1a3b2e22bSHong Zhang #include <petsc/private/matimpl.h> /*I "petscmat.h" I*/ 216b64355SHong Zhang #include <../src/mat/impls/aij/seq/aij.h> 316b64355SHong Zhang MatDestroySubMatrix_Dummy(Mat C)4d71ae5a4SJacob FaibussowitschPetscErrorCode MatDestroySubMatrix_Dummy(Mat C) 5d71ae5a4SJacob Faibussowitsch { 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)); 113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1216b64355SHong Zhang } 13a3b2e22bSHong Zhang MatDestroySubMatrices_Dummy(PetscInt n,Mat * mat[])14d71ae5a4SJacob FaibussowitschPetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[]) 15d71ae5a4SJacob Faibussowitsch { 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; 2648a46eb9SPierre Jolivet for (i = 0; i < nstages; i++) PetscCall(MatDestroy(&(*mat)[n + i])); 2786e85357SHong Zhang } 2886e85357SHong Zhang } 2986e85357SHong Zhang } 3086e85357SHong Zhang 3186e85357SHong Zhang /* memory is allocated even if n = 0 */ 329566063dSJacob Faibussowitsch PetscCall(PetscFree(*mat)); 333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3486e85357SHong Zhang } 3586e85357SHong Zhang MatDestroy_Dummy(Mat A)36*66976f2fSJacob Faibussowitschstatic PetscErrorCode MatDestroy_Dummy(Mat A) 37d71ae5a4SJacob Faibussowitsch { 38a3b2e22bSHong Zhang PetscFunctionBegin; 399566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)A, NULL)); 403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 41a3b2e22bSHong Zhang } 42a3b2e22bSHong Zhang 43a3b2e22bSHong Zhang /*MC 44a3b2e22bSHong Zhang MATDUMMY - A matrix type to be used for reusing specific internal data structure. 45a3b2e22bSHong Zhang 461d36bdfdSBarry Smith Level: developer 47a3b2e22bSHong Zhang 48db781477SPatrick Sanan .seealso: `Mat` 49a3b2e22bSHong Zhang M*/ 50a3b2e22bSHong Zhang MatCreate_Dummy(Mat A)51d71ae5a4SJacob FaibussowitschPETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) 52d71ae5a4SJacob Faibussowitsch { 53a3b2e22bSHong Zhang PetscFunctionBegin; 54a3b2e22bSHong Zhang /* matrix ops */ 559566063dSJacob Faibussowitsch PetscCall(PetscMemzero(A->ops, sizeof(struct _MatOps))); 56a3b2e22bSHong Zhang A->ops->destroy = MatDestroy_Dummy; 5786e85357SHong Zhang A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 58a3b2e22bSHong Zhang 59a3b2e22bSHong Zhang /* special MATPREALLOCATOR functions */ 609566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)A, MATDUMMY)); 613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 62a3b2e22bSHong Zhang } 63