Add diffusion to blackoil fluidsystem. Diffusion coefficients are only implemented for the CO2-Brine system
This commit is contained in:
parent
d10786a18c
commit
ceb71c53a2
@ -1274,6 +1274,26 @@ public:
|
||||
return canonicalToActivePhaseIdx_[phaseIdx];
|
||||
}
|
||||
|
||||
/*!
|
||||
* \copydoc BaseFluidSystem::diffusionCoefficient
|
||||
*/
|
||||
template <class FluidState, class LhsEval = typename FluidState::Scalar, class ParamCacheEval = LhsEval>
|
||||
static LhsEval diffusionCoefficient(const FluidState& fluidState,
|
||||
const ParameterCache<ParamCacheEval>& /*paramCache*/,
|
||||
unsigned phaseIdx,
|
||||
unsigned compIdx)
|
||||
{
|
||||
const auto& p = Opm::decay<LhsEval>(fluidState.pressure(phaseIdx));
|
||||
const auto& T = Opm::decay<LhsEval>(fluidState.temperature(phaseIdx));
|
||||
|
||||
switch (phaseIdx) {
|
||||
case oilPhaseIdx: return oilPvt().diffusionCoefficient(T, p, compIdx);
|
||||
case gasPhaseIdx: return gasPvt().diffusionCoefficient(T, p, compIdx);
|
||||
case waterPhaseIdx: return 0.0;
|
||||
default: throw std::logic_error("Unhandled phase index "+std::to_string(phaseIdx));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
static void resizeArrays_(size_t numRegions)
|
||||
{
|
||||
|
@ -276,6 +276,14 @@ public:
|
||||
brineReferenceDensity_ == data.brineReferenceDensity_;
|
||||
}
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& temperature,
|
||||
const Evaluation& pressure,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
return BinaryCoeffBrineCO2::liquidDiffCoeff(temperature, pressure);
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<Scalar> brineReferenceDensity_;
|
||||
std::vector<Scalar> co2ReferenceDensity_;
|
||||
|
@ -31,7 +31,9 @@
|
||||
|
||||
#include <opm/material/common/Tabulated1DFunction.hpp>
|
||||
#include <opm/material/components/CO2.hpp>
|
||||
#include <opm/material/components/SimpleHuDuanH2O.hpp>
|
||||
#include <opm/material/common/UniformTabulated2DFunction.hpp>
|
||||
#include <opm/material/binarycoefficients/Brine_CO2.hpp>
|
||||
#include <opm/material/components/co2tables.inc>
|
||||
|
||||
#if HAVE_ECL_INPUT
|
||||
@ -52,10 +54,14 @@ class Co2GasPvt
|
||||
{
|
||||
typedef std::vector<std::pair<Scalar, Scalar> > SamplingPoints;
|
||||
typedef Opm::CO2<Scalar, CO2Tables> CO2;
|
||||
typedef Opm::SimpleHuDuanH2O<Scalar> H2O;
|
||||
|
||||
public:
|
||||
typedef Opm::Tabulated1DFunction<Scalar> TabulatedOneDFunction;
|
||||
|
||||
//! The binary coefficients for brine and CO2 used by this fluid system
|
||||
typedef Opm::BinaryCoeff::Brine_CO2<Scalar, H2O, CO2> BinaryCoeffBrineCO2;
|
||||
|
||||
explicit Co2GasPvt() = default;
|
||||
Co2GasPvt(const std::vector<Scalar>& gasReferenceDensity)
|
||||
: gasReferenceDensity_(gasReferenceDensity)
|
||||
@ -205,6 +211,14 @@ public:
|
||||
const Evaluation& /*pressure*/) const
|
||||
{ return 0.0; /* this is dry gas! */ }
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& temperature,
|
||||
const Evaluation& pressure,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
return BinaryCoeffBrineCO2::gasDiffCoeff(temperature, pressure);
|
||||
}
|
||||
|
||||
const Scalar gasReferenceDensity(unsigned regionIdx) const
|
||||
{ return gasReferenceDensity_[regionIdx]; }
|
||||
|
||||
|
@ -272,6 +272,14 @@ public:
|
||||
const Evaluation& /*Rs*/) const
|
||||
{ return 0.0; /* this is dead oil, so there isn't any meaningful saturation pressure! */ }
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& /*temperature*/,
|
||||
const Evaluation& /*pressure*/,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
throw std::runtime_error("Not implemented: The PVT model does not provide a diffusionCoefficient()");
|
||||
}
|
||||
|
||||
const Scalar oilReferenceDensity(unsigned regionIdx) const
|
||||
{ return oilReferenceDensity_[regionIdx]; }
|
||||
|
||||
|
@ -278,6 +278,14 @@ public:
|
||||
const Evaluation& /*pressure*/) const
|
||||
{ return 0.0; /* this is dead oil! */ }
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& /*temperature*/,
|
||||
const Evaluation& /*pressure*/,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
throw std::runtime_error("Not implemented: The PVT model does not provide a diffusionCoefficient()");
|
||||
}
|
||||
|
||||
const Scalar oilReferenceDensity(unsigned regionIdx) const
|
||||
{ return oilReferenceDensity_[regionIdx]; }
|
||||
|
||||
|
@ -288,6 +288,14 @@ public:
|
||||
const Evaluation& /*pressure*/) const
|
||||
{ return 0.0; /* this is dry gas! */ }
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& /*temperature*/,
|
||||
const Evaluation& /*pressure*/,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
throw std::runtime_error("Not implemented: The PVT model does not provide a diffusionCoefficient()");
|
||||
}
|
||||
|
||||
const Scalar gasReferenceDensity(unsigned regionIdx) const
|
||||
{ return gasReferenceDensity_[regionIdx]; }
|
||||
|
||||
|
@ -272,6 +272,17 @@ public:
|
||||
const Evaluation& Rv) const
|
||||
{ OPM_GAS_PVT_MULTIPLEXER_CALL(return pvtImpl.saturationPressure(regionIdx, temperature, Rv)); return 0; }
|
||||
|
||||
/*!
|
||||
* \copydoc BaseFluidSystem::diffusionCoefficient
|
||||
*/
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& temperature,
|
||||
const Evaluation& pressure,
|
||||
unsigned compIdx) const
|
||||
{
|
||||
OPM_GAS_PVT_MULTIPLEXER_CALL(return pvtImpl.diffusionCoefficient(temperature, pressure, compIdx)); return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns the concrete approach for calculating the PVT relations.
|
||||
*
|
||||
|
@ -367,6 +367,13 @@ public:
|
||||
const Evaluation& pressure) const
|
||||
{ return isothermalPvt_->saturationPressure(regionIdx, temperature, pressure); }
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& temperature,
|
||||
const Evaluation& pressure,
|
||||
unsigned compIdx) const
|
||||
{
|
||||
return isothermalPvt_->diffusionCoefficient(temperature, pressure, compIdx);
|
||||
}
|
||||
const IsothermalPvt* isoThermalPvt() const
|
||||
{ return isothermalPvt_; }
|
||||
|
||||
|
@ -602,6 +602,13 @@ public:
|
||||
throw NumericalIssue(errlog.str());
|
||||
}
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& /*temperature*/,
|
||||
const Evaluation& /*pressure*/,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
throw std::runtime_error("Not implemented: The PVT model does not provide a diffusionCoefficient()");
|
||||
}
|
||||
const Scalar gasReferenceDensity(unsigned regionIdx) const
|
||||
{ return gasReferenceDensity_[regionIdx]; }
|
||||
|
||||
|
@ -266,6 +266,17 @@ public:
|
||||
const Evaluation& Rs) const
|
||||
{ OPM_OIL_PVT_MULTIPLEXER_CALL(return pvtImpl.saturationPressure(regionIdx, temperature, Rs)); return 0; }
|
||||
|
||||
/*!
|
||||
* \copydoc BaseFluidSystem::diffusionCoefficient
|
||||
*/
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& temperature,
|
||||
const Evaluation& pressure,
|
||||
unsigned compIdx) const
|
||||
{
|
||||
OPM_OIL_PVT_MULTIPLEXER_CALL(return pvtImpl.diffusionCoefficient(temperature, pressure, compIdx)); return 0;
|
||||
}
|
||||
|
||||
void setApproach(OilPvtApproach appr)
|
||||
{
|
||||
switch (appr) {
|
||||
|
@ -377,6 +377,14 @@ public:
|
||||
const Evaluation& pressure) const
|
||||
{ return isothermalPvt_->saturationPressure(regionIdx, temperature, pressure); }
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& temperature,
|
||||
const Evaluation& pressure,
|
||||
unsigned compIdx) const
|
||||
{
|
||||
return isothermalPvt_->diffusionCoefficient(temperature, pressure, compIdx);
|
||||
}
|
||||
|
||||
const IsothermalPvt* isoThermalPvt() const
|
||||
{ return isothermalPvt_; }
|
||||
|
||||
|
@ -189,6 +189,14 @@ public:
|
||||
return invBg/invMugBg;
|
||||
}
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& /*temperature*/,
|
||||
const Evaluation& /*pressure*/,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
throw std::runtime_error("Not implemented: The PVT model does not provide a diffusionCoefficient()");
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Return the reference density the solvent phase for a given PVT region
|
||||
*/
|
||||
|
@ -628,6 +628,14 @@ public:
|
||||
throw NumericalIssue(errlog.str());
|
||||
}
|
||||
|
||||
template <class Evaluation>
|
||||
Evaluation diffusionCoefficient(const Evaluation& /*temperature*/,
|
||||
const Evaluation& /*pressure*/,
|
||||
unsigned /*compIdx*/) const
|
||||
{
|
||||
throw std::runtime_error("Not implemented: The PVT model does not provide a diffusionCoefficient()");
|
||||
}
|
||||
|
||||
const Scalar gasReferenceDensity(unsigned regionIdx) const
|
||||
{ return gasReferenceDensity_[regionIdx]; }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user