https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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.
 
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.
 
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.
 
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.
 
void createAddedMeshGenerators ()
 Creates (constructs) all of the MeshGenerators that have been declared using addMeshGenerator().
 
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.
 
std::unique_ptr< libMesh::MeshBasegetSavedMesh (const std::string &name)
 Get the saved mesh by name.
 
std::vector< std::string > getSavedMeshNames () const
 Get all user-defined saved meshes except main and main_displaced.
 
void setCSGOnly ()
 Set whether mesh generator system is running in CSG-only mode to true.
 
bool getCSGOnly () const
 Get whether mesh generator system is running in CSG-only mode.
 
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.
 
bool appendingMeshGenerators () const
 Whether or not mesh generators are currently being appended (append_mesh_generator task)
 
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.
 
MeshGeneratorName getFinalMeshGeneratorName () const
 Get the name of the final mesh generator.
 
void setVerbose (const bool verbose)
 Set the verbose flag.
 
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.
 
std::unique_ptr< CSG::CSGBase > & getCSGBaseGeneratorOutput (const MeshGeneratorName &name)
 Returns the output CSGBase object associated with a particular mesh generator name.
 
PerfGraphperfGraph ()
 Get the PerfGraph.
 
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.
 
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.
 
static const std::string allow_data_driven_param
 The name of the boolean parameter on the MooseApp that will enable data driven generation.
 

Protected Member Functions

PerfID registerTimedSection (const std::string &section_name, const unsigned int level) const
 Call to register a named section for timing.
 
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.
 
std::string timedSectionName (const std::string &section_name) const
 

Protected Attributes

MooseApp_pg_moose_app
 The MooseApp that owns the PerfGraph.
 
const std::string _prefix
 A prefix to use for all sections.
 
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.
 
void createMeshGeneratorOrder ()
 Order all of the _mesh_generators into _ordered_mesh_generators for later execution in executeMeshGenerators.
 
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).
 
MeshGeneratorgetMeshGeneratorInternal (const std::string &name)
 Get a MeshGenerator with the name name.
 
const std::string & getDataDrivenGeneratorName () const
 

Private Attributes

MooseApp_app
 The MooseApp that owns this system.
 
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.
 
std::map< std::string, std::shared_ptr< MeshGenerator > > _mesh_generators
 Owning storage for mesh generators, map of name -> MeshGenerator.
 
std::vector< std::vector< MeshGenerator * > > _ordered_mesh_generators
 Holds the ordered mesh generators from createMeshGeneratorOrder() until they are executed in executeMeshGenerators()
 
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::string _final_generator_name
 The final mesh generator name to use.
 
std::map< std::string, std::unique_ptr< libMesh::MeshBase > > _save_in_meshes
 Holds the map of save in mesh -> name.
 
std::optional< std::string > _data_driven_generator_name
 The name of the data driven generator, if any.
 
bool _verbose
 Whether to print the names of the mesh generators being executed or not.
 
bool _csg_only
 Whether mesh generator system is running in CSG-only mode.
 
std::map< std::string, std::list< std::unique_ptr< CSG::CSGBase > > > _csg_base_outputs
 Holds the output CSGBase object for each mesh generator - including duplicates when needed by multiple downstream generators (key is MG name, value list is duplicates)
 

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 _verbose(false),
29 _csg_only(false)
30{
31}
MooseApp & _app
The MooseApp that owns this system.
bool _csg_only
Whether mesh generator system is running in CSG-only mode.
bool _verbose
Whether to print the names of the mesh generators being executed or not.
PerfGraph & perfGraph()
Get the PerfGraph for this app.
Definition MooseApp.h:179
Interface for objects interacting with the PerfGraph.

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 34 of file MeshGeneratorSystem.C.

37{
38 mooseAssert(!_mesh_generator_params.count(name), "Already exists");
40 std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple(type, params));
41
42 // This should be a sub mesh generator. We can assume this because if we're in the middle of
43 // constructing mesh generators (not "adding" them, where we simply store their parameters)
46}
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...
std::unordered_map< std::string, std::pair< std::string, InputParameters > > _mesh_generator_params
The MeshGenerators declared using addMeshGenerator(), cleared after createMeshGenerators() Key is the...
virtual bool constructingMeshGenerators() const
Whether this app is constructing mesh generators.
Definition MooseApp.C:3494

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

