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