Actual source code: matdummy.c

  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:   PetscFunctionBegin;
  9:   PetscCall(submatj->destroy(C));
 10:   PetscCall(MatDestroySubMatrix_Private(submatj));
 11:   PetscFunctionReturn(PETSC_SUCCESS);
 12: }

 14: PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[])
 15: {
 16:   PetscFunctionBegin;
 17:   /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */
 18:   if ((*mat)[n]) {
 19:     PetscBool isdummy;
 20:     PetscCall(PetscObjectTypeCompare((PetscObject)(*mat)[n], MATDUMMY, &isdummy));
 21:     if (isdummy) {
 22:       Mat_SubSppt *smat = (Mat_SubSppt *)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */

 24:       if (smat && !smat->singleis) {
 25:         PetscInt i, nstages = smat->nstages;
 26:         for (i = 0; i < nstages; i++) PetscCall(MatDestroy(&(*mat)[n + i]));
 27:       }
 28:     }
 29:   }

 31:   /* memory is allocated even if n = 0 */
 32:   PetscCall(PetscFree(*mat));
 33:   PetscFunctionReturn(PETSC_SUCCESS);
 34: }

 36: static PetscErrorCode MatDestroy_Dummy(Mat A)
 37: {
 38:   PetscFunctionBegin;
 39:   PetscCall(PetscObjectChangeTypeName((PetscObject)A, NULL));
 40:   PetscFunctionReturn(PETSC_SUCCESS);
 41: }

 43: /*MC
 44:    MATDUMMY - A matrix type to be used for reusing specific internal data structure.

 46:   Level: developer

 48: .seealso: `Mat`
 49: M*/

 51: PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A)
 52: {
 53:   PetscFunctionBegin;
 54:   /* matrix ops */
 55:   PetscCall(PetscMemzero(A->ops, sizeof(struct _MatOps)));
 56:   A->ops->destroy            = MatDestroy_Dummy;
 57:   A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy;

 59:   /* special MATPREALLOCATOR functions */
 60:   PetscCall(PetscObjectChangeTypeName((PetscObject)A, MATDUMMY));
 61:   PetscFunctionReturn(PETSC_SUCCESS);
 62: }