xref: /petsc/src/mat/utils/matstashspace.c (revision a77337e4d7d5143cd577a9cca2c72dcc9694336d)
175cae7c1SHong Zhang 
275cae7c1SHong Zhang #define PETSCMAT_DLL
375cae7c1SHong Zhang 
4b9147fbbSdalcinl #include "include/private/matimpl.h"
575cae7c1SHong Zhang 
675cae7c1SHong Zhang /* Get new PetscMatStashSpace into the existing space */
775cae7c1SHong Zhang #undef __FUNCT__
875cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceGet"
975cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2,PetscInt n,PetscMatStashSpace *space)
1075cae7c1SHong Zhang {
1175cae7c1SHong Zhang   PetscMatStashSpace a;
1275cae7c1SHong Zhang   PetscErrorCode     ierr;
1375cae7c1SHong Zhang 
1475cae7c1SHong Zhang   PetscFunctionBegin;
1575cae7c1SHong Zhang   if (!n) PetscFunctionReturn(0);
1675cae7c1SHong Zhang 
1775cae7c1SHong Zhang   ierr = PetscMalloc(sizeof(struct _MatStashSpace),&a);CHKERRQ(ierr);
18*a77337e4SBarry Smith   ierr = PetscMalloc(n*(bs2*sizeof(PetscScalar)+2*sizeof(PetscInt)),&(a->space_head));CHKERRQ(ierr);
1975cae7c1SHong Zhang   a->val              = a->space_head;
2075cae7c1SHong Zhang   a->idx              = (PetscInt*)(a->val + bs2*n);
2175cae7c1SHong Zhang   a->idy              = (PetscInt*)(a->idx + n);
2275cae7c1SHong Zhang   a->local_remaining  = n;
2375cae7c1SHong Zhang   a->local_used       = 0;
2475cae7c1SHong Zhang   a->total_space_size = 0;
2575cae7c1SHong Zhang   a->next             = PETSC_NULL;
2675cae7c1SHong Zhang 
2775cae7c1SHong Zhang   if (*space){
2875cae7c1SHong Zhang     (*space)->next      = a;
2975cae7c1SHong Zhang     a->total_space_size = (*space)->total_space_size;
3075cae7c1SHong Zhang   }
3175cae7c1SHong Zhang   a->total_space_size += n;
3275cae7c1SHong Zhang   *space               = a;
3375cae7c1SHong Zhang   PetscFunctionReturn(0);
3475cae7c1SHong Zhang }
3575cae7c1SHong Zhang 
3675cae7c1SHong Zhang /* Copy the values in space into arrays val, idx and idy. Then destroy space */
3775cae7c1SHong Zhang #undef __FUNCT__
3875cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceContiguous"
3975cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace *space,PetscScalar *val,PetscInt *idx,PetscInt *idy)
4075cae7c1SHong Zhang {
4175cae7c1SHong Zhang   PetscMatStashSpace a;
4275cae7c1SHong Zhang   PetscErrorCode     ierr;
4375cae7c1SHong Zhang 
4475cae7c1SHong Zhang   PetscFunctionBegin;
4575cae7c1SHong Zhang   while ((*space) != PETSC_NULL){
4675cae7c1SHong Zhang     a    = (*space)->next;
47*a77337e4SBarry Smith     ierr = PetscMemcpy(val,(*space)->val,((*space)->local_used*bs2)*sizeof(PetscScalar));CHKERRQ(ierr);
4875cae7c1SHong Zhang     val += bs2*(*space)->local_used;
4975cae7c1SHong Zhang     ierr = PetscMemcpy(idx,(*space)->idx,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr);
5075cae7c1SHong Zhang     idx += (*space)->local_used;
5175cae7c1SHong Zhang     ierr = PetscMemcpy(idy,(*space)->idy,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr);
5275cae7c1SHong Zhang     idy += (*space)->local_used;
5375cae7c1SHong Zhang 
5475cae7c1SHong Zhang     ierr =  PetscFree((*space)->space_head);CHKERRQ(ierr);
5575cae7c1SHong Zhang     ierr =  PetscFree(*space);CHKERRQ(ierr);
5675cae7c1SHong Zhang     *space = a;
5775cae7c1SHong Zhang   }
5875cae7c1SHong Zhang   PetscFunctionReturn(0);
5975cae7c1SHong Zhang }
6075cae7c1SHong Zhang 
6175cae7c1SHong Zhang #undef __FUNCT__
6275cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceDestroy"
6375cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace space)
6475cae7c1SHong Zhang {
6575cae7c1SHong Zhang   PetscMatStashSpace a;
6675cae7c1SHong Zhang   PetscErrorCode     ierr;
6775cae7c1SHong Zhang 
6875cae7c1SHong Zhang   PetscFunctionBegin;
6975cae7c1SHong Zhang   while (space != PETSC_NULL){
7075cae7c1SHong Zhang     a     = space->next;
7175cae7c1SHong Zhang     ierr  = PetscFree(space->space_head);CHKERRQ(ierr);
7275cae7c1SHong Zhang     ierr  = PetscFree(space);CHKERRQ(ierr);
7375cae7c1SHong Zhang     space = a;
7475cae7c1SHong Zhang   }
7575cae7c1SHong Zhang   PetscFunctionReturn(0);
7675cae7c1SHong Zhang }
77