Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consolidate register #12161

Merged
merged 9 commits into from Sep 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions framework/include/actions/ActionFactory.h
Expand Up @@ -133,6 +133,9 @@ class ActionFactory

FileLineInfoMap _name_to_line;
std::multimap<std::string, std::string> _task_to_action_map;

/// set<objectname, task> used to track if an object previously added is being added again
std::set<std::pair<std::string, std::string>> _current_objs;
};

#endif /* ACTIONFACTORY_H */
4 changes: 4 additions & 0 deletions framework/include/base/Moose.h
Expand Up @@ -163,6 +163,8 @@ using libMesh::out;
* Register objects that are in MOOSE
*/

void registerAll(Factory & f, ActionFactory & af, Syntax & s);

void registerObjects(Factory & factory);
void registerObjects(Factory & factory, const std::set<std::string> & obj_labels);
void addActionTypes(Syntax & syntax);
Expand All @@ -172,6 +174,8 @@ void registerActions(Syntax & syntax,
const std::set<std::string> & obj_labels);
void registerExecFlags(Factory & factory);

void associateSyntax(Syntax & syntax, ActionFactory & action_factory);

void setSolverDefaults(FEProblemBase & problem);

/**
Expand Down
18 changes: 7 additions & 11 deletions framework/include/base/MooseApp.h
Expand Up @@ -415,18 +415,15 @@ class MooseApp : public ConsoleStreamInterface, public libMesh::ParallelObject
* attempts to load a dynamic library and register it when it is needed. Throws an error if
* no suitable library is found that contains the app_name in question.
*/
void dynamicObjectRegistration(const std::string & app_name,
Factory * factory,
std::string library_path,
const std::string & library_name);
void dynamicAllRegistration(const std::string & app_name,
Factory * factory,
ActionFactory * action_factory,
Syntax * syntax,
std::string library_path,
const std::string & library_name);
void dynamicAppRegistration(const std::string & app_name,
std::string library_path,
const std::string & library_name);
void dynamicSyntaxAssociation(const std::string & app_name,
Syntax * syntax,
ActionFactory * action_factory,
std::string library_path,
const std::string & library_name);
///@}

/**
Expand Down Expand Up @@ -791,8 +788,7 @@ class MooseApp : public ConsoleStreamInterface, public libMesh::ParallelObject
enum RegistrationType
{
APPLICATION,
OBJECT,
SYNTAX
REGALL
};

/// Level of multiapp, the master is level 0. This used by the Console to indent output
Expand Down
8 changes: 0 additions & 8 deletions framework/include/parser/MooseSyntax.h
Expand Up @@ -10,12 +10,4 @@
#ifndef MOOSESYNTAX_H
#define MOOSESYNTAX_H

class Syntax;
class ActionFactory;

namespace Moose
{
void associateSyntax(Syntax & syntax, ActionFactory & action_factory);
}

#endif // MOOSESYNTAX_H
14 changes: 11 additions & 3 deletions framework/include/utils/DependencyResolver.h
Expand Up @@ -127,8 +127,11 @@ class DependencyResolver
/// This is our main data structure a multimap that contains any number of dependencies in a key = value format
std::multimap<T, T> _depends;

/// Used to avoid duplicate tracking of identical insertions of dependencies
std::set<std::pair<T, T>> _unique_deps;

/// Extra items that need to come out in the sorted list but contain no dependencies
std::vector<T> _independent_items;
std::set<T> _independent_items;

// A vector retaining the order in which items were added to the
// resolver, to disambiguate ordering of items with no
Expand Down Expand Up @@ -204,6 +207,11 @@ template <typename T>
void
DependencyResolver<T>::insertDependency(const T & key, const T & value)
{
auto k = std::make_pair(key, value);
if (_unique_deps.count(k) > 0)
return;
_unique_deps.insert(k);

if (dependsOn(value, key))
{
throw CyclicDependencyException<T>(
Expand All @@ -220,7 +228,7 @@ template <typename T>
void
DependencyResolver<T>::addItem(const T & value)
{
_independent_items.push_back(value);
_independent_items.insert(value);
if (std::find(_ordering_vector.begin(), _ordering_vector.end(), value) == _ordering_vector.end())
_ordering_vector.push_back(value);
}
Expand Down Expand Up @@ -295,7 +303,7 @@ DependencyResolver<T>::getSortedValuesSets()
_ordered_items.clear();

// Put the independent items into the first set in _ordered_items
std::vector<T> next_set(_independent_items);
std::vector<T> next_set(_independent_items.begin(), _independent_items.end());

/* Topological Sort */
while (!depends.empty())
Expand Down
5 changes: 4 additions & 1 deletion framework/include/utils/MooseEnumItem.h
Expand Up @@ -72,7 +72,10 @@ class MooseEnumItem
/**
* Less than operator. This is required for this class to work in maps and sets.
*/
bool operator<(const MooseEnumItem & other) const { return _id < other._id; }
bool operator<(const MooseEnumItem & other) const
{
return _id != other._id ? _id < other._id : _name < other._name;
}

