175cae7c1SHong Zhang 2af0996ceSBarry Smith #include <petsc/private/matimpl.h> 375cae7c1SHong Zhang 475cae7c1SHong Zhang /* Get new PetscMatStashSpace into the existing space */ 575cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2,PetscInt n,PetscMatStashSpace *space) 675cae7c1SHong Zhang { 775cae7c1SHong Zhang PetscMatStashSpace a; 875cae7c1SHong Zhang 975cae7c1SHong Zhang PetscFunctionBegin; 1075cae7c1SHong Zhang if (!n) PetscFunctionReturn(0); 1175cae7c1SHong Zhang 12*9566063dSJacob Faibussowitsch PetscCall(PetscMalloc(sizeof(struct _MatStashSpace),&a)); 13*9566063dSJacob 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; 2775cae7c1SHong Zhang PetscFunctionReturn(0); 2875cae7c1SHong Zhang } 2975cae7c1SHong Zhang 3075cae7c1SHong Zhang /* Copy the values in space into arrays val, idx and idy. Then destroy space */ 3175cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace *space,PetscScalar *val,PetscInt *idx,PetscInt *idy) 3275cae7c1SHong Zhang { 3375cae7c1SHong Zhang PetscMatStashSpace a; 3475cae7c1SHong Zhang 3575cae7c1SHong Zhang PetscFunctionBegin; 366c4ed002SBarry Smith while ((*space)) { 3775cae7c1SHong Zhang a = (*space)->next; 38*9566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(val,(*space)->val,(*space)->local_used*bs2)); 3975cae7c1SHong Zhang val += bs2*(*space)->local_used; 40*9566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(idx,(*space)->idx,(*space)->local_used)); 4175cae7c1SHong Zhang idx += (*space)->local_used; 42*9566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(idy,(*space)->idy,(*space)->local_used)); 4375cae7c1SHong Zhang idy += (*space)->local_used; 4475cae7c1SHong Zhang 45*9566063dSJacob Faibussowitsch PetscCall(PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy)); 46*9566063dSJacob Faibussowitsch PetscCall(PetscFree(*space)); 4775cae7c1SHong Zhang *space = a; 4875cae7c1SHong Zhang } 4975cae7c1SHong Zhang PetscFunctionReturn(0); 5075cae7c1SHong Zhang } 5175cae7c1SHong Zhang 526bf464f9SBarry Smith PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace *space) 5375cae7c1SHong Zhang { 5475cae7c1SHong Zhang PetscMatStashSpace a; 5575cae7c1SHong Zhang 5675cae7c1SHong Zhang PetscFunctionBegin; 576bf464f9SBarry Smith while (*space) { 586bf464f9SBarry Smith a = (*space)->next; 59*9566063dSJacob Faibussowitsch PetscCall(PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy)); 60*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*space))); 616bf464f9SBarry Smith *space = a; 6275cae7c1SHong Zhang } 630298fd71SBarry Smith *space = NULL; 6475cae7c1SHong Zhang PetscFunctionReturn(0); 6575cae7c1SHong Zhang } 66