xref: /petsc/src/mat/utils/freespace.c (revision 52e6d16ba989af9362d0fcebb12e73dd7c9666ed)
1 #include "src/mat/utils/freespace.h"
2 
3 #undef __FUNCT__
4 #define __FUNCT__ "GetMoreSpace"
5 PetscErrorCode GetMoreSpace(PetscInt n,FreeSpaceList *list)
6 {
7   FreeSpaceList  a;
8   PetscErrorCode ierr;
9 
10   PetscFunctionBegin;
11   ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr);
12   ierr = PetscMalloc(n*sizeof(PetscInt),&(a->array_head));CHKERRQ(ierr);
13   a->array            = a->array_head;
14   a->local_remaining  = n;
15   a->local_used       = 0;
16   a->total_array_size = 0;
17   a->more_space       = NULL;
18 
19   if (*list) {
20     (*list)->more_space = a;
21     a->total_array_size = (*list)->total_array_size;
22   }
23 
24   a->total_array_size += n;
25   *list               =  a;
26   PetscFunctionReturn(0);
27 }
28 
29 #undef __FUNCT__
30 #define __FUNCT__ "MakeSpaceContiguous"
31 PetscErrorCode MakeSpaceContiguous(FreeSpaceList *head,PetscInt *space)
32 {
33   FreeSpaceList  a;
34   PetscErrorCode ierr;
35 
36   PetscFunctionBegin;
37   while ((*head)!=NULL) {
38     a     =  (*head)->more_space;
39     ierr  =  PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(PetscInt));CHKERRQ(ierr);
40     space += (*head)->local_used;
41     ierr  =  PetscFree((*head)->array_head);CHKERRQ(ierr);
42     ierr  =  PetscFree(*head);CHKERRQ(ierr);
43     *head =  a;
44   }
45   PetscFunctionReturn(0);
46 }
47 
48 #undef __FUNCT__
49 #define __FUNCT__ "DestroySpace"
50 PetscErrorCode DestroySpace(FreeSpaceList head)
51 {
52   FreeSpaceList  a;
53   PetscErrorCode ierr;
54 
55   PetscFunctionBegin;
56   while ((head)!=NULL) {
57     a    = (head)->more_space;
58     ierr = PetscFree((head)->array_head);CHKERRQ(ierr);
59     ierr = PetscFree(head);CHKERRQ(ierr);
60     head = a;
61   }
62   PetscFunctionReturn(0);
63 }
64