- temperatureCoupled temperature
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:Coupled temperature
TungstenThermal
Computes the thermal properties of tungsten.
Description
This material calculates the temperature dependent thermal conductivity and isobaric specific heat capacity of tungsten using correlations from NASAGRC (2019).
Example Input Syntax
[Materials<<<{"href": "../../syntax/Materials/index.html"}>>>]
[thermal_properties]
type = TungstenThermal<<<{"description": "Computes the thermal properties of tungsten.", "href": "TungstenThermal.html"}>>>
base_name<<<{"description": "Optional parameter that allows the user to define multiple material systems on the same block, i.e. for multiple phases"}>>> = tungsten
temperature<<<{"description": "Coupled temperature"}>>> = temperature
outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = 'all'
output_properties<<<{"description": "List of material properties, from this material, to output (outputs must also be defined to an output type)"}>>> = 'tungsten_thermal_conductivity tungsten_specific_heat'
[]
[](test/tests/thermalTests/thermalTungsten/heat_exact.i)Input Parameters
- base_nameOptional parameter that allows the user to define multiple 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 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.
- silence_warningsFalseWhether to silence correlation out of bound warnings
Default:False
C++ Type:bool
Controllable:No
Description:Whether to silence correlation out of bound warnings
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
- specific_heat_scale_factor1Optional scaling factor applied to the overall specific heat.
Default:1
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Optional scaling factor applied to the overall specific heat.
- thermal_conductivity_scale_factor1Optional scaling factor applied to the overall thermal conductivity.
Default:1
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Optional scaling factor applied to the overall thermal conductivity.
Advanced: Scaling Factors Parameters
Input Files
- (test/tests/thermalTests/thermalTungsten/heat_derivatives.i)
- (assessment/nitride/PW-CANEL/SNAP50/analysis/PW_SNAP50_UN_Pin_base.i)
- (test/tests/nuclearMaterialUN/tungsten_non_action.i)
- (assessment/nitride/EBRII/SP1/analysis/SP1_base.i)
- (test/tests/nuclearMaterialNTPAction/two_blocks_manual.i)
- (assessment/nitride/MTR/SNAP50/analysis/SNAP50_base.i)
- (test/tests/thermalTests/thermalTungsten/heat_exact.i)
References
- NASAGRC.
Nuclear Thermal Propulsion Materials Data Property Book Revision 2.
Technical Report, National Aeronautics and Space Administration Glenn Research Center, Cleveland, Ohio, 2019.[BibTeX]
@techreport{nasa_ntp_property_book_2019, author = "NASAGRC", address = "Cleveland, Ohio", institution = "National Aeronautics and Space Administration Glenn Research Center", pages = "1-240", title = "{Nuclear Thermal Propulsion Materials Data Property Book Revision 2}", year = "2019" }
(test/tests/thermalTests/thermalTungsten/heat_exact.i)
# This test uses TungstenThermal to calculate the thermal conductivity and
# isobaric specific heat capacity of tungsten at various temperatures ranging
# from 20 to 3600 K. The results are compared to hand calculations contained
# in:
# NASAGRC. Nuclear Thermal Propulsion Materials Data Property Book Revision 2.
# Technical Report, National Aeronautics and Space Administration Glenn
# Research Center, Cleveland, Ohio, 2019.
[Mesh]
[generated_mesh]
type = GeneratedMeshGenerator
dim = 1
[]
[]
[Problem]
solve = false
[]
[AuxVariables]
[temperature]
[]
[]
[AuxKernels]
[temperature_auxkernel]
type = FunctionAux
variable = temperature
function = temperature_function
execute_on = 'initial timestep_end'
[]
[]
[Functions]
[temperature_function]
type = PiecewiseConstant
x = '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34'
y = '20 40 60 80 100 150 200 293 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2200 2400 2600 2800 3000 3200 3400 3600'
[]
[]
[Materials]
[thermal_properties]
type = TungstenThermal
base_name = tungsten
temperature = temperature
outputs = 'all'
output_properties = 'tungsten_thermal_conductivity tungsten_specific_heat'
[]
[]
[Executioner]
type = Transient
dt = 1
num_steps = 35
[]
[Postprocessors]
[a_temperature]
type = ElementAverageValue
variable = temperature
[]
[b_thermal_conductivity]
type = ElementAverageValue
variable = tungsten_thermal_conductivity
[]
[c_specific_heat]
type = ElementAverageValue
variable = tungsten_specific_heat
[]
[]
[Outputs]
csv = true
[]
(test/tests/thermalTests/thermalTungsten/heat_derivatives.i)
# This test uses TungstenThermal to calculate the derivatives of the thermal
# conductivity and isobaric specific heat capacity with respect to temperature
# for temperatures ranging from 20 to 3600 K. HeatConduction kernels are used
# to add the contributions of these derivatives to the Jacobian calculated by
# BISON, which is then compared to values calculated by Petsc using finite
# difference.
[Mesh]
[generated_mesh]
type = GeneratedMeshGenerator
dim = 1
[]
uniform_refine = 5
[]
[Variables]
[temperature]
[InitialCondition]
type = FunctionIC
function = temperature_function
[]
[]
[]
[Kernels]
[thermal_conductivity_derivative_contribution]
type = HeatConduction
variable = temperature
diffusion_coefficient = tungsten_thermal_conductivity
diffusion_coefficient_dT = tungsten_thermal_conductivity_dT
[]
[specific_heat_derivative_contribution]
type = HeatConduction
variable = temperature
diffusion_coefficient = tungsten_specific_heat
diffusion_coefficient_dT = tungsten_specific_heat_dT
[]
[]
[Functions]
[temperature_function]
type = ParsedFunction
expression = '20 + (3600 - 20) * x'
[]
[]
[Materials]
[thermal_properties]
type = TungstenThermal
base_name = tungsten
temperature = temperature
[]
[]
[Executioner]
type = Steady
solve_type = NEWTON
nl_max_its = 1
[]
(assessment/nitride/PW-CANEL/SNAP50/analysis/PW_SNAP50_UN_Pin_base.i)
[GlobalParams]
order = FIRST
energy_per_fission = ${energy_per_fission}
displacements = 'disp_x disp_y'
value_range_behavior = IGNORE
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temperature'
[]
[Mesh]
coord_type = RZ
[smeared_pellet_mesh]
type = FuelPinMeshGenerator
clad_thickness = ${cladding_liner_thickness}
pellet_outer_radius = ${fuel_radius}
pellet_height = ${fuel_height}
clad_top_gap_height = ${plenum_height}
clad_gap_width = ${cladding_gap_width}
bottom_clad_height = ${cladding_bottom_top_plug_length}
top_clad_height = ${cladding_bottom_top_plug_length}
clad_bot_gap_height = ${gap_bottom_length}
liner_thickness = ${liner_thickness}
clad_mesh_density = customize
pellet_mesh_density = customize
nx_p = 6
ny_p = 260
nx_c = 4
ny_c = 260
ny_cu = 3
ny_cl = 3
nx_liner = 2
pellet_quantity = 1
elem_type = QUAD4
[]
patch_size = 30
patch_update_strategy = auto
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
initial_condition = ${initial_temperature}
[]
[]
[Functions]
[power_history]
type = PiecewiseLinear
x = '0 ${time_end_ramp_up} ${time_start_ramp_down} ${time_end_ramp_down}'
y = '0 ${avg_lin_power} ${avg_lin_power} 0'
[]
[coolant_wall_temperature]
type = ParsedFunction
expression = 'if(t<${time_end_ramp_up}, ${initial_temperature} + t*(${a}*(y-${x_0})^2 + ${b} - ${initial_temperature})/(${time_end_ramp_up}),if(t<${time_start_ramp_down},${a}*(y-${x_0})^2 + ${b}, if(t<${time_end_ramp_down}, ${a}*(y-${x_0})^2 + ${b} + (t-${time_start_ramp_down})*(${initial_temperature}-(${a}*(y-${x_0})^2 + ${b}))/(${time_end_ramp_down}-${time_start_ramp_down}),${initial_temperature}))) '
[]
[coolant_press_ramp]
type = PiecewiseLinear
x = '0 ${run_time}'
y = '${coolant_pressure} ${coolant_pressure}' # unknown, Li coolant
[]
[plenum_pressure]
type = ConstantFunction
value = ${initial_plenum_pressure}
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = pellet
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress creep_strain_xx creep_strain_yy creep_strain_zz elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
extra_vector_tags = 'ref'
eigenstrain_names = 'fuel_thermal_expansion solid_swelling_eigenstrain'
temperature = temperature
[]
[clad]
block = clad
strain = FINITE
incremental = true
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
extra_vector_tags = 'ref'
eigenstrain_names = 'clad_thermal_expansion'
temperature = temperature
[]
[liner]
block = liner
strain = FINITE
incremental = true
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
extra_vector_tags = 'ref'
eigenstrain_names = 'liner_thermal_expansion'
temperature = temperature
[]
[]
[Kernels]
[gravity]
type = Gravity
variable = disp_y
value = -9.81
extra_vector_tags = 'ref'
block = 'pellet liner clad'
[]
[heat]
type = HeatConduction
variable = temperature
extra_vector_tags = 'ref'
block = 'pellet liner clad'
[]
[heat_ie]
type = HeatConductionTimeDerivative
variable = temperature
extra_vector_tags = 'ref'
block = 'pellet liner clad'
[]
[heat_source]
type = FissionRateHeatSource
variable = temperature
fission_rate = fission_rate
extra_vector_tags = 'ref'
energy_deposited_in_fuel = 0.95
block = 'pellet'
[]
[]
[ThermalContactMortar]
[thermal_contact]
secondary_variable = temperature
primary_boundary = '5' # clad_inside_right
secondary_boundary = '10' # pellet_outer_radial_surface
initial_moles = initial_moles # coupling to a postprocessor which supplies the initial plenum/gap gas mass
[]
[]
[Contact]
[mechanical]
model = frictionless
formulation = mortar
primary = 5 # clad_inside_right
secondary = 10 # pellet_outer_radial_surface
c_normal = 1e+11
correct_edge_dropping = true
[]
[]
[BCs]
[no_x_all]
type = DirichletBC
variable = disp_x
boundary = '12' # centerline
value = 0.0
[]
[no_y_clad]
type = DirichletBC
variable = disp_y
boundary = '1' # clad_outside_bottom
value = 0.0
[]
[no_y_fuel]
type = DirichletBC
variable = disp_y
boundary = '20' # bottom_of_bottom_pellet
value = 0.0
[]
[Pressure]
[coolantPressure]
boundary = '1 2 3' # clad_outside_bottom, clad_outside_right, clad_outside_top
function = coolant_press_ramp
[]
[]
[PlenumPressure] # apply plenum pressure on clad inner walls and pellet surfaces
[plenumPressure]
boundary = 9 # inside_surfaces
initial_pressure = ${initial_plenum_pressure}
startup_time = 0
R = ${R}
initial_temperature = ${initial_temperature}
temperature = ave_temperature_interior # coupling to post processor to get gas temperature approximation
output_initial_moles = initial_moles # coupling to post processor to get initial fill gas mass
volume = gas_volume # coupling to post processor to get gas volume
output = plenum_pressure # coupling to post processor to output plenum/gap pressure
[]
[]
[clad_outer_temperature]
type = FunctionDirichletBC
boundary = '1 2 3' # clad_outside_bottom, clad_outside_right, clad_outside_top
function = coolant_wall_temperature
variable = temperature
[]
[]
[Materials]
[porosity]
type = GenericConstantMaterial
block = pellet
prop_names = porosity
prop_values = ${initial_porosity}
outputs = all
[]
[fission_rate]
type = FissionRate
block = pellet
rod_linear_power = power_history
axial_power_profile = 1
pellet_radius = ${fuel_radius}
outputs = all
[]
[fuel_thermal]
type = MNThermal
block = pellet
temperature = temperature
porosity = porosity
outputs = all
[]
[fuel_elasticity_tensor]
block = pellet
type = MNElasticityTensor
temperature = temperature
porosity = porosity
output_properties = 'youngs_modulus poissons_ratio'
outputs = all
[]
[fuel_thermal_expansion]
block = pellet
type = MNThermalExpansionEigenstrain
eigenstrain_name = fuel_thermal_expansion
stress_free_temperature = ${stress_free_temperature_MN}
temperature = temperature
[]
[fuel_creep]
block = pellet
type = MNCreepUpdate
max_inelastic_increment = 1e-4
temperature = temperature
porosity = porosity
fission_rate = fission_rate
outputs = all
[]
[burnup]
type = Burnup
block = pellet
atoms_heavy_metal_per_volume = ${atoms_heavy_metal_per_volume}
outputs = all
[]
[burnup_swelling]
type = BurnupDependentEigenstrain
block = pellet
eigenstrain_name = 'solid_swelling_eigenstrain'
burnup = burnup
outputs = all
[]
[fuel_radial_return_stress]
block = pellet
type = ComputeMultipleInelasticStress
inelastic_models = 'fuel_creep'
[]
[fuel_density]
block = pellet
type = StrainAdjustedDensity
strain_free_density = ${density}
[]
[clad_elasticity_tensor]
block = clad
type = ComputeIsotropicElasticityTensor
youngs_modulus = 68.9e9
poissons_ratio = 0.4
[]
[clad_thermal_expansion]
block = clad
type = ComputeThermalExpansionEigenstrain
eigenstrain_name = clad_thermal_expansion
thermal_expansion_coeff = 7.54e-6
stress_free_temperature = ${stress_free_temperature_NbZr}
temperature = temperature
[]
[clad_stress]
block = clad
type = ComputeFiniteStrainElasticStress
[]
[clad_thermal]
type = HeatConductionMaterial
block = clad
thermal_conductivity = 41.9
specific_heat = 270
[]
[clad_density]
block = clad
type = StrainAdjustedDensity
strain_free_density = 8590
[]
[liner_elasticity_tensor]
block = liner
type = TungstenElasticityTensor
temperature = temperature
[]
[liner_thermal_expansion]
block = liner
type = TungstenThermalExpansionEigenstrain
eigenstrain_name = liner_thermal_expansion
stress_free_temperature = ${stress_free_temperature_W}
temperature = temperature
[]
[liner_stress]
block = liner
type = ComputeFiniteStrainElasticStress
[]
[liner_thermal]
block = liner
type = TungstenThermal
temperature = temperature
[]
[liner_density]
block = liner
type = StrainAdjustedDensity
strain_free_density = 19300
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
min_damping = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
min_damping = 1e-4
[]
[temperature]
type = MaxIncrement
variable = temperature
max_increment = 50
min_damping = 1e-4
[]
[]
[Executioner]
type = Transient
# With mortar contact
solve_type = 'PJFNK'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15'
snesmf_reuse_base = false
line_search = 'none'
l_max_its = 60
nl_max_its = 20
nl_rel_tol = 5e-6
nl_abs_tol = 5e-9
end_time = ${run_time}
dtmin = 1
dtmax = 5e4
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = time_step_limit
force_step_every_function_point = true
timestep_limiting_function = power_history
dt = 10
[]
[]
[Postprocessors]
# elemental temperatures
[temperature_fuel_avg]
type = ElementAverageValue
variable = temperature
block = pellet
execute_on = 'initial timestep_end'
[]
[temperature_fuel_max]
type = ElementExtremeValue
variable = temperature
block = pellet
[]
[temperature_fuel_min]
type = ElementExtremeValue
variable = temperature
block = pellet
value_type = min
[]
[temperature_clad_avg]
type = ElementAverageValue
variable = temperature
block = clad
execute_on = 'initial timestep_end'
[]
[temperature_clad_max]
type = ElementExtremeValue
variable = temperature
block = clad
[]
[temperature_clad_min]
type = ElementExtremeValue
variable = temperature
block = clad
value_type = min
[]
[temperature_liner_avg]
type = ElementAverageValue
variable = temperature
block = liner
execute_on = 'initial timestep_end'
[]
[temperature_liner_max]
type = ElementExtremeValue
variable = temperature
block = liner
[]
[temperature_liner_min]
type = ElementExtremeValue
variable = temperature
block = liner
value_type = min
[]
[ave_temperature_interior] # average temperature of the cladding interior and all pellet exteriors
type = SideAverageValue
boundary = '9' # inside_surfaces
variable = temperature
execute_on = 'initial linear'
[]
[temperature_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = '12' # centerline
variable = temperature
[]
[temperature_fuel_centerline_max]
type = NodalExtremeValue
boundary = '12' # centerline
variable = temperature
[]
[temperature_fuel_centerline_min]
type = NodalExtremeValue
boundary = '12' # centerline
variable = temperature
value_type = min
[]
[temperature_fuel_surface_avg]
type = SideAverageValue
boundary = '10' # pellet_outer_radial_surface
variable = temperature
[]
[temperature_fuel_surface_max]
type = NodalExtremeValue
boundary = '10' # pellet_outer_radial_surface
variable = temperature
[]
[temperature_fuel_surface_min]
type = NodalExtremeValue
boundary = '10' # pellet_outer_radial_surface
variable = temperature
value_type = min
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = pellet
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = pellet
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = pellet
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = pellet
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = pellet
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = pellet
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = pellet
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = pellet
[]
[strain_axial_fuel_avg]
type = ParsedPostprocessor
pp_names = 'disp_y_fuel_top_surface_avg disp_y_fuel_bottom_surface_avg'
expression = '(disp_y_fuel_top_surface_avg - disp_y_fuel_bottom_surface_avg) / ${fuel_height}'
[]
[disp_y_fuel_top_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = '11' # top_of_top_pellet
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = '11' # top_of_top_pellet
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = '20' # bottom_of_bottom_pellet
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = '20' # bottom_of_bottom_pellet
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = '10' # pellet_outer_radial_surface
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = '10' # pellet_outer_radial_surface
[]
[burnup_avg]
type = ElementAverageValue
block = pellet
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = pellet
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = pellet
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = pellet
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = pellet
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = pellet
[]
[swelling_dia_percent]
type = ParsedPostprocessor
pp_names = 'disp_x_fuel_radial_surface_avg'
expression = 'disp_x_fuel_radial_surface_avg / 3.14159 / ${fuel_radius} * 100'
[]
[fuel_volume]
type = VolumePostprocessor
block = pellet
execute_on = 'TIMESTEP_END INITIAL'
use_displaced_mesh = true
[]
[swelling_vol_percent]
type = ParsedPostprocessor
pp_names = 'fuel_volume'
expression = '(fuel_volume - ${fuel_volume}) / ${fuel_volume} * 100'
[]
[gas_volume]
type = InternalVolume
boundary = '9' # inside_surfaces
execute_on = 'initial linear'
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
outputs = none
block = 'pellet'
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[]
[PerformanceMetricOutputs]
outputs = 'performance_metrics performance_metrics_sync exodus console base_out'
[]
[Outputs]
perf_graph = true
csv = true
sync_times = '1e2 1e3 5e3 1e4 5e4 1e5 5e5 1e6 2.5e6 5e6 1e7 2e7 3e7 ${fparse run_time -1e3} ${run_time}'
file_base = '${group_name}_nominal_Pin'
[base_out]
type = CSV
file_base = '${group_name}_Pin_base_out'
show = 'burnup_max temperature_fuel_avg temperature_clad_avg temperature_liner_avg ave_temperature_interior swelling_vol_percent disp_x_fuel_radial_surface_max'
sync_only = true
[]
[checkpoint]
type = Checkpoint
time_step_interval = 10
[]
[exodus]
type = Exodus
[]
[sync]
type = CSV
file_base = '${group_name}_nominal_Pin_sync'
sync_only = true
[]
[console]
type = Console
show = 'time_step_size temperature_fuel_avg temperature_fuel_centerline_max stress_vonmises_fuel_max stress_hydro_fuel_max stress_hydro_fuel_min strain_axial_fuel_avg burnup_avg fission_rate_avg porosity_fuel_avg time_step_limit disp_x_fuel_radial_surface_max disp_x_fuel_radial_surface_avg swelling_dia_percent swelling_vol_percent fuel_volume'
[]
[performance_metrics]
type = CSV
file_base = '${group_name}_nominal_performance_metrics_Pin'
show = 'simulation_alive_time number_linear_iterations number_nonlinear_iterations time_step_size total_linear_iterations total_nonlinear_iterations physical_memory_use number_dofs number_nonlinear_variables residual_compute_time jacobian_compute_time'
[]
[performance_metrics_sync]
type = CSV
sync_only = true
file_base = '${group_name}_nominal_performance_metrics_Pin_sync'
show = 'simulation_alive_time number_linear_iterations number_nonlinear_iterations time_step_size total_linear_iterations total_nonlinear_iterations physical_memory_use number_dofs number_nonlinear_variables residual_compute_time jacobian_compute_time'
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temperature'
show_var_residual_norms = true
[]
(test/tests/nuclearMaterialUN/tungsten_non_action.i)
[GlobalParams]
displacements = disp_x
temperature = temperature
[]
[Mesh]
use_displaced_mesh = false
[line]
type = GeneratedMeshGenerator
dim = 1
[]
[]
[Variables]
[temperature]
initial_condition = 300
[]
[]
[Functions]
[temp_ramp]
type = PiecewiseLinear
x = '0.0 1.0 2.0 3.0 4.0'
y = '300 300 600 900 1200'
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
block = 0
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
variable = temperature
block = 0
[]
[]
[BCs]
[VariableT]
type = ADFunctionDirichletBC
boundary = 'left right'
variable = temperature
function = temp_ramp
[]
[disp_x]
type = ADDirichletBC
boundary = left
variable = disp_x
value = 0.0
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[liner]
block = 0
strain = SMALL
incremental = true
add_variables = true
automatic_eigenstrain_names = true
use_automatic_differentiation = true
[]
[]
[Materials]
[liner_elasticity_tensor]
block = 0
type = ADTungstenElasticityTensor
temperature = temperature
[]
[liner_thermal_expansion]
block = 0
type = ADTungstenThermalExpansionEigenstrain
eigenstrain_name = liner_thermal_strain
stress_free_temperature = 300
temperature = temperature
outputs = 'all'
[]
[liner_stress]
block = 0
type = ADComputeFiniteStrainElasticStress
[]
[liner_thermal]
block = 0
type = ADTungstenThermal
temperature = temperature
[]
[liner_density]
block = 0
type = ADStrainAdjustedDensity
strain_free_density = 19300
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
dt = 1
num_steps = 2
[]
[Postprocessors]
[average_fuel_T]
type = ElementAverageValue
variable = temperature
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
exodus = true
[]
(assessment/nitride/EBRII/SP1/analysis/SP1_base.i)
fuel_radius = '${fparse fuel_diameter / 2}' # m
fuel_volume = '${fparse pi * fuel_radius^2 * fuel_height}' # m
cladding_radial_gap = '${fparse diametral_gap / 2}'
pin_height = ${fparse fuel_height + plenum_height + 2 * cladding_bottom_top_plug_length} # m
R = 8.31446261815324
A_U = 0.238 # kg/mol
A_Pu = 0.239 # kg/mol
A_N = 0.014 # kg/mol
avo = 6.0221408e23 # atoms per mole
th_density = 14400 # kg/m3
initial_porosity = '${fparse 1.0 - fraction_th_density}'
density = '${fparse fraction_th_density * th_density}' # kg/m3
M_avg = '${fparse x_N * A_N + x_Pu * A_Pu + (1.0 - x_Pu) * A_U}' # kg / mol
atoms_heavy_metal_per_volume = '${fparse density / M_avg * avo}' # mol / m3
# Power history
avg_lin_power = '${fparse specific_power * density * pi * fuel_radius^2}' # W/m
time_end_ramp_up = '${fparse 5 * 3600}' # s, arbitrary 5 hour ramp
time_start_ramp_down = '${fparse time_end_ramp_up + run_time}' # s
time_end_ramp_down = '${fparse time_start_ramp_down + time_end_ramp_up}' # s
total_time = '${fparse time_end_ramp_down + 3600}' # s
[GlobalParams]
order = FIRST
energy_per_fission = 3.412e-11 # J/fission
displacements = 'disp_x disp_y'
value_range_behavior = IGNORE
min_damping = 1e-4
volumetric_locking_correction = true
absolute_value_vector_tags = ref
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temperature'
[]
[Mesh]
coord_type = RZ
[smeared_pellet_mesh]
type = FuelPinMeshGenerator
clad_thickness = ${cladding_thickness}
pellet_outer_radius = ${fuel_radius}
pellet_height = ${fuel_height}
clad_top_gap_height = ${plenum_height}
clad_gap_width = ${cladding_radial_gap}
top_clad_height = ${cladding_bottom_top_plug_length}
bottom_clad_height = ${cladding_bottom_top_plug_length}
clad_bot_gap_height = ${gap_bottom_length}
liner_thickness = ${liner_thickness}
clad_mesh_density = customize
pellet_mesh_density = customize
nx_p = 6
ny_p = 150
nx_c = 4
ny_c = 150
ny_cu = 3
ny_cl = 3
nx_liner = 2
pellet_quantity = 1
elem_type = QUAD4
[]
patch_size = 30
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
initial_condition = ${initial_temperature}
[]
[]
[Functions]
[power_history]
type = PiecewiseLinear
x = '0 ${time_end_ramp_up} ${time_start_ramp_down} ${time_end_ramp_down}'
y = '0 ${avg_lin_power} ${avg_lin_power} 0'
[]
[axial_power_function] # estimated, actual peaking unknown
type = PowerPeakingFunction
fit = EBRII_ROW_3
pellet_length = '${fuel_height}'
pellet_y_start = ${fparse cladding_bottom_top_plug_length + gap_bottom_length}
[]
[coolant_wall_temperature]
# This is fit from coolant wall temperature provided in Dutt, Cox, Millhollen, "Performance of Refractory Alloy-clad Fuel Pins" (1984)
type = ParsedFunction
expression = 'full_temp := 2.46e7*y^4 - 4.836e6*y^3 + 1.09e5*y^2 + 1.19e4*y + 1.13e3;
if(t < ${time_end_ramp_up}, ${initial_temperature} + t * (full_temp - ${initial_temperature}) / (${time_end_ramp_up}), if(t < ${time_start_ramp_down}, full_temp, if(t < ${time_end_ramp_down}, full_temp + (t - ${time_start_ramp_down}) * (${initial_temperature} - full_temp) / (${time_end_ramp_down} - ${time_start_ramp_down}), ${initial_temperature})))'
[]
[gas_diffusivity_function]
# x corresponds to temperature [K] and y corresponds to fission rate [fsn/m3/s]
type = ParsedFunction
expression = 'kBT := 1.380649e-23 / 1.602176634e-19 * x;
D1 := ${xe_D10} * exp(-1.0 * ${xe_Q1} / kBT);
D2 := (y / 1e19)^0.5 * ${xe_D20} * exp(${xe_D2Q1} / kBT + ${xe_D2Q2} / kBT / kBT);
D3 := 1.85e-39 * y;
D1 * ${D1_xe_scalar} + D2 * ${D2_xe_scalar} + D3 * ${D3_xe_scalar}'
[]
[vacancy_diffusivity_function]
# x corresponds to temperature [K] and y corresponds to fission rate [fsn/m3/s]
type = ParsedFunction
expression = 'kBT := 1.380649e-23 / 1.602176634e-19 * x;
D1 := ${D10} * exp(-1.0 * ${Q1} / kBT);
D2 := (y / 1e19)^0.5 * ${D20} * exp(${D2Q1} / kBT + ${D2Q2} / kBT / kBT);
D2b := (y / 1e19)^0.5 * ${D2b0} * exp(${D2bQ1} / kBT + ${D2bQ2} / kBT / kBT);
D1 * ${D1_scalar} + (D2 + D2b) * ${D2_scalar}'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = pellet
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress creep_strain_xx creep_strain_yy creep_strain_zz elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
eigenstrain_names = 'fuel_thermal_expansion solid_swelling_eigenstrain gaseous_swelling_eigenstrain'
temperature = temperature
use_automatic_differentiation = true
[]
[clad]
block = clad
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
eigenstrain_names = 'clad_thermal_expansion'
temperature = temperature
use_automatic_differentiation = true
[]
[liner]
block = liner
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
eigenstrain_names = 'liner_thermal_expansion'
temperature = temperature
use_automatic_differentiation = true
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
block = 'pellet liner clad'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
variable = temperature
block = 'pellet liner clad'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temperature
fission_rate = fission_rate
energy_deposited_in_fuel = 0.95
block = 'pellet'
[]
[]
[ThermalContactMortar]
[thermal_contact]
secondary_variable = temperature
primary_boundary = clad_inside_right
secondary_boundary = pellet_outer_radial_surface
initial_moles = initial_moles
gas_released = fg_released
jump_distance_model = LANNING
plenum_pressure = plenum_pressure
contact_pressure = mechanical_normal_lm
use_automatic_differentiation = true
# use mechanical contact subdomains
primary_subdomain = mechanical_primary_subdomain
secondary_subdomain = mechanical_secondary_subdomain
[]
[]
[Contact]
[mechanical]
model = frictionless
formulation = mortar
primary = clad_inside_right
secondary = pellet_outer_radial_surface
c_normal = 1e+11
correct_edge_dropping = true
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = centerline
value = 0.0
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = clad_outside_bottom
value = 0.0
[]
[no_y_fuel]
type = ADDirichletBC
variable = disp_y
boundary = bottom_central_pellet_node
value = 0.0
[]
[Pressure]
[coolantPressure]
boundary = 'clad_outside_bottom clad_outside_right clad_outside_top'
function = ${coolant_pressure}
use_automatic_differentiation = true
[]
[]
[PlenumPressure] # apply plenum pressure on clad inner walls and pellet surfaces
[plenumPressure]
boundary = inside_surfaces
initial_pressure = ${initial_plenum_pressure}
startup_time = 0
R = ${R}
initial_temperature = ${initial_temperature}
temperature = ave_temperature_interior # coupling to post processor to get gas temperature approximation
output_initial_moles = initial_moles # coupling to post processor to get initial fill gas mass
volume = gas_volume # coupling to post processor to get gas volume
output = plenum_pressure # coupling to post processor to output plenum/gap pressure
use_automatic_differentiation = true
[]
[]
[clad_outer_temperature]
type = ADFunctionDirichletBC
boundary = 'clad_outside_right'
function = coolant_wall_temperature
variable = temperature
[]
[]
[Materials]
[fission_rate]
type = ADFissionRate
block = pellet
rod_linear_power = power_history
axial_power_profile = axial_power_function
pellet_radius = ${fuel_radius}
outputs = all
[]
[burnup]
type = ADBurnup
block = pellet
atoms_heavy_metal_per_volume = ${atoms_heavy_metal_per_volume}
outputs = all
[]
[fuel_density]
block = pellet
type = ADStrainAdjustedDensity
strain_free_density = ${density}
[]
[porosity_pp]
type = ADParsedMaterial
property_name = porosity_pp
postprocessor_names = porosity_fuel_avg
expression = porosity_fuel_avg
[]
[fuel_thermal]
type = ADMNThermal
block = pellet
temperature = temperature
porosity = porosity_pp # This is a hack until thermal mortar can handle stateful materials
outputs = all
[]
[fuel_porosity]
type = ADPorosityFromStrain
block = pellet
initial_porosity = ${initial_porosity}
inelastic_strain = 'gaseous_swelling_eigenstrain'
outputs = all
[]
[fuel_elasticity_tensor]
block = pellet
type = ADMNElasticityTensor
temperature = temperature
use_old_porosity = true
porosity = porosity
output_properties = 'youngs_modulus poissons_ratio'
outputs = all
[]
[fuel_thermal_expansion]
block = pellet
type = ADMNThermalExpansionEigenstrain
eigenstrain_name = fuel_thermal_expansion
stress_free_temperature = ${initial_temperature}
temperature = temperature
[]
[fuel_radial_return_stress]
block = pellet
type = ADComputeMultipleInelasticStress
inelastic_models = 'fuel_creep'
[]
[fuel_creep]
block = pellet
type = ADMNCreepUpdate
max_inelastic_increment = 1e-3
temperature = temperature
porosity = porosity
fission_rate = fission_rate
outputs = all
[]
[burnup_swelling]
type = ADBurnupDependentEigenstrain
block = pellet
eigenstrain_name = 'solid_swelling_eigenstrain'
swelling_factor = 0.5 # 0.5% solid fission product swelling per % FIMA
burnup = burnup
outputs = all
[]
[gaseous_swelling]
type = ADParsedMaterial
block = pellet
material_property_names = 'deltav_v0_bubble_bulk deltav_v0_bd deltav_v0_bubble_intra_dislocation'
property_name = 'gaseous_swelling'
expression = 'deltav_v0_bubble_bulk + deltav_v0_bd + deltav_v0_bubble_intra_dislocation'
outputs = all
[]
[gaseous_swelling_eigenstrain]
type = ADComputeVolumetricEigenstrain
block = pellet
volumetric_materials = 'deltav_v0_bubble_bulk deltav_v0_bd deltav_v0_bubble_intra_dislocation'
eigenstrain_name = 'gaseous_swelling_eigenstrain'
[]
[vacancy_GB_diffusion]
type = ADParsedMaterial
block = pellet
property_name = vacancy_GB_diffusion
coupled_variables = 'temperature'
expression = 'kBT := 1.380649e-23 / 1.602176634e-19 * temperature;
${D1_scalar} * ${D10} * exp(-1.0 * ${Q1} / kBT) * 1e6'
[]
[fission_gas_behavior]
type = ADUNSifgrs
block = pellet
temperature = temperature
fission_rate_material = fission_rate
ig_bubble_coarsening = WITH_COARSENING
grain_radius_const = ${grain_radius}
dislocation_density_material = dislocation_density
vacancy_diffusivity_function = vacancy_diffusivity_function
gas_diffusivity_function = gas_diffusivity_function
outputs = all
initial_porosity = ${initial_porosity}
fract_yield = 0.475
shear_modulus = shear_modulus
dislocation_bubble_nucleation_factor = 5e5
vacancy_GB_diffusivity = vacancy_GB_diffusion
[]
[dislocation_density]
type = ADParsedMaterial
block = pellet
property_name = dislocation_density
expression = ${dislocation_density}
outputs = all
[]
[clad_elasticity_tensor]
block = clad
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 68.9e9
poissons_ratio = 0.4
[]
[clad_thermal_expansion]
block = clad
type = ADComputeThermalExpansionEigenstrain
eigenstrain_name = clad_thermal_expansion
thermal_expansion_coeff = 7.54e-6
stress_free_temperature = ${initial_temperature}
temperature = temperature
[]
[clad_stress]
block = clad
type = ADComputeFiniteStrainElasticStress
[]
[clad_thermal]
type = ADHeatConductionMaterial
block = clad
thermal_conductivity = 41.9
specific_heat = 270
[]
[clad_density]
block = clad
type = ADStrainAdjustedDensity
strain_free_density = 8590
[]
[liner_elasticity_tensor]
block = liner
type = ADTungstenElasticityTensor
temperature = temperature
[]
[liner_thermal_expansion]
block = liner
type = ADTungstenThermalExpansionEigenstrain
eigenstrain_name = liner_thermal_expansion
stress_free_temperature = ${initial_temperature}
temperature = temperature
[]
[liner_stress]
block = liner
type = ADComputeFiniteStrainElasticStress
[]
[liner_thermal]
block = liner
type = ADTungstenThermal
temperature = temperature
[]
[liner_density]
block = liner
type = ADStrainAdjustedDensity
strain_free_density = 19300
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temperature]
type = MaxIncrement
variable = temperature
max_increment = 50
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options = '-snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15'
line_search = contact
l_max_its = 60
nl_max_its = 20
nl_rel_tol = 5e-6
nl_abs_tol = 5e-9
nl_div_tol = -1
nl_abs_div_tol = -1
end_time = ${total_time}
dtmin = 1
dtmax = 5e5
verbose = true
automatic_scaling = true
compute_scaling_once = false
ignore_variables_for_autoscaling = 'thermal_contact_thermal_lm mechanical_normal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = time_step_limit
force_step_every_function_point = true
timestep_limiting_function = power_history
dt = 1e2
post_function_sync_dt = 1e3
[]
[]
[Postprocessors]
# elemental temperatures
[temperature_fuel_avg]
type = ElementAverageValue
variable = temperature
block = pellet
execute_on = 'initial timestep_end'
[]
[temperature_fuel_max]
type = ElementExtremeValue
variable = temperature
block = pellet
execute_on = 'initial timestep_end'
[]
[temperature_fuel_min]
type = ElementExtremeValue
variable = temperature
block = pellet
value_type = min
execute_on = 'initial timestep_end'
[]
[temperature_cladding_avg]
type = ElementAverageValue
variable = temperature
block = clad
execute_on = 'initial timestep_end'
[]
[temperature_cladding_max]
type = ElementExtremeValue
variable = temperature
block = clad
execute_on = 'initial timestep_end'
[]
[temperature_cladding_min]
type = ElementExtremeValue
variable = temperature
block = clad
value_type = min
execute_on = 'initial timestep_end'
[]
[temperature_liner_avg]
type = ElementAverageValue
variable = temperature
block = liner
execute_on = 'initial timestep_end'
[]
[temperature_liner_max]
type = ElementExtremeValue
variable = temperature
block = liner
execute_on = 'initial timestep_end'
[]
[temperature_liner_min]
type = ElementExtremeValue
variable = temperature
block = liner
value_type = min
execute_on = 'initial timestep_end'
[]
[ave_temperature_interior] # average temperature of the cladding interior and all pellet exteriors
type = SideAverageValue
boundary = inside_surfaces
variable = temperature
execute_on = 'initial linear'
[]
[temperature_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = centerline
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_centerline_max]
type = NodalExtremeValue
boundary = centerline
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_centerline_min]
type = NodalExtremeValue
boundary = centerline
variable = temperature
value_type = min
execute_on = 'initial timestep_end'
[]
[temperature_fuel_surface_avg]
type = SideAverageValue
boundary = pellet_outer_radial_surface
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_surface_max]
type = NodalExtremeValue
boundary = pellet_outer_radial_surface
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_surface_min]
type = NodalExtremeValue
boundary = pellet_outer_radial_surface
variable = temperature
value_type = min
execute_on = 'initial timestep_end'
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = pellet
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = pellet
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = pellet
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = pellet
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = pellet
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = pellet
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = pellet
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = pellet
[]
[strain_axial_fuel_avg]
type = ParsedPostprocessor
pp_names = 'disp_y_fuel_top_surface_avg disp_y_fuel_bottom_surface_avg'
expression = '(disp_y_fuel_top_surface_avg - disp_y_fuel_bottom_surface_avg) / ${fuel_height}'
[]
[disp_y_fuel_top_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = top_of_top_pellet
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = top_of_top_pellet
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = bottom_of_bottom_pellet
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = bottom_of_bottom_pellet
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = pellet_outer_radial_surface
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = pellet_outer_radial_surface
[]
[disp_x_cladding_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = clad_outside_right
[]
[disp_x_cladding_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = clad_outside_right
[]
[burnup_avg]
type = ElementAverageValue
block = pellet
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = pellet
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = pellet
execute_on = 'initial timestep_end'
[]
[fission_rate_max]
type = ElementExtremeValue
variable = fission_rate
block = pellet
execute_on = 'initial timestep_end'
[]
[dislocation_density_avg]
type = ElementAverageValue
variable = dislocation_density
block = pellet
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = pellet
execute_on = 'initial timestep_end'
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = pellet
execute_on = 'initial timestep_end'
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = pellet
execute_on = 'initial timestep_end'
[]
[swelling_dia_percent]
type = ParsedPostprocessor
pp_names = 'disp_x_fuel_radial_surface_avg'
expression = 'disp_x_fuel_radial_surface_avg / ${fparse pi * fuel_radius} * 100'
[]
[fuel_volume]
type = VolumePostprocessor
block = pellet
execute_on = 'TIMESTEP_END INITIAL'
use_displaced_mesh = true
[]
[swelling_vol_percent]
type = ParsedPostprocessor
pp_names = 'fuel_volume'
expression = '(fuel_volume - ${fuel_volume}) / ${fuel_volume} * 100'
[]
[gas_volume]
type = InternalVolume
boundary = inside_surfaces
execute_on = 'initial linear'
[]
# fission gas information
[deltav_v0_bubble_bulk]
type = ADElementAverageMaterialProperty
mat_prop = deltav_v0_bubble_bulk
block = pellet
[]
[deltav_v0_bd]
type = ADElementAverageMaterialProperty
mat_prop = deltav_v0_bd
block = pellet
[]
[deltav_v0_bubble_intra_dislocation]
type = ADElementAverageMaterialProperty
mat_prop = deltav_v0_bubble_intra_dislocation
block = pellet
[]
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_generated_total
block = pellet
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_release_total
block = pellet
[]
[fgr_percent]
type = ParsedPostprocessor
pp_names = 'fg_released fg_produced'
expression = 'fg_released / fg_produced * 100'
[]
[fg_grain_boundary]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_GB_bubble_volume
block = pellet
[]
[fg_matrix]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_matrix_intra
block = pellet
[]
[fg_intra_bubble]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_bubble_intra
block = pellet
[]
[fg_dislocation]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_bubble_intra_dislocation
block = pellet
[]
[gas_conservation]
type = ParsedPostprocessor
pp_names = 'fg_produced fg_released fg_dislocation fg_intra_bubble fg_matrix fg_grain_boundary'
expression = 'fg_produced - fg_released - fg_dislocation - fg_intra_bubble - fg_matrix - fg_grain_boundary'
[]
[GBcoverage_max]
type = ElementExtremeValue
variable = GBCoverage
block = pellet
[]
[GBcoverage_min]
type = ElementExtremeValue
variable = GBCoverage
value_type = min
block = pellet
[]
[GBcoverage_avg]
type = ElementAverageValue
variable = GBCoverage
block = pellet
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
outputs = none
block = 'pellet'
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[power_history]
type = FunctionValuePostprocessor
function = power_history
[]
[coolant_temperature]
type = FunctionValuePostprocessor
function = coolant_wall_temperature
[]
[]
[VectorPostprocessors]
[centerline]
type = SideValueSampler
boundary = centerline
variable = 'temperature fission_rate'
sort_by = y
outputs = base
[]
[cladding_surface]
type = SideValueSampler
boundary = clad_outside_right
variable = 'temperature fission_rate disp_x'
sort_by = y
outputs = base
[]
[midplane]
type = LineValueSampler
start_point = '0 ${fparse pin_height / 2} 0'
end_point = '${fuel_radius} ${fparse pin_height / 2} 0'
variable = 'temperature fission_rate'
num_points = 11
sort_by = x
outputs = base
[]
[]
[PerformanceMetricOutputs]
outputs = 'out console base'
[]
[Outputs]
perf_graph = true
sync_times = '1e2 1e3 5e3 1e4 5e4 1e5 5e5 1e6 2e6 3e6 4e6 5e6 6e6 7e6 8e6 9e6 1e7 ${time_end_ramp_up} ${time_start_ramp_down} ${time_end_ramp_down} ${total_time}'
file_base = '${group_name}_out'
[out]
type = Exodus
time_step_interval = 10
[]
[sync]
type = CSV
file_base = '${group_name}_sync_out'
show = 'burnup_avg temperature_fuel_avg temperature_fuel_max temperature_cladding_avg temperature_cladding_max temperature_liner_avg swelling_vol_percent fgr_percent fission_rate_avg fission_rate_max porosity_fuel_avg porosity_fuel_max'
sync_only = true
[]
[PIE_out]
type = CSV
file_base = '${group_name}_PIE_out'
show = 'burnup_avg fgr_percent swelling_vol_percent'
execute_on = 'FINAL'
[]
[checkpoint]
type = Checkpoint
time_step_interval = 10
[]
[base]
type = CSV
file_base = '${group_name}_csvs/${group_name}_base_out'
[]
[console]
type = Console
show = 'temperature_cladding_avg temperature_cladding_max GBcoverage_max GBcoverage_avg fgr_percent gas_conservation time_step_limit time_step_size temperature_fuel_avg temperature_fuel_max stress_vonmises_fuel_max stress_hydro_fuel_max stress_hydro_fuel_min strain_axial_fuel_avg burnup_avg fission_rate_avg porosity_fuel_avg disp_x_fuel_radial_surface_max disp_x_cladding_radial_surface_max swelling_vol_percent'
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temperature'
show_var_residual_norms = true
[]
(test/tests/nuclearMaterialNTPAction/two_blocks_manual.i)
# This input file sets up a nuclear thermal propulsion problem by calculating
# the material properties of a tungsten clad Alloy366-UN cermet at various
# temperatures ranging from 200 to 2800 K. These are used along with the
# following objects to set up a simple stress divergence problem:
# - solid mechanics quasi-static action
# - linear elastic stress formulation
# - fixed displacement boundary condition on the left side of the 1D domain
# - heat conduction kernels
# - a generic value for density
[GlobalParams]
displacements = disp_x
value_range_behavior = IGNORE
[]
[Mesh]
use_displaced_mesh = false
[generated_mesh]
type = GeneratedMeshGenerator
dim = 1
nx = 2
[]
[block_0]
type = ParsedSubdomainMeshGenerator
input = generated_mesh
block_id = 0
block_name = block_0
combinatorial_geometry = 'x <= 0.5'
[]
[block_1]
type = ParsedSubdomainMeshGenerator
input = block_0
block_id = 1
block_name = block_1
combinatorial_geometry = 'x > 0.5'
[]
uniform_refine = 4
[]
[Variables]
[temperature]
[InitialCondition]
type = FunctionIC
function = temperature_function
[]
[]
[]
[AuxVariables]
[elasticity_tensor_0000]
family = MONOMIAL
order = CONSTANT
[]
[thermal_expansion_000]
family = MONOMIAL
order = CONSTANT
[]
[]
[BCs]
[fix_left]
type = DirichletBC
variable = disp_x
value = 0
boundary = left
[]
[]
[Physics]
[SolidMechanics/QuasiStatic/All]
strain = SMALL
add_variables = true
eigenstrain_names = thermal_expansion
temperature = temperature
[]
[]
[Kernels]
[heat_time_derivative]
type = HeatConductionTimeDerivative
variable = temperature
density_name = density
specific_heat = specific_heat
[]
[heat_conduction]
type = HeatConduction
variable = temperature
diffusion_coefficient = specific_heat
diffusion_coefficient_dT = specific_heat_dT
[]
[]
[AuxKernels]
[elasticity_tensor_0000_auxkernel]
type = RankFourAux
variable = elasticity_tensor_0000
rank_four_tensor = elasticity_tensor
index_i = 0
index_j = 0
index_k = 0
index_l = 0
[]
[thermal_expansion_000_auxkernel]
type = RankTwoAux
variable = thermal_expansion_000
rank_two_tensor = thermal_expansion
index_i = 0
index_j = 0
[]
[]
[Functions]
[temperature_function]
type = ParsedFunction
expression = '200 + (2800 - 200) * x'
[]
[]
[Materials]
[stress]
type = ComputeLinearElasticStress
[]
[block_0_Alloy366_thermal_properties]
type = Alloy366Thermal
base_name = Alloy366
block = block_0
silence_warnings = true
temperature = temperature
[]
[block_0_Tungsten_elasticity_tensor]
type = TungstenElasticityTensor
base_name = Tungsten
block = block_0
silence_warnings = true
temperature = temperature
[]
[block_0_Molybdenum_elasticity_tensor]
type = MolybdenumElasticityTensor
base_name = Molybdenum
block = block_0
silence_warnings = true
temperature = temperature
[]
[block_0_Alloy366_weights]
type = GenericConstantMaterial
block = block_0
prop_names = 'Tungsten_fraction Molybdenum_fraction'
prop_values = '0.3 0.7'
[]
[block_0_Alloy366_elasticity_tensor]
type = CompositeElasticityTensor
coupled_variables = temperature
base_name = Alloy366
block = block_0
tensors = 'Tungsten Molybdenum'
weights = 'Tungsten_fraction Molybdenum_fraction'
[]
[block_0_Alloy366_thermal_expansion]
type = Alloy366ThermalExpansionEigenstrain
base_name = Alloy366
block = block_0
eigenstrain_name = thermal_expansion
silence_warnings = true
stress_free_temperature = 293
temperature = temperature
[]
[block_0_UN_thermal_properties]
type = MNThermal
formulation = NASAGRC
base_name = UN
block = block_0
temperature = temperature
porosity = 0
[]
[block_0_UN_elasticity_tensor]
type = UNElasticityTensor
base_name = UN
block = block_0
silence_warnings = true
temperature = temperature
[]
[block_0_UN_thermal_expansion]
type = UNThermalExpansionEigenstrain
base_name = UN
block = block_0
eigenstrain_name = thermal_expansion
silence_warnings = true
stress_free_temperature = 293
temperature = temperature
[]
[block_0_Cermet_weights]
type = GenericConstantMaterial
block = block_0
prop_names = 'fuel_fraction matrix_fraction'
prop_values = '0.6 0.4'
[]
[block_0_Cermet_thermal_conductivity]
type = ParsedMaterial
block = block_0
property_name = thermal_conductivity
expression = 'fuel_fraction * UN_thermal_conductivity + matrix_fraction * Alloy366_thermal_conductivity'
material_property_names = 'fuel_fraction UN_thermal_conductivity matrix_fraction Alloy366_thermal_conductivity'
output_properties = thermal_conductivity
outputs = exodus
[]
[block_0_Cermet_thermal_conductivity_dT]
type = ParsedMaterial
block = block_0
property_name = thermal_conductivity_dT
expression = 'fuel_fraction * UN_thermal_conductivity_dT + matrix_fraction * Alloy366_thermal_conductivity_dT'
material_property_names = 'fuel_fraction UN_thermal_conductivity_dT matrix_fraction Alloy366_thermal_conductivity_dT'
output_properties = thermal_conductivity_dT
outputs = exodus
[]
[block_0_Cermet_density]
type = StrainAdjustedDensity
strain_free_density = 11916
[]
[block_0_Cermet_specific_heat]
type = ParsedMaterial
block = block_0
property_name = specific_heat
expression = 'fuel_fraction * UN_specific_heat + matrix_fraction * Alloy366_specific_heat'
material_property_names = 'fuel_fraction UN_specific_heat matrix_fraction Alloy366_specific_heat'
output_properties = specific_heat
outputs = exodus
[]
[block_0_Cermet_specific_heat_dT]
type = ParsedMaterial
block = block_0
property_name = specific_heat_dT
expression = 'fuel_fraction * UN_specific_heat_dT + matrix_fraction * Alloy366_specific_heat_dT'
material_property_names = 'fuel_fraction UN_specific_heat_dT matrix_fraction Alloy366_specific_heat_dT'
output_properties = specific_heat_dT
outputs = exodus
[]
[block_0_Cermet_elasticity_tensor]
type = CompositeElasticityTensor
coupled_variables = temperature
block = block_0
tensors = 'UN Alloy366'
weights = 'fuel_fraction matrix_fraction'
[]
[block_0_Cermet_thermal_expansion]
type = CompositeEigenstrain
coupled_variables = temperature
block = block_0
eigenstrain_name = thermal_expansion
tensors = 'UN_thermal_expansion Alloy366_thermal_expansion'
weights = 'fuel_fraction matrix_fraction'
[]
[block_0_Cermet_thermal_expansion_dT]
type = GenericConstantRankTwoTensor
block = block_0
tensor_name = 'dthermal_expansion/dtemperature'
tensor_values = '0 0 0 0 0 0 0 0 0'
[]
[block_1_Tungsten_thermal_properties]
type = TungstenThermal
block = block_1
output_properties = 'thermal_conductivity thermal_conductivity_dT specific_heat specific_heat_dT'
outputs = exodus
silence_warnings = true
temperature = temperature
[]
[block_1_Tungsten_elasticity_tensor]
type = TungstenElasticityTensor
block = block_1
silence_warnings = true
temperature = temperature
[]
[block_1_Tungsten_thermal_expansion]
type = TungstenThermalExpansionEigenstrain
block = block_1
eigenstrain_name = thermal_expansion
silence_warnings = true
stress_free_temperature = 293
temperature = temperature
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
dt = 1
num_steps = 1
[]
[Outputs]
exodus = true
[]
(assessment/nitride/MTR/SNAP50/analysis/SNAP50_base.i)
fuel_radius = '${fparse fuel_diameter / 2}' # m
fuel_volume = '${fparse pi * fuel_radius^2 * fuel_height}' # m
spacer_height = '${fparse (pin_height - fuel_height) / 2 - cladding_bottom_top_plug_length}'
cladding_radial_gap = '${fparse cladding_outer_diameter / 2 - cladding_thickness - liner_thickness - fuel_radius}'
plenum_height = ${spacer_height}
gap_bottom_length = ${spacer_height}
R = 8.31446261815324
A_U = 0.238 # kg/mol
A_Pu = 0.239 # kg/mol
A_N = 0.014 # kg/mol
avo = 6.0221408e23 # atoms per mole
th_density = 14400 # kg/m3
initial_porosity = '${fparse 1.0 - fraction_th_density}'
density = '${fparse fraction_th_density * th_density}' # kg/m3
M_avg = '${fparse x_N * A_N + x_Pu * A_Pu + (1.0 - x_Pu) * A_U}' # kg / mol
atoms_heavy_metal_per_volume = '${fparse density / M_avg * avo}' # mol / m3
# Power history
avg_lin_power = '${fparse volumetric_power * pi * fuel_radius^2}' # W/m
time_end_ramp_up = '${fparse 5 * 3600}' # s, arbitrary 5 hour ramp
time_start_ramp_down = '${fparse time_end_ramp_up + run_time}' # s
time_end_ramp_down = '${fparse time_start_ramp_down + time_end_ramp_up}' # s
total_time = '${fparse time_end_ramp_down + 3600}' # s
[GlobalParams]
order = FIRST
energy_per_fission = 3.412e-11 # J/fission
displacements = 'disp_x disp_y'
value_range_behavior = IGNORE
min_damping = 1e-4
volumetric_locking_correction = true
absolute_value_vector_tags = ref
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temperature'
[]
[Mesh]
coord_type = RZ
[smeared_pellet_mesh]
type = FuelPinMeshGenerator
clad_thickness = ${cladding_thickness}
pellet_outer_radius = ${fuel_radius}
pellet_height = ${fuel_height}
clad_top_gap_height = ${plenum_height}
clad_gap_width = ${cladding_radial_gap}
top_clad_height = ${cladding_bottom_top_plug_length}
bottom_clad_height = ${cladding_bottom_top_plug_length}
clad_bot_gap_height = ${gap_bottom_length}
liner_thickness = ${liner_thickness}
clad_mesh_density = customize
pellet_mesh_density = customize
nx_p = 10
ny_p = 100
nx_c = 4
ny_c = 100
ny_cu = 3
ny_cl = 3
nx_liner = 4
pellet_quantity = 1
elem_type = QUAD4
[]
patch_size = 30
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
[]
[Variables]
[temperature]
initial_condition = ${initial_temperature}
[]
[]
[Functions]
[power_history]
type = PiecewiseLinear
x = '0 ${time_end_ramp_up} ${time_start_ramp_down} ${time_end_ramp_down}'
y = '0 ${avg_lin_power} ${avg_lin_power} 0'
[]
[axial_power_function] # estimated, actual peaking unknown
type = PowerPeakingFunction
fit = EBRII_ROW_3
pellet_length = '${fuel_height}'
pellet_y_start = ${fparse cladding_bottom_top_plug_length + gap_bottom_length}
[]
[coolant_wall_temperature]
type = ParsedFunction
expression = 'a := ${bottom_temperature} * (y - ${mid_midplane}) * (y - ${top_midplane}) / (${bottom_midplane} - ${mid_midplane}) / (${bottom_midplane} - ${top_midplane});
b := ${mid_temperature} * (y - ${bottom_midplane}) * (y - ${top_midplane}) / (${mid_midplane} - ${bottom_midplane}) / (${mid_midplane} - ${top_midplane});
c := ${top_temperature} * (y - ${bottom_midplane}) * (y - ${mid_midplane}) / (${top_midplane} - ${bottom_midplane}) / (${top_midplane} - ${mid_midplane});
full_temp := a + b + c;
if(t < ${time_end_ramp_up}, ${initial_temperature} + t * (full_temp - ${initial_temperature}) / (${time_end_ramp_up}), if(t < ${time_start_ramp_down}, full_temp, if(t < ${time_end_ramp_down}, full_temp + (t - ${time_start_ramp_down}) * (${initial_temperature} - full_temp) / (${time_end_ramp_down} - ${time_start_ramp_down}), ${initial_temperature})))'
[]
[gas_diffusivity_function]
# x corresponds to temperature [K] and y corresponds to fission rate [fsn/m3/s]
type = ParsedFunction
expression = 'kBT := 1.380649e-23 / 1.602176634e-19 * x;
D1 := ${xe_D10} * exp(-1.0 * ${xe_Q1} / kBT);
D2 := (y / 1e19)^0.5 * ${xe_D20} * exp(${xe_D2Q1} / kBT + ${xe_D2Q2} / kBT / kBT);
D3 := 1.85e-39 * y;
D1 * ${D1_xe_scalar} + D2 * ${D2_xe_scalar} + D3 * ${D3_xe_scalar}'
[]
[vacancy_diffusivity_function]
# x corresponds to temperature [K] and y corresponds to fission rate [fsn/m3/s]
type = ParsedFunction
expression = 'kBT := 1.380649e-23 / 1.602176634e-19 * x;
D1 := ${D10} * exp(-1.0 * ${Q1} / kBT);
D2 := (y / 1e19)^0.5 * ${D20} * exp(${D2Q1} / kBT + ${D2Q2} / kBT / kBT);
D2b := (y / 1e19)^0.5 * ${D2b0} * exp(${D2bQ1} / kBT + ${D2bQ2} / kBT / kBT);
D1 * ${D1_scalar} + (D2 + D2b) * ${D2_scalar}'
[]
[radial_power_function]
type = ParsedFunction
symbol_names = 'a b c d'
symbol_values = '0.88 -0.29 0.16 0.68'
expression = 'a*(x/${fuel_radius})^3 + b*(x/${fuel_radius})^2 + c*(x/${fuel_radius}) + d'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = pellet
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress creep_strain_xx creep_strain_yy creep_strain_zz elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
eigenstrain_names = 'fuel_thermal_expansion solid_swelling_eigenstrain gaseous_swelling_eigenstrain'
temperature = temperature
use_automatic_differentiation = true
[]
[clad]
block = clad
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
eigenstrain_names = 'clad_thermal_expansion'
temperature = temperature
use_automatic_differentiation = true
[]
[liner]
block = liner
strain = FINITE
add_variables = true
generate_output = 'firstinv_strain stress_xx stress_yy stress_zz vonmises_stress hydrostatic_stress elastic_strain_xx elastic_strain_yy elastic_strain_zz strain_xx strain_yy strain_zz'
eigenstrain_names = 'liner_thermal_expansion'
temperature = temperature
use_automatic_differentiation = true
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temperature
block = 'pellet liner clad'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
variable = temperature
block = 'pellet liner clad'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temperature
fission_rate = fission_rate
energy_deposited_in_fuel = 0.95
block = 'pellet'
[]
[gamma_heating]
type = ADMatBodyForce
variable = temperature
block = 'pellet liner clad'
material_property = gamma_heating_density
[]
[]
[ThermalContactMortar]
[thermal_contact]
secondary_variable = temperature
primary_boundary = clad_inside_right
secondary_boundary = pellet_outer_radial_surface
initial_moles = initial_moles
gas_released = fg_released
jump_distance_model = LANNING
plenum_pressure = plenum_pressure
contact_pressure = mechanical_normal_lm
use_automatic_differentiation = true
# use mechanical contact subdomains
primary_subdomain = mechanical_primary_subdomain
secondary_subdomain = mechanical_secondary_subdomain
[]
[]
[Contact]
[mechanical]
model = frictionless
formulation = mortar
primary = clad_inside_right
secondary = pellet_outer_radial_surface
c_normal = 1e+11
correct_edge_dropping = true
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = centerline
value = 0.0
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = clad_outside_bottom
value = 0.0
[]
[no_y_fuel]
type = ADDirichletBC
variable = disp_y
boundary = bottom_central_pellet_node
value = 0.0
[]
[Pressure]
[coolantPressure]
boundary = 'clad_outside_bottom clad_outside_right clad_outside_top'
function = ${coolant_pressure}
use_automatic_differentiation = true
[]
[]
[PlenumPressure] # apply plenum pressure on clad inner walls and pellet surfaces
[plenumPressure]
boundary = inside_surfaces
initial_pressure = ${initial_plenum_pressure}
startup_time = 0
R = ${R}
initial_temperature = ${initial_temperature}
temperature = ave_temperature_interior # coupling to post processor to get gas temperature approximation
output_initial_moles = initial_moles # coupling to post processor to get initial fill gas mass
volume = gas_volume # coupling to post processor to get gas volume
additional_volumes = spacer_volume
temperature_of_additional_volumes = ave_temperature_interior
output = plenum_pressure # coupling to post processor to output plenum/gap pressure
use_automatic_differentiation = true
[]
[]
[clad_outer_temperature]
type = ADFunctionDirichletBC
boundary = 'clad_outside_right'
function = coolant_wall_temperature
variable = temperature
[]
[]
[Materials]
[gamma_heating_density]
type = ADParsedMaterial
block = 'pellet clad liner'
material_property_names = 'density'
property_name = gamma_heating_density
expression = 'density * 500' # kg/m3 * W/kg
[]
[fission_rate]
type = ADFissionRate
block = pellet
rod_linear_power = power_history
axial_power_profile = axial_power_function
radial_power_profile = radial_power_function
pellet_radius = ${fuel_radius}
outputs = all
[]
[burnup]
type = ADBurnup
block = pellet
atoms_heavy_metal_per_volume = ${atoms_heavy_metal_per_volume}
outputs = all
[]
[fuel_density]
block = pellet
type = ADStrainAdjustedDensity
strain_free_density = ${density}
[]
[porosity_pp]
type = ADParsedMaterial
property_name = porosity_pp
postprocessor_names = porosity_fuel_avg
expression = porosity_fuel_avg
[]
[fuel_thermal]
type = ADMNThermal
block = pellet
temperature = temperature
porosity = porosity_pp # This is a hack until thermal mortar can handle stateful materials
outputs = all
[]
[fuel_porosity]
type = ADPorosityFromStrain
block = pellet
initial_porosity = ${initial_porosity}
inelastic_strain = 'gaseous_swelling_eigenstrain'
outputs = all
[]
[fuel_elasticity_tensor]
block = pellet
type = ADMNElasticityTensor
temperature = temperature
use_old_porosity = true
porosity = porosity
output_properties = 'youngs_modulus poissons_ratio'
outputs = all
[]
[fuel_thermal_expansion]
block = pellet
type = ADMNThermalExpansionEigenstrain
eigenstrain_name = fuel_thermal_expansion
stress_free_temperature = ${initial_temperature}
temperature = temperature
[]
[fuel_radial_return_stress]
block = pellet
type = ADComputeMultipleInelasticStress
inelastic_models = 'fuel_creep'
[]
[fuel_creep]
block = pellet
type = ADMNCreepUpdate
max_inelastic_increment = 1e-3
temperature = temperature
porosity = porosity
fission_rate = fission_rate
outputs = all
[]
[burnup_swelling]
type = ADBurnupDependentEigenstrain
block = pellet
eigenstrain_name = 'solid_swelling_eigenstrain'
swelling_factor = 0.5 # 0.5% solid fission product swelling per % FIMA
burnup = burnup
outputs = all
[]
[gaseous_swelling]
type = ADParsedMaterial
block = pellet
material_property_names = 'deltav_v0_bubble_bulk deltav_v0_bd deltav_v0_bubble_intra_dislocation'
property_name = 'gaseous_swelling'
expression = 'deltav_v0_bubble_bulk + deltav_v0_bd + deltav_v0_bubble_intra_dislocation'
outputs = all
[]
[gaseous_swelling_eigenstrain]
type = ADComputeVolumetricEigenstrain
block = pellet
volumetric_materials = 'deltav_v0_bubble_bulk deltav_v0_bd deltav_v0_bubble_intra_dislocation'
eigenstrain_name = 'gaseous_swelling_eigenstrain'
[]
[vacancy_GB_diffusion]
type = ADParsedMaterial
block = pellet
property_name = vacancy_GB_diffusion
coupled_variables = 'temperature'
expression = 'kBT := 1.380649e-23 / 1.602176634e-19 * temperature;
${D1_scalar} * ${D10} * exp(-1.0 * ${Q1} / kBT) * 1e6'
[]
[fission_gas_behavior]
type = ADUNSifgrs
block = pellet
temperature = temperature
fission_rate_material = fission_rate
ig_bubble_coarsening = WITH_COARSENING
grain_radius_const = ${grain_radius}
dislocation_density_material = dislocation_density
vacancy_diffusivity_function = vacancy_diffusivity_function
gas_diffusivity_function = gas_diffusivity_function
outputs = all
initial_porosity = ${initial_porosity}
fract_yield = 0.475
shear_modulus = shear_modulus
dislocation_bubble_nucleation_factor = 5e5
vacancy_GB_diffusivity = vacancy_GB_diffusion
[]
[dislocation_density]
type = ADParsedMaterial
block = pellet
property_name = dislocation_density
expression = ${dislocation_density}
outputs = all
[]
[clad_elasticity_tensor]
block = clad
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 68.9e9
poissons_ratio = 0.4
[]
[clad_thermal_expansion]
block = clad
type = ADComputeThermalExpansionEigenstrain
eigenstrain_name = clad_thermal_expansion
thermal_expansion_coeff = 7.54e-6
stress_free_temperature = ${initial_temperature}
temperature = temperature
[]
[clad_stress]
block = clad
type = ADComputeFiniteStrainElasticStress
[]
[clad_thermal]
type = ADHeatConductionMaterial
block = clad
thermal_conductivity = 41.9
specific_heat = 270
[]
[clad_density]
block = clad
type = ADStrainAdjustedDensity
strain_free_density = 8590
[]
[liner_elasticity_tensor]
block = liner
type = ADTungstenElasticityTensor
temperature = temperature
[]
[liner_thermal_expansion]
block = liner
type = ADTungstenThermalExpansionEigenstrain
eigenstrain_name = liner_thermal_expansion
stress_free_temperature = ${initial_temperature}
temperature = temperature
[]
[liner_stress]
block = liner
type = ADComputeFiniteStrainElasticStress
[]
[liner_thermal]
block = liner
type = ADTungstenThermal
temperature = temperature
[]
[liner_density]
block = liner
type = ADStrainAdjustedDensity
strain_free_density = 19300
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temperature]
type = MaxIncrement
variable = temperature
max_increment = 50
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options = '-snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15'
line_search = contact
l_max_its = 60
nl_max_its = 20
nl_rel_tol = 5e-6
nl_abs_tol = 5e-9
nl_div_tol = -1
nl_abs_div_tol = -1
end_time = ${total_time}
dtmin = 1
dtmax = 5e5
verbose = true
automatic_scaling = true
compute_scaling_once = false
ignore_variables_for_autoscaling = 'thermal_contact_thermal_lm mechanical_normal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = time_step_limit
force_step_every_function_point = true
timestep_limiting_function = power_history
dt = 1e2
post_function_sync_dt = 1e3
[]
[]
[Postprocessors]
# elemental temperatures
[temperature_fuel_avg]
type = ElementAverageValue
variable = temperature
block = pellet
execute_on = 'initial timestep_end'
[]
[temperature_fuel_max]
type = ElementExtremeValue
variable = temperature
block = pellet
execute_on = 'initial timestep_end'
[]
[temperature_fuel_min]
type = ElementExtremeValue
variable = temperature
block = pellet
value_type = min
execute_on = 'initial timestep_end'
[]
[temperature_cladding_avg]
type = ElementAverageValue
variable = temperature
block = clad
execute_on = 'initial timestep_end'
[]
[temperature_cladding_max]
type = ElementExtremeValue
variable = temperature
block = clad
execute_on = 'initial timestep_end'
[]
[temperature_cladding_min]
type = ElementExtremeValue
variable = temperature
block = clad
value_type = min
execute_on = 'initial timestep_end'
[]
[temperature_liner_avg]
type = ElementAverageValue
variable = temperature
block = liner
execute_on = 'initial timestep_end'
[]
[temperature_liner_max]
type = ElementExtremeValue
variable = temperature
block = liner
execute_on = 'initial timestep_end'
[]
[temperature_liner_min]
type = ElementExtremeValue
variable = temperature
block = liner
value_type = min
execute_on = 'initial timestep_end'
[]
[ave_temperature_interior] # average temperature of the cladding interior and all pellet exteriors
type = SideAverageValue
boundary = inside_surfaces
variable = temperature
execute_on = 'initial linear'
[]
[temperature_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = centerline
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_centerline_max]
type = NodalExtremeValue
boundary = centerline
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_centerline_min]
type = NodalExtremeValue
boundary = centerline
variable = temperature
value_type = min
execute_on = 'initial timestep_end'
[]
[temperature_fuel_surface_avg]
type = SideAverageValue
boundary = pellet_outer_radial_surface
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_surface_max]
type = NodalExtremeValue
boundary = pellet_outer_radial_surface
variable = temperature
execute_on = 'initial timestep_end'
[]
[temperature_fuel_surface_min]
type = NodalExtremeValue
boundary = pellet_outer_radial_surface
variable = temperature
value_type = min
execute_on = 'initial timestep_end'
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = pellet
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = pellet
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = pellet
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = pellet
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = pellet
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = pellet
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = pellet
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = pellet
[]
[strain_axial_fuel_avg]
type = ParsedPostprocessor
pp_names = 'disp_y_fuel_top_surface_avg disp_y_fuel_bottom_surface_avg'
expression = '(disp_y_fuel_top_surface_avg - disp_y_fuel_bottom_surface_avg) / ${fuel_height}'
[]
[disp_y_fuel_top_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = top_of_top_pellet
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = top_of_top_pellet
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = bottom_of_bottom_pellet
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = bottom_of_bottom_pellet
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = pellet_outer_radial_surface
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = pellet_outer_radial_surface
[]
[disp_x_cladding_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = clad_outside_right
[]
[disp_x_cladding_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = clad_outside_right
[]
[burnup_avg]
type = ElementAverageValue
block = pellet
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = pellet
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = pellet
execute_on = 'initial timestep_end'
[]
[fission_rate_max]
type = ElementExtremeValue
variable = fission_rate
block = pellet
execute_on = 'initial timestep_end'
[]
[dislocation_density_avg]
type = ElementAverageValue
variable = dislocation_density
block = pellet
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = pellet
execute_on = 'initial timestep_end'
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = pellet
execute_on = 'initial timestep_end'
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = pellet
execute_on = 'initial timestep_end'
[]
[swelling_dia_percent]
type = ParsedPostprocessor
pp_names = 'disp_x_fuel_radial_surface_avg'
expression = 'disp_x_fuel_radial_surface_avg / ${fparse pi * fuel_radius} * 100'
[]
[fuel_volume]
type = VolumePostprocessor
block = pellet
execute_on = 'TIMESTEP_END INITIAL'
use_displaced_mesh = true
[]
[swelling_vol_percent]
type = ParsedPostprocessor
pp_names = 'fuel_volume'
expression = '(fuel_volume - ${fuel_volume}) / ${fuel_volume} * 100'
[]
[gas_volume]
type = InternalVolume
boundary = inside_surfaces
execute_on = 'initial linear'
[]
[spacer_volume]
type = ParsedPostprocessor
pp_names = ''
expression = '${fparse - pi / 4 * (spacer_diameter^2 - (spacer_diameter - spacer_thickness * 2))^2 * spacer_height * 2}'
outputs = none
[]
# fission gas information
[deltav_v0_bubble_bulk]
type = ADElementAverageMaterialProperty
mat_prop = deltav_v0_bubble_bulk
block = pellet
[]
[deltav_v0_bd]
type = ADElementAverageMaterialProperty
mat_prop = deltav_v0_bd
block = pellet
[]
[deltav_v0_bubble_intra_dislocation]
type = ADElementAverageMaterialProperty
mat_prop = deltav_v0_bubble_intra_dislocation
block = pellet
[]
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_generated_total
block = pellet
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_release_total
block = pellet
[]
[fgr_percent]
type = ParsedPostprocessor
pp_names = 'fg_released fg_produced'
expression = 'fg_released / fg_produced * 100'
[]
[fg_grain_boundary]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_GB_bubble_volume
block = pellet
[]
[fg_matrix]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_matrix_intra
block = pellet
[]
[fg_intra_bubble]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_bubble_intra
block = pellet
[]
[fg_dislocation]
type = ADElementIntegralMaterialProperty
mat_prop = gas_concentration_bubble_intra_dislocation
block = pellet
[]
[gas_conservation]
type = ParsedPostprocessor
pp_names = 'fg_produced fg_released fg_dislocation fg_intra_bubble fg_matrix fg_grain_boundary'
expression = 'fg_produced - fg_released - fg_dislocation - fg_intra_bubble - fg_matrix - fg_grain_boundary'
[]
[GBcoverage_max]
type = ElementExtremeValue
variable = GBCoverage
block = pellet
[]
[GBcoverage_min]
type = ElementExtremeValue
variable = GBCoverage
value_type = min
block = pellet
[]
[GBcoverage_avg]
type = ElementAverageValue
variable = GBCoverage
block = pellet
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
outputs = none
block = 'pellet'
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[power_history]
type = FunctionValuePostprocessor
function = power_history
[]
[coolant_temperature]
type = FunctionValuePostprocessor
function = coolant_wall_temperature
[]
[]
[VectorPostprocessors]
[centerline]
type = SideValueSampler
boundary = centerline
variable = 'temperature fission_rate'
sort_by = y
outputs = base
[]
[cladding_surface]
type = SideValueSampler
boundary = clad_outside_right
variable = 'temperature fission_rate disp_x'
sort_by = y
outputs = base
[]
[midplane]
type = LineValueSampler
start_point = '0 ${fparse pin_height / 2} 0'
end_point = '${fuel_radius} ${fparse pin_height / 2} 0'
variable = 'temperature fission_rate'
num_points = 11
sort_by = x
outputs = base
[]
[]
[PerformanceMetricOutputs]
outputs = 'out console base'
[]
[Outputs]
perf_graph = true
sync_times = '1e2 1e3 5e3 1e4 5e4 1e5 5e5 1e6 2e6 3e6 4e6 5e6 6e6 7e6 8e6 9e6 1e7 ${time_end_ramp_up} ${time_start_ramp_down} ${time_end_ramp_down} ${total_time}'
file_base = '${group_name}_out'
[out]
type = Exodus
time_step_interval = 10
[]
[sync]
type = CSV
file_base = '${group_name}_sync_out'
show = 'burnup_avg temperature_fuel_avg temperature_fuel_max temperature_cladding_avg temperature_cladding_max temperature_liner_avg swelling_vol_percent fgr_percent fission_rate_avg fission_rate_max porosity_fuel_avg porosity_fuel_max'
sync_only = true
[]
[PIE_out]
type = CSV
file_base = '${group_name}_PIE_out'
show = 'burnup_avg fgr_percent swelling_vol_percent'
execute_on = 'FINAL'
[]
[checkpoint]
type = Checkpoint
time_step_interval = 10
[]
[base]
type = CSV
file_base = '${group_name}_csvs/${group_name}_base_out'
[]
[console]
type = Console
show = 'temperature_cladding_avg temperature_cladding_max GBcoverage_max GBcoverage_avg fgr_percent gas_conservation time_step_limit time_step_size temperature_fuel_avg temperature_fuel_max stress_vonmises_fuel_max stress_hydro_fuel_max stress_hydro_fuel_min strain_axial_fuel_avg burnup_avg fission_rate_avg porosity_fuel_avg disp_x_fuel_radial_surface_max disp_x_cladding_radial_surface_max swelling_vol_percent'
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temperature'
show_var_residual_norms = true
[]
(test/tests/thermalTests/thermalTungsten/heat_exact.i)
# This test uses TungstenThermal to calculate the thermal conductivity and
# isobaric specific heat capacity of tungsten at various temperatures ranging
# from 20 to 3600 K. The results are compared to hand calculations contained
# in:
# NASAGRC. Nuclear Thermal Propulsion Materials Data Property Book Revision 2.
# Technical Report, National Aeronautics and Space Administration Glenn
# Research Center, Cleveland, Ohio, 2019.
[Mesh]
[generated_mesh]
type = GeneratedMeshGenerator
dim = 1
[]
[]
[Problem]
solve = false
[]
[AuxVariables]
[temperature]
[]
[]
[AuxKernels]
[temperature_auxkernel]
type = FunctionAux
variable = temperature
function = temperature_function
execute_on = 'initial timestep_end'
[]
[]
[Functions]
[temperature_function]
type = PiecewiseConstant
x = '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34'
y = '20 40 60 80 100 150 200 293 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2200 2400 2600 2800 3000 3200 3400 3600'
[]
[]
[Materials]
[thermal_properties]
type = TungstenThermal
base_name = tungsten
temperature = temperature
outputs = 'all'
output_properties = 'tungsten_thermal_conductivity tungsten_specific_heat'
[]
[]
[Executioner]
type = Transient
dt = 1
num_steps = 35
[]
[Postprocessors]
[a_temperature]
type = ElementAverageValue
variable = temperature
[]
[b_thermal_conductivity]
type = ElementAverageValue
variable = tungsten_thermal_conductivity
[]
[c_specific_heat]
type = ElementAverageValue
variable = tungsten_specific_heat
[]
[]
[Outputs]
csv = true
[]