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();
111template<
class Gr
idView,
class Flu
idSystem>
113FlowGenericProblem<GridView,FluidSystem>::
122 "Usage: "+std::string(argv[0]) +
" [OPTIONS] [ECL_DECK_FILENAME]\n"
126template<
class Gr
idView,
class Flu
idSystem>
128FlowGenericProblem<GridView,FluidSystem>::
131 return briefDescription_;
134template<
class Gr
idView,
class Flu
idSystem>
137 std::function<std::array<int,3>(
const unsigned)> ijkIndex)
139 const auto& rock_config = eclState_.getSimulationConfig().rock_config();
143 const auto& comp = rock_config.comp();
145 std::transform(comp.begin(), comp.end(), std::back_inserter(rockParams_),
148 return RockParams{static_cast<Scalar>(c.pref),
149 static_cast<Scalar>(c.compressibility)};
154 if (rock_config.store()) {
155 OpmLog::warning(
"ROCKOPTS item 2 set to STORE, ROCK item 1 replaced with initial (equilibrated) pressures");
159 readRockCompactionParameters_();
161 unsigned numElem = gridView_.size(0);
162 if (eclState_.fieldProps().has_int(rock_config.rocknum_property())) {
164 std::function<void(
int,
int)> valueCheck = [&ijkIndex,&rock_config,
this](
int fieldPropValue,
int coarseElemIdx)
166 auto fmtError = [fieldPropValue, coarseElemIdx,&ijkIndex,&rock_config](
const char* type, std::size_t size)
168 return fmt::format(
"{} table index {} for elem {} read from {}"
169 " is out of bounds for number of tables {}",
170 type, fieldPropValue,
171 ijkIndex(coarseElemIdx),
172 rock_config.rocknum_property(), size);
174 if (!rockCompPoroMult_.empty() &&
175 fieldPropValue >
static_cast<int>(rockCompPoroMult_.size())) {
176 throw std::runtime_error(fmtError(
"Rock compaction",
177 rockCompPoroMult_.size()));
179 if (!rockCompPoroMultWc_.empty() &&
180 fieldPropValue >
static_cast<int>(rockCompPoroMultWc_.size())) {
181 throw std::runtime_error(fmtError(
"Rock water compaction",
182 rockCompPoroMultWc_.size()));
186 rockTableIdx_ = this->lookUpData_.template assignFieldPropsIntOnLeaf<short unsigned int>(eclState_.fieldProps(),
187 rock_config.rocknum_property(),
193 const auto& overburdTables = eclState_.getTableManager().getOverburdTables();
194 if (!overburdTables.empty() && !rock_config.store()) {
195 overburdenPressure_.resize(numElem,0.0);
196 std::size_t numRocktabTables = rock_config.num_rock_tables();
198 if (overburdTables.size() != numRocktabTables)
199 throw std::runtime_error(std::to_string(numRocktabTables) +
" OVERBURD tables is expected, but " + std::to_string(overburdTables.size()) +
" is provided");
201 std::vector<Tabulated1DFunction<Scalar>> overburdenTables(numRocktabTables);
202 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
203 const OverburdTable& overburdTable = overburdTables.template getTable<OverburdTable>(regionIdx);
204 overburdenTables[regionIdx].setXYContainers(overburdTable.getDepthColumn(),overburdTable.getOverburdenPressureColumn());
207 for (std::size_t elemIdx = 0; elemIdx < numElem; ++ elemIdx) {
208 unsigned tableIdx = 0;
209 if (!rockTableIdx_.empty()) {
210 tableIdx = rockTableIdx_[elemIdx];
212 overburdenPressure_[elemIdx] =
213 overburdenTables[tableIdx].eval(cellCenterDepths[elemIdx],
true);
216 else if (!overburdTables.empty() && rock_config.store()) {
217 OpmLog::warning(
"ROCKOPTS item 2 set to STORE, OVERBURD ignored!");
221template<
class Gr
idView,
class Flu
idSystem>
222void FlowGenericProblem<GridView,FluidSystem>::
223readRockCompactionParameters_()
225 const auto& rock_config = eclState_.getSimulationConfig().rock_config();
227 if (!rock_config.active())
230 unsigned numElem = gridView_.size(0);
231 switch (rock_config.hysteresis_mode()) {
232 case RockConfig::Hysteresis::REVERS:
234 case RockConfig::Hysteresis::IRREVERS:
237 minRefPressure_.resize(numElem, 1e99);
240 throw std::runtime_error(
"Not support ROCKOMP hysteresis option ");
243 std::size_t numRocktabTables = rock_config.num_rock_tables();
244 bool waterCompaction = rock_config.water_compaction();
246 if (!waterCompaction) {
247 const auto& rocktabTables = eclState_.getTableManager().getRocktabTables();
248 if (rocktabTables.size() != numRocktabTables)
249 throw std::runtime_error(
"ROCKCOMP is activated." + std::to_string(numRocktabTables)
250 +
" ROCKTAB tables is expected, but " + std::to_string(rocktabTables.size()) +
" is provided");
252 rockCompPoroMult_.resize(numRocktabTables);
253 rockCompTransMult_.resize(numRocktabTables);
254 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
255 const auto& rocktabTable = rocktabTables.template getTable<RocktabTable>(regionIdx);
256 const auto& pressureColumn = rocktabTable.getPressureColumn();
257 const auto& poroColumn = rocktabTable.getPoreVolumeMultiplierColumn();
258 const auto& transColumn = rocktabTable.getTransmissibilityMultiplierColumn();
259 rockCompPoroMult_[regionIdx].setXYContainers(pressureColumn, poroColumn);
260 rockCompTransMult_[regionIdx].setXYContainers(pressureColumn, transColumn);
263 const auto& rock2dTables = eclState_.getTableManager().getRock2dTables();
264 const auto& rock2dtrTables = eclState_.getTableManager().getRock2dtrTables();
265 const auto& rockwnodTables = eclState_.getTableManager().getRockwnodTables();
266 maxWaterSaturation_.resize(numElem, 0.0);
268 if (rock2dTables.size() != numRocktabTables)
269 throw std::runtime_error(
"Water compation option is selected in ROCKCOMP." + std::to_string(numRocktabTables)
270 +
" ROCK2D tables is expected, but " + std::to_string(rock2dTables.size()) +
" is provided");
272 if (rockwnodTables.size() != numRocktabTables)
273 throw std::runtime_error(
"Water compation option is selected in ROCKCOMP." + std::to_string(numRocktabTables)
274 +
" ROCKWNOD tables is expected, but " + std::to_string(rockwnodTables.size()) +
" is provided");
276 rockCompPoroMultWc_.resize(numRocktabTables, TabulatedTwoDFunction(TabulatedTwoDFunction::InterpolationPolicy::Vertical));
277 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
278 const RockwnodTable& rockwnodTable = rockwnodTables.template getTable<RockwnodTable>(regionIdx);
279 const auto& rock2dTable = rock2dTables[regionIdx];
281 if (rockwnodTable.getSaturationColumn().size() != rock2dTable.sizeMultValues())
282 throw std::runtime_error(
"Number of entries in ROCKWNOD and ROCK2D needs to match.");
284 for (std::size_t xIdx = 0; xIdx < rock2dTable.size(); ++xIdx) {
285 rockCompPoroMultWc_[regionIdx].appendXPos(rock2dTable.getPressureValue(xIdx));
286 for (std::size_t yIdx = 0; yIdx < rockwnodTable.getSaturationColumn().size(); ++yIdx)
287 rockCompPoroMultWc_[regionIdx].appendSamplePoint(xIdx,
288 rockwnodTable.getSaturationColumn()[yIdx],
289 rock2dTable.getPvmultValue(xIdx, yIdx));
293 if (!rock2dtrTables.empty()) {
294 rockCompTransMultWc_.resize(numRocktabTables, TabulatedTwoDFunction(TabulatedTwoDFunction::InterpolationPolicy::Vertical));
295 for (std::size_t regionIdx = 0; regionIdx < numRocktabTables; ++regionIdx) {
296 const RockwnodTable& rockwnodTable = rockwnodTables.template getTable<RockwnodTable>(regionIdx);
297 const auto& rock2dtrTable = rock2dtrTables[regionIdx];
299 if (rockwnodTable.getSaturationColumn().size() != rock2dtrTable.sizeMultValues())
300 throw std::runtime_error(
"Number of entries in ROCKWNOD and ROCK2DTR needs to match.");
302 for (std::size_t xIdx = 0; xIdx < rock2dtrTable.size(); ++xIdx) {
303 rockCompTransMultWc_[regionIdx].appendXPos(rock2dtrTable.getPressureValue(xIdx));
304 for (std::size_t yIdx = 0; yIdx < rockwnodTable.getSaturationColumn().size(); ++yIdx)
305 rockCompTransMultWc_[regionIdx].appendSamplePoint(xIdx,
306 rockwnodTable.getSaturationColumn()[yIdx],
307 rock2dtrTable.getTransMultValue(xIdx, yIdx));
314template<
class Gr
idView,
class Flu
idSystem>
315typename FlowGenericProblem<GridView,FluidSystem>::Scalar
316FlowGenericProblem<GridView,FluidSystem>::
317rockCompressibility(
unsigned globalSpaceIdx)
const
319 if (this->rockParams_.empty())
322 unsigned tableIdx = 0;
323 if (!this->rockTableIdx_.empty()) {
324 tableIdx = this->rockTableIdx_[globalSpaceIdx];
326 return this->rockParams_[tableIdx].compressibility;
329template<
class Gr
idView,
class Flu
idSystem>
330typename FlowGenericProblem<GridView,FluidSystem>::Scalar
331FlowGenericProblem<GridView,FluidSystem>::
332porosity(
unsigned globalSpaceIdx,
unsigned timeIdx)
const
334 return this->referencePorosity_[timeIdx][globalSpaceIdx];
337template<
class Gr
idView,
class Flu
idSystem>
338typename FlowGenericProblem<GridView,FluidSystem>::Scalar
339FlowGenericProblem<GridView,FluidSystem>::
340rockFraction(
unsigned elementIdx,
unsigned timeIdx)
const
350 const auto ntg = this->lookUpData_.fieldPropDouble(eclState_.fieldProps(),
"NTG", elementIdx);
351 const auto poro_eff = ntg * this->lookUpData_.fieldPropDouble(eclState_.fieldProps(),
"PORO", elementIdx);
355template<
class Gr
idView,
class Flu
idSystem>
358updateNum(
const std::string& name, std::vector<T>& numbers, std::size_t num_regions)
360 if (!eclState_.fieldProps().has_int(name))
363 std::function<void(T,
int)> valueCheck = [num_regions,name](T fieldPropValue, [[maybe_unused]]
int fieldPropIdx) {
364 if ( fieldPropValue > (
int)num_regions) {
365 throw std::runtime_error(
"Values larger than maximum number of regions "
366 + std::to_string(num_regions) +
" provided in " + name);
368 if ( fieldPropValue <= 0) {
369 throw std::runtime_error(
"zero or negative values provided for region array: " + name);
373 numbers = this->lookUpData_.template assignFieldPropsIntOnLeaf<T>(eclState_.fieldProps(), name,
377template<
class Gr
idView,
class Flu
idSystem>
378void FlowGenericProblem<GridView,FluidSystem>::
381 const auto num_regions = eclState_.getTableManager().getTabdims().getNumPVTTables();
382 updateNum(
"PVTNUM", pvtnum_, num_regions);
385template<
class Gr
idView,
class Flu
idSystem>
386void FlowGenericProblem<GridView,FluidSystem>::
389 const auto num_regions = eclState_.getTableManager().getTabdims().getNumSatTables();
390 updateNum(
"SATNUM", satnum_, num_regions);
393template<
class Gr
idView,
class Flu
idSystem>
394void FlowGenericProblem<GridView,FluidSystem>::
397 const auto num_regions = 1;
398 updateNum(
"MISCNUM", miscnum_, num_regions);
401template<
class Gr
idView,
class Flu
idSystem>
402void FlowGenericProblem<GridView,FluidSystem>::
405 const auto num_regions = 1;
406 updateNum(
"PLMIXNUM", plmixnum_, num_regions);
409template<
class Gr
idView,
class Flu
idSystem>
410bool FlowGenericProblem<GridView,FluidSystem>::
411vapparsActive(
int episodeIdx)
const
413 const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
414 return (oilVaporizationControl.getType() == OilVaporizationProperties::OilVaporization::VAPPARS);
417template<
class Gr
idView,
class Flu
idSystem>
418bool FlowGenericProblem<GridView,FluidSystem>::
419beginEpisode_(
bool enableExperiments,
422 if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
425 std::ostringstream ss;
426 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet(
"%d-%b-%Y");
427 boost::posix_time::ptime curDateTime =
428 boost::posix_time::from_time_t(schedule_.simTime(episodeIdx));
429 ss.imbue(std::locale(std::locale::classic(), facet));
430 ss <<
"Report step " << episodeIdx + 1
431 <<
"/" << schedule_.size() - 1
432 <<
" at day " << schedule_.seconds(episodeIdx)/(24*3600)
433 <<
"/" << schedule_.seconds(schedule_.size() - 1)/(24*3600)
434 <<
", date = " << curDateTime.date()
436 OpmLog::info(ss.str());
439 const auto& events = schedule_[episodeIdx].events();
442 if (episodeIdx > 0 && enableTuning_ && events.hasEvent(ScheduleEvents::TUNING_CHANGE))
444 const auto& sched_state = schedule_[episodeIdx];
445 const auto& tuning = sched_state.tuning();
446 initialTimeStepSize_ = sched_state.max_next_tstep(enableTuning_);
447 maxTimeStepAfterWellEvent_ = tuning.TMAXWC;
454template<
class Gr
idView,
class Flu
idSystem>
455void FlowGenericProblem<GridView,FluidSystem>::
456beginTimeStep_(
bool enableExperiments,
464 if (enableExperiments && gridView_.comm().rank() == 0 && episodeIdx >= 0) {
465 std::ostringstream ss;
466 boost::posix_time::time_facet* facet =
new boost::posix_time::time_facet(
"%d-%b-%Y");
467 boost::posix_time::ptime date = boost::posix_time::from_time_t(startTime) + boost::posix_time::milliseconds(
static_cast<long long>(time / prefix::milli));
468 ss.imbue(std::locale(std::locale::classic(), facet));
469 ss <<
"\nTime step " << timeStepIndex <<
", stepsize "
470 << unit::convert::to(timeStepSize, unit::day) <<
" days,"
471 <<
" at day " << (double)unit::convert::to(time, unit::day)
472 <<
"/" << (double)unit::convert::to(endTime, unit::day)
473 <<
", date = " << date;
474 OpmLog::info(ss.str());
478template<
class Gr
idView,
class Flu
idSystem>
479void FlowGenericProblem<GridView,FluidSystem>::
482 FluidSystem::initFromState(eclState_, schedule_);
485template<
class Gr
idView,
class Flu
idSystem>
486void FlowGenericProblem<GridView,FluidSystem>::
487readBlackoilExtentionsInitialConditions_(std::size_t numDof,
490 bool enablePolymerMolarWeight,
491 bool enableBioeffects,
494 auto getArray = [](
const std::vector<double>& input)
496 if constexpr (std::is_same_v<Scalar,double>) {
499 return std::vector<Scalar>{input.begin(), input.end()};
504 if (eclState_.fieldProps().has_double(
"SSOL")) {
505 solventSaturation_ = getArray(eclState_.fieldProps().get_double(
"SSOL"));
507 solventSaturation_.resize(numDof, 0.0);
510 solventRsw_.resize(numDof, 0.0);
514 if (eclState_.fieldProps().has_double(
"SPOLY")) {
515 polymer_.concentration = getArray(eclState_.fieldProps().get_double(
"SPOLY"));
517 polymer_.concentration.resize(numDof, 0.0);
521 if (enablePolymerMolarWeight) {
522 if (eclState_.fieldProps().has_double(
"SPOLYMW")) {
523 polymer_.moleWeight = getArray(eclState_.fieldProps().get_double(
"SPOLYMW"));
525 polymer_.moleWeight.resize(numDof, 0.0);
529 if (enableBioeffects) {
530 if (eclState_.fieldProps().has_double(
"SMICR")) {
531 bioeffects_.microbialConcentration = getArray(eclState_.fieldProps().get_double(
"SMICR"));
533 bioeffects_.microbialConcentration.resize(numDof, 0.0);
535 if (eclState_.fieldProps().has_double(
"SBIOF")) {
536 bioeffects_.biofilmVolumeFraction = getArray(eclState_.fieldProps().get_double(
"SBIOF"));
538 bioeffects_.biofilmVolumeFraction.resize(numDof, 0.0);
541 if (eclState_.fieldProps().has_double(
"SOXYG")) {
542 bioeffects_.oxygenConcentration = getArray(eclState_.fieldProps().get_double(
"SOXYG"));
544 bioeffects_.oxygenConcentration.resize(numDof, 0.0);
546 if (eclState_.fieldProps().has_double(
"SUREA")) {
547 bioeffects_.ureaConcentration = getArray(eclState_.fieldProps().get_double(
"SUREA"));
549 bioeffects_.ureaConcentration.resize(numDof, 0.0);
551 if (eclState_.fieldProps().has_double(
"SCALC")) {
552 bioeffects_.calciteVolumeFraction = getArray(eclState_.fieldProps().get_double(
"SCALC"));
554 bioeffects_.calciteVolumeFraction.resize(numDof, 0.0);
560template<
class Gr
idView,
class Flu
idSystem>
561typename FlowGenericProblem<GridView,FluidSystem>::Scalar
562FlowGenericProblem<GridView,FluidSystem>::
563maxWaterSaturation(
unsigned globalDofIdx)
const
565 if (maxWaterSaturation_.empty())
568 return maxWaterSaturation_[globalDofIdx];
571template<
class Gr
idView,
class Flu
idSystem>
572typename FlowGenericProblem<GridView,FluidSystem>::Scalar
573FlowGenericProblem<GridView,FluidSystem>::
574minOilPressure(
unsigned globalDofIdx)
const
576 if (minRefPressure_.empty())
579 return minRefPressure_[globalDofIdx];
582template<
class Gr
idView,
class Flu
idSystem>
583typename FlowGenericProblem<GridView,FluidSystem>::Scalar
584FlowGenericProblem<GridView,FluidSystem>::
585overburdenPressure(
unsigned elementIdx)
const
587 if (overburdenPressure_.empty())
590 return overburdenPressure_[elementIdx];
593template<
class Gr
idView,
class Flu
idSystem>
594typename FlowGenericProblem<GridView,FluidSystem>::Scalar
595FlowGenericProblem<GridView,FluidSystem>::
596solventSaturation(
unsigned elemIdx)
const
598 if (solventSaturation_.empty())
601 return solventSaturation_[elemIdx];
604template<
class Gr
idView,
class Flu
idSystem>
605typename FlowGenericProblem<GridView,FluidSystem>::Scalar
606FlowGenericProblem<GridView,FluidSystem>::
607solventRsw(
unsigned elemIdx)
const
609 if (solventRsw_.empty())
612 return solventRsw_[elemIdx];
617template<
class Gr
idView,
class Flu
idSystem>
618typename FlowGenericProblem<GridView,FluidSystem>::Scalar
619FlowGenericProblem<GridView,FluidSystem>::
620polymerConcentration(
unsigned elemIdx)
const
622 if (polymer_.concentration.empty()) {
626 return polymer_.concentration[elemIdx];
629template<
class Gr
idView,
class Flu
idSystem>
630typename FlowGenericProblem<GridView,FluidSystem>::Scalar
631FlowGenericProblem<GridView,FluidSystem>::
632polymerMolecularWeight(
const unsigned elemIdx)
const
634 if (polymer_.moleWeight.empty()) {
638 return polymer_.moleWeight[elemIdx];
641template<
class Gr
idView,
class Flu
idSystem>
642typename FlowGenericProblem<GridView,FluidSystem>::Scalar
643FlowGenericProblem<GridView,FluidSystem>::
644microbialConcentration(
unsigned elemIdx)
const
646 if (bioeffects_.microbialConcentration.empty()) {
650 return bioeffects_.microbialConcentration[elemIdx];
653template<
class Gr
idView,
class Flu
idSystem>
654typename FlowGenericProblem<GridView,FluidSystem>::Scalar
655FlowGenericProblem<GridView,FluidSystem>::
656oxygenConcentration(
unsigned elemIdx)
const
658 if (bioeffects_.oxygenConcentration.empty()) {
662 return bioeffects_.oxygenConcentration[elemIdx];
665template<
class Gr
idView,
class Flu
idSystem>
666typename FlowGenericProblem<GridView,FluidSystem>::Scalar
667FlowGenericProblem<GridView,FluidSystem>::
668ureaConcentration(
unsigned elemIdx)
const
670 if (bioeffects_.ureaConcentration.empty()) {
674 return bioeffects_.ureaConcentration[elemIdx];
677template<
class Gr
idView,
class Flu
idSystem>
678typename FlowGenericProblem<GridView,FluidSystem>::Scalar
679FlowGenericProblem<GridView,FluidSystem>::
680biofilmVolumeFraction(
unsigned elemIdx)
const
682 if (bioeffects_.biofilmVolumeFraction.empty()) {
686 return bioeffects_.biofilmVolumeFraction[elemIdx];
689template<
class Gr
idView,
class Flu
idSystem>
690typename FlowGenericProblem<GridView,FluidSystem>::Scalar
691FlowGenericProblem<GridView,FluidSystem>::
692calciteVolumeFraction(
unsigned elemIdx)
const
694 if (bioeffects_.calciteVolumeFraction.empty()) {
698 return bioeffects_.calciteVolumeFraction[elemIdx];
701template<
class Gr
idView,
class Flu
idSystem>
702unsigned FlowGenericProblem<GridView,FluidSystem>::
703pvtRegionIndex(
unsigned elemIdx)
const
708 return pvtnum_[elemIdx];
711template<
class Gr
idView,
class Flu
idSystem>
712unsigned FlowGenericProblem<GridView,FluidSystem>::
713satnumRegionIndex(
unsigned elemIdx)
const
718 return satnum_[elemIdx];
721template<
class Gr
idView,
class Flu
idSystem>
722unsigned FlowGenericProblem<GridView,FluidSystem>::
723miscnumRegionIndex(
unsigned elemIdx)
const
725 if (miscnum_.empty())
728 return miscnum_[elemIdx];
731template<
class Gr
idView,
class Flu
idSystem>
732unsigned FlowGenericProblem<GridView,FluidSystem>::
733plmixnumRegionIndex(
unsigned elemIdx)
const
735 if (plmixnum_.empty())
738 return plmixnum_[elemIdx];
741template<
class Gr
idView,
class Flu
idSystem>
742typename FlowGenericProblem<GridView,FluidSystem>::Scalar
743FlowGenericProblem<GridView,FluidSystem>::
744maxPolymerAdsorption(
unsigned elemIdx)
const
746 if (polymer_.maxAdsorption.empty()) {
750 return polymer_.maxAdsorption[elemIdx];
753template<
class Gr
idView,
class Flu
idSystem>
757 return this->maxWaterSaturation_ == rhs.maxWaterSaturation_ &&
758 this->minRefPressure_ == rhs.minRefPressure_ &&
759 this->overburdenPressure_ == rhs.overburdenPressure_ &&
760 this->solventSaturation_ == rhs.solventSaturation_ &&
761 this->solventRsw_ == rhs.solventRsw_ &&
762 this->polymer_ == rhs.polymer_ &&
763 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:129
Scalar referencePorosity(unsigned elementIdx, unsigned timeIdx) const
Returns the porosity of an element.
Definition FlowGenericProblem.hpp:137
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:43
This file provides the infrastructure to retrieve run-time parameters.