Actual source code: trimpl.h
1: /*
2: Context for a Newton trust region method for solving a system
3: of nonlinear equations
4: */
6: #pragma once
7: #include <petsc/private/snesimpl.h>
9: typedef struct {
10: PetscReal delta; /* trust region parameter */
11: PetscReal delta0; /* initial radius for trust region */
12: PetscReal deltaM; /* maximum radius for trust region */
13: PetscReal kmdc; /* sufficient decrease parameter */
15: /*
16: Given rho = (fk - fkp1) / (m(0) - m(pk))
18: The radius is modified as:
19: rho < eta2 -> delta *= t1
20: rho > eta3 -> delta *= t2
21: delta = min(delta,deltaM)
23: The step is accepted if rho > eta1
24: */
25: PetscReal eta1;
26: PetscReal eta2;
27: PetscReal eta3;
28: PetscReal t1;
29: PetscReal t2;
31: /* Use quasi-Newton models for J and (possibly different) Jp */
32: SNESNewtonTRQNType qn;
33: Mat qnB;
34: Mat qnB_pre;
36: /* The type of norm for the trust region */
37: NormType norm;
39: SNESNewtonTRFallbackType fallback; /* enum to distinguish fallback in case Newton step is outside of the trust region */
41: PetscErrorCode (*precheck)(SNES, Vec, Vec, PetscBool *, void *);
42: void *precheckctx;
43: PetscErrorCode (*postcheck)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *);
44: void *postcheckctx;
45: } SNES_NEWTONTR;