diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e531de34..8f8983098 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -259,6 +259,14 @@ opm_add_test(ebos_altidx DEPENDS "opmsimulators" LIBRARIES "opmsimulators") +opm_add_test(ebos_plain + ONLY_COMPILE + DEFAULT_ENABLE_IF ${EBOS_DEBUG_EXTENSIONS_DEFAULT_ENABLE_IF} + SOURCES ebos/ebos_plain.cc + EXE_NAME ebos_plain + DEPENDS "opmsimulators" + LIBRARIES "opmsimulators") + opm_add_bash_completion(ebos_solvent) opm_add_bash_completion(ebos_polymer) opm_add_bash_completion(ebos_gasoil) diff --git a/ebos/eclbasevanguard.hh b/ebos/eclbasevanguard.hh index cc162db89..5d5a5b786 100644 --- a/ebos/eclbasevanguard.hh +++ b/ebos/eclbasevanguard.hh @@ -238,6 +238,7 @@ public: tmp.emplace_back(Opm::ParseContext::PARSE_MISSING_DIMS_KEYWORD, Opm::InputError::WARN); tmp.emplace_back(Opm::ParseContext::SUMMARY_UNKNOWN_WELL, Opm::InputError::WARN); tmp.emplace_back(Opm::ParseContext::SUMMARY_UNKNOWN_GROUP, Opm::InputError::WARN); + tmp.emplace_back(Opm::ParseContext::PARSE_EXTRA_RECORDS, Opm::InputError::WARN); Opm::ParseContext parseContext(tmp); Opm::ErrorGuard errorGuard; diff --git a/ebos/ecloutputblackoilmodule.hh b/ebos/ecloutputblackoilmodule.hh index 8b7c34e3b..25b6604a8 100644 --- a/ebos/ecloutputblackoilmodule.hh +++ b/ebos/ecloutputblackoilmodule.hh @@ -607,25 +607,25 @@ public: val.second = Opm::getValue(fs.saturation(waterPhaseIdx)); else if (key.first == "BGSAT") val.second = Opm::getValue(fs.saturation(gasPhaseIdx)); - else if (key.first == "BOSAT") + else if (key.first == "BOSAT") val.second = 1. - Opm::getValue(fs.saturation(gasPhaseIdx)) - Opm::getValue(fs.saturation(waterPhaseIdx)); else if (key.first == "BPR") val.second = Opm::getValue(fs.pressure(oilPhaseIdx)); - else if (key.first == "BWKR" || key.first == "BKRW") + else if (key.first == "BWKR" || key.first == "BKRW") val.second = Opm::getValue(intQuants.relativePermeability(waterPhaseIdx)); - else if (key.first == "BGKR" || key.first == "BKRG") + else if (key.first == "BGKR" || key.first == "BKRG") val.second = Opm::getValue(intQuants.relativePermeability(gasPhaseIdx)); - else if (key.first == "BOKR" || key.first == "BKRO") + else if (key.first == "BOKR" || key.first == "BKRO") val.second = Opm::getValue(intQuants.relativePermeability(oilPhaseIdx)); - else if (key.first == "BWPC") + else if (key.first == "BWPC") val.second = Opm::getValue(fs.pressure(oilPhaseIdx)) - Opm::getValue(fs.pressure(waterPhaseIdx)); - else if (key.first == "BGPC") + else if (key.first == "BGPC") val.second = Opm::getValue(fs.pressure(gasPhaseIdx)) - Opm::getValue(fs.pressure(oilPhaseIdx)); - else if (key.first == "BVWAT" || key.first == "BWVIS") + else if (key.first == "BVWAT" || key.first == "BWVIS") val.second = Opm::getValue(fs.viscosity(waterPhaseIdx)); - else if (key.first == "BVGAS" || key.first == "BGVIS") + else if (key.first == "BVGAS" || key.first == "BGVIS") val.second = Opm::getValue(fs.viscosity(gasPhaseIdx)); - else if (key.first == "BVOIL" || key.first == "BOVIS") + else if (key.first == "BVOIL" || key.first == "BOVIS") val.second = Opm::getValue(fs.viscosity(oilPhaseIdx)); else { std::string logstring = "Keyword '"; @@ -1020,7 +1020,7 @@ public: } - void setRestart(const Opm::data::Solution& sol, unsigned elemIdx, unsigned globalDofIndex) + void setRestart(const Opm::data::Solution& sol, unsigned elemIdx, unsigned globalDofIndex) { Scalar so = 1.0; if (saturation_[waterPhaseIdx].size() > 0 && sol.has("SWAT")) { diff --git a/ebos/eclproblem.hh b/ebos/eclproblem.hh index d254c9947..6d7c578db 100644 --- a/ebos/eclproblem.hh +++ b/ebos/eclproblem.hh @@ -152,6 +152,9 @@ NEW_PROP_TAG(EnableApiTracking); // The class which deals with ECL aquifers NEW_PROP_TAG(EclAquiferModel); +// In experimental mode, decides if the aquifer model should be enabled or not +NEW_PROP_TAG(EclEnableAquifers); + // time stepping parameters NEW_PROP_TAG(EclMaxTimeStepSizeAfterWellEvent); NEW_PROP_TAG(EclRestartShrinkFactor); @@ -232,6 +235,9 @@ SET_TYPE_PROP(EclBaseProblem, EclAquiferModel, Ewoms::EclBaseAquiferModel); +// Enable aquifers by default in experimental mode +SET_BOOL_PROP(EclBaseProblem, EclEnableAquifers, true); + // Enable gravity SET_BOOL_PROP(EclBaseProblem, EnableGravity, true); @@ -475,6 +481,9 @@ public: if (enableExperiments) EWOMS_REGISTER_PARAM(TypeTag, bool, EclEnableDriftCompensation, "Enable partial compensation of systematic mass losses via the source term of the next time step"); + if (enableExperiments) + EWOMS_REGISTER_PARAM(TypeTag, bool, EclEnableAquifers, + "Enable analytic and numeric aquifer models"); EWOMS_REGISTER_PARAM(TypeTag, Scalar, EclMaxTimeStepSizeAfterWellEvent, "Maximum time step size after an well event"); EWOMS_REGISTER_PARAM(TypeTag, Scalar, EclRestartShrinkFactor, @@ -556,11 +565,11 @@ public: return "The Ecl-deck Black-Oil reservoir Simulator (ebos); a hydrocarbon " "reservoir simulation program that processes ECL-formatted input " - "files and is provided by the Open Porous Media project " + "files that is part of the Open Porous Media project " "(https://opm-project.org).\n" "\n" - "THE `ebos` SIMULATOR IS FOR RESEARCH PURPOSES ONLY! For industrial " - "applications, use `flow`."; + "THE GOAL OF THE `ebos` SIMULATOR IS TO CATER FOR THE NEEDS OF " + "DEVELOPMENT AND RESEARCH. No guarantees are made for production use!"; else return briefDescription_; } @@ -601,6 +610,11 @@ public: enableEclOutput_ = EWOMS_GET_PARAM(TypeTag, bool, EnableEclOutput); + if (enableExperiments) + enableAquifers_ = EWOMS_GET_PARAM(TypeTag, bool, EclEnableAquifers); + else + enableAquifers_ = true; + enableTuning_ = EWOMS_GET_PARAM(TypeTag, bool, EclEnableTuning); initialTimeStepSize_ = EWOMS_GET_PARAM(TypeTag, Scalar, InitialTimeStepSize); minTimeStepSize_ = EWOMS_GET_PARAM(TypeTag, Scalar, MinTimeStepSize); @@ -736,8 +750,9 @@ public: // deserialize the wells wellModel_.deserialize(res); - // deserialize the aquifer - aquiferModel_.deserialize(res); + if (enableAquifers_) + // deserialize the aquifer + aquiferModel_.deserialize(res); } /*! @@ -750,7 +765,9 @@ public: void serialize(Restarter& res) { wellModel_.serialize(res); - aquiferModel_.serialize(res); + + if (enableAquifers_) + aquiferModel_.serialize(res); } /*! @@ -820,7 +837,9 @@ public: wellModel_.beginEpisode(); // set up the aquifers for the next episode. - aquiferModel_.beginEpisode(); + if (enableAquifers_) + // set up the aquifers for the next episode. + aquiferModel_.beginEpisode(); // set the size of the initial time step of the episode Scalar dt = limitNextTimeStepSize_(simulator.episodeLength()); @@ -841,7 +860,7 @@ public: { const auto& simulator = this->simulator(); int epsiodeIdx = simulator.episodeIndex(); - bool invalidateIntensiveQuantities = false; + bool invalidateIntensiveQuantities = false; const auto& oilVaporizationControl = simulator.vanguard().schedule().getOilVaporizationProperties(epsiodeIdx); if (drsdtActive_()) // DRSDT is enabled @@ -865,7 +884,8 @@ public: this->model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0); wellModel_.beginTimeStep(); - aquiferModel_.beginTimeStep(); + if (enableAquifers_) + aquiferModel_.beginTimeStep(); tracerModel_.beginTimeStep(); } @@ -887,7 +907,8 @@ public: void beginIteration() { wellModel_.beginIteration(); - aquiferModel_.beginIteration(); + if (enableAquifers_) + aquiferModel_.beginIteration(); } /*! @@ -896,7 +917,8 @@ public: void endIteration() { wellModel_.endIteration(); - aquiferModel_.endIteration(); + if (enableAquifers_) + aquiferModel_.endIteration(); } /*! @@ -910,15 +932,19 @@ public: // the right thing (i.e., the mass change inside the whole reservoir must be // equivalent to the fluxes over the grid's boundaries plus the source rates // specified by the problem) - std::cout << "checking conservativeness of solution\n"; + int rank = this->simulator().gridView().comm().rank(); + if (rank == 0) + std::cout << "checking conservativeness of solution\n"; this->model().checkConservativeness(/*tolerance=*/-1, /*verbose=*/true); - std::cout << "solution is sufficiently conservative\n"; + if (rank == 0) + std::cout << "solution is sufficiently conservative\n"; } #endif // NDEBUG const auto& simulator = this->simulator(); wellModel_.endTimeStep(); - aquiferModel_.endTimeStep(); + if (enableAquifers_) + aquiferModel_.endTimeStep(); tracerModel_.endTimeStep(); // deal with DRSDT and DRVDT @@ -1478,7 +1504,8 @@ public: updateCompositionChangeLimits_(); - aquiferModel_.initialSolutionApplied(); + if (enableAquifers_) + aquiferModel_.initialSolutionApplied(); } /*! @@ -1506,7 +1533,8 @@ public: assert(Opm::isfinite(rate[eqIdx])); } - aquiferModel_.addToSource(rate, context, spaceIdx, timeIdx); + if (enableAquifers_) + aquiferModel_.addToSource(rate, context, spaceIdx, timeIdx); // if requested, compensate systematic mass loss for cells which were "well // behaved" in the last time step @@ -1824,7 +1852,8 @@ private: void checkDeckCompatibility_() const { const auto& deck = this->simulator().vanguard().deck(); - bool beVerbose = this->simulator().gridView().comm().rank() == 0; + const auto& comm = this->simulator().gridView().comm(); + bool beVerbose = comm.rank() == 0; if (enableApiTracking) throw std::logic_error("API tracking is not yet implemented but requested at compile time."); @@ -2496,8 +2525,10 @@ private: for (size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx)*simulator.timeStepSize(); - if (tracerModel().numTracers() > 0) - std::cout << "Warning: Restart is not implemented for the tracer model, it will initialize with initial tracer concentration" << std::endl; + if (tracerModel().numTracers() > 0 && this->gridView().comm().rank() == 0) + std::cout << "Warning: Restart is not implemented for the tracer model, it will initialize itself " + << "with the initial tracer concentration.\n" + << std::flush; // assign the restart solution to the current solution. note that we still need // to compute real initial solution after this because the initial fluid states @@ -3128,6 +3159,7 @@ private: GlobalEqVector drift_; EclWellModel wellModel_; + bool enableAquifers_; EclAquiferModel aquiferModel_; bool enableEclOutput_; diff --git a/ebos/eclthresholdpressure.hh b/ebos/eclthresholdpressure.hh index d972e70a6..4e5046330 100644 --- a/ebos/eclthresholdpressure.hh +++ b/ebos/eclthresholdpressure.hh @@ -168,8 +168,8 @@ public: int cartElem1Idx = vanguard.cartesianIndex(elem1Idx); int cartElem2Idx = vanguard.cartesianIndex(elem2Idx); - assert(0 <= cartElem1Idx && cartElemFaultIdx_.size() > 0U + cartElem1Idx); - assert(0 <= cartElem2Idx && cartElemFaultIdx_.size() > 0U + cartElem2Idx); + assert(0 <= cartElem1Idx && static_cast(cartElemFaultIdx_.size()) > cartElem1Idx); + assert(0 <= cartElem2Idx && static_cast(cartElemFaultIdx_.size()) > cartElem2Idx); int fault1Idx = cartElemFaultIdx_[cartElem1Idx]; int fault2Idx = cartElemFaultIdx_[cartElem2Idx]; diff --git a/ebos/ecltracermodel.hh b/ebos/ecltracermodel.hh index fedb4b8fd..e2a988e75 100644 --- a/ebos/ecltracermodel.hh +++ b/ebos/ecltracermodel.hh @@ -101,17 +101,22 @@ public: return; // tracer treatment is supposed to be disabled if (!EWOMS_GET_PARAM(TypeTag, bool, EnableTracerModel)) { - std::cout << "Warning: Tracer model is disabled but the deck contatins the TRACERS keyword \n"; - std::cout << "The tracer model must be activated using --enable-tracer-model=true "<< std::endl; + if (simulator_.gridView().comm().rank() == 0) { + std::cout << "Warning: Tracer model is disabled but the deck contains the TRACERS keyword\n" + << "The tracer model must be explictly activated using --enable-tracer-model=true\n" + << std::flush; + } return; // Tracer transport must be enabled by the user } if (!deck.hasKeyword("TRACER")) - throw std::runtime_error("the deck does not contain the TRACER keyword"); + throw std::runtime_error("The deck does not contain the TRACER keyword"); if (simulator_.gridView().comm().size() > 1) { tracerNames_.resize(0); - std::cout << "Warning: Tracer model is not compatible with mpi run" << std::endl; + if (simulator_.gridView().comm().rank() == 0) + std::cout << "Warning: The tracer model currently does not work for parallel runs\n" + << std::flush; return; } diff --git a/ebos/tracervdtable.hh b/ebos/tracervdtable.hh index 5e4722697..9d25f3f63 100644 --- a/ebos/tracervdtable.hh +++ b/ebos/tracervdtable.hh @@ -26,7 +26,7 @@ * \copydoc Ewoms::TracerVdTable */ #ifndef EWOMS_TRACER_VD_TABLE_HH -#define EWOMS_TRACER_VD_TABLE_HH +#define EWOMS_TRACER_VD_TABLE_HH #include