Tidy Up FlowProblem* Classes

In preparation of enabling the new saturation function consistency
checks.
This commit is contained in:
Bård Skaflestad 2024-10-15 18:09:25 +02:00
parent 585627295f
commit 92efa31c31
3 changed files with 92 additions and 70 deletions

View File

@ -37,8 +37,8 @@
#include <opm/common/utility/TimeService.hpp> #include <opm/common/utility/TimeService.hpp>
#include <opm/input/eclipse/EclipseState/EclipseState.hpp> #include <opm/input/eclipse/EclipseState/EclipseState.hpp>
#include <opm/input/eclipse/Parser/ParserKeywords/E.hpp>
#include <opm/input/eclipse/Schedule/Schedule.hpp> #include <opm/input/eclipse/Schedule/Schedule.hpp>
#include <opm/input/eclipse/Units/Units.hpp>
#include <opm/material/common/ConditionalStorage.hpp> #include <opm/material/common/ConditionalStorage.hpp>
#include <opm/material/common/Valgrind.hpp> #include <opm/material/common/Valgrind.hpp>
@ -72,8 +72,10 @@
#include <opm/utility/CopyablePtr.hpp> #include <opm/utility/CopyablePtr.hpp>
#include <algorithm> #include <algorithm>
#include <cstddef>
#include <functional> #include <functional>
#include <set> #include <set>
#include <stdexcept>
#include <string> #include <string>
#include <vector> #include <vector>
@ -224,38 +226,36 @@ public:
, pffDofData_(simulator.gridView(), this->elementMapper()) , pffDofData_(simulator.gridView(), this->elementMapper())
, tracerModel_(simulator) , tracerModel_(simulator)
{ {
const auto& vanguard = simulator.vanguard(); this->enableDriftCompensation_ = Parameters::Get<Parameters::EnableDriftCompensation>();
this->enableVtkOutput_ = Parameters::Get<Parameters::EnableVtkOutput>();
enableDriftCompensation_ = Parameters::Get<Parameters::EnableDriftCompensation>();
enableVtkOutput_ = Parameters::Get<Parameters::EnableVtkOutput>();
this->enableTuning_ = Parameters::Get<Parameters::EnableTuning>(); this->enableTuning_ = Parameters::Get<Parameters::EnableTuning>();
this->initialTimeStepSize_ = Parameters::Get<Parameters::InitialTimeStepSize<Scalar>>(); this->initialTimeStepSize_ = Parameters::Get<Parameters::InitialTimeStepSize<Scalar>>();
this->maxTimeStepAfterWellEvent_ = Parameters::Get<Parameters::TimeStepAfterEventInDays<Scalar>>() * 24 * 60 * 60; this->maxTimeStepAfterWellEvent_ = unit::convert::from
(Parameters::Get<Parameters::TimeStepAfterEventInDays<Scalar>>(), unit::day);
// The value N for this parameter is defined in the following order of presedence: // The value N for this parameter is defined in the following order of precedence:
//
// 1. Command line value (--num-pressure-points-equil=N) // 1. Command line value (--num-pressure-points-equil=N)
// 2. EQLDIMS item 2 //
// Default value is defined in opm-common/src/opm/input/eclipse/share/keywords/000_Eclipse100/E/EQLDIMS // 2. EQLDIMS item 2. Default value from
if (Parameters::IsSet<Parameters::NumPressurePointsEquil>()) // opm-common/opm/input/eclipse/share/keywords/000_Eclipse100/E/EQLDIMS
{
this->numPressurePointsEquil_ = Parameters::Get<Parameters::NumPressurePointsEquil>();
} else {
this->numPressurePointsEquil_ = simulator.vanguard().eclState().getTableManager().getEqldims().getNumDepthNodesP();
}
explicitRockCompaction_ = Parameters::Get<Parameters::ExplicitRockCompaction>(); this->numPressurePointsEquil_ = Parameters::IsSet<Parameters::NumPressurePointsEquil>()
? Parameters::Get<Parameters::NumPressurePointsEquil>()
: simulator.vanguard().eclState().getTableManager().getEqldims().getNumDepthNodesP();
this->explicitRockCompaction_ = Parameters::Get<Parameters::ExplicitRockCompaction>();
RelpermDiagnostics relpermDiagnostics; RelpermDiagnostics relpermDiagnostics{};
relpermDiagnostics.diagnosis(vanguard.eclState(), vanguard.cartesianIndexMapper()); relpermDiagnostics.diagnosis(simulator.vanguard().eclState(),
simulator.vanguard().cartesianIndexMapper());
} }
virtual ~FlowProblem() = default; virtual ~FlowProblem() = default;
void prefetch(const Element& elem) const void prefetch(const Element& elem) const
{ pffDofData_.prefetch(elem); } { this->pffDofData_.prefetch(elem); }
/*! /*!
* \brief This method restores the complete state of the problem and its sub-objects * \brief This method restores the complete state of the problem and its sub-objects

View File

@ -43,21 +43,25 @@
#include <opm/output/eclipse/EclipseIO.hpp> #include <opm/output/eclipse/EclipseIO.hpp>
#include <opm/input/eclipse/Units/Units.hpp>
#include <opm/simulators/flow/ActionHandler.hpp>
#include <opm/simulators/flow/FlowProblem.hpp> #include <opm/simulators/flow/FlowProblem.hpp>
#include <opm/simulators/flow/FlowProblemBlackoilProperties.hpp> #include <opm/simulators/flow/FlowProblemBlackoilProperties.hpp>
#include <opm/simulators/flow/FlowThresholdPressure.hpp> #include <opm/simulators/flow/FlowThresholdPressure.hpp>
#include <opm/simulators/flow/MixingRateControls.hpp>
#include <opm/simulators/flow/VtkTracerModule.hpp> #include <opm/simulators/flow/VtkTracerModule.hpp>
#include <opm/simulators/flow/MixingRateControls.hpp>
#include <opm/simulators/flow/ActionHandler.hpp>
#if HAVE_DAMARIS #if HAVE_DAMARIS
#include <opm/simulators/flow/DamarisWriter.hpp> #include <opm/simulators/flow/DamarisWriter.hpp>
#endif #endif
#include <algorithm> #include <algorithm>
#include <cstddef>
#include <functional> #include <functional>
#include <set> #include <set>
#include <stdexcept>
#include <string> #include <string>
#include <vector> #include <vector>
@ -209,6 +213,7 @@ public:
// create the ECL writer // create the ECL writer
eclWriter_ = std::make_unique<EclWriterType>(simulator); eclWriter_ = std::make_unique<EclWriterType>(simulator);
enableEclOutput_ = Parameters::Get<Parameters::EnableEclOutput>(); enableEclOutput_ = Parameters::Get<Parameters::EnableEclOutput>();
#if HAVE_DAMARIS #if HAVE_DAMARIS
// create Damaris writer // create Damaris writer
damarisWriter_ = std::make_unique<DamarisWriterType>(simulator); damarisWriter_ = std::make_unique<DamarisWriterType>(simulator);
@ -224,23 +229,27 @@ public:
FlowProblemType::beginEpisode(); FlowProblemType::beginEpisode();
auto& simulator = this->simulator(); auto& simulator = this->simulator();
int episodeIdx = simulator.episodeIndex();
const int episodeIdx = simulator.episodeIndex();
const auto& schedule = simulator.vanguard().schedule(); const auto& schedule = simulator.vanguard().schedule();
// Evaluate UDQ assign statements to make sure the settings are // Evaluate UDQ assign statements to make sure the settings are
// available as UDA controls for the current report step. // available as UDA controls for the current report step.
actionHandler_.evalUDQAssignments(episodeIdx, simulator.vanguard().udqState()); this->actionHandler_
.evalUDQAssignments(episodeIdx, simulator.vanguard().udqState());
if (episodeIdx >= 0) { if (episodeIdx >= 0) {
const auto& oilVap = schedule[episodeIdx].oilvap(); const auto& oilVap = schedule[episodeIdx].oilvap();
if (oilVap.getType() == OilVaporizationProperties::OilVaporization::VAPPARS) { if (oilVap.getType() == OilVaporizationProperties::OilVaporization::VAPPARS) {
FluidSystem::setVapPars(oilVap.vap1(), oilVap.vap2()); FluidSystem::setVapPars(oilVap.vap1(), oilVap.vap2());
} else { }
else {
FluidSystem::setVapPars(0.0, 0.0); FluidSystem::setVapPars(0.0, 0.0);
} }
} }
ConvectiveMixingModule::beginEpisode(simulator.vanguard().eclState(), simulator.vanguard().schedule(), episodeIdx, moduleParams_.convectiveMixingModuleParam); ConvectiveMixingModule::beginEpisode(simulator.vanguard().eclState(), schedule, episodeIdx,
this->moduleParams_.convectiveMixingModuleParam);
} }
/*! /*!
@ -248,18 +257,21 @@ public:
*/ */
void finishInit() void finishInit()
{ {
// TODO: there should be room to remove duplication for this function, // TODO: there should be room to remove duplication for this
// but there is relatively complicated logic in the function calls in this function // function, but there is relatively complicated logic in the
// some refactoring is needed for this function // function calls here. Some refactoring is needed.
FlowProblemType::finishInit(); FlowProblemType::finishInit();
auto& simulator = this->simulator(); auto& simulator = this->simulator();
auto finishTransmissibilities = [updated = false, this]() mutable auto finishTransmissibilities = [updated = false, this]() mutable
{ {
if (updated) { return; } if (updated) { return; }
this->transmissibilities_.finishInit([&vg = this->simulator().vanguard()](const unsigned int it) { this->transmissibilities_.finishInit([&vg = this->simulator().vanguard()](const unsigned int it) {
return vg.gridIdxToEquilGridIdx(it); return vg.gridIdxToEquilGridIdx(it);
}); });
updated = true; updated = true;
}; };
@ -279,7 +291,8 @@ public:
std::function<unsigned int(unsigned int)> equilGridToGrid = [&simulator](unsigned int i) { std::function<unsigned int(unsigned int)> equilGridToGrid = [&simulator](unsigned int i) {
return simulator.vanguard().gridEquilIdxToGridIdx(i); return simulator.vanguard().gridEquilIdxToGridIdx(i);
}; };
eclWriter_->extractOutputTransAndNNC(equilGridToGrid);
this->eclWriter_->extractOutputTransAndNNC(equilGridToGrid);
} }
simulator.vanguard().releaseGlobalTransmissibilities(); simulator.vanguard().releaseGlobalTransmissibilities();
@ -301,10 +314,12 @@ public:
// disables gravity, else the standard value of the gravity constant at sea level // disables gravity, else the standard value of the gravity constant at sea level
// on earth is used // on earth is used
this->gravity_ = 0.0; this->gravity_ = 0.0;
if (Parameters::Get<Parameters::EnableGravity>()) if (Parameters::Get<Parameters::EnableGravity>() &&
this->gravity_[dim - 1] = 9.80665; eclState.getInitConfig().hasGravity())
if (!eclState.getInitConfig().hasGravity()) {
this->gravity_[dim - 1] = 0.0; // unit::gravity is 9.80665 m^2/s--i.e., standard measure at Tellus equator.
this->gravity_[dim - 1] = unit::gravity;
}
if (this->enableTuning_) { if (this->enableTuning_) {
// if support for the TUNING keyword is enabled, we get the initial time // if support for the TUNING keyword is enabled, we get the initial time
@ -316,8 +331,6 @@ public:
this->initFluidSystem_(); this->initFluidSystem_();
if (FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) && if (FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx)) { FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx)) {
this->maxOilSaturation_.resize(this->model().numGridDof(), 0.0); this->maxOilSaturation_.resize(this->model().numGridDof(), 0.0);
@ -333,22 +346,25 @@ public:
} }
return coords; return coords;
}); });
this->readMaterialParameters_(); this->readMaterialParameters_();
this->readThermalParameters_(); this->readThermalParameters_();
// write the static output files (EGRID, INIT) // write the static output files (EGRID, INIT)
if (enableEclOutput_) { if (enableEclOutput_) {
eclWriter_->writeInit(); this->eclWriter_->writeInit();
} }
finishTransmissibilities(); finishTransmissibilities();
const auto& initconfig = eclState.getInitConfig(); const auto& initconfig = eclState.getInitConfig();
this->tracerModel_.init(initconfig.restartRequested()); this->tracerModel_.init(initconfig.restartRequested());
if (initconfig.restartRequested()) if (initconfig.restartRequested()) {
readEclRestartSolution_(); this->readEclRestartSolution_();
else }
readInitialCondition_(); else {
this->readInitialCondition_();
}
this->tracerModel_.prepareTracerBatches(); this->tracerModel_.prepareTracerBatches();
@ -357,14 +373,14 @@ public:
if constexpr (getPropValue<TypeTag, Properties::EnablePolymer>()) { if constexpr (getPropValue<TypeTag, Properties::EnablePolymer>()) {
const auto& vanguard = this->simulator().vanguard(); const auto& vanguard = this->simulator().vanguard();
const auto& gridView = vanguard.gridView(); const auto& gridView = vanguard.gridView();
int numElements = gridView.size(/*codim=*/0); const int numElements = gridView.size(/*codim=*/0);
this->polymer_.maxAdsorption.resize(numElements, 0.0); this->polymer_.maxAdsorption.resize(numElements, 0.0);
} }
this->readBoundaryConditions_(); this->readBoundaryConditions_();
// compute and set eq weights based on initial b values // compute and set eq weights based on initial b values
computeAndSetEqWeights_(); this->computeAndSetEqWeights_();
if (this->enableDriftCompensation_) { if (this->enableDriftCompensation_) {
this->drift_.resize(this->model().numGridDof()); this->drift_.resize(this->model().numGridDof());
@ -386,10 +402,11 @@ public:
} }
// TODO: move to the end for later refactoring of the function finishInit() // TODO: move to the end for later refactoring of the function finishInit()
// deal with DRSDT //
// deal with DRSDT
this->mixControls_.init(this->model().numGridDof(), this->mixControls_.init(this->model().numGridDof(),
this->episodeIndex(), this->episodeIndex(),
eclState.runspec().tabdims().getNumPVTTables()); eclState.runspec().tabdims().getNumPVTTables());
} }
/*! /*!

View File

@ -20,10 +20,20 @@
module for the precise wording of the license and the list of module for the precise wording of the license and the list of
copyright holders. copyright holders.
*/ */
#include "config.h" #include "config.h"
#define BOOST_TEST_MODULE Equil #define BOOST_TEST_MODULE Equil
#include <boost/test/unit_test.hpp>
#include <boost/version.hpp>
#if (BOOST_VERSION / 100000 == 1) && ((BOOST_VERSION / 100) % 1000 < 71)
#include <boost/test/floating_point_comparison.hpp>
#else
#include <boost/test/tools/floating_point_comparison.hpp>
#endif
#include <opm/grid/UnstructuredGrid.h> #include <opm/grid/UnstructuredGrid.h>
#include <opm/grid/GridManager.hpp> #include <opm/grid/GridManager.hpp>
#include <opm/grid/cpgrid/GridHelpers.hpp> #include <opm/grid/cpgrid/GridHelpers.hpp>
@ -58,42 +68,37 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <boost/test/unit_test.hpp>
#include <boost/version.hpp>
#if BOOST_VERSION / 100000 == 1 && BOOST_VERSION / 100 % 1000 < 71
#include <boost/test/floating_point_comparison.hpp>
#else
#include <boost/test/tools/floating_point_comparison.hpp>
#endif
namespace Opm::Properties { namespace Opm::Properties {
namespace TTag { namespace TTag {
struct TestEquilTypeTag { struct TestEquilTypeTag {
using InheritsFrom = std::tuple<FlowBaseProblemBlackoil, using InheritsFrom = std::tuple<FlowBaseProblemBlackoil,
BlackOilModel>; BlackOilModel>;
}; };
struct TestEquilVapwatTypeTag { struct TestEquilVapwatTypeTag {
using InheritsFrom = std::tuple<FlowBaseProblemBlackoil, using InheritsFrom = std::tuple<FlowBaseProblemBlackoil,
BlackOilModel>; BlackOilModel>;
}; };
}
} // namespace TTag
template<class TypeTag> template<class TypeTag>
struct WellModel<TypeTag, TTag::TestEquilTypeTag> { struct WellModel<TypeTag, TTag::TestEquilTypeTag> {
using type = BlackoilWellModel<TypeTag>; using type = BlackoilWellModel<TypeTag>;
}; };
template<class TypeTag> template<class TypeTag>
struct EnableVapwat<TypeTag, TTag::TestEquilTypeTag> { struct EnableVapwat<TypeTag, TTag::TestEquilTypeTag> {
static constexpr bool value = true; static constexpr bool value = true;
}; };
template<class TypeTag> template<class TypeTag>
struct WellModel<TypeTag, TTag::TestEquilVapwatTypeTag> { struct WellModel<TypeTag, TTag::TestEquilVapwatTypeTag> {
using type = BlackoilWellModel<TypeTag>; using type = BlackoilWellModel<TypeTag>;
}; };
template<class TypeTag> template<class TypeTag>
struct EnableVapwat<TypeTag, TTag::TestEquilVapwatTypeTag> { struct EnableVapwat<TypeTag, TTag::TestEquilVapwatTypeTag> {
static constexpr bool value = true; static constexpr bool value = true;
@ -101,18 +106,19 @@ struct EnableVapwat<TypeTag, TTag::TestEquilVapwatTypeTag> {
} // namespace Opm::Properties } // namespace Opm::Properties
namespace {
template <class TypeTag> template <class TypeTag>
std::unique_ptr<Opm::GetPropType<TypeTag, Opm::Properties::Simulator>> std::unique_ptr<Opm::GetPropType<TypeTag, Opm::Properties::Simulator>>
initSimulator(const char *filename) initSimulator(const char *filename)
{ {
using Simulator = Opm::GetPropType<TypeTag, Opm::Properties::Simulator>; using Simulator = Opm::GetPropType<TypeTag, Opm::Properties::Simulator>;
std::string filenameArg = "--ecl-deck-file-name="; const auto filenameArg = std::string {"--ecl-deck-file-name="} + filename;
filenameArg += filename;
const char* argv[] = { const char* argv[] = {
"test_equil", "test_equil",
filenameArg.c_str() filenameArg.c_str(),
}; };
Opm::setupParameters_<TypeTag>(/*argc=*/sizeof(argv)/sizeof(argv[0]), argv, /*registerParams=*/false); Opm::setupParameters_<TypeTag>(/*argc=*/sizeof(argv)/sizeof(argv[0]), argv, /*registerParams=*/false);
@ -123,7 +129,8 @@ initSimulator(const char *filename)
} }
template <class GridView> template <class GridView>
static std::vector<std::pair<double,double>> cellVerticalExtent(const GridView& gridView) std::vector<std::pair<double,double>>
cellVerticalExtent(const GridView& gridView)
{ {
using ElementMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>; using ElementMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
ElementMapper elemMapper(gridView, Dune::mcmgElementLayout()); ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
@ -142,7 +149,7 @@ static std::vector<std::pair<double,double>> cellVerticalExtent(const GridView&
} }
template <class TypeTag> template <class TypeTag>
static void initDefaultFluidSystem() void initDefaultFluidSystem()
{ {
using FluidSystem = Opm::GetPropType<TypeTag, Opm::Properties::FluidSystem>; using FluidSystem = Opm::GetPropType<TypeTag, Opm::Properties::FluidSystem>;
@ -207,11 +214,12 @@ static void initDefaultFluidSystem()
FluidSystem::initEnd(); FluidSystem::initEnd();
} }
static Opm::EquilRecord mkEquilRecord( double datd, double datp, Opm::EquilRecord
double zwoc, double pcow_woc, mkEquilRecord(const double datd, const double datp,
double zgoc, double pcgo_goc ) const double zwoc, const double pcow_woc,
const double zgoc, const double pcgo_goc)
{ {
return Opm::EquilRecord( datd, datp, zwoc, pcow_woc, zgoc, pcgo_goc, true, true, 0, true); return { datd, datp, zwoc, pcow_woc, zgoc, pcgo_goc, true, true, 0, true};
} }
template <typename Simulator> template <typename Simulator>
@ -220,8 +228,6 @@ double centerDepth(const Simulator& sim, const std::size_t cell)
return Opm::UgGridHelpers::cellCenterDepth(sim.vanguard().grid(), cell); return Opm::UgGridHelpers::cellCenterDepth(sim.vanguard().grid(), cell);
} }
namespace {
struct EquilFixture { struct EquilFixture {
EquilFixture() { EquilFixture() {
int argc = boost::unit_test::framework::master_test_suite().argc; int argc = boost::unit_test::framework::master_test_suite().argc;
@ -253,7 +259,7 @@ struct EquilFixture {
CartesianIndexMapper>; CartesianIndexMapper>;
}; };
} } // Anonymous namespace
BOOST_GLOBAL_FIXTURE(EquilFixture); BOOST_GLOBAL_FIXTURE(EquilFixture);
@ -845,7 +851,6 @@ BOOST_AUTO_TEST_CASE(DeckWithCO2STORE)
} }
} }
BOOST_AUTO_TEST_CASE(DeckWithWetGas) BOOST_AUTO_TEST_CASE(DeckWithWetGas)
{ {
using TypeTag = Opm::Properties::TTag::TestEquilTypeTag; using TypeTag = Opm::Properties::TTag::TestEquilTypeTag;