Actual source code: mffdimpl.h

      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

      7:                        F(x+ha) - F(x)
      8:           F'(u)a  ~=  ----------------
      9:                             h
     10: */
     11: #pragma once

     13: #include <petscmat.h>
     14: #include <petsc/private/petscimpl.h>

     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: };

     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() */

     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) */

     48:   MatMFFDiFn     *funci;        /* Evaluates func_[i]() */
     49:   MatMFFDiBaseFn *funcisetbase; /* Sets base for future evaluations of func_[i]() */

     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: };

     57: PETSC_EXTERN PetscFunctionList MatMFFDList;
     58: PETSC_EXTERN PetscBool         MatMFFDRegisterAllCalled;
     59: PETSC_EXTERN PetscErrorCode    MatMFFDRegisterAll(void);