1: #define PETSCMAT_DLL 3: #include src/mat/utils/freespace.h 7: PetscErrorCode PetscFreeSpaceGet(PetscInt n,PetscFreeSpaceList *list) 8: { 9: PetscFreeSpaceList a; 10: PetscErrorCode ierr; 13: PetscMalloc(sizeof(struct _Space),&a); 14: PetscMalloc(n*sizeof(PetscInt),&(a->array_head)); 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; 21: if (*list) { 22: (*list)->more_space = a; 23: a->total_array_size = (*list)->total_array_size; 24: } 26: a->total_array_size += n; 27: *list = a; 28: return(0); 29: } 33: PetscErrorCode PetscFreeSpaceContiguous(PetscFreeSpaceList *head,PetscInt *space) 34: { 35: PetscFreeSpaceList a; 36: PetscErrorCode ierr; 39: while ((*head)!=NULL) { 40: a = (*head)->more_space; 41: PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(PetscInt)); 42: space += (*head)->local_used; 43: PetscFree((*head)->array_head); 44: PetscFree(*head); 45: *head = a; 46: } 47: return(0); 48: } 52: PetscErrorCode PetscFreeSpaceDestroy(PetscFreeSpaceList head) 53: { 54: PetscFreeSpaceList a; 55: PetscErrorCode ierr; 58: while ((head)!=NULL) { 59: a = (head)->more_space; 60: PetscFree((head)->array_head); 61: PetscFree(head); 62: head = a; 63: } 64: return(0); 65: }