https://mooseframework.inl.gov
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
MeshGeneratorSystem Class Reference

System that manages MeshGenerators. More...

#include <MeshGeneratorSystem.h>

Inheritance diagram for MeshGeneratorSystem:
[legend]

Public Member Functions

 MeshGeneratorSystem (MooseApp &app)
 
void executeMeshGenerators ()
 Execute and clear the Mesh Generators data structure. More...
 
void addMeshGenerator (const std::string &type, const std::string &name, const InputParameters &params)
 Add a mesh generator that will act on the meshes in the system. More...
 
const MeshGeneratorappendMeshGenerator (const std::string &type, const std::string &name, InputParameters params)
 Append a mesh generator that will act on the current final mesh generator in the system. More...
 
std::unique_ptr< libMesh::MeshBase > & getMeshGeneratorOutput (const MeshGeneratorName &name)
 Get a reference to a pointer that will be the output of the MeshGenerator named name. More...
 
void createAddedMeshGenerators ()
 Creates (constructs) all of the MeshGenerators that have been declared using addMeshGenerator(). More...
 
std::vector< std::string > getMeshGeneratorNames () const
 Get names of all mesh generators Note: This function should be called after all mesh generators are added with the 'add_mesh_generator' task. More...
 
std::unique_ptr< libMesh::MeshBasegetSavedMesh (const std::string &name)
 Get the saved mesh by name. More...
 
std::vector< std::string > getSavedMeshNames () const
 Get all user-defined saved meshes except main and main_displaced. More...
 
void setCSGOnly ()
 Set whether mesh generator system is running in CSG-only mode to true. More...
 
bool getCSGOnly () const
 Get whether mesh generator system is running in CSG-only mode. More...
 
const std::vector< std::vector< MeshGenerator * > > & getOrderedMeshGenerators () const
 
bool hasMeshGenerator (const MeshGeneratorName &name) const
 
const MeshGeneratorgetMeshGenerator (const std::string &name) const
 
bool hasMeshGeneratorParams (const MeshGeneratorName &name) const
 Whether or not we know about the parameters for a MeshGenerator with the given name. More...
 
bool appendingMeshGenerators () const
 Whether or not mesh generators are currently being appended (append_mesh_generator task) More...
 
bool hasBreakMeshByBlockGenerator () const
 
bool hasDataDrivenAllowed () const
 
void dataDrivenError (const MeshGenerator &generator, const std::string &message) const
 Reports an error with the context of the data driven parameter, coming from the generator generator with message message. More...
 
MeshGeneratorName getFinalMeshGeneratorName () const
 Get the name of the final mesh generator. More...
 
void setVerbose (const bool verbose)
 Set the verbose flag. More...
 
void saveOutputCSGBase (const MeshGeneratorName generator_name, std::unique_ptr< CSG::CSGBase > &csg_base)
 Saves the CSGBase object to the global map storage, _csg_base_output, for a particular mesh generator. More...
 
std::unique_ptr< CSG::CSGBase > & getCSGBaseGeneratorOutput (const MeshGeneratorName &name)
 Returns the output CSGBase object associated with a particular mesh generator name. More...
 
PerfGraphperfGraph ()
 Get the PerfGraph. More...
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static std::string mainMeshGeneratorName ()
 The name reserved for the "main" mesh generator which is the one used for the numerical solver downstream. More...
 
static InputParameters validParams ()
 

Static Public Attributes

static const std::string data_driven_generator_param = "data_driven_generator"
 The name of the string parameter that sets the data driven generator. More...
 
static const std::string allow_data_driven_param
 The name of the boolean parameter on the MooseApp that will enable data driven generation. More...
 

Protected Member Functions

PerfID registerTimedSection (const std::string &section_name, const unsigned int level) const
 Call to register a named section for timing. More...
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level, const std::string &live_message, const bool print_dots=true) const
 Call to register a named section for timing. More...
 
std::string timedSectionName (const std::string &section_name) const
 

Protected Attributes

MooseApp_pg_moose_app
 The MooseApp that owns the PerfGraph. More...
 
const std::string _prefix
 A prefix to use for all sections. More...
 
const Parallel::Communicator_communicator
 

Private Member Functions

std::vector< std::pair< std::string, MeshGeneratorName > > getMeshGeneratorParamDependencies (const InputParameters &params, const bool allow_empty=false) const
 Gets the MeshGeneratorNames that are referenced in an object's parameters. More...
 
void createMeshGeneratorOrder ()
 Order all of the _mesh_generators into _ordered_mesh_generators for later execution in executeMeshGenerators. More...
 
std::shared_ptr< MeshGeneratorcreateMeshGenerator (const std::string &name)
 Internal method for actually constructing a mesh generator after it has been declared externally in addMeshGenerator (in Actions). More...
 
MeshGeneratorgetMeshGeneratorInternal (const std::string &name)
 Get a MeshGenerator with the name name. More...
 
const std::string & getDataDrivenGeneratorName () const
 

Private Attributes

MooseApp_app
 The MooseApp that owns this system. More...
 
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
 The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the name, pair contains the type and the params. More...
 
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
 Owning storage for mesh generators, map of name -> MeshGenerator. More...
 
std::vector< std::vector< MeshGenerator * > > _ordered_mesh_generators
 Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeMeshGenerators() More...
 
std::map< std::string, std::list< std::unique_ptr< libMesh::MeshBase > > > _mesh_generator_outputs
 Holds the output for each mesh generator - including duplicates needed downstream. More...
 
std::string _final_generator_name
 The final mesh generator name to use. More...
 
std::map< std::string, std::unique_ptr< libMesh::MeshBase > > _save_in_meshes
 Holds the map of save in mesh -> name. More...
 
std::optional< std::string > _data_driven_generator_name
 The name of the data driven generator, if any. More...
 
bool _has_bmbb
 Whether any of the mesh generators are a BreakMeshByBlockGenerator. More...
 
bool _verbose
 Whether to print the names of the mesh generators being executed or not. More...
 
bool _csg_only
 Whether mesh generator system is running in CSG-only mode. More...
 
std::map< std::string, std::unique_ptr< CSG::CSGBase > > _csg_base_output
 Holds the output CSGBase object for each mesh generator. More...
 

Detailed Description

System that manages MeshGenerators.

To be owned by the MooseApp.

Definition at line 31 of file MeshGeneratorSystem.h.

Constructor & Destructor Documentation

◆ MeshGeneratorSystem()

MeshGeneratorSystem::MeshGeneratorSystem ( MooseApp app)

Definition at line 24 of file MeshGeneratorSystem.C.

25  : PerfGraphInterface(app.perfGraph(), "MeshGeneratorSystem"),
26  ParallelObject(app),
27  _app(app),
28  _has_bmbb(false),
29  _verbose(false),
30  _csg_only(false)
31 {
32 }
ParallelObject(const Parallel::Communicator &comm_in)
bool _verbose
Whether to print the names of the mesh generators being executed or not.
MooseApp & _app
The MooseApp that owns this system.
bool _csg_only
Whether mesh generator system is running in CSG-only mode.
PerfGraphInterface(const MooseObject *moose_object)
For objects that are MooseObjects with a default prefix of type()
bool _has_bmbb
Whether any of the mesh generators are a BreakMeshByBlockGenerator.
PerfGraph & perfGraph()
Get the PerfGraph for this app.
Definition: MooseApp.h:173

Member Function Documentation

◆ addMeshGenerator()

void MeshGeneratorSystem::addMeshGenerator ( const std::string &  type,
const std::string &  name,
const InputParameters params 
)

Add a mesh generator that will act on the meshes in the system.

Parameters
typeThe type of MeshGenerator
nameThe name of the MeshGenerator
paramsThe params used to construct the MeshGenerator

