PolygonConcentricCircleMeshGenerator

This PolygonConcentricCircleMeshGenerator object is designed to mesh a polygon geometry with optional rings centered inside.

Overview

Figure 1: Typical meshes generated by this PolygonConcentricCircleMeshGenerator object: the left mesh consists of linear elements while the right mesh consists of quadratic elements.

The PolygonConcentricCircleMeshGenerator object generates a 2D mesh for concentric circles with a regular polygon enclosure with or without external ducts. Typical meshes generated by this object are shown in Figure 1. By default, the generated mesh consists of linear elements. If quadratic elements are preferred, users can set "tri_element_type" as TRI6 or TRI7, and "quad_element_type" as QUAD8 or QUAD9. Polygons with 3 or more sides (e.g. triangle, square, pentagon, hexagon,...) can be meshed using this object. The central concentric circular regions (termed rings) as well as the peripheral polygonal regions (termed ducts) are optional (see Figure 2). The region excluding any rings and ducts is termed the background region.

Geometry Information

The most fundamental geometry parameters that are needed by this object is:

Figure 2: A schematic drawing showing the different regions that can be generated by this PolygonConcentricCircleMeshGenerator object.

If concentric circle regions are needed, "ring_radii" must be provided to define the outer radius of each ring. If duct regions are needed, "duct_sizes" must be provided to define the inner boundary of each duct. Similar to "polygon_size", "duct_sizes" can either be apothems or radii of the corresponding ducts, decided by "duct_sizes_style".

Mesh Information

The parameters that are needed for meshing can be categorized into azimuthal and radial information, which determine the mesh density.

The azimuthal mesh discretization is controlled by "num_sectors_per_side", which is a vector that has the same length as "num_sides". Each element of "num_sectors_per_side" must be an even integer, which is the number of azimuthal intervals of the corresponding side. The sides are indexed counterclockwise with the upper-right polygon side being the first side as shown in Figure 2.

The radial mesh discretization is controlled by separate parameters for rings, background and ducts regions, which are "ring_intervals", "background_intervals", and "duct_intervals", respectively.

In addition, the radial meshing density of each rings, background and ducts region can be biased by setting corresponding parameters, which are "ring_radial_biases", "background_radial_bias", and "duct_radial_biases", respectively. The bias value should be a positive Real type parameter, which is the radial dimension ratio between two radially-neighboring elements (outer to inner).

Boundary Layers

Aside from the general mesh radial biasing options described above, users can also define boundary layers on each ring, background, and duct regions. For each region, both inner and outer boundary layers are supported (in this case, inner boundary layer refers to a boundary layer on the volume closer to the center of the polygon, and outer boundary layer refers to a boundary layer on the volume further from the center of the polygon; these two volumes are separated by the boundary itself). Each boundary layer requires three key input parameters:

If there are multiple ring/duct regions in the generated mesh, the boundary layer related parameters of all these regions must be provided together as vectors.

MeshMeshData Generation

When "num_sides" is set as 6, the hexagonal meshes produced by PolygonConcentricCircleMeshGenerator can be used by PatternedHexMeshGenerator to create patterned meshes. This functionality relies on a series of MeshMetaData generated by PolygonConcentricCircleMeshGenerator, including:

  • pitch_meta, type Real: Provides the side-to-side distance of the hexagon generated.

  • pattern_pitch_meta, type Real: Similar to pitch_meta. This is only used when the mesh produced here is stitched with assembly hexagon meshes generated by PatternedHexMeshGenerator.

  • background_intervals_meta, type unsigned int: Makes the value of the input parameter "background_intervals" available to other mesh generators.

  • node_id_background_meta, type dof_id_type: Records the maximum node id of the background nodes to provide a reference for node modifications.

  • max_radius_meta, type Real: Provides the maximum radius of the ring regions so that PatternedHexMeshGenerator does not compromise the circular geometry.

  • num_sectors_per_side_meta, type std::vector<unsigned int>: Makes the value of the input parameter "num_sectors_per_side" available to other mesh generators.

  • azimuthal_angle_meta, type std::vector<Real>: Contains the sorted azimuthal angles of all the nodes on the external boundary.

Reporting ID Assignment

PolygonConcentricCircleMeshGenerator can assign the reporting IDs for annular rings and sectors, which allows users to manipulate sub-pin level details information such as such as the depletion zone setup. The option for ring and sector reporting IDs can be turned on by defining the input parameters "ring_id_name" and "sector_id_name", respectively.

For the ring reporting IDs, each annular blocks defined by "ring_radii" has its own ID values by default. The default may be overridden by unique ID values by setting "ring_id_assign_type" as ring_wise, if both "ring_radii" and "ring_intervals" are specified.

Other Information

