https://mooseframework.inl.gov
Loading...
Searching...
No Matches
FVThermalResistanceBC.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11#include "HeatConductionNames.h"
12
14
17{
18 auto params = FVQpFluxBC::validParams();
19 params.addCoupledVar("temperature", "temperature variable");
20 params.addRequiredParam<Real>(HeatConduction::T_ambient, "constant ambient temperature");
21 params.addRequiredParam<MaterialPropertyName>("htc", "heat transfer coefficient");
22
23 params.addRequiredRangeCheckedParam<Real>(HeatConduction::emissivity,
24 HeatConduction::emissivity + " >= 0.0 & " +
26 "emissivity of the surface");
27
28 params.addRequiredParam<std::vector<Real>>(
29 "thermal_conductivities",
30 "vector of thermal conductivity values used for the conduction layers");
31 params.addRequiredParam<std::vector<Real>>("conduction_thicknesses",
32 "vector of conduction layer thicknesses");
33
34 MooseEnum geometry("cartesian cylindrical", "cartesian");
35 params.addParam<MooseEnum>("geometry", geometry, "type of geometry");
36 params.addRangeCheckedParam<Real>("inner_radius",
37 "inner_radius > 0.0",
38 "coordinate corresponding to the first resistance layer");
39
40 params.addRangeCheckedParam<Real>(
41 "step_size", 0.1, "step_size > 0.0", "underrelaxation step size");
42
43 params.addRangeCheckedParam<unsigned int>(
44 "max_iterations", 100, "max_iterations >= 0", "maximum iterations");
45
46 params.addRangeCheckedParam<Real>(
47 "tolerance", 1E-3, "tolerance > 0.0", "tolerance to converge iterations");
48 params.addClassDescription("Thermal resistance Heat flux boundary condition for the "
49 "fluid and solid energy equations");
50 return params;
51}
52
54 : FVQpFluxBC(parameters),
55 _geometry(getParam<MooseEnum>("geometry").getEnum<Moose::CoordinateSystemType>()),
56 _inner_radius(
57 _geometry == Moose::CoordinateSystemType::COORD_RZ ? getParam<Real>("inner_radius") : 1.0),
58 _T(isParamValid("temperature") ? adCoupledValue("temperature") : _u),
59 _T_ambient(getParam<Real>(HeatConduction::T_ambient)),
60 _k(getParam<std::vector<Real>>("thermal_conductivities")),
61 _dx(getParam<std::vector<Real>>("conduction_thicknesses")),
62 _h(getADMaterialPropertyByName<Real>(getParam<MaterialPropertyName>("htc"))),
63 _emissivity(getParam<Real>(HeatConduction::emissivity)),
64 _max_iterations(getParam<unsigned int>("max_iterations")),
65 _tolerance(getParam<Real>("tolerance")),
66 _alpha(getParam<Real>("step_size")),
67 _T_surface(0.0),
68 _outer_radius(_inner_radius),
69 _conduction_resistance(0.0),
70 _parallel_resistance(0.0)
71{
72 if (_k.size() != _dx.size())
73 paramError("conduction_thicknesses",
74 "Number of specified thermal conductivities must match "
75 "the number of conduction layers!");
76
77 if (_geometry == Moose::CoordinateSystemType::COORD_RZ)
78 for (const auto & d : _dx)
80
81 // because the thermal conductivities are constant, we only need to compute
82 // the conduction resistance one time
84}
85
86void
88{
89 Real r = _inner_radius;
90
91 for (const auto i : index_range(_k))
92 {
93 switch (_geometry)
94 {
95 case Moose::CoordinateSystemType::COORD_XYZ:
96 _conduction_resistance += _dx[i] / _k[i];
97 break;
98 case Moose::CoordinateSystemType::COORD_RZ:
99 {
100 _conduction_resistance += std::log((_dx[i] + r) / r) / _k[i];
101 r += _dx[i];
102 break;
103 }
104 default:
105 mooseError("Unhandled 'GeometryEnum' in 'FVThermalResistanceBC'!");
106 }
107 }
108}
109
110ADReal
112{
113 using std::abs;
114
115 // radiation resistance has to be solved iteratively, since we don't know the
116 // surface temperature. We do know that the heat flux in the conduction layers
117 // must match the heat flux in the parallel convection-radiation segment. For a
118 // first guess, take the surface temperature as the average of _T and T_ambient.
119 _T_surface = 0.5 * (_T[_qp] + _T_ambient);
120
121 // total flux perpendicular to boundary
122 ADReal flux;
123
124 // resistance component representing the sum of the convection and radiation
125 // resistances, in parallel
127
128 // other iteration requirements
129 unsigned int iteration = 0;
130 ADReal norm = 2 * _tolerance;
131 ADReal T_surface_previous;
132
133 // iterate to find the approximate surface temperature needed for evaluating the
134 // radiation resistance. We only do this iteration if we have radiation transfer.
135 if (_emissivity > 1e-8)
136 while (norm > (_tolerance * _alpha))
137 {
138 T_surface_previous = _T_surface;
139
140 // compute the flux based on the conduction part of the circuit
142
144
145 // use the flux computed from the conduction half to update T_surface
147 _T_surface = _alpha * _T_surface + (1 - _alpha) * T_surface_previous;
148 norm = abs(_T_surface - T_surface_previous) / abs(T_surface_previous);
149
150 if (iteration == _max_iterations)
151 {
152 mooseWarning("Maximum number of iterations reached in 'FVThermalResistanceBC'!");
153 break;
154 }
155 else
156 iteration += 1;
157 }
158
159 // once we have determined T_surface, we can finally evaluate the complete
160 // resistance to find the overall heat flux. For Cartesian, dividing by the
161 // 'inner_radius' has no effect, but it is required for correct normalization
162 // for cylindrical geometries.
164 return flux;
165}
166
167void
169{
170 // compute the parallel convection and radiation resistances, assuming they
171 // act on the same surface area size
174
175 // for Cartesian, dividing by the 'outer_radius' has no effect, but it is
176 // required for correct normalization for cylindrical geometries
177 _parallel_resistance = 1.0 / (hr + _h[_qp]) / _outer_radius;
178}
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("HeatTransferApp", FVThermalResistanceBC)
void ErrorVector unsigned int
const unsigned int _qp
static InputParameters validParams()
This BC applies a heat flux to a boundary, where the heat flux is determined using series conduction ...
const Real & _alpha
underrelaxation factor (when radiative heat transfer is included)
const ADMaterialProperty< Real > & _h
convective heat transfer coefficient
void computeConductionResistance()
Computes the serial resistance of multiple conductive layers.
ADReal _outer_radius
outer radius of surface
ADReal _parallel_resistance
parallel convection and radiation thermal resistance
FVThermalResistanceBC(const InputParameters &parameters)
static InputParameters validParams()
const std::vector< Real > & _k
thermal conductivities for each conduction layer, listed in order closest to the boundary
const Real & _tolerance
tolerance of iterations (when radiative heat transfer is included)
ADReal _T_surface
surface temperature
const Moose::CoordinateSystemType _geometry
Whether to use a cylindrical or cartesian form for the thermal resistances.
const Real _T_ambient
ambient temperature for convection and radiation heat transfer
const ADVariableValue & _T
temperature variable
const Real & _emissivity
boundary emissivity
void computeParallelResistance()
Computes the parallel heat flux resistance for a combined radiation-convection boundary.
const unsigned int & _max_iterations
maximum number of iterations (when radiative heat transfer is included)
const Real _inner_radius
Radius corresponding to the cylindrical surface (when using a cylindrical geometry)
const std::vector< Real > & _dx
thicknesses for each conduction layer, listed in order closest to the boundary
virtual ADReal computeQpResidual() override
ADReal _conduction_resistance
conduction thermal resistance
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
void mooseWarning(Args &&... args) const
static const std::string emissivity
static const std::string T_ambient