175cae7c1SHong Zhang 2af0996ceSBarry Smith #include <petsc/private/matimpl.h> 375cae7c1SHong Zhang 475cae7c1SHong Zhang /* Get new PetscMatStashSpace into the existing space */ 5d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2, PetscInt n, PetscMatStashSpace *space) 6d71ae5a4SJacob Faibussowitsch { 775cae7c1SHong Zhang PetscMatStashSpace a; 875cae7c1SHong Zhang 975cae7c1SHong Zhang PetscFunctionBegin; 10*3ba16761SJacob Faibussowitsch if (!n) PetscFunctionReturn(PETSC_SUCCESS); 1175cae7c1SHong Zhang 129566063dSJacob Faibussowitsch PetscCall(PetscMalloc(sizeof(struct _MatStashSpace), &a)); 139566063dSJacob Faibussowitsch PetscCall(PetscMalloc3(n * bs2, &(a->space_head), n, &a->idx, n, &a->idy)); 148865f1eaSKarl Rupp 1575cae7c1SHong Zhang a->val = a->space_head; 1675cae7c1SHong Zhang a->local_remaining = n; 1775cae7c1SHong Zhang a->local_used = 0; 1875cae7c1SHong Zhang a->total_space_size = 0; 190298fd71SBarry Smith a->next = NULL; 2075cae7c1SHong Zhang 2175cae7c1SHong Zhang if (*space) { 2275cae7c1SHong Zhang (*space)->next = a; 2375cae7c1SHong Zhang a->total_space_size = (*space)->total_space_size; 2475cae7c1SHong Zhang } 2575cae7c1SHong Zhang a->total_space_size += n; 2675cae7c1SHong Zhang *space = a; 27*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2875cae7c1SHong Zhang } 2975cae7c1SHong Zhang 3075cae7c1SHong Zhang /* Copy the values in space into arrays val, idx and idy. Then destroy space */ 31d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2, PetscMatStashSpace *space, PetscScalar *val, PetscInt *idx, PetscInt *idy) 32d71ae5a4SJacob Faibussowitsch { 3375cae7c1SHong Zhang PetscMatStashSpace a; 3475cae7c1SHong Zhang 3575cae7c1SHong Zhang PetscFunctionBegin; 366c4ed002SBarry Smith while ((*space)) { 3775cae7c1SHong Zhang a = (*space)->next; 389566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(val, (*space)->val, (*space)->local_used * bs2)); 3975cae7c1SHong Zhang val += bs2 * (*space)->local_used; 409566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(idx, (*space)->idx, (*space)->local_used)); 4175cae7c1SHong Zhang idx += (*space)->local_used; 429566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(idy, (*space)->idy, (*space)->local_used)); 4375cae7c1SHong Zhang idy += (*space)->local_used; 4475cae7c1SHong Zhang 459566063dSJacob Faibussowitsch PetscCall(PetscFree3((*space)->space_head, (*space)->idx, (*space)->idy)); 469566063dSJacob Faibussowitsch PetscCall(PetscFree(*space)); 4775cae7c1SHong Zhang *space = a; 4875cae7c1SHong Zhang } 49*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5075cae7c1SHong Zhang } 5175cae7c1SHong Zhang 52d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace *space) 53d71ae5a4SJacob Faibussowitsch { 5475cae7c1SHong Zhang PetscMatStashSpace a; 5575cae7c1SHong Zhang 5675cae7c1SHong Zhang PetscFunctionBegin; 576bf464f9SBarry Smith while (*space) { 586bf464f9SBarry Smith a = (*space)->next; 599566063dSJacob Faibussowitsch PetscCall(PetscFree3((*space)->space_head, (*space)->idx, (*space)->idy)); 609566063dSJacob Faibussowitsch PetscCall(PetscFree((*space))); 616bf464f9SBarry Smith *space = a; 6275cae7c1SHong Zhang } 630298fd71SBarry Smith *space = NULL; 64*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6575cae7c1SHong Zhang } 66