1*be1d678aSKris Buschelman #define PETSCMAT_DLL 2*be1d678aSKris Buschelman 370f19b1fSKris Buschelman #include "src/mat/utils/freespace.h" 470f19b1fSKris Buschelman 570f19b1fSKris Buschelman #undef __FUNCT__ 670f19b1fSKris Buschelman #define __FUNCT__ "GetMoreSpace" 72e111b49SBarry Smith PetscErrorCode GetMoreSpace(PetscInt n,FreeSpaceList *list) 82e111b49SBarry Smith { 970f19b1fSKris Buschelman FreeSpaceList a; 10dfbe8321SBarry Smith PetscErrorCode ierr; 1170f19b1fSKris Buschelman 1270f19b1fSKris Buschelman PetscFunctionBegin; 1370f19b1fSKris Buschelman ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr); 142e111b49SBarry Smith ierr = PetscMalloc(n*sizeof(PetscInt),&(a->array_head));CHKERRQ(ierr); 1570f19b1fSKris Buschelman a->array = a->array_head; 162e111b49SBarry Smith a->local_remaining = n; 1770f19b1fSKris Buschelman a->local_used = 0; 1870f19b1fSKris Buschelman a->total_array_size = 0; 1970f19b1fSKris Buschelman a->more_space = NULL; 2070f19b1fSKris Buschelman 2170f19b1fSKris Buschelman if (*list) { 2270f19b1fSKris Buschelman (*list)->more_space = a; 2370f19b1fSKris Buschelman a->total_array_size = (*list)->total_array_size; 2470f19b1fSKris Buschelman } 2570f19b1fSKris Buschelman 262e111b49SBarry Smith a->total_array_size += n; 2770f19b1fSKris Buschelman *list = a; 2870f19b1fSKris Buschelman PetscFunctionReturn(0); 2970f19b1fSKris Buschelman } 3070f19b1fSKris Buschelman 3170f19b1fSKris Buschelman #undef __FUNCT__ 3270f19b1fSKris Buschelman #define __FUNCT__ "MakeSpaceContiguous" 332e111b49SBarry Smith PetscErrorCode MakeSpaceContiguous(FreeSpaceList *head,PetscInt *space) 3438baddfdSBarry Smith { 3570f19b1fSKris Buschelman FreeSpaceList a; 36dfbe8321SBarry Smith PetscErrorCode ierr; 3770f19b1fSKris Buschelman 3870f19b1fSKris Buschelman PetscFunctionBegin; 3970f19b1fSKris Buschelman while ((*head)!=NULL) { 4070f19b1fSKris Buschelman a = (*head)->more_space; 412e111b49SBarry Smith ierr = PetscMemcpy(space,(*head)->array_head,((*head)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 4270f19b1fSKris Buschelman space += (*head)->local_used; 4370f19b1fSKris Buschelman ierr = PetscFree((*head)->array_head);CHKERRQ(ierr); 4470f19b1fSKris Buschelman ierr = PetscFree(*head);CHKERRQ(ierr); 4570f19b1fSKris Buschelman *head = a; 4670f19b1fSKris Buschelman } 4770f19b1fSKris Buschelman PetscFunctionReturn(0); 4870f19b1fSKris Buschelman } 497a48dd6fSHong Zhang 507a48dd6fSHong Zhang #undef __FUNCT__ 517a48dd6fSHong Zhang #define __FUNCT__ "DestroySpace" 527a48dd6fSHong Zhang PetscErrorCode DestroySpace(FreeSpaceList head) 537a48dd6fSHong Zhang { 547a48dd6fSHong Zhang FreeSpaceList a; 557a48dd6fSHong Zhang PetscErrorCode ierr; 567a48dd6fSHong Zhang 577a48dd6fSHong Zhang PetscFunctionBegin; 587a48dd6fSHong Zhang while ((head)!=NULL) { 597a48dd6fSHong Zhang a = (head)->more_space; 607a48dd6fSHong Zhang ierr = PetscFree((head)->array_head);CHKERRQ(ierr); 617a48dd6fSHong Zhang ierr = PetscFree(head);CHKERRQ(ierr); 627a48dd6fSHong Zhang head = a; 637a48dd6fSHong Zhang } 647a48dd6fSHong Zhang PetscFunctionReturn(0); 657a48dd6fSHong Zhang } 66