79 using TabulatedFunction =
typename BlackOilPolymerParams<Scalar>::TabulatedFunction;
80 using TabulatedTwoDFunction =
typename BlackOilPolymerParams<Scalar>::TabulatedTwoDFunction;
82 static constexpr unsigned polymerConcentrationIdx = Indices::polymerConcentrationIdx;
83 static constexpr unsigned polymerMoleWeightIdx = Indices::polymerMoleWeightIdx;
84 static constexpr unsigned contiPolymerEqIdx = Indices::contiPolymerEqIdx;
85 static constexpr unsigned contiPolymerMolarWeightEqIdx = Indices::contiPolymerMWEqIdx;
86 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
106 if (
iterTable != params_.plymwinjTables_.end()) {
110 throw std::runtime_error(
" the PLYMWINJ table " + std::to_string(
tableNumber) +
" does not exist\n");
120 if (
iterTable != params_.skprwatTables_.end()) {
124 throw std::runtime_error(
" the SKPRWAT table " + std::to_string(
tableNumber) +
" does not exist\n");
135 if (
iterTable != params_.skprpolyTables_.end()) {
139 throw std::runtime_error(
" the SKPRPOLY table " + std::to_string(
tableNumber) +
" does not exist\n");
148 if constexpr (enablePolymer) {
157 Simulator& simulator)
159 if constexpr (enablePolymer) {
164 static bool primaryVarApplies(
unsigned pvIdx)
166 if constexpr (enablePolymer) {
167 if constexpr (enablePolymerMolarWeight) {
168 return pvIdx == polymerConcentrationIdx ||
pvIdx == polymerMoleWeightIdx;
171 return pvIdx == polymerConcentrationIdx;
179 static std::string primaryVarName(
unsigned pvIdx)
183 if (
pvIdx == polymerConcentrationIdx) {
184 return "polymer_waterconcentration";
187 return "polymer_molecularweight";
196 return static_cast<Scalar
>(1.0);
199 static bool eqApplies(
unsigned eqIdx)
201 if constexpr (enablePolymer) {
202 if constexpr (enablePolymerMolarWeight) {
203 return eqIdx == contiPolymerEqIdx ||
eqIdx == contiPolymerMolarWeightEqIdx;
206 return eqIdx == contiPolymerEqIdx;
214 static std::string eqName(
unsigned eqIdx)
218 if (
eqIdx == contiPolymerEqIdx) {
219 return "conti^polymer";
222 return "conti^polymer_molecularweight";
231 return static_cast<Scalar
>(1.0);
235 template <
class LhsEval>
236 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
237 const IntensiveQuantities& intQuants)
239 if constexpr (enablePolymer) {
240 const auto& fs = intQuants.fluidState();
244 max(Toolbox::template
decay<LhsEval>(fs.saturation(waterPhaseIdx)) *
252 Toolbox::template
decay<LhsEval>(intQuants.polymerConcentration()) *
253 (1.0 - Toolbox::template
decay<LhsEval>(intQuants.polymerDeadPoreVolume()));
258 Toolbox::template
decay<LhsEval>(intQuants.polymerRockDensity()) *
266 if constexpr (enablePolymerMolarWeight) {
269 storage[contiPolymerMolarWeightEqIdx] +=
280 if constexpr (enablePolymer) {
283 const unsigned upIdx =
extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
287 Indices::conti0EqIdx + FluidSystem::canonicalToActiveCompIdx(FluidSystem::waterCompIdx);
290 flux[contiPolymerEqIdx] =
292 up.fluidState().invB(waterPhaseIdx) *
293 up.polymerViscosityCorrection() /
295 up.polymerConcentration();
301 flux[contiPolymerEqIdx] =
313 if constexpr (enablePolymerMolarWeight) {
315 flux[contiPolymerMolarWeightEqIdx] =
316 flux[contiPolymerEqIdx] *
up.polymerMoleWeight();
319 flux[contiPolymerMolarWeightEqIdx] =
335 return static_cast<Scalar
>(0.0);
338 template <
class DofEntity>
341 if constexpr (enablePolymer) {
342 const unsigned dofIdx = model.dofMapper().index(
dof);
343 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
344 outstream << priVars[polymerConcentrationIdx];
345 outstream << priVars[polymerMoleWeightIdx];
349 template <
class DofEntity>
352 if constexpr (enablePolymer) {
353 const unsigned dofIdx = model.dofMapper().index(
dof);
354 PrimaryVariables&
priVars0 = model.solution(0)[dofIdx];
355 PrimaryVariables&
priVars1 = model.solution(1)[dofIdx];
366 static Scalar plyrockDeadPoreVolume(
const ElementContext& elemCtx,
374 static Scalar plyrockResidualResistanceFactor(
const ElementContext& elemCtx,
382 static Scalar plyrockRockDensityFactor(
const ElementContext& elemCtx,
390 static Scalar plyrockAdsorbtionIndex(
const ElementContext& elemCtx,
398 static Scalar plyrockMaxAdsorbtion(
const ElementContext& elemCtx,
406 static const TabulatedFunction&
407 plyadsAdsorbedPolymer(
const ElementContext& elemCtx,
415 static const TabulatedFunction&
416 plyviscViscosityMultiplierTable(
const ElementContext& elemCtx,
425 static const TabulatedFunction&
429 static Scalar plymaxMaxConcentration(
const ElementContext& elemCtx,
434 elemCtx.problem().plmixnumRegionIndex(elemCtx,
scvIdx,
timeIdx);
438 static Scalar plymixparToddLongstaff(
const ElementContext& elemCtx,
443 elemCtx.problem().plmixnumRegionIndex(elemCtx,
scvIdx,
timeIdx);
447 static const typename BlackOilPolymerParams<Scalar>::PlyvmhCoefficients&
448 plyvmhCoefficients(
const ElementContext& elemCtx,
453 elemCtx.problem().plmixnumRegionIndex(elemCtx,
scvIdx,
timeIdx);
457 static bool hasPlyshlog()
458 {
return params_.hasPlyshlog_; }
460 static bool hasShrate()
461 {
return params_.hasShrate_; }
472 template <
class Evaluation>
475 const Evaluation&
v0)
483 const Scalar eps = 1
e-14;
486 return ToolboxLocal::createConstant(
v0, 1.0);
494 return ToolboxLocal::createConstant(
v0, 1.0);
534 bool converged =
false;
536 for (
int i = 0; i < 20; ++i) {
538 const auto df =
dF(
u);
546 throw std::runtime_error(
"Not able to compute shear velocity. \n");
553 Scalar molarMass()
const
589 static constexpr int polymerConcentrationIdx = Indices::polymerConcentrationIdx;
590 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
592 static constexpr int polymerMoleWeightIdx = Indices::polymerMoleWeightIdx;
604 const auto linearizationType = elemCtx.linearizationType();
605 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx,
timeIdx);
606 polymerConcentration_ = priVars.makeEvaluation(polymerConcentrationIdx,
timeIdx, linearizationType);
607 if constexpr (enablePolymerMolarWeight) {
608 polymerMoleWeight_ = priVars.makeEvaluation(polymerMoleWeightIdx,
timeIdx, linearizationType);
613 const auto& plyadsAdsorbedPolymer = PolymerModule::plyadsAdsorbedPolymer(elemCtx, dofIdx,
timeIdx);
614 polymerAdsorption_ = plyadsAdsorbedPolymer.eval(polymerConcentration_,
true);
615 if (
static_cast<int>(PolymerModule::plyrockAdsorbtionIndex(elemCtx, dofIdx,
timeIdx)) ==
618 const auto maxPolymerAdsorption =
619 elemCtx.problem().maxPolymerAdsorption(elemCtx, dofIdx,
timeIdx);
620 polymerAdsorption_ = std::max(Evaluation(maxPolymerAdsorption), polymerAdsorption_);
625 PolymerModule::plyrockResidualResistanceFactor(elemCtx, dofIdx,
timeIdx);
630 if constexpr (!enablePolymerMolarWeight) {
631 const Scalar
cmax = PolymerModule::plymaxMaxConcentration(elemCtx, dofIdx,
timeIdx);
632 const auto& fs = asImp_().fluidState_;
633 const Evaluation&
muWater = fs.viscosity(waterPhaseIdx);
635 PolymerModule::plyviscViscosityMultiplierTable(elemCtx, dofIdx,
timeIdx);
640 const Scalar plymixparToddLongstaff = PolymerModule::plymixparToddLongstaff(elemCtx, dofIdx,
timeIdx);
647 const Evaluation
cbar = polymerConcentration_ /
cmax;
654 const auto& plyvmhCoefficients = PolymerModule::plyvmhCoefficients(elemCtx, dofIdx,
timeIdx);
655 const Scalar k_mh = plyvmhCoefficients.k_mh;
656 const Scalar a_mh = plyvmhCoefficients.a_mh;
657 const Scalar gamma = plyvmhCoefficients.gamma;
658 const Scalar kappa = plyvmhCoefficients.kappa;
664 waterViscosityCorrection_ = 1.0 / (1.0 + gamma * (x + kappa * x * x));
665 polymerViscosityCorrection_ = 1.0;
669 asImp_().mobility_[waterPhaseIdx] *= waterViscosityCorrection_ /
resistanceFactor;
672 polymerDeadPoreVolume_ = PolymerModule::plyrockDeadPoreVolume(elemCtx, dofIdx,
timeIdx);
673 polymerRockDensity_ = PolymerModule::plyrockRockDensityFactor(elemCtx, dofIdx,
timeIdx);
676 const Evaluation& polymerConcentration()
const
677 {
return polymerConcentration_; }
679 const Evaluation& polymerMoleWeight()
const
681 if constexpr (enablePolymerMolarWeight) {
682 return polymerMoleWeight_;
685 throw std::logic_error(
"polymerMoleWeight() is called but polymer milecular weight is disabled");
689 Scalar polymerDeadPoreVolume()
const
690 {
return polymerDeadPoreVolume_; }
692 const Evaluation& polymerAdsorption()
const
693 {
return polymerAdsorption_; }
695 Scalar polymerRockDensity()
const
696 {
return polymerRockDensity_; }
699 const Evaluation& polymerViscosityCorrection()
const
700 {
return polymerViscosityCorrection_; }
703 const Evaluation& waterViscosityCorrection()
const
704 {
return waterViscosityCorrection_; }
707 Implementation& asImp_()
708 {
return *
static_cast<Implementation*
>(
this); }
710 Evaluation polymerConcentration_;
712 Evaluation polymerMoleWeight_;
713 Scalar polymerDeadPoreVolume_;
714 Scalar polymerRockDensity_;
715 Evaluation polymerAdsorption_;
716 Evaluation polymerViscosityCorrection_;
717 Evaluation waterViscosityCorrection_;