170f19b1fSKris Buschelman #include "src/mat/utils/freespace.h" 270f19b1fSKris Buschelman 370f19b1fSKris Buschelman #undef __FUNCT__ 470f19b1fSKris Buschelman #define __FUNCT__ "GetMoreSpace" 5*2e111b49SBarry Smith PetscErrorCode GetMoreSpace(PetscInt n,FreeSpaceList *list) 6*2e111b49SBarry Smith { 770f19b1fSKris Buschelman FreeSpaceList a; 8dfbe8321SBarry Smith PetscErrorCode ierr; 970f19b1fSKris Buschelman 1070f19b1fSKris Buschelman PetscFunctionBegin; 1170f19b1fSKris Buschelman ierr = PetscMalloc(sizeof(FreeSpace),&a);CHKERRQ(ierr); 12*2e111b49SBarry Smith ierr = PetscMalloc(n*sizeof(PetscInt),&(a->array_head));CHKERRQ(ierr); 1370f19b1fSKris Buschelman a->array = a->array_head; 14*2e111b49SBarry 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 24*2e111b49SBarry 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" 31*2e111b49SBarry 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; 39*2e111b49SBarry 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