https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
PinMeshGenerator Class Reference

Mesh generator for defining a reactor pin with background and duct regions, with the option to be 2-D or 3-D. More...

#include <PinMeshGenerator.h>

Inheritance diagram for PinMeshGenerator:
[legend]

Public Types

typedef DataFileName DataFileParameterType
 

Public Member Functions

 PinMeshGenerator (const InputParameters &parameters)
 
std::unique_ptr< MeshBase > generate () override
 
std::unique_ptr< CSG::CSGBase > generateCSG () override
 
void generateData () override
 
std::unique_ptr< CSG::CSGBase > generateInternalCSG ()
 
std::unique_ptr< MeshBase > generateInternal ()
 
const std::set< MeshGeneratorName > & getRequestedMeshGenerators () const
 
const std::set< MeshGeneratorName > & getRequestedMeshGeneratorsForSub () const
 
void addParentMeshGenerator (const MeshGenerator &mg, const AddParentChildKey)
 
void addChildMeshGenerator (const MeshGenerator &mg, const AddParentChildKey)
 
const std::set< const MeshGenerator *, Comparator > & getParentMeshGenerators () const
 
const std::set< const MeshGenerator *, Comparator > & getChildMeshGenerators () const
 
const std::set< const MeshGenerator *, Comparator > & getSubMeshGenerators () const
 
bool isParentMeshGenerator (const MeshGeneratorName &name, const bool direct=true) const
 
bool isChildMeshGenerator (const MeshGeneratorName &name, const bool direct=true) const
 
bool isNullMeshName (const MeshGeneratorName &name) const
 
bool hasSaveMesh () const
 
bool hasOutput () const
 
const std::string & getSavedMeshName () const
 
bool hasGenerateData () const
 
bool hasGenerateCSG () const
 
bool isDataOnly () const
 
virtual bool enabled () const
 
std::shared_ptr< MooseObject > getSharedPtr ()
 
std::shared_ptr< const MooseObject > getSharedPtr () const
 
bool isKokkosObject () const
 
MooseApp & getMooseApp () const
 
const std::string & type () const
 
const std::string & name () const
 
std::string typeAndName () const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
MooseObjectName uniqueName () const
 
const InputParameters & parameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const T & getParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const T * queryParam (const std::string &name) const
 
const T & getRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &name) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
std::string messagePrefix (const bool hit_prefix=true) const
 
std::string errorPrefix (const std::string &) const
 
