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

     15: #include <petscmat.h>
     16: #include <petsc/private/petscimpl.h>

     18: /*
     19:     Table of functions that manage the computation and understanding
     20:     of the parameter for finite difference based matrix-free computations
     21: */
     22: struct _MFOps {
     23:   PetscErrorCode (*compute)(MatMFFD,Vec,Vec,PetscScalar*,PetscBool * zeroa);
     24:   PetscErrorCode (*view)(MatMFFD,PetscViewer);
     25:   PetscErrorCode (*destroy)(MatMFFD);
     26:   PetscErrorCode (*setfromoptions)(PetscOptionItems*,MatMFFD);
     27: };

     29: /* context for default matrix-free SNES */
     30: struct _p_MatMFFD {
     31:   PETSCHEADER(struct _MFOps);
     32:   Vec            w;                                     /* work vector */
     33:   PetscReal      error_rel;                             /* square root of relative error in computing function */
     34:   PetscScalar    currenth;                              /* last differencing parameter h used */
     35:   PetscScalar    *historyh;                             /* history of differencing parameter h */
     36:   PetscInt       ncurrenth,maxcurrenth;
     37:   void           *hctx;
     38:   Mat            mat;                                   /* back reference to shell matrix that contains this */
     39:   PetscInt       recomputeperiod;                       /* how often the h is recomputed; default to 1 */
     40:   PetscInt       count;                                 /* used by recomputeperiod */
     41:   PetscErrorCode (*checkh)(void*,Vec,Vec,PetscScalar*);
     42:   void           *checkhctx;                            /* optional context used by MatMFFDSetCheckh() */

     44:   PetscErrorCode (*func)(void*,Vec,Vec); /* function used for matrix free */
     45:   void           *funcctx;               /* the context for the function */
     46:   Vec            current_f;              /* location of F(u); used with F(u+h) */
     47:   PetscBool      current_f_allocated;
     48:   Vec            current_u;              /* location of u; used with F(u+h) */

     50:   PetscErrorCode (*funci)(void*,PetscInt,Vec,PetscScalar*); /* Evaluates func_[i]() */
     51:   PetscErrorCode (*funcisetbase)(void*,Vec);                /* Sets base for future evaluations of func_[i]() */

     53:   void           *ctx;            /* this is used by MatCreateSNESMF() to store the SNES object */
     54: #if defined(PETSC_USE_COMPLEX)
     55:   PetscBool      usecomplex;      /* use Lyness complex number trick to compute the matrix-vector product */
     56: #endif
     57: };

     59: PETSC_EXTERN PetscFunctionList MatMFFDList;
     60: PETSC_EXTERN PetscBool         MatMFFDRegisterAllCalled;
     61: PETSC_EXTERN PetscErrorCode    MatMFFDRegisterAll(void);

     63: #endif