20 #include "libmesh/string_to_enum.h" 30 "Material to compute an effective gap conductance based on the thermal conductivity of the " 31 "gap and diffusive approximation to the radiative heat transfer.");
36 params.
addCoupledVar(
"gap_distance",
"Distance across the gap");
37 params.
addCoupledVar(
"gap_temp",
"Temperature on the other side of the gap");
38 params.
addParam<
Real>(
"gap_conductivity", 1.0,
"The thermal conductivity of the gap material");
40 "gap_conductivity_function",
41 "Thermal conductivity of the gap material as a function. Multiplied by gap_conductivity.");
43 "Variable to be used in the gap_conductivity_function in place of time");
48 "Whether or not to do quadrature point based gap heat " 49 "transfer. If this is true then gap_distance and " 50 "gap_temp should NOT be provided (and will be " 51 "ignored); however, paired_boundary and variable are " 53 params.
addParam<BoundaryName>(
"paired_boundary",
"The boundary to be penetrated");
55 params.
addParam<
Real>(
"stefan_boltzmann", 5.670374e-8,
"The Stefan-Boltzmann constant");
57 params.
addParam<
bool>(
"use_displaced_mesh",
59 "Whether or not this object should use the " 60 "displaced mesh for computation. Note that in " 61 "the case this is true but no displacements " 62 "are provided in the Mesh block the " 63 "undisplaced mesh will still be used.");
66 "warnings",
false,
"Whether to output warning messages concerning nodes not being found");
77 "gap_conductivity gap_conductivity_function gap_conductivity_function_variable",
88 "appended_property_name",
"",
"Name appended to material properties to make them unique");
89 MooseEnum gap_geom_types(
"PLATE CYLINDER SPHERE");
90 params.
addParam<
MooseEnum>(
"gap_geometry_type", gap_geom_types,
"Gap calculation type.");
93 "Start point for line defining cylindrical axis");
95 "End point for line defining cylindrical axis");
100 "emissivity_primary>=0 & emissivity_primary<=1",
101 "The emissivity of the primary surface");
104 "emissivity_secondary>=0 & emissivity_secondary<=1",
105 "The emissivity of the secondary surface");
108 "min_gap", 1e-6,
"min_gap>0",
"A minimum gap (denominator) size");
110 "max_gap", 1e6,
"max_gap>=0",
"A maximum gap (denominator) size");
112 "min_gap_order", 0,
"min_gap_order<=1",
"Order of the Taylor expansion below min_gap");
117 params.
addParamNamesToGroup(
"emissivity_primary emissivity_secondary",
"Radiative heat transfer");
125 _appended_property_name(getParam<
std::string>(
"appended_property_name")),
126 _temp(coupledValue(
"variable")),
129 _quadrature(getParam<bool>(
"quadrature")),
131 _gap_distance(88888),
136 _gap_distance_value(_quadrature ? _zero : coupledValue(
"gap_distance")),
137 _gap_temp_value(_quadrature ? _zero : coupledValue(
"gap_temp")),
138 _gap_conductance(declareProperty<
Real>(
"gap_conductance" + _appended_property_name)),
139 _gap_conductance_dT(declareProperty<
Real>(
"gap_conductance" + _appended_property_name +
"_dT")),
140 _gap_thermal_conductivity(declareProperty<
Real>(
"gap_conductivity")),
141 _gap_conductivity(getParam<
Real>(
"gap_conductivity")),
142 _gap_conductivity_function(isParamValid(
"gap_conductivity_function")
143 ? &getFunction(
"gap_conductivity_function")
145 _gap_conductivity_function_variable(isCoupled(
"gap_conductivity_function_variable")
146 ? &coupledValue(
"gap_conductivity_function_variable")
148 _stefan_boltzmann(getParam<
Real>(
"stefan_boltzmann")),
149 _emissivity_primary(getParam<
Real>(
"emissivity_primary")),
150 _emissivity_secondary(getParam<
Real>(
"emissivity_secondary")),
151 _min_gap(getParam<
Real>(
"min_gap")),
152 _min_gap_order(getParam<unsigned
int>(
"min_gap_order")),
153 _max_gap(getParam<
Real>(
"max_gap")),
154 _temp_var(_quadrature ? getVar(
"variable", 0) : nullptr),
155 _penetration_locator(nullptr),
156 _serialized_solution(_quadrature ? &_temp_var->sys().currentSolution() : nullptr),
157 _dof_map(_quadrature ? &_temp_var->sys().dofMap() : nullptr),
158 _warnings(getParam<bool>(
"warnings")),
159 _p1(declareRestartableData<Point>(
"cylinder_axis_point_1", Point(0, 1, 0))),
160 _p2(declareRestartableData<Point>(
"cylinder_axis_point_2", Point(0, 0, 0)))
173 getParam<std::vector<BoundaryName>>(
"boundary")[0],
179 paramError(
"gap_distance",
"needed if not using quadrature point based gap heat");
182 paramError(
"gap_temp",
"needed if not using quadrature point based gap heat");
186 mooseError(
"GapConductance does not work with uniform mesh refinement.");
193 const auto & check_subdomains =
195 if (check_subdomains.empty())
200 for (
auto subdomain : check_subdomains)
203 "The GapConductance model requires all subdomains to have the same coordinate system.");
213 unsigned int axisymmetric_radial_coord,
236 ::mooseError(
"'gap_geometry_type = PLATE' cannot be used with models having a spherical " 237 "coordinate system.");
245 ::
mooseError(
"For 'gap_geometry_type = CYLINDER' to be used with a Cartesian model, " 246 "'cylinder_axis_point_1' and 'cylinder_axis_point_2' must be specified.");
254 ::
mooseError(
"The 'cylinder_axis_point_1' and 'cylinder_axis_point_2' cannot be specified " 255 "with axisymmetric models. The y-axis is used as the cylindrical axis of " 258 if (axisymmetric_radial_coord == 0)
270 ::mooseError(
"'gap_geometry_type = CYLINDER' cannot be used with models having a spherical " 271 "coordinate system.");
278 ::
mooseError(
"For 'gap_geometry_type = SPHERE' to be used with a Cartesian or axisymmetric " 279 "model, 'sphere_origin' must be specified.");
285 ::
mooseError(
"The 'sphere_origin' cannot be specified with spherical models. x=0 is used " 286 "as the spherical origin.");
317 mooseAssert(min_gap > 0,
"min_gap must be larger than zero.");
319 if (adjusted_length > min_gap)
320 return 1.0 / adjusted_length;
322 switch (min_gap_order)
325 return 1.0 / min_gap;
328 return 1.0 / min_gap - (adjusted_length - min_gap) / (min_gap * min_gap);
391 Real surface_integration_factor = 1.0;
397 surface_integration_factor =
_r1 /
_r2;
407 const Real temp_func =
419 Real surface_integration_factor = 1.0;
425 surface_integration_factor =
_r1 /
_r2;
452 return gapRect(r2 - r1, max_gap);
464 const Real denominator =
radius * std::log(r2 / r1);
465 return std::min(denominator, max_denom);
472 return std::min(denominator, max_denom);
489 return gap_conductivity;
515 const Elem * secondary_side = pinfo->
_side;
516 std::vector<std::vector<Real>> & secondary_side_phi = pinfo->
_side_phi;
517 std::vector<dof_id_type> secondary_side_dof_indices;
521 for (
unsigned int i = 0; i < secondary_side_dof_indices.size(); ++i)
525 secondary_side_phi[i][0] * (*(*_serialized_solution))(secondary_side_dof_indices[i]);
531 mooseWarning(
"No gap value information found for node ",
547 const Point & current_point,
550 const Real & gap_distance,
551 const Point & current_normal,
560 const Point p2p1(p2 - p1);
561 const Point p1pc(p1 - current_point);
562 const Real t = -(p1pc * p2p1) / p2p1.norm_sq();
565 const Point p(p1 + t * p2p1);
566 Point rad_vec(current_point - p);
567 Real rad = rad_vec.norm();
569 Real rad_dot_norm = rad_vec * current_normal;
571 if (rad_dot_norm > 0)
574 r2 = rad - gap_distance;
577 else if (rad_dot_norm < 0)
579 r1 = rad + gap_distance;
584 ::mooseError(
"Issue with cylindrical flux calc. normals.\n");
588 const Point origin_to_curr_point(current_point - p1);
589 const Real normal_dot = origin_to_curr_point * current_normal;
590 const Real curr_point_radius = origin_to_curr_point.norm();
593 r1 = curr_point_radius;
594 r2 = curr_point_radius - gap_distance;
597 else if (normal_dot < 0)
599 r1 = curr_point_radius + gap_distance;
600 r2 = curr_point_radius;
604 ::mooseError(
"Issue with spherical flux calc. normals. \n");
const MooseArray< Point > & _q_point
const VariableValue *const _gap_conductivity_function_variable
unsigned int getAxisymmetricRadialCoord() const
virtual bool isCoupled(const std::string &var_name, unsigned int i=0) const
MaterialProperty< Real > & _gap_conductance_dT
const Real _stefan_boltzmann
FEProblemBase & _fe_problem
const InputParameters & _pars
const std::string & _name
registerMooseObject("HeatTransferApp", GapConductance)
static InputParameters actionParameters()
void paramError(const std::string ¶m, Args... args) const
static Real gapCyl(const Real radius, const Real r1, const Real r2, const Real max_denom)
Compute gap distance for cylinder geometry.
const T & getParam(const std::string &name) const
unsigned int number() const
const InputParameters & parameters() const
static InputParameters validParams()
static void computeGapRadii(const GAP_GEOMETRY gap_geometry_type, const Point ¤t_point, const Point &p1, const Point &p2, const Real &gap_distance, const Point ¤t_normal, Real &r1, Real &r2, Real &radius)
Compute current gap radii for surface integration of gas conductance.
static Real gapLength(const GAP_GEOMETRY &gap_geom, const Real radius, const Real r1, const Real r2, const Real max_gap)
MaterialProperty< Real > & _gap_thermal_conductivity
const Real _gap_conductivity
static Real gapAttenuation(Real adjusted_length, Real min_gap, unsigned int min_gap_order)
virtual const std::set< SubdomainID > & blockIDs() const
virtual bool blockRestricted() const
virtual Real h_radiation()
virtual Real dh_radiation()
std::vector< std::vector< Real > > _side_phi
virtual void initialSetup() override
std::map< dof_id_type, PenetrationInfo *> & _penetration_info
Real distance(const Point &p)
virtual Real h_conduction()
const VariableValue & _gap_temp_value
const unsigned int _min_gap_order
virtual Real dh_conduction()
static MooseEnum getNonlinearVariableOrders()
static InputParameters validParams()
static Real gapRect(const Real distance, const Real max_gap)
Compute gap distance for plate geometry.
static Real gapSphere(const Real radius, const Real r1, const Real r2, const Real max_denom)
Compute gap distance for sphere geometry.
static void setGapGeometryParameters(const InputParameters ¶ms, const Moose::CoordinateSystemType coord_sys, unsigned int axisymmetric_radial_coord, GAP_GEOMETRY &gap_geometry_type, Point &p1, Point &p2)
Generic gap heat transfer model, with h_gap = h_conduction + h_contact + h_radiation.
virtual void computeGapValues()
unsigned int uniformRefineLevel() const
virtual GeometricSearchData & geomSearchData()=0
const VariableValue & _gap_distance_value
const Real _emissivity_primary
Node * getQuadratureNode(const Elem *elem, const unsigned short int side, const unsigned int qp)
virtual void computeQpProperties() override
virtual void computeQpConductance()
Override this to compute the conductance at _qp.
PenetrationLocator & getQuadraturePenetrationLocator(const BoundaryName &primary, const BoundaryName &secondary, libMesh::Order order=libMesh::FIRST)
GAP_GEOMETRY & _gap_geometry_type
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const VariableValue & _temp
const MooseArray< Point > & _normals
const unsigned int & _current_side
void mooseWarning(Args &&... args) const
const std::set< SubdomainID > & meshBlockIDs() const
void mooseError(Args &&... args) const
PenetrationLocator * _penetration_locator
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
const Real _emissivity_secondary
MooseVariable * _temp_var
virtual Real value(Real t, const Point &p) const
const Function *const _gap_conductivity_function
processor_id_type processor_id() const
GapConductance(const InputParameters ¶meters)
void ErrorVector unsigned int
const Elem *const & _current_elem
MaterialProperty< Real > & _gap_conductance