1af0996ceSBarry Smith #include <petsc/private/matimpl.h>
275cae7c1SHong Zhang
375cae7c1SHong Zhang /* Get new PetscMatStashSpace into the existing space */
PetscMatStashSpaceGet(PetscInt bs2,PetscInt n,PetscMatStashSpace * space)4d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2, PetscInt n, PetscMatStashSpace *space)
5d71ae5a4SJacob Faibussowitsch {
675cae7c1SHong Zhang PetscMatStashSpace a;
775cae7c1SHong Zhang
875cae7c1SHong Zhang PetscFunctionBegin;
93ba16761SJacob Faibussowitsch if (!n) PetscFunctionReturn(PETSC_SUCCESS);
1075cae7c1SHong Zhang
119566063dSJacob Faibussowitsch PetscCall(PetscMalloc(sizeof(struct _MatStashSpace), &a));
12*f4f49eeaSPierre Jolivet PetscCall(PetscMalloc3(n * bs2, &a->space_head, n, &a->idx, n, &a->idy));
138865f1eaSKarl Rupp
1475cae7c1SHong Zhang a->val = a->space_head;
1575cae7c1SHong Zhang a->local_remaining = n;
1675cae7c1SHong Zhang a->local_used = 0;
1775cae7c1SHong Zhang a->total_space_size = 0;
180298fd71SBarry Smith a->next = NULL;
1975cae7c1SHong Zhang
2075cae7c1SHong Zhang if (*space) {
2175cae7c1SHong Zhang (*space)->next = a;
2275cae7c1SHong Zhang a->total_space_size = (*space)->total_space_size;
2375cae7c1SHong Zhang }
2475cae7c1SHong Zhang a->total_space_size += n;
2575cae7c1SHong Zhang *space = a;
263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2775cae7c1SHong Zhang }
2875cae7c1SHong Zhang
2975cae7c1SHong Zhang /* Copy the values in space into arrays val, idx and idy. Then destroy space */
PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace * space,PetscScalar * val,PetscInt * idx,PetscInt * idy)30d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2, PetscMatStashSpace *space, PetscScalar *val, PetscInt *idx, PetscInt *idy)
31d71ae5a4SJacob Faibussowitsch {
3275cae7c1SHong Zhang PetscMatStashSpace a;
3375cae7c1SHong Zhang
3475cae7c1SHong Zhang PetscFunctionBegin;
35*f4f49eeaSPierre Jolivet while (*space) {
3675cae7c1SHong Zhang a = (*space)->next;
379566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(val, (*space)->val, (*space)->local_used * bs2));
3875cae7c1SHong Zhang val += bs2 * (*space)->local_used;
399566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(idx, (*space)->idx, (*space)->local_used));
4075cae7c1SHong Zhang idx += (*space)->local_used;
419566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(idy, (*space)->idy, (*space)->local_used));
4275cae7c1SHong Zhang idy += (*space)->local_used;
4375cae7c1SHong Zhang
449566063dSJacob Faibussowitsch PetscCall(PetscFree3((*space)->space_head, (*space)->idx, (*space)->idy));
459566063dSJacob Faibussowitsch PetscCall(PetscFree(*space));
4675cae7c1SHong Zhang *space = a;
4775cae7c1SHong Zhang }
483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4975cae7c1SHong Zhang }
5075cae7c1SHong Zhang
PetscMatStashSpaceDestroy(PetscMatStashSpace * space)51d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace *space)
52d71ae5a4SJacob Faibussowitsch {
5375cae7c1SHong Zhang PetscMatStashSpace a;
5475cae7c1SHong Zhang
5575cae7c1SHong Zhang PetscFunctionBegin;
566bf464f9SBarry Smith while (*space) {
576bf464f9SBarry Smith a = (*space)->next;
589566063dSJacob Faibussowitsch PetscCall(PetscFree3((*space)->space_head, (*space)->idx, (*space)->idy));
59*f4f49eeaSPierre Jolivet PetscCall(PetscFree(*space));
606bf464f9SBarry Smith *space = a;
6175cae7c1SHong Zhang }
620298fd71SBarry Smith *space = NULL;
633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
6475cae7c1SHong Zhang }
65