Frequently Used Reactor Geometries and Corresponding Mesh Generators
This section lists frequently used hexagonal-based geometries for reactor cores and their associated mesh generator objects. All the following are considered "base" mesh generators which expose all input options including control of block (subdomain) numbering. While sidesets can also be numbered, the outer boundary sideset is automatically assigned to sideset 10000.
A second set of mesh generators (Reactor Geometry Mesh Builder mesh generators) is available for regular hexagonal and Cartesian geometry and provides a reduced set of input options, removes any mention of block (subdomain) numbering, and instead allows the user to specify materials directly on the mesh. These are covered in another Chapter.
Pin Cell
Pin cells form the basis of most reactor geometries and consist of concentric circular regions (fuel, clad, etc.) surrounded by a coolant zone. Sometimes, a ducted structural region surrounds the coolant zone. Due to the prevalence of pin cells in both hexagonal and Cartesian geometry, a dedicated mesh generator, PolygonConcentricCircleMeshGenerator, was created for pin cell generation of any regular polygon (three sides or more). It is important to note that the meshed circular areas can be forced to preserve area regardless of the discretization fidelity. This is very useful for mesh convergence studies in which changing the discretization could add or remove fuel from the problem. Preserving the fuel area or volume using the "preserve_volumes" parameter is highly recommended. This mesh generator can also be used when there is no fuel pin (e.g., an empty duct).
Object
Geometry Features
2D Cartesian or hexagonal unit pin cell, including fuel, clad, coolant and (optional) ducted regions on periphery
Notes
The pin cell size may be provided as the apothem (center-to-flat distance which is the pin "half-pitch") or radius (center-to-vertex distance) depending on the setting in "polygon_size_style". Apothem (half-pitch) is the default style.
Permits either quadrilateral or triangular elements in the pin center region (quad fuel and tri fuel regions must have different block IDs)
Fuel area preservation using the "preserve_volumes" parameter
Boundary layer meshing; radial mesh biasing
Different azimuthal discretization possible per pin cell face
Example

Figure 1: PolygonConcentricCircleMeshGenerator is capable of generating general polygon meshes as well as Cartesian and hexagonal pins.
Listing 1: Pin cell example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[hex_1]
type = PolygonConcentricCircleMeshGenerator<<<{"description": "This PolygonConcentricCircleMeshGenerator object is designed to mesh a polygon geometry with optional rings centered inside.", "href": "../../../source/meshgenerators/PolygonConcentricCircleMeshGenerator.html"}>>>
# General parameters
num_sides<<<{"description": "Number of sides of the polygon."}>>> = 6
num_sectors_per_side<<<{"description": "Number of azimuthal sectors per polygon side (rotating counterclockwise from top right face)."}>>> = '4 4 4 4 4 4'
polygon_size<<<{"description": "Size of the polygon to be generated (given as either apothem or radius depending on polygon_size_style)."}>>> = 5.0
# Ring regions parameters
ring_radii<<<{"description": "Radii of major concentric circles (rings)."}>>> = 4.0
ring_intervals<<<{"description": "Number of radial mesh intervals within each major concentric circle excluding their boundary layers."}>>> = 2
ring_block_ids<<<{"description": "Optional customized block ids for each ring geometry block."}>>> = '10 15'
ring_block_names<<<{"description": "Optional customized block names for each ring geometry block."}>>> = 'center_tri center'
preserve_volumes<<<{"description": "Volume of concentric circles can be preserved using this function."}>>> = on
# Background region parameters
background_intervals<<<{"description": "Number of radial meshing intervals in background region (area between rings and ducts) excluding the background's boundary layers."}>>> = 2
background_block_ids<<<{"description": "Optional customized block id for the background block."}>>> = 20
background_block_names<<<{"description": "Optional customized block names for the background block."}>>> = background
# # Optional Duct regions parameters
# duct_sizes = '4.5 4.8'
# duct_sizes_style = apothem
# duct_block_ids = '22 24'
# duct_block_names = 'duct_in duct_out'
# duct_intervals = '1 2'
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)Assembly (Homogenized)
Assemblies are one level higher than pins in the hierarchical lattice geometry structure. They consist of multiple pins laid out in a lattice, but sometimes, these pins are not explicitly represented. The SimpleHexagonGenerator mesh generator is appropriate for coarse, homogenized assembly approaches. Three modes are available for discretization: TRI (6 triangles), QUAD (2 quadrilaterals) and HYBRID (6 triangles surrounded by layers of quadrilaterals). The HYBRID method can be used when additional radial discretization is needed compared to the other two options. However, there is no additional azimuthal discretization available. PolygonConcentricCircleMeshGenerator should be used in that case. The hexagon will be discretized using the TRI mode by default if no discretization scheme is specified.
Object
Geometry Features
2D Hexagonal unit pin cell with coarse mesh discretization
Notes
Three modes are available to discretize the hexagon:
TRI: 6 triangles (default)
QUAD: 2 quadrilateral elements
HYBRID: 6 triangles + 6 * number of layers of quadrilateral elements
Example

