diff --git a/opm/simulators/flow/FlowGenericProblem.hpp b/opm/simulators/flow/FlowGenericProblem.hpp index 2531cd6b2..5d106cd4a 100644 --- a/opm/simulators/flow/FlowGenericProblem.hpp +++ b/opm/simulators/flow/FlowGenericProblem.hpp @@ -308,7 +308,8 @@ protected: bool shouldWriteRestartFile() const { return false; } - bool beginEpisode_(bool enableExperiments, + bool beginEpisode_(std::size_t numDof, + bool enableExperiments, int episodeIdx); void beginTimeStep_(bool enableExperiments, int episodeIdx, diff --git a/opm/simulators/flow/FlowGenericProblem_impl.hpp b/opm/simulators/flow/FlowGenericProblem_impl.hpp index 7c0fa2ed1..f78a668e0 100644 --- a/opm/simulators/flow/FlowGenericProblem_impl.hpp +++ b/opm/simulators/flow/FlowGenericProblem_impl.hpp @@ -418,7 +418,8 @@ vapparsActive(int episodeIdx) const template bool FlowGenericProblem:: -beginEpisode_(bool enableExperiments, +beginEpisode_(std::size_t numDof, + bool enableExperiments, int episodeIdx) { if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) { @@ -438,6 +439,10 @@ beginEpisode_(bool enableExperiments, OpmLog::info(ss.str()); } + this->mixControls_.init(numDof, + episodeIdx, + eclState_.runspec().tabdims().getNumPVTTables()); + const auto& events = schedule_[episodeIdx].events(); // react to TUNING changes diff --git a/opm/simulators/flow/FlowProblem.hpp b/opm/simulators/flow/FlowProblem.hpp index 79939dff3..86fe9857f 100644 --- a/opm/simulators/flow/FlowProblem.hpp +++ b/opm/simulators/flow/FlowProblem.hpp @@ -545,7 +545,7 @@ public: this->model().linearizer().updateDiscretizationParameters(); } - bool tuningEvent = this->beginEpisode_(enableExperiments, this->episodeIndex()); + bool tuningEvent = this->beginEpisode_(this->model().numGridDof(), enableExperiments, this->episodeIndex()); // set up the wells for the next episode. wellModel_.beginEpisode(); diff --git a/opm/simulators/flow/MixingRateControls.cpp b/opm/simulators/flow/MixingRateControls.cpp index b8ea2bab2..11ce8799f 100644 --- a/opm/simulators/flow/MixingRateControls.cpp +++ b/opm/simulators/flow/MixingRateControls.cpp @@ -97,20 +97,19 @@ template void MixingRateControls:: init(std::size_t numDof, int episodeIdx, const unsigned ntpvt) { - // deal with DRSDT - //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 - - maxDRv_.resize(ntpvt, 1e30); - lastRv_.resize(numDof, 0.0); + // allocate DRSDT related vectors + if (this->drsdtActive(episodeIdx) && maxDRs_.empty()) { maxDRs_.resize(ntpvt, 1e30); dRsDtOnlyFreeGas_.resize(ntpvt, false); lastRs_.resize(numDof, 0.0); + } + if (this->drvdtActive(episodeIdx && maxDRv_.empty())) { + lastRv_.resize(numDof, 0.0); maxDRv_.resize(ntpvt, 1e30); - if (this->drsdtConvective(episodeIdx)) { - convectiveDrs_.resize(numDof, 1.0); - } + } + if (this->drsdtConvective(episodeIdx) && convectiveDrs_.empty()) { + convectiveDrs_.resize(numDof, 1.0); + } } template @@ -170,14 +169,14 @@ updateExplicitQuantities(const int episodeIdx, const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); // DRSDT is enabled for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) { - if (this->drsdtActive(episodeIdx, pvtRegionIdx)) { + if (oilVaporizationControl.drsdtActive(pvtRegionIdx)) { maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize; } } // DRVDT is enabled for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) { - if (this->drvdtActive(episodeIdx, pvtRegionIdx)) { + if (oilVaporizationControl.drvdtActive(pvtRegionIdx)) { maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize; } } @@ -249,7 +248,7 @@ maxGasDissolutionFactor(const unsigned timeIdx, const int episodeIdx, const int pvtRegionIdx) const { - if (!this->drsdtActive(episodeIdx, pvtRegionIdx) || maxDRs_[pvtRegionIdx] < 0.0) { + if (!this->drsdtActive(episodeIdx, pvtRegionIdx)) { return std::numeric_limits::max() / 2.0; } @@ -275,7 +274,7 @@ maxOilVaporizationFactor(const unsigned timeIdx, const int episodeIdx, const int pvtRegionIdx) const { - if (!this->drvdtActive(episodeIdx, pvtRegionIdx) || maxDRv_[pvtRegionIdx] < 0.0) { + if (!this->drvdtActive(episodeIdx, pvtRegionIdx)) { return std::numeric_limits::max() / 2.0; }