xref: /petsc/src/mat/impls/dummy/matdummy.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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