Internally, this will store the parameters for future construction during the "add_mesh_generator" task. When called during the "create_mesh_generator" task (i.e., when creating mesh subgenerators), it will also construct the generator.

We don't construct them yet because we want to create them in order during createMeshGenerators() as much as possible so that we don't need lazy construction for things like mesh properties.

Definition at line 35 of file MeshGeneratorSystem.C.

Referenced by CombineComponentsMeshes::act(), MooseApp::addMeshGenerator(), ComponentMeshTransformHelper::addMeshGenerators(), CylinderComponent::addMeshGenerators(), and BatchMeshGeneratorAction::addMeshGenerators().

38 {
39  mooseAssert(!_mesh_generator_params.count(name), "Already exists");
40  _mesh_generator_params.emplace(
41  std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple(type, params));
42 
43  // This should be a sub mesh generator. We can assume this because if we're in the middle of
44  // constructing mesh generators (not "adding" them, where we simply store their parameters)
46  createMeshGenerator(name);
47 
48  if (type == "BreakMeshByBlockGenerator")
49  _has_bmbb = true;
50 }
virtual bool constructingMeshGenerators() const
Whether this app is constructing mesh generators.
Definition: MooseApp.C:3600
std::shared_ptr< MeshGenerator > createMeshGenerator(const std::string &name)
Internal method for actually constructing a mesh generator after it has been declared externally in a...
MooseApp & _app
The MooseApp that owns this system.
bool _has_bmbb
Whether any of the mesh generators are a BreakMeshByBlockGenerator.
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the...

◆ appendingMeshGenerators()

bool MeshGeneratorSystem::appendingMeshGenerators ( ) const

Whether or not mesh generators are currently being appended (append_mesh_generator task)

Definition at line 659 of file MeshGeneratorSystem.C.

Referenced by appendMeshGenerator(), and MooseApp::constructingMeshGenerators().

660 {
661  return _app.actionWarehouse().getCurrentTaskName() == "append_mesh_generator";
662 }
MooseApp & _app
The MooseApp that owns this system.
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:211
const std::string & getCurrentTaskName() const

◆ appendMeshGenerator()

const MeshGenerator & MeshGeneratorSystem::appendMeshGenerator ( const std::string &  type,
const std::string &  name,
InputParameters  params 
)

Append a mesh generator that will act on the current final mesh generator in the system.

Parameters
typeThe type of MeshGenerator
nameThe name of the MeshGenerator
paramsThe params used to construct the MeshGenerator

This MeshGenerator must have a parameter "input" of type MeshGeneratorName for this to work, as said parameter is set to the current final generator

Note: This function must be called during the append_mesh_generator task.

Definition at line 53 of file MeshGeneratorSystem.C.

Referenced by CombineComponentsMeshes::act(), and MooseApp::appendMeshGenerator().

56 {
58  mooseError("Can only call appendMeshGenerator() during the append_mesh_generator task");
59  const auto param_name_mg_name_pairs = getMeshGeneratorParamDependencies(params, true);
60 
61  // Make sure this mesh generator has one and _only_ one input, in the "input" parameter,
62  // Or several, listed in the "inputs" parameter
63  if ((param_name_mg_name_pairs.size() == 0) ||
64  (param_name_mg_name_pairs.size() == 1 && param_name_mg_name_pairs[0].first != "input" &&
65  param_name_mg_name_pairs[0].first != "inputs") ||
66  (param_name_mg_name_pairs.size() > 1 && param_name_mg_name_pairs[0].first != "inputs"))
67  mooseError("While adding ",
68  type,
69  " '",
70  name,
71  "' via appendMeshGenerator():\nCan only append a mesh generator that takes a "
72  "single input mesh generator via the parameter named 'input' or 'inputs'.");
73 
74  // If no final generator is set, we need to make sure that we have one; we will hit
75  // this the first time we add an appended MeshGenerator and only need to do it once.
76  // We'll then generate the final ordering within the execution phase. We'll also
77  // clear the ordering because it could be invalid if we append any more generators,
78  // and we'll be re-ordering within executeMeshgenerators() anyway (where we don't
79  // keep track of any state for the sake of simpler logic)
80  if (_final_generator_name.empty())
81  {
82  if (_mesh_generators.empty())
83  mooseError("Cannot use appendMeshGenerator() because there is not a generator to append to!");
84 
87  }
88 
89  // Set the final generator as the input if a single generator
90  mooseAssert(hasMeshGenerator(_final_generator_name), "Missing final generator");
91  if (params.have_parameter<MeshGeneratorName>("input"))
92  params.set<MeshGeneratorName>("input") = _final_generator_name;
93  // We'll trust the final combiner generator with its list of inputs
94 
95  // Keep track of the new final generator
97 
98  // Need to add this to the param map so that createMeshGenerator can use it
99  mooseAssert(!_mesh_generator_params.count(name), "Already exists");
100  _mesh_generator_params.emplace(
101  std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple(type, params));
102 
103  return *createMeshGenerator(name);
104 }
std::string name(const ElemQuality q)
std::string _final_generator_name
The final mesh generator name to use.
std::shared_ptr< MeshGenerator > createMeshGenerator(const std::string &name)
Internal method for actually constructing a mesh generator after it has been declared externally in a...
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
void createMeshGeneratorOrder()
Order all of the _mesh_generators into _ordered_mesh_generators for later execution in executeMeshGen...
bool hasMeshGenerator(const MeshGeneratorName &name) const
bool appendingMeshGenerators() const
Whether or not mesh generators are currently being appended (append_mesh_generator task) ...
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the...
std::vector< std::pair< std::string, MeshGeneratorName > > getMeshGeneratorParamDependencies(const InputParameters &params, const bool allow_empty=false) const
Gets the MeshGeneratorNames that are referenced in an object&#39;s parameters.
std::vector< std::vector< MeshGenerator * > > _ordered_mesh_generators
Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeM...

◆ createAddedMeshGenerators()

void MeshGeneratorSystem::createAddedMeshGenerators ( )

Creates (constructs) all of the MeshGenerators that have been declared using addMeshGenerator().

This parses the input parameters of type <MeshGenerator> and std::vector<MeshGeneratorName> to build the execution tree for the generators, and constructs them in dependency order

Sub generators are also generated within this phase, although the dependency resolution described above is only for the dependencies that we can parse using InputParameters. However, we require that sub generators be constructed within their dependency order (except for the last one, which may be coupled to via the generator creating said sub generator).

Should only be called by the CreateAddedMeshGenerator action during the create_added_mesh_generators task.

Definition at line 137 of file MeshGeneratorSystem.C.

Referenced by CreateAddedMeshGenerators::act().

