xref: /petsc/src/mat/impls/dummy/matdummy.c (revision bef158480efac06de457f7a665168877ab3c2fd7)
1 #include <petsc/private/matimpl.h>      /*I "petscmat.h" I*/
2 #include <../src/mat/impls/aij/seq/aij.h>
3 
4 PetscErrorCode MatDestroySubMatrix_Dummy(Mat C)
5 {
6   PetscErrorCode ierr;
7   Mat_SubSppt    *submatj = (Mat_SubSppt*)C->data;
8 
9   PetscFunctionBegin;
10   ierr = submatj->destroy(C);CHKERRQ(ierr);
11   ierr = MatDestroySubMatrix_Private(submatj);CHKERRQ(ierr);
12   PetscFunctionReturn(0);
13 }
14 
15 PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[])
16 {
17   PetscErrorCode ierr;
18 
19   PetscFunctionBegin;
20   /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */
21   if ((*mat)[n]) {
22     PetscBool      isdummy;
23     ierr = PetscObjectTypeCompare((PetscObject)(*mat)[n],MATDUMMY,&isdummy);CHKERRQ(ierr);
24     if (isdummy) {
25       Mat_SubSppt* smat = (Mat_SubSppt*)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */
26 
27       if (smat && !smat->singleis) {
28         PetscInt i,nstages=smat->nstages;
29         for (i=0; i<nstages; i++) {
30           ierr = MatDestroy(&(*mat)[n+i]);CHKERRQ(ierr);
31         }
32       }
33     }
34   }
35 
36   /* memory is allocated even if n = 0 */
37   ierr = PetscFree(*mat);CHKERRQ(ierr);
38   PetscFunctionReturn(0);
39 }
40 
41 PetscErrorCode MatDestroy_Dummy(Mat A)
42 {
43   PetscErrorCode ierr;
44 
45   PetscFunctionBegin;
46   ierr = PetscObjectChangeTypeName((PetscObject)A,NULL);CHKERRQ(ierr);
47   PetscFunctionReturn(0);
48 }
49 
50 /*MC
51    MATDUMMY - A matrix type to be used for reusing specific internal data structure.
52 
53   Level: developer
54 
55 .seealso: Mat
56 
57 M*/
58 
59 PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A)
60 {
61   PetscErrorCode    ierr;
62 
63   PetscFunctionBegin;
64   /* matrix ops */
65   ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr);
66   A->ops->destroy            = MatDestroy_Dummy;
67   A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy;
68 
69   /* special MATPREALLOCATOR functions */
70   ierr = PetscObjectChangeTypeName((PetscObject)A,MATDUMMY);CHKERRQ(ierr);
71   PetscFunctionReturn(0);
72 }
73