24#ifndef DUMUX_BRINE_CO2_FLUID_SYSTEM_HH
25#define DUMUX_BRINE_CO2_FLUID_SYSTEM_HH
29#include <dune/common/exceptions.hh>
50#include <dumux/material/components/co2tables.inc>
63 template<
bool useConstantSalinity>
95template<
bool salinityIsConstant,
bool fastButSimplifiedRelations = false>
112template<
class Scalar,
115 class Policy = BrineCO2DefaultPolicy<
true> >
117:
public Base<Scalar, BrineCO2<Scalar, CO2Table, H2OType, Policy>>
127 static constexpr bool useConstantSalinity = Policy::useConstantSalinity();
132 using BrineType =
typename std::conditional_t< useConstantSalinity,
133 ConstantSalinityBrine,
134 VariableSalinityBrine >;
144 static constexpr int BrineOrH2OIdx = 0;
146 static constexpr int NaClIdx = 2;
172 struct BrineAdapterPolicy
174 using FluidSystem = VariableSalinityBrine;
176 static constexpr int phaseIdx(
int brinePhaseIdx) {
return liquidPhaseIdx; }
177 static constexpr int compIdx(
int brineCompIdx)
180 switch (brineCompIdx)
189 template<
class Flu
idState>
205 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index " << phaseIdx);
219 static constexpr bool isGas(
int phaseIdx)
221 assert(0 <= phaseIdx && phaseIdx <
numPhases);
233 assert(0 <= phaseIdx && phaseIdx <
numPhases);
257 assert(0 <= phaseIdx && phaseIdx <
numPhases);
274 assert(0 <= phaseIdx && phaseIdx <
numPhases);
288 if (useConstantSalinity)
291 return name[compIdx];
297 VariableSalinityBrine::NaCl::name() };
298 return name[compIdx];
309 if (useConstantSalinity)
330 init(273.15, 623.15, 100,
336 Scalar startPressure,
Scalar endPressure,
int pressureSteps)
338 std::cout <<
"The Brine-CO2 fluid system was configured with the following policy:\n";
339 std::cout <<
" - use constant salinity: " << std::boolalpha << Policy::useConstantSalinity() <<
"\n";
340 std::cout <<
" - use CO2 gas density as gas mixture density: " << std::boolalpha << Policy::useCO2GasDensityAsGasMixtureDensity() << std::endl;
342 if (H2O::isTabulated)
343 H2O::init(startTemp, endTemp, tempSteps, startPressure, endPressure, pressureSteps);
355 template <
class Flu
idState>
358 Scalar T = fluidState.temperature(phaseIdx);
360 return liquidDensityMixture_(fluidState);
364 if (Policy::useCO2GasDensityAsGasMixtureDensity())
366 return CO2::gasDensity(fluidState.temperature(phaseIdx), fluidState.pressure(phaseIdx));
370 Scalar rho_gH2O = H2O::gasDensity(T, fluidState.partialPressure(
gasPhaseIdx, BrineOrH2OIdx));
372 return (rho_gH2O + rho_gCO2);
376 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
389 template <
class Flu
idState>
392 Scalar T = fluidState.temperature(phaseIdx);
394 return density(fluidState, phaseIdx)/fluidState.averageMolarMass(phaseIdx);
397 if (Policy::useCO2GasDensityAsGasMixtureDensity())
402 Scalar rhoMolar_gH2O = H2O::gasMolarDensity(T, fluidState.partialPressure(
gasPhaseIdx, BrineOrH2OIdx));
404 return rhoMolar_gH2O + rhoMolar_gCO2;
407 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
421 template <
class Flu
idState>
424 Scalar T = fluidState.temperature(phaseIdx);
425 Scalar p = fluidState.pressure(phaseIdx);
434 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
464 template <
class Flu
idState>
479 Scalar T = fluidState.temperature(phaseIdx);
484 assert(pl > 0 && pg > 0);
496 xlCO2 = max(0.0, min(1.0, xlCO2));
497 xgH2O = max(0.0, min(1.0, xgH2O));
501 if (compIdx == BrineOrH2OIdx)
502 return (xgH2O/xlH2O)*(pg/pl);
504 else if (compIdx ==
CO2Idx)
505 return (xgCO2/xlCO2)*(pg/pl);
508 else if (!useConstantSalinity && compIdx == NaClIdx)
511 DUNE_THROW(Dune::InvalidStateException,
"Invalid component index.");
514 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
524 template <
class Flu
idState>
529 Scalar T = fluidState.temperature(phaseIdx);
530 Scalar p = fluidState.pressure(phaseIdx);
548 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
578 template <
class Flu
idState>
580 { DUNE_THROW(Dune::NotImplemented,
"Diffusion coefficients"); }
591 template <
class Flu
idState>
600 if (compIIdx > compJIdx)
603 swap(compIIdx, compJIdx);
606 Scalar T = fluidState.temperature(phaseIdx);
607 Scalar p = fluidState.pressure(phaseIdx);
610 if (compIIdx == BrineOrH2OIdx && compJIdx ==
CO2Idx)
612 if (!useConstantSalinity && compIIdx == BrineOrH2OIdx && compJIdx == NaClIdx)
618 DUNE_THROW(Dune::NotImplemented,
"Binary diffusion coefficient of components " <<
619 compIIdx <<
" and " << compJIdx <<
" in phase " << phaseIdx);
623 if (compIIdx == BrineOrH2OIdx && compJIdx ==
CO2Idx)
629 else if (!useConstantSalinity && compIIdx ==
CO2Idx && compJIdx == NaClIdx)
632 DUNE_THROW(Dune::NotImplemented,
"Binary diffusion coefficient of components " <<
633 compIIdx <<
" and " << compJIdx <<
" in phase " << phaseIdx);
636 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
646 template <
class Flu
idState>
649 Scalar T = fluidState.temperature(phaseIdx);
650 Scalar p = fluidState.pressure(phaseIdx);
664 const Scalar delta_hCO2 = (-57.4375 + T * 0.1325) * 1000/44;
667 const Scalar hw = H2O::liquidEnthalpy(T, p)/1e3;
671 return (h_ls1 - X_CO2_w*hw + hg*X_CO2_w)*1e3;
676 return H2O::gasEnthalpy(T, p)*fluidState.massFraction(
gasPhaseIdx, BrineOrH2OIdx)
680 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
689 template <
class Flu
idState>
692 const Scalar T = fluidState.temperature(phaseIdx);
693 const Scalar p = fluidState.pressure(phaseIdx);
697 if (componentIdx == BrineOrH2OIdx)
698 return H2O::liquidEnthalpy(T, p);
699 else if (componentIdx ==
CO2Idx)
701 else if (componentIdx == NaClIdx)
702 DUNE_THROW(Dune::NotImplemented,
"The component enthalpy for NaCl is not implemented.");
703 DUNE_THROW(Dune::InvalidStateException,
"Invalid component index " << componentIdx);
707 if (componentIdx == BrineOrH2OIdx)
708 return H2O::gasEnthalpy(T, p);
709 else if (componentIdx ==
CO2Idx)
711 else if (componentIdx == NaClIdx)
712 DUNE_THROW(Dune::InvalidStateException,
"Implementation assumes NaCl not to be present in gas phase");
713 DUNE_THROW(Dune::InvalidStateException,
"Invalid component index " << componentIdx);
715 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index " << phaseIdx);
728 template <
class Flu
idState>
733 fluidState.pressure(phaseIdx) )
739 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
753 template <
class Flu
idState>
759 fluidState.pressure(phaseIdx) )
764 fluidState.pressure(phaseIdx));
766 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index.");
777 template<
class Flu
idState>
778 static Scalar liquidDensityMixture_(
const FluidState& fluidState)
785 "defined above 273.15K (T = " << T <<
")");
789 "defined below 250MPa (p = " << p <<
")");
792 Scalar rho_pure = H2O::liquidDensity(T, p);
796 if (useConstantSalinity)
803 Scalar xlBrine = min(1.0, max(0.0, fluidState.moleFraction(
liquidPhaseIdx, BrineOrH2OIdx)));
805 Scalar sumx = xlBrine + xlCO2;
809 rho_lCO2 = liquidDensityWaterCO2_(T, p, xlBrine, xlCO2);
814 auto xlH2O = fluidState.moleFraction(
liquidPhaseIdx, BrineOrH2OIdx);
816 const auto sumMoleFrac = xlH2O + xlCO2;
817 xlH2O = xlH2O/sumMoleFrac;
818 xlCO2 = xlCO2/sumMoleFrac;
819 rho_lCO2 = liquidDensityWaterCO2_(T, p, xlH2O, xlCO2);
824 : VariableSalinityBrine::
density( BrineAdapter<FluidState>(fluidState),
828 Scalar contribCO2 = rho_lCO2 - rho_pure;
832 return rho_brine + contribCO2;
846 static Scalar liquidDensityWaterCO2_(Scalar temperature,
852 const Scalar M_H2O = H2O::molarMass();
855 const Scalar rho_pure = H2O::liquidDensity(temperature, pl);
860 const Scalar M_T = M_H2O * xlH2O + M_CO2 * xlCO2;
861 const Scalar V_phi = (37.51 +
864 tempC*5.044e-7))) / 1.0e6;
865 return 1/(xlCO2 * V_phi/M_T + M_H2O * xlH2O / (rho_pure * M_T));
A collection of input/output field names for common physical quantities.
A class for the CO2 fluid properties.
Tabulates all thermodynamic properties of a given untabulated chemical species.
A generic template for tabulated material laws that depend on two parameters.
Adapter class for fluid states with different indices.
Relations valid for an ideal gas.
Binary coefficients for CO2 and brine.
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.
std::string temperature() noexcept
I/O name of temperature for equilibrium models.
Definition name.hh:51
std::string gaseousPhase() noexcept
I/O name of gaseous phase.
Definition name.hh:123
std::string liquidPhase() noexcept
I/O name of liquid phase.
Definition name.hh:119
Exception thrown if a fixable numerical problem occurs.
Definition exceptions.hh:39
Binary coefficients for brine and CO2.
Definition brine_co2.hh:42
static void calculateMoleFractions(const Scalar temperature, const Scalar pg, const Scalar salinity, const int knownPhaseIdx, Scalar &xlCO2, Scalar &ygH2O)
Definition brine_co2.hh:113
static Scalar liquidDiffCoeff(Scalar temperature, Scalar pressure)
Definition brine_co2.hh:83
static Scalar gasDiffCoeff(Scalar temperature, Scalar pressure)
Definition brine_co2.hh:57
A class for the brine fluid properties.
Definition components/brine.hh:56
static Scalar liquidViscosity(Scalar temperature, Scalar pressure)
Definition components/brine.hh:409
static const Scalar liquidEnthalpy(Scalar T, Scalar p)
Definition components/brine.hh:155
static Scalar molarMass()
Definition components/brine.hh:83
static Scalar salinity()
Definition components/brine.hh:73
static Scalar liquidThermalConductivity(Scalar temperature, Scalar pressure)
Definition components/brine.hh:435
static const Scalar liquidHeatCapacity(Scalar temperature, Scalar pressure)
Definition components/brine.hh:214
static constexpr bool liquidIsCompressible()
Definition components/brine.hh:297
static std::string name()
Definition components/brine.hh:67
static constexpr bool gasIsIdeal()
Definition components/brine.hh:285
static Scalar liquidDensity(Scalar temperature, Scalar pressure)
Definition components/brine.hh:310
A class for the CO2 fluid properties.
Definition co2.hh:57
static Scalar gasThermalConductivity(Scalar temperature, Scalar pressure)
Definition co2.hh:399
static Scalar liquidEnthalpy(Scalar temperature, Scalar pressure)
Definition co2.hh:180
static constexpr Scalar molarMass()
Definition co2.hh:72
static Scalar gasMolarDensity(Scalar temperature, Scalar pressure)
Definition co2.hh:244
static Scalar gasDensity(Scalar temperature, Scalar pressure)
Definition co2.hh:226
static constexpr bool gasIsIdeal()
Definition co2.hh:126
static std::string name()
Definition co2.hh:66
static Scalar gasViscosity(Scalar temperature, Scalar pressure)
Definition co2.hh:327
static Scalar liquidHeatCapacity(Scalar temperature, Scalar pressure)
Definition co2.hh:304
static Scalar gasEnthalpy(Scalar temperature, Scalar pressure)
Definition co2.hh:162
Tabulates all thermodynamic properties of a given untabulated chemical species.
Definition tabulatedcomponent.hh:82
Adapter class for fluid states with different indices.
Definition adapter.hh:44
Fluid system base class.
Definition fluidsystems/base.hh:45
ScalarType Scalar
export the scalar type
Definition fluidsystems/base.hh:48
static Scalar density(const FluidState &fluidState, int phaseIdx)
Calculate the density of a fluid phase.
Definition fluidsystems/base.hh:134
static Scalar thermalConductivity(const FluidState &fluidState, int phaseIdx)
Thermal conductivity of a fluid phase .
Definition fluidsystems/base.hh:390
static Scalar fugacityCoefficient(const FluidState &fluidState, int phaseIdx, int compIdx)
Calculate the fugacity coefficient of an individual component in a fluid phase.
Definition fluidsystems/base.hh:197
static Scalar diffusionCoefficient(const FluidState &fluidState, int phaseIdx, int compIdx)
Calculate the binary molecular diffusion coefficient for a component in a fluid phase .
Definition fluidsystems/base.hh:278
static Scalar binaryDiffusionCoefficient(const FluidState &fluidState, int phaseIdx, int compIIdx, int compJIdx)
Given a phase's composition, temperature and pressure, return the binary diffusion coefficient for c...
Definition fluidsystems/base.hh:326
static Scalar enthalpy(const FluidState &fluidState, int phaseIdx)
Given a phase's composition, temperature, pressure and density, calculate its specific enthalpy .
Definition fluidsystems/base.hh:363
static Scalar molarDensity(const FluidState &fluidState, int phaseIdx)
Calculate the molar density of a fluid phase.
Definition fluidsystems/base.hh:160
static Scalar viscosity(const FluidState &fluidState, int phaseIdx)
Calculate the dynamic viscosity of a fluid phase .
Definition fluidsystems/base.hh:236
static Scalar heatCapacity(const FluidState &fluidState, int phaseIdx)
Specific isobaric heat capacity of a fluid phase .
Definition fluidsystems/base.hh:424
A compositional single phase fluid system consisting of two components, which are H2O and NaCl.
Definition fluidsystems/brine.hh:47
static Scalar thermalConductivity(const FluidState &fluidState, int phaseIdx)
Definition fluidsystems/brine.hh:482
static Scalar viscosity(const FluidState &fluidState, int phaseIdx=liquidPhaseIdx)
Definition fluidsystems/brine.hh:281
static constexpr int H2OIdx
Definition fluidsystems/brine.hh:62
static Scalar heatCapacity(const FluidState &fluidState, int phaseIdx)
Definition fluidsystems/brine.hh:500
static Scalar molarMass(int compIdx)
Definition fluidsystems/brine.hh:166
static Scalar enthalpy(const FluidState &fluidState, int phaseIdx)
Definition fluidsystems/brine.hh:337
static constexpr int NaClIdx
Definition fluidsystems/brine.hh:63
static constexpr int liquidPhaseIdx
Definition fluidsystems/brine.hh:60
static bool isCompressible(int phaseIdx=liquidPhaseIdx)
Definition fluidsystems/brine.hh:125
static std::string componentName(int compIdx)
Definition fluidsystems/brine.hh:152
static Scalar binaryDiffusionCoefficient(const FluidState &fluidState, int phaseIdx, int compIIdx, int compJIdx)
Definition fluidsystems/brine.hh:445
Class that exports some indices that should be provided by the BrineAir fluid system....
Definition brineco2.hh:64
static constexpr int BrineIdx
Definition brineco2.hh:74
static constexpr int H2OIdx
Definition brineco2.hh:85
static constexpr int NaClIdx
Definition brineco2.hh:86
static constexpr int comp2Idx
Definition brineco2.hh:87
Default policy for the Brine-CO2 fluid system.
Definition brineco2.hh:97
static constexpr bool useCO2GasDensityAsGasMixtureDensity()
Definition brineco2.hh:99
static constexpr bool useConstantSalinity()
Definition brineco2.hh:98
A compositional fluid with brine (H2O & NaCl) and carbon dioxide as components in both the liquid and...
Definition brineco2.hh:119
static constexpr int CO2Idx
Definition brineco2.hh:167
static constexpr int numComponents
Definition brineco2.hh:155
static Scalar enthalpy(const FluidState &fluidState, int phaseIdx)
Given the phase composition, return the specific phase enthalpy .
Definition brineco2.hh:647
NullParameterCache ParameterCache
Definition brineco2.hh:149
static constexpr bool isCompressible(int phaseIdx)
Returns true if and only if a fluid phase is assumed to be compressible.
Definition brineco2.hh:272
static constexpr int phase0Idx
Definition brineco2.hh:160
static constexpr int comp0Idx
Definition brineco2.hh:163
H2OType H2O
Definition brineco2.hh:151
static Scalar molarMass(int compIdx)
Return the molar mass of a component in .
Definition brineco2.hh:306
static constexpr int numPhases
Definition brineco2.hh:156
static Scalar heatCapacity(const FluidState &fluidState, int phaseIdx)
Specific isobaric heat capacity of a fluid phase .
Definition brineco2.hh:754
static std::string componentName(int compIdx)
Return the human readable name of a component.
Definition brineco2.hh:285
static Scalar binaryDiffusionCoefficient(const FluidState &fluidState, int phaseIdx, int compIIdx, int compJIdx)
Given the phase compositions, return the binary diffusion coefficient of two components in a phase.
Definition brineco2.hh:592
static Scalar density(const FluidState &fluidState, int phaseIdx)
Given a phase's composition, temperature, pressure, and the partial pressures of all components,...
Definition brineco2.hh:356
static Scalar viscosity(const FluidState &fluidState, int phaseIdx)
Calculate the dynamic viscosity of a fluid phase .
Definition brineco2.hh:422
static Scalar diffusionCoefficient(const FluidState &fluidState, int phaseIdx, int compIdx)
Calculate the molecular diffusion coefficient for a component in a fluid phase .
Definition brineco2.hh:579
static void init()
Definition brineco2.hh:328
static constexpr bool isGas(int phaseIdx)
Return whether a phase is gaseous.
Definition brineco2.hh:219
static constexpr int phase1Idx
Definition brineco2.hh:161
static constexpr int gasPhaseIdx
Definition brineco2.hh:159
static constexpr bool isIdealGas(int phaseIdx)
Returns true if and only if a fluid phase is assumed to be an ideal gas.
Definition brineco2.hh:231
Dumux::Components::CO2< Scalar, CO2Table > CO2
Definition brineco2.hh:153
static std::string phaseName(int phaseIdx)
Return the human readable name of a fluid phase.
Definition brineco2.hh:198
static Scalar thermalConductivity(const FluidState &fluidState, int phaseIdx)
Thermal conductivity of a fluid phase .
Definition brineco2.hh:729
static constexpr int liquidPhaseIdx
Definition brineco2.hh:158
static Scalar fugacityCoefficient(const FluidState &fluidState, int phaseIdx, int compIdx)
Returns the fugacity coefficient of a component in a phase.
Definition brineco2.hh:465
static constexpr bool isMiscible()
Returns whether the fluids are miscible.
Definition brineco2.hh:211
BrineType Brine
Definition brineco2.hh:152
static void init(Scalar startTemp, Scalar endTemp, int tempSteps, Scalar startPressure, Scalar endPressure, int pressureSteps)
Definition brineco2.hh:335
static constexpr int comp1Idx
Definition brineco2.hh:164
static Scalar componentEnthalpy(const FluidState &fluidState, int phaseIdx, int componentIdx)
Returns the specific enthalpy of a component in a specific phase.
Definition brineco2.hh:690
static bool isIdealMixture(int phaseIdx)
Returns true if and only if a fluid phase is assumed to be an ideal mixture.
Definition brineco2.hh:255
static Scalar equilibriumMoleFraction(const FluidState &fluidState, const ParameterCache ¶mCache, int phaseIdx)
Returns the equilibrium concentration of the dissolved component in a phase.
Definition brineco2.hh:525
static Scalar molarDensity(const FluidState &fluidState, int phaseIdx)
The molar density of a fluid phase in .
Definition brineco2.hh:390
The a parameter cache which does nothing.
Definition nullparametercache.hh:34
A class for the brine fluid properties,.
A fluid system for brine, i.e. H2O with dissolved NaCl.