xref: /petsc/src/snes/impls/tr/trimpl.h (revision 9f55a80c5994219f655b6306b362625b9957fa37) !
1acbee50cSBarry Smith /*
2acbee50cSBarry Smith    Context for a Newton trust region method for solving a system
3acbee50cSBarry Smith    of nonlinear equations
4acbee50cSBarry Smith  */
5acbee50cSBarry Smith 
6a4963045SJacob Faibussowitsch #pragma once
7af0996ceSBarry Smith #include <petsc/private/snesimpl.h>
8acbee50cSBarry Smith 
9acbee50cSBarry Smith typedef struct {
10*3201ab8dSStefano Zampini   PetscReal delta; /* trust region radius */
11*3201ab8dSStefano Zampini 
12*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, delta0); /* initial radius for trust region */
13*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, deltaM); /* maximum radius for trust region */
14*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, deltam); /* minimum radius for trust region */
15*3201ab8dSStefano Zampini 
164b0a5c37SStefano Zampini   PetscReal kmdc; /* sufficient decrease parameter */
174a221d59SStefano Zampini 
184a221d59SStefano Zampini   /*
194a221d59SStefano Zampini     Given rho = (fk - fkp1) / (m(0) - m(pk))
204a221d59SStefano Zampini 
214a221d59SStefano Zampini     The radius is modified as:
224a221d59SStefano Zampini       rho < eta2 -> delta *= t1
234a221d59SStefano Zampini       rho > eta3 -> delta *= t2
244a221d59SStefano Zampini       delta = min(delta,deltaM)
254a221d59SStefano Zampini 
264a221d59SStefano Zampini     The step is accepted if rho > eta1
27*3201ab8dSStefano Zampini     The iterative process is halted if delta < deltam
284a221d59SStefano Zampini   */
29*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, eta1);
30*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, eta2);
31*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, eta3);
32*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, t1);
33*3201ab8dSStefano Zampini   PetscObjectParameterDeclare(PetscReal, t2);
344a221d59SStefano Zampini 
3524fb275aSStefano Zampini   /* Use quasi-Newton models for J and (possibly different) Jp */
3624fb275aSStefano Zampini   SNESNewtonTRQNType qn;
3724fb275aSStefano Zampini   Mat                qnB;
3824fb275aSStefano Zampini   Mat                qnB_pre;
3924fb275aSStefano Zampini 
4024fb275aSStefano Zampini   /* The type of norm for the trust region */
4124fb275aSStefano Zampini   NormType norm;
4224fb275aSStefano Zampini 
434a221d59SStefano Zampini   SNESNewtonTRFallbackType fallback; /* enum to distinguish fallback in case Newton step is outside of the trust region */
444a221d59SStefano Zampini 
45c9368356SGlenn Hammond   PetscErrorCode (*precheck)(SNES, Vec, Vec, PetscBool *, void *);
46c9368356SGlenn Hammond   void *precheckctx;
47c9368356SGlenn Hammond   PetscErrorCode (*postcheck)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *);
487cb011f5SBarry Smith   void *postcheckctx;
4904d7464bSBarry Smith } SNES_NEWTONTR;
50