mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
extending drsdtcon with regimes, and option for GAS/WATER
This commit is contained in:
committed by
Tor Harald Sandve
parent
ad595fed5e
commit
ab2bd924db
@@ -101,8 +101,7 @@ init(std::size_t numDof, int episodeIdx, const unsigned ntpvt)
|
||||
//TODO We may want to only allocate these properties only if active.
|
||||
//But since they may be activated at later time we need some more
|
||||
//intrastructure to handle it
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx)) {
|
||||
|
||||
maxDRv_.resize(ntpvt, 1e30);
|
||||
lastRv_.resize(numDof, 0.0);
|
||||
maxDRs_.resize(ntpvt, 1e30);
|
||||
@@ -113,7 +112,6 @@ init(std::size_t numDof, int episodeIdx, const unsigned ntpvt)
|
||||
if (this->drsdtConvective(episodeIdx)) {
|
||||
convectiveDrs_.resize(numDof, 1.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
@@ -123,7 +121,7 @@ drsdtActive(int episodeIdx) const
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
const bool bothOilGasActive = FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx);
|
||||
return (oilVaporizationControl.drsdtActive() && bothOilGasActive);
|
||||
return (oilVaporizationControl.drsdtActive());
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
@@ -133,7 +131,7 @@ drvdtActive(int episodeIdx) const
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
const bool bothOilGasActive = FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx);
|
||||
return (oilVaporizationControl.drvdtActive() && bothOilGasActive);
|
||||
return (oilVaporizationControl.drvdtActive());
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
@@ -143,7 +141,7 @@ drsdtConvective(int episodeIdx) const
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
const bool bothOilGasActive = FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx);
|
||||
return (oilVaporizationControl.drsdtConvective() && bothOilGasActive);
|
||||
return (oilVaporizationControl.drsdtConvective());
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
@@ -273,29 +271,61 @@ updateConvectiveDRsDt_(const unsigned compressedDofIdx,
|
||||
const Scalar p,
|
||||
const Scalar rs,
|
||||
const Scalar so,
|
||||
const Scalar sg,
|
||||
const Scalar poro,
|
||||
const Scalar permz,
|
||||
const Scalar distZ,
|
||||
const Scalar gravity,
|
||||
const Scalar salt,
|
||||
const Scalar Xhi,
|
||||
const Scalar Psi,
|
||||
const Scalar omegainn,
|
||||
const int pvtRegionIndex)
|
||||
{
|
||||
const Scalar rssat = FluidSystem::oilPvt().saturatedGasDissolutionFactor(pvtRegionIndex, t, p);
|
||||
const Scalar saturatedInvB
|
||||
= FluidSystem::oilPvt().saturatedInverseFormationVolumeFactor(pvtRegionIndex, t, p);
|
||||
const Scalar rssat = (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) ?
|
||||
FluidSystem::waterPvt().saturatedGasDissolutionFactor(pvtRegionIndex, t, p, salt) :
|
||||
FluidSystem::oilPvt().saturatedGasDissolutionFactor(pvtRegionIndex, t, p);
|
||||
const Scalar saturatedInvB = (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) ?
|
||||
FluidSystem::waterPvt().saturatedInverseFormationVolumeFactor(pvtRegionIndex, t, p, salt) :
|
||||
FluidSystem::oilPvt().saturatedInverseFormationVolumeFactor(pvtRegionIndex, t, p);
|
||||
const Scalar rsZero = 0.0;
|
||||
const Scalar pureDensity
|
||||
= FluidSystem::oilPvt().inverseFormationVolumeFactor(pvtRegionIndex, t, p, rsZero)
|
||||
* FluidSystem::oilPvt().oilReferenceDensity(pvtRegionIndex);
|
||||
const Scalar saturatedDensity = saturatedInvB
|
||||
* (FluidSystem::oilPvt().oilReferenceDensity(pvtRegionIndex)
|
||||
+ rssat * FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, pvtRegionIndex));
|
||||
const Scalar deltaDensity = saturatedDensity - pureDensity;
|
||||
const Scalar visc = FluidSystem::oilPvt().viscosity(pvtRegionIndex, t, p, rs);
|
||||
const Scalar sg_max = 1.0;
|
||||
const Scalar pureDensity = (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) ?
|
||||
(FluidSystem::waterPvt().inverseFormationVolumeFactor(pvtRegionIndex, t, p, rsZero, salt)
|
||||
* FluidSystem::waterPvt().waterReferenceDensity(pvtRegionIndex)) :
|
||||
(FluidSystem::oilPvt().inverseFormationVolumeFactor(pvtRegionIndex, t, p, rsZero)
|
||||
* FluidSystem::oilPvt().oilReferenceDensity(pvtRegionIndex));
|
||||
const Scalar saturatedDensity = (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) ?
|
||||
(saturatedInvB * (FluidSystem::waterPvt().waterReferenceDensity(pvtRegionIndex)
|
||||
+ rssat * FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, pvtRegionIndex))) :
|
||||
(saturatedInvB * (FluidSystem::oilPvt().oilReferenceDensity(pvtRegionIndex)
|
||||
+ rssat * FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, pvtRegionIndex)));
|
||||
Scalar deltaDensity = saturatedDensity - pureDensity;
|
||||
const Scalar visc = (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) ?
|
||||
FluidSystem::waterPvt().viscosity(pvtRegionIndex, t, p, rs, salt) :
|
||||
FluidSystem::oilPvt().viscosity(pvtRegionIndex, t, p, rs);
|
||||
|
||||
// Note that for so = 0 this gives no limits (inf) for the dissolution rate
|
||||
// Also we restrict the effect of convective mixing to positive density differences
|
||||
// i.e. we only allow for fingers moving downward
|
||||
|
||||
Scalar co2Density = FluidSystem::gasPvt().inverseFormationVolumeFactor(pvtRegionIndex,
|
||||
t,p,0.0 /*=Rv*/, 0.0 /*=Rvw*/) * FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, pvtRegionIndex);
|
||||
Scalar factor = 1.0;
|
||||
Scalar X = (rs - rssat * sg) / (rssat * ( 1.0 - sg));
|
||||
Scalar omega = 0.0;
|
||||
if ((rs >= (rssat * sg))){
|
||||
if(X > Psi){
|
||||
factor = 0.0;
|
||||
omega = omegainn;
|
||||
}
|
||||
} else {
|
||||
factor /= Xhi;
|
||||
deltaDensity = (saturatedDensity - co2Density);
|
||||
}
|
||||
|
||||
convectiveDrs_[compressedDofIdx]
|
||||
= permz * rssat * max(0.0, deltaDensity) * gravity / (so * visc * distZ * poro);
|
||||
= factor * permz * rssat * max(0.0, deltaDensity) * gravity / ( std::max(sg_max - sg, 0.0) * visc * distZ * poro) + (omega/Xhi);
|
||||
}
|
||||
|
||||
template class MixingRateControls<BlackOilFluidSystem<double,BlackOilDefaultIndexTraits>>;
|
||||
|
||||
Reference in New Issue
Block a user