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