By default, the mesh generated by this object contains a mixture of QUAD4 and TRI3 elements. To be specific, the central region of the mesh consists of triangular elements, whereas the rest of the mesh consists of quadrilateral elements. The users also have an option to generate a purely QUAD4 mesh by setting quad_center_elements as true (see Figure 3). In that case, the NN+1\frac{N}{N+1} factor shown in Figure 3 can also be customized using "center_quad_factor".

Figure 3: A schematic drawing showing the different meshing algorithms when "quad_center_elements" is set as false and true.

When rings regions are present, the radii of these rings can be auto-adjusted to preserve the meshed annular area (volume) to the true area (volume) by setting "preserve_volumes" as true. The volume preservation feature is compatible with quadratic elements.

By default, the azimuthal angles used to discretize the mesh are uniformly spaced in _angle_ on each sector of the polygon. However, uniform spacing of angles leads to non-uniform mesh intervals on the polygon external sides (unless exactly 2 sectors per side are used). However, as a uniformly spaced mesh on the polygon external boundary may facilitate mesh stitching, the user may force a uniform mesh on the polygon external boundary by setting "uniform_mesh_on_sides" as true.

The default block id numbering starts with 0 at the center region and increments by 1 for each mesh region radially outward. The user may instead set specific block id and name values to rings, background, and duct regions through the use of "ring_block_ids", "background_block_ids", "duct_block_ids", "ring_block_names", "background_block_names", and "duct_block_names".

The user should be aware that in two cases, the central geometric region is defined as two blocks instead of one: - When rings are not present, and "background_intervals" > 1 or a boundary layer is defined in this region - When rings are present, and the first entry of "ring_intervals" > 1 or a boundary layer is defined in this region

In both of these cases, the central geometric region will contain both blocks 0 and 1 by default. Any additional usage of block ids or name arrays will require an extra entry for the first geometric region. This extra block definition is needed to accommodate flexibility in defining the central region as either quadrilateral or triangular elements while still stitching properly to the neighboring region. Note that if "quad_center_elements" is set as true, the central geometric region is allowed to have a uniform block id/name. This can be achieved by providing a pair of duplicated block ids/names in the corresponding customized block ids/names input parameter. The user can also provide a single customized block id/name for the central geometric region in this case and the system will duplicate the input for the user.

The external boundary has a default boundary id of 10000. The user may instead set specific boundary id and/or name values through the use of external_boundary_id and external_boundary_name. Additionally, for each half side of the polygon, an independent boundary id can be optionally generated for side-specific applications by setting "generate_side_specific_boundaries" as true.

Interface Boundaries

The user can also decide whether the interface boundaries are generated or not.

There are two types of interface boundaries, "inward interface boundaries" and "outward interface boundaries". The "inward" and "outward" here refer to the direction of the boundary's normal vector. As a sideset must be defined on the sides of elements, which belong to one or multiple subdomains, an interface boundary can be defined either on the subdomain immediately inside the interface (i.e., with an "outward" normal vector) or on the subdomain immediately outside the interface (i.e., with an "inward" normal vector).

The user can set "create_inward_interface_boundaries" and "create_outward_interface_boundaries" to control which interface boundaries will be created. If generated, the outward interface boundaries will be assigned ids using sequential odd numbers (i.e., 1, 3, 5, 7, ...) from center to periphery, while the inward interface boundaries will be assigned ids using sequential even numbers (i.e., 2, 4, 6, 8, ...) similarly. These ids can be shifted by a user-provided parameter "interface_boundary_id_shift". The interface boundary names can also be specified through "inward_interface_boundary_names" and "outward_interface_boundary_names".

Example Syntax

[Mesh]
  [hex_1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '4 4 4 4 4 4'
    background_intervals = 2
    ring_radii = 4.0
    ring_intervals = 2
    ring_block_ids = '10 15'
    ring_block_names = 'center_tri center'
    background_block_ids = 20
    background_block_names = background
    polygon_size = 5.0
    preserve_volumes = on
  []
[]
(contrib/moose/modules/reactor/test/tests/meshgenerators/patterned_hex_mesh_generator/patterned_pattern.i)

Input Parameters

  • polygon_sizeSize of the polygon to be generated (given as either apothem or radius depending on polygon_size_style).

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Size of the polygon to be generated (given as either apothem or radius depending on polygon_size_style).

Required Parameters

  • background_inner_boundary_layer_bias1Growth factor used for mesh biasing of the background inner boundary layer.

    Default:1

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Growth factor used for mesh biasing of the background inner boundary layer.

  • background_inner_boundary_layer_intervals1Number of radial intervals of the background inner boundary layer

    Default:1

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial intervals of the background inner boundary layer

  • background_inner_boundary_layer_width0Width of background region that is assigned to be the inner boundary layer.

    Default:0

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Width of background region that is assigned to be the inner boundary layer.

  • background_outer_boundary_layer_bias1Growth factor used for mesh biasing of the background outer boundary layer.

    Default:1

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Growth factor used for mesh biasing of the background outer boundary layer.

  • background_outer_boundary_layer_intervals1Number of radial intervals of the background outer boundary layer

    Default:1

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial intervals of the background outer boundary layer

  • background_outer_boundary_layer_width0Width of background region that is assigned to be the outer boundary layer.

    Default:0

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Width of background region that is assigned to be the outer boundary layer.

  • background_radial_bias1Value used to create biasing in radial meshing for background region.

    Default:1

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Value used to create biasing in radial meshing for background region.

  • center_quad_factorA fractional radius factor used to determine the radial positions of transition nodes in the center region meshed by quad elements.

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:A fractional radius factor used to determine the radial positions of transition nodes in the center region meshed by quad elements.

  • duct_inner_boundary_layer_biasesGrowth factors used for mesh biasing of the duct inner boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Growth factors used for mesh biasing of the duct inner boundary layers.

  • duct_inner_boundary_layer_intervalsNumber of radial intervals of the duct inner boundary layers

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial intervals of the duct inner boundary layers

  • duct_inner_boundary_layer_widthsWidths of duct regions that are assigned to be the inner boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Widths of duct regions that are assigned to be the inner boundary layers.

  • duct_outer_boundary_layer_biasesGrowth factors used for mesh biasing of the duct outer boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Growth factors used for mesh biasing of the duct outer boundary layers.

  • duct_outer_boundary_layer_intervalsNumber of radial intervals of the duct outer boundary layers

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial intervals of the duct outer boundary layers

  • duct_outer_boundary_layer_widthsWidths of duct regions that are assigned to be the outer boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Widths of duct regions that are assigned to be the outer boundary layers.

  • duct_radial_biasesValues used to create biasing in radial meshing for duct regions.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Values used to create biasing in radial meshing for duct regions.

  • duct_sizesDistance(s) from polygon center to duct(s) inner boundaries.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Distance(s) from polygon center to duct(s) inner boundaries.

  • duct_sizes_styleradiusStyle in which polygon center to duct inner boundary distance is given (apothem = center to face, radius = center to vertex). Options: apothem radius

    Default:radius

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:apothem, radius

    Controllable:No

    Description:Style in which polygon center to duct inner boundary distance is given (apothem = center to face, radius = center to vertex). Options: apothem radius

  • flat_side_upFalseWhether to rotate the generated polygon mesh to ensure that one flat side faces up.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether to rotate the generated polygon mesh to ensure that one flat side faces up.

  • num_sides6Number of sides of the polygon.

    Default:6

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of sides of the polygon.

  • polygon_size_styleapothemStyle in which polygon size is given (default: apothem).

    Default:apothem

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:apothem, radius

    Controllable:No

    Description:Style in which polygon size is given (default: apothem).

  • preserve_volumesTrueVolume of concentric circles can be preserved using this function.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Volume of concentric circles can be preserved using this function.

  • quad_center_elementsFalseWhether the center elements are quad or triangular.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether the center elements are quad or triangular.

  • quad_element_typeQUAD4Type of the quadrilateral elements to be generated.

    Default:QUAD4

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:QUAD4, QUAD8, QUAD9

    Controllable:No

    Description:Type of the quadrilateral elements to be generated.

  • ring_radiiRadii of major concentric circles (rings).

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Radii of major concentric circles (rings).

  • smoothing_max_it0Number of Laplacian smoothing iterations. This number is disregarded when duct_sizes is present.

    Default:0

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of Laplacian smoothing iterations. This number is disregarded when duct_sizes is present.

  • tri_element_typeTRI3Type of the triangular elements to be generated.

    Default:TRI3

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:TRI3, TRI6, TRI7

    Controllable:No

    Description:Type of the triangular elements to be generated.

Optional Parameters

  • background_block_idsOptional customized block id for the background block.

    C++ Type:std::vector<unsigned short>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block id for the background block.

  • background_block_namesOptional customized block names for the background block.

    C++ Type:std::vector<SubdomainName>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block names for the background block.

  • block_id_shift0Integer used to shift block IDs.

    Default:0

    C++ Type:unsigned short

    Unit:(no unit assumed)

    Controllable:No

    Description:Integer used to shift block IDs.

  • create_inward_interface_boundariesFalseWhether the inward interface boundaries are created.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether the inward interface boundaries are created.

  • create_outward_interface_boundariesTrueWhether the outward interface boundaries are created.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether the outward interface boundaries are created.

  • duct_block_idsOptional customized block ids for each duct geometry block.

    C++ Type:std::vector<unsigned short>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block ids for each duct geometry block.

  • duct_block_namesOptional customized block names for each duct geometry block.

    C++ Type:std::vector<SubdomainName>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block names for each duct geometry block.

  • external_boundary_idOptional customized external boundary id.

    C++ Type:short

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized external boundary id.

  • external_boundary_nameOptional customized external boundary name.

    C++ Type:std::string

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized external boundary name.

  • generate_side_specific_boundariesFalsewhether the side-specific external boundaries are generated or not

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:whether the side-specific external boundaries are generated or not

  • interface_boundary_id_shift0Integer used to shift interface boundary IDs.

    Default:0

    C++ Type:short

    Unit:(no unit assumed)

    Controllable:No

    Description:Integer used to shift interface boundary IDs.

  • inward_interface_boundary_namesOptional customized boundary names for the internal inward interfaces between block.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized boundary names for the internal inward interfaces between block.

  • outward_interface_boundary_namesOptional customized boundary names for the internal outward interfaces between block.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized boundary names for the internal outward interfaces between block.

  • ring_block_idsOptional customized block ids for each ring geometry block.

    C++ Type:std::vector<unsigned short>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block ids for each ring geometry block.

  • ring_block_namesOptional customized block names for each ring geometry block.

    C++ Type:std::vector<SubdomainName>

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block names for each ring geometry block.

Customized Subdomain/Boundary Parameters

  • background_intervals1Number of radial meshing intervals in background region (area between rings and ducts) excluding the background's boundary layers.

    Default:1

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial meshing intervals in background region (area between rings and ducts) excluding the background's boundary layers.

  • duct_intervalsNumber of meshing intervals in each enclosing duct excluding duct boundary layers.

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of meshing intervals in each enclosing duct excluding duct boundary layers.

  • num_sectors_per_sideNumber of azimuthal sectors per polygon side (rotating counterclockwise from top right face).

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of azimuthal sectors per polygon side (rotating counterclockwise from top right face).

  • ring_intervalsNumber of radial mesh intervals within each major concentric circle excluding their boundary layers.

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial mesh intervals within each major concentric circle excluding their boundary layers.

  • uniform_mesh_on_sidesFalseWhether the side elements are reorganized to have a uniform size.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether the side elements are reorganized to have a uniform size.

General Mesh Density Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not to show mesh info after generating the mesh (bounding box, element types, sidesets, nodesets, subdomains, etc)

Debugging Parameters

  • ring_id_assign_typeblock_wiseType of ring ID assignment: block_wise or ring_wise

    Default:block_wise

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:block_wise, ring_wise

    Controllable:No

    Description:Type of ring ID assignment: block_wise or ring_wise

  • ring_id_nameName of integer (reporting) ID for ring regions to use the reporting ID for annular regions of ring geometry block.

    C++ Type:std::string

    Unit:(no unit assumed)

    Controllable:No

    Description:Name of integer (reporting) ID for ring regions to use the reporting ID for annular regions of ring geometry block.

  • sector_id_nameName of integer (reporting) ID for sector regions to use the reporting ID for azimuthal sector regions of ring geometry block.

    C++ Type:std::string

    Unit:(no unit assumed)

    Controllable:No

    Description:Name of integer (reporting) ID for sector regions to use the reporting ID for azimuthal sector regions of ring geometry block.

Ring/Sector Ids Parameters

  • ring_inner_boundary_layer_biasesGrowth factors used for mesh biasing of the rings' inner boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Growth factors used for mesh biasing of the rings' inner boundary layers.

  • ring_inner_boundary_layer_intervalsNumber of radial intervals of the rings' inner boundary layers

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial intervals of the rings' inner boundary layers

  • ring_inner_boundary_layer_widthsWidths of each ring regions that are assigned to be each ring's inner boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Widths of each ring regions that are assigned to be each ring's inner boundary layers.

  • ring_outer_boundary_layer_biasesGrowth factors used for mesh biasing of the rings' outer boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Growth factors used for mesh biasing of the rings' outer boundary layers.

  • ring_outer_boundary_layer_intervalsNumber of radial intervals of the rings' outer boundary layers

    C++ Type:std::vector<unsigned int>

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of radial intervals of the rings' outer boundary layers

  • ring_outer_boundary_layer_widthsWidths of each ring regions that are assigned to be each ring's outer boundary layers.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Widths of each ring regions that are assigned to be each ring's outer boundary layers.

  • ring_radial_biasesValues used to create biasing in radial meshing for ring regions.

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Values used to create biasing in radial meshing for ring regions.

Mesh Boundary Layers And Biasing Options Parameters