Creating a Layered1D Input File from a 2D-RZ Input File

The BISON Layered1D capability was designed to ensure reusability of the governing PDE equations and many of the consititutive thermal and mechanical material models. This reusability significantly reduces the number of changes that must be made to convert a 2D-RZ axisymmetric input file to Layered1D.

Nonetheless, the assumptions made about the out-of-plane mechanical stress and strain (see the introduction on GeneralizedPlaneStrain) require some changes to the strain calculators and to the displacement variables used. Additionally the mesh must also be changed to reflect the change in simulation dimension when transitioning to a Layered1D problem.

warningwarning:Solid Mechanics 2D-RZ Input File Assumed

This guide assumes a working 2D-RZ tensor mechanics assessment case input file.

Layered 1D Model Definition

The term 'Layered 1D' in BISON is defined as a cylindrical fuel geometry model composed of coupled 1D simulations on each axial fuel slice at given axial positions along the rod. The fuel rod is divided into several axial slices, where 1D versions of the thermal and mechanical governing PDEs are solved.

commentnote:BISON Layered 1D Model Overview

See the Introduction to Layered 1D Models for a description of how the Layered 1D capability is implemented in BISON, including a useful schematic which illustrates the key concept of axial slices.

Global Variables

These variables are defined outside of the usual block structure of the BISON input file. By definition, the Layered 1D problem has one fewer displacement variable the corresponding 2D-RZ Axisymmetric problem:


displacements = 'disp_x'

Problem Block

To use the ReferenceResidualProblem option with the Layered 1D model, the reference_vector = 'ref' and extra_tag_vectors = 'ref' must be used. The ReferenceResidualProblem input file block, is shown below.

[Problem<<<{"href": "../../syntax/Problem/index.html"}>>>]
  type = ReferenceResidualProblem
  reference_vector = 'ref'
  extra_tag_vectors = 'ref'
[]
(examples/1.5D_rodlet_10pellets/1_5D.i)

The line extra_vector_tags = 'ref' for the displacement variable must be added to the Layered1D action block as the argument for the extra_vector_tags = 'ref' parameter as done in the 2D input file.

commentnote:Scalar Out-of-Plane Strain Variables Added with Layered1D

Only the standard field variables, temperature and displacement in the radial or x direction, are included in the solution and reference residual variable parameter lists. The scalar out-of-plane strain variables are added automatically using specific scalar variable parameters in the Layered1D action block discussed below.

UserObject Block

Regardless if the fuel pin geometry user object is used in the 2D-RZ Axisymmetric input file, the Layered1DFuelPinGeometry user object is required for use in Layered 1D simulations.

[UserObjects<<<{"href": "../../syntax/UserObjects/index.html"}>>>]
  [pin_geometry]
    type = Layered1DFuelPinGeometry<<<{"description": "Computes LWR fuel pin geometry for 1D meshes by reading the input mesh. This object can be coupled to Burnup and other functions as an alternative to having the user supply parameters such as pellet radius and pellet-cladding gap.", "href": "../../source/userobject/Layered1DFuelPinGeometry.html"}>>>
    mesh_generator<<<{"description": "The name of the generator to use as the prefix for mesh meta data properties."}>>> = layered1D_mesh
  []
[]
(test/tests/layered_1D/internal_volume.i)

Mesh Block

The mesh for Layered 1D simulations is generated by the internal BISON mesh generator, Layered1DMeshGenerator. An example Layered1D model mesh block is:

[Mesh<<<{"href": "../../syntax/Mesh/index.html"}>>>]
  # Specify coordinate system type
  coord_type = RZ
  [layered1D_mesh]
    type = Layered1DMeshGenerator<<<{"description": "Creates an axisymmetric mesh composed of layers of 1-dimensional elements.", "href": "../../source/meshgenerators/Layered1DMeshGenerator.html"}>>>
    slices_per_block<<<{"description": "For cases with only cladding, this is a single number providing the total number of slices for the cladding.  For cases with fuel, this is the number of slices per fuel block. Multiple values are provided if multiple fuel blocks are used."}>>> = 10
    clad_gap_width<<<{"description": "Gap between maximum outer radius of pellet and inside surface of cladding."}>>> = 8.0e-5
    clad_thickness<<<{"description": "Thickness of cladding."}>>> = 0.00056
    fuel_height<<<{"description": "Height of the fuel."}>>> = 0.1186
    plenum_height<<<{"description": "Height of the upper plenum.  Used only when uniform_slice_heights is true."}>>> = 0.027
  []
  patch_update_strategy = auto
  partitioner = centroid
  centroid_partitioner_direction = y
