CoreMeshGenerator

This CoreMeshGenerator object is designed to generate a core-like structure, with IDs, from a reactor geometry. The core-like structure consists of a pattern of assembly-like structures generated with AssemblyMeshGenerator and is permitted to have "empty" locations. The size and spacing of the assembly-like structures is defined, and enforced by declaration in the ReactorMeshParams.

Overview

This object is designed to be used in the Reactor MeshGenerator workflow, which also consists of ReactorMeshParams, PinMeshGenerator, and AssemblyMeshGenerator.

The CoreMeshGenerator object generates core-like reactor geometry structures in either square or hexagonal geometries with block ID assignments and reporting (extra integer) IDs, as described in PatternedCartesianMeshGenerator. There is expected to only be a single CoreMeshGenerator in a Mesh definition.

This object automates the use and functionality of the PatternedCartesianMeshGenerator for cartesian reactor geometry, PatternedHexMeshGenerator for hexagonal reactor geometry and, if extruding to three dimensions, the `AdvancedExtruderGenerator' through the use of the MeshSubgenerator functionality and supporting functionality from RenameBoundaryGenerator and `PlaneIDMeshGenerator'. In addition to the functionality of the MeshGenerators used, this object also automates boundary ID and name assignment.

In addition to the functionality of PatternedCartesianMeshGenerator or PatternedHexMeshGenerator, this object allows for the definition of "empty" lattice locations using MeshSubgenerators. This is achieved through the use of creating "dummy" assembly meshes via CartesianMeshGenerator or HexagonConcentricCircleAdaptiveBoundaryMeshGenerator respectively. These assemblies are then removed after the core mesh creation via BlockDeletionGenerator. If assembly homogenization is leveraged by setting both "use_as_assembly" and "homogenized" to true, then all assemblies inputted to CoreMeshGenerator must be homogenized. Mixtures of heterogeneous and homogeneous assembly inputs to CoreMeshGenerator are not currently supported.

The CoreMeshGenerator object adopts much of the existing input structure of patterned MeshGenerators but also adapts to use parameters that are more accessible for reactor design.

Reporting ID Information

The CoreMeshGenerator object automatically tags the mesh, if three dimensional, with the axial layers using the extra integer name "plane_id". The assemblies composing the core are also tagged via PatternedCartesianMeshGenerator or PatternedHexMeshGenerator, using the "cell" assignment type, with the extra integer name "assembly_id" and any "dummy" assembly (identified via the "dummy_assembly_name" parameter) locations excluded.

Exterior Boundary ID Information

The CoreMeshGenerator objects automatically assigns boundary information. The exterior core boundary ID is assigned with the parameter "radial_boundary_id" and will have the name "outer_core".

If the core is extruded to three dimensions the top-most boundary ID must be assigned using "top_boundary_id" and will have the name "top", while the bottom-most boundary must be assigned using "bottom_boundary_id" and will have the name "bottom".

Example Syntax

[Mesh]
  [rmp]
    type = ReactorMeshParams
    dim = 3
    geom = "Square"
    assembly_pitch = 2.84126
    axial_regions = '1.0'
    axial_mesh_intervals = '1'
    top_boundary_id = 201
    bottom_boundary_id = 202
    radial_boundary_id = 200
  []

  [pin1]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 1
    pitch = 1.42063
    region_ids = '1 2 5'
    quad_center_elements = true
  []

  [pin2]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 2
    pitch = 1.42063
    region_ids = '2'
    quad_center_elements = true
  []

  [pin3]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 3
    pitch = 1.42063
    region_ids = '3 4'
    quad_center_elements = true
  []

  [amg1]
    type = AssemblyMeshGenerator
    assembly_type = 1
    inputs = 'pin2'
    pattern = '0 0;
               0 0'
  []

  [amg2]
    type = AssemblyMeshGenerator
    assembly_type = 2
    inputs = 'pin3 pin1 pin2'
    pattern = '0 1;
               1 2'
  []

  [cmg]
    type = CoreMeshGenerator
    inputs = 'amg2 amg1 empty'
    dummy_assembly_name = empty
    pattern = '1 0;
               0 1'
    extrude = true
  []

  [rotate90]
    type = TransformGenerator
    input = cmg
    transform = ROTATE
    vector_value = '0 0 90'
  []

  [translate]
    type = TransformGenerator
    input = cmg
    transform = TRANSLATE
    vector_value = '2.130945 -2.130945 0'
  []
[]
(modules/reactor/test/tests/meshgenerators/core_mesh_generator/core.i)

This is the resulting mesh block layout, where by default a single block is assigned to all of the quadrilateral elements in the mesh:

This is the resulting "region_id" extra element integer layout, which was chosen by setting the region IDs for each of the constituent pins and assemblies:

Periphery Mesh Generation

The CoreMeshGenerator includes support for meshing a circular reactor periphery surrounding the core. This integration supports using either PeripheralTriangleMeshGenerator (PTMG) or PeripheralRingMeshGenerator (PRMG), selected using the "periphery_generator" input option (by specifying either triangle or quad_ring, respectively). The input options for these mesh generators are provided below, but more details on their meaning and usage can be found in their respective documentation pages. The generated periphery region is given the block name "periphery_block_name" (default RGMB_CORE) and extra integer reporting ID region_id "periphery_region_id", along with outer boundary name "outside_periphery".

