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(
22 "taontr taobntr taobncg taonls taobnls taobqnktr taontl taobntl taolmvm "
23 "taoblmvm taonm taobqnls taoowlqn taogpcg taobmrm taoalmm");
25 "tao_solver", tao_solver_enum, "Tao solver to use for optimization.");
26 ExecFlagEnum exec_enum = ExecFlagEnum();
27 exec_enum.addAvailableFlags(EXEC_NONE,
34 params.addParam<ExecFlagEnum>(
35 "solve_on", exec_enum, "List of flags indicating when inner system solve should occur.");
36 params.addParam<bool>(
37 "output_optimization_iterations",
38 false,
39 "Use the time step as the current iteration for outputting optimization history.");
40 return params;
41}
42
44 : SolveObject(ex),
45 _my_comm(MPI_COMM_SELF),
46 _solve_on(getParam<ExecFlagEnum>("solve_on")),
47 _verbose(getParam<bool>("verbose")),
48 _output_opt_iters(getParam<bool>("output_optimization_iterations")),
49 _tao_solver_enum(getParam<MooseEnum>("tao_solver").getEnum<TaoSolverEnum>()),
50 _parameters(std::make_unique<libMesh::PetscVector<Number>>(_my_comm))
51{
52 if (libMesh::n_threads() > 1)
53 mooseError("OptimizeSolve does not currently support threaded execution");
54
57 "moose", 27225, "Outputting for transient executioners has not been implemented.");
58}
59
60bool
62{
63 TIME_SECTION("optimizeSolve", 1, "Optimization Solve");
64 // Initial solve
66
67 // Grab objective function
68 if (!_problem.hasUserObject("OptimizationReporter"))
69 mooseError("No OptimizationReporter object found.");
71
72 // Initialize solution and matrix
74 _ndof = _parameters->size();
75
76 // time step defaults 1, we want to start at 0 for first iteration to be
77 // consistent with TAO iterations.
79 _problem.timeStep() = 0;
80 bool solveInfo = (taoSolve() == 0);
81 return solveInfo;
82}
83
84PetscErrorCode
86{
88 // Initialize tao object
89 LibmeshPetscCallQ(TaoCreate(_my_comm.get(), &_tao));
90
91#if PETSC_RELEASE_LESS_THAN(3, 21, 0)
92 LibmeshPetscCallQ(TaoSetMonitor(_tao, monitor, this, nullptr));
93#else
94 LibmeshPetscCallQ(TaoMonitorSet(_tao, monitor, this, nullptr));
95#endif
96
97 switch (_tao_solver_enum)
98 {
100 LibmeshPetscCallQ(TaoSetType(_tao, TAONTR));
101 break;
103 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNTR));
104 break;
106 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNCG));
107 break;
109 LibmeshPetscCallQ(TaoSetType(_tao, TAONLS));
110 break;
112 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNLS));
113 break;
115 LibmeshPetscCallQ(TaoSetType(_tao, TAOBQNKTR));
116 break;
118 LibmeshPetscCallQ(TaoSetType(_tao, TAONTL));
119 break;
121 LibmeshPetscCallQ(TaoSetType(_tao, TAOBNTL));
122 break;
124 LibmeshPetscCallQ(TaoSetType(_tao, TAOLMVM));
125 break;
127 LibmeshPetscCallQ(TaoSetType(_tao, TAOBLMVM));
128 break;
129
131 LibmeshPetscCallQ(TaoSetType(_tao, TAONM));
132 break;
133
135 LibmeshPetscCallQ(TaoSetType(_tao, TAOBQNLS));
136 break;
138 LibmeshPetscCallQ(TaoSetType(_tao, TAOOWLQN));
139 break;
141 LibmeshPetscCallQ(TaoSetType(_tao, TAOGPCG));
142 break;
144 LibmeshPetscCallQ(TaoSetType(_tao, TAOBMRM));
145 break;
147#if !PETSC_VERSION_LESS_THAN(3, 15, 0)
148 LibmeshPetscCallQ(TaoSetType(_tao, TAOALMM));
149 // Need to cancel monitors for ALMM, if not there is a segfault at MOOSE destruction. Setup
150 // default constraint monitor.
151#if PETSC_RELEASE_GREATER_EQUALS(3, 21, 0)
152 LibmeshPetscCallQ(TaoMonitorCancel(_tao));
153#else
154 LibmeshPetscCallQ(TaoCancelMonitors(_tao));
155#endif
156 LibmeshPetscCallQ(PetscOptionsSetValue(NULL, "-tao_cmonitor", NULL));
157 break;
158#else
159 mooseError("ALMM is only compatible with PETSc versions above 3.14. ");
160#endif
161
162 default:
163 mooseError("Invalid Tao solve type");
164 }
165
166 // Set objective and gradient functions
167#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
168 LibmeshPetscCallQ(TaoSetObjective(_tao, objectiveFunctionWrapper, this));
169#else
170 LibmeshPetscCallQ(TaoSetObjectiveRoutine(_tao, objectiveFunctionWrapper, this));
171#endif
172#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
173 LibmeshPetscCallQ(
174 TaoSetObjectiveAndGradient(_tao, NULL, objectiveAndGradientFunctionWrapper, this));
175#else
176 LibmeshPetscCallQ(
177 TaoSetObjectiveAndGradientRoutine(_tao, objectiveAndGradientFunctionWrapper, this));
178#endif
179
180 // Set matrix-free version of the Hessian function
181 LibmeshPetscCallQ(MatCreateShell(_my_comm.get(), _ndof, _ndof, _ndof, _ndof, this, &_hessian));
182 // Link matrix-free Hessian to Tao
183#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
184 LibmeshPetscCallQ(TaoSetHessian(_tao, _hessian, _hessian, hessianFunctionWrapper, this));
185#else
186 LibmeshPetscCallQ(TaoSetHessianRoutine(_tao, _hessian, _hessian, hessianFunctionWrapper, this));
187#endif
188
189 // Set initial guess
190#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
191 LibmeshPetscCallQ(TaoSetSolution(_tao, _parameters->vec()));
192#else
193 LibmeshPetscCallQ(TaoSetInitialVector(_tao, _parameters->vec()));
194#endif
195
196 // Set TAO petsc options
197 LibmeshPetscCallQ(TaoSetFromOptions(_tao));
198
199 // save nonTAO PETSC options to reset before every call to execute()
201 // We only use a single system solve at this point
203
204 // Set bounds for bounded optimization
205 LibmeshPetscCallQ(TaoSetVariableBoundsRoutine(_tao, variableBoundsWrapper, this));
206
208 LibmeshPetscCallQ(taoALCreate());
209
210 // Backup multiapps so transient problems start with the same initial condition
214
215 // Solve optimization
216 LibmeshPetscCallQ(TaoSolve(_tao));
217
218 // Print solve statistics
219 if (getParam<bool>("verbose"))
220 LibmeshPetscCallQ(TaoView(_tao, PETSC_VIEWER_STDOUT_WORLD));
221
222 LibmeshPetscCallQ(TaoDestroy(&_tao));
223
224 LibmeshPetscCallQ(MatDestroy(&_hessian));
225
227 LibmeshPetscCallQ(taoALDestroy());
228
229 PetscFunctionReturn(PETSC_SUCCESS);
230}
231
232void
233OptimizeSolve::getTaoSolutionStatus(std::vector<int> & tot_iters,
234 std::vector<double> & gnorm,
235 std::vector<int> & obj_iters,
236 std::vector<double> & cnorm,
237 std::vector<int> & grad_iters,
238 std::vector<double> & xdiff,
239 std::vector<int> & hess_iters,
240 std::vector<double> & f,
241 std::vector<int> & tot_solves) const
242{
243 const auto num = _total_iterate_vec.size();
244 tot_iters.resize(num);
245 obj_iters.resize(num);
246 grad_iters.resize(num);
247 hess_iters.resize(num);
248 tot_solves.resize(num);
249 f.resize(num);
250 gnorm.resize(num);
251 cnorm.resize(num);
252 xdiff.resize(num);
253
254 for (const auto i : make_range(num))
255 {
256 tot_iters[i] = _total_iterate_vec[i];
257 obj_iters[i] = _obj_iterate_vec[i];
258 grad_iters[i] = _grad_iterate_vec[i];
259 hess_iters[i] = _hess_iterate_vec[i];
260 tot_solves[i] = _function_solve_vec[i];
261 f[i] = _f_vec[i];
262 gnorm[i] = _gnorm_vec[i];
263 cnorm[i] = _cnorm_vec[i];
264 xdiff[i] = _xdiff_vec[i];
265 }
266}
267
268void
269OptimizeSolve::setTaoSolutionStatus(double f, int its, double gnorm, double cnorm, double xdiff)
270{
271 // set data from TAO
272 _total_iterate_vec.push_back(its);
273 _f_vec.push_back(f);
274 _gnorm_vec.push_back(gnorm);
275 _cnorm_vec.push_back(cnorm);
276 _xdiff_vec.push_back(xdiff);
277 // set data we collect on this optimization iteration and then reset for next iteration
281 // count total number of FE solves
282 int solves = _obj_iterate + _grad_iterate + 2 * _hess_iterate;
283 _function_solve_vec.push_back(solves);
284 _obj_iterate = 0;
285 _grad_iterate = 0;
286 _hess_iterate = 0;
287
288 // Pass down the iteration number if the subapp is of the Steady/SteadyAndAdjoint type.
289 // This enables exodus per-iteration output.
290 for (auto & sub_app : _app.getExecutioner()->feProblem().getMultiAppWarehouse().getObjects())
291 {
292 if (auto steady = dynamic_cast<Steady *>(sub_app->getExecutioner(0)))
293 steady->setIterationNumberOutput((unsigned int)its);
294 }
295
296 // Output the converged iteration outputs
298
299 // Increment timestep. In steady problems timestep = time for outputting.
300 // See Output.C
302 _problem.timeStep() += 1;
303
304 // print verbose per iteration output
305 if (_verbose)
306 _console << "TAO SOLVER: iteration=" << its << "\tf=" << f << "\tgnorm=" << gnorm
307 << "\tcnorm=" << cnorm << "\txdiff=" << xdiff << std::endl;
308}
309
310PetscErrorCode
311OptimizeSolve::monitor(Tao tao, void * ctx)
312{
313 TaoConvergedReason reason;
314 PetscInt its;
315 PetscReal f, gnorm, cnorm, xdiff;
316
318 LibmeshPetscCallQ(TaoGetSolutionStatus(tao, &its, &f, &gnorm, &cnorm, &xdiff, &reason));
319
320 auto * solver = static_cast<OptimizeSolve *>(ctx);
321 solver->setTaoSolutionStatus((double)f, (int)its, (double)gnorm, (double)cnorm, (double)xdiff);
322
323 PetscFunctionReturn(PETSC_SUCCESS);
324}
325
326PetscErrorCode
327OptimizeSolve::objectiveFunctionWrapper(Tao /*tao*/, Vec x, Real * objective, void * ctx)
328{
330 auto * solver = static_cast<OptimizeSolve *>(ctx);
331
332 libMesh::PetscVector<Number> param(x, solver->_my_comm);
333 solver->_parameters->swap(param);
334
335 (*objective) = solver->objectiveFunction();
336 solver->_parameters->swap(param);
337 PetscFunctionReturn(PETSC_SUCCESS);
338}
339
340PetscErrorCode
342 Tao /*tao*/, Vec x, Real * objective, Vec gradient, void * ctx)
343{
345 auto * solver = static_cast<OptimizeSolve *>(ctx);
346
347 libMesh::PetscVector<Number> param(x, solver->_my_comm);
348 solver->_parameters->swap(param);
349
350 (*objective) = solver->objectiveFunction();
351 libMesh::PetscVector<Number> grad(gradient, solver->_my_comm);
352 solver->gradientFunction(grad);
353 solver->_parameters->swap(param);
354 PetscFunctionReturn(PETSC_SUCCESS);
355}
356
357PetscErrorCode
359 Tao /*tao*/, Vec /*x*/, Mat /*hessian*/, Mat /*pc*/, void * ctx)
360{
362 // Define Hessian-vector multiplication routine
363 auto * solver = static_cast<OptimizeSolve *>(ctx);
364 LibmeshPetscCallQ(MatShellSetOperation(
365 solver->_hessian, MATOP_MULT, (void (*)(void))OptimizeSolve::applyHessianWrapper));
366 PetscFunctionReturn(PETSC_SUCCESS);
367}
368
369PetscErrorCode
371{
372 void * ctx;
373
375 LibmeshPetscCallQ(MatShellGetContext(H, &ctx));
376
377 auto * solver = static_cast<OptimizeSolve *>(ctx);
378 libMesh::PetscVector<Number> sbar(s, solver->_my_comm);
379 libMesh::PetscVector<Number> Hsbar(Hs, solver->_my_comm);
380 return solver->applyHessian(sbar, Hsbar);
381}
382
383PetscErrorCode
384OptimizeSolve::variableBoundsWrapper(Tao tao, Vec /*xl*/, Vec /*xu*/, void * ctx)
385{
387 auto * solver = static_cast<OptimizeSolve *>(ctx);
388
389 LibmeshPetscCallQ(solver->variableBounds(tao));
390 PetscFunctionReturn(PETSC_SUCCESS);
391}
392
393Real
415
416void
433
434PetscErrorCode
436{
438 TIME_SECTION("applyHessian", 2, "Hessian forward/adjoint solve");
439 // What happens for material inversion when the Hessian
440 // is dependent on the parameters? Deal with it later???
441 // see notes on how this needs to change for Material inversion
442 if (_problem.hasMultiApps() &&
444 mooseError("Hessian based optimization algorithms require a sub-app with:\n"
445 " execute_on = HOMOGENEOUS_FORWARD");
447
452 mooseError("Homogeneous forward solve multiapp failed!");
455
457
462 mooseError("Adjoint solve multiapp failed!");
465
468 PetscFunctionReturn(PETSC_SUCCESS);
469}
470
471PetscErrorCode
473{
475 unsigned int sz = _obj_function->getNumParams();
476
479
480 // copy values from upper and lower bounds to xl and xu
481 for (const auto i : make_range(sz))
482 {
485 }
486 // set upper and lower bounds in tao solver
487 LibmeshPetscCallQ(TaoSetVariableBounds(tao, xl.vec(), xu.vec()));
488 PetscFunctionReturn(PETSC_SUCCESS);
489}
490
491PetscErrorCode
492OptimizeSolve::equalityFunctionWrapper(Tao /*tao*/, Vec /*x*/, Vec ce, void * ctx)
493{
495 // grab the solver
496 auto * solver = static_cast<OptimizeSolve *>(ctx);
497 libMesh::PetscVector<Number> eq_con(ce, solver->_my_comm);
498 // use the OptimizationReporterBase class to actually compute equality constraints
499 OptimizationReporterBase * obj_func = solver->getObjFunction();
500 obj_func->computeEqualityConstraints(eq_con);
501 PetscFunctionReturn(PETSC_SUCCESS);
502}
503
504PetscErrorCode
506 Tao /*tao*/, Vec /*x*/, Mat gradient_e, Mat /*gradient_epre*/, void * ctx)
507{
509 // grab the solver
510 auto * solver = static_cast<OptimizeSolve *>(ctx);
511 libMesh::PetscMatrix<Number> grad_eq(gradient_e, solver->_my_comm);
512 // use the OptimizationReporterBase class to actually compute equality
513 // constraints gradient
514 OptimizationReporterBase * obj_func = solver->getObjFunction();
515 obj_func->computeEqualityGradient(grad_eq);
516 PetscFunctionReturn(PETSC_SUCCESS);
517}
518
519PetscErrorCode
520OptimizeSolve::inequalityFunctionWrapper(Tao /*tao*/, Vec /*x*/, Vec ci, void * ctx)
521{
523 // grab the solver
524 auto * solver = static_cast<OptimizeSolve *>(ctx);
525 libMesh::PetscVector<Number> ineq_con(ci, solver->_my_comm);
526 // use the OptimizationReporterBase class to actually compute equality constraints
527 OptimizationReporterBase * obj_func = solver->getObjFunction();
528 obj_func->computeInequalityConstraints(ineq_con);
529 PetscFunctionReturn(PETSC_SUCCESS);
530}
531
532PetscErrorCode
534 Tao /*tao*/, Vec /*x*/, Mat gradient_i, Mat /*gradient_ipre*/, void * ctx)
535{
537 // grab the solver
538 auto * solver = static_cast<OptimizeSolve *>(ctx);
539 libMesh::PetscMatrix<Number> grad_ineq(gradient_i, solver->_my_comm);
540 // use the OptimizationReporterBase class to actually compute equality
541 // constraints gradient
542 OptimizationReporterBase * obj_func = solver->getObjFunction();
543 obj_func->computeInequalityGradient(grad_ineq);
544 PetscFunctionReturn(PETSC_SUCCESS);
545}
546
547PetscErrorCode
549{
552 {
553 // Create equality vector
554 LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ce));
555 LibmeshPetscCallQ(
557 LibmeshPetscCallQ(VecSetFromOptions(_ce));
558 LibmeshPetscCallQ(VecSetUp(_ce));
559
560 // Set equality jacobian matrix
561 LibmeshPetscCallQ(MatCreate(_my_comm.get(), &_gradient_e));
562 LibmeshPetscCallQ(MatSetSizes(
564 LibmeshPetscCallQ(MatSetFromOptions(_gradient_e));
565 LibmeshPetscCallQ(MatSetUp(_gradient_e));
566
567 // Set the Equality Constraints
568 LibmeshPetscCallQ(TaoSetEqualityConstraintsRoutine(_tao, _ce, equalityFunctionWrapper, this));
569
570 // Set the Equality Constraints Jacobian
571 LibmeshPetscCallQ(TaoSetJacobianEqualityRoutine(
573 }
574
576 {
577 // Create inequality vector
578 LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ci));
579 LibmeshPetscCallQ(
581 LibmeshPetscCallQ(VecSetFromOptions(_ci));
582 LibmeshPetscCallQ(VecSetUp(_ci));
583
584 // Set inequality jacobian matrix
585 LibmeshPetscCallQ(MatCreate(_my_comm.get(), &_gradient_i));
586 LibmeshPetscCallQ(MatSetSizes(_gradient_i,
588 _ndof,
590 _ndof));
591 LibmeshPetscCallQ(MatSetFromOptions(_gradient_i));
592 LibmeshPetscCallQ(MatSetUp(_gradient_i));
593
594 // Set the Inequality constraints
595 LibmeshPetscCallQ(
596 TaoSetInequalityConstraintsRoutine(_tao, _ci, inequalityFunctionWrapper, this));
597
598 // Set the Inequality constraints Jacobian
599 LibmeshPetscCallQ(TaoSetJacobianInequalityRoutine(
601 }
602 PetscFunctionReturn(PETSC_SUCCESS);
603}
604
605PetscErrorCode
607{
610 {
611 LibmeshPetscCallQ(VecDestroy(&_ce));
612 LibmeshPetscCallQ(MatDestroy(&_gradient_e));
613 }
615 {
616 LibmeshPetscCallQ(VecDestroy(&_ci));
617 LibmeshPetscCallQ(MatDestroy(&_gradient_i));
618 }
619
620 PetscFunctionReturn(PETSC_SUCCESS);
621}
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.
virtual void setMisfitToSimulatedValues()
Function to override misfit values with the simulated values from the matrix free hessian forward sol...
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
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...
unsigned int n_threads()