◆ appendingMeshGenerators()

bool MeshGeneratorSystem::appendingMeshGenerators ( ) const

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

Definition at line 681 of file MeshGeneratorSystem.C.

682{
683 return _app.actionWarehouse().getCurrentTaskName() == "append_mesh_generator";
684}
const std::string & getCurrentTaskName() const
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition MooseApp.h:217

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

◆ 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 49 of file MeshGeneratorSystem.C.

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

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

◆ 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 133 of file MeshGeneratorSystem.C.

134{
135 mooseAssert(_app.actionWarehouse().getCurrentTaskName() == "create_added_mesh_generators",
136 "Should not run now");
137
138 // No generators were added via addMeshGenerator()
139 if (_mesh_generator_params.empty())
140 return;
141
143
144 // Define the dependencies known so far
145 for (const auto & [name, type_params_pair] : _mesh_generator_params)
146 {
147 resolver.addItem(name);
148 for (const auto & param_dependency_pair :
149 getMeshGeneratorParamDependencies(type_params_pair.second))
150 resolver.addEdge(param_dependency_pair.second, name);
151 }
152
153 std::vector<std::vector<std::string>> ordered_generators;
154 try
155 {
156 ordered_generators = resolver.getSortedValuesSets();
157 }
159 {
160 mooseError("Cyclic dependencies detected in mesh generation: ",
161 MooseUtils::join(e.getCyclicDependencies(), " <- "));
162 }
163
164 const auto & moose_mesh = _app.actionWarehouse().getMesh();
165
166 // If there is no mesh
167 if (!moose_mesh.get())
168 mooseError("No mesh created. Either add a Mesh, an ActionComponents or a Components block");
169
170 // If we're using data-driven generation, find that requirement now
171 mooseAssert(!_data_driven_generator_name, "Should not be set");
172 if (moose_mesh->parameters().get<bool>("_mesh_generator_mesh") &&
173 moose_mesh->isParamValid(data_driven_generator_param))
174 {
176 moose_mesh->paramError(
178 "This application does not support data-driven mesh generation.\n\nThis generation is an "
179 "advanced feature and must be enabled on the application via the '",
181 "' parameter.");
182
183 mooseAssert(moose_mesh->type() == "MeshGeneratorMesh",
184 "Assumption for mesh type is now invalid");
185
186 _data_driven_generator_name = moose_mesh->getParam<std::string>(data_driven_generator_param);
188 moose_mesh->paramError(data_driven_generator_param,
189 "The data driven generator '",
191 "' does not exist");
192 }
193
194 // Check compatibility for CLI / meshing options with csg_only
195 const bool csg_only = getCSGOnly();
196 if (csg_only && _data_driven_generator_name)
197 moose_mesh->paramError(data_driven_generator_param,
198 "This parameter should not be set in conjunction with --csg-only");
199
200 // Construct all of the mesh generators that we know exist
201 for (const auto & generator_names : ordered_generators)
202 for (const auto & generator_name : generator_names)
203 if (auto it = _mesh_generator_params.find(generator_name); it != _mesh_generator_params.end())
204 {
205 auto & params = it->second.second;
206
207 // Determine now if we need to run this in data only mode
208 const bool data_only =
209 (csg_only ||
211 resolver.dependsOn(getDataDrivenGeneratorName(), generator_name)));
212 params.set<bool>(MeshGenerator::data_only_param) = data_only;
213
214 createMeshGenerator(generator_name);
215
216 if (csg_only && !getMeshGenerator(generator_name).hasGenerateCSG())
217 mooseError("Mesh generator ",
218 generator_name,
219 " cannot be used in csg-only mode since it does not have a generateCSG "
220 "implementation");
221
222 mooseAssert(data_only == getMeshGenerator(generator_name).isDataOnly(),
223 "Inconsistent data only");
224 }
225
226 mooseAssert(_mesh_generator_params.empty(), "Should be empty");
227 mooseAssert(_final_generator_name.empty(), "Should be unset at this point");
228
229 // Set the final generator if we have one set by the user
230 // and if so make sure it also exists
231 if (moose_mesh->parameters().get<bool>("_mesh_generator_mesh") &&
232 moose_mesh->isParamValid("final_generator"))
233 {
234 mooseAssert(moose_mesh->type() == "MeshGeneratorMesh",
235 "Assumption for mesh type is now invalid");
236
237 _final_generator_name = moose_mesh->getParam<std::string>("final_generator");
239 moose_mesh->paramError("final_generator",
240 "The forced final MeshGenerator '",
242 "' does not exist");
243 }
244}
for(PetscInt i=0;i< nvars;++i)
const std::shared_ptr< MooseMesh > & getMesh() const
const std::vector< T > & getCyclicDependencies() const
Class that represents the dependecy as a graph.
bool dependsOn(const T &key, const T &value)
Return true if key depends on value.
void addItem(const T &value)
Add an independent item to the set.
const std::vector< std::vector< T > > & getSortedValuesSets()
Returns a vector of sets that represent dependency resolved values.
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::optional< std::string > _data_driven_generator_name
The name of the data driven generator, if any.
static const std::string data_driven_generator_param
The name of the string parameter that sets the data driven generator.
bool getCSGOnly() const
Get whether mesh generator system is running in CSG-only mode.
bool hasDataDrivenAllowed() const
const MeshGenerator & getMeshGenerator(const std::string &name) const
static const std::string data_only_param
The name of the private parameter for setting data only.
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition KokkosUtils.h:40
if(subdm)

