1 #include "src/mat/utils/freespace.h" 2 3 #undef __FUNCT__ 4 #define __FUNCT__ "GetMoreSpace" 5 PetscErrorCode GetMoreSpace(int size,FreeSpaceList *list) { 6 FreeSpaceList a; 7 PetscErrorCode 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 PetscErrorCode MakeSpaceContiguous(FreeSpaceList *head,int *space) 31 { 32 FreeSpaceList a; 33 PetscErrorCode ierr; 34 35 PetscFunctionBegin; 36 while ((*head)!=NULL) { 37 a = (*head)->more_space; 38 ierr = PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(int));CHKERRQ(ierr); 39 space += (*head)->local_used; 40 ierr = PetscFree((*head)->array_head);CHKERRQ(ierr); 41 ierr = PetscFree(*head);CHKERRQ(ierr); 42 *head = a; 43 } 44 PetscFunctionReturn(0); 45 } 46