Example Core Periphery Syntax

[Mesh]
  [rmp]
    type = ReactorMeshParams
    dim = 3
    geom = "Hex"
    assembly_pitch = 7.10315
    axial_regions = '1.0'
    axial_mesh_intervals = '1'
    top_boundary_id = 201
    bottom_boundary_id = 202
    radial_boundary_id = 200
  []

  [pin1]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 1
    pitch = 1.42063
    num_sectors = 2
    ring_radii = '0.2'
    duct_halfpitch = '0.68'
    mesh_intervals = '1 1 1'
    region_ids = '1 2 5'

    quad_center_elements = true
  []

  [pin2]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 2
    pitch = 1.42063
    num_sectors = 2
    mesh_intervals = '2'
    region_ids = '2'

    quad_center_elements = true
  []

  [pin3]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 3
    pitch = 1.42063
    num_sectors = 2
    ring_radii = '0.3818'
    mesh_intervals = '1 1'
    region_ids = '3 4'

    quad_center_elements = true
  []

  [amg1]
    type = AssemblyMeshGenerator
    assembly_type = 1
    background_intervals = 1
    inputs = 'pin2'
    pattern = '0 0;
              0 0 0;
               0 0'
    background_region_id = 10
  []

  [amg2]
    type = AssemblyMeshGenerator
    assembly_type = 2
    background_intervals = 1
    inputs = 'pin1 pin3'
    pattern = '0 0;
              0 1 0;
               1 0'
    background_region_id = 20
  []

  [cmg]
    type = CoreMeshGenerator
    inputs = 'amg1 amg2 empty'
    dummy_assembly_name = empty
    pattern = '1 1;
              1 0 1;
               1 1'
    extrude = false

    mesh_periphery = true
    periphery_generator = triangle
    periphery_region_id = 30
    outer_circle_radius = 15
    outer_circle_num_segments = 100
    desired_area = 0.5
    periphery_block_name = PERIPHERY_PTMG
  []

  [rotate90]
    type = TransformGenerator
    input = cmg
    transform = ROTATE
    vector_value = '0 0 90'
  []
[]
(modules/reactor/test/tests/meshgenerators/core_mesh_generator/core_periphery_ptmg_vol.i)

This is the resulting mesh block layout:

Input Parameters

  • inputsThe AssemblyMeshGenerators that form the components of the assembly.

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

    Controllable:No

    Description:The AssemblyMeshGenerators that form the components of the assembly.

  • patternA double-indexed array starting with the upper-left corner where the indexrepresents the layout of input assemblies in the core lattice.

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

    Controllable:No

    Description:A double-indexed array starting with the upper-left corner where the indexrepresents the layout of input assemblies in the core lattice.

Required Parameters

  • dummy_assembly_namedummyThe place holder name in "inputs" that indicates an empty position.

    Default:dummy

    C++ Type:std::string

    Controllable:No

    Description:The place holder name in "inputs" that indicates an empty position.

  • extrudeFalseDetermines if this is the final step in the geometry construction and extrudes the 2D geometry to 3D. If this is true then this mesh cannot be used in further mesh building in the Reactor workflow

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Determines if this is the final step in the geometry construction and extrudes the 2D geometry to 3D. If this is true then this mesh cannot be used in further mesh building in the Reactor workflow

Optional Parameters

  • 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.

  • 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

  • desired_area0Desired (maximum) triangle area, or 0 to skip uniform refinement

    Default:0

    C++ Type:double

    Controllable:No

    Description:Desired (maximum) triangle area, or 0 to skip uniform refinement

  • desired_area_funcDesired (local) triangle area as a function of x,y; omit to skip non-uniform refinement

    C++ Type:std::string

    Controllable:No

    Description:Desired (local) triangle area as a function of x,y; omit to skip non-uniform refinement

  • outer_circle_num_segments0Number of radial segments to subdivide outer circle boundary.

    Default:0

    C++ Type:unsigned int

    Controllable:No

    Description:Number of radial segments to subdivide outer circle boundary.

Periphery Meshing: Ptmg Specific Parameters

  • mesh_peripheryFalseDetermines if the core periphery should be meshed.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Determines if the core periphery should be meshed.

  • outer_circle_radius0Radius of outer circle boundary.

    Default:0

    C++ Type:double

    Controllable:No

    Description:Radius of outer circle boundary.

  • periphery_block_nameRGMB_COREBlock name for periphery zone.

    Default:RGMB_CORE

    C++ Type:std::string

    Controllable:No

    Description:Block name for periphery zone.

  • periphery_generatortriangleThe meshgenerator to use when meshing the core boundary.

    Default:triangle

    C++ Type:MooseEnum

    Options:triangle, quad_ring

    Controllable:No

    Description:The meshgenerator to use when meshing the core boundary.

  • periphery_region_id65535ID for periphery zone for assignment of region_id extra element id.

    Default:65535

    C++ Type:unsigned short

    Controllable:No

    Description:ID for periphery zone for assignment of region_id extra element id.

Periphery Meshing 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

  • periphery_num_layers1Number of layers to subdivide the periphery boundary.

    Default:1

    C++ Type:unsigned int

    Controllable:No

    Description:Number of layers to subdivide the periphery boundary.

Periphery Meshing: Prmg Specific Parameters

Input Files