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:   PetscCtxDestroyFn *destroy;
     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);