Only resize drsdt related vectors when needed

This commit is contained in:
Tor Harald Sandve 2024-08-16 14:39:33 +02:00
parent 914f0b8644
commit fffa19e757
4 changed files with 22 additions and 17 deletions

View File

@ -308,7 +308,8 @@ protected:
bool shouldWriteRestartFile() const bool shouldWriteRestartFile() const
{ return false; } { return false; }
bool beginEpisode_(bool enableExperiments, bool beginEpisode_(std::size_t numDof,
bool enableExperiments,
int episodeIdx); int episodeIdx);
void beginTimeStep_(bool enableExperiments, void beginTimeStep_(bool enableExperiments,
int episodeIdx, int episodeIdx,

View File

@ -418,7 +418,8 @@ vapparsActive(int episodeIdx) const
template<class GridView, class FluidSystem> template<class GridView, class FluidSystem>
bool FlowGenericProblem<GridView,FluidSystem>:: bool FlowGenericProblem<GridView,FluidSystem>::
beginEpisode_(bool enableExperiments, beginEpisode_(std::size_t numDof,
bool enableExperiments,
int episodeIdx) int episodeIdx)
{ {
if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) { if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
@ -438,6 +439,10 @@ beginEpisode_(bool enableExperiments,
OpmLog::info(ss.str()); OpmLog::info(ss.str());
} }
this->mixControls_.init(numDof,
episodeIdx,
eclState_.runspec().tabdims().getNumPVTTables());
const auto& events = schedule_[episodeIdx].events(); const auto& events = schedule_[episodeIdx].events();
// react to TUNING changes // react to TUNING changes

View File

@ -545,7 +545,7 @@ public:
this->model().linearizer().updateDiscretizationParameters(); 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. // set up the wells for the next episode.
wellModel_.beginEpisode(); wellModel_.beginEpisode();

View File

@ -97,18 +97,17 @@ template<class FluidSystem>
void MixingRateControls<FluidSystem>:: void MixingRateControls<FluidSystem>::
init(std::size_t numDof, int episodeIdx, const unsigned ntpvt) init(std::size_t numDof, int episodeIdx, const unsigned ntpvt)
{ {
// deal with DRSDT // allocate DRSDT related vectors
//TODO We may want to only allocate these properties only if active. if (this->drsdtActive(episodeIdx) && maxDRs_.empty()) {
//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);
maxDRs_.resize(ntpvt, 1e30); maxDRs_.resize(ntpvt, 1e30);
dRsDtOnlyFreeGas_.resize(ntpvt, false); dRsDtOnlyFreeGas_.resize(ntpvt, false);
lastRs_.resize(numDof, 0.0); lastRs_.resize(numDof, 0.0);
}
if (this->drvdtActive(episodeIdx && maxDRv_.empty())) {
lastRv_.resize(numDof, 0.0);
maxDRv_.resize(ntpvt, 1e30); maxDRv_.resize(ntpvt, 1e30);
if (this->drsdtConvective(episodeIdx)) { }
if (this->drsdtConvective(episodeIdx) && convectiveDrs_.empty()) {
convectiveDrs_.resize(numDof, 1.0); convectiveDrs_.resize(numDof, 1.0);
} }
} }
@ -170,14 +169,14 @@ updateExplicitQuantities(const int episodeIdx,
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
// DRSDT is enabled // DRSDT is enabled
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) { 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; maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize;
} }
} }
// DRVDT is enabled // DRVDT is enabled
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) { 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; maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize;
} }
} }
@ -249,7 +248,7 @@ maxGasDissolutionFactor(const unsigned timeIdx,
const int episodeIdx, const int episodeIdx,
const int pvtRegionIdx) const const int pvtRegionIdx) const
{ {
if (!this->drsdtActive(episodeIdx, pvtRegionIdx) || maxDRs_[pvtRegionIdx] < 0.0) { if (!this->drsdtActive(episodeIdx, pvtRegionIdx)) {
return std::numeric_limits<Scalar>::max() / 2.0; return std::numeric_limits<Scalar>::max() / 2.0;
} }
@ -275,7 +274,7 @@ maxOilVaporizationFactor(const unsigned timeIdx,
const int episodeIdx, const int episodeIdx,
const int pvtRegionIdx) const const int pvtRegionIdx) const
{ {
if (!this->drvdtActive(episodeIdx, pvtRegionIdx) || maxDRv_[pvtRegionIdx] < 0.0) { if (!this->drvdtActive(episodeIdx, pvtRegionIdx)) {
return std::numeric_limits<Scalar>::max() / 2.0; return std::numeric_limits<Scalar>::max() / 2.0;
} }