From 1e41df3bcafcb8adee09137e6799cd41f77eb91c Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 9 Nov 2023 12:36:52 +0100 Subject: [PATCH 1/2] added: pass reportStep to FIP output functions use this to decide whether or not to use the RPTSOL configuration (reportStep == 0) or to read flags from RPTSCHED (reportStep > 0) --- ebos/eclgenericoutputblackoilmodule.cc | 41 ++++++++++++++++++++++---- ebos/eclgenericoutputblackoilmodule.hh | 4 +-- ebos/eclwriter.hh | 8 +++-- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/ebos/eclgenericoutputblackoilmodule.cc b/ebos/eclgenericoutputblackoilmodule.cc index 5dd804ba6..486b3b84c 100644 --- a/ebos/eclgenericoutputblackoilmodule.cc +++ b/ebos/eclgenericoutputblackoilmodule.cc @@ -265,6 +265,7 @@ template Inplace EclGenericOutputBlackoilModule:: outputFipLog(std::map& miscSummaryData, std::map>& regionData, + const std::size_t reportStepNum, const bool substep, const Parallel::Communication& comm) { @@ -276,9 +277,27 @@ outputFipLog(std::map& miscSummaryData, miscSummaryData, regionData); - if (!substep && !forceDisableFipOutput_) { + // For report step 0 we use the RPTSOL config, else derive from RPTSCHED + std::unique_ptr fipSched; + if (reportStepNum != 0) { + const auto& rpt = this->schedule_[reportStepNum].rpt_config.get(); + fipSched = std::make_unique(rpt); + } + const FIPConfig& fipc = reportStepNum == 0 ? this->eclState_.getEclipseConfig().fip() + : *fipSched; + + if (!substep && !forceDisableFipOutput_ && fipc.output(FIPConfig::OutputField::FIELD)) { logOutput_.fip(inplace, this->initialInplace(), ""); - logOutput_.fip(inplace, this->initialInplace(), "FIPNUM"); + if (fipc.output(FIPConfig::OutputField::FIPNUM)) { + logOutput_.fip(inplace, this->initialInplace(), "FIPNUM"); + } + if (fipc.output(FIPConfig::OutputField::FIP)) { + for (const auto& reg : this->regions_) { + if (reg.first != "FIPNUM") { + logOutput_.fip(inplace, this->initialInplace(), reg.first); + } + } + } } return inplace; @@ -287,9 +306,10 @@ outputFipLog(std::map& miscSummaryData, template Inplace EclGenericOutputBlackoilModule:: outputFipresvLog(std::map& miscSummaryData, - std::map>& regionData, - const bool substep, - const Parallel::Communication& comm) + std::map>& regionData, + const std::size_t reportStepNum, + const bool substep, + const Parallel::Communication& comm) { auto inplace = this->accumulateRegionSums(comm); if (comm.rank() != 0) @@ -299,7 +319,16 @@ outputFipresvLog(std::map& miscSummaryData, miscSummaryData, regionData); - if (!substep && !forceDisableFipresvOutput_) { + // For report step 0 we use the RPTSOL config, else derive from RPTSCHED + std::unique_ptr fipSched; + if (reportStepNum != 0) { + const auto& rpt = this->schedule_[reportStepNum].rpt_config.get(); + fipSched = std::make_unique(rpt); + } + const FIPConfig& fipc = reportStepNum == 0 ? this->eclState_.getEclipseConfig().fip() + : *fipSched; + + if (!substep && !forceDisableFipresvOutput_ && fipc.output(FIPConfig::OutputField::RESV)) { logOutput_.fipResv(inplace); } diff --git a/ebos/eclgenericoutputblackoilmodule.hh b/ebos/eclgenericoutputblackoilmodule.hh index e86585d17..b25c6a9b0 100644 --- a/ebos/eclgenericoutputblackoilmodule.hh +++ b/ebos/eclgenericoutputblackoilmodule.hh @@ -79,17 +79,17 @@ public: // write Fluid In Place to output log Inplace outputFipLog(std::map& miscSummaryData, std::map>& regionData, + const std::size_t reportStepNum, const bool substep, const Parallel::Communication& comm); // write Reservoir Volumes to output log Inplace outputFipresvLog(std::map& miscSummaryData, std::map>& regionData, + const std::size_t reportStepNum, const bool substep, const Parallel::Communication& comm); - - void outputErrorLog(const Parallel::Communication& comm) const; void addRftDataToWells(data::Wells& wellDatas, diff --git a/ebos/eclwriter.hh b/ebos/eclwriter.hh index b82222a53..0a4b04d58 100644 --- a/ebos/eclwriter.hh +++ b/ebos/eclwriter.hh @@ -248,9 +248,11 @@ public: std::map> regionData; Inplace inplace; { - OPM_TIMEBLOCK(outputFipLogAndFipresvLog); - inplace = eclOutputModule_->outputFipLog(miscSummaryData, regionData, isSubStep, simulator_.gridView().comm()); - eclOutputModule_->outputFipresvLog(miscSummaryData, regionData, isSubStep, simulator_.gridView().comm()); + OPM_TIMEBLOCK(outputFipLogAndFipresvLog); + inplace = eclOutputModule_->outputFipLog(miscSummaryData, regionData, reportStepNum, + isSubStep, simulator_.gridView().comm()); + eclOutputModule_->outputFipresvLog(miscSummaryData, regionData, reportStepNum, + isSubStep, simulator_.gridView().comm()); } bool forceDisableProdOutput = false; bool forceDisableInjOutput = false; From db85303a3eda6931dc3bb89bff83157c28e85d71 Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Thu, 9 Nov 2023 12:38:25 +0100 Subject: [PATCH 2/2] added: write out RPTSOL configured FIPs to PRT file on simulation start add a method in EclWriter to enable this. this is called the first time a call is made to WriteOutput, as that happens after initial conditions have been applied which is required to get the proper output. this also fixes a long-standing issue where the initial FIP state was taken after the first time step. --- ebos/eclgenericoutputblackoilmodule.cc | 5 +--- ebos/eclproblem.hh | 6 +++-- ebos/eclwriter.hh | 37 ++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ebos/eclgenericoutputblackoilmodule.cc b/ebos/eclgenericoutputblackoilmodule.cc index 486b3b84c..9e97aa5cf 100644 --- a/ebos/eclgenericoutputblackoilmodule.cc +++ b/ebos/eclgenericoutputblackoilmodule.cc @@ -1335,10 +1335,7 @@ accumulateRegionSums(const Parallel::Communication& comm) } // The first time the outputFipLog function is run we store the inplace values in - // the initialInplace_ member. This has at least two problems: - // - // o We really want the *initial* value - now we get the value after - // the first timestep. + // the initialInplace_ member. This has a problem: // // o For restarted runs this is obviously wrong. // diff --git a/ebos/eclproblem.hh b/ebos/eclproblem.hh index 2252215f5..776f85769 100644 --- a/ebos/eclproblem.hh +++ b/ebos/eclproblem.hh @@ -754,8 +754,6 @@ public: if (enableEclOutput_){ eclWriter_->writeOutput(std::move(localCellData), isSubStep); } - - } void finalizeOutput() { @@ -1346,6 +1344,10 @@ public: if (enableAquifers_) aquiferModel_.initialSolutionApplied(); + + if (this->simulator().episodeIndex() == 0) { + eclWriter_->writeInitialFIPReport(); + } } /*! diff --git a/ebos/eclwriter.hh b/ebos/eclwriter.hh index 0a4b04d58..4991c95bd 100644 --- a/ebos/eclwriter.hh +++ b/ebos/eclwriter.hh @@ -319,6 +319,43 @@ public: } } + //! \brief Writes the initial FIP report as configured in RPTSOL. + void writeInitialFIPReport() + { + const auto& fip = simulator_.vanguard().eclState().getEclipseConfig().fip(); + if (!fip.output(FIPConfig::OutputField::FIELD) && + !fip.output(FIPConfig::OutputField::RESV)) { + return; + } + + const auto& gridView = simulator_.vanguard().gridView(); + const int numElements = gridView.size(/*codim=*/0); + + this->eclOutputModule_-> + allocBuffers(numElements, 0, false, false, /*isRestart*/ false); + +#ifdef _OPENMP +#pragma omp parallel for +#endif + for (int dofIdx = 0; dofIdx < numElements; ++dofIdx) { + const auto& intQuants = *simulator_.model().cachedIntensiveQuantities(dofIdx, /*timeIdx=*/0); + const auto totVolume = simulator_.model().dofTotalVolume(dofIdx); + + this->eclOutputModule_->updateFluidInPlace(dofIdx, intQuants, totVolume); + } + + std::map miscSummaryData; + std::map> regionData; + Inplace inplace; + { + OPM_TIMEBLOCK(outputFipLogAndFipresvLog); + inplace = eclOutputModule_->outputFipLog(miscSummaryData, regionData, 0, + false, simulator_.gridView().comm()); + eclOutputModule_->outputFipresvLog(miscSummaryData, regionData, 0, + false, simulator_.gridView().comm()); + } + } + void writeOutput(data::Solution&& localCellData, bool isSubStep) { OPM_TIMEBLOCK(writeOutput);