mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
commit
9d6f20b172
@ -259,6 +259,14 @@ opm_add_test(ebos_altidx
|
|||||||
DEPENDS "opmsimulators"
|
DEPENDS "opmsimulators"
|
||||||
LIBRARIES "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_solvent)
|
||||||
opm_add_bash_completion(ebos_polymer)
|
opm_add_bash_completion(ebos_polymer)
|
||||||
opm_add_bash_completion(ebos_gasoil)
|
opm_add_bash_completion(ebos_gasoil)
|
||||||
|
@ -238,6 +238,7 @@ public:
|
|||||||
tmp.emplace_back(Opm::ParseContext::PARSE_MISSING_DIMS_KEYWORD, Opm::InputError::WARN);
|
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_WELL, Opm::InputError::WARN);
|
||||||
tmp.emplace_back(Opm::ParseContext::SUMMARY_UNKNOWN_GROUP, 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::ParseContext parseContext(tmp);
|
||||||
Opm::ErrorGuard errorGuard;
|
Opm::ErrorGuard errorGuard;
|
||||||
|
|
||||||
|
@ -607,25 +607,25 @@ public:
|
|||||||
val.second = Opm::getValue(fs.saturation(waterPhaseIdx));
|
val.second = Opm::getValue(fs.saturation(waterPhaseIdx));
|
||||||
else if (key.first == "BGSAT")
|
else if (key.first == "BGSAT")
|
||||||
val.second = Opm::getValue(fs.saturation(gasPhaseIdx));
|
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));
|
val.second = 1. - Opm::getValue(fs.saturation(gasPhaseIdx)) - Opm::getValue(fs.saturation(waterPhaseIdx));
|
||||||
else if (key.first == "BPR")
|
else if (key.first == "BPR")
|
||||||
val.second = Opm::getValue(fs.pressure(oilPhaseIdx));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
val.second = Opm::getValue(fs.viscosity(oilPhaseIdx));
|
||||||
else {
|
else {
|
||||||
std::string logstring = "Keyword '";
|
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;
|
Scalar so = 1.0;
|
||||||
if (saturation_[waterPhaseIdx].size() > 0 && sol.has("SWAT")) {
|
if (saturation_[waterPhaseIdx].size() > 0 && sol.has("SWAT")) {
|
||||||
|
@ -152,6 +152,9 @@ NEW_PROP_TAG(EnableApiTracking);
|
|||||||
// The class which deals with ECL aquifers
|
// The class which deals with ECL aquifers
|
||||||
NEW_PROP_TAG(EclAquiferModel);
|
NEW_PROP_TAG(EclAquiferModel);
|
||||||
|
|
||||||
|
// In experimental mode, decides if the aquifer model should be enabled or not
|
||||||
|
NEW_PROP_TAG(EclEnableAquifers);
|
||||||
|
|
||||||
// time stepping parameters
|
// time stepping parameters
|
||||||
NEW_PROP_TAG(EclMaxTimeStepSizeAfterWellEvent);
|
NEW_PROP_TAG(EclMaxTimeStepSizeAfterWellEvent);
|
||||||
NEW_PROP_TAG(EclRestartShrinkFactor);
|
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
|
// use the built-in proof of concept well model by default
|
||||||
SET_TYPE_PROP(EclBaseProblem, EclWellModel, EclWellManager<TypeTag>);
|
SET_TYPE_PROP(EclBaseProblem, EclWellModel, EclWellManager<TypeTag>);
|
||||||
|
|
||||||
|
// Enable aquifers by default in experimental mode
|
||||||
|
SET_BOOL_PROP(EclBaseProblem, EclEnableAquifers, true);
|
||||||
|
|
||||||
// Enable gravity
|
// Enable gravity
|
||||||
SET_BOOL_PROP(EclBaseProblem, EnableGravity, true);
|
SET_BOOL_PROP(EclBaseProblem, EnableGravity, true);
|
||||||
|
|
||||||
@ -475,6 +481,9 @@ public:
|
|||||||
if (enableExperiments)
|
if (enableExperiments)
|
||||||
EWOMS_REGISTER_PARAM(TypeTag, bool, EclEnableDriftCompensation,
|
EWOMS_REGISTER_PARAM(TypeTag, bool, EclEnableDriftCompensation,
|
||||||
"Enable partial compensation of systematic mass losses via the source term of the next time step");
|
"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,
|
EWOMS_REGISTER_PARAM(TypeTag, Scalar, EclMaxTimeStepSizeAfterWellEvent,
|
||||||
"Maximum time step size after an well event");
|
"Maximum time step size after an well event");
|
||||||
EWOMS_REGISTER_PARAM(TypeTag, Scalar, EclRestartShrinkFactor,
|
EWOMS_REGISTER_PARAM(TypeTag, Scalar, EclRestartShrinkFactor,
|
||||||
@ -556,11 +565,11 @@ public:
|
|||||||
return
|
return
|
||||||
"The Ecl-deck Black-Oil reservoir Simulator (ebos); a hydrocarbon "
|
"The Ecl-deck Black-Oil reservoir Simulator (ebos); a hydrocarbon "
|
||||||
"reservoir simulation program that processes ECL-formatted input "
|
"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"
|
"(https://opm-project.org).\n"
|
||||||
"\n"
|
"\n"
|
||||||
"THE `ebos` SIMULATOR IS FOR RESEARCH PURPOSES ONLY! For industrial "
|
"THE GOAL OF THE `ebos` SIMULATOR IS TO CATER FOR THE NEEDS OF "
|
||||||
"applications, use `flow`.";
|
"DEVELOPMENT AND RESEARCH. No guarantees are made for production use!";
|
||||||
else
|
else
|
||||||
return briefDescription_;
|
return briefDescription_;
|
||||||
}
|
}
|
||||||
@ -601,6 +610,11 @@ public:
|
|||||||
|
|
||||||
enableEclOutput_ = EWOMS_GET_PARAM(TypeTag, bool, EnableEclOutput);
|
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);
|
enableTuning_ = EWOMS_GET_PARAM(TypeTag, bool, EclEnableTuning);
|
||||||
initialTimeStepSize_ = EWOMS_GET_PARAM(TypeTag, Scalar, InitialTimeStepSize);
|
initialTimeStepSize_ = EWOMS_GET_PARAM(TypeTag, Scalar, InitialTimeStepSize);
|
||||||
minTimeStepSize_ = EWOMS_GET_PARAM(TypeTag, Scalar, MinTimeStepSize);
|
minTimeStepSize_ = EWOMS_GET_PARAM(TypeTag, Scalar, MinTimeStepSize);
|
||||||
@ -736,8 +750,9 @@ public:
|
|||||||
// deserialize the wells
|
// deserialize the wells
|
||||||
wellModel_.deserialize(res);
|
wellModel_.deserialize(res);
|
||||||
|
|
||||||
// deserialize the aquifer
|
if (enableAquifers_)
|
||||||
aquiferModel_.deserialize(res);
|
// deserialize the aquifer
|
||||||
|
aquiferModel_.deserialize(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -750,7 +765,9 @@ public:
|
|||||||
void serialize(Restarter& res)
|
void serialize(Restarter& res)
|
||||||
{
|
{
|
||||||
wellModel_.serialize(res);
|
wellModel_.serialize(res);
|
||||||
aquiferModel_.serialize(res);
|
|
||||||
|
if (enableAquifers_)
|
||||||
|
aquiferModel_.serialize(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -820,7 +837,9 @@ public:
|
|||||||
wellModel_.beginEpisode();
|
wellModel_.beginEpisode();
|
||||||
|
|
||||||
// set up the aquifers for the next episode.
|
// 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
|
// set the size of the initial time step of the episode
|
||||||
Scalar dt = limitNextTimeStepSize_(simulator.episodeLength());
|
Scalar dt = limitNextTimeStepSize_(simulator.episodeLength());
|
||||||
@ -841,7 +860,7 @@ public:
|
|||||||
{
|
{
|
||||||
const auto& simulator = this->simulator();
|
const auto& simulator = this->simulator();
|
||||||
int epsiodeIdx = simulator.episodeIndex();
|
int epsiodeIdx = simulator.episodeIndex();
|
||||||
bool invalidateIntensiveQuantities = false;
|
bool invalidateIntensiveQuantities = false;
|
||||||
const auto& oilVaporizationControl = simulator.vanguard().schedule().getOilVaporizationProperties(epsiodeIdx);
|
const auto& oilVaporizationControl = simulator.vanguard().schedule().getOilVaporizationProperties(epsiodeIdx);
|
||||||
if (drsdtActive_())
|
if (drsdtActive_())
|
||||||
// DRSDT is enabled
|
// DRSDT is enabled
|
||||||
@ -865,7 +884,8 @@ public:
|
|||||||
this->model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0);
|
this->model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0);
|
||||||
|
|
||||||
wellModel_.beginTimeStep();
|
wellModel_.beginTimeStep();
|
||||||
aquiferModel_.beginTimeStep();
|
if (enableAquifers_)
|
||||||
|
aquiferModel_.beginTimeStep();
|
||||||
tracerModel_.beginTimeStep();
|
tracerModel_.beginTimeStep();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -887,7 +907,8 @@ public:
|
|||||||
void beginIteration()
|
void beginIteration()
|
||||||
{
|
{
|
||||||
wellModel_.beginIteration();
|
wellModel_.beginIteration();
|
||||||
aquiferModel_.beginIteration();
|
if (enableAquifers_)
|
||||||
|
aquiferModel_.beginIteration();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -896,7 +917,8 @@ public:
|
|||||||
void endIteration()
|
void endIteration()
|
||||||
{
|
{
|
||||||
wellModel_.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
|
// 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
|
// equivalent to the fluxes over the grid's boundaries plus the source rates
|
||||||
// specified by the problem)
|
// 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);
|
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
|
#endif // NDEBUG
|
||||||
|
|
||||||
const auto& simulator = this->simulator();
|
const auto& simulator = this->simulator();
|
||||||
wellModel_.endTimeStep();
|
wellModel_.endTimeStep();
|
||||||
aquiferModel_.endTimeStep();
|
if (enableAquifers_)
|
||||||
|
aquiferModel_.endTimeStep();
|
||||||
tracerModel_.endTimeStep();
|
tracerModel_.endTimeStep();
|
||||||
|
|
||||||
// deal with DRSDT and DRVDT
|
// deal with DRSDT and DRVDT
|
||||||
@ -1478,7 +1504,8 @@ public:
|
|||||||
|
|
||||||
updateCompositionChangeLimits_();
|
updateCompositionChangeLimits_();
|
||||||
|
|
||||||
aquiferModel_.initialSolutionApplied();
|
if (enableAquifers_)
|
||||||
|
aquiferModel_.initialSolutionApplied();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -1506,7 +1533,8 @@ public:
|
|||||||
assert(Opm::isfinite(rate[eqIdx]));
|
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
|
// if requested, compensate systematic mass loss for cells which were "well
|
||||||
// behaved" in the last time step
|
// behaved" in the last time step
|
||||||
@ -1824,7 +1852,8 @@ private:
|
|||||||
void checkDeckCompatibility_() const
|
void checkDeckCompatibility_() const
|
||||||
{
|
{
|
||||||
const auto& deck = this->simulator().vanguard().deck();
|
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)
|
if (enableApiTracking)
|
||||||
throw std::logic_error("API tracking is not yet implemented but requested at compile time.");
|
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)
|
for (size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx)
|
||||||
maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx)*simulator.timeStepSize();
|
maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx)*simulator.timeStepSize();
|
||||||
|
|
||||||
if (tracerModel().numTracers() > 0)
|
if (tracerModel().numTracers() > 0 && this->gridView().comm().rank() == 0)
|
||||||
std::cout << "Warning: Restart is not implemented for the tracer model, it will initialize with initial tracer concentration" << std::endl;
|
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
|
// 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
|
// to compute real initial solution after this because the initial fluid states
|
||||||
@ -3128,6 +3159,7 @@ private:
|
|||||||
GlobalEqVector drift_;
|
GlobalEqVector drift_;
|
||||||
|
|
||||||
EclWellModel wellModel_;
|
EclWellModel wellModel_;
|
||||||
|
bool enableAquifers_;
|
||||||
EclAquiferModel aquiferModel_;
|
EclAquiferModel aquiferModel_;
|
||||||
|
|
||||||
bool enableEclOutput_;
|
bool enableEclOutput_;
|
||||||
|
@ -168,8 +168,8 @@ public:
|
|||||||
int cartElem1Idx = vanguard.cartesianIndex(elem1Idx);
|
int cartElem1Idx = vanguard.cartesianIndex(elem1Idx);
|
||||||
int cartElem2Idx = vanguard.cartesianIndex(elem2Idx);
|
int cartElem2Idx = vanguard.cartesianIndex(elem2Idx);
|
||||||
|
|
||||||
assert(0 <= cartElem1Idx && cartElemFaultIdx_.size() > 0U + cartElem1Idx);
|
assert(0 <= cartElem1Idx && static_cast<int>(cartElemFaultIdx_.size()) > cartElem1Idx);
|
||||||
assert(0 <= cartElem2Idx && cartElemFaultIdx_.size() > 0U + cartElem2Idx);
|
assert(0 <= cartElem2Idx && static_cast<int>(cartElemFaultIdx_.size()) > cartElem2Idx);
|
||||||
|
|
||||||
int fault1Idx = cartElemFaultIdx_[cartElem1Idx];
|
int fault1Idx = cartElemFaultIdx_[cartElem1Idx];
|
||||||
int fault2Idx = cartElemFaultIdx_[cartElem2Idx];
|
int fault2Idx = cartElemFaultIdx_[cartElem2Idx];
|
||||||
|
@ -101,17 +101,22 @@ public:
|
|||||||
return; // tracer treatment is supposed to be disabled
|
return; // tracer treatment is supposed to be disabled
|
||||||
|
|
||||||
if (!EWOMS_GET_PARAM(TypeTag, bool, EnableTracerModel)) {
|
if (!EWOMS_GET_PARAM(TypeTag, bool, EnableTracerModel)) {
|
||||||
std::cout << "Warning: Tracer model is disabled but the deck contatins the TRACERS keyword \n";
|
if (simulator_.gridView().comm().rank() == 0) {
|
||||||
std::cout << "The tracer model must be activated using --enable-tracer-model=true "<< std::endl;
|
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
|
return; // Tracer transport must be enabled by the user
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!deck.hasKeyword("TRACER"))
|
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) {
|
if (simulator_.gridView().comm().size() > 1) {
|
||||||
tracerNames_.resize(0);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
* \copydoc Ewoms::TracerVdTable
|
* \copydoc Ewoms::TracerVdTable
|
||||||
*/
|
*/
|
||||||
#ifndef EWOMS_TRACER_VD_TABLE_HH
|
#ifndef EWOMS_TRACER_VD_TABLE_HH
|
||||||
#define EWOMS_TRACER_VD_TABLE_HH
|
#define EWOMS_TRACER_VD_TABLE_HH
|
||||||
|
|
||||||
#include <opm/parser/eclipse/EclipseState/Tables/SimpleTable.hpp>
|
#include <opm/parser/eclipse/EclipseState/Tables/SimpleTable.hpp>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user