1a3b2e22bSHong Zhang #include <petsc/private/matimpl.h> /*I "petscmat.h" I*/ 216b64355SHong Zhang #include <../src/mat/impls/aij/seq/aij.h> 316b64355SHong Zhang 49371c9d4SSatish Balay PetscErrorCode MatDestroySubMatrix_Dummy(Mat C) { 55c39f6d9SHong Zhang Mat_SubSppt *submatj = (Mat_SubSppt *)C->data; 616b64355SHong Zhang 716b64355SHong Zhang PetscFunctionBegin; 89566063dSJacob Faibussowitsch PetscCall(submatj->destroy(C)); 99566063dSJacob Faibussowitsch PetscCall(MatDestroySubMatrix_Private(submatj)); 1016b64355SHong Zhang PetscFunctionReturn(0); 1116b64355SHong Zhang } 12a3b2e22bSHong Zhang 139371c9d4SSatish Balay PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[]) { 1486e85357SHong Zhang PetscFunctionBegin; 1586e85357SHong Zhang /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */ 1686e85357SHong Zhang if ((*mat)[n]) { 1786e85357SHong Zhang PetscBool isdummy; 189566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)(*mat)[n], MATDUMMY, &isdummy)); 1986e85357SHong Zhang if (isdummy) { 2086e85357SHong Zhang Mat_SubSppt *smat = (Mat_SubSppt *)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */ 2186e85357SHong Zhang 2286e85357SHong Zhang if (smat && !smat->singleis) { 2386e85357SHong Zhang PetscInt i, nstages = smat->nstages; 24*48a46eb9SPierre Jolivet for (i = 0; i < nstages; i++) PetscCall(MatDestroy(&(*mat)[n + i])); 2586e85357SHong Zhang } 2686e85357SHong Zhang } 2786e85357SHong Zhang } 2886e85357SHong Zhang 2986e85357SHong Zhang /* memory is allocated even if n = 0 */ 309566063dSJacob Faibussowitsch PetscCall(PetscFree(*mat)); 3186e85357SHong Zhang PetscFunctionReturn(0); 3286e85357SHong Zhang } 3386e85357SHong Zhang 349371c9d4SSatish Balay PetscErrorCode MatDestroy_Dummy(Mat A) { 35a3b2e22bSHong Zhang PetscFunctionBegin; 369566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)A, NULL)); 37a3b2e22bSHong Zhang PetscFunctionReturn(0); 38a3b2e22bSHong Zhang } 39a3b2e22bSHong Zhang 40a3b2e22bSHong Zhang /*MC 41a3b2e22bSHong Zhang MATDUMMY - A matrix type to be used for reusing specific internal data structure. 42a3b2e22bSHong Zhang 431d36bdfdSBarry Smith Level: developer 44a3b2e22bSHong Zhang 45db781477SPatrick Sanan .seealso: `Mat` 46a3b2e22bSHong Zhang 47a3b2e22bSHong Zhang M*/ 48a3b2e22bSHong Zhang 499371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) { 50a3b2e22bSHong Zhang PetscFunctionBegin; 51a3b2e22bSHong Zhang /* matrix ops */ 529566063dSJacob Faibussowitsch PetscCall(PetscMemzero(A->ops, sizeof(struct _MatOps))); 53a3b2e22bSHong Zhang A->ops->destroy = MatDestroy_Dummy; 5486e85357SHong Zhang A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 55a3b2e22bSHong Zhang 56a3b2e22bSHong Zhang /* special MATPREALLOCATOR functions */ 579566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)A, MATDUMMY)); 58a3b2e22bSHong Zhang PetscFunctionReturn(0); 59a3b2e22bSHong Zhang } 60