From 914f0b8644ca5f3137cd7a10aabf0e5a2c49a0d3 Mon Sep 17 00:00:00 2001 From: Tor Harald Sandve Date: Wed, 5 Jun 2024 14:56:39 +0200 Subject: [PATCH] Support deactivation of individual DRSDT/DRVDT/DRSDTCON regions --- opm/simulators/flow/FlowProblem.hpp | 3 +- opm/simulators/flow/MixingRateControls.cpp | 61 ++++++++++++++++------ opm/simulators/flow/MixingRateControls.hpp | 15 +++--- 3 files changed, 56 insertions(+), 23 deletions(-) diff --git a/opm/simulators/flow/FlowProblem.hpp b/opm/simulators/flow/FlowProblem.hpp index 550a16c14..79939dff3 100644 --- a/opm/simulators/flow/FlowProblem.hpp +++ b/opm/simulators/flow/FlowProblem.hpp @@ -1943,8 +1943,7 @@ protected: this->gravity_[dim - 1], perm[dim - 1][dim - 1], distZ, - pvtRegionIdx, - active); + pvtRegionIdx); } ); diff --git a/opm/simulators/flow/MixingRateControls.cpp b/opm/simulators/flow/MixingRateControls.cpp index 1d5d34d70..b8ea2bab2 100644 --- a/opm/simulators/flow/MixingRateControls.cpp +++ b/opm/simulators/flow/MixingRateControls.cpp @@ -137,22 +137,49 @@ drsdtConvective(int episodeIdx) const return (oilVaporizationControl.drsdtConvective()); } +template +bool MixingRateControls:: +drsdtActive(int episodeIdx, std::size_t pvtRegionIdx) const +{ + const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); + return (oilVaporizationControl.drsdtActive(pvtRegionIdx)); +} + +template +bool MixingRateControls:: +drvdtActive(int episodeIdx, std::size_t pvtRegionIdx) const +{ + const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); + return (oilVaporizationControl.drvdtActive(pvtRegionIdx)); +} + +template +bool MixingRateControls:: +drsdtConvective(int episodeIdx, std::size_t pvtRegionIdx) const +{ + const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); + return (oilVaporizationControl.drsdtConvective(pvtRegionIdx)); +} + + template void MixingRateControls:: 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::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::max() / 2.0; } diff --git a/opm/simulators/flow/MixingRateControls.hpp b/opm/simulators/flow/MixingRateControls.hpp index f5f5dfe90..e7ff42369 100644 --- a/opm/simulators/flow/MixingRateControls.hpp +++ b/opm/simulators/flow/MixingRateControls.hpp @@ -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& 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::type; @@ -171,7 +174,7 @@ public: lastRs_[compressedDofIdx] = std::numeric_limits::infinity(); } - if (active[2]) { + if (oilVaporizationControl.drvdtActive(pvtRegionIdx)) { const auto& fs = iq.fluidState(); using FluidState = typename std::decay::type; lastRv_[compressedDofIdx]