1: #include <petsc/private/matimpl.h> 2: #include <../src/mat/impls/aij/seq/aij.h> 4: PetscErrorCode MatDestroySubMatrix_Dummy(Mat C) 5: { 6: Mat_SubSppt *submatj = (Mat_SubSppt *)C->data; 8: submatj->destroy(C); 9: MatDestroySubMatrix_Private(submatj); 10: return 0; 11: } 13: PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[]) 14: { 15: /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */ 16: if ((*mat)[n]) { 17: PetscBool isdummy; 18: 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 */ 22: if (smat && !smat->singleis) { 23: PetscInt i, nstages = smat->nstages; 24: for (i = 0; i < nstages; i++) MatDestroy(&(*mat)[n + i]); 25: } 26: } 27: } 29: /* memory is allocated even if n = 0 */ 30: PetscFree(*mat); 31: return 0; 32: } 34: PetscErrorCode MatDestroy_Dummy(Mat A) 35: { 36: PetscObjectChangeTypeName((PetscObject)A, NULL); 37: return 0; 38: } 40: /*MC 41: MATDUMMY - A matrix type to be used for reusing specific internal data structure. 43: Level: developer 45: .seealso: `Mat` 46: M*/ 48: PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) 49: { 50: /* matrix ops */ 51: PetscMemzero(A->ops, sizeof(struct _MatOps)); 52: A->ops->destroy = MatDestroy_Dummy; 53: A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 55: /* special MATPREALLOCATOR functions */ 56: PetscObjectChangeTypeName((PetscObject)A, MATDUMMY); 57: return 0; 58: }