www.mooseframework.org
ActionWarehouse.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 #pragma once
11 
12 #include <string>
13 #include <set>
14 #include <map>
15 #include <vector>
16 #include <list>
17 #include <ostream>
18 
19 // MOOSE includes
20 #include "Action.h"
21 #include "ConsoleStreamInterface.h"
22 
24 using ActionIterator = std::list<Action *>::iterator;
25 
26 class MooseMesh;
27 class Syntax;
28 class ActionFactory;
29 class FEProblem;
30 
35 {
36 public:
37  ActionWarehouse(MooseApp & app, Syntax & syntax, ActionFactory & factory);
39 
44  void build();
45 
49  void clear();
50 
54  bool empty() const { return _action_blocks.empty(); }
55 
59  void addActionBlock(std::shared_ptr<Action> blk);
60 
66  void checkUnsatisfiedActions() const;
67 
73  void printActionDependencySets() const;
74 
81  void printInputFile(std::ostream & out);
82 
84 
90  ActionIterator actionBlocksWithActionBegin(const std::string & task);
91  ActionIterator actionBlocksWithActionEnd(const std::string & task);
93 
97  const std::vector<std::shared_ptr<Action>> & allActionBlocks() const;
98 
103  const std::list<Action *> & getActionListByName(const std::string & task) const;
104 
109  template <class T>
110  const T & getAction(const std::string & name)
111  {
112  typename std::shared_ptr<T> p;
113  for (auto act_ptr : _all_ptrs)
114  {
115  if (act_ptr->name() == name)
116  {
117  p = std::dynamic_pointer_cast<T>(act_ptr);
118  if (p)
119  break;
120  }
121  }
122  if (!p)
123  {
124  std::vector<std::string> all_names;
125  for (auto act_ptr : _all_ptrs)
126  if (!act_ptr->name().empty())
127  all_names.push_back(act_ptr->name());
128  else
129  all_names.push_back("unnamed");
130  mooseError("Action with name '",
131  name,
132  "' does not exist.\n These are the Actions that do exist:",
133  Moose::stringify(all_names));
134  }
135  return *p;
136  }
137 
141  template <class T>
142  std::vector<const T *> getActions()
143  {
144  // we need to create the map first to ensure that all actions in the map are unique
145  // and the actions are sorted by their names
146  typename std::map<std::string, const std::shared_ptr<T>> actions;
147  for (auto act_ptr : _all_ptrs)
148  {
149  auto p = std::dynamic_pointer_cast<T>(act_ptr);
150  if (p)
151  actions.insert(std::make_pair(act_ptr->name(), p));
152  }
153  // construct the vector from the map entries
154  std::vector<const T *> action_vector;
155  for (auto & pair : actions)
156  action_vector.push_back(pair.second.get());
157  return action_vector;
158  }
159 
166  template <class T>
167  const T * getActionByTask(const std::string & task)
168  {
169  const auto it = _action_blocks.find(task);
170  if (it == _action_blocks.end())
171  return nullptr;
172 
173  T * p = nullptr;
174  for (const auto & action : it->second)
175  {
176  T * tp = dynamic_cast<T *>(action);
177  if (tp)
178  {
179  if (p)
180  mooseError("More than one actions have been detected in getActionByTask for the task '",
181  task,
182  "' in the app '",
183  getMooseAppName(),
184  "'");
185  else
186  p = tp;
187  }
188  }
189  return p;
190  }
191 
192  void setFinalTask(const std::string & task);
193 
197  bool hasActions(const std::string & task) const;
198 
203  void executeAllActions();
204 
209  void executeActionsWithAction(const std::string & name);
210 
216  void showActionDependencies(bool state = true) { _show_action_dependencies = state; }
217 
223  void showActions(bool state = true) { _show_actions = state; }
224 
230  void showParser(bool state = true) { _show_parser = state; }
231 
233  Syntax & syntax() { return _syntax; }
234 
235  // We are not really using the reference counting capabilities of
236  // shared pointers here, just their memory management capability.
237  // Therefore, _mesh is actually being used more like a unique_ptr in
238  // this context. Since full support for unique_ptr is not quite
239  // available yet, we've implemented it as a std::shared_ptr.
240  std::shared_ptr<MooseMesh> & mesh() { return _mesh; }
241  const std::shared_ptr<MooseMesh> & getMesh() const { return _mesh; }
242 
243  std::shared_ptr<MooseMesh> & displacedMesh() { return _displaced_mesh; }
244  const std::shared_ptr<MooseMesh> & getDisplacedMesh() const { return _displaced_mesh; }
245 
246  std::shared_ptr<FEProblemBase> & problemBase() { return _problem; }
247  std::shared_ptr<FEProblem> problem();
248  MooseApp & mooseApp() { return _app; }
249  const std::string & getMooseAppName();
250  const std::string & getCurrentTaskName() const { return _current_task; }
251 
255  const Action * getCurrentAction() const { return _current_action; }
259  std::string getCurrentActionName() const;
260 
264  bool hasTask(const std::string & task) const;
268  bool isTaskComplete(const std::string & task) const;
269 
270 protected:
278  void buildBuildableActions(const std::string & task);
279 
280  std::vector<std::shared_ptr<Action>> _all_ptrs;
281 
289  std::map<std::string, std::list<Action *>> _action_blocks;
291  std::vector<std::string> _ordered_names;
293  std::set<std::string> _completed_tasks;
295  std::set<std::string> _unsatisfied_dependencies;
296 
303 
310 
311  // When executing the actions in the warehouse, this string will always contain
312  // the current task name
313  std::string _current_task;
314  // The current action that is running
316 
317  //
318  // data created by actions
319  //
320 
322  std::shared_ptr<MooseMesh> _mesh;
323 
325  std::shared_ptr<MooseMesh> _displaced_mesh;
326 
328  std::shared_ptr<FEProblemBase> _problem;
329 
330 private:
332  std::string _final_task;
333 
334  const std::list<Action *> _empty_action_list;
335 };
std::string name(const ElemQuality q)
bool _show_parser
Whether or not to print messages when actions are inserted in the warehouse by the parser...
void checkUnsatisfiedActions() const
This method checks the actions stored in the warehouse against the list of required registered action...
MooseApp & mooseApp()
std::list< Action * >::iterator ActionIterator
alias to hide implementation details
const Action * getCurrentAction() const
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
Definition: FEProblem.h:20
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:299
bool isTaskComplete(const std::string &task) const
Syntax & _syntax
Reference to a "syntax" of actions.
std::shared_ptr< MooseMesh > & displacedMesh()
const std::shared_ptr< MooseMesh > & getMesh() const
bool hasTask(const std::string &task) const
const std::string & getMooseAppName()
void setFinalTask(const std::string &task)
std::string getCurrentActionName() const
void showActions(bool state=true)
This method sets a Boolean which is used to show information about action execution of various wareho...
Base class for MOOSE-based applications.
Definition: MooseApp.h:73
Storage for action instances.
void addActionBlock(std::shared_ptr< Action > blk)
This method add an Action instance to the warehouse.
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
void showActionDependencies(bool state=true)
This method sets a Boolean which is used to print information about action dependencies before variou...
void printInputFile(std::ostream &out)
This method uses the Actions in the warehouse to reproduce the input file.
void executeActionsWithAction(const std::string &name)
This method executes only the actions in the warehouse that satisfy the task passed in...
const std::list< Action * > & getActionListByName(const std::string &task) const
Retrieve a constant list of Action pointers associated with the passed in task.
void printActionDependencySets() const
This method is used only during debugging when show_actions is set to true.
Base class for actions.
Definition: Action.h:38
std::shared_ptr< FEProblemBase > & problemBase()
std::string _final_task
Last task to run before (optional) early termination - blank means no early termination.
std::vector< std::string > _ordered_names
The container that holds the sorted action names from the DependencyResolver.
std::shared_ptr< MooseMesh > & mesh()
void showParser(bool state=true)
This method sets a Boolean which is used to show debugging information when actions are inserted in t...
bool empty() const
returns a Boolean indicating whether the warehouse is empty or not.
std::set< std::string > _completed_tasks
The completed tasks.
Specialized factory for generic Action System objects.
Definition: ActionFactory.h:50
An inteface for the _console for outputting to the Console object.
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition: MooseMesh.h:88
std::map< std::string, std::list< Action * > > _action_blocks
Pointers to the actual parsed input file blocks.
std::string stringify(const T &t)
conversion to string
Definition: Conversion.h:62
std::shared_ptr< MooseMesh > _displaced_mesh
Possible mesh for displaced problem.
bool _generator_valid
Flag to indicate whether or not there is an active iterator on this class.
const std::string & getCurrentTaskName() const
const std::list< Action * > _empty_action_list
std::vector< std::shared_ptr< Action > > _all_ptrs
std::shared_ptr< FEProblemBase > _problem
Problem class.
bool hasActions(const std::string &task) const
Check if Actions associated with passed in task exist.
ActionWarehouse(MooseApp &app, Syntax &syntax, ActionFactory &factory)
std::shared_ptr< MooseMesh > _mesh
Mesh class.
const std::shared_ptr< MooseMesh > & getDisplacedMesh() const
bool _show_actions
Whether or not the action warehouse prints the action execution information.
MooseApp & _app
The MooseApp this Warehouse is associated with.
const std::vector< std::shared_ptr< Action > > & allActionBlocks() const
Returns a reference to all of the actions.
void build()
Builds all auto-buildable tasks.
Holding syntax for parsing input files.
Definition: Syntax.h:21
const T * getActionByTask(const std::string &task)
Retrieve the action on a specific task with its type.
void executeAllActions()
This method loops over all actions in the warehouse and executes them.
ActionIterator actionBlocksWithActionEnd(const std::string &task)
std::set< std::string > _unsatisfied_dependencies
Use to store the current list of unsatisfied dependencies.
Action * _current_action
bool _show_action_dependencies
Whether or not the action warehouse prints the action dependency information.
const T & getAction(const std::string &name)
Retrieve an action with its name and the desired type.
std::shared_ptr< FEProblem > problem()
std::vector< const T * > getActions()
Retrieve all actions in a specific type ordered by their names.
ActionIterator actionBlocksWithActionBegin(const std::string &task)
Iterators to the Actions in the warehouse.
void clear()
This method deletes all of the Actions in the warehouse.
void buildBuildableActions(const std::string &task)
This method auto-builds all Actions that needs to be built and adds them to ActionWarehouse.
ActionFactory & _action_factory
The Factory that builds Actions.
std::string _current_task