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++) { 25: MatDestroy(&(*mat)[n+i]); 26: } 27: } 28: } 29: } 31: /* memory is allocated even if n = 0 */ 32: PetscFree(*mat); 33: return 0; 34: } 36: PetscErrorCode MatDestroy_Dummy(Mat A) 37: { 38: PetscObjectChangeTypeName((PetscObject)A,NULL); 39: return 0; 40: } 42: /*MC 43: MATDUMMY - A matrix type to be used for reusing specific internal data structure. 45: Level: developer 47: .seealso: Mat 49: M*/ 51: PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A) 52: { 53: /* matrix ops */ 54: PetscMemzero(A->ops,sizeof(struct _MatOps)); 55: A->ops->destroy = MatDestroy_Dummy; 56: A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy; 58: /* special MATPREALLOCATOR functions */ 59: PetscObjectChangeTypeName((PetscObject)A,MATDUMMY); 60: return 0; 61: }