[]
(examples/1.5D_rodlet_10pellets/1_5D.i)

Particular attention should be given to ensuring that these variables correctly represent the geometry of the 2D-RZ mesh geometry. Even small differences in the geometry can significantly alter the results.

  • fuel_height: Ensure this parameter matches the overall total height of the fuel stack in the 2D-RZ mesh at the start of the simulation

  • plenum_height: The value must be the sum of the vertical clad-fuel gap at the bottom of the pellet stack and the vertical clad-fuel gap at the top of the fuel stack. Analysts should verify this sum within Paraview or another mesh viewing software

  • slices_per_block: The number of slices per blocks; if multiple fuel blocks are present in the mesh block (e.g. for insulator pellets) list multiple values as the argument for this parameter.

  • slice_height: If the height varies among the axial fuel slices, add the specific heights as a string argument to this parameter.

The number of slices required for a Layered 1D simulation depends on the axial power profile. For a smooth profile, generally 10 or more slices are recommended for modeling a fuel rod. For a complex axial profile, significantly more slices may be required.

AuxVariables and AuxKernels

The Layered1D action used for Layered 1D simulations generates the same set of Rank-2 auxvariable and auxkernel pairs for output the data as the SolidMechanics QuasiStatic Action used in the 2D-RZ Axisymmetric models. Therefore no changes are required to the auxvariables and auxkernels when transitioning a 2D-RZ Axisymmetric input file to a Layered 1D model.

Functions Block

The majority of the entries in the functions block are identical to the 2D-RZ Axisymmetric simulation input files; however, two additional functions are required to correctly model the axial pressure due to the plenum pressure and coolant pressure: the ParsedFunction and the CladdingAxialPressureFunction.

[Functions<<<{"href": "../../syntax/Functions/index.html"}>>>]
  [fuel_axial_pressure]
    type = ParsedFunction<<<{"description": "Function created by parsing a string", "href": "../../source/functions/MooseParsedFunction.html"}>>>
    expression<<<{"description": "The user defined function."}>>> = plenum_pressure
    symbol_names<<<{"description": "Symbols (excluding t,x,y,z) that are bound to the values provided by the corresponding items in the vals vector."}>>> = plenum_pressure
    symbol_values<<<{"description": "Constant numeric values, postprocessor names, function names, and scalar variables corresponding to the symbols in symbol_names."}>>> = plenum_pressure
  []
[]
(examples/1.5D_rodlet_10pellets/1_5D.i)
[Functions<<<{"href": "../../syntax/Functions/index.html"}>>>]
  [clad_axial_pressure]
    type = CladdingAxialPressureFunction<<<{"description": "Computes the axial pressure applied to the cladding from the coolant and plenum pressure", "href": "../../source/functions/CladdingAxialPressureFunction.html"}>>>
    plenum_pressure<<<{"description": "Name of the Postprocessor that computes the plenum pressure"}>>> = plenum_pressure
    coolant_pressure<<<{"description": "Name of the Function that computes the coolant pressure"}>>> = pressure_ramp
    coolant_pressure_scaling_factor<<<{"description": "Factor by which to scale the coolant pressure function; this scaling factor must match the scaling factor in the coolant pressure BCs block"}>>> = 15.5e6
    fuel_pin_geometry<<<{"description": "Name of the UserObject that reads the pin geometry from the mesh."}>>> = pin_geometry
  []
[]
(examples/1.5D_rodlet_10pellets/1_5D.i)

Take care in setting the coolant_pressure_scaling_factor; this value must be equal to the value of the factor parameter in the coolant pressure boundary condition block. The incorrect use of this parameter, or the mismatch between this parameter and the analogous coolant pressure boundary condition block is a potential source of error.

Kernels Block

The kernels for temperature are the same for both the 2D-RZ Axisymmetric input file and the Layered 1D input file.

Modules Block

The general SolidMechanics QuasiStatic Action used in the 2D-RZ input file is replaced by the specific Layered1D action:

