175cae7c1SHong Zhang 2b45d2f2cSJed Brown #include <petsc-private/matimpl.h> 375cae7c1SHong Zhang 475cae7c1SHong Zhang /* Get new PetscMatStashSpace into the existing space */ 575cae7c1SHong Zhang #undef __FUNCT__ 675cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceGet" 775cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceGet(PetscInt bs2,PetscInt n,PetscMatStashSpace *space) 875cae7c1SHong Zhang { 975cae7c1SHong Zhang PetscMatStashSpace a; 1075cae7c1SHong Zhang PetscErrorCode ierr; 1175cae7c1SHong Zhang 1275cae7c1SHong Zhang PetscFunctionBegin; 1375cae7c1SHong Zhang if (!n) PetscFunctionReturn(0); 1475cae7c1SHong Zhang 1575cae7c1SHong Zhang ierr = PetscMalloc(sizeof(struct _MatStashSpace),&a);CHKERRQ(ierr); 16c05d87d6SBarry Smith ierr = PetscMalloc3(n*bs2,PetscScalar,&(a->space_head),n,PetscInt,&a->idx,n,PetscInt,&a->idy);CHKERRQ(ierr); 17*8865f1eaSKarl Rupp 1875cae7c1SHong Zhang a->val = a->space_head; 1975cae7c1SHong Zhang a->local_remaining = n; 2075cae7c1SHong Zhang a->local_used = 0; 2175cae7c1SHong Zhang a->total_space_size = 0; 2275cae7c1SHong Zhang a->next = PETSC_NULL; 2375cae7c1SHong Zhang 2475cae7c1SHong Zhang if (*space) { 2575cae7c1SHong Zhang (*space)->next = a; 2675cae7c1SHong Zhang a->total_space_size = (*space)->total_space_size; 2775cae7c1SHong Zhang } 2875cae7c1SHong Zhang a->total_space_size += n; 2975cae7c1SHong Zhang *space = a; 3075cae7c1SHong Zhang PetscFunctionReturn(0); 3175cae7c1SHong Zhang } 3275cae7c1SHong Zhang 3375cae7c1SHong Zhang /* Copy the values in space into arrays val, idx and idy. Then destroy space */ 3475cae7c1SHong Zhang #undef __FUNCT__ 3575cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceContiguous" 3675cae7c1SHong Zhang PetscErrorCode PetscMatStashSpaceContiguous(PetscInt bs2,PetscMatStashSpace *space,PetscScalar *val,PetscInt *idx,PetscInt *idy) 3775cae7c1SHong Zhang { 3875cae7c1SHong Zhang PetscMatStashSpace a; 3975cae7c1SHong Zhang PetscErrorCode ierr; 4075cae7c1SHong Zhang 4175cae7c1SHong Zhang PetscFunctionBegin; 4275cae7c1SHong Zhang while ((*space) != PETSC_NULL) { 4375cae7c1SHong Zhang a = (*space)->next; 44a77337e4SBarry Smith ierr = PetscMemcpy(val,(*space)->val,((*space)->local_used*bs2)*sizeof(PetscScalar));CHKERRQ(ierr); 4575cae7c1SHong Zhang val += bs2*(*space)->local_used; 4675cae7c1SHong Zhang ierr = PetscMemcpy(idx,(*space)->idx,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 4775cae7c1SHong Zhang idx += (*space)->local_used; 4875cae7c1SHong Zhang ierr = PetscMemcpy(idy,(*space)->idy,((*space)->local_used)*sizeof(PetscInt));CHKERRQ(ierr); 4975cae7c1SHong Zhang idy += (*space)->local_used; 5075cae7c1SHong Zhang 51c05d87d6SBarry Smith ierr = PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);CHKERRQ(ierr); 5275cae7c1SHong Zhang ierr = PetscFree(*space);CHKERRQ(ierr); 5375cae7c1SHong Zhang *space = a; 5475cae7c1SHong Zhang } 5575cae7c1SHong Zhang PetscFunctionReturn(0); 5675cae7c1SHong Zhang } 5775cae7c1SHong Zhang 5875cae7c1SHong Zhang #undef __FUNCT__ 5975cae7c1SHong Zhang #define __FUNCT__ "PetscMatStashSpaceDestroy" 606bf464f9SBarry Smith PetscErrorCode PetscMatStashSpaceDestroy(PetscMatStashSpace *space) 6175cae7c1SHong Zhang { 6275cae7c1SHong Zhang PetscMatStashSpace a; 6375cae7c1SHong Zhang PetscErrorCode ierr; 6475cae7c1SHong Zhang 6575cae7c1SHong Zhang PetscFunctionBegin; 666bf464f9SBarry Smith while (*space) { 676bf464f9SBarry Smith a = (*space)->next; 686bf464f9SBarry Smith ierr = PetscFree3((*space)->space_head,(*space)->idx,(*space)->idy);CHKERRQ(ierr); 696bf464f9SBarry Smith ierr = PetscFree((*space));CHKERRQ(ierr); 706bf464f9SBarry Smith *space = a; 7175cae7c1SHong Zhang } 726bf464f9SBarry Smith *space = PETSC_NULL; 7375cae7c1SHong Zhang PetscFunctionReturn(0); 7475cae7c1SHong Zhang } 75