Actual source code: snesmfj.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 include/petscsnes.h

 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)(MatSNESMFCtx,Vec,Vec,PetscScalar *,PetscTruth* zeroa);
 23:   PetscErrorCode (*view)(MatSNESMFCtx,PetscViewer);
 24:   PetscErrorCode (*destroy)(MatSNESMFCtx);
 25:   PetscErrorCode (*setfromoptions)(MatSNESMFCtx);
 26: };

 28: struct _p_MatSNESMFCtx {    /* context for default matrix-free SNES */
 29:   PETSCHEADER(struct _MFOps);
 30:   SNES             snes;                   /* nonlinear solver */
 31:   Vec              w;                      /* work vector */
 32:   MatNullSpace     sp;                     /* null space context */
 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:   void             *checkhctx;             /* optional context used by MatSNESMFSetCheckh() */
 42:   PetscErrorCode (*checkh)(Vec,Vec,PetscScalar*,void*);
 43:   /*
 44:         The next three are used only if user called MatSNESMFSetFunction()
 45:   */
 46:   PetscErrorCode (*func)(SNES,Vec,Vec,void*);  /* function used for matrix free */
 47:   void             *funcctx;                     /* the context for the function */
 48:   Vec              funcvec;                      /* location to store func(u) */
 49:   Vec              current_f;                    /* location of F(u); used with F(u+h) */
 50:   Vec              current_u;                    /* location of u; used with F(u+h) */

 52:   PetscTruth       usesnes;                      /* if false indicates that one should (*func) 
 53:                                                     instead of SNES even if snes is present */

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

 58:   PetscScalar      vscale,vshift;
 59: };

 61: EXTERN PetscFList MatSNESMPetscFList;
 62: EXTERN PetscTruth MatSNESMFRegisterAllCalled;

 64: #endif