xref: /petsc/src/mat/utils/freespace.c (revision 70f19b1f7e86062814f7b2efd7f722a70996ac5d)
1*70f19b1fSKris Buschelman #include "src/mat/utils/freespace.h"
2*70f19b1fSKris Buschelman 
3*70f19b1fSKris Buschelman #undef __FUNCT__
4*70f19b1fSKris Buschelman #define __FUNCT__ "GetMoreSpace"
5*70f19b1fSKris Buschelman int GetMoreSpace(int size,FreeSpaceList *list) {
6*70f19b1fSKris Buschelman   FreeSpaceList a;
7*70f19b1fSKris Buschelman   int ierr;
8*70f19b1fSKris Buschelman 
9*70f19b1fSKris Buschelman   PetscFunctionBegin;
10*70f19b1fSKris Buschelman   ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr);
11*70f19b1fSKris Buschelman   ierr = PetscMalloc(size*sizeof(int),&(a->array_head));CHKERRQ(ierr);
12*70f19b1fSKris Buschelman   a->array            = a->array_head;
13*70f19b1fSKris Buschelman   a->local_remaining  = size;
14*70f19b1fSKris Buschelman   a->local_used       = 0;
15*70f19b1fSKris Buschelman   a->total_array_size = 0;
16*70f19b1fSKris Buschelman   a->more_space       = NULL;
17*70f19b1fSKris Buschelman 
18*70f19b1fSKris Buschelman   if (*list) {
19*70f19b1fSKris Buschelman     (*list)->more_space = a;
20*70f19b1fSKris Buschelman     a->total_array_size = (*list)->total_array_size;
21*70f19b1fSKris Buschelman   }
22*70f19b1fSKris Buschelman 
23*70f19b1fSKris Buschelman   a->total_array_size += size;
24*70f19b1fSKris Buschelman   *list               =  a;
25*70f19b1fSKris Buschelman   PetscFunctionReturn(0);
26*70f19b1fSKris Buschelman }
27*70f19b1fSKris Buschelman 
28*70f19b1fSKris Buschelman #undef __FUNCT__
29*70f19b1fSKris Buschelman #define __FUNCT__ "MakeSpaceContiguous"
30*70f19b1fSKris Buschelman int MakeSpaceContiguous(FreeSpaceList *head,int *space) {
31*70f19b1fSKris Buschelman   FreeSpaceList a;
32*70f19b1fSKris Buschelman   int           ierr;
33*70f19b1fSKris Buschelman 
34*70f19b1fSKris Buschelman   PetscFunctionBegin;
35*70f19b1fSKris Buschelman   while ((*head)!=NULL) {
36*70f19b1fSKris Buschelman     a     =  (*head)->more_space;
37*70f19b1fSKris Buschelman     ierr  =  PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(int));CHKERRQ(ierr);
38*70f19b1fSKris Buschelman     space += (*head)->local_used;
39*70f19b1fSKris Buschelman     ierr  =  PetscFree((*head)->array_head);CHKERRQ(ierr);
40*70f19b1fSKris Buschelman     ierr  =  PetscFree(*head);CHKERRQ(ierr);
41*70f19b1fSKris Buschelman     *head =  a;
42*70f19b1fSKris Buschelman   }
43*70f19b1fSKris Buschelman   PetscFunctionReturn(0);
44*70f19b1fSKris Buschelman }
45