xref: /petsc/src/mat/utils/freespace.c (revision 38baddfdda9fcd85a080f141519fb97fb01bc0a4)
170f19b1fSKris Buschelman #include "src/mat/utils/freespace.h"
270f19b1fSKris Buschelman 
370f19b1fSKris Buschelman #undef __FUNCT__
470f19b1fSKris Buschelman #define __FUNCT__ "GetMoreSpace"
5dfbe8321SBarry Smith PetscErrorCode GetMoreSpace(int size,FreeSpaceList *list) {
670f19b1fSKris Buschelman   FreeSpaceList a;
7dfbe8321SBarry Smith   PetscErrorCode ierr;
870f19b1fSKris Buschelman 
970f19b1fSKris Buschelman   PetscFunctionBegin;
1070f19b1fSKris Buschelman   ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr);
1170f19b1fSKris Buschelman   ierr = PetscMalloc(size*sizeof(int),&(a->array_head));CHKERRQ(ierr);
1270f19b1fSKris Buschelman   a->array            = a->array_head;
1370f19b1fSKris Buschelman   a->local_remaining  = size;
1470f19b1fSKris Buschelman   a->local_used       = 0;
1570f19b1fSKris Buschelman   a->total_array_size = 0;
1670f19b1fSKris Buschelman   a->more_space       = NULL;
1770f19b1fSKris Buschelman 
1870f19b1fSKris Buschelman   if (*list) {
1970f19b1fSKris Buschelman     (*list)->more_space = a;
2070f19b1fSKris Buschelman     a->total_array_size = (*list)->total_array_size;
2170f19b1fSKris Buschelman   }
2270f19b1fSKris Buschelman 
2370f19b1fSKris Buschelman   a->total_array_size += size;
2470f19b1fSKris Buschelman   *list               =  a;
2570f19b1fSKris Buschelman   PetscFunctionReturn(0);
2670f19b1fSKris Buschelman }
2770f19b1fSKris Buschelman 
2870f19b1fSKris Buschelman #undef __FUNCT__
2970f19b1fSKris Buschelman #define __FUNCT__ "MakeSpaceContiguous"
30*38baddfdSBarry Smith PetscErrorCode MakeSpaceContiguous(FreeSpaceList *head,int *space)
31*38baddfdSBarry Smith {
3270f19b1fSKris Buschelman   FreeSpaceList  a;
33dfbe8321SBarry Smith   PetscErrorCode ierr;
3470f19b1fSKris Buschelman 
3570f19b1fSKris Buschelman   PetscFunctionBegin;
3670f19b1fSKris Buschelman   while ((*head)!=NULL) {
3770f19b1fSKris Buschelman     a     =  (*head)->more_space;
3870f19b1fSKris Buschelman     ierr  =  PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(int));CHKERRQ(ierr);
3970f19b1fSKris Buschelman     space += (*head)->local_used;
4070f19b1fSKris Buschelman     ierr  =  PetscFree((*head)->array_head);CHKERRQ(ierr);
4170f19b1fSKris Buschelman     ierr  =  PetscFree(*head);CHKERRQ(ierr);
4270f19b1fSKris Buschelman     *head =  a;
4370f19b1fSKris Buschelman   }
4470f19b1fSKris Buschelman   PetscFunctionReturn(0);
4570f19b1fSKris Buschelman }
46