Figure 2: Example output of the TRI, QUAD, and HYBRID (one quadrilateral layer) mode, respectively, of SimpleHexagonGenerator.
Listing 2: Homogenized assembly example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[hex_simple]
type = SimpleHexagonGenerator<<<{"description": "This SimpleHexagonGenerator object is designed to generate a simple hexagonal mesh that only contains six simple azimuthal triangular elements, two quadrilateral elements, or six central azimuthal triangular elements plus a several layers of quadrilateral elements.", "href": "../../../source/meshgenerators/SimpleHexagonGenerator.html"}>>>
hexagon_size<<<{"description": "Size of the hexagon to be generated."}>>> = 16
# Options: TRI, QUAD, HYBRID
element_type<<<{"description": "Whether the simple hexagon mesh is made of TRI or QUAD elements."}>>> = TRI
# Optional subdomain id/name
block_id<<<{"description": "Optional customized block id; two ids are needed for HYBRID 'element_type'."}>>> = '100'
block_name<<<{"description": "Optional customized block name; two names are needed for HYBRID 'element_type'."}>>> = 'hexagon'
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)Assembly (with multiple heterogeneous pins)
Assemblies with multiple heterogeneous pins are a very common reactor geometry component. The PatternedHexMeshGenerator creates an assembly by placing pre-defined pins into a user-defined lattice, and then applying optional background coolant and duct regions. Here we describe only the hexagonal assembly mesh generator. A Cartesian assembly mesh generator, PatternedCartesianMeshGenerator, is also available.
Object
(Cartesian sibling – PatternedCartesianMeshGenerator)
Geometry Features
2D Regular assembly with uniform pin pitch
Optional background and duct regions.
Notes
When generating an assembly mesh using PatternedHexMeshGenerator, be sure to set "generate_core_metadata" as
false
. This tells MOOSE that the constructed object is an assembly rather than a core (and consequently permits some operations downstream differently than if it were a core).When generating an assembly mesh, PolygonConcentricCircleMeshGenerator objects which define the hexagonal unit pin cells are generally used as inputs.
The input pattern will be automatically rotated 90 degrees counterclockwise into a "vertex up" position unless otherwise specified with "rotate_angle". This enables an assembly mesh to be patterned into a core directly (rows of assemblies should be oriented vertex up).
Example