/**
* ostream operator for string printing.
Expand Down
5 changes: 5 additions & 0 deletions framework/src/actions/ActionFactory.C
Expand Up @@ -23,6 +23,11 @@ ActionFactory::reg(const std::string & name,
const std::string & file,
int line)
{
auto key = std::make_pair(name, task);
if (_current_objs.count(key) > 0)
return;
_current_objs.insert(key);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For future reference we have a moose_try_emplace() method (C++17 wrapper) which is more efficient (and a single line) for this type of thing.


BuildInfo build_info;
build_info._build_pointer = obj_builder;
build_info._params_pointer = ref_params;
Expand Down
15 changes: 6 additions & 9 deletions framework/src/actions/DynamicObjectRegistrationAction.C
Expand Up @@ -55,15 +55,12 @@ DynamicObjectRegistrationAction::DynamicObjectRegistrationAction(InputParameters
getParam<std::vector<std::string>>("register_objects_from");
for (const auto & app_name : application_names)
{
_app.dynamicObjectRegistration(app_name,
&_factory,
getParam<std::string>("library_path"),
getParam<std::string>("library_name"));
_app.dynamicSyntaxAssociation(app_name,
&_awh.syntax(),
&_action_factory,
getParam<std::string>("library_path"),
getParam<std::string>("library_name"));
_app.dynamicAllRegistration(app_name,
&_factory,
&_action_factory,
&_awh.syntax(),
getParam<std::string>("library_path"),
getParam<std::string>("library_name"));
}
}
}
Expand Down
167 changes: 167 additions & 0 deletions framework/src/base/Moose.C
Expand Up @@ -19,6 +19,7 @@
#include "Factory.h"
#include "PetscSupport.h"
#include "Syntax.h"
#include "MooseSyntax.h"

#include <unistd.h>

Expand All @@ -43,9 +44,21 @@ const ExecFlagType EXEC_SAME_AS_MULTIAPP("SAME_AS_MULTIAPP");
namespace Moose
{

void associateSyntaxInner(Syntax & syntax, ActionFactory & action_factory);

void
registerAll(Factory & f, ActionFactory & af, Syntax & s)
{
registerObjects(f, {"MooseApp"});
associateSyntaxInner(s, af);
registerActions(s, af, {"MooseApp"});
registerExecFlags(f);
}

void
registerObjects(Factory & factory)
{
mooseDeprecated("use registerAll instead of registerObjects");
registerObjects(factory, {"MooseApp"});
}

Expand Down Expand Up @@ -302,6 +315,7 @@ addActionTypes(Syntax & syntax)
void
registerActions(Syntax & syntax, ActionFactory & action_factory)
{
mooseDeprecated("use registerAll instead of registerActions");
registerActions(syntax, action_factory, {"MooseApp"});
}

Expand Down Expand Up @@ -333,6 +347,159 @@ registerExecFlags(Factory & factory)
registerExecFlag(EXEC_SAME_AS_MULTIAPP);
}

void
associateSyntaxInner(Syntax & syntax, ActionFactory & /*action_factory*/)
{
/**
* Note: the optional third parameter is used to differentiate which task is
* satisfied based on the syntax encountered for classes which are registered
* to satisfy more than one task
*/
registerSyntaxTask("CopyNodalVarsAction", "Variables/*", "check_copy_nodal_vars");
registerSyntaxTask("CopyNodalVarsAction", "Variables/*", "copy_nodal_vars");
registerSyntaxTask("CopyNodalVarsAction", "AuxVariables/*", "check_copy_nodal_vars");
registerSyntaxTask("CopyNodalVarsAction", "AuxVariables/*", "copy_nodal_aux_vars");

registerSyntaxTask("AddKernelAction", "Kernels/*", "add_kernel");
registerSyntaxTask("AddNodalKernelAction", "NodalKernels/*", "add_nodal_kernel");
registerSyntaxTask("AddKernelAction", "AuxKernels/*", "add_aux_kernel");
registerSyntaxTask("AddKernelAction", "Bounds/*", "add_aux_kernel");

registerSyntaxTask("AddScalarKernelAction", "ScalarKernels/*", "add_scalar_kernel");
registerSyntaxTask("AddScalarKernelAction", "AuxScalarKernels/*", "add_aux_scalar_kernel");

registerSyntaxTask("AddBCAction", "BCs/*", "add_bc");

registerSyntax("CreateProblemAction", "Problem");
registerSyntax("DynamicObjectRegistrationAction", "Problem");
registerSyntax("SetupMeshAction", "Mesh");
registerSyntax("SetupMeshCompleteAction", "Mesh");
// registerSyntaxTask("SetupMeshCompleteAction", "Mesh", "prepare_mesh");
// registerSyntaxTask("SetupMeshCompleteAction", "Mesh", "setup_mesh_complete");
registerSyntax("CreateDisplacedProblemAction", "Mesh");
registerSyntax("AddMeshModifierAction", "MeshModifiers/*");
registerSyntax("AddMortarInterfaceAction", "Mesh/MortarInterfaces/*");

registerSyntax("AddFunctionAction", "Functions/*");
syntax.registerSyntaxType("Functions/*", "FunctionName");

registerSyntax("GlobalParamsAction", "GlobalParams");

registerSyntax("AddDistributionAction", "Distributions/*");
registerSyntax("AddSamplerAction", "Samplers/*");

registerSyntax("SetupDebugAction", "Debug");
registerSyntax("SetupResidualDebugAction", "Debug");

/// Variable/AuxVariable Actions
registerSyntax("AddVariableAction", "Variables/*");
syntax.registerSyntaxType("Variables/*", "VariableName");
syntax.registerSyntaxType("Variables/*", "NonlinearVariableName");
// syntax.registerActionSyntax("AddVariableAction", "Variables/*", "add_variable");
// syntax.registerActionSyntax("AddVariableAction", "Variables/*", "add_ic");

registerSyntax("AddICAction", "Variables/*/InitialCondition");

registerSyntax("AddAuxVariableAction", "AuxVariables/*");
syntax.registerSyntaxType("AuxVariables/*", "VariableName");
syntax.registerSyntaxType("AuxVariables/*", "AuxVariableName");
// syntax.registerActionSyntax("AddAuxVariableAction", "AuxVariables/*", "add_aux_variable");
// syntax.registerActionSyntax("AddAuxVariableAction", "AuxVariables/*", "add_ic");

registerSyntax("AddICAction", "AuxVariables/*/InitialCondition");

registerSyntaxTask("EmptyAction", "BCs/Periodic", "no_action"); // placeholder
registerSyntax("AddPeriodicBCAction", "BCs/Periodic/*");

registerSyntaxTask("AddInitialConditionAction", "ICs/*", "add_ic");

registerSyntax("AddMaterialAction", "Materials/*");

registerSyntax("SetupPostprocessorDataAction", "Postprocessors/*");
registerSyntax("AddPostprocessorAction", "Postprocessors/*");
syntax.registerSyntaxType("Postprocessors/*", "PostprocessorName");
syntax.registerSyntaxType("Postprocessors/*", "UserObjectName");

registerSyntax("AddVectorPostprocessorAction", "VectorPostprocessors/*");
syntax.registerSyntaxType("VectorPostprocessors/*", "VectorPostprocessorName");

registerSyntax("AddDamperAction", "Dampers/*");

registerSyntax("AddOutputAction", "Outputs/*");
registerSyntax("CommonOutputAction", "Outputs");
syntax.registerSyntaxType("Outputs/*", "OutputName");

// Note: Preconditioner Actions will be built by this setup action
registerSyntax("SetupPreconditionerAction", "Preconditioning/*");
registerSyntax("AddFieldSplitAction", "Preconditioning/*/*");

registerSyntax("CreateExecutionerAction", "Executioner");
registerSyntax("SetupTimeStepperAction", "Executioner/TimeStepper");
registerSyntax("SetupTimeIntegratorAction", "Executioner/TimeIntegrator");

registerSyntax("SetupQuadratureAction", "Executioner/Quadrature");
registerSyntax("SetupPredictorAction", "Executioner/Predictor");
#ifdef LIBMESH_ENABLE_AMR
registerSyntax("AdaptivityAction", "Executioner/Adaptivity");
#endif

registerSyntax("PartitionerAction", "Mesh/Partitioner");

registerSyntax("AddDiracKernelAction", "DiracKernels/*");

registerSyntax("AddDGKernelAction", "DGKernels/*");

registerSyntax("AddInterfaceKernelAction", "InterfaceKernels/*");

registerSyntax("AddConstraintAction", "Constraints/*");

registerSyntax("AddUserObjectAction", "UserObjects/*");
syntax.registerSyntaxType("UserObjects/*", "UserObjectName");
registerSyntax("AddControlAction", "Controls/*");
registerSyntax("AddBoundsVectorsAction", "Bounds");

registerSyntax("AddNodalNormalsAction", "NodalNormals");
// registerSyntaxTask("AddNodalNormalsAction", "NodalNormals", "add_aux_variable");
// registerSyntaxTask("AddNodalNormalsAction", "NodalNormals", "add_postprocessor");
// registerSyntaxTask("AddNodalNormalsAction", "NodalNormals", "add_user_object");

// Indicator
registerSyntax("AddElementalFieldAction", "Adaptivity/Indicators/*");
registerSyntax("AddIndicatorAction", "Adaptivity/Indicators/*");
syntax.registerSyntaxType("Adaptivity/Indicators/*", "IndicatorName");

// Marker
registerSyntax("AddElementalFieldAction", "Adaptivity/Markers/*");
registerSyntax("AddMarkerAction", "Adaptivity/Markers/*");
syntax.registerSyntaxType("Adaptivity/Markers/*", "MarkerName");

// New Adaptivity System
registerSyntax("SetAdaptivityOptionsAction", "Adaptivity");

// Deprecated Block
registerSyntax("DeprecatedBlockAction", "DeprecatedBlock");

// Multi Apps
registerSyntax("AddMultiAppAction", "MultiApps/*");
syntax.registerSyntaxType("MultiApps/*", "MultiAppName");

// Transfers
registerSyntax("AddTransferAction", "Transfers/*");

// Material derivative test
registerSyntaxTask("EmptyAction", "Debug/MaterialDerivativeTest", "no_action"); // placeholder
registerSyntax("MaterialDerivativeTestAction", "Debug/MaterialDerivativeTest/*");

addActionTypes(syntax);
}

void
associateSyntax(Syntax & syntax, ActionFactory & action_factory)
{
associateSyntaxInner(syntax, action_factory);
registerActions(syntax, action_factory);
}

void
setSolverDefaults(FEProblemBase & problem)
{
Expand Down