- num_sectorsNumber of azimuthal sectors in each quadrant. 'num_sectors' must be an even number.
C++ Type:unsigned int
Controllable:No
Description:Number of azimuthal sectors in each quadrant. 'num_sectors' must be an even number.
- slices_per_blockFor cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used.
C++ Type:std::vector<unsigned int>
Controllable:No
Description:For cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used.
Layered2DMeshGenerator
Base class containing methods used by mesh generators creating meshes based upon circular cross sections.
Description
This mesh generator class generates a layered 2-dimensional mesh containing multiple circular cross-sections of fuel and cladding. It allows the user to specify radii, mesh density, and gap sizes. A coating layer may be added to the exterior of the cladding, or multiple claddings may be defined. The fuel or cladding portion of the mesh can be disabled if desired. A missing pellet defect (MPS) may also be included on the fuel. Hollow and solid fuel pellets may be modeled. Details about common input parameters are as follows.
With uniform_slice_heights set to true, fuel slice heights are computed based on fuel_height. If set to false, provide slice_heights but not fuel_height. slice_heights is a list of heights for every slice in the model, including the plenum if a plenum is used.
plenum_height is the total height of cladding not adjacent to fuel.
plenum_heightFor comparison with 2D axisymmetric meshes (e.g.,FuelPinMeshGenerator), plenum_height must be the total of any non-fueled height above and below the fuel. Also note that plenum_height is only used with uniform_slice_heights set to true. If uniform_slice_heights is false and include_plenum is true, the last entry in slice_heights is the height of the plenum (again, the total non-fueled height).
pellet_bottom_coor is the vertical coordinate of the start of the fuel column. This means that the vertical coordinate of the first mesh layer will be at pellet_bottom_coor plus one half of the first layer height.
Multiple fuel blocks can be modeled each having its own pellet inner and outer radii. The cladding inner radius is defined as the largest pellet outer radius plus the clad_gap_width. Each fuel block may also have its own missing pellet surface (MPS) defect depth.
The spacing of the individual layers is the same as that shown in the figure for Layered1DMeshGenerator except that there is no axial line of symmetry assumed.
The resulting mesh will have the following sidesets:
| Sideset | Description |
|---|---|
2 | outer surface (named outer) |
5 | For a typical fuel and cladding mesh, this is the interior surface of the cladding. |
7 | For a typical fuel and cladding mesh, this is the interior surface of the cladding. |
8 | For a typical fuel and cladding mesh, this is the exterior surface of the fuel. |
9 | For a typical fuel and cladding mesh, this is the union of sidesets 7 and 8. |
10 | For a typical fuel and cladding mesh, this is the exterior surface of the fuel. |
101 | All the nodes along the abscissa axis (depends upon the out of plane direction specified) of the mesh (named bottom). See Figure 1. |
102 | All the nodes along the ordinate axis (depends upon the out of plane direction specified) of the mesh (named left). See Figure 1. |
1001, 1002, 1003, | every outside and inside radial surface of mesh blocks will receive a sideset, starting with 1001. Sideset 1001 is reserved for the interior surfaces on hollow fuel pellets (if fuel is included) and therefore the exterior of the fuel always has a sideset of 1002 regardless if it is solid or not. This allows a mesh to be created containing both solid and hollow fuel pellets with consistent sideset numbering throughout the mesh. For meshes containing no fuel sideset numbering begins at 1001 at the interior surface of the clad. |

Figure 1: Diagram describing the bottom (black) and left (red) sidesets depending upon the out of plane direction specified. Only one layer is shown.
The resulting mesh will have the following nodesets:
| Nodeset | Description |
|---|---|
10000, 10001, 10002, 10003, | corresponds to specific nodes at two locations at the interior and exterior of every ring as well as the central node if the first ring is solid. Nodeset 10000 is reserved for the central node of the first ring if it is solid. See Figure 2 for an illustration of the nodeset locations. The nodeset number continues to increase in the same fashion if additional rings are added. |

