28#ifndef EWOMS_BLACK_OIL_POLYMER_MODULE_HH
29#define EWOMS_BLACK_OIL_POLYMER_MODULE_HH
31#include <dune/common/fvector.hh>
33#include <opm/common/OpmLog/OpmLog.hpp>
34#include <opm/common/utility/gpuDecorators.hpp>
36#include <opm/material/common/MathToolbox.hpp>
64template <
class TypeTag>
65class BlackOilPolymerModule<TypeTag, true>
79 using Toolbox = MathToolbox<Evaluation>;
84 static constexpr unsigned polymerConcentrationIdx = Indices::polymerConcentrationIdx;
85 static constexpr unsigned polymerMoleWeightIdx = Indices::polymerMoleWeightIdx;
86 static constexpr unsigned contiPolymerEqIdx = Indices::contiPolymerEqIdx;
87 static constexpr unsigned contiPolymerMolarWeightEqIdx = Indices::contiPolymerMWEqIdx;
88 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
90 static constexpr bool enablePolymer =
true;
91 static constexpr bool enablePolymerMolarWeight = getPropValue<TypeTag, Properties::EnablePolymerMW>();
93 static constexpr unsigned numEq = getPropValue<TypeTag, Properties::NumEq>();
107 const auto iterTable = params_.plymwinjTables_.find(tableNumber);
108 if (iterTable != params_.plymwinjTables_.end()) {
109 return iterTable->second;
112 throw std::runtime_error(
" the PLYMWINJ table " +
std::to_string(tableNumber) +
" does not exist\n");
121 const auto iterTable = params_.skprwatTables_.find(tableNumber);
122 if (iterTable != params_.skprwatTables_.end()) {
123 return iterTable->second;
126 throw std::runtime_error(
" the SKPRWAT table " +
std::to_string(tableNumber) +
" does not exist\n");
136 const auto iterTable = params_.skprpolyTables_.find(tableNumber);
137 if (iterTable != params_.skprpolyTables_.end()) {
138 return iterTable->second;
141 throw std::runtime_error(
" the SKPRPOLY table " +
std::to_string(tableNumber) +
" does not exist\n");
157 Simulator& simulator)
164 if constexpr (enablePolymerMolarWeight) {
165 return pvIdx == polymerConcentrationIdx || pvIdx == polymerMoleWeightIdx;
168 return pvIdx == polymerConcentrationIdx;
174 assert(primaryVarApplies(pvIdx));
176 if (pvIdx == polymerConcentrationIdx) {
177 return "polymer_waterconcentration";
180 return "polymer_molecularweight";
186 assert(primaryVarApplies(pvIdx));
189 return static_cast<Scalar
>(1.0);
194 if constexpr (enablePolymerMolarWeight) {
195 return eqIdx == contiPolymerEqIdx || eqIdx == contiPolymerMolarWeightEqIdx;
198 return eqIdx == contiPolymerEqIdx;
202 static std::string
eqName(
unsigned eqIdx)
204 assert(eqApplies(eqIdx));
206 if (eqIdx == contiPolymerEqIdx) {
207 return "conti^polymer";
210 return "conti^polymer_molecularweight";
214 static Scalar
eqWeight([[maybe_unused]]
unsigned eqIdx)
216 assert(eqApplies(eqIdx));
219 return static_cast<Scalar
>(1.0);
223 template <
class StorageType>
225 const IntensiveQuantities& intQuants)
227 using LhsEval =
typename StorageType::value_type;
229 const auto& fs = intQuants.fluidState();
232 const LhsEval surfaceVolumeWater =
233 max(Toolbox::template decay<LhsEval>(fs.saturation(waterPhaseIdx)) *
234 Toolbox::template decay<LhsEval>(fs.invB(waterPhaseIdx)) *
235 Toolbox::template decay<LhsEval>(intQuants.porosity()),
239 const LhsEval massPolymer =
241 Toolbox::template decay<LhsEval>(intQuants.polymerConcentration()) *
242 (1.0 - Toolbox::template decay<LhsEval>(intQuants.polymerDeadPoreVolume()));
245 const LhsEval adsorptionPolymer =
246 Toolbox::template decay<LhsEval>(1.0 - intQuants.porosity()) *
247 Toolbox::template decay<LhsEval>(intQuants.polymerRockDensity()) *
248 Toolbox::template decay<LhsEval>(intQuants.polymerAdsorption());
250 LhsEval accumulationPolymer = massPolymer + adsorptionPolymer;
252 storage[contiPolymerEqIdx] += accumulationPolymer;
255 if constexpr (enablePolymerMolarWeight) {
256 accumulationPolymer = max(accumulationPolymer, 1e-10);
258 storage[contiPolymerMolarWeightEqIdx] +=
259 accumulationPolymer * Toolbox::template decay<LhsEval>(intQuants.polymerMoleWeight());
264 const ElementContext& elemCtx,
268 const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
270 const unsigned upIdx = extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
271 const unsigned inIdx = extQuants.interiorIndex();
272 const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
273 const unsigned contiWaterEqIdx =
274 Indices::conti0EqIdx + FluidSystem::canonicalToActiveCompIdx(FluidSystem::waterCompIdx);
276 if (upIdx == inIdx) {
277 flux[contiPolymerEqIdx] =
278 extQuants.volumeFlux(waterPhaseIdx) *
279 up.fluidState().invB(waterPhaseIdx) *
280 up.polymerViscosityCorrection() /
281 extQuants.polymerShearFactor() *
282 up.polymerConcentration();
285 flux[contiWaterEqIdx] /= extQuants.waterShearFactor();
288 flux[contiPolymerEqIdx] =
289 extQuants.volumeFlux(waterPhaseIdx) *
290 decay<Scalar>(up.fluidState().invB(waterPhaseIdx)) *
291 decay<Scalar>(up.polymerViscosityCorrection()) /
292 decay<Scalar>(extQuants.polymerShearFactor()) *
293 decay<Scalar>(up.polymerConcentration());
296 flux[contiWaterEqIdx] /= decay<Scalar>(extQuants.waterShearFactor());
300 if constexpr (enablePolymerMolarWeight) {
301 if (upIdx == inIdx) {
302 flux[contiPolymerMolarWeightEqIdx] =
303 flux[contiPolymerEqIdx] * up.polymerMoleWeight();
306 flux[contiPolymerMolarWeightEqIdx] =
307 flux[contiPolymerEqIdx] * decay<Scalar>(up.polymerMoleWeight());
321 return static_cast<Scalar
>(0.0);
324 template <
class DofEntity>
325 static void serializeEntity(
const Model& model, std::ostream& outstream,
const DofEntity& dof)
327 const unsigned dofIdx = model.dofMapper().index(dof);
328 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
329 outstream << priVars[polymerConcentrationIdx];
330 outstream << priVars[polymerMoleWeightIdx];
333 template <
class DofEntity>
336 const unsigned dofIdx = model.dofMapper().index(dof);
337 PrimaryVariables& priVars0 = model.solution(0)[dofIdx];
338 PrimaryVariables& priVars1 = model.solution(1)[dofIdx];
340 instream >> priVars0[polymerConcentrationIdx];
341 instream >> priVars0[polymerMoleWeightIdx];
344 priVars1[polymerConcentrationIdx] = priVars0[polymerConcentrationIdx];
345 priVars1[polymerMoleWeightIdx] = priVars0[polymerMoleWeightIdx];
352 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
353 return params_.plyrockDeadPoreVolume_[satnumRegionIdx];
360 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
361 return params_.plyrockResidualResistanceFactor_[satnumRegionIdx];
368 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
369 return params_.plyrockRockDensityFactor_[satnumRegionIdx];
376 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
377 return params_.plyrockAdsorbtionIndex_[satnumRegionIdx];
384 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
385 return params_.plyrockMaxAdsorbtion_[satnumRegionIdx];
388 static const TabulatedFunction&
393 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
394 return params_.plyadsAdsorbedPolymer_[satnumRegionIdx];
397 static const TabulatedFunction&
402 unsigned pvtnumRegionIdx =
403 elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
404 return params_.plyviscViscosityMultiplierTable_[pvtnumRegionIdx];
407 static const TabulatedFunction&
409 {
return params_.plyviscViscosityMultiplierTable_[pvtnumRegionIdx]; }
415 const unsigned polymerMixRegionIdx =
416 elemCtx.problem().plmixnumRegionIndex(elemCtx, scvIdx, timeIdx);
417 return params_.plymaxMaxConcentration_[polymerMixRegionIdx];
424 const unsigned polymerMixRegionIdx =
425 elemCtx.problem().plmixnumRegionIndex(elemCtx, scvIdx, timeIdx);
426 return params_.plymixparToddLongstaff_[polymerMixRegionIdx];
431 const unsigned scvIdx,
432 const unsigned timeIdx)
434 const unsigned polymerMixRegionIdx =
435 elemCtx.problem().plmixnumRegionIndex(elemCtx, scvIdx, timeIdx);
436 return params_.plyvmhCoefficients_[polymerMixRegionIdx];
440 {
return params_.hasPlyshlog_; }
443 {
return params_.hasShrate_; }
445 static Scalar
shrate(
unsigned pvtnumRegionIdx)
446 {
return params_.shrate_[pvtnumRegionIdx]; }
454 template <
class Evaluation>
456 unsigned pvtnumRegionIdx,
457 const Evaluation& v0)
459 using ToolboxLocal = MathToolbox<Evaluation>;
461 const auto& viscosityMultiplierTable = params_.plyviscViscosityMultiplierTable_[pvtnumRegionIdx];
462 const Scalar viscosityMultiplier =
463 viscosityMultiplierTable.eval(scalarValue(polymerConcentration),
true);
465 const Scalar eps = 1e-14;
467 if (std::abs((viscosityMultiplier - 1.0)) < eps) {
468 return ToolboxLocal::createConstant(v0, 1.0);
471 const std::vector<Scalar>& shearEffectRefLogVelocity =
472 params_.plyshlogShearEffectRefLogVelocity_[pvtnumRegionIdx];
473 const auto v0AbsLog = log(abs(v0));
475 if (v0AbsLog < shearEffectRefLogVelocity[0]) {
476 return ToolboxLocal::createConstant(v0, 1.0);
483 const std::vector<Scalar>& shearEffectRefMultiplier =
484 params_.plyshlogShearEffectRefMultiplier_[pvtnumRegionIdx];
485 const std::size_t numTableEntries = shearEffectRefLogVelocity.size();
486 assert(shearEffectRefMultiplier.size() == numTableEntries);
488 std::vector<Scalar> shearEffectMultiplier(numTableEntries, 1.0);
489 for (std::size_t i = 0; i < numTableEntries; ++i) {
490 shearEffectMultiplier[i] = (1.0 + (viscosityMultiplier - 1.0) *
491 shearEffectRefMultiplier[i]) / viscosityMultiplier;
492 shearEffectMultiplier[i] = log(shearEffectMultiplier[i]);
496 const TabulatedFunction logShearEffectMultiplier =
497 TabulatedFunction(numTableEntries, shearEffectRefLogVelocity,
498 shearEffectMultiplier,
false);
505 auto F = [&logShearEffectMultiplier, &v0AbsLog](
const Evaluation& u) {
506 return u + logShearEffectMultiplier.eval(u,
true) - v0AbsLog;
509 auto dF = [&logShearEffectMultiplier](
const Evaluation& u) {
510 return 1 + logShearEffectMultiplier.evalDerivative(u,
true);
516 bool converged =
false;
518 for (
int i = 0; i < 20; ++i) {
520 const auto df = dF(u);
522 if (std::abs(scalarValue(f)) < 1e-12) {
528 throw std::runtime_error(
"Not able to compute shear velocity. \n");
532 return exp(logShearEffectMultiplier.eval(u,
true));
542template <
class TypeTag>
543BlackOilPolymerParams<typename BlackOilPolymerModule<TypeTag, true>::Scalar>
544BlackOilPolymerModule<TypeTag, true>::params_;
553template <
class TypeTag>
568 static constexpr unsigned polymerConcentrationIdx = Indices::polymerConcentrationIdx;
569 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
570 static constexpr bool enablePolymerMolarWeight = getPropValue<TypeTag, Properties::EnablePolymerMW>();
571 static constexpr unsigned polymerMoleWeightIdx = Indices::polymerMoleWeightIdx;
583 const auto linearizationType = elemCtx.linearizationType();
584 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
585 polymerConcentration_ = priVars.makeEvaluation(polymerConcentrationIdx, timeIdx, linearizationType);
586 if constexpr (enablePolymerMolarWeight) {
587 polymerMoleWeight_ = priVars.makeEvaluation(polymerMoleWeightIdx, timeIdx, linearizationType);
591 const Scalar& maxAdsorbtion = PolymerModule::plyrockMaxAdsorbtion(elemCtx, dofIdx, timeIdx);
592 const auto& plyadsAdsorbedPolymer = PolymerModule::plyadsAdsorbedPolymer(elemCtx, dofIdx, timeIdx);
593 polymerAdsorption_ = plyadsAdsorbedPolymer.eval(polymerConcentration_,
true);
594 if (
static_cast<int>(PolymerModule::plyrockAdsorbtionIndex(elemCtx, dofIdx, timeIdx)) ==
597 const auto maxPolymerAdsorption =
598 elemCtx.problem().maxPolymerAdsorption(elemCtx, dofIdx, timeIdx);
599 polymerAdsorption_ = std::max(Evaluation(maxPolymerAdsorption), polymerAdsorption_);
603 const Scalar& residualResistanceFactor =
604 PolymerModule::plyrockResidualResistanceFactor(elemCtx, dofIdx, timeIdx);
605 const Evaluation resistanceFactor = 1.0 + (residualResistanceFactor - 1.0) *
606 polymerAdsorption_ / maxAdsorbtion;
609 if constexpr (!enablePolymerMolarWeight) {
610 const Scalar cmax = PolymerModule::plymaxMaxConcentration(elemCtx, dofIdx, timeIdx);
611 const auto& fs = asImp_().fluidState_;
612 const Evaluation& muWater = fs.viscosity(waterPhaseIdx);
613 const auto& viscosityMultiplier =
614 PolymerModule::plyviscViscosityMultiplierTable(elemCtx, dofIdx, timeIdx);
615 const Evaluation viscosityMixture =
616 viscosityMultiplier.eval(polymerConcentration_,
true) * muWater;
619 const Scalar plymixparToddLongstaff = PolymerModule::plymixparToddLongstaff(elemCtx, dofIdx, timeIdx);
620 const Evaluation viscosityPolymer = viscosityMultiplier.eval(cmax,
true) * muWater;
621 const Evaluation viscosityPolymerEffective =
622 pow(viscosityMixture, plymixparToddLongstaff) * pow(viscosityPolymer, 1.0 - plymixparToddLongstaff);
623 const Evaluation viscosityWaterEffective =
624 pow(viscosityMixture, plymixparToddLongstaff) * pow(muWater, 1.0 - plymixparToddLongstaff);
626 const Evaluation cbar = polymerConcentration_ / cmax;
628 waterViscosityCorrection_ = muWater * ((1.0 - cbar) / viscosityWaterEffective + cbar / viscosityPolymerEffective);
630 polymerViscosityCorrection_ = (muWater / waterViscosityCorrection_) / viscosityPolymerEffective;
633 const auto& plyvmhCoefficients = PolymerModule::plyvmhCoefficients(elemCtx, dofIdx, timeIdx);
634 const Scalar k_mh = plyvmhCoefficients.k_mh;
635 const Scalar a_mh = plyvmhCoefficients.a_mh;
636 const Scalar gamma = plyvmhCoefficients.gamma;
637 const Scalar kappa = plyvmhCoefficients.kappa;
641 const Evaluation intrinsicViscosity = k_mh * pow(polymerMoleWeight_ * 1000., a_mh);
642 const Evaluation x = polymerConcentration_ * intrinsicViscosity;
643 waterViscosityCorrection_ = 1.0 / (1.0 + gamma * (x + kappa * x * x));
644 polymerViscosityCorrection_ = 1.0;
648 asImp_().mobility_[waterPhaseIdx] *= waterViscosityCorrection_ / resistanceFactor;
651 polymerDeadPoreVolume_ = PolymerModule::plyrockDeadPoreVolume(elemCtx, dofIdx, timeIdx);
652 polymerRockDensity_ = PolymerModule::plyrockRockDensityFactor(elemCtx, dofIdx, timeIdx);
656 {
return polymerConcentration_; }
660 if constexpr (enablePolymerMolarWeight) {
661 return polymerMoleWeight_;
664 throw std::logic_error(
"polymerMoleWeight() is called but polymer milecular weight is disabled");
669 {
return polymerDeadPoreVolume_; }
672 {
return polymerAdsorption_; }
675 {
return polymerRockDensity_; }
679 {
return polymerViscosityCorrection_; }
683 {
return waterViscosityCorrection_; }
687 {
return *
static_cast<Implementation*
>(
this); }
706template <
class TypeTag>
717 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
728 template <
class Dummy =
bool>
734 throw std::runtime_error(
"The extension of the blackoil model for polymers is not yet "
735 "implemented for problems specified using permeabilities.");
748 waterShearFactor_ = 1.0;
749 polymerShearFactor_ = 1.0;
751 if (!PolymerModule::hasPlyshlog()) {
755 const ExtensiveQuantities& extQuants = asImp_();
756 const unsigned upIdx = extQuants.upstreamIndex(waterPhaseIdx);
757 const unsigned interiorDofIdx = extQuants.interiorIndex();
758 const unsigned exteriorDofIdx = extQuants.exteriorIndex();
759 const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
760 const auto& intQuantsIn = elemCtx.intensiveQuantities(interiorDofIdx, timeIdx);
761 const auto& intQuantsEx = elemCtx.intensiveQuantities(exteriorDofIdx, timeIdx);
764 const Evaluation poroAvg = intQuantsIn.porosity() * 0.5 + intQuantsEx.porosity() * 0.5;
765 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvfIdx, timeIdx);
766 const Evaluation& Sw = up.fluidState().saturation(waterPhaseIdx);
767 const unsigned cellIdx = elemCtx.globalSpaceIndex(scvfIdx, timeIdx);
768 const auto& materialLawManager = elemCtx.problem().materialLawManager();
769 const auto& scaledDrainageInfo =
770 materialLawManager->oilWaterScaledEpsInfoDrainage(cellIdx);
771 const Scalar& Swcr = scaledDrainageInfo.Swcr;
774 const Evaluation denom = max(poroAvg * (Sw - Swcr), 1e-12);
775 Evaluation waterVolumeVelocity = extQuants.volumeFlux(waterPhaseIdx) / denom;
778 if (PolymerModule::hasShrate()) {
779 const Evaluation& relWater = up.relativePermeability(waterPhaseIdx);
780 const Scalar trans = elemCtx.problem().transmissibility(elemCtx, interiorDofIdx, exteriorDofIdx);
782 const Scalar faceArea = elemCtx.stencil(timeIdx).interiorFace(scvfIdx).area();
783 const auto dist = elemCtx.pos(interiorDofIdx, timeIdx) - elemCtx.pos(exteriorDofIdx, timeIdx);
785 const Scalar absPerm = trans / faceArea * dist.two_norm();
786 waterVolumeVelocity *=
787 PolymerModule::shrate(pvtnumRegionIdx) * sqrt(poroAvg * Sw / (relWater * absPerm));
788 assert(isfinite(waterVolumeVelocity));
794 PolymerModule::computeShearFactor(up.polymerConcentration(),
796 waterVolumeVelocity);
797 polymerShearFactor_ =
798 PolymerModule::computeShearFactor(up.polymerConcentration(),
800 waterVolumeVelocity * up.polymerViscosityCorrection());
804 {
return polymerShearFactor_; }
807 {
return waterShearFactor_; }
810 Implementation& asImp_()
811 {
return *
static_cast<Implementation*
>(
this); }
813 Evaluation polymerShearFactor_;
814 Evaluation waterShearFactor_;
Contains classes extending the black-oil model. \detail This file holds dummy definitions,...
Contains the parameters required to extend the black-oil model by polymer.
Declares the properties required by the black oil model.
const Evaluation & polymerShearFactor() const
Definition: blackoilpolymermodules.hh:803
void updateShearMultipliers(const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Method which calculates the shear factor based on flow velocity.
Definition: blackoilpolymermodules.hh:744
void updateShearMultipliersPerm(const ElementContext &, unsigned, unsigned)
Method which calculates the shear factor based on flow velocity.
Definition: blackoilpolymermodules.hh:730
const Evaluation & waterShearFactor() const
Definition: blackoilpolymermodules.hh:806
Provides the polymer specific extensive quantities to the generic black-oil module's extensive quanti...
Evaluation polymerViscosityCorrection_
Definition: blackoilpolymermodules.hh:695
Scalar polymerDeadPoreVolume_
Definition: blackoilpolymermodules.hh:692
void polymerPropertiesUpdate_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the intensive properties needed to handle polymers from the primary variables.
Definition: blackoilpolymermodules.hh:579
Implementation & asImp_()
Definition: blackoilpolymermodules.hh:686
Scalar polymerRockDensity_
Definition: blackoilpolymermodules.hh:693
const Evaluation & polymerMoleWeight() const
Definition: blackoilpolymermodules.hh:658
Evaluation polymerConcentration_
Definition: blackoilpolymermodules.hh:689
Scalar polymerDeadPoreVolume() const
Definition: blackoilpolymermodules.hh:668
Evaluation polymerMoleWeight_
Definition: blackoilpolymermodules.hh:691
const Evaluation & waterViscosityCorrection() const
Definition: blackoilpolymermodules.hh:682
const Evaluation & polymerAdsorption() const
Definition: blackoilpolymermodules.hh:671
const Evaluation & polymerConcentration() const
Definition: blackoilpolymermodules.hh:655
const Evaluation & polymerViscosityCorrection() const
Definition: blackoilpolymermodules.hh:678
Evaluation waterViscosityCorrection_
Definition: blackoilpolymermodules.hh:696
Scalar polymerRockDensity() const
Definition: blackoilpolymermodules.hh:674
Evaluation polymerAdsorption_
Definition: blackoilpolymermodules.hh:694
Provides the volumetric quantities required for the equations needed by the polymers extension of the...
Contains the high level supplements required to extend the black oil model by polymer.
Definition: blackoilpolymermodules.hh:66
static void setParams(BlackOilPolymerParams< Scalar > &¶ms)
Set parameters.
Definition: blackoilpolymermodules.hh:97
static void deserializeEntity(Model &model, std::istream &instream, const DofEntity &dof)
Definition: blackoilpolymermodules.hh:334
static void registerParameters()
Register all run-time parameters for the black-oil polymer module.
Definition: blackoilpolymermodules.hh:148
static Scalar computeUpdateError(const PrimaryVariables &, const EqVector &)
Return how much a Newton-Raphson update is considered an error.
Definition: blackoilpolymermodules.hh:315
static Evaluation computeShearFactor(const Evaluation &polymerConcentration, unsigned pvtnumRegionIdx, const Evaluation &v0)
Computes the shear factor.
Definition: blackoilpolymermodules.hh:455
static void computeFlux(RateVector &flux, const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:263
static Scalar plymixparToddLongstaff(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:420
static bool hasPlyshlog()
Definition: blackoilpolymermodules.hh:439
static Scalar plyrockDeadPoreVolume(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:348
static void registerOutputModules(Model &model, Simulator &simulator)
Register all polymer specific VTK and ECL output modules.
Definition: blackoilpolymermodules.hh:156
static bool eqApplies(unsigned eqIdx)
Definition: blackoilpolymermodules.hh:192
static Scalar plyrockMaxAdsorbtion(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:380
static const TabulatedFunction & plyviscViscosityMultiplierTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:398
static bool primaryVarApplies(unsigned pvIdx)
Definition: blackoilpolymermodules.hh:162
static std::string primaryVarName(unsigned pvIdx)
Definition: blackoilpolymermodules.hh:172
static const TabulatedFunction & plyadsAdsorbedPolymer(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:389
static Scalar primaryVarWeight(unsigned pvIdx)
Definition: blackoilpolymermodules.hh:184
static Scalar plymaxMaxConcentration(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:411
static const BlackOilPolymerParams< Scalar >::PlyvmhCoefficients & plyvmhCoefficients(const ElementContext &elemCtx, const unsigned scvIdx, const unsigned timeIdx)
Definition: blackoilpolymermodules.hh:430
static void serializeEntity(const Model &model, std::ostream &outstream, const DofEntity &dof)
Definition: blackoilpolymermodules.hh:325
static const TabulatedFunction & plyviscViscosityMultiplierTable(unsigned pvtnumRegionIdx)
Definition: blackoilpolymermodules.hh:408
static Scalar shrate(unsigned pvtnumRegionIdx)
Definition: blackoilpolymermodules.hh:445
static BlackOilPolymerParams< Scalar >::SkprpolyTable & getSkprpolyTable(const int tableNumber)
get the SKPRPOLY table
Definition: blackoilpolymermodules.hh:134
static bool hasShrate()
Definition: blackoilpolymermodules.hh:442
static Scalar eqWeight(unsigned eqIdx)
Definition: blackoilpolymermodules.hh:214
static TabulatedTwoDFunction & getPlymwinjTable(const int tableNumber)
get the PLYMWINJ table
Definition: blackoilpolymermodules.hh:105
static OPM_HOST_DEVICE void addStorage(StorageType &storage, const IntensiveQuantities &intQuants)
Definition: blackoilpolymermodules.hh:224
static Scalar plyrockRockDensityFactor(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:364
Scalar molarMass() const
Definition: blackoilpolymermodules.hh:535
static Scalar plyrockResidualResistanceFactor(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:356
static TabulatedTwoDFunction & getSkprwatTable(const int tableNumber)
get the SKPRWAT table
Definition: blackoilpolymermodules.hh:119
static std::string eqName(unsigned eqIdx)
Definition: blackoilpolymermodules.hh:202
static Scalar plyrockAdsorbtionIndex(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilpolymermodules.hh:372
VTK output module for the black oil model's polymer related quantities.
Definition: vtkblackoilpolymermodule.hpp:61
static void registerParameters()
Register all run-time parameters for the multi-phase VTK output module.
Definition: vtkblackoilpolymermodule.hpp:91
Definition: blackoilbioeffectsmodules.hh:45
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
std::string to_string(const ConvergenceReport::ReservoirFailure::Type t)
The Opm property system, traits with inheritance.
Definition: blackoilpolymerparams.hpp:55
Definition: blackoilpolymerparams.hpp:62
Struct holding the parameters for the BlackOilPolymerModule class.
Definition: blackoilpolymerparams.hpp:43
IntervalTabulated2DFunction< Scalar > TabulatedTwoDFunction
Definition: blackoilpolymerparams.hpp:45
Tabulated1DFunction< Scalar > TabulatedFunction
Definition: blackoilpolymerparams.hpp:44