138 {
139  mooseAssert(_app.actionWarehouse().getCurrentTaskName() == "create_added_mesh_generators",
140  "Should not run now");
141 
142  // No generators were added via addMeshGenerator()
143  if (_mesh_generator_params.empty())
144  return;
145 
147 
148  // Define the dependencies known so far
149  for (const auto & [name, type_params_pair] : _mesh_generator_params)
150  {
151  resolver.addItem(name);
152  for (const auto & param_dependency_pair :
153  getMeshGeneratorParamDependencies(type_params_pair.second))
154  resolver.addEdge(param_dependency_pair.second, name);
155  }
156 
157  std::vector<std::vector<std::string>> ordered_generators;
158  try
159  {
160  ordered_generators = resolver.getSortedValuesSets();
161  }
163  {
164  mooseError("Cyclic dependencies detected in mesh generation: ",
166  }
167 
168  const auto & moose_mesh = _app.actionWarehouse().getMesh();
169 
170  // If there is no mesh
171  if (!moose_mesh.get())
172  mooseError("No mesh created. Either add a Mesh, an ActionComponents or a Components block");
173 
174  // If we're using data-driven generation, find that requirement now
175  mooseAssert(!_data_driven_generator_name, "Should not be set");
176  if (moose_mesh->parameters().get<bool>("_mesh_generator_mesh") &&
177  moose_mesh->isParamValid(data_driven_generator_param))
178  {
179  if (!hasDataDrivenAllowed())
180  moose_mesh->paramError(
182  "This application does not support data-driven mesh generation.\n\nThis generation is an "
183  "advanced feature and must be enabled on the application via the '",
185  "' parameter.");
186 
187  mooseAssert(moose_mesh->type() == "MeshGeneratorMesh",
188  "Assumption for mesh type is now invalid");
189 
190  _data_driven_generator_name = moose_mesh->getParam<std::string>(data_driven_generator_param);
192  moose_mesh->paramError(data_driven_generator_param,
193  "The data driven generator '",
195  "' does not exist");
196  }
197 
198  // Check compatibility for CLI / meshing options with csg_only
199  const bool csg_only = getCSGOnly();
200  if (csg_only && _data_driven_generator_name)
201  moose_mesh->paramError(data_driven_generator_param,
202  "This parameter should not be set in conjunction with --csg-only");
203 
204  // Construct all of the mesh generators that we know exist
205  for (const auto & generator_names : ordered_generators)
206  for (const auto & generator_name : generator_names)
207  if (auto it = _mesh_generator_params.find(generator_name); it != _mesh_generator_params.end())
208  {
209  auto & params = it->second.second;
210 
211  // Determine now if we need to run this in data only mode
212  const bool data_only =
213  (csg_only ||
215  resolver.dependsOn(getDataDrivenGeneratorName(), generator_name)));
216  params.set<bool>(MeshGenerator::data_only_param) = data_only;
217 
218  createMeshGenerator(generator_name);
219 
220  if (csg_only && !getMeshGenerator(generator_name).hasGenerateCSG())
221  mooseError("Mesh generator ",
222  generator_name,
223  " cannot be used in csg-only mode since it does not have a generateCSG "
224  "implementation");
225 
226  mooseAssert(data_only == getMeshGenerator(generator_name).isDataOnly(),
227  "Inconsistent data only");
228  }
229 
230  mooseAssert(_mesh_generator_params.empty(), "Should be empty");
231  mooseAssert(_final_generator_name.empty(), "Should be unset at this point");
232 
233  // Set the final generator if we have one set by the user
234  // and if so make sure it also exists
235  if (moose_mesh->parameters().get<bool>("_mesh_generator_mesh") &&
236  moose_mesh->isParamValid("final_generator"))
237  {
238  mooseAssert(moose_mesh->type() == "MeshGeneratorMesh",
239  "Assumption for mesh type is now invalid");
240 
241  _final_generator_name = moose_mesh->getParam<std::string>("final_generator");
243  moose_mesh->paramError("final_generator",
244  "The forced final MeshGenerator '",
246  "' does not exist");
247  }
248 }
std::string _final_generator_name
The final mesh generator name to use.
std::string join(Iterator begin, Iterator end, const std::string &delimiter)
Python-like join function for strings over an iterator range.
Definition: MooseUtils.h:144
static const std::string data_only_param
The name of the private parameter for setting data only.
Definition: MeshGenerator.h:76
std::shared_ptr< MeshGenerator > createMeshGenerator(const std::string &name)
Internal method for actually constructing a mesh generator after it has been declared externally in a...
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
bool hasDataDrivenAllowed() const
const std::shared_ptr< MooseMesh > & getMesh() const
bool dependsOn(const T &key, const T &value)
Return true if key depends on value.
std::optional< std::string > _data_driven_generator_name
The name of the data driven generator, if any.
const std::vector< std::vector< T > > & getSortedValuesSets()
Returns a vector of sets that represent dependency resolved values.
void addEdge(const T &a, const T &b)
Add an edge between nodes &#39;a&#39; and &#39;b&#39;.
void addItem(const T &value)
Add an independent item to the set.
MooseApp & _app
The MooseApp that owns this system.
bool getCSGOnly() const
Get whether mesh generator system is running in CSG-only mode.
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:211
const std::string & getCurrentTaskName() const
const std::vector< T > & getCyclicDependencies() const
static const std::string data_driven_generator_param
The name of the string parameter that sets the data driven generator.
bool hasMeshGenerator(const MeshGeneratorName &name) const
const MeshGenerator & getMeshGenerator(const std::string &name) const
static const std::string allow_data_driven_param
The name of the boolean parameter on the MooseApp that will enable data driven generation.
const std::string & getDataDrivenGeneratorName() const
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the...
std::vector< std::pair< std::string, MeshGeneratorName > > getMeshGeneratorParamDependencies(const InputParameters &params, const bool allow_empty=false) const
Gets the MeshGeneratorNames that are referenced in an object&#39;s parameters.

◆ createMeshGenerator()

std::shared_ptr< MeshGenerator > MeshGeneratorSystem::createMeshGenerator ( const std::string &  name)
private

Internal method for actually constructing a mesh generator after it has been declared externally in addMeshGenerator (in Actions).

Definition at line 481 of file MeshGeneratorSystem.C.

Referenced by addMeshGenerator(), appendMeshGenerator(), and createAddedMeshGenerators().

