- fuel_pin_geometryName of Layered1DFuelPinGeometry or Layered2DFuelPinGeometry UserObject
C++ Type:UserObjectName
Controllable:No
Description:Name of Layered1DFuelPinGeometry or Layered2DFuelPinGeometry UserObject
- variableThe name of the variable that this object operates on
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:The name of the variable that this object operates on
LayeredVariableIntegral
Computes the volume integral of the layers in a layered mesh.
Description
LayeredVariableIntegral calculates the volumetric integral for the layers in a Layered1D or Layered2D mesh. The volume integral uses the constant slice_height, defined for each layer in the Layered1D or Layered2D mesh, in the calculation of the volume integral.
Example Input Syntax
[UserObjects<<<{"href": "../../syntax/UserObjects/index.html"}>>>]
[temperature_sum]
type = LayeredVariableIntegral<<<{"description": "Computes the volume integral of the layers in a layered mesh.", "href": "LayeredVariableIntegral.html"}>>>
block<<<{"description": "The list of block ids (SubdomainID) that this object will be applied"}>>> = clad
variable<<<{"description": "The name of the variable that this object operates on"}>>> = temp
execute_on<<<{"description": "The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html."}>>> = timestep_end
direction<<<{"description": "The direction of the layers."}>>> = y
num_layers<<<{"description": "The number of layers."}>>> = 2
fuel_pin_geometry<<<{"description": "Name of Layered1DFuelPinGeometry or Layered2DFuelPinGeometry UserObject"}>>> = pin_geometry
[]
[](test/tests/layered_1D/layered_integral.i)Input Parameters
- blockThe list of block ids (SubdomainID) that this object will be applied
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The list of block ids (SubdomainID) that this object will be applied
- layer_bounding_blockList of block ids (SubdomainID) that are used to determine the upper and lower geometric bounds for all layers. If this is not specified, the ids specified in 'block' are used for this purpose.
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:List of block ids (SubdomainID) that are used to determine the upper and lower geometric bounds for all layers. If this is not specified, the ids specified in 'block' are used for this purpose.
Optional Parameters
- allow_duplicate_execution_on_initialFalseIn the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).
Default:False
C++ Type:bool
Controllable:No
Description:In the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).
- execute_onTIMESTEP_ENDThe list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html.
Default:TIMESTEP_END
C++ Type:ExecFlagEnum
Options:XFEM_MARK, NONE, INITIAL, LINEAR, NONLINEAR_CONVERGENCE, NONLINEAR, POSTCHECK, TIMESTEP_END, TIMESTEP_BEGIN, MULTIAPP_FIXED_POINT_END, MULTIAPP_FIXED_POINT_BEGIN, FINAL, CUSTOM
Controllable:No
Description:The list of flag(s) indicating when this object should be executed. For a description of each flag, see https://mooseframework.inl.gov/source/interfaces/SetupInterface.html.
- execution_order_group0Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.
Default:0
C++ Type:int
Controllable:No
Description:Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.
- force_postauxFalseForces the UserObject to be executed in POSTAUX
Default:False
C++ Type:bool
Controllable:No
Description:Forces the UserObject to be executed in POSTAUX
- force_preauxFalseForces the UserObject to be executed in PREAUX
Default:False
C++ Type:bool
Controllable:No
Description:Forces the UserObject to be executed in PREAUX
- force_preicFalseForces the UserObject to be executed in PREIC during initial setup
Default:False
C++ Type:bool
Controllable:No
Description:Forces the UserObject to be executed in PREIC during initial setup
Execution Scheduling Parameters
- average_radius1When using 'average' sampling this is how the number of values both above and below the layer that will be averaged.
Default:1
C++ Type:unsigned int
Controllable:No
Description:When using 'average' sampling this is how the number of values both above and below the layer that will be averaged.
- cumulativeFalseWhen true the value in each layer is the sum of the values up to and including that layer
Default:False
C++ Type:bool
Controllable:No
Description:When true the value in each layer is the sum of the values up to and including that layer
- positive_cumulative_directionTrueWhen 'cumulative' is true, whether the direction for summing the cumulative value is the positive direction or negative direction
Default:True
C++ Type:bool
Controllable:No
Description:When 'cumulative' is true, whether the direction for summing the cumulative value is the positive direction or negative direction
- sample_typedirectHow to sample the layers. 'direct' means get the value of the layer the point falls in directly (or average if that layer has no value). 'interpolate' does a linear interpolation between the two closest layers. 'average' averages the two closest layers.
Default:direct
C++ Type:MooseEnum
Options:direct, interpolate, average
Controllable:No
Description:How to sample the layers. 'direct' means get the value of the layer the point falls in directly (or average if that layer has no value). 'interpolate' does a linear interpolation between the two closest layers. 'average' averages the two closest layers.
Value Sampling / Aggregating Parameters
- boundsThe 'bounding' positions of the layers i.e.: '0, 1.2, 3.7, 4.2' will mean 3 layers between those positions.
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:The 'bounding' positions of the layers i.e.: '0, 1.2, 3.7, 4.2' will mean 3 layers between those positions.
- directionThe direction of the layers.
C++ Type:MooseEnum
Options:x, y, z
Controllable:No
Description:The direction of the layers.
- direction_maxMaximum coordinate along 'direction' that bounds the layers
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Maximum coordinate along 'direction' that bounds the layers
- direction_minMinimum coordinate along 'direction' that bounds the layers
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Minimum coordinate along 'direction' that bounds the layers
- num_layersThe number of layers.
C++ Type:unsigned int
Controllable:No
Description:The number of layers.
Layers Extent And Definition Parameters
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
Controllable:No
Description:Adds user-defined labels for accessing object parameters via control logic.
- enableTrueSet the enabled status of the MooseObject.
Default:True
C++ Type:bool
Controllable:Yes
Description:Set the enabled status of the MooseObject.
- implicitTrueDetermines whether this object is calculated using an implicit or explicit form
Default:True
C++ Type:bool
Controllable:No
Description:Determines whether this object is calculated using an implicit or explicit form
- seed0The seed for the master random number generator
Default:0
C++ Type:unsigned int
Controllable:No
Description:The seed for the master random number generator
- use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Advanced Parameters
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Default:False
C++ Type:bool
Controllable:No
Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Material Property Retrieval Parameters
Input Files
- (test/tests/axial_relocation/mass_relocation_translated.i)
- (test/tests/axial_relocation/ad_uo2_pulverization.i)
- (test/tests/axial_relocation/uo2_pulverization_phasefield.i)
- (test/tests/layered2D/layered_integral.i)
- (test/tests/uo2_transient_fission_gas_release/uo2_pulverization_phasefield2_transient_FGR.i)
- (examples/axial_relocation/layered1D/twin_balloon.i)
- (test/tests/axial_relocation/ad_uo2_pulverization_mesoscale.i)
- (test/tests/axial_relocation/packing_fraction.i)
- (test/tests/axial_relocation/uo2_pulverization_mesoscale.i)
- (test/tests/layered_1D/layered_integral.i)
- (examples/axial_relocation/layered1D/single_balloon.i)
- (test/tests/axial_relocation/ad_uo2_pulverization_phasefield2.i)
- (test/tests/axial_relocation/axial_relocation_volume_correction.i)
- (test/tests/axial_relocation/uo2_pulverization_phasefield2.i)
- (test/tests/axial_relocation/uo2_pulverization.i)
- (test/tests/axial_relocation/mass_relocation.i)
- (test/tests/uo2_transient_fission_gas_release/ad_uo2_pulverization_phasefield2_transient_FGR.i)
- (test/tests/axial_relocation/ad_uo2_pulverization_phasefield.i)
- (test/tests/axial_relocation/crumbled_thermal_conductivity.i)
- (test/tests/axial_relocation/axial_relocation_eigenstrain.i)
(test/tests/layered_1D/layered_integral.i)
#
# Mesh has two slices of heights 1 and 9.
# Temperature is set to 10 and 90 on the two slices.
#
# The integral in cylindrical coordinates for the bottom layer given the
# dimensions of the cladding is given by:
#
# int from 2 to 3 of 10 * (2 * pi * r) dr
# = 10 * pi * 3^2 - 10 * pi * 2^2
# = 282.74334 - 125.66371
# = 157.07963
#
# Multiplying by the thickness of the layer (1.0) gives the volume integral of:
# 157.07963
#
# For the top layer the integral is:
# int from 2 to 3 of 90 * (2 * pi * r) dr
# = 90 * pi * 3^2 - 90 * pi * 2^2
# = 2544.69005 - 1130.97336
# = 1413.71669
#
# Multiplying by the thickness of the layer (9.0) gives the volume integral of:
# 12723.45021
#
# These values are obtained by looking at the layered_temperature_sum AuxVariable.
#
[GlobalParams]
order = FIRST
family = LAGRANGE
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
uniform_slice_heights = false
slice_heights = '1.0 9.0'
slices_per_block = 2
include_fuel = false
include_plenum = false
pellet_bottom_coor = 0
pellet_outer_radius = 1.0
clad_gap_width = 1.0
clad_thickness = 1.0
elem_type = EDGE2
[]
[]
[AuxVariables]
[layered_temperature_sum]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[temp1]
type = PiecewiseLinear
x = '0 1'
y = '0 10'
[]
[temp2]
type = PiecewiseLinear
x = '0 1'
y = '0 90'
[]
[]
[Variables]
[temp]
initial_condition = 0
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temp
[]
[]
[AuxKernels]
[layered_temperature_sum]
type = SpatialUserObjectAux
variable = layered_temperature_sum
execute_on = timestep_end
block = clad
user_object = temperature_sum
[]
[]
[BCs]
[temp1]
type = FunctionDirichletBC
boundary = 10003
variable = temp
function = temp1
[]
[temp2]
type = FunctionDirichletBC
boundary = 10023
variable = temp
function = temp2
[]
[]
[Materials]
[heat1]
type = HeatConductionMaterial
block = clad
specific_heat = 1.0
thermal_conductivity = 100000000.0
[]
[density]
type = ParsedMaterial
block = clad
property_name = density
expression = 1.0
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
petsc_options_value = '201 hypre boomeramg 4'
line_search = 'none'
nl_abs_tol = 9e-2
nl_rel_tol = 1e-12
l_tol = 1e-8
l_max_its = 100
start_time = 0.0
dt = 1.0
end_time = 1.0
[]
[UserObjects]
[pin_geometry]
type = Layered1DFuelPinGeometry
include_fuel = false
mesh_generator = layered1D_mesh
[]
[temperature_sum]
type = LayeredVariableIntegral
block = clad
variable = temp
execute_on = timestep_end
direction = y
num_layers = 2
fuel_pin_geometry = pin_geometry
[]
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/mass_relocation_translated.i)
# The purpose of this test is to verify the internal loops of the AxialRelocationUserObject
# that keeps track of the mass relocation. A linearly varying burnup is applied through
# the radius of 5 axial fuel slices which are modeled with cladding of 0.56 mm with an outer
# fuel radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface but is
# constant in time. The fuel temperature is held constant at 1200 K and a constant
# contact pressure is applied to the fuel surface of 40 MPa.
#
# The above conditions correspond to the conditions used in the regression test
# packing_fraction.i which verified that an effective packing fraction of 0.828912
# is obtained. Using this packing fraction and applying an axially varying displacement
# on the inner cladding surface in the radial direction described by:
#
# disp_x = 2.0e-5 * t * cos(pi * y / 0.5)
#
# the mass relocation loops are verified. At 24 seconds axial relocation begins.
# The updated mass fraction relative to the initial mass calculated by BISON
# is tabulated below for each of the layers (0, 1, 2, 3, 4) for a total of 5 layers
# for the end of the time step at 26 seconds.
#
# Layer Initial Mass Current Mass Mass Fraction
# (-) (kg) (kg) (-)
# 4 0.066299 0.066299 1.0
# 3 0.066299 0.064207 0.96845
# 2 0.066299 0.068391 1.03155
# 1 0.066299 0.066299 1.0
# 0 0.066299 0.066299 1.0
#
# Using an independent calculation in Microsoft Excel for Mac (included in this
# testing directory) the updated mass fractions are verified to match the results
# of the layered_mass_fraction AuxVariable results at the end of the simulation.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temperature
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
fuel_height = 0.5
include_plenum = false
nx_p = 10
clad_gap_width = 0.0
pellet_mesh_density = customize
pellet_bottom_coor = -0.25
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*100.0/4.275'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '15000 15000'
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * cos(pi * y / 0.5)'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = fuel
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12 5 2'
variable = temperature
value = 1200
[]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
burnup = burnup
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial timestep_end'
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'initial timestep_end'
layer_bounding_block = fuel
boundary = 5
num_layers = 5
[]
[axial_relocation]
type = AxialRelocationUserObject
block = fuel
direction = y
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'initial timestep_end'
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 14
dt = 2
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/ad_uo2_pulverization.i)
# The purpose of this test is to calculate the amount of pulverization in
# a high burnup fuel as part of the axial relocation algorithm. In the test 5
# axial fuel slices are modeled without cladding with an outer fuel radius of 4.5 mm
# and slice height of 0.1 m. Ten radial finite elements are used. The burnup
# increases linearly from the fuel centerline to the fuel surface. The burnup also
# increases as a function of time from 0 to 100 MWd/kgU on the fuel surface over 100 seconds.
#
# The fuel temperature is held constant at 1200 K. And a constant contact pressure
# is applied to the fuel surface of 40 MPa.
#
# The threshold for pulverization is given by an empirical temperature threshold
# as a function of burnup. A local burnup of 71 MWd/kgU is required for pulverization
# to begin. At this burnup the temperature threshold is 1193.15 K. The temperature
# threshold linearly decreases to a value of 913.15 K at 94 MWd/kgU after which
# it is constant.
#
# Based upon the conditions and threshold given above at t = 100 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
#
# Using command line arguments another test is run where the contact pressure is
# changed to 60 MPa which precludes pulverization for the duration of that test.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*t/4.275'
[]
[contact_pressure_function]
type = ConstantFunction
value = 40.0e6
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[contact_pressure]
type = FunctionAux
variable = contact_pressure
boundary = 10
function = contact_pressure_function
execute_on = 'initial timestep_end'
[]
[pulverized]
type = ADMaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial timestep_end'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[]
[BCs]
[temperature]
type = ADDirichletBC
boundary = '10 12'
variable = temperature
value = 1200
[]
[]
[Materials]
[uo2pulverization]
type = ADUO2Pulverization
block = fuel
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[thermal]
type = ADHeatConductionMaterial
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial timestep_end'
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = Newton
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 100
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/uo2_pulverization_phasefield.i)
# This file is to test the phase-field based pulverization criterion for UO2 fuel
# with evolve_bubble_pressure_hbs = false and using the 2D phase field criterion
# for pulverization.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 673.15 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 110. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. This material property is output to the exodus file for this test.
# At each time step, the porosity in the HBS region is calculated at each radial
# position using the correlation due to Kampf in the UO2Thermal material.
# The porosity, along with the hydrostatic stress, are used to calculate the
# critical pressure for grain boundary fracture using data from fits to phase-field
# fracture simulations. The current pressure of the most likely bubble
# size is compared to the critical pressure to determine whether pulverization has
# occurred at each quadrature point.
# Based upon the conditions and threshold given above at t = 110 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 673.15, 673.15+(t-100)*15.5)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = UO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
hbs_model = true
hbs_material = hbs_formation
evolve_bubble_pressure_hbs = false
[]
[uo2pulverizationmesoscale]
type = UO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
pulverization_criterion_type = phase_field_2D
outputs = exodus
[]
[dummy_stress]
type = GenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-1e7 -1e7 -1e7 0 0 0'
[]
[fuel_thermal]
type = UO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = HighBurnupStructureFormation
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 110
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/layered2D/layered_integral.i)
#
# Mesh has two slices of height 10e-3.
# Temperature is set to 10 and 90 on the two slices.
#
# The integral in cylindrical coordinates for the bottom layer given the
# dimensions of the cladding is given by:
#
# int from 4.18e-3 to 4.75e-3 of 10 * (2 * pi * r) dr
# = 10 * pi * (4.75e-3)^2 - 10 * pi * (4.18e-3)^2
# = 7.0882-4 - 5.4891e-4
# = 1.5991e-4
#
# Multiplying by the thickness of the layer (10e-3) gives the volume integral of:
# 1.5991e-6
#
# For the top layer the integral is:
# int from 4.18e-3 to 4.75e-3 of 90 * (2 * pi * r) dr
# = 90 * pi * (4.75e-3)^2 - 90 * pi * (4.18e-3)^2
# = 6.3794e-3 - 4.9402e-3
# = 1.4392e-3
#
# Multiplying by the thickness of the layer (10e-3) gives the volume integral of:
# 1.4392e-5
#
# These values are obtained by looking at the layered_temperature_sum AuxVariable.
[GlobalParams]
order = SECOND
family = LAGRANGE
[]
[Mesh]
[layered2D_mesh]
type = Layered2DMeshGenerator
num_sectors = 10
axial_direction = y
slices_per_block = 2
clad_mesh_density = coarse
clad_thickness = 0.57e-3
clad_gap_width = 0.08e-3
fuel_height = 20e-3
include_plenum = false
include_fuel = false
pellet_bottom_coor = 0
pellet_inner_radius = 0
pellet_outer_radius = 0.0041
[]
[]
[UserObjects]
[pin_geometry]
type = Layered2DFuelPinGeometry
mesh_generator = layered2D_mesh
include_fuel = false
[]
[temperature_sum]
type = LayeredVariableIntegral
block = clad
variable = temp
execute_on = timestep_end
direction = y
num_layers = 2
fuel_pin_geometry = pin_geometry
[]
[]
[AuxVariables]
[layered_temperature_sum]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[temp_func]
type = PiecewiseBilinear
x = '0.005 0.015'
y = '0 1'
z = '0 0 10 90'
axis = 1
[]
[]
[Variables]
[temp]
initial_condition = 0
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temp
[]
[]
[AuxKernels]
[layered_temperature_sum]
type = SpatialUserObjectAux
variable = layered_temperature_sum
execute_on = timestep_end
block = clad
user_object = temperature_sum
[]
[]
[BCs]
[temp_func]
type = FunctionDirichletBC
boundary = 5
variable = temp
function = temp_func
[]
[]
[Materials]
[heat1]
type = HeatConductionMaterial
block = clad
specific_heat = 1.0
thermal_conductivity = 100000000.0
[]
[density]
type = ParsedMaterial
block = clad
property_name = density
expression = 1.0
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
petsc_options_value = '201 hypre boomeramg 4'
line_search = 'none'
nl_abs_tol = 1e-8
nl_rel_tol = 1e-8
l_tol = 1e-5
l_max_its = 100
start_time = 0.0
dt = 1.0
end_time = 1.0
[]
[Outputs]
exodus = true
[]
(test/tests/uo2_transient_fission_gas_release/uo2_pulverization_phasefield2_transient_FGR.i)
# This file is to test the transient fission gas release model that accounts for
# the amount of fission gas released as a result of fuel pulverization. it is
# based on the input file called uo2_pulverization_mesoscale.i, which tests the
# pulverization criteria for UO2 fuel with evolve_bubble_pressure_hbs = true and
# using the 3D phase field criterion for pulverization.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 673.15 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 125. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. A material property uses the local pulverization to compute the
# amount of fission gas released as a results of fuel pulverization.
# This material property is output to the exodus file for this test.
# At each time step, the pulverized material property is computed, as well as
# the bubble radius and amount of fission gas in bubbles. These material property
# are then used to determine the amount of fission gas release due to pulverization.
# This amount predicted by the material block
# UO2PulverizationTransientFissionGasRelease is compared with analytical calculations
# made in the material block fission_gas_released_amount for verification.
# This input is the non-AD version.
hydrostatic_stress_constant = 1e7
[GlobalParams]
value_range_behavior = WARN
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 900, 900+(t-100)*200)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = UO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
ig_bubble_model = MECHANISTIC_AAGESEN
hbs_model = true
hbs_material = hbs_formation
pulverization_model = true
pulverization_transient_fission_gas_release_material = UO2PulverizationTransientFissionGasRelease
ig_diff_algorithm = FORMAS
hydrostatic_stress_const = ${hydrostatic_stress_constant}
igdiffcoeff_scalef_HBS = 1e24 # Ensures that all the generated fission gases diffuse from the HBS matrix to the HBS bubbles
[]
[uo2pulverizationmesoscale]
type = UO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
pulverization_criterion_type = phase_field_3D
outputs = exodus
[]
[dummy_stress]
type = GenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-${hydrostatic_stress_constant} -${hydrostatic_stress_constant} -${hydrostatic_stress_constant} 0 0 0'
[]
[fuel_thermal]
type = UO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = HighBurnupStructureFormation
block = fuel
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[fission_gas_density_bubble_HBS] # moles/m^3
type = ParsedMaterial
block = fuel
property_name = 'rho_FG_hbs'
material_property_names = 'atom_per_bubble_GB_HBS bubble_GB_volume_density_HBS'
constant_names = 'Na'
constant_expressions = '6.02214076e23'
expression = 'atom_per_bubble_GB_HBS * bubble_GB_volume_density_HBS / Na'
outputs = exodus
[]
[opened_pore_volume_fraction] # -
type = ParsedMaterial
block = fuel
property_name = 'f_V_pul'
material_property_names = 'hbs_porosity bubble_radius_GB_HBS'
constant_names = 'fragment_size c_p c_r c_0'
constant_expressions = '5e-5 0.03 5.17 0.02'
expression = 'c_p * hbs_porosity + c_r * bubble_radius_GB_HBS/fragment_size + c_0'
outputs = exodus
[]
[fission_gas_released_amount_analytical] # moles/m^3
type = ParsedMaterial
block = fuel
property_name = 'fis_gas_rel'
material_property_names = 'f_V_pul rho_FG_hbs pulverized'
expression = 'pulverized * f_V_pul * rho_FG_hbs'
outputs = exodus
[]
[UO2PulverizationTransientFissionGasRelease] # moles/m^3
type = UO2PulverizationTransientFissionGasRelease
block = fuel
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Postprocessors]
[FG_amount_bubble_HBS]
type = LayeredElementIntegralMaterialProperty
mat_prop = rho_FG_hbs
block = fuel
fuel_pin_geometry = fuel_pin_geometry
[]
[FGR_analytical]
type = LayeredElementIntegralMaterialProperty
mat_prop = fis_gas_rel
block = fuel
fuel_pin_geometry = fuel_pin_geometry
[]
[FGR]
type = LayeredElementIntegralMaterialProperty
mat_prop = gas_concentration_release_pulverization
block = fuel
fuel_pin_geometry = fuel_pin_geometry
[]
[FGR_pps_diff_bison_analytical]
type = DifferencePostprocessor
value1 = FGR_analytical
value2 = FGR
[]
[FG_pps_diff_total_released]
type = DifferencePostprocessor
value1 = FG_amount_bubble_HBS
value2 = FGR
[]
[volume_domain]
type = LayeredElementIntegralMaterialProperty
mat_prop = 1
block = fuel
execute_on = TIMESTEP_END
fuel_pin_geometry = fuel_pin_geometry
[]
[hbs_volume]
type = LayeredElementIntegralMaterialProperty
mat_prop = hbs_volume_fraction
block = fuel
execute_on = TIMESTEP_END
fuel_pin_geometry = fuel_pin_geometry
[]
[hbs_volume_fraction]
type = ParsedPostprocessor
pp_names = 'hbs_volume volume_domain'
expression = 'hbs_volume / volume_domain'
execute_on = TIMESTEP_END
[]
[pulverized_volume]
type = LayeredElementIntegralMaterialProperty
mat_prop = pulverized
block = fuel
execute_on = TIMESTEP_END
fuel_pin_geometry = fuel_pin_geometry
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 125
dt = 1
[]
[Outputs]
exodus = true
csv = true
file_base = uo2_pulverization_phasefield2_transient_FGR_out
[]
(examples/axial_relocation/layered1D/twin_balloon.i)
initial_fuel_density = 10431.0
[GlobalParams]
density = ${initial_fuel_density}
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temp
[]
[Mesh]
coord_type = RZ
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 36
pellet_outer_radius = 4.5e-3
clad_gap_width = 0.0
clad_thickness = 0.56e-3
fuel_height = 3.6
include_plenum = false
pellet_bottom_coor = 0.0
[]
[]
[Variables]
[temp]
initial_condition = 300.0
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 0.07
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * abs(sin(2*pi * y / 3.6))'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '0 15000'
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[outer_fuel_radius]
order = FIRST
family = LAGRANGE
[]
[axial_relocation_strain]
order = CONSTANT
family = MONOMIAL
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temp
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = pin_geometry
strain = finite
block = fuel
eigenstrain_names = 'axial_relocation'
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[layered_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = average_contact_pressure
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = nonlinear
block = fuel
[]
[pulverized]
type = MaterialRealAux
property = pulverized
variable = pulverized
execute_on = timestep_end
block = fuel
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[outer_fuel_radius]
type = Radius
boundary = 10
variable = outer_fuel_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[axial_relocation_strain]
type = MaterialRealAux
variable = axial_relocation_strain
block = fuel
property = axial_relocation_strain
execute_on = 'timestep_end'
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[center]
type = DirichletBC
variable = temp
boundary = 12
value = 300
[]
[clad_inner_surface]
type = DirichletBC
variable = temp
boundary = 5
value = 300
[]
[clad_outer_surface]
type = DirichletBC
variable = temp
boundary = 2
value = 300
[]
[]
[UserObjects]
[pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = timestep_end
boundary = 10
num_layers = 36
[]
[layered_eigenstrain]
type = LayeredAxialRelocationEigenstrainUserObject
pellet_outer_radius = outer_fuel_radius
axial_relocation_object = axial_relocation
penetration = penetration
direction = y
execute_on = 'initial nonlinear'
boundary = 10
layer_bounding_block = fuel
num_layers = 36
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial nonlinear'
boundary = 5
layer_bounding_block = fuel
num_layers = 36
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'initial nonlinear'
boundary = 5
layer_bounding_block = fuel
num_layers = 36
[]
[average_outer_fuel_radius]
type = LayeredSideAverage
variable = outer_fuel_radius
direction = y
execute_on = 'initial nonlinear'
boundary = 10
num_layers = 36
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial nonlinear'
block = fuel
num_layers = 36
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
fuel_pin_geometry = pin_geometry
variable = pulverized
direction = y
execute_on = 'initial nonlinear'
block = fuel
num_layers = 36
[]
[axial_relocation]
type = AxialRelocationUserObject
direction = y
num_layers = 36
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = pin_geometry
fragment_packing_fraction = 0.75 # Set to force overall packing fraction to be 0.75
pulver_packing_fraction = 0.75 # Set to force overall packing fraction to be 0.75
pulver_characteristic_length = 0.0001
nonrelocatable_fuel_fraction = 0.01
execute_on = 'initial nonlinear'
[]
[]
[Materials]
[fuel_pulverization]
type = UO2Pulverization
burnup = burnup
block = fuel
temperature = temp
layered_average_contact_pressure = layered_average_contact_pressure
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 3.0
specific_heat = 260.0
[]
[axial_relocation_strain]
type = UO2AxialRelocationEigenstrain
block = fuel
axial_relocation_eigenstrain_object = layered_eigenstrain
eigenstrain_name = axial_relocation
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[fuel_density]
type = StrainAdjustedDensity
block = fuel
strain_free_density = ${initial_fuel_density}
[]
[clad_density]
type = StrainAdjustedDensity
block = clad
strain_free_density = 6551.0
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[num_lin_it]
type = NumLinearIterations
[]
[num_nonlin_it]
type = NumNonlinearIterations
[]
[tot_lin_it]
type = CumulativeValuePostprocessor
postprocessor = num_lin_it
[]
[tot_nonlin_it]
type = CumulativeValuePostprocessor
postprocessor = num_nonlin_it
[]
[alive_time]
type = PerfGraphData
section_name = Root
data_type = TOTAL
[]
[]
[VectorPostprocessors]
[mass_fraction]
type = LineValueSampler
start_point = '0 0.05 0'
end_point = '0 3.55 0'
num_points = 36
sort_by = y
variable = layered_mass_fraction
outputs = mass_fraction
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew '
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -ksp_gmres_restart'
petsc_options_value = 'lu superlu_dist 51'
l_max_its = 60
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
dt = 2
start_time = 0.0
end_time = 100
[]
[Outputs]
perf_graph = true
exodus = true
[mass_fraction]
type = CSV
execute_on = 'final'
create_final_symlink = true
[]
[]
(test/tests/axial_relocation/ad_uo2_pulverization_mesoscale.i)
# This file is to test the mesoscale-informed pulverization criterion for UO2 fuel.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 900 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 110. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. This material property is output to the exodus file for this test.
# At each time step, the porosity in the HBS region is calculated at each radial
# position using the correlation due to Kampf in the UO2Thermal material.
# The porosity, along with the grain boundary strength and hydrostatic stress, are
# used to calculate the critical pressure for grain boundary fracture by the
# UO2PulverizationMesoscale material. The current pressure of the most likely bubble
# size is compared to the critical pressure to determine whether pulverization has
# occurred at each quadrature point.
# Based upon the conditions and threshold given above at t = 110 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 900, 900+(t-100)*200)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = ADMaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = ADUO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
hbs_model = true
hbs_material = hbs_formation
[]
[uo2pulverizationmesoscale]
type = ADUO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
outputs = exodus
[]
[dummy_stress]
type = ADGenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-1e7 -1e7 -1e7 0 0 0'
[]
[fuel_thermal]
type = ADUO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = ADHighBurnupStructureFormation
block = fuel
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = Newton
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 110
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/packing_fraction.i)
# The purpose of this test is to calculate the effective packing fraction of crumbled
# fuel that is a mixture of larger fragments and smaller pulvers. A linearly varying
# burnup is applied through the radius of 5 axial fuel slices which are modeled with
# cladding of 0.56 mm with an outer fuel radius of 4.5 mm and slice height of 0.1 m.
# Ten radial finite elements are used. The burnup increases linearly from the fuel
# centerline to the fuel surface but is constant in time.
#
# The fuel temperature is held constant at 1200 K. The burnup function applied corresponds
# to the pulverization profile observed at the end of the uo2_pulverization.i test.
# This yielded a layered pulverized fuel volume of 3.24448e-6 m^3 in each layer.
#
# Given this layered average pulverized fuel volume and using the defaults of the
# AxialRelocationUserObject the effective fuel packing fraction can then be calculated
# by solving the following equation using a Newton iteration scheme:
#
# a^2 + 2Gab + b^2 = 1
#
# where a, b, and G are complex functions of the pulver_packing_fraction,
# fragment_packing_fraction, pulver_characteristic_length, calculated fragment
# characteristic length, pulver mass fraction and fragment mass fraction and
# packing fraction of the mixture. These functions are defined in the theory
# documentation of the AxialRelocationUserObject. A maximum power of 15000 W/m
# is applied to determine the fragment characteristic length.
#
# Using an independent calculation in Microsoft Excel for Mac (included in this
# testing directory) the packing fraction is determined to be 0.828912 for the
# Coindreau model, 0.831398 for the Walton model, and 0.833519 for the Barani model.
# In layers that have not gained or lost mass the the packing fraction is
# changed to 1.0. In layers that have lost mass the packing fraction is
# recalculated based upon the current mass. The verification of packing fraction in
# the layers that have lost mass is completed in the volume correction test.
#
# Examining the output of the layered_packing_fraction AuxVariable confirms
# the result.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temperature
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
fuel_height = 0.5
include_plenum = false
nx_p = 10
clad_gap_width = 0.0
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[layered_packing_fraction]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*100.0/4.275'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '15000 15000'
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * sin(pi * y / 0.5)'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = fuel
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[layered_packing_fraction]
type = AxialRelocationOutputAux
variable = layered_packing_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = PACKING_FRACTION
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12 5 2'
variable = temperature
value = 1200
[]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
burnup = burnup
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial timestep_end'
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[axial_relocation]
type = AxialRelocationUserObject
block = fuel
direction = y
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'initial timestep_end'
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 14
dt = 2
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/uo2_pulverization_mesoscale.i)
# This file is to test the mesoscale-informed pulverization criterion for UO2 fuel.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 900 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 110. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. This material property is output to the exodus file for this test.
# At each time step, the porosity in the HBS region is calculated at each radial
# position using the correlation due to Kampf in the UO2Thermal material.
# The porosity, along with the grain boundary strength and hydrostatic stress, are
# used to calculate the critical pressure for grain boundary fracture by the
# UO2PulverizationMesoscale material. The current pressure of the most likely bubble
# size is compared to the critical pressure to determine whether pulverization has
# occurred at each quadrature point.
# Based upon the conditions and threshold given above at t = 110 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 900, 900+(t-100)*200)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = UO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
hbs_model = true
hbs_material = hbs_formation
[]
[uo2pulverizationmesoscale]
type = UO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
outputs = exodus
[]
[dummy_stress]
type = GenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-1e7 -1e7 -1e7 0 0 0'
[]
[fuel_thermal]
type = UO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = HighBurnupStructureFormation
block = fuel
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 110
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/layered_1D/layered_integral.i)
#
# Mesh has two slices of heights 1 and 9.
# Temperature is set to 10 and 90 on the two slices.
#
# The integral in cylindrical coordinates for the bottom layer given the
# dimensions of the cladding is given by:
#
# int from 2 to 3 of 10 * (2 * pi * r) dr
# = 10 * pi * 3^2 - 10 * pi * 2^2
# = 282.74334 - 125.66371
# = 157.07963
#
# Multiplying by the thickness of the layer (1.0) gives the volume integral of:
# 157.07963
#
# For the top layer the integral is:
# int from 2 to 3 of 90 * (2 * pi * r) dr
# = 90 * pi * 3^2 - 90 * pi * 2^2
# = 2544.69005 - 1130.97336
# = 1413.71669
#
# Multiplying by the thickness of the layer (9.0) gives the volume integral of:
# 12723.45021
#
# These values are obtained by looking at the layered_temperature_sum AuxVariable.
#
[GlobalParams]
order = FIRST
family = LAGRANGE
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
uniform_slice_heights = false
slice_heights = '1.0 9.0'
slices_per_block = 2
include_fuel = false
include_plenum = false
pellet_bottom_coor = 0
pellet_outer_radius = 1.0
clad_gap_width = 1.0
clad_thickness = 1.0
elem_type = EDGE2
[]
[]
[AuxVariables]
[layered_temperature_sum]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[temp1]
type = PiecewiseLinear
x = '0 1'
y = '0 10'
[]
[temp2]
type = PiecewiseLinear
x = '0 1'
y = '0 90'
[]
[]
[Variables]
[temp]
initial_condition = 0
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temp
[]
[]
[AuxKernels]
[layered_temperature_sum]
type = SpatialUserObjectAux
variable = layered_temperature_sum
execute_on = timestep_end
block = clad
user_object = temperature_sum
[]
[]
[BCs]
[temp1]
type = FunctionDirichletBC
boundary = 10003
variable = temp
function = temp1
[]
[temp2]
type = FunctionDirichletBC
boundary = 10023
variable = temp
function = temp2
[]
[]
[Materials]
[heat1]
type = HeatConductionMaterial
block = clad
specific_heat = 1.0
thermal_conductivity = 100000000.0
[]
[density]
type = ParsedMaterial
block = clad
property_name = density
expression = 1.0
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
petsc_options_value = '201 hypre boomeramg 4'
line_search = 'none'
nl_abs_tol = 9e-2
nl_rel_tol = 1e-12
l_tol = 1e-8
l_max_its = 100
start_time = 0.0
dt = 1.0
end_time = 1.0
[]
[UserObjects]
[pin_geometry]
type = Layered1DFuelPinGeometry
include_fuel = false
mesh_generator = layered1D_mesh
[]
[temperature_sum]
type = LayeredVariableIntegral
block = clad
variable = temp
execute_on = timestep_end
direction = y
num_layers = 2
fuel_pin_geometry = pin_geometry
[]
[]
[Outputs]
exodus = true
[]
(examples/axial_relocation/layered1D/single_balloon.i)
initial_fuel_density = 10431.0
[GlobalParams]
density = ${initial_fuel_density}
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temp
[]
[Mesh]
coord_type = RZ
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 36
pellet_outer_radius = 4.5e-3
clad_gap_width = 0.0
clad_thickness = 0.56e-3
fuel_height = 3.6
include_plenum = false
pellet_bottom_coor = 0.0
[]
[]
[Variables]
[temp]
initial_condition = 300.0
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 0.07
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * sin(pi * y / 3.6)'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '0 15000'
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[outer_fuel_radius]
order = FIRST
family = LAGRANGE
[]
[axial_relocation_strain]
order = CONSTANT
family = MONOMIAL
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temp
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = pin_geometry
strain = finite
block = fuel
eigenstrain_names = 'axial_relocation'
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[layered_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = average_contact_pressure
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = nonlinear
block = fuel
[]
[pulverized]
type = MaterialRealAux
property = pulverized
variable = pulverized
execute_on = 'initial timestep_end'
block = fuel
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[outer_fuel_radius]
type = Radius
boundary = 10
variable = outer_fuel_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[axial_relocation_strain]
type = MaterialRealAux
variable = axial_relocation_strain
block = fuel
property = axial_relocation_strain
execute_on = 'timestep_end'
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[center]
type = DirichletBC
variable = temp
boundary = 12
value = 300
[]
[clad_inner_surface]
type = DirichletBC
variable = temp
boundary = 5
value = 300
[]
[clad_outer_surface]
type = DirichletBC
variable = temp
boundary = 2
value = 300
[]
[]
[UserObjects]
[pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial nonlinear'
boundary = 10
num_layers = 36
[]
[layered_eigenstrain]
type = LayeredAxialRelocationEigenstrainUserObject
pellet_outer_radius = outer_fuel_radius
axial_relocation_object = axial_relocation
penetration = penetration
direction = y
execute_on = 'initial nonlinear'
boundary = 10
layer_bounding_block = fuel
num_layers = 36
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial nonlinear'
boundary = 5
layer_bounding_block = fuel
num_layers = 36
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'initial nonlinear'
boundary = 5
layer_bounding_block = fuel
num_layers = 36
[]
[average_outer_fuel_radius]
type = LayeredSideAverage
variable = outer_fuel_radius
direction = y
execute_on = 'initial nonlinear'
boundary = 10
num_layers = 36
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial nonlinear'
block = fuel
num_layers = 36
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
fuel_pin_geometry = pin_geometry
variable = pulverized
direction = y
execute_on = 'initial nonlinear'
block = fuel
num_layers = 36
[]
[axial_relocation]
type = AxialRelocationUserObject
direction = y
num_layers = 36
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = pin_geometry
fragment_packing_fraction = 0.75 # Set to force overall packing fraction to be 0.75
pulver_packing_fraction = 0.75 # Set to force overall packing fraction to be 0.75
pulver_characteristic_length = 0.0001
nonrelocatable_fuel_fraction = 0.01
execute_on = 'initial nonlinear'
[]
[]
[Materials]
[fuel_pulverization]
type = UO2Pulverization
burnup = burnup
block = fuel
temperature = temp
layered_average_contact_pressure = layered_average_contact_pressure
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 3.0
specific_heat = 260.0
[]
[axial_relocation_strain]
type = UO2AxialRelocationEigenstrain
block = fuel
axial_relocation_eigenstrain_object = layered_eigenstrain
eigenstrain_name = axial_relocation
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[fuel_density]
type = StrainAdjustedDensity
block = fuel
strain_free_density = ${initial_fuel_density}
[]
[clad_density]
type = StrainAdjustedDensity
block = clad
strain_free_density = 6551.0
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = 'timestep_end'
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = 'timestep_end'
[]
[num_lin_it]
type = NumLinearIterations
[]
[num_nonlin_it]
type = NumNonlinearIterations
[]
[tot_lin_it]
type = CumulativeValuePostprocessor
postprocessor = num_lin_it
[]
[tot_nonlin_it]
type = CumulativeValuePostprocessor
postprocessor = num_nonlin_it
[]
[alive_time]
type = PerfGraphData
section_name = Root
data_type = TOTAL
[]
[]
[VectorPostprocessors]
[mass_fraction]
type = LineValueSampler
start_point = '0 0.05 0'
end_point = '0 3.55 0'
num_points = 36
sort_by = y
variable = layered_mass_fraction
outputs = mass_fraction
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options = '-snes_ksp_ew '
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -ksp_gmres_restart'
petsc_options_value = 'lu superlu_dist 51'
l_max_its = 60
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
dt = 2
start_time = 0.0
end_time = 100
[]
[Outputs]
perf_graph = true
exodus = true
[mass_fraction]
type = CSV
execute_on = 'final'
create_final_symlink = true
[]
[]
(test/tests/axial_relocation/ad_uo2_pulverization_phasefield2.i)
# This file is to test the phase-field based pulverization criterion for UO2 fuel
# with evolve_bubble_pressure_hbs = true and using the 3D phase field criterion
# for pulverization.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 673.15 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 125. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. This material property is output to the exodus file for this test.
# At each time step, the porosity in the HBS region is calculated at each radial
# position using the correlation due to Kampf in the UO2Thermal material.
# The porosity, along with the hydrostatic stress, are used to calculate the
# critical pressure for grain boundary fracture using data from fits to phase-field
# fracture simulations. The current pressure of the most likely bubble
# size is compared to the critical pressure to determine whether pulverization has
# occurred at each quadrature point.
# Based upon the conditions and threshold given above at t = 110 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 673.15, 673.15+(t-100)*15.5)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = ADMaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = ADUO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
hbs_model = true
hbs_material = hbs_formation
[]
[uo2pulverizationmesoscale]
type = ADUO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
pulverization_criterion_type = phase_field_3D
outputs = exodus
[]
[dummy_stress]
type = ADGenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-1e7 -1e7 -1e7 0 0 0'
[]
[fuel_thermal]
type = ADUO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = ADHighBurnupStructureFormation
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = Newton
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 125
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/axial_relocation_volume_correction.i)
# The purpose of this test is to verify the calculation of the internal gas volume
# in the rod when one or more axial layers have crumbled (accommodated
# additional mass) during axial relocation. This internal volume calculation
# takes into account that in crumbled layers the gas volume is intermixed with
# the porous bed of fuel fragments after the eigenstrain is applied to move the
# mesh to within a small residual gap size fo the inside surface of the cladding.
# In addition, in layers that have lost mass the packing fraction is calculated
# based upon the current mass in the layer via:
#
# phi = (m_frac * m_i) / (rho_f * V_c)
#
# where m_frac is the mass fraction in the layer, m_i is the initial mass in
# the layer, rho_f is the fuel density, and V_c is the internal volume of the
# cladding in the layer.
#
# In order to get the internal gas volume correct the volume of the pellet in
# the layers that have crumbled must be scaled by the packing fraction of that
# layer. This test consists of 5 layers and only the middle layer crumbles and
# experiences relocation. At the end of the simulation the inner cladding radius
# is calculated ot be 4.5e-3 + 0.00052 = 5.02e-3 m. Assuming a residual gap of
# 2.0e-6 m the fuel radius in this layer is 5.02e-3 - 2.0e-6 = 5.018e-3m. In all
# other layers the fuel radius remains as the as fabricated fuel radius (4.5e-3 m).
#
# Equal slice heights of 0.1 m are used giving a total pellet volume without the
# correction of:
#
# V_p = (0.1 * pi) * (4 * 4.5e-3^2 + 5.018e-3^2) = 3.335753e-5 m^3
#
# which is the value reported by the pellet_volume1 postprocessor (the postprocessor
# actually reports the negative of this value because of the direction of the normal
# of the pellet exterior). Adding the clad_volume and pellet_volume1 postprocessors
# give the value of postprocessor gas_volume1.
#
# However, the layer with a fuel radius of 5.018e-3 m must be multiplied by the
# packing fraction of 0.828912. In the layer that has lost mass the new packing
# fraction is given by:
#
# phi = (0.968449 * 0.0663592) / (10431.0 * 0.1 * pi * 4.92069e-3^2) = 0.80993
#
# These two corrections give a total pellet volume of:
#
# V_p = (0.1 * pi) * (3 * 4.5e-3^2 + 0.80993 * 4.5e-3^2 + 0.828912 * 5.018e-3^2)
# = 3.079497e-05 m^3
#
# which is verified to be the negative of the value given by postprocessor
# pellet_volume2. Adding the clad_volume and pellet_volum2 postprocessors gives
# the corrected gas volume given by the gas_volume2 postprocessor.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temperature
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
fuel_height = 0.5
include_plenum = false
nx_p = 10
clad_gap_width = 0.0
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[outer_fuel_radius]
order = FIRST
family = LAGRANGE
[]
[axial_relocation_strain]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*100.0/4.275'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '15000 15000'
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * sin(pi * y / 0.5)'
[]
[gas_volume2]
type = ParsedFunction
expression = 'clad_volume + pellet_volume2'
symbol_names = 'clad_volume pellet_volume2'
symbol_values = 'clad_volume pellet_volume2'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = fuel
eigenstrain_names = 'axial_relocation'
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[outer_fuel_radius]
type = Radius
boundary = 10
variable = outer_fuel_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[axial_relocation_strain]
type = MaterialRealAux
variable = axial_relocation_strain
block = fuel
property = axial_relocation_strain
execute_on = 'nonlinear timestep_end'
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12 5 2'
variable = temperature
value = 1200
[]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
burnup = burnup
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[axial_relocation_strain]
type = UO2AxialRelocationEigenstrain
block = fuel
axial_relocation_eigenstrain_object = layered_eigenstrain
eigenstrain_name = axial_relocation
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[layered_eigenstrain]
type = LayeredAxialRelocationEigenstrainUserObject
pellet_outer_radius = outer_fuel_radius
axial_relocation_object = axial_relocation
penetration = penetration
direction = y
execute_on = 'initial timestep_end'
boundary = 10
layer_bounding_block = fuel
num_layers = 5
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = timestep_end
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[axial_relocation]
type = AxialRelocationUserObject
block = fuel
direction = y
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'initial timestep_end'
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[pellet_volume1]
type = LayeredInternalVolumePostprocessor
boundary = 10
component = 0
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = strain_yy
execute_on = 'initial timestep_end'
[]
[pellet_volume2]
type = LayeredCrumbledInternalVolumePostprocessor
boundary = 10
component = 0
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = strain_yy
axial_relocation_object = axial_relocation
execute_on = 'initial timestep_end'
[]
[clad_volume]
type = LayeredInternalVolumePostprocessor
boundary = 5
component = 0
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = strain_yy
execute_on = 'initial timestep_end'
[]
[gas_volume]
type = LayeredInternalVolumePostprocessor
boundary = 9
component = 0
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = strain_yy
execute_on = 'initial timestep_end'
[]
[gas_volume2]
type = FunctionValuePostprocessor
function = gas_volume2
execute_on = 'initial timestep_end'
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-10
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 14
dt = 2
[]
[Outputs]
exodus = true
hide = penetration
[]
(test/tests/axial_relocation/uo2_pulverization_phasefield2.i)
# This file is to test the phase-field based pulverization criterion for UO2 fuel
# with evolve_bubble_pressure_hbs = true and using the 3D phase field criterion
# for pulverization.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 673.15 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 125. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. This material property is output to the exodus file for this test.
# At each time step, the porosity in the HBS region is calculated at each radial
# position using the correlation due to Kampf in the UO2Thermal material.
# The porosity, along with the hydrostatic stress, are used to calculate the
# critical pressure for grain boundary fracture using data from fits to phase-field
# fracture simulations. The current pressure of the most likely bubble
# size is compared to the critical pressure to determine whether pulverization has
# occurred at each quadrature point.
# Based upon the conditions and threshold given above at t = 110 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 673.15, 673.15+(t-100)*15.5)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = UO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
hbs_model = true
hbs_material = hbs_formation
[]
[uo2pulverizationmesoscale]
type = UO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
pulverization_criterion_type = phase_field_3D
outputs = exodus
[]
[dummy_stress]
type = GenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-1e7 -1e7 -1e7 0 0 0'
[]
[fuel_thermal]
type = UO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = HighBurnupStructureFormation
block = fuel
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 125
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/uo2_pulverization.i)
# The purpose of this test is to calculate the amount of pulverization in
# a high burnup fuel as part of the axial relocation algorithm. In the test 5
# axial fuel slices are modeled without cladding with an outer fuel radius of 4.5 mm
# and slice height of 0.1 m. Ten radial finite elements are used. The burnup
# increases linearly from the fuel centerline to the fuel surface. The burnup also
# increases as a function of time from 0 to 100 MWd/kgU on the fuel surface over 100 seconds.
#
# The fuel temperature is held constant at 1200 K. And a constant contact pressure
# is applied to the fuel surface of 40 MPa.
#
# The threshold for pulverization is given by an empirical temperature threshold
# as a function of burnup. A local burnup of 71 MWd/kgU is required for pulverization
# to begin. At this burnup the temperature threshold is 1193.15 K. The temperature
# threshold linearly decreases to a value of 913.15 K at 94 MWd/kgU after which
# it is constant.
#
# Based upon the conditions and threshold given above at t = 100 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
#
# Using command line arguments another test is run where the contact pressure is
# changed to 60 MPa which precludes pulverization for the duration of that test.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*t/4.275'
[]
[contact_pressure_function]
type = ConstantFunction
value = 40.0e6
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[contact_pressure]
type = FunctionAux
variable = contact_pressure
boundary = 10
function = contact_pressure_function
execute_on = 'initial timestep_end'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial timestep_end'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12'
variable = temperature
value = 1200
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[thermal]
type = HeatConductionMaterial
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial timestep_end'
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 100
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/mass_relocation.i)
# The purpose of this test is to verify the internal loops of the AxialRelocationUserObject
# that keeps track of the mass relocation. A linearly varying burnup is applied through
# the radius of 5 axial fuel slices which are modeled with cladding of 0.56 mm with an outer
# fuel radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface but is
# constant in time. The fuel temperature is held constant at 1200 K and a constant
# contact pressure is applied to the fuel surface of 40 MPa.
#
# The above conditions correspond to the conditions used in the regression test
# packing_fraction.i which verified that an effective packing fraction of 0.828912
# is obtained. Using this packing fraction and applying an axially varying displacement
# on the inner cladding surface in the radial direction described by:
#
# disp_x = 2.0e-5 * t * sin(pi * y / 0.5)
#
# the mass relocation loops are verified. At 24 seconds axial relocation begins.
# The updated mass fraction relative to the initial mass calculated by BISON
# is tabulated below for each of the layers (0, 1, 2, 3, 4) for a total of 5 layers
# for the end of the time step at 26 seconds.
#
# Layer Initial Mass Current Mass Mass Fraction
# (-) (kg) (kg) (-)
# 4 0.066299 0.066299 1.0
# 3 0.066299 0.064207 0.96845
# 2 0.066299 0.068391 1.03155
# 1 0.066299 0.066299 1.0
# 0 0.066299 0.066299 1.0
#
# Using an independent calculation in Microsoft Excel for Mac (included in this
# testing directory) the updated mass fractions are verified to match the results
# of the layered_mass_fraction AuxVariable results at the end of the simulation.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temperature
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
fuel_height = 0.5
include_plenum = false
nx_p = 10
clad_gap_width = 0.0
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*100.0/4.275'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '15000 15000'
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * sin(pi * y / 0.5)'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = fuel
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12 5 2'
variable = temperature
value = 1200
[]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
burnup = burnup
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial timestep_end'
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = 0.0
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[axial_relocation]
type = AxialRelocationUserObject
direction = y
block = fuel
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'initial timestep_end'
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 14
dt = 2
[]
[Outputs]
exodus = true
[]
(test/tests/uo2_transient_fission_gas_release/ad_uo2_pulverization_phasefield2_transient_FGR.i)
# This file is to test the transient fission gas release model that accounts for
# the amount of fission gas released as a result of fuel pulverization. it is
# based on the input file called uo2_pulverization_mesoscale.i, which tests the
# pulverization criteria for UO2 fuel with evolve_bubble_pressure_hbs = true and
# using the 3D phase field criterion for pulverization.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 673.15 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 125. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. A material property uses the local pulverization to compute the
# amount of fission gas released as a results of fuel pulverization.
# This material property is output to the exodus file for this test.
# At each time step, the pulverized material property is computed, as well as
# the bubble radius and amount of fission gas in bubbles. These material property
# are then used to determine the amount of fission gas release due to pulverization.
# This amount predicted by the material block
# UO2PulverizationTransientFissionGasRelease is compared with analytical calculations
# made in the material block fission_gas_released_amount for verification.
# This input is the AD version.
hydrostatic_stress_constant = 1e7
[GlobalParams]
value_range_behavior = WARN
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 900, 900+(t-100)*200)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = ADMaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[UO2PulverizationTransientFissionGasRelease] # moles/m^3
type = ADUO2PulverizationTransientFissionGasRelease
block = fuel
outputs = exodus
[]
[fission_gas_behavior]
type = ADUO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
ig_bubble_model = MECHANISTIC_AAGESEN
hbs_model = true
hbs_material = hbs_formation
pulverization_model = true
pulverization_transient_fission_gas_release_material = UO2PulverizationTransientFissionGasRelease
ig_diff_algorithm = FORMAS
hydrostatic_stress_const = ${hydrostatic_stress_constant}
igdiffcoeff_scalef_HBS = 1e24 # Ensures that all the generated fission gases diffuse from the HBS matrix to the HBS bubbles
[]
[uo2pulverizationmesoscale]
type = ADUO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
pulverization_criterion_type = phase_field_3D
outputs = exodus
[]
[dummy_stress]
type = ADGenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-${hydrostatic_stress_constant} -${hydrostatic_stress_constant} -${hydrostatic_stress_constant} 0 0 0'
[]
[fuel_thermal]
type = ADUO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = ADHighBurnupStructureFormation
block = fuel
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[fission_gas_density_bubble_HBS] # moles/m^3
type = ADParsedMaterial
block = fuel
property_name = 'rho_FG_hbs'
material_property_names = 'atom_per_bubble_GB_HBS bubble_GB_volume_density_HBS'
constant_names = 'Na'
constant_expressions = '6.02214076e23'
expression = 'atom_per_bubble_GB_HBS * bubble_GB_volume_density_HBS / Na'
outputs = exodus
[]
[opened_pore_volume_fraction] # -
type = ADParsedMaterial
block = fuel
property_name = 'f_V_pul'
material_property_names = 'hbs_porosity bubble_radius_GB_HBS'
constant_names = 'fragment_size c_p c_r c_0'
constant_expressions = '5e-5 0.03 5.17 0.02'
expression = 'c_p * hbs_porosity + c_r * bubble_radius_GB_HBS/fragment_size + c_0'
outputs = exodus
[]
[fission_gas_released_amount_analytical] # moles/m^3
type = ADParsedMaterial
block = fuel
property_name = 'fis_gas_rel'
material_property_names = 'f_V_pul rho_FG_hbs pulverized'
expression = 'pulverized * f_V_pul * rho_FG_hbs'
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Postprocessors]
[FG_amount_bubble_HBS]
type = ADLayeredElementIntegralMaterialProperty
mat_prop = rho_FG_hbs
block = fuel
fuel_pin_geometry = fuel_pin_geometry
[]
[FGR_analytical]
type = ADLayeredElementIntegralMaterialProperty
mat_prop = fis_gas_rel
block = fuel
fuel_pin_geometry = fuel_pin_geometry
[]
[FGR]
type = ADLayeredElementIntegralMaterialProperty
mat_prop = gas_concentration_release_pulverization
block = fuel
fuel_pin_geometry = fuel_pin_geometry
[]
[FGR_pps_diff_bison_analytical]
type = DifferencePostprocessor
value1 = FGR_analytical
value2 = FGR
[]
[FG_pps_diff_total_released]
type = DifferencePostprocessor
value1 = FG_amount_bubble_HBS
value2 = FGR
[]
[volume_domain]
type = ADLayeredElementIntegralMaterialProperty
mat_prop = 1
block = fuel
execute_on = TIMESTEP_END
fuel_pin_geometry = fuel_pin_geometry
[]
[hbs_volume]
type = ADLayeredElementIntegralMaterialProperty
mat_prop = hbs_volume_fraction
block = fuel
execute_on = TIMESTEP_END
fuel_pin_geometry = fuel_pin_geometry
[]
[hbs_volume_fraction]
type = ParsedPostprocessor
pp_names = 'hbs_volume volume_domain'
expression = 'hbs_volume / volume_domain'
execute_on = TIMESTEP_END
[]
[pulverized_volume]
type = ADLayeredElementIntegralMaterialProperty
mat_prop = pulverized
block = fuel
execute_on = TIMESTEP_END
fuel_pin_geometry = fuel_pin_geometry
[]
[]
[Executioner]
type = Transient
solve_type = Newton
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 125
dt = 1
[]
[Outputs]
exodus = true
csv = true
file_base = ad_uo2_pulverization_phasefield2_transient_FGR_out
[]
(test/tests/axial_relocation/ad_uo2_pulverization_phasefield.i)
# This file is to test the phase-field based pulverization criterion for UO2 fuel
# with evolve_bubble_pressure_hbs = false and using the 2D phase field criterion
# for pulverization.
# In the test 5 axial fuel slices are modeled without cladding with an outer fuel
# radius of 4.5 mm and slice height of 0.1 m. Ten radial finite elements are used.
# The burnup increases linearly from the fuel centerline to the fuel surface.
# Temperature is held at constant T = 673.15 K from t = 0 to t = 100, followed
# by a ramp in temperature from t = 100 to t = 110. Pulverization will occur
# during the ramp only, in the rim region where a significant amount of high burnup
# structure formation has begun. Local pulverization is tracked with the material
# property pulverized, which is 0 where pulverization has not occured and 1 where
# it has occurred. This material property is output to the exodus file for this test.
# At each time step, the porosity in the HBS region is calculated at each radial
# position using the correlation due to Kampf in the UO2Thermal material.
# The porosity, along with the hydrostatic stress, are used to calculate the
# critical pressure for grain boundary fracture using data from fits to phase-field
# fracture simulations. The current pressure of the most likely bubble
# size is compared to the critical pressure to determine whether pulverization has
# occurred at each quadrature point.
# Based upon the conditions and threshold given above at t = 110 s the outer three
# elements should be completely pulverized. The inner radius of the third element
# is at a radius of 3.150 mm. Therefore the layered averaged pulverized fuel volume
# (in each layer in this case) is analytically determined by:
#
# V_p = pi * L * (R_o^2 - R_p^2)
#
# where L is the slice height (0.1 m), R_o is the outer fuel radius, and R_p is the
# radius into the fuel at which pulverization ends. Therefore:
#
# V_p = pi * (0.1) * (4.5e-3^2 - 3.150e-3^2)
# V_p = 3.24448e-6 m^3 in each layer.
#
# The layered_pulverized_fuel_volume AuxVariable computed by BISON gives
# a layered volume of pulverized fuel as 3.24448e-6 m^3.
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
include_clad = false
fuel_height = 0.5
include_plenum = false
nx_p = 10
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 600
[]
[]
[AuxVariables]
[burnup]
order = FIRST
family = LAGRANGE
[]
[fission_rate]
order = FIRST
family = LAGRANGE
[]
[pulverized_aux]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*1.6*t/4.275'
[]
[temperature_function]
type = ParsedFunction
expression = 'if(t < 100, 673.15, 673.15+(t-100)*15.5)'
[]
[Fiss_func]
type = ParsedFunction
expression = '1.e19'
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[fissionrate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
value = 1
fission_rate_function = Fiss_func
execute_on = 'initial timestep_begin'
[]
[pulverized]
type = ADMaterialRealAux
block = fuel
variable = pulverized_aux
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[]
[BCs]
[temperature]
type = FunctionDirichletBC
boundary = '10 12'
variable = temperature
function = temperature_function
[]
[]
[Materials]
[fission_gas_behavior]
type = ADUO2Sifgrs
block = fuel
temperature = temperature
fission_rate = fission_rate
burnup = burnup
skip_bdr_model = true
hbs_model = true
hbs_material = hbs_formation
evolve_bubble_pressure_hbs = false
[]
[uo2pulverizationmesoscale]
type = ADUO2PulverizationMesoscale
block = fuel
temperature = temperature
output_properties = pulverized
pulverization_criterion_type = phase_field_2D
outputs = exodus
[]
[dummy_stress]
type = ADGenericConstantRankTwoTensor
tensor_name = 'stress'
tensor_values = '-1e7 -1e7 -1e7 0 0 0'
[]
[fuel_thermal]
type = ADUO2Thermal
block = fuel
thermal_conductivity_model = STAICU
hbs_porosity_correction = KAMPF
model_hbs_formation = true
temperature = temperature
burnup_function = burnup_function
output_properties = hbs_porosity
outputs = exodus
[]
[hbs_formation]
type = ADHighBurnupStructureFormation
block = fuel
temperature = temperature
burnup = burnup
threshold_temperature = 1273.15 # default
output_properties = hbs_volume_fraction
outputs = exodus
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
include_clad = false
mesh_generator = layered1D_mesh
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized_aux
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[]
[Executioner]
type = Transient
solve_type = Newton
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 110
dt = 1
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/crumbled_thermal_conductivity.i)
# The purpose of this test is to verify that the thermal conductivity of the fuel
# is properly scaled in regions that have crumbled due to axial relocation. In this
# test at the end of the simulation the middle layer of the 5 (indexed as layer 2)
# has been found to have crumbled (accommodated additional mass). Using the NFIR
# thermal conductivity as the underlying model for the thermal conductivity of the
# fuel which has been verified elsewhere the scaling factor for crumbled fuel is
# calculated.
#
# A constant burnup of 0.07 % FIMA and a constant temperature of 1200 K is applied
# to the fuel. These conditions result in no pulverization of the fuel. For
# simplicity the packing fraction of both fragments and pulvers are set to 0.828912
# To be consistent with the other tests in this directory. The use of a constant
# burnup is to ensure that the thermal conductivity is constant radially. Before
# crumbling the thermal conductivity calculated by the NFIR model is 2.023185.
#
# By examining the thermal_conductivity AuxVariable, and looking at the thermal
# conductivity of the middle layer it is listed as 1.588923 W/m-K. This value
# is obtained by an analytical calculation for the same conditions in the Excel
# spreadsheet included in this directory.
#
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temperature
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
fuel_height = 0.5
include_plenum = false
nx_p = 10
clad_gap_width = 0.0
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[gas_conductivity]
order = FIRST
family = LAGRANGE
[]
[thermal_conductivity]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = '0.07'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '15000 15000'
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * sin(pi * y / 0.5)'
[]
[gas_conductivity_function]
type = ConstantFunction
value = 0.15
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = fuel
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[gas_conductivity]
type = FunctionAux
function = gas_conductivity_function
variable = gas_conductivity
execute_on = 'initial linear'
[]
[th_cond]
type = MaterialRealAux
variable = thermal_conductivity
property = thermal_conductivity
block = fuel
execute_on = 'initial linear'
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12 5 2'
variable = temperature
value = 1200
[]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
burnup = burnup
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[fuel_thermal_crumbled]
type = UO2Thermal
Gd_content = 0.0
block = fuel
burnup = burnup
initial_porosity = 0.05
thermal_conductivity_model = NFIR # NFIR k for UO2
oxy_to_metal_ratio = 2.0
temperature = temperature
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = 'initial timestep_end'
boundary = 10
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[axial_relocation]
type = AxialRelocationUserObject
block = fuel
direction = y
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'initial timestep_end'
fragment_packing_fraction = 0.828912
pulver_packing_fraction = 0.828912
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-8
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 14
dt = 2
[]
[Outputs]
exodus = true
[]
(test/tests/axial_relocation/axial_relocation_eigenstrain.i)
# The purpose of this test is to verify the calculation of the eigenstrain
# applied to the fuel in the event that an axial layer has crumbled (accommodated
# additional mass) during axial relocation in Layered 1D. This eigenstrain is used
# to move the outer radius of the fuel to within a small residual gap size of the
# inside surface of the cladding.
#
# The eigenstrain is calculated as:
#
# epsilon = ln(1.0 + (R_fcurr + g_width - R_fo - g^r) / R_fo)
#
# where R_fcurr is the current outer radius of the pellet in the layer,
# g_width is the current fuel-to-clad gap width, g^r is the residual gap size
# (default of 2.0e-6 m), and R_fo is the fuel radius at the time the fuel begins
# to move to that layer. In this test case since there is no thermal expansion
# or other radial displacements of the fuel, R_fo is the as-fabricated fuel radius.
#
# In this test crumbling of the middle layer of 5 (layer 2 since indexing of
# the layers begins at zero) occurs at the end of the simulation. Since only this
# layer is deemed crumbled it is only this layer to which the eigenstrain is applied.
# At this time the inner cladding radius is calculated to be 4.5e-3 + 0.00052 =
# 5.02e-3 m. Therefore, the axial relocation eigenstrain is calculated to be:
#
# epsilon = ln(1.0 + (5.02e-3 - 4.5e-3 - 2.0e-6) / 4.5e-3)
#
# epsilon = 0.108954
#
# This is verified by checking the value of the axial_relocation_strain column in the
# outputs vector postprocessor.
[GlobalParams]
order = FIRST
family = LAGRANGE
displacements = disp_x
temperature = temperature
[]
[Mesh]
coord_type = RZ
[layered1D_mesh]
type = Layered1DMeshGenerator
elem_type = EDGE2
slices_per_block = 5
pellet_outer_radius = 4.5e-3
fuel_height = 0.5
include_plenum = false
nx_p = 10
clad_gap_width = 0.0
pellet_mesh_density = customize
pellet_bottom_coor = 0.0
[]
patch_update_strategy = auto
[]
[Variables]
[temperature]
order = FIRST
family = LAGRANGE
initial_condition = 1200
[]
[]
[AuxVariables]
[disp_y]
[]
[disp_z]
[]
[burnup]
order = FIRST
family = LAGRANGE
[]
[pulverized]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_contact_pressure]
order = CONSTANT
family = MONOMIAL
[]
[layered_pulverized_fuel_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_burnup]
order = CONSTANT
family = MONOMIAL
[]
[layered_mass_fraction]
order = CONSTANT
family = MONOMIAL
[]
[layered_packing_fraction]
order = CONSTANT
family = MONOMIAL
[]
[inner_clad_radius]
order = FIRST
family = LAGRANGE
[]
[layered_maximum_clad_radius]
order = CONSTANT
family = MONOMIAL
[]
[layered_clad_internal_volume]
order = CONSTANT
family = MONOMIAL
[]
[layered_average_gap_conductivity]
order = CONSTANT
family = MONOMIAL
[]
[outer_fuel_radius]
order = FIRST
family = LAGRANGE
[]
[axial_relocation_strain]
order = CONSTANT
family = MONOMIAL
[]
[gap_thermal_conductivity]
order = CONSTANT
family = MONOMIAL
[]
[strain_yy_0]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[burnup_function]
type = ParsedFunction
expression = 'x*100.0/4.275'
[]
[power]
type = PiecewiseLinear
x = '0 100'
y = '15000 15000'
[]
[clad_displacement_function]
type = ParsedFunction
expression = '2.0e-5 * t * sin(pi * y / 0.5)'
[]
[]
[Kernels]
[heat]
type = HeatConduction
variable = temperature
[]
[]
[Physics]
[SolidMechanics]
[Layered1D]
[gps_fuel]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = fuel
eigenstrain_names = 'axial_relocation'
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[gps_clad]
add_scalar_variables = true
add_variables = true
out_of_plane_strain_name = strain_yy
fuel_pin_geometry = fuel_pin_geometry
strain = finite
block = clad
decomposition_method = EigenSolution
mesh_generator = layered1D_mesh
[]
[]
[]
[]
[AuxKernels]
[burnup]
type = FunctionAux
variable = burnup
function = burnup_function
execute_on = 'initial linear'
[]
[pulverized]
type = MaterialRealAux
block = fuel
variable = pulverized
property = pulverized
execute_on = 'initial nonlinear'
[]
[layered_average_contact_pressure]
type = SpatialUserObjectAux
variable = layered_average_contact_pressure
execute_on = timestep_end
block = fuel
user_object = layered_average_contact_pressure
[]
[layered_pulverized_fuel_volume]
type = SpatialUserObjectAux
variable = layered_pulverized_fuel_volume
execute_on = timestep_end
block = fuel
user_object = layered_pulverized_fuel_volume
[]
[layered_average_burnup]
type = SpatialUserObjectAux
variable = layered_average_burnup
execute_on = timestep_end
block = fuel
user_object = layered_average_burnup
[]
[layered_mass_fraction]
type = AxialRelocationOutputAux
variable = layered_mass_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = MASS_FRACTION
[]
[layered_packing_fraction]
type = AxialRelocationOutputAux
variable = layered_packing_fraction
execute_on = timestep_end
block = fuel
axial_relocation_user_object = axial_relocation
output_option = PACKING_FRACTION
[]
[inner_clad_radius]
type = Radius
boundary = 5
variable = inner_clad_radius
execute_on = 'initial nonlinear'
[]
[outer_fuel_radius]
type = Radius
boundary = 10
variable = outer_fuel_radius
execute_on = 'initial nonlinear'
[]
[layered_maximum_clad_radius]
type = SpatialUserObjectAux
variable = layered_maximum_clad_radius
execute_on = timestep_end
block = fuel
user_object = layered_maximum_clad_radius
[]
[layered_clad_internal_volume]
type = SpatialUserObjectAux
variable = layered_clad_internal_volume
execute_on = timestep_end
block = fuel
user_object = layered_clad_internal_volume
[]
[layered_average_gap_conductivity]
type = SpatialUserObjectAux
variable = layered_average_gap_conductivity
execute_on = timestep_end
block = fuel
user_object = layered_average_gap_conductivity
[]
[axial_relocation_strain]
type = MaterialRealAux
variable = axial_relocation_strain
block = fuel
property = axial_relocation_strain
execute_on = 'nonlinear timestep_end'
[]
[gap_thermal_conductivity]
type = MaterialRealAux
variable = gap_thermal_conductivity
property = gap_conductivity
boundary = 10
execute_on = 'initial linear'
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 5
secondary = 10
penalty = 1e7
formulation = kinematic
model = frictionless
[]
[]
[ThermalContact]
[thermal_contact]
type = GasGapHeatTransfer
variable = temperature
primary = 5
secondary = 10
gap_conductivity = 1
[]
[]
[BCs]
[temperature]
type = DirichletBC
boundary = '10 12 5 2'
variable = temperature
value = 1200
[]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = 12
value = 0.0
[]
[inner_clad_displacement]
type = FunctionDirichletBC
variable = disp_x
boundary = '5'
function = clad_displacement_function
[]
[]
[Materials]
[uo2pulverization]
type = UO2Pulverization
block = fuel
burnup = burnup
layered_average_contact_pressure = layered_average_contact_pressure
temperature = temperature
[]
[fuel_thermal]
type = HeatConductionMaterial
block = fuel
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[fuel_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.e11
poissons_ratio = .345
[]
[fuel_stress]
type = ComputeFiniteStrainElasticStress
block = fuel
[]
[axial_relocation_strain]
type = UO2AxialRelocationEigenstrain
block = fuel
axial_relocation_eigenstrain_object = layered_eigenstrain
eigenstrain_name = axial_relocation
[]
[clad_elasticity_tensor]
type = ComputeIsotropicElasticityTensor
block = clad
youngs_modulus = 7.5e10
poissons_ratio = 0.3
[]
[clad_stress]
type = ComputeFiniteStrainElasticStress
block = clad
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 16.0
specific_heat = 330.0
[]
[]
[UserObjects]
[fuel_pin_geometry]
type = Layered1DFuelPinGeometry
mesh_generator = layered1D_mesh
[]
[layered_average_contact_pressure]
type = LayeredSideAverage
variable = contact_pressure
direction = y
execute_on = timestep_end
boundary = 10
num_layers = 5
[]
[layered_average_gap_conductivity]
type = LayeredSideAverage
variable = gap_thermal_conductivity
direction = y
execute_on = timestep_end
boundary = 10
num_layers = 5
[]
[layered_eigenstrain]
type = LayeredAxialRelocationEigenstrainUserObject
pellet_outer_radius = outer_fuel_radius
axial_relocation_object = axial_relocation
penetration = penetration
direction = y
execute_on = 'initial timestep_end'
boundary = 10
layer_bounding_block = fuel
num_layers = 5
[]
[layered_pulverized_fuel_volume]
type = LayeredVariableIntegral
variable = pulverized
fuel_pin_geometry = fuel_pin_geometry
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_average_burnup]
type = LayeredAverage
variable = burnup
direction = y
execute_on = 'initial timestep_end'
block = fuel
num_layers = 5
[]
[layered_maximum_clad_radius]
type = LayeredNodalExtremeValue
variable = inner_clad_radius
direction = y
execute_on = 'initial timestep_end'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[layered_clad_internal_volume]
type = LayeredInternalVolume
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = 0
direction = y
execute_on = 'timestep_begin final'
boundary = 5
layer_bounding_block = fuel
num_layers = 5
[]
[axial_relocation]
type = AxialRelocationUserObject
block = fuel
direction = y
num_layers = 5
layered_average_burnup = layered_average_burnup
layered_pulverized_fuel_volume = layered_pulverized_fuel_volume
layered_maximum_clad_radius = layered_maximum_clad_radius
layered_clad_internal_volume = layered_clad_internal_volume
max_linear_heat_generation_rate = maximum_power
fuel_pin_geometry = fuel_pin_geometry
execute_on = 'initial timestep_end'
[]
[]
[Postprocessors]
[rod_input_power]
type = FunctionValuePostprocessor
function = power
execute_on = timestep_end
[]
[maximum_power]
type = TimeExtremeValue
postprocessor = rod_input_power
value_type = max
execute_on = timestep_end
[]
[clad_volume]
type = LayeredInternalVolumePostprocessor
addition = 0
boundary = 5
component = 0
execute_on = 'INITIAL LINEAR'
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = strain_yy_0
use_displaced_mesh = true
[]
[pellet_volume]
type = LayeredCrumbledInternalVolumePostprocessor
axial_relocation_object = axial_relocation
boundary = 10
component = 0
execute_on = 'INITIAL LINEAR'
fuel_pin_geometry = fuel_pin_geometry
out_of_plane_strain = strain_yy_0
use_displaced_mesh = true
[]
[gas_volume]
type = LinearCombinationPostprocessor
execute_on = 'INITIAL LINEAR'
pp_coefs = '1 1'
pp_names = 'clad_volume pellet_volume'
[]
[]
[Executioner]
type = Transient
solve_type = PJFNK
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-ksp_gmres_restart'
petsc_options_value = '101'
line_search = 'none'
l_max_its = 100
nl_max_its = 100
nl_rel_tol = 1e-10
nl_abs_tol = 1e-10
l_tol = 1e-5
start_time = 0.0
num_steps = 14
dt = 2
[]
[VectorPostprocessors]
[vpp]
type = LineValueSampler
start_point = '2.25e-3 0.05 0'
end_point = '2.25e-3 0.45 0'
num_points = 5
sort_by = y
variable = 'axial_relocation_strain layered_packing_fraction'
outputs = results
[]
[]
[Outputs]
hide = penetration
[results]
type = CSV
execute_on = final
create_final_symlink = true
[]
[]