Loading...
Searching...
No Matches
PTFlashParameterCache.hpp
Go to the documentation of this file.
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*
Copyright 2022 NORCE.
Copyright 2022 SINTEF Digital, Mathematics and Cybernetics.
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/>.
Consult the COPYING file in the top-level source directory of this
module for the precise wording of the license and the list of
copyright holders.
*/
#ifndef OPM_PTFlash_PARAMETER_CACHE_HPP
#define OPM_PTFlash_PARAMETER_CACHE_HPP
#include <opm/material/fluidsystems/ParameterCacheBase.hpp>
#include <opm/material/eos/PengRobinson.hpp>
#include <opm/material/eos/PengRobinsonParamsMixture.hpp>
#include <cassert>
namespace Opm {
template <class Scalar, class FluidSystem>
class PTFlashParameterCache
: public Opm::ParameterCacheBase<PTFlashParameterCache<Scalar, FluidSystem> >
{
using ThisType = PTFlashParameterCache<Scalar, FluidSystem>;
using ParentType = Opm::ParameterCacheBase<ThisType>;
using PengRobinson = Opm::PengRobinson<Scalar, false>; // false refer to discard some old code
enum { numPhases = FluidSystem::numPhases };
enum { oilPhaseIdx = FluidSystem::oilPhaseIdx };
enum { gasPhaseIdx = FluidSystem::gasPhaseIdx };
static_assert(static_cast<int>(oilPhaseIdx) >= 0, "Oil phase index must be non-negative");
static_assert(static_cast<int>(oilPhaseIdx) < static_cast<int>(numPhases),
"Oil phase index must be strictly less than FluidSystem's number of phases");
static_assert(static_cast<int>(gasPhaseIdx) >= 0, "Gas phase index must be non-negative");
static_assert(static_cast<int>(gasPhaseIdx) < static_cast<int>(numPhases),
"Gas phase index must be strictly less than FluidSystem's number of phases");
public:
using OilPhaseParams = Opm::PengRobinsonParamsMixture<Scalar, FluidSystem, oilPhaseIdx, /*useChi=*/false>;
using GasPhaseParams = Opm::PengRobinsonParamsMixture<Scalar, FluidSystem, gasPhaseIdx, /*useChi=*/false>;
PTFlashParameterCache()
{
VmUpToDate_[oilPhaseIdx] = false;
Valgrind::SetUndefined(Vm_[oilPhaseIdx]);
VmUpToDate_[gasPhaseIdx] = false;
Valgrind::SetUndefined(Vm_[gasPhaseIdx]);
}
template <class FluidState>
void updatePhase(const FluidState& fluidState,
unsigned phaseIdx,
int exceptQuantities = ParentType::None)
{
assert ((phaseIdx == static_cast<unsigned int>(oilPhaseIdx)) ||
(phaseIdx == static_cast<unsigned int>(gasPhaseIdx)));
updateEosParams(fluidState, phaseIdx, exceptQuantities);
// update the phase's molar volume
updateMolarVolume_(fluidState, phaseIdx);
}
template <class FluidState>
void updateSingleMoleFraction(const FluidState& fluidState,
unsigned phaseIdx,
unsigned compIdx)
{
if (phaseIdx == oilPhaseIdx)
oilPhaseParams_.updateSingleMoleFraction(fluidState, compIdx);
if (phaseIdx == gasPhaseIdx)
gasPhaseParams_.updateSingleMoleFraction(fluidState, compIdx);
else
return;
// update the phase's molar volume
updateMolarVolume_(fluidState, phaseIdx);
}
Scalar a(unsigned phaseIdx) const
{
switch (phaseIdx)
{
case oilPhaseIdx: return oilPhaseParams_.a();
case gasPhaseIdx: return gasPhaseParams_.a();
default:
throw std::logic_error("The a() parameter is only defined for "
"oil and gas phases");
};
}
Scalar b(unsigned phaseIdx) const
{
switch (phaseIdx)
{
case oilPhaseIdx: return oilPhaseParams_.b();
case gasPhaseIdx: return gasPhaseParams_.b();
default:
throw std::logic_error("The b() parameter is only defined for "
"oil and gas phase");
};
}
Scalar aPure(unsigned phaseIdx, unsigned compIdx) const
{
switch (phaseIdx)
{
case oilPhaseIdx: return oilPhaseParams_.pureParams(compIdx).a();
case gasPhaseIdx: return gasPhaseParams_.pureParams(compIdx).a();
default:
throw std::logic_error("The a() parameter is only defined for "
"oil and gas phase");
};
}
Scalar bPure(unsigned phaseIdx, unsigned compIdx) const
{
switch (phaseIdx)
{
case oilPhaseIdx: return oilPhaseParams_.pureParams(compIdx).b();
case gasPhaseIdx: return gasPhaseParams_.pureParams(compIdx).b();
default:
throw std::logic_error("The b() parameter is only defined for "
"oil and gas phase");
};
}
Scalar aCache(unsigned phaseIdx, unsigned compIdx, unsigned compJIdx) const
{
switch (phaseIdx)
{
case oilPhaseIdx: return oilPhaseParams_.getaCache(compIdx,compJIdx);
case gasPhaseIdx: return gasPhaseParams_.getaCache(compIdx,compJIdx);
default:
throw std::logic_error("The aCache() parameter is only defined for "
"oil and gas phase");
};
}
Scalar molarVolume(unsigned phaseIdx) const
{ assert(VmUpToDate_[phaseIdx]); return Vm_[phaseIdx]; }
const OilPhaseParams& oilPhaseParams() const
{ return oilPhaseParams_; }
const GasPhaseParams& gasPhaseParams() const
// { throw std::invalid_argument("gas phase does not exist");}
{ return gasPhaseParams_; }
template <class FluidState>
void updateEosParams(const FluidState& fluidState,
unsigned phaseIdx,
int exceptQuantities = ParentType::None)
{
assert ((phaseIdx == static_cast<unsigned int>(oilPhaseIdx)) ||
(phaseIdx == static_cast<unsigned int>(gasPhaseIdx)));
if (!(exceptQuantities & ParentType::Temperature))
{
updatePure_(fluidState, phaseIdx);
updateMix_(fluidState, phaseIdx);
VmUpToDate_[phaseIdx] = false;
}
else if (!(exceptQuantities & ParentType::Composition))
{
updateMix_(fluidState, phaseIdx);
VmUpToDate_[phaseIdx] = false;
}
else if (!(exceptQuantities & ParentType::Pressure)) {
VmUpToDate_[phaseIdx] = false;
}
}
protected:
template <class FluidState>
void updatePure_(const FluidState& fluidState, unsigned phaseIdx)
{
Scalar T = decay<Scalar>(fluidState.temperature(phaseIdx));
Scalar p = decay<Scalar>(fluidState.pressure(phaseIdx));
switch (phaseIdx)
{
case oilPhaseIdx: oilPhaseParams_.updatePure(T, p); break;
case gasPhaseIdx: gasPhaseParams_.updatePure(T, p); break;
}
}
template <class FluidState>
void updateMix_(const FluidState& fluidState, unsigned phaseIdx)
{
Valgrind::CheckDefined(fluidState.averageMolarMass(phaseIdx));
switch (phaseIdx)
{
case oilPhaseIdx:
oilPhaseParams_.updateMix(fluidState);
break;
case gasPhaseIdx:
gasPhaseParams_.updateMix(fluidState);
break;
}
}
template <class FluidState>
void updateMolarVolume_(const FluidState& fluidState,
unsigned phaseIdx)
{
VmUpToDate_[phaseIdx] = true;
// calculate molar volume of the phase (we will need this for the
// fugacity coefficients and the density anyway)
switch (phaseIdx) {
case gasPhaseIdx: {
// calculate molar volumes for the given composition. although
// this isn't a Peng-Robinson parameter strictly speaking, the
// molar volume appears in basically every quantity the fluid
// system can get queried, so it is okay to calculate it
// here...
Vm_[gasPhaseIdx] = decay<Scalar> (
PengRobinson::computeMolarVolume(fluidState,
*this,
phaseIdx,
/*isGasPhase=*/true) );
break;
}
case oilPhaseIdx: {
// calculate molar volumes for the given composition. although
// this isn't a Peng-Robinson parameter strictly speaking, the
// molar volume appears in basically every quantity the fluid
// system can get queried, so it is okay to calculate it
// here...
Vm_[oilPhaseIdx] = decay<Scalar> (
PengRobinson::computeMolarVolume(fluidState,
*this,
phaseIdx,
/*isGasPhase=*/false) );
break;
}
};
}
bool VmUpToDate_[numPhases];
Scalar Vm_[numPhases];
OilPhaseParams oilPhaseParams_;
GasPhaseParams gasPhaseParams_;
};
} // namespace Opm
#endif
ParameterCacheBase.hpp
The base class of the parameter caches of fluid systems.
PengRobinsonParamsMixture.hpp
The mixing rule for the oil and the gas phases of the SPE5 problem.
PengRobinson.hpp
Implements the Peng-Robinson equation of state for liquids and gases.
Opm::PTFlashParameterCache
Specifies the parameter cache used by the SPE-5 fluid system.
Definition PTFlashParameterCache.hpp:48
Opm::PTFlashParameterCache::OilPhaseParams
Opm::PengRobinsonParamsMixture< Scalar, FluidSystem, oilPhaseIdx, false > OilPhaseParams
The cached parameters for the oil phase.
Definition PTFlashParameterCache.hpp:67
Opm::PTFlashParameterCache::oilPhaseParams
const OilPhaseParams & oilPhaseParams() const
Returns the Peng-Robinson mixture parameters for the oil phase.
Definition PTFlashParameterCache.hpp:218
Opm::PTFlashParameterCache::updatePure_
void updatePure_(const FluidState &fluidState, unsigned phaseIdx)
Update all parameters of a phase which only depend on temperature and/or pressure.
Definition PTFlashParameterCache.hpp:269
Opm::PTFlashParameterCache::molarVolume
Scalar molarVolume(unsigned phaseIdx) const
Returns the molar volume of a phase [m^3/mol].
Definition PTFlashParameterCache.hpp:210
Opm::PTFlashParameterCache::updateSingleMoleFraction
void updateSingleMoleFraction(const FluidState &fluidState, unsigned phaseIdx, unsigned compIdx)
Update all cached parameters of a specific fluid phase which depend on the mole fraction of a single ...
Definition PTFlashParameterCache.hpp:96
Opm::PTFlashParameterCache::bPure
Scalar bPure(unsigned phaseIdx, unsigned compIdx) const
The Peng-Robinson covolume for a pure component given the same temperature and pressure of the phase.
Definition PTFlashParameterCache.hpp:172
Opm::PTFlashParameterCache::aCache
Scalar aCache(unsigned phaseIdx, unsigned compIdx, unsigned compJIdx) const
TODO.
Definition PTFlashParameterCache.hpp:193
Opm::PTFlashParameterCache::GasPhaseParams
Opm::PengRobinsonParamsMixture< Scalar, FluidSystem, gasPhaseIdx, false > GasPhaseParams
The cached parameters for the gas phase.
Definition PTFlashParameterCache.hpp:69
Opm::PTFlashParameterCache::updateMix_
void updateMix_(const FluidState &fluidState, unsigned phaseIdx)
Update all parameters of a phase which depend on the fluid composition.
Definition PTFlashParameterCache.hpp:289
Opm::PTFlashParameterCache::updatePhase
void updatePhase(const FluidState &fluidState, unsigned phaseIdx, int exceptQuantities=ParentType::None)
Update all cached parameters of a specific fluid phase.
Definition PTFlashParameterCache.hpp:81
Opm::PTFlashParameterCache::a
Scalar a(unsigned phaseIdx) const
The Peng-Robinson attractive parameter for a phase.
Definition PTFlashParameterCache.hpp:116
Opm::PTFlashParameterCache::aPure
Scalar aPure(unsigned phaseIdx, unsigned compIdx) const
The Peng-Robinson attractive parameter for a pure component given the same temperature and pressure o...
Definition PTFlashParameterCache.hpp:153
Opm::PTFlashParameterCache::b
Scalar b(unsigned phaseIdx) const
The Peng-Robinson covolume for a phase.
Definition PTFlashParameterCache.hpp:133
Opm::PTFlashParameterCache::updateEosParams
void updateEosParams(const FluidState &fluidState, unsigned phaseIdx, int exceptQuantities=ParentType::None)
Update all parameters required by the equation of state to calculate some quantities for the phase.
Definition PTFlashParameterCache.hpp:238
Opm::PTFlashParameterCache::gasPhaseParams
const GasPhaseParams & gasPhaseParams() const
Returns the Peng-Robinson mixture parameters for the gas phase.
Definition PTFlashParameterCache.hpp:225
Opm::ParameterCacheBase
The base class of the parameter caches of fluid systems.
Definition ParameterCacheBase.hpp:38
Opm::ParameterCacheBase::Temperature
@ Temperature
The temperature has not been modified.
Definition ParameterCacheBase.hpp:48
Opm::ParameterCacheBase::None
@ None
All quantities have been (potentially) modified.
Definition ParameterCacheBase.hpp:45
Opm::ParameterCacheBase::Pressure
@ Pressure
The pressures have not been modified.
Definition ParameterCacheBase.hpp:51
Opm::ParameterCacheBase::Composition
@ Composition
The compositions have not been modified.
Definition ParameterCacheBase.hpp:54
Opm::PengRobinsonParamsMixture< Scalar, FluidSystem, oilPhaseIdx, false >
Opm::PengRobinsonParamsMixture::updateSingleMoleFraction
void updateSingleMoleFraction(const FluidState &fs, unsigned)
Calculates the "a" and "b" Peng-Robinson parameters for the mixture provided that only a single mole ...
Definition PengRobinsonParamsMixture.hpp:192
Opm::PengRobinsonParamsMixture::updatePure
void updatePure(const FluidState &fluidState)
Update Peng-Robinson parameters for the pure components.
Definition PengRobinsonParamsMixture.hpp:82
Opm::PengRobinsonParamsMixture::getaCache
Scalar getaCache(unsigned compIIdx, unsigned compJIdx) const
TODO.
Definition PengRobinsonParamsMixture.hpp:73
Opm::PengRobinsonParamsMixture::updateMix
void updateMix(const FluidState &fs)
Calculates the "a" and "b" Peng-Robinson parameters for the mixture.
Definition PengRobinsonParamsMixture.hpp:143
Opm::PengRobinsonParamsMixture::pureParams
const PureParams & pureParams(unsigned compIdx) const
Return the Peng-Robinson parameters of a pure substance,.
Definition PengRobinsonParamsMixture.hpp:201
Opm::PengRobinsonParams::a
Scalar a() const
Returns the attractive parameter 'a' of the Peng-Robinson fluid.
Definition PengRobinsonParams.hpp:50
Opm::PengRobinsonParams::b
Scalar b() const
Returns the repulsive parameter 'b' of the Peng-Robinson fluid.
Definition PengRobinsonParams.hpp:57
Opm::PengRobinson
Implements the Peng-Robinson equation of state for liquids and gases.
Definition PengRobinson.hpp:60
Opm::PengRobinson::computeMolarVolume
static FluidState::Scalar computeMolarVolume(const FluidState &fs, Params &params, unsigned phaseIdx, bool isGasPhase)
Computes molar volumes where the Peng-Robinson EOS is true.
Definition PengRobinson.hpp:148
Opm
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30