482 {
483  libmesh_parallel_only(comm());
484  mooseAssert(_app.constructingMeshGenerators(), "Should not run now");
485 
486  const auto find_params = _mesh_generator_params.find(generator_name);
487  mooseAssert(find_params != _mesh_generator_params.end(), "Not added");
488  const auto & [type, params] = find_params->second;
489  mooseAssert(comm().verify(type + generator_name), "Inconsistent construction order");
490 
491  std::shared_ptr<MeshGenerator> mg =
492  _app.getFactory().create<MeshGenerator>(type, generator_name, params);
493 
494  if (mg->hasSaveMesh())
495  {
496  if (_save_in_meshes.count(mg->getSavedMeshName()))
497  mg->paramError("save_with_name",
498  "The save with name '",
499  mg->getSavedMeshName(),
500  "' has already been used");
501  _save_in_meshes.emplace(mg->getSavedMeshName(), nullptr);
502  }
503 
504  // Setup the children and parents
505  for (const auto & dependency : mg->getRequestedMeshGenerators())
506  {
507  // We _shouldn't_ hit this; now that we enforce construction ordering we do
508  // all of this error checking at construction time because the info is available
509  mooseAssert(hasMeshGenerator(dependency), "Missing dependency");
510 
511  auto & dependency_mg = getMeshGeneratorInternal(dependency);
512  mg->addParentMeshGenerator(dependency_mg, MeshGenerator::AddParentChildKey());
513  dependency_mg.addChildMeshGenerator(*mg, MeshGenerator::AddParentChildKey());
514  }
515 
516  // Loop through all of the MeshGeneratorName and std::vector<MeshGeneratorName>
517  // parameters (meshes that we should depend on), and make sure that either:
518  // - We directly depend on them and requested a mesh from them
519  // - We created a sub generator that depends on them and we declared it
520  for (const auto & param_dependency_pair : getMeshGeneratorParamDependencies(mg->parameters()))
521  {
522  const auto & param_name = param_dependency_pair.first;
523  const auto & dependency_name = param_dependency_pair.second;
524 
525  if (mg->isNullMeshName(dependency_name))
526  continue;
527 
528  // True if this dependency was requested and is a parent
529  if (mg->isParentMeshGenerator(dependency_name))
530  {
531  mooseAssert(mg->getRequestedMeshGenerators().count(dependency_name), "Wasn't requested");
532  continue;
533  }
534 
535  // Whether or not this is a dependency of at least one SubGenerator
536  auto find_sub_dependency = std::find_if(mg->getSubMeshGenerators().begin(),
537  mg->getSubMeshGenerators().end(),
538  [&dependency_name](const auto & mg)
539  { return mg->isParentMeshGenerator(dependency_name); });
540  const auto is_sub_dependency = find_sub_dependency != mg->getSubMeshGenerators().end();
541 
542  // This should be used by a sub generator
543  if (mg->getRequestedMeshGeneratorsForSub().count(dependency_name))
544  {
545  if (!is_sub_dependency)
546  mg->mooseError("The sub generator dependency declared from MeshGenerator '",
547  dependency_name,
548  "' from the parameter '",
549  param_name,
550  "' was not used.\n\nDependencies that are declared by declareMeshForSub() "
551  "must be used as an input to a sub generator created by this object.");
552  }
553  // This was used by a sub generator but wasn't declared
554  else if (is_sub_dependency)
555  mg->mooseError(
556  "The MeshGenerator '",
557  dependency_name,
558  "' was referenced in the parameter '",
559  param_name,
560  "' and used in the sub generator ",
561  (*find_sub_dependency)->type(),
562  " '",
563  (*find_sub_dependency)->name(),
564  "', but was not declared as a sub dependency.\n\nTo correct this, modify the code of ",
565  mg->type(),
566  " to include a call to declareMesh(es)ForSub(\"",
567  param_name,
568  "\") in the constructor.");
569  // Isn't used at all
570  else
571  mg->mooseError(
572  "You failed to request the generated mesh(es) for the parameter '",
573  param_name,
574  "'.\n\nIn specific, the mesh from MeshGenerator '",
575  dependency_name,
576  "' was not requested.\n\nTo correct this, you should remove the parameter if the "
577  "mesh(es)\nare not needed, or request the mesh(es) with getMesh()/getMeshes().");
578  }
579 
580  mooseAssert(!_mesh_generators.count(generator_name), "Already created");
581  _mesh_generators.emplace(generator_name, mg);
582  mooseAssert(!_mesh_generator_outputs.count(generator_name), "Already exists");
583  _mesh_generator_outputs[generator_name];
584  _mesh_generator_params.erase(find_params);
585 
586  return mg;
587 }
virtual bool constructingMeshGenerators() const
Whether this app is constructing mesh generators.
Definition: MooseApp.C:3600
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition: MooseBase.h:439
std::map< std::string, std::unique_ptr< libMesh::MeshBase > > _save_in_meshes
Holds the map of save in mesh -> name.
const Parallel::Communicator & comm() const
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:401
MooseApp & _app
The MooseApp that owns this system.
virtual std::unique_ptr< Base > create()=0
std::map< std::string, std::list< std::unique_ptr< libMesh::MeshBase > > > _mesh_generator_outputs
Holds the output for each mesh generator - including duplicates needed downstream.
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.
Class that is used as a parameter to add[Parent/Child]() that allows only MeshGeneratorSystem methods...
bool hasMeshGenerator(const MeshGeneratorName &name) const
MeshGenerator & getMeshGeneratorInternal(const std::string &name)
Get a MeshGenerator with the name name.
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:33
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the...
std::vector< std::pair< std::string, MeshGeneratorName > > getMeshGeneratorParamDependencies(const InputParameters &params, const bool allow_empty=false) const
Gets the MeshGeneratorNames that are referenced in an object&#39;s parameters.

◆ createMeshGeneratorOrder()

void MeshGeneratorSystem::createMeshGeneratorOrder ( )
private

Order all of the _mesh_generators into _ordered_mesh_generators for later execution in executeMeshGenerators.

Definition at line 251 of file MeshGeneratorSystem.C.

Referenced by appendMeshGenerator(), and executeMeshGenerators().

252 {
253  mooseAssert(_app.constructingMeshGenerators() ||
254  _app.actionWarehouse().getCurrentTaskName() == "execute_mesh_generators",
255  "Incorrect call time");
256  mooseAssert(_ordered_mesh_generators.empty(), "Already ordered");
257  mooseAssert(_mesh_generators.size(), "No mesh generators to order");
258 
259  TIME_SECTION("createMeshGeneratorOrder", 1, "Ordering Mesh Generators");
260 
261  // We dare not sort these based on address!
263 
264  // The mesh generators that must be called
265  // This is needed to mark the generators that could be cut due to a
266  // final generator being set, but should still be called because they're
267  // either being saved in memory or as output
268  std::vector<std::string> required_generators;
269  for (const auto & it : _mesh_generators)
270  if (it.second->hasSaveMesh() || it.second->hasOutput())
271  required_generators.push_back(it.second->name());
272 
273  // The mesh generator tree should have all the mesh generators that
274  // The final generator depends on and all the mesh generators
275  // with 'save in' flag. Here we loop over all the mesh generators
276  // and conditionally add all of the dependencies into the resolver
277  for (const auto & it : _mesh_generators)
278  {
279  MeshGenerator * mg = it.second.get();
280 
281  // The mesh generator has to meet one of the following conditions:
282  // Final mesh generator is not set, so we build the whole tree
283  if (_final_generator_name.empty() ||
284  // This mesh generator is the final generator
285  mg->name() == _final_generator_name ||
286  // This needs to be saved or output
287  mg->hasSaveMesh() || mg->hasOutput() ||
288  // Final mesh generator set and is a child of this generator
290  // This is a dependency of a generator that needs to be saved or output
291  std::find_if(required_generators.begin(),
292  required_generators.end(),
293  [&mg](const auto & name) { return mg->isChildMeshGenerator(name, false); }) !=
294  required_generators.end())
295  {
296  resolver.addItem(mg);
297  for (const auto & dep_mg : mg->getParentMeshGenerators())
298  resolver.addEdge(&getMeshGeneratorInternal(dep_mg->name()), mg);
299  }
300  }
301 
302  // ...and sort them
303  try
304  {
306  }
307  // It is _quite_ hard to trigger this to test it. I've tried to no avail.
308  // Now that we...
309  // - check and sort up front
310  // - know if dependencies exist at the time of requesting them
311  // - require that sub generators depend only on other sub generators in an object's
312  // tree + input dependencies that we explicitly declare
313  // I don't think it's possible. But we'll leave it here anyway and it
314  // definitely will not be covered
316  {
317  const auto & cycle = e.getCyclicDependencies();
318  std::vector<std::string> names(cycle.size());
319  for (const auto i : index_range(cycle))
320  names[i] = cycle[i]->name();
321 
322  mooseError("Cyclic dependencies detected in mesh generation: ",
323  MooseUtils::join(names, " <- "));
324  }
325 
326  mooseAssert(_ordered_mesh_generators.size(), "No mesh generators found");
327 
328  const auto & final_generators = _ordered_mesh_generators.back();
329 
330  // We haven't forced a final generator yet
331  if (_final_generator_name.empty())
332  {
333  mooseAssert(final_generators.size(), "Empty vector");
334 
335  // See if we have multiple independent trees of generators
336  const auto ancestor_list = resolver.getAncestors(final_generators.back());
337  if (ancestor_list.size() != resolver.size() && _final_generator_name.empty())
338  {
339  // Need to remove duplicates and possibly perform a difference so we'll import our list
340  // into a set for these operations.
341  std::set<MeshGenerator *, MeshGenerator::Comparator> ancestors(ancestor_list.begin(),
342  ancestor_list.end());
343  // Get all of the items from the resolver so we can compare against the tree from the
344  // final generator we just pulled.
345  const auto & allValues = resolver.getSortedValues();
346  decltype(ancestors) all(allValues.begin(), allValues.end());
347 
348  decltype(ancestors) ind_tree;
349  std::set_difference(all.begin(),
350  all.end(),
351  ancestors.begin(),
352  ancestors.end(),
353  std::inserter(ind_tree, ind_tree.end()));
354 
355  std::ostringstream oss;
356  oss << "Your MeshGenerator tree contains multiple possible generator outputs :\n\""
357  << final_generators.back()->name()
358  << "\" and one or more of the following from an independent set: \"";
359  bool first = true;
360  for (const auto & gen : ind_tree)
361  {
362  if (!first)
363  oss << ", ";
364  else
365  first = false;
366 
367  oss << gen->name();
368  }
369  oss << "\"\n\nThis may be due to a missing dependency or may be intentional. Please either\n"
370  "- check that all the mesh generators are connected as a tree and culminate in a "
371  "single final mesh. Having one wrong 'input=mg' parameter is the most common error\n"
372  "- add additional dependencies to remove the ambiguity if you are using a user-built "
373  "MeshGenerator\n"
374  "- if you intend to execute a subset of the defined generators (uncommon), select the"
375  " final MeshGenerator in the [Mesh] block with the \"final_generator\" parameter.";
376  mooseError(oss.str());
377  }
378 
379  _final_generator_name = final_generators.back()->name();
380  }
381  else
382  mooseAssert(hasMeshGenerator(_final_generator_name), "Missing the preset final generator");
383 }
std::string name(const ElemQuality q)
virtual bool constructingMeshGenerators() const
Whether this app is constructing mesh generators.
Definition: MooseApp.C:3600
std::string _final_generator_name
The final mesh generator name to use.
std::string join(Iterator begin, Iterator end, const std::string &delimiter)
Python-like join function for strings over an iterator range.
Definition: MooseUtils.h:144
bool isChildMeshGenerator(const MeshGeneratorName &name, const bool direct=true) const
bool hasSaveMesh() const
Return whether or not to save the current mesh.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
std::size_t size() const
Returns the number of unique items stored in the dependency resolver.
const std::vector< T > & getSortedValues()
This function also returns dependency resolved values but with a simpler single vector interface...
bool hasOutput() const
std::list< T > getAncestors(const T &key)
Returns a list of all values that a given key depends on.
const std::vector< std::vector< T > > & getSortedValuesSets()
Returns a vector of sets that represent dependency resolved values.
void addEdge(const T &a, const T &b)
Add an edge between nodes &#39;a&#39; and &#39;b&#39;.
void addItem(const T &value)
Add an independent item to the set.
MooseApp & _app
The MooseApp that owns this system.
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:103
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:211
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.
const std::string & getCurrentTaskName() const
const std::vector< T > & getCyclicDependencies() const
const std::set< const MeshGenerator *, Comparator > & getParentMeshGenerators() const
Gets the MeshGenerators that are parents to this MeshGenerator.
bool hasMeshGenerator(const MeshGeneratorName &name) const
Class that represents the dependecy as a graph.
MeshGenerator & getMeshGeneratorInternal(const std::string &name)
Get a MeshGenerator with the name name.
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:33
auto index_range(const T &sizable)
std::vector< std::vector< MeshGenerator * > > _ordered_mesh_generators
Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeM...

