Line data Source code
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 : /** 11 : * This material computes Tungsten thermal properties as a function of temperature. 12 : * Constants are taken from Milner, J. L., Karkos, P., & Bowers, J. J. (2024). 13 : * Space Nuclear Propulsion (SNP) Material Property Handbook (No. SNP-HDBK-0008). 14 : * National Aeronautics and Space Administration (NASA). https://ntrs.nasa.gov/citations/20240004217 15 : */ 16 : 17 : #include "TungstenThermalPropertiesMaterial.h" 18 : #include "SolidPropertiesNames.h" 19 : #include "libmesh/utility.h" 20 : #include <cmath> 21 : 22 : registerMooseObject("SolidPropertiesApp", TungstenThermalPropertiesMaterial); 23 : registerMooseObject("SolidPropertiesApp", ADTungstenThermalPropertiesMaterial); 24 : 25 : template <bool is_ad> 26 : InputParameters 27 85 : TungstenThermalPropertiesMaterialTempl<is_ad>::validParams() 28 : { 29 85 : InputParameters params = Material::validParams(); 30 170 : params.addRequiredCoupledVar("temperature", "Temperature"); 31 85 : params.addParam<std::string>(SolidPropertiesNames::thermal_conductivity, 32 : SolidPropertiesNames::thermal_conductivity, 33 : "Name to be used for the thermal conductivity"); 34 85 : params.addParam<std::string>(SolidPropertiesNames::specific_heat, 35 : SolidPropertiesNames::specific_heat, 36 : "Name to be used for the specific heat"); 37 85 : params.addParam<std::string>(SolidPropertiesNames::density, 38 : SolidPropertiesNames::density, 39 : "Name to be used for the density"); 40 85 : params.addClassDescription("Computes tungsten thermal properties as a function of temperature"); 41 85 : return params; 42 0 : } 43 : template <bool is_ad> 44 66 : TungstenThermalPropertiesMaterialTempl<is_ad>::TungstenThermalPropertiesMaterialTempl( 45 : const InputParameters & parameters) 46 : : Material(parameters), 47 66 : _temperature(coupledGenericValue<is_ad>("temperature")), 48 132 : _k(declareGenericProperty<Real, is_ad>( 49 : getParam<std::string>(SolidPropertiesNames::thermal_conductivity))), 50 66 : _c_p(declareGenericProperty<Real, is_ad>( 51 : getParam<std::string>(SolidPropertiesNames::specific_heat))), 52 66 : _rho(declareGenericProperty<Real, is_ad>(getParam<std::string>(SolidPropertiesNames::density))) 53 : { 54 66 : } 55 : 56 : template <bool is_ad> 57 : void 58 2700 : TungstenThermalPropertiesMaterialTempl<is_ad>::computeQpProperties() 59 : { 60 2700 : if (_temperature[_qp] < 5 || _temperature[_qp] > 3600) 61 0 : flagInvalidSolution("The temperature is out of bounds to calculate tungsten density. " 62 : "Temperature has to be between 5 K and 3600 K."); 63 : 64 2700 : if (_temperature[_qp] < 1 || _temperature[_qp] > 3653) 65 0 : flagInvalidSolution("The temperature is out of bounds to calculate tungsten thermal " 66 : "conductivity. Temperature has to be between 1 K and 3653 K."); 67 : 68 2700 : if (_temperature[_qp] < 11 || _temperature[_qp] > 3700) 69 0 : flagInvalidSolution("The temperature is out of bounds to calculate tungsten specific " 70 : "heat. Temperature has to be between 11 K and 3700 K."); 71 : 72 2700 : const auto temperature_scaled = _temperature[_qp] / 1000; 73 : 74 2700 : _k[_qp] = (_temperature[_qp] < 55) 75 2700 : ? _kA0 * std::pow(temperature_scaled, 8.740e-01) / 76 27 : (1 + _kA1 * temperature_scaled + _kA2 * Utility::pow<2>(temperature_scaled) + 77 27 : _kA3 * Utility::pow<3>(temperature_scaled)) 78 2673 : : (_kB0 + _kB1 * temperature_scaled + _kB2 * Utility::pow<2>(temperature_scaled) + 79 2673 : _kB3 * Utility::pow<3>(temperature_scaled)) / 80 2673 : (_kC0 + _kC1 * temperature_scaled + Utility::pow<2>(temperature_scaled)); 81 : 82 2700 : _c_p[_qp] = 83 2700 : (_temperature[_qp] <= 293) 84 2700 : ? _cA0 * std::pow(temperature_scaled, 3.030) / 85 216 : (1 + _cA1 * temperature_scaled + _cA2 * Utility::pow<2>(temperature_scaled) + 86 216 : _cA3 * Utility::pow<3>(temperature_scaled)) 87 2484 : : _cB0 + _cB1 * temperature_scaled + _cB2 * Utility::pow<2>(temperature_scaled) + 88 2484 : _cB3 * Utility::pow<3>(temperature_scaled) + 89 2484 : _cB_2 / Utility::pow<2>(temperature_scaled); 90 : 91 2700 : _rho[_qp] = (_temperature[_qp] <= 294) 92 2700 : ? _rA0 / Utility::pow<3>(1 + (_rA1 + _rA2 * temperature_scaled + 93 216 : _rA3 * Utility::pow<2>(temperature_scaled) + 94 216 : _rA4 * Utility::pow<3>(temperature_scaled)) / 95 0 : 100) 96 2484 : : _rA0 / Utility::pow<3>(1 + (_rB0 + _rB1 * temperature_scaled + 97 2484 : _rB2 * Utility::pow<2>(temperature_scaled) + 98 2484 : _rB3 * Utility::pow<3>(temperature_scaled)) / 99 0 : 100); 100 2700 : } 101 : 102 : template class TungstenThermalPropertiesMaterialTempl<false>; 103 : template class TungstenThermalPropertiesMaterialTempl<true>;