xref: /petsc/src/mat/impls/dummy/matdummy.c (revision 9c5460f9064ca60dd71a234a1f6faf93e7a6b0c9)
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 Faibussowitsch PetscErrorCode 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 Faibussowitsch PetscErrorCode 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 Faibussowitsch static 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 Faibussowitsch PETSC_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