xref: /petsc/src/mat/impls/dummy/matdummy.c (revision 9566063d113dddea24716c546802770db7481bc0)
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;
9*9566063dSJacob Faibussowitsch   PetscCall(submatj->destroy(C));
10*9566063dSJacob 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;
20*9566063dSJacob 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++) {
27*9566063dSJacob 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 */
34*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(*mat));
3586e85357SHong Zhang   PetscFunctionReturn(0);
3686e85357SHong Zhang }
3786e85357SHong Zhang 
38a3b2e22bSHong Zhang PetscErrorCode MatDestroy_Dummy(Mat A)
39a3b2e22bSHong Zhang {
40a3b2e22bSHong Zhang   PetscFunctionBegin;
41*9566063dSJacob 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 
50a3b2e22bSHong Zhang .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 */
58*9566063dSJacob 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 */
63*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)A,MATDUMMY));
64a3b2e22bSHong Zhang   PetscFunctionReturn(0);
65a3b2e22bSHong Zhang }
66