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.");
35 "solve_on", exec_enum,
"List of flags indicating when inner system solve should occur.");
37 "output_optimization_iterations",
39 "Use the time step as the current iteration for outputting optimization history.");
45 _my_comm(MPI_COMM_SELF),
47 _verbose(getParam<bool>(
"verbose")),
48 _output_opt_iters(getParam<bool>(
"output_optimization_iterations")),
50 _parameters(
std::make_unique<
libMesh::PetscVector<Number>>(_my_comm))
53 mooseError(
"OptimizeSolve does not currently support threaded execution");
57 "moose", 27225,
"Outputting for transient executioners has not been implemented.");
63 TIME_SECTION(
"optimizeSolve", 1,
"Optimization Solve");
69 mooseError(
"No OptimizationReporter object found.");
91#if PETSC_RELEASE_LESS_THAN(3, 21, 0)
92 LibmeshPetscCallQ(TaoSetMonitor(
_tao,
monitor,
this,
nullptr));
94 LibmeshPetscCallQ(TaoMonitorSet(
_tao,
monitor,
this,
nullptr));
100 LibmeshPetscCallQ(TaoSetType(
_tao, TAONTR));
103 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBNTR));
106 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBNCG));
109 LibmeshPetscCallQ(TaoSetType(
_tao, TAONLS));
112 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBNLS));
115 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBQNKTR));
118 LibmeshPetscCallQ(TaoSetType(
_tao, TAONTL));
121 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBNTL));
124 LibmeshPetscCallQ(TaoSetType(
_tao, TAOLMVM));
127 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBLMVM));
131 LibmeshPetscCallQ(TaoSetType(
_tao, TAONM));
135 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBQNLS));
138 LibmeshPetscCallQ(TaoSetType(
_tao, TAOOWLQN));
141 LibmeshPetscCallQ(TaoSetType(
_tao, TAOGPCG));
144 LibmeshPetscCallQ(TaoSetType(
_tao, TAOBMRM));
147#if !PETSC_VERSION_LESS_THAN(3, 15, 0)
148 LibmeshPetscCallQ(TaoSetType(
_tao, TAOALMM));
151#if PETSC_RELEASE_GREATER_EQUALS(3, 21, 0)
152 LibmeshPetscCallQ(TaoMonitorCancel(
_tao));
154 LibmeshPetscCallQ(TaoCancelMonitors(
_tao));
156 LibmeshPetscCallQ(PetscOptionsSetValue(NULL,
"-tao_cmonitor", NULL));
159 mooseError(
"ALMM is only compatible with PETSc versions above 3.14. ");
167#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
172#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
183#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
190#if !PETSC_VERSION_LESS_THAN(3, 17, 0)
197 LibmeshPetscCallQ(TaoSetFromOptions(
_tao));
216 LibmeshPetscCallQ(TaoSolve(
_tao));
219 if (getParam<bool>(
"verbose"))
220 LibmeshPetscCallQ(TaoView(
_tao, PETSC_VIEWER_STDOUT_WORLD));
222 LibmeshPetscCallQ(TaoDestroy(&
_tao));
224 LibmeshPetscCallQ(MatDestroy(&
_hessian));
229 PetscFunctionReturn(PETSC_SUCCESS);
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
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);
254 for (
const auto i : make_range(num))
292 if (
auto steady =
dynamic_cast<Steady *
>(sub_app->getExecutioner(0)))
293 steady->setIterationNumberOutput((
unsigned int)its);
306 _console <<
"TAO SOLVER: iteration=" << its <<
"\tf=" <<
f <<
"\tgnorm=" << gnorm
307 <<
"\tcnorm=" << cnorm <<
"\txdiff=" << xdiff << std::endl;
313 TaoConvergedReason reason;
315 PetscReal
f, gnorm, cnorm, xdiff;
318 LibmeshPetscCallQ(TaoGetSolutionStatus(tao, &its, &
f, &gnorm, &cnorm, &xdiff, &reason));
323 PetscFunctionReturn(PETSC_SUCCESS);
333 solver->_parameters->swap(param);
335 (*objective) = solver->objectiveFunction();
336 solver->_parameters->swap(param);
337 PetscFunctionReturn(PETSC_SUCCESS);
342 Tao , Vec
x, Real * objective, Vec gradient,
void * ctx)
348 solver->_parameters->swap(param);
350 (*objective) = solver->objectiveFunction();
352 solver->gradientFunction(grad);
353 solver->_parameters->swap(param);
354 PetscFunctionReturn(PETSC_SUCCESS);
359 Tao , Vec , Mat , Mat ,
void * ctx)
364 LibmeshPetscCallQ(MatShellSetOperation(
366 PetscFunctionReturn(PETSC_SUCCESS);
375 LibmeshPetscCallQ(MatShellGetContext(
H, &ctx));
380 return solver->applyHessian(sbar, Hsbar);
389 LibmeshPetscCallQ(solver->variableBounds(tao));
390 PetscFunctionReturn(PETSC_SUCCESS);
396 TIME_SECTION(
"objectiveFunction", 2,
"Objective forward solve");
419 TIME_SECTION(
"gradientFunction", 2,
"Gradient adjoint solve");
438 TIME_SECTION(
"applyHessian", 2,
"Hessian forward/adjoint solve");
444 mooseError(
"Hessian based optimization algorithms require a sub-app with:\n"
445 " execute_on = HOMOGENEOUS_FORWARD");
452 mooseError(
"Homogeneous forward solve multiapp failed!");
469 PetscFunctionReturn(PETSC_SUCCESS);
482 for (
const auto i : make_range(sz))
488 LibmeshPetscCallQ(TaoSetVariableBounds(tao, xl.
vec(), xu.
vec()));
489 PetscFunctionReturn(PETSC_SUCCESS);
502 PetscFunctionReturn(PETSC_SUCCESS);
507 Tao , Vec , Mat gradient_e, Mat ,
void * ctx)
517 PetscFunctionReturn(PETSC_SUCCESS);
530 PetscFunctionReturn(PETSC_SUCCESS);
535 Tao , Vec , Mat gradient_i, Mat ,
void * ctx)
545 PetscFunctionReturn(PETSC_SUCCESS);
558 LibmeshPetscCallQ(VecSetFromOptions(
_ce));
559 LibmeshPetscCallQ(VecSetUp(
_ce));
563 LibmeshPetscCallQ(MatSetSizes(
572 LibmeshPetscCallQ(TaoSetJacobianEqualityRoutine(
582 LibmeshPetscCallQ(VecSetFromOptions(
_ci));
583 LibmeshPetscCallQ(VecSetUp(
_ci));
600 LibmeshPetscCallQ(TaoSetJacobianInequalityRoutine(
603 PetscFunctionReturn(PETSC_SUCCESS);
612 LibmeshPetscCallQ(VecDestroy(&
_ce));
617 LibmeshPetscCallQ(VecDestroy(&
_ci));
621 PetscFunctionReturn(PETSC_SUCCESS);
Real f(Real x)
Test function for Brents method.
const std::vector< double > x
const ExecFlagType EXEC_NONE
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)
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
bool isValueSet(const std::string &value) const
Base class for optimization objects, implements routines for calculating misfit.
void setInitialCondition(libMesh::PetscVector< Number > ¶m)
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.
@ BOUNDED_NEWTON_TRUST_LINE
@ BOUNDED_QUASI_NEWTON_LINE_SEARCH
@ AUGMENTED_LAGRANGIAN_MULTIPLIER_METHOD
@ BOUNDED_NEWTON_TRUST_REGION
@ BOUNDED_CONJUGATE_GRADIENT
@ BOUNDED_QUASI_NEWTON_TRUST_REGION
@ GRADIENT_PROJECTION_CONJUGATE_GRADIENT
@ BOUNDED_NEWTON_LINE_SEARCH
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
SolveObject * _inner_solve
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...