65 static constexpr unsigned microbialConcentrationIdx = Indices::microbialConcentrationIdx;
66 static constexpr unsigned oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
67 static constexpr unsigned ureaConcentrationIdx = Indices::ureaConcentrationIdx;
68 static constexpr unsigned biofilmConcentrationIdx = Indices::biofilmConcentrationIdx;
69 static constexpr unsigned calciteConcentrationIdx = Indices::calciteConcentrationIdx;
70 static constexpr unsigned contiMicrobialEqIdx = Indices::contiMicrobialEqIdx;
71 static constexpr unsigned contiOxygenEqIdx = Indices::contiOxygenEqIdx;
72 static constexpr unsigned contiUreaEqIdx = Indices::contiUreaEqIdx;
73 static constexpr unsigned contiBiofilmEqIdx = Indices::contiBiofilmEqIdx;
74 static constexpr unsigned contiCalciteEqIdx = Indices::contiCalciteEqIdx;
75 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
97 const PrimaryVariables& priVars = model.solution(1)[dofIdx];
98 if (phi - priVars[biofilmConcentrationIdx] - priVars[calciteConcentrationIdx] < toleranceBeforeClogging())
99 throw std::logic_error(
"Clogging has been (almost) reached in at least one cell\n");
118 Simulator& simulator)
127 static bool eqApplies(
unsigned eqIdx)
133 return eqIdx == contiMicrobialEqIdx ||
eqIdx == contiOxygenEqIdx ||
eqIdx == contiUreaEqIdx ||
eqIdx == contiBiofilmEqIdx ||
eqIdx == contiCalciteEqIdx;
141 return static_cast<Scalar
>(1.0);
145 template <
class LhsEval>
146 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
147 const IntensiveQuantities& intQuants)
177 static void computeFlux(RateVector&
flux,
178 const ElementContext& elemCtx,
194 flux[contiMicrobialEqIdx] =
extQuants.volumeFlux(waterPhaseIdx) *
up.microbialConcentration();
195 flux[contiOxygenEqIdx] =
extQuants.volumeFlux(waterPhaseIdx) *
up.oxygenConcentration();
196 flux[contiUreaEqIdx] =
extQuants.volumeFlux(waterPhaseIdx) *
up.ureaConcentration();
206 static void addSource(RateVector& source,
207 const ElementContext& elemCtx,
216 const IntensiveQuantities& intQuants = elemCtx.intensiveQuantities(dofIdx,
timeIdx);
217 const auto& K = elemCtx.problem().intrinsicPermeability(elemCtx, dofIdx, 0);
218 size_t numInteriorFaces = elemCtx.numInteriorFaces(
timeIdx);
224 const Evaluation&
mobWater =
up.mobility(waterPhaseIdx);
232 Scalar
k_a = microbialAttachmentRate();
233 Scalar
k_d = microbialDeathRate();
234 Scalar
rho_b = densityBiofilm();
235 Scalar
rho_c = densityCalcite();
236 Scalar
k_str = detachmentRate();
237 Scalar
k_o = halfVelocityOxygen();
238 Scalar
k_u = halfVelocityUrea() / 10.0;
239 Scalar
mu = maximumGrowthRate();
240 Scalar
mu_u = maximumUreaUtilization() / 10.0;
241 Scalar
Y_sb = yieldGrowthCoefficient();
242 Scalar
F = oxygenConsumptionFactor();
243 Scalar
Y_uc = 1.67 * 10;
246 source[Indices::contiMicrobialEqIdx] += intQuants.microbialConcentration() * intQuants.porosity() *
247 (
Y_sb *
mu * intQuants.oxygenConcentration() / (
k_o + intQuants.oxygenConcentration()) -
k_d -
k_a)
248 +
rho_b * intQuants.biofilmConcentration() *
k_str *
pow(intQuants.porosity() *
dpW, 0.58);
250 source[Indices::contiOxygenEqIdx] -= (intQuants.microbialConcentration() * intQuants.porosity() +
rho_b * intQuants.biofilmConcentration()) *
251 F *
mu * intQuants.oxygenConcentration() / (
k_o + intQuants.oxygenConcentration());
253 source[Indices::contiUreaEqIdx] -=
rho_b * intQuants.biofilmConcentration() *
mu_u * intQuants.ureaConcentration() / (
k_u + intQuants.ureaConcentration());
255 source[Indices::contiBiofilmEqIdx] += intQuants.biofilmConcentration() * (
Y_sb *
mu * intQuants.oxygenConcentration() / (
k_o + intQuants.oxygenConcentration()) -
k_d
257 (intQuants.ureaConcentration() / (
k_u + intQuants.ureaConcentration())) / (intQuants.porosity() + intQuants.biofilmConcentration()))
258 +
k_a * intQuants.microbialConcentration() * intQuants.porosity() /
rho_b;
260 source[Indices::contiCalciteEqIdx] += (
rho_b /
rho_c) * intQuants.biofilmConcentration() *
Y_uc *
mu_u * intQuants.ureaConcentration() / (
k_u + intQuants.ureaConcentration());
263 static const Scalar densityBiofilm()
265 return params_.densityBiofilm_;
268 static const Scalar densityCalcite()
270 return params_.densityCalcite_;
273 static const Scalar detachmentRate()
275 return params_.detachmentRate_;
278 static const Scalar criticalPorosity()
280 return params_.criticalPorosity_;
283 static const Scalar fittingFactor()
285 return params_.fittingFactor_;
288 static const Scalar halfVelocityOxygen()
290 return params_.halfVelocityOxygen_;
293 static const Scalar halfVelocityUrea()
295 return params_.halfVelocityUrea_;
298 static const Scalar maximumGrowthRate()
300 return params_.maximumGrowthRate_;
303 static const Scalar maximumOxygenConcentration()
305 return params_.maximumOxygenConcentration_;
308 static const Scalar maximumUreaConcentration()
310 return params_.maximumUreaConcentration_ / 10.0;
313 static const Scalar maximumUreaUtilization()
315 return params_.maximumUreaUtilization_;
318 static const Scalar microbialAttachmentRate()
320 return params_.microbialAttachmentRate_;
323 static const Scalar microbialDeathRate()
325 return params_.microbialDeathRate_;
328 static const Scalar minimumPermeability()
330 return params_.minimumPermeability_;
333 static const Scalar oxygenConsumptionFactor()
335 return params_.oxygenConsumptionFactor_;
338 static const Scalar toleranceBeforeClogging()
340 return params_.toleranceBeforeClogging_;
343 static const Scalar yieldGrowthCoefficient()
345 return params_.yieldGrowthCoefficient_;
348 static const std::vector<Scalar> phi()
383 static constexpr int microbialConcentrationIdx = Indices::microbialConcentrationIdx;
384 static constexpr int oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
385 static constexpr int ureaConcentrationIdx = Indices::ureaConcentrationIdx;
386 static constexpr int biofilmConcentrationIdx = Indices::biofilmConcentrationIdx;
387 static constexpr int calciteConcentrationIdx = Indices::calciteConcentrationIdx;
388 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
402 const auto linearizationType = elemCtx.linearizationType();
403 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx,
timeIdx);
404 const auto& intQuants = elemCtx.intensiveQuantities(dofIdx,
timeIdx);
405 const auto& K = elemCtx.problem().intrinsicPermeability(elemCtx, dofIdx,
timeIdx);
406 Scalar referencePorosity_ = elemCtx.problem().porosity(elemCtx, dofIdx,
timeIdx);
407 Scalar
eta = MICPModule::fittingFactor();
408 Scalar
k_min = MICPModule::minimumPermeability();
409 Scalar
phi_crit = MICPModule::criticalPorosity();
411 microbialConcentration_ = priVars.makeEvaluation(microbialConcentrationIdx,
timeIdx, linearizationType);
412 oxygenConcentration_ = priVars.makeEvaluation(oxygenConcentrationIdx,
timeIdx, linearizationType);
413 ureaConcentration_ = priVars.makeEvaluation(ureaConcentrationIdx,
timeIdx, linearizationType);
414 biofilmConcentration_ = priVars.makeEvaluation(biofilmConcentrationIdx,
timeIdx, linearizationType);
415 calciteConcentration_ = priVars.makeEvaluation(calciteConcentrationIdx,
timeIdx, linearizationType);
422 const Evaluation& microbialConcentration()
const
423 {
return microbialConcentration_; }
425 const Evaluation& oxygenConcentration()
const
426 {
return oxygenConcentration_; }
428 const Evaluation& ureaConcentration()
const
429 {
return ureaConcentration_; }
431 const Evaluation& biofilmConcentration()
const
432 {
return biofilmConcentration_; }
434 const Evaluation& calciteConcentration()
const
435 {
return calciteConcentration_; }
439 Implementation& asImp_()
440 {
return *
static_cast<Implementation*
>(
this); }
442 Evaluation microbialConcentration_;
443 Evaluation oxygenConcentration_;
444 Evaluation ureaConcentration_;
445 Evaluation biofilmConcentration_;
446 Evaluation calciteConcentration_;