MOOSE Reactor Module Tutorial: Meshing Reactor Geometries

www.mooseframework.org

Tutorial 4: MOOSE Meshing

Contents

MOOSE Introduction

Multi-physics Object Oriented Simulation Environment

History and Purpose

  • Development started in 2008

  • Open-sourced in 2014

  • Designed to solve computational engineering problems and reduce the expense and time required to develop new applications by:

    • being easily extended and maintained

    • working efficiently on a few and many processors

    • providing an object-oriented, extensible system for creating all aspects of a simulation tool

MOOSE By The Numbers

  • 208 contributors

  • 46,000 commits

  • 5000 unique visitors per month

  • ~6 new Discussion participants per week

  • 1500 citations for the MOOSE papers

    • Most cited paper in Elsevier Software-X

    • More than 500 publications using MOOSE

  • 30M tests per week

General Capabilities

  • Continuous and Discontinuous Galerkin FEM

  • Finite Volume

  • Supports fully coupled or segregated systems, fully implicit and explicit time integration

  • Automatic differentiation (AD)

  • Unstructured mesh with FEM shapes

  • Higher order geometry

  • Mesh adaptivity (refinement and coarsening)

  • Massively parallel (MPI and threads)

  • User code agnostic of dimension, parallelism, shape functions, etc.

  • Operating Systems:

    • macOS

    • Linux

    • Windows (WSL)

Object-oriented, pluggable system

Example Code

Software Quality

  • MOOSE follows an Nuclear Quality Assurance Level 1 (NQA-1) development process

  • All commits undergo review using GitHub Pull Requests and must pass a set of application regression tests before they are available to our users

  • MOOSE includes a test suite and documentation system to allow for agile development while maintaining a NQA-1 process

  • Utilizes the Continuous Integration Environment for Verification, Enhancement, and Testing (CIVET)

  • External contributions are guided through the process by the team, and are very welcome!

Development Process

Community

https://github.com/idaholab/moose/discussions

License

  • LGPL 2.1

  • Does not limit what you can do with your application

    • Can license/sell your application as closed source

  • Modifications to the library itself (or the modules) are open source

  • New contributions are automatically LGPL 2.1

Reactor Module Overview

Introduction

MOOSE's Reactor Module provides targeted meshing capability for common nuclear reactor core geometries

  • Rapidly build reactor pins, assemblies, and cores and perform operations like extrusion, rotation, and triangulation

  • Create rotating control drums and core periphery zones (outer barrel / shield)

  • Automatically preserve fuel pin volume

  • Apply boundary layers, mesh biasing, slicing, adaptive meshing to match other meshes

  • Automatic label of elements by component (e.g. pin, assembly, plane)

How it works, in a nutshell

  • The Reactor Module contains mesh generation objects which a user calls from the [Mesh] block of a MOOSE input file

  • User constructs sequences of mesh generation objects to build custom Cartesian and hexagonal-based pins, assemblies, and cores

  • Meshes may be created in memory or pre-generated/output as Exodus files for later use

MOOSE Meshing vs External Tools

MOOSE's Reactor Module offers several benefits over commonly used meshing software for many supported geometries:

  • Free and open source (included with MOOSE, no additional software packages needed)

  • Tightly integrated with MOOSE-based applications (link mesh and physics input to same input and executable)

  • Specialized functions for reactor geometries

  • Component/zone bookkeeping through "extra element integers" for material assignment and post-processing

  • Automatic fuel volume preservation useful for mesh convergence studies

  • Saves analyst and computer time – easier to learn than generic FEM tools and runs quickly

The Reactor Module is currently not suited for non-extruded geometries, ex-core components such as piping, heat exchangers, or complex 3D meshing of inlet plenums, CAD geometries, or wire wrapped pins. No tetrahedral meshing options are currently available.

Reactor Module Examples

The Reactor Module has been used to mesh cores of several reactor types:

  • liquid metal-cooled fast reactor (SFR, LFR)

  • heat pipe-cooled microreactor (HP-MR)

  • gas-cooled microreactor (GC-MR)

  • prismatic high temperature gas cooled reactor (prismatic HTGR) core geometries

Additionally, advanced meshing routines can be used to mesh some types of molten salt reactor (MSR) and pebble bed HTGR (PB-HTGR) cores.

The following meshes were generated by MOOSE's Reactor Module + Mesh System.

C5G7 Light Water Reactor

Figure 5: C5G7 light water reactor benchmark (Courtesy Yeon Sang Jung, Argonne National Laboratory).

Lead-Cooled Fast Reactor

Figure 6: Lead-cooled fast reactor assembly with annular pins (Credit: Emily Shemon, Shikhar Kumar, Hansol Park, Argonne National Laboratory).

Advanced Burner Test Reactor

Figure 7: Advanced Burner Test Reactor (ABTR) (Credit Shikhar Kumar, Argonne National Laboratory).

MARVEL Microreactor

Figure 8: DOE-NE MARVEL microreactor concept at Idaho National Laboratory (Courtesy Stefano Terlizzi, Idaho National Laboratory).

High Temperature Gas-Cooled Reactor

Figure 9: Modular High Temperature Gas-Cooled Reactor (MHTGR) (Courtesy Olin Calvin, Idaho National Laboratory).

Molten Salt Reactor Experiment

Figure 10: Molten Salt Reactor Experiment at Oak Ridge National Laboratory (Courtesy Kun Mo and Yan Cao, Argonne National Laboratory).

Building the Reactor Module

Install MOOSE

To use the Reactor Module you must first Install MOOSE.

In this tutorial, $MOOSE_DIR is defined as the MOOSE installation directory. This can be set in a Bash shell like this (assuming you installed in ~/projects/moose):


export $MOOSE_DIR=~/projects/moose

The copy/paste commands in this tutorial expect you will have this environment variable defined.

Compiling an app

Compile the Reactor Module App by navigating to $MOOSE_DIR/modules/reactor and issuing the make command. This will generate a binary file (reactor-opt) in that directory which leverages both the MOOSE framework and Reactor module capabilities. Running the binary with the --version flag should simply output the current code version without error if it was compiled properly.


cd $MOOSE_DIR/modules/reactor
make -j4
./reactor-opt --version

To test that a compiled binary is linked properly with the Reactor module, the binary can be run with one of the Reactor module test inputs:


$MOOSE_DIR/modules/reactor/reactor-opt -i $MOOSE_DIR/modules/reactor/test/tests/meshgenerators/simple_hexagon_generator/sim_hex.i --mesh-only

This should output generated mesh information without producing any errors.

Meshing Workflow in MOOSE

Constructing a Reactor Mesh Hierarchically

MOOSE's Mesh System and Reactor Module contains numerous "MeshGenerator" objects which either (a) create a mesh from scratch or (b) perform operations on existing meshes. To create a mesh, the user must define a sequence of MeshGenerator object calls inside the [Mesh] block to construct a geometry beginning with the smallest components (pins) and building up to larger components (core). For example, after pins are defined, they can be patterned into an assembly, and assemblies can then be patterned into a core. Application of a peripheral core zone, trimming along symmetry lines and extrusion to 3D are optional in the final steps.

The meshing workflow for a standard reactor core follows the general hierarchical process of identifying key features in the geometry and building them hierarchically in terms of smallest to largest (pins, assemblies, core, core periphery):

  1. Define pins

  2. Define assembly by patterning existing pins into a lattice and adding coolant background and/or duct region

  3. Define core by patterning assemblies into a lattice

  4. Apply core periphery zones like a circular shield

  5. Trim along lines of symmetry to reduce computational expense

  6. Extrude to 3D

Execution

Use any executable with the Reactor module compiled, such as or $MOOSE_DIR/modules/reactor-opt along with the --mesh-only command line option:


$MOOSE_DIR/modules/reactor/reactor-opt -i <my_meshing_input.i> --mesh-only

The --mesh-only optional command line parameter executes only the [Mesh] block of the input file and outputs the generated mesh. This is useful while building and testing the mesh as it doesn't require the rest of the MOOSE problem be defined in the input file. Recent updates to the --mesh-only option now allow the mesh output in Exodus format to include the extra element integer IDs defined on the mesh by default for convenient visualization purposes.

When you are satisfied with your mesh input, you may invoke MOOSE without the --mesh-only option to execute the entire input file (mesh building and physics input).

Executables of any MOOSE applications that contain the Reactor module in their Makefile can also be used, such as Griffin, Sockeye, Pronghorn, Cardinal, and BlueCRAB.

Visualization with ParaView

The Exodus output format is the preferred way to write out simulation results from MOOSE simulations. This format is supported by ParaView, VisIt, and other postprocessing applications. ParaView is most commonly used, but the visualization procedure is similar for other programs.

To save a lot of clicks, the following settings are recommended (in Edit->Settings):

  • Auto Apply: Automatically apply changes in the 'Properties' panel

  • Load All Variables: Load all variables when loading a data set

  • Default Time Step: Go to last timestep

Figure 11: Recommended default settings in ParaView. Ahrens et al. (2005)

To visually inspect a mesh, first load the Exodus output file (ending in .e) into ParaView. Select the Open button in the top left corner, browse to the Exodus mesh file, click OK, and click the Apply button in the Properties dialogue in the lower left corner.

Figure 1: Open Exodus mesh file in ParaView. Ahrens et al. (2005)

With the mesh loaded, there are two key visualization options in the top center of the menu: the visualization style on the right, which is good to set to Surface with Edges to show where the element boundaries are located, and the visualization property on the left, which can be switched between the various properties defined on the mesh.

Figure 2: ParaView visualization selectors. Ahrens et al. (2005)

There are also a variety of toggles in the Properties dialog in the lower left corner, which can control which elements of the mesh are visualized. After any modification of the properties, be sure to click Apply for the changes to apply.

Figure 3: ParaView properties dialogue. Ahrens et al. (2005)

In this example, the periphery block was removed and outer core side set is highlighted (in green).

Figure 4: Example of selected blocks/sidesets. Ahrens et al. (2005)

Meshing Terminology

Before proceeding in this tutorial, we briefly define some terminology, limiting discussion to the spatial domain for simplicity:

  • Finite Element Method (FEM)

    • A numerical technique to solve PDEs which first requires that the spatial domain be divided into a mesh consisting of a finite number of discretized pieces. (FEM is one of the foundations of the MOOSE framework.)

  • Mesh

    • A set of points connected to form a network which discretize a geometry into discrete elements.

  • Finite Element (or simply Element)

    • An ordered grouping of nodes that defines the boundaries of a piece of the spatial domain. A typical first order 2D element has 3 (triangle) or 4 (quadrilateral) nodes. Straight lines connect the nodes to form the element shape. In 3D, typical elements have 6 (triangular prism), 8 (hexahedron), 4 (tetrahedron) or 5 (pyramid) nodes. The full set of elements comprises the mesh which approximates the geometry. Basis functions from the FEM are defined on each element. Higher order elements may have additional nodes than those listed here, and may have curved geometries. A mesh can consist of different types of elements.

    • This mesh has 48 unique elements (12 triangular in the center, and 36 quadrilateral).

  • Block (or Subdomain)

    • A grouping of elements which must have similar type and order. A mesh may have few or many blocks.

    • This mesh has 4 unique blocks: 1 triangular element block (blue), and 3 quadrilateral element blocks (red, green, gray).

  • Node

    • A coordinate point in space, connected to one or more elements, which will be used along with other nodes to define element shape.

    • Nodes are highlighted as small circles in this mesh. Nodes specify the vertices of linear triangular and quadrilateral elements.

  • Nodeset

    • A grouping of nodes. Nodes can belong to more than one nodeset.

    • This mesh has 3 nodesets, one pertaining to each sideset. Nodes within each nodeset link together to form the sideset edges.

  • Sideset

    • A grouping of element edges or faces (in 2D & 3D respectively) categorized by their owning surfaces or volumes. These are associated with elements and this association is determined by a normal direction to the edge or face. Edges or faces may belong to more than one sideset.

    • This mesh has 3 unique sidesets (1 exterior sideset and 2 interior sidesets). No sideset was created between the blue and red blocks because these actually represent the same material (fuel) and therefore there is no material interface, information transfer, or boundary condition to apply here.

Frequently Used Reactor Geometries and Corresponding Mesh Generators

This section lists frequently used hexagonal-based geometries for reactor cores and their associated mesh generator objects. All the following are considered "base" mesh generators which expose all input options including control of block (subdomain) numbering. While sidesets can also be numbered, the outer boundary sideset is automatically assigned to sideset 10000.

A second set of mesh generators (Reactor Geometry Mesh Builder mesh generators) is available for regular hexagonal and Cartesian geometry and provides a reduced set of input options, removes any mention of block (subdomain) numbering, and instead allows the user to specify materials directly on the mesh. These are covered in another Chapter.

Pin Cell

  • PolygonConcentricCircleMeshGenerator

  • The pin cell size may be provided as the apothem (center-to-flat distance which is the pin "half-pitch") or radius (center-to-vertex distance) depending on the setting in "polygon_size_style"

  • 2D Cartesian or hex pin cell, including fuel, clad, coolant and (optional) ducted regions

  • Permits either quadrilateral or triangular elements in the pin center region (quad fuel and tri fuel regions must have different block IDs)

  • Fuel area preservation using the "preserve_volumes" parameter

  • Different azimuthal discretization possible per pin cell face

[Mesh]
  [hex_1]
    type = PolygonConcentricCircleMeshGenerator
    # General parameters
    num_sides = 6
    num_sectors_per_side = '4 4 4 4 4 4'
    polygon_size = 5.0
    # Ring regions parameters
    ring_radii = 4.0
    ring_intervals = 2
    ring_block_ids = '10 15'
    ring_block_names = 'center_tri center'
    preserve_volumes = on
    # Background region parameters
    background_intervals = 2
    background_block_ids = 20
    background_block_names = background
    #    # Optional Duct regions parameters
    #    duct_sizes = '4.5 4.8'
    #    duct_sizes_style = apothem
    #    duct_block_ids = '22 24'
    #    duct_block_names = 'duct_in duct_out'
    #    duct_intervals = '1 2'
  []
[]

Assembly (Homogenized)

  • SimpleHexagonGenerator

  • 2D Hexagonal unit pin cell with coarse mesh discretization

  • Three modes are available to discretize the hexagon:

    • TRI: 6 triangles (default)

    • QUAD: 2 quadrilateral elements

    • HYBRID: 6 triangles + 6 * number of layers of quadrilateral elements

[Mesh]
  [hex_simple]
    type = SimpleHexagonGenerator
    hexagon_size = 16
    # Options: TRI, QUAD, HYBRID
    element_type = TRI
    # Optional subdomain id/name
    block_id = '100'
    block_name = 'hexagon'
  []
[]

Assembly (with multiple heterogeneous pins)

[Mesh]
  [pattern_assm]
    type = PatternedHexMeshGenerator
    inputs = 'hex_1'
    pattern = '0 0;
              0 0 0;
               0 0'
    hexagon_size = 16
    # Background region parameters
    background_intervals = 2
    background_block_id = 80
    background_block_name = hex_background
    #    # Optional Duct regions parameters
    #    duct_sizes = '15.0 15.5'
    #    duct_sizes_style = apothem
    #    duct_block_ids = '82 84'
    #    duct_block_names = 'assm_duct_in assm_duct_out'
    #    duct_intervals = '1 2'
    # Advanced option
    deform_non_circular_region = false
  []
[]

Assembly (control drum, duct-heterogeneous, or single pin)

[Mesh]
  [adaptive_assm]
    type = HexagonConcentricCircleAdaptiveBoundaryMeshGenerator
    num_sectors_per_side = '4 4 4 4 4 4'
    background_intervals = 2
    hexagon_size = 16
    sides_to_adapt = '1 2 3'
    meshes_to_adapt_to = 'pattern_assm pattern_assm pattern_assm'
  []
[]

Core

[Mesh]
  [pattern_core]
    type = PatternedHexMeshGenerator
    inputs = 'pattern_assm adaptive_assm'
    pattern_boundary = none
    # Set as true to tell MOOSE that inputs have meshes made by PatternedHexMeshGenerator
    # Set as false if the inputs are made by SimpleHexagonGenerator
    generate_core_metadata = true
    pattern = '0 0 0;
              0 0 0 0;
             0 0 0 0 1;
              0 0 0 0;
               0 0 0'
  []
[]

Core Periphery (PRMG)

[Mesh]
  [pr]
    type = PeripheralRingMeshGenerator
    input = pattern_core
    peripheral_layer_num = 3
    peripheral_ring_radius = 100.0
    input_mesh_external_boundary = 10000
    peripheral_ring_block_id = 300
    peripheral_ring_block_name = reactor_ring
  []
[]

Core Periphery (PTMG)

[Mesh]
  [pt]
    type = PeripheralTriangleMeshGenerator
    input = pattern_core
    peripheral_ring_radius = 100.0
    peripheral_ring_num_segments = 100
    desired_area = 20
  []
[]

Frequently Used Operations and Corresponding MeshGenerators

Mesh Trimming Along Lines of Symmetry

  • HexagonMeshTrimmer

  • (Cartesian sibling – CartesianMeshTrimmer)

  • Two types of trimming can be performed by HexagonMeshTrimmer: Peripheral Trimming and Through-the-Center Trimming.

  • Peripheral trimming can be performed on six possible lines, each of which is parallel to a side of the hexagon and crosses the center of the pins laid out in that direction

  • Peripheral trimming can only be used for assembly meshes

  • Through-the-center trimming can be used for both assembly and core meshes

Mesh Trimming Examples

[Mesh]
  [pattern_assm_peri_trim]
    type = HexagonMeshTrimmer
    input = pattern_assm
    trim_peripheral_region = '1 1 1 1 1 1'
    peripheral_trimming_section_boundary = peripheral_section
  []
[]
[Mesh]
  [core_trim]
    type = HexagonMeshTrimmer
    input = pr
    center_trim_starting_index = 0
    center_trim_ending_index = 2
    center_trimming_section_boundary = symmetric
  []
[]

Assembly Periphery Modification

  • PatternedHexPeripheralModifier

  • (Cartesian sibling – PatternedCartesianPeripheralModifier)

  • Modify the peripheral region of an assembly mesh to enforce a given number of nodes uniformly distributed on the external boundary to facilitate the stitching of different assembly meshes.

  • The input mesh must be an assembly with a hexagonal boundary (coolant and/or duct region(s) present).

[Mesh]
  [pattern_assm_peri_mod]
    type = PatternedHexPeripheralModifier
    input = pattern_assm
    input_mesh_external_boundary = 10000
    new_num_sector = 10
    num_layers = 2
  []
[]

