https://mooseframework.inl.gov
Loading...
Searching...
No Matches
OptimizeSolve.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "Moose.h"
11#include "MooseError.h"
12#include "OptimizeSolve.h"
15#include "Steady.h"
16
19{
21 MooseEnum tao_solver_enum("taontr taobntr taobncg taonls taobnls taobqnktr taontl taobntl "
22 "taonm taobqnls taoowlqn taogpcg taobmrm taoalmm");
24 "tao_solver", tao_solver_enum, "Tao solver to use for optimization.");
25 ExecFlagEnum exec_enum = ExecFlagEnum();
26 exec_enum.addAvailableFlags(EXEC_NONE,
33 params.addParam<ExecFlagEnum>(
34 "solve_on", exec_enum, "List of flags indicating when inner system solve should occur.");
35 params.addParam<bool>(
36 "output_optimization_iterations",
37 false,
38 "Use the time step as the current iteration for outputting optimization history.");
39 return params;
40}
41
43 : SolveObject(ex),
44 _my_comm(MPI_COMM_SELF),
45 _solve_on(getParam<ExecFlagEnum>("solve_on")),
46 _verbose(getParam<bool>("verbose")),
47 _output_opt_iters(getParam<bool>("output_optimization_iterations")),
48 _tao_solver_enum(getParam<MooseEnum>("tao_solver").getEnum<TaoSolverEnum>()),
49 _parameters(std::make_unique<libMesh::PetscVector<Number>>(_my_comm))
50{
51 if (_problem.numThreads() > 1)
52 mooseError("OptimizeSolve does not currently support threaded execution");
53
56 "moose", 27225, "Outputting for transient executioners has not been implemented.");
57}
58
59bool
61{
62 TIME_SECTION("optimizeSolve", 1, "Optimization Solve");
63 // Initial solve
65
66 // Grab objective function
67 if (!_problem.hasUserObject("OptimizationReporter"))
68 mooseError("No OptimizationReporter object found.");
70
71 // Initialize solution and matrix
73 _ndof = _parameters->size();
74
75 // time step defaults 1, we want to start at 0 for first iteration to be
76 // consistent with TAO iterations.
78 _problem.timeStep() = 0;
79 bool solveInfo = (taoSolve() == 0);
80 return solveInfo;
81}
82
83PetscErrorCode
85{
87 // Initialize tao object
88 LibmeshPetscCallQ(TaoCreate(_my_comm.get(), &_tao));
89
90#if PETSC_RELEASE_LESS_THAN(3, 21, 0)
91 LibmeshPetscCallQ(TaoSetMonitor(_tao, monitor, this, nullptr));
92#else
93 LibmeshPetscCallQ(TaoMonitorSet(_tao, monitor, this, nullptr));
94#endif
95
96 switch (_tao_solver_enum)
97 {
99 LibmeshPetscCallQ(TaoSetType(_tao, TAONTR));
100 break;
102 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNTR));
103 break;
105 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNCG));
106 break;
108 LibmeshPetscCallQ(TaoSetType(_tao, TAONLS));
109 break;
111 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNLS));
112 break;
114 LibmeshPetscCallQ(TaoSetType(_tao, TAOBQNKTR));
115 break;
117 LibmeshPetscCallQ(TaoSetType(_tao, TAONTL));
118 break;
120 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNTL));
121 break;
123 LibmeshPetscCallQ(TaoSetType(_tao, TAONM));
124 break;
125
127 LibmeshPetscCallQ(TaoSetType(_tao, TAOBQNLS));
128 break;
130 LibmeshPetscCallQ(TaoSetType(_tao, TAOOWLQN));
131 break;
133 LibmeshPetscCallQ(TaoSetType(_tao, TAOGPCG));
134 break;
136 LibmeshPetscCallQ(TaoSetType(_tao, TAOBMRM));
137 break;
139#if !PETSC_VERSION_LESS_THAN(3, 15, 0)
140 LibmeshPetscCallQ(TaoSetType(_tao, TAOALMM));
141 // Need to cancel monitors for ALMM, if not there is a segfault at MOOSE destruction. Setup
142 // default constraint monitor.
143#if PETSC_RELEASE_GREATER_EQUALS(3, 21, 0)
144 LibmeshPetscCallQ(TaoMonitorCancel(_tao));
145#else
146 LibmeshPetscCallQ(TaoCancelMonitors(_tao));
147#endif
148 LibmeshPetscCallQ(PetscOptionsSetValue(NULL, "-tao_cmonitor", NULL));
149 break;
150#else
151 mooseError("ALMM is only compatible with PETSc versions above 3.14. ");
152#endif
153
154 default:
155 mooseError("Invalid Tao solve type");
156 }
157
158 // Set objective and gradient functions
159#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
160 LibmeshPetscCallQ(TaoSetObjective(_tao, objectiveFunctionWrapper, this));
161#else
162 LibmeshPetscCallQ(TaoSetObjectiveRoutine(_tao, objectiveFunctionWrapper, this));
163#endif
164#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
165 LibmeshPetscCallQ(
166 TaoSetObjectiveAndGradient(_tao, NULL, objectiveAndGradientFunctionWrapper, this));
167#else
168 LibmeshPetscCallQ(
169 TaoSetObjectiveAndGradientRoutine(_tao, objectiveAndGradientFunctionWrapper, this));
170#endif
171
172 // Set matrix-free version of the Hessian function
173 LibmeshPetscCallQ(MatCreateShell(_my_comm.get(), _ndof, _ndof, _ndof, _ndof, this, &_hessian));
174 // Link matrix-free Hessian to Tao
175#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
176 LibmeshPetscCallQ(TaoSetHessian(_tao, _hessian, _hessian, hessianFunctionWrapper, this));
177#else
178 LibmeshPetscCallQ(TaoSetHessianRoutine(_tao, _hessian, _hessian, hessianFunctionWrapper, this));
179#endif
180
181 // Set initial guess
182#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
183 LibmeshPetscCallQ(TaoSetSolution(_tao, _parameters->vec()));
184#else
185 LibmeshPetscCallQ(TaoSetInitialVector(_tao, _parameters->vec()));
186#endif
187
188 // Set TAO petsc options
189 LibmeshPetscCallQ(TaoSetFromOptions(_tao));
190
191 // save nonTAO PETSC options to reset before every call to execute()
193 // We only use a single system solve at this point
195
196 // Set bounds for bounded optimization
197 LibmeshPetscCallQ(TaoSetVariableBoundsRoutine(_tao, variableBoundsWrapper, this));
198
200 LibmeshPetscCallQ(taoALCreate());
201
202 // Backup multiapps so transient problems start with the same initial condition
206
207 // Solve optimization
208 LibmeshPetscCallQ(TaoSolve(_tao));
209
210 // Print solve statistics
211 if (getParam<bool>("verbose"))
212 LibmeshPetscCallQ(TaoView(_tao, PETSC_VIEWER_STDOUT_WORLD));
213
214 LibmeshPetscCallQ(TaoDestroy(&_tao));
215
216 LibmeshPetscCallQ(MatDestroy(&_hessian));
217
219 LibmeshPetscCallQ(taoALDestroy());
220
221 PetscFunctionReturn(PETSC_SUCCESS);
222}
223
224void
225OptimizeSolve::getTaoSolutionStatus(std::vector<int> & tot_iters,
226 std::vector<double> & gnorm,
227 std::vector<int> & obj_iters,
228 std::vector<double> & cnorm,
229 std::vector<int> & grad_iters,
230 std::vector<double> & xdiff,
231 std::vector<int> & hess_iters,
232 std::vector<double> & f,
233 std::vector<int> & tot_solves) const
234{
235 const auto num = _total_iterate_vec.size();
236 tot_iters.resize(num);
237 obj_iters.resize(num);
238 grad_iters.resize(num);
239 hess_iters.resize(num);
240 tot_solves.resize(num);
241 f.resize(num);
242 gnorm.resize(num);
243 cnorm.resize(num);
244 xdiff.resize(num);
245
246 for (const auto i : make_range(num))
247 {
248 tot_iters[i] = _total_iterate_vec[i];
249 obj_iters[i] = _obj_iterate_vec[i];
250 grad_iters[i] = _grad_iterate_vec[i];
251 hess_iters[i] = _hess_iterate_vec[i];
252 tot_solves[i] = _function_solve_vec[i];
253 f[i] = _f_vec[i];
254 gnorm[i] = _gnorm_vec[i];
255 cnorm[i] = _cnorm_vec[i];
256 xdiff[i] = _xdiff_vec[i];
257 }
258}
259
260void
261OptimizeSolve::setTaoSolutionStatus(double f, int its, double gnorm, double cnorm, double xdiff)
262{
263 // set data from TAO
264 _total_iterate_vec.push_back(its);
265 _f_vec.push_back(f);
266 _gnorm_vec.push_back(gnorm);
267 _cnorm_vec.push_back(cnorm);
268 _xdiff_vec.push_back(xdiff);
269 // set data we collect on this optimization iteration and then reset for next iteration
273 // count total number of FE solves
274 int solves = _obj_iterate + _grad_iterate + 2 * _hess_iterate;
275 _function_solve_vec.push_back(solves);
276 _obj_iterate = 0;
277 _grad_iterate = 0;
278 _hess_iterate = 0;
279
280 // Pass down the iteration number if the subapp is of the Steady/SteadyAndAdjoint type.
281 // This enables exodus per-iteration output.
282 for (auto & sub_app : _app.getExecutioner()->feProblem().getMultiAppWarehouse().getObjects())
283 {
284 if (auto steady = dynamic_cast<Steady *>(sub_app->getExecutioner(0)))
285 steady->setIterationNumberOutput((unsigned int)its);
286 }
287
288 // Output the converged iteration outputs
290
291 // Increment timestep. In steady problems timestep = time for outputting.
292 // See Output.C
294 _problem.timeStep() += 1;
295
296 // print verbose per iteration output
297 if (_verbose)
298 _console << "TAO SOLVER: iteration=" << its << "\tf=" << f << "\tgnorm=" << gnorm
299 << "\tcnorm=" << cnorm << "\txdiff=" << xdiff << std::endl;
300}
301
302PetscErrorCode
303OptimizeSolve::monitor(Tao tao, void * ctx)
304{
305 TaoConvergedReason reason;
306 PetscInt its;
307 PetscReal f, gnorm, cnorm, xdiff;
308
310 LibmeshPetscCallQ(TaoGetSolutionStatus(tao, &its, &f, &gnorm, &cnorm, &xdiff, &reason));
311
312 auto * solver = static_cast<OptimizeSolve *>(ctx);
313 solver->setTaoSolutionStatus((double)f, (int)its, (double)gnorm, (double)cnorm, (double)xdiff);
314
315 PetscFunctionReturn(PETSC_SUCCESS);
316}
317
318PetscErrorCode
319OptimizeSolve::objectiveFunctionWrapper(Tao /*tao*/, Vec x, Real * objective, void * ctx)
320{
322 auto * solver = static_cast<OptimizeSolve *>(ctx);
323
324 libMesh::PetscVector<Number> param(x, solver->_my_comm);
325 solver->_parameters->swap(param);
326
327 (*objective) = solver->objectiveFunction();
328 solver->_parameters->swap(param);
329 PetscFunctionReturn(PETSC_SUCCESS);
330}
331
332PetscErrorCode
334 Tao /*tao*/, Vec x, Real * objective, Vec gradient, void * ctx)
335{
337 auto * solver = static_cast<OptimizeSolve *>(ctx);
338
339 libMesh::PetscVector<Number> param(x, solver->_my_comm);
340 solver->_parameters->swap(param);
341
342 (*objective) = solver->objectiveFunction();
343 libMesh::PetscVector<Number> grad(gradient, solver->_my_comm);
344 solver->gradientFunction(grad);
345 solver->_parameters->swap(param);
346 PetscFunctionReturn(PETSC_SUCCESS);
347}
348
349PetscErrorCode
351 Tao /*tao*/, Vec /*x*/, Mat /*hessian*/, Mat /*pc*/, void * ctx)
352{
354 // Define Hessian-vector multiplication routine
355 auto * solver = static_cast<OptimizeSolve *>(ctx);
356 LibmeshPetscCallQ(MatShellSetOperation(
357 solver->_hessian, MATOP_MULT, (void (*)(void))OptimizeSolve::applyHessianWrapper));
358 PetscFunctionReturn(PETSC_SUCCESS);
359}
360
361PetscErrorCode
363{
364 void * ctx;
365
367 LibmeshPetscCallQ(MatShellGetContext(H, &ctx));
368
369 auto * solver = static_cast<OptimizeSolve *>(ctx);
370 libMesh::PetscVector<Number> sbar(s, solver->_my_comm);
371 libMesh::PetscVector<Number> Hsbar(Hs, solver->_my_comm);
372 return solver->applyHessian(sbar, Hsbar);
373}
374
375PetscErrorCode
376OptimizeSolve::variableBoundsWrapper(Tao tao, Vec /*xl*/, Vec /*xu*/, void * ctx)
377{
379 auto * solver = static_cast<OptimizeSolve *>(ctx);
380
381 LibmeshPetscCallQ(solver->variableBounds(tao));
382 PetscFunctionReturn(PETSC_SUCCESS);
383}
384
385Real
407
408void
425
426PetscErrorCode
428{
430 TIME_SECTION("applyHessian", 2, "Hessian forward/adjoint solve");
431 // What happens for material inversion when the Hessian
432 // is dependent on the parameters? Deal with it later???
433 // see notes on how this needs to change for Material inversion
434 if (_problem.hasMultiApps() &&
436 mooseError("Hessian based optimization algorithms require a sub-app with:\n"
437 " execute_on = HOMOGENEOUS_FORWARD");
439
444 mooseError("Homogeneous forward solve multiapp failed!");
447
448 // The adjoint solve below applies the misfit as its source. For the Hessian action, that source
449 // is the simulated values from the homogeneous forward solve, so the input must transfer
450 // 'simulation_values' from the homogeneous forward sub-app into 'misfit_values'.
455 mooseError("Adjoint solve multiapp failed!");
458
461 PetscFunctionReturn(PETSC_SUCCESS);
462}
463
464PetscErrorCode
466{
468 unsigned int sz = _obj_function->getNumParams();
469
472
473 // copy values from upper and lower bounds to xl and xu
474 for (const auto i : make_range(sz))
475 {
478 }
479 // set upper and lower bounds in tao solver
480 LibmeshPetscCallQ(TaoSetVariableBounds(tao, xl.vec(), xu.vec()));
481 PetscFunctionReturn(PETSC_SUCCESS);
482}
483
484PetscErrorCode
485OptimizeSolve::equalityFunctionWrapper(Tao /*tao*/, Vec /*x*/, Vec ce, void * ctx)
486{
488 // grab the solver
489 auto * solver = static_cast<OptimizeSolve *>(ctx);
490 libMesh::PetscVector<Number> eq_con(ce, solver->_my_comm);
491 // use the OptimizationReporterBase class to actually compute equality constraints
492 OptimizationReporterBase * obj_func = solver->getObjFunction();
493 obj_func->computeEqualityConstraints(eq_con);
494 PetscFunctionReturn(PETSC_SUCCESS);
495}
496
497PetscErrorCode
499 Tao /*tao*/, Vec /*x*/, Mat gradient_e, Mat /*gradient_epre*/, void * ctx)
500{
502 // grab the solver
503 auto * solver = static_cast<OptimizeSolve *>(ctx);
504 libMesh::PetscMatrix<Number> grad_eq(gradient_e, solver->_my_comm);
505 // use the OptimizationReporterBase class to actually compute equality
506 // constraints gradient
507 OptimizationReporterBase * obj_func = solver->getObjFunction();
508 obj_func->computeEqualityGradient(grad_eq);
509 PetscFunctionReturn(PETSC_SUCCESS);
510}
511
512PetscErrorCode
513OptimizeSolve::inequalityFunctionWrapper(Tao /*tao*/, Vec /*x*/, Vec ci, void * ctx)
514{
516 // grab the solver
517 auto * solver = static_cast<OptimizeSolve *>(ctx);
518 libMesh::PetscVector<Number> ineq_con(ci, solver->_my_comm);
519 // use the OptimizationReporterBase class to actually compute equality constraints
520 OptimizationReporterBase * obj_func = solver->getObjFunction();
521 obj_func->computeInequalityConstraints(ineq_con);
522 PetscFunctionReturn(PETSC_SUCCESS);
523}
524
525PetscErrorCode
527 Tao /*tao*/, Vec /*x*/, Mat gradient_i, Mat /*gradient_ipre*/, void * ctx)
528{
530 // grab the solver
531 auto * solver = static_cast<OptimizeSolve *>(ctx);
532 libMesh::PetscMatrix<Number> grad_ineq(gradient_i, solver->_my_comm);
533 // use the OptimizationReporterBase class to actually compute equality
534 // constraints gradient
535 OptimizationReporterBase * obj_func = solver->getObjFunction();
536 obj_func->computeInequalityGradient(grad_ineq);
537 PetscFunctionReturn(PETSC_SUCCESS);
538}
539
540PetscErrorCode
542{
545 {
546 // Create equality vector
547 LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ce));
548 LibmeshPetscCallQ(
550 LibmeshPetscCallQ(VecSetFromOptions(_ce));
551 LibmeshPetscCallQ(VecSetUp(_ce));
552
553 // Set equality jacobian matrix
554 LibmeshPetscCallQ(MatCreate(_my_comm.get(), &_gradient_e));
555 LibmeshPetscCallQ(MatSetSizes(
557 LibmeshPetscCallQ(MatSetFromOptions(_gradient_e));
558 LibmeshPetscCallQ(MatSetUp(_gradient_e));
559
560 // Set the Equality Constraints
561 LibmeshPetscCallQ(TaoSetEqualityConstraintsRoutine(_tao, _ce, equalityFunctionWrapper, this));
562
563 // Set the Equality Constraints Jacobian
564 LibmeshPetscCallQ(TaoSetJacobianEqualityRoutine(
566 }
567
569 {
570 // Create inequality vector
571 LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ci));
572 LibmeshPetscCallQ(
574 LibmeshPetscCallQ(VecSetFromOptions(_ci));
575 LibmeshPetscCallQ(VecSetUp(_ci));
576
577 // Set inequality jacobian matrix
578 LibmeshPetscCallQ(MatCreate(_my_comm.get(), &_gradient_i));
579 LibmeshPetscCallQ(MatSetSizes(_gradient_i,
581 _ndof,
583 _ndof));
584 LibmeshPetscCallQ(MatSetFromOptions(_gradient_i));
585 LibmeshPetscCallQ(MatSetUp(_gradient_i));
586
587 // Set the Inequality constraints
588 LibmeshPetscCallQ(
589 TaoSetInequalityConstraintsRoutine(_tao, _ci, inequalityFunctionWrapper, this));
590
591 // Set the Inequality constraints Jacobian
592 LibmeshPetscCallQ(TaoSetJacobianInequalityRoutine(
594 }
595 PetscFunctionReturn(PETSC_SUCCESS);
596}
597
598PetscErrorCode
600{
603 {
604 LibmeshPetscCallQ(VecDestroy(&_ce));
605 LibmeshPetscCallQ(MatDestroy(&_gradient_e));
606 }
608 {
609 LibmeshPetscCallQ(VecDestroy(&_ci));
610 LibmeshPetscCallQ(MatDestroy(&_gradient_i));
611 }
612
613 PetscFunctionReturn(PETSC_SUCCESS);
614}
Real f(Real x)
Test function for Brents method.
const std::vector< double > x
InputParameters emptyInputParameters()
const ExecFlagType EXEC_NONE
PetscFunctionBegin
void ErrorVector unsigned int
const ConsoleStream _console
FEProblemBase & feProblem()
T & getUserObject(const std::string &name, unsigned int tid=0) const
ExecuteMooseObjectWarehouse< MultiApp > & getMultiAppWarehouse()
bool hasMultiApps() const
SolverParams & solverParams(unsigned int solver_sys_num=0)
bool hasUserObject(const std::string &name) const
void restoreMultiApps(ExecFlagType type, bool force=false)
bool execMultiApps(ExecFlagType type, bool auto_advance=true)
void backupMultiApps(ExecFlagType type)
virtual void execute(const ExecFlagType &exec_type)
Moose::PetscSupport::PetscOptions & getPetscOptions()
virtual int & timeStep() const
virtual bool isTransient() const override
virtual void outputStep(ExecFlagType type)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
Executioner * getExecutioner() const
void mooseDocumentedError(const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
void mooseError(Args &&... args) const
const std::vector< std::shared_ptr< T > > & getObjects(THREAD_ID tid=0) const
MooseApp & _app
bool isValueSet(const std::string &value) const
Base class for optimization objects, implements routines for calculating misfit.
void setInitialCondition(libMesh::PetscVector< Number > &param)
Function to initialize petsc vectors from vpp data.
virtual void computeGradient(libMesh::PetscVector< Number > &gradient) const
Function to compute gradient.
virtual Real computeObjective()=0
Function to compute objective.
virtual void computeEqualityGradient(libMesh::PetscMatrix< Number > &gradient) const
Function to compute the gradient of the equality constraints/ This is the last call of the equality c...
Real getLowerBound(dof_id_type i) const
dof_id_type getNumEqCons() const
Function to get the total number of equalities.
virtual void computeInequalityConstraints(libMesh::PetscVector< Number > &ineqs_constraints) const
Function to compute the inequality constraints.
virtual void updateParameters(const libMesh::PetscVector< Number > &x)
Function to set parameters.
Real getUpperBound(dof_id_type i) const
Upper and lower bounds for each parameter being controlled.
virtual dof_id_type getNumParams() const
Function to get the total number of parameters.
virtual void computeEqualityConstraints(libMesh::PetscVector< Number > &eqs_constraints) const
Function to compute the equality constraints.
virtual void computeInequalityGradient(libMesh::PetscMatrix< Number > &gradient) const
Function to compute the gradient of the inequality constraints/ This is the last call of the inequali...
dof_id_type getNumInEqCons() const
Function to get the total number of inequalities.
solveObject to interface with Petsc Tao
static PetscErrorCode objectiveFunctionWrapper(Tao tao, Vec x, Real *objective, void *ctx)
static PetscErrorCode equalityFunctionWrapper(Tao tao, Vec x, Vec ce, void *ctx)
Mat _gradient_e
Equality constraint gradient.
std::vector< double > _f_vec
objective value per iteration
dof_id_type _ndof
Number of parameters being optimized.
std::vector< int > _grad_iterate_vec
gradient solves per iteration
virtual Real objectiveFunction()
Objective routine.
virtual bool solve() override
Moose::PetscSupport::PetscOptions _petsc_options
const libMesh::Parallel::Communicator _my_comm
Communicator used for operations.
std::vector< int > _obj_iterate_vec
number of objective solves per iteration
static PetscErrorCode monitor(Tao tao, void *ctx)
void getTaoSolutionStatus(std::vector< int > &tot_iters, std::vector< double > &gnorm, std::vector< int > &obj_iters, std::vector< double > &cnorm, std::vector< int > &grad_iters, std::vector< double > &xdiff, std::vector< int > &hess_iters, std::vector< double > &f, std::vector< int > &tot_solves) const
Record tao TaoGetSolutionStatus data for output by a reporter.
Mat _gradient_i
Inequality constraint gradient.
Vec _ce
Equality constraint vector.
std::vector< int > _hess_iterate_vec
Hessian solves per iteration.
virtual PetscErrorCode variableBounds(Tao tao)
Bounds routine.
std::vector< double > _xdiff_vec
step length per iteration
virtual void gradientFunction(libMesh::PetscVector< Number > &gradient)
Gradient routine.
std::unique_ptr< libMesh::PetscVector< Number > > _parameters
Parameters (solution) given to TAO.
void setTaoSolutionStatus(double f, int its, double gnorm, double cnorm, double xdiff)
output optimization iteration solve data
const ExecFlagEnum & _solve_on
List of execute flags for when to solve the system.
OptimizeSolve(Executioner &ex)
static PetscErrorCode inequalityGradientFunctionWrapper(Tao tao, Vec x, Mat gradient_i, Mat gradient_ipre, void *ctx)
TaoSolverEnum
Enum of tao solver types.
std::vector< int > _total_iterate_vec
total solves per iteration
bool _verbose
control optimization executioner output
static PetscErrorCode applyHessianWrapper(Mat H, Vec s, Vec Hs)
std::vector< double > _cnorm_vec
infeasibility norm per iteration
virtual PetscErrorCode applyHessian(libMesh::PetscVector< Number > &s, libMesh::PetscVector< Number > &Hs)
Hessian application routine.
static PetscErrorCode equalityGradientFunctionWrapper(Tao tao, Vec x, Mat gradient_e, Mat gradient_epre, void *ctx)
static PetscErrorCode inequalityFunctionWrapper(Tao tao, Vec x, Vec ci, void *ctx)
static PetscErrorCode variableBoundsWrapper(Tao, Vec xl, Vec xu, void *ctx)
Mat _hessian
Hessian (matrix) - usually a matrix-free representation.
enum OptimizeSolve::TaoSolverEnum _tao_solver_enum
bool _output_opt_iters
Use time step as the iteration counter for purposes of outputting.
PetscErrorCode taoALCreate()
Used for creating petsc structures when using the ALMM algorithm.
std::vector< int > _function_solve_vec
total solves per iteration
std::vector< double > _gnorm_vec
gradient norm per iteration
static PetscErrorCode hessianFunctionWrapper(Tao tao, Vec x, Mat hessian, Mat pc, void *ctx)
OptimizationReporterBase * _obj_function
objective function defining objective, gradient, and hessian
static InputParameters validParams()
static PetscErrorCode objectiveAndGradientFunctionWrapper(Tao tao, Vec x, Real *objective, Vec gradient, void *ctx)
Tao _tao
Tao optimization object.
PetscErrorCode taoSolve()
Here is where we call tao and solve.
Vec _ci
Inequality constraint vector.
PetscErrorCode taoALDestroy()
Used for destroying petsc structures when using the ALMM algorithm.
SolverParams _solver_params
FEProblemBase & _problem
SolveObject * _inner_solve
virtual bool solve()=0
THREAD_ID numThreads() const
virtual void set(const numeric_index_type i, const T value) override
void petscSetOptions(const PetscOptions &po, const SolverParams &solver_params, FEProblemBase *const problem=nullptr)
const ExecFlagType EXEC_ADJOINT
const ExecFlagType EXEC_FORWARD
const ExecFlagType EXEC_HOMOGENEOUS_FORWARD
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...