Skip to content

Commit

Permalink
Use new static exec flag reg and namespace custom exec flags
Browse files Browse the repository at this point in the history
  • Loading branch information
loganharbour authored and dschwen committed Sep 23, 2022
1 parent 6f01d07 commit d3a8bb0
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 33 deletions.
3 changes: 3 additions & 0 deletions modules/optimization/include/base/IsopodAppTypes.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#pragma once
#include "Moose.h"

namespace IsopodAppTypes
{
extern const ExecFlagType EXEC_FORWARD;
extern const ExecFlagType EXEC_ADJOINT;
extern const ExecFlagType EXEC_HOMOGENEOUS_FORWARD;
}
11 changes: 7 additions & 4 deletions modules/optimization/src/base/IsopodAppTypes.C
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#include "IsopodAppTypes.h"
#include "MooseEnumItem.h"
#include "ExecFlagRegistry.h"

const ExecFlagType EXEC_FORWARD("FORWARD");
const ExecFlagType EXEC_ADJOINT("ADJOINT");
const ExecFlagType EXEC_HOMOGENEOUS_FORWARD("HOMOGENEOUS_FORWARD");
namespace IsopodAppTypes
{
const ExecFlagType EXEC_FORWARD = registerExecFlag("FORWARD");
const ExecFlagType EXEC_ADJOINT = registerExecFlag("ADJOINT");
const ExecFlagType EXEC_HOMOGENEOUS_FORWARD = registerExecFlag("HOMOGENEOUS_FORWARD");
}
6 changes: 0 additions & 6 deletions modules/optimization/src/base/isopodApp.C
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@ isopodApp::registerAll(Factory & f, ActionFactory & af, Syntax & s)
Registry::registerActionsTo(af, {"isopodApp"});

auto & syntax = s;
auto & factory = f;

// Optimization execution flags
registerExecFlag(EXEC_FORWARD);
registerExecFlag(EXEC_ADJOINT);
registerExecFlag(EXEC_HOMOGENEOUS_FORWARD);

// Form Function actions
registerSyntaxTask("AddOptimizationReporterAction", "OptimizationReporter", "add_reporter");
Expand Down
49 changes: 27 additions & 22 deletions modules/optimization/src/executioners/OptimizeSolve.C
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,13 @@ OptimizeSolve::validParams()
params.addRequiredParam<MooseEnum>(
"tao_solver", tao_solver_enum, "Tao solver to use for optimization.");
ExecFlagEnum exec_enum = ExecFlagEnum();
exec_enum.addAvailableFlags(EXEC_NONE, EXEC_FORWARD, EXEC_ADJOINT, EXEC_HOMOGENEOUS_FORWARD);
exec_enum = {EXEC_FORWARD, EXEC_ADJOINT, EXEC_HOMOGENEOUS_FORWARD};
exec_enum.addAvailableFlags(EXEC_NONE,
IsopodAppTypes::EXEC_FORWARD,
IsopodAppTypes::EXEC_ADJOINT,
IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD);
exec_enum = {IsopodAppTypes::EXEC_FORWARD,
IsopodAppTypes::EXEC_ADJOINT,
IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD};
params.addParam<ExecFlagEnum>(
"solve_on", exec_enum, "List of flags indicating when inner system solve should occur.");
return params;
Expand Down Expand Up @@ -140,9 +145,9 @@ OptimizeSolve::taoSolve()
CHKERRQ(ierr);

// Backup multiapps so transient problems start with the same initial condition
_problem.backupMultiApps(EXEC_FORWARD);
_problem.backupMultiApps(EXEC_ADJOINT);
_problem.backupMultiApps(EXEC_HOMOGENEOUS_FORWARD);
_problem.backupMultiApps(IsopodAppTypes::EXEC_FORWARD);
_problem.backupMultiApps(IsopodAppTypes::EXEC_ADJOINT);
_problem.backupMultiApps(IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD);

