- variableThe name of the variable that this residual object operates on
C++ Type:NonlinearVariableName
Unit:(no unit assumed)
Controllable:No
Description:The name of the variable that this residual object operates on
ArrheniusDiffusion
Diffusion with Arrhenius coefficient
Description
The kernel ADArrheniusDiffusion is used for applying an Arrhenius diffusion term when automatic differentiation is active. If present, an ADArrheniusDiffusionCoef material model must also be present.
Example Input Syntax
[Kernels<<<{"href": "../../syntax/Kernels/index.html"}>>>]
[diff]
type = ADArrheniusDiffusion<<<{"description": "Diffusion with Arrhenius coefficient", "href": "ADArrheniusDiffusion.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = u
[]
[](test/tests/arrhenius_diffusion_coef/ad_2d_arrhenius.i)Input Parameters
- arrhenius_prpty_namearrhenius_diffusion_coefProperty name for the Arrhenius diffusion coefficient.
Default:arrhenius_diffusion_coef
C++ Type:std::string
Controllable:No
Description:Property name for the Arrhenius diffusion coefficient.
- 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
- displacementsThe displacements
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:The displacements
Optional Parameters
- absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution
C++ Type:std::vector<TagName>
Controllable:No
Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution
- extra_matrix_tagsThe extra tags for the matrices this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the matrices this Kernel should fill
- extra_vector_tagsThe extra tags for the vectors this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the vectors this Kernel should fill
- matrix_tagssystemThe tag for the matrices this Kernel should fill
Default:system
C++ Type:MultiMooseEnum
Options:nontime, system
Controllable:No
Description:The tag for the matrices this Kernel should fill
- vector_tagsnontimeThe tag for the vectors this Kernel should fill
Default:nontime
C++ Type:MultiMooseEnum
Options:nontime, time
Controllable:No
Description:The tag for the vectors this Kernel should fill
Contribution To Tagged Field Data 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.
- diag_save_inThe name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)
C++ Type:std::vector<AuxVariableName>
Unit:(no unit assumed)
Controllable:No
Description:The name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)
- 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
- save_inThe name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)
C++ Type:std::vector<AuxVariableName>
Unit:(no unit assumed)
Controllable:No
Description:The name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)
- seed0The seed for the master random number generator
Default:0
C++ Type:unsigned int
Controllable:No
Description:The seed for the master random number generator
- use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Advanced Parameters
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Default:False
C++ Type:bool
Controllable:No
Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Material Property Retrieval Parameters
Input Files
- (test/tests/species_source/ad_Ag_exact.i)
- (test/tests/side_integral_mass_flux/ad_side_integral_mass_flux_test.i)
- (test/tests/species_source/ad_Sr_exact.i)
- (test/tests/species_source/ad_custom_source.i)
- (examples/TRISO/accident_simulation/triso2D_accident_ad.i)
- (test/tests/species_source/ad_Kr_exact.i)
- (test/tests/arrhenius_diffusion_coef/ad_2d_arrhenius.i)
(test/tests/arrhenius_diffusion_coef/ad_2d_arrhenius.i)
[Mesh]
[mesh]
type = FileMeshGenerator
file = square.e
[]
[]
[Variables]
[u]
order = FIRST
family = LAGRANGE
initial_condition = .5
[]
[temp]
order = FIRST
family = LAGRANGE
initial_condition = 1100
[]
[]
[Kernels]
[diff]
type = ADArrheniusDiffusion
variable = u
[]
[heat]
type = ADHeatConduction
variable = temp
[]
[]
[BCs]
[left]
type = ADDirichletBC
variable = u
boundary = 1
value = 0
[]
[right]
type = ADDirichletBC
variable = u
boundary = 2
value = 1
[]
[leftt]
type = ADDirichletBC
variable = temp
boundary = 1
value = 1100
[]
[rightt]
type = ADDirichletBC
variable = temp
boundary = 2
value = 1200
[]
[]
[Materials]
[UO2_thermal]
type = ADHeatConductionMaterial
block = 1
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[UO2_cesium_diffusion]
type = ADArrheniusDiffusionCoef
d1 = 5.6e-8
q1 = 2.09e5
d2 = 5.2e-4
q2 = 3.62e5
block = 1
temperature = temp
[]
[]
[Executioner]
type = Steady
solve_type = 'PJFNK'
petsc_options_iname = '-pc_type -pc_hypre_type'
petsc_options_value = 'hypre boomeramg'
nl_rel_tol = 1e-14
nl_abs_tol = 1e-50
nl_abs_step_tol = 1e-15
l_tol = 1e-14
l_max_its = 100
[]
[Outputs]
execute_on = 'timestep_end'
exodus = true
[]
(test/tests/species_source/ad_Ag_exact.i)
#
# This test checks whether the species source for silver is operating
# as intended in AD. The amount of silver produced in SpeciesSourceMaterial
# is checked against the amount computed through a ParsedMaterial.
#
# If correct, the 'diff' Postprocessor will have a value close to zero,
# and the 'fraction' Postprocessor will be one.
#
[GlobalParams]
initial_enrichment = 0.2
[]
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 1
[]
[]
[Variables]
[conc]
[]
[]
[AuxVariables]
[temperature]
initial_condition = 1000
[]
[]
[Kernels]
[conc_dt]
type = ADTimeDerivative
variable = conc
[]
[conc_diffusion]
type = ADArrheniusDiffusion
variable = conc
arrhenius_prpty_name = diff_coef
[]
[conc_source]
type = ADSpeciesSourceRate
variable = conc
property_name = conc_generation
[]
[]
[BCs]
[conc]
type = ADFunctionDirichletBC
variable = conc
boundary = 'left right'
function = '.1 * t + .1'
[]
[]
[Materials]
[burnup]
type = ADGenericFunctionMaterial
prop_names = burnup
prop_values = '0.01*t'
[]
[fission_rate]
type = ADGenericFunctionMaterial
prop_names = fission_rate
prop_values = 'if(t=0,0,1e19)'
[]
[diff_coef]
type = ADArrheniusDiffusionCoef
temperature = temperature
d1 = 1e-6
q1 = 100e3
arrhenius_prpty_name = diff_coef
[]
[conc_generation]
type = ADSpeciesSourceMaterial
property_name = conc_generation
kind = Ag
[]
[conc_generation_exact]
type = ADParsedMaterial
property_name = conc_generation_exact
material_property_names = 'burnup fission_rate'
constant_names = 'a1 a2 b1 b2 e limit avo'
constant_expressions = '1.31625e-3 8.24492e-4 0.55734 0.53853 0.2 0.175 6.02214076e23'
expression = 'b:=if(burnup*100<1.0,1.0,burnup*100);
if(e<limit,a1*b^b1,a2*b^b2)/avo*fission_rate'
[]
[]
[Executioner]
type = Transient
num_steps = 10
[]
[Postprocessors]
[conc]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation
execute_on = 'initial timestep_end'
[]
[conc_exact]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation_exact
execute_on = 'initial timestep_end'
[]
[diff]
type = DifferencePostprocessor
value1 = 'conc'
value2 = 'conc_exact'
outputs = console
execute_on = 'initial timestep_end'
[]
[fraction]
type = FractionalRelease
released = conc
total = conc_exact
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
csv = true
[]
(test/tests/side_integral_mass_flux/ad_side_integral_mass_flux_test.i)
# Tests ADSideIntegralMassFlux post processor on a single element unit cube having a fixed
# concentration flux of 10 on one face and a fixed zero concentration on the opposing face.
# The diffusion coefficent is set to unity and a large time step (5e6) is taken, such that a
# linear steady-state concentration gradient is achieved in two time steps. The integrated flux
# on both faces is computed with the post processor and matches the analytical solution.
#
# integrated mass flux out = integral (-D del_C dot n) dA
# = -1 * -10 * 1
# = 10
#
# which is the value reported as mass_flux_3
[Mesh]
[mesh]
type = FileMeshGenerator
file = 1x1x1_cube.e
[]
[]
[Variables]
[temp]
order = FIRST
family = LAGRANGE
initial_condition = 100.0
scaling = 1e-7
[]
[conc]
order = FIRST
family = LAGRANGE
initial_condition = 0.0
scaling = 1e10
[]
[]
[Kernels]
[heat]
type = ADHeatConduction
variable = temp
[]
[ie_mass]
type = ADTimeDerivative
variable = conc
[]
[mass]
type = ADArrheniusDiffusion
variable = conc
[]
[]
[BCs]
[temp_fixed]
type = ADDirichletBC
variable = temp
boundary = '1 2'
value = 100.0
[]
[conc_symm]
type = ADNeumannBC
variable = conc
boundary = '1 2 4 6'
value = 0.0
[]
[conc_flux]
type = ADNeumannBC
variable = conc
boundary = 3
value = 10
[]
[conc_fixed]
type = ADDirichletBC
variable = conc
boundary = 5
value = 0.0
[]
[]
[Materials]
[thermal]
type = ADHeatConductionMaterial
block = 1
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[mass]
type = ADArrheniusDiffusionCoef
block = 1
d1 = 1.0
q1 = 0.0
d2 = 0.0
q2 = 0.0
gas_constant = 8.3143
temperature = temp
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options_iname = '-pc_type -pc_hypre_type'
petsc_options_value = 'hypre boomeramg'
nl_rel_tol = 1e-7
nl_abs_tol = 1e-50
nl_abs_step_tol = 1e-50
nl_rel_step_tol = 1e-50
l_tol = 1e-8
l_max_its = 10
start_time = 0.0
end_time = 1.0e7
dt = 5.0e6
num_steps = 2
[]
[Postprocessors]
[side_int_3]
type = SideIntegralVariablePostprocessor
variable = conc
boundary = 3
[]
[side_int_5]
type = SideIntegralVariablePostprocessor
variable = conc
boundary = 5
[]
[mass_flux_3]
type = ADSideIntegralMassFlux
variable = conc
boundary = 3
[]
[mass_flux_5]
type = ADSideIntegralMassFlux
variable = conc
boundary = 5
[]
[]
[Outputs]
file_base = ad_out
exodus = true
[]
(test/tests/species_source/ad_Sr_exact.i)
#
# This test checks whether the species source for strontium is operating
# as intended in AD. The amount of strontium produced in SpeciesSourceMaterial
# is checked against the amount computed through a ParsedMaterial.
#
# If correct, the 'diff' Postprocessor will have a value close to zero,
# and the 'fraction' Postprocessor will be one.
#
[GlobalParams]
initial_enrichment = 0.2
[]
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 1
[]
[]
[Variables]
[conc]
[]
[]
[AuxVariables]
[temperature]
initial_condition = 1000
[]
[]
[Kernels]
[conc_dt]
type = ADTimeDerivative
variable = conc
[]
[conc_diffusion]
type = ADArrheniusDiffusion
variable = conc
arrhenius_prpty_name = diff_coef
[]
[conc_source]
type = ADSpeciesSourceRate
variable = conc
property_name = conc_generation
[]
[]
[BCs]
[conc]
type = ADFunctionDirichletBC
variable = conc
boundary = 'left right'
function = '.1 * t + .1'
[]
[]
[Materials]
[burnup]
type = ADGenericFunctionMaterial
prop_names = burnup
prop_values = '0.01*t'
[]
[fission_rate]
type = ADGenericFunctionMaterial
prop_names = fission_rate
prop_values = 'if(t=0,0,1e19)'
[]
[diff_coef]
type = ADArrheniusDiffusionCoef
temperature = temperature
d1 = 1e-6
q1 = 100e3
arrhenius_prpty_name = diff_coef
[]
[conc_generation]
type = ADSpeciesSourceMaterial
property_name = conc_generation
kind = Sr
[]
[conc_generation_exact]
type = ADParsedMaterial
property_name = conc_generation_exact
material_property_names = 'burnup fission_rate'
constant_names = 'a1 a2 b1 b2 e limit avo'
constant_expressions = '0.11754 0.11819 -0.21762 -0.15778 0.2 0.175 6.02214076e23'
expression = 'b:=if(burnup*100<1.0,1.0,burnup*100);
if(e<limit,a1*b^b1,a2*b^b2)/avo*fission_rate'
[]
[]
[Executioner]
type = Transient
num_steps = 10
[]
[Postprocessors]
[conc]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation
execute_on = 'initial timestep_end'
[]
[conc_exact]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation_exact
execute_on = 'initial timestep_end'
[]
[diff]
type = DifferencePostprocessor
value1 = 'conc'
value2 = 'conc_exact'
outputs = console
execute_on = 'initial timestep_end'
[]
[fraction]
type = FractionalRelease
released = conc
total = conc_exact
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
csv = true
[]
(test/tests/species_source/ad_custom_source.i)
#
# This test checks whether the species source computed using custom
# input is functioning as intended in AD. The amount of mass produced in
# SpeciesSourceMaterial is checked against the amount computed through
# a ParsedMaterial.
#
# If correct, the 'diff' Postprocessor will have a value close to zero,
# and the 'check_rate' Postprocessor will be one.
#
# In addition, the total amount produced is also checked. The 'check_total'
# Postprocessor should report a value of one.
#
[GlobalParams]
initial_enrichment = 0.2
[]
[Mesh]
coord_type = RSPHERICAL
[gen]
type = GeneratedMeshGenerator
dim = 1
xmin = 0
nx = 50
[]
[]
[Variables]
[conc]
[]
[]
[AuxVariables]
[temperature]
initial_condition = 1000
[]
[]
[Kernels]
[conc_dt]
type = ADTimeDerivative
variable = conc
[]
[conc_diffusion]
type = ADArrheniusDiffusion
variable = conc
arrhenius_prpty_name = diff_coef
[]
[conc_source]
type = ADSpeciesSourceRate
variable = conc
property_name = conc_generation
[]
[]
[BCs]
[conc]
type = ADFunctionDirichletBC
variable = conc
boundary = 'right'
function = 0
[]
[]
[Functions]
[fred]
type = ParsedFunction
expression = 't/6.022e23'
[]
[]
[Materials]
[dummy]
type = ADGenericFunctionMaterial
prop_names = dummy
prop_values = 'if(t<=10000,1.1819e-8,0)'
[]
[fission_rate]
type = ADGenericFunctionMaterial
prop_names = fission_rate
prop_values = 'if(t<=10000,1e19,0)'
[]
[diff_coef]
type = ADArrheniusDiffusionCoef
temperature = temperature
d1 = 1e-6
q1 = 100e3
arrhenius_prpty_name = diff_coef
[]
[conc_generation]
type = ADSpeciesSourceMaterial
property_name = conc_generation
kind = custom
additional_function = fred
additional_function_property = dummy
[]
[conc_generation_exact]
type = ADParsedMaterial
property_name = conc_generation_exact
material_property_names = 'dummy fission_rate'
constant_names = 'avo'
constant_expressions = '6.02214076e23'
expression = 'b:=dummy/avo;
if(fission_rate>0,b*fission_rate,0)'
[]
[]
[Executioner]
type = Transient
num_steps = 11
dt = 1000
automatic_scaling = true
[]
[Postprocessors]
[rate]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation
execute_on = 'initial timestep_end'
[]
[rate_exact]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation_exact
execute_on = 'initial timestep_end'
[]
[diff]
type = DifferencePostprocessor
value1 = rate
value2 = rate_exact
outputs = console
execute_on = 'initial timestep_end'
[]
[check_rate]
type = FractionalRelease
released = rate
total = rate_exact
execute_on = 'initial timestep_end'
[]
[total_direct]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation_total
execute_on = 'initial timestep_end'
[]
[total_integrated]
type = TimeIntegratedPostprocessor
value = rate
execute_on = 'initial timestep_end'
[]
[check_total]
type = FractionalRelease
released = total_direct
total = total_integrated
execute_on = 'initial timestep_end'
[]
[mass_flux]
type = ADSideIntegralMassFlux
variable = conc
boundary = right
arrhenius_prpty_name = diff_coef
execute_on = 'initial timestep_end'
[]
[integrated_flux]
type = TimeIntegratedPostprocessor
value = mass_flux
execute_on = 'initial timestep_end'
[]
[fraction]
type = FractionalRelease
released = integrated_flux
total = total_direct
execute_on = 'initial timestep_end'
[]
[fraction_safety_net]
type = FractionalRelease
released = integrated_flux
total = total_direct
start_time = 1000
stop_time = 10000
safety_fraction_type = net
execute_on = 'initial timestep_end'
[]
[fraction_safety_total]
type = FractionalRelease
released = integrated_flux
total = total_direct
start_time = 1000
safety_fraction_type = total
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
csv = true
[]
(examples/TRISO/accident_simulation/triso2D_accident_ad.i)
# This example is 2D-RZ analysis of a TRISO fuel particle. Fully coupled
# heat transfer and solid mechanics, plus diffusion of the fission product
# species cesium (Cs) are simulated. The mesh includes contact surfaces
# between the buffer and IPyC layers to facilitate a gap opening between
# these layers. These surfaces are initially in mechanical contact but
# are assumed to have no strength in tension. A coarse mesh is used to
# provide a short run time.
# The calculation simulates fuel-life in three steps. The first step is an
# irradiation period, where constant power and a fixed particle surface
# temperature (1500 K) are assumed over a lifetime of 76 Ms (2.4 yrs).
# For the second step, fuel removal and storage are simulated by setting
# the reactor power and Cs source terms to zero, reducing the particle
# surface temperature to ambient (300 K), and then holding it
# for 100 days. A third and final step simulates accident
# behavior by increasing the particle surface temperature from ambient
# to 2073 K over 2 hrs, and then holding it at this elevated temperature
# for an additional 200 hrs. At the particle outer boundary, the Cs
# concentration is held at zero and the pressure at ambient during the
# entire simulation. The particle is assumed to be stress-free at an
# initial temperature of 1500 K.
#
# Details about this simulation are given in Section 4 of the following
# article: J. D. Hales, R. L. Williamson, S. R. Novascone, D. M. Perez,
# B. W. Spencer and G. Pastore, "Multidimensional multiphysics simulation
# of TRISO particle fuel", Journal of Nuclear Materials, Vol. 443, p. 531,
# 2013.
# This is a version using a thermomechanical mortar approach. It uses
# Automatic Differentiation classes and models gap mass transfer using
# flux preserving and sorption mortar constraints. Sorption constants are
# given in Table 1 of the following article: A. Londono-Hurtado, I.
# Szlufarska, R. Bratton and D. Morgan, "A review of fission product
# sorption in carbon structures", Journal of Nuclear Materials, Vol. 426,
# p. 254, 2012.
initial_fuel_density = 11000.0
[GlobalParams]
order = SECOND
family = LAGRANGE
displacements = 'disp_x disp_y'
flux_conversion_factor = 0.85
use_automatic_differentiation = true
[]
[Mesh]
coord_type = RZ
[file]
type = FileMeshGenerator
file = triso2Dmed.e
[]
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
converge_on = 'disp_x disp_y temp conc'
[]
[Variables]
[disp_x]
[]
[disp_y]
[]
[temp]
initial_condition = 1500.0
[]
[conc]
initial_condition = 0.0
[]
[conc_lm]
block = pellet_clad_mechanical_secondary_subdomain
[]
[conc_dx_lm]
block = pellet_clad_mechanical_secondary_subdomain
[]
[conc_dy_lm]
block = pellet_clad_mechanical_secondary_subdomain
[]
[]
[AuxVariables]
[fission_rate]
block = fuel
order = CONSTANT
family = MONOMIAL
[]
[fluence]
order = CONSTANT
family = MONOMIAL
[]
[burnup]
block = fuel
order = CONSTANT
family = MONOMIAL
[]
[creep_xx]
order = CONSTANT
family = MONOMIAL
[]
[creep_yy]
order = CONSTANT
family = MONOMIAL
[]
[creep_zz]
order = CONSTANT
family = MONOMIAL
[]
[]
[Functions]
[power_history]
type = PiecewiseLinear
x = '0 76e6 76.001e6'
y = '1 1 0'
[]
[temp_bc]
type = PiecewiseLinear
x = '0 76e6 76.001e6 84.641e6 84.6482e6'
y = '1500 1500 300 300 2073'
[]
[k_function]
type = PiecewiseLinear
x = '0 200e6'
y = '4e-37 4e-37'
[]
[d1_function]
type = ParsedFunction
expression = 'exp(t/4.5e25)'
[]
[integral_flux_error]
type = ParsedFunction
symbol_names = 'buffer_integral_flux IPyC_integral_flux'
symbol_values = 'buffer_integral_flux IPyC_integral_flux'
expression = 'IPyC_integral_flux + buffer_integral_flux'
[]
[partial_pressure_error]
type = ParsedFunction
symbol_names = 'buffer_partial_pressure IPyC_partial_pressure'
symbol_values = 'buffer_partial_pressure IPyC_partial_pressure'
expression = 'IPyC_partial_pressure - buffer_partial_pressure'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
generate_output = 'stress_xx stress_yy stress_zz stress_xy stress_yz stress_zx hydrostatic_stress'
strain = FINITE
incremental = true
add_variables = false
[default]
block = 'fuel buffer IPyC OPyC'
eigenstrain_names = 'thermal_strain swelling_strain'
extra_vector_tags = 'ref'
[]
[SiC]
block = 'SiC'
eigenstrain_names = 'thermal_strain'
extra_vector_tags = 'ref'
[]
[]
[Kernels]
[heat_ie]
type = ADHeatConductionTimeDerivative
variable = temp
extra_vector_tags = 'ref'
block = 'fuel buffer IPyC SiC OPyC'
[]
[heat]
type = ADHeatConduction
variable = temp
extra_vector_tags = 'ref'
block = 'fuel buffer IPyC SiC OPyC'
[]
[heat_source]
type = ADNeutronHeatSource
variable = temp
block = fuel
energy_per_fission = 3.2e-11 # units of J/fission
fission_rate = fission_rate
extra_vector_tags = 'ref'
[]
[mass_ie]
type = ADTimeDerivative
variable = conc
extra_vector_tags = 'ref'
block = 'fuel buffer IPyC SiC OPyC'
[]
[mass]
type = ADArrheniusDiffusion
variable = conc
extra_vector_tags = 'ref'
block = 'fuel buffer IPyC SiC OPyC'
[]
[mass_source]
type = ADBodyForce
variable = conc
function = power_history
value = 1.22e-5 # units of moles/m**3-s
block = fuel
extra_vector_tags = 'ref'
[]
[mass_decay]
type = Decay
variable = conc
radioactive_decay_constant = 7.297e-10 # units:(1/sec) The constant for Cesium
block = 'fuel buffer IPyC SiC OPyC'
extra_vector_tags = 'ref'
[]
[]
[AuxKernels]
[fission_rate]
type = FissionRateGeneral
fission_rate_formulation = GENERIC
variable = fission_rate
block = fuel
fission_rate_function = power_history
value = 3.89e19
execute_on = timestep_begin
[]
[fluence]
type = ADMaterialRealAux
property = fast_neutron_fluence
variable = fluence
[]
[burnup]
type = ADBurnupAux
variable = burnup
block = fuel
fission_rate = fission_rate
molecular_weight = 0.270 # units of kg/mole
execute_on = timestep_begin
density = ${initial_fuel_density}
[]
[creep_xx]
type = ADRankTwoAux
rank_two_tensor = creep_strain
variable = creep_xx
index_i = 0
index_j = 0
block = 'buffer IPyC SiC OPyC'
execute_on = timestep_end
[]
[creep_yy]
type = ADRankTwoAux
rank_two_tensor = creep_strain
variable = creep_yy
index_i = 1
index_j = 1
block = 'buffer IPyC SiC OPyC'
execute_on = timestep_end
[]
[creep_zz]
type = ADRankTwoAux
rank_two_tensor = creep_strain
variable = creep_zz
index_i = 2
index_j = 2
block = 'buffer IPyC SiC OPyC'
execute_on = timestep_end
[]
[]
[ThermalContactMortar]
[thermal]
secondary_variable = temp
primary_boundary = 15
secondary_boundary = 17
initial_moles = initial_moles # coupling to a postprocessor which supplies the initial plenum/gap gas mass
gas_released = 'fis_gas_released co_production' # coupling to postprocessors which supply the fission gas addition, co addition
released_gas_types = 'Kr Xe;
CO'
released_fractions = '0.153 0.847;
1'
gap_geometry_type = CYLINDER
min_gap = 1e-7
max_gap = 50e-6
roughness_coef = 0.0
correct_edge_dropping = true
[]
[]
[Contact]
[pellet_clad_mechanical]
primary = 15
secondary = 17
model = frictionless
formulation = mortar
c_normal = 1.0e8
correct_edge_dropping = true
[]
[]
[Constraints]
[cesium_gap_value]
type = MassSorptionConstraint
variable = conc_lm
primary_variable = conc
primary_boundary = 15
primary_subdomain = pellet_clad_mechanical_primary_subdomain
secondary_variable = conc
secondary_boundary = 17
secondary_subdomain = pellet_clad_mechanical_secondary_subdomain
partial_pressure_name = partial_pressure
epsilon = 1e-4
correct_edge_dropping = true
[]
[cesium_gap_flux_x]
type = MassFluxConstraint
variable = conc_dx_lm
primary_variable = conc
diffusivity_primary = arrhenius_diffusion_coef
primary_boundary = 15
primary_subdomain = pellet_clad_mechanical_primary_subdomain
secondary_variable = conc
diffusivity_secondary = arrhenius_diffusion_coef
secondary_boundary = 17
secondary_subdomain = pellet_clad_mechanical_secondary_subdomain
component = 0
epsilon = 1e-5
correct_edge_dropping = true
[]
[cesium_gap_flux_y]
type = MassFluxConstraint
variable = conc_dy_lm
primary_variable = conc
diffusivity_primary = arrhenius_diffusion_coef
primary_boundary = 15
primary_subdomain = pellet_clad_mechanical_primary_subdomain
secondary_variable = conc
diffusivity_secondary = arrhenius_diffusion_coef
secondary_boundary = 17
secondary_subdomain = pellet_clad_mechanical_secondary_subdomain
component = 1
epsilon = 1e-5
correct_edge_dropping = true
[]
[]
[BCs]
# pin particle along symmetry planes
[no_disp_x]
type = ADDirichletBC
variable = disp_x
boundary = xzero
value = 0.0
extra_vector_tags = 'ref'
[]
[no_disp_y]
type = ADDirichletBC
variable = disp_y
boundary = yzero
value = 0.0
extra_vector_tags = 'ref'
[]
# fix temperature on free surface
[freesurf_temp]
type = ADFunctionDirichletBC
variable = temp
boundary = exterior
function = temp_bc
extra_vector_tags = 'ref'
[]
# fix concentration on free surface
[freesurf_conc]
type = ADDirichletBC
variable = conc
boundary = exterior
value = 0.0
extra_vector_tags = 'ref'
[]
[PlenumPressure] # apply plenum pressure on clad inner walls and pellet surfaces
[plenumPressure]
boundary = BufferGapVol
initial_pressure = 0
startup_time = 1.0e4
R = 8.3145
output_initial_moles = initial_moles # coupling to post processor to get initial fill gas mass
temperature = ave_temp_interior # coupling to post processor to get gas temperature approximation
volume = volumeGas # coupling to post processor to get gas volume
material_input = 'fis_gas_released co_production' # coupling to post processor to get fission gas added, co added
output = plenum_pressure # coupling to post processor to output plenum/gap pressure
[]
[]
[]
[Materials]
[flux]
type = ADFastNeutronFlux
calculate_fluence = true
factor = 5e17
[]
[fission_gas_release] # Sifgrs fission gas release mode
type = ADUO2Sifgrs
block = fuel
temperature = temp
fission_rate = fission_rate # coupling to fission_rate aux variable
grain_radius_const = 5.0e-6
[]
[fuel_thermal]
type = ADUO2Thermal
thermal_conductivity_model = FINK_LUCUTA
block = fuel
temperature = temp
burnup = burnup
initial_porosity = 0.0
[]
[fuel_swelling]
type = ADUO2VolumetricSwellingEigenstrain
gas_swelling_model_type = MATPRO
block = fuel
temperature = temp
burnup = burnup
eigenstrain_name = 'swelling_strain'
initial_fuel_density = ${initial_fuel_density}
[]
[fuel_stress]
type = ADComputeFiniteStrainElasticStress
block = 'fuel'
[]
[fuel_elasticity]
type = ADComputeIsotropicElasticityTensor
block = fuel
youngs_modulus = 2.2e11
poissons_ratio = .345
[]
[fuel_thermal_strain]
type = ADComputeThermalExpansionEigenstrain
block = fuel
thermal_expansion_coeff = 10e-6
stress_free_temperature = 1500.0
eigenstrain_name = thermal_strain
temperature = temp
[]
[fuel_den]
type = ADStrainAdjustedDensity
block = fuel
strain_free_density = ${initial_fuel_density} # kg/m^3
[]
[fuel_conc]
type = ADArrheniusDiffusionCoef
block = fuel
d1 = 5.6e-8 # m^2/s
q1 = 209.0e+3 # J/mol
d2 = 5.2e-4 # m^2/s
q2 = 362.0e+3 # J/mol
gas_constant = 8.3143 # J/K-mol
temperature = temp
[]
[buffer_eigenstrain]
type = ADPyCIrradiationEigenstrain
block = buffer
pyc_type = buffer
eigenstrain_name = 'swelling_strain'
[]
[buffer_thermal_strain]
type = ADComputeThermalExpansionEigenstrain
block = buffer
thermal_expansion_coeff = 5.65e-6
stress_free_temperature = 1500.0
eigenstrain_name = thermal_strain
temperature = temp
[]
[buffer_elasticity]
type = ADComputeIsotropicElasticityTensor
block = buffer
youngs_modulus = 2e10
poissons_ratio = .23
[]
[buffer_stress]
type = ADPyCCreep
block = buffer
temperature = temp
[]
[buffer_temp]
type = ADHeatConductionMaterial
block = buffer
thermal_conductivity = 0.5 # J/m-s-K
specific_heat = 720.0 # J/kg-K
[]
[buffer_den]
type = ADStrainAdjustedDensity
strain_free_density = 1000.0 #kg/m^3
block = buffer
[]
[buffer_conc]
type = ADArrheniusDiffusionCoef
block = buffer
d1 = 1.0e-12 # m^2/s
q1 = 0.0
d2 = 0.0
q2 = 0.0
gas_constant = 8.3143 # J/K-mol
temperature = temp
[]
[buffer_partial_pressure]
type = ADSorptionPartialPressure
A = 19.33
B = -47290
D = 1.518
E = 4338
d1 = 3.397
d2 = 6.15e-4
unit_scale = 1e3 # convert from mol to mmol
density = 1000 # convert from mmol/m^3 to mmol/kg, using constant for compatibility with default AD derivative container size
concentration = conc
temperature = temp
block = buffer
outputs = 'all'
output_properties = partial_pressure
[]
[normal_vectors_triso]
type = NormalVectorsTRISO
block = 'IPyC OPyC buffer'
[]
[IPyC_eigenstrain]
type = ADPyCIrradiationEigenstrain
block = IPyC
pyc_type = dense
eigenstrain_name = 'swelling_strain'
[]
[IPyC_thermal_strain]
type = ADComputeThermalExpansionEigenstrain
block = IPyC
thermal_expansion_coeff = 5.65e-6
stress_free_temperature = 1500.0
eigenstrain_name = thermal_strain
temperature = temp
[]
[IPyC_elasticity]
type = ADComputeIsotropicElasticityTensor
block = IPyC
youngs_modulus = 4.74e10
poissons_ratio = .23
[]
[IPyC_disp]
type = ADPyCCreep
block = 'IPyC OPyC'
temperature = temp
[]
[IPyC_temp]
type = ADHeatConductionMaterial
block = 'IPyC OPyC'
thermal_conductivity = 4.0
specific_heat = 720.0
[]
[IPyC_den]
type = ADStrainAdjustedDensity
block = 'IPyC OPyC'
strain_free_density = 1900.0
[]
[IPyC_conc]
type = ADArrheniusDiffusionCoef
block = IPyC
d1 = 6.3e-8
q1 = 222.0e+3
d2 = 0.0
q2 = 0.0
gas_constant = 8.3143 # J/K-mol
temperature = temp
[]
[IPyC_partial_pressure]
type = ADSorptionPartialPressure
A = 19.33
B = -47290
D = 1.518
E = 4338
d1 = 3.397
d2 = 6.15e-4
unit_scale = 1e3 # convert from mol to mmol
density = 1900 # convert from mmol/m^3 to mmol/kg, using constant for compatibility with default AD derivative container size
concentration = conc
temperature = temp
block = IPyC
outputs = 'all'
output_properties = partial_pressure
[]
[SiC_thermal_strain]
type = ADComputeThermalExpansionEigenstrain
block = SiC
thermal_expansion_coeff = 4.9e-6
stress_free_temperature = 1500.0
eigenstrain_name = thermal_strain
temperature = temp
[]
[SiC_elasticity]
type = ADComputeIsotropicElasticityTensor
block = SiC
youngs_modulus = 3.4e11
poissons_ratio = .13
[]
[SiC_creep]
type = ADMonolithicSiCCreepUpdate
block = SiC
temperature = temp
k_function = k_function
[]
[SiC_stress]
type = ADComputeMultipleInelasticStress
block = SiC
inelastic_models = 'SiC_creep'
[]
[SiC_temp]
type = ADHeatConductionMaterial
block = SiC
thermal_conductivity = 13.9 # J/m-s-K
specific_heat = 620.0 # J/kg-K
[]
[SiC_den]
type = ADStrainAdjustedDensity
strain_free_density = 3180.0 # kg/m^3
block = SiC
[]
[SiC_conc]
type = ADArrheniusDiffusionCoef
block = SiC
d1 = 5.5e-14 # m^2/s
d1_function = d1_function
d1_function_variable = fluence
q1 = 125.0e+3 # J/mol
d2 = 1.6e-2 # m^2/s
q2 = 514.0e+3 # J/mol
gas_constant = 8.3143 # J/K-mol
temperature = temp
[]
[OPyC_eigenstrain]
type = ADPyCIrradiationEigenstrain
block = OPyC
pyc_type = dense
eigenstrain_name = 'swelling_strain'
[]
[OPyC_thermal_strain]
type = ADComputeThermalExpansionEigenstrain
block = OPyC
thermal_expansion_coeff = 5.65e-6
stress_free_temperature = 1500.0
eigenstrain_name = thermal_strain
temperature = temp
[]
[OPyC_elasticity]
type = ADComputeIsotropicElasticityTensor
block = OPyC
youngs_modulus = 4.74e10
poissons_ratio = .23
[]
[OPyC_conc]
type = ADArrheniusDiffusionCoef
block = OPyC
d1 = 6.3e-8 # m^2/s
q1 = 222.0e+3 # J/mol
d2 = 0.0
q2 = 0.0
gas_constant = 8.3143 # J/K-mol
temperature = temp
[]
[]
[Dampers]
[temp]
type = MaxIncrement
variable = temp
max_increment = 50
[]
[]
[Debug]
show_var_residual_norms = true
[]
[Preconditioning]
[SMP]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew'
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-14'
snesmf_reuse_base = false
line_search = 'none'
nl_rel_tol = 5e-4
nl_abs_tol = 1e-10
nl_max_its = 20
l_max_its = 8
start_time = 0.0
end_time = 85.3682e6
dt = 100
dtmax = 2e6
dtmin = 1
[TimeStepper]
type = IterationAdaptiveDT
dt = 100
optimal_iterations = 10
growth_factor = 1.5
linear_iteration_ratio = 100
time_t = '0 76e6 76.001e6 84.641e6 84.6482e6'
time_dt = '20 20 20 20 20'
[]
[Predictor]
type = SimplePredictor
scale = 0.5
skip_times_old = '0 76e6 76.001e6 84.641e6 84.6482e6'
[]
[]
[Outputs]
perf_graph = true
exodus = true
[console]
type = Console
max_rows = 25
[]
[csv]
type = CSV
sync_times = '100 6308007 75696087'
sync_only = true
[]
[]
[Postprocessors]
[Cs_release]
type = ADSideDiffusiveFluxIntegral
variable = conc
diffusivity = arrhenius_diffusion_coef
boundary = exterior
execute_on = timestep_end
[]
[dt]
type = TimestepSize
execute_on = timestep_end
[]
[fis_gas_produced] # fission gas produced (moles)
type = ADElementIntegralFisGasGeneratedSifgrs
block = fuel
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[fis_gas_released] # fission gas released to plenum (moles)
type = ADElementIntegralFisGasReleasedSifgrs
block = fuel
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[volumeTotal]
type = InternalVolume
boundary = exterior
execute_on = 'initial timestep_end'
[]
[volumeFuel]
type = InternalVolume
boundary = fuel
execute_on = 'initial timestep_end'
[]
[volumeGas]
type = InternalVolume
boundary = BufferGapVol
# ro = 3.125e-4
# ri = 2.125e-4
# vb = 4/3*pi*(ro^3-ri^3) = 8.76e-11
# buffer density = 1000
# PyC density = 1900
# fill ratio = 10/19
# vb*10/19 = 4.6e-11
# Must remove 4.6e-11 m^3 from the volume
addition = -4.6e-11
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[volumeBufferShell]
type = InternalVolume
boundary = BufferGapVol
execute_on = 'initial timestep_end'
[]
[ave_temp_interior]
type = SideAverageValue
boundary = BufferGapVol
variable = temp
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
# Postprocessors for CO production
[total_fission_rate]
type = ElementIntegralPower
variable = temp
fission_rate = fission_rate
block = fuel
energy_per_fission = 1.0
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[total_fissions]
type = TimeIntegratedPostprocessor
value = total_fission_rate
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[avg_surface_temp]
type = SideAverageValue
variable = temp
boundary = exterior
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[time_int_surf_temp]
type = TimeIntegratedPostprocessor
value = avg_surface_temp
execute_on = 'initial linear nonlinear timestep_begin timestep_end'
[]
[co_production]
type = CarbonMonoxideProduction
total_fissions = total_fissions
time_integrated_triso_temperature = time_int_surf_temp
initial_enrichment = 0.14029
execute_on = 'initial linear nonlinear timestep_begin 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
[]
[buffer_integral_flux]
type = ADSideDiffusiveFluxIntegral
variable = conc
boundary = 17
diffusivity = arrhenius_diffusion_coef
[]
[IPyC_integral_flux]
type = ADSideDiffusiveFluxIntegral
variable = conc
boundary = 15
diffusivity = arrhenius_diffusion_coef
[]
[buffer_partial_pressure]
type = ADSideAverageMaterialProperty
property = partial_pressure
boundary = 17
[]
[IPyC_partial_pressure]
type = ADSideAverageMaterialProperty
property = partial_pressure
boundary = 15
[]
[integral_flux_error]
type = FunctionValuePostprocessor
function = integral_flux_error
[]
[partial_pressure_error]
type = FunctionValuePostprocessor
function = partial_pressure_error
[]
[integral_Cs_release]
type = TimeIntegratedPostprocessor
value = Cs_release
[]
[Cs_production]
type = FunctionValuePostprocessor
function = power_history
scale_factor = 1.22e-5 # units of moles/m**3-s
[]
[time_integral_Cs_production]
type = TimeIntegratedPostprocessor
value = Cs_production
[]
[volumeFuel_initial]
type = InternalVolume
boundary = fuel
execute_on = initial
[]
[integral_Cs_production]
type = ParsedPostprocessor
pp_names = 'time_integral_Cs_production volumeFuel_initial'
expression = 'time_integral_Cs_production * volumeFuel_initial'
[]
[Cs_release_fraction]
type = ParsedPostprocessor
pp_names = 'integral_Cs_release integral_Cs_production'
expression = 'integral_Cs_release / integral_Cs_production'
[]
[]
[VectorPostprocessors]
[temperaturevpp]
type = SideValueSampler
boundary = 11
variable = temp
sort_by = x
outputs = 'csv'
use_displaced_mesh = true
[]
[]
(test/tests/species_source/ad_Kr_exact.i)
#
# This test checks whether the species source for krypton is operating
# as intended in AD. The amount of strontium produced in SpeciesSourceMaterial
# is checked against the amount computed through a ParsedMaterial.
#
# If correct, the 'diff' Postprocessor will have a value close to zero,
# and the 'fraction' Postprocessor will be one.
#
[GlobalParams]
initial_enrichment = 0.2
[]
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 1
[]
[]
[Variables]
[conc]
[]
[]
[AuxVariables]
[temperature]
initial_condition = 1000
[]
[]
[Kernels]
[conc_dt]
type = ADTimeDerivative
variable = conc
[]
[conc_diffusion]
type = ADArrheniusDiffusion
variable = conc
arrhenius_prpty_name = diff_coef
[]
[conc_source]
type = ADSpeciesSourceRate
variable = conc
property_name = conc_generation
[]
[]
[BCs]
[conc]
type = ADFunctionDirichletBC
variable = conc
boundary = 'left right'
function = '.1 * t + .1'
[]
[]
[Materials]
[fission_rate]
type = ADGenericFunctionMaterial
prop_names = fission_rate
prop_values = 'if(t=0,0,t*t*1e17)'
[]
[diff_coef]
type = ADArrheniusDiffusionCoef
temperature = temperature
d1 = 1e-6
q1 = 100e3
arrhenius_prpty_name = diff_coef
[]
[conc_generation]
type = ADSpeciesSourceMaterial
property_name = conc_generation
kind = Kr
[]
[conc_generation_exact]
type = ADParsedMaterial
property_name = conc_generation_exact
material_property_names = 'fission_rate'
constant_names = 'c avo'
constant_expressions = '0.297 6.02214076e23'
expression = 'c/avo*fission_rate'
[]
[]
[Executioner]
type = Transient
num_steps = 10
[]
[Postprocessors]
[conc]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation
execute_on = 'initial timestep_end'
[]
[conc_exact]
type = ADElementIntegralMaterialProperty
mat_prop = conc_generation_exact
execute_on = 'initial timestep_end'
[]
[diff]
type = DifferencePostprocessor
value1 = 'conc'
value2 = 'conc_exact'
outputs = console
execute_on = 'initial timestep_end'
[]
[fraction]
type = FractionalRelease
released = conc
total = conc_exact
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
csv = true
[]
(test/tests/arrhenius_diffusion_coef/ad_2d_arrhenius.i)
[Mesh]
[mesh]
type = FileMeshGenerator
file = square.e
[]
[]
[Variables]
[u]
order = FIRST
family = LAGRANGE
initial_condition = .5
[]
[temp]
order = FIRST
family = LAGRANGE
initial_condition = 1100
[]
[]
[Kernels]
[diff]
type = ADArrheniusDiffusion
variable = u
[]
[heat]
type = ADHeatConduction
variable = temp
[]
[]
[BCs]
[left]
type = ADDirichletBC
variable = u
boundary = 1
value = 0
[]
[right]
type = ADDirichletBC
variable = u
boundary = 2
value = 1
[]
[leftt]
type = ADDirichletBC
variable = temp
boundary = 1
value = 1100
[]
[rightt]
type = ADDirichletBC
variable = temp
boundary = 2
value = 1200
[]
[]
[Materials]
[UO2_thermal]
type = ADHeatConductionMaterial
block = 1
thermal_conductivity = 1.0
specific_heat = 1.0
[]
[UO2_cesium_diffusion]
type = ADArrheniusDiffusionCoef
d1 = 5.6e-8
q1 = 2.09e5
d2 = 5.2e-4
q2 = 3.62e5
block = 1
temperature = temp
[]
[]
[Executioner]
type = Steady
solve_type = 'PJFNK'
petsc_options_iname = '-pc_type -pc_hypre_type'
petsc_options_value = 'hypre boomeramg'
nl_rel_tol = 1e-14
nl_abs_tol = 1e-50
nl_abs_step_tol = 1e-15
l_tol = 1e-14
l_max_its = 100
[]
[Outputs]
execute_on = 'timestep_end'
exodus = true
[]