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.

warning:Tensor Mechanics 2D-RZ Input File Assumed

This guide assumes a working 2D-RZ tensor mechanics assessment case input file. See the migration guidelines for changing a solid mechanics input file to use tensor mechanics if you are beginning with a 2D-RZ solid mechanics 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.

note: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, all of the scalar out-of-plane strain variables must be listed in the ReferenceResidualProblem input file block, as shown below


[Problem]
  coord_type = RZ
  type = ReferenceResidualProblem
  solution_variables = 'disp_x temp scalar_strain_yy_fuel_10 scalar_strain_yy_fuel_11 scalar_strain_yy_fuel_20 scalar_strain_yy_fuel_21 scalar_strain_yy_fuel_22 scalar_strain_yy_fuel_30 scalar_strain_yy_clad0 scalar_strain_yy_clad1 scalar_strain_yy_clad2 scalar_strain_yy_clad3 scalar_strain_yy_clad4 scalar_strain_yy_clad5 scalar_strain_yy_clad6'
  reference_residual_variables = 'saved_x saved_t saved_scalar_strain_yy_fuel_10 saved_scalar_strain_yy_fuel_11 saved_scalar_strain_yy_fuel_20 saved_scalar_strain_yy_fuel_21 saved_scalar_strain_yy_fuel_22 saved_scalar_strain_yy_fuel_30 saved_scalar_strain_yy_clad0 saved_scalar_strain_yy_clad1 saved_scalar_strain_yy_clad2 saved_scalar_strain_yy_clad3 saved_scalar_strain_yy_clad4 saved_scalar_strain_yy_clad5 saved_scalar_strain_yy_clad6'
[]
(test/tests/layered_1D/multi_block.i)

and the AuxVariable saved_x for the displacement variable must be added to the Layered1DMaster.

[./Layered1DMaster]
  [./fuel_1]
    add_variables = true
    add_scalar_variables = true
    out_of_plane_strain_name = strain_yy
    fuel_pin_geometry = pin_geometry
    block = fuel_1
    out_of_plane_pressure = fuel_axial_pressure
    use_displaced_mesh = true
    strain = finite
    eigenstrain_names = 'fuelthermal_strain'
    save_in = saved_x
  [../]
  [./fuel_2]
    add_variables = true
    add_scalar_variables = true
    out_of_plane_strain_name = strain_yy
    fuel_pin_geometry = pin_geometry
    block = fuel_2
    out_of_plane_pressure = fuel_axial_pressure
    use_displaced_mesh = true
    strain = finite
    eigenstrain_names = 'fuelthermal_strain'
    save_in = saved_x
  [../]
  [./fuel_3]
    add_variables = true
    add_scalar_variables = true
    out_of_plane_strain_name = strain_yy
    fuel_pin_geometry = pin_geometry
    block = fuel_3
    out_of_plane_pressure = fuel_axial_pressure
    use_displaced_mesh = true
    strain = finite
    eigenstrain_names = 'fuelthermal_strain'
    save_in = saved_x
  [../]
  [./clad]
    add_variables = true
    add_scalar_variables = true
    out_of_plane_strain_name = strain_yy
    fuel_pin_geometry = pin_geometry
    block = clad
    out_of_plane_pressure = clad_axial_pressure
    use_displaced_mesh = true
    strain = finite
    eigenstrain_names = 'clad_thermal_eigenstrain'
    save_in = saved_x
  [../]
[../]
(test/tests/layered_1D/multi_block.i)

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]
  [./pin_geometry]
    type = Layered1DFuelPinGeometry
  [../]
[]
(test/tests/layered_1D/internal_volume.i)

Mesh Block

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


[Mesh]
  type = Layered1DMesh
  patch_update_strategy = auto
  partitioner = centroid
  centroid_partitioner_direction = y
  slices_per_block = 10
  clad_gap_width = 8.0e-5
  clad_thickness = 0.00056
  fuel_height = 0.1186
  plenum_height = 0.027
[]
(examples/tensor_mechanics/1.5D_rodlet_10pellets/Smeared_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 Layered1DMaster action used for Layered 1D simulations generates the same set of Rank-2 auxvariable and auxkernel pairs for output the data as the TensorMechanics MasterAction 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.


[./fuel_axial_pressure]
  type = ParsedFunction
  value = plenum_pressure
  vars = plenum_pressure
  vals = plenum_pressure
[../]
(examples/tensor_mechanics/1.5D_rodlet_10pellets/Smeared_1.5D.i)

[./clad_axial_pressure]
  type = CladdingAxialPressureFunction
  plenum_pressure = plenum_pressure
  coolant_pressure = pressure_ramp
  coolant_pressure_scaling_factor = 15.5e6
  fuel_pin_geometry = pin_geometry
[../]
(examples/tensor_mechanics/1.5D_rodlet_10pellets/Smeared_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 TensorMechanics MasterAction used in the 2D-RZ input file is replaced by the specific Layered1DMaster action:


[Modules]
  [./TensorMechanics]
    [./Layered1DMaster]
      [./fuel]
        block = fuel
        add_variables = true
        strain = FINITE
        add_scalar_variables = true
        out_of_plane_strain_name = strain_yy
        fuel_pin_geometry = pin_geometry
        out_of_plane_pressure = fuel_axial_pressure
        eigenstrain_names = 'fuelthermal_strain swelling_strain fuel_relocation_strain'
        generate_output = 'stress_xx stress_yy stress_zz vonmises_stress strain_xx'
      [../]
      [./clad]
        block = clad
        add_variables = true
        strain = FINITE
        add_scalar_variables = true
        out_of_plane_strain_name = strain_yy
        fuel_pin_geometry = pin_geometry
        out_of_plane_pressure = clad_axial_pressure
        eigenstrain_names = 'clad_thermal_eigenstrain clad_irradiation_strain'
        generate_output = 'stress_xx stress_yy stress_zz vonmises_stress strain_xx'
      [../]
    [../]
  [../]
[]
(examples/tensor_mechanics/1.5D_rodlet_10pellets/Smeared_1.5D.i)

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