Figure 2: Diagram describing nodeset numbering convention. A solid fuel layer and a hollow fuel layer with a MPS are shown. The arrows are pointing to the nodes on the inner surface of the cladding.
The resulting mesh will have the following blocks:
| Block | Description |
|---|---|
1 | clad (named clad) |
3, 4, 5, | the fuel blocks. The total number is equal to the size of the slices_per_block parameter (if one block, named 'fuel', else named fuel1, fuel2, fuel3, etc.) |
3 + total_fuel_blocks, 3 + total_fuel_blocks + 1, | the additional_rings (names based upon the user supplied names in additional_block_names parameter) |
Example Input Syntax
An example of using the layered 2D mesh generator for a mesh containing a single fuel block and clad:
[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
[l2Dmg]
type = Layered2DMeshGenerator<<<{"description": "Base class containing methods used by mesh generators creating meshes based upon circular cross sections.", "href": "Layered2DMeshGenerator.html"}>>>
num_sectors<<<{"description": "Number of azimuthal sectors in each quadrant. 'num_sectors' must be an even number."}>>> = 10
slices_per_block<<<{"description": "For cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used."}>>> = '2'
pellet_bottom_coor<<<{"description": "Axial location of the start of the fuel stack."}>>> = 0.0
pellet_mesh_density<<<{"description": "Sets the mesh density of the pellet (coarse, medium, fine, customize)."}>>> = coarse
clad_mesh_density<<<{"description": "Sets the mesh density of the cladding (coarse, medium, fine, customize)."}>>> = coarse
include_plenum<<<{"description": "Whether to include the plenum."}>>> = false
fuel_height<<<{"description": "Height of the fuel."}>>> = 10e-3
[]
[](test/tests/layered2D/layered2D_mesh.i)An example of using the layered 2D mesh generator for a mesh containing a single fuel block and clad with non uniform slice heights:
[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
[l2Dmg]
type = Layered2DMeshGenerator<<<{"description": "Base class containing methods used by mesh generators creating meshes based upon circular cross sections.", "href": "Layered2DMeshGenerator.html"}>>>
num_sectors<<<{"description": "Number of azimuthal sectors in each quadrant. 'num_sectors' must be an even number."}>>> = 10
slices_per_block<<<{"description": "For cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used."}>>> = '2'
pellet_bottom_coor<<<{"description": "Axial location of the start of the fuel stack."}>>> = 0.0
pellet_mesh_density<<<{"description": "Sets the mesh density of the pellet (coarse, medium, fine, customize)."}>>> = coarse
clad_mesh_density<<<{"description": "Sets the mesh density of the cladding (coarse, medium, fine, customize)."}>>> = coarse
include_plenum<<<{"description": "Whether to include the plenum."}>>> = false
slice_heights<<<{"description": "Needed if uniform_slice_heights is false. Height of each slice. The number of slices provided must be the total number of fuel slices, plus one slice for the plenum, if a plenum is used, plus one slice for the lower plenum, if a lower plenum is used. This equals the number of slices in the cladding."}>>> = '10e-3 25e-3'
uniform_slice_heights<<<{"description": "Whether heights of fuel/cladding slices are uniform, excluding plenum height."}>>> = false
[]
[](test/tests/layered2D/layered2D_non_uniform_mesh.i)An example of using the layered 2D mesh generator for a mesh containing an additional gap and block representing an outer capsule:
[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
[l2Dmg]
type = Layered2DMeshGenerator<<<{"description": "Base class containing methods used by mesh generators creating meshes based upon circular cross sections.", "href": "Layered2DMeshGenerator.html"}>>>
num_sectors<<<{"description": "Number of azimuthal sectors in each quadrant. 'num_sectors' must be an even number."}>>> = 10
slices_per_block<<<{"description": "For cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used."}>>> = '2'
pellet_bottom_coor<<<{"description": "Axial location of the start of the fuel stack."}>>> = 0.0
pellet_mesh_density<<<{"description": "Sets the mesh density of the pellet (coarse, medium, fine, customize)."}>>> = coarse
clad_mesh_density<<<{"description": "Sets the mesh density of the cladding (coarse, medium, fine, customize)."}>>> = coarse
include_plenum<<<{"description": "Whether to include the plenum."}>>> = false
fuel_height<<<{"description": "Height of the fuel."}>>> = 10e-3
additional_block_names<<<{"description": "The names assigned to the blocks representing the additional rings."}>>> = 'null capsule'
additional_elements_per_ring<<<{"description": "The number of elements through the additional rings. Must be the same length as additional_ring_thicknesses."}>>> = '0 1'
additional_ring_thicknesses<<<{"description": "The thicknesses of additional rings."}>>> = '100e-6 500e-6'
[]
[](test/tests/layered2D/layered2D_additional_blocks_mesh.i)Multiple Fuel Rods
The ability to create multiple fuel rods within the same input file also exists. See Layered2DArray.
It is also possible to create multiple fuel rods directly. In doing so, the numbering system described above still exists, but offsets to the base numbering are required. This is achieved through the input parameters name_prefix and id_offset ensuring unique names and numbering for possible otherwise identical fuel rods. Additionally, the use of Translation blocks in the mesh construction should be utilized to guarantee distinct coordinates for each fuel rod.
An example of constructing multiple fuel rods:
[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
[layered2D_mesh_1]
type = Layered2DMeshGenerator<<<{"description": "Base class containing methods used by mesh generators creating meshes based upon circular cross sections.", "href": "Layered2DMeshGenerator.html"}>>>
axial_direction<<<{"description": "The direction perpendicular to the circular cross section."}>>> = z
num_sectors<<<{"description": "Number of azimuthal sectors in each quadrant. 'num_sectors' must be an even number."}>>> = 10
slices_per_block<<<{"description": "For cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used."}>>> = 36
clad_thickness<<<{"description": "Thickness of cladding."}>>> = 0.56e-3
clad_gap_width<<<{"description": "Gap between maximum outer radius of pellet and inside surface of cladding."}>>> = 0.0
fuel_height<<<{"description": "Height of the fuel."}>>> = 3.6
include_plenum<<<{"description": "Whether to include the plenum."}>>> = false
pellet_bottom_coor<<<{"description": "Axial location of the start of the fuel stack."}>>> = 0.0
pellet_outer_radius<<<{"description": "Pellet outer radius. If more than one given, number must match number of fuel blocks."}>>> = 0.0045
name_prefix<<<{"description": "If provided, prefix the built in boundary names with this string"}>>> = 'righthand'
id_offset<<<{"description": "This offset is added to the generated boundary IDs"}>>> = 10
# show_info = true
[]
[translate_1]
type = TransformGenerator<<<{"description": "Applies a linear transform to the entire mesh.", "href": "TransformGenerator.html"}>>>
transform<<<{"description": "The type of transformation to perform (TRANSLATE, TRANSLATE_CENTER_ORIGIN, TRANSLATE_MIN_ORIGIN, ROTATE, SCALE)"}>>> = TRANSLATE
vector_value<<<{"description": "The value to use for the transformation. When using TRANSLATE or SCALE, the xyz coordinates are applied in each direction respectively. When using ROTATE, the values are interpreted as the Euler angles phi, theta and psi given in degrees."}>>> = '1 0 0'
input<<<{"description": "The mesh we want to modify"}>>> = layered2D_mesh_1
[]
[layered2D_mesh_2]
type = Layered2DMeshGenerator<<<{"description": "Base class containing methods used by mesh generators creating meshes based upon circular cross sections.", "href": "Layered2DMeshGenerator.html"}>>>
axial_direction<<<{"description": "The direction perpendicular to the circular cross section."}>>> = z
num_sectors<<<{"description": "Number of azimuthal sectors in each quadrant. 'num_sectors' must be an even number."}>>> = 10
slices_per_block<<<{"description": "For cases with only cladding, this is a single number providing the total number of slices for the cladding. For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used."}>>> = 36
clad_thickness<<<{"description": "Thickness of cladding."}>>> = 0.56e-3
clad_gap_width<<<{"description": "Gap between maximum outer radius of pellet and inside surface of cladding."}>>> = 0.0
fuel_height<<<{"description": "Height of the fuel."}>>> = 3.6
include_plenum<<<{"description": "Whether to include the plenum."}>>> = false
pellet_bottom_coor<<<{"description": "Axial location of the start of the fuel stack."}>>> = 0.0
pellet_outer_radius<<<{"description": "Pellet outer radius. If more than one given, number must match number of fuel blocks."}>>> = 0.0045
name_prefix<<<{"description": "If provided, prefix the built in boundary names with this string"}>>> = 'lefthand'
id_offset<<<{"description": "This offset is added to the generated boundary IDs"}>>> = 30
# show_info = true
[]
[translate_2]
type = TransformGenerator<<<{"description": "Applies a linear transform to the entire mesh.", "href": "TransformGenerator.html"}>>>
transform<<<{"description": "The type of transformation to perform (TRANSLATE, TRANSLATE_CENTER_ORIGIN, TRANSLATE_MIN_ORIGIN, ROTATE, SCALE)"}>>> = TRANSLATE
vector_value<<<{"description": "The value to use for the transformation. When using TRANSLATE or SCALE, the xyz coordinates are applied in each direction respectively. When using ROTATE, the values are interpreted as the Euler angles phi, theta and psi given in degrees."}>>> = '-1 0 0'
input<<<{"description": "The mesh we want to modify"}>>> = layered2D_mesh_2
[]
[combine]
type = CombinerGenerator<<<{"description": "Combine multiple meshes (or copies of one mesh) together into one (disjoint) mesh. Can optionally translate those meshes before combining them.", "href": "CombinerGenerator.html"}>>>
inputs<<<{"description": "The input MeshGenerators. This can either be N generators or 1 generator. If only 1 is given then 'positions' must also be given."}>>> = 'translate_1 translate_2'
[]
partitioner = centroid
centroid_partitioner_direction = z
patch_update_strategy = auto
[](examples/axial_relocation/layered2D/single_balloon/single_balloon_two_rods.i)id_offsetCurrently, id_offset needs to be additionally set for the AxialRelocationAction.
Input Parameters
- additional_block_namesThe names assigned to the blocks representing the additional rings.
C++ Type:std::vector<std::string>
Controllable:No
Description:The names assigned to the blocks representing the additional rings.
- additional_elements_per_ringThe number of elements through the additional rings. Must be the same length as additional_ring_thicknesses.
C++ Type:std::vector<unsigned int>
Controllable:No
Description:The number of elements through the additional rings. Must be the same length as additional_ring_thicknesses.
- additional_ring_thicknessesThe thicknesses of additional rings.
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:The thicknesses of additional rings.
- all_bottom_leftFalseWhether to generate sidesets for every bottom and left surface of mesh blocks.
Default:False
C++ Type:bool
Controllable:No
Description:Whether to generate sidesets for every bottom and left surface of mesh blocks.
- axial_directionzThe direction perpendicular to the circular cross section.
Default:z
C++ Type:MooseEnum
Controllable:No
Description:The direction perpendicular to the circular cross section.
- clad_gap_width2.5e-05Gap between maximum outer radius of pellet and inside surface of cladding.
Default:2.5e-05
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Gap between maximum outer radius of pellet and inside surface of cladding.
- clad_mesh_densitymediumSets the mesh density of the cladding (coarse, medium, fine, customize).
Default:medium
C++ Type:MooseEnum
Controllable:No
Description:Sets the mesh density of the cladding (coarse, medium, fine, customize).
- clad_thickness0.00041Thickness of cladding.
Default:0.00041
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Thickness of cladding.
- compress_boundary_idsFalseWhether to compress the boundary IDs into a consecutive list.
Default:False
C++ Type:bool
Controllable:No
Description:Whether to compress the boundary IDs into a consecutive list.
- elem_typequad8Whether to generate quad8 or quad4 elements.
Default:quad8
C++ Type:MooseEnum
Controllable:No
Description:Whether to generate quad8 or quad4 elements.
- fuel_heightHeight of the fuel.
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Height of the fuel.
- id_offset0This offset is added to the generated boundary IDs
Default:0
C++ Type:short
Controllable:No
Description:This offset is added to the generated boundary IDs
- include_cladTrueWhether to include the clad block.
Default:True
C++ Type:bool
Controllable:No
Description:Whether to include the clad block.
- include_fuelTrueWhether to include the fuel block.
Default:True
C++ Type:bool
Controllable:No
Description:Whether to include the fuel block.
- include_plenumTrueWhether to include the plenum.
Default:True
C++ Type:bool
Controllable:No
Description:Whether to include the plenum.
- liner_thickness0Thickness of liner on interior of cladding.
Default:0
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Thickness of liner on interior of cladding.
- mps_depth0 Radial depth of MPS. If more than one given, number must match the number of fuel blocks.
Default:0
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:Radial depth of MPS. If more than one given, number must match the number of fuel blocks.
- name_prefixIf provided, prefix the built in boundary names with this string
C++ Type:std::string
Controllable:No
Description:If provided, prefix the built in boundary names with this string
- nr_c2Number of cladding elements in radial direction.
Default:2
C++ Type:unsigned int
Controllable:No
Description:Number of cladding elements in radial direction.
- nr_p4Number of fuel elements in radial direction of the outer ring outside the inner quadrilateral portion of the fuel mesh.
Default:4
C++ Type:unsigned int
Controllable:No
Description:Number of fuel elements in radial direction of the outer ring outside the inner quadrilateral portion of the fuel mesh.
- offsetsOffset of each fuel slice block (x and y for each block).
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:Offset of each fuel slice block (x and y for each block).
- pellet_bottom_coor0.00324Axial location of the start of the fuel stack.
Default:0.00324
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Axial location of the start of the fuel stack.
- pellet_inner_radius0 Pellet inner radius. If more than one given, number must match number of fuel blocks.
Default:0
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:Pellet inner radius. If more than one given, number must match number of fuel blocks.
- pellet_mesh_densitymediumSets the mesh density of the pellet (coarse, medium, fine, customize).
Default:medium
C++ Type:MooseEnum
Controllable:No
Description:Sets the mesh density of the pellet (coarse, medium, fine, customize).
- pellet_outer_radius0.0041 Pellet outer radius. If more than one given, number must match number of fuel blocks.
Default:0.0041
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:Pellet outer radius. If more than one given, number must match number of fuel blocks.
- plenum_heightHeight of the plenum, including above and below the fuel.
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Height of the plenum, including above and below the fuel.
- portionfullControl of which part of mesh is created
Default:full
C++ Type:MooseEnum
Controllable:No
Description:Control of which part of mesh is created
- slice_heightsNeeded if uniform_slice_heights is false. Height of each slice. The number of slices provided must be the total number of fuel slices, plus one slice for the plenum, if a plenum is used, plus one slice for the lower plenum, if a lower plenum is used. This equals the number of slices in the cladding.
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:Needed if uniform_slice_heights is false. Height of each slice. The number of slices provided must be the total number of fuel slices, plus one slice for the plenum, if a plenum is used, plus one slice for the lower plenum, if a lower plenum is used. This equals the number of slices in the cladding.
- slices_within_upper_plenum1Number of slices within the upper plenum. By default, the upper plenum is treated as a single volume (#slices = 1).
Default:1
C++ Type:unsigned int
Controllable:No
Description:Number of slices within the upper plenum. By default, the upper plenum is treated as a single volume (#slices = 1).
- uniform_slice_heightsTrueWhether heights of fuel/cladding slices are uniform, excluding plenum height.
Default:True
C++ Type:bool
Controllable:No
Description:Whether heights of fuel/cladding slices are uniform, excluding plenum height.
- use_legacy_block_idsTrueWhether to use legacy block id convention.
Default:True
C++ Type:bool
Controllable:No
Description:Whether to use legacy block id convention.
Optional Parameters
- enableTrueSet the enabled status of the MooseObject.
Default:True
C++ Type:bool
Controllable:No
Description:Set the enabled status of the MooseObject.
- save_with_nameKeep the mesh from this mesh generator in memory with the name specified
C++ Type:std::string
Controllable:No
Description:Keep the mesh from this mesh generator in memory with the name specified
Advanced Parameters
- nemesisFalseWhether or not to output the mesh file in the nemesisformat (only if output = true)
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not to output the mesh file in the nemesisformat (only if output = true)
- outputFalseWhether or not to output the mesh file after generating the mesh
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not to output the mesh file after generating the mesh
- show_infoFalseWhether or not to show mesh info after generating the mesh (bounding box, element types, sidesets, nodesets, subdomains, etc)
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not to show mesh info after generating the mesh (bounding box, element types, sidesets, nodesets, subdomains, etc)
Debugging Parameters
Input Files
- (test/tests/layered2D/layered2D_additional_blocks_mesh.i)
- (test/tests/layered2D/layered_plenum_temperature.i)
- (test/tests/layered2D/layered_integral.i)
- (examples/axial_relocation/layered2D/single_balloon/single_balloon.i)
- (examples/axial_relocation/layered2D/single_balloon/single_balloon_translated.i)
- (examples/axial_relocation/layered2D/twin_balloon/twin_balloon.i)
- (test/tests/layered2D/side_average_value.i)
- (test/tests/layered2D/gps_elastic_2scalar_2slice_1block.i)
- (test/tests/layered2D/layered_axial_profile.i)
- (test/tests/layered2D/thickness.i)
- (test/tests/layered2D/internal_volume.i)
- (test/tests/layered2D/multi_block.i)
- (test/tests/layered2D/layered2D_mesh.i)
- (examples/axial_relocation/layered2D/single_balloon/single_balloon_two_rods.i)
- (test/tests/layered2D/layered2D_init_eigenstrain.i)
- (test/tests/layered2D/layered_axial_profile_nonuniform.i)
- (test/tests/radial_power_factor/offset.i)
- (test/tests/layered2D/fuel_pin_geometry.i)
- (test/tests/layered2D/layered2D_non_uniform_mesh.i)
- (test/tests/fuelrodlinevaluesampler/chk_layered2D_mesh.i)