204 const EqVector& update,
207 static constexpr bool enableSolvent = Indices::solventSaturationIdx >= 0;
208 static constexpr bool enableExtbo = Indices::zFractionIdx >= 0;
209 static constexpr bool enablePolymer = Indices::polymerConcentrationIdx >= 0;
211 static constexpr bool enableEnergy = Indices::temperatureIdx >= 0;
212 static constexpr bool enableFoam = Indices::foamConcentrationIdx >= 0;
213 static constexpr bool enableBrine = Indices::saltConcentrationIdx >= 0;
214 static constexpr bool enableBioeffects = Indices::biofilmVolumeFractionIdx >= 0;
215 static constexpr bool enableMICP = Indices::enableMICP;
218 Valgrind::CheckDefined(update);
227 if (
currentValue.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw)
229 deltaSw = update[Indices::waterSwitchIdx];
232 if (
currentValue.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg)
234 deltaSg = update[Indices::compositionSwitchIdx];
237 if (
currentValue.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
238 deltaSs = update[Indices::solventSaturationIdx];
264 if (
pvIdx == Indices::pressureSwitchIdx) {
270 else if (
pvIdx == Indices::waterSwitchIdx)
271 if (
currentValue.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
280 else if (
pvIdx == Indices::compositionSwitchIdx) {
286 if (
currentValue.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
296 else if (enableSolvent &&
pvIdx == Indices::solventSaturationIdx) {
298 if (
currentValue.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
308 else if (enableExtbo &&
pvIdx == Indices::zFractionIdx) {
314 const double sign =
delta >= 0. ? 1. : -1.;
321 else if (enableEnergy &&
pvIdx == Indices::temperatureIdx) {
322 const double sign =
delta >= 0. ? 1. : -1.;
323 delta =
sign * std::min(std::abs(
delta), bparams_.maxTempChange_);
325 else if (enableBrine &&
pvIdx == Indices::saltConcentrationIdx &&
326 enableSaltPrecipitation &&
327 currentValue.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
330 const Scalar
sign =
delta >= 0. ? 1. : -1.;
338 if (enableSolvent &&
pvIdx == Indices::solventSaturationIdx) {
339 if (
currentValue.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
345 if (enableExtbo &&
pvIdx == Indices::zFractionIdx) {
350 if (enablePolymer &&
pvIdx == Indices::polymerConcentrationIdx) {
356 const double polymerConcentration =
nextValue[Indices::polymerConcentrationIdx];
357 if (polymerConcentration < 1.e-10) {
363 if (enableFoam &&
pvIdx == Indices::foamConcentrationIdx) {
367 if (enableBrine &&
pvIdx == Indices::saltConcentrationIdx) {
369 if (!enableSaltPrecipitation ||
370 currentValue.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Cs)
375 if (enableSaltPrecipitation &&
376 currentValue.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)
383 if (enableEnergy &&
pvIdx == Indices::temperatureIdx) {
387 if (
pvIdx == Indices::pressureSwitchIdx) {
396 if constexpr (enableBioeffects) {
397 if (
pvIdx == Indices::microbialConcentrationIdx) {
400 if (
pvIdx == Indices::biofilmVolumeFractionIdx) {
403 this->problem().referencePorosity(globalDofIdx, 0) - 1
e-8);
405 if constexpr (enableMICP) {
406 if (
pvIdx == Indices::oxygenConcentrationIdx) {
409 if (
pvIdx == Indices::ureaConcentrationIdx) {
412 if (
pvIdx == Indices::calciteVolumeFractionIdx) {
414 this->problem().referencePorosity(globalDofIdx, 0) - 1
e-8);
423 if (wasSwitched_[globalDofIdx]) {
424 wasSwitched_[globalDofIdx] =
nextValue.adaptPrimaryVariables(this->problem(),
426 bparams_.waterSaturationMax_,
427 bparams_.waterOnlyThreshold_,
428 bparams_.priVarOscilationThreshold_);
431 wasSwitched_[globalDofIdx] =
nextValue.adaptPrimaryVariables(this->problem(),
433 bparams_.waterSaturationMax_,
434 bparams_.waterOnlyThreshold_);
437 if (wasSwitched_[globalDofIdx]) {
438 ++numPriVarsSwitched_;
440 if (bparams_.projectSaturations_) {