diff --git a/modules/thermal_hydraulics/doc/content/source/components/HSCoupler2D3D.md b/modules/thermal_hydraulics/doc/content/source/components/HSCoupler2D3D.md index dcc4bf05e47c..4c6c918b1fee 100644 --- a/modules/thermal_hydraulics/doc/content/source/components/HSCoupler2D3D.md +++ b/modules/thermal_hydraulics/doc/content/source/components/HSCoupler2D3D.md @@ -1,7 +1,7 @@ # HSCoupler2D3D This component is used to couple a [HeatStructureCylindrical.md] and a -[HeatStructureFromFile3D.md] via gap conduction and radiation. +[HeatStructureFromFile3D.md] via gap conduction, radiation, and convection. ## Formulation @@ -34,10 +34,10 @@ where This approach guarantees energy conservation of this heat exchange. -The heat flux is composed of two pieces, corresponding to conduction and radiation: +The heat flux is composed of three pieces, corresponding to conduction, radiation, and convection: !equation -q_{z,\theta} = q^\text{cond}_{z,\theta} + q^\text{rad}_{z,\theta} \,. +q_{z,\theta} = q^\text{cond}_{z,\theta} + q^\text{rad}_{z,\theta} + q^\text{conv}_{r,\theta} \,. Before describing these pieces, we describe some preliminaries. @@ -116,6 +116,18 @@ q^\text{rad}_{z,\theta} = \frac{\sigma (T_z^4 - T_{z,\theta}^4)}{\mathcal{R}_{z, where $\sigma$ is the Stefan-Boltzmann constant. +### Convection Heat Flux + +The convection heat flux is computed as + +!equation +q^\text{conv}_{z,\theta} = h^\text{gap}_{z,\theta} (T_z^4 - T_{z,\theta}^4) \,, + +where the gap heat transfer coefficient is evaluated at the gap temperature: + +!equation +h^\text{gap}_{z,\theta} = h_\text{gap}(T^\text{gap}_{z,\theta}) \,. + ## Restrictions and Assumptions - Currently, no contact ($\delta = 0$) is permitted, but this restriction is @@ -135,15 +147,17 @@ corresponding to each heat structure, at which the heat exchange occurs. The parameters [!param](/Components/HSCoupler2D3D/emissivity_2d), [!param](/Components/HSCoupler2D3D/emissivity_3d), -[!param](/Components/HSCoupler2D3D/gap_thickness), and -[!param](/Components/HSCoupler2D3D/gap_thermal_conductivity) correspond +[!param](/Components/HSCoupler2D3D/gap_thickness), +[!param](/Components/HSCoupler2D3D/gap_thermal_conductivity), and +[!param](/Components/HSCoupler2D3D/gap_htc) correspond to [Functions](Functions/index.md) of the relevant temperature; respectively, these correspond to - $\epsilon_\text{2D}(T_\text{2D})$, - $\epsilon_\text{3D}(T_\text{3D})$, -- $\delta(T_\text{gap})$, and -- $k_\text{gap}(T_\text{gap})$. +- $\delta(T_\text{gap})$, +- $k_\text{gap}(T_\text{gap})$, and +- $h_\text{gap}(T_\text{gap})$. The temperature values are substituted in place of the time coordinate for these `Function`s. diff --git a/modules/thermal_hydraulics/include/userobjects/HSCoupler2D3DUserObject.h b/modules/thermal_hydraulics/include/userobjects/HSCoupler2D3DUserObject.h index 530e485caed7..f78251da76d5 100644 --- a/modules/thermal_hydraulics/include/userobjects/HSCoupler2D3DUserObject.h +++ b/modules/thermal_hydraulics/include/userobjects/HSCoupler2D3DUserObject.h @@ -61,6 +61,8 @@ class HSCoupler2D3DUserObject : public SideUserObject const Function & _gap_thickness_fn; /// Gap thermal conductivity as a function of temperature const Function & _k_gap_fn; + /// Gap heat transfer coefficient as a function of temperature + const Function & _htc_gap_fn; /// User object containing the temperature values on the 2D boundary const StoreVariableByElemIDSideUserObject & _temperature_2d_uo; diff --git a/modules/thermal_hydraulics/src/components/HSCoupler2D3D.C b/modules/thermal_hydraulics/src/components/HSCoupler2D3D.C index 545caf1bcdb0..a07a342fbc7c 100644 --- a/modules/thermal_hydraulics/src/components/HSCoupler2D3D.C +++ b/modules/thermal_hydraulics/src/components/HSCoupler2D3D.C @@ -39,6 +39,8 @@ HSCoupler2D3D::validParams() params.addRequiredParam( "gap_thermal_conductivity", "Gap thermal conductivity [W/(m-K)] as a function of temperature [K]"); + params.addParam( + "gap_htc", 0, "Gap heat transfer coefficient [W/(m^2-K)] as a function of temperature [K]"); params.addClassDescription("Couples a 2D heat structure boundary to a 3D heat structure boundary " "using gap heat transfer."); @@ -183,6 +185,7 @@ HSCoupler2D3D::addMooseObjects() params.set("gap_thickness") = getParam("gap_thickness"); params.set("gap_thermal_conductivity") = getParam("gap_thermal_conductivity"); + params.set("gap_htc") = getParam("gap_htc"); params.set("temperature_2d_uo") = temperature_2d_uo_name; params.set("mesh_alignment") = &_mesh_alignment; params.set("execute_on") = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR}; diff --git a/modules/thermal_hydraulics/src/userobjects/HSCoupler2D3DUserObject.C b/modules/thermal_hydraulics/src/userobjects/HSCoupler2D3DUserObject.C index 407f5ee4eb23..73e263c3aff2 100644 --- a/modules/thermal_hydraulics/src/userobjects/HSCoupler2D3DUserObject.C +++ b/modules/thermal_hydraulics/src/userobjects/HSCoupler2D3DUserObject.C @@ -36,6 +36,8 @@ HSCoupler2D3DUserObject::validParams() params.addRequiredParam( "gap_thermal_conductivity", "Gap thermal conductivity [W/(m-K)] as a function of temperature [K]"); + params.addParam( + "gap_htc", 0, "Gap heat transfer coefficient [W/(m^2-K)] as a function of temperature [K]"); params.addRequiredParam( "temperature_2d_uo", "StoreVariableByElemIDSideUserObject containing the temperature values on the 2D boundary"); @@ -56,6 +58,7 @@ HSCoupler2D3DUserObject::HSCoupler2D3DUserObject(const InputParameters & paramet _include_radiation(isParamSetByUser("emissivity_2d") && isParamSetByUser("emissivity_3d")), _gap_thickness_fn(getFunction("gap_thickness")), _k_gap_fn(getFunction("gap_thermal_conductivity")), + _htc_gap_fn(getFunction("gap_htc")), _temperature_2d_uo(getUserObject("temperature_2d_uo")), _mesh_alignment(*getParam("mesh_alignment")) { @@ -102,6 +105,9 @@ HSCoupler2D3DUserObject::execute() HeatTransferModels::cylindricalGapConductionHeatFlux(k_gap, _r_2d, r_3d, T_2d, T_3d); auto heat_flux = heat_flux_cond; + const auto htc = evaluateTemperatureFunction(_htc_gap_fn, T_gap); + heat_flux += htc * (T_2d - T_3d); + if (_include_radiation) { const auto emissivity_2d = evaluateTemperatureFunction(_emissivity_2d_fn, T_2d); diff --git a/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/gold/convection_only.e b/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/gold/convection_only.e new file mode 100644 index 000000000000..b4d3b16e52e8 Binary files /dev/null and b/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/gold/convection_only.e differ diff --git a/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/tests b/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/tests index 4b059fcd76e4..90b672246238 100644 --- a/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/tests +++ b/modules/thermal_hydraulics/test/tests/components/hs_coupler_2d3d/tests @@ -31,6 +31,16 @@ exodiff = conduction_only.e detail = 'using conduction only.' [] + [convection_only] + type = Exodiff + input = hs_coupler_2d3d.i + cli_args = " + Components/hs_coupler/gap_thermal_conductivity=0 + Components/hs_coupler/gap_htc=100 + Outputs/file_base=convection_only" + exodiff = convection_only.e + detail = 'using convection only.' + [] [] [error_reporting]