28#ifndef OPM_ECL_WRITER_HPP
29#define OPM_ECL_WRITER_HPP
31#include <dune/grid/common/partitionset.hh>
33#include <opm/common/TimingMacros.hpp>
34#include <opm/common/OpmLog/OpmLog.hpp>
35#include <opm/common/utility/TimeService.hpp>
36#include <opm/input/eclipse/Schedule/RPTConfig.hpp>
38#include <opm/input/eclipse/Units/UnitSystem.hpp>
39#include <opm/input/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>
41#include <opm/output/eclipse/Inplace.hpp>
42#include <opm/output/eclipse/RegionVariableCollection.hpp>
43#include <opm/output/eclipse/RestartValue.hpp>
58#ifdef RESERVOIR_COUPLING_ENABLED
62#include <boost/date_time/posix_time/posix_time.hpp>
118template <
class TypeTag,
class OutputModule>
120 GetPropType<TypeTag, Properties::EquilGrid>,
121 GetPropType<TypeTag, Properties::GridView>,
122 GetPropType<TypeTag, Properties::ElementMapper>,
123 GetPropType<TypeTag, Properties::Scalar>>
133 using Element =
typename GridView::template Codim<0>::Entity;
135 using ElementIterator =
typename GridView::template Codim<0>::Iterator;
138 typedef Dune::MultipleCodimMultipleGeomTypeMapper< GridView > VertexMapper;
140 static constexpr bool enableEnergy =
141 getPropValue<TypeTag, Properties::EnergyModuleType>() == EnergyModules::FullyImplicitThermal ||
142 getPropValue<TypeTag, Properties::EnergyModuleType>() == EnergyModules::SequentialImplicitThermal;
143 enum { enableMech = getPropValue<TypeTag, Properties::EnableMech>() };
144 static constexpr bool enableSolvent = getPropValue<TypeTag, Properties::EnableSolvent>();
145 enum { enableGeochemistry = getPropValue<TypeTag, Properties::EnableGeochemistry>() };
150 std::vector<std::pair<std::string, std::vector<std::size_t>>>;
154 OutputModule::registerParameters();
156 Parameters::Register<Parameters::EnableAsyncEclOutput>
157 (
"Write the ECL-formated results in a non-blocking way "
158 "(i.e., using a separate thread).");
159 Parameters::Register<Parameters::EnableEsmry>
160 (
"Write ESMRY file for fast loading of summary data.");
167 :
BaseType(simulator.vanguard().schedule(),
168 simulator.vanguard().eclState(),
169 simulator.vanguard().summaryConfig(),
170 simulator.vanguard().grid(),
171 ((simulator.vanguard().grid().comm().rank() == 0)
172 ? &simulator.vanguard().equilGrid()
174 simulator.vanguard().gridView(),
175 simulator.vanguard().cartesianIndexMapper(),
176 ((simulator.vanguard().grid().comm().rank() == 0)
177 ? &simulator.vanguard().equilCartesianIndexMapper()
179 Parameters::
Get<Parameters::EnableAsyncEclOutput>(),
180 Parameters::
Get<Parameters::EnableEsmry>())
181 , simulator_(simulator)
184 if (this->simulator_.vanguard().grid().comm().size() > 1) {
185 auto smryCfg = (this->simulator_.vanguard().grid().comm().rank() == 0)
186 ? this->
eclIO_->finalSummaryConfig()
189 eclBroadcast(this->simulator_.vanguard().grid().comm(), smryCfg);
191 this->outputModule_ = std::make_unique<OutputModule>
197 this->outputModule_ = std::make_unique<OutputModule>
198 (simulator, this->
eclIO_->finalSummaryConfig(), this->collectOnIORank_);
201 this->rank_ = this->simulator_.vanguard().grid().comm().rank();
203 this->simulator_.vanguard().eclState().computeFipRegionStatistics();
211 return simulator_.vanguard().equilGrid();
217 this->
eclIO_->recordNewDynamicWellConns(newConns);
227 const int reportStepNum = simulator_.episodeIndex() + 1;
247 if (reportStepNum == 0)
250 const Scalar curTime = simulator_.time() + simulator_.timeStepSize();
251 const Scalar totalCpuTime =
252 simulator_.executionTimer().realTimeElapsed() +
253 simulator_.setupTimer().realTimeElapsed() +
254 simulator_.vanguard().setupTime();
256 auto& regVars = this->outputModule_->regionVariables();
258 regVars.prepareValueAccumulation();
260 if (
const auto conn_opt_ix = regVars
261 .variableIndex(this->outputModule_->regVarMapping(),
"ConnOPT");
262 conn_opt_ix.has_value())
264 this->simulator_.problem()
265 .wellModel().reportIntervalConnectionOilProduction
266 (this->simulator_.timeStepSize(), *conn_opt_ix, regVars);
269 const auto localWellData = simulator_.problem().wellModel().wellData();
270 const auto localWBP = simulator_.problem().wellModel().wellBlockAveragePressures();
271 const auto localGroupAndNetworkData = simulator_.problem().wellModel()
272 .groupAndNetworkData(reportStepNum);
274 const auto localAquiferData = simulator_.problem().aquiferModel().aquiferData();
275 const auto localWellTestState = simulator_.problem().wellModel().wellTestState();
276 this->prepareLocalCellData(isSubStep, reportStepNum);
278 if (this->outputModule_->needInterfaceFluxes(isSubStep)) {
279 this->captureLocalFluxData();
285 std::map<std::pair<std::string,int>,
double> dummy;
287 outputModule_->getBlockData(),
291 localGroupAndNetworkData,
294 this->outputModule_->getInterRegFlows(),
297 this->outputModule_->getLgrBlockData());
302 if (! iregFlows.readIsConsistent()) {
303 throw std::runtime_error {
304 "Inconsistent inter-region flow "
305 "region set names in parallel"
313 this->simulator_.vanguard().grid().comm());
317 std::map<std::string, double> miscSummaryData;
318 std::map<std::string, std::vector<double>> regionData;
322 OPM_TIMEBLOCK(outputFipLogAndFipresvLog);
324 inplace = outputModule_->calc_inplace(miscSummaryData, regionData, simulator_.gridView().comm());
332 if (totalCpuTime != 0.0) {
333 miscSummaryData[
"TCPU"] = totalCpuTime;
359 const auto rcGroupRates = this->collectReservoirCouplingGroupRates_();
367 regVars.commitValues();
371 : this->outputModule_->getBlockData();
375 : this->outputModule_->getLgrBlockData();
379 : this->outputModule_->getInterRegFlows();
385 localGroupAndNetworkData,
391 this->outputModule_->regVarMapping(),
394 this->outputModule_->initialInplace(),
396 this->summaryState(),
398 rcGroupRates ? &(*rcGroupRates) :
nullptr);
405 const auto& gridView = simulator_.vanguard().gridView();
409 this->outputModule_->
410 allocBuffers(num_interior, 0,
false,
false,
414#pragma omp parallel for
416 for (
int dofIdx = 0; dofIdx < num_interior; ++dofIdx) {
417 const auto& intQuants = simulator_.model().intensiveQuantities(dofIdx, 0);
418 const auto totVolume = simulator_.model().dofTotalVolume(dofIdx);
420 this->outputModule_->updateFluidInPlace(dofIdx, intQuants, totVolume);
425 outputModule_->calc_initial_inplace(simulator_.gridView().comm());
428 const auto& fip = simulator_.vanguard().eclState().getEclipseConfig().fip();
429 if (fip.output(FIPConfig::OutputField::FIELD) ||
430 fip.output(FIPConfig::OutputField::RESV))
432 OPM_TIMEBLOCK(outputFipLogAndFipresvLog);
434 const auto start_time = boost::posix_time::from_time_t
435 (TimeService::to_time_t(simulator_.vanguard().schedule().getStartTime()));
438 this->inplace_ = *this->outputModule_->initialInplace();
440 this->outputModule_->
441 outputFipAndResvLog(this->inplace_, 0, 0.0, start_time,
442 false, simulator_.gridView().comm());
446 outputModule_->outputFipAndResvLogToCSV(0,
false, simulator_.gridView().comm());
463 const auto firstStep = this->initialStep();
467 const auto& rpt = this->
schedule_[simStep].rpt_config();
469 if (rpt.contains(
"WELSPECS") && (rpt.at(
"WELSPECS") > 0)) {
472 this->writeWellspecReport(timer);
480 if (rpt.contains(
"WELLS") && rpt.at(
"WELLS") > 0) {
481 this->writeWellflowReport(timer, simStep, rpt.at(
"WELLS"));
484 this->outputModule_->outputFipAndResvLog(this->inplace_,
489 simulator_.gridView().comm());
494 void writeOutput(data::Solution&& localCellData,
const bool isSubStep,
const bool isForcedFinalOutput)
498 const int reportStepNum = simulator_.episodeIndex() + 1;
499 this->prepareLocalCellData(isSubStep, reportStepNum);
500 this->outputModule_->outputErrorLog(simulator_.gridView().comm());
503 auto localWellData = simulator_.problem().wellModel().wellData();
504 auto localGroupAndNetworkData = simulator_.problem().wellModel()
505 .groupAndNetworkData(reportStepNum);
507 auto localAquiferData = simulator_.problem().aquiferModel().aquiferData();
508 auto localWellTestState = simulator_.problem().wellModel().wellTestState();
510 const bool isFlowsn = this->outputModule_->getFlows().hasFlowsn();
511 auto flowsn = this->outputModule_->getFlows().getFlowsn();
513 const bool isFloresn = this->outputModule_->getFlows().hasFloresn();
514 auto floresn = this->outputModule_->getFlows().getFloresn();
516 if (! isSubStep || Parameters::Get<Parameters::EnableWriteAllSolutions>()) {
518 if (localCellData.empty()) {
519 this->outputModule_->assignToSolution(localCellData);
523 this->outputModule_->addRftDataToWells(localWellData,
525 simulator_.gridView().comm());
529 this->collectOnIORank_.doesNeedReordering())
537 this->outputModule_->getBlockData(),
538 this->outputModule_->getExtraBlockData(),
541 localGroupAndNetworkData,
552 this->outputModule_->assignGlobalFieldsToSolution(localCellData);
556 const Scalar curTime = simulator_.time() + simulator_.timeStepSize();
557 const Scalar nextStepSize = simulator_.problem().nextTimeStepSize();
558 std::optional<int> timeStepIdx;
559 if (Parameters::Get<Parameters::EnableWriteAllSolutions>()) {
560 timeStepIdx = simulator_.timeStepIndex();
564 std::move(localCellData),
565 std::move(localWellData),
566 std::move(localGroupAndNetworkData),
567 std::move(localAquiferData),
568 std::move(localWellTestState),
571 this->summaryState(),
572 this->simulator_.problem().thresholdPressure().getRestartVector(),
573 curTime, nextStepSize,
574 Parameters::Get<Parameters::EclOutputDoublePrecision>(),
575 isFlowsn, std::move(flowsn),
576 isFloresn, std::move(floresn));
582 const auto enablePCHysteresis = simulator_.problem().materialLawManager().enablePCHysteresis();
583 const auto enableNonWettingHysteresis = simulator_.problem().materialLawManager().enableNonWettingHysteresis();
584 const auto enableWettingHysteresis = simulator_.problem().materialLawManager().enableWettingHysteresis();
585 const auto oilActive = FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx);
586 const auto gasActive = FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx);
587 const auto waterActive = FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx);
588 const auto enableSwatinit = simulator_.vanguard().eclState().fieldProps().has_double(
"SWATINIT");
590 std::vector<RestartKey> solutionKeys {
591 {
"PRESSURE", UnitSystem::measure::pressure},
592 {
"SWAT", UnitSystem::measure::identity, waterActive},
593 {
"SGAS", UnitSystem::measure::identity, gasActive},
594 {
"TEMP", UnitSystem::measure::temperature, enableEnergy},
595 {
"SSOLVENT", UnitSystem::measure::identity, enableSolvent},
597 {
"RS", UnitSystem::measure::gas_oil_ratio, FluidSystem::enableDissolvedGas()},
598 {
"RV", UnitSystem::measure::oil_gas_ratio, FluidSystem::enableVaporizedOil()},
599 {
"RVW", UnitSystem::measure::oil_gas_ratio, FluidSystem::enableVaporizedWater()},
600 {
"RSW", UnitSystem::measure::gas_oil_ratio, FluidSystem::enableDissolvedGasInWater()},
602 {
"SGMAX", UnitSystem::measure::identity, enableNonWettingHysteresis && oilActive && gasActive},
603 {
"SHMAX", UnitSystem::measure::identity, enableWettingHysteresis && oilActive && gasActive},
605 {
"SOMAX", UnitSystem::measure::identity,
606 (enableNonWettingHysteresis && oilActive && waterActive)
607 || simulator_.problem().vapparsActive(simulator_.episodeIndex())},
609 {
"SOMIN", UnitSystem::measure::identity, enablePCHysteresis && oilActive && gasActive},
610 {
"SWHY1", UnitSystem::measure::identity, enablePCHysteresis && oilActive && waterActive},
611 {
"SWMAX", UnitSystem::measure::identity, enableWettingHysteresis && oilActive && waterActive},
613 {
"PPCW", UnitSystem::measure::pressure, enableSwatinit},
617 const auto& tracers = simulator_.vanguard().eclState().tracer();
619 for (
const auto& tracer : tracers) {
620 const auto enableSolTracer =
621 ((tracer.phase == Phase::GAS) && FluidSystem::enableDissolvedGas()) ||
622 ((tracer.phase == Phase::OIL) && FluidSystem::enableVaporizedOil());
624 solutionKeys.emplace_back(tracer.fname(), UnitSystem::measure::identity,
true);
625 solutionKeys.emplace_back(tracer.sname(), UnitSystem::measure::identity, enableSolTracer);
629 const auto& inputThpres = eclState().getSimulationConfig().getThresholdPressure();
630 const std::vector<RestartKey> extraKeys {
631 {
"OPMEXTRA", UnitSystem::measure::identity,
false},
632 {
"THRESHPR", UnitSystem::measure::pressure, inputThpres.active()},
635 const auto& gridView = this->simulator_.vanguard().gridView();
636 const auto numElements = gridView.size(0);
640 this->outputModule_->allocBuffers(numElements,
646 const auto restartSolution =
648 solutionKeys, gridView.comm(), 0);
650 if (!restartSolution.empty()) {
651 for (
auto elemIdx = 0*numElements; elemIdx < numElements; ++elemIdx) {
653 this->outputModule_->setRestart(restartSolution, elemIdx, globalIdx);
656 this->simulator_.problem().readSolutionFromOutputModule(0,
true);
657 this->simulator_.problem().temperatureModel().init();
658 ElementContext elemCtx(this->simulator_);
659 for (
const auto& elem : elements(gridView, Dune::Partitions::interior)) {
660 elemCtx.updatePrimaryStencil(elem);
661 elemCtx.updatePrimaryIntensiveQuantities(0);
663 this->outputModule_->updateFluidInPlace(elemCtx);
666 this->outputModule_->calc_initial_inplace(this->simulator_.gridView().comm());
674 const auto restartStepIdx = this->simulator_.vanguard()
675 .eclState().getInitConfig().getRestartStep();
677 this->outputModule_->allocBuffers(numElements,
685 const auto restartValues =
688 this->summaryState(),
689 solutionKeys, extraKeys, gridView.comm());
691 for (
auto elemIdx = 0*numElements; elemIdx < numElements; ++elemIdx) {
693 this->outputModule_->setRestart(restartValues.solution, elemIdx, globalIdx);
696 auto& tracer_model = simulator_.problem().tracerModel();
697 for (
int tracer_index = 0; tracer_index < tracer_model.numTracers(); ++tracer_index) {
700 const auto& free_tracer_name = tracer_model.fname(tracer_index);
701 const auto& free_tracer_solution = restartValues.solution
702 .template data<double>(free_tracer_name);
704 for (
auto elemIdx = 0*numElements; elemIdx < numElements; ++elemIdx) {
706 tracer_model.setFreeTracerConcentration
707 (tracer_index, elemIdx, free_tracer_solution[globalIdx]);
712 if ((tracer_model.phase(tracer_index) == Phase::GAS && FluidSystem::enableDissolvedGas()) ||
713 (tracer_model.phase(tracer_index) == Phase::OIL && FluidSystem::enableVaporizedOil()))
715 tracer_model.setEnableSolTracers(tracer_index,
true);
717 const auto& sol_tracer_name = tracer_model.sname(tracer_index);
718 const auto& sol_tracer_solution = restartValues.solution
719 .template data<double>(sol_tracer_name);
721 for (
auto elemIdx = 0*numElements; elemIdx < numElements; ++elemIdx) {
723 tracer_model.setSolTracerConcentration
724 (tracer_index, elemIdx, sol_tracer_solution[globalIdx]);
728 tracer_model.setEnableSolTracers(tracer_index,
false);
730 for (
auto elemIdx = 0*numElements; elemIdx < numElements; ++elemIdx) {
731 tracer_model.setSolTracerConcentration(tracer_index, elemIdx, 0.0);
736 if (inputThpres.active()) {
737 const_cast<Simulator&
>(this->simulator_)
738 .problem().thresholdPressure()
739 .setFromRestart(restartValues.getExtra(
"THRESHPR"));
742 restartTimeStepSize_ = restartValues.getExtra(
"OPMEXTRA")[0];
743 if (restartTimeStepSize_ <= 0) {
744 restartTimeStepSize_ = std::numeric_limits<double>::max();
748 this->simulator_.problem().wellModel()
749 .initFromRestartFile(restartValues);
751 if (!restartValues.aquifer.empty()) {
752 this->simulator_.problem().mutableAquiferModel()
753 .initFromRestart(restartValues.aquifer);
763 this->outputModule_->calc_initial_inplace(this->simulator_.gridView().comm());
766 if (
const auto* iip = this->outputModule_->initialInplace(); iip !=
nullptr) {
767 this->inplace_ = *iip;
773 {
return *outputModule_; }
776 {
return *outputModule_; }
779 {
return restartTimeStepSize_; }
781 template <
class Serializer>
784 serializer(*outputModule_);
788 static bool enableEclOutput_()
790 static bool enable = Parameters::Get<Parameters::EnableEclOutput>();
794 const EclipseState& eclState()
const
795 {
return simulator_.vanguard().eclState(); }
797 SummaryState& summaryState()
798 {
return simulator_.vanguard().summaryState(); }
800 Action::State& actionState()
801 {
return simulator_.vanguard().actionState(); }
804 {
return simulator_.vanguard().udqState(); }
806 const Schedule& schedule()
const
807 {
return simulator_.vanguard().schedule(); }
813 std::optional<data::ReservoirCouplingGroupRates> collectReservoirCouplingGroupRates_()
815#ifdef RESERVOIR_COUPLING_ENABLED
820 using WellModelType = std::remove_cvref_t<
821 decltype(simulator_.problem().wellModel())>;
822 if constexpr (
requires(WellModelType& wm) { wm.isReservoirCouplingMaster(); }) {
823 auto& wellModel = simulator_.problem().wellModel();
824 if (wellModel.isReservoirCouplingMaster()) {
825 return wellModel.reservoirCouplingMaster()
826 .collectGroupRatesForSummary();
828 if (wellModel.isReservoirCouplingSlave()) {
829 auto rates = data::ReservoirCouplingGroupRates{};
830 for (
const auto& [group, targets] :
831 wellModel.reservoirCouplingSlave().effectiveInjectionTargets())
833 for (
const auto& [phase, target] : targets) {
834 rates.injection_targets[group][phase] =
static_cast<double>(target);
837 for (
const auto& [group, limits] :
838 wellModel.reservoirCouplingSlave().effectiveProductionTargets())
840 for (
const auto& [cmode, limit] : limits) {
841 rates.production_targets[group][cmode] =
static_cast<double>(limit);
851 void prepareLocalCellData(
const bool isSubStep,
852 const int reportStepNum)
854 OPM_TIMEBLOCK(prepareLocalCellData);
856 if (this->outputModule_->localDataValid()) {
860 const auto& gridView = simulator_.vanguard().gridView();
865 const bool writeAllSolutions =
866 Parameters::Get<Parameters::EnableWriteAllSolutions>();
870 const bool forceRestartFieldAllocation =
871 writeAllSolutions && (simulator_.timeStepIndex() > 0);
872 this->outputModule_->
873 allocBuffers(num_interior, reportStepNum,
874 isSubStep && !writeAllSolutions,
875 log, forceRestartFieldAllocation);
877 ElementContext elemCtx(simulator_);
882 OPM_TIMEBLOCK(prepareCellBasedData);
884 this->outputModule_->prepareDensityAccumulation();
885 this->outputModule_->setupExtractors(isSubStep, reportStepNum);
886 for (
const auto& elem : elements(gridView, Dune::Partitions::interior)) {
887 elemCtx.updatePrimaryStencil(elem);
888 elemCtx.updatePrimaryIntensiveQuantities(0);
890 this->outputModule_->processElement(elemCtx);
891 this->outputModule_->processElementBlockData(elemCtx);
893 this->outputModule_->clearExtractors();
897 OPM_TIMEBLOCK(prepareFluidInPlace);
900#pragma omp parallel for
902 for (
int dofIdx = 0; dofIdx < num_interior; ++dofIdx) {
903 const auto& intQuants = simulator_.model().intensiveQuantities(dofIdx, 0);
904 const auto totVolume = simulator_.model().dofTotalVolume(dofIdx);
906 this->outputModule_->updateFluidInPlace(dofIdx, intQuants, totVolume);
911 this->simulator_.vanguard().grid().comm());
914 this->outputModule_->accumulateDensityParallel();
915 this->outputModule_->validateLocalData();
918 void captureLocalFluxData()
920 OPM_TIMEBLOCK(captureLocalData);
922 const auto& gridView = this->simulator_.vanguard().gridView();
923 const auto timeIdx = 0u;
925 auto elemCtx = ElementContext { this->simulator_ };
927 const auto elemMapper = ElementMapper { gridView, Dune::mcmgElementLayout() };
928 const auto activeIndex = [&elemMapper](
const Element& e)
930 return elemMapper.index(e);
933 const auto cartesianIndex = [
this](
const int elemIndex)
935 return this->
cartMapper_.cartesianIndex(elemIndex);
938 this->outputModule_->initializeFluxData();
942 for (
const auto& elem : elements(gridView, Dune::Partitions::interiorBorder)) {
943 elemCtx.updateStencil(elem);
944 elemCtx.updateIntensiveQuantities(timeIdx);
945 elemCtx.updateExtensiveQuantities(timeIdx);
947 this->outputModule_->processFluxes(elemCtx, activeIndex, cartesianIndex);
951 this->simulator_.vanguard().grid().comm())
953 this->outputModule_->finalizeFluxData();
956 void writeWellspecReport(const SimulatorTimer& timer)
const
958 const auto changedWells = this->
schedule_
959 .changed_wells(timer.reportStepNum(), this->initialStep());
961 const auto changedWellLists = this->
schedule_
962 .changedWellLists(timer.reportStepNum(), this->initialStep());
964 if (changedWells.empty() && !changedWellLists) {
968 this->outputModule_->outputWellspecReport(changedWells,
970 timer.reportStepNum(),
971 timer.simulationTimeElapsed(),
972 timer.currentDateTime());
975 void writeWellflowReport(
const SimulatorTimer& timer,
977 const int wellsRequest)
const
979 this->outputModule_->outputTimeStamp(
"WELLS",
980 timer.simulationTimeElapsed(),
981 timer.reportStepNum(),
982 timer.currentDateTime());
984 const auto wantConnData = wellsRequest > 1;
986 this->outputModule_->outputProdLog(simStep, wantConnData);
987 this->outputModule_->outputInjLog(simStep, wantConnData);
988 this->outputModule_->outputCumLog(simStep, wantConnData);
989 this->outputModule_->outputMSWLog(simStep);
992 int initialStep()
const
994 const auto& initConfig = this->eclState().cfg().init();
996 return initConfig.restartRequested()
997 ? initConfig.getRestartStep()
1001 Simulator& simulator_;
1002 std::unique_ptr<OutputModule> outputModule_;
1003 Scalar restartTimeStepSize_;
#define OPM_END_PARALLEL_TRY_CATCH(prefix, comm)
Catch exception and throw in a parallel try-catch clause.
Definition: DeferredLoggingErrorHelpers.hpp:197
#define OPM_BEGIN_PARALLEL_TRY_CATCH()
Macro to setup the try of a parallel try-catch.
Definition: DeferredLoggingErrorHelpers.hpp:160
Declares the properties required by the black oil model.
const std::map< std::tuple< std::string, int, int >, double > & globalLgrBlockData() const
Definition: CollectDataOnIORank.hpp:95
int localIdxToGlobalIdx(unsigned localIdx) const
Definition: CollectDataOnIORank_impl.hpp:1197
InterRegFlowMap & globalInterRegFlows()
Definition: CollectDataOnIORank.hpp:119
bool isParallel() const
Definition: CollectDataOnIORank.hpp:134
bool isIORank() const
Definition: CollectDataOnIORank.hpp:131
const std::map< std::pair< std::string, int >, double > & globalBlockData() const
Definition: CollectDataOnIORank.hpp:92
const data::Solution & globalCellData() const
Definition: CollectDataOnIORank.hpp:98
void collect(const data::Solution &localCellData, const std::map< std::pair< std::string, int >, double > &localBlockData, std::map< std::pair< std::string, int >, double > &localExtraBlockData, const data::Wells &localWellData, const data::WellBlockAveragePressures &localWBPData, const data::GroupAndNetworkValues &localGroupAndNetworkData, const data::Aquifers &localAquiferData, const WellTestState &localWellTestState, const InterRegFlowMap &interRegFlows, const std::array< FlowsData< double >, 3 > &localFlowsn, const std::array< FlowsData< double >, 3 > &localFloresn, const std::map< std::tuple< std::string, int, int >, double > &localLgrBlockData)
Definition: CollectDataOnIORank_impl.hpp:1055
Definition: EclGenericWriter.hpp:76
void evalSummary(int reportStepNum, GetPropType< TypeTag, Properties::Scalar > curTime, const data::Wells &localWellData, const data::WellBlockAveragePressures &localWBPData, const data::GroupAndNetworkValues &localGroupAndNetworkData, const std::map< int, data::AquiferData > &localAquiferData, const std::map< std::pair< std::string, int >, double > &blockData, const std::map< std::tuple< std::string, int, int >, double > &lgrBlockData, const std::map< std::string, double > &miscSummaryData, const std::map< std::string, std::vector< double > > ®ionData, const data::RegionVariableMapping ®VarMap, const RegionVariableCollection ®Vars, const Inplace &inplace, const Inplace *initialInPlace, const InterRegFlowMap &interRegFlows, SummaryState &summaryState, UDQState &udqState, const data::ReservoirCouplingGroupRates *rcGroupRates=nullptr)
Definition: EclGenericWriter_impl.hpp:1058
CollectDataOnIORankType collectOnIORank_
Definition: EclGenericWriter.hpp:192
const Schedule & schedule_
Definition: EclGenericWriter.hpp:195
SimulatorReport simulation_report_
Definition: EclGenericWriter.hpp:206
SimulatorReportSingle sub_step_report_
Definition: EclGenericWriter.hpp:205
const Dune::CartesianIndexMapper< GetPropType< TypeTag, Properties::Grid > > & cartMapper_
Definition: EclGenericWriter.hpp:202
std::unique_ptr< EclipseIO > eclIO_
Definition: EclGenericWriter.hpp:197
void doWriteOutput(const int reportStepNum, const std::optional< int > timeStepNum, const bool isSubStep, const bool forcedSimulationFinished, data::Solution &&localCellData, data::Wells &&localWellData, data::GroupAndNetworkValues &&localGroupAndNetworkData, data::Aquifers &&localAquiferData, WellTestState &&localWTestState, const Action::State &actionState, const UDQState &udqState, const SummaryState &summaryState, const std::vector< GetPropType< TypeTag, Properties::Scalar > > &thresholdPressure, GetPropType< TypeTag, Properties::Scalar > curTime, GetPropType< TypeTag, Properties::Scalar > nextStepSize, bool doublePrecision, bool isFlowsn, std::array< FlowsData< double >, 3 > &&flowsn, bool isFloresn, std::array< FlowsData< double >, 3 > &&floresn)
Definition: EclGenericWriter_impl.hpp:948
Collects necessary output values and pass it to opm-common's ECL output.
Definition: EclWriter.hpp:124
OutputModule & mutableOutputModule() const
Definition: EclWriter.hpp:775
const OutputModule & outputModule() const
Definition: EclWriter.hpp:772
void writeOutput(data::Solution &&localCellData, const bool isSubStep, const bool isForcedFinalOutput)
Definition: EclWriter.hpp:494
void evalSummaryState(bool isSubStep)
collect and pass data and pass it to eclIO writer
Definition: EclWriter.hpp:224
static void registerParameters()
Definition: EclWriter.hpp:152
void serializeOp(Serializer &serializer)
Definition: EclWriter.hpp:782
void writeInitialFIPReport()
Writes the initial FIP report as configured in RPTSOL.
Definition: EclWriter.hpp:403
std::vector< std::pair< std::string, std::vector< std::size_t > > > DynamicConns
Definition: EclWriter.hpp:150
void beginRestart()
Definition: EclWriter.hpp:580
EclWriter(Simulator &simulator)
Definition: EclWriter.hpp:166
void writeReports(const SimulatorTimer &timer)
Definition: EclWriter.hpp:449
void recordNewDynamicWellConns(const DynamicConns &newConns)
Definition: EclWriter.hpp:214
void endRestart()
Definition: EclWriter.hpp:758
Scalar restartTimeStepSize() const
Definition: EclWriter.hpp:778
~EclWriter()
Definition: EclWriter.hpp:206
const EquilGrid & globalGrid() const
Definition: EclWriter.hpp:209
virtual int reportStepNum() const
Current report step number. This might differ from currentStepNum in case of sub stepping.
Definition: SimulatorTimerInterface.hpp:109
Definition: SimulatorTimer.hpp:38
virtual boost::posix_time::ptime currentDateTime() const
Return the current time as a posix time object.
double simulationTimeElapsed() const override
Defines the common properties required by the porous medium multi-phase models.
Definition: ActionHandler.hpp:34
Definition: blackoilnewtonmethodparams.hpp:31
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition: parametersystem.hpp:192
std::size_t countLocalInteriorCellsGridView(const GridView &gridView)
Get the number of local interior cells in a grid view.
Definition: countGlobalCells.hpp:45
Definition: blackoilbioeffectsmodules.hh:45
data::Solution loadParallelRestartSolution(const EclipseIO *eclIO, const std::vector< RestartKey > &solutionKeys, Parallel::Communication comm, const int step)
void eclBroadcast(Parallel::Communication, T &)
RestartValue loadParallelRestart(const EclipseIO *eclIO, Action::State &actionState, SummaryState &summaryState, const std::vector< RestartKey > &solutionKeys, const std::vector< RestartKey > &extraKeys, Parallel::Communication comm)
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
Definition: EclWriter.hpp:82
static constexpr bool value
Definition: EclWriter.hpp:82
Definition: EclWriter.hpp:79
static constexpr bool value
Definition: EclWriter.hpp:79
Definition: EclWriter.hpp:89
static constexpr bool value
Definition: EclWriter.hpp:89
Definition: EclWriter.hpp:86
static constexpr bool value
Definition: EclWriter.hpp:86
SimulatorReportSingle success
Definition: SimulatorReport.hpp:203
unsigned int min_linear_iterations
Definition: SimulatorReport.hpp:52
unsigned int total_newton_iterations
Definition: SimulatorReport.hpp:50
unsigned int max_linear_iterations
Definition: SimulatorReport.hpp:53
unsigned int total_linear_iterations
Definition: SimulatorReport.hpp:51