mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
@@ -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<TypeTa
|
||||
// use the built-in proof of concept well model by default
|
||||
SET_TYPE_PROP(EclBaseProblem, EclWellModel, EclWellManager<TypeTag>);
|
||||
|
||||
// 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_;
|
||||
|
||||
Reference in New Issue
Block a user