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