void mooseError (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecatedNoTrace (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
void callMooseError (std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &relative_path) const
 
std::string getDataFilePath (const std::string &relative_path) const
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static InputParameters validParams ()
 
static void addDepletionIDParams (InputParameters &parameters)
 
static bool hasGenerateData (const InputParameters &params)
 
static bool hasGenerateCSG (const InputParameters &params)
 
static void callMooseError (MooseApp *const app, const InputParameters &params, std::string msg, const bool with_prefix, const hit::Node *node, const bool show_trace=true)
 
static void setHasGenerateData (InputParameters &params)
 
static void setHasGenerateCSG (InputParameters &params)
 

Public Attributes

 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 

Static Public Attributes

static const std::string data_only_param
 
static const std::string type_param
 
static const std::string name_param
 
static const std::string unique_name_param
 
static const std::string app_param
 
static const std::string moose_base_param
 
static const std::string kokkos_object_param
 
static constexpr auto SYSTEM
 
static constexpr auto NAME
 

Protected Types

enum class  DepletionIDGenerationLevel { Pin , Assembly , Drum , Core }
 specify the depletion id is generated at which reactor generation level More...
 

Protected Member Functions

void generateFlexibleAssemblyBoundaries ()
 
void generateMetadata ()
 
unsigned int getElemIntegerFromMesh (MeshBase &input_mesh, std::string extra_int_name, bool should_exist=false)
 Initializes extra element integer from id name for a given mesh and throws an error if it should exist but cannot be found within the mesh.
 
void initializeReactorMeshParams (const std::string reactor_param_name)
 Initializes and checks validity of ReactorMeshParams mesh generator object.
 
void printReactorMetadata (const std::string geometry_type, const std::string mg_name, const bool first_function_call=true)
 Print metadata associated with ReactorGeometryMeshBuilder object.
 
void printCoreMetadata (const std::string mg_name, const bool first_function_call)
 Print core-level metadata associated with ReactorGeometryMeshBuilder object.
 
void printAssemblyMetadata (const std::string mg_name, const bool first_function_call)
 Print assembly-level metadata associated with ReactorGeometryMeshBuilder object.
 
void printPinMetadata (const std::string mg_name)
 Print pin-level metadata associated with ReactorGeometryMeshBuilder object.
 
void printGlobalReactorMetadata ()
 Print global ReactorMeshParams metadata associated with ReactorGeometryMeshBuilder object.
 
template<typename T >
void printMetadataToConsole (const std::string metadata_name, const std::string mg_name)
 Print metadata with provided name that can be found with given mesh generator name.
 
template<typename T >
void print2dMetadataToConsole (const std::string metadata_name, const std::string mg_name)
 Print metadata with data type std::vector<std::vector<T>> and provided name that can be found with given mesh generator name.
 
void freeReactorParamsMesh ()
 Releases the mesh obtained in _reactor_params_mesh.
 
void freeReactorParamsCSG ()
 Releases the CSG base object obtained in _reactor_params_csg.
 
template<typename T >
bool hasReactorParam (const std::string param_name)
 Checks whether parameter is defined in ReactorMeshParams metadata.
 
template<typename T >
const T & getReactorParam (const std::string &param_name)
 Returns reference of parameter in ReactorMeshParams object.
 
void updateElementBlockNameId (MeshBase &input_mesh, Elem *elem, std::map< std::string, SubdomainID > &name_id_map, std::string elem_block_name, SubdomainID &next_free_id)
 Updates the block names and ids of the element in an input mesh according to a map of block name to block ids.
 
MeshGeneratorName callExtrusionMeshSubgenerators (const MeshGeneratorName input_mesh_name)
 Calls mesh subgenerators related to extrusion, renaming of top / bottom boundaries, and defining plane IDs.
 
void addDepletionId (MeshBase &input_mesh, const MooseEnum &option, const DepletionIDGenerationLevel generation_level, const bool extrude)
 add depletion IDs
 
std::vector< std::reference_wrapper< const CSG::CSGSurface > > getAxialPlaneSurfaces (CSG::CSGBase &csg_obj, const bool skip_intermediate_plane_generation)
 Get CSGSurfaces corresponding to axial planes of the extruded RGMB mesh.
 
const CSG::CSGLattice & createRGMBLattice (const Real pitch, const std::vector< std::vector< std::reference_wrapper< const CSG::CSGUniverse > > > pattern, CSG::CSGBase &csg_obj)
 Create CSG lattice for assembly and core lattices.
 
bool checkInputVectorInAscendingOrder (const std::vector< Real > &input_vec)
 Check if input vector of Reals is defined in ascending order.
 
bool checkUndefinedLatticeRefs (const std::vector< std::vector< unsigned int > > &input_lattice, unsigned int num_inputs)
 Check if input lattice has values that are less than the number of input elements in lattice.
 
T & copyMeshProperty (const std::string &target_data_name, const std::string &source_data_name, const std::string &source_mesh)
 
T & copyMeshProperty (const std::string &source_data_name, const std::string &source_mesh)
 
std::unique_ptr< MeshBase > & getMesh (const std::string &param_name, const bool allow_invalid=false)
 
std::vector< std::unique_ptr< MeshBase > * > getMeshes (const std::string &param_name)
 
std::unique_ptr< MeshBase > & getMeshByName (const MeshGeneratorName &mesh_generator_name)
 
std::vector< std::unique_ptr< MeshBase > * > getMeshesByName (const std::vector< MeshGeneratorName > &mesh_generator_names)
 
std::unique_ptr< CSG::CSGBase > & getCSGBase (const std::string &param_name)
 
std::unique_ptr< CSG::CSGBase > & getCSGBaseByName (const MeshGeneratorName &mesh_generator_name)
 
std::vector< std::unique_ptr< CSG::CSGBase > * > getCSGBases (const std::string &param_name)
 
std::vector< std::unique_ptr< CSG::CSGBase > * > getCSGBasesByName (const std::vector< MeshGeneratorName > &mesh_generator_names)
 
void declareMeshForSub (const std::string &param_name)
 
void declareMeshesForSub (const std::string &param_name)
 
void declareMeshForSubByName (const MeshGeneratorName &mesh_generator_name)
 
void declareMeshesForSubByName (const std::vector< MeshGeneratorName > &mesh_generator_names)
 
std::unique_ptr< MeshBase > buildMeshBaseObject (unsigned int dim=libMesh::invalid_uint)
 
std::unique_ptr< ReplicatedMesh > buildReplicatedMesh (unsigned int dim=libMesh::invalid_uint)
 
std::unique_ptr< DistributedMesh > buildDistributedMesh (unsigned int dim=libMesh::invalid_uint)
 
void addMeshSubgenerator (const std::string &type, const std::string &name, Ts... extra_input_parameters)
 
void addMeshSubgenerator (const std::string &type, const std::string &name, InputParameters params)
 
void declareNullMeshName (const MeshGeneratorName &name)
 
void flagInvalidSolutionInternal (const InvalidSolutionID invalid_solution_id) const
 
InvalidSolutionID registerInvalidSolutionInternal (const std::string &message, const bool warning) const
 
const T & getMeshProperty (const std::string &data_name, const std::string &prefix)
 
const T & getMeshProperty (const std::string &data_name)
 
bool hasMeshProperty (const std::string &data_name, const std::string &prefix) const
 
bool hasMeshProperty (const std::string &data_name, const std::string &prefix) const
 
bool hasMeshProperty (const std::string &data_name) const
 
bool hasMeshProperty (const std::string &data_name) const
 
std::string meshPropertyName (const std::string &data_name) const
 
T & declareMeshProperty (const std::string &data_name, Args &&... args)
 
T & declareMeshProperty (const std::string &data_name, const T &data_value)
 
T & declareMeshProperty (const std::string &data_name, Args &&... args)
 
T & declareMeshProperty (const std::string &data_name, const T &data_value)
 
T & setMeshProperty (const std::string &data_name, Args &&... args)
 
T & setMeshProperty (const std::string &data_name, const T &data_value)
 
T & setMeshProperty (const std::string &data_name, Args &&... args)
 
T & setMeshProperty (const std::string &data_name, const T &data_value)
 

Static Protected Member Functions

static std::string meshPropertyName (const std::string &data_name, const std::string &prefix)
 

Protected Attributes

const subdomain_id_type _pin_type
 The id number for this pin type.
 
const Real _pitch
 The face-to-face size of this pin.
 
const unsigned int _num_sectors
 The number of azimuthal divisions.
 
std::vector< Real > _ring_radii
 The outer radii of concentric rings in the pin.
 
const std::vector< Real > _duct_halfpitch
 The inner apothem of any surrounding ducts in the pin.
 
std::vector< unsigned int > _intervals
 The number of mesh intervals in a radial division starting from the center.
 
std::vector< std::vector< subdomain_id_type > > _region_ids
 2-D vector (axial outer indexing, radial inner indexing) used to set "region_id" extra-element integer of the pin mesh elements
 
bool _has_block_names
 Whether block names have been provided by user.
 
std::vector< std::vector< std::string > > _block_names
 2-D vector (axial outer indexing, radial inner indexing) used to set block names of pin mesh elements
 
std::string _mesh_geometry
 The type of geometry that is being described (Square or Hex, declared in the ReactorMeshParams object)
 
unsigned int _mesh_dimensions
 The number of dimensions the mesh is ultimately going to have (2 or 3, declared in the ReactorMeshParams object)
 
const bool _extrude
 Whether this mesh should be extruded to 3-D, making it the final structure in the reactor mesh.
 
bool _quad_center
 Whether the centermost elements in the pin should be quad elements as opposed to tri elements.
 
bool _homogenized
 Whether the resulting pin mesh should be homogenized.
 
bool _is_assembly
 Whether the resulting pin mesh should also be used as an assembly mesh.
 
std::unique_ptr< MeshBase > * _build_mesh
 The final mesh that is generated by the subgenerators; This mesh is generated by the subgenerators with only element and boundary ids changed.
 
MeshGeneratorName _reactor_params
 The ReactorMeshParams object that is storing the reactor global information for this reactor geometry mesh.
 
MooseMesh *const _mesh
 
const bool & _enabled
 
MooseApp & _app
 
Factory & _factory
 
ActionFactory & _action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters & _pars
 
const Parallel::Communicator & _communicator
 

Private Member Functions

virtual std::string meshPropertyPrefix (const std::string &) const override final
 
void checkGetMesh (const MeshGeneratorName &mesh_generator_name, const std::string &param_name) const
 
const MeshGeneratorName * getMeshGeneratorNameFromParam (const std::string &param_name, const bool allow_invalid) const
 
const std::vector< MeshGeneratorName > & getMeshGeneratorNamesFromParam (const std::string &param_name) const
 
RestartableDataValue & setMeshPropertyHelper (const std::string &data_name)
 
const RestartableDataValue & getMeshPropertyInternal (const std::string &data_name, const std::string &prefix) const
 
void mooseErrorInternal (Args &&... args) const
 

Static Private Member Functions

static const hit::Node * getHitNode (const InputParameters &params)
 
static std::string messagePrefix (const InputParameters &params, const bool hit_prefix)
 

Private Attributes

std::unique_ptr< MeshBase > * _reactor_params_mesh
 The dummy param mesh that we need to clear once we've generated (in freeReactorMeshParams)
 
std::unique_ptr< CSG::CSGBase > * _reactor_params_csg
 
std::set< MeshGeneratorName > _requested_mesh_generators
 
std::set< MeshGeneratorName > _requested_mesh_generators_for_sub
 
std::vector< std::pair< std::string, std::unique_ptr< MeshBase > * > > _requested_meshes
 
std::vector< std::pair< std::string, std::unique_ptr< CSG::CSGBase > * > > _requested_csg_bases
 
std::unique_ptr< MeshBase > _null_mesh
 
std::unique_ptr< CSG::CSGBase > _null_csg_base
 
std::set< const MeshGenerator *, Comparator > _parent_mesh_generators
 
std::set< const MeshGenerator *, Comparator > _child_mesh_generators
 
std::set< const MeshGenerator *, Comparator > _sub_mesh_generators
 
std::set< std::string > _null_mesh_names
 
const std::string & _save_with_name
 
const bool _data_only
 
const ParallelParamObject & _parent
 
const MooseBase & _si_moose_base
 
const FEProblemBase * _si_problem
 
MooseApp & _meta_data_app
 
const MooseObject *const _meta_data_object
 

Detailed Description

Mesh generator for defining a reactor pin with background and duct regions, with the option to be 2-D or 3-D.

Definition at line 18 of file PinMeshGenerator.h.

Member Enumeration Documentation

◆ DepletionIDGenerationLevel

specify the depletion id is generated at which reactor generation level

Enumerator
Pin 
Assembly 
Drum 
Core 

Definition at line 267 of file ReactorGeometryMeshBuilderBase.h.

Constructor & Destructor Documentation

◆ PinMeshGenerator()

PinMeshGenerator::PinMeshGenerator ( const InputParameters &  parameters)

Definition at line 102 of file PinMeshGenerator.C.

104 _pin_type(getParam<subdomain_id_type>("pin_type")),
105 _pitch(getParam<Real>("pitch")),
106 _num_sectors(isParamValid("num_sectors") ? getParam<unsigned int>("num_sectors") : 0),
107 _ring_radii(isParamValid("ring_radii") ? getParam<std::vector<Real>>("ring_radii")
108 : std::vector<Real>()),
109 _duct_halfpitch(isParamValid("duct_halfpitch") ? getParam<std::vector<Real>>("duct_halfpitch")
110 : std::vector<Real>()),
111 _intervals(getParam<std::vector<unsigned int>>("mesh_intervals")),
112 _region_ids(isParamValid("region_ids")
113 ? getParam<std::vector<std::vector<subdomain_id_type>>>("region_ids")
114 : std::vector<std::vector<subdomain_id_type>>()),
115 _extrude(getParam<bool>("extrude")),
116 _quad_center(getParam<bool>("quad_center_elements")),
117 _homogenized(getParam<bool>("homogenized")),
118 _is_assembly(getParam<bool>("use_as_assembly"))
119{
120 // Initialize ReactorMeshParams object
121 initializeReactorMeshParams(getParam<MeshGeneratorName>("reactor_params"));
122
123 _mesh_dimensions = getReactorParam<unsigned int>(RGMB::mesh_dimensions);
124 _mesh_geometry = getReactorParam<std::string>(RGMB::mesh_geometry);
125
126 if (_is_assembly)
127 {
128 auto assembly_pitch = getReactorParam<Real>(RGMB::assembly_pitch);
129 if (assembly_pitch != _pitch)
130 mooseError("Pitch defined in PinMeshGenerator must match assembly_pitch defined in "
131 "ReactorMeshParams if use_as_assembly is set to true");
132 }
133
134 if (_extrude && _mesh_dimensions != 3)
135 paramError("extrude",
136 "In order to extrude this mesh, ReactorMeshParams/dim needs to be set to 3\n");
137 if (_extrude && (!hasReactorParam<boundary_id_type>(RGMB::top_boundary_id) ||
138 !hasReactorParam<boundary_id_type>(RGMB::bottom_boundary_id)))
139 mooseError("Both top_boundary_id and bottom_boundary_id must be provided in ReactorMeshParams "
140 "if using extruded geometry");
141
142 if (_homogenized)
143 {
144 if (_mesh_geometry == "Square")
145 mooseError("Homogenization in PinMeshGenerator is only supported for hexagonal geometries");
146 const std::vector<std::string> disallowed_parameters = {
147 "num_sectors", "ring_radii", "duct_halfpitch", "mesh_intervals"};
148 for (const auto & parameter : disallowed_parameters)
149 if (parameters.isParamSetByUser(parameter))
150 paramError(parameter,
151 "Parameter " + parameter + " should not be defined for a homogenized pin mesh");
152 }
153 else
154 {
155 if (_num_sectors == 0)
157 "Number of sectors must be assigned with parameter num_sectors for non-homogenized pins");
158 if (_intervals.size() != (_ring_radii.size() + _duct_halfpitch.size() + 1))
160 "The number of mesh intervals must be equal to the number of annular regions + the "
161 "number of duct regions + 1"
162 " for the region between the rings and ducts\n");
163 }
164
165 if (isParamValid("region_ids"))
166 {
167 unsigned int n_axial_levels =
168 (_mesh_dimensions == 3)
169 ? getReactorParam<std::vector<unsigned int>>(RGMB::axial_mesh_intervals).size()
170 : 1;
171 if (_region_ids.size() != n_axial_levels)
172 mooseError("The size of region IDs must be equal to the number of axial levels as defined in "
173 "the ReactorMeshParams object");
174 if (_region_ids[0].size() != (_ring_radii.size() + _duct_halfpitch.size() + 1))
175 mooseError("The number of region IDs given needs to be one more than the number of "
176 "ring_radii + the number of duct_radii\n");
177 }
178 else
179 {
180 mooseError("Region IDs must be assigned with parameter region_ids");
181 }
182 if (isParamValid("block_names"))
183 {
184 if (getReactorParam<bool>(RGMB::region_id_as_block_name))
185 paramError("block_names",
186 "If ReactorMeshParams/region_id_as_block_name is set, block_names should not be "
187 "specified in PinMeshGenerator");
188 _has_block_names = true;
189 _block_names = getParam<std::vector<std::vector<std::string>>>("block_names");
190 if (_region_ids.size() != _block_names.size())
191 mooseError("The size of block_names must match the size of region_ids");
192 for (const auto i : index_range(_region_ids))
193 if (_region_ids[i].size() != _block_names[i].size())
194 mooseError("The size of block_names must match the size of region_ids");
195 }
196 else
197 _has_block_names = false;
198
199 const auto use_flexible_stitching = getReactorParam<bool>(RGMB::flexible_assembly_stitching);
200 std::string build_mesh_name;
201
202 // No subgenerators will be called if option to bypass mesh generators is enabled
203 if (!getReactorParam<bool>(RGMB::bypass_meshgen))
204 {
205 if (_homogenized)
206 {
207 // If flexible assembly stitching is invoked and this is a homogeneous assembly mesh, do not
208 // call mesh subgenerators here. The homogeneous assembly mesh should be created entirely in
209 // generateFlexibleAssemblyBoundaries()
210 bool skip_assembly_generation = _is_assembly && use_flexible_stitching;
211
212 auto params = _app.getFactory().getValidParams("SimpleHexagonGenerator");
213
214 params.set<Real>("hexagon_size") = _pitch / 2.0;
215 params.set<boundary_id_type>("external_boundary_id") =
217 const auto boundary_name =
219 std::to_string(_pin_type);
220 params.set<BoundaryName>("external_boundary_name") = boundary_name;
221 params.set<std::vector<subdomain_id_type>>("block_id") = {
223 params.set<MooseEnum>("element_type") = _quad_center ? "QUAD" : "TRI";
224 auto block_name = RGMB::PIN_BLOCK_NAME_PREFIX + std::to_string(_pin_type) + "_R0";
225 if (!_quad_center)
226 block_name += RGMB::TRI_BLOCK_NAME_SUFFIX;
227 params.set<std::vector<SubdomainName>>("block_name") = {block_name};
228
229 if (!skip_assembly_generation)
230 {
231 build_mesh_name = name() + "_2D";
232 addMeshSubgenerator("SimpleHexagonGenerator", build_mesh_name, params);
233 }
234 }
235 else
236 {
237 // Define all id variables used in the pin
238 std::vector<unsigned int> ring_intervals;
239 std::vector<subdomain_id_type> ring_blk_ids;
240 std::vector<SubdomainName> ring_blk_names;
241 unsigned int background_intervals = 1;
242 std::vector<subdomain_id_type> background_blk_ids;
243 std::vector<SubdomainName> background_blk_names;
244 std::vector<unsigned int> duct_intervals;
245 std::vector<subdomain_id_type> duct_blk_ids;
246 std::vector<SubdomainName> duct_blk_names;
247
248 for (const auto i : index_range(_intervals))
249 {
250 const auto block_name =
251 RGMB::PIN_BLOCK_NAME_PREFIX + std::to_string(_pin_type) + "_R" + std::to_string(i);
252 const auto block_id = RGMB::PIN_BLOCK_ID_START + i;
253
254 if (i < _ring_radii.size())
255 {
256 ring_intervals.push_back(_intervals[i]);
257 ring_blk_ids.push_back(block_id);
258 ring_blk_names.push_back(block_name);
259 }
260 else if (i > _ring_radii.size())
261 {
262 duct_intervals.push_back(_intervals[i]);
263 duct_blk_ids.push_back(block_id);
264 duct_blk_names.push_back(block_name);
265 }
266 else
267 {
268 background_intervals = _intervals[i];
269 background_blk_ids.push_back(block_id);
270 background_blk_names.push_back(block_name);
271 }
272 }
273 if (ring_intervals.size() > 0)
274 {
275 if (ring_intervals.front() != 1)
276 {
277 // If quad center elements, copy element at beginning of block names and
278 // block ids. Otherwise add RGMB::TRI_BLOCK_NAME_SUFFIX to block names and generate new
279 // block id
280 if (_quad_center)
281 {
282 ring_blk_ids.insert(ring_blk_ids.begin(), ring_blk_ids.front());
283 ring_blk_names.insert(ring_blk_names.begin(), ring_blk_names.front());
284 }
285 else
286 {
287 const auto block_name = ring_blk_names.front() + RGMB::TRI_BLOCK_NAME_SUFFIX;
288 const auto block_id = RGMB::PIN_BLOCK_ID_TRI;
289 ring_blk_ids.insert(ring_blk_ids.begin(), block_id);
290 ring_blk_names.insert(ring_blk_names.begin(), block_name);
291 }
292 }
293 // Add RGMB::TRI_BLOCK_NAME_SUFFIX if only one radial region and tri center elements
294 else if (!_quad_center)
295 {
296 ring_blk_ids[0] = RGMB::PIN_BLOCK_ID_TRI;
297 ring_blk_names[0] += RGMB::TRI_BLOCK_NAME_SUFFIX;
298 }
299 }
300 else
301 {
302 if (background_intervals > 1)
303 {
304 // If quad center elements, copy element at beginning of block names and
305 // block ids. Otherwise add RGMB::TRI_BLOCK_NAME_SUFFIX to block names and generate new
306 // block id
307 if (_quad_center)
308 {
309 background_blk_ids.insert(background_blk_ids.begin(), background_blk_ids.front());
310 background_blk_names.insert(background_blk_names.begin(), background_blk_names.front());
311 }
312 else
313 {
314 const auto block_name = background_blk_names.front() + RGMB::TRI_BLOCK_NAME_SUFFIX;
315 const auto block_id = RGMB::PIN_BLOCK_ID_TRI;
316 background_blk_ids.insert(background_blk_ids.begin(), block_id);
317 background_blk_names.insert(background_blk_names.begin(), block_name);
318 }
319 }
320 // Add RGMB::TRI_BLOCK_NAME_SUFFIX if only one background region and tri center elements
321 // and no ring regions
322 else if (!_quad_center)
323 {
324 background_blk_ids[0] = RGMB::PIN_BLOCK_ID_TRI;
325 background_blk_names[0] += RGMB::TRI_BLOCK_NAME_SUFFIX;
326 }
327 }
328
329 // If flexible assembly stitching is invoked and this is an assembly mesh with only a
330 // background region, do not call mesh subgenerators here. This assembly mesh should be
331 // created entirely in generateFlexibleAssemblyBoundaries()
332 bool skip_assembly_generation =
333 _is_assembly && use_flexible_stitching && _intervals.size() == 1;
334
335 if (!skip_assembly_generation)
336 {
337 // Generate Cartesian/hex pin using PolygonConcentricCircleMeshGenerator
338 {
339 // Get and assign parameters for the main geometry feature of the Pin
340 // which is created with a PolygonConcentricCircleMeshGenerator subgenerator
341 auto params = _app.getFactory().getValidParams("PolygonConcentricCircleMeshGenerator");
342 params.set<bool>("preserve_volumes") = true;
343 params.set<bool>("quad_center_elements") = _quad_center;
344 params.set<MooseEnum>("polygon_size_style") = "apothem";
345 params.set<Real>("polygon_size") = _pitch / 2.0;
346 params.set<boundary_id_type>("external_boundary_id") =
348 const auto boundary_name = (_is_assembly ? RGMB::ASSEMBLY_BOUNDARY_NAME_PREFIX
350 std::to_string(_pin_type);
351 params.set<BoundaryName>("external_boundary_name") = boundary_name;
352 bool flat_side_up = (_mesh_geometry == "Square");
353 params.set<bool>("flat_side_up") = flat_side_up;
354 params.set<bool>("create_outward_interface_boundaries") = false;
355
356 const auto num_sides = (_mesh_geometry == "Square") ? 4 : 6;
357 params.set<unsigned int>("num_sides") = num_sides;
358 params.set<std::vector<unsigned int>>("num_sectors_per_side") =
359 std::vector<unsigned int>(num_sides, _num_sectors);
360
361 if (ring_intervals.size() > 0)
362 {
363 params.set<std::vector<Real>>("ring_radii") = _ring_radii;
364 params.set<std::vector<subdomain_id_type>>("ring_block_ids") = ring_blk_ids;
365 params.set<std::vector<SubdomainName>>("ring_block_names") = ring_blk_names;
366 params.set<std::vector<unsigned int>>("ring_intervals") = ring_intervals;
367 }
368
369 params.set<std::vector<subdomain_id_type>>("background_block_ids") = background_blk_ids;
370 params.set<std::vector<SubdomainName>>("background_block_names") = background_blk_names;
371 params.set<unsigned int>("background_intervals") = background_intervals;
372
373 if (duct_intervals.size() > 0)
374 {
375 params.set<MooseEnum>("duct_sizes_style") = "apothem";
376 params.set<std::vector<Real>>("duct_sizes") = _duct_halfpitch;
377 params.set<std::vector<subdomain_id_type>>("duct_block_ids") = duct_blk_ids;
378 params.set<std::vector<SubdomainName>>("duct_block_names") = duct_blk_names;
379 params.set<std::vector<unsigned int>>("duct_intervals") = duct_intervals;
380 }
381
382 addMeshSubgenerator("PolygonConcentricCircleMeshGenerator", name() + "_2D", params);
383 }
384
385 // Remove extra sidesets created by PolygonConcentricCircleMeshGenerator
386 {
387 auto params = _app.getFactory().getValidParams("BoundaryDeletionGenerator");
388
389 params.set<MeshGeneratorName>("input") = name() + "_2D";
390
391 auto num_sides = (_mesh_geometry == "Square") ? 4 : 6;
392 std::vector<BoundaryName> boundaries_to_delete = {};
393 for (const auto i : make_range(num_sides))
394 boundaries_to_delete.insert(boundaries_to_delete.end(),
395 {std::to_string(10001 + i), std::to_string(15001 + i)});
396 params.set<std::vector<BoundaryName>>("boundary_names") = boundaries_to_delete;
397
398 build_mesh_name = name() + "_delbds";
399 addMeshSubgenerator("BoundaryDeletionGenerator", build_mesh_name, params);
400 }
401 }
402 }
403
404 // For pin acting as assembly, modify outermost mesh interval to enable flexible assembly
405 // stitching
406 if (_is_assembly && use_flexible_stitching)
407 {
409 build_mesh_name = name() + "_fpg_delbds";
410 }
411
412 // Pass mesh meta-data defined in subgenerator constructor to this MeshGenerator
413 if (hasMeshProperty<Real>("pitch_meta", name() + "_2D"))
414 copyMeshProperty<Real>("pitch_meta", name() + "_2D");
415 if (hasMeshProperty<std::vector<unsigned int>>("num_sectors_per_side_meta", name() + "_2D"))
416 copyMeshProperty<std::vector<unsigned int>>("num_sectors_per_side_meta", name() + "_2D");
417 if (hasMeshProperty<Real>("max_radius_meta", name() + "_2D"))
418 copyMeshProperty<Real>("max_radius_meta", name() + "_2D");
419 if (hasMeshProperty<unsigned int>("background_intervals_meta", name() + "_2D"))
420 copyMeshProperty<unsigned int>("background_intervals_meta", name() + "_2D");
421 if (hasMeshProperty<dof_id_type>("node_id_background_meta", name() + "_2D"))
422 copyMeshProperty<dof_id_type>("node_id_background_meta", name() + "_2D");
423
424 if (_is_assembly)
425 declareMeshProperty("pattern_pitch_meta", getReactorParam<Real>(RGMB::assembly_pitch));
426 else if (hasMeshProperty<Real>("pattern_pitch_meta", name() + "_2D"))
427 copyMeshProperty<Real>("pattern_pitch_meta", name() + "_2D");
428 declareMeshProperty("is_control_drum_meta", false);
429
430 if (_extrude)
431 build_mesh_name = callExtrusionMeshSubgenerators(build_mesh_name);
432
433 // Store final mesh subgenerator
434 _build_mesh = &getMeshByName(build_mesh_name);
435 }
436 else
437 {
438 // Since subgenerators are not called, error checking on input parameters needs to happen here
439 if (_pitch > getReactorParam<Real>(RGMB::assembly_pitch))
440 paramError("pitch", "Pin pitch must not exceed assembly pitch defined in ReactorMeshParams");
441 auto has_radii = _ring_radii.size() > 0;
442 if (has_radii)
443 {
445 paramError("ring_radii", "This parameter must be strictly ascending.");
446 if (_ring_radii.back() > _pitch / 2.)
447 paramError("ring_radii", "Ring radii of pin must not exceed half the pin pitch");
448 }
449 auto has_ducts = _duct_halfpitch.size() > 0;
450 if (has_ducts)
451 {
453 paramError("duct_halfpitch", "This parameter must be strictly ascending.");
454 if (_duct_halfpitch.back() > _pitch / 2.)
455 paramError("duct_halfpitch", "Duct halfpitches of pin must not exceed half the pin pitch");
456 }
457 if (has_radii && has_ducts && (_ring_radii.back() > _duct_halfpitch.front()))
458 paramError("ring_radii", "Ring radii of pin must not exceed duct halfpitches of pin");
459 }
461}
void ErrorVector unsigned int
InputParameters getValidParams(const std::string &name) const
T & set(const std::string &name, bool quiet_mode=false)
void addMeshSubgenerator(const std::string &type, const std::string &name, Ts... extra_input_parameters)
std::unique_ptr< MeshBase > & getMeshByName(const MeshGeneratorName &mesh_generator_name)
T & declareMeshProperty(const std::string &data_name, Args &&... args)
bool hasMeshProperty(const std::string &data_name, const std::string &prefix) const
Factory & getFactory()
const InputParameters & parameters() const
const std::string & name() const
void paramError(const std::string &param, Args... args) const
bool isParamSetByUser(const std::string &name) const
void mooseError(Args &&... args) const
const T & getParam(const std::string &name) const
bool isParamValid(const std::string &name) const
MooseApp & _app
std::vector< unsigned int > _intervals
The number of mesh intervals in a radial division starting from the center.
const std::vector< Real > _duct_halfpitch
The inner apothem of any surrounding ducts in the pin.
bool _homogenized
Whether the resulting pin mesh should be homogenized.
unsigned int _mesh_dimensions
The number of dimensions the mesh is ultimately going to have (2 or 3, declared in the ReactorMeshPar...
void generateFlexibleAssemblyBoundaries()
const unsigned int _num_sectors
The number of azimuthal divisions.
std::vector< Real > _ring_radii
The outer radii of concentric rings in the pin.
bool _quad_center
Whether the centermost elements in the pin should be quad elements as opposed to tri elements.
std::unique_ptr< MeshBase > * _build_mesh
The final mesh that is generated by the subgenerators; This mesh is generated by the subgenerators wi...
const bool _extrude
Whether this mesh should be extruded to 3-D, making it the final structure in the reactor mesh.
bool _has_block_names
Whether block names have been provided by user.
std::vector< std::vector< subdomain_id_type > > _region_ids
2-D vector (axial outer indexing, radial inner indexing) used to set "region_id" extra-element intege...
const Real _pitch
The face-to-face size of this pin.
std::vector< std::vector< std::string > > _block_names
2-D vector (axial outer indexing, radial inner indexing) used to set block names of pin mesh elements
std::string _mesh_geometry
The type of geometry that is being described (Square or Hex, declared in the ReactorMeshParams object...
const subdomain_id_type _pin_type
The id number for this pin type.
bool _is_assembly
Whether the resulting pin mesh should also be used as an assembly mesh.
A base class that contains common members for Reactor Geometry Mesh Builder mesh generators.
const T & getReactorParam(const std::string &param_name)
Returns reference of parameter in ReactorMeshParams object.
void initializeReactorMeshParams(const std::string reactor_param_name)
Initializes and checks validity of ReactorMeshParams mesh generator object.
MeshGeneratorName callExtrusionMeshSubgenerators(const MeshGeneratorName input_mesh_name)
Calls mesh subgenerators related to extrusion, renaming of top / bottom boundaries,...
bool checkInputVectorInAscendingOrder(const std::vector< Real > &input_vec)
Check if input vector of Reals is defined in ascending order.
static const std::string bottom_boundary_id
const BoundaryName PIN_BOUNDARY_NAME_PREFIX
static const std::string bypass_meshgen
const subdomain_id_type PIN_BLOCK_ID_START
static const std::string top_boundary_id
const subdomain_id_type PIN_BLOCK_ID_TRI
const SubdomainName TRI_BLOCK_NAME_SUFFIX
const BoundaryName ASSEMBLY_BOUNDARY_NAME_PREFIX
static const std::string assembly_pitch
static const std::string mesh_dimensions
static constexpr boundary_id_type PIN_BOUNDARY_ID_START
static const std::string flexible_assembly_stitching
static const std::string region_id_as_block_name
static const std::string axial_mesh_intervals
static const std::string mesh_geometry
const SubdomainName PIN_BLOCK_NAME_PREFIX
auto index_range(const T &sizable)
int8_t boundary_id_type
if(subdm)
TestClass subdomain_id_type
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)

Member Function Documentation

◆ addDepletionId()

void ReactorGeometryMeshBuilderBase::addDepletionId ( MeshBase &  input_mesh,
const MooseEnum &  option,
const DepletionIDGenerationLevel  generation_level,
const bool  extrude 
)
protectedinherited

add depletion IDs

Parameters
input_meshinput mesh
optionoption for specifying level of details
generation_leveldepletion id is generated at which reactor generator level
extrudewhether input mesh is extruded, if false, assume that input mesh is defined in 2D and do not use 'plane_id` in depletion id generation

Definition at line 130 of file ReactorGeometryMeshBuilderBase.C.

134{
135 // prepare set of extra elem ids for depletion ID generation
136 std::vector<ExtraElementIDName> id_names = {};
137 if (extrude)
138 id_names.push_back("plane_id");
139 if (generation_level == DepletionIDGenerationLevel::Core)
140 {
141 if (option == "pin")
142 id_names.insert(id_names.end(), {"assembly_id", "pin_id"});
143 else if (option == "pin_type")
144 id_names.insert(id_names.end(), {"assembly_id", "pin_type_id"});
145 else if (option == "assembly")
146 id_names.push_back("assembly_id");
147 else if (option == "assembly_type")
148 id_names.push_back("assembly_type_id");
149 }
150 else if (generation_level == DepletionIDGenerationLevel::Assembly)
151 {
152 if (option == "pin")
153 id_names.push_back("pin_id");
154 else if (option == "pin_type")
155 id_names.push_back("pin_type_id");
156 else
157 paramError("depletion_id_type",
158 "'assembly_id' or 'assembly_type_id' is not allowed in depletion ID generation at "
159 "assembly level");
160 }
161 else if (generation_level == DepletionIDGenerationLevel::Drum)
162 {
163 if (option == "pin_type")
164 id_names.push_back("pin_type_id");
165 else
166 paramError("depletion_id_type",
167 "Only 'pin_type' is allowed in depletion ID generation at "
168 "drum level");
169 }
170 else if (generation_level == DepletionIDGenerationLevel::Pin)
171 mooseError("Depletion ID generation is not supported at pin level yet in RGMB");
172 id_names.push_back("region_id");
173 // no block restriction
174 std::set<SubdomainID> block_ids = {};
175 // create depletion IDs
176 // depletion IDs will be assigned in the following order:
177 // regions (materials) within pin -> pins in assembly -> assemblies in core -> axial planes
178 std::unordered_map<dof_id_type, dof_id_type> depl_ids =
179 MooseMeshUtils::getExtraIDUniqueCombinationMap(input_mesh, block_ids, id_names);
180 // assign depletion ids to elements
181 const auto depl_id_index = input_mesh.add_elem_integer("depletion_id");
182 for (Elem * const elem : input_mesh.active_element_ptr_range())
183 elem->set_extra_integer(depl_id_index, depl_ids.at(elem->id()));
184}
std::unordered_map< dof_id_type, dof_id_type > getExtraIDUniqueCombinationMap(const MeshBase &mesh, const std::set< SubdomainID > &block_ids, std::vector< ExtraElementIDName > extra_ids)

Referenced by AssemblyMeshGenerator::generate(), ControlDrumMeshGenerator::generate(), and CoreMeshGenerator::generate().

◆ addDepletionIDParams()

void ReactorGeometryMeshBuilderBase::addDepletionIDParams ( InputParameters &  parameters)
staticinherited

Definition at line 35 of file ReactorGeometryMeshBuilderBase.C.

36{
37 params.addParam<bool>(
38 "generate_depletion_id", false, "Determine wheter the depletion ID is assigned.");
39 MooseEnum depletion_id_option("assembly assembly_type pin pin_type");
40 params.addParam<MooseEnum>("depletion_id_type",
41 depletion_id_option,
42 "Determine level of details in depletion ID assignment.");
43 params.addParamNamesToGroup("generate_depletion_id depletion_id_type", "Depletion ID assignment");
44}

Referenced by AssemblyMeshGenerator::validParams(), ControlDrumMeshGenerator::validParams(), and CoreMeshGenerator::validParams().

◆ callExtrusionMeshSubgenerators()

MeshGeneratorName ReactorGeometryMeshBuilderBase::callExtrusionMeshSubgenerators ( const MeshGeneratorName  input_mesh_name)
protectedinherited

Calls mesh subgenerators related to extrusion, renaming of top / bottom boundaries, and defining plane IDs.

Parameters
input_mesh_namename of input 2D mesh generator to extrude
Returns
name of final output 3D mesh generator

Definition at line 187 of file ReactorGeometryMeshBuilderBase.C.

189{
190 std::vector<Real> axial_boundaries = getReactorParam<std::vector<Real>>(RGMB::axial_mesh_sizes);
191 const auto top_boundary = getReactorParam<boundary_id_type>(RGMB::top_boundary_id);
192 const auto bottom_boundary = getReactorParam<boundary_id_type>(RGMB::bottom_boundary_id);
193
194 {
195 auto params = _app.getFactory().getValidParams("AdvancedExtruderGenerator");
196
197 params.set<MeshGeneratorName>("input") = input_mesh_name;
198 params.set<Point>("direction") = Point(0, 0, 1);
199 params.set<std::vector<unsigned int>>("num_layers") =
200 getReactorParam<std::vector<unsigned int>>(RGMB::axial_mesh_intervals);
201 params.set<std::vector<Real>>("heights") = axial_boundaries;
202 params.set<BoundaryName>("bottom_boundary") = std::to_string(bottom_boundary);
203 params.set<BoundaryName>("top_boundary") = std::to_string(top_boundary);
204 addMeshSubgenerator("AdvancedExtruderGenerator", name() + "_extruded", params);
205 }
206
207 {
208 auto params = _app.getFactory().getValidParams("RenameBoundaryGenerator");
209
210 params.set<MeshGeneratorName>("input") = name() + "_extruded";
211 params.set<std::vector<BoundaryName>>("old_boundary") = {
212 std::to_string(top_boundary),
213 std::to_string(bottom_boundary)}; // hard coded boundary IDs in patterned mesh generator
214 params.set<std::vector<BoundaryName>>("new_boundary") = {"top", "bottom"};
215 addMeshSubgenerator("RenameBoundaryGenerator", name() + "_change_plane_name", params);
216 }
217
218 const MeshGeneratorName output_mesh_name = name() + "_extrudedIDs";
219 {
220 auto params = _app.getFactory().getValidParams("PlaneIDMeshGenerator");
221
222 params.set<MeshGeneratorName>("input") = name() + "_change_plane_name";
223
224 std::vector<Real> plane_heights{0};
225 for (Real z : axial_boundaries)
226 plane_heights.push_back(z + plane_heights.back());
227
228 params.set<std::vector<Real>>("plane_coordinates") = plane_heights;
229
230 std::string plane_id_name = "plane_id";
231 params.set<std::string>("id_name") = "plane_id";
232
233 addMeshSubgenerator("PlaneIDMeshGenerator", output_mesh_name, params);
234 }
235
236 return output_mesh_name;
237}
static const std::string axial_mesh_sizes

Referenced by AssemblyMeshGenerator::AssemblyMeshGenerator(), ControlDrumMeshGenerator::ControlDrumMeshGenerator(), CoreMeshGenerator::CoreMeshGenerator(), and PinMeshGenerator().

◆ checkInputVectorInAscendingOrder()

bool ReactorGeometryMeshBuilderBase::checkInputVectorInAscendingOrder ( const std::vector< Real > &  input_vec)
protectedinherited

Check if input vector of Reals is defined in ascending order.

Parameters
input_vecInput vector to check
Returns
true if vector is in ascending order, false otherwise

Definition at line 302 of file ReactorGeometryMeshBuilderBase.C.

304{
305 for (unsigned int i = 1; i < input_vec.size(); ++i)
306 if (input_vec[i] <= input_vec[i - 1])
307 return false;
308 return true;
309}

Referenced by AssemblyMeshGenerator::AssemblyMeshGenerator(), and PinMeshGenerator().

◆ checkUndefinedLatticeRefs()

bool ReactorGeometryMeshBuilderBase::checkUndefinedLatticeRefs ( const std::vector< std::vector< unsigned int > > &  input_lattice,
unsigned int  num_inputs 
)
protectedinherited

Check if input lattice has values that are less than the number of input elements in lattice.

Parameters
input_latticeInput lattice to check
num_inputsnumber of expected inputs in lattice. This sets the value that the lattice entries should all be less than
Returns
true if all elements in input_lattice have values less than num_inputs, false otherwise

Definition at line 312 of file ReactorGeometryMeshBuilderBase.C.

314{
315 for (const auto i : index_range(input_lattice))
316 for (const auto j : index_range(input_lattice[i]))
317 if (input_lattice[i][j] >= num_inputs)
318 return false;
319
320 return true;
321}
for(PetscInt i=0;i< nvars;++i)

Referenced by AssemblyMeshGenerator::AssemblyMeshGenerator(), and CoreMeshGenerator::CoreMeshGenerator().

◆ createRGMBLattice()

const CSG::CSGLattice & ReactorGeometryMeshBuilderBase::createRGMBLattice ( const Real  pitch,
const std::vector< std::vector< std::reference_wrapper< const CSG::CSGUniverse > > >  pattern,
CSG::CSGBase &  csg_obj 
)
protectedinherited

Create CSG lattice for assembly and core lattices.

This method does not set the outer universe of the lattice

Parameters
pitchlattice pitch
patternpattern of universes in the lattice
csg_objreference to CSGBase object

Definition at line 283 of file ReactorGeometryMeshBuilderBase.C.

287{
288 // Create lattice based on whether it is hexagonal or Cartesian
289 std::string lat_name = name() + "_lattice";
290 std::unique_ptr<CSG::CSGLattice> lat_ptr;
291 const auto mesh_geometry = getReactorParam<std::string>(RGMB::mesh_geometry);
292 if (mesh_geometry == "Square")
293 lat_ptr = std::make_unique<CSG::CSGCartesianLattice>(lat_name, pitch, pattern);
294 else // _geom_type == "Hex"
295 lat_ptr = std::make_unique<CSG::CSGHexagonalLattice>(lat_name, pitch, pattern);
296
297 auto & assembly_lattice = csg_obj.addLattice(std::move(lat_ptr));
298 return assembly_lattice;
299}
const LatticeType & addLattice(std::unique_ptr< LatticeType > lattice)

Referenced by AssemblyMeshGenerator::generateCSG(), and CoreMeshGenerator::generateCSG().

◆ freeReactorParamsCSG()

void ReactorGeometryMeshBuilderBase::freeReactorParamsCSG ( )
protectedinherited

Releases the CSG base object obtained in _reactor_params_csg.

This must be called in any object that derives from this one, because the MeshGenerator system requires that all meshes that are requested from the system are moved out of the MeshGenerator system and into the MeshGenerator that requests them. In our case, we move it into this MeshGenerator and then release (delete) it.

Definition at line 81 of file ReactorGeometryMeshBuilderBase.C.

82{
83 _reactor_params_csg->reset();
84}
std::unique_ptr< CSG::CSGBase > * _reactor_params_csg

Referenced by AssemblyMeshGenerator::generateCSG(), CoreMeshGenerator::generateCSG(), and generateCSG().

◆ freeReactorParamsMesh()

void ReactorGeometryMeshBuilderBase::freeReactorParamsMesh ( )
protectedinherited

Releases the mesh obtained in _reactor_params_mesh.

This must be called in any object that derives from this one, because the MeshGenerator system requires that all meshes that are requested from the system are moved out of the MeshGenerator system and into the MeshGenerator that requests them. In our case, we move it into this MeshGenerator and then release (delete) it.

Definition at line 75 of file ReactorGeometryMeshBuilderBase.C.

76{
77 _reactor_params_mesh->reset();
78}
std::unique_ptr< MeshBase > * _reactor_params_mesh
The dummy param mesh that we need to clear once we've generated (in freeReactorMeshParams)

Referenced by AssemblyMeshGenerator::generate(), ControlDrumMeshGenerator::generate(), CoreMeshGenerator::generate(), and generate().

◆ generate()

std::unique_ptr< MeshBase > PinMeshGenerator::generate ( )
overridevirtual

Implements MeshGenerator.

Definition at line 609 of file PinMeshGenerator.C.

610{
611 // Must be called to free the ReactorMeshParams mesh
613
614 // If bypass_mesh is true, return a null mesh. In this mode, an output mesh is not
615 // generated and only metadata is defined on the generator, so logic related to
616 // generation of output mesh will not be called
617 if (getReactorParam<bool>(RGMB::bypass_meshgen))
618 {
619 auto null_mesh = nullptr;
620 return null_mesh;
621 }
622
623 // Update metadata at this point since values for these metadata only get set by PCCMG
624 // at generate() stage
625 if (hasMeshProperty<Real>("max_radius_meta", name() + "_2D"))
626 {
627 const auto max_radius_meta = getMeshProperty<Real>("max_radius_meta", name() + "_2D");
628 setMeshProperty("max_radius_meta", max_radius_meta);
629 }
630 if (hasMeshProperty<unsigned int>("background_intervals_meta", name() + "_2D"))
631 {
632 const auto background_intervals_meta =
633 getMeshProperty<unsigned int>("background_intervals_meta", name() + "_2D");
634 setMeshProperty("background_intervals_meta", background_intervals_meta);
635 }
636 if (hasMeshProperty<dof_id_type>("node_id_background_meta", name() + "_2D"))
637 {
638 const auto node_id_background_meta =
639 getMeshProperty<dof_id_type>("node_id_background_meta", name() + "_2D");
640 setMeshProperty("node_id_background_meta", node_id_background_meta);
641 }
642
643 // This generate() method will be called once the subgenerators that we depend on
644 // have been called. This is where we reassign subdomain ids/names according to what
645 // the user has provided, and also where we set region_id, pin_type_id, and radial_id
646 // extra element integers
647
648 // Add region id, pin type id, and radial id to the mesh as element integers
649 std::string region_id_name = "region_id";
650 std::string pin_type_id_name = "pin_type_id";
651 std::string assembly_type_id_name = "assembly_type_id";
652 std::string plane_id_name = "plane_id";
653 std::string radial_id_name = "radial_id";
654 const std::string default_block_name =
656 std::to_string(_pin_type);
657
658 auto region_id_int = getElemIntegerFromMesh(*(*_build_mesh), region_id_name);
659 auto radial_id_int = getElemIntegerFromMesh(*(*_build_mesh), radial_id_name);
660 auto pin_type_id_int = getElemIntegerFromMesh(*(*_build_mesh), pin_type_id_name);
661 unsigned int plane_id_int = 0;
662 unsigned int assembly_type_id_int = 0;
663 if (_extrude)
664 plane_id_int = getElemIntegerFromMesh(*(*_build_mesh), plane_id_name, true);
665 if (_is_assembly)
666 assembly_type_id_int = getElemIntegerFromMesh(*(*_build_mesh), assembly_type_id_name);
667
668 // Get next free block ID in mesh in case subdomain ids need to be remapped
669 auto next_block_id = MooseMeshUtils::getNextFreeSubdomainID(*(*(_build_mesh)));
670 std::map<std::string, SubdomainID> rgmb_name_id_map;
671
672 // Loop through all elements and set regions ids, pin type id, and radial idx.
673 // These element integers are also used to infer the block name for the region,
674 // and block IDs/names will be reassigned on the pin mesh if necessary
675 for (auto & elem : (*_build_mesh)->active_element_ptr_range())
676 {
677 const auto base_block_id = elem->subdomain_id();
678 const auto base_block_name = (*_build_mesh)->subdomain_name(base_block_id);
679
680 // Check if block name has correct prefix
681 std::string prefix = RGMB::PIN_BLOCK_NAME_PREFIX + std::to_string(_pin_type) + "_R";
682 if (!(base_block_name.find(prefix, 0) == 0))
683 continue;
684 // Radial index is integer value of substring after prefix
685 std::string radial_str = base_block_name.substr(prefix.length());
686
687 // Filter out RGMB::TRI_BLOCK_NAME_SUFFIX if needed
688 const std::string suffix = RGMB::TRI_BLOCK_NAME_SUFFIX;
689 const std::size_t found = radial_str.find(suffix);
690 if (found != std::string::npos)
691 radial_str.replace(found, suffix.length(), "");
692 const unsigned int radial_idx = std::stoi(radial_str);
693
694 // Region id is inferred from z_id and radial_idx
695 dof_id_type z_id = _extrude ? elem->get_extra_integer(plane_id_int) : 0;
696 const subdomain_id_type elem_region_id = _region_ids[std::size_t(z_id)][radial_idx];
697
698 // Set element integers
699 elem->set_extra_integer(region_id_int, elem_region_id);
700 elem->set_extra_integer(pin_type_id_int, _pin_type);
701 elem->set_extra_integer(radial_id_int, radial_idx);
702 if (_is_assembly)
703 elem->set_extra_integer(assembly_type_id_int, _pin_type);
704
705 // Set element block name and block id
706 auto elem_block_name = default_block_name;
708 elem_block_name += "_" + _block_names[std::size_t(z_id)][radial_idx];
709 else if (getReactorParam<bool>(RGMB::region_id_as_block_name))
710 elem_block_name += "_REG" + std::to_string(elem_region_id);
711 if (elem->type() == TRI3 || elem->type() == PRISM6)
712 elem_block_name += RGMB::TRI_BLOCK_NAME_SUFFIX;
714 *(*_build_mesh), elem, rgmb_name_id_map, elem_block_name, next_block_id);
715 }
716
717 // Mark mesh as not prepared, as block IDs were re-assigned in this method
718 (*_build_mesh)->unset_is_prepared();
719
720 return std::move(*_build_mesh);
721}
T & setMeshProperty(const std::string &data_name, Args &&... args)
void freeReactorParamsMesh()
Releases the mesh obtained in _reactor_params_mesh.
void updateElementBlockNameId(MeshBase &input_mesh, Elem *elem, std::map< std::string, SubdomainID > &name_id_map, std::string elem_block_name, SubdomainID &next_free_id)
Updates the block names and ids of the element in an input mesh according to a map of block name to b...
unsigned int getElemIntegerFromMesh(MeshBase &input_mesh, std::string extra_int_name, bool should_exist=false)
Initializes extra element integer from id name for a given mesh and throws an error if it should exis...
SubdomainID getNextFreeSubdomainID(MeshBase &input_mesh)
const SubdomainName ASSEMBLY_BLOCK_NAME_PREFIX
uint8_t dof_id_type

◆ generateCSG()

std::unique_ptr< CSG::CSGBase > PinMeshGenerator::generateCSG ( )
overridevirtual

Reimplemented from MeshGenerator.

Definition at line 724 of file PinMeshGenerator.C.

725{
726 // Must be called to free the ReactorMeshParams CSGBase object
728
729 auto csg_obj = std::make_unique<CSG::CSGBase>();
730
731 // Convert region IDs to actual region names that will be stored as material fills.
732 std::vector<std::vector<std::string>> region_names(_region_ids.size());
733 for (const auto i : index_range(_region_ids))
734 {
735 region_names[i].resize(_region_ids[i].size());
736 for (const auto j : index_range(_region_ids[i]))
737 region_names[i][j] = "rgmb_region_" + std::to_string(_region_ids[i][j]);
738 }
739
740 std::vector<Real> axial_plane_levels;
741 std::vector<std::string> axial_plane_names;
742 Real top_axial_level = 0.;
743 if (_mesh_dimensions == 3)
744 {
745 auto axial_boundaries = getReactorParam<std::vector<Real>>(RGMB::axial_mesh_sizes);
746 for (const auto i : make_range(axial_boundaries.size()))
747 {
748 top_axial_level += axial_boundaries[i];
749 // Top and bottom axial planes should be removed for the construction of
750 // DuctedPinEngUnit, as this unit creates an infinite universe axially
751 if (i != axial_boundaries.size() - 1)
752 {
753 axial_plane_levels.push_back(top_axial_level);
754 axial_plane_names.push_back(RGMB::CSG_AXIAL_PLANE_PREFIX + std::to_string(i));
755 }
756 }
757 }
758
759 // Define ducted pin engineering unit and add it to CSGBase
760 std::unique_ptr<CSG::DuctedPinEngUnit> pin_ptr =
761 std::make_unique<CSG::DuctedPinEngUnit>(name() + "_ducted_pin_unit",
765 region_names,
766 axial_plane_levels,
767 axial_plane_names);
768 auto & pin_unit = csg_obj->addEngUnit(std::move(pin_ptr));
769
770 // Define radial and axial extent of pin to constrain the universe created by DuctedPinEngUnit
771 const auto unit_name = _name + "_radial_boundary";
772 const auto n_sides = (_mesh_geometry == "Hex") ? 6 : 4;
773 std::unique_ptr<CSG::CSGNPolygonUnit> radial_boundary_ptr =
774 std::make_unique<CSG::CSGNPolygonUnit>(unit_name, n_sides, _pitch / 2.);
775 auto & radial_boundary_unit = csg_obj->addEngUnit(std::move(radial_boundary_ptr));
776 auto pin_region = -radial_boundary_unit;
777 if (_mesh_dimensions == 3)
778 {
779 const auto bottom_surf_name = RGMB::CSG_AXIAL_PLANE_PREFIX + "bottom_boundary";
780 std::unique_ptr<CSG::CSGSurface> bottom_surf_ptr =
781 std::make_unique<CSG::CSGPlane>(bottom_surf_name, 0, 0, 1, 0.);
782 const auto & bottom_plane_surf = csg_obj->addSurface(std::move(bottom_surf_ptr));
783
784 const auto top_surf_name = RGMB::CSG_AXIAL_PLANE_PREFIX + "top_boundary";
785 std::unique_ptr<CSG::CSGSurface> top_surf_ptr =
786 std::make_unique<CSG::CSGPlane>(top_surf_name, 0, 0, 1, top_axial_level);
787 const auto & top_plane_surf = csg_obj->addSurface(std::move(top_surf_ptr));
788
789 auto axial_region = +bottom_plane_surf & -top_plane_surf;
790 pin_region &= axial_region;
791 }
792
793 // Create cell that constrains DuctedPinEngUnit based on the outer boundary
794 // of the pin
795 csg_obj->createCell(_name + "_root_cell", pin_unit, pin_region);
796
797 if (getReactorParam<bool>(RGMB::expand_units))
798 csg_obj->expandAllEngUnits();
799
800 return csg_obj;
801}
const std::string & _name
void freeReactorParamsCSG()
Releases the CSG base object obtained in _reactor_params_csg.
static const std::string expand_units
static const std::string CSG_AXIAL_PLANE_PREFIX

◆ generateData()

void ReactorGeometryMeshBuilderBase::generateData ( )
inlineoverridevirtualinherited

Reimplemented from MeshGenerator.

Definition at line 123 of file ReactorGeometryMeshBuilderBase.h.

123{};

◆ generateFlexibleAssemblyBoundaries()

void PinMeshGenerator::generateFlexibleAssemblyBoundaries ( )
protected

Definition at line 464 of file PinMeshGenerator.C.

465{
466 SubdomainName outermost_block_name;
467 bool has_single_mesh_interval;
468
469 // Assemblies that invoke this method are either homogenized or have a single pin. First check if
470 // the assembly only has a single region. Otherwise, determine the outermost region for deletion
471 if (_homogenized || (_intervals.size() == 1))
472 {
473 outermost_block_name = RGMB::PIN_BLOCK_NAME_PREFIX + std::to_string(_pin_type) + "_R0";
474 has_single_mesh_interval = true;
475 }
476 else
477 {
478 outermost_block_name = RGMB::PIN_BLOCK_NAME_PREFIX + std::to_string(_pin_type) + "_R" +
479 std::to_string(_intervals.size() - 1);
480 has_single_mesh_interval = false;
481
482 // Invoke BlockDeletionGenerator to delete outermost mesh interval of assembly
483 auto params = _app.getFactory().getValidParams("BlockDeletionGenerator");
484
485 params.set<std::vector<SubdomainName>>("block") = {outermost_block_name};
486 params.set<MeshGeneratorName>("input") = _homogenized ? name() + "_2D" : name() + "_delbds";
487
488 addMeshSubgenerator("BlockDeletionGenerator", name() + "_del_outer", params);
489 }
490
491 {
492 // Invoke FlexiblePatternGenerator to triangulate deleted mesh interval
493 auto params = _app.getFactory().getValidParams("FlexiblePatternGenerator");
494
495 if (has_single_mesh_interval)
496 params.set<std::vector<MeshGeneratorName>>("inputs") = {};
497 else
498 {
499 params.set<std::vector<MeshGeneratorName>>("inputs") = {name() + "_del_outer"};
500 params.set<std::vector<libMesh::Point>>("extra_positions") = {libMesh::Point(0, 0, 0)};
501 params.set<std::vector<unsigned int>>("extra_positions_mg_indices") = {0};
502 }
503 params.set<bool>("use_auto_area_func") = true;
504 params.set<bool>("verify_holes") = false;
505 params.set<MooseEnum>("boundary_type") = (_mesh_geometry == "Hex") ? "HEXAGON" : "CARTESIAN";
506 params.set<unsigned int>("boundary_sectors") =
507 getReactorParam<unsigned int>(RGMB::num_sectors_flexible_stitching);
508 params.set<Real>("boundary_size") = getReactorParam<Real>(RGMB::assembly_pitch);
509 params.set<boundary_id_type>("external_boundary_id") = RGMB::PIN_BOUNDARY_ID_START + _pin_type;
510 params.set<BoundaryName>("external_boundary_name") =
512 params.set<SubdomainName>("background_subdomain_name") =
513 outermost_block_name + RGMB::TRI_BLOCK_NAME_SUFFIX;
514 params.set<unsigned short>("background_subdomain_id") = RGMB::PIN_BLOCK_ID_TRI_FLEXIBLE;
515
516 addMeshSubgenerator("FlexiblePatternGenerator", name() + "_fpg", params);
517 }
518 {
519 // Delete extra boundary created by FlexiblePatternGenerator
520 auto params = _app.getFactory().getValidParams("BoundaryDeletionGenerator");
521
522 params.set<MeshGeneratorName>("input") = name() + "_fpg";
523 std::vector<BoundaryName> boundaries_to_delete = {};
524 if (!has_single_mesh_interval)
525 boundaries_to_delete.push_back(std::to_string(1));
526 params.set<std::vector<BoundaryName>>("boundary_names") = boundaries_to_delete;
527
528 addMeshSubgenerator("BoundaryDeletionGenerator", name() + "_fpg_delbds", params);
529 }
530}
const subdomain_id_type PIN_BLOCK_ID_TRI_FLEXIBLE
static const std::string num_sectors_flexible_stitching

Referenced by PinMeshGenerator().

◆ generateMetadata()

void PinMeshGenerator::generateMetadata ( )
protected

Definition at line 533 of file PinMeshGenerator.C.

534{
535 // Store pin region ids and block names for id swap after extrusion if needed
536 // by future mesh generators
537 std::map<subdomain_id_type, std::vector<std::vector<subdomain_id_type>>> region_id_map{
539
540 // Declare mesh properties that need to be moved up to the assembly level
541 if (_is_assembly)
542 {
544 declareMeshProperty(RGMB::background_block_name, std::vector<std::string>());
545 declareMeshProperty(RGMB::duct_block_names, std::vector<std::vector<std::string>>());
548 // Following metadata is only relevant if an output mesh is generated by RGMB
549 // because it pertains to region & block ids of elements in the output mesh
550 if (!getReactorParam<bool>(RGMB::bypass_meshgen))
551 {
552 std::map<subdomain_id_type, std::vector<std::vector<subdomain_id_type>>> pin_region_id_map;
553 pin_region_id_map.insert(
554 std::pair<subdomain_id_type, std::vector<std::vector<subdomain_id_type>>>(
555 region_id_map.begin()->first, region_id_map.begin()->second));
557 std::map<subdomain_id_type, std::vector<std::vector<std::string>>> pin_block_name_map;
558 pin_block_name_map.insert(std::pair<subdomain_id_type, std::vector<std::vector<std::string>>>(
561 }
562 }
563 // Declare mesh properties that are only relevant to pin meshes
564 else
565 {
569 }
570
571 // Set metadata to describe pin attributes
577
578 unsigned int n_axial_levels =
579 (_mesh_dimensions == 3)
580 ? getReactorParam<std::vector<unsigned int>>(RGMB::axial_mesh_intervals).size()
581 : 1;
582 std::vector<std::vector<subdomain_id_type>> ring_region_ids(
583 n_axial_levels, std::vector<subdomain_id_type>(_ring_radii.size()));
584 std::vector<std::vector<subdomain_id_type>> duct_region_ids(
585 n_axial_levels, std::vector<subdomain_id_type>(_duct_halfpitch.size()));
586 std::vector<subdomain_id_type> background_region_ids(n_axial_levels);
587
588 for (const auto axial_idx : make_range(n_axial_levels))
589 {
590 for (const auto ring_idx : index_range(_ring_radii))
591 ring_region_ids[axial_idx][ring_idx] = _region_ids[axial_idx][ring_idx];
592
593 background_region_ids[axial_idx] = _region_ids[axial_idx][_ring_radii.size()];
594
595 for (unsigned int duct_idx = _ring_radii.size() + 1;
596 duct_idx < _duct_halfpitch.size() + _ring_radii.size() + 1;
597 ++duct_idx)
598 duct_region_ids[axial_idx][duct_idx - _ring_radii.size() - 1] =
599 _region_ids[axial_idx][duct_idx];
600 }
601
602 // Define mesh properties related to region ids
604 declareMeshProperty(RGMB::background_region_id, background_region_ids);
606}
static const std::string is_single_pin
static const std::string pin_region_id_map
static const std::string is_control_drum
static const std::string ring_radii
static const std::string assembly_type
static const std::string pin_block_name_map
static const std::string duct_block_names
static const std::string duct_halfpitches
static const std::string duct_region_ids
static const std::string pin_region_ids
static const std::string extruded
static const std::string background_region_id
static const std::string ring_region_ids
static const std::string is_homogenized
static const std::string background_block_name
static const std::string pitch
static const std::string pin_block_names
static const std::string pin_type

Referenced by PinMeshGenerator().

◆ getAxialPlaneSurfaces()

std::vector< std::reference_wrapper< const CSG::CSGSurface > > ReactorGeometryMeshBuilderBase::getAxialPlaneSurfaces ( CSG::CSGBase &  csg_obj,
const bool  skip_intermediate_plane_generation 
)
protectedinherited

Get CSGSurfaces corresponding to axial planes of the extruded RGMB mesh.

Parameters
csg_objReference to CSGBase object for retrieving axial plane surfaces
skip_intermediate_plane_generationSkip generation of intermediate axial planes if they don't exist.
Returns
vector of surfaces that correspond to axial planes of extruded RGMB mesh
Note
This method will always generate the top and bottom axial surfaces if they do not exist in the CSGBase instance

Definition at line 240 of file ReactorGeometryMeshBuilderBase.C.

242{
243 std::vector<std::string> axial_surf_names;
244 std::vector<std::reference_wrapper<const CSG::CSGSurface>> surfaces_by_axial_region;
245
246 // Add bottom boundary surface
247 const auto bottom_surf_name = RGMB::CSG_AXIAL_PLANE_PREFIX + "bottom_boundary";
248 axial_surf_names.push_back(bottom_surf_name);
249
250 // Add intermediate surfaces
251 auto axial_boundaries = getReactorParam<std::vector<Real>>(RGMB::axial_mesh_sizes);
252 unsigned int n_intermediate_surfs = axial_boundaries.size() - 1;
253 for (const auto i : make_range(n_intermediate_surfs))
254 axial_surf_names.push_back(RGMB::CSG_AXIAL_PLANE_PREFIX + std::to_string(i));
255
256 // Add top boundary surface
257 const auto top_surf_name = RGMB::CSG_AXIAL_PLANE_PREFIX + "top_boundary";
258 axial_surf_names.push_back(top_surf_name);
259
260 // Check if axial planes have been defined in CSGBase and add it to surfaces_by_axial_region
261 Real axial_level = 0.;
262 for (const auto i : index_range(axial_surf_names))
263 {
264 const auto & surf_name = axial_surf_names[i];
265 axial_level += (i != 0) ? axial_boundaries[i - 1] : 0.;
266 if (csg_obj.hasSurface(surf_name))
267 // Surface exists in CSGBase, retrieve from object
268 surfaces_by_axial_region.push_back(csg_obj.getSurfaceByName(surf_name));
269 else if (!skip_intermediate_plane_generation || i == 0 || i == axial_surf_names.size() - 1)
270 {
271 // Surface has not been defined, create it and add to CSGBase
272 std::unique_ptr<CSG::CSGSurface> plane_surf_ptr =
273 std::make_unique<CSG::CSGPlane>(surf_name, 0, 0, 1, axial_level);
274 const auto & plane_surf = csg_obj.addSurface(std::move(plane_surf_ptr));
275 surfaces_by_axial_region.push_back(plane_surf);
276 }
277 }
278
279 return surfaces_by_axial_region;
280}
const CSGSurface & getSurfaceByName(const std::string &name) const
const CSGSurface & addSurface(std::unique_ptr< CSGSurface > surf)
bool hasSurface(const std::string &name) const

Referenced by AssemblyMeshGenerator::generateCSG(), and CoreMeshGenerator::generateCSG().

◆ getElemIntegerFromMesh()

unsigned int ReactorGeometryMeshBuilderBase::getElemIntegerFromMesh ( MeshBase &  input_mesh,
std::string  extra_int_name,
bool  should_exist = false 
)
protectedinherited

Initializes extra element integer from id name for a given mesh and throws an error if it should exist but cannot be found within the mesh.

Parameters
input_meshinput mesh
extra_int_nameextra element id name
should_existwhether extra element integer should already exist in mesh
Returns
extra element integer

Definition at line 87 of file ReactorGeometryMeshBuilderBase.C.

90{
91 if (input_mesh.has_elem_integer(extra_int_name))
92 return input_mesh.get_elem_integer_index(extra_int_name);
93 else
94 {
95 if (should_exist)
96 mooseError("Expected extruded mesh to have " + extra_int_name + " extra integers");
97 else
98 return input_mesh.add_elem_integer(extra_int_name);
99 }
100}

Referenced by AssemblyMeshGenerator::generate(), ControlDrumMeshGenerator::generate(), CoreMeshGenerator::generate(), and generate().

◆ getReactorParam()

template<typename T >
const T & ReactorGeometryMeshBuilderBase::getReactorParam ( const std::string &  param_name)
protectedinherited

Returns reference of parameter in ReactorMeshParams object.

Template Parameters
Tdatatype of metadata value associated with metadata name
Parameters
param_namename of ReactorMeshParams parameter
Returns
reference to parameter defined in ReactorMeshParams metadata

Definition at line 347 of file ReactorGeometryMeshBuilderBase.h.

348{
349 return getMeshProperty<T>(param_name, _reactor_params);
350}
MeshGeneratorName _reactor_params
The ReactorMeshParams object that is storing the reactor global information for this reactor geometry...

Referenced by AssemblyMeshGenerator::AssemblyMeshGenerator(), ReactorGeometryMeshBuilderBase::callExtrusionMeshSubgenerators(), ControlDrumMeshGenerator::ControlDrumMeshGenerator(), generateMetadata(), and PinMeshGenerator().

◆ hasReactorParam()

template<typename T >
bool ReactorGeometryMeshBuilderBase::hasReactorParam ( const std::string  param_name)
protectedinherited

Checks whether parameter is defined in ReactorMeshParams metadata.

Template Parameters
Tdatatype of metadata value associated with metadata name
Parameters
param_namename of ReactorMeshParams parameter
Returns
whether parameter is defined in ReactorMeshParams metadata

Definition at line 340 of file ReactorGeometryMeshBuilderBase.h.

341{
342 return hasMeshProperty<T>(param_name, _reactor_params);
343}

◆ initializeReactorMeshParams()

void ReactorGeometryMeshBuilderBase::initializeReactorMeshParams ( const std::string  reactor_param_name)
protectedinherited

Initializes and checks validity of ReactorMeshParams mesh generator object.

Parameters
reactor_param_namename of ReactorMeshParams mesh generator

Definition at line 52 of file ReactorGeometryMeshBuilderBase.C.

53{
54 _reactor_params = reactor_param_name;
55
56 // Ensure that the user has supplied a valid ReactorMeshParams object
57 _reactor_params_mesh = &getMeshByName(reactor_param_name);
59 mooseError("The reactor_params mesh is not of the correct type");
60
61 if (!hasMeshProperty<unsigned int>("mesh_dimensions", _reactor_params) ||
62 !hasMeshProperty<std::string>("mesh_geometry", _reactor_params))
63 mooseError("The reactor_params input must be a ReactorMeshParams type MeshGenerator\n Please "
64 "check that a valid definition and name of ReactorMeshParams has been provided.");
65
66 // Set reactor_params_name metadata for use by future mesh generators
67 declareMeshProperty("reactor_params_name", std::string(_reactor_params));
68
69 // Store CSGBase object if we are in CSG only mode
72}
bool getCSGOnly() const
std::unique_ptr< CSG::CSGBase > & getCSGBaseByName(const MeshGeneratorName &mesh_generator_name)
MeshGeneratorSystem & getMeshGeneratorSystem()

Referenced by AssemblyMeshGenerator::AssemblyMeshGenerator(), ControlDrumMeshGenerator::ControlDrumMeshGenerator(), CoreMeshGenerator::CoreMeshGenerator(), and PinMeshGenerator().

◆ print2dMetadataToConsole()

template<typename T >
void ReactorGeometryMeshBuilderBase::print2dMetadataToConsole ( const std::string  metadata_name,
const std::string  mg_name 
)
protectedinherited

Print metadata with data type std::vector<std::vector<T>> and provided name that can be found with given mesh generator name.

Template Parameters
Tdatatype of elements in 2-D vector to output
Parameters
metadata_nameName of metadata to output
mg_nameName of mesh generator that stores metadata

◆ printAssemblyMetadata()

void ReactorGeometryMeshBuilderBase::printAssemblyMetadata ( const std::string  mg_name,
const bool  first_function_call 
)
protectedinherited

Print assembly-level metadata associated with ReactorGeometryMeshBuilder object.

Parameters
mg_namename of mesh generator associated with assembly
whetherthis is the original function call, which will trigger additional output messages

◆ printCoreMetadata()

void ReactorGeometryMeshBuilderBase::printCoreMetadata ( const std::string  mg_name,
const bool  first_function_call 
)
protectedinherited

Print core-level metadata associated with ReactorGeometryMeshBuilder object.

Parameters
mg_namename of mesh generator associated with core
first_function_callwhether this is the original function call, which will trigger additional output messages

◆ printGlobalReactorMetadata()

void ReactorGeometryMeshBuilderBase::printGlobalReactorMetadata ( )
protectedinherited

Print global ReactorMeshParams metadata associated with ReactorGeometryMeshBuilder object.

◆ printMetadataToConsole()

template<typename T >
void ReactorGeometryMeshBuilderBase::printMetadataToConsole ( const std::string  metadata_name,
const std::string  mg_name 
)
protectedinherited

Print metadata with provided name that can be found with given mesh generator name.

Template Parameters
Tdatatype of metadata value to output
Parameters
metadata_nameName of metadata to output
mg_nameName of mesh generator that stores metadata

◆ printPinMetadata()

void ReactorGeometryMeshBuilderBase::printPinMetadata ( const std::string  mg_name)
protectedinherited

Print pin-level metadata associated with ReactorGeometryMeshBuilder object.

Parameters
mg_namename of mesh generator associated with assembly

◆ printReactorMetadata()

void ReactorGeometryMeshBuilderBase::printReactorMetadata ( const std::string  geometry_type,
const std::string  mg_name,
const bool  first_function_call = true 
)
protectedinherited

Print metadata associated with ReactorGeometryMeshBuilder object.

Parameters
geometry_typetype of geometry (pin / assembly / core) under consideration
mg_namename of mesh generator associated with this object
first_function_callwhether this is the original function call, which will trigger additional output messages

◆ updateElementBlockNameId()

void ReactorGeometryMeshBuilderBase::updateElementBlockNameId ( MeshBase &  input_mesh,
Elem *  elem,
std::map< std::string, SubdomainID > &  name_id_map,
std::string  elem_block_name,
SubdomainID &  next_free_id 
)
protectedinherited

Updates the block names and ids of the element in an input mesh according to a map of block name to block ids.

Updates the map if the block name is not in the map

Parameters
input_nameinput mesh
elemiterator to mesh element
name_id_mapmap of name-id pairs used in mesh
elem_block_nameblock name to set for element
next_free_idnext free block id to use if block name does not exist in map

Definition at line 103 of file ReactorGeometryMeshBuilderBase.C.

109{
110 SubdomainID elem_block_id;
111 if (name_id_map.find(elem_block_name) == name_id_map.end())
112 {
113 // Block name does not exist in mesh yet, assign new block id and name
114 elem_block_id = next_free_id++;
115 elem->subdomain_id() = elem_block_id;
116 input_mesh.set_subdomain_name(elem_block_id, elem_block_name);
117 name_id_map[elem_block_name] = elem_block_id;
118 }
119 else
120 {
121 // Block name exists in mesh, reuse block id
122 elem_block_id = name_id_map[elem_block_name];
123 elem->subdomain_id() = elem_block_id;
124 }
125
126 input_mesh.unset_has_cached_elem_data();
127}

Referenced by AssemblyMeshGenerator::generate(), ControlDrumMeshGenerator::generate(), CoreMeshGenerator::generate(), and generate().

◆ validParams()

InputParameters PinMeshGenerator::validParams ( )
static

Definition at line 25 of file PinMeshGenerator.C.

26{
28
29 params.addRequiredParam<MeshGeneratorName>(
30 "reactor_params",
31 "The ReactorMeshParams MeshGenerator that is the basis for this component conformal mesh.");
32
33 params.addRequiredParam<subdomain_id_type>("pin_type",
34 "The integer ID for this pin type definition");
35
36 params.addRequiredRangeCheckedParam<Real>(
37 "pitch", "pitch>0.0", "The pitch for the outermost boundary polygon");
38
39 params.addRangeCheckedParam<unsigned int>(
40 "num_sectors", "num_sectors>0", "Number of azimuthal sectors in each quadrant");
41
42 params.addRangeCheckedParam<std::vector<Real>>(
43 "ring_radii",
44 "ring_radii>0.0",
45 "Radii of major concentric circles of the pin. If unspecified, no pin is present.");
46
47 params.addRangeCheckedParam<std::vector<Real>>(
48 "duct_halfpitch",
49 "duct_halfpitch>0.0",
50 "Apothem of the ducts. If unspecified, no duct is present.");
51
52 params.addRangeCheckedParam<std::vector<unsigned int>>(
53 "mesh_intervals",
54 std::vector<unsigned int>{1},
55 "mesh_intervals>0",
56 "The number of meshing intervals for each region starting at the center. Parameter should be "
57 "size:"
58 "((length(ring_radii) + length(duct_halfpitch) + 1");
59
60 params.addParam<std::vector<std::vector<std::string>>>(
61 "block_names",
62 "Block names for each radial and axial zone. "
63 "Inner indexing is radial zones (pin/background/duct), outer indexing is axial");
64
65 params.addParam<std::vector<std::vector<subdomain_id_type>>>(
66 "region_ids",
67 "IDs for each radial and axial zone for assignment of region_id extra element "
68 "id. "
69 "Inner indexing is radial zones (pin/background/duct), outer indexing is axial");
70
71 params.addParam<bool>("extrude",
72 false,
73 "Determines if this is the final step in the geometry construction"
74 " and extrudes the 2D geometry to 3D. If this is true then this mesh "
75 "cannot be used in further mesh building in the Reactor workflow");
76 params.addParam<bool>(
77 "homogenized", false, "Determines whether homogenized pin mesh should be generated");
78 params.addParam<bool>(
79 "use_as_assembly", false, "Determines whether pin mesh should be used as an assembly mesh");
80
81 params.addParam<bool>(
82 "quad_center_elements", true, "Whether the center elements are quad or triangular.");
83 params.addParamNamesToGroup("region_ids pin_type", "ID assigment");
84 params.addParamNamesToGroup(
85 "mesh_intervals ring_radii num_sectors pin_type homogenized use_as_assembly",
86 "Pin specifications");
87 params.addParamNamesToGroup("mesh_intervals duct_halfpitch num_sectors", "Duct specifications");
88
89 params.addClassDescription("This PinMeshGenerator object is designed to generate pin-like "
90 "structures, with IDs, from a reactor geometry. "
91 "Whether it be a square or hexagonal pin, they are divided into three "
92 "substructures - the innermost "
93 "radial pin regions, the single bridging background region, and the "
94 "square or hexagonal ducts regions.");
95
96 // Declare that this generator has a generateCSG method
98
99 return params;
100}
static void setHasGenerateCSG(InputParameters &params)

Member Data Documentation

◆ _block_names

std::vector<std::vector<std::string> > PinMeshGenerator::_block_names
protected

2-D vector (axial outer indexing, radial inner indexing) used to set block names of pin mesh elements

Definition at line 62 of file PinMeshGenerator.h.

Referenced by generate(), generateMetadata(), and PinMeshGenerator().

◆ _build_mesh

std::unique_ptr<MeshBase>* PinMeshGenerator::_build_mesh
protected

The final mesh that is generated by the subgenerators; This mesh is generated by the subgenerators with only element and boundary ids changed.

Definition at line 84 of file PinMeshGenerator.h.

Referenced by generate(), and PinMeshGenerator().

◆ _duct_halfpitch

const std::vector<Real> PinMeshGenerator::_duct_halfpitch
protected

The inner apothem of any surrounding ducts in the pin.

Definition at line 50 of file PinMeshGenerator.h.

Referenced by generateCSG(), generateMetadata(), and PinMeshGenerator().

◆ _extrude

const bool PinMeshGenerator::_extrude
protected

Whether this mesh should be extruded to 3-D, making it the final structure in the reactor mesh.

Definition at line 71 of file PinMeshGenerator.h.

Referenced by generate(), generateMetadata(), and PinMeshGenerator().

◆ _has_block_names

bool PinMeshGenerator::_has_block_names
protected

Whether block names have been provided by user.

Definition at line 59 of file PinMeshGenerator.h.

Referenced by generate(), and PinMeshGenerator().

◆ _homogenized

bool PinMeshGenerator::_homogenized
protected

Whether the resulting pin mesh should be homogenized.

Definition at line 77 of file PinMeshGenerator.h.

Referenced by generateFlexibleAssemblyBoundaries(), generateMetadata(), and PinMeshGenerator().

◆ _intervals

std::vector<unsigned int> PinMeshGenerator::_intervals
protected

The number of mesh intervals in a radial division starting from the center.

Definition at line 53 of file PinMeshGenerator.h.

Referenced by generateFlexibleAssemblyBoundaries(), and PinMeshGenerator().

◆ _is_assembly

bool PinMeshGenerator::_is_assembly
protected

Whether the resulting pin mesh should also be used as an assembly mesh.

Definition at line 80 of file PinMeshGenerator.h.

Referenced by generate(), generateMetadata(), and PinMeshGenerator().

◆ _mesh_dimensions

unsigned int PinMeshGenerator::_mesh_dimensions
protected

The number of dimensions the mesh is ultimately going to have (2 or 3, declared in the ReactorMeshParams object)

Definition at line 68 of file PinMeshGenerator.h.

Referenced by generateCSG(), generateMetadata(), and PinMeshGenerator().

◆ _mesh_geometry

std::string PinMeshGenerator::_mesh_geometry
protected

The type of geometry that is being described (Square or Hex, declared in the ReactorMeshParams object)

Definition at line 65 of file PinMeshGenerator.h.

Referenced by generateCSG(), generateFlexibleAssemblyBoundaries(), and PinMeshGenerator().

◆ _num_sectors

const unsigned int PinMeshGenerator::_num_sectors
protected

The number of azimuthal divisions.

Definition at line 44 of file PinMeshGenerator.h.

Referenced by PinMeshGenerator().

◆ _pin_type

const subdomain_id_type PinMeshGenerator::_pin_type
protected

The id number for this pin type.

Definition at line 38 of file PinMeshGenerator.h.

Referenced by generate(), generateFlexibleAssemblyBoundaries(), generateMetadata(), and PinMeshGenerator().

◆ _pitch

const Real PinMeshGenerator::_pitch
protected

The face-to-face size of this pin.

Definition at line 41 of file PinMeshGenerator.h.

Referenced by generateCSG(), generateMetadata(), and PinMeshGenerator().

◆ _quad_center

bool PinMeshGenerator::_quad_center
protected

Whether the centermost elements in the pin should be quad elements as opposed to tri elements.

Definition at line 74 of file PinMeshGenerator.h.

Referenced by PinMeshGenerator().

◆ _reactor_params

MeshGeneratorName ReactorGeometryMeshBuilderBase::_reactor_params
protectedinherited

The ReactorMeshParams object that is storing the reactor global information for this reactor geometry mesh.

Definition at line 265 of file ReactorGeometryMeshBuilderBase.h.

Referenced by ReactorGeometryMeshBuilderBase::getReactorParam(), ReactorGeometryMeshBuilderBase::hasReactorParam(), and ReactorGeometryMeshBuilderBase::initializeReactorMeshParams().

◆ _reactor_params_csg

std::unique_ptr<CSG::CSGBase>* ReactorGeometryMeshBuilderBase::_reactor_params_csg
privateinherited

◆ _reactor_params_mesh

std::unique_ptr<MeshBase>* ReactorGeometryMeshBuilderBase::_reactor_params_mesh
privateinherited

The dummy param mesh that we need to clear once we've generated (in freeReactorMeshParams)

Definition at line 334 of file ReactorGeometryMeshBuilderBase.h.

Referenced by ReactorGeometryMeshBuilderBase::freeReactorParamsMesh(), and ReactorGeometryMeshBuilderBase::initializeReactorMeshParams().

◆ _region_ids

std::vector<std::vector<subdomain_id_type> > PinMeshGenerator::_region_ids
protected

2-D vector (axial outer indexing, radial inner indexing) used to set "region_id" extra-element integer of the pin mesh elements

Definition at line 56 of file PinMeshGenerator.h.

Referenced by generate(), generateCSG(), generateMetadata(), and PinMeshGenerator().

◆ _ring_radii

std::vector<Real> PinMeshGenerator::_ring_radii
protected

The outer radii of concentric rings in the pin.

Definition at line 47 of file PinMeshGenerator.h.

Referenced by generateCSG(), generateMetadata(), and PinMeshGenerator().


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