Referenced by CreateAddedMeshGenerators::act().

◆ 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 498 of file MeshGeneratorSystem.C.

499{
500 libmesh_parallel_only(comm());
501 mooseAssert(_app.constructingMeshGenerators(), "Should not run now");
502
503 const auto find_params = _mesh_generator_params.find(generator_name);
504 mooseAssert(find_params != _mesh_generator_params.end(), "Not added");
505 const auto & [type, params] = find_params->second;
506 mooseAssert(comm().verify(type + generator_name), "Inconsistent construction order");
507
508 std::shared_ptr<MeshGenerator> mg =
509 _app.getFactory().create<MeshGenerator>(type, generator_name, params);
510
511 if (mg->hasSaveMesh())
512 {
513 if (_save_in_meshes.count(mg->getSavedMeshName()))
514 mg->paramError("save_with_name",
515 "The save with name '",
516 mg->getSavedMeshName(),
517 "' has already been used");
518 _save_in_meshes.emplace(mg->getSavedMeshName(), nullptr);
519 }
520
521 // Setup the children and parents
522 for (const auto & dependency : mg->getRequestedMeshGenerators())
523 {
524 // We _shouldn't_ hit this; now that we enforce construction ordering we do
525 // all of this error checking at construction time because the info is available
526 mooseAssert(hasMeshGenerator(dependency), "Missing dependency");
527
528 auto & dependency_mg = getMeshGeneratorInternal(dependency);
529 mg->addParentMeshGenerator(dependency_mg, MeshGenerator::AddParentChildKey());
530 dependency_mg.addChildMeshGenerator(*mg, MeshGenerator::AddParentChildKey());
531 }
532
533 // Loop through all of the MeshGeneratorName and std::vector<MeshGeneratorName>
534 // parameters (meshes that we should depend on), and make sure that either:
535 // - We directly depend on them and requested a mesh from them
536 // - We created a sub generator that depends on them and we declared it
537 for (const auto & param_dependency_pair : getMeshGeneratorParamDependencies(mg->parameters()))
538 {
539 const auto & param_name = param_dependency_pair.first;
540 const auto & dependency_name = param_dependency_pair.second;
541
542 if (mg->isNullMeshName(dependency_name))
543 continue;
544
545 // True if this dependency was requested and is a parent
546 if (mg->isParentMeshGenerator(dependency_name))
547 {
548 mooseAssert(mg->getRequestedMeshGenerators().count(dependency_name), "Wasn't requested");
549 continue;
550 }
551
552 // Whether or not this is a dependency of at least one SubGenerator
553 auto find_sub_dependency = std::find_if(mg->getSubMeshGenerators().begin(),
554 mg->getSubMeshGenerators().end(),
555 [&dependency_name](const auto & mg)
556 { return mg->isParentMeshGenerator(dependency_name); });
557 const auto is_sub_dependency = find_sub_dependency != mg->getSubMeshGenerators().end();
558
559 // This should be used by a sub generator
560 if (mg->getRequestedMeshGeneratorsForSub().count(dependency_name))
561 {
562 if (!is_sub_dependency)
563 mg->mooseError("The sub generator dependency declared from MeshGenerator '",
564 dependency_name,
565 "' from the parameter '",
566 param_name,
567 "' was not used.\n\nDependencies that are declared by declareMeshForSub() "
568 "must be used as an input to a sub generator created by this object.");
569 }
570 // This was used by a sub generator but wasn't declared
571 else if (is_sub_dependency)
572 mg->mooseError(
573 "The MeshGenerator '",
574 dependency_name,
575 "' was referenced in the parameter '",
576 param_name,
577 "' and used in the sub generator ",
578 (*find_sub_dependency)->type(),
579 " '",
580 (*find_sub_dependency)->name(),
581 "', but was not declared as a sub dependency.\n\nTo correct this, modify the code of ",
582 mg->type(),
583 " to include a call to declareMesh(es)ForSub(\"",
584 param_name,
585 "\") in the constructor.");
586 // Isn't used at all
587 else
588 mg->mooseError(
589 "You failed to request the generated mesh(es) for the parameter '",
590 param_name,
591 "'.\n\nIn specific, the mesh from MeshGenerator '",
592 dependency_name,
593 "' was not requested.\n\nTo correct this, you should remove the parameter if the "
594 "mesh(es)\nare not needed, or request the mesh(es) with getMesh()/getMeshes().");
595 }
596
597 mooseAssert(!_mesh_generators.count(generator_name), "Already created");
598 _mesh_generators.emplace(generator_name, mg);
599 mooseAssert(!_mesh_generator_outputs.count(generator_name), "Already exists");
600 _mesh_generator_outputs[generator_name];
601 if (getCSGOnly())
602 {
603 mooseAssert(!_csg_base_outputs.count(generator_name), "CSG already exists");
604 _csg_base_outputs[generator_name];
605 }
606 _mesh_generator_params.erase(find_params);
607
608 return mg;
609}
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::unique_ptr< libMesh::MeshBase > > _save_in_meshes
Holds the map of save in mesh -> name.
std::map< std::string, std::list< std::unique_ptr< CSG::CSGBase > > > _csg_base_outputs
Holds the output CSGBase object for each mesh generator - including duplicates when needed by multipl...
MeshGenerator & getMeshGeneratorInternal(const std::string &name)
Get a MeshGenerator with the name name.
Class that is used as a parameter to add[Parent/Child]() that allows only MeshGeneratorSystem methods...
MeshGenerators are objects that can modify or add to an existing mesh.
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition MooseApp.h:407
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:457
virtual std::unique_ptr< Base > create()=0
const Parallel::Communicator & comm() const

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

