28#ifndef EWOMS_BLACK_OIL_BRINE_MODULE_HH
29#define EWOMS_BLACK_OIL_BRINE_MODULE_HH
31#include <dune/common/fvector.hh>
33#include <opm/common/utility/gpuDecorators.hpp>
56template <class TypeTag, bool enableBrineV = getPropValue<TypeTag, Properties::EnableBrine>()>
72 using Toolbox = MathToolbox<Evaluation>;
76 static constexpr unsigned saltConcentrationIdx = Indices::saltConcentrationIdx;
77 static constexpr unsigned contiBrineEqIdx = Indices::contiBrineEqIdx;
78 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
79 static constexpr bool gasEnabled = Indices::gasEnabled;
80 static constexpr bool oilEnabled = Indices::oilEnabled;
81 static constexpr bool enableBrine = enableBrineV;
82 static constexpr bool enableSaltPrecipitation =
83 getPropValue<TypeTag, Properties::EnableSaltPrecipitation>();
85 static constexpr unsigned numEq = getPropValue<TypeTag, Properties::NumEq>();
86 static constexpr unsigned numPhases = FluidSystem::numPhases;
103 if constexpr (enableBrine) {
104 return pvIdx == saltConcentrationIdx;
114 template <
class Flu
idState>
116 const FluidState& fluidState)
118 if constexpr (enableBrine) {
119 priVars[saltConcentrationIdx] = fluidState.saltConcentration();
127 return "saltConcentration";
135 return static_cast<Scalar
>(1.0);
140 if constexpr (enableBrine) {
141 return eqIdx == contiBrineEqIdx;
148 static std::string
eqName([[maybe_unused]]
unsigned eqIdx)
152 return "conti^brine";
155 static Scalar
eqWeight([[maybe_unused]]
unsigned eqIdx)
160 return static_cast<Scalar
>(1.0);
164 template <
class StorageType>
166 const IntensiveQuantities& intQuants)
168 using LhsEval =
typename StorageType::value_type;
170 if constexpr (enableBrine) {
171 const auto& fs = intQuants.fluidState();
174 const LhsEval surfaceVolumeWater =
175 max(Toolbox::template decay<LhsEval>(fs.saturation(waterPhaseIdx)) *
176 Toolbox::template decay<LhsEval>(fs.invB(waterPhaseIdx)) *
177 Toolbox::template decay<LhsEval>(intQuants.porosity()),
181 const LhsEval massBrine = surfaceVolumeWater *
182 Toolbox::template decay<LhsEval>(fs.saltConcentration());
184 if constexpr (enableSaltPrecipitation) {
185 const double saltDensity = intQuants.saltDensity();
186 const LhsEval solidSalt =
187 Toolbox::template decay<LhsEval>(intQuants.porosity()) /
188 (1.0 - Toolbox::template decay<LhsEval>(fs.saltSaturation()) + 1.e-8) *
190 Toolbox::template decay<LhsEval>(fs.saltSaturation());
192 storage[contiBrineEqIdx] += massBrine + solidSalt;
195 storage[contiBrineEqIdx] += massBrine;
201 [[maybe_unused]]
const ElementContext& elemCtx,
202 [[maybe_unused]]
unsigned scvfIdx,
203 [[maybe_unused]]
unsigned timeIdx)
205 if constexpr (enableBrine) {
206 const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
207 unsigned focusIdx = elemCtx.focusDofIndex();
208 unsigned upIdx = extQuants.upstreamIndex(waterPhaseIdx);
209 flux[contiBrineEqIdx] = 0.0;
210 if (upIdx == focusIdx)
211 addBrineFluxes_<Evaluation>(flux, elemCtx, scvfIdx, timeIdx);
213 addBrineFluxes_<Scalar>(flux, elemCtx, scvfIdx, timeIdx);
217 template <
class UpstreamEval>
219 const ElementContext& elemCtx,
223 const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
224 unsigned upIdx = extQuants.upstreamIndex(waterPhaseIdx);
225 const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
226 const auto& upFs = up.fluidState();
227 const auto& volFlux = extQuants.volumeFlux(waterPhaseIdx);
228 addBrineFluxes_<UpstreamEval>(flux, waterPhaseIdx, volFlux, upFs);
231 template <
class UpEval,
class Flu
idState>
234 const Evaluation& volFlux,
235 const FluidState& upFs)
237 if constexpr (enableBrine) {
238 if (phaseIdx == waterPhaseIdx) {
239 flux[contiBrineEqIdx] =
240 decay<UpEval>(upFs.saltConcentration())
241 * decay<UpEval>(upFs.invB(waterPhaseIdx))
256 return static_cast<Scalar
>(0.0);
259 template <
class DofEntity>
260 static void serializeEntity(
const Model& model, std::ostream& outstream,
const DofEntity& dof)
262 if constexpr (enableBrine) {
263 const unsigned dofIdx = model.dofMapper().index(dof);
264 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
265 outstream << priVars[saltConcentrationIdx];
269 template <
class DofEntity>
272 if constexpr (enableBrine) {
273 const unsigned dofIdx = model.dofMapper().index(dof);
274 PrimaryVariables& priVars0 = model.solution(0)[dofIdx];
275 PrimaryVariables& priVars1 = model.solution(1)[dofIdx];
277 instream >> priVars0[saltConcentrationIdx];
280 priVars1[saltConcentrationIdx] = priVars0[saltConcentrationIdx];
288 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
289 return params_.referencePressure_[pvtnumRegionIdx];
292 static const TabulatedFunction&
bdensityTable(
const ElementContext& elemCtx,
296 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
297 return params_.bdensityTable_[pvtnumRegionIdx];
300 static const TabulatedFunction&
pcfactTable(
unsigned satnumRegionIdx)
301 {
return params_.pcfactTable_[satnumRegionIdx]; }
303 static const TabulatedFunction&
permfactTable(
const ElementContext& elemCtx,
307 const unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
308 return params_.permfactTable_[satnumRegionIdx];
312 {
return params_.permfactTable_[satnumRegionIdx]; }
318 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
319 return params_.saltsolTable_[pvtnumRegionIdx];
324 return params_.saltsolTable_[pvtnumRegionIdx];
331 const unsigned pvtnumRegionIdx = elemCtx.problem().pvtRegionIndex(elemCtx, scvIdx, timeIdx);
332 return params_.saltdenTable_[pvtnumRegionIdx];
337 return params_.saltdenTable_[pvtnumRegionIdx];
341 {
return !params_.bdensityTable_.empty(); }
344 {
return !params_.saltsolTable_.empty(); }
348 if constexpr (enableSaltPrecipitation) {
349 return !params_.pcfactTable_.empty();
357 {
return params_.saltsolTable_[regionIdx]; }
363template <
class TypeTag,
bool enableBrineV>
364BlackOilBrineParams<typename BlackOilBrineModule<TypeTag, enableBrineV>::Scalar>
365BlackOilBrineModule<TypeTag, enableBrineV>::params_;
367template <
class TypeTag,
bool enableBrineV>
377template <
class TypeTag>
392 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
393 static constexpr int saltConcentrationIdx = Indices::saltConcentrationIdx;
394 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
395 static constexpr int gasPhaseIdx = FluidSystem::gasPhaseIdx;
396 static constexpr int oilPhaseIdx = FluidSystem::oilPhaseIdx;
397 static constexpr bool enableBrine =
true;
398 static constexpr bool enableSaltPrecipitation =
399 getPropValue<TypeTag, Properties::EnableSaltPrecipitation>();
400 static constexpr int contiBrineEqIdx = Indices::contiBrineEqIdx;
412 const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
414 updateSaltConcentration_(priVars, timeIdx, lintype);
418 const unsigned timeIdx,
421 const unsigned pvtnumRegionIdx = priVars.pvtRegionIndex();
422 auto& fs = asImp_().fluidState_;
424 if constexpr (enableSaltPrecipitation) {
425 saltSolubility_ = BrineModule::saltsolTable(pvtnumRegionIdx);
426 saltDensity_ = BrineModule::saltdenTable(pvtnumRegionIdx);
428 if (priVars.primaryVarsMeaningBrine() == PrimaryVariables::BrineMeaning::Sp) {
429 saltSaturation_ = priVars.makeEvaluation(saltConcentrationIdx, timeIdx, lintype);
430 fs.setSaltConcentration(saltSolubility_);
433 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx, timeIdx, lintype);
434 fs.setSaltConcentration(saltConcentration_);
435 saltSaturation_ = 0.0;
437 fs.setSaltSaturation(saltSaturation_);
440 saltConcentration_ = priVars.makeEvaluation(saltConcentrationIdx, timeIdx, lintype);
441 fs.setSaltConcentration(saltConcentration_);
446 [[maybe_unused]]
unsigned dofIdx,
447 [[maybe_unused]]
unsigned timeIdx)
449 if constexpr (enableSaltPrecipitation) {
450 const Evaluation porosityFactor = min(1.0 - asImp_().fluidState_.saltSaturation(), 1.0);
452 const auto& permfactTable = BrineModule::permfactTable(elemCtx, dofIdx, timeIdx);
454 permFactor_ = permfactTable.eval(porosityFactor);
459 {
return refDensity_; }
462 {
return saltSolubility_; }
465 {
return saltDensity_; }
468 {
return permFactor_; }
472 {
return *
static_cast<Implementation*
>(
this); }
482template <
class TypeTag>
501 {
throw std::runtime_error(
"brineRefDensity() called but brine are disabled"); }
504 {
throw std::logic_error(
"saltSolubility() called but salt precipitation is disabled"); }
507 {
throw std::logic_error(
"saltDensity() called but salt precipitation is disabled"); }
510 {
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:490
const Scalar saltDensity() const
Definition: blackoilbrinemodules.hh:506
const Evaluation & permFactor() const
Definition: blackoilbrinemodules.hh:509
void saltPropertiesUpdate_(const ElementContext &, unsigned, unsigned)
Definition: blackoilbrinemodules.hh:495
const Scalar saltSolubility() const
Definition: blackoilbrinemodules.hh:503
const Evaluation & brineRefDensity() const
Definition: blackoilbrinemodules.hh:500
void updateSaltConcentration_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the intensive properties needed to handle brine from the primary variables.
Definition: blackoilbrinemodules.hh:408
Evaluation refDensity_
Definition: blackoilbrinemodules.hh:475
const Evaluation & brineRefDensity() const
Definition: blackoilbrinemodules.hh:458
Evaluation permFactor_
Definition: blackoilbrinemodules.hh:477
Evaluation saltConcentration_
Definition: blackoilbrinemodules.hh:474
Scalar saltSolubility_
Definition: blackoilbrinemodules.hh:478
const Evaluation & permFactor() const
Definition: blackoilbrinemodules.hh:467
Scalar saltDensity_
Definition: blackoilbrinemodules.hh:479
void updateSaltConcentration_(const PrimaryVariables &priVars, const unsigned timeIdx, const LinearizationType lintype)
Definition: blackoilbrinemodules.hh:417
Evaluation saltSaturation_
Definition: blackoilbrinemodules.hh:476
Scalar saltSolubility() const
Definition: blackoilbrinemodules.hh:461
Implementation & asImp_()
Definition: blackoilbrinemodules.hh:471
void saltPropertiesUpdate_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:445
Scalar saltDensity() const
Definition: blackoilbrinemodules.hh:464
Definition: blackoilbrinemodules.hh:368
Contains the high level supplements required to extend the black oil model by brine.
Definition: blackoilbrinemodules.hh:58
static bool hasBDensityTables()
Definition: blackoilbrinemodules.hh:340
static const TabulatedFunction & bdensityTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:292
static void serializeEntity(const Model &model, std::ostream &outstream, const DofEntity &dof)
Definition: blackoilbrinemodules.hh:260
static Scalar saltSol(unsigned regionIdx)
Definition: blackoilbrinemodules.hh:356
static std::string eqName(unsigned eqIdx)
Definition: blackoilbrinemodules.hh:148
static bool primaryVarApplies(unsigned pvIdx)
Definition: blackoilbrinemodules.hh:101
static const TabulatedFunction & pcfactTable(unsigned satnumRegionIdx)
Definition: blackoilbrinemodules.hh:300
static const TabulatedFunction & permfactTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:303
static bool hasPcfactTables()
Definition: blackoilbrinemodules.hh:346
static Scalar referencePressure(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:284
static Scalar saltsolTable(const unsigned pvtnumRegionIdx)
Definition: blackoilbrinemodules.hh:322
static std::string primaryVarName(unsigned pvIdx)
Definition: blackoilbrinemodules.hh:123
static void setParams(BlackOilBrineParams< Scalar > &¶ms)
Set parameters.
Definition: blackoilbrinemodules.hh:90
static void registerParameters()
Register all run-time parameters for the black-oil brine module.
Definition: blackoilbrinemodules.hh:98
static const TabulatedFunction & permfactTable(unsigned satnumRegionIdx)
Definition: blackoilbrinemodules.hh:311
static bool hasSaltsolTables()
Definition: blackoilbrinemodules.hh:343
static Scalar eqWeight(unsigned eqIdx)
Definition: blackoilbrinemodules.hh:155
static Scalar saltdenTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:327
static Scalar saltsolTable(const ElementContext &elemCtx, unsigned scvIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:314
static Scalar primaryVarWeight(unsigned pvIdx)
Definition: blackoilbrinemodules.hh:130
static void computeFlux(RateVector &flux, const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:200
static bool eqApplies(unsigned eqIdx)
Definition: blackoilbrinemodules.hh:138
static OPM_HOST_DEVICE void addStorage(StorageType &storage, const IntensiveQuantities &intQuants)
Definition: blackoilbrinemodules.hh:165
static Scalar saltdenTable(const unsigned pvtnumRegionIdx)
Definition: blackoilbrinemodules.hh:335
static void assignPrimaryVars(PrimaryVariables &priVars, const FluidState &fluidState)
Assign the brine specific primary variables to a PrimaryVariables object.
Definition: blackoilbrinemodules.hh:115
static void deserializeEntity(Model &model, std::istream &instream, const DofEntity &dof)
Definition: blackoilbrinemodules.hh:270
static void addBrineFluxes_(RateVector &flux, const ElementContext &elemCtx, unsigned scvfIdx, unsigned timeIdx)
Definition: blackoilbrinemodules.hh:218
static void addBrineFluxes_(RateVector &flux, unsigned phaseIdx, const Evaluation &volFlux, const FluidState &upFs)
Definition: blackoilbrinemodules.hh:232
static Scalar computeUpdateError(const PrimaryVariables &, const EqVector &)
Return how much a Newton-Raphson update is considered an error.
Definition: blackoilbrinemodules.hh:250
Declare the properties used by the infrastructure code of the finite volume discretizations.
Definition: blackoilbioeffectsmodules.hh:45
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:42
Tabulated1DFunction< Scalar > TabulatedFunction
Definition: blackoilbrineparams.hpp:46
Definition: linearizationtype.hh:34