20 #include "libmesh/string_to_enum.h" 33 params.
addCoupledVar(
"gap_distance",
"Distance across the gap");
34 params.
addCoupledVar(
"gap_temp",
"Temperature on the other side of the gap");
35 params.
addParam<
Real>(
"gap_conductivity", 1.0,
"The thermal conductivity of the gap material");
37 "gap_conductivity_function",
38 "Thermal conductivity of the gap material as a function. Multiplied by gap_conductivity.");
40 "Variable to be used in the gap_conductivity_function in place of time");
45 "Whether or not to do quadrature point based gap heat " 46 "transfer. If this is true then gap_distance and " 47 "gap_temp should NOT be provided (and will be " 48 "ignored); however, paired_boundary and variable are " 50 params.
addParam<BoundaryName>(
"paired_boundary",
"The boundary to be penetrated");
52 params.
addParam<
Real>(
"stefan_boltzmann", 5.670374e-8,
"The Stefan-Boltzmann constant");
54 params.
addParam<
bool>(
"use_displaced_mesh",
56 "Whether or not this object should use the " 57 "displaced mesh for computation. Note that in " 58 "the case this is true but no displacements " 59 "are provided in the Mesh block the " 60 "undisplaced mesh will still be used.");
63 "warnings",
false,
"Whether to output warning messages concerning nodes not being found");
74 "gap_conductivity gap_conductivity_function gap_conductivity_function_variable",
85 "appended_property_name",
"",
"Name appended to material properties to make them unique");
86 MooseEnum gap_geom_types(
"PLATE CYLINDER SPHERE");
87 params.
addParam<
MooseEnum>(
"gap_geometry_type", gap_geom_types,
"Gap calculation type.");
90 "Start point for line defining cylindrical axis");
92 "End point for line defining cylindrical axis");
97 "emissivity_primary>=0 & emissivity_primary<=1",
98 "The emissivity of the primary surface");
101 "emissivity_secondary>=0 & emissivity_secondary<=1",
102 "The emissivity of the secondary surface");
105 "min_gap", 1e-6,
"min_gap>0",
"A minimum gap (denominator) size");
107 "max_gap", 1e6,
"max_gap>=0",
"A maximum gap (denominator) size");
109 "min_gap_order", 0,
"min_gap_order<=1",
"Order of the Taylor expansion below min_gap");
116 _appended_property_name(getParam<
std::string>(
"appended_property_name")),
117 _temp(coupledValue(
"variable")),
120 _quadrature(getParam<bool>(
"quadrature")),
122 _gap_distance(88888),
127 _gap_distance_value(_quadrature ? _zero : coupledValue(
"gap_distance")),
128 _gap_temp_value(_quadrature ? _zero : coupledValue(
"gap_temp")),
129 _gap_conductance(declareProperty<
Real>(
"gap_conductance" + _appended_property_name)),
130 _gap_conductance_dT(declareProperty<
Real>(
"gap_conductance" + _appended_property_name +
"_dT")),
131 _gap_thermal_conductivity(declareProperty<
Real>(
"gap_conductivity")),
132 _gap_conductivity(getParam<
Real>(
"gap_conductivity")),
133 _gap_conductivity_function(isParamValid(
"gap_conductivity_function")
134 ? &getFunction(
"gap_conductivity_function")
136 _gap_conductivity_function_variable(isCoupled(
"gap_conductivity_function_variable")
137 ? &coupledValue(
"gap_conductivity_function_variable")
139 _stefan_boltzmann(getParam<
Real>(
"stefan_boltzmann")),
140 _emissivity_primary(getParam<
Real>(
"emissivity_primary")),
141 _emissivity_secondary(getParam<
Real>(
"emissivity_secondary")),
142 _min_gap(getParam<
Real>(
"min_gap")),
143 _min_gap_order(getParam<unsigned
int>(
"min_gap_order")),
144 _max_gap(getParam<
Real>(
"max_gap")),
145 _temp_var(_quadrature ? getVar(
"variable", 0) : nullptr),
146 _penetration_locator(nullptr),
147 _serialized_solution(_quadrature ? &_temp_var->sys().currentSolution() : nullptr),
148 _dof_map(_quadrature ? &_temp_var->sys().dofMap() : nullptr),
149 _warnings(getParam<bool>(
"warnings")),
150 _p1(declareRestartableData<Point>(
"cylinder_axis_point_1", Point(0, 1, 0))),
151 _p2(declareRestartableData<Point>(
"cylinder_axis_point_2", Point(0, 0, 0)))
164 getParam<std::vector<BoundaryName>>(
"boundary")[0],
170 paramError(
"gap_distance",
"needed if not using quadrature point based gap heat");
173 paramError(
"gap_temp",
"needed if not using quadrature point based gap heat");
177 mooseError(
"GapConductance does not work with uniform mesh refinement.");
184 const auto & check_subdomains =
186 if (check_subdomains.empty())
191 for (
auto subdomain : check_subdomains)
194 "The GapConductance model requires all subdomains to have the same coordinate system.");
204 unsigned int axisymmetric_radial_coord,
227 ::mooseError(
"'gap_geometry_type = PLATE' cannot be used with models having a spherical " 228 "coordinate system.");
236 ::
mooseError(
"For 'gap_geometry_type = CYLINDER' to be used with a Cartesian model, " 237 "'cylinder_axis_point_1' and 'cylinder_axis_point_2' must be specified.");
245 ::
mooseError(
"The 'cylinder_axis_point_1' and 'cylinder_axis_point_2' cannot be specified " 246 "with axisymmetric models. The y-axis is used as the cylindrical axis of " 249 if (axisymmetric_radial_coord == 0)
261 ::mooseError(
"'gap_geometry_type = CYLINDER' cannot be used with models having a spherical " 262 "coordinate system.");
269 ::
mooseError(
"For 'gap_geometry_type = SPHERE' to be used with a Cartesian or axisymmetric " 270 "model, 'sphere_origin' must be specified.");
276 ::
mooseError(
"The 'sphere_origin' cannot be specified with spherical models. x=0 is used " 277 "as the spherical origin.");
308 mooseAssert(min_gap > 0,
"min_gap must be larger than zero.");
310 if (adjusted_length > min_gap)
311 return 1.0 / adjusted_length;
313 switch (min_gap_order)
316 return 1.0 / min_gap;
319 return 1.0 / min_gap - (adjusted_length - min_gap) / (min_gap * min_gap);
382 Real surface_integration_factor = 1.0;
388 surface_integration_factor =
_r1 /
_r2;
398 const Real temp_func =
410 Real surface_integration_factor = 1.0;
416 surface_integration_factor =
_r1 /
_r2;
443 return gapRect(r2 - r1, max_gap);
455 const Real denominator =
radius * std::log(r2 / r1);
456 return std::min(denominator, max_denom);
463 return std::min(denominator, max_denom);
480 return gap_conductivity;
506 const Elem * secondary_side = pinfo->
_side;
507 std::vector<std::vector<Real>> & secondary_side_phi = pinfo->
_side_phi;
508 std::vector<dof_id_type> secondary_side_dof_indices;
512 for (
unsigned int i = 0; i < secondary_side_dof_indices.size(); ++i)
516 secondary_side_phi[i][0] * (*(*_serialized_solution))(secondary_side_dof_indices[i]);
522 mooseWarning(
"No gap value information found for node ",
538 const Point & current_point,
541 const Real & gap_distance,
542 const Point & current_normal,
551 const Point p2p1(p2 - p1);
552 const Point p1pc(p1 - current_point);
553 const Real t = -(p1pc * p2p1) / p2p1.norm_sq();
556 const Point p(p1 + t * p2p1);
557 Point rad_vec(current_point - p);
558 Real rad = rad_vec.norm();
560 Real rad_dot_norm = rad_vec * current_normal;
562 if (rad_dot_norm > 0)
565 r2 = rad - gap_distance;
568 else if (rad_dot_norm < 0)
570 r1 = rad + gap_distance;
575 ::mooseError(
"Issue with cylindrical flux calc. normals.\n");
579 const Point origin_to_curr_point(current_point - p1);
580 const Real normal_dot = origin_to_curr_point * current_normal;
581 const Real curr_point_radius = origin_to_curr_point.norm();
584 r1 = curr_point_radius;
585 r2 = curr_point_radius - gap_distance;
588 else if (normal_dot < 0)
590 r1 = curr_point_radius + gap_distance;
591 r2 = curr_point_radius;
595 ::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
registerMooseObject("HeatTransferApp", GapConductance)
static InputParameters actionParameters()
static Real gapCyl(const Real radius, const Real r1, const Real r2, const Real max_denom)
Compute gap distance for cylinder geometry.
unsigned int number() 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
void mooseWarning(Args &&... args) const
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()
const T & getParam(const std::string &name) const
void paramError(const std::string ¶m, Args... args) const
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
const std::set< SubdomainID > & meshBlockIDs() const
void mooseError(Args &&... args) const
const InputParameters & _pars
PenetrationLocator * _penetration_locator
const InputParameters & parameters() const
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