◆ createMeshGeneratorOrder()

void MeshGeneratorSystem::createMeshGeneratorOrder ( )
private

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

Definition at line 247 of file MeshGeneratorSystem.C.

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

Referenced by appendMeshGenerator(), and executeMeshGenerators().

◆ 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 700 of file MeshGeneratorSystem.C.

702{
703 const auto & moose_mesh = _app.actionWarehouse().getMesh();
704 moose_mesh->paramError(data_driven_generator_param,
705 "The generator '",
707 "' cannot be used in data-driven mode because the parent ",
708 generator.typeAndName(),
709 " ",
710 message);
711}
std::string typeAndName() const
Get the class's combined type and name; useful in error handling.
Definition MooseBase.C:57

Referenced by MeshGenerator::MeshGenerator().

◆ executeMeshGenerators()

void MeshGeneratorSystem::executeMeshGenerators ( )

Execute and clear the Mesh Generators data structure.

Definition at line 382 of file MeshGeneratorSystem.C.

383{
384 libmesh_parallel_only(comm());
385
386 // we do not need to do this when there are no mesh generators
387 if (_mesh_generators.empty())
388 return;
389
390 // Order the generators
392
393 // Save all meshes marked to to_save_in_meshes and save in error checking
394 std::map<std::string, std::unique_ptr<MeshBase> *> to_save_in_meshes;
395 for (const auto & generator_set : _ordered_mesh_generators)
396 for (const auto & generator : generator_set)
397 if (generator->hasSaveMesh())
398 {
399 if (_final_generator_name == generator->name())
400 generator->paramError("save_with_name",
401 "Cannot use the save in capability with the final mesh generator");
402 if (getCSGOnly())
403 generator->paramError("save_with_name", "Cannot use in conjunction with --csg-only");
404 to_save_in_meshes.emplace(generator->getSavedMeshName(),
405 &getMeshGeneratorOutput(generator->name()));
406 }
407 // Grab the outputs from the final generator so MeshGeneratorMesh can pick it up
408 to_save_in_meshes.emplace(mainMeshGeneratorName(),
410
411 // Run the MeshGenerators in the proper order
412 for (const auto & generator_set : _ordered_mesh_generators)
413 {
414 for (const auto & generator : generator_set)
415 {
416 mooseAssert(comm().verify(generator->typeAndName().size()) &&
417 comm().verify(generator->typeAndName()),
418 "Mesh generator generation is parallel inconsistent; about to execute "
419 << generator->typeAndName());
420
421 const auto & name = generator->name();
422 if (_verbose)
423 _app._console << " [DBG] Executing mesh generator (" << COLOR_GREEN << std::setw(20) << name
424 << COLOR_DEFAULT << ") in type (" << COLOR_GREEN << generator->type()
425 << COLOR_DEFAULT << ")" << std::endl;
426 auto current_mesh = generator->generateInternal();
427
428 if (!generator->isDataOnly())
429 mooseAssert(comm().verify(current_mesh->is_prepared()),
430 "Mesh prepared state after " << generator->typeAndName()
431 << " is parallel inconsistent");
432
433 mooseAssert(comm().verify(generator->typeAndName().size()) &&
434 comm().verify(generator->typeAndName()),
435 "Mesh generator generation is parallel inconsistent; just executed "
436 << generator->typeAndName());
437
438 // Only generating data for this generator
439 if (generator->isDataOnly())
440 {
441 mooseAssert(!current_mesh, "Should not have a mesh");
442 continue;
443 }
444
445#ifdef DEBUG
446 // Assert that the mesh is either marked as not prepared or if it is marked as prepared,
447 // that it's *actually* prepared.
448 //
449 // In newer version of libMesh, this also asserts that a mesh
450 // marked as partially prepared is indeed prepared in (at least)
451 // the aspects which are so marked.
452 if (!MeshTools::valid_is_prepared(*current_mesh))
453 generator->mooseError(
454 "The generated mesh is marked as (at least partially) prepared but is not "
455 "prepared in the marked sense(s). Please edit the '",
456 generator->type(),
457 "' class to call 'unset_is_prepared()', or more fine-grained "
458 "alternatives as appropriate.");
459#endif
460
461 // Now we need to possibly give this mesh to downstream generators
462 auto & outputs = _mesh_generator_outputs[name];
463
464 if (outputs.size())
465 {
466 auto & first_output = *outputs.begin();
467
468 first_output = std::move(current_mesh);
469
470 const auto & copy_from = *first_output;
471
472 auto output_it = ++outputs.begin();
473
474 // For all of the rest we need to make a copy
475 for (; output_it != outputs.end(); ++output_it)
476 (*output_it) = copy_from.clone();
477 }
478 }
479 }
480
481 // No save in meshes exist in csg only mode
482 if (getCSGOnly())
483 return;
484
485 // Grab all the valid save in meshes from the temporary map to_save_in_meshes
486 // and store them in _save_in_meshes
487 for (auto & [name, mesh_ptr] : to_save_in_meshes)
488 {
489 mooseAssert(mesh_ptr, "Invalid pointer");
490 mooseAssert(*mesh_ptr, "Invalid pointer");
491 if (name != mainMeshGeneratorName())
492 mooseAssert(_save_in_meshes.count(name), "Mesh has not been requested for save");
493 _save_in_meshes[name] = std::move(*mesh_ptr);
494 }
495}
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
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.
static std::string mainMeshGeneratorName()
The name reserved for the "main" mesh generator which is the one used for the numerical solver downst...
bool valid_is_prepared(const MeshBase &mesh)

Referenced by ExecuteMeshGenerators::act().

◆ 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 741 of file MeshGeneratorSystem.C.

742{
743 mooseAssert(_app.constructingMeshGenerators() ||
744 _app.actionWarehouse().getCurrentTaskName() == "execute_mesh_generators",
745 "Incorrect call time");
746
747 auto it = _csg_base_outputs.find(name);
748 mooseAssert(it != _csg_base_outputs.end(), "CSG mesh not initialized");
749 it->second.push_back(nullptr);
750 return it->second.back();
751}

Referenced by MeshGenerator::getCSGBaseByName().

◆ 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.

135{ return _csg_only; }

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

◆ getDataDrivenGeneratorName()

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

Definition at line 693 of file MeshGeneratorSystem.C.

694{
695 mooseAssert(_data_driven_generator_name, "Not set");
697}

Referenced by createAddedMeshGenerators(), and dataDrivenError().

◆ getFinalMeshGeneratorName()

MeshGeneratorName MeshGeneratorSystem::getFinalMeshGeneratorName ( ) const
inline

Get the name of the final mesh generator.

Definition at line 188 of file MeshGeneratorSystem.h.

188{ return _final_generator_name; }

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

◆ getMeshGenerator()

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

Definition at line 637 of file MeshGeneratorSystem.C.

638{
639 const auto it = _mesh_generators.find(name);
640 if (it == _mesh_generators.end())
641 mooseError("Failed to find a MeshGenerator with the name '", name, "'");
642 mooseAssert(it->second, "Invalid shared pointer");
643 return *it->second;
644}

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

◆ 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 244 of file MeshGeneratorSystem.h.

245 {
246 return const_cast<MeshGenerator &>(std::as_const(*this).getMeshGenerator(name));
247 }

Referenced by createMeshGenerator(), and createMeshGeneratorOrder().

◆ 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 647 of file MeshGeneratorSystem.C.

648{
649 std::vector<std::string> names;
650 for (auto & pair : _mesh_generators)
651 names.push_back(pair.first);
652 return names;
653}

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

◆ 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 612 of file MeshGeneratorSystem.C.

613{
614 mooseAssert(_app.constructingMeshGenerators() ||
615 _app.actionWarehouse().getCurrentTaskName() == "execute_mesh_generators",
616 "Incorrect call time");
617
618 auto it = _mesh_generator_outputs.find(name);
619 mooseAssert(it != _mesh_generator_outputs.end(), "Not initialized");
620 it->second.push_back(nullptr);
621 return it->second.back();
622}

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

◆ 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 103 of file MeshGeneratorSystem.C.

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

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

◆ getOrderedMeshGenerators()

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

Definition at line 137 of file MeshGeneratorSystem.h.

138 {
139 mooseAssert(_ordered_mesh_generators.size(), "Mesh generator order has not been set");
141 }

Referenced by CSGOnlyAction::act().

◆ getSavedMesh()

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

Get the saved mesh by name.

Definition at line 665 of file MeshGeneratorSystem.C.

666{
667 auto find_mesh = _save_in_meshes.find(name);
668 if (find_mesh == _save_in_meshes.end())
669 mooseError("Failed to find a saved mesh with the name '", name, "'");
670
671 auto & mesh_unique_ptr = find_mesh->second;
672 if (!mesh_unique_ptr)
673 mooseError("While getting the saved mesh generator '",
674 name,
675 "', said mesh has already been retrieved");
676
677 return std::move(mesh_unique_ptr);
678}

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

◆ getSavedMeshNames()

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

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

Definition at line 656 of file MeshGeneratorSystem.C.

657{
658 std::vector<std::string> names;
659 for (auto & pair : _save_in_meshes)
660 names.push_back(pair.first);
661 return names;
662}

◆ hasDataDrivenAllowed()

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

Definition at line 687 of file MeshGeneratorSystem.C.

688{
690}
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

Referenced by createAddedMeshGenerators().

◆ hasMeshGenerator()

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

Definition at line 625 of file MeshGeneratorSystem.C.

626{
627 return _mesh_generators.count(name);
628}

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

◆ 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 631 of file MeshGeneratorSystem.C.

632{
633 return _mesh_generator_params.count(name);
634}

◆ 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.

172{ return "main"; };

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

◆ perfGraph()

PerfGraph & PerfGraphInterface::perfGraph ( )
inherited

Get the PerfGraph.

Definition at line 86 of file PerfGraphInterface.C.

87{
88 return _pg_moose_app.perfGraph();
89}
MooseApp & _pg_moose_app
The MooseApp that owns the PerfGraph.

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

◆ 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 61 of file PerfGraphInterface.C.

63{
64 const auto timed_section_name = timedSectionName(section_name);
65 if (!moose::internal::getPerfGraphRegistry().sectionExists(timed_section_name))
66 return moose::internal::getPerfGraphRegistry().registerSection(timed_section_name, level);
67 else
68 return moose::internal::getPerfGraphRegistry().sectionID(timed_section_name);
69}
std::string timedSectionName(const std::string &section_name) const
PerfID sectionID(const std::string &section_name) const
Given a name return the PerfID @section_name The name of the section.
PerfID registerSection(const std::string &section_name, const unsigned int level)
Call to register a named section for timing.
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 72 of file PerfGraphInterface.C.

76{
77 const auto timed_section_name = timedSectionName(section_name);
78 if (!moose::internal::getPerfGraphRegistry().sectionExists(timed_section_name))
80 timedSectionName(section_name), level, live_message, print_dots);
81 else
82 return moose::internal::getPerfGraphRegistry().sectionID(timed_section_name);
83}

