197 const EqVector& update,
200 static constexpr bool enableSolvent = Indices::solventSaturationIdx >= 0;
201 static constexpr bool enableExtbo = Indices::zFractionIdx >= 0;
202 static constexpr bool enablePolymer = Indices::polymerConcentrationIdx >= 0;
204 static constexpr bool enableEnergy = Indices::temperatureIdx >= 0;
205 static constexpr bool enableFoam = Indices::foamConcentrationIdx >= 0;
206 static constexpr bool enableBrine = Indices::saltConcentrationIdx >= 0;
207 static constexpr bool enableMICP = Indices::microbialConcentrationIdx >= 0;
210 Valgrind::CheckDefined(update);
219 if (
currentValue.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw)
221 deltaSw = update[Indices::waterSwitchIdx];
224 if (
currentValue.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg)
226 deltaSg = update[Indices::compositionSwitchIdx];
229 if (
currentValue.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
230 deltaSs = update[Indices::solventSaturationIdx];
256 if (
pvIdx == Indices::pressureSwitchIdx) {
262 else if (
pvIdx == Indices::waterSwitchIdx)
263 if (
currentValue.primaryVarsMeaningWater() == PrimaryVariables::WaterMeaning::Sw) {
272 else if (
pvIdx == Indices::compositionSwitchIdx) {
278 if (
currentValue.primaryVarsMeaningGas() == PrimaryVariables::GasMeaning::Sg) {
287 else if (enableSolvent &&
pvIdx == Indices::solventSaturationIdx) {
289 if (
currentValue.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
297 else if (enableExtbo &&
pvIdx == Indices::zFractionIdx) {
303 const double sign =
delta >= 0. ? 1. : -1.;
310 else if (enableEnergy &&
pvIdx == Indices::temperatureIdx) {
311 const double sign =
delta >= 0. ? 1. : -1.;
312 delta =
sign * std::min(std::abs(
delta), bparams_.maxTempChange_);
314 else if (enableBrine &&
pvIdx == Indices::saltConcentrationIdx &&
315 enableSaltPrecipitation &&
316 currentValue.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
318 const Scalar
sign =
delta >= 0. ? 1. : -1.;
326 if (enableSolvent &&
pvIdx == Indices::solventSaturationIdx) {
327 if (
currentValue.primaryVarsMeaningSolvent() == PrimaryVariables::SolventMeaning::Ss) {
333 if (enableExtbo &&
pvIdx == Indices::zFractionIdx) {
338 if (enablePolymer &&
pvIdx == Indices::polymerConcentrationIdx) {
344 const double polymerConcentration =
nextValue[Indices::polymerConcentrationIdx];
345 if (polymerConcentration < 1.e-10) {
351 if (enableFoam &&
pvIdx == Indices::foamConcentrationIdx) {
355 if (enableBrine &&
pvIdx == Indices::saltConcentrationIdx) {
357 if (!enableSaltPrecipitation || (enableSaltPrecipitation &&
currentValue.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Cs)) {
361 if ((enableSaltPrecipitation &&
currentValue.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp)) {
367 if (enableEnergy &&
pvIdx == Indices::temperatureIdx) {
371 if (
pvIdx == Indices::pressureSwitchIdx) {
381 if (enableMICP &&
pvIdx == Indices::microbialConcentrationIdx) {
384 if (enableMICP &&
pvIdx == Indices::oxygenConcentrationIdx) {
387 if (enableMICP &&
pvIdx == Indices::ureaConcentrationIdx) {
390 if (enableMICP &&
pvIdx == Indices::biofilmConcentrationIdx) {
393 if (enableMICP &&
pvIdx == Indices::calciteConcentrationIdx) {
401 if (wasSwitched_[globalDofIdx]) {
402 wasSwitched_[globalDofIdx] =
nextValue.adaptPrimaryVariables(this->problem(),
404 bparams_.waterSaturationMax_,
405 bparams_.waterOnlyThreshold_,
406 bparams_.priVarOscilationThreshold_);
409 wasSwitched_[globalDofIdx] =
nextValue.adaptPrimaryVariables(this->problem(),
411 bparams_.waterSaturationMax_,
412 bparams_.waterOnlyThreshold_);
415 if (wasSwitched_[globalDofIdx]) {
416 ++numPriVarsSwitched_;
418 if (bparams_.projectSaturations_) {