xref: /petsc/src/mat/impls/mffd/mffdimpl.h (revision ccfb0f9f40a0131988d7995ed9679700dae2a75a)
1 /*
2     This file should be included in NEW routines that compute the
3     differencing parameter for finite difference based matrix-free
4     methods.  For example, such routines can compute h for use in
5     Jacobian-vector products of the form
6 
7                        F(x+ha) - F(x)
8           F'(u)a  ~=  ----------------
9                             h
10 */
11 #pragma once
12 
13 #include <petscmat.h> /*I  "petscmat.h"   I*/
14 #include <petsc/private/petscimpl.h>
15 
16 /*
17  Table of functions that manage the computation and understanding
18  of the parameter for finite difference based matrix-free computations
19 */
20 struct _MFOps {
21   PetscErrorCode (*compute)(MatMFFD, Vec, Vec, PetscScalar *, PetscBool *zeroa);
22   PetscErrorCode (*view)(MatMFFD, PetscViewer);
23   PetscErrorCode (*destroy)(MatMFFD);
24   PetscErrorCode (*setfromoptions)(MatMFFD, PetscOptionItems);
25 };
26 
27 /* context for default matrix-free SNES */
28 struct _p_MatMFFD {
29   PETSCHEADER(struct _MFOps);
30   Vec              w;         /* work vector */
31   PetscReal        error_rel; /* square root of relative error in computing function */
32   PetscScalar      currenth;  /* last differencing parameter h used */
33   PetscScalar     *historyh;  /* history of differencing parameter h */
34   PetscInt         ncurrenth, maxcurrenth;
35   void            *hctx;
36   Mat              mat;             /* back reference to shell matrix that contains this */
37   PetscInt         recomputeperiod; /* how often the h is recomputed; default to 1 */
38   PetscInt         count;           /* used by recomputeperiod */
39   MatMFFDCheckhFn *checkh;
40   void            *checkhctx; /* optional context used by MatMFFDSetCheckh() */
41 
42   MatMFFDFn *func;      /* function used for matrix-free */
43   void      *funcctx;   /* the context for the function */
44   Vec        current_f; /* location of F(u); used with F(u+h) */
45   PetscBool  current_f_allocated;
46   Vec        current_u; /* location of u; used with F(u+h) */
47 
48   MatMFFDiFn     *funci;        /* Evaluates func_[i]() */
49   MatMFFDiBaseFn *funcisetbase; /* Sets base for future evaluations of func_[i]() */
50 
51   void *ctx; /* this is used by MatCreateSNESMF() to store the SNES object */
52 #if defined(PETSC_USE_COMPLEX)
53   PetscBool usecomplex; /* use the Lyness complex number trick to compute the matrix-vector product */
54 #endif
55 };
56 
57 PETSC_EXTERN PetscFunctionList MatMFFDList;
58 PETSC_EXTERN PetscBool         MatMFFDRegisterAllCalled;
59 PETSC_EXTERN PetscErrorCode    MatMFFDRegisterAll(void);
60