Files
opm-common/opm/material/components/iapws/Region1.hpp
2015-05-21 15:33:07 +02:00

375 lines
12 KiB
C++

/*
Copyright (C) 2009-2013 by Andreas Lauser
Copyright (C) 2010 by Felix Bode
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
/*!
* \file
* \copydoc Opm::IAPWS::Region1
*/
#ifndef OPM_IAPWS_REGION1_HPP
#define OPM_IAPWS_REGION1_HPP
#include <opm/material/common/MathToolbox.hpp>
#include <cmath>
namespace Opm {
namespace IAPWS {
/*!
* \ingroup IAPWS
*
* \brief Implements the equations for region 1 of the IAPWS '97 formulation.
*
* \tparam Scalar The type used for scalar values
*
* See:
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Scalar>
class Region1
{
public:
/*!
* \brief Returns true if IAPWS region 1 applies for a
* (temperature in \f$\mathrm{[K]}\f$, pressure in \f$\mathrm{[Pa]}\f$) pair.
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*/
template <class Evaluation>
static bool isValid(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
return
Toolbox::value(temperature) <= 623.15 &&
Toolbox::value(pressure) <= 100e6;
// actually this is:
/*
return
(
273.15 <= temperature &&
temperature <= 623.15 &&
pressure >= vaporPressure(temperature) &&
pressure <= 100e6
);
*/
}
/*!
* \brief Returns the reduced temperature for IAPWS region 1.
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
*/
template <class Evaluation>
static Evaluation tau(const Evaluation& temperature)
{ return 1386.0 / temperature; }
/*!
* \brief Returns the derivative of the reduced temperature to the
* temperature for IAPWS region 1 in \f$\mathrm{[1/K]}\f$.
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
*/
template <class Evaluation>
static Evaluation dtau_dT(const Evaluation& temperature)
{ return - 1386.0 / (temperature*temperature); }
/*!
* \brief Returns the reduced pressure for IAPWS region 1.
*
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*/
template <class Evaluation>
static Evaluation pi(const Evaluation& pressure)
{ return pressure / 16.53e6; }
/*!
* \brief Returns the derivative of the reduced pressure to the
* pressure for IAPWS region 1 in \f$\mathrm{[1/Pa]}\f$.
*
* \param pressure temperature of component in \f$\mathrm{[Pa]}\f$
*/
static Scalar dpi_dp(Scalar pressure)
{ return 1.0 / 16.53e6; }
/*!
* \brief Returns the derivative of the pressure to the
* reduced pressure for IAPWS region 1 in \f$\mathrm{[Pa]}\f$.
*
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*/
static Scalar dp_dpi(Scalar pressure)
{ return 16.53e6; }
/*!
* \brief The Gibbs free energy (dimensionless) for IAPWS region 1 (i.e. liquid)
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Evaluation>
static Evaluation gamma(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
const Evaluation tau_ = tau(temperature); /* reduced temperature */
const Evaluation pi_ = pi(pressure); /* reduced pressure */
Evaluation result = 0;
for (int i = 0; i < 34; ++i) {
result += n(i)*Toolbox::pow(7.1 - pi_, I(i))*Toolbox::pow(tau_ - 1.222, J(i));
}
return result;
}
/*!
* \brief The partial derivative of the Gibbs free energy to the
* normalized temperature for IAPWS region 1 (i.e. liquid) (dimensionless).
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Evaluation>
static Evaluation dgamma_dtau(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
const Evaluation tau_ = tau(temperature); /* reduced temperature */
const Evaluation pi_ = pi(pressure); /* reduced pressure */
Evaluation result = Toolbox::createConstant(0.0);
for (int i = 0; i < 34; i++) {
result +=
n(i) *
Toolbox::pow(7.1 - pi_, static_cast<Scalar>(I(i))) *
Toolbox::pow(tau_ - 1.222, static_cast<Scalar>(J(i)-1)) *
J(i);
}
return result;
}
/*!
* \brief The partial derivative of the Gibbs free energy to the
* normalized pressure for IAPWS region 1 (i.e. liquid) dimensionless).
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Evaluation>
static Evaluation dgamma_dpi(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
const Evaluation tau_ = tau(temperature); /* reduced temperature */
const Evaluation pi_ = pi(pressure); /* reduced pressure */
Evaluation result = Toolbox::createConstant(0.0);
for (int i = 0; i < 34; i++) {
result +=
-n(i) *
I(i) *
Toolbox::pow(7.1 - pi_, static_cast<Scalar>(I(i) - 1)) *
Toolbox::pow(tau_ - 1.222, static_cast<Scalar>(J(i)));
}
return result;
}
/*!
* \brief The partial derivative of the Gibbs free energy to the
* normalized pressure and to the normalized temperature
* for IAPWS region 1 (i.e. liquid water) (dimensionless).
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Evaluation>
static Evaluation ddgamma_dtaudpi(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
const Evaluation tau_ = tau(temperature); /* reduced temperature */
const Evaluation pi_ = pi(pressure); /* reduced pressure */
Evaluation result = Toolbox::createConstant(0.0);
for (int i = 0; i < 34; i++) {
result +=
-n(i) *
I(i) *
J(i) *
Toolbox::pow(7.1 - pi_, static_cast<Scalar>(I(i) - 1)) *
Toolbox::pow(tau_ - 1.222, static_cast<Scalar>(J(i) - 1));
}
return result;
}
/*!
* \brief The second partial derivative of the Gibbs free energy
* to the normalized pressure for IAPWS region 1
* (i.e. liquid water) (dimensionless).
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Evaluation>
static Evaluation ddgamma_ddpi(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
const Evaluation tau_ = tau(temperature); /* reduced temperature */
const Evaluation pi_ = pi(pressure); /* reduced pressure */
Evaluation result = Toolbox::createConstant(0.0);
for (int i = 0; i < 34; i++) {
result +=
n(i) *
I(i) *
(I(i) - 1) *
Toolbox::pow(7.1 - pi_, I(i) - 2) *
Toolbox::pow(tau_ - 1.222, J(i));
}
return result;
}
/*!
* \brief The second partial derivative of the Gibbs free energy to the
* normalized temperature for IAPWS region 1 (i.e. liquid) (dimensionless).
*
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
*
* IAPWS: "Revised Release on the IAPWS Industrial Formulation
* 1997 for the Thermodynamic Properties of Water and Steam",
* http://www.iapws.org/relguide/IF97-Rev.pdf
*/
template <class Evaluation>
static Evaluation ddgamma_ddtau(const Evaluation& temperature, const Evaluation& pressure)
{
typedef MathToolbox<Evaluation> Toolbox;
const Evaluation tau_ = tau(temperature); /* reduced temperature */
const Evaluation pi_ = pi(pressure); /* reduced pressure */
Evaluation result = Toolbox::createConstant(0.0);
for (int i = 0; i < 34; i++) {
result +=
n(i) *
Toolbox::pow(7.1 - pi_, I(i)) *
J(i) *
(J(i) - 1) *
Toolbox::pow(tau_ - 1.222, J(i) - 2);
}
return result;
}
private:
static Scalar n(int i)
{
static const Scalar n[34] = {
0.14632971213167, -0.84548187169114, -0.37563603672040e1,
0.33855169168385e1, -0.95791963387872, 0.15772038513228,
-0.16616417199501e-1, 0.81214629983568e-3, 0.28319080123804e-3,
-0.60706301565874e-3, -0.18990068218419e-1, -0.32529748770505e-1,
-0.21841717175414e-1, -0.52838357969930e-4, -0.47184321073267e-3,
-0.30001780793026e-3, 0.47661393906987e-4, -0.44141845330846e-5,
-0.72694996297594e-15,-0.31679644845054e-4, -0.28270797985312e-5,
-0.85205128120103e-9, -0.22425281908000e-5, -0.65171222895601e-6,
-0.14341729937924e-12,-0.40516996860117e-6, -0.12734301741641e-8,
-0.17424871230634e-9, -0.68762131295531e-18, 0.14478307828521e-19,
0.26335781662795e-22,-0.11947622640071e-22, 0.18228094581404e-23,
-0.93537087292458e-25
};
return n[i];
}
static Scalar I(int i)
{
static const short int I[34] = {
0, 0, 0,
0, 0, 0,
0, 0, 1,
1, 1, 1,
1, 1, 2,
2, 2, 2,
2, 3, 3,
3, 4, 4,
4, 5, 8,
8, 21, 23,
29, 30, 31,
32
};
return I[i];
}
static Scalar J(int i)
{
static const short int J[34] = {
-2, -1, 0,
1, 2, 3,
4, 5, -9,
-7, -1, 0,
1, 3, -3,
0, 1, 3,
17, -4, 0,
6, -5, -2,
10, -8, -11,
-6, -29, -31,
-38, -39, -40,
-41
};
return J[i];
}
};
} // namespace IAPWS
} // namespace Opm
#endif