mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Support deactivation of individual DRSDT/DRVDT/DRSDTCON regions
This commit is contained in:
parent
908a9b37ff
commit
914f0b8644
@ -1943,8 +1943,7 @@ protected:
|
||||
this->gravity_[dim - 1],
|
||||
perm[dim - 1][dim - 1],
|
||||
distZ,
|
||||
pvtRegionIdx,
|
||||
active);
|
||||
pvtRegionIdx);
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -137,22 +137,49 @@ drsdtConvective(int episodeIdx) const
|
||||
return (oilVaporizationControl.drsdtConvective());
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
bool MixingRateControls<FluidSystem>::
|
||||
drsdtActive(int episodeIdx, std::size_t pvtRegionIdx) const
|
||||
{
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
return (oilVaporizationControl.drsdtActive(pvtRegionIdx));
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
bool MixingRateControls<FluidSystem>::
|
||||
drvdtActive(int episodeIdx, std::size_t pvtRegionIdx) const
|
||||
{
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
return (oilVaporizationControl.drvdtActive(pvtRegionIdx));
|
||||
}
|
||||
|
||||
template<class FluidSystem>
|
||||
bool MixingRateControls<FluidSystem>::
|
||||
drsdtConvective(int episodeIdx, std::size_t pvtRegionIdx) const
|
||||
{
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
return (oilVaporizationControl.drsdtConvective(pvtRegionIdx));
|
||||
}
|
||||
|
||||
|
||||
template<class FluidSystem>
|
||||
void MixingRateControls<FluidSystem>::
|
||||
updateExplicitQuantities(const int episodeIdx,
|
||||
const Scalar timeStepSize)
|
||||
{
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
if (this->drsdtActive(episodeIdx)) {
|
||||
// DRSDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx)
|
||||
// DRSDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) {
|
||||
if (this->drsdtActive(episodeIdx, pvtRegionIdx)) {
|
||||
maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->drvdtActive(episodeIdx)) {
|
||||
// DRVDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx)
|
||||
// DRVDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) {
|
||||
if (this->drvdtActive(episodeIdx, pvtRegionIdx)) {
|
||||
maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -177,16 +204,16 @@ updateMaxValues(const int episodeIdx,
|
||||
const Scalar timeStepSize)
|
||||
{
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
if (this->drsdtActive(episodeIdx)) {
|
||||
// DRSDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) {
|
||||
// DRSDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) {
|
||||
if (this->drsdtActive(episodeIdx, pvtRegionIdx)) {
|
||||
maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->drvdtActive(episodeIdx)) {
|
||||
// DRVDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) {
|
||||
// DRVDT is enabled
|
||||
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) {
|
||||
if (this->drvdtActive(episodeIdx, pvtRegionIdx)) {
|
||||
maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize;
|
||||
}
|
||||
}
|
||||
@ -207,6 +234,10 @@ drsdtcon(const unsigned elemIdx,
|
||||
// Output drsdt value for index 0
|
||||
episodeIdx = std::max(episodeIdx, 0);
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
|
||||
if (!oilVaporizationControl.drsdtConvective(pvtRegionIdx))
|
||||
return 0;
|
||||
|
||||
return oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * convectiveDrs_[elemIdx];
|
||||
}
|
||||
|
||||
@ -218,12 +249,12 @@ maxGasDissolutionFactor(const unsigned timeIdx,
|
||||
const int episodeIdx,
|
||||
const int pvtRegionIdx) const
|
||||
{
|
||||
if (!this->drsdtActive(episodeIdx) || maxDRs_[pvtRegionIdx] < 0.0) {
|
||||
if (!this->drsdtActive(episodeIdx, pvtRegionIdx) || maxDRs_[pvtRegionIdx] < 0.0) {
|
||||
return std::numeric_limits<Scalar>::max() / 2.0;
|
||||
}
|
||||
|
||||
Scalar scaling = 1.0;
|
||||
if (this->drsdtConvective(episodeIdx)) {
|
||||
if (this->drsdtConvective(episodeIdx, pvtRegionIdx)) {
|
||||
scaling = convectiveDrs_[globalDofIdx];
|
||||
}
|
||||
|
||||
@ -244,7 +275,7 @@ maxOilVaporizationFactor(const unsigned timeIdx,
|
||||
const int episodeIdx,
|
||||
const int pvtRegionIdx) const
|
||||
{
|
||||
if (!this->drvdtActive(episodeIdx) || maxDRv_[pvtRegionIdx] < 0.0) {
|
||||
if (!this->drvdtActive(episodeIdx, pvtRegionIdx) || maxDRv_[pvtRegionIdx] < 0.0) {
|
||||
return std::numeric_limits<Scalar>::max() / 2.0;
|
||||
}
|
||||
|
||||
|
@ -60,7 +60,10 @@ public:
|
||||
bool drsdtActive(int episodeIdx) const;
|
||||
bool drvdtActive(int episodeIdx) const;
|
||||
bool drsdtConvective(int episodeIdx) const;
|
||||
|
||||
|
||||
bool drsdtActive(int episodeIdx, std::size_t pvtRegionIdx) const;
|
||||
bool drvdtActive(int episodeIdx, std::size_t pvtRegionIdx) const;
|
||||
bool drsdtConvective(int episodeIdx, std::size_t pvtRegionIdx) const;
|
||||
/*!
|
||||
* \brief Returns the dynamic drsdt convective mixing value
|
||||
*/
|
||||
@ -114,11 +117,11 @@ public:
|
||||
const Scalar gravity,
|
||||
const Scalar permZ,
|
||||
const Scalar distZ,
|
||||
const int pvtRegionIdx,
|
||||
const std::array<bool,3>& active)
|
||||
const int pvtRegionIdx)
|
||||
{
|
||||
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
|
||||
if (active[0]) {
|
||||
|
||||
if (oilVaporizationControl.drsdtConvective(pvtRegionIdx)) {
|
||||
// This implements the convective DRSDT as described in
|
||||
// Sandve et al. "Convective dissolution in field scale CO2 storage simulations using the OPM Flow
|
||||
// simulator" Submitted to TCCS 11, 2021
|
||||
@ -155,7 +158,7 @@ public:
|
||||
fs.pvtRegionIndex());
|
||||
}
|
||||
|
||||
if (active[1]) {
|
||||
if (oilVaporizationControl.drsdtActive(pvtRegionIdx)) {
|
||||
const auto& fs = iq.fluidState();
|
||||
|
||||
using FluidState = typename std::decay<decltype(fs)>::type;
|
||||
@ -171,7 +174,7 @@ public:
|
||||
lastRs_[compressedDofIdx] = std::numeric_limits<Scalar>::infinity();
|
||||
}
|
||||
|
||||
if (active[2]) {
|
||||
if (oilVaporizationControl.drvdtActive(pvtRegionIdx)) {
|
||||
const auto& fs = iq.fluidState();
|
||||
using FluidState = typename std::decay<decltype(fs)>::type;
|
||||
lastRv_[compressedDofIdx]
|
||||
|
Loading…
Reference in New Issue
Block a user