[Physics<<<{"href": "../../syntax/Physics/index.html"}>>>]
  [SolidMechanics<<<{"href": "../../syntax/Physics/SolidMechanics/index.html"}>>>]
    [Layered1D<<<{"href": "../../syntax/Physics/SolidMechanics/Layered1D/index.html"}>>>]
      [fuel]
        block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = fuel
        add_variables<<<{"description": "Add the displacement variables"}>>> = true
        strain<<<{"description": "Strain formulation"}>>> = FINITE
        add_scalar_variables<<<{"description": "Add the scalar_out_of_plane_strain variables."}>>> = true
        out_of_plane_strain_name<<<{"description": "Name provided by user for aux variable to gather scalar_out_of_plane_strains."}>>> = strain_yy
        fuel_pin_geometry<<<{"description": "User object name which provides subblock index."}>>> = pin_geometry
        out_of_plane_pressure_function<<<{"description": "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction (y for 1D Axisymmetric or z for 2D Cartesian problems)"}>>> = fuel_axial_pressure
        eigenstrain_names<<<{"description": "List of eigenstrains to be applied in this strain calculation"}>>> = 'fuelthermal_strain swelling_strain fuel_relocation_strain'
        generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'stress_xx stress_yy stress_zz vonmises_stress strain_xx'
        extra_vector_tags<<<{"description": "The tag names for extra vectors that residual data should be saved into"}>>> = 'ref'
        outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = none
        group_scalar_vars_in_reference_residual<<<{"description": "Group all scalar variables in reference residual problem."}>>> = true
        mesh_generator<<<{"description": "The name of the generator to use as the prefix for mesh meta data properties."}>>> = layered1D_mesh
      []
      [clad]
        block<<<{"description": "The list of ids of the blocks (subdomain) that the stress divergence kernels will be applied to"}>>> = clad
        add_variables<<<{"description": "Add the displacement variables"}>>> = true
        strain<<<{"description": "Strain formulation"}>>> = FINITE
        add_scalar_variables<<<{"description": "Add the scalar_out_of_plane_strain variables."}>>> = true
        out_of_plane_strain_name<<<{"description": "Name provided by user for aux variable to gather scalar_out_of_plane_strains."}>>> = strain_yy
        fuel_pin_geometry<<<{"description": "User object name which provides subblock index."}>>> = pin_geometry
        out_of_plane_pressure_function<<<{"description": "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction (y for 1D Axisymmetric or z for 2D Cartesian problems)"}>>> = clad_axial_pressure
        eigenstrain_names<<<{"description": "List of eigenstrains to be applied in this strain calculation"}>>> = 'clad_thermal_eigenstrain clad_irradiation_strain'
        generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'stress_xx stress_yy stress_zz vonmises_stress strain_xx'
        extra_vector_tags<<<{"description": "The tag names for extra vectors that residual data should be saved into"}>>> = 'ref'
        outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = none
        group_scalar_vars_in_reference_residual<<<{"description": "Group all scalar variables in reference residual problem."}>>> = true
        mesh_generator<<<{"description": "The name of the generator to use as the prefix for mesh meta data properties."}>>> = layered1D_mesh
      []
    []
  []
[]
(examples/1.5D_rodlet_10pellets/1_5D.i)

If the 2D problem was run using the ReferenceResidualProblem, the scalar variables must be added to the list of variables in that block. We recommend using the add_scalar_vars_to_reference_residual option in the Layered1D block shown here to automatically add all of the scalar variables to ReferenceResidualProblem. The group_scalar_vars_in_reference_residual option is also recommended but is not required; this option uses the L2 norm of the scalar variables as a set rather than as individual entires for determining convergence.

Contact Blocks

Changes to the contact module settings in the Layered 1D input file are necessary because of the limited number of interaction points across the slices. The majority of the changes required are only in the contact module:

  • formulation: set this parameter equal to kinematic

  • system: change the argument for this parameter to constraint

The limited number of slices affects the smoothing distance in both mechanical and thermal contact:

  • Remove the normal_smoothing_distance parameter from both the mechanical contact block and the thermal contact block.

BCs Block

Changes to the boundary condition block are reflective of the reduced number of degrees of freedom within a Layered 1D simulation.

  • Remove all boundary conditions associated with the y-displacement variable, disp_y

  • Ensure that all displacement variable strings refer to only the x-displacement variable, that is, displacements = 'disp_x'`

  • If the pellets in the Layered 1D simulation are annular, remove all x-displacement variable boundary conditions: the hoop stress generated by the axisymmetric materials constrains displacement in the x-direction.

  • Modify the clad_surface_temperature boundary condition to apply to only boundary = 2

  • Modify the coolant_pressure boundary condition to apply to only boundary = 2

Materials Block

Because the Layered 1D BISON capability is built on the Solid Mechanics module, no changes are required to the Materials block.

Executioner Block

If running the 1.5D simulation on a machine with PETSc 3.7.4 or PETSc 3.7.5, use lu as the solver. Generally it is possible to run a Layered 1D simulation on a single processor, and using the lu solver is acceptable whenever running with a single processor.

PostProcessors Block

Different postprocessors are required for Layered 1D simulations; these new postprocessors account for the geometrical simplifications made by the Layered 1D mesh.