Multi-physics Object Oriented Simulation Environment
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
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
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)
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!
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
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'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.
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.
Figure 5: C5G7 light water reactor benchmark (Courtesy Yeon Sang Jung, Argonne National Laboratory).
Figure 6: Lead-cooled fast reactor assembly with annular pins (Credit: Emily Shemon, Shikhar Kumar, Hansol Park, Argonne National Laboratory).
Figure 7: Advanced Burner Test Reactor (ABTR) (Credit Shikhar Kumar, Argonne National Laboratory).
Figure 8: DOE-NE MARVEL microreactor concept at Idaho National Laboratory (Courtesy Stefano Terlizzi, Idaho National Laboratory).
Figure 9: Modular High Temperature Gas-Cooled Reactor (MHTGR) (Courtesy Olin Calvin, Idaho National Laboratory).
Figure 10: Molten Salt Reactor Experiment at Oak Ridge National Laboratory (Courtesy Kun Mo and Yan Cao, Argonne National Laboratory).
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.
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.
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):
Define pins
Define assembly by patterning existing pins into a lattice and adding coolant background and/or duct region
Define core by patterning assemblies into a lattice
Apply core periphery zones like a circular shield
Trim along lines of symmetry to reduce computational expense
Extrude to 3D
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.
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)
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.
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.
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'
[]
[]
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'
[]
[]
(Cartesian sibling – PatternedCartesianMeshGenerator)
2D Regular assembly with uniform pin pitch
Optional background and duct regions
When generating an assembly mesh using PatternedHexMeshGenerator, be sure to set "generate_core_metadata" as false
Input will be automatically rotated 90 degrees CCW unless specified with "rotate_angle"
[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
[]
[]
(Cartesian sibling – CartesianConcentricCircleAdaptiveBoundaryMeshGenerator)
Hexagonal mesh with assembly metadata
Can optionally match other assembly meshes' external boundary to enable stitching to generate core meshes.
It can be used without specifying "sides_to_adapt" and "meshes_to_adapt_to" to generate PolygonConcentricCircleMeshGenerator -style hexagonal mesh with assembly mesh metadata
[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'
[]
[]
(Cartesian sibling – PatternedCartesianMeshGenerator)
2D regular assembly pattern with uniform assembly pitch
Assembly meshes generated by PatternedHexMeshGenerator, HexagonConcentricCircleAdaptiveBoundaryMeshGenerator and SimpleHexagonGenerator can be used as inputs
Core mesh generation should include the parameter "generate_core_metadata" as true
.
The pattern will be automatically rotated 90 degrees CCW unless specified with "rotate_angle"
[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'
[]
[]
PeripheralRingMeshGenerator (abbreviated as PRMG)
Adds circular peripheral region to a reactor core mesh
PeripheralRingMeshGenerator has a boundary layer capability
PeripheralRingMeshGenerator generates a structured peripheral mesh with QUAD4 elements
[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
[]
[]
PeripheralTriangleMeshGenerator (abbreviated as PTMG)
Adds circular peripheral region to a reactor core mesh
PeripheralTriangleMeshGenerator generates an unstructured peripheral mesh with TRI3 elements
Automatic element area refinement is available
[Mesh]
[pt]
type = PeripheralTriangleMeshGenerator
input = pattern_core
peripheral_ring_radius = 100.0
peripheral_ring_num_segments = 100
desired_area = 20
[]
[]
(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]
[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
[]
[]
(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
[]
[]
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'
[]
[]
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
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
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.
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.
[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
[]
[]
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
[]
[]
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'
[]
[]
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'
[]
[]
Integrates solution variables over zones identified by combinations of reporting IDs
ExtraIDIntegralVectorPostprocessor exports the post-processed results in CSV file format
ExtraIDIntegralReporter, based on the MOOSE reporting system, can output in JSON file format
[VectorPostprocessors]
[integral]
type = ExtraIDIntegralVectorPostprocessor
variable = 'variable_1 variable_2'
id_name = 'assembly_id pin_id'
[]
[]
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
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'
[]
[]
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'
[]
[]
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
[]
[]
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 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 coordinates demarking axial levels in plane_coordinates. These levels should be consistent with how axial levels were defined in AdvancedExtruderGenerator.
[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
[]
[]
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'
[]
[]
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.
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'
[]
[]
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
[]
[]
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.
For each ExtraIDIntegralVectorPostprocessor, a separate CSV file is generated to describe the integral variable quantity as a function of each combination of input reporting ID provided. Alternatively, ExtraIDIntegralReporter can output in JSON file format, which is more suitable for additional data parsing using script languages.
[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'
[]
[]
For each ExtraIDIntegralVectorPostprocessor, a separate CSV file is generated to describe the integral variable quantity as a function of each combination of input reporting ID provided. Alternatively, ExtraIDIntegralReporter can output in JSON file format, which is more suitable for additional data parsing using script languages.
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
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
[]
[]
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'
[]
[]
61 assembly core
Whole core rotated 60 degrees
[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
[]
[]
Define control drum mesh with HexagonConcentricCircleAdaptiveBoundaryMeshGenerator
Split outer ring into 2 separate block IDs using AzimuthalBlockSplitGenerator to account for control material zone
Setup
3 regions (Center region, Absorber Ring, Hexagonal background)
Circular volumes preserved regardless of meshing fidelity ("preserve_volumes"=true
)
Side node adaptation performed for instances with neighboring fuel assemblies
HexagonConcentricCircleAdaptiveBoundaryMeshGenerator is used in this case to create a "single pin" hexagonal assembly with sides matching another mesh
[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
[]
[]
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'
[]
[]
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
[]
[]
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
[]
[]
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
[]
[]
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 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
[]
[]
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.
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
[]
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 (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 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 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 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 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
[]
[]
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
[]
[]
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.
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 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
[]
[]
This example does not have any pin-level geometry as the assemblies are homogenized. However, we still start with PinMeshGenerator.
To define single assemblies directly with PinMeshGenerators for stitching with CoreMeshGenerator, PinMeshGenerator is used with "use_as_assembly" set to true
.
In addition, "homogenized" = true
is used to indicate that this region is homogenized and SimpleHexagonGenerator should be called to discretize the assembly instead of PolygonConcentricCircleMeshGenerator.
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 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
[]
[]
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
[]
[]
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 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
[]
[]
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 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:
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
'
[]
[]
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
[]
[]
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).
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.
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.
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 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
[]
[]
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.
PolygonConcentricCircleMeshGenerator is utilized for producing circular and triangular-shaped regions within the lattice
FillBetweenSidesetsGenerator is employed for generating mesh to fill in the regions between the regions generated by PolygonConcentricCircleMeshGenerator
ParsedCurveGenerator is used for creating the outline of complex shapes before mesh generation.
XYDelaunayGenerator is employed for meshing the irregular areas.
PeripheralTriangleMeshGenerator is utilized to add layers of triangular mesh onto an existing circular mesh.
CircularBoundaryCorrectionGenerator is used to adjust a discretized circle to match the true circle's volume.
PolygonConcentricCircleMeshGenerator and PatternedHexMeshGenerator generate pins and assemblies
XYDelaunayGenerator generates control rod holes and reflector assemblies
StitchedMeshGenerator merges control rod holes with fuel and reflector assemblies
HexagonConcentricCircleAdaptiveBoundaryMeshGenerator generates ducts for reflector assembly that can be stitched with other assembles.
PatternedHexMeshGenerator generates a lattice of fuel and reflector assemblies into the core
PeripheralRingMeshGenerator adds a circular boundary surrounding the core
AdvancedExtruderGenerator performs 2D to 3D extrusion for the core
DepletionIDGenerator sets up assembly-wise depletion zones
FillBetweenPointVectorsGenerator generates pebble bed streamlines
CartesianMeshGenerator and FillBetweenSidesetsGenerator generates rectangular meshes and trapezoid meshes
StitchedMeshGenerator merges core components
CombinerGenerator combines outer walls of core barrel and RPV
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 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'
[]
[]
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
[]
[]
[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
[]
[]
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'
[]
[]
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
[]
[]
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'
[]
[]
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
[]
[]
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'
[]
[]
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
[]
[]
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'
[]
[]
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'
[]
[]
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'
[]
[]
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
[]
[]