xref: /petsc/src/mat/impls/shell/shell.h (revision d52a580b706c59ca78066c1e38754e45b6b56e2b)
1 #pragma once
2 
3 #include <petsc/private/matimpl.h>
4 #include <petsc/private/vecimpl.h>
5 
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 };
15 
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 */
23 
24   struct _n_MatShellMatFunctionList *next;
25 };
26 typedef struct _n_MatShellMatFunctionList *MatShellMatFunctionList;
27 
28 typedef struct {
29   struct _MatShellOps ops[1];
30 
31   /* The user will manage the scaling and shifts for the MATSHELL, not the default */
32   PetscBool managescalingshifts;
33 
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;
40 
41   /* support for MatAXPY */
42   Mat              axpy;
43   PetscScalar      axpy_vscale;
44   Vec              axpy_left, axpy_right;
45   PetscObjectState axpy_state;
46 
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;
54 
55   /* MatMat operations */
56   MatShellMatFunctionList matmat;
57 
58   /* user defined context */
59   PetscContainer ctxcontainer;
60 } Mat_Shell;
61 
62 PETSC_INTERN PetscErrorCode MatAssemblyEnd_Shell(Mat X, MatAssemblyType assembly);
63