72 using TabulatedFunction =
typename BlackOilBrineParams<Scalar>::TabulatedFunction;
74 static constexpr unsigned saltConcentrationIdx = Indices::saltConcentrationIdx;
75 static constexpr unsigned contiBrineEqIdx = Indices::contiBrineEqIdx;
76 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
77 static constexpr bool gasEnabled = Indices::gasEnabled;
78 static constexpr bool oilEnabled = Indices::oilEnabled;
80 static constexpr bool enableSaltPrecipitation =
84 static constexpr unsigned numPhases = FluidSystem::numPhases;
99 static bool primaryVarApplies(
unsigned pvIdx)
101 if constexpr (enableBrine) {
102 return pvIdx == saltConcentrationIdx;
112 template <
class Flu
idState>
114 const FluidState& fluidState)
116 if constexpr (enableBrine) {
117 priVars[saltConcentrationIdx] = fluidState.saltConcentration();
125 return "saltConcentration";
133 return static_cast<Scalar
>(1.0);
136 static bool eqApplies(
unsigned eqIdx)
138 if constexpr (enableBrine) {
139 return eqIdx == contiBrineEqIdx;
150 return "conti^brine";
158 return static_cast<Scalar
>(1.0);
162 template <
class LhsEval>
163 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
164 const IntensiveQuantities& intQuants)
166 if constexpr (enableBrine) {
167 const auto& fs = intQuants.fluidState();
171 max(Toolbox::template
decay<LhsEval>(fs.saturation(waterPhaseIdx)) *
180 if constexpr (enableSaltPrecipitation) {
181 const double saltDensity = intQuants.saltDensity();
184 (1.0 - Toolbox::template
decay<LhsEval>(fs.saltSaturation()) + 1.e-8) *
201 if constexpr (enableBrine) {
203 unsigned focusIdx = elemCtx.focusDofIndex();
205 flux[contiBrineEqIdx] = 0.0;
213 template <
class UpstreamEval>
214 static void addBrineFluxes_(RateVector&
flux,
215 const ElementContext& elemCtx,
222 const auto&
upFs =
up.fluidState();
227 template <
class UpEval,
class Flu
idState>
228 static void addBrineFluxes_(RateVector&
flux,
231 const FluidState&
upFs)
233 if constexpr (enableBrine) {
235 flux[contiBrineEqIdx] =
252 return static_cast<Scalar
>(0.0);
255 template <
class DofEntity>
258 if constexpr (enableBrine) {
259 const unsigned dofIdx = model.dofMapper().index(
dof);
260 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
261 outstream << priVars[saltConcentrationIdx];
265 template <
class DofEntity>
268 if constexpr (enableBrine) {
269 const unsigned dofIdx = model.dofMapper().index(
dof);
270 PrimaryVariables&
priVars0 = model.solution(0)[dofIdx];
271 PrimaryVariables&
priVars1 = model.solution(1)[dofIdx];
280 static Scalar referencePressure(
const ElementContext& elemCtx,
288 static const TabulatedFunction& bdensityTable(
const ElementContext& elemCtx,
299 static const TabulatedFunction& permfactTable(
const ElementContext& elemCtx,
307 static const TabulatedFunction& permfactTable(
unsigned satnumRegionIdx)
310 static Scalar saltsolTable(
const ElementContext& elemCtx,
323 static Scalar saltdenTable(
const ElementContext& elemCtx,
336 static bool hasBDensityTables()
337 {
return !params_.bdensityTable_.empty(); }
339 static bool hasSaltsolTables()
340 {
return !params_.saltsolTable_.empty(); }
342 static bool hasPcfactTables()
344 if constexpr (enableSaltPrecipitation) {
345 return !params_.pcfactTable_.empty();
352 static Scalar saltSol(
unsigned regionIdx)
353 {
return params_.saltsolTable_[
regionIdx]; }
389 static constexpr int saltConcentrationIdx = Indices::saltConcentrationIdx;
390 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
391 static constexpr int gasPhaseIdx = FluidSystem::gasPhaseIdx;
392 static constexpr int oilPhaseIdx = FluidSystem::oilPhaseIdx;
393 static constexpr bool enableBrine =
true;
394 static constexpr bool enableSaltPrecipitation =
396 static constexpr int contiBrineEqIdx = Indices::contiBrineEqIdx;
408 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx,
timeIdx);
413 void updateSaltConcentration_(
const PrimaryVariables& priVars,
418 auto& fs = asImp_().fluidState_;
420 if constexpr (enableSaltPrecipitation) {
424 if (priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
425 saltSaturation_ = priVars.makeEvaluation(saltConcentrationIdx,
timeIdx,
lintype);
426 fs.setSaltConcentration(saltSolubility_);
429 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx,
timeIdx,
lintype);
430 fs.setSaltConcentration(saltConcentration_);
431 saltSaturation_ = 0.0;
433 fs.setSaltSaturation(saltSaturation_);
436 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx,
timeIdx,
lintype);
437 fs.setSaltConcentration(saltConcentration_);
441 void saltPropertiesUpdate_([[
maybe_unused]]
const ElementContext& elemCtx,
445 if constexpr (enableSaltPrecipitation) {
446 const Evaluation
porosityFactor = min(1.0 - asImp_().fluidState_.saltSaturation(), 1.0);
448 const auto& permfactTable = BrineModule::permfactTable(elemCtx, dofIdx,
timeIdx);
452 if (!FluidSystem::phaseIsActive(
phaseIdx)) {
456 asImp_().mobility_[
phaseIdx] *= permFactor_;
461 const Evaluation& brineRefDensity()
const
462 {
return refDensity_; }
464 Scalar saltSolubility()
const
465 {
return saltSolubility_; }
467 Scalar saltDensity()
const
468 {
return saltDensity_; }
470 const Evaluation& permFactor()
const
471 {
return permFactor_; }
474 Implementation& asImp_()
475 {
return *
static_cast<Implementation*
>(
this); }
477 Evaluation saltConcentration_;
478 Evaluation refDensity_;
479 Evaluation saltSaturation_;
480 Evaluation permFactor_;
481 Scalar saltSolubility_;
void updateSaltConcentration_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the intensive properties needed to handle brine from the primary variables.
Definition blackoilbrinemodules.hh:404
static void assignPrimaryVars(PrimaryVariables &priVars, const FluidState &fluidState)
Assign the brine specific primary variables to a PrimaryVariables object.
Definition blackoilbrinemodules.hh:113
static Scalar computeUpdateError(const PrimaryVariables &, const EqVector &)
Return how much a Newton-Raphson update is considered an error.
Definition blackoilbrinemodules.hh:246
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition propertysystem.hh:233