Hotspot analysis
In the previous analysis, the effect of pores was accounted for in a homogenized manner by scaling the power density. Larger pores may arise due to manufacturing processes, and understanding how these larger, infiltrated pores, along with the infiltrated pore network, manifest into stress is crucial. This page provides a framework to set up simulations with hotspots, aiming to evaluate the critical size of a pore that could lead to high stress values.
Computational Model Description
This section outlines the setup and execution of hotspot analysis using a 2D MSRE (Molten Salt Reactor Experiment) stringer geometry.
Files used by this model include:
MOOSE input file
Exodus reference solution file for initializing the infiltration amount
Mesh input file
This document reviews the important elements of the input file, listed in full here:
# ==============================================================================
# Role of a local hotspot on the stress distribution of a 2D graphite section
# Application : MOOSE
# ------------------------------------------------------------------------------
# Idaho Falls, INL, 2025
# Author(s): V Prithivirajan, Ben Spencer
# If using or referring to this model, please cite as explained on
# https://mooseframework.inl.gov/virtual_test_bed/citing.html
# ==============================================================================
### INPUTS ###
INF = 1.0
E = 9.8e9 #Pa
K = 63 #W/mK
max_PD = 1e7 #W/m^3
nu = 0.14
Tinf = 923 #K
htc = 4500 #W/m^2K
CTE = 4.5e-6 #1/K
porosity = 0.2
# Hot spot inputs
x0 = 0.0072 #m
y0 = 0.0072 #m
R = 1e-3 #m
interface_width = '${fparse R/10}'
PD = '${fparse max_PD*porosity}'
threshold = 0.8
[GlobalParams]
displacements = 'disp_x disp_y'
scalar_out_of_plane_strain = scalar_strain_yy
[]
[Mesh]
file = '../1_create_infiltration_profile/2D/msre2D_1X.e'
[]
[ICs]
[eta_ic]
type = SpecifiedSmoothCircleIC
variable = eta
x_positions = ${x0}
y_positions = ${y0}
z_positions = 0
radii = ${R}
invalue = 1
outvalue = 0
int_width = ${interface_width}
[]
[]
[Variables]
[T]
initial_condition = 300.0 #K
[]
[scalar_strain_yy]
order = FIRST
family = SCALAR
[]
[]
[AuxVariables]
[smooth_read]
order = FIRST
family = LAGRANGE
[]
[hotspot_var]
order = CONSTANT
family = MONOMIAL
[]
[eta]
[]
[]
[Kernels]
[heat_conduction]
type = HeatConduction
variable = T
[]
[heat_source]
type = HeatSource
variable = T
function = mod_heatsource_soln_func
[]
[heat_source_hotspot]
type = HeatSource
variable = T
function = heatsource_hotspot_fn
[]
[]
[AuxKernels]
[smooth_read_fn]
type = FunctionAux
variable = smooth_read
function = mod_heatsource_soln_func
execute_on = TIMESTEP_BEGIN
[]
[hotspot]
type = FunctionAux
variable = hotspot_var
function = heatsource_hotspot_fn
[]
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
planar_formulation = GENERALIZED_PLANE_STRAIN
scalar_out_of_plane_strain = scalar_strain_yy
add_variables = true
strain = small
automatic_eigenstrain_names = true
generate_output = 'stress_xx stress_yy max_principal_stress vonmises_stress'
[]
[]
[]
[]
[Functions]
[heatsource_soln_func]
type = SolutionFunction
solution = heatsource_soln
from_variable = diffuse
[]
[mod_heatsource_soln_func]
type = ParsedFunction
symbol_names = smooth_mod
symbol_values = heatsource_soln_func
expression = 'if(smooth_mod>=${threshold},${PD},0)'
[]
[heatsource_hotspot_fn]
type = ParsedFunction
expression = 'r := (sqrt((x-${x0})^2 + (y-${y0})^2) );
if(r<=${R},${max_PD}-${PD},0)'
[]
[]
[UserObjects]
[heatsource_soln]
type = SolutionUserObject
# mesh = 'Ref_solution_file.e'
# use a gold file for convenience
mesh = '../2_create_reference_solution_file/gold/CombinedExodus_AllResults_out.e'
time_transformation = ${INF}
system_variables = 'diffuse'
[]
[]
[Materials]
[h_void]
type = SwitchingFunctionMaterial
eta = eta
h_order = HIGH
function_name = h_void
output_properties = 'h_void'
outputs = exodus
[]
[h_mat]
type = DerivativeParsedMaterial
expression = '1-h_void'
coupled_variables = 'eta'
property_name = h_mat
material_property_names = 'h_void'
outputs = exodus
[]
[thermal]
type = HeatConductionMaterial
thermal_conductivity = ${K}
specific_heat = 1400 #J/KgK
[]
[density]
type = GenericConstantMaterial
prop_names = 'density'
prop_values = 1760.0 #Kg/m^3
[]
[elastic_tensor_matrix]
type = ComputeIsotropicElasticityTensor
youngs_modulus = ${E}
poissons_ratio = ${nu}
base_name = Cijkl_matrix
[]
[elastic_tensor_void]
type = ComputeIsotropicElasticityTensor
youngs_modulus = 1e-3 #Pa
poissons_ratio = 1e-3
base_name = Cijkl_void
[]
[elasticity_tensor]
type = CompositeElasticityTensor
tensors = 'Cijkl_matrix Cijkl_void'
weights = 'h_mat h_void'
coupled_variables = 'eta'
[]
[expansion1]
type = ComputeThermalExpansionEigenstrain
temperature = T
thermal_expansion_coeff = ${CTE}
stress_free_temperature = 300 #K
eigenstrain_name = thermal_expansion
[]
[stress]
type = ComputeLinearElasticStress
[]
[]
[BCs]
[xsymm_left]
type = DirichletBC
variable = disp_x
value = 0
boundary = 'left'
[]
[ysymm_bottom]
type = DirichletBC
variable = disp_y
value = 0
boundary = 'bottom'
[]
[contacting_salt]
type = ConvectiveHeatFluxBC
variable = T
boundary = 'right_channelboundary'
T_infinity = ${Tinf}
heat_transfer_coefficient = ${htc}
[]
[]
[Postprocessors]
[maxstress]
type = ElementExtremeValue
variable = max_principal_stress
value_type = max
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Steady
solve_type = 'NEWTON'
petsc_options = '-snes_ksp_ew'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package'
petsc_options_value = 'lu superlu_dist'
line_search = 'none'
nl_abs_tol = 1.0e-10
nl_rel_tol = 1.0e-08
[]
[Outputs]
exodus = true
[](msr/graphite_model/infiltration/5_hotspot_analysis_2D/hotspotanalysis_2D.i)Setting up the hotspot
The center and the radius of the hotspot are provided as inputs:
x0 = 0.0072
y0 = 0.0072
R = 1e-3
The hotspot is initialized through an auxiliary variable using a parsed function. The auxiliary variable hotspot_var is defined with constant order and monomial family. The parsed function heatsource_hotspot_fn calculates the distance from the center of the hotspot and assigns a power density value if the distance is within the hotspot radius. This function is then applied to the auxiliary variable through the hotspot AuxKernel. This setup ensures that the hotspot is correctly initialized and applied within the simulation.
[AuxVariables]
[hotspot_var]
order = CONSTANT
family = MONOMIAL
[]
[]
[Kernels]
[heat_source_hotspot]
type = HeatSource
variable = T
function = heatsource_hotspot_fn
[]
[]
[Functions]
[heatsource_hotspot_fn]
type = ParsedFunction
expression = 'r := (sqrt((x-${x0})^2 + (y-${y0})^2) );
if(r<=${R},${max_PD}-${PD},0)'
[]
[](msr/graphite_model/infiltration/5_hotspot_analysis_2D/hotspotanalysis_2D.i)The heat generation from the hotspot is incorporated within the Kernels section using the heat_source_hotspot kernel. This kernel applies the parsed function heatsource_hotspot_fn to account for the localized heat generation due to the hotspot.
Setting up the hotspot as a pore
In structural analysis, a pore acts as a significant stress concentrator. It is crucial to assign appropriate elastic properties to the pore to accurately capture this effect. In this model, we do not explicitly represent the pore. Instead, we assign near-zero elastic properties to the hotspot region. This approach ensures that the stress concentration effects are appropriately accounted for without the need for detailed pore geometry.
The following block defines a variable eta which is 1 within the pore/hotspot and 0 elsewhere, with a smooth transition between these regions.
[ICs]
[eta_ic]
type = SpecifiedSmoothCircleIC
variable = eta
x_positions = ${x0}
y_positions = ${y0}
z_positions = 0
radii = ${R}
invalue = 1
outvalue = 0
int_width = ${interface_width}
[]
[](msr/graphite_model/infiltration/5_hotspot_analysis_2D/hotspotanalysis_2D.i)The following blocks define the material properties and elasticity tensors based on the variable eta.
[Materials]
[h_void]
type = SwitchingFunctionMaterial
eta = eta
h_order = HIGH
function_name = h_void
output_properties = 'h_void'
outputs = exodus
[]
[h_mat]
type = DerivativeParsedMaterial
expression = '1-h_void'
coupled_variables = 'eta'
property_name = h_mat
material_property_names = 'h_void'
outputs = exodus
[]
[thermal]
type = HeatConductionMaterial
thermal_conductivity = ${K}
specific_heat = 1400 #J/KgK
[]
[density]
type = GenericConstantMaterial
prop_names = 'density'
prop_values = 1760.0 #Kg/m^3
[]
[elastic_tensor_matrix]
type = ComputeIsotropicElasticityTensor
youngs_modulus = ${E}
poissons_ratio = ${nu}
base_name = Cijkl_matrix
[]
[elastic_tensor_void]
type = ComputeIsotropicElasticityTensor
youngs_modulus = 1e-3 #Pa
poissons_ratio = 1e-3
base_name = Cijkl_void
[]
[elasticity_tensor]
type = CompositeElasticityTensor
tensors = 'Cijkl_matrix Cijkl_void'
weights = 'h_mat h_void'
coupled_variables = 'eta'
[]
[expansion1]
type = ComputeThermalExpansionEigenstrain
temperature = T
thermal_expansion_coeff = ${CTE}
stress_free_temperature = 300 #K
eigenstrain_name = thermal_expansion
[]
[stress]
type = ComputeLinearElasticStress
[]
[](msr/graphite_model/infiltration/5_hotspot_analysis_2D/hotspotanalysis_2D.i)The h_void block defines a switching function material for eta, producing the property h_void. The h_mat block calculates the complementary property h_mat as 1 - h_void. The elastic_tensor_matrix block defines the elasticity tensor for the matrix material with a specified Young's modulus and Poisson's ratio. The elastic_tensor_void block defines the elasticity tensor for the void with very low elastic properties. Finally, the elasticity_tensor block creates a composite elasticity tensor by combining matrix and void properties, weighted by h_mat and h_void, respectively.
Running the model
To run this model using the MOOSE combined executable, run the following command:
mpiexec -n 8 /path/to/app/combined-opt -i hotspotanalysis_2D.i
The following output file will be produced:
The Exodus results file:
hotspotanalysis_2D_out.e
The Exodus output file can be visualized with Paraview.