66 using TabulatedFunction =
typename BlackOilBrineParams<Scalar>::TabulatedFunction;
68 static constexpr unsigned saltConcentrationIdx = Indices::saltConcentrationIdx;
69 static constexpr unsigned contiBrineEqIdx = Indices::contiBrineEqIdx;
70 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
71 static constexpr bool gasEnabled = Indices::gasEnabled;
72 static constexpr bool oilEnabled = Indices::oilEnabled;
77 static constexpr unsigned numPhases = FluidSystem::numPhases;
93 static bool primaryVarApplies(
unsigned pvIdx)
95 if constexpr (enableBrine)
96 return pvIdx == saltConcentrationIdx;
104 template <
class Flu
idState>
106 const FluidState& fluidState)
108 if constexpr (enableBrine)
109 priVars[saltConcentrationIdx] = fluidState.saltConcentration();
116 return "saltConcentration";
124 return static_cast<Scalar
>(1.0);
127 static bool eqApplies(
unsigned eqIdx)
129 if constexpr (enableBrine)
130 return eqIdx == contiBrineEqIdx;
139 return "conti^brine";
147 return static_cast<Scalar
>(1.0);
151 template <
class LhsEval>
152 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
155 if constexpr (enableBrine) {
170 if (enableSaltPrecipitation){
171 double saltDensity =
intQuants.saltDensity();
190 if constexpr (enableBrine) {
193 const unsigned upIdx =
extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
198 flux[contiBrineEqIdx] =
200 *
up.fluidState().invB(waterPhaseIdx)
201 *
up.fluidState().saltConcentration();
204 flux[contiBrineEqIdx] =
221 return static_cast<Scalar
>(0.0);
224 template <
class DofEntity>
227 if constexpr (enableBrine) {
228 unsigned dofIdx = model.dofMapper().index(
dof);
229 const PrimaryVariables& priVars = model.solution(0)[
dofIdx];
230 outstream << priVars[saltConcentrationIdx];
234 template <
class DofEntity>
237 if constexpr (enableBrine) {
238 unsigned dofIdx = model.dofMapper().index(
dof);
249 static const Scalar& referencePressure(
const ElementContext&
elemCtx,
258 static const TabulatedFunction& bdensityTable(
const ElementContext&
elemCtx,
271 static const TabulatedFunction& permfactTable(
const ElementContext&
elemCtx,
279 static const TabulatedFunction& permfactTable(
unsigned pvtnumRegionIdx)
284 static const Scalar saltsolTable(
const ElementContext&
elemCtx,
292 static const Scalar saltdenTable(
const ElementContext&
elemCtx,
300 static bool hasBDensityTables()
302 return !params_.bdensityTable_.empty();
305 static bool hasSaltsolTables()
307 return !params_.saltsolTable_.empty();
310 static bool hasPcfactTables()
312 if constexpr (enableSaltPrecipitation)
313 return !params_.pcfactTable_.empty();
318 static Scalar saltSol(
unsigned regionIdx) {
354 static constexpr int saltConcentrationIdx = Indices::saltConcentrationIdx;
355 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
356 static constexpr int gasPhaseIdx = FluidSystem::gasPhaseIdx;
357 static constexpr int oilPhaseIdx = FluidSystem::oilPhaseIdx;
360 static constexpr int contiBrineEqIdx = Indices::contiBrineEqIdx;
375 auto&
fs = asImp_().fluidState_;
377 if constexpr (enableSaltPrecipitation) {
379 saltSolubility_ = saltsolTable;
382 saltDensity_ = saltdenTable;
384 if (priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
385 saltSaturation_ = priVars.makeEvaluation(saltConcentrationIdx,
timeIdx);
386 fs.setSaltConcentration(saltSolubility_);
389 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx,
timeIdx);
390 fs.setSaltConcentration(saltConcentration_);
391 saltSaturation_ = 0.0;
393 fs.setSaltSaturation(saltSaturation_);
396 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx,
timeIdx);
397 fs.setSaltConcentration(saltConcentration_);
405 if constexpr (enableSaltPrecipitation) {
412 if (!FluidSystem::phaseIsActive(
phaseIdx))
415 asImp_().mobility_[
phaseIdx] *= permFactor_;
420 const Evaluation& saltConcentration()
const
421 {
return saltConcentration_; }
423 const Evaluation& brineRefDensity()
const
424 {
return refDensity_; }
426 const Evaluation& saltSaturation()
const
427 {
return saltSaturation_; }
429 Scalar saltSolubility()
const
430 {
return saltSolubility_; }
432 Scalar saltDensity()
const
433 {
return saltDensity_; }
435 const Evaluation& permFactor()
const
436 {
return permFactor_; }
439 Implementation& asImp_()
440 {
return *
static_cast<Implementation*
>(
this); }
442 Evaluation saltConcentration_;
443 Evaluation refDensity_;
444 Evaluation saltSaturation_;
445 Evaluation permFactor_;
446 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:369
static void assignPrimaryVars(PrimaryVariables &priVars, const FluidState &fluidState)
Assign the brine specific primary variables to a PrimaryVariables object.
Definition blackoilbrinemodules.hh:105
static Scalar computeUpdateError(const PrimaryVariables &, const EqVector &)
Return how much a Newton-Raphson update is considered an error.
Definition blackoilbrinemodules.hh:215
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:242
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:235