1a3b2e22bSHong Zhang #include <petsc/private/matimpl.h> /*I "petscmat.h" I*/ 216b64355SHong Zhang #include <../src/mat/impls/aij/seq/aij.h> 316b64355SHong Zhang 4f68bb481SHong Zhang PetscErrorCode MatDestroySubMatrix_Dummy(Mat C) 516b64355SHong Zhang { 616b64355SHong Zhang PetscErrorCode ierr; 75c39f6d9SHong Zhang Mat_SubSppt *submatj = (Mat_SubSppt*)C->data; 816b64355SHong Zhang 916b64355SHong Zhang PetscFunctionBegin; 1016b64355SHong Zhang ierr = submatj->destroy(C);CHKERRQ(ierr); 11f68bb481SHong Zhang ierr = MatDestroySubMatrix_Private(submatj);CHKERRQ(ierr); 1216b64355SHong Zhang PetscFunctionReturn(0); 1316b64355SHong Zhang } 14a3b2e22bSHong Zhang 15*86e85357SHong Zhang PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[]) 16*86e85357SHong Zhang { 17*86e85357SHong Zhang PetscErrorCode ierr; 18*86e85357SHong Zhang 19*86e85357SHong Zhang PetscFunctionBegin; 20*86e85357SHong Zhang /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */ 21*86e85357SHong Zhang if ((*mat)[n]) { 22*86e85357SHong Zhang PetscBool isdummy; 23*86e85357SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)(*mat)[n],MATDUMMY,&isdummy);CHKERRQ(ierr); 24*86e85357SHong Zhang if (isdummy) { 25*86e85357SHong Zhang Mat_SubSppt* smat = (Mat_SubSppt*)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */ 26*86e85357SHong Zhang 27*86e85357SHong Zhang if (smat && !smat->singleis) { 28*86e85357SHong Zhang PetscInt i,nstages=smat->nstages; 29*86e85357SHong Zhang for (i=0; i<nstages; i++) { 30*86e85357SHong Zhang ierr = MatDestroy(&(*mat)[n+i]);CHKERRQ(ierr); 31*86e85357SHong Zhang } 32*86e85357SHong Zhang } 33*86e85357SHong Zhang } 34*86e85357SHong Zhang } 35*86e85357SHong Zhang 36*86e85357SHong Zhang /* memory is allocated even if n = 0 */ 37*86e85357SHong Zhang ierr = PetscFree(*mat);CHKERRQ(ierr); 38*86e85357SHong Zhang PetscFunctionReturn(0); 39*86e85357SHong Zhang } 40*86e85357SHong Zhang 41a3b2e22bSHong Zhang PetscErrorCode MatDestroy_Dummy(Mat A) 42a3b2e22bSHong Zhang { 43a3b2e22bSHong Zhang PetscErrorCode ierr; 44a3b2e22bSHong Zhang 45a3b2e22bSHong Zhang PetscFunctionBegin; 46a3b2e22bSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)A,0);CHKERRQ(ierr); 47a3b2e22bSHong Zhang PetscFunctionReturn(0); 48a3b2e22bSHong Zhang } 49a3b2e22bSHong Zhang 50a3b2e22bSHong Zhang /*MC 51a3b2e22bSHong Zhang MATDUMMY - A matrix type to be used for reusing specific internal data structure. 52a3b2e22bSHong Zhang 53a3b2e22bSHong Zhang Level: advanced 54a3b2e22bSHong Zhang 55a3b2e22bSHong Zhang .seealso: Mat 56a3b2e22bSHong Zhang 57a3b2e22bSHong Zhang M*/ 58a3b2e22bSHong Zhang 59a3b2e22bSHong Zhang PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) 60a3b2e22bSHong Zhang { 61a3b2e22bSHong Zhang PetscErrorCode ierr; 62a3b2e22bSHong Zhang 63a3b2e22bSHong Zhang PetscFunctionBegin; 64a3b2e22bSHong Zhang /* matrix ops */ 65a3b2e22bSHong Zhang ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr); 66a3b2e22bSHong Zhang A->ops->destroy = MatDestroy_Dummy; 67*86e85357SHong Zhang A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 68a3b2e22bSHong Zhang 69a3b2e22bSHong Zhang /* special MATPREALLOCATOR functions */ 70a3b2e22bSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)A,MATDUMMY);CHKERRQ(ierr); 71a3b2e22bSHong Zhang PetscFunctionReturn(0); 72a3b2e22bSHong Zhang } 73