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.
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.
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.
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] 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' 
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 [../] [../]
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 [../] 
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 
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.
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 [../]
[./clad_axial_pressure] type = CladdingAxialPressureFunction plenum_pressure = plenum_pressure coolant_pressure = pressure_ramp coolant_pressure_scaling_factor = 15.5e6 fuel_pin_geometry = pin_geometry [../]
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.
The kernels for temperature are the same for both the 2D-RZ Axisymmetric input file and the Layered 1D input file.
[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' [../] [../] [../] 
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
system: change the argument for this parameter to
The limited number of slices affects the smoothing distance in both mechanical and thermal contact:
normal_smoothing_distanceparameter from both the mechanical contact block and the thermal contact 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,
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.
clad_surface_temperatureboundary condition to apply to only
boundary = 2
coolant_pressureboundary condition to apply to only
boundary = 2
Because the Layered 1D Bison capability is built on the Tensor Mechanics module, no changes are required to the Materials 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.
Different postprocessors are required for Layered 1D simulations; these new postprocessors account for the geometrical simplifications made by the Layered 1D mesh.
In the total rod power post processor, ElementIntegralPower, add the parameter
fuel_pin_geometry = pin_geometry.