◆ dataDrivenError()

void MeshGeneratorSystem::dataDrivenError ( const MeshGenerator generator,
const std::string &  message 
) const

Reports an error with the context of the data driven parameter, coming from the generator generator with message message.

Should be used to throw errors from within a MeshGenerator with more context.

Definition at line 678 of file MeshGeneratorSystem.C.

Referenced by MeshGenerator::MeshGenerator().

680 {
681  const auto & moose_mesh = _app.actionWarehouse().getMesh();
682  moose_mesh->paramError(data_driven_generator_param,
683  "The generator '",
685  "' cannot be used in data-driven mode because the parent ",
686  generator.typeAndName(),
687  " ",
688  message);
689 }
const std::shared_ptr< MooseMesh > & getMesh() const
MooseApp & _app
The MooseApp that owns this system.
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:211
std::string typeAndName() const
Get the class&#39;s combined type and name; useful in error handling.
Definition: MooseBase.C:57
static const std::string data_driven_generator_param
The name of the string parameter that sets the data driven generator.
const std::string & getDataDrivenGeneratorName() const

◆ executeMeshGenerators()

void MeshGeneratorSystem::executeMeshGenerators ( )

Execute and clear the Mesh Generators data structure.

Definition at line 386 of file MeshGeneratorSystem.C.

Referenced by ExecuteMeshGenerators::act().

