Actual source code: taoimpl.h
1: #pragma once
3: #include <petsctao.h>
4: #include <petsctaolinesearch.h>
5: #include <petsc/private/petscimpl.h>
7: PETSC_EXTERN PetscBool TaoRegisterAllCalled;
8: PETSC_EXTERN PetscErrorCode TaoRegisterAll(void);
10: typedef struct _TaoOps *TaoOps;
12: struct _TaoOps {
13: /* Methods set by application */
14: PetscErrorCode (*computeobjective)(Tao, Vec, PetscReal *, void *);
15: PetscErrorCode (*computeobjectiveandgradient)(Tao, Vec, PetscReal *, Vec, void *);
16: PetscErrorCode (*computegradient)(Tao, Vec, Vec, void *);
17: PetscErrorCode (*computehessian)(Tao, Vec, Mat, Mat, void *);
18: PetscErrorCode (*computeresidual)(Tao, Vec, Vec, void *);
19: PetscErrorCode (*computeresidualjacobian)(Tao, Vec, Mat, Mat, void *);
20: PetscErrorCode (*computeconstraints)(Tao, Vec, Vec, void *);
21: PetscErrorCode (*computeinequalityconstraints)(Tao, Vec, Vec, void *);
22: PetscErrorCode (*computeequalityconstraints)(Tao, Vec, Vec, void *);
23: PetscErrorCode (*computejacobian)(Tao, Vec, Mat, Mat, void *);
24: PetscErrorCode (*computejacobianstate)(Tao, Vec, Mat, Mat, Mat, void *);
25: PetscErrorCode (*computejacobiandesign)(Tao, Vec, Mat, void *);
26: PetscErrorCode (*computejacobianinequality)(Tao, Vec, Mat, Mat, void *);
27: PetscErrorCode (*computejacobianequality)(Tao, Vec, Mat, Mat, void *);
28: PetscErrorCode (*computebounds)(Tao, Vec, Vec, void *);
29: PetscErrorCode (*update)(Tao, PetscInt, void *);
30: PetscErrorCode (*convergencetest)(Tao, void *);
31: PetscErrorCode (*convergencedestroy)(void *);
33: /* Methods set by solver */
34: PetscErrorCode (*computedual)(Tao, Vec, Vec);
35: PetscErrorCode (*setup)(Tao);
36: PetscErrorCode (*solve)(Tao);
37: PetscErrorCode (*view)(Tao, PetscViewer);
38: PetscErrorCode (*setfromoptions)(Tao, PetscOptionItems *);
39: PetscErrorCode (*destroy)(Tao);
40: };
42: #define MAXTAOMONITORS 10
44: struct _p_Tao {
45: PETSCHEADER(struct _TaoOps);
46: void *user;
47: void *user_objP;
48: void *user_objgradP;
49: void *user_gradP;
50: void *user_hessP;
51: void *user_lsresP;
52: void *user_lsjacP;
53: void *user_conP;
54: void *user_con_equalityP;
55: void *user_con_inequalityP;
56: void *user_jacP;
57: void *user_jac_equalityP;
58: void *user_jac_inequalityP;
59: void *user_jac_stateP;
60: void *user_jac_designP;
61: void *user_boundsP;
62: void *user_update;
64: PetscErrorCode (*monitor[MAXTAOMONITORS])(Tao, void *);
65: PetscErrorCode (*monitordestroy[MAXTAOMONITORS])(void **);
66: void *monitorcontext[MAXTAOMONITORS];
67: PetscInt numbermonitors;
68: void *cnvP;
69: TaoConvergedReason reason;
71: PetscBool setupcalled;
72: void *data;
74: Vec solution;
75: Vec gradient;
76: Vec stepdirection;
77: Vec XL;
78: Vec XU;
79: Vec IL;
80: Vec IU;
81: Vec DI;
82: Vec DE;
83: Mat hessian;
84: Mat hessian_pre;
85: Mat gradient_norm;
86: Vec gradient_norm_tmp;
87: Vec ls_res;
88: Mat ls_jac;
89: Mat ls_jac_pre;
90: Vec res_weights_v;
91: PetscInt res_weights_n;
92: PetscInt *res_weights_rows;
93: PetscInt *res_weights_cols;
94: PetscReal *res_weights_w;
95: Vec constraints;
96: Vec constraints_equality;
97: Vec constraints_inequality;
98: Mat jacobian;
99: Mat jacobian_pre;
100: Mat jacobian_inequality;
101: Mat jacobian_inequality_pre;
102: Mat jacobian_equality;
103: Mat jacobian_equality_pre;
104: Mat jacobian_state;
105: Mat jacobian_state_inv;
106: Mat jacobian_design;
107: Mat jacobian_state_pre;
108: Mat jacobian_design_pre;
109: IS state_is;
110: IS design_is;
111: PetscReal step;
112: PetscReal residual;
113: PetscReal gnorm0;
114: PetscReal cnorm;
115: PetscReal cnorm0;
116: PetscReal fc;
118: PetscInt max_constraints;
119: PetscInt nfuncs;
120: PetscInt ngrads;
121: PetscInt nfuncgrads;
122: PetscInt nhess;
123: PetscInt niter;
124: PetscInt ntotalits;
125: PetscInt nconstraints;
126: PetscInt niconstraints;
127: PetscInt neconstraints;
128: PetscInt njac;
129: PetscInt njac_equality;
130: PetscInt njac_inequality;
131: PetscInt njac_state;
132: PetscInt njac_design;
134: PetscInt ksp_its; /* KSP iterations for this solver iteration */
135: PetscInt ksp_tot_its; /* Total (cumulative) KSP iterations */
137: TaoLineSearch linesearch;
138: PetscBool lsflag; /* goes up when line search fails */
139: KSP ksp;
140: PetscReal trust; /* Current trust region */
142: /* EW type forcing term */
143: PetscBool ksp_ewconv;
144: SNES snes_ewdummy;
146: PetscObjectParameterDeclare(PetscReal, gatol);
147: PetscObjectParameterDeclare(PetscReal, grtol);
148: PetscObjectParameterDeclare(PetscReal, gttol);
149: PetscObjectParameterDeclare(PetscReal, catol);
150: PetscObjectParameterDeclare(PetscReal, crtol);
151: PetscObjectParameterDeclare(PetscReal, steptol);
152: PetscObjectParameterDeclare(PetscReal, fmin);
153: PetscObjectParameterDeclare(PetscInt, max_it);
154: PetscObjectParameterDeclare(PetscInt, max_funcs);
155: PetscObjectParameterDeclare(PetscReal, trust0); /* initial trust region radius */
157: PetscBool printreason;
158: PetscBool viewsolution;
159: PetscBool viewgradient;
160: PetscBool viewconstraints;
161: PetscBool viewhessian;
162: PetscBool viewjacobian;
163: PetscBool bounded;
164: PetscBool constrained;
165: PetscBool eq_constrained;
166: PetscBool ineq_constrained;
167: PetscBool ineq_doublesided;
168: PetscBool header_printed;
169: PetscBool recycle;
171: TaoSubsetType subset_type;
172: PetscInt hist_max; /* Number of iteration histories to keep */
173: PetscReal *hist_obj; /* obj value at each iteration */
174: PetscReal *hist_resid; /* residual at each iteration */
175: PetscReal *hist_cnorm; /* constraint norm at each iteration */
176: PetscInt *hist_lits; /* number of ksp its at each TAO iteration */
177: PetscInt hist_len;
178: PetscBool hist_reset;
179: PetscBool hist_malloc;
180: };
182: PETSC_EXTERN PetscLogEvent TAO_Solve;
183: PETSC_EXTERN PetscLogEvent TAO_ObjectiveEval;
184: PETSC_EXTERN PetscLogEvent TAO_GradientEval;
185: PETSC_EXTERN PetscLogEvent TAO_ObjGradEval;
186: PETSC_EXTERN PetscLogEvent TAO_HessianEval;
187: PETSC_EXTERN PetscLogEvent TAO_ConstraintsEval;
188: PETSC_EXTERN PetscLogEvent TAO_JacobianEval;
190: static inline PetscErrorCode TaoLogConvergenceHistory(Tao tao, PetscReal obj, PetscReal resid, PetscReal cnorm, PetscInt totits)
191: {
192: PetscFunctionBegin;
193: if (tao->hist_max > tao->hist_len) {
194: if (tao->hist_obj) tao->hist_obj[tao->hist_len] = obj;
195: if (tao->hist_resid) tao->hist_resid[tao->hist_len] = resid;
196: if (tao->hist_cnorm) tao->hist_cnorm[tao->hist_len] = cnorm;
197: if (tao->hist_lits) {
198: PetscInt sits = totits;
199: PetscCheck(tao->hist_len >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "History length cannot be negative");
200: for (PetscInt i = 0; i < tao->hist_len; i++) sits -= tao->hist_lits[i];
201: tao->hist_lits[tao->hist_len] = sits;
202: }
203: tao->hist_len++;
204: }
205: PetscFunctionReturn(PETSC_SUCCESS);
206: }