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);