◆ 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 720 of file MeshGeneratorSystem.C.

722{
723 auto & outputs = _csg_base_outputs[generator_name];
724
725 // Store CSGBase instance for any downstream MG's that request it, creating copies
726 // as needed
727 if (outputs.size())
728 {
729 // Set first output to csg_base
730 auto & first_output = *outputs.begin();
731 first_output = std::move(csg_base);
732 const auto & copy_from = *first_output;
733 auto output_it = ++outputs.begin();
734 // For all of the rest we create a clone of csg_base
735 for (; output_it != outputs.end(); ++output_it)
736 (*output_it) = copy_from.clone();
737 }
738}

Referenced by CSGOnlyAction::act().

◆ setCSGOnly()

void MeshGeneratorSystem::setCSGOnly ( )

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

Definition at line 714 of file MeshGeneratorSystem.C.

715{
716 _csg_only = true;
717}

Referenced by CSGOnlyAction::act().

◆ setVerbose()

void MeshGeneratorSystem::setVerbose ( const bool  verbose)
inline

Set the verbose flag.

Definition at line 191 of file MeshGeneratorSystem.h.

191{ _verbose = verbose; }

Referenced by SetupDebugAction::SetupDebugAction().

◆ 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 55 of file PerfGraphInterface.C.

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

Referenced by PerfGraphInterface::registerTimedSection(), and PerfGraphInterface::registerTimedSection().

◆ validParams()

InputParameters PerfGraphInterface::validParams ( )
staticinherited

Definition at line 16 of file PerfGraphInterface.C.

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

Referenced by Convergence::validParams().

Member Data Documentation

◆ _app

MooseApp& MeshGeneratorSystem::_app
private

◆ _csg_base_outputs

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

Holds the output CSGBase object for each mesh generator - including duplicates when needed by multiple downstream generators (key is MG name, value list is duplicates)

Definition at line 286 of file MeshGeneratorSystem.h.

Referenced by createMeshGenerator(), getCSGBaseGeneratorOutput(), and saveOutputCSGBase().

◆ _csg_only

bool MeshGeneratorSystem::_csg_only
private

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

Definition at line 283 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 277 of file MeshGeneratorSystem.h.

Referenced by createAddedMeshGenerators(), and getDataDrivenGeneratorName().

◆ _final_generator_name

std::string MeshGeneratorSystem::_final_generator_name
private

◆ _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 268 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 259 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 265 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 135 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 138 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 274 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 280 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: