PatternedHexPeripheralModifier

PatternedPolygonPeripheralModifierBase is the base class for PatternedCartPeripheralModifier and PatternedHexPeripheralModifier.

Overview

This PatternedHexPeripheralModifier class utilizes FillBetweenPointVectorsTools to replace the outmost layer of the quad elements of the 2D hexagonal assembly mesh generated by PatternedHexMeshGenerator (or its derived class HexIDPatternedMeshGenerator) with a transition layer consisting of triangular elements so that the assembly mesh can have nodes on designated positions on the external boundary. This boundary modification facilitates the stitching of hexagonal assemblies which have different node numbers on their outer periphery due to differing numbers of interior pins and/or different azimuthal discretization.

Both linear and quadratic elements are supported by PatternedHexPeripheralModifier. The order of the elements to be generated is automatically determined by the element order of the input mesh.

Default Behavior of PatternedHexMeshGenerator and the Least Common Multiple Approach

When PatternedHexMeshGenerator is used to generate a hexagonal assembly mesh, the number of nodes on each hexagon side follows a pre-determined formula based on the pin cell meshes which comprise the assembly. These pin cell hexagonal meshes used by PatternedHexMeshGenerator must have a uniform even number of sectors per side (e.g., 2M2M) given by "num_sectors_per_side" in PolygonConcentricCircleMeshGenerator. If PatternedHexMeshGenerator creates a hexagonal bundle with NN (N>1N>1) pins on each side of the outermost ring, there are 2M(2N1)2M\cdot(2N-1) sectors or 2M(2N1)+12M\cdot(2N-1)+1 nodes on each side of the hexagonal assembly mesh. If all the assemblies within a reactor core contain identical numbers of pins, it is straightforward to make assembly meshes stitchable with each other by using the same MM number for the azimuthal discretization of each pin cell. However, if a reactor core includes assemblies with different numbers of pins, MM must be wisely selected based on the least common multiple of 4Ni24N_i-2 (ii is the assembly index) of all the assemblies involved. This approach may be practical in cases where two assembly types with different pin numbers are involved, as shown in the following table:

Assm. #1 Number of pins per side N1N_1Assm. #1 Number of azimuthal intervals per sector M1M_1Assm. #1 Number of pins per side N2N_2Assm. #1 Number of azimuthal intervals per sector M2M_2Node Number on Assembly Side
253330
274342
235118
2116366
2137378
374570
395590
31165110
31375130
4957126
41167154
41377182
51169198
51379234
613711286

However, multiple different assemblies with unique numbers of pins are involved in a reactor core, the "num_sectors_per_side" (i.e., 2M2M) may be impractically large, as indicated in the following table:

Assm. #1 N1N_1Assm. #1 M1M_1Assm. #2 N2N_2Assm. #2 M2M_2Assm. #3 N3N_3Assm. #3 M3M_3Node Number on Assembly Side
235321415210
215395590
255333615330
2214957126
277433621462
23351169198
363445535630
377455635770
399555645990
4995776631386

Modification of Peripheral Boundary to Allow Stitching

The PatternedHexPeripheralModifier class modifies assembly meshes so that assemblies with different number of pins can be stitched together without increasing the mesh fidelity to an impractically fine fidelity (as shown in the previous section). This mesh generator only works with the "input" mesh created by PatternedHexMeshGenerator. Users must specify the external boundary of the input assembly mesh through "input_mesh_external_boundary". Given this input, the mesh generator identifies and deletes the outmost layer of elements and uses the newly formed external boundary as one of the two vectors of boundary nodes needed by FillBetweenPointVectorsTools after symmetry reduction. In addition, uniformly distributed nodes are placed along the original external boundary of the mesh and defined as the second vector of boundary nodes needed by FillBetweenPointVectorsTools. The number of new boundary nodes is specified using "new_num_sector". Thus, the outmost layer of the assembly mesh can be replaced with a triangular element transition layer mesh that can be easily stitched with another transition layer mesh. An example of the assembly mesh modified by this mesh generator is shown in Figure 1

