xref: /petsc/src/mat/impls/dummy/matdummy.c (revision 86e853574b4da5b5ec8a4530edf4d7f4f5e0911f)
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 {
616b64355SHong Zhang   PetscErrorCode ierr;
75c39f6d9SHong Zhang   Mat_SubSppt    *submatj = (Mat_SubSppt*)C->data;
816b64355SHong Zhang 
916b64355SHong Zhang   PetscFunctionBegin;
1016b64355SHong Zhang   ierr = submatj->destroy(C);CHKERRQ(ierr);
11f68bb481SHong Zhang   ierr = MatDestroySubMatrix_Private(submatj);CHKERRQ(ierr);
1216b64355SHong Zhang   PetscFunctionReturn(0);
1316b64355SHong Zhang }
14a3b2e22bSHong Zhang 
15*86e85357SHong Zhang PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[])
16*86e85357SHong Zhang {
17*86e85357SHong Zhang   PetscErrorCode ierr;
18*86e85357SHong Zhang 
19*86e85357SHong Zhang   PetscFunctionBegin;
20*86e85357SHong Zhang   /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */
21*86e85357SHong Zhang   if ((*mat)[n]) {
22*86e85357SHong Zhang     PetscBool      isdummy;
23*86e85357SHong Zhang     ierr = PetscObjectTypeCompare((PetscObject)(*mat)[n],MATDUMMY,&isdummy);CHKERRQ(ierr);
24*86e85357SHong Zhang     if (isdummy) {
25*86e85357SHong Zhang       Mat_SubSppt* smat = (Mat_SubSppt*)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */
26*86e85357SHong Zhang 
27*86e85357SHong Zhang       if (smat && !smat->singleis) {
28*86e85357SHong Zhang         PetscInt i,nstages=smat->nstages;
29*86e85357SHong Zhang         for (i=0; i<nstages; i++) {
30*86e85357SHong Zhang           ierr = MatDestroy(&(*mat)[n+i]);CHKERRQ(ierr);
31*86e85357SHong Zhang         }
32*86e85357SHong Zhang       }
33*86e85357SHong Zhang     }
34*86e85357SHong Zhang   }
35*86e85357SHong Zhang 
36*86e85357SHong Zhang   /* memory is allocated even if n = 0 */
37*86e85357SHong Zhang   ierr = PetscFree(*mat);CHKERRQ(ierr);
38*86e85357SHong Zhang   PetscFunctionReturn(0);
39*86e85357SHong Zhang }
40*86e85357SHong Zhang 
41a3b2e22bSHong Zhang PetscErrorCode MatDestroy_Dummy(Mat A)
42a3b2e22bSHong Zhang {
43a3b2e22bSHong Zhang   PetscErrorCode ierr;
44a3b2e22bSHong Zhang 
45a3b2e22bSHong Zhang   PetscFunctionBegin;
46a3b2e22bSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)A,0);CHKERRQ(ierr);
47a3b2e22bSHong Zhang   PetscFunctionReturn(0);
48a3b2e22bSHong Zhang }
49a3b2e22bSHong Zhang 
50a3b2e22bSHong Zhang /*MC
51a3b2e22bSHong Zhang    MATDUMMY - A matrix type to be used for reusing specific internal data structure.
52a3b2e22bSHong Zhang 
53a3b2e22bSHong Zhang   Level: advanced
54a3b2e22bSHong Zhang 
55a3b2e22bSHong Zhang .seealso: Mat
56a3b2e22bSHong Zhang 
57a3b2e22bSHong Zhang M*/
58a3b2e22bSHong Zhang 
59a3b2e22bSHong Zhang PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A)
60a3b2e22bSHong Zhang {
61a3b2e22bSHong Zhang   PetscErrorCode    ierr;
62a3b2e22bSHong Zhang 
63a3b2e22bSHong Zhang   PetscFunctionBegin;
64a3b2e22bSHong Zhang   /* matrix ops */
65a3b2e22bSHong Zhang   ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr);
66a3b2e22bSHong Zhang   A->ops->destroy            = MatDestroy_Dummy;
67*86e85357SHong Zhang   A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy;
68a3b2e22bSHong Zhang 
69a3b2e22bSHong Zhang   /* special MATPREALLOCATOR functions */
70a3b2e22bSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)A,MATDUMMY);CHKERRQ(ierr);
71a3b2e22bSHong Zhang   PetscFunctionReturn(0);
72a3b2e22bSHong Zhang }
73