My Project
Loading...
Searching...
No Matches
ThreeComponentFluidSystem.hh
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*
4 Copyright 2022 SINTEF Digital, Mathematics and Cybernetics.
5
6 This file is part of the Open Porous Media project (OPM).
7
8 OPM is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 OPM is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with OPM. If not, see <http://www.gnu.org/licenses/>.
20
21 Consult the COPYING file in the top-level source directory of this
22 module for the precise wording of the license and the list of
23 copyright holders.
24*/
25
26#ifndef OPM_THREECOMPONENTFLUIDSYSTEM_HH
27#define OPM_THREECOMPONENTFLUIDSYSTEM_HH
28
34
35#include <string_view>
36
37
38// TODO: this is something else need to check
41
42namespace Opm {
50 template<class Scalar>
52 : public Opm::BaseFluidSystem<Scalar, ThreeComponentFluidSystem<Scalar> > {
53 public:
54 // TODO: I do not think these should be constant in fluidsystem, will try to make it non-constant later
55 static constexpr int numPhases=2;
56 static constexpr int numComponents = 3;
57 static constexpr int numMisciblePhases=2;
58 static constexpr int numMiscibleComponents = 3;
59 // TODO: phase location should be more general
60 static constexpr int oilPhaseIdx = 0;
61 static constexpr int gasPhaseIdx = 1;
62
63 static constexpr int Comp0Idx = 0;
64 static constexpr int Comp1Idx = 1;
65 static constexpr int Comp2Idx = 2;
66
67 // TODO: needs to be more general
69 using Comp1 = C1<Scalar>;
70 using Comp2 = C10<Scalar>;
71
72 template <class ValueType>
76
82 static Scalar acentricFactor(unsigned compIdx)
83 {
84 switch (compIdx) {
85 case Comp0Idx: return Comp0::acentricFactor();
86 case Comp1Idx: return Comp1::acentricFactor();
87 case Comp2Idx: return Comp2::acentricFactor();
88 default: throw std::runtime_error("Illegal component index for acentricFactor");
89 }
90 }
96 static Scalar criticalTemperature(unsigned compIdx)
97 {
98 switch (compIdx) {
99 case Comp0Idx: return Comp0::criticalTemperature();
100 case Comp1Idx: return Comp1::criticalTemperature();
101 case Comp2Idx: return Comp2::criticalTemperature();
102 default: throw std::runtime_error("Illegal component index for criticalTemperature");
103 }
104 }
110 static Scalar criticalPressure(unsigned compIdx) {
111 switch (compIdx) {
112 case Comp0Idx: return Comp0::criticalPressure();
113 case Comp1Idx: return Comp1::criticalPressure();
114 case Comp2Idx: return Comp2::criticalPressure();
115 default: throw std::runtime_error("Illegal component index for criticalPressure");
116 }
117 }
123 static Scalar criticalVolume(unsigned compIdx)
124 {
125 switch (compIdx) {
126 case Comp0Idx: return Comp0::criticalVolume();
127 case Comp1Idx: return Comp1::criticalVolume();
128 case Comp2Idx: return Comp2::criticalVolume();
129 default: throw std::runtime_error("Illegal component index for criticalVolume");
130 }
131 }
132
134 static Scalar molarMass(unsigned compIdx)
135 {
136 switch (compIdx) {
137 case Comp0Idx: return Comp0::molarMass();
138 case Comp1Idx: return Comp1::molarMass();
139 case Comp2Idx: return Comp2::molarMass();
140 default: throw std::runtime_error("Illegal component index for molarMass");
141 }
142 }
143
148 static Scalar interactionCoefficient(unsigned /*comp1Idx*/, unsigned /*comp2Idx*/)
149 {
150 return 0.0;
151 }
152
154 static std::string_view phaseName(unsigned phaseIdx)
155 {
156 static const std::string_view name[] = {"o", // oleic phase
157 "g"}; // gas phase
158
159 assert(phaseIdx < 2);
160 return name[phaseIdx];
161 }
162
164 static std::string_view componentName(unsigned compIdx)
165 {
166 static const std::string_view name[] = {
167 Comp0::name(),
168 Comp1::name(),
169 Comp2::name(),
170 };
171
172 assert(compIdx < 3);
173 return name[compIdx];
174 }
175
179 template <class FluidState, class LhsEval = typename FluidState::Scalar, class ParamCacheEval = LhsEval>
180 static LhsEval density(const FluidState& fluidState,
181 const ParameterCache<ParamCacheEval>& paramCache,
182 unsigned phaseIdx)
183 {
184 assert(phaseIdx == oilPhaseIdx || phaseIdx == gasPhaseIdx); // This is a oil + gas only two-phase system
185 return decay<LhsEval>(fluidState.averageMolarMass(phaseIdx) / paramCache.molarVolume(phaseIdx));
186 }
187
189 template <class FluidState, class LhsEval = typename FluidState::Scalar, class ParamCacheEval = LhsEval>
190 static LhsEval viscosity(const FluidState& fluidState,
191 const ParameterCache<ParamCacheEval>& paramCache,
192 unsigned phaseIdx)
193 {
194 // Use LBC method to calculate viscosity
195 return decay<LhsEval>(ViscosityModel::LBC(fluidState, paramCache, phaseIdx));
196 }
197
199 template <class FluidState, class LhsEval = typename FluidState::Scalar, class ParamCacheEval = LhsEval>
200 static LhsEval fugacityCoefficient(const FluidState& fluidState,
201 const ParameterCache<ParamCacheEval>& paramCache,
202 unsigned phaseIdx,
203 unsigned compIdx)
204 {
205 assert(phaseIdx < numPhases);
206 assert(compIdx < numComponents);
207
208 return decay<LhsEval>(PengRobinsonMixture::computeFugacityCoefficient(fluidState, paramCache, phaseIdx, compIdx));
209 }
210
212 static bool isCompressible([[maybe_unused]] unsigned phaseIdx)
213 {
214 assert(phaseIdx < numPhases);
215
216 return true;
217 }
218
220 static bool isIdealMixture([[maybe_unused]] unsigned phaseIdx)
221 {
222 assert(phaseIdx < numPhases);
223
224 return false;
225 }
226
228 static bool isLiquid(unsigned phaseIdx)
229 {
230 assert(phaseIdx < numPhases);
231
232 return (phaseIdx == 0);
233 }
234
236 static bool isIdealGas(unsigned phaseIdx)
237 {
238 assert(phaseIdx < numPhases);
239
240 return (phaseIdx == 1);
241 }
242 };
243}
244#endif //OPM_THREECOMPONENTFLUIDSYSTEM_HH
The base class for all fluid systems.
Properties of pure molecular n-Decane .
Properties of pure molecular methane .
Specifies the parameter cache used by the SPE-5 fluid system.
Implements the Peng-Robinson equation of state for a mixture.
A simplistic class representing the fluid properties.
The base class for all fluid systems.
Definition BaseFluidSystem.hpp:47
Scalar Scalar
The type used for scalar quantities.
Definition BaseFluidSystem.hpp:52
Properties of pure molecular n-Decane .
Definition C10.hpp:50
static Scalar criticalVolume()
Critical volume of [m3/kmol].
Definition C10.hpp:81
static std::string_view name()
A human readable name for NDecane.
Definition C10.hpp:57
static Scalar criticalPressure()
Returns the critical pressure of molecular n-Decane.
Definition C10.hpp:75
static Scalar criticalTemperature()
Returns the critical temperature of molecular n-Decane.
Definition C10.hpp:69
static Scalar molarMass()
The molar mass in of molecular n-Decane.
Definition C10.hpp:63
static Scalar acentricFactor()
Acentric factor of .
Definition C10.hpp:86
Properties of pure molecular methane .
Definition C1.hpp:51
static Scalar criticalPressure()
Returns the critical pressure of molecular methane.
Definition C1.hpp:76
static Scalar molarMass()
The molar mass in of molecular methane.
Definition C1.hpp:64
static Scalar criticalTemperature()
Returns the critical temperature of molecular methane.
Definition C1.hpp:70
static Scalar acentricFactor()
Acentric factor of .
Definition C1.hpp:87
static Scalar criticalVolume()
Critical volume of [m3/kmol].
Definition C1.hpp:82
static std::string_view name()
A human readable name for NDecane.
Definition C1.hpp:58
Specifies the parameter cache used by the SPE-5 fluid system.
Definition PTFlashParameterCache.hpp:48
Scalar molarVolume(unsigned phaseIdx) const
Returns the molar volume of a phase [m^3/mol].
Definition PTFlashParameterCache.hpp:199
Implements the Peng-Robinson equation of state for a mixture.
Definition PengRobinsonMixture.hpp:41
static LhsEval computeFugacityCoefficient(const FluidState &fs, const Params &params, unsigned phaseIdx, unsigned compIdx)
Returns the fugacity coefficient of an individual component in the phase.
Definition PengRobinsonMixture.hpp:74
A simplistic class representing the fluid properties.
Definition SimpleCO2.hpp:50
static Scalar criticalVolume()
Critical volume of [m2/kmol].
Definition SimpleCO2.hpp:93
static Scalar criticalTemperature()
Returns the critical temperature of .
Definition SimpleCO2.hpp:69
static Scalar acentricFactor()
Acentric factor of .
Definition SimpleCO2.hpp:87
static Scalar criticalPressure()
Returns the critical pressure of .
Definition SimpleCO2.hpp:75
static std::string_view name()
A human readable name for the component.
Definition SimpleCO2.hpp:57
static Scalar molarMass()
The molar mass in of the component.
Definition SimpleCO2.hpp:63
A two phase three component fluid system with components CO2, Methane and NDekan.
Definition ThreeComponentFluidSystem.hh:52
static LhsEval fugacityCoefficient(const FluidState &fluidState, const ParameterCache< ParamCacheEval > &paramCache, unsigned phaseIdx, unsigned compIdx)
Calculate the fugacity coefficient [Pa] of an individual component in a fluid phase.
Definition ThreeComponentFluidSystem.hh:200
static LhsEval density(const FluidState &fluidState, const ParameterCache< ParamCacheEval > &paramCache, unsigned phaseIdx)
Calculate the density [kg/m^3] of a fluid phase.
Definition ThreeComponentFluidSystem.hh:180
static Scalar criticalPressure(unsigned compIdx)
Critical pressure of a component [Pa].
Definition ThreeComponentFluidSystem.hh:110
static std::string_view componentName(unsigned compIdx)
Return the human readable name of a component.
Definition ThreeComponentFluidSystem.hh:164
static Scalar criticalTemperature(unsigned compIdx)
Critical temperature of a component [K].
Definition ThreeComponentFluidSystem.hh:96
static bool isIdealMixture(unsigned phaseIdx)
Returns true if and only if a fluid phase is assumed to be an ideal mixture.
Definition ThreeComponentFluidSystem.hh:220
static std::string_view phaseName(unsigned phaseIdx)
Return the human readable name of a fluid phase.
Definition ThreeComponentFluidSystem.hh:154
static Scalar molarMass(unsigned compIdx)
Return the molar mass of a component in [kg/mol].
Definition ThreeComponentFluidSystem.hh:134
static Scalar acentricFactor(unsigned compIdx)
The acentric factor of a component [].
Definition ThreeComponentFluidSystem.hh:82
static bool isCompressible(unsigned phaseIdx)
Returns true if and only if a fluid phase is assumed to be compressible.
Definition ThreeComponentFluidSystem.hh:212
static bool isIdealGas(unsigned phaseIdx)
Returns true if and only if a fluid phase is assumed to be an ideal gas.
Definition ThreeComponentFluidSystem.hh:236
static Scalar interactionCoefficient(unsigned, unsigned)
Returns the interaction coefficient for two components.
Definition ThreeComponentFluidSystem.hh:148
static bool isLiquid(unsigned phaseIdx)
Return whether a phase is liquid.
Definition ThreeComponentFluidSystem.hh:228
static LhsEval viscosity(const FluidState &fluidState, const ParameterCache< ParamCacheEval > &paramCache, unsigned phaseIdx)
Calculate the dynamic viscosity of a fluid phase [Pa*s].
Definition ThreeComponentFluidSystem.hh:190
static Scalar criticalVolume(unsigned compIdx)
Critical volume of a component [m3].
Definition ThreeComponentFluidSystem.hh:123
Definition LBC.hpp:40
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30