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:   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: }