66 using TabulatedFunction =
typename BlackOilMICPParams<Scalar>::TabulatedFunction;
68 enum { waterCompIdx = FluidSystem::waterCompIdx };
70 static constexpr unsigned microbialConcentrationIdx = Indices::microbialConcentrationIdx;
71 static constexpr unsigned oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
72 static constexpr unsigned ureaConcentrationIdx = Indices::ureaConcentrationIdx;
73 static constexpr unsigned biofilmConcentrationIdx = Indices::biofilmConcentrationIdx;
74 static constexpr unsigned calciteConcentrationIdx = Indices::calciteConcentrationIdx;
75 static constexpr unsigned contiMicrobialEqIdx = Indices::contiMicrobialEqIdx;
76 static constexpr unsigned contiOxygenEqIdx = Indices::contiOxygenEqIdx;
77 static constexpr unsigned contiUreaEqIdx = Indices::contiUreaEqIdx;
78 static constexpr unsigned contiBiofilmEqIdx = Indices::contiBiofilmEqIdx;
79 static constexpr unsigned contiCalciteEqIdx = Indices::contiCalciteEqIdx;
80 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
98 if constexpr (enableMICP)
106 Simulator& simulator)
108 if constexpr (enableMICP)
112 static bool eqApplies(
unsigned eqIdx)
114 if constexpr (enableMICP)
115 return eqIdx == contiMicrobialEqIdx ||
eqIdx == contiOxygenEqIdx ||
eqIdx == contiUreaEqIdx
116 ||
eqIdx == contiBiofilmEqIdx ||
eqIdx == contiCalciteEqIdx;
126 return static_cast<Scalar
>(1.0);
130 template <
class LhsEval>
131 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
132 const IntensiveQuantities& intQuants)
134 if constexpr (enableMICP) {
135 const auto& fs = intQuants.fluidState();
164 template <
class UpEval,
class Eval,
class IntensiveQuantities>
165 static void addMICPFluxes_(RateVector&
flux,
166 const Eval& volumeFlux,
167 const IntensiveQuantities&
upFs)
169 if constexpr (enableMICP) {
170 flux[contiMicrobialEqIdx] +=
173 flux[contiOxygenEqIdx] +=
176 flux[contiUreaEqIdx] +=
183 static void applyScaling(RateVector&
flux)
185 if constexpr (enableMICP) {
196 if constexpr (enableMICP) {
197 flux[contiMicrobialEqIdx] = 0.0;
198 flux[contiOxygenEqIdx] = 0.0;
199 flux[contiUreaEqIdx] = 0.0;
201 unsigned focusIdx = elemCtx.focusDofIndex();
210 template <
class UpstreamEval>
211 static void addMICPFluxes_(RateVector&
flux,
212 const ElementContext& elemCtx,
219 const auto& fs =
up.fluidState();
225 static void addSource(RateVector& source,
226 const Problem& problem,
227 const IntensiveQuantities& intQuants,
230 if constexpr (enableMICP) {
231 const auto&
velocityInf = problem.model().linearizer().getVelocityInfo();
233 Scalar normVelocityCell = 0.0;
235 normVelocityCell = max(normVelocityCell, std::abs(
velocityInfo.velocity[waterPhaseIdx]));
239 const auto b = intQuants.fluidState().invB(waterPhaseIdx);
252 Scalar
F = oxygenConsumptionFactor(
satnumIdx);
257 Evaluation
k_g =
mu * intQuants.oxygenConcentration() / (
k_o + intQuants.oxygenConcentration());
258 Evaluation
k_c =
mu_u * intQuants.ureaConcentration() / (
k_u + intQuants.ureaConcentration());
259 if (intQuants.oxygenConcentration() < 0)
260 k_g =
mu * intQuants.oxygenConcentration() /
k_o;
261 if (intQuants.ureaConcentration() < 0)
262 k_c =
mu_u * intQuants.ureaConcentration() /
k_u;
265 source[Indices::contiMicrobialEqIdx] += intQuants.microbialConcentration() * intQuants.porosity() *
267 rho_b * intQuants.biofilmConcentration() *
k_str *
pow(normVelocityCell,
eta);
269 source[Indices::contiOxygenEqIdx] -= (intQuants.microbialConcentration() * intQuants.porosity() *
270 b +
rho_b * intQuants.biofilmConcentration()) *
F *
k_g;
272 source[Indices::contiUreaEqIdx] -=
rho_b * intQuants.biofilmConcentration() *
k_c;
274 source[Indices::contiBiofilmEqIdx] += intQuants.biofilmConcentration() * (
Y_sb *
k_g -
k_d -
276 intQuants.biofilmConcentration() *
k_c / (intQuants.porosity() +
277 intQuants.biofilmConcentration())) +
k_a * intQuants.microbialConcentration() *
278 intQuants.porosity() *
b /
rho_b;
280 source[Indices::contiCalciteEqIdx] += (
rho_b /
rho_c) * intQuants.biofilmConcentration() *
Y_uc *
k_c;
287 static void addSource([[
maybe_unused]] RateVector& source,
292 if constexpr (enableMICP) {
293 const auto& problem = elemCtx.problem();
294 const auto& intQuants = elemCtx.intensiveQuantities(dofIdx,
timeIdx);
295 addSource(source, problem, intQuants, dofIdx);
359 static const Scalar yieldUreaToCalciteCoefficient(
unsigned satnumRegionIdx)
364 static const Scalar microbialDiffusion(
unsigned pvtRegionIdx)
366 return params_.microbialDiffusion_[pvtRegionIdx];
369 static const Scalar oxygenDiffusion(
unsigned pvtRegionIdx)
371 return params_.oxygenDiffusion_[pvtRegionIdx];
374 static const Scalar ureaDiffusion(
unsigned pvtRegionIdx)
376 return params_.ureaDiffusion_[pvtRegionIdx];
379 static const TabulatedFunction& permfactTable(
const ElementContext& elemCtx,
387 static const TabulatedFunction& permfactTable(
unsigned satnumRegionIdx)
422 static constexpr int microbialConcentrationIdx = Indices::microbialConcentrationIdx;
423 static constexpr int oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
424 static constexpr int ureaConcentrationIdx = Indices::ureaConcentrationIdx;
425 static constexpr int biofilmConcentrationIdx = Indices::biofilmConcentrationIdx;
426 static constexpr int calciteConcentrationIdx = Indices::calciteConcentrationIdx;
427 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
441 const auto linearizationType = elemCtx.linearizationType();
442 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx,
timeIdx);
443 const Scalar referencePorosity_ = elemCtx.problem().referencePorosity(dofIdx,
timeIdx);
445 microbialConcentration_ = priVars.makeEvaluation(microbialConcentrationIdx,
timeIdx, linearizationType);
446 oxygenConcentration_ = priVars.makeEvaluation(oxygenConcentrationIdx,
timeIdx, linearizationType);
447 ureaConcentration_ = priVars.makeEvaluation(ureaConcentrationIdx,
timeIdx, linearizationType);
448 biofilmConcentration_ = priVars.makeEvaluation(biofilmConcentrationIdx,
timeIdx, linearizationType);
449 calciteConcentration_ = priVars.makeEvaluation(calciteConcentrationIdx,
timeIdx, linearizationType);
451 const Evaluation
porosityFactor = min(1.0 - (biofilmConcentration_+calciteConcentration_)/(referencePorosity_+1
e-8), 1.0);
453 const auto& permfactTable = MICPModule::permfactTable(
satnumRegionIdx);
456 biofilmMass_ = referencePorosity_*biofilmConcentration_*MICPModule::densityBiofilm(
satnumRegionIdx);
457 calciteMass_ = referencePorosity_*calciteConcentration_*MICPModule::densityCalcite(
satnumRegionIdx);
460 const Evaluation& microbialConcentration()
const
461 {
return microbialConcentration_; }
463 const Evaluation& oxygenConcentration()
const
464 {
return oxygenConcentration_; }
466 const Evaluation& ureaConcentration()
const
467 {
return ureaConcentration_; }
469 const Evaluation& biofilmConcentration()
const
470 {
return biofilmConcentration_; }
472 const Evaluation& calciteConcentration()
const
473 {
return calciteConcentration_; }
475 const Evaluation biofilmMass()
const
476 {
return biofilmMass_; }
478 const Evaluation calciteMass()
const
479 {
return calciteMass_; }
481 const Evaluation& permFactor()
const
482 {
return permFactor_; }
485 Evaluation microbialConcentration_;
486 Evaluation oxygenConcentration_;
487 Evaluation ureaConcentration_;
488 Evaluation biofilmConcentration_;
489 Evaluation calciteConcentration_;
490 Evaluation biofilmMass_;
491 Evaluation calciteMass_;
492 Evaluation permFactor_;