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