175cae7c1SHong Zhang 275cae7c1SHong Zhang #define PETSCMAT_DLL 375cae7c1SHong Zhang 47c4f633dSBarry Smith #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*c05d87d6SBarry Smith ierr = PetscMalloc3(n*bs2,PetscScalar,&(a->space_head),n,PetscInt,&a->idx,n,PetscInt,&a->idy);CHKERRQ(ierr); 1975cae7c1SHong Zhang a->val = a->space_head; 2075cae7c1SHong Zhang a->local_remaining = n; 2175cae7c1SHong Zhang a->local_used = 0; 2275cae7c1SHong Zhang a->total_space_size = 0; 2375cae7c1SHong Zhang a->next = PETSC_NULL; 2475cae7c1SHong Zhang 2575cae7c1SHong Zhang if (*space){ 2675cae7c1SHong Zhang (*space)->next = a; 2775cae7c1SHong Zhang a->total_space_size = (*space)->total_space_size; 2875cae7c1SHong Zhang } 2975cae7c1SHong Zhang a->total_space_size += n; 3075cae7c1SHong Zhang *space = a; 3175cae7c1SHong Zhang PetscFunctionReturn(0); 3275cae7c1SHong Zhang } 3375cae7c1SHong Zhang 3475cae7c1SHong Zhang /* Copy the values in space into arrays val, idx and idy. Then destroy space */ 3575cae7c1SHong Zhang #undef __FUNCT__ 3675cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceContiguous" 3775cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace *space,PetscScalar *val,PetscInt *idx,PetscInt *idy) 3875cae7c1SHong Zhang { 3975cae7c1SHong Zhang PetscMatStashSpace a; 4075cae7c1SHong Zhang PetscErrorCode ierr; 4175cae7c1SHong Zhang 4275cae7c1SHong Zhang PetscFunctionBegin; 4375cae7c1SHong Zhang while ((*space) != PETSC_NULL){ 4475cae7c1SHong Zhang a = (*space)->next; 45a77337e4SBarry Smith ierr = PetscMemcpy(val,(*space)->val,((*space)->local_used*bs2)*sizeof(PetscScalar));CHKERRQ(ierr); 4675cae7c1SHong Zhang val += bs2*(*space)->local_used; 4775cae7c1SHong Zhang ierr = PetscMemcpy(idx,(*space)->idx,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 4875cae7c1SHong Zhang idx += (*space)->local_used; 4975cae7c1SHong Zhang ierr = PetscMemcpy(idy,(*space)->idy,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 5075cae7c1SHong Zhang idy += (*space)->local_used; 5175cae7c1SHong Zhang 52*c05d87d6SBarry Smith ierr = PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);CHKERRQ(ierr); 5375cae7c1SHong Zhang ierr = PetscFree(*space);CHKERRQ(ierr); 5475cae7c1SHong Zhang *space = a; 5575cae7c1SHong Zhang } 5675cae7c1SHong Zhang PetscFunctionReturn(0); 5775cae7c1SHong Zhang } 5875cae7c1SHong Zhang 5975cae7c1SHong Zhang #undef __FUNCT__ 6075cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceDestroy" 6175cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace space) 6275cae7c1SHong Zhang { 6375cae7c1SHong Zhang PetscMatStashSpace a; 6475cae7c1SHong Zhang PetscErrorCode ierr; 6575cae7c1SHong Zhang 6675cae7c1SHong Zhang PetscFunctionBegin; 6775cae7c1SHong Zhang while (space != PETSC_NULL){ 6875cae7c1SHong Zhang a = space->next; 69*c05d87d6SBarry Smith ierr = PetscFree3(space->space_head,space->idx,space->idy);CHKERRQ(ierr); 7075cae7c1SHong Zhang ierr = PetscFree(space);CHKERRQ(ierr); 7175cae7c1SHong Zhang space = a; 7275cae7c1SHong Zhang } 7375cae7c1SHong Zhang PetscFunctionReturn(0); 7475cae7c1SHong Zhang } 75