https://mooseframework.inl.gov
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 
10 #include "FVThermalResistanceBC.h"
11 #include "HeatConductionNames.h"
12 
13 registerMooseObject("HeatTransferApp", FVThermalResistanceBC);
14 
17 {
18  auto params = FVFluxBC::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 & " +
25  HeatConduction::emissivity + " <= 1.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  : FVFluxBC(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)
79  _outer_radius += d;
80 
81  // because the thermal conductivities are constant, we only need to compute
82  // the conduction resistance one time
84 }
85 
86 void
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 
110 ADReal
112 {
113  // radiation resistance has to be solved iteratively, since we don't know the
114  // surface temperature. We do know that the heat flux in the conduction layers
115  // must match the heat flux in the parallel convection-radiation segment. For a
116  // first guess, take the surface temperature as the average of _T and T_ambient.
117  _T_surface = 0.5 * (_T[_qp] + _T_ambient);
118 
119  // total flux perpendicular to boundary
120  ADReal flux;
121 
122  // resistance component representing the sum of the convection and radiation
123  // resistances, in parallel
125 
126  // other iteration requirements
127  unsigned int iteration = 0;
128  ADReal norm = 2 * _tolerance;
129  ADReal T_surface_previous;
130 
131  // iterate to find the approximate surface temperature needed for evaluating the
132  // radiation resistance. We only do this iteration if we have radiation transfer.
133  if (_emissivity > 1e-8)
134  while (norm > (_tolerance * _alpha))
135  {
136  T_surface_previous = _T_surface;
137 
138  // compute the flux based on the conduction part of the circuit
139  flux = (_T[_qp] - _T_surface) / _conduction_resistance;
140 
142 
143  // use the flux computed from the conduction half to update T_surface
145  _T_surface = _alpha * _T_surface + (1 - _alpha) * T_surface_previous;
146  norm = std::abs(_T_surface - T_surface_previous) / std::abs(T_surface_previous);
147 
148  if (iteration == _max_iterations)
149  {
150  mooseWarning("Maximum number of iterations reached in 'FVThermalResistanceBC'!");
151  break;
152  }
153  else
154  iteration += 1;
155  }
156 
157  // once we have determined T_surface, we can finally evaluate the complete
158  // resistance to find the overall heat flux. For Cartesian, dividing by the
159  // 'inner_radius' has no effect, but it is required for correct normalization
160  // for cylindrical geometries.
162  return flux;
163 }
164 
165 void
167 {
168  // compute the parallel convection and radiation resistances, assuming they
169  // act on the same surface area size
172 
173  // for Cartesian, dividing by the 'outer_radius' has no effect, but it is
174  // required for correct normalization for cylindrical geometries
175  _parallel_resistance = 1.0 / (hr + _h[_qp]) / _outer_radius;
176 }
FVThermalResistanceBC(const InputParameters &parameters)
const Real _inner_radius
Radius corresponding to the cylindrical surface (when using a cylindrical geometry) ...
static InputParameters validParams()
COORD_RZ
const Real _T_ambient
ambient temperature for convection and radiation heat transfer
ADReal _T_surface
surface temperature
DualNumber< Real, DNDerivativeType, true > ADReal
void mooseWarning(Args &&... args) const
const Moose::CoordinateSystemType _geometry
Whether to use a cylindrical or cartesian form for the thermal resistances.
const unsigned int _qp
ADReal _conduction_resistance
conduction thermal resistance
static const std::string T_ambient
const unsigned int & _max_iterations
maximum number of iterations (when radiative heat transfer is included)
ADReal _parallel_resistance
parallel convection and radiation thermal resistance
void paramError(const std::string &param, Args... args) const
void computeConductionResistance()
Computes the serial resistance of multiple conductive layers.
auto norm(const T &a) -> decltype(std::abs(a))
static InputParameters validParams()
const Real & _emissivity
boundary emissivity
const std::vector< Real > & _k
thermal conductivities for each conduction layer, listed in order closest to the boundary ...
const Real & _alpha
underrelaxation factor (when radiative heat transfer is included)
const Real & _tolerance
tolerance of iterations (when radiative heat transfer is included)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
CoordinateSystemType
void mooseError(Args &&... args) const
void computeParallelResistance()
Computes the parallel heat flux resistance for a combined radiation-convection boundary.
virtual ADReal computeQpResidual() override
This BC applies a heat flux to a boundary, where the heat flux is determined using series conduction ...
const ADVariableValue & _T
temperature variable
void ErrorVector unsigned int
auto index_range(const T &sizable)
const std::vector< Real > & _dx
thicknesses for each conduction layer, listed in order closest to the boundary
static const std::string emissivity
registerMooseObject("HeatTransferApp", FVThermalResistanceBC)
ADReal _outer_radius
outer radius of surface
const ADMaterialProperty< Real > & _h
convective heat transfer coefficient