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/input/eclipse/EclipseState/EclipseState.hpp>
#include <opm/input/eclipse/Parser/ParserKeywords/E.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/Valgrind.hpp>
@ -72,8 +72,10 @@
#include <opm/utility/CopyablePtr.hpp>
#include <algorithm>
#include <cstddef>
#include <functional>
#include <set>
#include <stdexcept>
#include <string>
#include <vector>
@ -224,38 +226,36 @@ public:
, pffDofData_(simulator.gridView(), this->elementMapper())
, tracerModel_(simulator)
{
const auto& vanguard = simulator.vanguard();
enableDriftCompensation_ = Parameters::Get<Parameters::EnableDriftCompensation>();
enableVtkOutput_ = Parameters::Get<Parameters::EnableVtkOutput>();
this->enableDriftCompensation_ = Parameters::Get<Parameters::EnableDriftCompensation>();
this->enableVtkOutput_ = Parameters::Get<Parameters::EnableVtkOutput>();
this->enableTuning_ = Parameters::Get<Parameters::EnableTuning>();
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)
// 2. EQLDIMS item 2
// Default value is defined in opm-common/src/opm/input/eclipse/share/keywords/000_Eclipse100/E/EQLDIMS
if (Parameters::IsSet<Parameters::NumPressurePointsEquil>())
{
this->numPressurePointsEquil_ = Parameters::Get<Parameters::NumPressurePointsEquil>();
} else {
this->numPressurePointsEquil_ = simulator.vanguard().eclState().getTableManager().getEqldims().getNumDepthNodesP();
}
//
// 2. EQLDIMS item 2. Default value from
// opm-common/opm/input/eclipse/share/keywords/000_Eclipse100/E/EQLDIMS
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.diagnosis(vanguard.eclState(), vanguard.cartesianIndexMapper());
RelpermDiagnostics relpermDiagnostics{};
relpermDiagnostics.diagnosis(simulator.vanguard().eclState(),
simulator.vanguard().cartesianIndexMapper());
}
virtual ~FlowProblem() = default;
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

View File

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

View File

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