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