28#ifndef EWOMS_BLACK_OIL_BRINE_MODULE_HH
29#define EWOMS_BLACK_OIL_BRINE_MODULE_HH
31#include <dune/common/fvector.hh>
54template <class TypeTag, bool enableBrineV = getPropValue<TypeTag, Properties::EnableBrine>()>
70 using Toolbox = MathToolbox<Evaluation>;
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;
79 static constexpr bool enableBrine = enableBrineV;
80 static constexpr bool enableSaltPrecipitation =
81 getPropValue<TypeTag, Properties::EnableSaltPrecipitation>();
83 static constexpr unsigned numEq = getPropValue<TypeTag, Properties::NumEq>();
84 static constexpr unsigned numPhases = FluidSystem::numPhases;
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);
138 if constexpr (enableBrine) {
139 return eqIdx == contiBrineEqIdx;
146 static std::string
eqName([[maybe_unused]]
unsigned eqIdx)
150 return "conti^brine";
153 static Scalar
eqWeight([[maybe_unused]]
unsigned eqIdx)
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();
170 const LhsEval surfaceVolumeWater =
171 max(Toolbox::template decay<LhsEval>(fs.saturation(waterPhaseIdx)) *
172 Toolbox::template decay<LhsEval>(fs.invB(waterPhaseIdx)) *
173 Toolbox::template decay<LhsEval>(intQuants.porosity()),
177 const LhsEval massBrine = surfaceVolumeWater *
178 Toolbox::template decay<LhsEval>(fs.saltConcentration());
180 if constexpr (enableSaltPrecipitation) {
181 const double saltDensity = intQuants.saltDensity();
182 const LhsEval solidSalt =
183 Toolbox::template decay<LhsEval>(intQuants.porosity()) /
184 (1.0 - Toolbox::template decay<LhsEval>(intQuants.saltSaturation()) + 1.e-8) *
186 Toolbox::template decay<LhsEval>(intQuants.saltSaturation());
188 storage[contiBrineEqIdx] += massBrine + solidSalt;
191 storage[contiBrineEqIdx] += massBrine;
197 [[maybe_unused]]
const ElementContext& elemCtx,
198 [[maybe_unused]]
unsigned scvfIdx,
199 [[maybe_unused]]
unsigned timeIdx)
202 if constexpr (enableBrine) {
203 const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
205 const unsigned upIdx = extQuants.upstreamIndex(FluidSystem::waterPhaseIdx);
206 const unsigned inIdx = extQuants.interiorIndex();
207 const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
209 if (upIdx == inIdx) {
210 flux[contiBrineEqIdx] =
211 extQuants.volumeFlux(waterPhaseIdx) *
212 up.fluidState().invB(waterPhaseIdx) *
213 up.fluidState().saltConcentration();
216 flux[contiBrineEqIdx] =
217 extQuants.volumeFlux(waterPhaseIdx) *
218 decay<Scalar>(up.fluidState().invB(waterPhaseIdx)) *
219 decay<Scalar>(up.fluidState().saltConcentration());
233 return static_cast<Scalar
>(0.0);
236 template <
class DofEntity>
237 static void serializeEntity(
const Model& model, std::ostream& outstream,
const DofEntity& dof)
239 if constexpr (enableBrine) {
240 const unsigned dofIdx = model.dofMapper().index(dof);
241 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
242 outstream << priVars[saltConcentrationIdx];
246 template <
class DofEntity>
249 if constexpr (enableBrine) {
250 const unsigned dofIdx = model.dofMapper().index(dof);
251 PrimaryVariables& priVars0 = model.solution(0)[dofIdx];
252 PrimaryVariables& priVars1 = model.solution(1)[dofIdx];
254 instream >> priVars0[saltConcentrationIdx];
257 priVars1[saltConcentrationIdx] = priVars0[saltConcentrationIdx];
265 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
266 return params_.referencePressure_[pvtnumRegionIdx];
269 static const TabulatedFunction&
bdensityTable(
const ElementContext& elemCtx,
273 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
274 return params_.bdensityTable_[pvtnumRegionIdx];
277 static const TabulatedFunction&
pcfactTable(
unsigned satnumRegionIdx)
278 {
return params_.pcfactTable_[satnumRegionIdx]; }
280 static const TabulatedFunction&
permfactTable(
const ElementContext& elemCtx,
284 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
285 return params_.permfactTable_[satnumRegionIdx];
289 {
return params_.permfactTable_[satnumRegionIdx]; }
295 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
296 return params_.saltsolTable_[pvtnumRegionIdx];
301 return params_.saltsolTable_[pvtnumRegionIdx];
308 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
309 return params_.saltdenTable_[pvtnumRegionIdx];
314 return params_.saltdenTable_[pvtnumRegionIdx];
318 {
return !params_.bdensityTable_.empty(); }
321 {
return !params_.saltsolTable_.empty(); }
325 if constexpr (enableSaltPrecipitation) {
326 return !params_.pcfactTable_.empty();
334 {
return params_.saltsolTable_[regionIdx]; }
340template <
class TypeTag,
bool enableBrineV>
341BlackOilBrineParams<typename BlackOilBrineModule<TypeTag, enableBrineV>::Scalar>
342BlackOilBrineModule<TypeTag, enableBrineV>::params_;
344template <
class TypeTag,
bool enableBrineV>
354template <
class TypeTag>
369 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
370 static constexpr int saltConcentrationIdx = Indices::saltConcentrationIdx;
371 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
372 static constexpr int gasPhaseIdx = FluidSystem::gasPhaseIdx;
373 static constexpr int oilPhaseIdx = FluidSystem::oilPhaseIdx;
374 static constexpr bool enableBrine =
true;
375 static constexpr bool enableSaltPrecipitation =
376 getPropValue<TypeTag, Properties::EnableSaltPrecipitation>();
377 static constexpr int contiBrineEqIdx = Indices::contiBrineEqIdx;
389 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
391 updateSaltConcentration_(priVars, timeIdx, lintype);
395 const unsigned timeIdx,
398 const unsigned pvtnumRegionIdx = priVars.pvtRegionIndex();
399 auto& fs = asImp_().fluidState_;
401 if constexpr (enableSaltPrecipitation) {
402 saltSolubility_ = BrineModule::saltsolTable(pvtnumRegionIdx);
403 saltDensity_ = BrineModule::saltdenTable(pvtnumRegionIdx);
405 if (priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
406 saltSaturation_ = priVars.makeEvaluation(saltConcentrationIdx, timeIdx, lintype);
407 fs.setSaltConcentration(saltSolubility_);
410 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx, timeIdx, lintype);
411 fs.setSaltConcentration(saltConcentration_);
412 saltSaturation_ = 0.0;
414 fs.setSaltSaturation(saltSaturation_);
417 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx, timeIdx, lintype);
418 fs.setSaltConcentration(saltConcentration_);
423 [[maybe_unused]]
unsigned dofIdx,
424 [[maybe_unused]]
unsigned timeIdx)
426 if constexpr (enableSaltPrecipitation) {
427 const Evaluation porosityFactor = min(1.0 - saltSaturation(), 1.0);
429 const auto& permfactTable = BrineModule::permfactTable(elemCtx, dofIdx, timeIdx);
431 permFactor_ = permfactTable.eval(porosityFactor);
432 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
433 if (!FluidSystem::phaseIsActive(phaseIdx)) {
437 asImp_().mobility_[phaseIdx] *= permFactor_;
443 {
return saltConcentration_; }
446 {
return refDensity_; }
449 {
return saltSaturation_; }
452 {
return saltSolubility_; }
455 {
return saltDensity_; }
458 {
return permFactor_; }
462 {
return *
static_cast<Implementation*
>(
this); }
472template <
class TypeTag>
491 {
throw std::runtime_error(
"saltConcentration() called but brine are disabled"); }
494 {
throw std::runtime_error(
"brineRefDensity() called but brine are disabled"); }
497 {
throw std::logic_error(
"saltSaturation() called but salt precipitation is disabled"); }
500 {
throw std::logic_error(
"saltSolubility() called but salt precipitation is disabled"); }
503 {
throw std::logic_error(
"saltDensity() called but salt precipitation is disabled"); }
506 {
throw std::logic_error(
"permFactor() called but salt precipitation is disabled"); }
Defines a type tags and some fundamental properties all models.
Contains the parameters required to extend the black-oil model by brine.
Declares the properties required by the black oil model.
void updateSaltConcentration_(const ElementContext &, unsigned, unsigned)
Definition: blackoilbrinemodules.hh:480
const Scalar saltDensity() const
Definition: blackoilbrinemodules.hh:502
const Evaluation & permFactor() const
Definition: blackoilbrinemodules.hh:505
const Evaluation & saltSaturation() const
Definition: blackoilbrinemodules.hh:496
void saltPropertiesUpdate_(const ElementContext &, unsigned, unsigned)
Definition: blackoilbrinemodules.hh:485
const Scalar saltSolubility() const
Definition: blackoilbrinemodules.hh:499
const Evaluation & brineRefDensity() const
Definition: blackoilbrinemodules.hh:493
const Evaluation & saltConcentration() const
Definition: blackoilbrinemodules.hh:490
void updateSaltConcentration_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the intensive properties needed to handle brine from the primary variables.
Definition: blackoilbrinemodules.hh:385
Evaluation refDensity_
Definition: blackoilbrinemodules.hh:465
const Evaluation & saltSaturation() const
Definition: blackoilbrinemodules.hh:448
const Evaluation & brineRefDensity() const
Definition: blackoilbrinemodules.hh:445
Evaluation permFactor_
Definition: blackoilbrinemodules.hh:467
Evaluation saltConcentration_
Definition: blackoilbrinemodules.hh:464
Scalar saltSolubility_
Definition: blackoilbrinemodules.hh:468
const Evaluation & permFactor() const
Definition: blackoilbrinemodules.hh:457
const Evaluation & saltConcentration() const
Definition: blackoilbrinemodules.hh:442
Scalar saltDensity_
Definition: blackoilbrinemodules.hh:469
void updateSaltConcentration_(const PrimaryVariables &priVars, const unsigned timeIdx, const LinearizationType lintype)
Definition: blackoilbrinemodules.hh:394
Evaluation saltSaturation_
Definition: blackoilbrinemodules.hh:466
Scalar saltSolubility() const
Definition: blackoilbrinemodules.hh:451
Implementation & asImp_()
Definition: blackoilbrinemodules.hh:461
void saltPropertiesUpdate_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:422
Scalar saltDensity() const
Definition: blackoilbrinemodules.hh:454
Definition: blackoilbrinemodules.hh:345
Contains the high level supplements required to extend the black oil model by brine.
Definition: blackoilbrinemodules.hh:56
static bool hasBDensityTables()
Definition: blackoilbrinemodules.hh:317
static const TabulatedFunction & bdensityTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:269
static void serializeEntity(const Model &model, std::ostream &outstream, const DofEntity &dof)
Definition: blackoilbrinemodules.hh:237
static Scalar saltSol(unsigned regionIdx)
Definition: blackoilbrinemodules.hh:333
static std::string eqName(unsigned eqIdx)
Definition: blackoilbrinemodules.hh:146
static bool primaryVarApplies(unsigned pvIdx)
Definition: blackoilbrinemodules.hh:99
static const TabulatedFunction & pcfactTable(unsigned satnumRegionIdx)
Definition: blackoilbrinemodules.hh:277
static const TabulatedFunction & permfactTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:280
static bool hasPcfactTables()
Definition: blackoilbrinemodules.hh:323
static Scalar referencePressure(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:261
static Scalar saltsolTable(const unsigned pvtnumRegionIdx)
Definition: blackoilbrinemodules.hh:299
static std::string primaryVarName(unsigned pvIdx)
Definition: blackoilbrinemodules.hh:121
static void setParams(BlackOilBrineParams< Scalar > &¶ms)
Set parameters.
Definition: blackoilbrinemodules.hh:88
static void registerParameters()
Register all run-time parameters for the black-oil brine module.
Definition: blackoilbrinemodules.hh:96
static const TabulatedFunction & permfactTable(unsigned satnumRegionIdx)
Definition: blackoilbrinemodules.hh:288
static bool hasSaltsolTables()
Definition: blackoilbrinemodules.hh:320
static Scalar eqWeight(unsigned eqIdx)
Definition: blackoilbrinemodules.hh:153
static Scalar saltdenTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:304
static Scalar saltsolTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:291
static Scalar primaryVarWeight(unsigned pvIdx)
Definition: blackoilbrinemodules.hh:128
static void computeFlux(RateVector &flux, const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:196
static bool eqApplies(unsigned eqIdx)
Definition: blackoilbrinemodules.hh:136
static Scalar saltdenTable(const unsigned pvtnumRegionIdx)
Definition: blackoilbrinemodules.hh:312
static void assignPrimaryVars(PrimaryVariables &priVars, const FluidState &fluidState)
Assign the brine specific primary variables to a PrimaryVariables object.
Definition: blackoilbrinemodules.hh:113
static void deserializeEntity(Model &model, std::istream &instream, const DofEntity &dof)
Definition: blackoilbrinemodules.hh:247
static void addStorage(Dune::FieldVector< LhsEval, numEq > &storage, const IntensiveQuantities &intQuants)
Definition: blackoilbrinemodules.hh:163
static Scalar computeUpdateError(const PrimaryVariables &, const EqVector &)
Return how much a Newton-Raphson update is considered an error.
Definition: blackoilbrinemodules.hh:227
Declare the properties used by the infrastructure code of the finite volume discretizations.
Definition: blackoilboundaryratevector.hh:39
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
Struct holding the parameters for the BlackoilBrineModule class.
Definition: blackoilbrineparams.hpp:44
Tabulated1DFunction< Scalar > TabulatedFunction
Definition: blackoilbrineparams.hpp:50
Definition: linearizationtype.hh:34