xref: /petsc/src/mat/utils/freespace.c (revision 7a48dd6f2aa3b8ed7e706edfa21a0730bd5df65d)
170f19b1fSKris Buschelman #include "src/mat/utils/freespace.h"
270f19b1fSKris Buschelman 
370f19b1fSKris Buschelman #undef __FUNCT__
470f19b1fSKris Buschelman #define __FUNCT__ "GetMoreSpace"
52e111b49SBarry Smith PetscErrorCode GetMoreSpace(PetscInt n,FreeSpaceList *list)
62e111b49SBarry Smith {
770f19b1fSKris Buschelman   FreeSpaceList  a;
8dfbe8321SBarry Smith   PetscErrorCode ierr;
970f19b1fSKris Buschelman 
1070f19b1fSKris Buschelman   PetscFunctionBegin;
1170f19b1fSKris Buschelman   ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr);
122e111b49SBarry Smith   ierr = PetscMalloc(n*sizeof(PetscInt),&(a->array_head));CHKERRQ(ierr);
1370f19b1fSKris Buschelman   a->array            = a->array_head;
142e111b49SBarry Smith   a->local_remaining  = n;
1570f19b1fSKris Buschelman   a->local_used       = 0;
1670f19b1fSKris Buschelman   a->total_array_size = 0;
1770f19b1fSKris Buschelman   a->more_space       = NULL;
1870f19b1fSKris Buschelman 
1970f19b1fSKris Buschelman   if (*list) {
2070f19b1fSKris Buschelman     (*list)->more_space = a;
2170f19b1fSKris Buschelman     a->total_array_size = (*list)->total_array_size;
2270f19b1fSKris Buschelman   }
2370f19b1fSKris Buschelman 
242e111b49SBarry Smith   a->total_array_size += n;
2570f19b1fSKris Buschelman   *list               =  a;
2670f19b1fSKris Buschelman   PetscFunctionReturn(0);
2770f19b1fSKris Buschelman }
2870f19b1fSKris Buschelman 
2970f19b1fSKris Buschelman #undef __FUNCT__
3070f19b1fSKris Buschelman #define __FUNCT__ "MakeSpaceContiguous"
312e111b49SBarry Smith PetscErrorCode MakeSpaceContiguous(FreeSpaceList *head,PetscInt *space)
3238baddfdSBarry Smith {
3370f19b1fSKris Buschelman   FreeSpaceList  a;
34dfbe8321SBarry Smith   PetscErrorCode ierr;
3570f19b1fSKris Buschelman 
3670f19b1fSKris Buschelman   PetscFunctionBegin;
3770f19b1fSKris Buschelman   while ((*head)!=NULL) {
3870f19b1fSKris Buschelman     a     =  (*head)->more_space;
392e111b49SBarry Smith     ierr  =  PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(PetscInt));CHKERRQ(ierr);
4070f19b1fSKris Buschelman     space += (*head)->local_used;
4170f19b1fSKris Buschelman     ierr  =  PetscFree((*head)->array_head);CHKERRQ(ierr);
4270f19b1fSKris Buschelman     ierr  =  PetscFree(*head);CHKERRQ(ierr);
4370f19b1fSKris Buschelman     *head =  a;
4470f19b1fSKris Buschelman   }
4570f19b1fSKris Buschelman   PetscFunctionReturn(0);
4670f19b1fSKris Buschelman }
47*7a48dd6fSHong Zhang 
48*7a48dd6fSHong Zhang #undef __FUNCT__
49*7a48dd6fSHong Zhang #define __FUNCT__ "DestroySpace"
50*7a48dd6fSHong Zhang PetscErrorCode DestroySpace(FreeSpaceList head)
51*7a48dd6fSHong Zhang {
52*7a48dd6fSHong Zhang   FreeSpaceList  a;
53*7a48dd6fSHong Zhang   PetscErrorCode ierr;
54*7a48dd6fSHong Zhang 
55*7a48dd6fSHong Zhang   PetscFunctionBegin;
56*7a48dd6fSHong Zhang   while ((head)!=NULL) {
57*7a48dd6fSHong Zhang     a    = (head)->more_space;
58*7a48dd6fSHong Zhang     ierr = PetscFree((head)->array_head);CHKERRQ(ierr);
59*7a48dd6fSHong Zhang     ierr = PetscFree(head);CHKERRQ(ierr);
60*7a48dd6fSHong Zhang     head = a;
61*7a48dd6fSHong Zhang   }
62*7a48dd6fSHong Zhang   PetscFunctionReturn(0);
63*7a48dd6fSHong Zhang }
64