- axial_relocation_eigenstrain_objectName of the LayeredAxialRelocationEigenstrainUserObject that contains the axial relocation eigenstrain.
C++ Type:UserObjectName
Controllable:No
Description:Name of the LayeredAxialRelocationEigenstrainUserObject that contains the axial relocation eigenstrain.
- eigenstrain_nameMaterial property name for the eigenstrain tensor computed by this model. IMPORTANT: The name of this property must also be provided to the strain calculator.
C++ Type:std::string
Controllable:No
Description:Material property name for the eigenstrain tensor computed by this model. IMPORTANT: The name of this property must also be provided to the strain calculator.
UO2AxialRelocationEigenstrain
Accounts for the increase in the effective diameter of a crumbled layer of fuel during axial relocation under Loss of Coolant Conditions.
Description
The UO2AxialRelocationEigenstrain computes a strain to be applied in the radial direction in axial layers of fuel that have crumbled determined by the AxialRelocationUserObject. The strain is calculated using the current inner cladding radius and original pellet radius for the layer as a function of azimuthal position. The LayeredAxialRelocationEigenstrainUserObject computes and stores the eigenstrain, and this material reads in the eigenstrain to be applied.
Example Input Syntax
[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
[axial_relocation_strain]
type = UO2AxialRelocationEigenstrain<<<{"description": "Accounts for the increase in the effective diameter of a crumbled layer of fuel during axial relocation under Loss of Coolant Conditions.", "href": "UO2AxialRelocationEigenstrain.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = fuel
axial_relocation_eigenstrain_object<<<{"description": "Name of the LayeredAxialRelocationEigenstrainUserObject that contains the axial relocation eigenstrain."}>>> = layered_eigenstrain
eigenstrain_name<<<{"description": "Material property name for the eigenstrain tensor computed by this model. IMPORTANT: The name of this property must also be provided to the strain calculator."}>>> = axial_relocation
[]
[](test/tests/axial_relocation/axial_relocation_eigenstrain.i)Input Parameters
- axial_directionyCoordinate axis of the axial direction of the fuel stack (0, 1, or 2 for x, y, or z
Default:y
C++ Type:MooseEnum
Options:x, y, z
Controllable:No
Description:Coordinate axis of the axial direction of the fuel stack (0, 1, or 2 for x, y, or z
- base_nameOptional parameter that allows the user to define multiple mechanics material systems on the same block, i.e. for multiple phases
C++ Type:std::string
Controllable:No
Description:Optional parameter that allows the user to define multiple mechanics material systems on the same block, i.e. for multiple phases
- blockThe list of blocks (ids or names) that this object will be applied
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The list of blocks (ids or names) that this object will be applied
- boundaryThe list of boundaries (ids or names) from the mesh where this object applies
C++ Type:std::vector<BoundaryName>
Controllable:No
Description:The list of boundaries (ids or names) from the mesh where this object applies
- computeTrueWhen false, MOOSE will not call compute methods on this material. The user must call computeProperties() after retrieving the MaterialBase via MaterialBasePropertyInterface::getMaterialBase(). Non-computed MaterialBases are not sorted for dependencies.
Default:True
C++ Type:bool
Controllable:No
Description:When false, MOOSE will not call compute methods on this material. The user must call computeProperties() after retrieving the MaterialBase via MaterialBasePropertyInterface::getMaterialBase(). Non-computed MaterialBases are not sorted for dependencies.
- constant_onNONEWhen ELEMENT, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps.When SUBDOMAIN, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps. Evaluations on element qps will be skipped
Default:NONE
C++ Type:MooseEnum
Options:NONE, ELEMENT, SUBDOMAIN
Controllable:No
Description:When ELEMENT, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps.When SUBDOMAIN, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps. Evaluations on element qps will be skipped
- declare_suffixAn optional suffix parameter that can be appended to any declared 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 declared properties. The suffix will be prepended with a '_' character.
Optional 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
- output_propertiesList of material properties, from this material, to output (outputs must also be defined to an output type)
C++ Type:std::vector<std::string>
Controllable:No
Description:List of material properties, from this material, to output (outputs must also be defined to an output type)
- outputsnone Vector of output names where you would like to restrict the output of variables(s) associated with this object
Default:none
C++ Type:std::vector<OutputName>
Controllable:No
Description:Vector of output names where you would like to restrict the output of variables(s) associated with this object
Outputs 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/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
[]
[]
(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/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
[]
(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/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
[]
[]