- bubble_concentrationName of material property for bubble number density
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Name of material property for bubble number density
- temperatureCoupled temperature variable
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:Coupled temperature variable
UPuZrHotPressingStressUpdate
Computes the inelastic strain due to hot pressing of UPuZr fuel as a function of temperature, stress, and the plenum pressure.
Description
UPuZrHotPressingStressUpdate is used to model the pore collapse of fission gas bubbles due to compressive hydrostatic stress. The model is based on the experimental and theoretical work from McDeavitt and Solomon (1996). While the formulation used here can only be used for approximate strain rates, it is allows for implementation of a temperature and stress-dependent hot pressing strain rate in the absence of a fully viscoplastic mechanistic model.
The hot pressing plastic strain rate defined by McDeavitt and Solomon (1996) is a combined diffusion-controlled cavitation, established by Speight and Beere (1975) and Beere and Speight (1978), combined with a creep-flow model established by Needleman and Rice (1980), and further refined by Chen and Argon (1981). McDeavitt and Solomon (1996) define the linear hot pressing strain rate as, where , , and are the temperature dependent pre-factor, shape function, and driving force respectively, is the bubble concentration, [] is the atomic volume, [J/K], is temperature in [K], is the compressive hydrostatic stress (i.e., ), is the internal pressure in the porosity (i.e., the pressure of the plenum assuming interconnected bubbles), is the surface energy, and is the estimated radius of the pores, computed from the porosity, . is given in units of [].
The shape function is defined by Beere and Speight (1978) as, where is defined by Chen and Argon (1981) as, Here and are the far-field creep stress and creep rate, where is described by McDeavitt and Solomon (1996) as, where is half the distance between pores. can be defined either by the value used by McDeavitt and Solomon (1996): or by the formulation defined in ADUPuZrCreepUpdate.
is computed using a similar method to the RadialReturnStressUpdate used for deviatoric creep. Given the linear scalar inelastic strain rate, the total inelastic strain due to hot pressing is , where is a rank two identity tensor. This strain is computed via ADComputeMultipleInelasticStress, along with all other strains (e.g., creep and fission gas swelling). The total porosity is computed given the change in the volumetric strain rate via ADPorosityFromStrain.
Due to the high pressure of gas in non-interconnected fission gas pores, hot pressing is only allowed to occur when all porosity becomes locally interconnected. In this way, fission gas pores will only monotonically increase due to fission gas swelling, and then change size due to the hot pressing only after full interconnection. In addition, the hot pressing rate can be limited via the 'porosity_start' and 'porosity_end' parameters, which are utilized through the MathUtils::smootherStep function from MathUtils.h, where is the porosity limited hot pressing strain, is the porosity, is the porosity value at which hot pressing starts to be limited, and is the porosity value at which hot pressing is terminated. Typical values of these are and .
While, in general, the implementation of the hot pressing strain here may be applicable to tensile stress (e.g., porosity growth), it is typically limited to activate when pores are subjected to compressive stress (e.g., pore collapse). With the addition of the surface energy term, there is a possibility to have a tensile bulk stress with a net compressive stress on the pores, especially with little or no . To combat this, the restriction is enforced, which is generally consistent during reactor operation as the plenum pressure is on the order of [MPa].
Example Input Syntax
[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
[hot_press]
type = ADUPuZrHotPressingStressUpdate<<<{"description": "Computes the inelastic strain due to hot pressing of UPuZr fuel as a function of temperature, stress, and the plenum pressure.", "href": "UPuZrHotPressingStressUpdate.html"}>>>
temperature<<<{"description": "Coupled temperature variable"}>>> = temp
surface_energy<<<{"description": "Surface energy of material (J/m^2)"}>>> = 1
bubble_concentration<<<{"description": "Name of material property for bubble number density"}>>> = 1e15
plenum_pressure<<<{"description": "Coupled postprocessor that provies the plenum pressure."}>>> = 2.5e5
max_inelastic_increment<<<{"description": "The maximum inelastic strain increment allowed in a time step"}>>> = 0.001
interconnectivity<<<{"description": "Interconnectivity material property name"}>>> = interconnectivity
outputs<<<{"description": "Vector of output names where you would like to restrict the output of variables(s) associated with this object"}>>> = all
internal_solve_full_iteration_history<<<{"description": "Set true to output full internal Newton iteration history at times determined by `internal_solve_output_on`. If false, only a summary is output."}>>> = true
[]
[](test/tests/solid_mechanics/upuzr_hot_pressing/ad.i)UPuZrHotPressingStressUpdate must be run in conjunction with the inelastic strain return mapping stress calculator as shown below:
[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
[fuel_stress]
type = ADComputeMultipleInelasticStress<<<{"description": "Compute state (stress and internal parameters such as plastic strains and internal parameters) using an iterative process. Combinations of creep models and plastic models may be used.", "href": "../ADComputeMultipleInelasticStress.html"}>>>
inelastic_models<<<{"description": "The material objects to use to calculate stress and inelastic strains. Note: specify creep models first and plasticity models second."}>>> = 'hot_press gas_swelling'
[]
[](test/tests/solid_mechanics/upuzr_hot_pressing/ad.i)Input Parameters
- absolute_tolerance1e-11Absolute convergence tolerance for Newton iteration
Default:1e-11
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Absolute convergence tolerance for Newton iteration
- acceptable_multiplier10Factor applied to relative and absolute tolerance for acceptable convergence if iterations are no longer making progress
Default:10
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Factor applied to relative and absolute tolerance for acceptable convergence if iterations are no longer making progress
- allow_pore_growthFalseFlag to optionally allow for bubble growth due to tensile hydrostatic stresses.
Default:False
C++ Type:bool
Controllable:No
Description:Flag to optionally allow for bubble growth due to tensile hydrostatic stresses.
- alpha_transition_end973Temperature at which the alpha phase finishes transitioning out. The further away from alpha_transition_start this parameter is, the better smoother the transition between creep regimes
Default:973
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Temperature at which the alpha phase finishes transitioning out. The further away from alpha_transition_start this parameter is, the better smoother the transition between creep regimes
- alpha_transition_start923Temperature at which the alpha phase starts to transition out.
Default:923
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Temperature at which the alpha phase starts to transition out.
- atomic_volume2.15e-29Atomic volume of the fission gas in [m3 per atom]
Default:2.15e-29
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Atomic volume of the fission gas in [m3 per atom]
- automatic_differentiation_return_mappingFalseWhether to use automatic differentiation to compute the derivative.
Default:False
C++ Type:bool
Controllable:No
Description:Whether to use automatic differentiation to compute the derivative.
- base_nameOptional parameter that defines a prefix for all material properties related to this stress update model. This allows for multiple models of the same type to be used without naming conflicts.
C++ Type:std::string
Controllable:No
Description:Optional parameter that defines a prefix for all material properties related to this stress update model. This allows for multiple models of the same type to be used without naming conflicts.
- 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
- 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
- creep_modelMCDEAVITTCreep model. Choices are: MFH MCDEAVITT
Default:MCDEAVITT
C++ Type:MooseEnum
Options:MFH, MCDEAVITT
Controllable:No
Description:Creep model. Choices are: MFH MCDEAVITT
- 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.
- fission_rateFission rate material property name
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Fission rate material property name
- grain_boundary_D03.24e-11Prefactor for grain boundary diffusion times grain boundary width.
Default:3.24e-11
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Prefactor for grain boundary diffusion times grain boundary width.
- grain_boundary_Q186600Activation energy for grain boundary diffusion times grain boundary width.
Default:186600
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Activation energy for grain boundary diffusion times grain boundary width.
- initial_porosity0Initial porosity
Default:0
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Initial porosity
- interconnectivityinterconnectivityInterconnectivity material property name
Default:interconnectivity
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Interconnectivity material property name
- interconnectivity_limit1Interconnectivity value used to turn on hot pressing when interconnectivity from the previous time step is above this limit
Default:1
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Interconnectivity value used to turn on hot pressing when interconnectivity from the previous time step is above this limit
- lower_interconnectivity_limitinterconnectivity_limit >= 0.0 & interconnectivity_limit <= 1.0Lower interconnectivity used to smoothly transition to hot pressing from this limit to 'interconnectivity_limit'. If no value is provided, the hot pressing rate will turned on for all interconnectivity values above 'interconnectivity_limit'
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:interconnectivity_limit >= 0.0 & interconnectivity_limit <= 1.0Lower interconnectivity used to smoothly transition to hot pressing from this limit to 'interconnectivity_limit'. If no value is provided, the hot pressing rate will turned on for all interconnectivity values above 'interconnectivity_limit'
- max_inelastic_increment0.001The maximum inelastic strain increment allowed in a time step
Default:0.001
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:The maximum inelastic strain increment allowed in a time step
- negative_behaviorINITIAL_CONDITIONEnum how to handle negative porosities
Default:INITIAL_CONDITION
C++ Type:MooseEnum
Options:ZERO, INITIAL_CONDITION, EXCEPTION
Controllable:No
Description:Enum how to handle negative porosities
- plenum_pressureplenum_pressureCoupled postprocessor that provies the plenum pressure.
Default:plenum_pressure
C++ Type:PostprocessorName
Unit:(no unit assumed)
Controllable:No
Description:Coupled postprocessor that provies the plenum pressure.
- porosity_end0Material property name for the value of the porosity at which the hot pressing rate goes to zero.
Default:0
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Material property name for the value of the porosity at which the hot pressing rate goes to zero.
- porosity_nameporosityName of porosity material property
Default:porosity
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Name of porosity material property
- porosity_start0Material property name for the value of the porosity at which the hot pressing rate starts to be limited.
Default:0
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Material property name for the value of the porosity at which the hot pressing rate starts to be limited.
- relative_tolerance1e-08Relative convergence tolerance for Newton iteration
Default:1e-08
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Relative convergence tolerance for Newton iteration
- scalar1Scalar material mutliplied by the effective hot pressing strain
Default:1
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:Scalar material mutliplied by the effective hot pressing strain
- surface_energy0Surface energy of material (J/m^2)
Default:0
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Surface energy of material (J/m^2)
- total_strain_base_nameBase name for the total strain
C++ Type:std::string
Controllable:No
Description:Base name for the total strain
- verboseFalseFlag to output verbose information
Default:False
C++ Type:bool
Controllable:No
Description:Flag to output verbose information
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
- inelastic_strain_namehot_pressing_strainName of the material property that stores the effective inelastic strain
Default:hot_pressing_strain
C++ Type:std::string
Controllable:No
Description:Name of the material property that stores the effective inelastic strain
- 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
- internal_solve_full_iteration_historyFalseSet true to output full internal Newton iteration history at times determined by `internal_solve_output_on`. If false, only a summary is output.
Default:False
C++ Type:bool
Controllable:No
Description:Set true to output full internal Newton iteration history at times determined by `internal_solve_output_on`. If false, only a summary is output.
- internal_solve_output_onon_errorWhen to output internal Newton solve information
Default:on_error
C++ Type:MooseEnum
Options:never, on_error, always
Controllable:No
Description:When to output internal Newton solve information
Debug Parameters
- output_propertiesList of material properties, from this material, to output (outputs must also be defined to an output type)
C++ Type:std::vector<std::string>
Controllable:No
Description:List of material properties, from this material, to output (outputs must also be defined to an output type)
- outputsnone Vector of output names where you would like to restrict the output of variables(s) associated with this object
Default:none
C++ Type:std::vector<OutputName>
Controllable:No
Description:Vector of output names where you would like to restrict the output of variables(s) associated with this object
Outputs Parameters
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Default:False
C++ Type:bool
Controllable:No
Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Material Property Retrieval Parameters
Input Files
- (assessment/metallic_fuel/FBTA/analysis/steady_state/common_inputs/test_base.i)
- (test/tests/solid_mechanics/upuzr_hot_pressing/exact_grow.i)
- (assessment/metallic_fuel/EBRII/X447/analysis/enhancement/x447_enh_base.i)
- (test/tests/solid_mechanics/upuzr_hot_pressing/interconnectivity_decrease_exact.i)
- (test/tests/solid_mechanics/upuzr_hot_pressing/ad.i)
- (assessment/metallic_fuel/WPF/analysis/X425_T418/X425_base.i)
- (test/tests/solid_mechanics/upuzr_hot_pressing/exact.i)
- (test/tests/solid_mechanics/upuzr_hot_pressing/exact_upuzrcreep.i)
- (assessment/metallic_fuel/FBTA/analysis/steady_state/AK181/181193/IFR1_181193.i)
- (assessment/metallic_fuel/WPF/analysis/FM-1/FM_base.i)
References
- W. Beere and M. V. Speight.
Creep cavitation by vacancy diffusion in plastically deforming solid.
Metal Science, 12:172–176, 1978.
doi:10.1179/msc.1978.12.4.172.[BibTeX]
@article{Beere1978172, author = "Beere, W. and Speight, M. V.", title = "{Creep cavitation by vacancy diffusion in plastically deforming solid}", journal = "Metal Science", year = "1978", volume = "12", pages = "172--176", doi = "10.1179/msc.1978.12.4.172" } - I. W. Chen and A. S. Argon.
Diffusive Growth of Grain-boundary Cavities.
Acta Metallurgica, 29:1759–1768, 1981.
doi:10.1016/0001-6160(81)90009-2.[BibTeX]
@article{Chen19811759, author = "Chen, I. W. and Argon, A. S.", title = "{Diffusive Growth of Grain-boundary Cavities}", journal = "Acta Metallurgica", year = "1981", volume = "29", pages = "1759--1768", doi = "10.1016/0001-6160(81)90009-2" } - S. M. McDeavitt and A. A. Solomon.
Hot-isostatic pressing of U-10Zr by a coupled grain boundary diffusion and creep cavitation mechanism.
Journal of Nuclear Materials, 228:184–200, 1996.
doi:10.1016/S0022-3115(95)00220-0.[BibTeX]
@article{McDeavitt1996184, author = "McDeavitt, S. M. and Solomon, A. A.", title = "{Hot-isostatic pressing of U-10Zr by a coupled grain boundary diffusion and creep cavitation mechanism}", journal = "Journal of Nuclear Materials", year = "1996", volume = "228", pages = "184--200", doi = "10.1016/S0022-3115(95)00220-0" } - A. Needleman and J. R. Rice.
Plastic creep flow effects in the diffusive cavitation of grain boundaries.
Acta Metallurgica, 28(10):1315–1332, October 1980.
doi:10.1016/0001-6160(80)90001-2.[BibTeX]
@article{Needleman19801315, author = "Needleman, A. and Rice, J. R.", title = "{Plastic creep flow effects in the diffusive cavitation of grain boundaries}", journal = "Acta Metallurgica", year = "1980", volume = "28", number = "10", pages = "1315--1332", month = "October", doi = "10.1016/0001-6160(80)90001-2" } - M. V. Speight and W. Beere.
Vacancy Potential and Void Growth on Grain Boundaries.
Metal Science, 9:190–191, 1975.
doi:10.1179/030634575790445161.[BibTeX]
@article{Speight1975190, author = "Speight, M. V. and Beere, W.", title = "{Vacancy Potential and Void Growth on Grain Boundaries}", journal = "Metal Science", year = "1975", volume = "9", pages = "190--191", doi = "10.1179/030634575790445161" }
(moose/framework/include/utils/MathUtils.h)
// This file is part of the MOOSE framework
// https://mooseframework.inl.gov
//
// All rights reserved, see COPYRIGHT for full restrictions
// https://github.com/idaholab/moose/blob/master/COPYRIGHT
//
// Licensed under LGPL 2.1, please see LICENSE for details
// https://www.gnu.org/licenses/lgpl-2.1.html
#pragma once
#include "Moose.h"
#include "MooseError.h"
#include "MooseTypes.h"
#include "libmesh/libmesh.h"
#include "libmesh/utility.h"
#include "libmesh/numeric_vector.h"
#include "libmesh/compare_types.h"
#include "libmesh/point.h"
namespace MathUtils
{
/// std::sqrt is not constexpr, so we add sqrt(2) as a constant (used in Mandel notation)
static constexpr Real sqrt2 = 1.4142135623730951;
Real poly1Log(Real x, Real tol, unsigned int derivative_order);
Real poly2Log(Real x, Real tol, unsigned int derivative_order);
Real poly3Log(Real x, Real tol, unsigned int derivative_order);
Real poly4Log(Real x, Real tol, unsigned int derivative_order);
Real taylorLog(Real x);
/**
* Evaluate Cartesian coordinates of any center point of a triangle given Barycentric
* coordinates of center point and Cartesian coordinates of triangle's vertices
* @param p0,p1,p2 are the three non-collinear vertices in Cartesian coordinates
* @param b0,b1,b2 is the center point in barycentric coordinates with b0+b1+b2=1, e.g.
* (1/3,1/3,1/3) for a centroid
* @return the center point of triangle in Cartesian coordinates
*/
Point barycentricToCartesian2D(const Point & p0,
const Point & p1,
const Point & p2,
const Real b0,
const Real b1,
const Real b2);
/**
* Evaluate Cartesian coordinates of any center point of a tetrahedron given Barycentric
* coordinates of center point and Cartesian coordinates of tetrahedon's vertices
* @param p0,p1,p2,p3 are the three non-coplanar vertices in Cartesian coordinates
* @param b0,b1,b2,b3 is the center point in barycentric coordinates with b0+b1+b2+b3=1, e.g.
* (1/4,1/4,1/4,1/4) for a centroid.
* @return the center point of tetrahedron in Cartesian coordinates
*/
Point barycentricToCartesian3D(const Point & p0,
const Point & p1,
const Point & p2,
const Point & p3,
const Real b0,
const Real b1,
const Real b2,
const Real b3);
/**
* Evaluate circumcenter of a triangle given three arbitrary points
* @param p0,p1,p2 are the three non-collinear vertices in Cartesian coordinates
* @return the circumcenter in Cartesian coordinates
*/
Point circumcenter2D(const Point & p0, const Point & p1, const Point & p2);
/**
* Evaluate circumcenter of a tetrahedrom given four arbitrary points
* @param p0,p1,p2,p3 are the four non-coplanar vertices in Cartesian coordinates
* @return the circumcenter in Cartesian coordinates
*/
Point circumcenter3D(const Point & p0, const Point & p1, const Point & p2, const Point & p3);
template <typename T>
T
round(T x)
{
return ::round(x); // use round from math.h
}
template <typename T>
T
sign(T x)
{
return x >= 0.0 ? 1.0 : -1.0;
}
template <typename T>
T
pow(T x, int e)
{
bool neg = false;
T result = 1.0;
if (e < 0)
{
neg = true;
e = -e;
}
while (e)
{
// if bit 0 is set multiply the current power of two factor of the exponent
if (e & 1)
result *= x;
// x is incrementally set to consecutive powers of powers of two
x *= x;
// bit shift the exponent down
e >>= 1;
}
return neg ? 1.0 / result : result;
}
template <typename T>
T
heavyside(T x)
{
return x < 0.0 ? 0.0 : 1.0;
}
template <typename T>
T
regularizedHeavyside(T x, Real smoothing_length)
{
if (x <= -smoothing_length)
return 0.0;
else if (x < smoothing_length)
return 0.5 * (1 + std::sin(libMesh::pi * x / 2 / smoothing_length));
else
return 1.0;
}
template <typename T>
T
regularizedHeavysideDerivative(T x, Real smoothing_length)
{
if (x < smoothing_length && x > -smoothing_length)
return 0.25 * libMesh::pi / smoothing_length *
(std::cos(libMesh::pi * x / 2 / smoothing_length));
else
return 0.0;
}
template <typename T>
T
positivePart(T x)
{
return x > 0.0 ? x : 0.0;
}
template <typename T>
T
negativePart(T x)
{
return x < 0.0 ? x : 0.0;
}
template <
typename T,
typename T2,
typename T3,
typename std::enable_if<libMesh::ScalarTraits<T>::value && libMesh::ScalarTraits<T2>::value &&
libMesh::ScalarTraits<T3>::value,
int>::type = 0>
void
addScaled(const T & a, const T2 & b, T3 & result)
{
result += a * b;
}
template <typename T,
typename T2,
typename T3,
typename std::enable_if<libMesh::ScalarTraits<T>::value, int>::type = 0>
void
addScaled(const T & scalar,
const libMesh::NumericVector<T2> & numeric_vector,
libMesh::NumericVector<T3> & result)
{
result.add(scalar, numeric_vector);
}
template <
typename T,
typename T2,
template <typename>
class W,
template <typename>
class W2,
typename std::enable_if<std::is_same<typename W<T>::index_type, unsigned int>::value &&
std::is_same<typename W2<T2>::index_type, unsigned int>::value,
int>::type = 0>
typename libMesh::CompareTypes<T, T2>::supertype
dotProduct(const W<T> & a, const W2<T2> & b)
{
return a * b;
}
template <typename T,
typename T2,
template <typename>
class W,
template <typename>
class W2,
typename std::enable_if<std::is_same<typename W<T>::index_type,
std::tuple<unsigned int, unsigned int>>::value &&
std::is_same<typename W2<T2>::index_type,
std::tuple<unsigned int, unsigned int>>::value,
int>::type = 0>
typename libMesh::CompareTypes<T, T2>::supertype
dotProduct(const W<T> & a, const W2<T2> & b)
{
return a.contract(b);
}
/**
* Evaluate a polynomial with the coefficients c at x. Note that the Polynomial
* form is
* c[0]*x^s + c[1]*x^(s-1) + c[2]*x^(s-2) + ... + c[s-2]*x^2 + c[s-1]*x + c[s]
* where s = c.size()-1 , which is counter intuitive!
*
* This function will be DEPRECATED soon (10/22/2020)
*
* The coefficient container type can be any container that provides an index
* operator [] and a .size() method (e.g. std::vector, std::array). The return
* type is the supertype of the container value type and the argument x.
* The supertype is the type that can represent both number types.
*/
template <typename C,
typename T,
typename R = typename libMesh::CompareTypes<typename C::value_type, T>::supertype>
R
poly(const C & c, const T x, const bool derivative = false)
{
const auto size = c.size();
if (size == 0)
return 0.0;
R value = c[0];
if (derivative)
{
value *= size - 1;
for (std::size_t i = 1; i < size - 1; ++i)
value = value * x + c[i] * (size - i - 1);
}
else
{
for (std::size_t i = 1; i < size; ++i)
value = value * x + c[i];
}
return value;
}
/**
* Evaluate a polynomial with the coefficients c at x. Note that the Polynomial
* form is
* c[0] + c[1] * x + c[2] * x^2 + ...
* The coefficient container type can be any container that provides an index
* operator [] and a .size() method (e.g. std::vector, std::array). The return
* type is the supertype of the container value type and the argument x.
* The supertype is the type that can represent both number types.
*/
template <typename C,
typename T,
typename R = typename libMesh::CompareTypes<typename C::value_type, T>::supertype>
R
polynomial(const C & c, const T x)
{
auto size = c.size();
if (size == 0)
return 0.0;
size--;
R value = c[size];
for (std::size_t i = 1; i <= size; ++i)
value = value * x + c[size - i];
return value;
}
/**
* Returns the derivative of polynomial(c, x) with respect to x
*/
template <typename C,
typename T,
typename R = typename libMesh::CompareTypes<typename C::value_type, T>::supertype>
R
polynomialDerivative(const C & c, const T x)
{
auto size = c.size();
if (size <= 1)
return 0.0;
size--;
R value = c[size] * size;
for (std::size_t i = 1; i < size; ++i)
value = value * x + c[size - i] * (size - i);
return value;
}
template <typename T, typename T2>
T
clamp(const T & x, T2 lowerlimit, T2 upperlimit)
{
if (x < lowerlimit)
return lowerlimit;
if (x > upperlimit)
return upperlimit;
return x;
}
template <typename T, typename T2>
T
smootherStep(T x, T2 start, T2 end, bool derivative = false)
{
mooseAssert("start < end", "Start value must be lower than end value for smootherStep");
if (x <= start)
return 0.0;
else if (x >= end)
{
if (derivative)
return 0.0;
else
return 1.0;
}
x = (x - start) / (end - start);
if (derivative)
return 30.0 * libMesh::Utility::pow<2>(x) * (x * (x - 2.0) + 1.0) / (end - start);
return libMesh::Utility::pow<3>(x) * (x * (x * 6.0 - 15.0) + 10.0);
}
enum class ComputeType
{
value,
derivative
};
template <ComputeType compute_type, typename X, typename S, typename E>
auto
smootherStep(const X & x, const S & start, const E & end)
{
mooseAssert("start < end", "Start value must be lower than end value for smootherStep");
if (x <= start)
return 0.0;
else if (x >= end)
{
if constexpr (compute_type == ComputeType::derivative)
return 0.0;
if constexpr (compute_type == ComputeType::value)
return 1.0;
}
const auto u = (x - start) / (end - start);
if constexpr (compute_type == ComputeType::derivative)
return 30.0 * libMesh::Utility::pow<2>(u) * (u * (u - 2.0) + 1.0) / (end - start);
if constexpr (compute_type == ComputeType::value)
return libMesh::Utility::pow<3>(u) * (u * (u * 6.0 - 15.0) + 10.0);
}
/**
* Helper function templates to set a variable to zero.
* Specializations may have to be implemented (for examples see
* RankTwoTensor, RankFourTensor).
*/
template <typename T>
inline void
mooseSetToZero(T & v)
{
/**
* The default for non-pointer types is to assign zero.
* This should either do something sensible, or throw a compiler error.
* Otherwise the T type is designed badly.
*/
v = 0;
}
template <typename T>
inline void
mooseSetToZero(T *&)
{
mooseError("mooseSetToZero does not accept pointers");
}
template <>
inline void
mooseSetToZero(std::vector<Real> & vec)
{
for (auto & v : vec)
v = 0.;
}
/**
* generate a complete multi index table for given dimension and order
* i.e. given dim = 2, order = 2, generated table will have the following content
* 0 0
* 1 0
* 0 1
* 2 0
* 1 1
* 0 2
* The first number in each entry represents the order of the first variable, i.e. x;
* The second number in each entry represents the order of the second variable, i.e. y.
* Multiplication is implied between numbers in each entry, i.e. 1 1 represents x^1 * y^1
*
* @param dim dimension of the multi-index, here dim = mesh dimension
* @param order generate the multi-index up to certain order
* @return a data structure holding entries representing the complete multi index
*/
std::vector<std::vector<unsigned int>> multiIndex(unsigned int dim, unsigned int order);
template <ComputeType compute_type, typename X, typename X1, typename X2, typename Y1, typename Y2>
auto
linearInterpolation(const X & x, const X1 & x1, const X2 & x2, const Y1 & y1, const Y2 & y2)
{
const auto m = (y2 - y1) / (x2 - x1);
if constexpr (compute_type == ComputeType::derivative)
return m;
if constexpr (compute_type == ComputeType::value)
return m * (x - x1) + y1;
}
/**
* perform modulo operator for Euclidean division that ensures a non-negative result
* @param dividend dividend of the modulo operation
* @param divisor divisor of the modulo operation
* @return the non-negative remainder when the dividend is divided by the divisor
*/
template <typename T1, typename T2>
std::size_t
euclideanMod(T1 dividend, T2 divisor)
{
return (dividend % divisor + divisor) % divisor;
}
/**
* automatic prefixing for naming material properties based on gradients of coupled
* variables/functors
*/
template <typename T>
T
gradName(const T & base_prop_name)
{
return "grad_" + base_prop_name;
}
/**
* automatic prefixing for naming material properties based on time derivatives of coupled
* variables/functors
*/
template <typename T>
T
timeDerivName(const T & base_prop_name)
{
return "d" + base_prop_name + "_dt";
}
/**
* Computes the Kronecker product of two matrices.
* @param product Reference to the product matrix
* @param mat_A Reference to the first matrix
* @param mat_B Reference to the other matrix
*/
void kron(RealEigenMatrix & product, const RealEigenMatrix & mat_A, const RealEigenMatrix & mat_B);
} // namespace MathUtils
/// A helper function for MathUtils::multiIndex
std::vector<std::vector<unsigned int>> multiIndexHelper(unsigned int N, unsigned int K);
(test/tests/solid_mechanics/upuzr_hot_pressing/ad.i)
# This test is to ensure adequate coupling between ADUPuZrHotPressingStressUpdate
# and other typical thermo-mechanical UPuZr models, especially ADSimpleFissionGasViscoplasticityStressUpdate
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = 0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hot_press gas_swelling'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
bubble_concentration = 1e15
initial_bubble_concentration = 1e15
compute_interconnectivity = true
fission_rate = 3e19
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.999
interconnection_initiating_porosity = 0.22
interconnection_terminating_porosity = 0.28
max_inelastic_increment = 0.001
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.25
initial_porosity = 1e-10
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = 1
bubble_concentration = 1e15
plenum_pressure = 2.5e5
max_inelastic_increment = 0.001
interconnectivity = interconnectivity
outputs = all
internal_solve_full_iteration_history = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 1e7
dt = 1e6
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[disp_x_avg]
type = SideAverageValue
variable = disp_x
boundary = right
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[interconnectivity]
type = ElementAverageValue
variable = interconnectivity
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
exodus = true
[]
(test/tests/solid_mechanics/upuzr_hot_pressing/ad.i)
# This test is to ensure adequate coupling between ADUPuZrHotPressingStressUpdate
# and other typical thermo-mechanical UPuZr models, especially ADSimpleFissionGasViscoplasticityStressUpdate
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = 0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hot_press gas_swelling'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
bubble_concentration = 1e15
initial_bubble_concentration = 1e15
compute_interconnectivity = true
fission_rate = 3e19
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.999
interconnection_initiating_porosity = 0.22
interconnection_terminating_porosity = 0.28
max_inelastic_increment = 0.001
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.25
initial_porosity = 1e-10
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = 1
bubble_concentration = 1e15
plenum_pressure = 2.5e5
max_inelastic_increment = 0.001
interconnectivity = interconnectivity
outputs = all
internal_solve_full_iteration_history = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 1e7
dt = 1e6
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[disp_x_avg]
type = SideAverageValue
variable = disp_x
boundary = right
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[interconnectivity]
type = ElementAverageValue
variable = interconnectivity
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
exodus = true
[]
(assessment/metallic_fuel/FBTA/analysis/steady_state/common_inputs/test_base.i)
# IFR Steady State Irradiation Base Input File
# Inspired by X441 Assessment Case
fipd_submodule_dir = '../../../../../../../fipd-bison-integration-data/'
gap_bottom_length = 0.31e-3
top_bot_cladding_height = 2.24e-3
# calculations
cladding_ir = '${fparse fuel_radius + cladding_gap_width}'
gas_plenum_height = '${fparse plenum_volume / pi / cladding_ir^2}'
fuel_y_start = '${fparse gap_bottom_length + top_bot_cladding_height}'
alpha_start = 877
alpha_end = 936
bubble_concentration = 1e15
cladding_block = 'cladding'
clad_n_rad = 10
[GlobalParams]
order = FIRST
energy_per_fission = 3.2e-11 # J/fission
displacements = 'disp_x disp_y'
alpha_transition_end = ${alpha_end}
alpha_transition_start = ${alpha_start}
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temp'
[]
[Mesh]
# Pin design parameters from FIPD database
[gen]
type = FIPDRodletMeshGenerator
fipd_geom_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / ${pin_id} _design.csv'}
gap_bottom_length = 0.31e-3 # arbitrary
cladding_bottom_plug_length = 2.24e-3 # arbitrary
cladding_top_plug_length = 2.24e-3 # arbitrary
cladding_sidewall_radial_elements = ${clad_n_rad}
cladding_sidewall_axial_element_numbers = '2 150 150'
# use_tri_for_cladding_sidewall = '0 1 0'
cladding_top_plug_radial_elements = 10
cladding_top_plug_axial_elements = 5
cladding_bottom_plug_axial_elements = 5
fuel_radial_elements = 6
fuel_axial_element_intervals = '0 1'
fuel_axial_element_numbers = '250'
use_default_cladding_sidewall_axial_element_intervals = true
elem_type = QUAD4
make_stand = true
make_cap = true
cap_axial_elements = 15
stand_axial_elements = 15
[]
[sodium_height]
type = SideSetsFromBoundingBoxGenerator
input = gen
bottom_left = '0 0 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1005'
[]
[gas_height]
type = SideSetsFromBoundingBoxGenerator
input = sodium_height
bottom_left = '0 ${fparse fuel_y_start + fuel_height} 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height + gas_plenum_height + top_bot_cladding_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1006'
[]
[sodium_plenum_rename]
type = RenameBoundaryGenerator
input = gas_height
old_boundary = '1005 1006'
new_boundary = 'sodium_height gas_height'
[]
patch_size = 40
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
coord_type = RZ
[]
[Variables]
[temp]
initial_condition = 298
block = 'fuel ${cladding_block} cap stand'
[]
[disp_x]
block = 'fuel ${cladding_block} cap stand'
[]
[disp_y]
block = 'fuel ${cladding_block} cap stand'
[]
[]
[Functions]
[fflux_axial_peaking_factors] # Fast flux peaking factor from FIPD database; used for fuel related simulations
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_flux_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
[]
[fflux_axial_peaking_factors_elongate] # Fast flux peaking factor from FIPD database; used for cladding related simulations
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_flux_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
fuel_elongation_pp = max_fuel_elongation # pp used to track fuel elongation
[]
[flux_history] # Time-dependent pin average fast flux from FIPD database
type = PiecewiseLinear
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / flux_history_ ${pin_id} .csv'}
[]
[clad_od_temp] # Time-dependent cladding OD temperature from FIPD database
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / clad_od_temp_history_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
[]
[ab_sodium_vol]
type = MeshPropertyFunction
mesh_generator = gen
mesh_property_name = sodium_volume
scale_factor = -1.0
[]
[sodium_volume]
# Need to account for the factor that hot pressing is also occupying the open pores
type = ParsedFunction
symbol_names = 'porosity_sodium_logging_avg volume_fuel raw_sodium_vol temp_sodium_avg'
symbol_values = 'porosity_sodium_logging_avg volume_fuel ab_sodium_vol temp_sodium_avg'
# Note the the symbol before volume_fuel should be negative as volume_fuel itself is negative
expression = 'raw_sodium_vol * 954 / (1102 - 0.23 * temp_sodium_avg) - volume_fuel * porosity_sodium_logging_avg'
[]
[power_history] # Time-dependent pin average power from FIPD database
type = PiecewiseLinear
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / power_history_ ${pin_id} .csv'}
[]
[axial_peaking_factors]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_power_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
[]
[axial_peaking_factors_extended]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_power_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
fuel_elongation_pp = max_fuel_elongation # pp used to track fuel elongation
[]
[anisotropic_swelling_factor]
type = ParsedFunction
symbol_names = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg fuel_height fuel_radius'
symbol_values = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg ${fuel_height} ${fuel_radius}'
expression = '(disp_x_fuel_radial_surface_avg / ${fuel_radius}) / (disp_y_fuel_top_surface_avg / ${fuel_height})'
[]
[gap_thermal_conductivity]
type = ParsedFunction
expression = '124.67 - 0.11381 * t + 5.5226e-5 * t^2 - 1.1842e-8 * t^3'
[]
[id_vpp_func] # vpp_function used to track FCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = id_wastage
argument_column = y
wastage_type = ID
value_column = wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[od_vpp_func] # vpp_function used to track CCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = od_wastage
argument_column = y
wastage_type = OD
value_column = cc_wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[fuel_melt_func]
type = MetallicFuelMeltingFunction
vectorpostprocessor_name = fuel_melting
argument_column = y
value_column = fuel_melting_thickness
use_metadata = true
mesh_generator = 'gen'
transition_width = 2e-4
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = fuel
strain = FINITE
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_strain solid_swelling_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[]
[Kernels]
[gravity]
type = ADGravity
block = 'fuel ${cladding_block}'
variable = disp_y
value = -9.81
extra_vector_tags = 'ref'
[]
[heat]
type = ADHeatConduction
block = 'fuel ${cladding_block} cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
block = 'fuel ${cladding_block} cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temp
block = 'fuel'
fission_rate = fission_rate
extra_vector_tags = 'ref'
energy_deposited_in_fuel = 0.95
[]
[disp_x_dt]
type = ADTimeDerivative
variable = disp_x
block = 'cap stand'
extra_vector_tags = 'ref'
[]
[disp_y_dt]
type = ADTimeDerivative
variable = disp_y
block = 'cap stand'
extra_vector_tags = 'ref'
[]
[disp_x_diff]
type = ADMatAnisoDiffusion
variable = disp_x
block = 'cap stand'
diffusivity = d_x
extra_vector_tags = 'ref'
[]
[disp_y_diff]
type = ADMatDiffusion
variable = disp_y
block = 'cap stand'
diffusivity = 1e8
extra_vector_tags = 'ref'
[]
[]
[UserObjects]
[pin_geometry]
type = FuelPinGeometry
clad_bottom = cladding_outside_bottom
clad_inner_wall = cladding_inside_right
clad_outer_wall = cladding_outside_right
clad_top = cladding_outside_top
pellet_exteriors = fuel_outside_all
[]
[fuel_thm_exp]
type = LayeredAverage
variable = fuel_thermal_strain_xx
direction = y
num_layers = 1000
block = fuel
[]
[clad_thm_exp]
type = LayeredAverage
variable = clad_thermal_eigenstrain_xx
direction = y
num_layers = 1000
block = ${cladding_block}
[]
[]
[Contact]
[fuel_cladding_mechanical]
primary = cladding_inside_right
secondary = fuel_outer_radial_surface
model = coulomb
friction_coefficient = 0.1
formulation = mortar
c_normal = '${fparse 1e17 * magic_factor}'
c_tangential = '${fparse 1e19 * magic_factor}'
correct_edge_dropping = true
[]
[]
[MortarGapHeatTransfer]
[inside2outside]
temperature = temp
boundary = 'cladding_inside_right'
gap_conductivity_function = gap_thermal_conductivity
gap_conductivity_function_variable = temp
primary_boundary = cladding_inside_right
secondary_boundary = fuel_contact_surfaces
gap_flux_options = 'CONDUCTION'
ghost_point_neighbors = true
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = 'centerline cap_top'
value = 0.0
preset = false
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = 'cladding_inside_bottom'
value = 0.0
preset = false
[]
[Pressure]
[coolantPressure]
boundary = 'cladding_outside_right'
factor = 0.151e6
use_automatic_differentiation = true
[]
[]
[PlenumPressure]
[plenumPressure]
boundary = 'inside_surfaces'
initial_pressure = 84116 # in Pa, 12.2 psi
startup_time = 0
R = 8.3143
temperature = temp_gas_avg
volume = volume_plenum
output = plenum_pressure
material_input = fg_released
use_automatic_differentiation = true
[]
[]
[surf] # Setting temperature BC base on FIPD data
type = ADFunctionDirichletBC
variable = temp
boundary = 'cladding_outside_bottom cladding_outside_right cladding_outside_top'
function = clad_od_temp
[]
[]
[AuxVariables]
[cumulative_damage_index]
order = CONSTANT
family = MONOMIAL
[]
[relx]
[]
[clad_thm_exp]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[clad_thermal_eigenstrain_xx]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[fuel_thermal_strain_xx]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[fuel_thermal_strain_yy]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[fuel_thm_exp]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[func_val1]
[]
[func_val2]
[]
[func_val3]
[]
# OPTD Dummy during this stage
[pen_thick_aux]
family = MONOMIAL
order = CONSTANT
block = 'fuel ${cladding_block}'
[]
[total_id_reduction]
family = MONOMIAL
order = CONSTANT
block = 'fuel ${cladding_block}'
[]
[fast_neutron_fluence_aux]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[]
[AuxKernels]
[func_val1]
type = FunctionAux
function = id_vpp_func
variable = func_val1
block = ${cladding_block}
[]
[func_val2]
type = FunctionAux
function = od_vpp_func
variable = func_val2
block = ${cladding_block}
[]
[func_val3]
type = FunctionAux
function = fuel_melt_func
variable = func_val3
block = fuel
[]
[cdf_amount]
block = '${cladding_block}'
type = MaterialRealAux
property = cdf_failure
variable = cumulative_damage_index
[]
[relx_aux]
type = ParsedAux
variable = relx
block = fuel
use_xyzt = true
expression = 'x / ${fuel_radius}'
[]
[clad_thm_exp]
type = SpatialUserObjectAux
variable = clad_thm_exp
execute_on = 'initial timestep_end'
user_object = clad_thm_exp
block = '${cladding_block}'
[]
[clad_thermal_eigenstrain_xx]
type = ADRankTwoAux
rank_two_tensor = cladding_thermal_eigenstrain
variable = clad_thermal_eigenstrain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = '${cladding_block}'
[]
[fuel_thermal_strain_xx]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = fuel
[]
[fuel_thermal_strain_yy]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_yy
index_j = 1
index_i = 1
execute_on = 'initial timestep_end'
block = fuel
[]
[fuel_thm_exp]
type = SpatialUserObjectAux
variable = fuel_thm_exp
execute_on = 'initial timestep_end'
user_object = fuel_thm_exp
block = fuel
[]
# OPTD
[assign_pen_thick_aux]
type = ADMaterialRealAux
variable = pen_thick_aux
property = liquid_penetration
block = 'fuel ${cladding_block}'
[]
[assign_total_id_reduction]
type = ParsedAux
variable = total_id_reduction
coupled_variables = 'pen_thick_aux wastage_thickness'
expression = 'pen_thick_aux + wastage_thickness'
block = 'fuel ${cladding_block}'
[]
[]
[Materials]
[fuel_pen]
type = ADMetallicFuelLiquidCladdingPenetration
temperature = temp
mesh_generator = gen
fuel_elongation_pp = max_fuel_elongation
liquid_penetration_model = 'ANL_CONSERVATIVE'
fuel_pu = Pu_0
burnup = burnup
outputs = all
calculate_fuel_melting_thickness = true
block = 'fuel ${cladding_block}'
[]
[d_x]
type = ADConstantAnisotropicMobility
tensor = '1e3 0 0
0 1e6 0
0 0 0'
M_name = d_x
[]
[cap_thcond]
type = ADGenericConstantMaterial
prop_names = 'thermal_conductivity specific_heat density'
prop_values = '65 1200 830'
block = 'cap stand'
outputs = all
[]
[interconnected_porosity]
type = ADParsedMaterial
block = 'fuel'
property_name = interconnected_porosity
material_property_names = 'porosity interconnectivity'
expression = 'porosity * interconnectivity'
outputs = all
[]
[fission_rate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors
pellet_radius = ${fuel_radius}
# initial_X_Zr=${initial_X_Zr}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${X_Pu}
block = 'fuel'
outputs = all
[]
[fission_rate_elongate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors_extended
pellet_radius = ${fuel_radius}
# initial_X_Zr = ${initial_X_Zr}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${X_Pu}
block = '${cladding_block}'
outputs = all
fission_rate_name = fission_rate
[]
[burnup]
type = ADUPuZrBurnup
initial_X_Zr = ${initial_X_Zr}
initial_X_Pu = ${X_Pu}
density = ${fuel_density}
block = 'fuel'
outputs = all
[]
[burnup_elongate]
type = ADUPuZrBurnup
initial_X_Pu = ${X_Pu}
initial_X_Zr = ${initial_X_Zr}
outputs = all
block = '${cladding_block}'
density = ${fuel_density}
burnup_name = burnup
[]
[fuel_elastic_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hotpress fuel_upuzrcreep gas_swelling'
block = 'fuel'
outputs = all
[]
[hotpress]
type = ADUPuZrHotPressingStressUpdate
block = 'fuel'
outputs = all
surface_energy = 1.6
plenum_pressure = plenum_pressure
porosity_name = porosity
max_inelastic_increment = 1e-1
interconnectivity = interconnectivity
bubble_concentration = ${bubble_concentration}
temperature = temp
creep_model = MFH
fission_rate = fission_rate
atomic_volume = 2.15e-29
porosity_start = 0.01
porosity_end = 0
grain_boundary_D0 = 4e-29
grain_boundary_Q = 0
absolute_tolerance = 1e-9
[]
[porosity]
type = ADPorosityFromStrain
block = 'fuel'
initial_porosity = 1e-10
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[fuel_elasticity_tensor]
type = ADUPuZrElasticityTensor
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
youngs_model = LANL
block = 'fuel'
temperature = temp
use_old_porosity = true
outputs = all
output_properties = 'youngs_modulus poissons_ratio'
[]
[fuel_upuzrcreep]
type = ADUPuZrCreepUpdate
block = 'fuel'
temperature = temp
porosity = porosity
use_old_porosity = true
max_inelastic_increment = 1e-3
outputs = all
automatic_differentiation_return_mapping = false
[]
[fuel_thermal_expansion]
type = ADUPuZrThermalExpansionEigenstrain
block = 'fuel'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = fuel_thermal_strain
outputs = all
thermal_expansion_model = LANL
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
block = 'fuel'
bubble_concentration = ${bubble_concentration}
initial_bubble_concentration = ${bubble_concentration}
compute_interconnectivity = true
fission_gas_yield = 0.3017 #0.25
fission_rate = fission_rate
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.99
interconnection_initiating_porosity = 0.23
interconnection_terminating_porosity = 0.25
max_inelastic_increment = 1e-2
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.26
initial_porosity = 1e-10
fuel_melting_function = fuel_melt_func
[]
[solid_swelling]
type = ADBurnupDependentEigenstrain
eigenstrain_name = solid_swelling_eigenstrain
block = 'fuel'
swelling_name = 'solid_swelling'
outputs = all
anisotropic_factor = 0.26
[]
[metal_fuel_thermal]
type = ADUPuZrThermal
block = 'fuel'
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
spheat_model = savage
porosity = porosity
temperature = temp
outputs = all
porosity_model = logged
sodium_logged_porosity = sodium_logged_porosity
[]
[sodium_logging]
type = ADUPuZrSodiumLogging
block = 'fuel'
porosity = porosity
interconnectivity = interconnectivity
sodium_infiltration_fraction = 0.28
outputs = all
[]
[fuel_density]
type = ADStrainAdjustedDensity
block = 'fuel'
strain_free_density = ${fuel_density}
outputs = all
[]
[fast_neutron_flux]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors
rod_ave_lin_pow = flux_history
block = fuel
factor = 1.0
outputs = all
[]
[fast_neutron_flux_elongate]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors_elongate
rod_ave_lin_pow = flux_history
block = '${cladding_block}'
factor = 1.0
outputs = all
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temp]
type = MaxIncrement
variable = temp
max_increment = 50
[]
[]
[Preconditioning]
[vcp]
type = VCP
full = true
primary_variable = 'disp_x disp_y temp'
preconditioner = 'LU'
adaptive_condensation = true
lm_variable = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
is_lm_coupling_diagonal = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
petsc_options = '-snes_ksp_ew -snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount -snes_force_iteration'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15 1'
line_search = 'none'
snesmf_reuse_base = false
verbose = true
l_max_its = 60
nl_max_its = 20
nl_rel_tol = 1e-7
nl_abs_tol = 1e-8 #1e9
end_time = ${run_time}
dtmin = 1
dtmax = ${max_time_step}
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
ignore_variables_for_autoscaling = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = time_step_limit
force_step_every_function_point = true
timestep_limiting_function = power_history
dt = 1e2
iteration_window = 4
optimal_iterations = 10
[]
[]
[Postprocessors]
[_dt]
type = TimestepSize
[]
# elemental temperatures
[temp_fuel_avg]
type = ElementAverageValue
variable = temp
block = 'fuel'
execute_on = 'initial timestep_end'
[]
[temp_fuel_max]
type = ElementExtremeValue
variable = temp
block = 'fuel'
[]
[temp_fuel_min]
type = ElementExtremeValue
variable = temp
block = 'fuel'
value_type = min
[]
[temp_cladding_avg]
type = ElementAverageValue
variable = temp
block = '${cladding_block}'
[]
[temp_cladding_max]
type = ElementExtremeValue
variable = temp
block = '${cladding_block}'
[]
[temp_cladding_min]
type = ElementExtremeValue
variable = temp
block = '${cladding_block}'
value_type = min
[]
# boundary temperatures
[temp_gas_avg]
type = SideAverageValue
boundary = 'gas_height cladding_inside_top'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_sodium_avg]
type = ElementAverageValue
block = 'cap'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_inside_surfaces_avg]
type = SideAverageValue
boundary = 'inside_surfaces'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_max]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_min]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
value_type = min
[]
[temp_fuel_surface_avg]
type = SideAverageValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_max]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_min]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
value_type = min
[]
[temp_cladding_inside_right_avg]
type = SideAverageValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_inside_right_max]
type = NodalExtremeValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_outside_right_avg]
type = SideAverageValue
boundary = 'cladding_outside_right'
variable = temp
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'fuel'
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'fuel'
[]
[stress_vonmises_cladding_avg]
type = ElementAverageValue
variable = vonmises_stress
block = '${cladding_block}'
[]
[stress_vonmises_cladding_max]
type = ElementExtremeValue
variable = vonmises_stress
block = '${cladding_block}'
[]
[stress_vonmises_cladding_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = '${cladding_block}'
[]
[stress_hydro_cladding_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = '${cladding_block}'
[]
[stress_hydro_cladding_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = '${cladding_block}'
[]
[stress_hydro_cladding_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = '${cladding_block}'
[]
[contact_pressure_max]
type = NodalExtremeValue
variable = fuel_cladding_mechanical_normal_lm
boundary = 'fuel_outer_radial_surface'
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = 'fuel'
[]
[strain_gas_swelling_fuel_avg]
type = ElementAverageValue
variable = effective_fission_gas_strain
block = 'fuel'
[]
[strain_hot_pressing_fuel_avg]
type = ElementAverageValue
variable = effective_hot_pressing_strain
block = 'fuel'
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = 'fuel'
[]
[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 = 'fuel_top'
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_top'
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_cladding_interior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_interior_min]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
value_type = min
[]
[disp_x_cladding_interior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_exterior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[disp_x_cladding_exterior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[anisotropic_swelling_factor]
type = FunctionValuePostprocessor
function = anisotropic_swelling_factor
[]
[max_fuel_elongation]
type = NodalExtremeValue
variable = disp_y
boundary = fuel_outside_all
[]
# geometric information
[volume_cladding_interior]
type = InternalVolume
boundary = 'cladding_inside_all'
[]
[volume_fuel]
type = InternalVolume
boundary = 'fuel_outside_all'
execute_on = 'initial timestep_end'
[]
[volume_plenum]
type = InternalVolume
boundary = 'inside_surfaces'
execute_on = 'initial timestep_end'
addition = sodium_volume
[]
[plenum_ratio]
type = ParsedPostprocessor
pp_names = 'volume_plenum volume_fuel'
expression = 'volume_plenum / volume_fuel'
execute_on = 'initial timestep_end'
[]
[volume_sodium]
type = FunctionValuePostprocessor
function = sodium_volume
execute_on = 'initial timestep_end'
[]
# energy information
[flux_clad]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'cladding_inside_right'
diffusivity = thermal_conductivity
[]
[flux_fuel]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'fuel_contact_surfaces'
diffusivity = thermal_conductivity
[]
[power_integral]
type = ADElementIntegralPower
variable = temp
use_material_fission_rate = true
fission_rate_material = fission_rate
block = fuel
[]
[linear_heat_generation_rate]
type = FunctionValuePostprocessor
function = power_history
scale_factor = 0.01
[]
[burnup_avg]
type = ElementAverageValue
block = fuel
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = fuel
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = fuel
[]
# fission gas information
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_produced
block = fuel
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_released
block = fuel
execute_on = 'initial timestep_end'
[]
[fg_percent]
type = FGRPercent
fission_gas_released = fg_released
fission_gas_generated = fg_produced
[]
[interconnected_porosity_fuel_avg]
type = ElementAverageValue
variable = interconnected_porosity
block = fuel
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = fuel
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = fuel
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = fuel
[]
[porosity_sodium_logging_avg]
type = ElementAverageValue
variable = sodium_logged_porosity
block = fuel
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
block = 'fuel ${cladding_block}'
outputs = none
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[max_wastagethickness]
type = ElementExtremeValue
value_type = max
variable = wastage_thickness
# outputs = 'console'
[]
[max_wst_temp]
type = ElementExtremeValue
value_type = max
variable = temp
proxy_variable = wastage_thickness
block = '${cladding_block}'
[]
[max_wst_burnup]
type = ElementExtremeValue
value_type = max
variable = burnup
proxy_variable = wastage_thickness
block = '${cladding_block}'
[]
[max_cdf]
type = ElementExtremeValue
value_type = max
variable = cumulative_damage_index
[]
[]
[VectorPostprocessors]
[id_wastage]
type = FuelRodLineValueSampler
variable = wastage_thickness
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = csv_wst_a
[]
[id_pen_total]
type = FuelRodLineValueSampler
variable = total_id_reduction
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[od_wastage]
type = FuelRodLineValueSampler
variable = cc_wastage_thickness
material = 'clad'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[fuel_melting]
type = FuelRodLineValueSampler
variable = fuel_melting_thickness
material = 'fuel'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[]
[PerformanceMetricOutputs]
outputs = 'console'
[]
[Outputs]
# print_linear_residuals = true
# color = true
# perf_graph = true
# sync_times = ${time_spots}
[checkpoint]
type = Checkpoint
time_step_interval = 1
enable = false
[]
[exodus]
type = Exodus
sync_only = true
sync_times = ${time_spots}
enable = false
additional_execute_on = 'FAILED'
[]
[exodus_final]
type = Exodus
execute_on = 'FINAL'
[]
[console]
type = Console
show = 'time_step_size temp_fuel_avg temp_fuel_centerline_max temp_cladding_avg temp_cladding_max stress_vonmises_fuel_max stress_hydro_fuel_max stress_hydro_fuel_min contact_pressure_max strain_axial_fuel_avg power_integral burnup_avg fission_rate_avg fg_percent porosity_fuel_avg time_step_limit anisotropic_swelling_factor plenum_ratio volume_fuel volume_plenum max_wastagethickness max_cdf'
[]
[csv_wst_a]
type = CSV
sync_only = true
sync_times = ${time_spots_a}
enable = ${enable_a}
execute_postprocessors_on = none
create_latest_symlink = true
[]
[csv_general]
type = CSV
sync_only = true
sync_times = ${time_spots}
enable = true
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temp'
show_var_residual_norms = true
[]
(test/tests/solid_mechanics/upuzr_hot_pressing/exact_grow.i)
C_bub = 1e15
gamma = 1
P_plenum = 1.5e5
scalar = 0.9
omega = 5e-29
kb = 1.380649e-23
pi = 3.1415926535
D0 = 3e-11
Q = 190000
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = -0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hot_press'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = ${gamma}
bubble_concentration = ${C_bub}
plenum_pressure = ${P_plenum}
scalar = ${scalar}
atomic_volume = ${omega}
porosity_name = porosity
max_inelastic_increment = 0.001
interconnectivity = 1.0
outputs = all
creep_model = MCDEAVITT
porosity_start = 0.195
porosity_end = 0.18
grain_boundary_D0 = ${D0}
grain_boundary_Q = ${Q}
allow_pore_growth = true
internal_solve_full_iteration_history = true
internal_solve_output_on = on_error
# verbose = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 1.4e7
dt = 1e6
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[disp_x_avg]
type = SideAverageValue
variable = disp_x
boundary = right
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[hp_strain_rate_exact]
type = ParsedPostprocessor
pp_names = 'temp hydro porosity'
expression = 'sigma := -hydro * 1e-6;
rad := (3. / 4. / ${pi} * porosity / ${C_bub})^(1/3);
extra_sigma := if((2 * ${gamma} / rad - ${P_plenum}) * 1e-6> 0, 0, (2 * ${gamma} / rad - ${P_plenum}) * 1e-6);
lambda := rad / porosity^(1/3);
diff := ${D0} * exp(-${Q} / 8.314 / temp);
const := ${scalar} * 2 * ${pi} / 3 * ${C_bub} * ${omega} * diff / ${kb} / temp * 1e6;
force := sigma + extra_sigma;
sigma_inf := (sigma * lambda^2 + extra_sigma * rad^2) / (lambda^2 - rad^2);
epsilon_inf := 4e-10 * sigma_inf^5;
Lambda := (diff * ${omega} / ${kb} / temp * sigma_inf / epsilon_inf * 1e6)^(1/3);
boverrad := Lambda / rad + 1;
f_shape := 1 / (log(boverrad) - boverrad^(-4) / 4 + boverrad^(-2) - 0.75);
x := (porosity - 0.195) / (0.18 - 0.195);
clampedx := if(x > 1, 1, if(x < 0, 0, x));
mixing := 1 - clampedx^3 * (clampedx * (clampedx * 6.0 - 15.0) + 10.0);
const * f_shape * force * mixing'
[]
[hp_strain_rate_diff]
type = ParsedPostprocessor
pp_names = 'hp_strain_rate hp_strain_rate_exact'
expression = 'if(hp_strain_rate_exact = 0, 0, (hp_strain_rate - hp_strain_rate_exact) / hp_strain_rate_exact)'
[]
[hp_strain_rate_diff_max]
type = TimeExtremeValue
postprocessor = hp_strain_rate_diff
value_type = abs_max
[]
[]
[Outputs]
csv = true
[]
(assessment/metallic_fuel/EBRII/X447/analysis/enhancement/x447_enh_base.i)
# Enhanced X447 analysis
# Uses advanced contact and gap conductance modeling from X441 assessment case
# Uses 0.3017 for fission gas yield, which is consistent with X423 assessment case
## Sodium logging was calculated by hand here for confirmation
## The hotpressing, or the accumulation of solid FPs (~15% at ~10% BU)
## Will consume the available porosity
gap_bottom_length = 0.31e-3
top_bot_cladding_height = 2.24e-3
# Calculations
cladding_ir = ${fparse fuel_radius + cladding_gap_width}
gas_plenum_height = ${fparse plenum_volume / pi / cladding_ir^2}
fuel_y_start = ${fparse gap_bottom_length + top_bot_cladding_height}
alpha_start = 877
alpha_end = 936
bubble_concentration = 1e15
[GlobalParams]
order = FIRST
energy_per_fission = 3.2e-11 # J/fission
displacements = 'disp_x disp_y'
alpha_transition_end = ${alpha_end}
alpha_transition_start = ${alpha_start}
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temp'
[]
[Mesh]
# Pin design parameters from FIPD database
[gen]
type = FIPDRodletMeshGenerator
fipd_geom_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} / ${pin_id} _design.csv'}
gap_bottom_length = ${gap_bottom_length} # arbitrary
cladding_bottom_plug_length = ${top_bot_cladding_height} # arbitrary
cladding_top_plug_length = ${top_bot_cladding_height} # arbitrary
cladding_sidewall_radial_elements = 10
cladding_sidewall_axial_element_numbers = '2 150 150'
cladding_top_plug_radial_elements = 10
cladding_top_plug_axial_elements = 5
cladding_bottom_plug_axial_elements = 5
fuel_radial_elements = 6
fuel_axial_element_intervals = '0 1'
fuel_axial_element_numbers = '150'
use_default_cladding_sidewall_axial_element_intervals = true
elem_type = QUAD4
make_stand = true
make_cap = true
cap_axial_elements = 15
stand_axial_elements = 15
[]
[sodium_height]
type = SideSetsFromBoundingBoxGenerator
input = gen
bottom_left = '0 0 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1005'
[]
[gas_height]
type = SideSetsFromBoundingBoxGenerator
input = sodium_height
bottom_left = '0 ${fparse fuel_y_start + fuel_height} 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height + gas_plenum_height + top_bot_cladding_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1006'
[]
[sodium_plenum_rename]
type = RenameBoundaryGenerator
input = gas_height
old_boundary = '1005 1006'
new_boundary = 'sodium_height gas_height'
[]
patch_size = 120
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
coord_type = RZ
[]
[Variables]
[temp]
initial_condition = 298
block = 'fuel cladding cap stand'
[]
[disp_x]
block = 'fuel cladding cap stand'
[]
[disp_y]
block = 'fuel cladding cap stand'
[]
[]
[Functions]
[fflux_axial_peaking_factors] # Fast flux peaking factor from FIPD database; used for fuel related simulations
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /peakingfactor_flux_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
[]
[fflux_axial_peaking_factors_elongate] # Fast flux peaking factor from FIPD database; used for cladding related simulations
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /peakingfactor_flux_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
fuel_elongation_pp = max_fuel_elongation # pp used to track fuel elongation
[]
[flux_history] # Time-dependent pin average fast flux from FIPD database
type = PiecewiseLinear
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /flux_history_ ${pin_id} .csv'}
[]
[clad_od_temp] # Time-dependent cladding OD temperature from FIPD database
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /clad_od_temp_history_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
[]
[ab_sodium_vol]
type = MeshPropertyFunction
mesh_generator = gen
mesh_property_name = sodium_volume
scale_factor = -1.0
[]
[sodium_volume]
# Need to account for the factor that hot pressing is also occupying the open pores
type = ParsedFunction
symbol_names = 'porosity_sodium_logging_avg volume_fuel raw_sodium_vol temp_sodium_avg'
symbol_values = 'porosity_sodium_logging_avg volume_fuel ab_sodium_vol temp_sodium_avg'
# Note the the symbol before volume_fuel should be negative as volume_fuel itself is negative
expression = 'raw_sodium_vol * 954 / (1102 - 0.23 * temp_sodium_avg) - volume_fuel * porosity_sodium_logging_avg'
[]
[power_history] # Time-dependent pin average power from FIPD database
type = PiecewiseLinear
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /power_history_ ${pin_id} .csv'}
[]
[axial_peaking_factors]
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /peakingfactor_power_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
[]
[axial_peaking_factors_extended]
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /peakingfactor_power_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
fuel_elongation_pp = max_fuel_elongation # pp used to track fuel elongation
[]
[anisotropic_swelling_factor]
type = ParsedFunction
symbol_names = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg fuel_height fuel_radius'
symbol_values = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg ${fuel_height} '
'${fuel_radius}'
expression = '(disp_x_fuel_radial_surface_avg / ${fuel_radius}) / '
'(disp_y_fuel_top_surface_avg / ${fuel_height})'
[]
[gap_thermal_conductivity]
type = ParsedFunction
expression = '124.67 - 0.11381 * t + 5.5226e-5 * t^2 - 1.1842e-8 * t^3'
[]
[id_vpp_func] # vpp_function used to track FCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = id_wastage
argument_column = y
wastage_type = ID
value_column = wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[od_vpp_func] # vpp_function used to track CCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = od_wastage
argument_column = y
wastage_type = OD
value_column = cc_wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = fuel
strain = FINITE
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_strain solid_swelling_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[cladding]
strain = FINITE
generate_output = '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'
block = 'cladding'
eigenstrain_names = 'cladding_thermal_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[]
[Kernels]
[gravity]
type = ADGravity
block = 'fuel cladding'
variable = disp_y
value = -9.81
extra_vector_tags = 'ref'
[]
[heat]
type = ADHeatConduction
block = 'fuel cladding cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
block = 'fuel cladding cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temp
block = 'fuel'
fission_rate = fission_rate
extra_vector_tags = 'ref'
energy_deposited_in_fuel = 0.95
[]
[disp_x_dt]
type = ADTimeDerivative
variable = disp_x
block = ' cap stand'
extra_vector_tags = 'ref'
[]
[disp_y_dt]
type = ADTimeDerivative
variable = disp_y
block = 'cap stand'
extra_vector_tags = 'ref'
[]
[disp_x_diff]
type = ADMatAnisoDiffusion
variable = disp_x
block = 'cap stand'
diffusivity = d_x
extra_vector_tags = 'ref'
[]
[disp_y_diff]
type = ADMatDiffusion
variable = disp_y
block = 'cap stand'
diffusivity = 1e8
extra_vector_tags = 'ref'
[]
[]
[UserObjects]
[pin_geometry]
type = FuelPinGeometry
clad_bottom = cladding_outside_bottom
clad_inner_wall = cladding_inside_right
clad_outer_wall = cladding_outside_right
clad_top = cladding_outside_top
pellet_exteriors = fuel_outside_all
[]
[clad_thm_exp]
type = LayeredAverage
variable = clad_thermal_eigenstrain_xx
direction = y
num_layers = 1000
block = cladding
[]
[]
[Contact]
[fuel_cladding_mechanical]
primary = cladding_inside_right
secondary = fuel_outer_radial_surface
model = coulomb
friction_coefficient = 0.1
formulation = mortar
c_normal = ${fparse 1e17 * magic_factor}
c_tangential = ${fparse 1e19 * magic_factor}
correct_edge_dropping = true
[]
[]
[MortarGapHeatTransfer]
[inside2outside]
temperature = temp
boundary = 'cladding_inside_right'
gap_conductivity_function = gap_thermal_conductivity
gap_conductivity_function_variable = temp
primary_boundary = cladding_inside_right
secondary_boundary = fuel_contact_surfaces
gap_flux_options = 'CONDUCTION'
ghost_point_neighbors = true
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = 'centerline cap_top'
value = 0.0
preset = false
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = 'cladding_inside_bottom'
value = 0.0
preset = false
[]
[Pressure]
[coolantPressure]
boundary = 'cladding_outside_right'
factor = 0.151e6
use_automatic_differentiation = true
[]
[]
[PlenumPressure]
[plenumPressure]
boundary = 'inside_surfaces'
initial_pressure = 84116 # in Pa, 12.2 psi
startup_time = 0
R = 8.3143
temperature = temp_gas_avg
volume = volume_plenum
output = plenum_pressure
material_input = fg_released
use_automatic_differentiation = true
[]
[]
[surf] # Setting temperature BC base on FIPD data
type = FunctionDirichletBC
variable = temp
boundary = 'cladding_outside_bottom cladding_outside_right cladding_outside_top'
function = clad_od_temp
[]
[]
[AuxVariables]
[cumulative_damage_index]
order = CONSTANT
family = MONOMIAL
[]
[relx]
[]
[clad_thm_exp]
order = CONSTANT
family = MONOMIAL
block = cladding
[]
[clad_thermal_eigenstrain_xx]
order = CONSTANT
family = MONOMIAL
block = cladding
[]
[]
[AuxKernels]
[cdf_amount]
block = cladding
type = MaterialRealAux
property = cdf_failure
variable = cumulative_damage_index
[]
[clad_thm_exp]
type = SpatialUserObjectAux
variable = clad_thm_exp
execute_on = 'initial timestep_end'
user_object = clad_thm_exp
block = cladding
[]
[clad_thermal_eigenstrain_xx]
type = ADRankTwoAux
rank_two_tensor = cladding_thermal_eigenstrain
variable = clad_thermal_eigenstrain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = cladding
[]
[]
[Materials]
[longHT9_failure]
type = HT9FailureClad
block = cladding
method = cdf_long
temperature = temp
outputs = all
hoop_stress = stress_zz # Since 2D-RZ
[]
[d_x]
type = ADConstantAnisotropicMobility
tensor = '1e3 0 0
0 1e6 0
0 0 0'
M_name = d_x
[]
[cap_thcond]
type = ADGenericConstantMaterial
prop_names = 'thermal_conductivity specific_heat density'
prop_values = '65 1200 830'
block = 'cap stand'
outputs = all
[]
[interconnected_porosity]
type = ADParsedMaterial
block = 'fuel'
property_name = interconnected_porosity
material_property_names = 'porosity interconnectivity'
expression = 'porosity * interconnectivity'
outputs = all
[]
[fission_rate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors
pellet_radius = ${fuel_radius}
initial_X_Zr=${initial_X_Zr}
X_Zr = ${initial_X_Zr}
X_Pu_function = 0
block = 'fuel'
outputs = all
[]
[fission_rate_elongate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors_extended
pellet_radius = ${fuel_radius}
# initial_X_Zr=${initial_X_Zr}
X_Zr = ${initial_X_Zr}
X_Pu_function = 0
block = 'cladding'
outputs = all
fission_rate_name = fission_rate
[]
[burnup]
type = ADUPuZrBurnup
initial_X_Zr = ${initial_X_Zr}
initial_X_Pu = 0
density = ${fuel_density}
block = 'fuel'
outputs = all
[]
[burnup_elongate]
type = ADUPuZrBurnup
initial_X_Pu = 0
initial_X_Zr = ${initial_X_Zr}
outputs = all
block = cladding
density = ${fuel_density}
burnup_name = burnup
[]
[fuel_elastic_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hotpress fuel_upuzrcreep gas_swelling'
block = 'fuel'
outputs = all
[]
[hotpress]
type = ADUPuZrHotPressingStressUpdate
block = 'fuel'
outputs = all
surface_energy = 1.6
plenum_pressure = plenum_pressure
porosity_name = porosity
max_inelastic_increment = 1e-1
interconnectivity = interconnectivity
bubble_concentration = ${bubble_concentration}
temperature = temp
creep_model = MFH
fission_rate = fission_rate
atomic_volume = 2.15e-29
porosity_start = 0.01
porosity_end = 0
grain_boundary_D0 = 4e-29
grain_boundary_Q = 0
absolute_tolerance = 1e-9
[]
[porosity]
type = ADPorosityFromStrain
block = 'fuel'
initial_porosity = 1e-10
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[fuel_elasticity_tensor]
type = ADUPuZrElasticityTensor
X_Zr = ${initial_X_Zr}
X_Pu = 0
youngs_model = LANL
block = 'fuel'
temperature = temp
use_old_porosity = true
outputs = all
output_properties = 'youngs_modulus poissons_ratio'
[]
[fuel_upuzrcreep]
type = ADUPuZrCreepUpdate
block = 'fuel'
temperature = temp
porosity = porosity
use_old_porosity = true
max_inelastic_increment = 1e-1
outputs = all
automatic_differentiation_return_mapping = false
[]
[fuel_thermal_expansion]
type = ADUPuZrThermalExpansionEigenstrain
block = 'fuel'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = fuel_thermal_strain
outputs = all
thermal_expansion_model = LANL
X_Zr = ${initial_X_Zr}
X_Pu = 0
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
block = 'fuel'
bubble_concentration = ${bubble_concentration}
initial_bubble_concentration = ${bubble_concentration}
compute_interconnectivity = true
fission_gas_yield = 0.3017 #0.25
fission_rate = fission_rate
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.99
interconnection_initiating_porosity = 0.23
interconnection_terminating_porosity = 0.25
max_inelastic_increment = 1e-2
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.26
initial_porosity = 1e-10
[]
[solid_swelling]
type = ADBurnupDependentEigenstrain
eigenstrain_name = solid_swelling_eigenstrain
block = 'fuel'
swelling_name = 'solid_swelling'
outputs = all
[]
[metal_fuel_thermal]
type = ADUPuZrThermal
block = 'fuel'
X_Zr = ${initial_X_Zr}
X_Pu = 0
spheat_model = savage
porosity = porosity
temperature = temp
outputs = all
porosity_model = logged
sodium_logged_porosity = sodium_logged_porosity
[]
[sodium_logging]
type = ADUPuZrSodiumLogging
block = 'fuel'
porosity = porosity
interconnectivity = interconnectivity
sodium_infiltration_fraction = 0.28
outputs = all
[]
[fuel_density]
type = ADStrainAdjustedDensity
block = 'fuel'
strain_free_density = ${fuel_density}
outputs = all
[]
[fast_neutron_flux]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors
rod_ave_lin_pow = flux_history
block = fuel
factor = 1.0
outputs = all
[]
[fast_neutron_flux_elongate]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors_elongate
rod_ave_lin_pow = flux_history
block = cladding
factor = 1.0
outputs = all
[]
[cladding_elasticity_tensor]
type = ADHT9ElasticityTensor
temperature = temp
block = 'cladding'
outputs = all
id_wastage_degradation_function = id_vpp_func
od_wastage_degradation_function = od_vpp_func
output_properties = 'youngs_modulus poissons_ratio'
[]
[cladding_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'cladding_creep'
block = 'cladding'
outputs = all
[]
[cladding_creep]
type = ADHT9CreepUpdate
block = 'cladding'
temperature = temp
outputs = all
primary_creep_model = MFH
secondary_creep_model = MFH
tertiary_creep_model = MFH
irradiation_creep_model = MFH
use_effective_time_for_tertiary = true
use_effective_time_for_primary = true
fast_neutron_flux = fast_neutron_flux
[]
[thermal_expansion]
type = ADHT9ThermalExpansionEigenstrain
block = 'cladding'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = cladding_thermal_eigenstrain
outputs = all
[]
[cladding_thermal]
type = ADHT9Thermal
block = 'cladding'
temperature = temp
outputs = all
[]
[cladding_density]
type = ADStrainAdjustedDensity
block = 'cladding'
strain_free_density = ${cladding_density}
outputs = all
[]
[wastage_thickness]
type = ADMetallicFuelWastage
method = burnup_ht9_opt
burnup = burnup
temperature = temp
scale_factor = 1
block = 'cladding'
outputs = all
[]
[cc_wastage_thickness]
type = ADMetallicFuelCoolantWastage
clad_material = HT9
use_effective_method = true
temperature = temp
scale_factor = 1
block = 'cladding'
outputs = all
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temp]
type = MaxIncrement
variable = temp
max_increment = 50
[]
[]
[Preconditioning]
[vcp]
type = VCP
full = true
primary_variable = 'disp_x disp_y temp'
preconditioner = 'LU'
adaptive_condensation = true
lm_variable = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
is_lm_coupling_diagonal = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
petsc_options = '-snes_ksp_ew -snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount -snes_force_iteration'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15 1'
line_search = 'none'
snesmf_reuse_base = false
verbose = true
l_max_its = 60
nl_max_its = 15 #20
nl_rel_tol = 5e-6
nl_abs_tol = 5e-9
end_time = ${run_time}
dtmin = 1
dtmax = ${max_time_step}
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
ignore_variables_for_autoscaling = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = time_step_limit
force_step_every_function_point = true
max_function_change = 300
timestep_limiting_function = power_history
dt = 1e2
iteration_window = 4
optimal_iterations = 10
[]
[]
[Postprocessors]
# elemental temperatures
[temp_fuel_avg]
type = ElementAverageValue
variable = temp
block = 'fuel'
execute_on = 'initial timestep_end'
[]
[temp_fuel_max]
type = ElementExtremeValue
variable = temp
block = 'fuel'
[]
[temp_fuel_min]
type = ElementExtremeValue
variable = temp
block = 'fuel'
value_type = min
[]
[temp_cladding_avg]
type = ElementAverageValue
variable = temp
block = 'cladding'
[]
[temp_cladding_max]
type = ElementExtremeValue
variable = temp
block = 'cladding'
[]
[temp_cladding_min]
type = ElementExtremeValue
variable = temp
block = 'cladding'
value_type = min
[]
# boundary temperatures
[temp_gas_avg]
type = ElementAverageValue
block = 'cap'
variable = temp
execute_on = 'initial timestep_end'
[]
# Beyond gap closure, sodium temperarture is almost the same as the cap.
[temp_sodium_avg]
type = ElementAverageValue
block = 'cap'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_inside_surfaces_avg]
type = SideAverageValue
boundary = 'inside_surfaces'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_max]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_min]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
value_type = min
[]
[temp_fuel_surface_avg]
type = SideAverageValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_max]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_min]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
value_type = min
[]
[temp_cladding_inside_right_avg]
type = SideAverageValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_inside_right_max]
type = NodalExtremeValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_outside_right_avg]
type = SideAverageValue
boundary = 'cladding_outside_right'
variable = temp
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'fuel'
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'fuel'
[]
[stress_vonmises_cladding_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'cladding'
[]
[stress_vonmises_cladding_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'cladding'
[]
[stress_vonmises_cladding_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'cladding'
[]
[stress_hydro_cladding_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'cladding'
[]
[stress_hydro_cladding_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'cladding'
[]
[stress_hydro_cladding_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'cladding'
[]
[contact_pressure_max]
type = NodalExtremeValue
variable = fuel_cladding_mechanical_normal_lm
boundary = 'fuel_outer_radial_surface'
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = 'fuel'
[]
[strain_gas_swelling_fuel_avg]
type = ElementAverageValue
variable = effective_fission_gas_strain
block = 'fuel'
[]
[strain_hot_pressing_fuel_avg]
type = ElementAverageValue
variable = effective_hot_pressing_strain
block = 'fuel'
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = 'fuel'
[]
[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 = 'fuel_top'
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_top'
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_cladding_interior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_interior_min]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
value_type = min
[]
[disp_x_cladding_interior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_exterior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[disp_x_cladding_exterior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[anisotropic_swelling_factor]
type = FunctionValuePostprocessor
function = anisotropic_swelling_factor
[]
[max_fuel_elongation]
type = NodalExtremeValue
variable = disp_y
boundary = fuel_outside_all
[]
# geometric information
[volume_cladding_interior]
type = InternalVolume
boundary = 'cladding_inside_all'
[]
[volume_fuel]
type = InternalVolume
boundary = 'fuel_outside_all'
execute_on = 'initial timestep_end'
[]
[volume_plenum]
type = InternalVolume
boundary = 'inside_surfaces'
execute_on = 'initial timestep_end'
addition = sodium_volume
[]
[plenum_ratio]
type = ParsedPostprocessor
pp_names = 'volume_plenum volume_fuel'
expression = 'volume_plenum / volume_fuel'
execute_on = 'initial timestep_end'
[]
[volume_sodium]
type = FunctionValuePostprocessor
function = sodium_volume
execute_on = 'initial timestep_end'
[]
# energy information
[flux_clad]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'cladding_inside_right'
diffusivity = thermal_conductivity
[]
[flux_fuel]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'fuel_contact_surfaces'
diffusivity = thermal_conductivity
[]
[power_integral]
type = ADElementIntegralPower
variable = temp
use_material_fission_rate = true
fission_rate_material = fission_rate
block = fuel
[]
[linear_heat_generation_rate]
type = FunctionValuePostprocessor
function = power_history
scale_factor = 0.01
[]
[burnup_avg]
type = ElementAverageValue
block = fuel
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = fuel
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = fuel
[]
# fission gas information
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_produced
block = fuel
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_released
block = fuel
execute_on = 'initial timestep_end'
[]
[fg_percent]
type = FGRPercent
fission_gas_released = fg_released
fission_gas_generated = fg_produced
[]
[interconnected_porosity_fuel_avg]
type = ElementAverageValue
variable = interconnected_porosity
block = fuel
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = fuel
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = fuel
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = fuel
[]
[porosity_sodium_logging_avg]
type = ElementAverageValue
variable = sodium_logged_porosity
block = fuel
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
block = 'fuel cladding'
outputs = none
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > max_dt, max_dt, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
constant_names = 'max_dt'
constant_expressions = '${max_time_step}'
[]
[max_wastagethickness]
type = ElementExtremeValue
value_type = max
variable = wastage_thickness
[]
[max_wst_temp]
type=ElementExtremeValue
value_type=max
variable=temp
proxy_variable=wastage_thickness
block='cladding'
[]
[max_wst_burnup]
type=ElementExtremeValue
value_type=max
variable=burnup
proxy_variable=wastage_thickness
block='cladding'
[]
[max_cdf]
type = ElementExtremeValue
value_type = max
variable = cumulative_damage_index
[]
[]
[VectorPostprocessors]
[id_wastage]
type = FuelRodLineValueSampler
variable = wastage_thickness
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = csv_wst_a
[]
[od_wastage]
type = FuelRodLineValueSampler
variable = cc_wastage_thickness
material = 'clad'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[nrad_comparison_a]
type = FIPDAxialPIEComparison
boundary = cladding_outside_right
sort_by = y
csv_file = ${raw '../../../../../../../fipd-bison-integration-data/X447/ ${pin_id} /X447A_ ${pin_id} _PR.csv'}
variable = disp_x
thermal_strain_variable = clad_thm_exp
involved_component = cladding
mesh_generator = gen
series_type_to_read = 'Cladding O.D. (mils)'
outputs = csv_vpp_a
enable = ${enable_a}
[]
[]
[PerformanceMetricOutputs]
outputs = 'console'
[]
[Outputs]
print_linear_residuals = true
color = true
perf_graph = true
sync_times=${time_spots}
[checkpoint]
type = Checkpoint
sync_times = '19339200'
file_base = 'midpoint_cp'
[]
[exodus]
type = Exodus
time_step_interval = 500
sync_times = ${time_spots}
enable = false
file_base = 'x447_${pin_id}_exodus'
[]
[console]
type = Console
show = 'time_step_size max_fuel_elongation burnup_avg max_wastagethickness'
[]
[csv_vpp_a]
type = CSV
sync_only = true
sync_times = ${time_spots_a}
enable = ${enable_a}
execute_postprocessors_on = none
create_latest_symlink = true
file_base = 'x447_${pin_id}_csv_vpp_a'
[]
[csv_wst_a]
type = CSV
sync_only = true
sync_times = ${time_spots_a}
enable = ${enable_a}
execute_postprocessors_on = none
create_latest_symlink = true
file_base = 'x447_${pin_id}_csv_wst_a'
[]
[csv_general]
type = CSV
sync_only = true
sync_times = ${time_spots}
enable = true
file_base = 'x447_${pin_id}_csv_general'
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temp'
show_var_residual_norms = true
[]
(test/tests/solid_mechanics/upuzr_hot_pressing/interconnectivity_decrease_exact.i)
C_bub = 1e15
gamma = 2
P_plenum = -7.5e6
scalar = 0.9
omega = 5e-29
kb = 1.380649e-23
pi = 3.14159
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = 0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'gas_swelling hot_press'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[gas_swelling]
type = ADCoupledFissionGasViscoplasticityStressUpdate
diffusion_model = infinite
atomic_volume = 0
force_newton_solve = true
# below are same as ADSimpleFissionGasViscoplasticityStressUpdate
fission_rate = 1e18
temperature = temp
bubble_concentration = 1e20
initial_bubble_concentration = 1e20
interconnection_initiating_porosity = 0.11
interconnection_terminating_porosity = 0.28
allow_interconnectivity_decrease = true
maximum_porosity_change = 0.5
compute_interconnectivity = true
scalar = 0.8
initial_fgm_dissolved = 0
initial_atoms_per_bubble = 1e6
surface_energy = 0.8
fission_gas_yield = 0.15
retained_gas_fraction = 0.2
outputs = all
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = ${gamma}
bubble_concentration = ${C_bub}
plenum_pressure = ${P_plenum}
scalar = ${scalar}
atomic_volume = ${omega}
porosity_name = porosity
max_inelastic_increment = 0.001
interconnectivity = 1 #interconnectivity
outputs = all
creep_model = MCDEAVITT
porosity_start = 0.195
porosity_end = 0.18
[]
[]
[Executioner]
type = Transient
solve_type = Newton
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 6e6
dtmax = 1e6
[TimeStepper]
type = IterationAdaptiveDT
#postprocessor_dtlim = creep_timestep
dt = 1e1
growth_factor = 10
cutback_factor = 0.1
iteration_window = 3
optimal_iterations = 10
[]
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[interconnectivity]
type = ElementAverageValue
variable = interconnectivity
[]
[hot_press]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[gas_swelling]
type = ElementAverageValue
variable = effective_fission_gas_strain
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[hp_strain_rate_exact]
type = ParsedPostprocessor
pp_names = 'temp hydro porosity'
expression = 'sigma := -hydro * 1e-6;
rad := (3. / 4. / ${pi} * porosity / ${C_bub})^(1/3);
extra_sigma := if((2 * ${gamma} / rad - ${P_plenum}) * 1e-6> 0, 0, (2 * ${gamma} / rad - ${P_plenum}) * 1e-6);
lambda := rad / porosity^(1/3);
diff := 3.24e-11 * exp(-186600 / 8.314 / temp);
const := ${scalar} * 2 * ${pi} / 3 * ${C_bub} * ${omega} * diff / ${kb} / temp * 1e6;
force := sigma + extra_sigma;
sigma_inf := (sigma * lambda^2 + extra_sigma * rad^2) / (lambda^2 - rad^2);
epsilon_inf := 4e-10 * sigma_inf^5;
Lambda := (diff * ${omega} / ${kb} / temp * sigma_inf / epsilon_inf * 1e6)^(1/3);
boverrad := Lambda / rad + 1;
f_shape := 1 / (log(boverrad) - boverrad^(-4) / 4 + boverrad^(-2) - 0.75);
x := (porosity - 0.195) / (0.18 - 0.195);
clampedx := if(x > 1, 1, if(x < 0, 0, x));
mixing := 1 - clampedx^3 * (clampedx * (clampedx * 6.0 - 15.0) + 10.0);
if(force < 0, 0, const * f_shape * force * mixing)'
[]
[hp_strain_rate_diff]
type = ParsedPostprocessor
epsilon = 1e-12
pp_names = 'hp_strain_rate hp_strain_rate_exact'
expression = 'if(hp_strain_rate_exact = 0, 0, (hp_strain_rate - hp_strain_rate_exact) / hp_strain_rate_exact)'
[]
[hp_strain_rate_diff_max]
type = TimeExtremeValue
postprocessor = hp_strain_rate_diff
value_type = abs_max
[]
[]
[Outputs]
csv = true
[]
(test/tests/solid_mechanics/upuzr_hot_pressing/ad.i)
# This test is to ensure adequate coupling between ADUPuZrHotPressingStressUpdate
# and other typical thermo-mechanical UPuZr models, especially ADSimpleFissionGasViscoplasticityStressUpdate
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = 0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hot_press gas_swelling'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
bubble_concentration = 1e15
initial_bubble_concentration = 1e15
compute_interconnectivity = true
fission_rate = 3e19
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.999
interconnection_initiating_porosity = 0.22
interconnection_terminating_porosity = 0.28
max_inelastic_increment = 0.001
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.25
initial_porosity = 1e-10
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = 1
bubble_concentration = 1e15
plenum_pressure = 2.5e5
max_inelastic_increment = 0.001
interconnectivity = interconnectivity
outputs = all
internal_solve_full_iteration_history = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 1e7
dt = 1e6
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[disp_x_avg]
type = SideAverageValue
variable = disp_x
boundary = right
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[interconnectivity]
type = ElementAverageValue
variable = interconnectivity
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[]
[Outputs]
exodus = true
[]
(assessment/metallic_fuel/WPF/analysis/X425_T418/X425_base.i)
# X425 Steady State Irradiation Base Input File
gap_bottom_length = 0.31e-3
top_bot_cladding_height = 2.24e-3
# calculations
cladding_ir = '${fparse fuel_radius + cladding_gap_width}'
gas_plenum_height = '${fparse plenum_volume / pi / cladding_ir^2}'
fuel_y_start = '${fparse gap_bottom_length + top_bot_cladding_height}'
alpha_start = 877
alpha_end = 936
bubble_concentration = 1e15
cladding_block = 'cladding cladding_tri'
# A relatively coarse radial mesh density can be used
# since localized refining is done by TRI3 elements
clad_n_rad = 10
[GlobalParams]
order = FIRST
energy_per_fission = 3.2e-11 # J/fission
displacements = 'disp_x disp_y'
alpha_transition_end = ${alpha_end}
alpha_transition_start = ${alpha_start}
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temp'
[]
[Mesh]
# Pin design parameters from FIPD database
[gen]
type = FIPDRodletMeshGenerator
fipd_geom_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} / ${pin_id} _design.csv'}
gap_bottom_length = 0.31e-3 # arbitrary
cladding_bottom_plug_length = 2.24e-3 # arbitrary
cladding_top_plug_length = 2.24e-3 # arbitrary
cladding_sidewall_radial_elements = ${clad_n_rad}
cladding_sidewall_axial_element_intervals = '0 0.540 0.625 1.0'
cladding_sidewall_axial_element_numbers = '150 1000 150'
use_tri_for_cladding_sidewall = '0 1 0'
cladding_top_plug_radial_elements = 10
cladding_top_plug_axial_elements = 5
cladding_bottom_plug_axial_elements = 5
fuel_radial_elements = 10
fuel_axial_element_intervals = '0 1'
fuel_axial_element_numbers = '1000'
tri_element_size_factor = 0.4
elem_type = QUAD4
make_stand = true
make_cap = true
cap_axial_elements = 15
stand_axial_elements = 15
[]
[sodium_height]
type = SideSetsFromBoundingBoxGenerator
input = gen
bottom_left = '0 0 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1005'
[]
[gas_height]
type = SideSetsFromBoundingBoxGenerator
input = sodium_height
bottom_left = '0 ${fparse fuel_y_start + fuel_height} 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height + gas_plenum_height + top_bot_cladding_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1006'
[]
[sodium_plenum_rename]
type = RenameBoundaryGenerator
input = gas_height
old_boundary = '1005 1006'
new_boundary = 'sodium_height gas_height'
[]
patch_size = 40
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
coord_type = RZ
[]
[Variables]
[temp]
initial_condition = 298
block = 'fuel ${cladding_block} cap stand'
[]
[disp_x]
block = 'fuel ${cladding_block} cap stand'
[]
[disp_y]
block = 'fuel ${cladding_block} cap stand'
[]
[]
[Functions]
[fflux_axial_peaking_factors] # Fast flux peaking factor from FIPD database; used for fuel related simulations
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /peakingfactor_flux_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
[]
[fflux_axial_peaking_factors_elongate] # Fast flux peaking factor from FIPD database; used for cladding related simulations
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /peakingfactor_flux_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
fuel_elongation_pp = max_fuel_elongation # pp used to track fuel elongation
[]
[flux_history] # Time-dependent pin average fast flux from FIPD database
type = PiecewiseLinear
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /flux_history_ ${pin_id} .csv'}
[]
[clad_od_temp] # Time-dependent cladding OD temperature from FIPD database
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /clad_od_temp_history_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
[]
[ab_sodium_vol]
type = MeshPropertyFunction
mesh_generator = gen
mesh_property_name = sodium_volume
scale_factor = -1.0
[]
[sodium_volume]
# Need to account for the factor that hot pressing is also occupying the open pores
type = ParsedFunction
symbol_names = 'porosity_sodium_logging_avg volume_fuel raw_sodium_vol temp_sodium_avg'
symbol_values = 'porosity_sodium_logging_avg volume_fuel ab_sodium_vol temp_sodium_avg'
# Note the the symbol before volume_fuel should be negative as volume_fuel itself is negative
expression = 'raw_sodium_vol * 954 / (1012 - 0.23 * temp_sodium_avg) - volume_fuel * porosity_sodium_logging_avg'
[]
[power_history] # Time-dependent pin average power from FIPD database
type = PiecewiseLinear
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /power_history_ ${pin_id} .csv'}
[]
[axial_peaking_factors]
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /peakingfactor_power_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
[]
[axial_peaking_factors_extended]
type = FIPDAxialProfileFunction
data_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} /peakingfactor_power_relative_ ${pin_id} .csv'}
use_metadata = true
mesh_generator = gen
zero_ends = true
data_shift_type = peaking
fuel_elongation_pp = max_fuel_elongation # pp used to track fuel elongation
[]
[anisotropic_swelling_factor]
type = ParsedFunction
symbol_names = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg fuel_height fuel_radius'
symbol_values = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg ${fuel_height} ${fuel_radius}'
expression = '(disp_x_fuel_radial_surface_avg / ${fuel_radius}) / (disp_y_fuel_top_surface_avg / ${fuel_height})'
[]
[gap_thermal_conductivity]
type = ParsedFunction
expression = '124.67 - 0.11381 * t + 5.5226e-5 * t^2 - 1.1842e-8 * t^3'
[]
[id_vpp_func] # vpp_function used to track FCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = id_wastage
argument_column = y
wastage_type = ID
value_column = wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[od_vpp_func] # vpp_function used to track CCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = od_wastage
argument_column = y
wastage_type = OD
value_column = cc_wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[fuel_melt_func]
type = MetallicFuelMeltingFunction
vectorpostprocessor_name = fuel_melting
argument_column = y
value_column = fuel_melting_thickness
use_metadata = true
mesh_generator = 'gen'
transition_width = 2e-4
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = fuel
strain = FINITE
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_strain solid_swelling_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[cladding]
strain = FINITE
generate_output = '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'
block = '${cladding_block}'
eigenstrain_names = 'cladding_thermal_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[]
[Kernels]
[gravity]
type = ADGravity
block = 'fuel ${cladding_block}'
variable = disp_y
value = -9.81
extra_vector_tags = 'ref'
[]
[heat]
type = ADHeatConduction
block = 'fuel ${cladding_block} cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
block = 'fuel ${cladding_block} cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temp
block = 'fuel'
fission_rate = fission_rate
extra_vector_tags = 'ref'
energy_deposited_in_fuel = 0.95
[]
[disp_x_dt]
type = ADTimeDerivative
variable = disp_x
block = ' cap stand'
extra_vector_tags = 'ref'
[]
[disp_y_dt]
type = ADTimeDerivative
variable = disp_y
block = 'cap stand'
extra_vector_tags = 'ref'
[]
[disp_x_diff]
type = ADMatAnisoDiffusion
variable = disp_x
block = 'cap stand'
diffusivity = d_x
extra_vector_tags = 'ref'
[]
[disp_y_diff]
type = ADMatDiffusion
variable = disp_y
block = 'cap stand'
diffusivity = 1e8
extra_vector_tags = 'ref'
[]
[]
[UserObjects]
[pin_geometry]
type = FuelPinGeometry
clad_bottom = cladding_outside_bottom
clad_inner_wall = cladding_inside_right
clad_outer_wall = cladding_outside_right
clad_top = cladding_outside_top
pellet_exteriors = fuel_outside_all
[]
[fuel_thm_exp]
type = LayeredAverage
variable = fuel_thermal_strain_xx
direction = y
num_layers = 1000
block = fuel
[]
[clad_thm_exp]
type = LayeredAverage
variable = clad_thermal_eigenstrain_xx
direction = y
num_layers = 1000
block = ${cladding_block}
[]
[]
[Contact]
[fuel_cladding_mechanical]
primary = cladding_inside_right
secondary = fuel_outer_radial_surface
model = coulomb
friction_coefficient = 0.1
formulation = mortar
c_normal = '${fparse 1e17 * magic_factor}'
c_tangential = '${fparse 1e19 * magic_factor}'
correct_edge_dropping = true
[]
[]
[MortarGapHeatTransfer]
[inside2outside]
temperature = temp
boundary = 'cladding_inside_right'
gap_conductivity_function = gap_thermal_conductivity
gap_conductivity_function_variable = temp
primary_boundary = cladding_inside_right
secondary_boundary = fuel_contact_surfaces
gap_flux_options = 'CONDUCTION'
ghost_point_neighbors = true
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = 'centerline cap_top'
value = 0.0
preset = false
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = 'cladding_inside_bottom'
value = 0.0
preset = false
[]
[Pressure]
[coolantPressure]
boundary = 'cladding_outside_right'
factor = 0.151e6
use_automatic_differentiation = true
[]
[]
[PlenumPressure]
[plenumPressure]
boundary = 'inside_surfaces'
initial_pressure = 84116 # in Pa, 12.2 psi
startup_time = 0
R = 8.3143
temperature = temp_gas_avg
volume = volume_plenum
output = plenum_pressure
material_input = fg_released
use_automatic_differentiation = true
[]
[]
[surf] # Setting temperature BC base on FIPD data
type = ADFunctionDirichletBC
variable = temp
boundary = 'cladding_outside_bottom cladding_outside_right cladding_outside_top'
function = clad_od_temp
[]
[]
[AuxVariables]
[cumulative_damage_index]
order = CONSTANT
family = MONOMIAL
[]
[relx]
[]
[clad_thm_exp]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[clad_thermal_eigenstrain_xx]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[fuel_thermal_strain_xx]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[fuel_thermal_strain_yy]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[fuel_thm_exp]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[func_val1]
[]
[func_val2]
[]
[func_val3]
[]
# OPTD Dummy during this stage
[pen_thick_aux]
family = MONOMIAL
order = CONSTANT
block = 'fuel ${cladding_block}'
[]
[total_id_reduction]
family = MONOMIAL
order = CONSTANT
block = 'fuel ${cladding_block}'
[]
[fast_neutron_fluence_aux]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[]
[AuxKernels]
[func_val1]
type = FunctionAux
function = id_vpp_func
variable = func_val1
block = 'cladding cladding_tri'
[]
[func_val2]
type = FunctionAux
function = od_vpp_func
variable = func_val2
block = 'cladding cladding_tri'
[]
[func_val3]
type = FunctionAux
function = fuel_melt_func
variable = func_val3
block = fuel
[]
[cdf_amount]
block = '${cladding_block}'
type = MaterialRealAux
property = cdf_failure
variable = cumulative_damage_index
[]
[relx_aux]
type = ParsedAux
variable = relx
block = fuel
use_xyzt = true
expression = 'x / ${fuel_radius}'
[]
[clad_thm_exp]
type = SpatialUserObjectAux
variable = clad_thm_exp
execute_on = 'initial timestep_end'
user_object = clad_thm_exp
block = '${cladding_block}'
[]
[clad_thermal_eigenstrain_xx]
type = ADRankTwoAux
rank_two_tensor = cladding_thermal_eigenstrain
variable = clad_thermal_eigenstrain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = '${cladding_block}'
[]
[fuel_thermal_strain_xx]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = fuel
[]
[fuel_thermal_strain_yy]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_yy
index_j = 1
index_i = 1
execute_on = 'initial timestep_end'
block = fuel
[]
[fuel_thm_exp]
type = SpatialUserObjectAux
variable = fuel_thm_exp
execute_on = 'initial timestep_end'
user_object = fuel_thm_exp
block = fuel
[]
# OPTD
[assign_pen_thick_aux]
type = ADMaterialRealAux
variable = pen_thick_aux
property = liquid_penetration
block = 'fuel ${cladding_block}'
[]
[assign_total_id_reduction]
type = ParsedAux
variable = total_id_reduction
coupled_variables = 'pen_thick_aux wastage_thickness'
expression = 'pen_thick_aux + wastage_thickness'
block = 'fuel ${cladding_block}'
[]
[]
[Materials]
[fuel_pen]
type = ADMetallicFuelLiquidCladdingPenetration
temperature = temp
mesh_generator = gen
fuel_elongation_pp = max_fuel_elongation
liquid_penetration_model = 'ANL_CONSERVATIVE'
fuel_pu = Pu_0
burnup = burnup
outputs = all
calculate_fuel_melting_thickness = true
block = 'fuel ${cladding_block}'
[]
[longHT9_failure]
type = HT9FailureClad
block = '${cladding_block}'
method = cdf_long
temperature = temp
outputs = all
hoop_stress = stress_zz # Since 2D-RZ
[]
[d_x]
type = ADConstantAnisotropicMobility
tensor = '1e3 0 0
0 1e6 0
0 0 0'
M_name = d_x
[]
[cap_thcond]
type = ADGenericConstantMaterial
prop_names = 'thermal_conductivity specific_heat density'
prop_values = '65 1200 830'
block = 'cap stand'
outputs = all
[]
[interconnected_porosity]
type = ADParsedMaterial
block = 'fuel'
property_name = interconnected_porosity
material_property_names = 'porosity interconnectivity'
expression = 'porosity * interconnectivity'
outputs = all
[]
[fission_rate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors
pellet_radius = ${fuel_radius}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${X_Pu}
block = 'fuel'
outputs = all
[]
[fission_rate_elongate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors_extended
pellet_radius = ${fuel_radius}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${X_Pu}
block = '${cladding_block}'
outputs = all
fission_rate_name = fission_rate
[]
[burnup]
type = ADUPuZrBurnup
initial_X_Zr = ${initial_X_Zr}
initial_X_Pu = ${X_Pu}
density = ${fuel_density}
block = 'fuel'
outputs = all
[]
[burnup_elongate]
type = ADUPuZrBurnup
initial_X_Pu = ${X_Pu}
initial_X_Zr = ${initial_X_Zr}
outputs = all
block = '${cladding_block}'
density = ${fuel_density}
burnup_name = burnup
[]
[fuel_elastic_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hotpress fuel_upuzrcreep gas_swelling'
block = 'fuel'
outputs = all
[]
[hotpress]
type = ADUPuZrHotPressingStressUpdate
block = 'fuel'
outputs = all
surface_energy = 1.6
plenum_pressure = plenum_pressure
porosity_name = porosity
max_inelastic_increment = 1e-1
interconnectivity = interconnectivity
bubble_concentration = ${bubble_concentration}
temperature = temp
creep_model = MFH
fission_rate = fission_rate
atomic_volume = 2.15e-29
porosity_start = 0.01
porosity_end = 0
grain_boundary_D0 = 4e-29
grain_boundary_Q = 0
absolute_tolerance = 1e-9
[]
[porosity]
type = ADPorosityFromStrain
block = 'fuel'
initial_porosity = 1e-10
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[fuel_elasticity_tensor]
type = ADUPuZrElasticityTensor
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
youngs_model = LANL
block = 'fuel'
temperature = temp
use_old_porosity = true
outputs = all
output_properties = 'youngs_modulus poissons_ratio'
[]
[fuel_upuzrcreep]
type = ADUPuZrCreepUpdate
block = 'fuel'
temperature = temp
porosity = porosity
use_old_porosity = true
max_inelastic_increment = 1e-1
outputs = all
automatic_differentiation_return_mapping = false
[]
[fuel_thermal_expansion]
type = ADUPuZrThermalExpansionEigenstrain
block = 'fuel'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = fuel_thermal_strain
outputs = all
thermal_expansion_model = LANL
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
block = 'fuel'
bubble_concentration = ${bubble_concentration}
initial_bubble_concentration = ${bubble_concentration}
compute_interconnectivity = true
fission_gas_yield = 0.3017
fission_rate = fission_rate
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.99
interconnection_initiating_porosity = 0.23
interconnection_terminating_porosity = 0.25
max_inelastic_increment = 1e-2
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.26
initial_porosity = 1e-10
fuel_melting_function = fuel_melt_func
[]
[solid_swelling]
type = ADBurnupDependentEigenstrain
eigenstrain_name = solid_swelling_eigenstrain
block = 'fuel'
swelling_name = 'solid_swelling'
outputs = all
anisotropic_factor = 0.26
[]
[metal_fuel_thermal]
type = ADUPuZrThermal
block = 'fuel'
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
spheat_model = savage
porosity = porosity
temperature = temp
outputs = all
porosity_model = logged
sodium_logged_porosity = sodium_logged_porosity
[]
[sodium_logging]
type = ADUPuZrSodiumLogging
block = 'fuel'
porosity = porosity
interconnectivity = interconnectivity
sodium_infiltration_fraction = 0.28
outputs = all
[]
[fuel_density]
type = ADStrainAdjustedDensity
block = 'fuel'
strain_free_density = ${fuel_density}
outputs = all
[]
[fast_neutron_flux]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors
rod_ave_lin_pow = flux_history
block = fuel
factor = 1.0
outputs = all
[]
[fast_neutron_flux_elongate]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors_elongate
rod_ave_lin_pow = flux_history
block = '${cladding_block}'
factor = 1.0
outputs = all
[]
[cladding_elasticity_tensor]
type = ADHT9ElasticityTensor
temperature = temp
block = '${cladding_block}'
outputs = all
id_wastage_degradation_function = id_vpp_func
od_wastage_degradation_function = od_vpp_func
output_properties = 'youngs_modulus poissons_ratio'
[]
[cladding_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'cladding_creep'
block = '${cladding_block}'
outputs = all
[]
[cladding_creep]
type = ADHT9CreepUpdate
block = '${cladding_block}'
temperature = temp
outputs = all
primary_creep_model = MFH
secondary_creep_model = MFH
irradiation_creep_model = MFH
fast_neutron_flux = fast_neutron_flux
[]
[thermal_expansion]
type = ADHT9ThermalExpansionEigenstrain
block = '${cladding_block}'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = cladding_thermal_eigenstrain
outputs = all
[]
[cladding_thermal]
type = ADHT9Thermal
block = '${cladding_block}'
temperature = temp
outputs = all
[]
[cladding_density]
type = ADStrainAdjustedDensity
block = '${cladding_block}'
strain_free_density = '${clad_density}'
outputs = all
[]
[wastage_thickness]
type = ADMetallicFuelWastage
method = burnup_ht9_opt
burnup = burnup
temperature = temp
scale_factor = 1
block = '${cladding_block}'
outputs = all
[]
[cc_wastage_thickness]
type = ADMetallicFuelCoolantWastage
clad_material = HT9
use_effective_method = true
temperature = temp
scale_factor = 1
block = '${cladding_block}'
outputs = all
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temp]
type = MaxIncrement
variable = temp
max_increment = 50
[]
[]
[Preconditioning]
[vcp]
type = VCP
full = true
primary_variable = 'disp_x disp_y temp'
preconditioner = 'LU'
adaptive_condensation = true
lm_variable = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
is_lm_coupling_diagonal = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
petsc_options = '-snes_ksp_ew -snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount -snes_force_iteration'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15 1'
line_search = 'none'
snesmf_reuse_base = false
verbose = true
l_max_its = 60
nl_max_its = 20
nl_rel_tol = 1e-7
nl_abs_tol = 1e-9
end_time = ${run_time}
dtmin = 1e-100
dtmax = ${max_time_step}
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
ignore_variables_for_autoscaling = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = time_step_limit
force_step_every_function_point = true
timestep_limiting_function = power_history
dt = 1e2
iteration_window = 4
optimal_iterations = 10
[]
[]
[Postprocessors]
[_dt]
type = TimestepSize
[]
# elemental temperatures
[temp_fuel_avg]
type = ElementAverageValue
variable = temp
block = 'fuel'
execute_on = 'initial timestep_end'
[]
[temp_fuel_max]
type = ElementExtremeValue
variable = temp
block = 'fuel'
[]
[temp_fuel_min]
type = ElementExtremeValue
variable = temp
block = 'fuel'
value_type = min
[]
[temp_cladding_avg]
type = ElementAverageValue
variable = temp
block = '${cladding_block}'
[]
[temp_cladding_max]
type = ElementExtremeValue
variable = temp
block = '${cladding_block}'
[]
[temp_cladding_min]
type = ElementExtremeValue
variable = temp
block = '${cladding_block}'
value_type = min
[]
# boundary temperatures
[temp_gas_avg]
type = SideAverageValue
boundary = 'gas_height cladding_inside_top'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_sodium_avg]
type = ElementAverageValue
block = 'cap'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_inside_surfaces_avg]
type = SideAverageValue
boundary = 'inside_surfaces'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_max]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_min]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
value_type = min
[]
[temp_fuel_surface_avg]
type = SideAverageValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_max]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_min]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
value_type = min
[]
[temp_cladding_inside_right_avg]
type = SideAverageValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_inside_right_max]
type = NodalExtremeValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_outside_right_avg]
type = SideAverageValue
boundary = 'cladding_outside_right'
variable = temp
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'fuel'
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'fuel'
[]
[stress_vonmises_cladding_avg]
type = ElementAverageValue
variable = vonmises_stress
block = '${cladding_block}'
[]
[stress_vonmises_cladding_max]
type = ElementExtremeValue
variable = vonmises_stress
block = '${cladding_block}'
[]
[stress_vonmises_cladding_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = '${cladding_block}'
[]
[stress_hydro_cladding_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = '${cladding_block}'
[]
[stress_hydro_cladding_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = '${cladding_block}'
[]
[stress_hydro_cladding_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = '${cladding_block}'
[]
[contact_pressure_max]
type = NodalExtremeValue
variable = fuel_cladding_mechanical_normal_lm
boundary = 'fuel_outer_radial_surface'
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = 'fuel'
[]
[strain_gas_swelling_fuel_avg]
type = ElementAverageValue
variable = effective_fission_gas_strain
block = 'fuel'
[]
[strain_hot_pressing_fuel_avg]
type = ElementAverageValue
variable = effective_hot_pressing_strain
block = 'fuel'
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = 'fuel'
[]
[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 = 'fuel_top'
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_top'
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_cladding_interior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_interior_min]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
value_type = min
[]
[disp_x_cladding_interior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_exterior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[disp_x_cladding_exterior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[anisotropic_swelling_factor]
type = FunctionValuePostprocessor
function = anisotropic_swelling_factor
[]
[max_fuel_elongation]
type = NodalExtremeValue
variable = disp_y
boundary = fuel_outside_all
[]
# geometric information
[volume_cladding_interior]
type = InternalVolume
boundary = 'cladding_inside_all'
[]
[volume_fuel]
type = InternalVolume
boundary = 'fuel_outside_all'
execute_on = 'initial timestep_end'
[]
[volume_plenum]
type = InternalVolume
boundary = 'inside_surfaces'
execute_on = 'initial timestep_end'
addition = sodium_volume
[]
[plenum_ratio]
type = ParsedPostprocessor
pp_names = 'volume_plenum volume_fuel'
expression = 'volume_plenum / volume_fuel'
execute_on = 'initial timestep_end'
[]
[volume_sodium]
type = FunctionValuePostprocessor
function = sodium_volume
execute_on = 'initial timestep_end'
[]
# energy information
[flux_clad]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'cladding_inside_right'
diffusivity = thermal_conductivity
[]
[flux_fuel]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'fuel_contact_surfaces'
diffusivity = thermal_conductivity
[]
[power_integral]
type = ADElementIntegralPower
variable = temp
use_material_fission_rate = true
fission_rate_material = fission_rate
block = fuel
[]
[linear_heat_generation_rate]
type = FunctionValuePostprocessor
function = power_history
scale_factor = 0.01
[]
[burnup_avg]
type = ElementAverageValue
block = fuel
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = fuel
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = fuel
[]
# fission gas information
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_produced
block = fuel
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_released
block = fuel
execute_on = 'initial timestep_end'
[]
[fg_percent]
type = FGRPercent
fission_gas_released = fg_released
fission_gas_generated = fg_produced
[]
[interconnected_porosity_fuel_avg]
type = ElementAverageValue
variable = interconnected_porosity
block = fuel
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = fuel
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = fuel
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = fuel
[]
[porosity_sodium_logging_avg]
type = ElementAverageValue
variable = sodium_logged_porosity
block = fuel
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
block = 'fuel ${cladding_block}'
outputs = none
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[max_wastagethickness]
type = ElementExtremeValue
value_type = max
variable = wastage_thickness
# outputs = 'console'
[]
[max_wst_temp]
type = ElementExtremeValue
value_type = max
variable = temp
proxy_variable = wastage_thickness
block = '${cladding_block}'
[]
[max_wst_burnup]
type = ElementExtremeValue
value_type = max
variable = burnup
proxy_variable = wastage_thickness
block = '${cladding_block}'
[]
[max_cdf]
type = ElementExtremeValue
value_type = max
variable = cumulative_damage_index
[]
[]
[VectorPostprocessors]
[id_wastage]
type = FuelRodLineValueSampler
variable = wastage_thickness
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = csv_wst_a
[]
[id_pen_total]
type = FuelRodLineValueSampler
variable = total_id_reduction
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[od_wastage]
type = FuelRodLineValueSampler
variable = cc_wastage_thickness
material = 'clad'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[fuel_melting]
type = FuelRodLineValueSampler
variable = fuel_melting_thickness
material = 'fuel'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[]
[PerformanceMetricOutputs]
outputs = 'console'
[]
[Outputs]
print_linear_residuals = true
color = true
perf_graph = true
sync_times = ${time_spots}
[checkpoint]
type = Checkpoint
time_step_interval = 1
[]
[exodus]
type = Exodus
time_step_interval = 500
sync_times = ${time_spots}
enable = false
[]
[console]
type = Console
show = 'time_step_size temp_fuel_avg temp_fuel_centerline_max temp_cladding_avg temp_cladding_max stress_vonmises_fuel_max stress_hydro_fuel_max stress_hydro_fuel_min contact_pressure_max strain_axial_fuel_avg power_integral burnup_avg fission_rate_avg fg_percent porosity_fuel_avg time_step_limit anisotropic_swelling_factor plenum_ratio volume_fuel volume_plenum max_wastagethickness max_cdf'
[]
[csv_wst_a]
type = CSV
sync_only = true
sync_times = ${time_spots_a}
enable = ${enable_a}
execute_postprocessors_on = none
create_latest_symlink = true
[]
[csv_general]
type = CSV
sync_only = true
sync_times = ${time_spots}
enable = true
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temp'
show_var_residual_norms = true
[]
(test/tests/solid_mechanics/upuzr_hot_pressing/exact.i)
C_bub = 1e15
gamma = 1
P_plenum = 1.5e5
scalar = 0.9
omega = 5e-29
kb = 1.380649e-23
pi = 3.14159
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = 0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hot_press'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = ${gamma}
bubble_concentration = ${C_bub}
plenum_pressure = ${P_plenum}
scalar = ${scalar}
atomic_volume = ${omega}
porosity_name = porosity
max_inelastic_increment = 0.001
interconnectivity = 1.0
outputs = all
creep_model = MCDEAVITT
porosity_start = 0.195
porosity_end = 0.18
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 1.4e7
dt = 1e6
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[disp_x_avg]
type = SideAverageValue
variable = disp_x
boundary = right
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[hp_strain_rate_exact]
type = ParsedPostprocessor
pp_names = 'temp hydro porosity'
expression = 'sigma := -hydro * 1e-6;
rad := (3. / 4. / ${pi} * porosity / ${C_bub})^(1/3);
extra_sigma := if((2 * ${gamma} / rad - ${P_plenum}) * 1e-6> 0, 0, (2 * ${gamma} / rad - ${P_plenum}) * 1e-6);
lambda := rad / porosity^(1/3);
diff := 3.24e-11 * exp(-186600 / 8.314 / temp);
const := ${scalar} * 2 * ${pi} / 3 * ${C_bub} * ${omega} * diff / ${kb} / temp * 1e6;
force := sigma + extra_sigma;
sigma_inf := (sigma * lambda^2 + extra_sigma * rad^2) / (lambda^2 - rad^2);
epsilon_inf := 4e-10 * sigma_inf^5;
Lambda := (diff * ${omega} / ${kb} / temp * sigma_inf / epsilon_inf * 1e6)^(1/3);
boverrad := Lambda / rad + 1;
f_shape := 1 / (log(boverrad) - boverrad^(-4) / 4 + boverrad^(-2) - 0.75);
x := (porosity - 0.195) / (0.18 - 0.195);
clampedx := if(x > 1, 1, if(x < 0, 0, x));
mixing := 1 - clampedx^3 * (clampedx * (clampedx * 6.0 - 15.0) + 10.0);
if(force < 0, 0, const * f_shape * force * mixing)'
[]
[hp_strain_rate_diff]
type = ParsedPostprocessor
pp_names = 'hp_strain_rate hp_strain_rate_exact'
expression = 'if(hp_strain_rate_exact = 0, 0, (hp_strain_rate - hp_strain_rate_exact) / hp_strain_rate_exact)'
[]
[hp_strain_rate_diff_max]
type = TimeExtremeValue
postprocessor = hp_strain_rate_diff
value_type = abs_max
[]
[]
[Outputs]
csv = true
[]
(test/tests/solid_mechanics/upuzr_hot_pressing/exact_upuzrcreep.i)
C_bub = 1e15
gamma = 1
P_plenum = 1.5e5
scalar = 0.9
omega = 5e-29
kb = 1.380649e-23
pi = 3.14159
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Mesh]
[gen]
type = ExamplePatchMeshGenerator
dim = 3
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[all]
add_variables = true
strain = FINITE
use_automatic_differentiation = true
generate_output = 'hydrostatic_stress'
[]
[]
[AuxVariables]
[temp]
initial_condition = 800
[]
[]
[AuxKernels]
[temp_aux]
type = FunctionAux
variable = temp
function = '800 + t / 5e4'
[]
[]
[BCs]
[Pressure]
[u_top_pull]
boundary = top
factor = 0.1
function = 't'
use_automatic_differentiation = true
[]
[]
[bottom_x]
type = ADDirichletBC
variable = disp_x
boundary = 'left'
value = 0.0
[]
[bottom_y]
type = ADDirichletBC
variable = disp_y
boundary = 'bottom'
value = 0.0
[]
[bottom_z]
type = ADDirichletBC
variable = disp_z
boundary = 'back'
value = 0.0
[]
[]
[Materials]
[elasticity_tensor]
type = ADComputeIsotropicElasticityTensor
youngs_modulus = 1.0e9
poissons_ratio = .3
[]
[fuel_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hot_press'
[]
[porosity]
type = ADPorosityFromStrain
initial_porosity = 0.2
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[hot_press]
type = ADUPuZrHotPressingStressUpdate
temperature = temp
surface_energy = ${gamma}
bubble_concentration = ${C_bub}
plenum_pressure = ${P_plenum}
scalar = ${scalar}
atomic_volume = ${omega}
porosity_name = porosity
interconnectivity = 1.0
outputs = all
alpha_transition_start = 825
alpha_transition_end = 855
fission_rate = 1e20
creep_model = MFH
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
end_time = 1e7
dt = 1e6
[]
[Postprocessors]
[hydro]
type = ElementAverageValue
variable = hydrostatic_stress
[]
[hp_strain_rate]
type = ElementAverageValue
variable = hot_pressing_strain_rate
[]
[hp_strain]
type = ElementAverageValue
variable = effective_hot_pressing_strain
[]
[porosity]
type = ElementAverageValue
variable = porosity
execute_on = TIMESTEP_BEGIN
[]
[disp_x_avg]
type = SideAverageValue
variable = disp_x
boundary = right
[]
[temp]
type = ElementAverageValue
variable = temp
[]
[volume]
type = InternalVolume
boundary = 'top bottom front back left right'
execute_on = 'initial timestep_end'
[]
[hp_strain_rate_exact]
type = ParsedPostprocessor
pp_names = 'temp hydro porosity'
expression = 'sigma := -hydro * 1e-6;
rad := (3. / 4. / ${pi} * porosity / ${C_bub})^(1/3);
extra_sigma := if((2 * ${gamma} / rad - ${P_plenum}) * 1e-6> 0, 0, (2 * ${gamma} / rad - ${P_plenum}) * 1e-6);
lambda := rad / porosity^(1/3);
diff := 3.24e-11 * exp(-186600 / 8.314 / temp);
const := ${scalar} * 2 * ${pi} / 3 * ${C_bub} * ${omega} * diff / ${kb} / temp * 1e6;
force := sigma + extra_sigma;
sigma_inf := (sigma * lambda^2 + extra_sigma * rad^2) / (lambda^2 - rad^2);
diff_alpha := 5.0e4 * (1 + 7.9 * porosity + 470 * porosity^2) * exp(-52000 / 1.987 / temp) * sigma_inf;
dis_alpha := 6 * (1 - porosity^(2/3))^(-4.5) * exp(-52000 / 1.987 / temp) * sigma_inf^(4.5);
gamma := 0.08 * (1 - porosity^(2/3))^(-3) * exp(-28500 / 1.987 / temp) * sigma_inf^3;
x := (temp - 825) / (855 - 825);
clampedx := if(x > 1, 1, if(x < 0, 0, x));
mix := (clampedx)^3 * (clampedx * (clampedx * 6.0 - 15.0) + 10.0);
irr_creep_rate := 7.7e-29 * 1e20 * sigma_inf;
epsilon_inf := (diff_alpha + dis_alpha) * (1 - mix) + gamma * mix + irr_creep_rate;
Lambda := (diff * ${omega} / ${kb} / temp * sigma_inf / epsilon_inf * 1e6)^(1/3);
boverrad := Lambda / rad + 1;
f_shape := 1 / (log(boverrad) - boverrad^(-4) / 4 + boverrad^(-2) - 0.75);
if(force < 0, 0, const * f_shape * force)'
[]
[hp_strain_rate_diff]
type = ParsedPostprocessor
pp_names = 'hp_strain_rate hp_strain_rate_exact'
expression = '(hp_strain_rate - hp_strain_rate_exact) / hp_strain_rate_exact'
[]
[hp_strain_rate_diff_max]
type = TimeExtremeValue
postprocessor = hp_strain_rate_diff
value_type = abs_max
[]
[]
[Outputs]
csv = true
[]
(assessment/metallic_fuel/FBTA/analysis/steady_state/AK181/181193/IFR1_181193.i)
# IFR-1 Pin 181193
# Inspired by BISON IFR-1 Assessment Case and BISON X441 Assessment Case
exp_id = AK181
pin_id = 181193
fipd_submodule_dir = '../../../../../../../fipd-bison-integration-data/'
cladding_ir = '${fparse 0.226*0.5*0.0254}'
cladding_thickness = '${fparse 0.022*0.0254}'
fuel_radius = ${fparse 0.196*0.5*0.0254}
# Fuel length is 6.5 + 36.0 + 6.5 = 49.0 inch
# Which is 0.13265 0.73470 0.13265
reflector_frac = 0.13265
active_frac = 0.73470
transition_frac = 0.001
fuel_intervals = '0 ${fparse reflector_frac-transition_frac} ${reflector_frac} ${fparse reflector_frac+active_frac} ${fparse reflector_frac+active_frac+transition_frac} 1.0'
reflector_height = '${fparse 6.5*0.0254}'
active_fuel_height = '${fparse 36.0*0.0254}'
transition_height = '${fparse reflector_height/reflector_frac*transition_frac}'
clad_plug_thick = 2.24e-3
bot_gap_thick = 0.31e-3
bottom_blanket_start = '${fparse clad_plug_thick+bot_gap_thick}'
bottom_transition_layer_start = '${fparse bottom_blanket_start+reflector_height-transition_height}'
active_fuel_start = '${fparse bottom_blanket_start+reflector_height}'
active_fuel_end = '${fparse active_fuel_start+active_fuel_height}'
top_transition_layer_end = '${fparse active_fuel_end+transition_height}'
top_blanket_end = '${fparse active_fuel_end+reflector_height}'
gas_plenum_height = '${fparse 39.0*0.0254}'
sodium_cap_height = '${fparse 1.0*0.0254}'
time_last = 53611920
max_dt = 1e5
magic_factor = 5e-1 #1.00e-01
A_U = 0.23803 # [kg/mol]
A_Pu = 0.240 # [kg/mol]
A_Zr = 0.091224 # [kg/mol]
W_Pu = 0.19
W_Zr = 0.1
W_U = '${fparse 1 - W_Pu - W_Zr}'
A_tot = '${fparse 1 / (W_U / A_U + W_Pu / A_Pu + W_Zr / A_Zr)}'
X_Pu = '${fparse W_Pu / A_Pu * A_tot}'
fuel_pu = ${X_Pu}
initial_X_Zr = '${fparse W_Zr / A_Zr * A_tot}'
fuel_density = 15.73e3
alpha_start = 877
alpha_end = 936
bubble_concentration = 1e15
cladding_block = 'cladding'
[GlobalParams]
density = ${fuel_density}
order = FIRST
family = LAGRANGE
energy_per_fission = 3.2e-11 # J/fission
volumetric_locking_correction = false
displacements = 'disp_x disp_y'
alpha_transition_end = ${alpha_end}
alpha_transition_start = ${alpha_start}
[]
[Problem]
type = ReferenceResidualProblem
extra_tag_vectors = 'ref'
reference_vector = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temp'
[]
[Mesh]
[gen]
type = FIPDRodletMeshGenerator
fipd_geom_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / ${pin_id} _design.csv'}
gap_bottom_length = ${bot_gap_thick}
cladding_bottom_plug_length = ${clad_plug_thick}
cladding_top_plug_length = ${clad_plug_thick}
cladding_sidewall_radial_elements = 10
cladding_sidewall_axial_element_numbers = '2 400 400'
cladding_top_plug_radial_elements = 10
cladding_top_plug_axial_elements = 5
cladding_bottom_plug_axial_elements = 5
fuel_radial_elements = 10
fuel_axial_element_intervals = ${fuel_intervals}
fuel_axial_element_numbers = '30 1 400 1 30'
use_default_cladding_sidewall_axial_element_intervals = true
elem_type = QUAD4
make_stand = true
make_cap = true
cap_axial_elements = 15
stand_axial_elements = 15
[]
# As RodletMeshGenerator does not support axial blankets
# We need to define them ourselves
[upper_blanket]
type = ParsedSubdomainMeshGenerator
input = gen
excluded_subdomains = 'cladding cap stand'
combinatorial_geometry = 'y>=y0'
constant_names = 'y0'
constant_expressions = '${top_transition_layer_end}'
block_id = 11
block_name = 'upper_blanket'
[]
[lower_blanket]
type = ParsedSubdomainMeshGenerator
input = upper_blanket
excluded_subdomains = 'cladding cap stand upper_blanket'
combinatorial_geometry = 'y<=y0'
constant_names = 'y0'
constant_expressions = '${bottom_transition_layer_start}'
block_id = 12
block_name = 'lower_blanket'
[]
[upper_transition]
type = ParsedSubdomainMeshGenerator
input = lower_blanket
excluded_subdomains = 'cladding cap stand upper_blanket'
combinatorial_geometry = 'y>=y0'
constant_names = 'y0'
constant_expressions = '${active_fuel_end}'
block_id = 13
block_name = 'upper_transition'
[]
[lower_transition]
type = ParsedSubdomainMeshGenerator
input = upper_transition
excluded_subdomains = 'cladding cap stand lower_blanket'
combinatorial_geometry = 'y<=y0'
constant_names = 'y0'
constant_expressions = '${active_fuel_start}'
block_id = 14
block_name = 'lower_transition'
[]
[sodium_height]
type = SideSetsFromBoundingBoxGenerator
input = lower_transition
bottom_left = '0 0 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${top_blanket_end} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1005'
[]
[gas_height]
type = SideSetsFromBoundingBoxGenerator
input = sodium_height
bottom_left = '0 ${top_blanket_end} 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse top_blanket_end + sodium_cap_height + gas_plenum_height + clad_plug_thick} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1006'
[]
[sodium_plenum_rename]
type = RenameBoundaryGenerator
input = gas_height
old_boundary = '1005 1006'
new_boundary = 'sodium_height gas_height'
[]
patch_size = 40
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
coord_type = RZ
[]
[Variables]
[temp]
initial_condition = 298
block = 'fuel cladding cap stand upper_blanket lower_blanket upper_transition lower_transition'
[]
[disp_x]
block = 'fuel cladding cap stand upper_blanket lower_blanket upper_transition lower_transition'
[]
[disp_y]
block = 'fuel cladding cap stand upper_blanket lower_blanket upper_transition lower_transition'
[]
[]
[Functions]
# We do not have SE2P data for IFR-1
# [clad_od_temp]
# type = FIPDAxialProfileFunction
# data_file = ${raw 'fipd /clad_od_temp_history_ ${pin_id} .csv'}
# bottom_clad_height = ${clad_plug_thick}
# clad_bottom_gap_height = ${fparse bot_gap_thick+reflector_height}
# fuel_slug_length = ${active_fuel_height}
# []
[coolant_flux_function]
type = PiecewiseLinear
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / flow_history_ ${pin_id} .csv'}
[]
[coolant_pressure_function]
# Constant coolant inlet pressure (Pa) taken from [Cabell, 1980].
# From IFR-1 Assessment Case
type = ConstantFunction
value = 1018327
[]
[coolant_T_in_function]
# Sodium coolant inlet temperature (K). See [Porter and Tsai, 2011]
# We would like to always use 633.15 K
type = ConstantFunction
value = 633.15
[]
[ab_sodium_vol]
type = MeshPropertyFunction
mesh_generator = gen
mesh_property_name = sodium_volume
scale_factor = -1.0
[]
[sodium_volume]
type = ParsedFunction
symbol_names = 'porosity_sodium_logging_avg volume_fuel raw_sodium_vol temp_sodium_avg'
symbol_values = 'porosity_sodium_logging_avg volume_fuel ab_sodium_vol temp_sodium_avg'
expression = 'raw_sodium_vol * 954 / (1102 - 0.23 * temp_sodium_avg) - volume_fuel * porosity_sodium_logging_avg'
[]
[power_history]
type = PiecewiseLinear
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / power_history_ ${pin_id} .csv'}
[]
[power_history_avg]
type = PiecewiseLinear
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / power_history_ ${pin_id} .csv'}
scale_factor = 0.811078523
[]
[pwr_axial_peaking_factors]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_power_relative_ ${pin_id} .csv'}
zero_ends = true
data_shift_type = peaking
bottom_clad_height = ${clad_plug_thick}
clad_bottom_gap_height = ${fparse bot_gap_thick+reflector_height}
fuel_slug_length = ${active_fuel_height}
[]
[pwr_axial_peaking_factors_cdf]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_power_cdf_relative_ ${pin_id} .csv'}
data_shift_type = peaking
bottom_clad_height = ${clad_plug_thick}
clad_bottom_gap_height = ${fparse bot_gap_thick+reflector_height}
fuel_slug_length = ${active_fuel_height}
[]
[pwr_axial_peaking_factors_elongate]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_power_relative_ ${pin_id} .csv'}
zero_ends = true
data_shift_type = peaking
fuel_elongation_pp = max_fuel_elongation
bottom_clad_height = ${clad_plug_thick}
clad_bottom_gap_height = ${fparse bot_gap_thick+reflector_height}
fuel_slug_length = ${active_fuel_height}
[]
[fflux_axial_peaking_factors]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_flux_relative_ ${pin_id} .csv'}
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
bottom_clad_height = ${clad_plug_thick}
clad_bottom_gap_height = ${fparse bot_gap_thick+reflector_height}
fuel_slug_length = ${active_fuel_height}
[]
[fflux_axial_peaking_factors_elongate]
type = FIPDAxialProfileFunction
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / peakingfactor_flux_relative_ ${pin_id} .csv'}
zero_ends = true
data_shift_type = peaking
extrapolate_to_zero = true
fuel_elongation_pp = max_fuel_elongation
bottom_clad_height = ${clad_plug_thick}
clad_bottom_gap_height = ${fparse bot_gap_thick+reflector_height}
fuel_slug_length = ${active_fuel_height}
[]
[flux_history]
type = PiecewiseLinear
data_file = ${raw ' ${fipd_submodule_dir} / ${exp_id} / ${pin_id} / flux_history_ ${pin_id} .csv'}
[]
[id_vpp_func]
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = id_wastage
argument_column = y
wastage_type = ID
value_column = wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[od_vpp_func]
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = od_wastage
argument_column = y
wastage_type = OD
value_column = cc_wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[anisotropic_swelling_factor]
type = ParsedFunction
symbol_names = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg fuel_height fuel_radius'
symbol_values = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg ${active_fuel_height} ${fuel_radius}'
expression = '(disp_x_fuel_radial_surface_avg / fuel_radius) / (disp_y_fuel_top_surface_avg / fuel_height)'
[]
[gap_thermal_conductivity]
type = ParsedFunction
expression = '124.67 - 0.11381 * t + 5.5226e-5 * t^2 - 1.1842e-8 * t^3'
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
strain = FINITE
add_variables = false
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'
block = 'fuel upper_blanket lower_blanket'
eigenstrain_names = 'fuel_thermal_strain solid_swelling_eigenstrain'
use_automatic_differentiation = true
[]
[]
[Kernels]
[gravity]
type = ADGravity
block = 'fuel cladding upper_blanket lower_blanket'
variable = disp_y
value = -9.81
extra_vector_tags = 'ref'
[]
[heat]
type = ADHeatConduction
block = 'fuel cladding cap stand upper_blanket lower_blanket upper_transition lower_transition'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
block = 'fuel cladding cap stand upper_blanket lower_blanket upper_transition lower_transition'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temp
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
fission_rate = fission_rate
extra_vector_tags = 'ref'
energy_deposited_in_fuel = 0.95
[]
[disp_x_dt]
type = ADTimeDerivative
variable = disp_x
block = 'cap stand upper_transition lower_transition'
extra_vector_tags = 'ref'
[]
[disp_y_dt]
type = ADTimeDerivative
variable = disp_y
block = 'cap stand upper_transition lower_transition'
extra_vector_tags = 'ref'
[]
[disp_x_diff]
type = ADMatAnisoDiffusion
variable = disp_x
block = 'cap stand upper_transition lower_transition'
diffusivity = d_x
extra_vector_tags = 'ref'
[]
[disp_y_diff]
type = ADMatDiffusion
variable = disp_y
block = 'cap stand upper_transition lower_transition'
diffusivity = 1e8
extra_vector_tags = 'ref'
[]
[]
[UserObjects]
[fuel_thm_exp]
type = LayeredAverage
variable = fuel_thermal_strain_xx
direction = y
num_layers = 1000
block = 'fuel upper_blanket lower_blanket'
[]
[pin_geometry]
type = FuelPinGeometry
clad_bottom = cladding_outside_bottom
clad_inner_wall = cladding_inside_right
clad_outer_wall = cladding_outside_right
clad_top = cladding_outside_top
pellet_exteriors = fuel_outside_all
[]
[clad_thm_exp]
type = LayeredAverage
variable = clad_thermal_eigenstrain_xx
direction = y
num_layers = 1000
block = cladding
[]
[]
[Contact]
[fuel_cladding_mechanical]
primary = cladding_inside_right
secondary = fuel_outer_radial_surface
model = coulomb
friction_coefficient = 0.1
formulation = mortar
c_normal = ${fparse 1e17 * magic_factor}
c_tangential = ${fparse 1e19 * magic_factor}
tangential_lm_scaling = 1.0e-22
normal_lm_scaling = 1.0e-4
correct_edge_dropping = true
[]
[]
[MortarGapHeatTransfer]
[inside2outside]
temperature = temp
primary_emissivity = 0
secondary_emissivity = 0
boundary = 'cladding_inside_right'
gap_conductivity_function = gap_thermal_conductivity
gap_conductivity_function_variable = temp
primary_boundary = cladding_inside_right
secondary_boundary = fuel_contact_surfaces
gap_flux_options = 'CONDUCTION'
thermal_lm_scaling = 1e-4
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = 'centerline cap_top'
value = 0.0
preset = false
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = 'cladding_inside_bottom'
value = 0.0
preset = false
[]
[Pressure]
[coolantPressure]
boundary = 'cladding_outside_right'
factor = 0.151e6
use_automatic_differentiation = true
[]
[]
[PlenumPressure]
[plenumPressure]
boundary = 'inside_surfaces'
initial_pressure = 84116 # in Pa, 12.2 psi
startup_time = 0
R = 8.3143
temperature = temp_gas_avg
volume = volume_plenum
output = plenum_pressure
material_input = fg_released
use_automatic_differentiation = true
[]
[]
[convection]
type = ConvectiveHeatFluxBC
variable = temp
boundary = cladding_outside_right
T_infinity = coolant_temperature
heat_transfer_coefficient = coolant_channel_htc
[]
[]
[FluidProperties]
[sodium_uo]
type = SodiumProperties
[]
[]
[AuxVariables]
[cumulative_damage_index]
order = CONSTANT
family = MONOMIAL
[]
[relx]
[]
[clad_thm_exp]
order = CONSTANT
family = MONOMIAL
block = cladding
[]
[fuel_thermal_strain_xx]
order = CONSTANT
family = MONOMIAL
block = 'fuel upper_blanket lower_blanket'
[]
[fuel_thermal_strain_yy]
order = CONSTANT
family = MONOMIAL
block = 'fuel upper_blanket lower_blanket'
[]
[fuel_thm_exp]
order = CONSTANT
family = MONOMIAL
block = 'fuel upper_blanket lower_blanket'
[]
[clad_thermal_eigenstrain_xx]
order = CONSTANT
family = MONOMIAL
block = cladding
[]
[func_val1]
[]
[func_val2]
[]
[fast_neutron_fluence_aux]
order = CONSTANT
family = MONOMIAL
block = 'cladding'
[]
[]
[AuxKernels]
[func_val1]
type = FunctionAux
function = id_vpp_func
variable = func_val1
block = 'cladding'
[]
[func_val2]
type = FunctionAux
function = od_vpp_func
variable = func_val2
block = 'cladding'
[]
[cdf_amount]
block = cladding
type = MaterialRealAux
property = cdf_failure
variable = cumulative_damage_index
execute_on = timestep_end
[]
[relx_aux]
type = ParsedAux
variable = relx
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
use_xyzt = true
expression = 'x / ${fuel_radius}'
[]
[clad_thm_exp]
type = SpatialUserObjectAux
variable = clad_thm_exp
execute_on = 'initial timestep_end'
user_object = clad_thm_exp
block = cladding
[]
[clad_thermal_eigenstrain_xx]
type = ADRankTwoAux
rank_two_tensor = cladding_thermal_eigenstrain
variable = clad_thermal_eigenstrain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = cladding
[]
[fuel_thermal_strain_xx]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = 'fuel upper_blanket lower_blanket'
[]
[fuel_thermal_strain_yy]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_yy
index_j = 1
index_i = 1
execute_on = 'initial timestep_end'
block = 'fuel upper_blanket lower_blanket'
[]
[fuel_thm_exp]
type = SpatialUserObjectAux
variable = fuel_thm_exp
execute_on = 'initial timestep_end'
user_object = fuel_thm_exp
block = 'fuel upper_blanket lower_blanket'
[]
[]
[Materials]
[coolant]
type = SodiumCoolantChannelMaterial
boundary = cladding_outside_right
inlet_temperature_function = coolant_T_in_function
rod_linear_power = power_history_avg
inlet_massflux_function = coolant_flux_function
axial_power_profile_cdf = pwr_axial_peaking_factors_cdf
pellet_height = ${active_fuel_height}
cladding_radius = '${fparse cladding_ir + cladding_thickness}'
wire_wrap_diameter = ${fparse 0.054*0.0254}
temperature = temp
sodium_user_object = sodium_uo
htc_model = BGF
update_temperature = true
pin_location = interior
peclet_limit_behavior = error
outputs = all
[]
[d_x]
type = ADConstantAnisotropicMobility
tensor = '1e3 0 0
0 1e6 0
0 0 0'
M_name = d_x
[]
[cap_thcond]
type = ADGenericConstantMaterial
prop_names = 'thermal_conductivity specific_heat density'
prop_values = '65 1200 830'
block = 'cap stand'
outputs = all
[]
[interconnected_porosity]
type = ADParsedMaterial
property_name = interconnected_porosity
material_property_names = 'porosity interconnectivity'
expression = 'porosity * interconnectivity'
outputs = all
block = 'fuel upper_blanket lower_blanket'
[]
[fission_rate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = pwr_axial_peaking_factors
pellet_radius = ${fuel_radius}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${fuel_pu}
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
outputs = all
[]
[fission_rate_elongate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = pwr_axial_peaking_factors_elongate
pellet_radius = ${fuel_radius}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${fuel_pu}
block = 'cladding'
outputs = all
fission_rate_name = fission_rate
[]
[burnup]
type = ADUPuZrBurnup
initial_X_Zr = ${initial_X_Zr}
initial_X_Pu = ${fuel_pu}
density = ${fuel_density}
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
outputs = all
[]
[burnup_elongate]
type = ADUPuZrBurnup
initial_X_Pu = ${fuel_pu}
initial_X_Zr = ${initial_X_Zr}
outputs = all
block = cladding
density = ${fuel_density}
burnup_name = burnup
[]
[fuel_elastic_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hotpress fuel_upuzrcreep gas_swelling'
block = 'fuel upper_blanket lower_blanket'
outputs = all
[]
[hotpress]
type = ADUPuZrHotPressingStressUpdate
block = 'fuel upper_blanket lower_blanket'
outputs = all
surface_energy = 1.6
plenum_pressure = plenum_pressure
porosity_name = porosity
max_inelastic_increment = 1e-3 #1e-1
interconnectivity = interconnectivity
bubble_concentration = ${bubble_concentration}
temperature = temp
creep_model = MFH
fission_rate = fission_rate
atomic_volume = 2.15e-29
porosity_start = 0.01
porosity_end = 0
grain_boundary_D0 = 4e-29
grain_boundary_Q = 0
absolute_tolerance = 1e-9
[]
[porosity]
type = ADPorosityFromStrain
block = 'fuel upper_blanket lower_blanket'
initial_porosity = 1e-10
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[porosity_transition]
type = ADGenericConstantMaterial
prop_names = 'porosity interconnectivity'
prop_values = '0.0 0.0'
block = 'upper_transition lower_transition'
[]
[fuel_elasticity_tensor]
type = ADUPuZrElasticityTensor
X_Zr = ${initial_X_Zr}
X_Pu = ${fuel_pu}
youngs_model = LANL
block = 'fuel upper_blanket lower_blanket'
temperature = temp
use_old_porosity = true
outputs = all
output_properties = 'youngs_modulus poissons_ratio'
[]
[fuel_upuzrcreep]
type = ADUPuZrCreepUpdate
block = 'fuel upper_blanket lower_blanket'
temperature = temp
porosity = porosity
max_inelastic_increment=1e-1
use_old_porosity = true
automatic_differentiation_return_mapping = false
[]
[fuel_thermal_expansion]
type = ADUPuZrThermalExpansionEigenstrain
block = 'fuel upper_blanket lower_blanket'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = fuel_thermal_strain
outputs = all
thermal_expansion_model = LANL
X_Zr = ${initial_X_Zr}
X_Pu = ${fuel_pu}
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
block = 'fuel upper_blanket lower_blanket'
bubble_concentration = ${bubble_concentration}
initial_bubble_concentration = ${bubble_concentration}
compute_interconnectivity = true
fission_gas_yield = 0.25
fission_rate = fission_rate
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.99
interconnection_initiating_porosity = 0.23
interconnection_terminating_porosity = 0.25
max_inelastic_increment = 1e-2
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.26
initial_porosity = 1e-10
[]
[solid_swelling]
type = ADBurnupDependentEigenstrain
eigenstrain_name = solid_swelling_eigenstrain
block = 'fuel upper_blanket lower_blanket'
swelling_name = 'solid_swelling'
outputs = all
anisotropic_factor = 0.26
[]
[metal_fuel_thermal]
type = ADUPuZrThermal
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
X_Zr = ${initial_X_Zr}
X_Pu = ${fuel_pu}
spheat_model = savage
porosity = porosity
temperature = temp
outputs = all
porosity_model = logged
sodium_logged_porosity = sodium_logged_porosity
[]
[sodium_logging]
type = ADUPuZrSodiumLogging
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
porosity = porosity
interconnectivity = interconnectivity
sodium_infiltration_fraction = 0.28
outputs = all
[]
[fuel_density]
type = ADStrainAdjustedDensity
strain_free_density = ${fuel_density}
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
[]
[fast_neutron_flux]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors
rod_ave_lin_pow = flux_history
block = 'fuel upper_blanket lower_blanket upper_transition lower_transition'
factor = 1.0
outputs = all
[]
[fast_neutron_flux_elongate]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors_elongate
rod_ave_lin_pow = flux_history
block = cladding
factor = 1.0
outputs = all
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-4
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temp]
type = MaxIncrement
variable = temp
max_increment = 50
[]
[]
[Preconditioning]
[vcp]
type = VCP
full = true
primary_variable = 'disp_x disp_y temp'
preconditioner = 'LU'
adaptive_condensation = true
lm_variable = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
is_lm_coupling_diagonal = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
petsc_options = '-snes_ksp_ew -snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount -snes_force_iteration'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15 1'
line_search = 'none'
snesmf_reuse_base = false
verbose = true
l_max_its = 60
nl_max_its = 30
nl_rel_tol = 1e-4 #5e-6
nl_abs_tol = 1e-8 #5e-9
end_time = ${time_last}
dtmin = 1
dtmax = ${max_dt}
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
ignore_variables_for_autoscaling = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_function = power_history
dt = 100
iteration_window = 4
optimal_iterations = 20
force_step_every_function_point = true
timestep_limiting_postprocessor = creep_timestep
[]
[]
[Postprocessors]
[creep_timestep]
type = MaterialTimeStepPostprocessor
block = 'fuel cladding'
[]
[_dt]
type=TimestepSize
[]
# elemental temperatures
[temp_fuel_avg]
type = ElementAverageValue
variable = temp
block = 'fuel'
execute_on = 'initial timestep_end'
[]
[temp_fuel_max]
type = ElementExtremeValue
variable = temp
block = 'fuel'
[]
[temp_fuel_min]
type = ElementExtremeValue
variable = temp
block = 'fuel'
value_type = min
[]
[temp_cladding_avg]
type = ElementAverageValue
variable = temp
block = 'cladding'
[]
[temp_cladding_max]
type = ElementExtremeValue
variable = temp
block = 'cladding'
[]
[temp_cladding_min]
type = ElementExtremeValue
variable = temp
block = 'cladding'
value_type = min
[]
# boundary temperatures
[temp_gas_avg]
type = SideAverageValue
boundary = 'gas_height cladding_inside_top'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_sodium_avg]
type = SideAverageValue
boundary = 'sodium_height fuel_bottom cladding_inside_bottom fuel_top'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_inside_surfaces_avg]
type = SideAverageValue
boundary = 'inside_surfaces'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_max]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_min]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
value_type = min
[]
[temp_fuel_surface_avg]
type = SideAverageValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_max]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_min]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
value_type = min
[]
[temp_cladding_inside_right_avg]
type = SideAverageValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_inside_right_max]
type = NodalExtremeValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_outside_right_avg]
type = SideAverageValue
boundary = 'cladding_outside_right'
variable = temp
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'fuel'
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'fuel'
[]
[stress_vonmises_cladding_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'cladding'
[]
[stress_vonmises_cladding_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'cladding'
[]
[stress_vonmises_cladding_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'cladding'
[]
[stress_hydro_cladding_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'cladding'
[]
[stress_hydro_cladding_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'cladding'
[]
[stress_hydro_cladding_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'cladding'
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = 'fuel'
[]
[strain_gas_swelling_fuel_avg]
type = ElementAverageValue
variable = effective_fission_gas_strain
block = 'fuel'
[]
[strain_hot_pressing_fuel_avg]
type = ElementAverageValue
variable = effective_hot_pressing_strain
block = 'fuel'
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = 'fuel'
[]
[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) / ${active_fuel_height}'
[]
[disp_y_fuel_top_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = 'fuel_top'
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_top'
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_cladding_interior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_interior_min]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
value_type = min
[]
[disp_x_cladding_interior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_exterior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[disp_x_cladding_exterior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[anisotropic_swelling_factor]
type = FunctionValuePostprocessor
function = anisotropic_swelling_factor
[]
[max_fuel_elongation]
type = NodalExtremeValue
variable = disp_y
boundary = fuel_outside_all
[]
# geometric information
[volume_cladding_interior]
type = InternalVolume
boundary = 'cladding_inside_all'
[]
[volume_fuel]
type = InternalVolume
boundary = 'fuel_outside_all'
execute_on = 'initial timestep_end'
[]
[volume_plenum]
type = InternalVolume
boundary = 'inside_surfaces'
execute_on = 'initial timestep_end'
addition = sodium_volume
[]
[plenum_ratio]
type = ParsedPostprocessor
pp_names = 'volume_plenum volume_fuel'
expression = 'volume_plenum / volume_fuel'
execute_on = 'initial timestep_end'
[]
[volume_sodium]
type = FunctionValuePostprocessor
function = sodium_volume
execute_on = 'initial timestep_end'
[]
# energy information
[flux_clad]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'cladding_inside_right'
diffusivity = thermal_conductivity
[]
[flux_fuel]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'fuel_contact_surfaces'
diffusivity = thermal_conductivity
[]
[power_integral]
type = ADElementIntegralPower
variable = temp
use_material_fission_rate = true
fission_rate_material = fission_rate
block = fuel
[]
[linear_heat_generation_rate]
type = FunctionValuePostprocessor
function = power_history
scale_factor = 0.01
[]
[burnup_avg]
type = ElementAverageValue
block = fuel
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = fuel
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = fuel
[]
# fission gas information
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_produced
block = fuel
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_released
block = fuel
execute_on = 'initial timestep_end'
[]
[fg_percent]
type = FGRPercent
fission_gas_released = fg_released
fission_gas_generated = fg_produced
[]
[interconnected_porosity_fuel_avg]
type = ElementAverageValue
variable = interconnected_porosity
block = fuel
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = fuel
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = fuel
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = fuel
[]
[porosity_sodium_logging_avg]
type = ElementAverageValue
variable = sodium_logged_porosity
block = fuel
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
block = 'fuel cladding'
outputs = none
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[max_wastagethickness]
type = ElementExtremeValue
value_type = max
variable = wastage_thickness
[]
[max_wst_temp]
type=ElementExtremeValue
value_type=max
variable=temp
proxy_variable=wastage_thickness
block='cladding'
[]
[max_wst_burnup]
type=ElementExtremeValue
value_type=max
variable=burnup
proxy_variable=wastage_thickness
block='cladding'
[]
[max_cdf]
type = ElementExtremeValue
value_type = max
variable = cumulative_damage_index
[]
[]
[VectorPostprocessors]
[id_wastage]
type = FuelRodLineValueSampler
variable = wastage_thickness
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[od_wastage]
type = FuelRodLineValueSampler
variable = cc_wastage_thickness
material = 'clad'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[]
[Outputs]
perf_graph = true
color = true
[console]
type = Console
max_rows = 25
[]
[csv_general]
type = CSV
execute_on = FINAL
[]
[exodus]
type = Exodus
enable = false
additional_execute_on = 'FAILED'
[]
[params_exodus_final]
type = Exodus
execute_on = 'FINAL'
[]
[]
!include d9_clad_base.i
(assessment/metallic_fuel/WPF/analysis/FM-1/FM_base.i)
# FM-1 Base Input File
gap_bottom_length = 0.31e-3
top_bot_cladding_height = 2.24e-3
# calculations
cladding_ir = '${fparse fuel_radius + cladding_gap_width}'
gas_plenum_height = '${fparse plenum_volume / pi / cladding_ir^2}'
fuel_y_start = '${fparse gap_bottom_length + top_bot_cladding_height}'
alpha_start = 877
alpha_end = 936
bubble_concentration = 1e15
cladding_block = 'cladding cladding_tri'
y_tc1 = '${fparse 2.55e-3+22.0*0.0254}'
y_tc2 = '${fparse y_tc1-4.5*0.0254}'
y_tc3 = '${fparse y_tc2-3.5*0.0254}'
y_tc4 = '${fparse y_tc3-2.0*0.0254}'
y_tc5 = '${fparse y_tc4-3.0*0.0254}'
y_tc6 = '${fparse y_tc1-4.0*0.0254}'
x_tc = 0.002920
p_tc1 = '${x_tc} ${y_tc1} 0.0'
p_tc2 = '${x_tc} ${y_tc2} 0.0'
p_tc3 = '${x_tc} ${y_tc3} 0.0'
p_tc4 = '${x_tc} ${y_tc4} 0.0'
p_tc5 = '${x_tc} ${y_tc5} 0.0'
p_tc6 = '${x_tc} ${y_tc6} 0.0'
# A relatively coarse radial mesh density can be used
# since localized refining is done by TRI3 elements
clad_n_rad = 10
[GlobalParams]
order = FIRST
energy_per_fission = 3.2e-11 # J/fission
displacements = 'disp_x disp_y'
alpha_transition_end = ${alpha_end}
alpha_transition_start = ${alpha_start}
[]
[Problem]
type = ReferenceResidualProblem
reference_vector = 'ref'
extra_tag_vectors = 'ref'
group_variables = 'disp_x disp_y'
converge_on = 'disp_x disp_y temp'
[]
[Mesh]
# Pin design parameters from FIPD database
[gen]
type = FIPDRodletMeshGenerator
fipd_geom_file = ${raw '../../../../../fipd-bison-integration-data/ ${exp_id} / ${pin_id} / ${pin_id} _design.csv'}
gap_bottom_length = 0.31e-3 # arbitrary
cladding_bottom_plug_length = 2.24e-3 # arbitrary
cladding_top_plug_length = 2.24e-3 # arbitrary
cladding_sidewall_radial_elements = ${clad_n_rad}
cladding_sidewall_axial_element_intervals = '0 0.540 0.625 1.0'
cladding_sidewall_axial_element_numbers = '150 1000 150'
use_tri_for_cladding_sidewall = '0 1 0'
cladding_top_plug_radial_elements = 10
cladding_top_plug_axial_elements = 5
cladding_bottom_plug_axial_elements = 5
fuel_radial_elements = 10
fuel_axial_element_intervals = '0 1'
fuel_axial_element_numbers = '1000'
tri_element_size_factor = 0.4
elem_type = QUAD4
make_stand = true
make_cap = true
cap_axial_elements = 15
stand_axial_elements = 15
[]
[sodium_height]
type = SideSetsFromBoundingBoxGenerator
input = gen
bottom_left = '0 0 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1005'
[]
[gas_height]
type = SideSetsFromBoundingBoxGenerator
input = sodium_height
bottom_left = '0 ${fparse fuel_y_start + fuel_height} 0'
top_right = '${fparse cladding_ir + cladding_thickness} ${fparse fuel_y_start + fuel_height + gas_plenum_height + top_bot_cladding_height} 0'
included_boundaries = 'cladding_inside_right'
boundary_new = '1006'
[]
[sodium_plenum_rename]
type = RenameBoundaryGenerator
input = gas_height
old_boundary = '1005 1006'
new_boundary = 'sodium_height gas_height'
[]
patch_size = 40
patch_update_strategy = always
partitioner = centroid
centroid_partitioner_direction = y
coord_type = RZ
[]
[Variables]
[temp]
initial_condition = 298
block = 'fuel ${cladding_block} cap stand'
[]
[disp_x]
block = 'fuel ${cladding_block} cap stand'
[]
[disp_y]
block = 'fuel ${cladding_block} cap stand'
[]
[]
[Functions]
[fflux_axial_peaking_factors]
type = ConstantFunction
value = 0.0
[]
[fflux_axial_peaking_factors_elongate]
type = ConstantFunction
value = 0.0
[]
[flux_history] # Time-dependent pin average fast flux from FIPD database
type = ConstantFunction
value = 0.0
[]
[clad_od_temp]
type = PiecewiseBilinear
data_file = './data/temp_hist.csv'
xaxis = 1
[]
[ab_sodium_vol]
type = MeshPropertyFunction
mesh_generator = gen
mesh_property_name = sodium_volume
scale_factor = -1.0
[]
[sodium_volume]
# Need to account for the factor that hot pressing is also occupying the open pores
type = ParsedFunction
symbol_names = 'porosity_sodium_logging_avg volume_fuel raw_sodium_vol temp_sodium_avg'
symbol_values = 'porosity_sodium_logging_avg volume_fuel ab_sodium_vol temp_sodium_avg'
# Note the the symbol before volume_fuel should be negative as volume_fuel itself is negative
expression = 'raw_sodium_vol * 954 / (1012 - 0.23 * temp_sodium_avg) - volume_fuel * porosity_sodium_logging_avg'
[]
[power_history]
type = ConstantFunction
value = 0.0
[]
[axial_peaking_factors]
type = ConstantFunction
value = 0.0
[]
[axial_peaking_factors_extended]
type = ConstantFunction
value = 0.0
[]
[anisotropic_swelling_factor]
type = ParsedFunction
symbol_names = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg fuel_height fuel_radius'
symbol_values = 'disp_x_fuel_radial_surface_avg disp_y_fuel_top_surface_avg ${fuel_height} ${fuel_radius}'
expression = '(disp_x_fuel_radial_surface_avg / ${fuel_radius}) / (disp_y_fuel_top_surface_avg / ${fuel_height})'
[]
[gap_thermal_conductivity]
type = ParsedFunction
expression = '124.67 - 0.11381 * t + 5.5226e-5 * t^2 - 1.1842e-8 * t^3'
[]
[id_vpp_func] # vpp_function used to track FCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = id_pen_total
argument_column = y
wastage_type = ID
value_column = total_id_reduction
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[od_vpp_func] # vpp_function used to track CCCI-related cladding degradation.
type = MetallicFuelWastageDegradationFunction
vectorpostprocessor_name = od_wastage
argument_column = y
wastage_type = OD
value_column = cc_wastage_thickness
use_metadata = true
degradation_factor = 0.001
mesh_generator = 'gen'
transition_width = 1E-4
[]
[fuel_melt_func]
type = MetallicFuelMeltingFunction
vectorpostprocessor_name = fuel_melting
argument_column = y
value_column = fuel_melting_thickness
use_metadata = true
mesh_generator = 'gen'
transition_width = 2e-4
[]
[]
[Physics/SolidMechanics/QuasiStatic]
[fuel]
block = fuel
strain = FINITE
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_strain solid_swelling_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[cladding]
strain = FINITE
generate_output = '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'
block = '${cladding_block}'
eigenstrain_names = 'cladding_thermal_eigenstrain'
use_automatic_differentiation = true
volumetric_locking_correction = true
[]
[]
[Kernels]
[gravity]
type = ADGravity
block = 'fuel ${cladding_block}'
variable = disp_y
value = -9.81
extra_vector_tags = 'ref'
[]
[heat]
type = ADHeatConduction
block = 'fuel ${cladding_block} cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_ie]
type = ADHeatConductionTimeDerivative
block = 'fuel ${cladding_block} cap stand'
variable = temp
extra_vector_tags = 'ref'
[]
[heat_source]
type = ADFissionRateHeatSource
variable = temp
block = 'fuel'
fission_rate = fission_rate
extra_vector_tags = 'ref'
energy_deposited_in_fuel = 0.95
[]
[disp_x_dt]
type = ADTimeDerivative
variable = disp_x
block = ' cap stand'
extra_vector_tags = 'ref'
[]
[disp_y_dt]
type = ADTimeDerivative
variable = disp_y
block = 'cap stand'
extra_vector_tags = 'ref'
[]
[disp_x_diff]
type = ADMatAnisoDiffusion
variable = disp_x
block = 'cap stand'
diffusivity = d_x
extra_vector_tags = 'ref'
[]
[disp_y_diff]
type = ADMatDiffusion
variable = disp_y
block = 'cap stand'
diffusivity = 1e8
extra_vector_tags = 'ref'
[]
[]
[UserObjects]
[pin_geometry]
type = FuelPinGeometry
clad_bottom = cladding_outside_bottom
clad_inner_wall = cladding_inside_right
clad_outer_wall = cladding_outside_right
clad_top = cladding_outside_top
pellet_exteriors = fuel_outside_all
[]
[fuel_thm_exp]
type = LayeredAverage
variable = fuel_thermal_strain_xx
direction = y
num_layers = 1000
block = fuel
[]
[clad_thm_exp]
type = LayeredAverage
variable = clad_thermal_eigenstrain_xx
direction = y
num_layers = 1000
block = ${cladding_block}
[]
[]
[Contact]
[fuel_cladding_mechanical]
primary = cladding_inside_right
secondary = fuel_outer_radial_surface
model = coulomb
friction_coefficient = 0.1
formulation = mortar
c_normal = '${fparse 1e17 * magic_factor}'
c_tangential = '${fparse 1e19 * magic_factor}'
correct_edge_dropping = true
[]
[]
[MortarGapHeatTransfer]
[inside2outside]
temperature = temp
boundary = 'cladding_inside_right'
gap_conductivity_function = gap_thermal_conductivity
gap_conductivity_function_variable = temp
primary_boundary = cladding_inside_right
secondary_boundary = fuel_contact_surfaces
gap_flux_options = 'CONDUCTION'
ghost_point_neighbors = true
[]
[]
[BCs]
[no_x_all]
type = ADDirichletBC
variable = disp_x
boundary = 'centerline cap_top'
value = 0.0
preset = false
[]
[no_y_clad]
type = ADDirichletBC
variable = disp_y
boundary = 'cladding_inside_bottom'
value = 0.0
preset = false
[]
[Pressure]
[coolantPressure]
boundary = 'cladding_outside_right'
factor = 1378.95 # in Pa, 0.2 psia as measured by transducer
use_automatic_differentiation = true
[]
[]
[PlenumPressure]
[plenumPressure]
boundary = 'inside_surfaces'
initial_pressure = 84116 # in Pa, 12.2 psi
startup_time = 0
R = 8.3143
temperature = temp_gas_avg
volume = volume_plenum
output = plenum_pressure
material_input = fg_released
use_automatic_differentiation = true
[]
[]
[surf] # Setting temperature BC base on FIPD data
type = ADFunctionDirichletBC
variable = temp
boundary = 'cladding_outside_bottom cladding_outside_right cladding_outside_top'
function = clad_od_temp
[]
[]
[AuxVariables]
[dummy_hoop_stress]
order = CONSTANT
family = MONOMIAL
[]
[cumulative_damage_index]
order = CONSTANT
family = MONOMIAL
[]
[relx]
[]
[clad_thm_exp]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[clad_thermal_eigenstrain_xx]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[fuel_thermal_strain_xx]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[fuel_thermal_strain_yy]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[fuel_thm_exp]
order = CONSTANT
family = MONOMIAL
block = fuel
[]
[func_val1]
[]
[func_val2]
[]
[func_val3]
[]
# OPTD Active during this stage
[pen_thick_aux]
family = MONOMIAL
order = CONSTANT
block = 'fuel ${cladding_block}'
[]
[total_id_reduction]
family = MONOMIAL
order = CONSTANT
block = 'fuel ${cladding_block}'
[]
[fast_neutron_fluence_aux]
order = CONSTANT
family = MONOMIAL
block = '${cladding_block}'
[]
[]
[AuxKernels]
[func_val1]
type = FunctionAux
function = id_vpp_func
variable = func_val1
block = 'cladding cladding_tri'
[]
[func_val2]
type = FunctionAux
function = od_vpp_func
variable = func_val2
block = 'cladding cladding_tri'
[]
[func_val3]
type = FunctionAux
function = fuel_melt_func
variable = func_val3
block = fuel
[]
[cdf_amount]
block = '${cladding_block}'
type = MaterialRealAux
property = cdf_failure
variable = cumulative_damage_index
[]
[relx_aux]
type = ParsedAux
variable = relx
block = fuel
use_xyzt = true
expression = 'x / ${fuel_radius}'
[]
[clad_thm_exp]
type = SpatialUserObjectAux
variable = clad_thm_exp
execute_on = 'initial timestep_end'
user_object = clad_thm_exp
block = '${cladding_block}'
[]
[clad_thermal_eigenstrain_xx]
type = ADRankTwoAux
rank_two_tensor = cladding_thermal_eigenstrain
variable = clad_thermal_eigenstrain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = '${cladding_block}'
[]
[fuel_thermal_strain_xx]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_xx
index_j = 0
index_i = 0
execute_on = 'initial timestep_end'
block = fuel
[]
[fuel_thermal_strain_yy]
type = ADRankTwoAux
rank_two_tensor = fuel_thermal_strain
variable = fuel_thermal_strain_yy
index_j = 1
index_i = 1
execute_on = 'initial timestep_end'
block = fuel
[]
[fuel_thm_exp]
type = SpatialUserObjectAux
variable = fuel_thm_exp
execute_on = 'initial timestep_end'
user_object = fuel_thm_exp
block = fuel
[]
#OPTD
[assign_pen_thick_aux]
type = ADMaterialRealAux
variable = pen_thick_aux
property = liquid_penetration
block = 'fuel ${cladding_block}'
[]
[assign_total_id_reduction]
type = ParsedAux
variable = total_id_reduction
coupled_variables = 'pen_thick_aux wastage_thickness'
expression = 'pen_thick_aux + wastage_thickness'
block = 'fuel ${cladding_block}'
[]
[]
[Materials]
[fuel_pen]
type = ADMetallicFuelLiquidCladdingPenetration
temperature = temp
mesh_generator = gen
fuel_elongation_pp = max_fuel_elongation
liquid_penetration_model = 'ANL_CONSERVATIVE'
fuel_pu = Pu_0
burnup = burnup
outputs = all
calculate_fuel_melting_thickness = true
block = 'fuel ${cladding_block}'
[]
[longHT9_failure]
type = HT9FailureClad
block = '${cladding_block}'
method = cdf_long
temperature = temp
outputs = all
hoop_stress = stress_zz # Since 2D-RZ
[]
[d_x]
type = ADConstantAnisotropicMobility
tensor = '1e3 0 0
0 1e6 0
0 0 0'
M_name = d_x
[]
[cap_thcond]
type = ADGenericConstantMaterial
prop_names = 'thermal_conductivity specific_heat density'
prop_values = '65 1200 830'
block = 'cap stand'
outputs = all
[]
[interconnected_porosity]
type = ADParsedMaterial
block = 'fuel'
property_name = interconnected_porosity
material_property_names = 'porosity interconnectivity'
expression = 'porosity * interconnectivity'
outputs = all
[]
[fission_rate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors
pellet_radius = ${fuel_radius}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${X_Pu}
block = 'fuel'
outputs = all
[]
[fission_rate_elongate]
type = ADUPuZrFissionRate
rod_linear_power = power_history
axial_power_profile = axial_peaking_factors_extended
pellet_radius = ${fuel_radius}
X_Zr = ${initial_X_Zr}
X_Pu_function = ${X_Pu}
block = '${cladding_block}'
outputs = all
fission_rate_name = fission_rate
[]
[burnup]
type = ADUPuZrBurnup
initial_X_Zr = ${initial_X_Zr}
initial_X_Pu = ${X_Pu}
density = ${fuel_density}
block = 'fuel'
outputs = all
[]
[burnup_elongate]
type = ADUPuZrBurnup
initial_X_Pu = ${X_Pu}
initial_X_Zr = ${initial_X_Zr}
outputs = all
block = '${cladding_block}'
density = ${fuel_density}
burnup_name = burnup
[]
[fuel_elastic_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'hotpress fuel_upuzrcreep gas_swelling'
block = 'fuel'
outputs = all
[]
[hotpress]
type = ADUPuZrHotPressingStressUpdate
block = 'fuel'
outputs = all
surface_energy = 1.6
plenum_pressure = plenum_pressure
porosity_name = porosity
max_inelastic_increment = 1e-1
interconnectivity = interconnectivity
bubble_concentration = ${bubble_concentration}
temperature = temp
creep_model = MFH
fission_rate = fission_rate
atomic_volume = 2.15e-29
porosity_start = 0.01
porosity_end = 0
grain_boundary_D0 = 4e-29
grain_boundary_Q = 0
absolute_tolerance = 1e-9
[]
[porosity]
type = ADPorosityFromStrain
block = 'fuel'
initial_porosity = 1e-10
inelastic_strain = 'combined_inelastic_strain'
outputs = all
[]
[fuel_elasticity_tensor]
type = ADUPuZrElasticityTensor
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
youngs_model = LANL
block = 'fuel'
temperature = temp
use_old_porosity = true
outputs = all
output_properties = 'youngs_modulus poissons_ratio'
[]
[fuel_upuzrcreep]
type = ADUPuZrCreepUpdate
block = 'fuel'
temperature = temp
porosity = porosity
use_old_porosity = true
max_inelastic_increment = 1e-1
outputs = all
automatic_differentiation_return_mapping = false
[]
[fuel_thermal_expansion]
type = ADUPuZrThermalExpansionEigenstrain
block = 'fuel'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = fuel_thermal_strain
outputs = all
thermal_expansion_model = LANL
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
[]
[gas_swelling]
type = ADSimpleFissionGasViscoplasticityStressUpdate
temperature = temp
outputs = all
block = 'fuel'
bubble_concentration = ${bubble_concentration}
initial_bubble_concentration = ${bubble_concentration}
compute_interconnectivity = true
fission_gas_yield = 0.3017
fission_rate = fission_rate
initial_atoms_per_bubble = 1e-05
initial_bubble_radius = 1e-15
initial_fgm_dissolved = 0
interconnection_cutoff = 0.99
interconnection_initiating_porosity = 0.23
interconnection_terminating_porosity = 0.25
max_inelastic_increment = 1e-2
retained_gas_fraction = 0.25
interconnection_dependent_retained_gas_fraction = 0.5
surface_energy = 1.6
anisotropic_factor = 0.26
initial_porosity = 1e-10
fuel_melting_function = fuel_melt_func
[]
[solid_swelling]
type = ADBurnupDependentEigenstrain
eigenstrain_name = solid_swelling_eigenstrain
block = 'fuel'
swelling_name = 'solid_swelling'
outputs = all
anisotropic_factor = 0.26
[]
[metal_fuel_thermal]
type = ADUPuZrThermal
block = 'fuel'
X_Zr = ${initial_X_Zr}
X_Pu = ${X_Pu}
spheat_model = savage
porosity = porosity
temperature = temp
outputs = all
porosity_model = logged
sodium_logged_porosity = sodium_logged_porosity
[]
[sodium_logging]
type = ADUPuZrSodiumLogging
block = 'fuel'
porosity = porosity
interconnectivity = interconnectivity
sodium_infiltration_fraction = 0.28
outputs = all
[]
[fuel_density]
type = ADStrainAdjustedDensity
block = 'fuel'
strain_free_density = ${fuel_density}
outputs = all
[]
[fast_neutron_flux]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors
rod_ave_lin_pow = flux_history
block = fuel
factor = 1.0
outputs = all
[]
[fast_neutron_flux_elongate]
type = ADFastNeutronFlux
calculate_fluence = true
axial_power_profile = fflux_axial_peaking_factors_elongate
rod_ave_lin_pow = flux_history
block = '${cladding_block}'
factor = 1.0
outputs = all
[]
[cladding_elasticity_tensor]
type = ADHT9ElasticityTensor
temperature = temp
block = '${cladding_block}'
outputs = all
id_wastage_degradation_function = id_vpp_func
od_wastage_degradation_function = od_vpp_func
output_properties = 'youngs_modulus poissons_ratio'
[]
[cladding_stress]
type = ADComputeMultipleInelasticStress
inelastic_models = 'cladding_creep'
block = '${cladding_block}'
outputs = all
[]
[cladding_creep]
type = ADHT9CreepUpdate
block = '${cladding_block}'
temperature = temp
outputs = all
primary_creep_model = MFH
secondary_creep_model = MFH
irradiation_creep_model = MFH
fast_neutron_flux = fast_neutron_flux
[]
[thermal_expansion]
type = ADHT9ThermalExpansionEigenstrain
block = '${cladding_block}'
temperature = temp
stress_free_temperature = 298.0
eigenstrain_name = cladding_thermal_eigenstrain
outputs = all
[]
[cladding_thermal]
type = ADHT9Thermal
block = '${cladding_block}'
temperature = temp
outputs = all
[]
[cladding_density]
type = ADStrainAdjustedDensity
block = '${cladding_block}'
strain_free_density = '${clad_density}'
outputs = all
[]
[wastage_thickness]
type = ADMetallicFuelWastage
method = burnup_ht9_opt
burnup = burnup
temperature = temp
scale_factor = 1
block = '${cladding_block}'
outputs = all
[]
[cc_wastage_thickness]
type = ADMetallicFuelCoolantWastage
clad_material = HT9
use_effective_method = true
temperature = temp
scale_factor = 1
block = '${cladding_block}'
outputs = all
[]
[]
[Dampers]
[disp_x]
type = MaxIncrement
variable = disp_x
max_increment = 1e-3
[]
[disp_y]
type = MaxIncrement
variable = disp_y
max_increment = 1e-3
[]
[temp]
type = MaxIncrement
variable = temp
max_increment = 100
[]
[]
[Preconditioning]
[vcp]
type = VCP
full = true
primary_variable = 'disp_x disp_y temp'
preconditioner = 'LU'
adaptive_condensation = true
lm_variable = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
is_lm_coupling_diagonal = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
petsc_options = '-snes_ksp_ew -snes_converged_reason -ksp_converged_reason'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_mffd_err -pc_factor_shift_type -pc_factor_shift_amount -snes_force_iteration'
petsc_options_value = 'lu superlu_dist 1e-5 NONZERO 1e-15 1'
line_search = 'none'
snesmf_reuse_base = false
verbose = true
l_max_its = 60
nl_max_its = 100
nl_rel_tol = 5e-6
nl_abs_tol = 5e-9
end_time = '${fparse run_time + total_transient_time}'
dtmin = 1e-5
dtmax = 5.0
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
ignore_variables_for_autoscaling = 'fuel_cladding_mechanical_normal_lm fuel_cladding_mechanical_tangential_lm inside2outside_thermal_lm'
[TimeStepper]
type = IterationAdaptiveDT
timestep_limiting_postprocessor = actual_cladding_time_step_limit
dt = 0.01
iteration_window = 4
optimal_iterations = 10
cutback_factor_at_failure = 0.9
growth_factor = 2
[]
[]
[Postprocessors]
[_dt]
type = TimestepSize
[]
[_transient_t]
type = ParsedPostprocessor
pp_names = ''
expression = 't-t0'
use_t = true
constant_names = 't0'
constant_expressions = '${run_time}'
[]
# elemental temperatures
[temp_fuel_avg]
type = ElementAverageValue
variable = temp
block = 'fuel'
execute_on = 'initial timestep_end'
[]
[temp_fuel_max]
type = ElementExtremeValue
variable = temp
block = 'fuel'
[]
[temp_fuel_min]
type = ElementExtremeValue
variable = temp
block = 'fuel'
value_type = min
[]
[temp_cladding_avg]
type = ElementAverageValue
variable = temp
block = '${cladding_block}'
[]
[temp_cladding_max]
type = ElementExtremeValue
variable = temp
block = '${cladding_block}'
[]
[temp_cladding_min]
type = ElementExtremeValue
variable = temp
block = '${cladding_block}'
value_type = min
[]
# boundary temperatures
[temp_gas_avg]
type = SideAverageValue
boundary = 'gas_height cladding_inside_top'
variable = temp
execute_on = 'initial timestep_end'
[]
# Beyond gap closure, sodium temperarture is almost the same as the cap.
[temp_sodium_avg]
type = ElementAverageValue
block = 'cap'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_inside_surfaces_avg]
type = SideAverageValue
boundary = 'inside_surfaces'
variable = temp
execute_on = 'initial timestep_end'
[]
[temp_fuel_centerline_avg]
type = AxisymmetricCenterlineAverageValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_max]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
[]
[temp_fuel_centerline_min]
type = NodalExtremeValue
boundary = 'centerline'
variable = temp
value_type = min
[]
[temp_fuel_surface_avg]
type = SideAverageValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_max]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
[]
[temp_fuel_surface_min]
type = NodalExtremeValue
boundary = 'fuel_outer_radial_surface'
variable = temp
value_type = min
[]
[temp_cladding_inside_right_avg]
type = SideAverageValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_inside_right_max]
type = NodalExtremeValue
boundary = 'cladding_inside_right'
variable = temp
[]
[temp_cladding_outside_right_avg]
type = SideAverageValue
boundary = 'cladding_outside_right'
variable = temp
[]
# stresses
[stress_vonmises_fuel_avg]
type = ElementAverageValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_max]
type = ElementExtremeValue
variable = vonmises_stress
block = 'fuel'
[]
[stress_vonmises_fuel_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = 'fuel'
[]
[stress_hydro_fuel_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = 'fuel'
[]
[stress_hydro_fuel_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = 'fuel'
[]
[stress_vonmises_cladding_avg]
type = ElementAverageValue
variable = vonmises_stress
block = '${cladding_block}'
[]
[stress_vonmises_cladding_max]
type = ElementExtremeValue
variable = vonmises_stress
block = '${cladding_block}'
[]
[stress_vonmises_cladding_min]
type = ElementExtremeValue
variable = vonmises_stress
value_type = min
block = '${cladding_block}'
[]
[stress_hydro_cladding_avg]
type = ElementAverageValue
variable = hydrostatic_stress
block = '${cladding_block}'
[]
[stress_hydro_cladding_max]
type = ElementExtremeValue
variable = hydrostatic_stress
block = '${cladding_block}'
[]
[stress_hydro_cladding_min]
type = ElementExtremeValue
variable = hydrostatic_stress
value_type = min
block = '${cladding_block}'
[]
[contact_pressure_max]
type = NodalExtremeValue
variable = fuel_cladding_mechanical_normal_lm
boundary = 'fuel_outer_radial_surface'
[]
# strain information
[strain_solid_swelling_fuel_avg]
type = ElementAverageValue
variable = solid_swelling
block = 'fuel'
[]
[strain_gas_swelling_fuel_avg]
type = ElementAverageValue
variable = effective_fission_gas_strain
block = 'fuel'
[]
[strain_hot_pressing_fuel_avg]
type = ElementAverageValue
variable = effective_hot_pressing_strain
block = 'fuel'
[]
[strain_volumetric_fuel_avg]
type = ElementAverageValue
variable = firstinv_strain
block = 'fuel'
[]
[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 = 'fuel_top'
[]
[disp_y_fuel_top_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_top'
[]
[disp_y_fuel_bottom_surface_avg]
type = SideAverageValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_y_fuel_bottom_surface_max]
type = NodalExtremeValue
variable = disp_y
boundary = 'fuel_bottom'
[]
[disp_x_fuel_radial_surface_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_fuel_radial_surface_avg]
type = SideAverageValue
variable = disp_x
boundary = 'fuel_outer_radial_surface'
[]
[disp_x_cladding_interior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_interior_min]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_inside_right'
value_type = min
[]
[disp_x_cladding_interior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_inside_right'
[]
[disp_x_cladding_exterior_max]
type = NodalExtremeValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[disp_x_cladding_exterior_avg]
type = SideAverageValue
variable = disp_x
boundary = 'cladding_outside_right'
[]
[anisotropic_swelling_factor]
type = FunctionValuePostprocessor
function = anisotropic_swelling_factor
[]
[max_fuel_elongation]
type = NodalExtremeValue
variable = disp_y
boundary = fuel_outside_all
[]
# geometric information
[volume_cladding_interior]
type = InternalVolume
boundary = 'cladding_inside_all'
[]
[volume_fuel]
type = InternalVolume
boundary = 'fuel_outside_all'
execute_on = 'initial timestep_end'
[]
[volume_plenum]
type = InternalVolume
boundary = 'inside_surfaces'
execute_on = 'initial timestep_end'
addition = sodium_volume
[]
[plenum_ratio]
type = ParsedPostprocessor
pp_names = 'volume_plenum volume_fuel'
expression = 'volume_plenum / volume_fuel'
execute_on = 'initial timestep_end'
[]
[volume_sodium]
type = FunctionValuePostprocessor
function = sodium_volume
execute_on = 'initial timestep_end'
[]
# energy information
[flux_clad]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'cladding_inside_right'
diffusivity = thermal_conductivity
[]
[flux_fuel]
type = ADSideDiffusiveFluxIntegral
variable = temp
boundary = 'fuel_contact_surfaces'
diffusivity = thermal_conductivity
[]
[power_integral]
type = ADElementIntegralPower
variable = temp
use_material_fission_rate = true
fission_rate_material = fission_rate
block = fuel
[]
[linear_heat_generation_rate]
type = FunctionValuePostprocessor
function = power_history
scale_factor = 0.01
[]
[burnup_avg]
type = ElementAverageValue
block = fuel
variable = burnup
[]
[burnup_max]
type = ElementExtremeValue
block = fuel
variable = burnup
[]
[fission_rate_avg]
type = ElementAverageValue
variable = fission_rate
block = fuel
[]
# fission gas information
[fg_produced]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_produced
block = fuel
[]
[fg_released]
type = ADElementIntegralMaterialProperty
mat_prop = fgm_released
block = fuel
execute_on = 'initial timestep_end'
[]
[fg_percent]
type = FGRPercent
fission_gas_released = fg_released
fission_gas_generated = fg_produced
[]
[interconnected_porosity_fuel_avg]
type = ElementAverageValue
variable = interconnected_porosity
block = fuel
execute_on = 'initial timestep_end'
[]
[porosity_fuel_avg]
type = ElementAverageValue
variable = porosity
block = fuel
[]
[porosity_fuel_max]
type = ElementExtremeValue
variable = porosity
block = fuel
[]
[porosity_fuel_min]
type = ElementExtremeValue
variable = porosity
value_type = min
block = fuel
[]
[porosity_sodium_logging_avg]
type = ElementAverageValue
variable = sodium_logged_porosity
block = fuel
[]
# extras
[actual_time_step_limit]
type = MaterialTimeStepPostprocessor
block = 'fuel ${cladding_block}'
outputs = none
[]
[actual_fuel_time_step_limit]
type = MaterialTimeStepPostprocessor
block = 'fuel'
outputs = 'console'
[]
[actual_cladding_time_step_limit]
type = MaterialTimeStepPostprocessor
block = '${cladding_block}'
outputs = 'console'
[]
[time_step_limit]
type = ParsedPostprocessor
expression = 'if(actual_time_step_limit > 1e6, 1e6, actual_time_step_limit)'
pp_names = 'actual_time_step_limit'
[]
[max_wastagethickness]
type = ElementExtremeValue
value_type = max
variable = wastage_thickness
[]
[max_wst_temp]
type = ElementExtremeValue
value_type = max
variable = temp
proxy_variable = wastage_thickness
block = '${cladding_block}'
[]
[max_wst_burnup]
type = ElementExtremeValue
value_type = max
variable = burnup
proxy_variable = wastage_thickness
block = '${cladding_block}'
[]
[max_cdf]
type = ElementExtremeValue
value_type = max
variable = cumulative_damage_index
[]
# OPTD
[temp_tc1]
type = PointValue
point = ${p_tc1}
variable = temp
[]
[temp_tc2]
type = PointValue
point = ${p_tc2}
variable = temp
[]
[temp_tc3]
type = PointValue
point = ${p_tc3}
variable = temp
[]
[temp_tc4]
type = PointValue
point = ${p_tc4}
variable = temp
[]
[temp_tc5]
type = PointValue
point = ${p_tc5}
variable = temp
[]
[temp_tc6]
type = PointValue
point = ${p_tc6}
variable = temp
[]
[max_vm]
type = ElementExtremeValue
value_type = max
block = cladding
variable = vonmises_stress
[]
[max_pen_total]
type = VectorPostprocessorReductionValue
vector_name = total_id_reduction
vectorpostprocessor = id_pen_total
value_type = max
[]
[]
[VectorPostprocessors]
[id_wastage]
type = FuelRodLineValueSampler
variable = wastage_thickness
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[id_pen_total]
type = FuelRodLineValueSampler
variable = total_id_reduction
material = 'clad'
fraction = 0.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[od_wastage]
type = FuelRodLineValueSampler
variable = cc_wastage_thickness
material = 'clad'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[fuel_melting]
type = FuelRodLineValueSampler
variable = fuel_melting_thickness
material = 'fuel'
fraction = 1.0
num_points = 600
orientation = 'vertical'
fuel_pin_geometry = 'pin_geometry'
execute_on = 'initial timestep_end'
allow_duplicate_execution_on_initial = true
outputs = none
[]
[]
[PerformanceMetricOutputs]
outputs = 'console'
[]
[Outputs]
print_linear_residuals = true
color = true
perf_graph = true
sync_times = ${time_spots}
[checkpoint]
type = Checkpoint
time_step_interval = 1
enable = false
[]
[exodus]
type = Exodus
time_step_interval = 500
sync_times = ${time_spots}
enable = false
[]
[ext]
type = Exodus
time_step_interval = 5
enable = true
[]
[console]
type = Console
show = 'time_step_size temp_fuel_avg temp_fuel_centerline_max temp_cladding_avg temp_cladding_max stress_vonmises_fuel_max stress_hydro_fuel_max stress_hydro_fuel_min contact_pressure_max strain_axial_fuel_avg power_integral burnup_avg fission_rate_avg fg_percent porosity_fuel_avg time_step_limit anisotropic_swelling_factor plenum_ratio volume_fuel volume_plenum max_wastagethickness temp_tc1 temp_tc2 temp_tc3 temp_tc4 temp_tc5 temp_tc6 _transient_t max_vm max_pen_total actual_fuel_time_step_limit actual_cladding_time_step_limit max_cdf'
[]
[csv_general]
type = CSV
file_base = 'FM-1/FM-1_csv_general'
[]
[csv_gold]
type = CSV
show = 'temp_tc1 temp_tc2 temp_tc3 temp_tc4 temp_tc5 temp_tc6 _transient_t max_vm max_pen_total max_cdf'
sync_only = true
sync_times = '${fparse run_time+10} ${fparse run_time+20} ${fparse run_time+50} ${fparse run_time+100} ${fparse run_time+200}
${fparse run_time+500} ${fparse run_time+1000} ${fparse run_time+2000} ${fparse run_time+3000} ${fparse run_time+4000}
${fparse run_time+5000} ${fparse run_time+6000}'
file_base = 'FM-1/FM-1_gold'
[]
[]
[Debug]
show_var_residual = 'disp_x disp_y temp'
show_var_residual_norms = true
[]