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>
46#include <opm/simulators/timestepping/EclTimeSteppingParams.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)
69 this->initFluidSystem_();
71 enableTuning_ = Parameters::Get<Parameters::EnableTuning>();
72 enableDriftCompensation_ = Parameters::Get<Parameters::EnableDriftCompensation>();
73 initialTimeStepSize_ = Parameters::Get<Parameters::InitialTimeStepSize<Scalar>>();
74 maxTimeStepAfterWellEvent_ = unit::convert::from
75 (Parameters::Get<Parameters::TimeStepAfterEventInDays<Scalar>>(), unit::day);
84 numPressurePointsEquil_ = Parameters::IsSet<Parameters::NumPressurePointsEquil>()
85 ? Parameters::Get<Parameters::NumPressurePointsEquil>()
86 : eclState.getTableManager().getEqldims().getNumDepthNodesP();
88 explicitRockCompaction_ = Parameters::Get<Parameters::ExplicitRockCompaction>();
91template<
class Gr
idView,
class Flu
idSystem>
92FlowGenericProblem<GridView,FluidSystem>
93FlowGenericProblem<GridView,FluidSystem>::
94serializationTestObject(
const EclipseState& eclState,
95 const Schedule& schedule,
96 const GridView& gridView)
98 FlowGenericProblem result(eclState, schedule, gridView);
99 result.maxOilSaturation_ = {1.0, 2.0};
100 result.maxWaterSaturation_ = {6.0};
101 result.minRefPressure_ = {7.0, 8.0, 9.0, 10.0};
102 result.overburdenPressure_ = {11.0};
103 result.solventSaturation_ = {15.0};
104 result.solventRsw_ = {18.0};
105 result.polymer_ = PolymerSolutionContainer<Scalar>::serializationTestObject();
106 result.bioeffects_ = BioeffectsSolutionContainer<Scalar>::serializationTestObject();
107 result.CO2H2_ = CO2H2SolutionContainer<Scalar>::serializationTestObject();
112template<
class Gr
idView,
class Flu
idSystem>
114FlowGenericProblem<GridView,FluidSystem>::
123 "Usage: "+std::string(argv[0]) +
" [OPTIONS] [ECL_DECK_FILENAME]\n"
127template<
class Gr
idView,
class Flu
idSystem>
129FlowGenericProblem<GridView,FluidSystem>::
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>
226void FlowGenericProblem<GridView,FluidSystem>::
227readRockCompactionParameters_()
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>
321typename FlowGenericProblem<GridView,FluidSystem>::Scalar
322FlowGenericProblem<GridView,FluidSystem>::
323rockCompressibility(
unsigned globalSpaceIdx)
const
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>
336typename FlowGenericProblem<GridView,FluidSystem>::Scalar
337FlowGenericProblem<GridView,FluidSystem>::
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>
366void FlowGenericProblem<GridView,FluidSystem>::
369 const auto num_regions = eclState_.getTableManager().getTabdims().getNumPVTTables();
370 updateNum(
"PVTNUM", pvtnum_, num_regions);
373template<
class Gr
idView,
class Flu
idSystem>
374void FlowGenericProblem<GridView,FluidSystem>::
377 const auto num_regions = eclState_.getTableManager().getTabdims().getNumSatTables();
378 updateNum(
"SATNUM", satnum_, num_regions);
381template<
class Gr
idView,
class Flu
idSystem>
382void FlowGenericProblem<GridView,FluidSystem>::
385 const auto num_regions = 1;
386 updateNum(
"MISCNUM", miscnum_, num_regions);
389template<
class Gr
idView,
class Flu
idSystem>
390void FlowGenericProblem<GridView,FluidSystem>::
393 const auto num_regions = 1;
394 updateNum(
"PLMIXNUM", plmixnum_, num_regions);
397template<
class Gr
idView,
class Flu
idSystem>
398bool FlowGenericProblem<GridView,FluidSystem>::
399vapparsActive(
int episodeIdx)
const
401 const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
402 return (oilVaporizationControl.getType() == OilVaporizationProperties::OilVaporization::VAPPARS);
405template<
class Gr
idView,
class Flu
idSystem>
406bool FlowGenericProblem<GridView,FluidSystem>::
407beginEpisode_(
bool enableExperiments,
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>
443void FlowGenericProblem<GridView,FluidSystem>::
444beginTimeStep_(
bool enableExperiments,
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>
468void FlowGenericProblem<GridView,FluidSystem>::
471 FluidSystem::initFromState(eclState_, schedule_);
474template<
class Gr
idView,
class Flu
idSystem>
475void FlowGenericProblem<GridView,FluidSystem>::
476readBlackoilExtentionsInitialConditions_(std::size_t numDof,
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>
550typename FlowGenericProblem<GridView,FluidSystem>::Scalar
551FlowGenericProblem<GridView,FluidSystem>::
552maxWaterSaturation(
unsigned globalDofIdx)
const
554 if (maxWaterSaturation_.empty())
557 return maxWaterSaturation_[globalDofIdx];
560template<
class Gr
idView,
class Flu
idSystem>
561typename FlowGenericProblem<GridView,FluidSystem>::Scalar
562FlowGenericProblem<GridView,FluidSystem>::
563minOilPressure(
unsigned globalDofIdx)
const
565 if (minRefPressure_.empty())
568 return minRefPressure_[globalDofIdx];
571template<
class Gr
idView,
class Flu
idSystem>
572typename FlowGenericProblem<GridView,FluidSystem>::Scalar
573FlowGenericProblem<GridView,FluidSystem>::
574overburdenPressure(
unsigned elementIdx)
const
576 if (overburdenPressure_.empty())
579 return overburdenPressure_[elementIdx];
582template<
class Gr
idView,
class Flu
idSystem>
583typename FlowGenericProblem<GridView,FluidSystem>::Scalar
584FlowGenericProblem<GridView,FluidSystem>::
585solventSaturation(
unsigned elemIdx)
const
587 if (solventSaturation_.empty())
590 return solventSaturation_[elemIdx];
593template<
class Gr
idView,
class Flu
idSystem>
594typename FlowGenericProblem<GridView,FluidSystem>::Scalar
595FlowGenericProblem<GridView,FluidSystem>::
596solventRsw(
unsigned elemIdx)
const
598 if (solventRsw_.empty())
601 return solventRsw_[elemIdx];
606template<
class Gr
idView,
class Flu
idSystem>
607typename FlowGenericProblem<GridView,FluidSystem>::Scalar
608FlowGenericProblem<GridView,FluidSystem>::
609polymerConcentration(
unsigned elemIdx)
const
611 if (polymer_.concentration.empty()) {
615 return polymer_.concentration[elemIdx];
618template<
class Gr
idView,
class Flu
idSystem>
619typename FlowGenericProblem<GridView,FluidSystem>::Scalar
620FlowGenericProblem<GridView,FluidSystem>::
621polymerMolecularWeight(
const unsigned elemIdx)
const
623 if (polymer_.moleWeight.empty()) {
627 return polymer_.moleWeight[elemIdx];
630template<
class Gr
idView,
class Flu
idSystem>
631typename FlowGenericProblem<GridView,FluidSystem>::Scalar
632FlowGenericProblem<GridView,FluidSystem>::
633microbialConcentration(
unsigned elemIdx)
const
635 if (bioeffects_.microbialConcentration.empty()) {
639 return bioeffects_.microbialConcentration[elemIdx];
642template<
class Gr
idView,
class Flu
idSystem>
643typename FlowGenericProblem<GridView,FluidSystem>::Scalar
644FlowGenericProblem<GridView,FluidSystem>::
645oxygenConcentration(
unsigned elemIdx)
const
647 if (bioeffects_.oxygenConcentration.empty()) {
651 return bioeffects_.oxygenConcentration[elemIdx];
654template<
class Gr
idView,
class Flu
idSystem>
655typename FlowGenericProblem<GridView,FluidSystem>::Scalar
656FlowGenericProblem<GridView,FluidSystem>::
657ureaConcentration(
unsigned elemIdx)
const
659 if (bioeffects_.ureaConcentration.empty()) {
663 return bioeffects_.ureaConcentration[elemIdx];
666template<
class Gr
idView,
class Flu
idSystem>
667typename FlowGenericProblem<GridView,FluidSystem>::Scalar
668FlowGenericProblem<GridView,FluidSystem>::
669biofilmVolumeFraction(
unsigned elemIdx)
const
671 if (bioeffects_.biofilmVolumeFraction.empty()) {
675 return bioeffects_.biofilmVolumeFraction[elemIdx];
678template<
class Gr
idView,
class Flu
idSystem>
679typename FlowGenericProblem<GridView,FluidSystem>::Scalar
680FlowGenericProblem<GridView,FluidSystem>::
681calciteVolumeFraction(
unsigned elemIdx)
const
683 if (bioeffects_.calciteVolumeFraction.empty()) {
687 return bioeffects_.calciteVolumeFraction[elemIdx];
690template<
class Gr
idView,
class Flu
idSystem>
691unsigned FlowGenericProblem<GridView,FluidSystem>::
692pvtRegionIndex(
unsigned elemIdx)
const
697 return pvtnum_[elemIdx];
700template<
class Gr
idView,
class Flu
idSystem>
701unsigned FlowGenericProblem<GridView,FluidSystem>::
702satnumRegionIndex(
unsigned elemIdx)
const
707 return satnum_[elemIdx];
710template<
class Gr
idView,
class Flu
idSystem>
711unsigned FlowGenericProblem<GridView,FluidSystem>::
712miscnumRegionIndex(
unsigned elemIdx)
const
714 if (miscnum_.empty())
717 return miscnum_[elemIdx];
720template<
class Gr
idView,
class Flu
idSystem>
721unsigned FlowGenericProblem<GridView,FluidSystem>::
722plmixnumRegionIndex(
unsigned elemIdx)
const
724 if (plmixnum_.empty())
727 return plmixnum_[elemIdx];
730template<
class Gr
idView,
class Flu
idSystem>
731typename FlowGenericProblem<GridView,FluidSystem>::Scalar
732FlowGenericProblem<GridView,FluidSystem>::
733maxPolymerAdsorption(
unsigned elemIdx)
const
735 if (polymer_.maxAdsorption.empty()) {
739 return polymer_.maxAdsorption[elemIdx];
742template<
class Gr
idView,
class Flu
idSystem>
746 return this->maxWaterSaturation_ == rhs.maxWaterSaturation_ &&
747 this->minRefPressure_ == rhs.minRefPressure_ &&
748 this->overburdenPressure_ == rhs.overburdenPressure_ &&
749 this->solventSaturation_ == rhs.solventSaturation_ &&
750 this->solventRsw_ == rhs.solventRsw_ &&
751 this->polymer_ == rhs.polymer_ &&
752 this->bioeffects_ == rhs.bioeffects_;
This problem simulates an input file given in the data format used by the commercial ECLiPSE simulato...
This problem simulates an input file given in the data format used by the commercial ECLiPSE simulato...
This problem simulates an input file given in the data format used by the commercial ECLiPSE simulato...
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
static std::string briefDescription()
Returns a human readable description of the problem for the help message.
Definition FlowGenericProblem_impl.hpp:130
Declare the properties used by the infrastructure code of the finite volume discretizations.
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:45
This file provides the infrastructure to retrieve run-time parameters.