Figure 3: A schematic showing an assembly mesh generated by PatternedHexMeshGenerator.
Listing 3: Heterogeneous assembly example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[pattern_assm]
type = PatternedHexMeshGenerator<<<{"description": "This PatternedHexMeshGenerator source code assembles hexagonal meshes into a hexagonal grid and optionally forces the outer boundary to be hexagonal and/or adds a duct.", "href": "../../../source/meshgenerators/PatternedHexMeshGenerator.html"}>>>
inputs<<<{"description": "The input MeshGenerators."}>>> = 'hex_1'
pattern<<<{"description": "A double-indexed hexagonal-shaped array starting with the upper-left corner."}>>> = '0 0;
0 0 0;
0 0'
hexagon_size<<<{"description": "Size of the outmost hexagon boundary to be generated; this is required only when pattern type is 'hexagon'."}>>> = 16
# Background region parameters
background_intervals<<<{"description": "Radial intervals in the assembly peripheral region."}>>> = 2
background_block_id<<<{"description": "Optional customized block id for the background block in 'assembly' mode; must be provided along with 'duct_block_ids' if 'duct_sizes' is provided."}>>> = 80
background_block_name<<<{"description": "Optional customized block name for the background block in 'assembly' mode; must be provided along with 'duct_block_names' if 'duct_sizes' is provided."}>>> = hex_background
# # Optional Duct regions parameters
# duct_sizes = '15.0 15.5'
# duct_sizes_style = apothem
# duct_block_ids = '82 84'
# duct_block_names = 'assm_duct_in assm_duct_out'
# duct_intervals = '1 2'
# Advanced option
deform_non_circular_region<<<{"description": "Whether the non-circular region (outside the rings) can be deformed."}>>> = false
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)Assembly (control drum, duct-heterogeneous, or single pin)
Another type of assembly in a reactor core is an assembly with a single pin (such as a rotating control drum), or an assembly with no pins explicitly represented (such as a duct-heterogeneous assembly representation). The HexagonConcentricCircleAdaptiveBoundaryMeshGenerator is typically used to create these types of assembly meshes. It creates an object that looks just like an output of PolygonConcentricCircleMeshGenerator, but has "assembly" metadata and additionally can have different discretizations on each side which are adaptively meshed to match other neighboring assembly meshes.
Object
Geometry Features
Hexagonal mesh with assembly metadata
Can optionally match other assembly meshes' external boundary to enable stitching to generate core meshes.
Notes
It can be used without specifying "sides_to_adapt" and "meshes_to_adapt_to" to generate PolygonConcentricCircleMeshGenerator -style hexagonal mesh with assembly mesh metadata. The azimuthal discretization of the sides listed in "sides_to_adapt" will be identical to the input meshes "meshes_to_adapt_to" and overwrite the appropriate entry(s) in "num_sectors_per_side".
The size of the hexagon ("hexagon_size") must match the size of the input meshes. Default style for providing "hexagon_size" is
apothem
(half-pitch).
Example

Figure 4: A schematic drawing showing the input and generated meshes of HexagonConcentricCircleAdaptiveBoundaryMeshGenerator.
Listing 4: Reflector-style assembly example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[adaptive_assm]
type = HexagonConcentricCircleAdaptiveBoundaryMeshGenerator<<<{"description": "This HexagonConcentricCircleAdaptiveBoundaryMeshGenerator object is designed to generate hexagonal meshes with adaptive boundary to facilitate stitching.", "href": "../../../source/meshgenerators/HexagonConcentricCircleAdaptiveBoundaryMeshGenerator.html"}>>>
num_sectors_per_side<<<{"description": "Number of azimuthal sectors per polygon side (rotating counterclockwise from top right face)."}>>> = '4 4 4 4 4 4'
background_intervals<<<{"description": "Number of radial meshing intervals in background region (area between rings and ducts) excluding the background's boundary layers."}>>> = 2
hexagon_size<<<{"description": "Size of the hexagon to be generated."}>>> = 16
sides_to_adapt<<<{"description": "List of the hexagon reference side indices that correspond to the sides that need adaptive meshing. The meshes to adapt these sides to are provided in 'inputs'."}>>> = '1 2 3'
meshes_to_adapt_to<<<{"description": "The name list of the input meshes to adapt to."}>>> = 'pattern_assm pattern_assm pattern_assm'
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)Core
The highest level of reactor geometry is generally the core, which consists of multiple assemblies patterned together. PatternedHexMeshGenerator can be used to create cores similar to how it is used to create assemblies. The main difference is that the inputs to a core object are assemblies rather than pins, and the parameter "generate_core_metadata" should be set to true
when creating a core. This tells MOOSE that the generated object is a core rather than an assembly, which is required to identify eligible mesh operations after creation (for example trimming along a line).
Object
(Cartesian sibling – PatternedCartesianMeshGenerator)
Geometry Features
2D regular assembly pattern with uniform assembly pitch
Notes
Assembly meshes generated by PatternedHexMeshGenerator, HexagonConcentricCircleAdaptiveBoundaryMeshGenerator and SimpleHexagonGenerator can be used as inputs. If SimpleHexagonGenerator is used, the assemblies are homogenized.
Core mesh generation should include the parameter "generate_core_metadata" as
true
.The input pattern will be automatically rotated 90 degrees counterclockwise into a "vertex up" position unless otherwise specified with "rotate_angle"
Example

