https://mooseframework.inl.gov
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"
13 #include "OptimizationAppTypes.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 
60 bool
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 
84 PetscErrorCode
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)
174  TaoSetObjectiveAndGradient(_tao, NULL, objectiveAndGradientFunctionWrapper, this));
175 #else
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)
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 
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 
228 
229  PetscFunctionReturn(PETSC_SUCCESS);
230 }
231 
232 void
233 OptimizeSolve::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 
268 void
269 OptimizeSolve::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
278  _obj_iterate_vec.push_back(_obj_iterate);
279  _grad_iterate_vec.push_back(_grad_iterate);
280  _hess_iterate_vec.push_back(_hess_iterate);
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
301  if (_output_opt_iters)
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 
310 PetscErrorCode
311 OptimizeSolve::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 
326 PetscErrorCode
327 OptimizeSolve::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 
340 PetscErrorCode
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 
357 PetscErrorCode
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 
369 PetscErrorCode
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 
383 PetscErrorCode
384 OptimizeSolve::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 
393 Real
395 {
396  TIME_SECTION("objectiveFunction", 2, "Objective forward solve");
398 
401 
404  {
405  // We do this so we can output for failed solves.
407  mooseError("Forward solve multiapp failed!");
408  }
410  _inner_solve->solve();
411 
412  _obj_iterate++;
414 }
415 
416 void
418 {
419  TIME_SECTION("gradientFunction", 2, "Gradient adjoint solve");
421 
426  mooseError("Adjoint solve multiapp failed!");
428  _inner_solve->solve();
429 
430  _grad_iterate++;
431  _obj_function->computeGradient(gradient);
432 }
433 
434 PetscErrorCode
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!");
454  _inner_solve->solve();
455 
457 
462  mooseError("Adjoint solve multiapp failed!");
464  _inner_solve->solve();
465 
467  _hess_iterate++;
468  PetscFunctionReturn(PETSC_SUCCESS);
469 }
470 
471 PetscErrorCode
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  {
483  xl.set(i, _obj_function->getLowerBound(i));
484  xu.set(i, _obj_function->getUpperBound(i));
485  }
486  // set upper and lower bounds in tao solver
487  LibmeshPetscCallQ(TaoSetVariableBounds(tao, xl.vec(), xu.vec()));
488  PetscFunctionReturn(PETSC_SUCCESS);
489 }
490 
491 PetscErrorCode
492 OptimizeSolve::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 
504 PetscErrorCode
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 
519 PetscErrorCode
520 OptimizeSolve::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 
532 PetscErrorCode
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 
547 PetscErrorCode
549 {
552  {
553  // Create equality vector
554  LibmeshPetscCallQ(VecCreate(_my_comm.get(), &_ce));
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));
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
596  TaoSetInequalityConstraintsRoutine(_tao, _ci, inequalityFunctionWrapper, this));
597 
598  // Set the Inequality constraints Jacobian
599  LibmeshPetscCallQ(TaoSetJacobianInequalityRoutine(
601  }
602  PetscFunctionReturn(PETSC_SUCCESS);
603 }
604 
605 PetscErrorCode
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 }
virtual bool solve() override
Definition: OptimizeSolve.C:61
FEProblemBase & _problem
Moose::PetscSupport::PetscOptions & getPetscOptions()
unsigned int n_threads()
virtual void setMisfitToSimulatedValues()
Function to override misfit values with the simulated values from the matrix free hessian forward sol...
T & getUserObject(const std::string &name, unsigned int tid=0) const
Moose::PetscSupport::PetscOptions _petsc_options
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
virtual void computeInequalityConstraints(libMesh::PetscVector< Number > &ineqs_constraints) const
Function to compute the inequality constraints.
static InputParameters validParams()
Definition: OptimizeSolve.C:18
Mat _gradient_e
Equality constraint gradient.
Real getLowerBound(dof_id_type i) const
const libMesh::Parallel::Communicator _my_comm
Communicator used for operations.
Definition: OptimizeSolve.h:75
const ExecFlagType EXEC_NONE
Tao _tao
Tao optimization object.
Definition: OptimizeSolve.h:87
static PetscErrorCode inequalityFunctionWrapper(Tao tao, Vec x, Vec ci, void *ctx)
FEProblemBase & feProblem()
dof_id_type getNumEqCons() const
Function to get the total number of equalities.
PetscFunctionBegin
PetscErrorCode taoSolve()
Here is where we call tao and solve.
Definition: OptimizeSolve.C:85
const ExecFlagType EXEC_HOMOGENEOUS_FORWARD
const ExecFlagType EXEC_FORWARD
PetscErrorCode taoALDestroy()
Used for destroying petsc structures when using the ALMM algorithm.
Vec _ce
Equality constraint vector.
Vec _ci
Inequality constraint vector.
ExecuteMooseObjectWarehouse< MultiApp > & getMultiAppWarehouse()
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...
bool hasUserObject(const std::string &name) const
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
Mat _gradient_i
Inequality constraint gradient.
std::vector< int > _hess_iterate_vec
Hessian solves per iteration.
static PetscErrorCode applyHessianWrapper(Mat H, Vec s, Vec Hs)
virtual dof_id_type getNumParams() const
Function to get the total number of parameters.
static PetscErrorCode variableBoundsWrapper(Tao, Vec xl, Vec xu, void *ctx)
static PetscErrorCode objectiveAndGradientFunctionWrapper(Tao tao, Vec x, Real *objective, Vec gradient, void *ctx)
void addRequiredParam(const std::string &name, const std::string &doc_string)
InputParameters emptyInputParameters()
OptimizeSolve(Executioner &ex)
Definition: OptimizeSolve.C:43
Base class for optimization objects, implements routines for calculating misfit.
bool _verbose
control optimization executioner output
Definition: OptimizeSolve.h:91
void setInitialCondition(libMesh::PetscVector< Number > &param)
Function to initialize petsc vectors from vpp data.
void mooseDocumentedError(const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
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.
virtual void execute(const ExecFlagType &exec_type)
const std::vector< std::shared_ptr< MultiApp > > & getObjects(THREAD_ID tid=0) const
virtual PetscErrorCode applyHessian(libMesh::PetscVector< Number > &s, libMesh::PetscVector< Number > &Hs)
Hessian application routine.
const std::vector< double > x
Real f(Real x)
Test function for Brents method.
std::unique_ptr< libMesh::PetscVector< Number > > _parameters
Parameters (solution) given to TAO.
SolveObject * _inner_solve
const ExecFlagEnum & _solve_on
List of execute flags for when to solve the system.
Definition: OptimizeSolve.h:78
OptimizationReporterBase * _obj_function
objective function defining objective, gradient, and hessian
Definition: OptimizeSolve.h:81
virtual Real computeObjective()=0
Function to compute objective.
static PetscErrorCode monitor(Tao tao, void *ctx)
bool isValueSet(const std::string &value) const
void petscSetOptions(const PetscOptions &po, const SolverParams &solver_params, FEProblemBase *const problem=nullptr)
Executioner * getExecutioner() const
void backupMultiApps(ExecFlagType type)
virtual int & timeStep() const
std::vector< int > _grad_iterate_vec
gradient solves per iteration
std::string grad(const std::string &var)
Definition: NS.h:91
std::vector< double > _f_vec
objective value per iteration
static PetscErrorCode inequalityGradientFunctionWrapper(Tao tao, Vec x, Mat gradient_i, Mat gradient_ipre, void *ctx)
const ExecFlagType EXEC_ADJOINT
TaoSolverEnum
Enum of tao solver types.
std::vector< int > _function_solve_vec
total solves per iteration
LibmeshPetscCallQ(DMShellGetContext(dm, &ctx))
virtual void set(const numeric_index_type i, const T value) override
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...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
MooseApp & _app
Mat _hessian
Hessian (matrix) - usually a matrix-free representation.
virtual void computeGradient(libMesh::PetscVector< Number > &gradient) const
Function to compute gradient.
void restoreMultiApps(ExecFlagType type, bool force=false)
std::vector< double > _cnorm_vec
infeasibility norm per iteration
static PetscErrorCode equalityGradientFunctionWrapper(Tao tao, Vec x, Mat gradient_e, Mat gradient_epre, void *ctx)
IntRange< T > make_range(T beg, T end)
class infix_ostream_iterator if void
virtual void updateParameters(const libMesh::PetscVector< Number > &x)
Function to set parameters.
void mooseError(Args &&... args) const
SolverParams & solverParams(unsigned int solver_sys_num=0)
std::vector< double > _xdiff_vec
step length per iteration
std::vector< double > _gnorm_vec
gradient norm per iteration
void * ctx
enum OptimizeSolve::TaoSolverEnum _tao_solver_enum
const ConsoleStream _console
std::vector< int > _total_iterate_vec
total solves per iteration
bool execMultiApps(ExecFlagType type, bool auto_advance=true)
virtual bool isTransient() const override
bool hasMultiApps() const
Real getUpperBound(dof_id_type i) const
Upper and lower bounds for each parameter being controlled.
Real Number
static PetscErrorCode hessianFunctionWrapper(Tao tao, Vec x, Mat hessian, Mat pc, void *ctx)
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)
SolverParams _solver_params
bool _output_opt_iters
Use time step as the iteration counter for purposes of outputting.
Definition: OptimizeSolve.h:94
virtual bool solve()=0
virtual void gradientFunction(libMesh::PetscVector< Number > &gradient)
Gradient routine.
virtual void computeEqualityConstraints(libMesh::PetscVector< Number > &eqs_constraints) const
Function to compute the equality constraints.
static PetscErrorCode equalityFunctionWrapper(Tao tao, Vec x, Vec ce, void *ctx)
solveObject to interface with Petsc Tao
Definition: OptimizeSolve.h:28
PetscErrorCode taoALCreate()
Used for creating petsc structures when using the ALMM algorithm.
std::vector< int > _obj_iterate_vec
number of objective solves per iteration
void setTaoSolutionStatus(double f, int its, double gnorm, double cnorm, double xdiff)
output optimization iteration solve data
virtual Real objectiveFunction()
Objective routine.
virtual void outputStep(ExecFlagType type)
virtual PetscErrorCode variableBounds(Tao tao)
Bounds routine.
dof_id_type getNumInEqCons() const
Function to get the total number of inequalities.
static PetscErrorCode objectiveFunctionWrapper(Tao tao, Vec x, Real *objective, void *ctx)
dof_id_type _ndof
Number of parameters being optimized.