- bundle_pitchBundle pitch, or flat-to-flat distance across bundle
C++ Type:double
Controllable:No
Description:Bundle pitch, or flat-to-flat distance across bundle
- heightHeight of assembly
C++ Type:double
Controllable:No
Description:Height of assembly
- n_axialNumber of axial cells
C++ Type:unsigned int
Controllable:No
Description:Number of axial cells
- n_ringsNumber of pin rings, including the centermost pin as a 'ring'
C++ Type:unsigned int
Controllable:No
Description:Number of pin rings, including the centermost pin as a 'ring'
- pin_diameterPin outer diameter
C++ Type:double
Controllable:No
Description:Pin outer diameter
- pin_pitchPin pitch, or distance between pin centers
C++ Type:double
Controllable:No
Description:Pin pitch, or distance between pin centers
HexagonalSubchannelMesh
Mesh respecting subchannel boundaries for a triangular lattice
Description
This class builds a 3-D mesh of a triangular lattice of pins enclosed in a hexagonal duct with a uniform axial discretization. The theta_res
parameter indicates how many nodes should be placed on the pin's surface in each channel, while the gap_res
parameter indicates how many nodes should be placed on each gap.
To allow easy averages or other postprocessors to be applied by channel type, all interior, edge, and corner channels are by default set to a unique subdomain ID (1 for the interior channels, 2 for the edge channels, and 3 for the corner channels). This behavior can be controlled by setting the interior_id
, edge_id
, and corner_id
parameters to the desired subdomain IDs.
By default, this class will create a volume mesh of a subchannel discretization (i.e. using 3-D elements). By setting volume_mesh = false
, you can instead create 2-D plane meshes (on planes perpendicular to axis
), such as for visualizing results from a user object paired with a LayeredGapBin.
This class is intended ONLY for visualization purposes - node connectivity between elements is not obeyed, so you cannot use this mesh to solve any anything that requires connectivity information between elements (such as a finite element solve).
Example Input syntax
The following shows the mesh generated for a bundle with three rings of pins with two axial layers.
[Mesh]
type = HexagonalSubchannelMesh
bundle_pitch = 4.0
pin_pitch = 0.8
pin_diameter = 0.6
n_rings = 3
n_axial = 2
height = 0.5
gap_res = 3
[]
(test/tests/mesh/hexagonal_subchannel_mesh/three_rings.i)An image of the generated mesh is shown in Figure 1. The elements are colored by block ID. By default, all interior channels are added to block 1, all edge channels to block 2, and all corner channels to block 3.
The following shows the mesh generated for a bundle with two rings of pins with two axial layers when volume_mesh = false
.
[Mesh]
type = HexagonalSubchannelMesh
bundle_pitch = 2.5
pin_pitch = 0.8
pin_diameter = 0.6
n_rings = 2
n_axial = 2
height = 0.5
volume_mesh = false
[]
(test/tests/mesh/hexagonal_subchannel_mesh/two_rings_faces.i)An image of the generate mesh is shown in Figure 2. The elements are again colored by block ID.
Input Parameters
- add_sideset_idsThe listed sideset ids will be assumed valid for the mesh. This permits setting up boundary restrictions for sidesets initially containing no sides. Names for this sidesets may be provided using add_sideset_names. In this case this list and add_sideset_names must contain the same number of items.
C++ Type:std::vector<short>
Controllable:No
Description:The listed sideset ids will be assumed valid for the mesh. This permits setting up boundary restrictions for sidesets initially containing no sides. Names for this sidesets may be provided using add_sideset_names. In this case this list and add_sideset_names must contain the same number of items.
- add_sideset_namesThe listed sideset names will be assumed valid for the mesh. This permits setting up boundary restrictions for sidesets initially containing no sides. Ids for this sidesets may be provided using add_sideset_ids. In this case this list and add_sideset_ids must contain the same number of items.
C++ Type:std::vector<BoundaryName>
Controllable:No
Description:The listed sideset names will be assumed valid for the mesh. This permits setting up boundary restrictions for sidesets initially containing no sides. Ids for this sidesets may be provided using add_sideset_ids. In this case this list and add_sideset_ids must contain the same number of items.
- add_subdomain_idsThe listed subdomain ids will be assumed valid for the mesh. This permits setting up subdomain restrictions for subdomains initially containing no elements, which can occur, for example, in additive manufacturing simulations which dynamically add and remove elements. Names for this subdomains may be provided using add_subdomain_names. In this case this list and add_subdomain_names must contain the same number of items.
C++ Type:std::vector<unsigned short>
Controllable:No
Description:The listed subdomain ids will be assumed valid for the mesh. This permits setting up subdomain restrictions for subdomains initially containing no elements, which can occur, for example, in additive manufacturing simulations which dynamically add and remove elements. Names for this subdomains may be provided using add_subdomain_names. In this case this list and add_subdomain_names must contain the same number of items.
- add_subdomain_namesThe listed subdomain names will be assumed valid for the mesh. This permits setting up subdomain restrictions for subdomains initially containing no elements, which can occur, for example, in additive manufacturing simulations which dynamically add and remove elements. IDs for this subdomains may be provided using add_subdomain_ids. Otherwise IDs are automatically assigned. In case add_subdomain_ids is set too, both lists must contain the same number of items.
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The listed subdomain names will be assumed valid for the mesh. This permits setting up subdomain restrictions for subdomains initially containing no elements, which can occur, for example, in additive manufacturing simulations which dynamically add and remove elements. IDs for this subdomains may be provided using add_subdomain_ids. Otherwise IDs are automatically assigned. In case add_subdomain_ids is set too, both lists must contain the same number of items.
- allow_renumberingTrueIf allow_renumbering=false, node and element numbers are kept fixed until deletion
Default:True
C++ Type:bool
Controllable:No
Description:If allow_renumbering=false, node and element numbers are kept fixed until deletion
- axiszvertical axis of the reactor (x, y, or z) along which pins are aligned
Default:z
C++ Type:MooseEnum
Controllable:No
Description:vertical axis of the reactor (x, y, or z) along which pins are aligned
- build_all_side_lowerd_meshFalseTrue to build the lower-dimensional mesh for all sides.
Default:False
C++ Type:bool
Controllable:No
Description:True to build the lower-dimensional mesh for all sides.
- coord_blockBlock IDs for the coordinate systems. If this parameter is specified, then it must encompass all the subdomains on the mesh.
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:Block IDs for the coordinate systems. If this parameter is specified, then it must encompass all the subdomains on the mesh.
- corner_id3Block ID to set for the corner channels
Default:3
C++ Type:unsigned short
Controllable:No
Description:Block ID to set for the corner channels
- edge_id2Block ID to set for the edge channels
Default:2
C++ Type:unsigned short
Controllable:No
Description:Block ID to set for the edge channels
- gap_res2Number of nodes on each gap
Default:2
C++ Type:unsigned int
Controllable:No
Description:Number of nodes on each gap
- ghosting_patch_sizeThe number of nearest neighbors considered for ghosting purposes when 'iteration' patch update strategy is used. Default is 5 * patch_size.
C++ Type:unsigned int
Controllable:No
Description:The number of nearest neighbors considered for ghosting purposes when 'iteration' patch update strategy is used. Default is 5 * patch_size.
- interior_id1Block ID to set for the interior channels
Default:1
C++ Type:unsigned short
Controllable:No
Description:Block ID to set for the interior channels
- max_leaf_size10The maximum number of points in each leaf of the KDTree used in the nearest neighbor search. As the leaf size becomes larger,KDTree construction becomes faster but the nearest neighbor searchbecomes slower.
Default:10
C++ Type:unsigned int
Controllable:No
Description:The maximum number of points in each leaf of the KDTree used in the nearest neighbor search. As the leaf size becomes larger,KDTree construction becomes faster but the nearest neighbor searchbecomes slower.
- parallel_typeDEFAULTDEFAULT: Use libMesh::ReplicatedMesh unless --distributed-mesh is specified on the command line REPLICATED: Always use libMesh::ReplicatedMesh DISTRIBUTED: Always use libMesh::DistributedMesh
Default:DEFAULT
C++ Type:MooseEnum
Controllable:No
Description:DEFAULT: Use libMesh::ReplicatedMesh unless --distributed-mesh is specified on the command line REPLICATED: Always use libMesh::ReplicatedMesh DISTRIBUTED: Always use libMesh::DistributedMesh
- skip_refine_when_use_splitTrueTrue to skip uniform refinements when using a pre-split mesh.
Default:True
C++ Type:bool
Controllable:No
Description:True to skip uniform refinements when using a pre-split mesh.
- theta_res6Number of nodes on each pin's arc length with a channel
Default:6
C++ Type:unsigned int
Controllable:No
Description:Number of nodes on each pin's arc length with a channel
- volume_meshTrueWhether to generate a volume mesh (true) or just the surfaces between axial layers in the domain (false)
Default:True
C++ Type:bool
Controllable:No
Description:Whether to generate a volume mesh (true) or just the surfaces between axial layers in the domain (false)
Optional Parameters
- alpha_rotationThe number of degrees that the domain should be alpha-rotated using the Euler angle ZXZ convention from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix in order to align with a canonical physical space of your choosing.
C++ Type:double
Controllable:No
Description:The number of degrees that the domain should be alpha-rotated using the Euler angle ZXZ convention from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix in order to align with a canonical physical space of your choosing.
- beta_rotationThe number of degrees that the domain should be beta-rotated using the Euler angle ZXZ convention from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix in order to align with a canonical physical space of your choosing.
C++ Type:double
Controllable:No
Description:The number of degrees that the domain should be beta-rotated using the Euler angle ZXZ convention from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix in order to align with a canonical physical space of your choosing.
- gamma_rotationThe number of degrees that the domain should be gamma-rotated using the Euler angle ZXZ convention from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix in order to align with a canonical physical space of your choosing.
C++ Type:double
Controllable:No
Description:The number of degrees that the domain should be gamma-rotated using the Euler angle ZXZ convention from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix in order to align with a canonical physical space of your choosing.
- length_unitHow much distance one mesh length unit represents, e.g. 1 cm, 1 nm, 1 ft, 5inches
C++ Type:std::string
Controllable:No
Description:How much distance one mesh length unit represents, e.g. 1 cm, 1 nm, 1 ft, 5inches
- up_directionSpecify what axis corresponds to the up direction in physical space (the opposite of the gravity vector if you will). If this parameter is provided, we will perform a single 90 degree rotation of the domain--if the provided axis is 'x' or 'z', we will not rotate if the axis is 'y'--such that a point which was on the provided axis will now lie on the y-axis, e.g. the y-axis is our canonical up direction. If you want finer grained control than this, please use the 'alpha_rotation', 'beta_rotation', and 'gamma_rotation' parameters.
C++ Type:MooseEnum
Controllable:No
Description:Specify what axis corresponds to the up direction in physical space (the opposite of the gravity vector if you will). If this parameter is provided, we will perform a single 90 degree rotation of the domain--if the provided axis is 'x' or 'z', we will not rotate if the axis is 'y'--such that a point which was on the provided axis will now lie on the y-axis, e.g. the y-axis is our canonical up direction. If you want finer grained control than this, please use the 'alpha_rotation', 'beta_rotation', and 'gamma_rotation' parameters.
Transformations Relative To Parent Application Frame Of Reference Parameters
- coord_typeXYZType of the coordinate system per block param
Default:XYZ
C++ Type:MultiMooseEnum
Controllable:No
Description:Type of the coordinate system per block param
- rz_coord_axisYThe rotation axis (X | Y) for axisymmetric coordinates
Default:Y
C++ Type:MooseEnum
Controllable:No
Description:The rotation axis (X | Y) for axisymmetric coordinates
- rz_coord_blocksBlocks using general axisymmetric coordinate systems
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:Blocks using general axisymmetric coordinate systems
- rz_coord_directionsAxis directions for each block in 'rz_coord_blocks'
C++ Type:std::vector<libMesh::VectorValue<double>>
Controllable:No
Description:Axis directions for each block in 'rz_coord_blocks'
- rz_coord_originsAxis origin points for each block in 'rz_coord_blocks'
C++ Type:std::vector<libMesh::Point>
Controllable:No
Description:Axis origin points for each block in 'rz_coord_blocks'
Coordinate System Parameters
- centroid_partitioner_directionSpecifies the sort direction if using the centroid partitioner. Available options: x, y, z, radial
C++ Type:MooseEnum
Controllable:No
Description:Specifies the sort direction if using the centroid partitioner. Available options: x, y, z, radial
- partitionerdefaultSpecifies a mesh partitioner to use when splitting the mesh for a parallel computation.
Default:default
C++ Type:MooseEnum
Controllable:No
Description:Specifies a mesh partitioner to use when splitting the mesh for a parallel computation.
Partitioning Parameters
- construct_node_list_from_side_listTrueWhether or not to generate nodesets from the sidesets (usually a good idea).
Default:True
C++ Type:bool
Controllable:No
Description:Whether or not to generate nodesets from the sidesets (usually a good idea).
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
Controllable:No
Description:Adds user-defined labels for accessing object parameters via control logic.
- dim1This is only required for certain mesh formats where the dimension of the mesh cannot be autodetected. In particular you must supply this for GMSH meshes. Note: This is completely ignored for ExodusII meshes!
Default:1
C++ Type:MooseEnum
Controllable:No
Description:This is only required for certain mesh formats where the dimension of the mesh cannot be autodetected. In particular you must supply this for GMSH meshes. Note: This is completely ignored for ExodusII meshes!
- enableTrueSet the enabled status of the MooseObject.
Default:True
C++ Type:bool
Controllable:No
Description:Set the enabled status of the MooseObject.
- nemesisFalseIf nemesis=true and file=foo.e, actually reads foo.e.N.0, foo.e.N.1, ... foo.e.N.N-1, where N = # CPUs, with NemesisIO.
Default:False
C++ Type:bool
Controllable:No
Description:If nemesis=true and file=foo.e, actually reads foo.e.N.0, foo.e.N.1, ... foo.e.N.N-1, where N = # CPUs, with NemesisIO.
- patch_size40The number of nodes to consider in the NearestNode neighborhood.
Default:40
C++ Type:unsigned int
Controllable:No
Description:The number of nodes to consider in the NearestNode neighborhood.
- patch_update_strategyneverHow often to update the geometric search 'patch'. The default is to never update it (which is the most efficient but could be a problem with lots of relative motion). 'always' will update the patch for all secondary nodes at the beginning of every timestep which might be time consuming. 'auto' will attempt to determine at the start of which timesteps the patch for all secondary nodes needs to be updated automatically.'iteration' updates the patch at every nonlinear iteration for a subset of secondary nodes for which penetration is not detected. If there can be substantial relative motion between the primary and secondary surfaces during the nonlinear iterations within a timestep, it is advisable to use 'iteration' option to ensure accurate contact detection.
Default:never
C++ Type:MooseEnum
Controllable:No
Description:How often to update the geometric search 'patch'. The default is to never update it (which is the most efficient but could be a problem with lots of relative motion). 'always' will update the patch for all secondary nodes at the beginning of every timestep which might be time consuming. 'auto' will attempt to determine at the start of which timesteps the patch for all secondary nodes needs to be updated automatically.'iteration' updates the patch at every nonlinear iteration for a subset of secondary nodes for which penetration is not detected. If there can be substantial relative motion between the primary and secondary surfaces during the nonlinear iterations within a timestep, it is advisable to use 'iteration' option to ensure accurate contact detection.
Advanced Parameters
Input Files
- (test/tests/mesh/hexagonal_gap_mesh/context_mesh3.i)
- (test/tests/userobjects/volume/nondimensional/subchannel.i)
- (test/tests/mesh/hexagonal_subchannel_mesh/one_ring.i)
- (test/tests/userobjects/hexagonal_gap_layered/subchannel_axial.i)
- (test/tests/mesh/hexagonal_subchannel_mesh/two_rings.i)
- (test/tests/userobjects/subchannel_layered/subchannel.i)
- (test/tests/mesh/hexagonal_subchannel_mesh/one_ring_faces.i)
- (test/tests/userobjects/volume/dimensional/subchannel.i)
- (test/tests/userobjects/hexagonal_subchannel_bin/subchannel.i)
- (test/tests/mesh/hexagonal_subchannel_mesh/three_rings.i)
- (test/tests/mesh/hexagonal_subchannel_mesh/three_rings_faces.i)
- (test/tests/userobjects/subchannel_layered/subchannel_b.i)
- (tutorials/subchannel/subchannel.i)
- (test/tests/mesh/hexagonal_subchannel_mesh/two_rings_faces.i)
- (test/tests/userobjects/hexagonal_gap_bin/context_mesh3.i)
- (test/tests/userobjects/hexagonal_gap_layered/normals/subchannel_axial.i)