version 3.10-dev
compositionalflash.hh
Go to the documentation of this file.
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// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
13#ifndef DUMUX_COMPOSITIONAL_FLASH_HH
14#define DUMUX_COMPOSITIONAL_FLASH_HH
15
16#include <dune/common/fvector.hh>
17
19
20namespace Dumux {
21
37template <class Scalar, class FluidSystem>
39{
41
42 enum { numPhases = FluidSystem::numPhases,
43 numComponents = FluidSystem::numComponents
44 };
45
46 enum{
47 phase0Idx = FluidSystem::phase0Idx,
48 phase1Idx = FluidSystem::phase1Idx,
49 comp0Idx = FluidSystem::comp0Idx,
50 comp1Idx = FluidSystem::comp1Idx
51 };
52
53public:
54 using ComponentVector = Dune::FieldVector<Scalar, numComponents>;
55 using PhaseVector = Dune::FieldVector<Scalar, numPhases>;
56
57
78 template<class FluidState>
79 static void concentrationFlash2p2c(FluidState& fluidState,
80 const Scalar Z0,
81 const PhaseVector& phasePressure,
82 const Scalar temperature)
83 {
84#ifndef NDEBUG
85 // this solver can only handle fluid systems which
86 // assume ideal mixtures of all fluids.
87 for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
88 assert(FluidSystem::isIdealMixture(phaseIdx));
89
90 }
91#endif
92
93 // set the temperature, pressure
94 fluidState.setTemperature(temperature);
95 fluidState.setPressure(phase0Idx, phasePressure[phase0Idx]);
96 fluidState.setPressure(phase1Idx, phasePressure[phase1Idx]);
97
98 // mole equilibrium ratios k for in case first phase is reference phase
99 const Scalar k10 = FluidSystem::fugacityCoefficient(fluidState, phase0Idx, comp0Idx) * fluidState.pressure(phase0Idx)
100 / (FluidSystem::fugacityCoefficient(fluidState, phase1Idx, comp0Idx) * fluidState.pressure(phase1Idx));
101 const Scalar k11 = FluidSystem::fugacityCoefficient(fluidState, phase0Idx, comp1Idx) * fluidState.pressure(phase0Idx)
102 / (FluidSystem::fugacityCoefficient(fluidState, phase1Idx, comp1Idx) * fluidState.pressure(phase1Idx));
103
104 // get mole fraction from equilibrium constants
105 fluidState.setMoleFraction(phase0Idx, comp0Idx, ((1. - k11) / (k10 - k11)));
106 fluidState.setMoleFraction(phase1Idx, comp0Idx, (fluidState.moleFraction(phase0Idx,comp0Idx) * k10));
107 fluidState.setMoleFraction(phase0Idx, comp1Idx, 1.0 - fluidState.moleFraction(phase0Idx,comp0Idx));
108 fluidState.setMoleFraction(phase1Idx, comp1Idx, 1.0 - fluidState.moleFraction(phase1Idx,comp0Idx));
109
110 // mass equilibrium ratios K for in case first phase is reference phase
111 const Scalar K10 = fluidState.massFraction(phase1Idx, comp0Idx) / fluidState.massFraction(phase0Idx, comp0Idx);
112 const Scalar K11 = (1. - fluidState.massFraction(phase1Idx, comp0Idx)) / (1. - fluidState.massFraction(phase0Idx, comp0Idx));
113
114 // phase mass fraction Nu (ratio of phase mass to total phase mass) of first phase
115 const Scalar Nu0 = 1. + ((Z0 * (K10 - 1.)) + ((1. - Z0) * (K11 - 1.))) / ((K11 - 1.) * (K10 - 1.));
116
117 // an array of the phase mass fractions from which we will compute the saturations
118 std::array<Scalar, 2> phaseMassFraction;
119
120 // check phase presence
121 if (Nu0 > 0. && Nu0 < 1.) // two phases present
122 phaseMassFraction[phase0Idx] = Nu0;
123 else if (Nu0 <= 0.) // only second phase present
124 {
125 phaseMassFraction[phase0Idx] = 0.0; // no first phase
126 fluidState.setMassFraction(phase1Idx,comp0Idx, Z0); // assign complete mass dissolved into second phase
127 }
128 else // only first phase present
129 {
130 phaseMassFraction[phase0Idx] = 1.0; // no second phase
131 fluidState.setMassFraction(phase0Idx, comp0Idx, Z0); // assign complete mass dissolved into first phase
132 }
133
134 // complete phase mass fractions
135 phaseMassFraction[phase1Idx] = 1.0 - phaseMassFraction[phase0Idx];
136
137 // get densities with correct composition
138 fluidState.setDensity(phase0Idx, FluidSystem::density(fluidState, phase0Idx));
139 fluidState.setDensity(phase1Idx, FluidSystem::density(fluidState, phase1Idx));
140 fluidState.setMolarDensity(phase0Idx, FluidSystem::molarDensity(fluidState, phase0Idx));
141 fluidState.setMolarDensity(phase1Idx, FluidSystem::molarDensity(fluidState, phase1Idx));
142
143 fluidState.setViscosity(phase0Idx, FluidSystem::viscosity(fluidState, phase0Idx));
144 fluidState.setViscosity(phase1Idx, FluidSystem::viscosity(fluidState, phase1Idx));
145
146 Scalar sw = phaseMassFraction[phase0Idx] / fluidState.density(phase0Idx);
147 sw /= (phaseMassFraction[phase0Idx] / fluidState.density(phase0Idx)
148 + phaseMassFraction[phase1Idx] / fluidState.density(phase1Idx));
149 fluidState.setSaturation(phase0Idx, sw);
150 fluidState.setSaturation(phase1Idx, 1.0-sw);
151 }
152
167 static void concentrationFlash1p2c(FluidState1p2c& fluidState, const Scalar& Z0,const Dune::FieldVector<Scalar,numPhases>
168 phasePressure,const int presentPhaseIdx, const Scalar& temperature)
169 {
170 // set the temperature, pressure
171 fluidState.setTemperature(temperature);
172 fluidState.setPressure(phase0Idx, phasePressure[phase0Idx]);
173 fluidState.setPressure(phase1Idx, phasePressure[phase1Idx]);
174
175 fluidState.setPresentPhaseIdx(presentPhaseIdx);
176 fluidState.setMassFraction(presentPhaseIdx,comp0Idx, Z0);
177
178 // transform mass to mole fractions
179 fluidState.setMoleFraction(presentPhaseIdx, comp0Idx, Z0 / FluidSystem::molarMass(comp0Idx)
180 / (Z0 / FluidSystem::molarMass(comp0Idx) + (1. - Z0) / FluidSystem::molarMass(comp1Idx)));
181
182 fluidState.setAverageMolarMass(presentPhaseIdx,
183 fluidState.massFraction(presentPhaseIdx, comp0Idx) * FluidSystem::molarMass(comp0Idx)
184 + fluidState.massFraction(presentPhaseIdx, comp1Idx) * FluidSystem::molarMass(comp1Idx));
185
186 fluidState.setDensity(presentPhaseIdx, FluidSystem::density(fluidState, presentPhaseIdx));
187 fluidState.setMolarDensity(presentPhaseIdx, FluidSystem::molarDensity(fluidState, presentPhaseIdx));
188
189 fluidState.setViscosity(presentPhaseIdx, FluidSystem::viscosity(fluidState, presentPhaseIdx));
190 }
192
194
206 template<class FluidState>
207 static void saturationFlash2p2c(FluidState& fluidState,
208 const Scalar saturation,
209 const PhaseVector& phasePressure,
210 const Scalar temperature)
211 {
212#ifndef NDEBUG
213 // this solver can only handle fluid systems which
214 // assume ideal mixtures of all fluids.
215 for (int phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
216 assert(FluidSystem::isIdealMixture(phaseIdx));
217
218 }
219#endif
220
221 // set the temperature, pressure
222 fluidState.setTemperature(temperature);
223 fluidState.setPressure(phase0Idx, phasePressure[phase0Idx]);
224 fluidState.setPressure(phase1Idx, phasePressure[phase1Idx]);
225
226 // mole equilibrium ratios k for in case first phase is reference phase
227 const Scalar k10 = FluidSystem::fugacityCoefficient(fluidState, phase0Idx, comp0Idx) * fluidState.pressure(phase0Idx)
228 / (FluidSystem::fugacityCoefficient(fluidState, phase1Idx, comp0Idx) * fluidState.pressure(phase1Idx));
229 const Scalar k11 = FluidSystem::fugacityCoefficient(fluidState, phase0Idx, comp1Idx) * fluidState.pressure(phase0Idx)
230 / (FluidSystem::fugacityCoefficient(fluidState, phase1Idx, comp1Idx) * fluidState.pressure(phase1Idx));
231
232 // get mole fraction from equilibrium constants
233 fluidState.setMoleFraction(phase0Idx,comp0Idx, ((1. - k11) / (k10 - k11)));
234 fluidState.setMoleFraction(phase1Idx,comp0Idx, (fluidState.moleFraction(phase0Idx,comp0Idx) * k10));
235 fluidState.setMoleFraction(phase0Idx, comp1Idx, 1.0 - fluidState.moleFraction(phase0Idx,comp0Idx));
236 fluidState.setMoleFraction(phase1Idx, comp1Idx, 1.0 - fluidState.moleFraction(phase1Idx,comp0Idx));
237
238 // get densities with correct composition
239 fluidState.setDensity(phase0Idx, FluidSystem::density(fluidState, phase0Idx));
240 fluidState.setDensity(phase1Idx, FluidSystem::density(fluidState, phase1Idx));
241 fluidState.setMolarDensity(phase0Idx, FluidSystem::molarDensity(fluidState, phase0Idx));
242 fluidState.setMolarDensity(phase1Idx, FluidSystem::molarDensity(fluidState, phase1Idx));
243
244 fluidState.setViscosity(phase0Idx, FluidSystem::viscosity(fluidState, phase0Idx));
245 fluidState.setViscosity(phase1Idx, FluidSystem::viscosity(fluidState, phase1Idx));
246
247 // set saturation
248 fluidState.setSaturation(phase0Idx, saturation);
249 fluidState.setSaturation(phase1Idx, 1.0-saturation);
250 }
252};
253
254} // end namespace Dumux
255
256#endif
Flash calculation routines for compositional sequential models.
Definition: compositionalflash.hh:39
static void saturationFlash2p2c(FluidState &fluidState, const Scalar saturation, const PhaseVector &phasePressure, const Scalar temperature)
Definition: compositionalflash.hh:207
Dune::FieldVector< Scalar, numComponents > ComponentVector
Definition: compositionalflash.hh:54
static void concentrationFlash1p2c(FluidState1p2c &fluidState, const Scalar &Z0, const Dune::FieldVector< Scalar, numPhases > phasePressure, const int presentPhaseIdx, const Scalar &temperature)
The simplest possible update routine for 1p2c "flash" calculations.
Definition: compositionalflash.hh:167
Dune::FieldVector< Scalar, numPhases > PhaseVector
Definition: compositionalflash.hh:55
static void concentrationFlash2p2c(FluidState &fluidState, const Scalar Z0, const PhaseVector &phasePressure, const Scalar temperature)
Definition: compositionalflash.hh:79
Container for compositional variables in a 1p2c situation.
Definition: pseudo1p2c.hh:32
void setAverageMolarMass(int phaseIdx, Scalar value)
Set the average molar mass of a fluid phase [kg/mol].
Definition: pseudo1p2c.hh:264
void setMassFraction(int phaseIdx, int compIdx, Scalar value)
Sets the mass fraction of a component in a phase.
Definition: pseudo1p2c.hh:204
void setPresentPhaseIdx(int phaseIdx)
Sets the phase Index that is present in this fluidState.
Definition: pseudo1p2c.hh:245
void setPressure(int phaseIdx, Scalar value)
Sets the phase pressure .
Definition: pseudo1p2c.hh:270
void setDensity(int phaseIdx, Scalar value)
Sets the density of a phase .
Definition: pseudo1p2c.hh:223
void setViscosity(int phaseIdx, Scalar value)
Sets the viscosity of a phase .
Definition: pseudo1p2c.hh:191
void setMolarDensity(int phaseIdx, Scalar value)
Set the molar density of a phase .
Definition: pseudo1p2c.hh:235
void setTemperature(Scalar value)
Sets the temperature.
Definition: pseudo1p2c.hh:253
Scalar massFraction(int phaseIdx, int compIdx) const
Returns the mass fraction of component in fluid phase in .
Definition: pseudo1p2c.hh:109
void setMoleFraction(int phaseIdx, int compIdx, Scalar value)
Sets the molar fraction of a component in a fluid phase.
Definition: pseudo1p2c.hh:214
std::string temperature() noexcept
I/O name of temperature for equilibrium models.
Definition: name.hh:39
std::string saturation(int phaseIdx) noexcept
I/O name of saturation for multiphase systems.
Definition: name.hh:31
std::string viscosity(int phaseIdx) noexcept
I/O name of viscosity for multiphase systems.
Definition: name.hh:62
std::string molarDensity(int phaseIdx) noexcept
I/O name of molar density for multiphase systems.
Definition: name.hh:71
std::string density(int phaseIdx) noexcept
I/O name of density for multiphase systems.
Definition: name.hh:53
Definition: adapt.hh:17
Calculates phase state for a single phase but two-component state.