Figure 5: A example showing a core mesh generated by PatternedHexMeshGenerator with six identical assembly meshes and one reflector mesh stitched together.
Listing 5: Core assembly example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[pattern_core]
type = PatternedHexMeshGenerator<<<{"description": "This PatternedHexMeshGenerator source code assembles hexagonal meshes into a hexagonal grid and optionally forces the outer boundary to be hexagonal and/or adds a duct.", "href": "../../../source/meshgenerators/PatternedHexMeshGenerator.html"}>>>
inputs<<<{"description": "The input MeshGenerators."}>>> = 'pattern_assm adaptive_assm'
pattern_boundary<<<{"description": "The boundary shape of the patterned mesh."}>>> = none
# Set as true to tell MOOSE that inputs have meshes made by PatternedHexMeshGenerator
# Set as false if the inputs are made by SimpleHexagonGenerator
generate_core_metadata<<<{"description": "A Boolean parameter that controls whether the core related metadata is generated for other MOOSE objects such as 'MultiControlDrumFunction' or not."}>>> = true
pattern<<<{"description": "A double-indexed hexagonal-shaped array starting with the upper-left corner."}>>> = '0 0 0;
0 0 0 0;
0 0 0 0 1;
0 0 0 0;
0 0 0'
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)Core Periphery
Nuclear reactor cores are often surrounded by cylindrical reflector barrels to prevent neutron leakages and improve shielding. Once the 2D core is created, a circular reflector, called the "core periphery" in the Reactor module, can be added to the outer ring of assemblies. Two options are available for meshing the core periphery: quadrilateral elements (PeripheralRingMeshGenerator) or triangular elements (PeripheralTriangleMeshGenerator).
Object
PeripheralRingMeshGenerator (abbreviated as PRMG)
PeripheralTriangleMeshGenerator (abbreviated as PTMG)
Geometry Features
Adds circular peripheral region to a reactor core mesh
PeripheralRingMeshGenerator has a boundary layer capability
Notes
PeripheralRingMeshGenerator generates a structured peripheral mesh with QUAD4 elements
PeripheralTriangleMeshGenerator generates an unstructured peripheral mesh with TRI3 elements
PRMG Example

Figure 6: Peripheral ring mesh generated by PeripheralRingMeshGenerator.
Listing 6: PRMG example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[pr]
type = PeripheralRingMeshGenerator<<<{"description": "This PeripheralRingMeshGenerator object adds a circular peripheral region to the input mesh.", "href": "../../../source/meshgenerators/PeripheralRingMeshGenerator.html"}>>>
input<<<{"description": "The input mesh to be modified."}>>> = pattern_core
peripheral_layer_num<<<{"description": "The radial layers of the peripheral ring to be added."}>>> = 3
peripheral_ring_radius<<<{"description": "Radius of the peripheral ring to be added."}>>> = 100.0
input_mesh_external_boundary<<<{"description": "The external boundary of the input mesh."}>>> = 10000
peripheral_ring_block_id<<<{"description": "The block id assigned to the created peripheral layer."}>>> = 300
peripheral_ring_block_name<<<{"description": "The block name assigned to the created peripheral layer."}>>> = reactor_ring
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)PTMG Example

Figure 7: Peripheral triangle mesh generated by PeripheralTriangleMeshGenerator.
Listing 7: PTMG example input.
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
[pt]
type = PeripheralTriangleMeshGenerator<<<{"description": "This PeripheralTriangleMeshGenerator object is designed to generate a triangulated mesh between a generated outer circle boundary and a provided inner mesh.", "href": "../../../source/meshgenerators/PeripheralTriangleMeshGenerator.html"}>>>
input<<<{"description": "The input mesh to be modified."}>>> = pattern_core
peripheral_ring_radius<<<{"description": "Radius of the peripheral ring to be added."}>>> = 100.0
peripheral_ring_num_segments<<<{"description": "Number of segments of the peripheral ring."}>>> = 100
desired_area<<<{"description": "Desired (maximum) triangle area, or 0 to skip uniform refinement"}>>> = 20
[]
[]
(tutorials/tutorial04_meshing/app/test/tests/base_mesh_generators/common_geo.i)