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: {
      7:   Mat_SubSppt    *submatj = (Mat_SubSppt*)C->data;

     10:   submatj->destroy(C);
     11:   MatDestroySubMatrix_Private(submatj);
     12:   return(0);
     13: }

     15: PetscErrorCode MatDestroySubMatrices_Dummy(PetscInt n, Mat *mat[])
     16: {

     20:   /* Destroy dummy submatrices (*mat)[n]...(*mat)[n+nstages-1] used for reuse struct Mat_SubSppt */
     21:   if ((*mat)[n]) {
     22:     PetscBool      isdummy;
     23:     PetscObjectTypeCompare((PetscObject)(*mat)[n],MATDUMMY,&isdummy);
     24:     if (isdummy) {
     25:       Mat_SubSppt* smat = (Mat_SubSppt*)((*mat)[n]->data); /* singleis and nstages are saved in (*mat)[n]->data */

     27:       if (smat && !smat->singleis) {
     28:         PetscInt i,nstages=smat->nstages;
     29:         for (i=0; i<nstages; i++) {
     30:           MatDestroy(&(*mat)[n+i]);
     31:         }
     32:       }
     33:     }
     34:   }

     36:   /* memory is allocated even if n = 0 */
     37:   PetscFree(*mat);
     38:   return(0);
     39: }

     41: PetscErrorCode MatDestroy_Dummy(Mat A)
     42: {

     46:   PetscObjectChangeTypeName((PetscObject)A,NULL);
     47:   return(0);
     48: }

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

     53:   Level: developer

     55: .seealso: Mat

     57: M*/

     59: PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat A)
     60: {
     61:   PetscErrorCode    ierr;

     64:   /* matrix ops */
     65:   PetscMemzero(A->ops,sizeof(struct _MatOps));
     66:   A->ops->destroy            = MatDestroy_Dummy;
     67:   A->ops->destroysubmatrices = MatDestroySubMatrices_Dummy;

     69:   /* special MATPREALLOCATOR functions */
     70:   PetscObjectChangeTypeName((PetscObject)A,MATDUMMY);
     71:   return(0);
     72: }