23#ifndef OPM_FLOW_GENERIC_PROBLEM_IMPL_HPP
24#define OPM_FLOW_GENERIC_PROBLEM_IMPL_HPP
26#include <dune/common/parametertree.hh>
28#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
29#include <opm/input/eclipse/EclipseState/Tables/OverburdTable.hpp>
30#include <opm/input/eclipse/EclipseState/Tables/RockwnodTable.hpp>
31#include <opm/input/eclipse/Schedule/Schedule.hpp>
32#include <opm/input/eclipse/Units/Units.hpp>
37#include <boost/date_time.hpp>
39#include <fmt/format.h>
40#include <fmt/ranges.h>
49 std::set<std::string>& seenParams,
50 std::string& errorMsg,
54 std::string param = argv[paramIdx];
55 std::size_t i = param.find(
'=');
56 if (i != std::string::npos) {
57 std::string oldParamName = param.substr(0, i);
58 std::string oldParamValue = param.substr(i+1);
59 std::string newParamName =
"--" + oldParamName;
60 std::replace(newParamName.begin(),
61 newParamName.end(),
'_' ,
'-');
63 "The old syntax to specify parameters on the command line is no longer supported: "
64 "Try replacing '" + oldParamName +
"=" + oldParamValue +
"' with "+
65 "'" + newParamName +
"=" + oldParamValue +
"'!";
69 if (seenParams.count(
"EclDeckFileName") > 0) {
71 "Parameter 'EclDeckFileName' specified multiple times"
72 " as a command line parameter";
76 addKey(
"EclDeckFileName", argv[paramIdx]);
77 seenParams.insert(
"EclDeckFileName");
81template<
class Gr
idView,
class Flu
idSystem>
84 const Schedule& schedule,
85 const GridView& gridView)
89 , lookUpData_(gridView)
93template<
class Gr
idView,
class Flu
idSystem>
97 const Schedule& schedule,
98 const GridView& gridView)
113template<
class Gr
idView,
class Flu
idSystem>
124 "Usage: "+std::string(argv[0]) +
" [OPTIONS] [ECL_DECK_FILENAME]\n"
128template<
class Gr
idView,
class Flu
idSystem>
133 return briefDescription_;
136template<
class Gr
idView,
class Flu
idSystem>
139 std::function<std::array<int,3>(
const unsigned)> ijkIndex)
141 const auto& rock_config = eclState_.getSimulationConfig().rock_config();
145 const auto& comp = rock_config.comp();
147 for (
const auto& c : comp) {
148 rockParams_.push_back({
static_cast<Scalar>(c.pref),
149 static_cast<Scalar>(c.compressibility)});
154 readRockCompactionParameters_();
156 unsigned numElem = gridView_.size(0);
157 if (eclState_.fieldProps().has_int(rock_config.rocknum_property())) {
159 std::function<void(
int,
int)> valueCheck = [&ijkIndex,&rock_config,
this](
int fieldPropValue,
int coarseElemIdx)
161 auto fmtError = [fieldPropValue, coarseElemIdx,&ijkIndex,&rock_config](
const char* type, std::size_t size)
163 return fmt::format(
"{} table index {} for elem {} read from {}"
164 " is out of bounds for number of tables {}",
165 type, fieldPropValue,
166 ijkIndex(coarseElemIdx),
167 rock_config.rocknum_property(), size);
169 if (!rockCompPoroMult_.empty() &&
170 fieldPropValue >
static_cast<int>(rockCompPoroMult_.size())) {
171 throw std::runtime_error(fmtError(
"Rock compaction",
172 rockCompPoroMult_.size()));
174 if (!rockCompPoroMultWc_.empty() &&
175 fieldPropValue >
static_cast<int>(rockCompPoroMultWc_.size())) {
176 throw std::runtime_error(fmtError(
"Rock water compaction",
177 rockCompPoroMultWc_.size()));
181 rockTableIdx_ = this->lookUpData_.template assignFieldPropsIntOnLeaf<short unsigned int>(eclState_.fieldProps(),
182 rock_config.rocknum_property(),
188 const auto& overburdTables = eclState_.getTableManager().getOverburdTables();
189 if (!overburdTables.empty()) {
190 overburdenPressure_.resize(numElem,0.0);
191 std::size_t numRocktabTables = rock_config.num_rock_tables();
193 if (overburdTables.size() != numRocktabTables)
194 throw std::runtime_error(
std::to_string(numRocktabTables) +
" OVERBURD tables is expected, but " +
std::to_string(overburdTables.size()) +
" is provided");
196 std::vector<Tabulated1DFunction<Scalar>> overburdenTables(numRocktabTables);
197 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
198 const OverburdTable& overburdTable = overburdTables.template getTable<OverburdTable>(regionIdx);
199 overburdenTables[regionIdx].setXYContainers(overburdTable.getDepthColumn(),overburdTable.getOverburdenPressureColumn());
202 for (std::size_t elemIdx = 0; elemIdx < numElem; ++ elemIdx) {
203 unsigned tableIdx = 0;
204 if (!rockTableIdx_.empty()) {
205 tableIdx = rockTableIdx_[elemIdx];
207 overburdenPressure_[elemIdx] =
208 overburdenTables[tableIdx].eval(cellCenterDepths[elemIdx],
true);
213template<
class Gr
idView,
class Flu
idSystem>
217 const auto& rock_config = eclState_.getSimulationConfig().rock_config();
219 if (!rock_config.active())
222 unsigned numElem = gridView_.size(0);
223 switch (rock_config.hysteresis_mode()) {
224 case RockConfig::Hysteresis::REVERS:
226 case RockConfig::Hysteresis::IRREVERS:
229 minRefPressure_.resize(numElem, 1e99);
232 throw std::runtime_error(
"Not support ROCKOMP hysteresis option ");
235 std::size_t numRocktabTables = rock_config.num_rock_tables();
236 bool waterCompaction = rock_config.water_compaction();
238 if (!waterCompaction) {
239 const auto& rocktabTables = eclState_.getTableManager().getRocktabTables();
240 if (rocktabTables.size() != numRocktabTables)
241 throw std::runtime_error(
"ROCKCOMP is activated." +
std::to_string(numRocktabTables)
242 +
" ROCKTAB tables is expected, but " +
std::to_string(rocktabTables.size()) +
" is provided");
244 rockCompPoroMult_.resize(numRocktabTables);
245 rockCompTransMult_.resize(numRocktabTables);
246 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
247 const auto& rocktabTable = rocktabTables.template getTable<RocktabTable>(regionIdx);
248 const auto& pressureColumn = rocktabTable.getPressureColumn();
249 const auto& poroColumn = rocktabTable.getPoreVolumeMultiplierColumn();
250 const auto& transColumn = rocktabTable.getTransmissibilityMultiplierColumn();
251 rockCompPoroMult_[regionIdx].setXYContainers(pressureColumn, poroColumn);
252 rockCompTransMult_[regionIdx].setXYContainers(pressureColumn, transColumn);
255 const auto& rock2dTables = eclState_.getTableManager().getRock2dTables();
256 const auto& rock2dtrTables = eclState_.getTableManager().getRock2dtrTables();
257 const auto& rockwnodTables = eclState_.getTableManager().getRockwnodTables();
258 maxWaterSaturation_.resize(numElem, 0.0);
260 if (rock2dTables.size() != numRocktabTables)
261 throw std::runtime_error(
"Water compation option is selected in ROCKCOMP." +
std::to_string(numRocktabTables)
262 +
" ROCK2D tables is expected, but " +
std::to_string(rock2dTables.size()) +
" is provided");
264 if (rockwnodTables.size() != numRocktabTables)
265 throw std::runtime_error(
"Water compation option is selected in ROCKCOMP." +
std::to_string(numRocktabTables)
266 +
" ROCKWNOD tables is expected, but " +
std::to_string(rockwnodTables.size()) +
" is provided");
268 rockCompPoroMultWc_.resize(numRocktabTables,
TabulatedTwoDFunction(TabulatedTwoDFunction::InterpolationPolicy::Vertical));
269 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
270 const RockwnodTable& rockwnodTable = rockwnodTables.template getTable<RockwnodTable>(regionIdx);
271 const auto& rock2dTable = rock2dTables[regionIdx];
273 if (rockwnodTable.getSaturationColumn().size() != rock2dTable.sizeMultValues())
274 throw std::runtime_error(
"Number of entries in ROCKWNOD and ROCK2D needs to match.");
276 for (std::size_t xIdx = 0; xIdx < rock2dTable.size(); ++xIdx) {
277 rockCompPoroMultWc_[regionIdx].appendXPos(rock2dTable.getPressureValue(xIdx));
278 for (std::size_t yIdx = 0; yIdx < rockwnodTable.getSaturationColumn().size(); ++yIdx)
279 rockCompPoroMultWc_[regionIdx].appendSamplePoint(xIdx,
280 rockwnodTable.getSaturationColumn()[yIdx],
281 rock2dTable.getPvmultValue(xIdx, yIdx));
285 if (!rock2dtrTables.empty()) {
286 rockCompTransMultWc_.resize(numRocktabTables, TabulatedTwoDFunction(TabulatedTwoDFunction::InterpolationPolicy::Vertical));
287 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
288 const RockwnodTable& rockwnodTable = rockwnodTables.template getTable<RockwnodTable>(regionIdx);
289 const auto& rock2dtrTable = rock2dtrTables[regionIdx];
291 if (rockwnodTable.getSaturationColumn().size() != rock2dtrTable.sizeMultValues())
292 throw std::runtime_error(
"Number of entries in ROCKWNOD and ROCK2DTR needs to match.");
294 for (std::size_t xIdx = 0; xIdx < rock2dtrTable.size(); ++xIdx) {
295 rockCompTransMultWc_[regionIdx].appendXPos(rock2dtrTable.getPressureValue(xIdx));
296 for (std::size_t yIdx = 0; yIdx < rockwnodTable.getSaturationColumn().size(); ++yIdx)
297 rockCompTransMultWc_[regionIdx].appendSamplePoint(xIdx,
298 rockwnodTable.getSaturationColumn()[yIdx],
299 rock2dtrTable.getTransMultValue(xIdx, yIdx));
306template<
class Gr
idView,
class Flu
idSystem>
311 if (this->rockParams_.empty())
314 unsigned tableIdx = 0;
315 if (!this->rockTableIdx_.empty()) {
316 tableIdx = this->rockTableIdx_[globalSpaceIdx];
318 return this->rockParams_[tableIdx].compressibility;
321template<
class Gr
idView,
class Flu
idSystem>
326 if (this->rockParams_.empty())
329 unsigned tableIdx = 0;
330 if (!this->rockTableIdx_.empty()) {
331 tableIdx = this->rockTableIdx_[globalSpaceIdx];
333 return this->rockParams_[tableIdx].referencePressure;
336template<
class Gr
idView,
class Flu
idSystem>
339porosity(
unsigned globalSpaceIdx,
unsigned timeIdx)
const
341 return this->referencePorosity_[timeIdx][globalSpaceIdx];
344template<
class Gr
idView,
class Flu
idSystem>
347rockFraction(
unsigned elementIdx,
unsigned timeIdx)
const
353 auto porosity = this->lookUpData_.fieldPropDouble(eclState_.fieldProps(),
"PORO", elementIdx);
354 return referencePorosity(elementIdx, timeIdx) / porosity * (1 - porosity);
357template<
class Gr
idView,
class Flu
idSystem>
360updateNum(
const std::string& name, std::vector<T>& numbers, std::size_t num_regions)
362 if (!eclState_.fieldProps().has_int(name))
365 std::function<void(T,
int)> valueCheck = [num_regions,name](T fieldPropValue, [[maybe_unused]]
int fieldPropIdx) {
366 if ( fieldPropValue > (
int)num_regions) {
367 throw std::runtime_error(
"Values larger than maximum number of regions "
370 if ( fieldPropValue <= 0) {
371 throw std::runtime_error(
"zero or negative values provided for region array: " + name);
375 numbers = this->lookUpData_.template assignFieldPropsIntOnLeaf<T>(eclState_.fieldProps(), name,
379template<
class Gr
idView,
class Flu
idSystem>
383 const auto num_regions = eclState_.getTableManager().getTabdims().getNumPVTTables();
384 updateNum(
"PVTNUM", pvtnum_, num_regions);
387template<
class Gr
idView,
class Flu
idSystem>
391 const auto num_regions = eclState_.getTableManager().getTabdims().getNumSatTables();
392 updateNum(
"SATNUM", satnum_, num_regions);
395template<
class Gr
idView,
class Flu
idSystem>
399 const auto num_regions = 1;
400 updateNum(
"MISCNUM", miscnum_, num_regions);
403template<
class Gr
idView,
class Flu
idSystem>
407 const auto num_regions = 1;
408 updateNum(
"PLMIXNUM", plmixnum_, num_regions);
411template<
class Gr
idView,
class Flu
idSystem>
415 const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
416 return (oilVaporizationControl.getType() == OilVaporizationProperties::OilVaporization::VAPPARS);
419template<
class Gr
idView,
class Flu
idSystem>
424 if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
427 std::ostringstream ss;
428 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet(
"%d-%b-%Y");
429 boost::posix_time::ptime curDateTime =
430 boost::posix_time::from_time_t(schedule_.simTime(episodeIdx));
431 ss.imbue(std::locale(std::locale::classic(), facet));
432 ss <<
"Report step " << episodeIdx + 1
433 <<
"/" << schedule_.size() - 1
434 <<
" at day " << schedule_.seconds(episodeIdx)/(24*3600)
435 <<
"/" << schedule_.seconds(schedule_.size() - 1)/(24*3600)
436 <<
", date = " << curDateTime.date()
438 OpmLog::info(ss.str());
441 const auto& events = schedule_[episodeIdx].events();
444 if (episodeIdx > 0 && enableTuning_ && events.hasEvent(ScheduleEvents::TUNING_CHANGE))
446 const auto& sched_state = schedule_[episodeIdx];
447 const auto& tuning = sched_state.tuning();
448 initialTimeStepSize_ = sched_state.max_next_tstep(enableTuning_);
449 maxTimeStepAfterWellEvent_ = tuning.TMAXWC;
456template<
class Gr
idView,
class Flu
idSystem>
466 if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
467 std::ostringstream ss;
468 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet(
"%d-%b-%Y");
469 boost::posix_time::ptime date = boost::posix_time::from_time_t(startTime) + boost::posix_time::milliseconds(
static_cast<long long>(time / prefix::milli));
470 ss.imbue(std::locale(std::locale::classic(), facet));
471 ss <<
"\nTime step " << timeStepIndex <<
", stepsize "
472 << unit::convert::to(timeStepSize, unit::day) <<
" days,"
473 <<
" at day " << (double)unit::convert::to(time, unit::day)
474 <<
"/" << (double)unit::convert::to(endTime, unit::day)
475 <<
", date = " << date;
476 OpmLog::info(ss.str());
480template<
class Gr
idView,
class Flu
idSystem>
484 FluidSystem::initFromState(eclState_, schedule_);
487template<
class Gr
idView,
class Flu
idSystem>
492 bool enablePolymerMolarWeight,
495 auto getArray = [](
const std::vector<double>& input)
497 if constexpr (std::is_same_v<Scalar,double>) {
500 return std::vector<Scalar>{input.begin(), input.end()};
505 if (eclState_.fieldProps().has_double(
"SSOL")) {
506 solventSaturation_ = getArray(eclState_.fieldProps().get_double(
"SSOL"));
508 solventSaturation_.resize(numDof, 0.0);
511 solventRsw_.resize(numDof, 0.0);
515 if (eclState_.fieldProps().has_double(
"SPOLY")) {
516 polymer_.concentration = getArray(eclState_.fieldProps().get_double(
"SPOLY"));
518 polymer_.concentration.resize(numDof, 0.0);
522 if (enablePolymerMolarWeight) {
523 if (eclState_.fieldProps().has_double(
"SPOLYMW")) {
524 polymer_.moleWeight = getArray(eclState_.fieldProps().get_double(
"SPOLYMW"));
526 polymer_.moleWeight.resize(numDof, 0.0);
531 if (eclState_.fieldProps().has_double(
"SMICR")) {
532 micp_.microbialConcentration = getArray(eclState_.fieldProps().get_double(
"SMICR"));
534 micp_.microbialConcentration.resize(numDof, 0.0);
536 if (eclState_.fieldProps().has_double(
"SOXYG")) {
537 micp_.oxygenConcentration = getArray(eclState_.fieldProps().get_double(
"SOXYG"));
539 micp_.oxygenConcentration.resize(numDof, 0.0);
541 if (eclState_.fieldProps().has_double(
"SUREA")) {
542 micp_.ureaConcentration = getArray(eclState_.fieldProps().get_double(
"SUREA"));
544 micp_.ureaConcentration.resize(numDof, 0.0);
546 if (eclState_.fieldProps().has_double(
"SBIOF")) {
547 micp_.biofilmConcentration = getArray(eclState_.fieldProps().get_double(
"SBIOF"));
549 micp_.biofilmConcentration.resize(numDof, 0.0);
551 if (eclState_.fieldProps().has_double(
"SCALC")) {
552 micp_.calciteConcentration = getArray(eclState_.fieldProps().get_double(
"SCALC"));
554 micp_.calciteConcentration.resize(numDof, 0.0);
559template<
class Gr
idView,
class Flu
idSystem>
564 if (maxWaterSaturation_.empty())
567 return maxWaterSaturation_[globalDofIdx];
570template<
class Gr
idView,
class Flu
idSystem>
575 if (minRefPressure_.empty())
578 return minRefPressure_[globalDofIdx];
581template<
class Gr
idView,
class Flu
idSystem>
586 if (overburdenPressure_.empty())
589 return overburdenPressure_[elementIdx];
592template<
class Gr
idView,
class Flu
idSystem>
597 if (solventSaturation_.empty())
600 return solventSaturation_[elemIdx];
603template<
class Gr
idView,
class Flu
idSystem>
608 if (solventRsw_.empty())
611 return solventRsw_[elemIdx];
616template<
class Gr
idView,
class Flu
idSystem>
621 if (polymer_.concentration.empty()) {
625 return polymer_.concentration[elemIdx];
628template<
class Gr
idView,
class Flu
idSystem>
633 if (polymer_.moleWeight.empty()) {
637 return polymer_.moleWeight[elemIdx];
640template<
class Gr
idView,
class Flu
idSystem>
645 if (micp_.microbialConcentration.empty()) {
649 return micp_.microbialConcentration[elemIdx];
652template<
class Gr
idView,
class Flu
idSystem>
657 if (micp_.oxygenConcentration.empty()) {
661 return micp_.oxygenConcentration[elemIdx];
664template<
class Gr
idView,
class Flu
idSystem>
669 if (micp_.ureaConcentration.empty()) {
673 return micp_.ureaConcentration[elemIdx];
676template<
class Gr
idView,
class Flu
idSystem>
681 if (micp_.biofilmConcentration.empty()) {
685 return micp_.biofilmConcentration[elemIdx];
688template<
class Gr
idView,
class Flu
idSystem>
693 if (micp_.calciteConcentration.empty()) {
697 return micp_.calciteConcentration[elemIdx];
700template<
class Gr
idView,
class Flu
idSystem>
707 return pvtnum_[elemIdx];
710template<
class Gr
idView,
class Flu
idSystem>
717 return satnum_[elemIdx];
720template<
class Gr
idView,
class Flu
idSystem>
724 if (miscnum_.empty())
727 return miscnum_[elemIdx];
730template<
class Gr
idView,
class Flu
idSystem>
734 if (plmixnum_.empty())
737 return plmixnum_[elemIdx];
740template<
class Gr
idView,
class Flu
idSystem>
745 if (polymer_.maxAdsorption.empty()) {
749 return polymer_.maxAdsorption[elemIdx];
752template<
class Gr
idView,
class Flu
idSystem>
762 this->micp_ == rhs.
micp_;
This problem simulates an input file given in the data format used by the commercial ECLiPSE simulato...
Definition: FlowGenericProblem.hpp:70
UniformXTabulated2DFunction< Scalar > TabulatedTwoDFunction
Definition: FlowGenericProblem.hpp:73
Scalar maxPolymerAdsorption(unsigned elemIdx) const
Returns the max polymer adsorption value.
Definition: FlowGenericProblem_impl.hpp:743
unsigned pvtRegionIndex(unsigned elemIdx) const
Returns the index the relevant PVT region given a cell index.
Definition: FlowGenericProblem_impl.hpp:702
Scalar oxygenConcentration(unsigned elemIdx) const
Returns the initial oxygen concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:655
Scalar microbialConcentration(unsigned elemIdx) const
Returns the initial microbial concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:643
PolymerSolutionContainer< Scalar > polymer_
Definition: FlowGenericProblem.hpp:357
Scalar rockReferencePressure(unsigned globalSpaceIdx) const
Definition: FlowGenericProblem_impl.hpp:324
static std::string briefDescription()
Returns a human readable description of the problem for the help message.
Definition: FlowGenericProblem_impl.hpp:131
Scalar solventRsw(unsigned elemIdx) const
Returns the initial solvent dissolved in water for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:606
Scalar overburdenPressure(unsigned elementIdx) const
Get the pressure of the overburden.
Definition: FlowGenericProblem_impl.hpp:584
void updateMiscnum_()
Definition: FlowGenericProblem_impl.hpp:397
Scalar porosity(unsigned globalSpaceIdx, unsigned timeIdx) const
Direct indexed access to the porosity.
Definition: FlowGenericProblem_impl.hpp:339
Scalar rockCompressibility(unsigned globalSpaceIdx) const
Definition: FlowGenericProblem_impl.hpp:309
unsigned miscnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant MISC region given a cell index.
Definition: FlowGenericProblem_impl.hpp:722
bool vapparsActive(int episodeIdx) const
Definition: FlowGenericProblem_impl.hpp:413
unsigned satnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant saturation function region given a cell index.
Definition: FlowGenericProblem_impl.hpp:712
Scalar rockFraction(unsigned elementIdx, unsigned timeIdx) const
Returns the rockFraction of an element.
Definition: FlowGenericProblem_impl.hpp:347
Scalar maxWaterSaturation(unsigned globalDofIdx) const
Returns an element's historic maximum water phase saturation that was observed during the simulation.
Definition: FlowGenericProblem_impl.hpp:562
std::vector< Scalar > solventSaturation_
Definition: FlowGenericProblem.hpp:362
void readRockCompactionParameters_()
Definition: FlowGenericProblem_impl.hpp:215
void updateSatnum_()
Definition: FlowGenericProblem_impl.hpp:389
void updatePvtnum_()
Definition: FlowGenericProblem_impl.hpp:381
static FlowGenericProblem serializationTestObject(const EclipseState &eclState, const Schedule &schedule, const GridView &gridView)
Definition: FlowGenericProblem_impl.hpp:96
void beginTimeStep_(bool enableExperiments, int episodeIdx, int timeStepIndex, Scalar startTime, Scalar time, Scalar timeStepSize, Scalar endTime)
Definition: FlowGenericProblem_impl.hpp:458
unsigned plmixnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant PLMIXNUM (for polymer module) region given a cell index.
Definition: FlowGenericProblem_impl.hpp:732
FlowGenericProblem(const EclipseState &eclState, const Schedule &schedule, const GridView &gridView)
Definition: FlowGenericProblem_impl.hpp:83
Scalar solventSaturation(unsigned elemIdx) const
Returns the initial solvent saturation for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:595
Scalar polymerMolecularWeight(const unsigned elemIdx) const
Returns the polymer molecule weight for a given cell index.
Definition: FlowGenericProblem_impl.hpp:631
Scalar biofilmConcentration(unsigned elemIdx) const
Returns the initial biofilm concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:679
MICPSolutionContainer< Scalar > micp_
Definition: FlowGenericProblem.hpp:364
void readRockParameters_(const std::vector< Scalar > &cellCenterDepths, std::function< std::array< int, 3 >(const unsigned)> ijkIndex)
Definition: FlowGenericProblem_impl.hpp:138
std::vector< Scalar > maxOilSaturation_
Definition: FlowGenericProblem.hpp:358
void readBlackoilExtentionsInitialConditions_(std::size_t numDof, bool enableSolvent, bool enablePolymer, bool enablePolymerMolarWeight, bool enableMICP)
Definition: FlowGenericProblem_impl.hpp:489
Scalar minOilPressure(unsigned globalDofIdx) const
Returns an element's historic minimum pressure of the oil phase that was observed during the simulati...
Definition: FlowGenericProblem_impl.hpp:573
std::vector< Scalar > maxWaterSaturation_
Definition: FlowGenericProblem.hpp:359
void initFluidSystem_()
Definition: FlowGenericProblem_impl.hpp:482
bool operator==(const FlowGenericProblem &rhs) const
Definition: FlowGenericProblem_impl.hpp:754
Scalar calciteConcentration(unsigned elemIdx) const
Returns the initial calcite concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:691
Scalar ureaConcentration(unsigned elemIdx) const
Returns the initial urea concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:667
std::vector< Scalar > minRefPressure_
Definition: FlowGenericProblem.hpp:360
bool beginEpisode_(bool enableExperiments, int episodeIdx)
Definition: FlowGenericProblem_impl.hpp:421
std::vector< Scalar > solventRsw_
Definition: FlowGenericProblem.hpp:363
static std::string helpPreamble(int, const char **argv)
Returns the string that is printed before the list of command line parameters in the help message.
Definition: FlowGenericProblem_impl.hpp:116
std::vector< Scalar > overburdenPressure_
Definition: FlowGenericProblem.hpp:361
void updatePlmixnum_()
Definition: FlowGenericProblem_impl.hpp:405
typename FluidSystem::Scalar Scalar
Definition: FlowGenericProblem.hpp:72
Scalar polymerConcentration(unsigned elemIdx) const
Returns the initial polymer concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:619
Definition: blackoilboundaryratevector.hh:37
int eclPositionalParameter(std::function< void(const std::string &, const std::string &)> addKey, std::set< std::string > &seenParams, std::string &errorMsg, const char **argv, int paramIdx)
Definition: FlowGenericProblem_impl.hpp:48
std::string to_string(const ConvergenceReport::ReservoirFailure::Type t)
static MICPSolutionContainer serializationTestObject()
static PolymerSolutionContainer serializationTestObject()