23#ifndef OPM_FLOW_GENERIC_PROBLEM_IMPL_HPP
24#define OPM_FLOW_GENERIC_PROBLEM_IMPL_HPP
26#ifndef OPM_FLOW_GENERIC_PROBLEM_HPP
31#include <dune/common/parametertree.hh>
33#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
34#include <opm/input/eclipse/EclipseState/Tables/OverburdTable.hpp>
35#include <opm/input/eclipse/EclipseState/Tables/RockwnodTable.hpp>
36#include <opm/input/eclipse/Schedule/Schedule.hpp>
37#include <opm/input/eclipse/Units/Units.hpp>
48#include <boost/date_time.hpp>
50#include <fmt/format.h>
51#include <fmt/ranges.h>
58template<
class Gr
idView,
class Flu
idSystem>
61 const Schedule& schedule,
62 const GridView& gridView)
66 , lookUpData_(gridView)
85 ? Parameters::Get<Parameters::NumPressurePointsEquil>()
86 : eclState.getTableManager().getEqldims().getNumDepthNodesP();
91template<
class Gr
idView,
class Flu
idSystem>
95 const Schedule& schedule,
96 const GridView& gridView)
112template<
class Gr
idView,
class Flu
idSystem>
123 "Usage: "+std::string(argv[0]) +
" [OPTIONS] [ECL_DECK_FILENAME]\n"
127template<
class Gr
idView,
class Flu
idSystem>
132 return briefDescription_;
135template<
class Gr
idView,
class Flu
idSystem>
138 std::function<std::array<int,3>(
const unsigned)> ijkIndex)
140 const auto& rock_config = eclState_.getSimulationConfig().rock_config();
144 const auto& comp = rock_config.comp();
146 std::ranges::transform(comp, std::back_inserter(rockParams_),
150 static_cast<Scalar>(c.pref),
151 static_cast<Scalar>(c.compressibility)
157 if (rock_config.store()) {
158 OpmLog::warning(
"ROCKOPTS item 2 set to STORE, ROCK item 1 replaced with initial (equilibrated) pressures");
162 readRockCompactionParameters_();
164 unsigned numElem = gridView_.size(0);
165 if (eclState_.fieldProps().has_int(rock_config.rocknum_property())) {
167 std::function<void(
int,
int)> valueCheck = [&ijkIndex,&rock_config,
this](
int fieldPropValue,
int coarseElemIdx)
169 auto fmtError = [fieldPropValue, coarseElemIdx,&ijkIndex,&rock_config](
const char* type, std::size_t size)
171 return fmt::format(
"{} table index {} for elem {} read from {}"
172 " is out of bounds for number of tables {}",
173 type, fieldPropValue,
174 ijkIndex(coarseElemIdx),
175 rock_config.rocknum_property(), size);
177 if (!rockCompPoroMult_.empty() &&
178 fieldPropValue >
static_cast<int>(rockCompPoroMult_.size())) {
179 throw std::runtime_error(fmtError(
"Rock compaction",
180 rockCompPoroMult_.size()));
182 if (!rockCompPoroMultWc_.empty() &&
183 fieldPropValue >
static_cast<int>(rockCompPoroMultWc_.size())) {
184 throw std::runtime_error(fmtError(
"Rock water compaction",
185 rockCompPoroMultWc_.size()));
189 rockTableIdx_ = this->lookUpData_.template assignFieldPropsIntOnLeaf<short unsigned int>(eclState_.fieldProps(),
190 rock_config.rocknum_property(),
196 const auto& overburdTables = eclState_.getTableManager().getOverburdTables();
197 if (!overburdTables.empty() && !rock_config.store()) {
198 overburdenPressure_.resize(numElem,0.0);
199 std::size_t numRocktabTables = rock_config.num_rock_tables();
201 if (overburdTables.size() != numRocktabTables)
202 throw std::runtime_error(fmt::format(
"{} OVERBURD tables is expected, but {} is provided",
203 numRocktabTables, overburdTables.size()));
205 std::vector<Tabulated1DFunction<Scalar>> overburdenTables(numRocktabTables);
206 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
207 const OverburdTable& overburdTable = overburdTables.template getTable<OverburdTable>(regionIdx);
208 overburdenTables[regionIdx].setXYContainers(overburdTable.getDepthColumn(),overburdTable.getOverburdenPressureColumn());
211 for (std::size_t elemIdx = 0; elemIdx < numElem; ++ elemIdx) {
212 unsigned tableIdx = 0;
213 if (!rockTableIdx_.empty()) {
214 tableIdx = rockTableIdx_[elemIdx];
216 overburdenPressure_[elemIdx] =
217 overburdenTables[tableIdx].eval(cellCenterDepths[elemIdx],
true);
220 else if (!overburdTables.empty() && rock_config.store()) {
221 OpmLog::warning(
"ROCKOPTS item 2 set to STORE, OVERBURD ignored!");
225template<
class Gr
idView,
class Flu
idSystem>
229 const auto& rock_config = eclState_.getSimulationConfig().rock_config();
231 if (!rock_config.active())
234 unsigned numElem = gridView_.size(0);
235 switch (rock_config.hysteresis_mode()) {
236 case RockConfig::Hysteresis::REVERS:
238 case RockConfig::Hysteresis::IRREVERS:
241 minRefPressure_.resize(numElem, 1e99);
244 throw std::runtime_error(
"Not support ROCKOMP hysteresis option ");
247 std::size_t numRocktabTables = rock_config.num_rock_tables();
248 bool waterCompaction = rock_config.water_compaction();
250 if (!waterCompaction) {
251 const auto& rocktabTables = eclState_.getTableManager().getRocktabTables();
252 if (rocktabTables.size() != numRocktabTables)
253 throw std::runtime_error(
"ROCKCOMP is activated." +
std::to_string(numRocktabTables)
254 +
" ROCKTAB tables is expected, but " +
std::to_string(rocktabTables.size()) +
" is provided");
256 rockCompPoroMult_.resize(numRocktabTables);
257 rockCompTransMult_.resize(numRocktabTables);
258 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
259 const auto& rocktabTable = rocktabTables.template getTable<RocktabTable>(regionIdx);
260 const auto& pressureColumn = rocktabTable.getPressureColumn();
261 const auto& poroColumn = rocktabTable.getPoreVolumeMultiplierColumn();
262 const auto& transColumn = rocktabTable.getTransmissibilityMultiplierColumn();
263 rockCompPoroMult_[regionIdx].setXYContainers(pressureColumn, poroColumn);
264 rockCompTransMult_[regionIdx].setXYContainers(pressureColumn, transColumn);
267 const auto& rock2dTables = eclState_.getTableManager().getRock2dTables();
268 const auto& rock2dtrTables = eclState_.getTableManager().getRock2dtrTables();
269 const auto& rockwnodTables = eclState_.getTableManager().getRockwnodTables();
270 maxWaterSaturation_.resize(numElem, 0.0);
272 if (rock2dTables.size() != numRocktabTables)
273 throw std::runtime_error(fmt::format(
"Water compation option is selected in ROCKCOMP."
274 " {} ROCK2D tables is expected, but {} is provided",
275 numRocktabTables, rock2dTables.size()));
277 if (rockwnodTables.size() != numRocktabTables)
278 throw std::runtime_error(fmt::format(
"Water compation option is selected in ROCKCOMP."
279 " {} ROCKWNOD tables is expected, but {} is provided",
280 numRocktabTables, rockwnodTables.size()));
282 rockCompPoroMultWc_.resize(numRocktabTables,
TabulatedTwoDFunction(TabulatedTwoDFunction::InterpolationPolicy::Vertical));
283 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
284 const RockwnodTable& rockwnodTable = rockwnodTables.template getTable<RockwnodTable>(regionIdx);
285 const auto& rock2dTable = rock2dTables[regionIdx];
287 if (rockwnodTable.getSaturationColumn().size() != rock2dTable.sizeMultValues())
288 throw std::runtime_error(
"Number of entries in ROCKWNOD and ROCK2D needs to match.");
290 for (std::size_t xIdx = 0; xIdx < rock2dTable.size(); ++xIdx) {
291 rockCompPoroMultWc_[regionIdx].appendXPos(rock2dTable.getPressureValue(xIdx));
292 for (std::size_t yIdx = 0; yIdx < rockwnodTable.getSaturationColumn().size(); ++yIdx)
293 rockCompPoroMultWc_[regionIdx].appendSamplePoint(xIdx,
294 rockwnodTable.getSaturationColumn()[yIdx],
295 rock2dTable.getPvmultValue(xIdx, yIdx));
299 if (!rock2dtrTables.empty()) {
300 rockCompTransMultWc_.resize(numRocktabTables, TabulatedTwoDFunction(TabulatedTwoDFunction::InterpolationPolicy::Vertical));
301 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
302 const RockwnodTable& rockwnodTable = rockwnodTables.template getTable<RockwnodTable>(regionIdx);
303 const auto& rock2dtrTable = rock2dtrTables[regionIdx];
305 if (rockwnodTable.getSaturationColumn().size() != rock2dtrTable.sizeMultValues())
306 throw std::runtime_error(
"Number of entries in ROCKWNOD and ROCK2DTR needs to match.");
308 for (std::size_t xIdx = 0; xIdx < rock2dtrTable.size(); ++xIdx) {
309 rockCompTransMultWc_[regionIdx].appendXPos(rock2dtrTable.getPressureValue(xIdx));
310 for (std::size_t yIdx = 0; yIdx < rockwnodTable.getSaturationColumn().size(); ++yIdx)
311 rockCompTransMultWc_[regionIdx].appendSamplePoint(xIdx,
312 rockwnodTable.getSaturationColumn()[yIdx],
313 rock2dtrTable.getTransMultValue(xIdx, yIdx));
320template<
class Gr
idView,
class Flu
idSystem>
325 if (this->rockParams_.empty())
328 unsigned tableIdx = 0;
329 if (!this->rockTableIdx_.empty()) {
330 tableIdx = this->rockTableIdx_[globalSpaceIdx];
332 return this->rockParams_[tableIdx].compressibility;
335template<
class Gr
idView,
class Flu
idSystem>
338porosity(
unsigned globalSpaceIdx,
unsigned timeIdx)
const
340 return this->referencePorosity_[timeIdx][globalSpaceIdx];
343template<
class Gr
idView,
class Flu
idSystem>
346updateNum(
const std::string& name, std::vector<T>& numbers, std::size_t num_regions)
348 if (!eclState_.fieldProps().has_int(name))
351 std::function<void(T,
int)> valueCheck = [num_regions,name](T fieldPropValue, [[maybe_unused]]
int fieldPropIdx) {
352 if (fieldPropValue >
static_cast<int>(num_regions)) {
353 throw std::runtime_error(fmt::format(
"Values larger than maximum number of regions {} provided in {}",
356 if (fieldPropValue <= 0) {
357 throw std::runtime_error(
"zero or negative values provided for region array: " + name);
361 numbers = this->lookUpData_.template assignFieldPropsIntOnLeaf<T>(eclState_.fieldProps(), name,
365template<
class Gr
idView,
class Flu
idSystem>
369 const auto num_regions = eclState_.getTableManager().getTabdims().getNumPVTTables();
370 updateNum(
"PVTNUM", pvtnum_, num_regions);
373template<
class Gr
idView,
class Flu
idSystem>
377 const auto num_regions = eclState_.getTableManager().getTabdims().getNumSatTables();
378 updateNum(
"SATNUM", satnum_, num_regions);
381template<
class Gr
idView,
class Flu
idSystem>
385 const auto num_regions = 1;
386 updateNum(
"MISCNUM", miscnum_, num_regions);
389template<
class Gr
idView,
class Flu
idSystem>
393 const auto num_regions = 1;
394 updateNum(
"PLMIXNUM", plmixnum_, num_regions);
397template<
class Gr
idView,
class Flu
idSystem>
401 const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
402 return (oilVaporizationControl.getType() == OilVaporizationProperties::OilVaporization::VAPPARS);
405template<
class Gr
idView,
class Flu
idSystem>
410 if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
413 std::ostringstream ss;
414 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet(
"%d-%b-%Y");
415 boost::posix_time::ptime curDateTime =
416 boost::posix_time::from_time_t(schedule_.simTime(episodeIdx));
417 ss.imbue(std::locale(std::locale::classic(), facet));
418 ss <<
"Report step " << episodeIdx + 1
419 <<
"/" << schedule_.size() - 1
420 <<
" at day " << schedule_.seconds(episodeIdx)/(24*3600)
421 <<
"/" << schedule_.seconds(schedule_.size() - 1)/(24*3600)
422 <<
", date = " << curDateTime.date()
424 OpmLog::info(ss.str());
427 const auto& events = schedule_[episodeIdx].events();
430 if (episodeIdx > 0 && enableTuning_ && events.hasEvent(ScheduleEvents::TUNING_CHANGE))
432 const auto& sched_state = schedule_[episodeIdx];
433 const auto& tuning = sched_state.tuning();
434 initialTimeStepSize_ = sched_state.max_next_tstep(enableTuning_);
435 maxTimeStepAfterWellEvent_ = tuning.TMAXWC;
442template<
class Gr
idView,
class Flu
idSystem>
452 if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
453 std::ostringstream ss;
454 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet(
"%d-%b-%Y");
455 boost::posix_time::ptime date = boost::posix_time::from_time_t(startTime) +
456 boost::posix_time::milliseconds(
static_cast<long long>(time / prefix::milli));
457 ss.imbue(std::locale(std::locale::classic(), facet));
458 ss <<
"\nTime step " << timeStepIndex <<
", stepsize "
459 << unit::convert::to(timeStepSize, unit::day) <<
" days,"
460 <<
" at day " << (double)unit::convert::to(time, unit::day)
461 <<
"/" << (double)unit::convert::to(endTime, unit::day)
462 <<
", date = " << date;
463 OpmLog::info(ss.str());
467template<
class Gr
idView,
class Flu
idSystem>
471 FluidSystem::initFromState(eclState_, schedule_);
474template<
class Gr
idView,
class Flu
idSystem>
479 bool enablePolymerMolarWeight,
480 bool enableBioeffects,
483 auto getArray = [](
const std::vector<double>& input)
485 if constexpr (std::is_same_v<Scalar,double>) {
488 return std::vector<Scalar>{input.begin(), input.end()};
493 if (eclState_.fieldProps().has_double(
"SSOL")) {
494 solventSaturation_ = getArray(eclState_.fieldProps().get_double(
"SSOL"));
496 solventSaturation_.resize(numDof, 0.0);
499 solventRsw_.resize(numDof, 0.0);
503 if (eclState_.fieldProps().has_double(
"SPOLY")) {
504 polymer_.concentration = getArray(eclState_.fieldProps().get_double(
"SPOLY"));
506 polymer_.concentration.resize(numDof, 0.0);
510 if (enablePolymerMolarWeight) {
511 if (eclState_.fieldProps().has_double(
"SPOLYMW")) {
512 polymer_.moleWeight = getArray(eclState_.fieldProps().get_double(
"SPOLYMW"));
514 polymer_.moleWeight.resize(numDof, 0.0);
518 if (enableBioeffects) {
519 if (eclState_.fieldProps().has_double(
"SMICR")) {
520 bioeffects_.microbialConcentration = getArray(eclState_.fieldProps().get_double(
"SMICR"));
522 bioeffects_.microbialConcentration.resize(numDof, 0.0);
524 if (eclState_.fieldProps().has_double(
"SBIOF")) {
525 bioeffects_.biofilmVolumeFraction = getArray(eclState_.fieldProps().get_double(
"SBIOF"));
527 bioeffects_.biofilmVolumeFraction.resize(numDof, 0.0);
530 if (eclState_.fieldProps().has_double(
"SOXYG")) {
531 bioeffects_.oxygenConcentration = getArray(eclState_.fieldProps().get_double(
"SOXYG"));
533 bioeffects_.oxygenConcentration.resize(numDof, 0.0);
535 if (eclState_.fieldProps().has_double(
"SUREA")) {
536 bioeffects_.ureaConcentration = getArray(eclState_.fieldProps().get_double(
"SUREA"));
538 bioeffects_.ureaConcentration.resize(numDof, 0.0);
540 if (eclState_.fieldProps().has_double(
"SCALC")) {
541 bioeffects_.calciteVolumeFraction = getArray(eclState_.fieldProps().get_double(
"SCALC"));
543 bioeffects_.calciteVolumeFraction.resize(numDof, 0.0);
549template<
class Gr
idView,
class Flu
idSystem>
554 if (maxWaterSaturation_.empty())
557 return maxWaterSaturation_[globalDofIdx];
560template<
class Gr
idView,
class Flu
idSystem>
565 if (minRefPressure_.empty())
568 return minRefPressure_[globalDofIdx];
571template<
class Gr
idView,
class Flu
idSystem>
576 if (overburdenPressure_.empty())
579 return overburdenPressure_[elementIdx];
582template<
class Gr
idView,
class Flu
idSystem>
587 if (solventSaturation_.empty())
590 return solventSaturation_[elemIdx];
593template<
class Gr
idView,
class Flu
idSystem>
598 if (solventRsw_.empty())
601 return solventRsw_[elemIdx];
606template<
class Gr
idView,
class Flu
idSystem>
611 if (polymer_.concentration.empty()) {
615 return polymer_.concentration[elemIdx];
618template<
class Gr
idView,
class Flu
idSystem>
623 if (polymer_.moleWeight.empty()) {
627 return polymer_.moleWeight[elemIdx];
630template<
class Gr
idView,
class Flu
idSystem>
635 if (bioeffects_.microbialConcentration.empty()) {
639 return bioeffects_.microbialConcentration[elemIdx];
642template<
class Gr
idView,
class Flu
idSystem>
647 if (bioeffects_.oxygenConcentration.empty()) {
651 return bioeffects_.oxygenConcentration[elemIdx];
654template<
class Gr
idView,
class Flu
idSystem>
659 if (bioeffects_.ureaConcentration.empty()) {
663 return bioeffects_.ureaConcentration[elemIdx];
666template<
class Gr
idView,
class Flu
idSystem>
671 if (bioeffects_.biofilmVolumeFraction.empty()) {
675 return bioeffects_.biofilmVolumeFraction[elemIdx];
678template<
class Gr
idView,
class Flu
idSystem>
683 if (bioeffects_.calciteVolumeFraction.empty()) {
687 return bioeffects_.calciteVolumeFraction[elemIdx];
690template<
class Gr
idView,
class Flu
idSystem>
697 return pvtnum_[elemIdx];
700template<
class Gr
idView,
class Flu
idSystem>
707 return satnum_[elemIdx];
710template<
class Gr
idView,
class Flu
idSystem>
714 if (miscnum_.empty())
717 return miscnum_[elemIdx];
720template<
class Gr
idView,
class Flu
idSystem>
724 if (plmixnum_.empty())
727 return plmixnum_[elemIdx];
730template<
class Gr
idView,
class Flu
idSystem>
735 if (polymer_.maxAdsorption.empty()) {
739 return polymer_.maxAdsorption[elemIdx];
742template<
class Gr
idView,
class Flu
idSystem>
Defines some fundamental parameters for all models.
This problem simulates an input file given in the data format used by the commercial ECLiPSE simulato...
Definition: FlowGenericProblem.hpp:61
UniformXTabulated2DFunction< Scalar > TabulatedTwoDFunction
Definition: FlowGenericProblem.hpp:64
Scalar maxPolymerAdsorption(unsigned elemIdx) const
Returns the max polymer adsorption value.
Definition: FlowGenericProblem_impl.hpp:733
unsigned pvtRegionIndex(unsigned elemIdx) const
Returns the index the relevant PVT region given a cell index.
Definition: FlowGenericProblem_impl.hpp:692
Scalar oxygenConcentration(unsigned elemIdx) const
Returns the initial oxygen concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:645
Scalar microbialConcentration(unsigned elemIdx) const
Returns the initial microbial concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:633
PolymerSolutionContainer< Scalar > polymer_
Definition: FlowGenericProblem.hpp:338
static std::string briefDescription()
Returns a human readable description of the problem for the help message.
Definition: FlowGenericProblem_impl.hpp:130
Scalar solventRsw(unsigned elemIdx) const
Returns the initial solvent dissolved in water for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:596
Scalar overburdenPressure(unsigned elementIdx) const
Get the pressure of the overburden.
Definition: FlowGenericProblem_impl.hpp:574
void updateMiscnum_()
Definition: FlowGenericProblem_impl.hpp:383
Scalar porosity(unsigned globalSpaceIdx, unsigned timeIdx) const
Direct indexed access to the porosity.
Definition: FlowGenericProblem_impl.hpp:338
Scalar rockCompressibility(unsigned globalSpaceIdx) const
Definition: FlowGenericProblem_impl.hpp:323
Scalar initialTimeStepSize_
Definition: FlowGenericProblem.hpp:350
unsigned miscnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant MISC region given a cell index.
Definition: FlowGenericProblem_impl.hpp:712
bool vapparsActive(int episodeIdx) const
Definition: FlowGenericProblem_impl.hpp:399
unsigned satnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant saturation function region given a cell index.
Definition: FlowGenericProblem_impl.hpp:702
Scalar maxWaterSaturation(unsigned globalDofIdx) const
Returns an element's historic maximum water phase saturation that was observed during the simulation.
Definition: FlowGenericProblem_impl.hpp:552
std::vector< Scalar > solventSaturation_
Definition: FlowGenericProblem.hpp:343
void readRockCompactionParameters_()
Definition: FlowGenericProblem_impl.hpp:227
void updateSatnum_()
Definition: FlowGenericProblem_impl.hpp:375
void updatePvtnum_()
Definition: FlowGenericProblem_impl.hpp:367
bool enableDriftCompensation_
Definition: FlowGenericProblem.hpp:356
static FlowGenericProblem serializationTestObject(const EclipseState &eclState, const Schedule &schedule, const GridView &gridView)
Definition: FlowGenericProblem_impl.hpp:94
void beginTimeStep_(bool enableExperiments, int episodeIdx, int timeStepIndex, Scalar startTime, Scalar time, Scalar timeStepSize, Scalar endTime)
Definition: FlowGenericProblem_impl.hpp:444
Scalar calciteVolumeFraction(unsigned elemIdx) const
Returns the initial calcite volume fraction for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:681
CO2H2SolutionContainer< Scalar > CO2H2_
Definition: FlowGenericProblem.hpp:346
unsigned plmixnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant PLMIXNUM (for polymer module) region given a cell index.
Definition: FlowGenericProblem_impl.hpp:722
FlowGenericProblem(const EclipseState &eclState, const Schedule &schedule, const GridView &gridView)
Definition: FlowGenericProblem_impl.hpp:60
BioeffectsSolutionContainer< Scalar > bioeffects_
Definition: FlowGenericProblem.hpp:345
bool enableTuning_
Definition: FlowGenericProblem.hpp:349
Scalar solventSaturation(unsigned elemIdx) const
Returns the initial solvent saturation for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:585
Scalar polymerMolecularWeight(const unsigned elemIdx) const
Returns the polymer molecule weight for a given cell index.
Definition: FlowGenericProblem_impl.hpp:621
void readRockParameters_(const std::vector< Scalar > &cellCenterDepths, std::function< std::array< int, 3 >(const unsigned)> ijkIndex)
Definition: FlowGenericProblem_impl.hpp:137
std::vector< Scalar > maxOilSaturation_
Definition: FlowGenericProblem.hpp:339
int numPressurePointsEquil_
Definition: FlowGenericProblem.hpp:354
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:563
std::vector< Scalar > maxWaterSaturation_
Definition: FlowGenericProblem.hpp:340
void initFluidSystem_()
Definition: FlowGenericProblem_impl.hpp:469
bool operator==(const FlowGenericProblem &rhs) const
Definition: FlowGenericProblem_impl.hpp:744
Scalar maxTimeStepAfterWellEvent_
Definition: FlowGenericProblem.hpp:351
Scalar ureaConcentration(unsigned elemIdx) const
Returns the initial urea concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:657
std::vector< Scalar > minRefPressure_
Definition: FlowGenericProblem.hpp:341
bool beginEpisode_(bool enableExperiments, int episodeIdx)
Definition: FlowGenericProblem_impl.hpp:407
Scalar biofilmVolumeFraction(unsigned elemIdx) const
Returns the initial biofilm volume fraction for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:669
std::vector< Scalar > solventRsw_
Definition: FlowGenericProblem.hpp:344
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:115
std::vector< Scalar > overburdenPressure_
Definition: FlowGenericProblem.hpp:342
void readBlackoilExtentionsInitialConditions_(std::size_t numDof, bool enableSolvent, bool enablePolymer, bool enablePolymerMolarWeight, bool enableBioeffects, bool enableMICP)
Definition: FlowGenericProblem_impl.hpp:476
void updatePlmixnum_()
Definition: FlowGenericProblem_impl.hpp:391
bool explicitRockCompaction_
Definition: FlowGenericProblem.hpp:358
typename FluidSystem::Scalar Scalar
Definition: FlowGenericProblem.hpp:63
Scalar polymerConcentration(unsigned elemIdx) const
Returns the initial polymer concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:609
Declare the properties used by the infrastructure code of the finite volume discretizations.
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition: parametersystem.hpp:187
Definition: blackoilbioeffectsmodules.hh:43
std::string to_string(const ConvergenceReport::ReservoirFailure::Type t)
This file provides the infrastructure to retrieve run-time parameters.
static BioeffectsSolutionContainer serializationTestObject()
static CO2H2SolutionContainer serializationTestObject()
Definition: FlowGenericProblem.hpp:67
Definition: EclTimeSteppingParams.hpp:45
static PolymerSolutionContainer serializationTestObject()