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
456 // The adjoint solve below applies the misfit as its source. For the Hessian action, that source
457 // is the simulated values from the homogeneous forward solve, so the input must transfer
458 // 'simulation_values' from the homogeneous forward sub-app into 'misfit_values'.
463 mooseError("Adjoint solve multiapp failed!");
466
469 PetscFunctionReturn(PETSC_SUCCESS);
470}
471
472PetscErrorCode
474{
476 unsigned int sz = _obj_function->getNumParams();
477
480
481 // copy values from upper and lower bounds to xl and xu
482 for (const auto i : make_range(sz))
483 {
486 }
487 // set upper and lower bounds in tao solver
488 LibmeshPetscCallQ(TaoSetVariableBounds(tao, xl.vec(), xu.vec()));
489 PetscFunctionReturn(PETSC_SUCCESS);
490}
491
492PetscErrorCode
493OptimizeSolve::equalityFunctionWrapper(Tao /*tao*/, Vec /*x*/, Vec ce, void * ctx)
494{
496 // grab the solver
497 auto * solver = static_cast<OptimizeSolve *>(ctx);
498 libMesh::PetscVector<Number> eq_con(ce, solver->_my_comm);
499 // use the OptimizationReporterBase class to actually compute equality constraints
500 OptimizationReporterBase * obj_func = solver->getObjFunction();
501 obj_func->computeEqualityConstraints(eq_con);
502 PetscFunctionReturn(PETSC_SUCCESS);
503}
504
505PetscErrorCode
507 Tao /*tao*/, Vec /*x*/, Mat gradient_e, Mat /*gradient_epre*/, void * ctx)
508{
510 // grab the solver
511 auto * solver = static_cast<OptimizeSolve *>(ctx);
512 libMesh::PetscMatrix<Number> grad_eq(gradient_e, solver->_my_comm);
513 // use the OptimizationReporterBase class to actually compute equality
514 // constraints gradient
515 OptimizationReporterBase * obj_func = solver->getObjFunction();
516 obj_func->computeEqualityGradient(grad_eq);
517 PetscFunctionReturn(PETSC_SUCCESS);
518}
519
520PetscErrorCode
521OptimizeSolve::inequalityFunctionWrapper(Tao /*tao*/, Vec /*x*/, Vec ci, void * ctx)
522{
524 // grab the solver
525 auto * solver = static_cast<OptimizeSolve *>(ctx);
526 libMesh::PetscVector<Number> ineq_con(ci, solver->_my_comm);
527 // use the OptimizationReporterBase class to actually compute equality constraints
528 OptimizationReporterBase * obj_func = solver->getObjFunction();
529 obj_func->computeInequalityConstraints(ineq_con);
530 PetscFunctionReturn(PETSC_SUCCESS);
531}
532
533PetscErrorCode
535 Tao /*tao*/, Vec /*x*/, Mat gradient_i, Mat /*gradient_ipre*/, void * ctx)
536{
538 // grab the solver
539 auto * solver = static_cast<OptimizeSolve *>(ctx);
540 libMesh::PetscMatrix<Number> grad_ineq(gradient_i, solver->_my_comm);
541 // use the OptimizationReporterBase class to actually compute equality
542 // constraints gradient
543 OptimizationReporterBase * obj_func = solver->getObjFunction();
544 obj_func->computeInequalityGradient(grad_ineq);
545 PetscFunctionReturn(PETSC_SUCCESS);
546}
547
548PetscErrorCode
550{
553 {
554 // Create equality vector
555 LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ce));
556 LibmeshPetscCallQ(
558 LibmeshPetscCallQ(VecSetFromOptions(_ce));
559 LibmeshPetscCallQ(VecSetUp(_ce));
560
561 // Set equality jacobian matrix
562 LibmeshPetscCallQ(MatCreate(_my_comm.get(), &_gradient_e));
563 LibmeshPetscCallQ(MatSetSizes(
565 LibmeshPetscCallQ(MatSetFromOptions(_gradient_e));
566 LibmeshPetscCallQ(MatSetUp(_gradient_e));
567
568 // Set the Equality Constraints
569 LibmeshPetscCallQ(TaoSetEqualityConstraintsRoutine(_tao, _ce, equalityFunctionWrapper, this));
570
571 // Set the Equality Constraints Jacobian
572 LibmeshPetscCallQ(TaoSetJacobianEqualityRoutine(
574 }
575
577 {
578 // Create inequality vector
579 LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ci));
580 LibmeshPetscCallQ(
582 LibmeshPetscCallQ(VecSetFromOptions(_ci));
583 LibmeshPetscCallQ(VecSetUp(_ci));
584
585 // Set inequality jacobian matrix
586 LibmeshPetscCallQ(MatCreate(_my_comm.get(), &_gradient_i));
587 LibmeshPetscCallQ(MatSetSizes(_gradient_i,
589 _ndof,
591 _ndof));
592 LibmeshPetscCallQ(MatSetFromOptions(_gradient_i));
593 LibmeshPetscCallQ(MatSetUp(_gradient_i));
594
595 // Set the Inequality constraints
596 LibmeshPetscCallQ(
597 TaoSetInequalityConstraintsRoutine(_tao, _ci, inequalityFunctionWrapper, this));
598
599 // Set the Inequality constraints Jacobian
600 LibmeshPetscCallQ(TaoSetJacobianInequalityRoutine(
602 }
603 PetscFunctionReturn(PETSC_SUCCESS);
604}
605
606PetscErrorCode
608{
611 {
612 LibmeshPetscCallQ(VecDestroy(&_ce));
613 LibmeshPetscCallQ(MatDestroy(&_gradient_e));
614 }
616 {
617 LibmeshPetscCallQ(VecDestroy(&_ci));
618 LibmeshPetscCallQ(MatDestroy(&_gradient_i));
619 }
620
621 PetscFunctionReturn(PETSC_SUCCESS);
622}
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
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()