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