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