// Solve optimization
ierr = TaoSolve(_tao);
Expand Down Expand Up @@ -307,12 +312,12 @@ OptimizeSolve::objectiveFunction()
{
_form_function->updateParameters(*_parameters.get());

_problem.execute(EXEC_FORWARD);
_problem.execute(IsopodAppTypes::EXEC_FORWARD);
bool multiapp_passed = true;
_problem.restoreMultiApps(EXEC_FORWARD);
if (!_problem.execMultiApps(EXEC_FORWARD))
_problem.restoreMultiApps(IsopodAppTypes::EXEC_FORWARD);
if (!_problem.execMultiApps(IsopodAppTypes::EXEC_FORWARD))
multiapp_passed = false;
if (_solve_on.contains(EXEC_FORWARD))
if (_solve_on.contains(IsopodAppTypes::EXEC_FORWARD))
_inner_solve->solve();

_obj_iterate++;
Expand All @@ -324,11 +329,11 @@ OptimizeSolve::gradientFunction(libMesh::PetscVector<Number> & gradient)
{
_form_function->updateParameters(*_parameters.get());

_problem.execute(EXEC_ADJOINT);
_problem.restoreMultiApps(EXEC_ADJOINT);
if (!_problem.execMultiApps(EXEC_ADJOINT))
_problem.execute(IsopodAppTypes::EXEC_ADJOINT);
_problem.restoreMultiApps(IsopodAppTypes::EXEC_ADJOINT);
if (!_problem.execMultiApps(IsopodAppTypes::EXEC_ADJOINT))
mooseError("Adjoint solve multiapp failed!");
if (_solve_on.contains(EXEC_ADJOINT))
if (_solve_on.contains(IsopodAppTypes::EXEC_ADJOINT))
_inner_solve->solve();

_grad_iterate++;
Expand All @@ -341,25 +346,25 @@ OptimizeSolve::applyHessian(libMesh::PetscVector<Number> & s, libMesh::PetscVect
// What happens for material inversion when the Hessian
// is dependent on the parameters? Deal with it later???
// see notes on how this needs to change for Material inversion
if (_problem.hasMultiApps() && !_problem.hasMultiApps(EXEC_HOMOGENEOUS_FORWARD))
if (_problem.hasMultiApps() && !_problem.hasMultiApps(IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD))
mooseError("Hessian based optimization algorithms require a sub-app with:\n"
" execute_on = HOMOGENEOUS_FORWARD");
_form_function->updateParameters(s);

_problem.execute(EXEC_HOMOGENEOUS_FORWARD);
_problem.restoreMultiApps(EXEC_HOMOGENEOUS_FORWARD);
if (!_problem.execMultiApps(EXEC_HOMOGENEOUS_FORWARD))
_problem.execute(IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD);
_problem.restoreMultiApps(IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD);
if (!_problem.execMultiApps(IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD))
mooseError("Homogeneous forward solve multiapp failed!");
if (_solve_on.contains(EXEC_HOMOGENEOUS_FORWARD))
if (_solve_on.contains(IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD))
_inner_solve->solve();

_form_function->setMisfitToSimulatedValues();

_problem.execute(EXEC_ADJOINT);
_problem.restoreMultiApps(EXEC_ADJOINT);
if (!_problem.execMultiApps(EXEC_ADJOINT))
_problem.execute(IsopodAppTypes::EXEC_ADJOINT);
_problem.restoreMultiApps(IsopodAppTypes::EXEC_ADJOINT);
if (!_problem.execMultiApps(IsopodAppTypes::EXEC_ADJOINT))
mooseError("Adjoint solve multiapp failed!");
if (_solve_on.contains(EXEC_ADJOINT))
if (_solve_on.contains(IsopodAppTypes::EXEC_ADJOINT))
_inner_solve->solve();

_form_function->computeGradient(Hs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ OptimizeFullSolveMultiApp::validParams()
InputParameters params = FullSolveMultiApp::validParams();
params.addClassDescription("This is FullSolveMultiApp with some extra flags registered.");
ExecFlagEnum exec_enum = ExecFlagEnum();
exec_enum.addAvailableFlags(EXEC_NONE, EXEC_FORWARD, EXEC_ADJOINT, EXEC_HOMOGENEOUS_FORWARD);
exec_enum.addAvailableFlags(EXEC_NONE,
IsopodAppTypes::EXEC_FORWARD,
IsopodAppTypes::EXEC_ADJOINT,
IsopodAppTypes::EXEC_HOMOGENEOUS_FORWARD);
params.addParam<ExecFlagEnum>(
"execute_on", exec_enum, "List of flags indicating when this multiapp should solve.");

Expand Down

0 comments on commit d3a8bb0

Please sign in to comment.