387 {
388  libmesh_parallel_only(comm());
389 
390  // we do not need to do this when there are no mesh generators
391  if (_mesh_generators.empty())
392  return;
393 
394  // Order the generators
396 
397  // Save all meshes marked to to_save_in_meshes and save in error checking
398  std::map<std::string, std::unique_ptr<MeshBase> *> to_save_in_meshes;
399  for (const auto & generator_set : _ordered_mesh_generators)
400  for (const auto & generator : generator_set)
401  if (generator->hasSaveMesh())
402  {
403  if (_final_generator_name == generator->name())
404  generator->paramError("save_with_name",
405  "Cannot use the save in capability with the final mesh generator");
406  if (getCSGOnly())
407  generator->paramError("save_with_name", "Cannot use in conjunction with --csg-only");
408  to_save_in_meshes.emplace(generator->getSavedMeshName(),
409  &getMeshGeneratorOutput(generator->name()));
410  }
411  // Grab the outputs from the final generator so MeshGeneratorMesh can pick it up
412  to_save_in_meshes.emplace(mainMeshGeneratorName(),
414 
415  // Run the MeshGenerators in the proper order
416  for (const auto & generator_set : _ordered_mesh_generators)
417  {
418  for (const auto & generator : generator_set)
419  {
420  const auto & name = generator->name();
421  if (_verbose)
422  _app._console << " [DBG] Executing mesh generator (" << COLOR_GREEN << std::setw(20) << name
423  << COLOR_DEFAULT << ") in type (" << COLOR_GREEN << generator->type()
424  << COLOR_DEFAULT << ")" << std::endl;
425  auto current_mesh = generator->generateInternal();
426 
427  // Only generating data for this generator
428  if (generator->isDataOnly())
429  {
430  mooseAssert(!current_mesh, "Should not have a mesh");
431  continue;
432  }
433 
434 #ifdef DEBUG
435  // Assert that the mesh is either marked as not prepared or if it is marked as prepared,
436  // that it's *actually* prepared
437  if (!_has_bmbb && !MeshTools::valid_is_prepared(*current_mesh))
438  generator->mooseError("The generated mesh is marked as prepared but is not actually "
439  "prepared. Please edit the '",
440  generator->type(),
441  "' class to call 'set_isnt_prepared()'");
442 #endif
443 
444  // Now we need to possibly give this mesh to downstream generators
445  auto & outputs = _mesh_generator_outputs[name];
446 
447  if (outputs.size())
448  {
449  auto & first_output = *outputs.begin();
450 
451  first_output = std::move(current_mesh);
452 
453  const auto & copy_from = *first_output;
454 
455  auto output_it = ++outputs.begin();
456 
457  // For all of the rest we need to make a copy
458  for (; output_it != outputs.end(); ++output_it)
459  (*output_it) = copy_from.clone();
460  }
461  }
462  }
463 
464  // No save in meshes exist in csg only mode
465  if (getCSGOnly())
466  return;
467 
468  // Grab all the valid save in meshes from the temporary map to_save_in_meshes
469  // and store them in _save_in_meshes
470  for (auto & [name, mesh_ptr] : to_save_in_meshes)
471  {
472  mooseAssert(mesh_ptr, "Invalid pointer");
473  mooseAssert(*mesh_ptr, "Invalid pointer");
474  if (name != mainMeshGeneratorName())
475  mooseAssert(_save_in_meshes.count(name), "Mesh has not been requested for save");
476  _save_in_meshes[name] = std::move(*mesh_ptr);
477  }
478 }
std::string name(const ElemQuality q)
std::string _final_generator_name
The final mesh generator name to use.
std::unique_ptr< libMesh::MeshBase > & getMeshGeneratorOutput(const MeshGeneratorName &name)
Get a reference to a pointer that will be the output of the MeshGenerator named name.
std::map< std::string, std::unique_ptr< libMesh::MeshBase > > _save_in_meshes
Holds the map of save in mesh -> name.
const Parallel::Communicator & comm() const
bool _verbose
Whether to print the names of the mesh generators being executed or not.
MooseApp & _app
The MooseApp that owns this system.
bool getCSGOnly() const
Get whether mesh generator system is running in CSG-only mode.
std::map< std::string, std::list< std::unique_ptr< libMesh::MeshBase > > > _mesh_generator_outputs
Holds the output for each mesh generator - including duplicates needed downstream.
static std::string mainMeshGeneratorName()
The name reserved for the "main" mesh generator which is the one used for the numerical solver downst...
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.
void createMeshGeneratorOrder()
Order all of the _mesh_generators into _ordered_mesh_generators for later execution in executeMeshGen...
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
bool _has_bmbb
Whether any of the mesh generators are a BreakMeshByBlockGenerator.
std::vector< std::vector< MeshGenerator * > > _ordered_mesh_generators
Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeM...

◆ getCSGBaseGeneratorOutput()

std::unique_ptr< CSG::CSGBase > & MeshGeneratorSystem::getCSGBaseGeneratorOutput ( const MeshGeneratorName &  name)

Returns the output CSGBase object associated with a particular mesh generator name.

Parameters
nameName of mesh generator
Returns
Pointer to CSGBase object associated with mesh generator name

Definition at line 707 of file MeshGeneratorSystem.C.

Referenced by MeshGenerator::getCSGBaseByName().

708 {
709  mooseAssert(_app.actionWarehouse().getCurrentTaskName() == "execute_csg_generators",
710  "Incorrect call time");
711 
712  auto it = _csg_base_output.find(name);
713  mooseAssert(it != _csg_base_output.end(), "CSG mesh not initialized");
714  return it->second;
715 }
MooseApp & _app
The MooseApp that owns this system.
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:211
const std::string & getCurrentTaskName() const
std::map< std::string, std::unique_ptr< CSG::CSGBase > > _csg_base_output
Holds the output CSGBase object for each mesh generator.

◆ getCSGOnly()

bool MeshGeneratorSystem::getCSGOnly ( ) const
inline

Get whether mesh generator system is running in CSG-only mode.

Definition at line 135 of file MeshGeneratorSystem.h.

Referenced by createAddedMeshGenerators(), and executeMeshGenerators().

135 { return _csg_only; }
bool _csg_only
Whether mesh generator system is running in CSG-only mode.

◆ getDataDrivenGeneratorName()

const std::string & MeshGeneratorSystem::getDataDrivenGeneratorName ( ) const
private
Returns
The data driven generator name (can only be called when set)

Definition at line 671 of file MeshGeneratorSystem.C.

Referenced by createAddedMeshGenerators(), and dataDrivenError().

672 {
673  mooseAssert(_data_driven_generator_name, "Not set");
675 }
std::optional< std::string > _data_driven_generator_name
The name of the data driven generator, if any.

◆ getFinalMeshGeneratorName()

MeshGeneratorName MeshGeneratorSystem::getFinalMeshGeneratorName ( ) const
inline

Get the name of the final mesh generator.

Definition at line 193 of file MeshGeneratorSystem.h.

Referenced by CombineComponentsMeshes::act(), and CSGOnlyAction::act().

193 { return _final_generator_name; }
std::string _final_generator_name
The final mesh generator name to use.

◆ getMeshGenerator()

const MeshGenerator & MeshGeneratorSystem::getMeshGenerator ( const std::string &  name) const
Returns
The MeshGenerator with the name name.

Definition at line 615 of file MeshGeneratorSystem.C.

Referenced by createAddedMeshGenerators(), and MooseApp::getMeshGenerator().

616 {
617  const auto it = _mesh_generators.find(name);
618  if (it == _mesh_generators.end())
619  mooseError("Failed to find a MeshGenerator with the name '", name, "'");
620  mooseAssert(it->second, "Invalid shared pointer");
621  return *it->second;
622 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.

◆ getMeshGeneratorInternal()

MeshGenerator& MeshGeneratorSystem::getMeshGeneratorInternal ( const std::string &  name)
inlineprivate

Get a MeshGenerator with the name name.

We add the "internal" here so that we allow objects that have non-const access to MooseApp to call getMeshGenerator without a const_cast. If the name was the same, you'd get an error about trying to access a private method.

Definition at line 249 of file MeshGeneratorSystem.h.

Referenced by createMeshGenerator(), and createMeshGeneratorOrder().

250  {
251  return const_cast<MeshGenerator &>(std::as_const(*this).getMeshGenerator(name));
252  }
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:33

◆ getMeshGeneratorNames()

std::vector< std::string > MeshGeneratorSystem::getMeshGeneratorNames ( ) const

Get names of all mesh generators Note: This function should be called after all mesh generators are added with the 'add_mesh_generator' task.

The returned value will be undefined and depends on the ordering that mesh generators are added by MOOSE if the function is called during the 'add_mesh_generator' task.

Definition at line 625 of file MeshGeneratorSystem.C.

Referenced by CombineComponentsMeshes::act(), and MooseApp::getMeshGeneratorNames().

626 {
627  std::vector<std::string> names;
628  for (auto & pair : _mesh_generators)
629  names.push_back(pair.first);
630  return names;
631 }
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.

◆ getMeshGeneratorOutput()

std::unique_ptr< MeshBase > & MeshGeneratorSystem::getMeshGeneratorOutput ( const MeshGeneratorName &  name)

Get a reference to a pointer that will be the output of the MeshGenerator named name.

Definition at line 590 of file MeshGeneratorSystem.C.

Referenced by executeMeshGenerators(), and MeshGenerator::getMeshByName().

591 {
592  mooseAssert(_app.constructingMeshGenerators() ||
593  _app.actionWarehouse().getCurrentTaskName() == "execute_mesh_generators",
594  "Incorrect call time");
595 
596  auto it = _mesh_generator_outputs.find(name);
597  mooseAssert(it != _mesh_generator_outputs.end(), "Not initialized");
598  it->second.push_back(nullptr);
599  return it->second.back();
600 }
virtual bool constructingMeshGenerators() const
Whether this app is constructing mesh generators.
Definition: MooseApp.C:3600
MooseApp & _app
The MooseApp that owns this system.
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:211
std::map< std::string, std::list< std::unique_ptr< libMesh::MeshBase > > > _mesh_generator_outputs
Holds the output for each mesh generator - including duplicates needed downstream.
const std::string & getCurrentTaskName() const

◆ getMeshGeneratorParamDependencies()

std::vector< std::pair< std::string, MeshGeneratorName > > MeshGeneratorSystem::getMeshGeneratorParamDependencies ( const InputParameters params,
const bool  allow_empty = false 
) const
private

Gets the MeshGeneratorNames that are referenced in an object's parameters.

The result is returned as a pair of param name -> MeshGeneratorName in order to provide context.

The allow_empty param sets whether or not to report names that are empty.

Definition at line 107 of file MeshGeneratorSystem.C.

Referenced by appendMeshGenerator(), createAddedMeshGenerators(), and createMeshGenerator().

109 {
110  std::vector<std::pair<std::string, MeshGeneratorName>> dependencies;
111 
112  auto add_dependency =
113  [&dependencies, &allow_empty](const auto & param_name, const auto & dependency)
114  {
115  if (dependency.size() || allow_empty)
116  dependencies.emplace_back(param_name, dependency);
117  };
118 
119  for (const auto & [name, param] : params)
120  if (const auto dependency =
121  dynamic_cast<const Parameters::Parameter<MeshGeneratorName> *>(param.get()))
122  add_dependency(name, dependency->get());
123  else if (const auto dependencies =
124  dynamic_cast<const Parameters::Parameter<std::vector<MeshGeneratorName>> *>(
125  param.get()))
126  {
127  if (allow_empty && dependencies->get().empty())
128  add_dependency(name, std::string());
129  for (const auto & dependency : dependencies->get())
130  add_dependency(name, dependency);
131  }
132 
133  return dependencies;
134 }

◆ getOrderedMeshGenerators()

const std::vector<std::vector<MeshGenerator *> >& MeshGeneratorSystem::getOrderedMeshGenerators ( ) const
inline

Definition at line 137 of file MeshGeneratorSystem.h.

Referenced by CSGOnlyAction::act().

138  {
139  mooseAssert(_ordered_mesh_generators.size(), "Mesh generator order has not been set");
141  }
std::vector< std::vector< MeshGenerator * > > _ordered_mesh_generators
Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeM...

◆ getSavedMesh()

std::unique_ptr< MeshBase > MeshGeneratorSystem::getSavedMesh ( const std::string &  name)

Get the saved mesh by name.

Definition at line 643 of file MeshGeneratorSystem.C.

Referenced by SetupMeshAction::act(), MooseApp::getMeshGeneratorMesh(), and MeshGeneratorComponent::setupComponent().

644 {
645  auto find_mesh = _save_in_meshes.find(name);
646  if (find_mesh == _save_in_meshes.end())
647  mooseError("Failed to find a saved mesh with the name '", name, "'");
648 
649  auto & mesh_unique_ptr = find_mesh->second;
650  if (!mesh_unique_ptr)
651  mooseError("While getting the saved mesh generator '",
652  name,
653  "', said mesh has already been retrieved");
654 
655  return std::move(mesh_unique_ptr);
656 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
std::map< std::string, std::unique_ptr< libMesh::MeshBase > > _save_in_meshes
Holds the map of save in mesh -> name.

◆ getSavedMeshNames()

std::vector< std::string > MeshGeneratorSystem::getSavedMeshNames ( ) const

Get all user-defined saved meshes except main and main_displaced.

Definition at line 634 of file MeshGeneratorSystem.C.

635 {
636  std::vector<std::string> names;
637  for (auto & pair : _save_in_meshes)
638  names.push_back(pair.first);
639  return names;
640 }
std::map< std::string, std::unique_ptr< libMesh::MeshBase > > _save_in_meshes
Holds the map of save in mesh -> name.

◆ hasBreakMeshByBlockGenerator()

bool MeshGeneratorSystem::hasBreakMeshByBlockGenerator ( ) const
inline
Returns
Whether any of our mesh generators were of type BreakMeshByBlockGenerator

Definition at line 177 of file MeshGeneratorSystem.h.

Referenced by ExtraNodesetGenerator::generate(), and SideSetsFromNormalsGenerator::generate().

177 { return _has_bmbb; }
bool _has_bmbb
Whether any of the mesh generators are a BreakMeshByBlockGenerator.

◆ hasDataDrivenAllowed()

bool MeshGeneratorSystem::hasDataDrivenAllowed ( ) const
Returns
Whether or not data driven generation is enabled in the app

Definition at line 665 of file MeshGeneratorSystem.C.

Referenced by createAddedMeshGenerators().

666 {
667  return _app.parameters().get<bool>(allow_data_driven_param);
668 }
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
MooseApp & _app
The MooseApp that owns this system.
static const std::string allow_data_driven_param
The name of the boolean parameter on the MooseApp that will enable data driven generation.

◆ hasMeshGenerator()

bool MeshGeneratorSystem::hasMeshGenerator ( const MeshGeneratorName &  name) const
Returns
Whether or not a mesh generator exists with the name name.

Definition at line 603 of file MeshGeneratorSystem.C.

Referenced by appendMeshGenerator(), createAddedMeshGenerators(), createMeshGenerator(), createMeshGeneratorOrder(), and MooseApp::hasMeshGenerator().

604 {
605  return _mesh_generators.count(name);
606 }
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
Owning storage for mesh generators, map of name -> MeshGenerator.

◆ hasMeshGeneratorParams()

bool MeshGeneratorSystem::hasMeshGeneratorParams ( const MeshGeneratorName &  name) const

Whether or not we know about the parameters for a MeshGenerator with the given name.

This is primarily for error checking. If MeshGenerator dependencies are screwed up, someone could be looking for a MeshGenerator that hasn't been constructed yet. With this, at least we can give the user some context that we know the generator exists, just that the dependencies are hosed.

Definition at line 609 of file MeshGeneratorSystem.C.

610 {
611  return _mesh_generator_params.count(name);
612 }
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the...

◆ mainMeshGeneratorName()

static std::string MeshGeneratorSystem::mainMeshGeneratorName ( )
inlinestatic

The name reserved for the "main" mesh generator which is the one used for the numerical solver downstream.

Definition at line 172 of file MeshGeneratorSystem.h.

Referenced by executeMeshGenerators(), and MooseApp::getMeshGeneratorMesh().

172 { return "main"; };

◆ perfGraph()

PerfGraph & PerfGraphInterface::perfGraph ( )
inherited

Get the PerfGraph.

Definition at line 78 of file PerfGraphInterface.C.

Referenced by CommonOutputAction::act(), PerfGraphData::finalize(), and PerfGraphOutput::output().

79 {
80  return _pg_moose_app.perfGraph();
81 }
MooseApp & _pg_moose_app
The MooseApp that owns the PerfGraph.
PerfGraph & perfGraph()
Get the PerfGraph for this app.
Definition: MooseApp.h:173

◆ registerTimedSection() [1/2]

PerfID PerfGraphInterface::registerTimedSection ( const std::string &  section_name,
const unsigned int  level 
) const
protectedinherited

Call to register a named section for timing.

Parameters
section_nameThe name of the code section to be timed
levelThe importance of the timer - lower is more important (0 will always come out)
Returns
The ID of the section - use when starting timing

Definition at line 53 of file PerfGraphInterface.C.

55 {
56  const auto timed_section_name = timedSectionName(section_name);
57  if (!moose::internal::getPerfGraphRegistry().sectionExists(timed_section_name))
58  return moose::internal::getPerfGraphRegistry().registerSection(timed_section_name, level);
59  else
60  return moose::internal::getPerfGraphRegistry().sectionID(timed_section_name);
61 }
PerfID registerSection(const std::string &section_name, const unsigned int level)
Call to register a named section for timing.
std::string timedSectionName(const std::string &section_name) const
PerfID sectionID(const std::string &section_name) const
Given a name return the PerfID The name of the section.
PerfGraphRegistry & getPerfGraphRegistry()
Get the global PerfGraphRegistry singleton.

◆ registerTimedSection() [2/2]

PerfID PerfGraphInterface::registerTimedSection ( const std::string &  section_name,
const unsigned int  level,
const std::string &  live_message,
const bool  print_dots = true 
) const
protectedinherited

Call to register a named section for timing.

Parameters
section_nameThe name of the code section to be timed
levelThe importance of the timer - lower is more important (0 will always come out)
live_messageThe message to be printed to the screen during execution
print_dotsWhether or not progress dots should be printed for this section
Returns
The ID of the section - use when starting timing

Definition at line 64 of file PerfGraphInterface.C.

68 {
69  const auto timed_section_name = timedSectionName(section_name);
70  if (!moose::internal::getPerfGraphRegistry().sectionExists(timed_section_name))
72  timedSectionName(section_name), level, live_message, print_dots);
73  else
74  return moose::internal::getPerfGraphRegistry().sectionID(timed_section_name);
75 }
PerfID registerSection(const std::string &section_name, const unsigned int level)
Call to register a named section for timing.
std::string timedSectionName(const std::string &section_name) const
PerfID sectionID(const std::string &section_name) const
Given a name return the PerfID The name of the section.
PerfGraphRegistry & getPerfGraphRegistry()
Get the global PerfGraphRegistry singleton.

◆ saveOutputCSGBase()

void MeshGeneratorSystem::saveOutputCSGBase ( const MeshGeneratorName  generator_name,
std::unique_ptr< CSG::CSGBase > &  csg_base 
)

Saves the CSGBase object to the global map storage, _csg_base_output, for a particular mesh generator.

Note that this moves the memory ownership of the CSGBase to the MeshGeneratorSystem.

Parameters
generator_nameName of mesh generator
csg_basePointer to CSGBase object created by mesh generator

Definition at line 698 of file MeshGeneratorSystem.C.

Referenced by CSGOnlyAction::act().

700 {
701  mooseAssert(_csg_base_output.find(generator_name) == _csg_base_output.end(),
702  "CSG mesh already exists");
703  _csg_base_output[generator_name] = std::move(csg_base);
704 }
std::map< std::string, std::unique_ptr< CSG::CSGBase > > _csg_base_output
Holds the output CSGBase object for each mesh generator.

◆ setCSGOnly()

void MeshGeneratorSystem::setCSGOnly ( )

Set whether mesh generator system is running in CSG-only mode to true.

Definition at line 692 of file MeshGeneratorSystem.C.

Referenced by CSGOnlyAction::act().

693 {
694  _csg_only = true;
695 }
bool _csg_only
Whether mesh generator system is running in CSG-only mode.

◆ setVerbose()

void MeshGeneratorSystem::setVerbose ( const bool  verbose)
inline

Set the verbose flag.

Definition at line 196 of file MeshGeneratorSystem.h.

Referenced by SetupDebugAction::SetupDebugAction().

196 { _verbose = verbose; }
bool _verbose
Whether to print the names of the mesh generators being executed or not.

◆ timedSectionName()

std::string PerfGraphInterface::timedSectionName ( const std::string &  section_name) const
protectedinherited
Returns
The name of the timed section with the name section_name.

Optionally adds a prefix if one is defined.

Definition at line 47 of file PerfGraphInterface.C.

Referenced by PerfGraphInterface::registerTimedSection().

48 {
49  return _prefix.empty() ? "" : (_prefix + "::") + section_name;
50 }
const std::string _prefix
A prefix to use for all sections.

◆ validParams()

InputParameters PerfGraphInterface::validParams ( )
staticinherited

Definition at line 16 of file PerfGraphInterface.C.

Referenced by Convergence::validParams().

17 {
19  return params;
20 }
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()

Member Data Documentation

◆ _app

MooseApp& MeshGeneratorSystem::_app
private

◆ _csg_base_output

std::map<std::string, std::unique_ptr<CSG::CSGBase> > MeshGeneratorSystem::_csg_base_output
private

Holds the output CSGBase object for each mesh generator.

Definition at line 294 of file MeshGeneratorSystem.h.

Referenced by getCSGBaseGeneratorOutput(), and saveOutputCSGBase().

◆ _csg_only

bool MeshGeneratorSystem::_csg_only
private

Whether mesh generator system is running in CSG-only mode.

Definition at line 291 of file MeshGeneratorSystem.h.

Referenced by getCSGOnly(), and setCSGOnly().

◆ _data_driven_generator_name

std::optional<std::string> MeshGeneratorSystem::_data_driven_generator_name
private

The name of the data driven generator, if any.

Definition at line 282 of file MeshGeneratorSystem.h.

Referenced by createAddedMeshGenerators(), and getDataDrivenGeneratorName().

◆ _final_generator_name

std::string MeshGeneratorSystem::_final_generator_name
private

◆ _has_bmbb

bool MeshGeneratorSystem::_has_bmbb
private

Whether any of the mesh generators are a BreakMeshByBlockGenerator.

Definition at line 285 of file MeshGeneratorSystem.h.

Referenced by addMeshGenerator(), executeMeshGenerators(), and hasBreakMeshByBlockGenerator().

◆ _mesh_generator_outputs

std::map<std::string, std::list<std::unique_ptr<libMesh::MeshBase> > > MeshGeneratorSystem::_mesh_generator_outputs
private

Holds the output for each mesh generator - including duplicates needed downstream.

Definition at line 273 of file MeshGeneratorSystem.h.

Referenced by createMeshGenerator(), executeMeshGenerators(), and getMeshGeneratorOutput().

◆ _mesh_generator_params

std::unordered_map<std::string, std::pair<std::string, InputParameters> > MeshGeneratorSystem::_mesh_generator_params
private

The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the name, pair contains the type and the params.

Definition at line 264 of file MeshGeneratorSystem.h.

Referenced by addMeshGenerator(), appendMeshGenerator(), createAddedMeshGenerators(), createMeshGenerator(), and hasMeshGeneratorParams().

◆ _mesh_generators

std::map<std::string, std::shared_ptr<MeshGenerator> > MeshGeneratorSystem::_mesh_generators
private

◆ _ordered_mesh_generators

std::vector<std::vector<MeshGenerator *> > MeshGeneratorSystem::_ordered_mesh_generators
private

Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeMeshGenerators()

Definition at line 270 of file MeshGeneratorSystem.h.

Referenced by appendMeshGenerator(), createMeshGeneratorOrder(), executeMeshGenerators(), and getOrderedMeshGenerators().

◆ _pg_moose_app

MooseApp& PerfGraphInterface::_pg_moose_app
protectedinherited

The MooseApp that owns the PerfGraph.

Definition at line 124 of file PerfGraphInterface.h.

Referenced by PerfGraphInterface::perfGraph().

◆ _prefix

const std::string PerfGraphInterface::_prefix
protectedinherited

A prefix to use for all sections.

Definition at line 127 of file PerfGraphInterface.h.

Referenced by PerfGraphInterface::timedSectionName().

◆ _save_in_meshes

std::map<std::string, std::unique_ptr<libMesh::MeshBase> > MeshGeneratorSystem::_save_in_meshes
private

Holds the map of save in mesh -> name.

Definition at line 279 of file MeshGeneratorSystem.h.

Referenced by createMeshGenerator(), executeMeshGenerators(), getSavedMesh(), and getSavedMeshNames().

◆ _verbose

bool MeshGeneratorSystem::_verbose
private

Whether to print the names of the mesh generators being executed or not.

Definition at line 288 of file MeshGeneratorSystem.h.

Referenced by executeMeshGenerators(), and setVerbose().

◆ allow_data_driven_param

const std::string MeshGeneratorSystem::allow_data_driven_param
static
Initial value:
=
"allow_data_driven_mesh_generation"

The name of the boolean parameter on the MooseApp that will enable data driven generation.

Definition at line 39 of file MeshGeneratorSystem.h.

Referenced by createAddedMeshGenerators(), hasDataDrivenAllowed(), and MooseApp::validParams().

◆ data_driven_generator_param

const std::string MeshGeneratorSystem::data_driven_generator_param = "data_driven_generator"
static

The name of the string parameter that sets the data driven generator.

Definition at line 37 of file MeshGeneratorSystem.h.

Referenced by createAddedMeshGenerators(), dataDrivenError(), and MeshGeneratorMesh::validParams().


The documentation for this class was generated from the following files: