Actual source code: mffdimpl.h
petsc-3.3-p7 2013-05-11
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> /*I "petscmat.h" I*/
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);
26: };
28: struct _p_MatMFFD { /* context for default matrix-free SNES */
29: PETSCHEADER(struct _MFOps);
30: Vec w; /* work vector */
31: MatNullSpace sp; /* null space context */
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() */
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) */
49: PetscErrorCode (*funci)(void*,PetscInt,Vec,PetscScalar*); /* Evaluates func_[i]() */
50: PetscErrorCode (*funcisetbase)(void*,Vec); /* Sets base for future evaluations of func_[i]() */
52: PetscScalar vscale,vshift; /* diagonal scale and shift by scalars */
53: Vec dlscale,drscale,dshift; /* diagonal scale and shift by vectors */
54: };
56: extern PetscFList MatMFFDList;
57: extern PetscBool MatMFFDRegisterAllCalled;
59: #endif