xref: /petsc/src/mat/utils/matstashspace.c (revision 9566063d113dddea24716c546802770db7481bc0)
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