LCOV - code coverage report
Current view: top level - src/fluidproperties - HeliumFluidProperties.C (source / functions) Hit Total Coverage
Test: idaholab/moose fluid_properties: #31706 (f8ed4a) with base bb0a08 Lines: 118 195 60.5 %
Date: 2025-11-03 17:24:35 Functions: 30 46 65.2 %
Legend: Lines: hit not hit

          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             : #include "HeliumFluidProperties.h"
      11             : 
      12             : registerMooseObject("FluidPropertiesApp", HeliumFluidProperties);
      13             : 
      14             : InputParameters
      15          22 : HeliumFluidProperties::validParams()
      16             : {
      17          22 :   InputParameters params = SinglePhaseFluidProperties::validParams();
      18          22 :   params.addClassDescription("Fluid properties for helium");
      19          22 :   return params;
      20           0 : }
      21             : 
      22          11 : HeliumFluidProperties::HeliumFluidProperties(const InputParameters & parameters)
      23          11 :   : SinglePhaseFluidProperties(parameters), _cv(3117.0), _cp(5195.0)
      24             : {
      25          11 : }
      26             : 
      27             : std::string
      28           1 : HeliumFluidProperties::fluidName() const
      29             : {
      30           1 :   return "helium";
      31             : }
      32             : 
      33             : Real
      34           1 : HeliumFluidProperties::e_from_p_rho(Real p, Real rho) const
      35             : {
      36             :   // Initial guess using ideal gas law
      37           1 :   Real e = p / (_cp / _cv - 1.) / rho;
      38           1 :   const Real v = 1. / rho;
      39             : 
      40             :   Real p_from_props, dp_dv, dp_de;
      41             :   const unsigned int max_its = 10;
      42             :   unsigned int it = 0;
      43             : 
      44             :   do
      45             :   {
      46           2 :     p_from_v_e(v, e, p_from_props, dp_dv, dp_de);
      47             :     const Real & jacobian = dp_de;
      48           2 :     const Real residual = p_from_props - p;
      49             : 
      50           2 :     if (std::abs(residual) / p < 1e-12)
      51             :       break;
      52             : 
      53           1 :     const Real delta_e = -residual / jacobian;
      54           1 :     e += delta_e;
      55           1 :   } while (++it < max_its);
      56             : 
      57           1 :   if (it >= max_its)
      58           0 :     mooseWarning("The e_from_p_rho iteration failed to converge");
      59             : 
      60           1 :   return e;
      61             : }
      62             : 
      63             : ADReal
      64           0 : HeliumFluidProperties::e_from_p_rho(const ADReal & p, const ADReal & rho) const
      65             : {
      66             :   // Initial guess using ideal gas law
      67           0 :   ADReal e = p / (_cp / _cv - 1.) / rho;
      68           0 :   const ADReal v = 1. / rho;
      69             : 
      70             :   ADReal p_from_props, dp_dv, dp_de;
      71             :   const unsigned int max_its = 10;
      72             :   unsigned int it = 0;
      73             : 
      74             :   do
      75             :   {
      76           0 :     p_from_v_e(v, e, p_from_props, dp_dv, dp_de);
      77             :     const ADReal & jacobian = dp_de;
      78             :     const ADReal residual = p_from_props - p;
      79             : 
      80           0 :     if (std::abs(residual.value()) / p.value() < 1e-12)
      81             :       break;
      82             : 
      83           0 :     const ADReal delta_e = -residual / jacobian;
      84           0 :     e += delta_e;
      85           0 :   } while (++it < max_its);
      86             : 
      87           0 :   if (it >= max_its)
      88           0 :     mooseWarning("The e_from_p_rho iteration failed to converge");
      89             : 
      90           0 :   return e;
      91             : }
      92             : 
      93             : Real
      94          10 : HeliumFluidProperties::p_from_v_e(Real v, Real e) const
      95             : {
      96          10 :   Real T = T_from_v_e(v, e);
      97          10 :   return T / (48.14 * v - 0.4446 / std::pow(T, 0.2)) * 1.0e5;
      98             : }
      99             : 
     100             : ADReal
     101           0 : HeliumFluidProperties::p_from_v_e(const ADReal & v, const ADReal & e) const
     102             : {
     103             :   using std::pow;
     104           0 :   const ADReal T = T_from_v_e(v, e);
     105           0 :   return T / (48.14 * v - 0.4446 / pow(T, 0.2)) * 1.0e5;
     106             : }
     107             : 
     108             : void
     109           3 : HeliumFluidProperties::p_from_v_e(Real v, Real e, Real & p, Real & dp_dv, Real & dp_de) const
     110             : {
     111           3 :   p = p_from_v_e(v, e);
     112             : 
     113             :   Real T, dT_dv, dT_de;
     114           3 :   T_from_v_e(v, e, T, dT_dv, dT_de);
     115             : 
     116           3 :   Real val = 48.14 * v - 0.4446 / std::pow(T, 0.2);
     117           3 :   Real dp_dT = 1.0e5 / val - 0.4446 * 0.2e5 * std::pow(T, -0.2) / (val * val);
     118             : 
     119           3 :   dp_dv = -48.14e5 * T / (val * val); // taking advantage of dT_dv = 0.0;
     120           3 :   dp_de = dp_dT * dT_de;
     121           3 : }
     122             : 
     123             : void
     124           0 : HeliumFluidProperties::p_from_v_e(
     125             :     const ADReal & v, const ADReal & e, ADReal & p, ADReal & dp_dv, ADReal & dp_de) const
     126             : {
     127             :   using std::pow;
     128           0 :   p = p_from_v_e(v, e);
     129             : 
     130             :   ADReal T, dT_dv, dT_de;
     131           0 :   T_from_v_e(v, e, T, dT_dv, dT_de);
     132             : 
     133           0 :   auto val = 48.14 * v - 0.4446 / pow(T, 0.2);
     134           0 :   auto dp_dT = 1.0e5 / val - 0.4446 * 0.2e5 * pow(T, -0.2) / (val * val);
     135             : 
     136           0 :   dp_dv = -48.14e5 * T / (val * val); // taking advantage of dT_dv = 0.0;
     137           0 :   dp_de = dp_dT * dT_de;
     138           0 : }
     139             : 
     140             : Real
     141           0 : HeliumFluidProperties::p_from_T_v(const Real T, const Real v) const
     142             : {
     143             :   // Formula taken from p_from_v_e method
     144           0 :   return T / (48.14 * v - 0.4446 / std::pow(T, 0.2)) * 1.0e5;
     145             : }
     146             : 
     147             : ADReal
     148           0 : HeliumFluidProperties::p_from_T_v(const ADReal & T, const ADReal & v) const
     149             : {
     150             :   using std::pow;
     151             :   // Formula taken from p_from_v_e method
     152           0 :   return T / (48.14 * v - 0.4446 / pow(T, 0.2)) * 1.0e5;
     153             : }
     154             : 
     155             : Real
     156           0 : HeliumFluidProperties::e_from_T_v(const Real T, const Real /*v*/) const
     157             : {
     158             :   // Formula taken from e_from_p_T method
     159           0 :   return _cv * T;
     160             : }
     161             : 
     162             : void
     163           0 : HeliumFluidProperties::e_from_T_v(
     164             :     const Real T, const Real v, Real & e, Real & de_dT, Real & de_dv) const
     165             : {
     166           0 :   e = e_from_T_v(T, v);
     167           0 :   de_dT = _cv;
     168           0 :   de_dv = 0;
     169           0 : }
     170             : 
     171             : ADReal
     172           0 : HeliumFluidProperties::e_from_T_v(const ADReal & T, const ADReal & /*v*/) const
     173             : {
     174             :   // Formula taken from e_from_p_T method
     175           0 :   return _cv * T;
     176             : }
     177             : 
     178             : void
     179           0 : HeliumFluidProperties::e_from_T_v(
     180             :     const ADReal & T, const ADReal & v, ADReal & e, ADReal & de_dT, ADReal & de_dv) const
     181             : {
     182           0 :   e = e_from_T_v(T, v);
     183           0 :   de_dT = _cv;
     184           0 :   de_dv = 0;
     185           0 : }
     186             : 
     187             : Real
     188          22 : HeliumFluidProperties::T_from_v_e(Real /*v*/, Real e) const
     189             : {
     190          22 :   return e / _cv;
     191             : }
     192             : 
     193             : ADReal
     194           0 : HeliumFluidProperties::T_from_v_e(const ADReal & /*v*/, const ADReal & e) const
     195             : {
     196           0 :   return e / _cv;
     197             : }
     198             : 
     199             : void
     200           4 : HeliumFluidProperties::T_from_v_e(Real v, Real e, Real & T, Real & dT_dv, Real & dT_de) const
     201             : {
     202           4 :   T = T_from_v_e(v, e);
     203           4 :   dT_dv = 0.0;
     204           4 :   dT_de = 1.0 / _cv;
     205           4 : }
     206             : 
     207             : void
     208           0 : HeliumFluidProperties::T_from_v_e(
     209             :     const ADReal & v, const ADReal & e, ADReal & T, ADReal & dT_dv, ADReal & dT_de) const
     210             : {
     211           0 :   T = SinglePhaseFluidProperties::T_from_v_e(v, e);
     212           0 :   dT_dv = 0.0;
     213           0 :   dT_de = 1.0 / _cv;
     214           0 : }
     215             : 
     216             : Real
     217           1 : HeliumFluidProperties::T_from_p_h(Real /* p */, Real h) const
     218             : {
     219           1 :   return h / _cp;
     220             : }
     221             : 
     222             : ADReal
     223           0 : HeliumFluidProperties::T_from_p_h(const ADReal & /* p */, const ADReal & h) const
     224             : {
     225           0 :   return h / _cp;
     226             : }
     227             : 
     228             : Real
     229           0 : HeliumFluidProperties::c_from_v_e(Real v, Real e) const
     230             : {
     231           0 :   Real p = p_from_v_e(v, e);
     232           0 :   Real T = T_from_v_e(v, e);
     233             : 
     234             :   Real rho, drho_dp, drho_dT;
     235           0 :   rho_from_p_T(p, T, rho, drho_dp, drho_dT);
     236             : 
     237           0 :   Real c2 = -(p / rho / rho - _cv / drho_dT) / (_cv * drho_dp / drho_dT);
     238           0 :   return std::sqrt(c2);
     239             : }
     240             : 
     241             : void
     242           0 : HeliumFluidProperties::c_from_v_e(Real v, Real e, Real & c, Real & dc_dv, Real & dc_de) const
     243             : {
     244             :   using std::sqrt;
     245             : 
     246           0 :   ADReal myv = v;
     247             :   Moose::derivInsert(myv.derivatives(), 0, 1);
     248             :   Moose::derivInsert(myv.derivatives(), 1, 0);
     249           0 :   ADReal mye = e;
     250             :   Moose::derivInsert(mye.derivatives(), 0, 0);
     251             :   Moose::derivInsert(mye.derivatives(), 1, 1);
     252             : 
     253           0 :   auto p = SinglePhaseFluidProperties::p_from_v_e(myv, mye);
     254           0 :   auto T = SinglePhaseFluidProperties::T_from_v_e(myv, mye);
     255             : 
     256             :   ADReal rho, drho_dp, drho_dT;
     257           0 :   rho_from_p_T(p, T, rho, drho_dp, drho_dT);
     258             : 
     259           0 :   auto cc = sqrt(-(p / rho / rho - _cv / drho_dT) / (_cv * drho_dp / drho_dT));
     260           0 :   c = cc.value();
     261           0 :   dc_dv = cc.derivatives()[0];
     262           0 :   dc_de = cc.derivatives()[1];
     263           0 : }
     264             : 
     265             : Real
     266           7 : HeliumFluidProperties::cp_from_v_e(Real /*v*/, Real /*e*/) const
     267             : {
     268           7 :   return _cp;
     269             : }
     270             : 
     271             : void
     272           1 : HeliumFluidProperties::cp_from_v_e(Real v, Real e, Real & cp, Real & dcp_dv, Real & dcp_de) const
     273             : {
     274           1 :   cp = cp_from_v_e(v, e);
     275           1 :   dcp_dv = 0.0;
     276           1 :   dcp_de = 0.0;
     277           1 : }
     278             : 
     279             : Real
     280           7 : HeliumFluidProperties::cv_from_v_e(Real /*v*/, Real /*e*/) const
     281             : {
     282           7 :   return _cv;
     283             : }
     284             : 
     285             : void
     286           1 : HeliumFluidProperties::cv_from_v_e(Real v, Real e, Real & cv, Real & dcv_dv, Real & dcv_de) const
     287             : {
     288           1 :   cv = cv_from_v_e(v, e);
     289           1 :   dcv_dv = 0.0;
     290           1 :   dcv_de = 0.0;
     291           1 : }
     292             : 
     293             : Real
     294           1 : HeliumFluidProperties::mu_from_v_e(Real v, Real e) const
     295             : {
     296           1 :   return 3.674e-7 * std::pow(T_from_v_e(v, e), 0.7);
     297             : }
     298             : 
     299             : Real
     300           1 : HeliumFluidProperties::k_from_v_e(Real v, Real e) const
     301             : {
     302           1 :   Real p_in_bar = p_from_v_e(v, e) * 1.0e-5;
     303           1 :   Real T = T_from_v_e(v, e);
     304           1 :   return 2.682e-3 * (1.0 + 1.123e-3 * p_in_bar) * std::pow(T, 0.71 * (1.0 - 2.0e-4 * p_in_bar));
     305             : }
     306             : 
     307             : Real
     308           0 : HeliumFluidProperties::beta_from_p_T(Real pressure, Real temperature) const
     309             : {
     310             :   Real rho;
     311             :   Real drho_dT;
     312             :   Real drho_dp;
     313           0 :   rho_from_p_T(pressure, temperature, rho, drho_dp, drho_dT);
     314             : 
     315           0 :   return -drho_dT / rho;
     316             : }
     317             : 
     318             : Real
     319          14 : HeliumFluidProperties::rho_from_p_T(Real pressure, Real temperature) const
     320             : {
     321          14 :   Real p_in_bar = pressure * 1.0e-5;
     322          14 :   return 48.14 * p_in_bar / (temperature + 0.4446 * p_in_bar / std::pow(temperature, 0.2));
     323             : }
     324             : 
     325             : void
     326           1 : HeliumFluidProperties::rho_from_p_T(
     327             :     Real pressure, Real temperature, Real & rho, Real & drho_dp, Real & drho_dT) const
     328             : {
     329           1 :   rho = rho_from_p_T(pressure, temperature);
     330           1 :   Real val = 1.0 / (temperature + 0.4446e-5 * pressure / std::pow(temperature, 0.2));
     331           1 :   drho_dp = 48.14e-5 * (val - 0.4446e-5 * pressure * val * val / std::pow(temperature, 0.2));
     332           1 :   drho_dT =
     333           1 :       -48.14e-5 * pressure * val * val * (1.0 - 0.08892e-5 * pressure / std::pow(temperature, 1.2));
     334           1 : }
     335             : 
     336             : void
     337           0 : HeliumFluidProperties::rho_from_p_T(const ADReal & pressure,
     338             :                                     const ADReal & temperature,
     339             :                                     ADReal & rho,
     340             :                                     ADReal & drho_dp,
     341             :                                     ADReal & drho_dT) const
     342             : {
     343             :   using std::pow;
     344           0 :   rho = SinglePhaseFluidProperties::rho_from_p_T(pressure, temperature);
     345           0 :   auto val = 1.0 / (temperature + 0.4446e-5 * pressure / pow(temperature, 0.2));
     346           0 :   drho_dp = 48.14e-5 * (val - 0.4446e-5 * pressure * val * val / pow(temperature, 0.2));
     347             :   drho_dT =
     348           0 :       -48.14e-5 * pressure * val * val * (1.0 - 0.08892e-5 * pressure / pow(temperature, 1.2));
     349           0 : }
     350             : 
     351             : Real
     352          13 : HeliumFluidProperties::e_from_p_T(Real /*pressure*/, Real temperature) const
     353             : {
     354          13 :   return _cv * temperature;
     355             : }
     356             : 
     357             : void
     358           1 : HeliumFluidProperties::e_from_p_T(
     359             :     Real pressure, Real temperature, Real & e, Real & de_dp, Real & de_dT) const
     360             : {
     361           1 :   e = e_from_p_T(pressure, temperature);
     362           1 :   de_dp = 0.0;
     363           1 :   de_dT = _cv;
     364           1 : }
     365             : 
     366             : Real
     367           8 : HeliumFluidProperties::h_from_p_T(Real /*pressure*/, Real temperature) const
     368             : {
     369           8 :   return _cp * temperature;
     370             : }
     371             : 
     372             : void
     373           1 : HeliumFluidProperties::h_from_p_T(
     374             :     Real pressure, Real temperature, Real & h, Real & dh_dp, Real & dh_dT) const
     375             : {
     376           1 :   h = h_from_p_T(pressure, temperature);
     377           1 :   dh_dp = 0.0;
     378           1 :   dh_dT = _cp;
     379           1 : }
     380             : 
     381             : Real
     382           1 : HeliumFluidProperties::molarMass() const
     383             : {
     384           1 :   return 4.002602e-3;
     385             : }
     386             : 
     387             : Real
     388           7 : HeliumFluidProperties::cp_from_p_T(Real /*pressure*/, Real /*temperature*/) const
     389             : {
     390           7 :   return _cp;
     391             : }
     392             : 
     393             : void
     394           1 : HeliumFluidProperties::cp_from_p_T(
     395             :     Real pressure, Real temperature, Real & cp, Real & dcp_dp, Real & dcp_dT) const
     396             : {
     397           1 :   cp = cp_from_p_T(pressure, temperature);
     398           1 :   dcp_dp = 0.0;
     399           1 :   dcp_dT = 0.0;
     400           1 : }
     401             : 
     402             : Real
     403           7 : HeliumFluidProperties::cv_from_p_T(Real /*pressure*/, Real /*temperature*/) const
     404             : {
     405           7 :   return _cv;
     406             : }
     407             : 
     408             : void
     409           1 : HeliumFluidProperties::cv_from_p_T(
     410             :     Real pressure, Real temperature, Real & cv, Real & dcv_dp, Real & dcv_dT) const
     411             : {
     412           1 :   cv = cv_from_p_T(pressure, temperature);
     413           1 :   dcv_dp = 0.0;
     414           1 :   dcv_dT = 0.0;
     415           1 : }
     416             : 
     417             : Real
     418           7 : HeliumFluidProperties::mu_from_p_T(Real /*pressure*/, Real temperature) const
     419             : {
     420           7 :   return 3.674e-7 * std::pow(temperature, 0.7);
     421             : }
     422             : 
     423             : void
     424           1 : HeliumFluidProperties::mu_from_p_T(
     425             :     Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const
     426             : {
     427           1 :   mu = mu_from_p_T(pressure, temperature);
     428           1 :   dmu_dp = 0.0;
     429           1 :   dmu_dT = 3.674e-7 * 0.7 * std::pow(temperature, -0.3);
     430           1 : }
     431             : 
     432             : Real
     433           7 : HeliumFluidProperties::k_from_p_T(Real pressure, Real temperature) const
     434             : {
     435           7 :   return 2.682e-3 * (1.0 + 1.123e-8 * pressure) *
     436           7 :          std::pow(temperature, 0.71 * (1.0 - 2.0e-9 * pressure));
     437             : }
     438             : 
     439             : void
     440           1 : HeliumFluidProperties::k_from_p_T(
     441             :     Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const
     442             : {
     443           1 :   k = k_from_p_T(pressure, temperature);
     444             : 
     445           1 :   Real term = 1.0 + 1.123e-8 * pressure;
     446           1 :   Real exp = 0.71 * (1.0 - 2.0e-9 * pressure);
     447             : 
     448           1 :   dk_dp = 2.682e-3 * (term * 0.71 * (-2.0e-9) * std::log(temperature) * std::pow(temperature, exp) +
     449           1 :                       std::pow(temperature, exp) * 1.123e-8);
     450             : 
     451           1 :   dk_dT = 2.682e-3 * term * exp * std::pow(temperature, exp - 1.0);
     452           1 : }

Generated by: LCOV version 1.14