most of these people like to inflict pain on themselfs (i.e., warnings in their own code), but they usually don't like if pain is inflicted on them by others (i.e., warnings produced by external code which they use). This patch should make these kinds of people happy. I'm not really sure if the code is easier to understand with this, but at least clang does not complain for most of the warnings of "-Weverything" anymore.
315 lines
10 KiB
C++
315 lines
10 KiB
C++
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
// vi: set et ts=4 sw=4 sts=4:
|
|
/*
|
|
Copyright (C) 2009-2013 by Andreas Lauser
|
|
Copyright (C) 2011 by Benjamin Faigle
|
|
Copyright (C) 2010 by Katherina Baber
|
|
Copyright (C) 2011-2012 by Philipp Nuske
|
|
|
|
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::N2
|
|
*/
|
|
#ifndef OPM_N2_HPP
|
|
#define OPM_N2_HPP
|
|
|
|
#include <opm/material/IdealGas.hpp>
|
|
#include <opm/material/common/MathToolbox.hpp>
|
|
|
|
#include "Component.hpp"
|
|
|
|
#include <cmath>
|
|
|
|
namespace Opm
|
|
{
|
|
|
|
/*!
|
|
* \ingroup Components
|
|
*
|
|
* \brief Properties of pure molecular nitrogen \f$N_2\f$.
|
|
*
|
|
* \tparam Scalar The type used for scalar values
|
|
*/
|
|
template <class Scalar>
|
|
class N2 : public Component<Scalar, N2<Scalar> >
|
|
{
|
|
typedef Opm::IdealGas<Scalar> IdealGas;
|
|
|
|
public:
|
|
/*!
|
|
* \brief A human readable name for nitrogen.
|
|
*/
|
|
static const char *name()
|
|
{ return "N2"; }
|
|
|
|
/*!
|
|
* \brief The molar mass in \f$\mathrm{[kg/mol]}\f$ of molecular nitrogen.
|
|
*/
|
|
static Scalar molarMass()
|
|
{ return 28.0134e-3;}
|
|
|
|
/*!
|
|
* \brief Returns the critical temperature \f$\mathrm{[K]}\f$ of molecular nitrogen
|
|
*/
|
|
static Scalar criticalTemperature()
|
|
{ return 126.192; /* [K] */ }
|
|
|
|
/*!
|
|
* \brief Returns the critical pressure \f$\mathrm{[Pa]}\f$ of molecular nitrogen.
|
|
*/
|
|
static Scalar criticalPressure()
|
|
{ return 3.39858e6; /* [N/m^2] */ }
|
|
|
|
/*!
|
|
* \brief Returns the temperature \f$\mathrm{[K]}\f$ at molecular nitrogen's triple point.
|
|
*/
|
|
static Scalar tripleTemperature()
|
|
{ return 63.151; /* [K] */ }
|
|
|
|
/*!
|
|
* \brief Returns the pressure \f$\mathrm{[Pa]}\f$ at molecular nitrogen's triple point.
|
|
*/
|
|
static Scalar triplePressure()
|
|
{ return 12.523e3; /* [N/m^2] */ }
|
|
|
|
/*!
|
|
* \brief The vapor pressure in \f$\mathrm{[Pa]}\f$ of pure molecular nitrogen
|
|
* at a given temperature.
|
|
*
|
|
*\param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
*
|
|
* Taken from:
|
|
*
|
|
* R. Span, E.W. Lemmon, et al.: "A Reference Equation of State
|
|
* for the Thermodynamic Properties of Nitrogen for Temperatures
|
|
* from 63.151 to 1000 K and Pressures to 2200 MPa", Journal of
|
|
* Physical and Chemical Refefence Data, Vol. 29, No. 6,
|
|
* pp. 1361-1433
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation vaporPressure(const Evaluation& temperature)
|
|
{
|
|
typedef MathToolbox<Evaluation> Toolbox;
|
|
|
|
if (temperature > criticalTemperature())
|
|
return criticalPressure();
|
|
if (temperature < tripleTemperature())
|
|
return 0; // N2 is solid: We don't take sublimation into
|
|
// account
|
|
|
|
// note: this is the ancillary equation given on page 1368
|
|
const Evaluation& sigma = 1.0 - temperature/criticalTemperature();
|
|
const Evaluation& sqrtSigma = Toolbox::sqrt(sigma);
|
|
const Scalar N1 = -6.12445284;
|
|
const Scalar N2 = 1.26327220;
|
|
const Scalar N3 = -0.765910082;
|
|
const Scalar N4 = -1.77570564;
|
|
return
|
|
criticalPressure() *
|
|
Toolbox::exp(criticalTemperature()/temperature*
|
|
(sigma*(N1 +
|
|
sqrtSigma*N2 +
|
|
sigma*(sqrtSigma*N3 +
|
|
sigma*sigma*sigma*N4))));
|
|
}
|
|
|
|
/*!
|
|
* \brief The density \f$\mathrm{[kg/m^3]}\f$ of \f$N_2\f$ gas at a given pressure and temperature.
|
|
*
|
|
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasDensity(const Evaluation& temperature, const Evaluation& pressure)
|
|
{
|
|
// Assume an ideal gas
|
|
return IdealGas::density(Evaluation(molarMass()), temperature, pressure);
|
|
}
|
|
|
|
/*!
|
|
* \brief Returns true iff the gas phase is assumed to be compressible
|
|
*/
|
|
static bool gasIsCompressible()
|
|
{ return true; }
|
|
|
|
/*!
|
|
* \brief Returns true iff the gas phase is assumed to be ideal
|
|
*/
|
|
static bool gasIsIdeal()
|
|
{ return true; }
|
|
|
|
/*!
|
|
* \brief The pressure of gaseous \f$N_2\f$ in \f$\mathrm{[Pa]}\f$ at a given density and temperature.
|
|
*
|
|
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
* \param density density of component in \f$\mathrm{[kg/m^3]}\f$
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasPressure(const Evaluation& temperature, const Evaluation& density)
|
|
{
|
|
// Assume an ideal gas
|
|
return IdealGas::pressure(temperature, density/molarMass());
|
|
}
|
|
|
|
/*!
|
|
* \brief Specific enthalpy \f$\mathrm{[J/kg]}\f$ of pure nitrogen gas.
|
|
*
|
|
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
|
|
*
|
|
* See: R. Reid, et al.: The Properties of Gases and Liquids, 4th
|
|
* edition, McGraw-Hill, 1987, pp 154, 657, 665
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasEnthalpy(const Evaluation& temperature,
|
|
const Evaluation& /*pressure*/)
|
|
{
|
|
// method of Joback
|
|
const Scalar cpVapA = 31.15;
|
|
const Scalar cpVapB = -0.01357;
|
|
const Scalar cpVapC = 2.680e-5;
|
|
const Scalar cpVapD = -1.168e-8;
|
|
|
|
// calculate: \int_0^T c_p dT
|
|
return
|
|
1/molarMass()* // conversion from [J/(mol K)] to [J/(kg K)]
|
|
|
|
temperature*(cpVapA + temperature*
|
|
(cpVapB/2 + temperature*
|
|
(cpVapC/3 + temperature*
|
|
(cpVapD/4))));
|
|
|
|
//#warning NIST DATA STUPID INTERPOLATION
|
|
// Scalar T2 = 300.;
|
|
// Scalar T1 = 285.;
|
|
// Scalar h2 = 311200.;
|
|
// Scalar h1 = 295580.;
|
|
// Scalar h = h1+ (h2-h1) / (T2-T1) * (T-T1);
|
|
// return h ;
|
|
}
|
|
|
|
/*!
|
|
* \brief Specific enthalpy \f$\mathrm{[J/kg]}\f$ of pure nitrogen gas.
|
|
*
|
|
* Definition of enthalpy: \f$h= u + pv = u + p / \rho\f$.
|
|
*
|
|
* Rearranging for internal energy yields: \f$u = h - pv\f$.
|
|
*
|
|
* Exploiting the Ideal Gas assumption (\f$pv = R_{\textnormal{specific}} T\f$)gives: \f$u = h - R / M T \f$.
|
|
*
|
|
* The universal gas constant can only be used in the case of molar formulations.
|
|
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasInternalEnergy(const Evaluation& temperature,
|
|
const Evaluation& pressure)
|
|
{
|
|
return
|
|
gasEnthalpy(temperature, pressure) -
|
|
1/molarMass()* // conversion from [J/(mol K)] to [J/(kg K)]
|
|
IdealGas::R*temperature; // = pressure * spec. volume for an ideal gas
|
|
}
|
|
|
|
/*!
|
|
* \brief Specific isobaric heat capacity \f$[J/(kg K)]\f$ of pure
|
|
* nitrogen gas.
|
|
*
|
|
* This is equivalent to the partial derivative of the specific
|
|
* enthalpy to the temperature.
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasHeatCapacity(const Evaluation& temperature,
|
|
const Evaluation& /*pressure*/)
|
|
{
|
|
// method of Joback
|
|
const Scalar cpVapA = 31.15;
|
|
const Scalar cpVapB = -0.01357;
|
|
const Scalar cpVapC = 2.680e-5;
|
|
const Scalar cpVapD = -1.168e-8;
|
|
|
|
return
|
|
1/molarMass()* // conversion from [J/(mol K)] to [J/(kg K)]
|
|
|
|
cpVapA + temperature*
|
|
(cpVapB + temperature*
|
|
(cpVapC + temperature*
|
|
(cpVapD)));
|
|
}
|
|
|
|
/*!
|
|
* \brief The dynamic viscosity \f$\mathrm{[Pa*s]}\f$ of \f$N_2\f$ at a given pressure and temperature.
|
|
*
|
|
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
|
|
*
|
|
* See:
|
|
*
|
|
* See: R. Reid, et al.: The Properties of Gases and Liquids,
|
|
* 4th edition, McGraw-Hill, 1987, pp 396-397,
|
|
* 5th edition, McGraw-Hill, 2001 pp 9.7-9.8 (omega and V_c taken from p. A.19)
|
|
*
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasViscosity(const Evaluation& temperature, const Evaluation& /*pressure*/)
|
|
{
|
|
typedef MathToolbox<Evaluation> Toolbox;
|
|
|
|
const Scalar Tc = criticalTemperature();
|
|
const Scalar Vc = 90.1; // critical specific volume [cm^3/mol]
|
|
const Scalar omega = 0.037; // accentric factor
|
|
const Scalar M = molarMass() * 1e3; // molar mas [g/mol]
|
|
const Scalar dipole = 0.0; // dipole moment [debye]
|
|
|
|
Scalar mu_r4 = 131.3 * dipole / std::sqrt(Vc * Tc);
|
|
mu_r4 *= mu_r4;
|
|
mu_r4 *= mu_r4;
|
|
|
|
Scalar Fc = 1 - 0.2756*omega + 0.059035*mu_r4;
|
|
const Evaluation& Tstar = 1.2593 * temperature/Tc;
|
|
const Evaluation& Omega_v =
|
|
1.16145*Toolbox::pow(Tstar, -0.14874) +
|
|
0.52487*Toolbox::exp(- 0.77320*Tstar) +
|
|
2.16178*Toolbox::exp(- 2.43787*Tstar);
|
|
const Evaluation& mu = 40.785*Fc*Toolbox::sqrt(M*temperature)/(std::pow(Vc, 2./3)*Omega_v);
|
|
|
|
// convertion from micro poise to Pa s
|
|
return mu/1e6 / 10;
|
|
}
|
|
|
|
/*!
|
|
* \brief Specific heat conductivity of steam \f$\mathrm{[W/(m K)]}\f$.
|
|
*
|
|
* Isobaric Properties for Nitrogen in: NIST Standard Reference
|
|
* Database Number 69, Eds. P.J. Linstrom and W.G. Mallard
|
|
* evaluated at p=.1 MPa, T=8°C, does not change dramatically with
|
|
* p,T
|
|
*
|
|
* \param temperature temperature of component in \f$\mathrm{[K]}\f$
|
|
* \param pressure pressure of component in \f$\mathrm{[Pa]}\f$
|
|
*/
|
|
template <class Evaluation>
|
|
static Evaluation gasThermalConductivity(const Evaluation& /*temperature*/,
|
|
const Evaluation& /*pressure*/)
|
|
{ return 0.024572; }
|
|
};
|
|
|
|
} // namespace Opm
|
|
|
|
#endif
|