170f19b1fSKris Buschelman #include "src/mat/utils/freespace.h" 270f19b1fSKris Buschelman 370f19b1fSKris Buschelman #undef __FUNCT__ 470f19b1fSKris Buschelman #define __FUNCT__ "GetMoreSpace" 52e111b49SBarry Smith PetscErrorCode GetMoreSpace(PetscInt n,FreeSpaceList *list) 62e111b49SBarry Smith { 770f19b1fSKris Buschelman FreeSpaceList a; 8dfbe8321SBarry Smith PetscErrorCode ierr; 970f19b1fSKris Buschelman 1070f19b1fSKris Buschelman PetscFunctionBegin; 1170f19b1fSKris Buschelman ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr); 122e111b49SBarry Smith ierr = PetscMalloc(n*sizeof(PetscInt),&(a->array_head));CHKERRQ(ierr); 1370f19b1fSKris Buschelman a->array = a->array_head; 142e111b49SBarry Smith a->local_remaining = n; 1570f19b1fSKris Buschelman a->local_used = 0; 1670f19b1fSKris Buschelman a->total_array_size = 0; 1770f19b1fSKris Buschelman a->more_space = NULL; 1870f19b1fSKris Buschelman 1970f19b1fSKris Buschelman if (*list) { 2070f19b1fSKris Buschelman (*list)->more_space = a; 2170f19b1fSKris Buschelman a->total_array_size = (*list)->total_array_size; 2270f19b1fSKris Buschelman } 2370f19b1fSKris Buschelman 242e111b49SBarry Smith a->total_array_size += n; 2570f19b1fSKris Buschelman *list = a; 2670f19b1fSKris Buschelman PetscFunctionReturn(0); 2770f19b1fSKris Buschelman } 2870f19b1fSKris Buschelman 2970f19b1fSKris Buschelman #undef __FUNCT__ 3070f19b1fSKris Buschelman #define __FUNCT__ "MakeSpaceContiguous" 312e111b49SBarry Smith PetscErrorCode MakeSpaceContiguous(FreeSpaceList *head,PetscInt *space) 3238baddfdSBarry Smith { 3370f19b1fSKris Buschelman FreeSpaceList a; 34dfbe8321SBarry Smith PetscErrorCode ierr; 3570f19b1fSKris Buschelman 3670f19b1fSKris Buschelman PetscFunctionBegin; 3770f19b1fSKris Buschelman while ((*head)!=NULL) { 3870f19b1fSKris Buschelman a = (*head)->more_space; 392e111b49SBarry Smith ierr = PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 4070f19b1fSKris Buschelman space += (*head)->local_used; 4170f19b1fSKris Buschelman ierr = PetscFree((*head)->array_head);CHKERRQ(ierr); 4270f19b1fSKris Buschelman ierr = PetscFree(*head);CHKERRQ(ierr); 4370f19b1fSKris Buschelman *head = a; 4470f19b1fSKris Buschelman } 4570f19b1fSKris Buschelman PetscFunctionReturn(0); 4670f19b1fSKris Buschelman } 47*7a48dd6fSHong Zhang 48*7a48dd6fSHong Zhang #undef __FUNCT__ 49*7a48dd6fSHong Zhang #define __FUNCT__ "DestroySpace" 50*7a48dd6fSHong Zhang PetscErrorCode DestroySpace(FreeSpaceList head) 51*7a48dd6fSHong Zhang { 52*7a48dd6fSHong Zhang FreeSpaceList a; 53*7a48dd6fSHong Zhang PetscErrorCode ierr; 54*7a48dd6fSHong Zhang 55*7a48dd6fSHong Zhang PetscFunctionBegin; 56*7a48dd6fSHong Zhang while ((head)!=NULL) { 57*7a48dd6fSHong Zhang a = (head)->more_space; 58*7a48dd6fSHong Zhang ierr = PetscFree((head)->array_head);CHKERRQ(ierr); 59*7a48dd6fSHong Zhang ierr = PetscFree(head);CHKERRQ(ierr); 60*7a48dd6fSHong Zhang head = a; 61*7a48dd6fSHong Zhang } 62*7a48dd6fSHong Zhang PetscFunctionReturn(0); 63*7a48dd6fSHong Zhang } 64