21 #include "libmesh/elem.h" 30 params.addRequiredParam<MeshGeneratorName>(
32 "The ReactorMeshParams MeshGenerator that is the basis for this component conformal mesh.");
35 "The integer ID for this pin type definition");
37 params.addRequiredRangeCheckedParam<
Real>(
38 "pitch",
"pitch>0.0",
"The pitch for the outermost boundary polygon");
40 params.addRangeCheckedParam<
unsigned int>(
41 "num_sectors",
"num_sectors>0",
"Number of azimuthal sectors in each quadrant");
43 params.addRangeCheckedParam<std::vector<Real>>(
46 "Radii of major concentric circles of the pin. If unspecified, no pin is present.");
48 params.addRangeCheckedParam<std::vector<Real>>(
51 "Apothem of the ducts. If unspecified, no duct is present.");
53 params.addRangeCheckedParam<std::vector<unsigned int>>(
55 std::vector<unsigned int>{1},
57 "The number of meshing intervals for each region starting at the center. Parameter should be " 59 "((length(ring_radii) + length(duct_halfpitch) + 1");
61 params.addParam<std::vector<std::vector<std::string>>>(
63 "Block names for each radial and axial zone. " 64 "Inner indexing is radial zones (pin/background/duct), outer indexing is axial");
66 params.addParam<std::vector<std::vector<subdomain_id_type>>>(
68 "IDs for each radial and axial zone for assignment of region_id extra element " 70 "Inner indexing is radial zones (pin/background/duct), outer indexing is axial");
72 params.addParam<
bool>(
"extrude",
74 "Determines if this is the final step in the geometry construction" 75 " and extrudes the 2D geometry to 3D. If this is true then this mesh " 76 "cannot be used in further mesh building in the Reactor workflow");
77 params.addParam<
bool>(
78 "homogenized",
false,
"Determines whether homogenized pin mesh should be generated");
79 params.addParam<
bool>(
80 "use_as_assembly",
false,
"Determines whether pin mesh should be used as an assembly mesh");
82 params.addParam<
bool>(
83 "quad_center_elements",
true,
"Whether the center elements are quad or triangular.");
84 params.addParamNamesToGroup(
"region_ids pin_type",
"ID assigment");
85 params.addParamNamesToGroup(
86 "mesh_intervals ring_radii num_sectors pin_type homogenized use_as_assembly",
87 "Pin specifications");
88 params.addParamNamesToGroup(
"mesh_intervals duct_halfpitch num_sectors",
"Duct specifications");
90 params.addClassDescription(
"This PinMeshGenerator object is designed to generate pin-like " 91 "structures, with IDs, from a reactor geometry. " 92 "Whether it be a square or hexagonal pin, they are divided into three " 93 "substructures - the innermost " 94 "radial pin regions, the single bridging background region, and the " 95 "square or hexagonal ducts regions.");
106 _pitch(getParam<
Real>(
"pitch")),
107 _num_sectors(isParamValid(
"num_sectors") ? getParam<unsigned
int>(
"num_sectors") : 0),
108 _ring_radii(isParamValid(
"ring_radii") ? getParam<
std::vector<
Real>>(
"ring_radii")
110 _duct_halfpitch(isParamValid(
"duct_halfpitch") ? getParam<
std::vector<
Real>>(
"duct_halfpitch")
112 _intervals(getParam<
std::vector<unsigned
int>>(
"mesh_intervals")),
113 _region_ids(isParamValid(
"region_ids")
116 _extrude(getParam<bool>(
"extrude")),
117 _quad_center(getParam<bool>(
"quad_center_elements")),
118 _homogenized(getParam<bool>(
"homogenized")),
119 _is_assembly(getParam<bool>(
"use_as_assembly"))
131 mooseError(
"Pitch defined in PinMeshGenerator must match assembly_pitch defined in " 132 "ReactorMeshParams if use_as_assembly is set to true");
137 "In order to extrude this mesh, ReactorMeshParams/dim needs to be set to 3\n");
140 mooseError(
"Both top_boundary_id and bottom_boundary_id must be provided in ReactorMeshParams " 141 "if using extruded geometry");
146 mooseError(
"Homogenization in PinMeshGenerator is only supported for hexagonal geometries");
147 const std::vector<std::string> disallowed_parameters = {
148 "num_sectors",
"ring_radii",
"duct_halfpitch",
"mesh_intervals"};
149 for (
const auto & parameter : disallowed_parameters)
152 "Parameter " + parameter +
" should not be defined for a homogenized pin mesh");
158 "Number of sectors must be assigned with parameter num_sectors for non-homogenized pins");
161 "The number of mesh intervals must be equal to the number of annular regions + the " 162 "number of duct regions + 1" 163 " for the region between the rings and ducts\n");
168 unsigned int n_axial_levels =
173 mooseError(
"The size of region IDs must be equal to the number of axial levels as defined in " 174 "the ReactorMeshParams object");
176 mooseError(
"The number of region IDs given needs to be one more than the number of " 177 "ring_radii + the number of duct_radii\n");
181 mooseError(
"Region IDs must be assigned with parameter region_ids");
187 "If ReactorMeshParams/region_id_as_block_name is set, block_names should not be " 188 "specified in PinMeshGenerator");
190 _block_names = getParam<std::vector<std::vector<std::string>>>(
"block_names");
192 mooseError(
"The size of block_names must match the size of region_ids");
195 mooseError(
"The size of block_names must match the size of region_ids");
201 std::string build_mesh_name;
211 bool skip_assembly_generation =
_is_assembly && use_flexible_stitching;
218 const auto boundary_name =
221 params.set<BoundaryName>(
"external_boundary_name") = boundary_name;
222 params.set<std::vector<subdomain_id_type>>(
"block_id") = {
228 params.set<std::vector<SubdomainName>>(
"block_name") = {block_name};
230 if (!skip_assembly_generation)
232 build_mesh_name =
name() +
"_2D";
239 std::vector<unsigned int> ring_intervals;
240 std::vector<subdomain_id_type> ring_blk_ids;
241 std::vector<SubdomainName> ring_blk_names;
242 unsigned int background_intervals = 1;
243 std::vector<subdomain_id_type> background_blk_ids;
244 std::vector<SubdomainName> background_blk_names;
245 std::vector<unsigned int> duct_intervals;
246 std::vector<subdomain_id_type> duct_blk_ids;
247 std::vector<SubdomainName> duct_blk_names;
251 const auto block_name =
258 ring_blk_ids.push_back(block_id);
259 ring_blk_names.push_back(block_name);
264 duct_blk_ids.push_back(block_id);
265 duct_blk_names.push_back(block_name);
270 background_blk_ids.push_back(block_id);
271 background_blk_names.push_back(block_name);
274 if (ring_intervals.size() > 0)
276 if (ring_intervals.front() != 1)
283 ring_blk_ids.insert(ring_blk_ids.begin(), ring_blk_ids.front());
284 ring_blk_names.insert(ring_blk_names.begin(), ring_blk_names.front());
290 ring_blk_ids.insert(ring_blk_ids.begin(), block_id);
291 ring_blk_names.insert(ring_blk_names.begin(), block_name);
303 if (background_intervals > 1)
310 background_blk_ids.insert(background_blk_ids.begin(), background_blk_ids.front());
311 background_blk_names.insert(background_blk_names.begin(), background_blk_names.front());
317 background_blk_ids.insert(background_blk_ids.begin(), block_id);
318 background_blk_names.insert(background_blk_names.begin(), block_name);
333 bool skip_assembly_generation =
336 if (!skip_assembly_generation)
343 params.
set<
bool>(
"preserve_volumes") =
true;
344 params.set<
bool>(
"quad_center_elements") =
_quad_center;
345 params.set<
MooseEnum>(
"polygon_size_style") =
"apothem";
346 params.set<
Real>(
"polygon_size") =
_pitch / 2.0;
352 params.set<BoundaryName>(
"external_boundary_name") = boundary_name;
354 params.set<
bool>(
"flat_side_up") = flat_side_up;
355 params.set<
bool>(
"create_outward_interface_boundaries") =
false;
358 params.set<
unsigned int>(
"num_sides") = num_sides;
359 params.set<std::vector<unsigned int>>(
"num_sectors_per_side") =
362 if (ring_intervals.size() > 0)
364 params.set<std::vector<Real>>(
"ring_radii") =
_ring_radii;
365 params.set<std::vector<subdomain_id_type>>(
"ring_block_ids") = ring_blk_ids;
366 params.set<std::vector<SubdomainName>>(
"ring_block_names") = ring_blk_names;
367 params.set<std::vector<unsigned int>>(
"ring_intervals") = ring_intervals;
370 params.set<std::vector<subdomain_id_type>>(
"background_block_ids") = background_blk_ids;
371 params.set<std::vector<SubdomainName>>(
"background_block_names") = background_blk_names;
372 params.set<
unsigned int>(
"background_intervals") = background_intervals;
374 if (duct_intervals.size() > 0)
376 params.set<
MooseEnum>(
"duct_sizes_style") =
"apothem";
378 params.set<std::vector<subdomain_id_type>>(
"duct_block_ids") = duct_blk_ids;
379 params.set<std::vector<SubdomainName>>(
"duct_block_names") = duct_blk_names;
380 params.set<std::vector<unsigned int>>(
"duct_intervals") = duct_intervals;
390 params.
set<MeshGeneratorName>(
"input") =
name() +
"_2D";
393 std::vector<BoundaryName> boundaries_to_delete = {};
395 boundaries_to_delete.insert(boundaries_to_delete.end(),
396 {std::to_string(10001 + i), std::to_string(15001 + i)});
397 params.set<std::vector<BoundaryName>>(
"boundary_names") = boundaries_to_delete;
399 build_mesh_name =
name() +
"_delbds";
410 build_mesh_name =
name() +
"_fpg_delbds";
414 if (hasMeshProperty<Real>(
"pitch_meta",
name() +
"_2D"))
415 copyMeshProperty<Real>(
"pitch_meta",
name() +
"_2D");
416 if (
hasMeshProperty<std::vector<unsigned int>>(
"num_sectors_per_side_meta",
name() +
"_2D"))
418 if (hasMeshProperty<Real>(
"max_radius_meta",
name() +
"_2D"))
419 copyMeshProperty<Real>(
"max_radius_meta",
name() +
"_2D");
420 if (hasMeshProperty<unsigned int>(
"background_intervals_meta",
name() +
"_2D"))
421 copyMeshProperty<unsigned int>(
"background_intervals_meta",
name() +
"_2D");
422 if (hasMeshProperty<dof_id_type>(
"node_id_background_meta",
name() +
"_2D"))
423 copyMeshProperty<dof_id_type>(
"node_id_background_meta",
name() +
"_2D");
427 else if (hasMeshProperty<Real>(
"pattern_pitch_meta",
name() +
"_2D"))
428 copyMeshProperty<Real>(
"pattern_pitch_meta",
name() +
"_2D");
444 SubdomainName outermost_block_name;
445 bool has_single_mesh_interval;
452 has_single_mesh_interval =
true;
458 has_single_mesh_interval =
false;
463 params.
set<std::vector<SubdomainName>>(
"block") = {outermost_block_name};
473 if (has_single_mesh_interval)
474 params.
set<std::vector<MeshGeneratorName>>(
"inputs") = {};
477 params.set<std::vector<MeshGeneratorName>>(
"inputs") = {
name() +
"_del_outer"};
478 params.set<std::vector<libMesh::Point>>(
"extra_positions") = {
libMesh::Point(0, 0, 0)};
479 params.set<std::vector<unsigned int>>(
"extra_positions_mg_indices") = {0};
481 params.set<
bool>(
"use_auto_area_func") =
true;
482 params.set<
bool>(
"verify_holes") =
false;
484 params.set<
unsigned int>(
"boundary_sectors") =
488 params.set<BoundaryName>(
"external_boundary_name") =
490 params.set<SubdomainName>(
"background_subdomain_name") =
500 params.
set<MeshGeneratorName>(
"input") =
name() +
"_fpg";
501 std::vector<BoundaryName> boundaries_to_delete = {};
502 if (!has_single_mesh_interval)
503 boundaries_to_delete.push_back(std::to_string(1));
504 params.set<std::vector<BoundaryName>>(
"boundary_names") = boundaries_to_delete;
515 std::map<subdomain_id_type, std::vector<std::vector<subdomain_id_type>>> region_id_map{
530 std::map<subdomain_id_type, std::vector<std::vector<subdomain_id_type>>>
pin_region_id_map;
533 region_id_map.begin()->first, region_id_map.begin()->second));
535 std::map<subdomain_id_type, std::vector<std::vector<std::string>>>
pin_block_name_map;
556 unsigned int n_axial_levels =
561 n_axial_levels, std::vector<subdomain_id_type>(
_ring_radii.size()));
563 n_axial_levels, std::vector<subdomain_id_type>(
_duct_halfpitch.size()));
564 std::vector<subdomain_id_type> background_region_ids(n_axial_levels);
566 for (
const auto axial_idx :
make_range(n_axial_levels))
573 for (
unsigned int duct_idx =
_ring_radii.size() + 1;
586 std::unique_ptr<MeshBase>
597 auto null_mesh =
nullptr;
603 if (hasMeshProperty<Real>(
"max_radius_meta",
name() +
"_2D"))
605 const auto max_radius_meta = getMeshProperty<Real>(
"max_radius_meta",
name() +
"_2D");
608 if (hasMeshProperty<unsigned int>(
"background_intervals_meta",
name() +
"_2D"))
610 const auto background_intervals_meta =
611 getMeshProperty<unsigned int>(
"background_intervals_meta",
name() +
"_2D");
612 setMeshProperty(
"background_intervals_meta", background_intervals_meta);
614 if (hasMeshProperty<dof_id_type>(
"node_id_background_meta",
name() +
"_2D"))
616 const auto node_id_background_meta =
617 getMeshProperty<dof_id_type>(
"node_id_background_meta",
name() +
"_2D");
627 std::string region_id_name =
"region_id";
628 std::string pin_type_id_name =
"pin_type_id";
629 std::string assembly_type_id_name =
"assembly_type_id";
630 std::string plane_id_name =
"plane_id";
631 std::string radial_id_name =
"radial_id";
632 const std::string default_block_name =
639 unsigned int plane_id_int = 0;
640 unsigned int assembly_type_id_int = 0;
648 std::map<std::string, SubdomainID> rgmb_name_id_map;
653 for (
auto & elem : (*_build_mesh)->active_element_ptr_range())
655 const auto base_block_id = elem->subdomain_id();
656 const auto base_block_name = (*_build_mesh)->subdomain_name(base_block_id);
660 if (!(base_block_name.find(prefix, 0) == 0))
663 std::string radial_str = base_block_name.substr(prefix.length());
667 const std::size_t found = radial_str.find(suffix);
668 if (found != std::string::npos)
669 radial_str.replace(found, suffix.length(),
"");
670 const unsigned int radial_idx = std::stoi(radial_str);
677 elem->set_extra_integer(region_id_int, elem_region_id);
678 elem->set_extra_integer(pin_type_id_int,
_pin_type);
679 elem->set_extra_integer(radial_id_int, radial_idx);
681 elem->set_extra_integer(assembly_type_id_int,
_pin_type);
684 auto elem_block_name = default_block_name;
686 elem_block_name +=
"_" +
_block_names[std::size_t(z_id)][radial_idx];
688 elem_block_name +=
"_REG" + std::to_string(elem_region_id);
689 if (elem->type() ==
TRI3 || elem->type() ==
PRISM6)
692 *(*
_build_mesh), elem, rgmb_name_id_map, elem_block_name, next_block_id);
696 (*_build_mesh)->unset_is_prepared();
701 std::unique_ptr<CSG::CSGBase>
707 auto csg_obj = std::make_unique<CSG::CSGBase>();
709 unsigned int radial_index = 0;
710 std::vector<std::vector<std::reference_wrapper<const CSG::CSGSurface>>> surfaces_by_radial_region;
715 const auto surf_name =
name() +
"_radial_ring_" + std::to_string(radial_index);
716 std::unique_ptr<CSG::CSGSurface> ring_surf_ptr =
717 std::make_unique<CSG::CSGZCylinder>(surf_name, 0, 0,
radius);
718 const auto & ring_surf = csg_obj->addSurface(std::move(ring_surf_ptr));
719 surfaces_by_radial_region.push_back({ring_surf});
726 const auto & duct_surfaces =
728 surfaces_by_radial_region.push_back(duct_surfaces);
733 const auto & duct_surfaces =
735 surfaces_by_radial_region.push_back(duct_surfaces);
738 std::vector<CSG::CSGRegion> radial_regions;
740 for (
const auto i :
index_range(surfaces_by_radial_region))
742 const auto & radial_surfaces = surfaces_by_radial_region[i];
744 bool is_last_radial_region = i == surfaces_by_radial_region.size() - 1;
747 if (!is_last_radial_region)
751 radial_region = inner_region;
758 outer_region = ~inner_region;
760 radial_region = is_last_radial_region ? outer_region : (inner_region & outer_region);
762 radial_regions.push_back(radial_region);
766 std::vector<CSG::CSGRegion> axial_regions;
767 std::vector<std::reference_wrapper<const CSG::CSGSurface>> surfaces_by_axial_region;
772 for (
const auto i :
make_range(surfaces_by_axial_region.size()))
776 const auto & lower_surf = surfaces_by_axial_region[i - 1].get();
777 if (lower_surf != surfaces_by_axial_region.front())
778 axial_region = +lower_surf;
779 const auto & upper_surf = surfaces_by_axial_region[i].get();
780 if (upper_surf != surfaces_by_axial_region.back())
783 axial_region = -upper_surf;
785 axial_region &= -upper_surf;
787 axial_regions.push_back(axial_region);
792 const auto & pin_univ = csg_obj->createUniverse(
name() +
"_univ");
795 for (
const auto j :
make_range(extruded_pin ? axial_regions.size() : 1))
797 auto cell_region = radial_regions[i];
798 auto cell_name =
name() +
"_cell_radial_" + std::to_string(i);
800 const auto mat_name =
"rgmb_region_" + std::to_string(region_id);
804 const auto axial_region = axial_regions[
j];
808 cell_region &= axial_region;
810 cell_region = axial_region;
812 cell_name +=
"_axial_" + std::to_string(
j);
814 csg_obj->createCell(cell_name, mat_name, cell_region, &pin_univ);
823 const auto & lowest_axial_surf = surfaces_by_axial_region.front().get();
824 const auto & highest_axial_surf = surfaces_by_axial_region.back().get();
825 auto axial_region = +lowest_axial_surf & -highest_axial_surf;
826 pin_region &= axial_region;
828 csg_obj->createCell(
name() +
"_root_cell", pin_univ, pin_region);
std::unique_ptr< MeshBase > & getMeshByName(const MeshGeneratorName &mesh_generator_name)
const SubdomainName ASSEMBLY_BLOCK_NAME_PREFIX
const subdomain_id_type _pin_type
The id number for this pin type.
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...
static const std::string duct_block_names
static const std::string background_region_id
T & setMeshProperty(const std::string &data_name, Args &&... args)
static const std::string assembly_type
PinMeshGenerator(const InputParameters ¶meters)
void paramError(const std::string ¶m, Args... args) const
static const std::string region_id_as_block_name
unsigned int _mesh_dimensions
The number of dimensions the mesh is ultimately going to have (2 or 3, declared in the ReactorMeshPar...
static const std::string is_single_pin
void generateFlexibleAssemblyBoundaries()
std::unique_ptr< CSG::CSGBase > generateCSG() override
const InputParameters & parameters() const
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...
const subdomain_id_type PIN_BLOCK_ID_START
static const std::string mesh_geometry
void initializeReactorMeshParams(const std::string reactor_param_name)
Initializes and checks validity of ReactorMeshParams mesh generator object.
InputParameters getValidParams(const std::string &name) const
std::vector< std::reference_wrapper< const CSG::CSGSurface > > getAxialPlaneSurfaces(CSG::CSGBase &csg_obj)
Get CSGSurfaces corresponding to axial planes of the extruded RGMB mesh.
Mesh generator for defining a reactor pin with background and duct regions, with the option to be 2-D...
static const std::string background_block_name
static const std::string assembly_pitch
bool _homogenized
Whether the resulting pin mesh should be homogenized.
std::vector< unsigned int > _intervals
The number of mesh intervals in a radial division starting from the center.
static const std::string pin_type
registerMooseObject("ReactorApp", PinMeshGenerator)
static InputParameters validParams()
const SubdomainName TRI_BLOCK_NAME_SUFFIX
bool _quad_center
Whether the centermost elements in the pin should be quad elements as opposed to tri elements...
bool _has_block_names
Whether block names have been provided by user.
static const std::string pin_region_id_map
const BoundaryName PIN_BOUNDARY_NAME_PREFIX
static const std::string extruded
const T & getReactorParam(const std::string ¶m_name)
Returns reference of parameter in ReactorMeshParams object.
const std::string & name() const
static const std::string duct_halfpitches
static const std::string mesh_dimensions
void addMeshSubgenerator(const std::string &type, const std::string &name, Ts... extra_input_parameters)
MeshGeneratorName callExtrusionMeshSubgenerators(const MeshGeneratorName input_mesh_name)
Calls mesh subgenerators related to extrusion, renaming of top / bottom boundaries, and defining plane IDs.
static InputParameters validParams()
RegionType getRegionType() const
static const std::string pitch
static constexpr boundary_id_type PIN_BOUNDARY_ID_START
void freeReactorParamsMesh()
Releases the mesh obtained in _reactor_params_mesh.
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...
const unsigned int _num_sectors
The number of azimuthal divisions.
const SubdomainName PIN_BLOCK_NAME_PREFIX
static const std::string top_boundary_id
std::vector< std::reference_wrapper< const CSG::CSGSurface > > getOuterRadialSurfacesForUnitCell(unsigned int radial_index, Real halfpitch, CSG::CSGBase &csg_obj)
Get CSGSurfaces corresponding to hexagonal or square region with given halfpitch and centered around ...
CSG::CSGRegion getInnerRegion(const std::vector< std::reference_wrapper< const CSG::CSGSurface >> &surfaces, const libMesh::Point &origin)
static void setHasGenerateCSG(InputParameters ¶ms)
const bool _extrude
Whether this mesh should be extruded to 3-D, making it the final structure in the reactor mesh...
std::unique_ptr< MeshBase > generate() override
static const std::string is_homogenized
void freeReactorParamsCSG()
Releases the CSG base object obtained in _reactor_params_csg.
std::vector< Real > _ring_radii
The outer radii of concentric rings in the pin.
static const std::string is_control_drum
static const std::string pin_region_ids
static const std::string flexible_assembly_stitching
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _pitch
The face-to-face size of this pin.
static const std::string ring_radii
const subdomain_id_type PIN_BLOCK_ID_TRI_FLEXIBLE
static const std::string pin_block_names
const subdomain_id_type PIN_BLOCK_ID_TRI
static const std::string axial_mesh_intervals
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
A base class that contains common members for Reactor Geometry Mesh Builder mesh generators.
const BoundaryName ASSEMBLY_BOUNDARY_NAME_PREFIX
T & declareMeshProperty(const std::string &data_name, Args &&... args)
std::string _mesh_geometry
The type of geometry that is being described (Square or Hex, declared in the ReactorMeshParams object...
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
bool isParamValid(const std::string &name) const
static const std::string bypass_meshgen
bool _is_assembly
Whether the resulting pin mesh should also be used as an assembly mesh.
SubdomainID getNextFreeSubdomainID(MeshBase &input_mesh)
T & copyMeshProperty(const std::string &target_data_name, const std::string &source_data_name, const std::string &source_mesh)
static const std::string num_sectors_flexible_stitching
static const std::string duct_region_ids
void ErrorVector unsigned int
auto index_range(const T &sizable)
static const std::string bottom_boundary_id
std::unique_ptr< MeshBase > * _build_mesh
The final mesh that is generated by the subgenerators; This mesh is generated by the subgenerators wi...
static const std::string pin_block_name_map
const std::vector< Real > _duct_halfpitch
The inner apothem of any surrounding ducts in the pin.
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...
static const std::string ring_region_ids