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 Mat_SubSppt *submatj = (Mat_SubSppt *)C->data; 6 7 PetscFunctionBegin; 8 PetscCall(submatj->destroy(C)); 9 PetscCall(MatDestroySubMatrix_Private(submatj)); 10 PetscFunctionReturn(0); 11 } 12 13 PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[]) { 14 PetscFunctionBegin; 15 /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */ 16 if ((*mat)[n]) { 17 PetscBool isdummy; 18 PetscCall(PetscObjectTypeCompare((PetscObject)(*mat)[n], MATDUMMY, &isdummy)); 19 if (isdummy) { 20 Mat_SubSppt *smat = (Mat_SubSppt *)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */ 21 22 if (smat && !smat->singleis) { 23 PetscInt i, nstages = smat->nstages; 24 for (i = 0; i < nstages; i++) { PetscCall(MatDestroy(&(*mat)[n + i])); } 25 } 26 } 27 } 28 29 /* memory is allocated even if n = 0 */ 30 PetscCall(PetscFree(*mat)); 31 PetscFunctionReturn(0); 32 } 33 34 PetscErrorCode MatDestroy_Dummy(Mat A) { 35 PetscFunctionBegin; 36 PetscCall(PetscObjectChangeTypeName((PetscObject)A, NULL)); 37 PetscFunctionReturn(0); 38 } 39 40 /*MC 41 MATDUMMY - A matrix type to be used for reusing specific internal data structure. 42 43 Level: developer 44 45 .seealso: `Mat` 46 47 M*/ 48 49 PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) { 50 PetscFunctionBegin; 51 /* matrix ops */ 52 PetscCall(PetscMemzero(A->ops, sizeof(struct _MatOps))); 53 A->ops->destroy = MatDestroy_Dummy; 54 A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 55 56 /* special MATPREALLOCATOR functions */ 57 PetscCall(PetscObjectChangeTypeName((PetscObject)A, MATDUMMY)); 58 PetscFunctionReturn(0); 59 } 60