Figure 1: A schematic drawing of an example assembly mesh with transition layer as its outmost mesh layer.

Advantages

This mesh generator forces the number of nodes on a hexagonal mesh to match a user-specified input. This allows assemblies with different number of pins or azimuthal discretizations (and consequently different numbers of boundary nodes) to be stitched together without increasing the mesh density to an unreasonable level.

Figure 2: A schematic drawing showing a virtual core design with assemblies including 7, 19, 37 and 61 pins.

Figure 2 illustrates a core comprising four types of assemblies. This mesh generator's functionality was leveraged to force a common mesh density on each hexagonal assembly side (16 nodes on each assembly side) so that the assemblies can be easily stitched. In the absence of this mesh generator, the least common multiple approach would require 631 nodes on each assembly side as shown in Figure 3. The mesh density would be increased dramatically just to ensure stitchability, showing the prominent advantage of using this mesh generator instead of the least common multiple approach.

Figure 3: A close-up comparison between the virtual core meshes (see Figure 2) generated with and without using this mesh generator.

Handling Reporting IDs

If the input mesh contains extra element integers (reporting IDs), the PatternedHexPeripheralModifier provides options to retain or reassign these reporting IDs (see Figure 4). By default, all the extra element integers existing on the input mesh are retained. Due to the nature of the transition layer which creates a new set of elements, the original boundaries between different reporting ID values have to be slightly shifted after modification. When PatternedHexPeripheralModifier assigns reporting ID values to a new element in the transition layer, it utilizes the reporting ID values of the original element that is nearest to the new element (based on centroid positions) to retain the setting of the input mesh.

commentnote

The extra element IDs from the original peripheral region are conserved. They may be modified using the "extra_id_names_to_modify" and "new_extra_id_values_to_assign" parameters.

Figure 4: Different approaches to handle a reporting id: (Left) input mesh with reporting id (pin_id); (Middle) retained pin_id for transition layer; (Right) user provided pin_id value for transition layer.

Example Syntax

[Mesh]
  [pmg_1]
    type = PatternedHexPeripheralModifier
    input = pattern_1
    input_mesh_external_boundary = 10000
    new_num_sector = ${new_num_sector}
    num_layers = ${num_layer}
  []
[]
(contrib/moose/modules/reactor/test/tests/meshgenerators/patterned_hex_peripheral_modifier/patterned.i)

Input Parameters

  • inputThe input mesh to be modified. Note that this generator only works with PatternedHex/CartesianMeshGenerator and its derived classes such as HexIDPatternedMeshGenerator.

    C++ Type:MeshGeneratorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The input mesh to be modified. Note that this generator only works with PatternedHex/CartesianMeshGenerator and its derived classes such as HexIDPatternedMeshGenerator.

  • input_mesh_external_boundaryThe external boundary of the input mesh.

    C++ Type:BoundaryName

    Unit:(no unit assumed)

    Controllable:No

    Description:The external boundary of the input mesh.

  • new_num_sectorNumber of sectors of each side for the new mesh.

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Number of sectors of each side for the new mesh.

Required Parameters

  • extra_id_names_to_modifyNames of the element extra ids in the peripheral region that should be modified

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

    Unit:(no unit assumed)

    Controllable:No

    Description:Names of the element extra ids in the peripheral region that should be modified

  • new_extra_id_values_to_assignValues of the modified extra ids in the peripheral region.

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

    Unit:(no unit assumed)

    Controllable:No

    Description:Values of the modified extra ids in the peripheral region.

  • num_layers1Layers of elements for transition.

    Default:1

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Layers of elements for transition.

  • transition_layer_id10000Optional customized block id for the transition layer block.

    Default:10000

    C++ Type:unsigned short

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block id for the transition layer block.

  • transition_layer_nametransition_layerOptional customized block name for the transition layer block.

    Default:transition_layer

    C++ Type:SubdomainName

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional customized block name for the transition layer block.

Optional 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