Actual source code: shell.h

  1: #pragma once

  3: #include <petsc/private/matimpl.h>
  4: #include <petsc/private/vecimpl.h>

  6: struct _MatShellOps {
  7:   /*   3 */ PetscErrorCode (*mult)(Mat, Vec, Vec);
  8:   /*   5 */ PetscErrorCode (*multtranspose)(Mat, Vec, Vec);
  9:   /*  17 */ PetscErrorCode (*getdiagonal)(Mat, Vec);
 10:   /*  32 */ PetscErrorCode (*getdiagonalblock)(Mat, Mat *);
 11:   /*  43 */ PetscErrorCode (*copy)(Mat, Mat, MatStructure);
 12:   /*  60 */ PetscErrorCode (*destroy)(Mat);
 13:   /* 121 */ PetscErrorCode (*multhermitiantranspose)(Mat, Vec, Vec);
 14: };

 16: struct _n_MatShellMatFunctionList {
 17:   PetscErrorCode (*symbolic)(Mat, Mat, Mat, void **);
 18:   PetscErrorCode (*numeric)(Mat, Mat, Mat, void *);
 19:   PetscErrorCode (*destroy)(void *);
 20:   MatProductType ptype;
 21:   char          *composedname; /* string to identify routine with double dispatch */
 22:   char          *resultname;   /* result matrix type */

 24:   struct _n_MatShellMatFunctionList *next;
 25: };
 26: typedef struct _n_MatShellMatFunctionList *MatShellMatFunctionList;

 28: typedef struct {
 29:   struct _MatShellOps ops[1];

 31:   /* The user will manage the scaling and shifts for the MATSHELL, not the default */
 32:   PetscBool managescalingshifts;

 34:   /* support for MatScale, MatShift and MatMultAdd */
 35:   PetscScalar vscale, vshift;
 36:   Vec         dshift;
 37:   Vec         left, right;
 38:   Vec         left_work, right_work;
 39:   Vec         left_add_work, right_add_work;

 41:   /* support for MatAXPY */
 42:   Mat              axpy;
 43:   PetscScalar      axpy_vscale;
 44:   Vec              axpy_left, axpy_right;
 45:   PetscObjectState axpy_state;

 47:   /* support for ZeroRows/Columns operations */
 48:   IS         zrows;
 49:   IS         zcols;
 50:   Vec        zvals;
 51:   Vec        zvals_w;
 52:   VecScatter zvals_sct_r;
 53:   VecScatter zvals_sct_c;

 55:   /* MatMat operations */
 56:   MatShellMatFunctionList matmat;

 58:   /* user defined context */
 59:   PetscContainer ctxcontainer;
 60: } Mat_Shell;

 62: PETSC_INTERN PetscErrorCode MatAssemblyEnd_Shell(Mat X, MatAssemblyType assembly);