Extrusion to 3D

  • AdvancedExtruderGenerator

  • Extrudes a 1D mesh into 2D, or 2D into 3D

  • Variable height / # of layers in each elevation

  • Variable growth factors of axial element sizes within each elevation

  • Remap subdomain IDs, boundary IDs and element EEIDs in each elevation and boundaries between neighboring elevations

  • Extrusion may be performed along any direction specified by an vector. Most common is (+-direction).

[Mesh]
  [core_ext]
    type = AdvancedExtruderGenerator
    input = core_trim
    heights = '30 60 30'
    num_layers = '2 3 2'
    direction = '0 0 1'
    # Optional subdomain swap
    subdomain_swaps = '10 100 15 150 20 150 80 150 300 150;
                        ;
                       10 200 15 250 20 250 80 250 300 250'
  []
[]

Reporting IDs: A Powerful Feature for Assisting with Physics Input and Output Processing

Why do we need Reporting IDs?

  • In reactor simulations, we want to bookkeep the individual elements belonging to each geometric component

    • Assign material properties to the mesh in different regions

    • Extract integral quantities from the solution in different regions

  • Using numerous block IDs just to differentiate regions is not practical or sufficient

    • Using excessive blocks can cause performance degradation in MOOSE

    • Multiple hierarchical levels in geometries (e.g., pin, assembly) cannot be represented with blocks

  • Reporting IDs were introduced as a practical solution to this bookkeeping issue

What are Reporting IDs?

  • Reporting IDs are extra integer ID tags assigned on each element of the mesh

    • A reporting ID consists of a name (e.g. pin_id, assembly_id) and an assigned value (e.g. 1, 2, 3...)

    • A reporting ID designates association with a specific reactor component or zone, such as pin ID or assembly ID

    • An element may have multiple reporting IDs to track different information (e.g., pin number, assembly number, plane number).

  • How do we get reporting IDs on mesh elements?

    • The automatic assignment of reporting IDs to elements in a mesh is provided through several mesh generators that "understand" the concept of pins, assemblies, planes, etc.

    • There is no need to provide physical locations or coordinates of elements in order to assign IDs

How can we use reporting IDs?

  • Reporting IDs can be used to assign material properties

  • Reporting IDs can be used to create additional unique zones (e.g. depletion zones)

  • Reporting IDs can be leveraged to post-process solution data into tables by using the ExtraIDIntegralVectorPostprocessor. This postprocessor integrates the solution based on reporting IDs. Component-wise values such as pin-by-pin power distribution can be easily yielded by specifying integration over pin and assembly reporting IDs to this postprocessor.

Applying Reporting IDs for Cartesian and Hexagonal Lattices

  • PatternedCartesianMeshGenerator (Cartesian)

  • PatternedHexMeshGenerator (Hexagonal)

  • Assign reporting IDs for input geometric components (pins or assemblies) during lattice mesh generations.

  • Supports the following numbering schemes (set with "assign_type"):

    • cell (default): Assign unique IDs for each component in the lattice in sequential order (begins at 0 in the top left corner of the pattern).

    • pattern: assign a different ID for each unique input component

    • manual: use a manual numbering scheme provided by user

  • When assembly duct regions are present, these regions are numbered sequentially starting from the inner-most region to the outer-most region.

  • Pin and Assembly IDs are applied during creations of assemblies and core, respectively.

Cell Pattern Example

