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 { 65c39f6d9SHong Zhang Mat_SubSppt *submatj = (Mat_SubSppt*)C->data; 716b64355SHong Zhang 816b64355SHong Zhang PetscFunctionBegin; 99566063dSJacob Faibussowitsch PetscCall(submatj->destroy(C)); 109566063dSJacob Faibussowitsch PetscCall(MatDestroySubMatrix_Private(submatj)); 1116b64355SHong Zhang PetscFunctionReturn(0); 1216b64355SHong Zhang } 13a3b2e22bSHong Zhang 1486e85357SHong Zhang PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[]) 1586e85357SHong Zhang { 1686e85357SHong Zhang PetscFunctionBegin; 1786e85357SHong Zhang /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */ 1886e85357SHong Zhang if ((*mat)[n]) { 1986e85357SHong Zhang PetscBool isdummy; 209566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)(*mat)[n],MATDUMMY,&isdummy)); 2186e85357SHong Zhang if (isdummy) { 2286e85357SHong Zhang Mat_SubSppt* smat = (Mat_SubSppt*)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */ 2386e85357SHong Zhang 2486e85357SHong Zhang if (smat && !smat->singleis) { 2586e85357SHong Zhang PetscInt i,nstages=smat->nstages; 2686e85357SHong Zhang for (i=0; i<nstages; i++) { 279566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*mat)[n+i])); 2886e85357SHong Zhang } 2986e85357SHong Zhang } 3086e85357SHong Zhang } 3186e85357SHong Zhang } 3286e85357SHong Zhang 3386e85357SHong Zhang /* memory is allocated even if n = 0 */ 349566063dSJacob Faibussowitsch PetscCall(PetscFree(*mat)); 3586e85357SHong Zhang PetscFunctionReturn(0); 3686e85357SHong Zhang } 3786e85357SHong Zhang 38a3b2e22bSHong Zhang PetscErrorCode MatDestroy_Dummy(Mat A) 39a3b2e22bSHong Zhang { 40a3b2e22bSHong Zhang PetscFunctionBegin; 419566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)A,NULL)); 42a3b2e22bSHong Zhang PetscFunctionReturn(0); 43a3b2e22bSHong Zhang } 44a3b2e22bSHong Zhang 45a3b2e22bSHong Zhang /*MC 46a3b2e22bSHong Zhang MATDUMMY - A matrix type to be used for reusing specific internal data structure. 47a3b2e22bSHong Zhang 481d36bdfdSBarry Smith Level: developer 49a3b2e22bSHong Zhang 50*db781477SPatrick Sanan .seealso: `Mat` 51a3b2e22bSHong Zhang 52a3b2e22bSHong Zhang M*/ 53a3b2e22bSHong Zhang 54a3b2e22bSHong Zhang PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) 55a3b2e22bSHong Zhang { 56a3b2e22bSHong Zhang PetscFunctionBegin; 57a3b2e22bSHong Zhang /* matrix ops */ 589566063dSJacob Faibussowitsch PetscCall(PetscMemzero(A->ops,sizeof(struct _MatOps))); 59a3b2e22bSHong Zhang A->ops->destroy = MatDestroy_Dummy; 6086e85357SHong Zhang A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 61a3b2e22bSHong Zhang 62a3b2e22bSHong Zhang /* special MATPREALLOCATOR functions */ 639566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)A,MATDUMMY)); 64a3b2e22bSHong Zhang PetscFunctionReturn(0); 65a3b2e22bSHong Zhang } 66