www.mooseframework.org
HelmholtzFluidProperties.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
11 #include "BrentsMethod.h"
12 #include "libmesh/utility.h"
13 
16 {
18  params.addClassDescription("Base class for Helmholtz free energy fluid EOS");
19  return params;
20 }
21 
23  : SinglePhaseFluidProperties(parameters)
24 {
25 }
26 
27 Real
29 {
30  Real density;
31  // Initial estimate of a bracketing interval for the density
32  Real lower_density = 1.0e-2;
33  Real upper_density = 100.0;
34 
35  // The density is found by finding the zero of the pressure
36  auto pressure_diff = [&pressure, &temperature, this](Real x)
37  { return this->p_from_rho_T(x, temperature) - pressure; };
38 
39  BrentsMethod::bracket(pressure_diff, lower_density, upper_density);
40  density = BrentsMethod::root(pressure_diff, lower_density, upper_density);
41 
42  return density;
43 }
44 
45 void
47  Real pressure, Real temperature, Real & rho, Real & drho_dp, Real & drho_dT) const
48 {
49  rho = this->rho_from_p_T(pressure, temperature);
50 
51  // Scale the density and temperature
52  const Real delta = rho / criticalDensity();
53  const Real tau = criticalTemperature() / temperature;
54  const Real da_dd = dalpha_ddelta(delta, tau);
55  const Real d2a_dd2 = d2alpha_ddelta2(delta, tau);
56 
57  drho_dp = molarMass() / (_R * temperature * delta * (2.0 * da_dd + delta * d2a_dd2));
58  drho_dT = rho * (tau * d2alpha_ddeltatau(delta, tau) - da_dd) / temperature /
59  (2.0 * da_dd + delta * d2a_dd2);
60 }
61 
62 Real
64 {
65  // Require density first
67  // Scale the input density and temperature
68  const Real delta = density / criticalDensity();
69  const Real tau = criticalTemperature() / temperature;
70 
71  return _R * temperature * tau * dalpha_dtau(delta, tau) / molarMass();
72 }
73 
74 void
76  Real pressure, Real temperature, Real & e, Real & de_dp, Real & de_dT) const
77 {
78  e = this->e_from_p_T(pressure, temperature);
79 
80  // Require density first
82  // Scale the input density and temperature
83  const Real delta = density / criticalDensity();
84  const Real tau = criticalTemperature() / temperature;
85 
86  const Real da_dd = dalpha_ddelta(delta, tau);
87  const Real d2a_dd2 = d2alpha_ddelta2(delta, tau);
88  const Real d2a_ddt = d2alpha_ddeltatau(delta, tau);
89 
90  de_dp = tau * d2a_ddt / (density * (2.0 * da_dd + delta * d2a_dd2));
91  de_dT = -_R *
92  (delta * tau * d2a_ddt * (da_dd - tau * d2a_ddt) / (2.0 * da_dd + delta * d2a_dd2) +
93  tau * tau * d2alpha_dtau2(delta, tau)) /
94  molarMass();
95 }
96 
97 Real
99 {
100  // Require density first
102  // Scale the input density and temperature
103  const Real delta = density / criticalDensity();
104  const Real tau = criticalTemperature() / temperature;
105 
106  const Real da_dd = dalpha_ddelta(delta, tau);
107 
108  Real w = 2.0 * delta * da_dd + delta * delta * d2alpha_ddelta2(delta, tau);
109  w -= Utility::pow<2>(delta * da_dd - delta * tau * d2alpha_ddeltatau(delta, tau)) /
110  (tau * tau * d2alpha_dtau2(delta, tau));
111 
112  return std::sqrt(_R * temperature * w / molarMass());
113 }
114 
115 Real
117 {
118  // Require density first
120  // Scale the input density and temperature
121  const Real delta = density / criticalDensity();
122  const Real tau = criticalTemperature() / temperature;
123 
124  const Real da_dd = dalpha_ddelta(delta, tau);
125 
126  const Real cp = _R *
127  (-tau * tau * d2alpha_dtau2(delta, tau) +
128  Utility::pow<2>(delta * da_dd - delta * tau * d2alpha_ddeltatau(delta, tau)) /
129  (2.0 * delta * da_dd + delta * delta * d2alpha_ddelta2(delta, tau))) /
130  molarMass();
131 
132  return cp;
133 }
134 
135 Real
137 {
138  // Require density first
140  // Scale the input density and temperature
141  const Real delta = density / criticalDensity();
142  const Real tau = criticalTemperature() / temperature;
143 
144  return -_R * tau * tau * d2alpha_dtau2(delta, tau) / molarMass();
145 }
146 
147 Real
149 {
150  // Require density first
152  // Scale the input density and temperature
153  const Real delta = density / criticalDensity();
154  const Real tau = criticalTemperature() / temperature;
155 
156  return _R * (tau * dalpha_dtau(delta, tau) - alpha(delta, tau)) / molarMass();
157 }
158 
159 void
161  Real pressure, Real temperature, Real & s, Real & ds_dp, Real & ds_dT) const
162 {
163  s = this->s_from_p_T(pressure, temperature);
164 
165  // Require density first
167  // Scale the input density and temperature
168  const Real delta = density / criticalDensity();
169  const Real tau = criticalTemperature() / temperature;
170 
171  const Real da_dd = dalpha_ddelta(delta, tau);
172  const Real da_dt = dalpha_dtau(delta, tau);
173  const Real d2a_dd2 = d2alpha_ddelta2(delta, tau);
174  const Real d2a_dt2 = d2alpha_dtau2(delta, tau);
175  const Real d2a_ddt = d2alpha_ddeltatau(delta, tau);
176 
177  ds_dp = tau * (d2a_ddt - da_dd) / (density * temperature * (2.0 * da_dd + delta * d2a_dd2));
178  ds_dT = -_R * tau * (da_dt - alpha(delta, tau) + tau * (d2a_dt2 - da_dt)) /
179  (molarMass() * temperature);
180 }
181 
182 Real
184 {
185  // Require density first
187  // Scale the input density and temperature
188  const Real delta = density / criticalDensity();
189  const Real tau = criticalTemperature() / temperature;
190 
191  return _R * temperature * (tau * dalpha_dtau(delta, tau) + delta * dalpha_ddelta(delta, tau)) /
192  molarMass();
193 }
194 
195 void
197  Real pressure, Real temperature, Real & h, Real & dh_dp, Real & dh_dT) const
198 {
199  h = this->h_from_p_T(pressure, temperature);
200 
201  // Require density first
203  // Scale the input density and temperature
204  const Real delta = density / criticalDensity();
205  const Real tau = criticalTemperature() / temperature;
206 
207  const Real da_dd = dalpha_ddelta(delta, tau);
208  const Real d2a_dd2 = d2alpha_ddelta2(delta, tau);
209  const Real d2a_ddt = d2alpha_ddeltatau(delta, tau);
210 
211  dh_dp = (da_dd + delta * d2a_dd2 + tau * d2a_ddt) / (density * (2.0 * da_dd + delta * d2a_dd2));
212  dh_dT = _R *
213  (delta * da_dd * (1.0 - tau * d2a_ddt / da_dd) * (1.0 - tau * d2a_ddt / da_dd) /
214  (2.0 + delta * d2a_dd2 / da_dd) -
215  tau * tau * d2alpha_dtau2(delta, tau)) /
216  molarMass();
217 }
218 
219 Real
221 {
222  // Scale the input density and temperature
223  const Real delta = density / criticalDensity();
224  const Real tau = criticalTemperature() / temperature;
225 
226  return _R * density * temperature * delta * dalpha_ddelta(delta, tau) / molarMass();
227 }
virtual Real d2alpha_ddeltatau(Real delta, Real tau) const =0
Second derivative of Helmholtz free energy wrt delta and tau.
virtual Real d2alpha_dtau2(Real delta, Real tau) const =0
Second derivative of Helmholtz free energy wrt tau.
static InputParameters validParams()
virtual virtual std Real molarMass() const
Fluid name.
static const std::string density
Definition: NS.h:33
int delta(unsigned int i, unsigned int j)
Delta function, which returns zero if $i j$ and unity if $i=j$.
static const Real _R
Universal gas constant (J/mol/K)
virtual Real c_from_p_T(Real pressure, Real temperature) const override
static const std::string temperature
Definition: NS.h:57
virtual Real d2alpha_ddelta2(Real delta, Real tau) const =0
Second derivative of Helmholtz free energy wrt delta.
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
virtual Real cp_from_p_T(Real pressure, Real temperature) const override
static const std::string cp
Definition: NS.h:120
HelmholtzFluidProperties(const InputParameters &parameters)
virtual Real cv_from_p_T(Real pressure, Real temperature) const override
virtual Real criticalTemperature() const
Critical temperature.
virtual Real dalpha_ddelta(Real delta, Real tau) const =0
Derivative of Helmholtz free energy wrt delta.
const std::vector< double > x
Real root(std::function< Real(Real)> const &f, Real x1, Real x2, Real tol=1.0e-12)
Finds the root of a function using Brent&#39;s method.
Definition: BrentsMethod.C:61
virtual Real h_from_p_T(Real pressure, Real temperature) const override
Common class for single phase fluid properties.
virtual Real rho_from_p_T(Real pressure, Real temperature) const override
e e e e s T T T T T rho v v T h
static InputParameters validParams()
virtual Real dalpha_dtau(Real delta, Real tau) const =0
Derivative of Helmholtz free energy wrt tau.
virtual Real p_from_rho_T(Real rho, Real T) const
Pressure as a function of density and temperature.
virtual Real alpha(Real delta, Real tau) const =0
Helmholtz free energy.
virtual Real criticalDensity() const
Critical density.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real s_from_p_T(Real pressure, Real temperature) const override
static const std::string pressure
Definition: NS.h:56
void addClassDescription(const std::string &doc_string)
void bracket(std::function< Real(Real)> const &f, Real &x1, Real &x2)
Function to bracket a root of a given function.
Definition: BrentsMethod.C:17
virtual Real e_from_p_T(Real pressure, Real temperature) const override