[Mesh]
  [pin1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 4
    num_sectors_per_side = '2 2 2 2'
    background_intervals = 1
    ring_radii = '0.4 0.5'
    ring_intervals = '1 1'
    polygon_size = 0.63
    flat_side_up = true
  []

  [pin2]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 4
    num_sectors_per_side = '2 2 2 2'
    background_intervals = 1
    ring_radii = '0.4 0.5'
    ring_intervals = '1 1'
    polygon_size = 0.63
    flat_side_up = true
  []

  [assembly1]
    type = PatternedCartesianMeshGenerator
    inputs = 'pin1 pin2'
    pattern = ' 1  0  1  0;
                0  1  0  1;
                1  0  1  0;
                0  1  0  1'
    assign_type = 'cell'
    id_name = 'pin_id'
    pattern_boundary = 'none'
    generate_core_metadata = false
  []

  [assembly2]
    type = PatternedCartesianMeshGenerator
    inputs = 'pin1 pin2'
    pattern = ' 0  1  1  0;
                1  0  0  1;
                1  0  0  1;
                0  1  1  0'
    assign_type = 'cell'
    id_name = 'pin_id'
    pattern_boundary = 'none'
    generate_core_metadata = false
  []

  [core]
    type = PatternedCartesianMeshGenerator
    inputs = 'assembly1 assembly2'
    pattern = '0  1;
               1  0'
    assign_type = 'cell'
    id_name = 'assembly_id'
    pattern_boundary = 'none'
    generate_core_metadata = true
  []
[]

Alternative Pattern Example

  • Supports other numbering schemes:

    • "assign_type" = pattern: Assign IDs identical to the already-provided "pattern" array

    • "assign_type" = manual: Assign IDs based on a user-defined mapping in the optional "id_pattern" array, which may differ from the required "pattern" array

[Mesh]
  [pin1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 4
    num_sectors_per_side = '2 2 2 2'
    background_intervals = 1
    ring_radii = '0.4 0.5'
    ring_intervals = '1 1'
    polygon_size = 0.63
    flat_side_up = true
  []

  [pin2]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 4
    num_sectors_per_side = '2 2 2 2'
    background_intervals = 1
    ring_radii = '0.4 0.5'
    ring_intervals = '1 1'
    polygon_size = 0.63
    flat_side_up = true
  []

  [assembly1]
    type = PatternedCartesianMeshGenerator
    inputs = 'pin1 pin2'
    pattern = ' 1  0  0  1;
                0  0  1  0;
                0  1  0  0;
                1  0  0  1'
    assign_type = 'pattern'
    id_name = 'pin_id'
    pattern_boundary = 'none'
    square_size = 5.04
    generate_core_metadata = false
  []

  [assembly2]
    type = PatternedCartesianMeshGenerator
    inputs = 'pin1 pin2'
    pattern = ' 0  1  1  0;
                1  0  0  1;
                1  0  0  1;
                0  1  1  0'
    id_pattern = ' 0  0  1  1;
                   0  0  1  1;
                   2  2  3  3;
                   2  2  3  3'
    assign_type = 'manual'
    id_name = 'pin_id'
    pattern_boundary = 'none'
    square_size = 5.04
    generate_core_metadata = false
  []

  [core]
    type = PatternedCartesianMeshGenerator
    inputs = 'assembly1 assembly2'
    pattern = '0  1;
               1  0'
    assign_type = 'cell'
    id_name = 'assembly_id'
    pattern_boundary = 'none'
    generate_core_metadata = true
  []
[]

Applying Reporting IDs for Axial Plane

  • PlaneIDMeshGenerator

  • Apply reporting IDs between axial planes in an already extruded mesh

  • Only applicable for extruded geometries where the concept of axial layers (in , , or directions) is valid

  • The input mesh to this mesh generator should be 3D (this mesh generator does not perform the extrusion itself)

  • Unique IDs can be assigned between axial planes (coarse approach) or also to each unique sublayer defined by axial subintervals between the planes (fine approach)

[Mesh]
  [CORE_3D]
    type = PlaneIDMeshGenerator
    input = 'CORE_3D_BASE'
    plane_coordinates = '0. 10. 50. 60.'
    num_ids_per_plane = '1 4 1'
    id_name = 'plane_id'
  []
[]

Applying Depletion IDs

  • DepletionIDGenerator

  • Automatically assign depletion zones based on existing unique combination of reporting IDs and material ID

  • Easily control the fidelity of depletion zones based on the other reporting IDs already in the mesh (including block and material IDs)

  • For a pin-level depletion case, the depletion IDs for the entire domain can be specified by finding unique combinations of assembly, pin, and material IDs

  • By additionally including ring and sector IDs accessible through PolygonConcentricCircleMeshGenerator, depletion zones can be defined within the pin itself

[Mesh]
  [depletion_id]
    type = DepletionIDGenerator
    input = 'core_mat_id'
    id_name = 'assembly_id pin_id'
    material_id_name = 'material_id'
    exclude_id_name = 'material_id'
    exclude_id_value = '3 4'
  []
[]

Querying Output Data using Reporting IDs

[VectorPostprocessors]
  [integral]
    type = ExtraIDIntegralVectorPostprocessor
    variable = 'variable_1 variable_2'
    id_name = 'assembly_id pin_id'
  []
[]

Example: Homogenous Assembly Fast Reactor Core (ABTR)

Homogenous Assembly Fast Reactor Core (ABTR)

  • We now build a sodium-cooled fast reactor core mesh for the Advanced Burner Test Reactor (ABTR) (Shemon et al. (2015)) using the following key steps:

    • Create homogenized hexagonal assemblies

    • Create dummy assemblies needed for core patterning

    • Combine assemblies into a full core

    • Delete dummy assemblies

    • Extrude 2D mesh to 3D

    • Assign plane-level reporting IDs

    • Rename outer boundary sidesets for later use in Griffin (optional)

Hands-on package MOOSE input file: combined/reactor_workshop/tests/reactor_examples/abtr/abtr.i

Define Homogeneous Hexagonal Assemblies

  • SimpleHexagonGenerator

  • Hexagonal assembly

  • Size of 7.3425 (apothem style, center to wall distance, or half-pitch).

  • QUAD elements

  • Assign unique block ID to each assembly type

  • Each assembly type requires its own definition so that different materials can later be assigned to different assemblies (using block id as a differentiating factor)

  • Alternatively, using "element_type" = TRI discretizes hexagonal assembly into 6 triangles

[Mesh]
  [control]
    type = SimpleHexagonGenerator
    hexagon_size = 7.3425 # Half of the assembly pitch, which is 14.685
    hexagon_size_style = 'apothem' # default
    element_type = QUAD
    block_id = '0'
  []
[]

Define Dummy Assemblies

  • SimpleHexagonGenerator

  • Hexagonal assembly

  • 7.3425 cm half-pitch

  • QUAD elements

  • Use a specific ID or name for the dummy in order to delete later in mesh generation process

[Mesh]
  [dummy]
    type = SimpleHexagonGenerator
    hexagon_size = 7.3425
    hexagon_size_style = 'apothem'
    element_type = QUAD
    block_id = '997'
  []
[]

Assemble Core Lattice

  • PatternedHexMeshGenerator

  • Uses all generated real assemblies and dummy assembly as input

  • The parameters "id_name", "assign_type", and "exclude_id" define how the assembly_id reporting ID will be generated. We exclude the dummy assemblies from being assigned IDs.

[Mesh]
  [core]
    type = PatternedHexMeshGenerator
    inputs = 'control inner_core test_fuel inner_reflector
              outer_core outer_reflector shield dummy'
    pattern_boundary = none # do not add background coolant or a duct around this pattern
    rotate_angle = 0 # do not rotate (default is 90 degrees, i.e. vertex up)
    external_boundary_name = radial # external boundary is called 'radial'
    generate_core_metadata = false # This is a special case. Even though this is a core, we say "false" since the assemblies
    # are homogenized (no pin information) and this is the first invocation of patterning.

    pattern = '  7   7   6   6   6   6   6   6   7   7;
                 7   6   6   5   5   5   5   5   6   6   7;
               6   6   5   5   3   3   3   3   5   5   6   6;
             6   5   5   3   3   3   3   3   3   3   5   5   6;
           6   5   3   3   3   3   4   4   3   3   3   3   5   6;
         6   5   3   3   3   4   4   0   4   4   3   3   3   5   6;
       6   5   3   3   4   4   2   1   1   3   4   4   3   3   5   6;
     6   5   3   3   4   0   1   1   2   1   1   0   4   3   3   5   6;
   7   6   5   3   3   4   1   0   1   1   0   1   4   3   3   5   6   7;
 7   6   5   3   3   4   3   1   1   0   1   1   2   4   3   3   5   6   7;
   7   6   5   3   3   4   1   2   1   1   2   1   4   3   3   5   6   7;
     6   5   3   3   4   0   1   1   0   1   1   0   4   3   3   5   6;
       6   5   3   3   4   4   2   1   1   3   4   4   3   3   5   6;
         6   5   3   3   3   4   4   0   4   4   3   3   3   5   6;
           6   5   3   3   3   3   4   4   3   3   3   3   5   6;
             6   5   5   3   3   3   3   3   3   3   5   5   6;
               6   6   5   5   3   3   3   3   5   5   6   6;
                 7   6   6   5   5   5   5   5   6   6   7;
                   7   7   6   6   6   6   6   6   7   7'
    id_name = 'assembly_id' # automatically assigns assembly_ids
    assign_type = cell # using cell mode
    exclude_id = 'dummy' # don't assign ids to dummy assemblies
  []
[]

Delete Dummy Assemblies

  • BlockDeletionGenerator

  • Remove "dummy" assemblies added for core hex patterning

  • Set "new_boundary" to same value as outer boundary in Mesh/core/external_boundary_name to update the outer boundary sideset along the location of deleted assemblies

[Mesh]
  [del_dummy]
    type = BlockDeletionGenerator
    input = core
    block = 997 # delete the elements in block 997 (these are the dummy blocks)
    new_boundary = radial # rename the newly exposed outer boundary 'radial'
  []
[]

Extrude 2D core to 3D

  • AdvancedExtruderGenerator

  • Extrude 2D mesh to 3D (in + direction )

  • Split into multiple intervals, definite heights and number of layers for each

  • Set top/bottom boundary IDs to be referenced later

  • Assign new block IDs to each axial level using "subdomain_swaps"

[Mesh]
  [extrude]
    type = AdvancedExtruderGenerator
    input = del_dummy
    heights = '50.24 42.32 17.98 16.88 16.88 16.88 16.89 16.88 19.76 65.66 31.14 30.15'
    num_layers = '3 2 1 1 1 1 1 1 1 4 2 2'
    direction = '0 0 1'
    top_boundary = 998
    bottom_boundary = 999

    # This changes the block (subdomain) IDs on each axial layer from the original value (0,1,2,3,4,5,6) to something else
    # There are more than 7 materials in the problem so we introduce new block IDs such as 8,9,10,11,12 to account for different materials.

    # The first row changes the bottom layer block ids 0 1 2 3 4 5 6 to block ids 12 12 12 12 12 11
    subdomain_swaps = '0 12 1 12 2 12 3 12 4 12 5 12 6 11;
                       0 9  1 9  2 9  3 8  4 9  5 10 6 11;
                       0 4  1 9  2 9  3 8  4 9  5 10 6 11;
                       0 4  1 1  2 2  3 8  4 3  5 10 6 11;
                       0 4  1 1  2 2  3 8  4 3  5 10 6 11;
                       0 4  1 1  2 2  3 8  4 3  5 10 6 11;
                       0 4  1 1  2 2  3 8  4 3  5 10 6 11;
                       0 5  1 1  2 2  3 8  4 3  5 10 6 11;
                       0 6  1 13 2 13 3 8  4 13 5 10 6 11;
                       0 6  1 14 2 14 3 8  4 14 5 10 6 11;
                       0 7  1 14 2 14 3 8  4 14 5 10 6 11;
                       0 15 1 15 2 15 3 15 4 15 5 15 6 11'
    # The last row changes the block ids on the top layer
  []
[]

Assign Plane-level Reporting IDs

[Mesh]
  [plane_id]
    type = PlaneIDMeshGenerator
    input = extrude
    id_name = plane_id # add reporting ids called 'plane_id'
    plane_coordinates = '0.000 50.240 92.560 110.540 127.420
                         144.300 161.180 178.070 194.950
                         214.710 280.370 311.510 341.660' # elements between these coordinates will be labeled with the same plane_id
  []
[]

(Optional) Rename Outer Boundary Sidesets

  • RenameBoundaryGenerator

  • Griffin requires the outer boundary sidesets to be defined to apply boundary conditions such as vacuum or reflective boundary conditions

[Mesh]
  [abtr_mesh]
    type = RenameBoundaryGenerator
    input = plane_id
    old_boundary = '999 998' # The old boundary '999' is renamed 'bottom'.
    # The old boundary '998' is renamed 'top'.
    new_boundary = 'bottom top'
  []
[]

Use of ABTR Mesh in Downstream Physics Code (Griffin)

The Reactor Module creates meshes containing blocks of elements (identified by block ID), groups of elements with similar reporting IDs (identified by different reporting IDs such as pin_id, assembly_id, depletion_id), and groups of curves (2D meshes) or faces (3D meshes) called sidesets (identified by sideset ID). In particular, the blocks and sidesets are used in downstream physics codes to assign materials to mesh elements and to assign boundary conditions.

These assignments are discussed here for Griffin, a MOOSE-based reactor physics code developed under the DOE Nuclear Energy Advanced Modeling and Simulation Program.

Assignment of Material Properties to Blocks

Griffin's MixedNeutronicsMaterial defines the mesh-material mapping explicitly using the subdomain IDs defined on the mesh. Each corresponding material ID defines the cross-section properties for those mesh elements.

The key point is that the block IDs (subdomain_id) in the mesh need to be referenced in the Griffin input file in order to map materials to these blocks. A separate MixedNeutronicsMaterial should be defined in the Griffin input for each unique material ID pertaining to the input mesh.

[Materials]
  [icore]
    type = MixedNeutronicsMaterial
    material_id = 1
    block = '  84   85   80   81   79   75   76   82  104  105  100  101   99   95   96  102  124  125  120  121  119  115  116  122  144   145  140  141  139  135  136  142  167  168  162  164  161  156  157  165'
    isotopes = 'pseudo_ICORE'
  []
[]

Assignment of Boundary Conditions to Sidesets

Griffin requires boundary conditions to be applied to all external boundaries of the mesh (generally the top, bottom, and radial periphery for a typical 3D core). Boundary conditions are set in the TransportSystems block of Griffin. These outer boundary sidesets must be assigned to the appropriate boundary condition type (e.g., VacuumBoundary, ReflectingBoundary, etc.).

[TransportSystems]
  particle = neutron
  G = 33
  VacuumBoundary = 'top bottom radial'
  equation_type = eigenvalue
  [sn]
    scheme = DFEM-SN
    family = L2_LAGRANGE
    order = FIRST
    AQtype = Gauss-Chebyshev
    NPolar = 3
    NAzmthl = 4
    NA = 2
    sweep_type = asynchronous_parallel_sweeper
    using_array_variable = true
    collapse_scattering = true
  []
[]

Generation of CMFD Mesh in Griffin

We briefly touch on mesh generation for the Coarse Mesh Finite Difference (CMFD) acceleration option in Griffin. There are three options:

  • Option 1: Define "coarse" mesh that is identical to fine mesh

  • Option 2: Define coarse mesh covering the same geometry as the fine mesh, but with a coarser mesh refinement

  • Option 3: Define a regular square grid covering the entire mesh domain (and beyond)

This ABTR example uses option 1, where the CMFD acceleration uses the same mesh as the fine mesh, so no additional mesh generation is performed.

Output Postprocessing

[PowerDensity]
  power_density_variable = power
  power = 60.0
[]

[VectorPostprocessors]
  [assembly_power_2d]
    type = ExtraIDIntegralVectorPostprocessor
    variable = 'power'
    id_name = 'assembly_id'
  []
  [axial_power]
    type = ExtraIDIntegralVectorPostprocessor
    variable = 'power'
    id_name = 'plane_id'
  []
  [assembly_power_3d]
    type = ExtraIDIntegralVectorPostprocessor
    variable = 'power'
    id_name = 'assembly_id plane_id'
  []
[]

Output Postprocessing

Example: Heat Pipe-Cooled Micro Reactor (HP-MR)

Heat Pipe-Cooled Micro Reactor (HP-MR)

  • This section covers the creation of a detailed 1/6 core Heat-Pipe Micro Reactor mesh using the following key steps:

    • Create fuel/moderator/heat-pipe pin cells

    • Combine pins into a fuel assembly

    • Create control drum assembly

    • Create additional assemblies (reflector, central hole, dummies)

    • Combine assemblies into a full core

    • Delete dummy assemblies

    • Add a core periphery region

    • Slice full core to 1/6 core

    • Extrude 2D mesh to 3D

Hands-on package MOOSE input file: combined/reactor_workshop/tests/reactor_examples/hpmr/hpmr.i

Create Pin Unit Cell

  • PolygonConcentricCircleMeshGenerator

  • Center, outer ring, background region

  • Volumes preserved ("preserve_volumes"=True)

  • TRI center elements ("quad_center_elements"=False)

  • Center of pin unit cell can be meshed by triangular or quadratic elements

  • Duct regions can also be added to the outer periphery (not used in this example)

  • Block IDs are assigned for each radial layer

[Mesh]
  [moderator_pincell]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6 # must be six to use hex pattern
    num_sectors_per_side = '2 2 2 2 2 2 '
    background_intervals = 1
    background_block_ids = '10'
    polygon_size = 1.15
    polygon_size_style = 'apothem'
    ring_radii = '0.825 0.92'
    ring_intervals = '2 1'
    ring_block_ids = '103 100 101' # 103 is tri mesh
    preserve_volumes = on
    quad_center_elements = false
  []
[]

Create Patterned Hexagonal Fuel Assembly

  • PatternedHexMeshGenerator

  • Hexagonal grid (13.376 units apothem )

  • 3 input pin types (fuel, heatpipe, moderator)

  • Background region out to hexagonal boundary

  • Pattern references input mesh list in order (0-indexed)

[Mesh]
  [fuel_assembly]
    type = PatternedHexMeshGenerator
    inputs = 'fuel_pincell heatpipe_pincell moderator_pincell'
    hexagon_size = 13.376
    background_block_id = 10
    background_intervals = 1
    pattern = '1 0 1 0 1 0 1;
              0 2 0 2 0 2 0 0;
             1 0 1 0 1 0 1 2 1;
            0 2 0 2 0 2 0 0 0 0;
           1 0 1 0 1 0 1 2 1 2 1;
          0 2 0 2 0 2 0 0 0 0 0 0;
         1 0 1 0 1 0 1 2 1 2 1 2 1;
          0 2 0 2 0 2 0 0 0 0 0 0;
           1 0 1 0 1 0 1 2 1 2 1;
            0 2 0 2 0 2 0 0 0 0;
             1 0 1 0 1 0 1 2 1;
              0 2 0 2 0 2 0 0;
               1 0 1 0 1 0 1'
  []
[]

Fuel-Only Core

[Mesh]
  [fuel_core]
    type = PatternedHexMeshGenerator
    inputs = 'fuel_assembly'
    # Pattern ID  0
    pattern_boundary = none
    generate_core_metadata = true
    pattern = '0 0 0 0 0;
              0 0 0 0 0 0;
             0 0 0 0 0 0 0;
            0 0 0 0 0 0 0 0;
           0 0 0 0 0 0 0 0 0;
            0 0 0 0 0 0 0 0;
             0 0 0 0 0 0 0;
              0 0 0 0 0 0;
               0 0 0 0 0'
    rotate_angle = 60
  []
[]

Control Drum Assembly

  1. Define control drum mesh with HexagonConcentricCircleAdaptiveBoundaryMeshGenerator

  2. Split outer ring into 2 separate block IDs using AzimuthalBlockSplitGenerator to account for control material zone

Setup

Control Drum Assembly

[Mesh]
  [cd1_step1]
    type = HexagonConcentricCircleAdaptiveBoundaryMeshGenerator
    meshes_to_adapt_to = 'fuel_assembly fuel_assembly'
    sides_to_adapt = '3 4'
    num_sectors_per_side = '4 4 4 4 4 4'
    hexagon_size = 13.376
    background_intervals = 2
    background_block_ids = 504
    ring_radii = '12.25 13.25'
    ring_intervals = '2 1'
    ring_block_ids = '500 501 502'
    preserve_volumes = true
    is_control_drum = true
  []
[]

[Mesh]
  [cd1]
    type = AzimuthalBlockSplitGenerator
    input = cd1_step1
    start_angle = 45
    angle_range = 90
    old_blocks = 502
    new_block_ids = 503
  []
[]

Create Additional Assemblies (Reflector, Air, Dummy)

  • HexagonConcentricCircleAdaptiveBoundaryMeshGenerator

  • Same size as fuel assemblies

  • Side node adaptation for case with neighboring fuel assemblies

  • Single central air hole assembly

  • Multiple "Dummy" assemblies needed for patterning (to be deleted later)

  • Boundary nodes on two neighboring assemblies need to match up in order for the assemblies to be stitched together

  • Assemblies that neighbor several different assembly types (control drums, reflectors) are generally created last so that the boundaries can be specified based on the meshes these need to match.

[Mesh]
  [refl1]
    type = HexagonConcentricCircleAdaptiveBoundaryMeshGenerator
    meshes_to_adapt_to = 'fuel_assembly'
    sides_to_adapt = '4'
    num_sectors_per_side = '4 4 4 4 4 4'
    hexagon_size = 13.376
    background_intervals = 2
    background_block_ids = '400 401'
  []
[]

Create Patterned Full Core

  • PatternedHexMeshGenerator

  • Whole core rotated 60 degrees

  • 5 Input geometry types

    • Fuel assemblies

    • "Other" Assemblies - Control drum (12 meshes), Reflector (6 meshes), Air hole center

    • Dummy assemblies

  • "Empty" spots should be defined with dummy assemblies and later deleted.

[Mesh]
  [core]
    type = PatternedHexMeshGenerator
    inputs = 'fuel_assembly cd1 cd2 cd3 cd4 cd5 cd6 cd7 cd8 cd9 cd10 cd11 cd12 refl1 refl2 refl3 refl4 refl5 refl6 dummy air_center'
    # Pattern ID  0           1   2   3   4   5   6   7   8   9   10   11   12    13    14    15    16    17    18   19  20
    pattern_boundary = none
    generate_core_metadata = true
    pattern = '19 13 1  18 19;
             13 12  0  0  2 18;
           11  0  0  0  0  0  3;
          14 0  0   0  0  0  0 17;
        19 10  0  0  20  0  0  4 19;
          14 0  0   0  0  0  0 17;
            9  0  0  0  0  0  5;
             15  8  0  0  6 16;
               19 15  7 16 19'
    rotate_angle = 60
  []
[]

Delete Dummy Assemblies

  • BlockDeletionGenerator

  • Remove "dummy" assemblies which were added only for core hex patterning

  • The blocks IDs of the dummy assembly were defined by the user in the definition of the dummy assembly

  • Set the new outer boundaries that result from the deleted assemblies to have the same sideset ID as the existing outer boundary

[Mesh]
  [del_dummy]
    type = BlockDeletionGenerator
    block = '700 701'
    input = core
    new_boundary = 10000
  []
[]

Add Core Periphery

  • PeripheralRingMeshGenerator

  • 115.0 units vessel radius

  • Use existing core outer boundary ID as input boundary which describes which boundary the peripheral ring should start from

[Mesh]
  [outer_shield]
    type = PeripheralRingMeshGenerator
    input = del_dummy
    peripheral_layer_num = 1
    peripheral_ring_radius = 115.0
    input_mesh_external_boundary = 10000
    peripheral_ring_block_id = 250
    peripheral_ring_block_name = outer_shield
  []
[]

Slice to 1/6 Core

  • PlaneDeletionGenerator

  • Trimming plane defined by a point and a normal vector

  • Elements whose centroids lie "above" (in the direction of the normal vector) the plane will be deleted

  • Set new outer boundary ID on sliced lines to be referenced later

  • To slice the full core in half:

    • Point = , normal =

  • To slice the half core into 1/3:

    • Point = , normal =

  • Advanced trimming options are available (see HexagonMeshTrimmer). Trimming should only be performed along lines of symmetry.

[Mesh]
  [coreslice_1]
    type = PlaneDeletionGenerator
    point = '0 0 0'
    normal = '10 17.32 0'
    input = outer_shield
    new_boundary = 147
  []
[]
[Mesh]
  [coreslice_2]
    type = PlaneDeletionGenerator
    point = '0 0 0'
    normal = '10 -17.32 0'
    input = coreslice_1
    new_boundary = 147
  []
[]

Extrude to 3D

  • AdvancedExtruderGenerator

  • Extrude the 2D mesh in + direction

  • Split into 3 axial intervals

  • Heights for each interval: 20 units, 160 units, 20 units

    • Number of layers in each interval: 1, 8, 1

  • Set top/bottom boundary IDs to be referenced later

[Mesh]
  [extrude]
    type = AdvancedExtruderGenerator
    input = coreslice_2
    heights = '20 160 20'
    num_layers = '1 8 1'
    direction = '0 0 1'
    subdomain_swaps = '10 1000 100 1000 101 1000 103 1003 200 1000 201 1000 203 1003 301 1000 303 1003;
                        10 10   100 100  101 101  103 103  200 200  201 201  203 203  301 301  303 303;
                        10 1000 100 1000 101 1000 103 1003 200 200  201 201  203 203  301 1000 303 1003'
    top_boundary = 2000
    bottom_boundary = 3000
  []
[]

Using the Mesh in Downstream Physics Applications (Griffin)

We briefly describe some key steps which are required to use the resulting mesh in Griffin. Namely, block IDs (subdomain_id) are referenced in Griffin to assign materials to elements. The external boundary sideset IDs are referenced in Griffin to assign boundary conditions.

Assignment of Material Properties to Blocks

All blocks in the mesh must be assigned to a material in Griffin.

[Materials]
  [mat1]
    type = CoupledFeedbackNeutronicsMaterial
    block = '250'
    material_id = 1
  []
  [mat2]
    type = CoupledFeedbackNeutronicsMaterial
    block = '600'
    material_id = 2
  []
  # Repeat for all other blocks in mesh
[]

Assignment of Boundary Conditions to Sidesets

Generation of Coarse Mesh in Griffin

We briefly touch on mesh generation for the Coarse Mesh Finite Difference acceleration option in Griffin. There are three options:

  • Option 1: Define "coarse" mesh that is identical to fine mesh

  • Option 2: Define coarse mesh covering the same geometry as the fine mesh but with a coarser mesh refinement

  • Option 3: Define a regular square grid covering the entire mesh domain (and beyond)

Reactor Geometry Mesh Builder: A Contained System for Building Regular Geometries

Reactor Geometry Mesh Builder (RGMB) refers to a subset of specialized mesh generators designed specifically for simplifying the task of building reactor geometries. These mesh generators are intended to be called in a specific order and assume that pin-like structures are built into a Cartesian or hexagonal assembly lattice. These assembly lattices can be combined into a core lattice with a peripheral ring added to the core boundary. RGMB mesh generation is accomplished by calling base Reactor module mesh generators under-the-hood while exposing only the minimum number of parameters needed by the user to define the reactor geometry.

Benefits of RGMB system include:

  • Simplified user options for generation of reactor meshes

  • Minimal number of blocks associated with output mesh – one block is allocated to all quadrilateral elements and another block is used for all triangular elements

  • Automatic assignment of extra element integers: pin_id, assembly_id, plane_id

  • Assignment of region ids directly on the mesh, avoiding the need to define these map materials to mesh in the MOOSE physics application input file

The RGMB system is useful for regular 2D or extruded 3D Cartesian or hexagonal geometries. Many useful meshing options (e.g., boundary layers) are currently hidden and unavailable to the user through RGMB to keep things simple. If these options are needed for more complex geometries, the individual Reactor Module mesh generators should be used as shown in earlier sections. Additionally, control drum support has not yet been added.

ReactorMeshParams

ReactorMeshParams acts as a container for storing global data about the reactor geometry that needs to be retrieved at different stages of the RGMB mesh generation workflow. In particular, the union axial grid for the extruded geometry is defined here and propagated to the entire mesh upon the extrusion step.

[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
  []
[]

PinMeshGenerator

PinMeshGenerator calls PolygonConcentricCircleMeshGenerator to generate a Cartesian or hexagonal pin-like structure (pin, background, and duct) (mesh colored by subdomain_id (left) and region_id (right))

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

[Mesh]
  [pin1]
    type = PinMeshGenerator
    reactor_params = rmp
    pin_type = 1
    pitch = 1.42063
    num_sectors = 2
    ring_radii = 0.2
    duct_halfpitch = 0.58
    mesh_intervals = '1 1 1'
    region_ids = '1 2 3'
    quad_center_elements = false
  []
[]

AssemblyMeshGenerator

AssemblyMeshGenerator calls PatternedHexMeshGenerator or PatternedMeshGenerator to generate a Cartesian or hexagonal lattice of pin-like structures. (assembly colored by subdomain_id (left), region_id (middle), and pin_id (right))

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

[Mesh]
  [assembly1]
    type = AssemblyMeshGenerator
    assembly_type = 1
    inputs = 'pin1 pin2 pin3'
    pattern = '1 2;
              2 0 1;
               1 2'
    background_intervals = 1
    background_region_id = 7
    duct_intervals = 1
    duct_halfpitch = 2.2
    duct_region_ids = 8
  []
[]

CoreMeshGenerator

CoreMeshGenerator calls PatternedHexMeshGenerator or PatternedMeshGenerator to generate a Cartesian or hexagonal lattice of assembly-like structures. (core colored by subdomain_id (left), region_id (middle), and assembly_id (right))

[Mesh]
  [rgmb_core]
    type = CoreMeshGenerator
    inputs = 'assembly1 assembly2'
    pattern = '1 0;
               0 1'
    extrude = true
  []
[]

[Mesh]
  [rgmb_core]
    type = CoreMeshGenerator
    inputs = 'assembly1 assembly2 empty'
    dummy_assembly_name = empty
    pattern = '2 1;
              1 0 2;
               2 1'
    extrude = true
  []
[]

CoreMeshGenerator with Peripheral Ring

A core periphery region can be added utilizing either the PeripheralRingMeshGenerator or the PeripheralTriangleMeshGenerator.

[Mesh]
  [rgmb_core]
    type = CoreMeshGenerator
    inputs = 'assembly1 assembly2 empty'
    dummy_assembly_name = empty
    pattern = '2 1;
              1 0 2;
               2 1'
    extrude = false

    mesh_periphery = true
    periphery_generator = triangle
    periphery_region_id = 100
    outer_circle_radius = 8
    outer_circle_num_segments = 100
    desired_area = 0.5
  []
[]

Default Block and External Boundary Names

An RGMB case can terminate at the pin, assembly, or core "level". Pins and assemblies always have a "type" assigned (a numeric integer specified as "pin_type" for pins and "assembly_type" for assemblies), whereas cores do not. The "level" and "type" are used in the naming schemes for the blocks and outer boundary as follows:

  • The default block names in the final mesh are RGMB_(level)(type) and RGMB_(level)(type)_TRI (if triangular elements are present). For example, RGMB_PIN1 and RMGB_PIN1_TRI, or RGMB_ASSEMBLY1 and RGMB_ASSEMBLY1_TRI, or RGMB_CORE and RGMB_CORE_TRI, for workflows ending at the pin, assembly or core level, respectively.

  • The default outer boundary names in the radial dimension are outer_(level)_(type). For example, for workflows ending at the pin, assembly or core level respectively, the outer boundary names are outer_pin_1, outer_assembly_1 and outer_core.

  • If the problem is extruded in the axial dimension, the top and bottom boundaries also exist.

Reactor Geometry Mesh Builder Example: Homogeneous Sodium-Cooled Fast Reactor Core (ABTR)

Homogeneous Sodium-Cooled Fast Reactor Core (ABTR)

This example illustrates the use of RGMB mesh generators to define a 3D hexagonal geometry core with homogeneous assemblies (ABTR (Shemon et al. (2015)), constructed earlier in this tutorial using base mesh generators).

Hands-on package MOOSE input file: combined/reactor_workshop/tests/reactor_examples/rgmb_abtr/rgmb_abtr.i

ReactorMeshParams

ReactorMeshParams contains global mesh/geometry parameters including whether the final mesh is 2D or 3D, Cartesian or hexagonal, assembly pitch, and the axial discretization for the final extruded geometry. This information will be accessible to the other RGMB mesh generators and consistently used.

[Mesh]
  [rmp]
    type = ReactorMeshParams
    dim = 3 # Dimensionality of output mesh (2 or 3)
    geom = "Hex" # Geometry type (Hex or Square)
    assembly_pitch = 14.685 # Size of assembly flat-to-flat pitch
    axial_regions = '50.24 42.32 17.98 16.88
                     16.88 16.88 16.89 16.88
                     19.76 65.66 31.14 30.15' # Size of each axial zone
    axial_mesh_intervals = '3 2 1 1 1 1 1 1 1 4 2 2' # Number of subintervals per axial zone
    top_boundary_id = 201 # Boundary id assigned to top surface
    bottom_boundary_id = 202 # Boundary id assigned to bottom surface
    radial_boundary_id = 203 # Boundary id assigned to radial surface
  []
[]

PinMeshGenerator

PinMeshGenerator is called multiple times to define the various homogeneous assemblies. Dummy assemblies are not required when building a core using RGMB, so they are not defined in this input.

[Mesh]
  [control]
    type = PinMeshGenerator
    reactor_params = rmp # Name of ReactorMeshParams object
    pin_type = 1 # Unique identifier for each homogenized assembly type
    pitch = 14.685 # Assembly pitch
    region_ids = '12; 9; 4; 4;
                  4; 4; 4; 5;
                  6; 6; 7; 15' # Region ID's, assigned radially outwards then axially from bottom to top
    quad_center_elements = true # Discretize homogenized assemblies into 2 quadrilaterals
    homogenized = true # Use SimpleHexagonGenerator to define homogenized assemblies
    use_as_assembly = true # Treat mesh as assembly for direct stitching into CoreMeshGenerator
  []
[]

CoreMeshGenerator

  • CoreMeshGenerator has some additional intelligence to automatically handle dummy assembly creation and deletion

[Mesh]
  [core]
    type = CoreMeshGenerator
    inputs = 'control inner_core test_fuel inner_reflector
              outer_core outer_reflector shield dummy' # Name of constituent assemblies
    dummy_assembly_name = dummy # Name of dummy assembly, does not need to be explicitly defined
    pattern = '  7   7   6   6   6   6   6   6   7   7;
                 7   6   6   5   5   5   5   5   6   6   7;
               6   6   5   5   3   3   3   3   5   5   6   6;
             6   5   5   3   3   3   3   3   3   3   5   5   6;
           6   5   3   3   3   3   4   4   3   3   3   3   5   6;
         6   5   3   3   3   4   4   0   4   4   3   3   3   5   6;
       6   5   3   3   4   4   2   1   1   3   4   4   3   3   5   6;
     6   5   3   3   4   0   1   1   2   1   1   0   4   3   3   5   6;
   7   6   5   3   3   4   1   0   1   1   0   1   4   3   3   5   6   7;
 7   6   5   3   3   4   3   1   1   0   1   1   2   4   3   3   5   6   7;
   7   6   5   3   3   4   1   2   1   1   2   1   4   3   3   5   6   7;
     6   5   3   3   4   0   1   1   0   1   1   0   4   3   3   5   6;
       6   5   3   3   4   4   2   1   1   3   4   4   3   3   5   6;
         6   5   3   3   3   4   4   0   4   4   3   3   3   5   6;
           6   5   3   3   3   3   4   4   3   3   3   3   5   6;
             6   5   5   3   3   3   3   3   3   3   5   5   6;
               6   6   5   5   3   3   3   3   5   5   6   6;
                 7   6   6   5   5   5   5   5   6   6   7;
                   7   7   6   6   6   6   6   6   7   7' # Lattice pattern of constituent assemblies
    extrude = true # Extrude core to 3-D
  []
[]

Use of RGMB Mesh with Griffin

Griffin recognizes material ID assignments through the material_id tag. Therefore, the region_id tags need to be renamed to material_id. This is done using ExtraElementIDCopyGenerator.

[Mesh]
  [abtr_mesh]
    type = ExtraElementIDCopyGenerator
    input = core
    source_extra_element_id = region_id
    target_extra_element_ids = 'material_id'
  []
[]

Material definition in the Griffin input file is then greatly simplified since material_id is defined directly on mesh. No additional mapping is needed.

[Materials]
  [matid]
    type = MixedMatIDNeutronicsMaterial
    block = 'RGMB_CORE'
    isotopes = 'pseudo'
  []
[]

RGMB labels outer boundary sidesets with pre-defined names – "top" for top boundary, "bottom" for bottom boundary, and "outer_core" for radial boundary. Boundary conditions are assigned to these sidesets in Griffin.

[TransportSystems]
  particle = neutron
  G = 33
  VacuumBoundary = 'outer_core top bottom'
  equation_type = eigenvalue
  [sn]
    scheme = DFEM-SN
    family = L2_LAGRANGE
    order = FIRST
    AQtype = Gauss-Chebyshev
    NPolar = 3
    NAzmthl = 4
    NA = 2
    sweep_type = asynchronous_parallel_sweeper
    using_array_variable = true
    collapse_scattering = true
  []
[]

Reactor Geometry Mesh Builder Example: Heterogeneous Lead-Cooled Fast Reactor Assembly

Heterogeneous Lead-Cooled Fast Reactor Assembly

This example illustrates the use of RGMB mesh generators to define a 3D pin-heterogeneous hexagonal assembly with duct. The geometry is based on an early prototype of a lead-cooled fast reactor (LFR) assembly designed by Westinghouse Electric Company (WEC) (Grasso et al. (2019)).

Hands-on package MOOSE input file: combined/reactor_workshop/tests/reactor_examples/rgmb_lfr/rgmb_lfr_assembly.i

ReactorMeshParams

ReactorMeshParams contains global mesh/geometry parameters including the dimension (3D), type (hexagonal) and the axial discretization for the final geometry.

[Mesh]
  [rmp]
    type = ReactorMeshParams
    dim = 3 # Dimensionality of output mesh (2 or 3)
    geom = "Hex" # Geometry type (Hex or Square)
    assembly_pitch = 16.4165 # Size of assembly flat-to-flat pitch
    axial_regions = '10.07 30.79 6.56 85.85 1.52
                     106.07 1.51 12.13 5.05 93.87' # Size of each axial zone
    axial_mesh_intervals = '1 3 1 9 1 20 1 2 1 9' # Number of subintervals per axial zone
    top_boundary_id = 201 # Boundary id assigned to top surface
    bottom_boundary_id = 202 # Boundary id assigned to bottom surface
    radial_boundary_id = 200 # Boundary id assigned to radial surface
  []
[]

PinMeshGenerator

The pitch of the pin is specified with pitch, and the number of azimuthal sectors is specified with "num_sectors". The number or radial blocks and radial sub-intervals is specified through the array "mesh_intervals". In this case, the pin has 4 important radii corresponding to the central helium gap radius, outer fuel radius, inner cladding radius, and outer cladding radius.

[Mesh]
  [pin1]
    type = PinMeshGenerator
    reactor_params = rmp # Name of ReactorMeshParams object
    pin_type = 1 # Unique identifier for each pin type
    pitch = 1.3425 # Pin pitch
    num_sectors = 2 # Number of azimuthal sectors per quadrant
    mesh_intervals = '1 3 1 1 1' # Number of mesh intervals per radial region
    # (4 ring regions followed by background region)
    ring_radii = '0.2020 0.4319 0.4495 0.5404' # Radii of each ring region
    region_ids = '1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 5 6;
                8 8 8 9 10;
                20 19 20 13 21;
                24 24 24 25 26;
                28 28 28 29 30;
                32 32 32 32 32;
                33 33 33 33 33' # Region ID's, assigned radially outwards (4 rings + background) then
    # axially from bottom to top
    quad_center_elements = false # Whether to discretize central ring region into quad or tri elements
  []
[]

AssemblyMeshGenerator

AssemblyMeshGenerator takes the pin types previously defined and places them into a regular hexagonal grid. Additionally, coolant and duct regions need to be added around the pins in order to create the assembly geometry.

Extrusion is performed by using the "extrude"=true option and is performed after the 2D assembly geometry has been completed.

[Mesh]
  [assembly]
    type = AssemblyMeshGenerator
    inputs = 'pin1 pin2 pin3 pin4 pin5 pin6 pin7' # Name of constituent pins
    pattern = ' 0 0 0 0 0 0 0;
                0 1 1 1 1 1 1 0;
               0 1 2 2 2 2 2 1 0;
              0 1 2 3 3 3 3 2 1 0;
             0 1 2 3 4 4 4 3 2 1 0;
            0 1 2 3 4 5 5 4 3 2 1 0;
           0 1 2 3 4 5 6 5 4 3 2 1 0;
            0 1 2 3 4 5 5 4 3 2 1 0;
             0 1 2 3 4 4 4 3 2 1 0;
              0 1 2 3 3 3 3 2 1 0;
               0 1 2 2 2 2 2 1 0;
                0 1 1 1 1 1 1 0;
                 0 0 0 0 0 0 0' # Lattice pattern of constituent pins
    extrude = true # Extrude assembly to 3-D
    assembly_type = 1 # Unique identifier for each assembly type
    background_region_id = '1 2 3 6 10 21 26 30 32 33' # Region ID's of background region, defined axially from bottom to top
    background_intervals = '1' # Number of mesh intervals per background region
    duct_halfpitch = '7.6712 8.0245' # Half pitch of each duct region
    duct_intervals = '1 1' # Number of mesh intervals per duct region
    duct_region_ids = '1  1;  2  2;  3  3;  7  6;
                      11 10; 22 23; 27 26; 31 30;
                      32 32; 33 33' # Region ID's of duct region, assigned radially outwards then axially from bottom to top
  []
[]

EEIDs for subdomain_id (left), pin_id (middle) and plane_id (right) automatically applied:

Materials IDs also assigned:

Use of RGMB Mesh with Griffin

region_id extra element integer needs to be renamed to material_id so that Griffin can recognize these values are material assignments

[Mesh]
  [lfr_assy]
    type = ExtraElementIDCopyGenerator
    input = assembly
    source_extra_element_id = region_id
    target_extra_element_ids = 'material_id'
  []
[]

Boundary conditions are assigned to the outer boundary sidesets. The default outer boundary name for an assembly with "assembly_type" 1 is outer_assembly_1.

[TransportSystems]
  particle = neutron
  equation_type = eigenvalue
  G = 9
  VacuumBoundary = 'top bottom'
  ReflectingBoundary = 'outer_assembly_1'
  [sn]
    scheme = DFEM-SN
    family = L2_LAGRANGE
    order = FIRST
    AQtype = Gauss-Chebyshev
    NPolar = 2
    NAzmthl = 3
    NA = 1
    using_array_variable = true
    collapse_scattering = true
  []
[]

Material definition is greatly simplified since the material_id extra element ID is defined directly on mesh. Just the blocks need to be listed. The remainder of the file shown here simply describes the composition of the materials by isotope, and where to find them in the library file. There is no mapping performed in Griffin.

[Materials]
  [mat]
    type = MicroNeutronicsMaterial
    library_file = LFR_127Pin_Assembly_9g.micro.xml
    library_name = ISOTXS-neutron
    library_id = 1
    plus = true
    dbgmat = false
    grid_names = 'Tfuel'
    grid = '1'
    maximum_diffusion_coefficient = 1000
    block = 'RGMB_ASSEMBLY1 RGMB_ASSEMBLY1_TRI'
    materials = '
     HOM_IA00 1
       pseudo_FE54_IA:2.357119E-03
       pseudo_FE56_IA:3.700230E-02
       pseudo_FE57_IA:8.545370E-04
       pseudo_FE58_IA:1.137209E-04
       pseudo_NI58_IA:4.964541E-03
       pseudo_NI60_IA:1.912316E-03
       pseudo_NI61_IA:8.313568E-05
       pseudo_NI62_IA:2.650122E-04
       pseudo_NI64_IA:6.752956E-05
       pseudo_CR50_IA:4.670038E-04
       pseudo_CR52_IA:9.005674E-03
       pseudo_CR53_IA:1.021208E-03
       pseudo_CR54_IA:2.541921E-04
       pseudo_MN55_IA:6.804056E-04
       pseudo_MO92_IA:1.208810E-04
       pseudo_MO94_IA:7.534562E-05
       pseudo_MO95_IA:1.296811E-04
       pseudo_MO96_IA:1.358711E-04
       pseudo_MO97_IA:7.778964E-05
       pseudo_MO98_IA:1.965516E-04
       pseudo_MO100IA:7.844165E-05
       pseudo_SI28_IA:6.346952E-04
       pseudo_SI29_IA:3.222827E-05
       pseudo_SI30_IA:2.124518E-05
       pseudo_C____IA:1.414012E-04
       pseudo_P31__IA:2.963124E-05
       pseudo_S32__IA:1.501712E-05
       pseudo_S33__IA:1.202210E-07
       pseudo_S34__IA:6.786456E-07
       pseudo_S36__IA:3.163826E-09
       pseudo_TI46_IA:4.392136E-06
       pseudo_TI47_IA:3.960833E-06
       pseudo_TI48_IA:3.924632E-05
       pseudo_TI49_IA:2.880124E-06
       pseudo_TI50_IA:2.757723E-06
       pseudo_V____IA:3.751831E-06
       pseudo_ZR90_IA:1.077909E-06
       pseudo_ZR91_IA:2.350719E-07
       pseudo_ZR92_IA:3.593130E-07
       pseudo_ZR94_IA:3.641330E-07
       pseudo_ZR96_IA:5.866348E-08
       pseudo_W182_IA:2.755023E-07
       pseudo_W183_IA:1.487712E-07
       pseudo_W184_IA:3.197926E-07
       pseudo_W186_IA:2.955624E-07
       pseudo_CU63_IA:2.080417E-06
       pseudo_CU65_IA:9.272576E-07
       pseudo_CO59_IA:3.243027E-06
       pseudo_CA40_IA:4.622938E-06
       pseudo_CA42_IA:3.085425E-08
       pseudo_CA43_IA:6.437853E-09
       pseudo_CA44_IA:9.947682E-08
       pseudo_CA46_IA:1.907516E-10
       pseudo_CA48_IA:8.917673E-09
       pseudo_NB93_IA:1.028608E-06
       pseudo_N14__IA:6.797356E-06
       pseudo_N15__IA:2.510621E-08
       pseudo_AL27_IA:3.541729E-06
       pseudo_TA181IA:5.281244E-07
       pseudo_B10__IA:7.036758E-07
       pseudo_B11__IA:2.832423E-06
       pseudo_PB204IA:1.170210E-04
       pseudo_PB206IA:2.014417E-03
       pseudo_PB207IA:1.847215E-03
       pseudo_PB208IA:4.379936E-03;

     HOM_IB00 2
       pseudo_FE54_IB:2.614802E-04
       pseudo_FE56_IB:4.104560E-03
       pseudo_FE57_IB:9.479369E-05
       pseudo_FE58_IB:1.261549E-05
       pseudo_NI58_IB:6.872268E-04
       pseudo_NI60_IB:2.647203E-04
       pseudo_NI61_IB:1.150845E-05
       pseudo_NI62_IB:3.668443E-05
       pseudo_NI64_IB:9.347864E-06
       pseudo_CR50_IB:4.631781E-05
       pseudo_CR52_IB:8.931848E-04
       pseudo_CR53_IB:1.012839E-04
       pseudo_CR54_IB:2.521098E-05
       pseudo_MN55_IB:1.043741E-04
       pseudo_MO92_IB:8.868246E-06
       pseudo_MO94_IB:5.527715E-06
       pseudo_MO95_IB:9.513671E-06
       pseudo_MO96_IB:9.967888E-06
       pseudo_MO97_IB:5.707022E-06
       pseudo_MO98_IB:1.441956E-05
       pseudo_MO100IB:5.754824E-06
       pseudo_SI28_IB:1.067042E-04
       pseudo_SI29_IB:5.418111E-06
       pseudo_SI30_IB:3.571639E-06
       pseudo_C____IB:2.864312E-05
       pseudo_P31__IB:5.553616E-06
       pseudo_S32__IB:1.697766E-06
       pseudo_S33__IB:1.359253E-08
       pseudo_S34__IB:7.672599E-08
       pseudo_S36__IB:3.576939E-10
       pseudo_TI46_IB:2.635303E-06
       pseudo_TI47_IB:2.376593E-06
       pseudo_TI48_IB:2.354892E-05
       pseudo_TI49_IB:1.728167E-06
       pseudo_TI50_IB:1.654664E-06
       pseudo_V____IB:2.251188E-06
       pseudo_ZR90_IB:6.467752E-07
       pseudo_ZR91_IB:1.410455E-07
       pseudo_ZR92_IB:2.155884E-07
       pseudo_ZR94_IB:2.184885E-07
       pseudo_ZR96_IB:3.519937E-08
       pseudo_W182_IB:1.653064E-07
       pseudo_W183_IB:8.926448E-08
       pseudo_W184_IB:1.918775E-07
       pseudo_W186_IB:1.773469E-07
       pseudo_CU63_IB:1.248249E-06
       pseudo_CU65_IB:5.563717E-07
       pseudo_CO59_IB:1.945876E-06
       pseudo_CA40_IB:2.773808E-06
       pseudo_CA42_IB:1.851272E-08
       pseudo_CA43_IB:3.862851E-09
       pseudo_CA44_IB:5.968833E-08
       pseudo_CA46_IB:1.144545E-10
       pseudo_CA48_IB:5.350809E-09
       pseudo_NB93_IB:6.171741E-07
       pseudo_N14__IB:4.078559E-06
       pseudo_N15__IB:1.506459E-08
       pseudo_AL27_IB:2.125083E-06
       pseudo_TA181IB:3.168823E-07
       pseudo_B10__IB:4.222165E-07
       pseudo_B11__IB:1.699466E-06
       pseudo_PB204IB:3.885751E-04
       pseudo_PB206IB:6.688961E-03
       pseudo_PB207IB:6.133839E-03
       pseudo_PB208IB:1.454357E-02;

     HOM_IC00 3
       pseudo_FE54_IC:1.251752E-03
       pseudo_FE56_IC:1.964981E-02
       pseudo_FE57_IC:4.537988E-04
       pseudo_FE58_IC:6.039250E-05
       pseudo_NI58_IC:3.289936E-03
       pseudo_NI60_IC:1.267252E-03
       pseudo_NI61_IC:5.509228E-05
       pseudo_NI62_IC:1.756173E-04
       pseudo_NI64_IC:4.474985E-05
       pseudo_CR50_IC:2.217292E-04
       pseudo_CR52_IC:4.275877E-03
       pseudo_CR53_IC:4.848501E-04
       pseudo_CR54_IC:1.206850E-04
       pseudo_MN55_IC:4.996407E-04
       pseudo_MO92_IC:4.245476E-05
       pseudo_MO94_IC:2.646209E-05
       pseudo_MO95_IC:4.554388E-05
       pseudo_MO96_IC:4.771797E-05
       pseudo_MO97_IC:2.732113E-05
       pseudo_MO98_IC:6.903086E-05
       pseudo_MO100IC:2.754914E-05
       pseudo_SI28_IC:5.108111E-04
       pseudo_SI29_IC:2.593807E-05
       pseudo_SI30_IC:1.709871E-05
       pseudo_C____IC:1.371257E-04
       pseudo_P31__IC:2.658610E-05
       pseudo_S32__IC:8.127836E-06
       pseudo_S33__IC:6.507069E-08
       pseudo_S34__IC:3.673052E-07
       pseudo_S36__IC:1.712371E-09
       pseudo_TI46_IC:1.261552E-05
       pseudo_TI47_IC:1.137747E-05
       pseudo_TI48_IC:1.127347E-04
       pseudo_TI49_IC:8.273042E-06
       pseudo_TI50_IC:7.921328E-06
       pseudo_V____IC:1.077645E-05
       pseudo_ZR90_IC:3.096328E-06
       pseudo_ZR91_IC:6.752279E-07
       pseudo_ZR92_IC:1.032143E-06
       pseudo_ZR94_IC:1.045943E-06
       pseudo_ZR96_IC:1.685070E-07
       pseudo_W182_IC:7.913527E-07
       pseudo_W183_IC:4.273277E-07
       pseudo_W184_IC:9.185680E-07
       pseudo_W186_IC:8.489851E-07
       pseudo_CU63_IC:5.975747E-06
       pseudo_CU65_IC:2.663510E-06
       pseudo_CO59_IC:9.315485E-06
       pseudo_CA40_IC:1.327855E-05
       pseudo_CA42_IC:8.862667E-08
       pseudo_CA43_IC:1.849277E-08
       pseudo_CA44_IC:2.857418E-07
       pseudo_CA46_IC:5.479227E-10
       pseudo_CA48_IC:2.561506E-08
       pseudo_NB93_IC:2.954522E-06
       pseudo_N14__IC:1.952481E-05
       pseudo_N15__IC:7.211698E-08
       pseudo_AL27_IC:1.017342E-05
       pseudo_TA181IC:1.516963E-06
       pseudo_B10__IC:2.021284E-06
       pseudo_B11__IC:8.135837E-06
       pseudo_PB204IC:2.570306E-04
       pseudo_PB206IC:4.424583E-03
       pseudo_PB207IC:4.057368E-03
       pseudo_PB208IC:9.620298E-03;

     ID_TUBEMIX00 4
       pseudo_FE54_ID:6.532669E-04
       pseudo_FE56_ID:1.025499E-02
       pseudo_FE57_ID:2.368260E-04
       pseudo_FE58_ID:3.151812E-05
       pseudo_NI58_ID:1.716934E-03
       pseudo_NI60_ID:6.613685E-04
       pseudo_NI61_ID:2.875159E-05
       pseudo_NI62_ID:9.165281E-05
       pseudo_NI64_ID:2.335454E-05
       pseudo_CR50_ID:1.157225E-04
       pseudo_CR52_ID:2.231534E-03
       pseudo_CR53_ID:2.530392E-04
       pseudo_CR54_ID:6.298624E-05
       pseudo_MN55_ID:2.607607E-04
       pseudo_MO92_ID:2.215631E-05
       pseudo_MO94_ID:1.381068E-05
       pseudo_MO95_ID:2.376862E-05
       pseudo_MO96_ID:2.490384E-05
       pseudo_MO97_ID:1.425877E-05
       pseudo_MO98_ID:3.602700E-05
       pseudo_MO100ID:1.437779E-05
       pseudo_SI28_ID:2.665818E-04
       pseudo_SI29_ID:1.353663E-05
       pseudo_SI30_ID:8.923334E-06
       pseudo_C____ID:7.156191E-05
       pseudo_P31__ID:1.387470E-05
       pseudo_S32__ID:4.241824E-06
       pseudo_S33__ID:3.395960E-08
       pseudo_S34__ID:1.916872E-07
       pseudo_S36__ID:8.936736E-10
       pseudo_TI46_ID:6.584079E-06
       pseudo_TI47_ID:5.937654E-06
       pseudo_TI48_ID:5.883443E-05
       pseudo_TI49_ID:4.317539E-06
       pseudo_TI50_ID:4.134003E-06
       pseudo_V____ID:5.624293E-06
       pseudo_ZR90_ID:1.615914E-06
       pseudo_ZR91_ID:3.523885E-07
       pseudo_ZR92_ID:5.386347E-07
       pseudo_ZR94_ID:5.458561E-07
       pseudo_ZR96_ID:8.794009E-08
       pseudo_W182_ID:4.130003E-07
       pseudo_W183_ID:2.230133E-07
       pseudo_W184_ID:4.793831E-07
       pseudo_W186_ID:4.430761E-07
       pseudo_CU63_ID:3.118706E-06
       pseudo_CU65_ID:1.390070E-06
       pseudo_CO59_ID:4.861645E-06
       pseudo_CA40_ID:6.930147E-06
       pseudo_CA42_ID:4.625299E-08
       pseudo_CA43_ID:9.650875E-09
       pseudo_CA44_ID:1.491290E-07
       pseudo_CA46_ID:2.859556E-10
       pseudo_CA48_ID:1.336860E-08
       pseudo_NB93_ID:1.541900E-06
       pseudo_N14__ID:1.018998E-05
       pseudo_N15__ID:3.763731E-08
       pseudo_AL27_ID:5.309332E-06
       pseudo_TA181ID:7.916938E-07
       pseudo_B10__ID:1.054905E-06
       pseudo_B11__ID:4.245925E-06
       pseudo_HE4__ID:1.990687E-05;

     ID_CLAD00 5
       pseudo_FE54_ID:3.185952E-03
       pseudo_FE56_ID:5.001168E-02
       pseudo_FE57_ID:1.154947E-03
       pseudo_FE58_ID:1.537129E-04
       pseudo_NI58_ID:8.373412E-03
       pseudo_NI60_ID:3.225451E-03
       pseudo_NI61_ID:1.402235E-04
       pseudo_NI62_ID:4.469793E-04
       pseudo_NI64_ID:1.138947E-04
       pseudo_CR50_ID:5.643439E-04
       pseudo_CR52_ID:1.088250E-02
       pseudo_CR53_ID:1.234043E-03
       pseudo_CR54_ID:3.071758E-04
       pseudo_MN55_ID:1.271641E-03
       pseudo_MO92_ID:1.080550E-04
       pseudo_MO94_ID:6.735188E-05
       pseudo_MO95_ID:1.159146E-04
       pseudo_MO96_ID:1.214544E-04
       pseudo_MO97_ID:6.953578E-05
       pseudo_MO98_ID:1.757019E-04
       pseudo_MO100ID:7.011875E-05
       pseudo_SI28_ID:1.300140E-03
       pseudo_SI29_ID:6.601594E-05
       pseudo_SI30_ID:4.351798E-05
       pseudo_C____ID:3.489938E-04
       pseudo_P31__ID:6.766687E-05
       pseudo_S32__ID:2.068704E-05
       pseudo_S33__ID:1.656123E-07
       pseudo_S34__ID:9.348567E-07
       pseudo_S36__ID:4.358298E-09
       pseudo_TI46_ID:3.210951E-05
       pseudo_TI47_ID:2.895766E-05
       pseudo_TI48_ID:2.869267E-04
       pseudo_TI49_ID:2.105602E-05
       pseudo_TI50_ID:2.016107E-05
       pseudo_V____ID:2.742873E-05
       pseudo_ZR90_ID:7.880535E-06
       pseudo_ZR91_ID:1.718520E-06
       pseudo_ZR92_ID:2.626878E-06
       pseudo_ZR94_ID:2.662077E-06
       pseudo_ZR96_ID:4.288701E-07
       pseudo_W182_ID:2.014107E-06
       pseudo_W183_ID:1.087650E-06
       pseudo_W184_ID:2.337892E-06
       pseudo_W186_ID:2.160800E-06
       pseudo_CU63_ID:1.520930E-05
       pseudo_CU65_ID:6.778986E-06
       pseudo_CO59_ID:2.370990E-05
       pseudo_CA40_ID:3.379743E-05
       pseudo_CA42_ID:2.255696E-07
       pseudo_CA43_ID:4.706582E-08
       pseudo_CA44_ID:7.272563E-07
       pseudo_CA46_ID:1.394535E-09
       pseudo_CA48_ID:6.519498E-08
       pseudo_NB93_ID:7.519752E-06
       pseudo_N14__ID:4.969370E-05
       pseudo_N15__ID:1.835515E-07
       pseudo_AL27_ID:2.589280E-05
       pseudo_TA181ID:3.861021E-06
       pseudo_B10__ID:5.144462E-06
       pseudo_B11__ID:2.070704E-05;

     ID_LEAD00 6
       pseudo_PB204ID:4.232323E-04
       pseudo_PB206ID:7.285612E-03
       pseudo_PB207ID:6.680995E-03
       pseudo_PB208ID:1.584046E-02;

     ID_WRAPPER00 7
       pseudo_FE54_ID:3.192503E-03
       pseudo_FE56_ID:5.011505E-02
       pseudo_FE57_ID:1.157401E-03
       pseudo_FE58_ID:1.540302E-04
       pseudo_NI58_ID:8.390808E-03
       pseudo_NI60_ID:3.232103E-03
       pseudo_NI61_ID:1.405101E-04
       pseudo_NI62_ID:4.479004E-04
       pseudo_NI64_ID:1.141301E-04
       pseudo_CR50_ID:5.655206E-04
       pseudo_CR52_ID:1.090501E-02
       pseudo_CR53_ID:1.236601E-03
       pseudo_CR54_ID:3.078103E-04
       pseudo_MN55_ID:1.274301E-03
       pseudo_MO92_ID:1.082801E-04
       pseudo_MO94_ID:6.749107E-05
       pseudo_MO95_ID:1.161601E-04
       pseudo_MO96_ID:1.217001E-04
       pseudo_MO97_ID:6.968007E-05
       pseudo_MO98_ID:1.760602E-04
       pseudo_MO100ID:7.026407E-05
       pseudo_SI28_ID:1.302801E-03
       pseudo_SI29_ID:6.615206E-05
       pseudo_SI30_ID:4.360804E-05
       pseudo_C____ID:3.497203E-04
       pseudo_P31__ID:6.780707E-05
       pseudo_S32__ID:2.073002E-05
       pseudo_S33__ID:1.659602E-07
       pseudo_S34__ID:9.367909E-07
       pseudo_S36__ID:4.367304E-09
       pseudo_TI46_ID:3.217603E-05
       pseudo_TI47_ID:2.901703E-05
       pseudo_TI48_ID:2.875203E-04
       pseudo_TI49_ID:2.110002E-05
       pseudo_TI50_ID:2.020302E-05
       pseudo_V____ID:2.748603E-05
       pseudo_ZR90_ID:7.896908E-06
       pseudo_ZR91_ID:1.722102E-06
       pseudo_ZR92_ID:2.632303E-06
       pseudo_ZR94_ID:2.667603E-06
       pseudo_ZR96_ID:4.297604E-07
       pseudo_W182_ID:2.018302E-06
       pseudo_W183_ID:1.089901E-06
       pseudo_W184_ID:2.342702E-06
       pseudo_W186_ID:2.165302E-06
       pseudo_CU63_ID:1.524101E-05
       pseudo_CU65_ID:6.793007E-06
       pseudo_CO59_ID:2.375902E-05
       pseudo_CA40_ID:3.386703E-05
       pseudo_CA42_ID:2.260402E-07
       pseudo_CA43_ID:4.716405E-08
       pseudo_CA44_ID:7.287707E-07
       pseudo_CA46_ID:1.397401E-09
       pseudo_CA48_ID:6.533006E-08
       pseudo_NB93_ID:7.535407E-06
       pseudo_N14__ID:4.979705E-05
       pseudo_N15__ID:1.839302E-07
       pseudo_AL27_ID:2.594703E-05
       pseudo_TA181ID:3.869004E-06
       pseudo_B10__ID:5.155105E-06
       pseudo_B11__ID:2.075002E-05;

     IE_YSZMIX00 8
       pseudo_ZR90_IE:1.110556E-02
       pseudo_ZR91_IE:2.421721E-03
       pseudo_ZR92_IE:3.701685E-03
       pseudo_ZR94_IE:3.751388E-03
       pseudo_ZR96_IE:6.043603E-04
       pseudo_Y89__IE:3.753788E-03
       pseudo_O16__IE:4.880044E-02
       pseudo_HE4__IE:2.388520E-06;

     IE_CLAD00 9
       pseudo_FE54_IE:3.185952E-03
       pseudo_FE56_IE:5.001168E-02
       pseudo_FE57_IE:1.154947E-03
       pseudo_FE58_IE:1.537129E-04
       pseudo_NI58_IE:8.373412E-03
       pseudo_NI60_IE:3.225451E-03
       pseudo_NI61_IE:1.402235E-04
       pseudo_NI62_IE:4.469793E-04
       pseudo_NI64_IE:1.138947E-04
       pseudo_CR50_IE:5.643439E-04
       pseudo_CR52_IE:1.088250E-02
       pseudo_CR53_IE:1.234043E-03
       pseudo_CR54_IE:3.071758E-04
       pseudo_MN55_IE:1.271641E-03
       pseudo_MO92_IE:1.080550E-04
       pseudo_MO94_IE:6.735188E-05
       pseudo_MO95_IE:1.159146E-04
       pseudo_MO96_IE:1.214544E-04
       pseudo_MO97_IE:6.953578E-05
       pseudo_MO98_IE:1.757019E-04
       pseudo_MO100IE:7.011875E-05
       pseudo_SI28_IE:1.300140E-03
       pseudo_SI29_IE:6.601594E-05
       pseudo_SI30_IE:4.351798E-05
       pseudo_C____IE:3.489938E-04
       pseudo_P31__IE:6.766687E-05
       pseudo_S32__IE:2.068704E-05
       pseudo_S33__IE:1.656123E-07
       pseudo_S34__IE:9.348567E-07
       pseudo_S36__IE:4.358298E-09
       pseudo_TI46_IE:3.210951E-05
       pseudo_TI47_IE:2.895766E-05
       pseudo_TI48_IE:2.869267E-04
       pseudo_TI49_IE:2.105602E-05
       pseudo_TI50_IE:2.016107E-05
       pseudo_V____IE:2.742873E-05
       pseudo_ZR90_IE:7.880535E-06
       pseudo_ZR91_IE:1.718520E-06
       pseudo_ZR92_IE:2.626878E-06
       pseudo_ZR94_IE:2.662077E-06
       pseudo_ZR96_IE:4.288701E-07
       pseudo_W182_IE:2.014107E-06
       pseudo_W183_IE:1.087650E-06
       pseudo_W184_IE:2.337892E-06
       pseudo_W186_IE:2.160800E-06
       pseudo_CU63_IE:1.520930E-05
       pseudo_CU65_IE:6.778986E-06
       pseudo_CO59_IE:2.370990E-05
       pseudo_CA40_IE:3.379743E-05
       pseudo_CA42_IE:2.255696E-07
       pseudo_CA43_IE:4.706582E-08
       pseudo_CA44_IE:7.272563E-07
       pseudo_CA46_IE:1.394535E-09
       pseudo_CA48_IE:6.519498E-08
       pseudo_NB93_IE:7.519752E-06
       pseudo_N14__IE:4.969370E-05
       pseudo_N15__IE:1.835515E-07
       pseudo_AL27_IE:2.589280E-05
       pseudo_TA181IE:3.861021E-06
       pseudo_B10__IE:5.144462E-06
       pseudo_B11__IE:2.070704E-05;

     IE_LEAD00 10
       pseudo_PB204IE:4.232323E-04
       pseudo_PB206IE:7.285612E-03
       pseudo_PB207IE:6.680995E-03
       pseudo_PB208IE:1.584046E-02;

     IE_WRAPPER00 11
       pseudo_FE54_IE:3.192503E-03
       pseudo_FE56_IE:5.011505E-02
       pseudo_FE57_IE:1.157401E-03
       pseudo_FE58_IE:1.540302E-04
       pseudo_NI58_IE:8.390808E-03
       pseudo_NI60_IE:3.232103E-03
       pseudo_NI61_IE:1.405101E-04
       pseudo_NI62_IE:4.479004E-04
       pseudo_NI64_IE:1.141301E-04
       pseudo_CR50_IE:5.655206E-04
       pseudo_CR52_IE:1.090501E-02
       pseudo_CR53_IE:1.236601E-03
       pseudo_CR54_IE:3.078103E-04
       pseudo_MN55_IE:1.274301E-03
       pseudo_MO92_IE:1.082801E-04
       pseudo_MO94_IE:6.749107E-05
       pseudo_MO95_IE:1.161601E-04
       pseudo_MO96_IE:1.217001E-04
       pseudo_MO97_IE:6.968007E-05
       pseudo_MO98_IE:1.760602E-04
       pseudo_MO100IE:7.026407E-05
       pseudo_SI28_IE:1.302801E-03
       pseudo_SI29_IE:6.615206E-05
       pseudo_SI30_IE:4.360804E-05
       pseudo_C____IE:3.497203E-04
       pseudo_P31__IE:6.780707E-05
       pseudo_S32__IE:2.073002E-05
       pseudo_S33__IE:1.659602E-07
       pseudo_S34__IE:9.367909E-07
       pseudo_S36__IE:4.367304E-09
       pseudo_TI46_IE:3.217603E-05
       pseudo_TI47_IE:2.901703E-05
       pseudo_TI48_IE:2.875203E-04
       pseudo_TI49_IE:2.110002E-05
       pseudo_TI50_IE:2.020302E-05
       pseudo_V____IE:2.748603E-05
       pseudo_ZR90_IE:7.896908E-06
       pseudo_ZR91_IE:1.722102E-06
       pseudo_ZR92_IE:2.632303E-06
       pseudo_ZR94_IE:2.667603E-06
       pseudo_ZR96_IE:4.297604E-07
       pseudo_W182_IE:2.018302E-06
       pseudo_W183_IE:1.089901E-06
       pseudo_W184_IE:2.342702E-06
       pseudo_W186_IE:2.165302E-06
       pseudo_CU63_IE:1.524101E-05
       pseudo_CU65_IE:6.793007E-06
       pseudo_CO59_IE:2.375902E-05
       pseudo_CA40_IE:3.386703E-05
       pseudo_CA42_IE:2.260402E-07
       pseudo_CA43_IE:4.716405E-08
       pseudo_CA44_IE:7.287707E-07
       pseudo_CA46_IE:1.397401E-09
       pseudo_CA48_IE:6.533006E-08
       pseudo_NB93_IE:7.535407E-06
       pseudo_N14__IE:4.979705E-05
       pseudo_N15__IE:1.839302E-07
       pseudo_AL27_IE:2.594703E-05
       pseudo_TA181IE:3.869004E-06
       pseudo_B10__IE:5.155105E-06
       pseudo_B11__IE:2.075002E-05;

     IF_FUELR100 12
       pseudo_U234_FR1:1.769055E-07
       pseudo_U235_FR1:4.404137E-05
       pseudo_U238_FR1:1.735054E-02
       pseudo_PU238FR1:1.244939E-05
       pseudo_PU239FR1:3.413306E-03
       pseudo_PU240FR1:1.319941E-03
       pseudo_PU241FR1:8.656869E-05
       pseudo_PU242FR1:1.234538E-04
       pseudo_AM241FR1:2.087265E-04
       pseudo_O16__FR1:4.444138E-02;

     IF_CLAD00 13
       pseudo_FE54_FCD:3.185952E-03
       pseudo_FE56_FCD:5.001168E-02
       pseudo_FE57_FCD:1.154947E-03
       pseudo_FE58_FCD:1.537129E-04
       pseudo_NI58_FCD:8.373412E-03
       pseudo_NI60_FCD:3.225451E-03
       pseudo_NI61_FCD:1.402235E-04
       pseudo_NI62_FCD:4.469793E-04
       pseudo_NI64_FCD:1.138947E-04
       pseudo_CR50_FCD:5.643439E-04
       pseudo_CR52_FCD:1.088250E-02
       pseudo_CR53_FCD:1.234043E-03
       pseudo_CR54_FCD:3.071758E-04
       pseudo_MN55_FCD:1.271641E-03
       pseudo_MO92_FCD:1.080550E-04
       pseudo_MO94_FCD:6.735188E-05
       pseudo_MO95_FCD:1.159146E-04
       pseudo_MO96_FCD:1.214544E-04
       pseudo_MO97_FCD:6.953578E-05
       pseudo_MO98_FCD:1.757019E-04
       pseudo_MO100FCD:7.011875E-05
       pseudo_SI28_FCD:1.300140E-03
       pseudo_SI29_FCD:6.601594E-05
       pseudo_SI30_FCD:4.351798E-05
       pseudo_C____FCD:3.489938E-04
       pseudo_P31__FCD:6.766687E-05
       pseudo_S32__FCD:2.068704E-05
       pseudo_S33__FCD:1.656123E-07
       pseudo_S34__FCD:9.348567E-07
       pseudo_S36__FCD:4.358298E-09
       pseudo_TI46_FCD:3.210951E-05
       pseudo_TI47_FCD:2.895766E-05
       pseudo_TI48_FCD:2.869267E-04
       pseudo_TI49_FCD:2.105602E-05
       pseudo_TI50_FCD:2.016107E-05
       pseudo_V____FCD:2.742873E-05
       pseudo_ZR90_FCD:7.880535E-06
       pseudo_ZR91_FCD:1.718520E-06
       pseudo_ZR92_FCD:2.626878E-06
       pseudo_ZR94_FCD:2.662077E-06
       pseudo_ZR96_FCD:4.288701E-07
       pseudo_W182_FCD:2.014107E-06
       pseudo_W183_FCD:1.087650E-06
       pseudo_W184_FCD:2.337892E-06
       pseudo_W186_FCD:2.160800E-06
       pseudo_CU63_FCD:1.520930E-05
       pseudo_CU65_FCD:6.778986E-06
       pseudo_CO59_FCD:2.370990E-05
       pseudo_CA40_FCD:3.379743E-05
       pseudo_CA42_FCD:2.255696E-07
       pseudo_CA43_FCD:4.706582E-08
       pseudo_CA44_FCD:7.272563E-07
       pseudo_CA46_FCD:1.394535E-09
       pseudo_CA48_FCD:6.519498E-08
       pseudo_NB93_FCD:7.519752E-06
       pseudo_N14__FCD:4.969370E-05
       pseudo_N15__FCD:1.835515E-07
       pseudo_AL27_FCD:2.589280E-05
       pseudo_TA181FCD:3.861021E-06
       pseudo_B10__FCD:5.144462E-06
       pseudo_B11__FCD:2.070704E-05;

     IF_FUELR200 14
       pseudo_U234_FR2:1.769055E-07
       pseudo_U235_FR2:4.404137E-05
       pseudo_U238_FR2:1.735054E-02
       pseudo_PU238FR2:1.244939E-05
       pseudo_PU239FR2:3.413306E-03
       pseudo_PU240FR2:1.319941E-03
       pseudo_PU241FR2:8.656869E-05
       pseudo_PU242FR2:1.234538E-04
       pseudo_AM241FR2:2.087265E-04
       pseudo_O16__FR2:4.444138E-02;

     IF_FUELR300 15
       pseudo_U234_FR3:1.769055E-07
       pseudo_U235_FR3:4.404137E-05
       pseudo_U238_FR3:1.735054E-02
       pseudo_PU238FR3:1.244939E-05
       pseudo_PU239FR3:3.413306E-03
       pseudo_PU240FR3:1.319941E-03
       pseudo_PU241FR3:8.656869E-05
       pseudo_PU242FR3:1.234538E-04
       pseudo_AM241FR3:2.087265E-04
       pseudo_O16__FR3:4.444138E-02;

     IF_FUELR400 16
       pseudo_U234_FR4:1.769055E-07
       pseudo_U235_FR4:4.404137E-05
       pseudo_U238_FR4:1.735054E-02
       pseudo_PU238FR4:1.244939E-05
       pseudo_PU239FR4:3.413306E-03
       pseudo_PU240FR4:1.319941E-03
       pseudo_PU241FR4:8.656869E-05
       pseudo_PU242FR4:1.234538E-04
       pseudo_AM241FR4:2.087265E-04
       pseudo_O16__FR4:4.444138E-02;

     IF_FUELR500 17
       pseudo_U234_FR5:1.769055E-07
       pseudo_U235_FR5:4.404137E-05
       pseudo_U238_FR5:1.735054E-02
       pseudo_PU238FR5:1.244939E-05
       pseudo_PU239FR5:3.413306E-03
       pseudo_PU240FR5:1.319941E-03
       pseudo_PU241FR5:8.656869E-05
       pseudo_PU242FR5:1.234538E-04
       pseudo_AM241FR5:2.087265E-04
       pseudo_O16__FR5:4.444138E-02;

     IF_FUELR600 18
       pseudo_U234_FR6:1.769055E-07
       pseudo_U235_FR6:4.404137E-05
       pseudo_U238_FR6:1.735054E-02
       pseudo_PU238FR6:1.244939E-05
       pseudo_PU239FR6:3.413306E-03
       pseudo_PU240FR6:1.319941E-03
       pseudo_PU241FR6:8.656869E-05
       pseudo_PU242FR6:1.234538E-04
       pseudo_AM241FR6:2.087265E-04
       pseudo_O16__FR6:4.444138E-02;

     IF_FUELR700 19
       pseudo_U234_FR7:1.769055E-07
       pseudo_U235_FR7:4.404137E-05
       pseudo_U238_FR7:1.735054E-02
       pseudo_PU238FR7:1.244939E-05
       pseudo_PU239FR7:3.413306E-03
       pseudo_PU240FR7:1.319941E-03
       pseudo_PU241FR7:8.656869E-05
       pseudo_PU242FR7:1.234538E-04
       pseudo_AM241FR7:2.087265E-04
       pseudo_O16__FR7:4.444138E-02;

     IF_HELIUM00 20
       pseudo_HE4__FR1:2.512611E-05;

     IF_LEADCOOL00 21
       pseudo_PB204FCO:4.232323E-04
       pseudo_PB206FCO:7.285612E-03
       pseudo_PB207FCO:6.680995E-03
       pseudo_PB208FCO:1.584046E-02;

     IF_WRAPPER00 22
       pseudo_FE54_FWR:3.192503E-03
       pseudo_FE56_FWR:5.011505E-02
       pseudo_FE57_FWR:1.157401E-03
       pseudo_FE58_FWR:1.540302E-04
       pseudo_NI58_FWR:8.390808E-03
       pseudo_NI60_FWR:3.232103E-03
       pseudo_NI61_FWR:1.405101E-04
       pseudo_NI62_FWR:4.479004E-04
       pseudo_NI64_FWR:1.141301E-04
       pseudo_CR50_FWR:5.655206E-04
       pseudo_CR52_FWR:1.090501E-02
       pseudo_CR53_FWR:1.236601E-03
       pseudo_CR54_FWR:3.078103E-04
       pseudo_MN55_FWR:1.274301E-03
       pseudo_MO92_FWR:1.082801E-04
       pseudo_MO94_FWR:6.749107E-05
       pseudo_MO95_FWR:1.161601E-04
       pseudo_MO96_FWR:1.217001E-04
       pseudo_MO97_FWR:6.968007E-05
       pseudo_MO98_FWR:1.760602E-04
       pseudo_MO100FWR:7.026407E-05
       pseudo_SI28_FWR:1.302801E-03
       pseudo_SI29_FWR:6.615206E-05
       pseudo_SI30_FWR:4.360804E-05
       pseudo_C____FWR:3.497203E-04
       pseudo_P31__FWR:6.780707E-05
       pseudo_S32__FWR:2.073002E-05
       pseudo_S33__FWR:1.659602E-07
       pseudo_S34__FWR:9.367909E-07
       pseudo_S36__FWR:4.367304E-09
       pseudo_TI46_FWR:3.217603E-05
       pseudo_TI47_FWR:2.901703E-05
       pseudo_TI48_FWR:2.875203E-04
       pseudo_TI49_FWR:2.110002E-05
       pseudo_TI50_FWR:2.020302E-05
       pseudo_V____FWR:2.748603E-05
       pseudo_ZR90_FWR:7.896908E-06
       pseudo_ZR91_FWR:1.722102E-06
       pseudo_ZR92_FWR:2.632303E-06
       pseudo_ZR94_FWR:2.667603E-06
       pseudo_ZR96_FWR:4.297604E-07
       pseudo_W182_FWR:2.018302E-06
       pseudo_W183_FWR:1.089901E-06
       pseudo_W184_FWR:2.342702E-06
       pseudo_W186_FWR:2.165302E-06
       pseudo_CU63_FWR:1.524101E-05
       pseudo_CU65_FWR:6.793007E-06
       pseudo_CO59_FWR:2.375902E-05
       pseudo_CA40_FWR:3.386703E-05
       pseudo_CA42_FWR:2.260402E-07
       pseudo_CA43_FWR:4.716405E-08
       pseudo_CA44_FWR:7.287707E-07
       pseudo_CA46_FWR:1.397401E-09
       pseudo_CA48_FWR:6.533006E-08
       pseudo_NB93_FWR:7.535407E-06
       pseudo_N14__FWR:4.979705E-05
       pseudo_N15__FWR:1.839302E-07
       pseudo_AL27_FWR:2.594703E-05
       pseudo_TA181FWR:3.869004E-06
       pseudo_B10__FWR:5.155105E-06
       pseudo_B11__FWR:2.075002E-05;

     IF_LEADGAP00 23
       pseudo_PB204FGP:4.232323E-04
       pseudo_PB206FGP:7.285612E-03
       pseudo_PB207FGP:6.680995E-03
       pseudo_PB208FGP:1.584046E-02;

     IG_YSZMIX00 24
       pseudo_ZR90_IG:1.110556E-02
       pseudo_ZR91_IG:2.421721E-03
       pseudo_ZR92_IG:3.701685E-03
       pseudo_ZR94_IG:3.751388E-03
       pseudo_ZR96_IG:6.043603E-04
       pseudo_Y89__IG:3.753788E-03
       pseudo_O16__IG:4.880044E-02
       pseudo_HE4__IG:2.388520E-06;

     IG_CLAD00 25
       pseudo_FE54_IG:3.185952E-03
       pseudo_FE56_IG:5.001168E-02
       pseudo_FE57_IG:1.154947E-03
       pseudo_FE58_IG:1.537129E-04
       pseudo_NI58_IG:8.373412E-03
       pseudo_NI60_IG:3.225451E-03
       pseudo_NI61_IG:1.402235E-04
       pseudo_NI62_IG:4.469793E-04
       pseudo_NI64_IG:1.138947E-04
       pseudo_CR50_IG:5.643439E-04
       pseudo_CR52_IG:1.088250E-02
       pseudo_CR53_IG:1.234043E-03
       pseudo_CR54_IG:3.071758E-04
       pseudo_MN55_IG:1.271641E-03
       pseudo_MO92_IG:1.080550E-04
       pseudo_MO94_IG:6.735188E-05
       pseudo_MO95_IG:1.159146E-04
       pseudo_MO96_IG:1.214544E-04
       pseudo_MO97_IG:6.953578E-05
       pseudo_MO98_IG:1.757019E-04
       pseudo_MO100IG:7.011875E-05
       pseudo_SI28_IG:1.300140E-03
       pseudo_SI29_IG:6.601594E-05
       pseudo_SI30_IG:4.351798E-05
       pseudo_C____IG:3.489938E-04
       pseudo_P31__IG:6.766687E-05
       pseudo_S32__IG:2.068704E-05
       pseudo_S33__IG:1.656123E-07
       pseudo_S34__IG:9.348567E-07
       pseudo_S36__IG:4.358298E-09
       pseudo_TI46_IG:3.210951E-05
       pseudo_TI47_IG:2.895766E-05
       pseudo_TI48_IG:2.869267E-04
       pseudo_TI49_IG:2.105602E-05
       pseudo_TI50_IG:2.016107E-05
       pseudo_V____IG:2.742873E-05
       pseudo_ZR90_IG:7.880535E-06
       pseudo_ZR91_IG:1.718520E-06
       pseudo_ZR92_IG:2.626878E-06
       pseudo_ZR94_IG:2.662077E-06
       pseudo_ZR96_IG:4.288701E-07
       pseudo_W182_IG:2.014107E-06
       pseudo_W183_IG:1.087650E-06
       pseudo_W184_IG:2.337892E-06
       pseudo_W186_IG:2.160800E-06
       pseudo_CU63_IG:1.520930E-05
       pseudo_CU65_IG:6.778986E-06
       pseudo_CO59_IG:2.370990E-05
       pseudo_CA40_IG:3.379743E-05
       pseudo_CA42_IG:2.255696E-07
       pseudo_CA43_IG:4.706582E-08
       pseudo_CA44_IG:7.272563E-07
       pseudo_CA46_IG:1.394535E-09
       pseudo_CA48_IG:6.519498E-08
       pseudo_NB93_IG:7.519752E-06
       pseudo_N14__IG:4.969370E-05
       pseudo_N15__IG:1.835515E-07
       pseudo_AL27_IG:2.589280E-05
       pseudo_TA181IG:3.861021E-06
       pseudo_B10__IG:5.144462E-06
       pseudo_B11__IG:2.070704E-05;

     IG_LEAD00 26
       pseudo_PB204IG:4.232323E-04
       pseudo_PB206IG:7.285612E-03
       pseudo_PB207IG:6.680995E-03
       pseudo_PB208IG:1.584046E-02;

     IG_WRAPPER00 27
       pseudo_FE54_IG:3.192503E-03
       pseudo_FE56_IG:5.011505E-02
       pseudo_FE57_IG:1.157401E-03
       pseudo_FE58_IG:1.540302E-04
       pseudo_NI58_IG:8.390808E-03
       pseudo_NI60_IG:3.232103E-03
       pseudo_NI61_IG:1.405101E-04
       pseudo_NI62_IG:4.479004E-04
       pseudo_NI64_IG:1.141301E-04
       pseudo_CR50_IG:5.655206E-04
       pseudo_CR52_IG:1.090501E-02
       pseudo_CR53_IG:1.236601E-03
       pseudo_CR54_IG:3.078103E-04
       pseudo_MN55_IG:1.274301E-03
       pseudo_MO92_IG:1.082801E-04
       pseudo_MO94_IG:6.749107E-05
       pseudo_MO95_IG:1.161601E-04
       pseudo_MO96_IG:1.217001E-04
       pseudo_MO97_IG:6.968007E-05
       pseudo_MO98_IG:1.760602E-04
       pseudo_MO100IG:7.026407E-05
       pseudo_SI28_IG:1.302801E-03
       pseudo_SI29_IG:6.615206E-05
       pseudo_SI30_IG:4.360804E-05
       pseudo_C____IG:3.497203E-04
       pseudo_P31__IG:6.780707E-05
       pseudo_S32__IG:2.073002E-05
       pseudo_S33__IG:1.659602E-07
       pseudo_S34__IG:9.367909E-07
       pseudo_S36__IG:4.367304E-09
       pseudo_TI46_IG:3.217603E-05
       pseudo_TI47_IG:2.901703E-05
       pseudo_TI48_IG:2.875203E-04
       pseudo_TI49_IG:2.110002E-05
       pseudo_TI50_IG:2.020302E-05
       pseudo_V____IG:2.748603E-05
       pseudo_ZR90_IG:7.896908E-06
       pseudo_ZR91_IG:1.722102E-06
       pseudo_ZR92_IG:2.632303E-06
       pseudo_ZR94_IG:2.667603E-06
       pseudo_ZR96_IG:4.297604E-07
       pseudo_W182_IG:2.018302E-06
       pseudo_W183_IG:1.089901E-06
       pseudo_W184_IG:2.342702E-06
       pseudo_W186_IG:2.165302E-06
       pseudo_CU63_IG:1.524101E-05
       pseudo_CU65_IG:6.793007E-06
       pseudo_CO59_IG:2.375902E-05
       pseudo_CA40_IG:3.386703E-05
       pseudo_CA42_IG:2.260402E-07
       pseudo_CA43_IG:4.716405E-08
       pseudo_CA44_IG:7.287707E-07
       pseudo_CA46_IG:1.397401E-09
       pseudo_CA48_IG:6.533006E-08
       pseudo_NB93_IG:7.535407E-06
       pseudo_N14__IG:4.979705E-05
       pseudo_N15__IG:1.839302E-07
       pseudo_AL27_IG:2.594703E-05
       pseudo_TA181IG:3.869004E-06
       pseudo_B10__IG:5.155105E-06
       pseudo_B11__IG:2.075002E-05;

     IH_SPRINGMIX00 28
       pseudo_FE54_IH:3.504949E-04
       pseudo_FE56_IH:5.501991E-03
       pseudo_FE57_IH:1.270690E-04
       pseudo_FE58_IH:1.691020E-05
       pseudo_NI58_IH:9.211855E-04
       pseudo_NI60_IH:3.548352E-04
       pseudo_NI61_IH:1.542610E-05
       pseudo_NI62_IH:4.917349E-05
       pseudo_NI64_IH:1.252989E-05
       pseudo_CR50_IH:6.208541E-05
       pseudo_CR52_IH:1.197285E-03
       pseudo_CR53_IH:1.357596E-04
       pseudo_CR54_IH:3.379340E-05
       pseudo_MN55_IH:1.398999E-04
       pseudo_MO92_IH:1.188684E-05
       pseudo_MO94_IH:7.409526E-06
       pseudo_MO95_IH:1.275291E-05
       pseudo_MO96_IH:1.336095E-05
       pseudo_MO97_IH:7.649844E-06
       pseudo_MO98_IH:1.932937E-05
       pseudo_MO100IH:7.713948E-06
       pseudo_SI28_IH:1.430302E-04
       pseudo_SI29_IH:7.262616E-06
       pseudo_SI30_IH:4.787540E-06
       pseudo_C____IH:3.839473E-05
       pseudo_P31__IH:7.444329E-06
       pseudo_S32__IH:2.275762E-06
       pseudo_S33__IH:1.822029E-08
       pseudo_S34__IH:1.028473E-07
       pseudo_S36__IH:4.794741E-10
       pseudo_TI46_IH:3.532451E-06
       pseudo_TI47_IH:3.185626E-06
       pseudo_TI48_IH:3.156524E-05
       pseudo_TI49_IH:2.316465E-06
       pseudo_TI50_IH:2.217958E-06
       pseudo_V____IH:3.017514E-06
       pseudo_ZR90_IH:8.669616E-07
       pseudo_ZR91_IH:1.890634E-07
       pseudo_ZR92_IH:2.889905E-07
       pseudo_ZR94_IH:2.928608E-07
       pseudo_ZR96_IH:4.718135E-08
       pseudo_W182_IH:2.215757E-07
       pseudo_W183_IH:1.196485E-07
       pseudo_W184_IH:2.571983E-07
       pseudo_W186_IH:2.377169E-07
       pseudo_CU63_IH:1.673219E-06
       pseudo_CU65_IH:7.457830E-07
       pseudo_CO59_IH:2.608385E-06
       pseudo_CA40_IH:3.718164E-06
       pseudo_CA42_IH:2.481576E-08
       pseudo_CA43_IH:5.177868E-09
       pseudo_CA44_IH:8.000768E-08
       pseudo_CA46_IH:1.534209E-10
       pseudo_CA48_IH:7.172310E-09
       pseudo_NB93_IH:8.272788E-07
       pseudo_N14__IH:5.466988E-06
       pseudo_N15__IH:2.019243E-08
       pseudo_AL27_IH:2.848602E-06
       pseudo_TA181IH:4.247602E-07
       pseudo_B10__IH:5.659602E-07
       pseudo_B11__IH:2.278062E-06
       pseudo_HE4__IH:2.228358E-05;

     IH_CLAD00 29
       pseudo_FE54_IH:3.185952E-03
       pseudo_FE56_IH:5.001168E-02
       pseudo_FE57_IH:1.154947E-03
       pseudo_FE58_IH:1.537129E-04
       pseudo_NI58_IH:8.373412E-03
       pseudo_NI60_IH:3.225451E-03
       pseudo_NI61_IH:1.402235E-04
       pseudo_NI62_IH:4.469793E-04
       pseudo_NI64_IH:1.138947E-04
       pseudo_CR50_IH:5.643439E-04
       pseudo_CR52_IH:1.088250E-02
       pseudo_CR53_IH:1.234043E-03
       pseudo_CR54_IH:3.071758E-04
       pseudo_MN55_IH:1.271641E-03
       pseudo_MO92_IH:1.080550E-04
       pseudo_MO94_IH:6.735188E-05
       pseudo_MO95_IH:1.159146E-04
       pseudo_MO96_IH:1.214544E-04
       pseudo_MO97_IH:6.953578E-05
       pseudo_MO98_IH:1.757019E-04
       pseudo_MO100IH:7.011875E-05
       pseudo_SI28_IH:1.300140E-03
       pseudo_SI29_IH:6.601594E-05
       pseudo_SI30_IH:4.351798E-05
       pseudo_C____IH:3.489938E-04
       pseudo_P31__IH:6.766687E-05
       pseudo_S32__IH:2.068704E-05
       pseudo_S33__IH:1.656123E-07
       pseudo_S34__IH:9.348567E-07
       pseudo_S36__IH:4.358298E-09
       pseudo_TI46_IH:3.210951E-05
       pseudo_TI47_IH:2.895766E-05
       pseudo_TI48_IH:2.869267E-04
       pseudo_TI49_IH:2.105602E-05
       pseudo_TI50_IH:2.016107E-05
       pseudo_V____IH:2.742873E-05
       pseudo_ZR90_IH:7.880535E-06
       pseudo_ZR91_IH:1.718520E-06
       pseudo_ZR92_IH:2.626878E-06
       pseudo_ZR94_IH:2.662077E-06
       pseudo_ZR96_IH:4.288701E-07
       pseudo_W182_IH:2.014107E-06
       pseudo_W183_IH:1.087650E-06
       pseudo_W184_IH:2.337892E-06
       pseudo_W186_IH:2.160800E-06
       pseudo_CU63_IH:1.520930E-05
       pseudo_CU65_IH:6.778986E-06
       pseudo_CO59_IH:2.370990E-05
       pseudo_CA40_IH:3.379743E-05
       pseudo_CA42_IH:2.255696E-07
       pseudo_CA43_IH:4.706582E-08
       pseudo_CA44_IH:7.272563E-07
       pseudo_CA46_IH:1.394535E-09
       pseudo_CA48_IH:6.519498E-08
       pseudo_NB93_IH:7.519752E-06
       pseudo_N14__IH:4.969370E-05
       pseudo_N15__IH:1.835515E-07
       pseudo_AL27_IH:2.589280E-05
       pseudo_TA181IH:3.861021E-06
       pseudo_B10__IH:5.144462E-06
       pseudo_B11__IH:2.070704E-05;

     IH_LEAD00 30
       pseudo_PB204IH:4.232323E-04
       pseudo_PB206IH:7.285612E-03
       pseudo_PB207IH:6.680995E-03
       pseudo_PB208IH:1.584046E-02;

     IH_WRAPPER00 31
       pseudo_FE54_IH:3.192503E-03
       pseudo_FE56_IH:5.011505E-02
       pseudo_FE57_IH:1.157401E-03
       pseudo_FE58_IH:1.540302E-04
       pseudo_NI58_IH:8.390808E-03
       pseudo_NI60_IH:3.232103E-03
       pseudo_NI61_IH:1.405101E-04
       pseudo_NI62_IH:4.479004E-04
       pseudo_NI64_IH:1.141301E-04
       pseudo_CR50_IH:5.655206E-04
       pseudo_CR52_IH:1.090501E-02
       pseudo_CR53_IH:1.236601E-03
       pseudo_CR54_IH:3.078103E-04
       pseudo_MN55_IH:1.274301E-03
       pseudo_MO92_IH:1.082801E-04
       pseudo_MO94_IH:6.749107E-05
       pseudo_MO95_IH:1.161601E-04
       pseudo_MO96_IH:1.217001E-04
       pseudo_MO97_IH:6.968007E-05
       pseudo_MO98_IH:1.760602E-04
       pseudo_MO100IH:7.026407E-05
       pseudo_SI28_IH:1.302801E-03
       pseudo_SI29_IH:6.615206E-05
       pseudo_SI30_IH:4.360804E-05
       pseudo_C____IH:3.497203E-04
       pseudo_P31__IH:6.780707E-05
       pseudo_S32__IH:2.073002E-05
       pseudo_S33__IH:1.659602E-07
       pseudo_S34__IH:9.367909E-07
       pseudo_S36__IH:4.367304E-09
       pseudo_TI46_IH:3.217603E-05
       pseudo_TI47_IH:2.901703E-05
       pseudo_TI48_IH:2.875203E-04
       pseudo_TI49_IH:2.110002E-05
       pseudo_TI50_IH:2.020302E-05
       pseudo_V____IH:2.748603E-05
       pseudo_ZR90_IH:7.896908E-06
       pseudo_ZR91_IH:1.722102E-06
       pseudo_ZR92_IH:2.632303E-06
       pseudo_ZR94_IH:2.667603E-06
       pseudo_ZR96_IH:4.297604E-07
       pseudo_W182_IH:2.018302E-06
       pseudo_W183_IH:1.089901E-06
       pseudo_W184_IH:2.342702E-06
       pseudo_W186_IH:2.165302E-06
       pseudo_CU63_IH:1.524101E-05
       pseudo_CU65_IH:6.793007E-06
       pseudo_CO59_IH:2.375902E-05
       pseudo_CA40_IH:3.386703E-05
       pseudo_CA42_IH:2.260402E-07
       pseudo_CA43_IH:4.716405E-08
       pseudo_CA44_IH:7.287707E-07
       pseudo_CA46_IH:1.397401E-09
       pseudo_CA48_IH:6.533006E-08
       pseudo_NB93_IH:7.535407E-06
       pseudo_N14__IH:4.979705E-05
       pseudo_N15__IH:1.839302E-07
       pseudo_AL27_IH:2.594703E-05
       pseudo_TA181IH:3.869004E-06
       pseudo_B10__IH:5.155105E-06
       pseudo_B11__IH:2.075002E-05;

     HOM_II00 32
       pseudo_FE54_II:1.251752E-03
       pseudo_FE56_II:1.964981E-02
       pseudo_FE57_II:4.537988E-04
       pseudo_FE58_II:6.039250E-05
       pseudo_NI58_II:3.289936E-03
       pseudo_NI60_II:1.267252E-03
       pseudo_NI61_II:5.509228E-05
       pseudo_NI62_II:1.756173E-04
       pseudo_NI64_II:4.474985E-05
       pseudo_CR50_II:2.217292E-04
       pseudo_CR52_II:4.275877E-03
       pseudo_CR53_II:4.848501E-04
       pseudo_CR54_II:1.206850E-04
       pseudo_MN55_II:4.996407E-04
       pseudo_MO92_II:4.245476E-05
       pseudo_MO94_II:2.646209E-05
       pseudo_MO95_II:4.554388E-05
       pseudo_MO96_II:4.771797E-05
       pseudo_MO97_II:2.732113E-05
       pseudo_MO98_II:6.903086E-05
       pseudo_MO100II:2.754914E-05
       pseudo_SI28_II:5.108111E-04
       pseudo_SI29_II:2.593807E-05
       pseudo_SI30_II:1.709871E-05
       pseudo_C____II:1.371257E-04
       pseudo_P31__II:2.658610E-05
       pseudo_S32__II:8.127836E-06
       pseudo_S33__II:6.507069E-08
       pseudo_S34__II:3.673052E-07
       pseudo_S36__II:1.712371E-09
       pseudo_TI46_II:1.261552E-05
       pseudo_TI47_II:1.137747E-05
       pseudo_TI48_II:1.127347E-04
       pseudo_TI49_II:8.273042E-06
       pseudo_TI50_II:7.921328E-06
       pseudo_V____II:1.077645E-05
       pseudo_ZR90_II:3.096328E-06
       pseudo_ZR91_II:6.752279E-07
       pseudo_ZR92_II:1.032143E-06
       pseudo_ZR94_II:1.045943E-06
       pseudo_ZR96_II:1.685070E-07
       pseudo_W182_II:7.913527E-07
       pseudo_W183_II:4.273277E-07
       pseudo_W184_II:9.185680E-07
       pseudo_W186_II:8.489851E-07
       pseudo_CU63_II:5.975747E-06
       pseudo_CU65_II:2.663510E-06
       pseudo_CO59_II:9.315485E-06
       pseudo_CA40_II:1.327855E-05
       pseudo_CA42_II:8.862667E-08
       pseudo_CA43_II:1.849277E-08
       pseudo_CA44_II:2.857418E-07
       pseudo_CA46_II:5.479227E-10
       pseudo_CA48_II:2.561506E-08
       pseudo_NB93_II:2.954522E-06
       pseudo_N14__II:1.952481E-05
       pseudo_N15__II:7.211698E-08
       pseudo_AL27_II:1.017342E-05
       pseudo_TA181II:1.516963E-06
       pseudo_B10__II:2.021284E-06
       pseudo_B11__II:8.135837E-06
       pseudo_PB204II:2.570306E-04
       pseudo_PB206II:4.424583E-03
       pseudo_PB207II:4.057368E-03
       pseudo_PB208II:9.620298E-03;

     HOM_IJ00 33
       pseudo_FE54_IJ:7.604462E-04
       pseudo_FE56_IJ:1.193694E-02
       pseudo_FE57_IJ:2.756886E-04
       pseudo_FE58_IJ:3.668882E-05
       pseudo_NI58_IJ:1.998690E-03
       pseudo_NI60_IJ:7.698761E-04
       pseudo_NI61_IJ:3.346883E-05
       pseudo_NI62_IJ:1.066895E-04
       pseudo_NI64_IJ:2.718586E-05
       pseudo_CR50_IJ:1.347093E-04
       pseudo_CR52_IJ:2.597687E-03
       pseudo_CR53_IJ:2.945585E-04
       pseudo_CR54_IJ:7.332063E-05
       pseudo_MN55_IJ:3.035385E-04
       pseudo_MO92_IJ:2.579187E-05
       pseudo_MO94_IJ:1.607592E-05
       pseudo_MO95_IJ:2.766886E-05
       pseudo_MO96_IJ:2.898985E-05
       pseudo_MO97_IJ:1.659792E-05
       pseudo_MO98_IJ:4.193779E-05
       pseudo_MO100IJ:1.673692E-05
       pseudo_SI28_IJ:3.103184E-04
       pseudo_SI29_IJ:1.575692E-05
       pseudo_SI30_IJ:1.038695E-05
       pseudo_C____IJ:8.330258E-05
       pseudo_P31__IJ:1.615192E-05
       pseudo_S32__IJ:4.937775E-06
       pseudo_S33__IJ:3.953080E-08
       pseudo_S34__IJ:2.231389E-07
       pseudo_S36__IJ:1.040295E-09
       pseudo_TI46_IJ:7.664362E-06
       pseudo_TI47_IJ:6.911865E-06
       pseudo_TI48_IJ:6.848666E-05
       pseudo_TI49_IJ:5.025975E-06
       pseudo_TI50_IJ:4.812276E-06
       pseudo_V____IJ:6.547067E-06
       pseudo_ZR90_IJ:1.880991E-06
       pseudo_ZR91_IJ:4.102079E-07
       pseudo_ZR92_IJ:6.270069E-07
       pseudo_ZR94_IJ:6.354168E-07
       pseudo_ZR96_IJ:1.023695E-07
       pseudo_W182_IJ:4.807576E-07
       pseudo_W183_IJ:2.596087E-07
       pseudo_W184_IJ:5.580372E-07
       pseudo_W186_IJ:5.157674E-07
       pseudo_CU63_IJ:3.630382E-06
       pseudo_CU65_IJ:1.618092E-06
       pseudo_CO59_IJ:5.659272E-06
       pseudo_CA40_IJ:8.067160E-06
       pseudo_CA42_IJ:5.384173E-08
       pseudo_CA43_IJ:1.123394E-08
       pseudo_CA44_IJ:1.735891E-07
       pseudo_CA46_IJ:3.328683E-10
       pseudo_CA48_IJ:1.556192E-08
       pseudo_NB93_IJ:1.794891E-06
       pseudo_N14__IJ:1.186194E-05
       pseudo_N15__IJ:4.381178E-08
       pseudo_AL27_IJ:6.180469E-06
       pseudo_TA181IJ:9.215854E-07
       pseudo_B10__IJ:1.227894E-06
       pseudo_B11__IJ:4.942575E-06
       pseudo_PB204IJ:3.224084E-04
       pseudo_PB206IJ:5.549972E-03
       pseudo_PB207IJ:5.089375E-03
       pseudo_PB208IJ:1.206694E-02
    '
  []
[]

Advanced Meshing Tools

ParsedCurveGenerator

The ParsedCurveGenerator object generates a 3D curve mesh composed of EDGE2 elements which connect the series of points given by , , . This is useful when the user wants to construct a non-standard boundary and mesh inside of it.

[Mesh]
  [pcg]
    type = ParsedCurveGenerator
    x_formula = 'cos(t)'
    y_formula = 'sin(t)'
    z_formula = 't'
    section_bounding_t_values = '0 ${fparse 4*pi}'
    nums_segments = 24
  []
[]

FillBetweenCurvesGenerator, FillBetweenPointVectorsGenerator, and FillBetweenSidesetsGenerator

Several mesh generators are available to the user to generate a "transition layer" between two curves using linear triangle elements (TRI3). Behind the scenes, these mesh generators use MOOSE's FillBetweenPointVectorsTools capability to generate a "transition layer" between two given curves (in the form of two vectors of points).

FillBetweenCurvesGenerator

The FillBetweenCurvesGenerator object is designed to generate a transition layer to connect two boundaries of two input meshes. The user provides two 1D meshes (curves) which should be connected to each other with transition layers.

FillBetweenSidesetsGenerator

The FillBetweenSidesetsGenerator object is designed to generate a transition layer to connect two boundaries of two input meshes. The user provides two 2D input meshes with sidesets. These sidesets specify which boundaries of each mesh should be connected to the other mesh with a transitional layer.

FillBetweenPointVectorsGenerator

This FillBetweenPointVectorsGenerator object generates a transition layer between two point vectors with different numbers of nodes. The user should provide two vectors of points as well as the number of layers of elements to create between the two vectors.

XYDelaunayGenerator

XYDelaunayGenerator creates an unstructured mesh consisting of TRI3 elements based on a given external boundary and, optionally, a series of internal hole meshes.

XYDelaunayGenerator is extremely powerful when combined with ParsedCurveGenerator and other Reactor module objects already described, as it can mesh very irregularly shaped regions.

[Mesh]
  [outer_bdy]
    type = PolyLineMeshGenerator
    points = '-1.0 0.0 0.0
              0.0 -1.0 0.0
              1.0 0.0 0.0
              0.0 2.0 0.0'
    loop = true
  []
  [hole_1]
    type = PolyLineMeshGenerator
    points = '-0.5 -0.1 0.0
              -0.3 -0.1 0.0
              -0.3 0.1 0.0
              -0.5 0.1 0.0'
    loop = true
  []
  [hole_2]
    type = PolyLineMeshGenerator
    points = '0.3 -0.1 0.0
              0.5 -0.1 0.0
              0.5 0.1 0.0
              0.3 0.1 0.0'
    loop = true
  []
  [triang]
    type = XYDelaunayGenerator
    boundary = 'outer_bdy'
    holes = 'hole_1
             hole_2'
    add_nodes_per_boundary_segment = 3
    refine_boundary = false
    desired_area = 0.05
  []
[]

Advanced Meshing Examples

Possible Advanced Reactor Geometries

This tutorial covers the generation of mostly standard geometries, but many reactor designs involve features which were not covered previously. Using the tools covered in this section, MOOSE can generate quite complex geometries illustrated here. The key mesh generators required are listed briefly.

Molten Salt Reactor Experiment (MSRE) 2D lattice

KRUSTY heat-pipe cooled microreactor 2D core

Modular High Temperature Gas Cooled Reactor (MHTGR)

2D Pebble Bed Reactor with Streamlines

Boundary Layers and Biasing

During the mesh refinement process, it is common to require finer discretizations in one region and coarser discretizations in another region. The boundary layer and biasing features available in the Reactor Module allow the user to refine the mesh in areas of interest for the physics problem at hand.

Mesh Biasing

Mesh biasing applies non-uniform meshing subintervals within a specific region. For example, a fuel pin may generally require an axial meshing size of 5 cm, but at the very top and bottom of the active fuel zone where the power shape has a larger gradient, the user may require finer grids. This is possible using mesh biasing parameters available in AdvancedExtruderGenerator.

[Mesh]
  [gmg]
    type = GeneratedMeshGenerator
    dim = 2
    nx = 6
    ny = 6
    nz = 0
    zmin = 0
    zmax = 0
    elem_type = QUAD4
  []

  [extrude]
    type = AdvancedExtruderGenerator
    input = gmg
    heights = '2 1 2'
    num_layers = '5 3 5'
    biases = '1.6 1.0 0.625'
    direction = '0 0 1'
    bottom_sideset = '4'
    top_sideset = '5'
    subdomain_swaps = '0 1;
                         0 2;
                         0 3'
  []
[]

Radial Mesh Biasing

Similarly, the user may want to radially bias the mesh where solution gradients are known to be high, for example at the edge of a fuel pin or control rod. This is possible using mesh biasing parameters in PolygonConcentricCircleMeshGenerator as well as PeripheralRingMeshGenerator.

[Mesh]
  [hex_1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '4 4 4 4 4 4'
    background_intervals = 4
    ring_radii = '2.0 4.0'
    ring_intervals = '5 5'
    ring_block_ids = '10 11 15'
    ring_block_names = 'center_tri center mid'
    background_block_ids = 20
    background_block_names = background
    polygon_size = 5.0
    preserve_volumes = on
    ring_radial_biases = '1.0 1.6'
    background_radial_bias = 0.625
  []
[]

Radial Mesh Biasing in Core Periphery

[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
    background_radial_bias = 0.625
  []
  [peripheral_ring]
    type = PeripheralRingMeshGenerator
    input = hex_1
    peripheral_ring_block_id = 200
    peripheral_layer_num = 5
    input_mesh_external_boundary = 10000
    peripheral_ring_radius = 8
    peripheral_radial_bias = 0.625
  []
[]

Mesh Boundary Layers

Boundary layers are commonly needed in thermal-hydraulic applications, where the thickness of the mesh near a wall must be a certain size, uniformly, regardless of the width of the meshed region. Boundary layers are possible using PolygonConcentricCircleMeshGenerator and PeripheralRingMeshGenerator.

[Mesh]
  [hex_1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '4 4 4 4 4 4'
    background_intervals = 2
    ring_radii = '2.0 4.0'
    ring_intervals = '2 2'
    ring_block_ids = '10 11 15'
    ring_block_names = 'center_tri center mid'
    background_block_ids = 20
    background_block_names = background
    polygon_size = 5.0
    preserve_volumes = on
    ## Background boundary layer setting
    background_inner_boundary_layer_bias = 1.6
    background_inner_boundary_layer_intervals = 3
    background_inner_boundary_layer_width = 0.4
    ## Ring boundary layer setting
    ring_outer_boundary_layer_biases = '1.0 0.625'
    ring_outer_boundary_layer_intervals = '0 3'
    ring_outer_boundary_layer_widths = '0.0 0.5'
  []
[]

Stitching Assemblies with Different Pin Numbers

Typical reactor cores are comprised of many different assembly types, each with different numbers of pins. It is difficult to find a reasonably low azimuthal discretization for each assembly such that all assemblies have the same number of nodes on their boundaries.

The best approach for this situation is to use PatternedHexPeripheralModifier to strip the outermost layer off each assembly and replace it with a transition layer with a set number of nodes on the outermost boundary.

[Mesh]
  [hex_1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '2 2 2 2 2 2'
    background_intervals = 1
    ring_radii = 4.0
    ring_intervals = 1
    ring_block_ids = '10'
    ring_block_names = 'center_1'
    background_block_ids = 20
    background_block_names = background_1
    polygon_size = 5.0
    preserve_volumes = on
    quad_center_elements = true
  []
  [pattern_1]
    type = PatternedHexMeshGenerator
    inputs = 'hex_1'
    pattern = '0 0;
              0 0 0;
               0 0'
    background_intervals = 1
    hexagon_size = 17
    #duct_sizes = '15 15.5'
    #duct_intervals = '1 2'
  []
  [pmg_1]
    type = PatternedHexPeripheralModifier
    input = pattern_1
    input_mesh_external_boundary = 10000
    new_num_sector = ${new_num_sector}
    num_layers = ${num_layer}
  []
  [hex_2]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '2 2 2 2 2 2'
    background_intervals = 1
    ring_radii = 2.5
    ring_intervals = 1
    ring_block_ids = '30'
    ring_block_names = 'center_2'
    background_block_ids = 40
    background_block_names = background_2
    polygon_size = 3.0
    preserve_volumes = on
    quad_center_elements = true
  []
  [pattern_2]
    type = PatternedHexMeshGenerator
    inputs = 'hex_2'
    pattern = '0 0 0;
              0 0 0 0;
             0 0 0 0 0;
              0 0 0 0;
               0 0 0'
    background_intervals = 1
    hexagon_size = 17
    #duct_sizes = '15 15.5'
    #duct_intervals = '1 2'
  []
  [pmg_2]
    type = PatternedHexPeripheralModifier
    input = pattern_2
    input_mesh_external_boundary = 10000
    new_num_sector = ${new_num_sector}
    num_layers = ${num_layer}
  []
  [hex_3]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '2 2 2 2 2 2'
    background_intervals = 1
    ring_radii = 1.5
    ring_intervals = 1
    ring_block_ids = '50'
    ring_block_names = 'center_3'
    background_block_ids = 60
    background_block_names = background_3
    polygon_size = 2.3
    preserve_volumes = on
    quad_center_elements = true
  []
  [pattern_3]
    type = PatternedHexMeshGenerator
    inputs = 'hex_3'
    pattern = '0 0 0 0;
              0 0 0 0 0;
             0 0 0 0 0 0;
            0 0 0 0 0 0 0;
             0 0 0 0 0 0;
              0 0 0 0 0;
               0 0 0 0'
    background_intervals = 1
    hexagon_size = 17
    #duct_sizes = '15 15.5'
    #duct_intervals = '1 2'
  []
  [pmg_3]
    type = PatternedHexPeripheralModifier
    input = pattern_3
    input_mesh_external_boundary = 10000
    new_num_sector = ${new_num_sector}
    num_layers = ${num_layer}
  []
  [hex_4]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '2 2 2 2 2 2'
    background_intervals = 1
    ring_radii = 1.4
    ring_intervals = 1
    ring_block_ids = '70'
    ring_block_names = 'center_4'
    background_block_ids = 80
    background_block_names = background_4
    polygon_size = 1.8
    preserve_volumes = on
    quad_center_elements = true
  []
  [pattern_4]
    type = PatternedHexMeshGenerator
    inputs = 'hex_4'
    pattern = '0 0 0 0 0;
              0 0 0 0 0 0;
             0 0 0 0 0 0 0;
            0 0 0 0 0 0 0 0;
           0 0 0 0 0 0 0 0 0;
            0 0 0 0 0 0 0 0;
             0 0 0 0 0 0 0;
              0 0 0 0 0 0;
               0 0 0 0 0'
    background_intervals = 1
    hexagon_size = 17
    #duct_sizes = '15 15.5'
    #duct_intervals = '1 2'
  []
  [pmg_4]
    type = PatternedHexPeripheralModifier
    input = pattern_4
    input_mesh_external_boundary = 10000
    new_num_sector = ${new_num_sector}
    num_layers = ${num_layer}
  []
  [pattern_sum]
    type = PatternedHexMeshGenerator
    inputs = 'pmg_1 pmg_2 pmg_3 pmg_4'
    pattern = '2 3;
              1 0 1;
               3 2'
    pattern_boundary = none
    generate_core_metadata = true
  []
[]

Oversized Pin

Some assemblies contain an oversized pin which intrudes on neighboring unit pin cells. Here, we describe one possible approach to mesh this situation.

First, define the regular small fuel pins and place them into the assembly as a full lattice. Separately, the oversized pin should be defined as its own object, remembering to remove the background region which is created by default in PolygonConcentricCircleMeshGenerator. Finally, XYDelaunayGenerator is used to mesh the regions between the assembly (with deleted dummies) and the oversized pin.

[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
  []
  [hex_big]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '4 4 4 4 4 4'
    background_intervals = 2
    ring_radii = 10.0
    ring_intervals = 2
    ring_block_ids = '110 115'
    ring_block_names = 'center2_tri center2'
    background_block_ids = 120
    background_block_names = background2
    polygon_size = 13.0
    preserve_volumes = on
  []
  [bkg_rm]
    type = BlockDeletionGenerator
    input = hex_big
    block = 'background2'
    new_boundary = 'big_pin_ext'
  []
  [hex_dummy]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '4 4 4 4 4 4'
    background_intervals = 2
    background_block_ids = '40 45'
    background_block_names = 'background_dummy_tri background_dummy'
    polygon_size = 5.0
    preserve_volumes = on
  []
  [assm]
    type = PatternedHexMeshGenerator
    inputs = 'hex_1 hex_dummy'
    pattern = '0 0 0 0 0;
              0 0 0 0 0 0;
             0 0 0 0 0 0 0;
            0 0 0 1 1 0 0 0;
           0 0 0 1 1 1 0 0 0;
            0 0 0 1 1 0 0 0;
             0 0 0 0 0 0 0;
              0 0 0 0 0 0;
               0 0 0 0 0'
    background_block_id = 25
    background_block_name = "assem_block"
    hexagon_size = 42
  []
  [blk_del]
    type = BlockDeletionGenerator
    input = assm
    block = 'background_dummy_tri background_dummy'
    new_boundary = 'hole_bdry'
  []
  [xyd]
    type = XYDelaunayGenerator
    boundary = 'blk_del'
    input_boundary_names = 'hole_bdry'
    refine_boundary = false
    desired_area = 1
    output_boundary = 'xyd_ext'
    output_subdomain_name = '100'
    holes = 'bkg_rm'
    stitch_holes = 'true'
  []
  [stitch]
    type = StitchedMeshGenerator
    inputs = 'blk_del xyd'
    clear_stitched_boundary_ids = true
    stitch_boundaries_pairs = 'hole_bdry xyd_ext'
    parallel_type = 'replicated'
  []
[]

Filling Between Curves using "FillBetweenSidesetsGenerator"

The MSRE 2D lattice case was constructed using the FillBetweenSidesetsGenerator to connect "quarter" circular pins. First, ConcentricCircleMeshGenerator (a predecessor of PolygonConcentricCircleMeshGenerator which has a different set of input options and works only for square pin cells) was used to create two quarter pins.

[Mesh]
  [connect_two_circles]
    type = FillBetweenSidesetsGenerator
    input_mesh_1 = 'Corner_bottom_left_2'
    input_mesh_2 = 'Corner_top_right_3'
    boundary_1 = 'curve_1'
    boundary_2 = 'curve_2'
    num_layers = 8
    keep_inputs = true
    use_quad_elements = true
    block_id = 200
  []
[]

Triangulation of Odd-Shaped Regions Using "ParsedCurveGenerator" and "XYDelaunayGenerator"

This example demonstrates how to place a control drum object in an arbitrary position in a core that may overlap subdomain boundaries.

First, the center assembly is created using regular pins and procedures.

[Mesh]
  [hex_1]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '2 2 2 2 2 2'
    background_intervals = 2
    ring_radii = 4.0
    ring_intervals = 2
    ring_block_ids = '10 15'
    ring_block_names = 'pin_tri pin_quad'
    background_block_ids = 20
    background_block_names = pin_background
    polygon_size = 5.0
    preserve_volumes = on
  []

  [pattern]
    type = PatternedHexMeshGenerator
    inputs = 'hex_1'
    hexagon_size = 25
    background_block_id = 30
    background_block_name = assembly_background
    pattern = '0 0 0;
                0 0 0 0;
               0 0 0 0 0;
                0 0 0 0;
                 0 0 0'
  []
[]

Triangulation of Odd-Shaped Regions (cont.)

Next, two circular peripheral regions are added using PeripheralTriangleMeshGenerator (yellow, purple zones).

[Mesh]
  [tmg1]
    type = PeripheralTriangleMeshGenerator
    input = pattern
    peripheral_ring_radius = 35
    peripheral_ring_num_segments = 50
    peripheral_ring_block_name = peripheral_1
    desired_area = 8
  []

  [tmg2]
    type = PeripheralTriangleMeshGenerator
    input = tmg1
    peripheral_ring_radius = 38
    peripheral_ring_num_segments = 80
    peripheral_ring_block_name = peripheral_2
    desired_area = 6
  []
[]

Triangulation of Odd-Shaped Regions (cont.)

Next, the complex boundary shape which is the outer edge of the light blue zone is defined using ParsedCurveGenerator and analytic piecewise functions. The interior of this boundary is then filled in, including the center assembly, using XYDelaunayGenerator.

[Mesh]
  [pcg1]
    type = ParsedCurveGenerator
    x_formula = 't1:=t;
                     t2:=t-1;
                     t3:=t-2;
                     t4:=t-3;
                     x1:=r*cos(t1*(th1-th0)+th0);
                     x2_0:=r*cos(th1);
                     x2_1:=x2_0-Lx;
                     x2:=x2_0+(x2_1-x2_0)*t2;
                     rs:=abs(r*sin(th1));
                     rth0:=1.5*pi;
                     rth1:=0.5*pi;
                     x3:=x2_1+rs*cos(rth0+(rth1-rth0)*t3);
                     x4_1:=r*cos(th1);
                     x4_0:=x4_1-Lx;
                     x4:=x4_0+(x4_1-x4_0)*t4;
                     if(t<1,x1,if(t<2,x2,if(t<3,x3,x4)))'
    y_formula = 't1:=t;
                     t2:=t-1;
                     t3:=t-2;
                     t4:=t-3;
                     y1:=r*sin(t1*(th1-th0)+th0);
                     y2:=r*sin(th1);
                     rs:=abs(r*sin(th1));
                     rth0:=1.5*pi;
                     rth1:=0.5*pi;
                     y3:=rs*sin(rth0+(rth1-rth0)*t3);
                     y4:=r*sin(th0);
                     if(t<1,y1,if(t<2,y2,if(t<3,y3,y4)))'
    section_bounding_t_values = '0 1 2 3 4'
    constant_names = 'pi           r    th0               th1                    Lx'
    constant_expressions = '${fparse pi} 100.0 ${fparse pi/9.0} ${fparse pi/9.0*17.0} 10.0'
    nums_segments = '50 3 15 3'
    is_closed_loop = true
  []

  [xydg1]
    type = XYDelaunayGenerator
    boundary = 'pcg1'
    holes = 'tmg2'
    add_nodes_per_boundary_segment = 0
    refine_boundary = false
    desired_area = 30
    output_subdomain_name = xy_layer_1
    stitch_holes = 'true'
    refine_holes = 'false'
  []
[]

Triangulation of Odd-Shaped Regions (cont.)

The control drum object is defined including the absorber arc using PolygonConcentricCircleMeshGenerator and AzimuthalBlockSplitGenerator, then the background region of the control drum is deleted to leave only the circular part. This mesh is then translated into the desired position of the final mesh using TransformGenerator. The small red pin is defined similarly (not requiring AzimuthalBlockSplitGenerator).

[Mesh]
  [cd]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '6 6 6 6 6 6'
    background_intervals = 2
    ring_radii = '27 30 32'
    ring_intervals = '2 2 2'
    ring_block_ids = '110 115 120 125'
    ring_block_names = 'cd_1_tri cd_1_quad cd_2 cd_3'
    background_block_ids = 130
    background_block_names = cd_background
    polygon_size = 40
    preserve_volumes = on
  []

  [cd_azi_define]
    type = AzimuthalBlockSplitGenerator
    input = cd
    start_angle = 300
    angle_range = 120
    old_blocks = '120'
    new_block_ids = '121'
    new_block_names = 'absorber'
    preserve_volumes = true
  []

  [cd_bd]
    type = BlockDeletionGenerator
    input = cd_azi_define
    block = cd_background
  []

  [cd_translate]
    type = TransformGenerator
    input = cd_bd
    transform = translate
    vector_value = '${fparse 100.0*cos(pi/9.0)-10.0} 0 0'
  []

  [outer_pin]
    type = PolygonConcentricCircleMeshGenerator
    num_sides = 6
    num_sectors_per_side = '2 2 2 2 2 2'
    background_intervals = 2
    ring_radii = '10 12'
    ring_intervals = '2 2'
    ring_block_ids = '210 215 220'
    ring_block_names = 'op_1_tri op_1_quad op_2'
    background_block_ids = 230
    background_block_names = op_background
    polygon_size = 15
    preserve_volumes = on
  []

  [op_bd]
    type = BlockDeletionGenerator
    input = outer_pin
    block = op_background
  []

  [op_translate]
    type = TransformGenerator
    input = op_bd
    transform = translate
    vector_value = '${fparse 120/sqrt(2)} ${fparse 120/sqrt(2)} 0'
  []
[]

Triangulation of Odd-Shaped Regions (cont.)

The outer boundary of the dark blue zone is then generated using ParsedCurveGenerator and analytical functions. XYDelaunayGenerator is again used to fill the dark blue regions, keeping the light blue region and assembly, control drum, and small pin.

[Mesh]
  [pcg2]
    type = ParsedCurveGenerator
    x_formula = 'r*cos(t)'
    y_formula = 'r*sin(t)'
    section_bounding_t_values = '0 ${fparse 2*pi}'
    constant_names = 'pi           r'
    constant_expressions = '${fparse pi} 140.0'
    nums_segments = '100'
    is_closed_loop = true
  []

  [xydg2]
    type = XYDelaunayGenerator
    boundary = 'pcg2'
    holes = 'xydg1 cd_translate op_translate'
    add_nodes_per_boundary_segment = 0
    refine_boundary = false
    desired_area = 30
    output_subdomain_name = xy_layer_2
    stitch_holes = 'true true true'
    refine_holes = 'false false false'
  []
[]

Triangulation of Odd-Shaped Regions (cont.)

Finally, a circular peripheral region is added at the end using PeripheralTriangleMeshGenerator (yellow).

[Mesh]
  [tmg3]
    type = PeripheralTriangleMeshGenerator
    input = xydg2
    peripheral_ring_radius = 150
    peripheral_ring_num_segments = 100
    peripheral_ring_block_name = peripheral_3
    desired_area = 20
  []
[]

References

  1. James Ahrens, Berk Geveci, and Charles Law. ParaView: an end-user tool for large data visualization. In Visualization Handbook. Elesvier, 2005. URL: https://doi.org/10.1016/B978-012387582-2/50038-1.
  2. A MOX-fuel core configuration for the Westinghouse Lead Fast Reactor, Juan-les-pins, France, 2019. International Congress on Advances in Nuclear Power Plants (ICAPP).
  3. E. R. Shemon, J. J. Grudzinski, C. H. Lee, J. W. Thomas, and Y. Q. Yu. Specification of the advanced burner test reactor multi-physics coupling demonstration problem. Technical Report ANL/NE-15/43, Argonne National Laboratory, 12 2015. URL: https://www.osti.gov/biblio/1236452, doi:10.2172/1236452.