3.2-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
porousmediumflow/2p1c/volumevariables.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 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
25#ifndef DUMUX_2P1C_VOLUME_VARIABLES_HH
26#define DUMUX_2P1C_VOLUME_VARIABLES_HH
27
28#include <array>
29
30#include <dune/common/exceptions.hh>
31
37
39
40namespace Dumux {
41
46template <class Traits>
49, public EnergyVolumeVariables<Traits, TwoPOneCVolumeVariables<Traits> >
50{
53 using Scalar = typename Traits::PrimaryVariables::value_type;
54 using PermeabilityType = typename Traits::PermeabilityType;
55 using FS = typename Traits::FluidSystem;
56 using Idx = typename Traits::ModelTraits::Indices;
57 static constexpr int numFluidComps = ParentType::numFluidComponents();
58
59 // primary variable indices
60 enum
61 {
62 numFluidPhases = Traits::ModelTraits::numFluidPhases(),
63 switchIdx = Idx::switchIdx,
64 pressureIdx = Idx::pressureIdx
65 };
66
67 // component indices
68 enum
69 {
70 comp0Idx = FS::comp0Idx,
71 liquidPhaseIdx = FS::liquidPhaseIdx,
72 gasPhaseIdx = FS::gasPhaseIdx
73 };
74
75 // phase presence indices
76 enum
77 {
78 twoPhases = Idx::twoPhases,
79 liquidPhaseOnly = Idx::liquidPhaseOnly,
80 gasPhaseOnly = Idx::gasPhaseOnly,
81 };
82
83 // formulations
84 static constexpr auto formulation = Traits::ModelTraits::priVarFormulation();
85
86public:
88 using FluidState = typename Traits::FluidState;
90 using FluidSystem = typename Traits::FluidSystem;
92 using Indices = typename Traits::ModelTraits::Indices;
94 using SolidState = typename Traits::SolidState;
96 using SolidSystem = typename Traits::SolidSystem;
99
101 static constexpr TwoPFormulation priVarFormulation() { return formulation; }
102
103 // check for permissive combinations
104 static_assert(Traits::ModelTraits::numFluidPhases() == 2, "NumPhases set in the model is not two!");
105 static_assert(Traits::ModelTraits::numFluidComponents() == 1, "NumComponents set in the model is not one!");
106 static_assert((formulation == TwoPFormulation::p0s1 || formulation == TwoPFormulation::p1s0), "Chosen TwoPFormulation not supported!");
107
117 template<class ElemSol, class Problem, class Element, class Scv>
118 void update(const ElemSol &elemSol,
119 const Problem &problem,
120 const Element &element,
121 const Scv& scv)
122 {
123 ParentType::update(elemSol, problem, element, scv);
124
125 completeFluidState(elemSol, problem, element, scv, fluidState_, solidState_);
126
128 // calculate the remaining quantities
130 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
131 const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
132
133 // Second instance of a parameter cache.
134 // Could be avoided if diffusion coefficients also
135 // became part of the fluid state.
136 typename FluidSystem::ParameterCache paramCache;
137 paramCache.updateAll(fluidState_);
138 const int wPhaseIdx = fluidState_.wettingPhase();
139 for (int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
140 {
141 // relative permeabilities
142 Scalar kr;
143 if (phaseIdx == wPhaseIdx)
144 kr = MaterialLaw::krw(materialParams, saturation(wPhaseIdx));
145 else // ATTENTION: krn requires the wetting phase saturation
146 // as parameter!
147 kr = MaterialLaw::krn(materialParams, saturation(wPhaseIdx));
148 relativePermeability_[phaseIdx] = kr;
149 Valgrind::CheckDefined(relativePermeability_[phaseIdx]);
150 }
151
152 // porosity & permeability
153 // porosity calculation over inert volumefraction
154 updateSolidVolumeFractions(elemSol, problem, element, scv, solidState_, numFluidComps);
155 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv, solidState_);
156 permeability_ = problem.spatialParams().permeability(element, scv, elemSol);
157 EnergyVolVars::updateEffectiveThermalConductivity();
158 }
159
171 template<class ElemSol, class Problem, class Element, class Scv>
172 void completeFluidState(const ElemSol& elemSol,
173 const Problem& problem,
174 const Element& element,
175 const Scv& scv,
178 {
179
180 // capillary pressure parameters
181 const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
182 const auto wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol);
183 fluidState.setWettingPhase(wPhaseIdx);
184
185 const auto& priVars = elemSol[scv.localDofIndex()];
186 const auto phasePresence = priVars.state();
187
188 // set the saturations
189 if (phasePresence == twoPhases)
190 {
191 if (formulation == TwoPFormulation::p0s1)
192 {
193 fluidState.setSaturation(gasPhaseIdx, priVars[switchIdx]);
194 fluidState.setSaturation(liquidPhaseIdx, 1.0 - priVars[switchIdx]);
195 }
196 else
197 {
198 fluidState.setSaturation(liquidPhaseIdx, priVars[switchIdx]);
199 fluidState.setSaturation(gasPhaseIdx, 1.0 - priVars[switchIdx]);
200 }
201 }
202 else if (phasePresence == liquidPhaseOnly)
203 {
204 fluidState.setSaturation(liquidPhaseIdx, 1.0);
205 fluidState.setSaturation(gasPhaseIdx, 0.0);
206 }
207 else if (phasePresence == gasPhaseOnly)
208 {
209 fluidState.setSaturation(liquidPhaseIdx, 0.0);
210 fluidState.setSaturation(gasPhaseIdx, 1.0);
211 }
212 else
213 DUNE_THROW(Dune::InvalidStateException, "phasePresence: " << phasePresence << " is invalid.");
214
215 // set pressures of the fluid phases
216 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
217 pc_ = MaterialLaw::pc(materialParams, fluidState.saturation(wPhaseIdx));
218 if (formulation == TwoPFormulation::p0s1)
219 {
220 fluidState.setPressure(liquidPhaseIdx, priVars[pressureIdx]);
221 fluidState.setPressure(gasPhaseIdx, (wPhaseIdx == liquidPhaseIdx) ? priVars[pressureIdx] + pc_
222 : priVars[pressureIdx] - pc_);
223 }
224 else
225 {
226 fluidState.setPressure(gasPhaseIdx, priVars[pressureIdx]);
227 fluidState.setPressure(liquidPhaseIdx, (wPhaseIdx == liquidPhaseIdx) ? priVars[pressureIdx] - pc_
228 : priVars[pressureIdx] + pc_);
229 }
230
231 // set the temperature
232 updateTemperature(elemSol, problem, element, scv, fluidState, solidState);
233
234 // set the densities
235 for (int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
236 {
237 Scalar rho = FluidSystem::density(fluidState, phaseIdx);
238 Scalar rhoMolar = FluidSystem::molarDensity(fluidState, phaseIdx);
239
240 fluidState.setDensity(phaseIdx, rho);
241 fluidState.setMolarDensity(phaseIdx, rhoMolar);
242 }
243
244 //get the viscosity and mobility
245 for (int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
246 {
247 // Mobilities
248 const Scalar mu =
250 phaseIdx);
251 fluidState.setViscosity(phaseIdx,mu);
252 }
253
254 // the enthalpies (internal energies are directly calculated in the fluidstate
255 for (int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
256 {
257 const Scalar h = FluidSystem::enthalpy(fluidState, phaseIdx);
258 fluidState.setEnthalpy(phaseIdx, h);
259 }
260 }
261
264 template<class ElemSol, class Problem, class Element, class Scv>
265 void updateTemperature(const ElemSol& elemSol,
266 const Problem& problem,
267 const Element& element,
268 const Scv& scv,
271 {
272 const auto& priVars = elemSol[scv.localDofIndex()];
273 const auto phasePresence = priVars.state();
274
275 // get temperature
276 Scalar fluidTemperature;
277 if (phasePresence == liquidPhaseOnly || phasePresence == gasPhaseOnly)
278 fluidTemperature = priVars[switchIdx];
279 else if (phasePresence == twoPhases)
280 fluidTemperature = FluidSystem::vaporTemperature(fluidState, fluidState_.wettingPhase());
281 else
282 DUNE_THROW(Dune::InvalidStateException, "phasePresence: " << phasePresence << " is invalid.");
283
285
286 // the model assumes that all fluid phases have the same temperature
287 for (int phaseIdx=0; phaseIdx < FluidSystem::numPhases; ++phaseIdx)
288 fluidState.setTemperature(phaseIdx, fluidTemperature);
289
290 // the solid phase could have a different temperature
291 if (Traits::ModelTraits::numEnergyEq() == 1)
292 solidState.setTemperature(fluidTemperature);
293 else
294 {
295 const Scalar solidTemperature = elemSol[scv.localDofIndex()][Traits::ModelTraits::numEq()-1];
296 solidState.setTemperature(solidTemperature);
297 }
298 }
299
303 const FluidState &fluidState() const
304 { return fluidState_; }
305
309 const SolidState &solidState() const
310 { return solidState_; }
311
317 Scalar averageMolarMass(int phaseIdx) const
318 { return fluidState_.averageMolarMass(phaseIdx); }
319
326 Scalar saturation(const int phaseIdx) const
327 { return fluidState_.saturation(phaseIdx); }
328
335 Scalar density(const int phaseIdx) const
336 { return fluidState_.density(phaseIdx); }
337
344 Scalar molarDensity(const int phaseIdx) const
345 { return fluidState_.molarDensity(phaseIdx); }
346
353 Scalar pressure(const int phaseIdx) const
354 { return fluidState_.pressure(phaseIdx); }
355
363 Scalar temperature(const int phaseIdx = 0) const
364 { return fluidState_.temperature(phaseIdx); }
365
372 Scalar mobility(const int phaseIdx) const
373 {
374 return relativePermeability_[phaseIdx]/fluidState_.viscosity(phaseIdx);
375 }
376
381 Scalar capillaryPressure() const
382 { return pc_; }
383
387 Scalar porosity() const
388 { return solidState_.porosity(); }
389
393 const PermeabilityType& permeability() const
394 { return permeability_; }
395
399 Scalar vaporTemperature() const
400 { return FluidSystem::vaporTemperature(fluidState_, liquidPhaseIdx);}
401
405 int wettingPhase() const
406 { return fluidState_.wettingPhase(); }
407
408protected:
411
412private:
413 Scalar pc_; // The capillary pressure
414 PermeabilityType permeability_; // Effective permeability within the control volume
415
416 // Relative permeability within the control volume
417 std::array<Scalar, numFluidPhases> relativePermeability_;
418};
419
420} // end namespace Dumux
421
422#endif
Some templates to wrap the valgrind macros.
Update the solid volume fractions (inert and reacitve) and set them in the solidstate.
Defines an enumeration for the formulations accepted by the two-phase model.
TwoPFormulation
Enumerates the formulations which the two-phase model accepts.
Definition: formulation.hh:35
@ p1s0
first phase saturation and second phase pressure as primary variables
@ p0s1
first phase pressure and second phase saturation as primary variables
void updateSolidVolumeFractions(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv, SolidState &solidState, const int solidVolFracOffset)
update the solid volume fractions (inert and reacitve) and set them in the solidstate
Definition: updatesolidvolumefractions.hh:36
bool CheckDefined(const T &value)
Make valgrind complain if the object occupied by an object is undefined.
Definition: valgrind.hh:72
Definition: adapt.hh:29
std::string solidTemperature() noexcept
I/O name of solid temperature for non-equilibrium models.
Definition: name.hh:60
std::string phasePresence() noexcept
I/O name of phase presence.
Definition: name.hh:147
std::string viscosity(int phaseIdx) noexcept
I/O name of viscosity for multiphase systems.
Definition: name.hh:74
std::string molarDensity(int phaseIdx) noexcept
I/O name of molar density for multiphase systems.
Definition: name.hh:83
std::string density(int phaseIdx) noexcept
I/O name of density for multiphase systems.
Definition: name.hh:65
std::string fluidTemperature(int phaseIdx) noexcept
I/O name of temperature for non-equilibrium models.
Definition: name.hh:56
The primary variable switch for the two-phase one-component model.
Definition: 2p1c/primaryvariableswitch.hh:41
The volume variables (i.e. secondary variables) for the two-phase one-component model.
Definition: porousmediumflow/2p1c/volumevariables.hh:50
Scalar saturation(const int phaseIdx) const
Returns the effective saturation of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:326
typename Traits::FluidSystem FluidSystem
The type of the fluid system.
Definition: porousmediumflow/2p1c/volumevariables.hh:90
const PermeabilityType & permeability() const
Returns the average permeability within the control volume in .
Definition: porousmediumflow/2p1c/volumevariables.hh:393
Scalar density(const int phaseIdx) const
Returns the mass density of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:335
Scalar temperature(const int phaseIdx=0) const
Returns temperature inside the sub-control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:363
typename Traits::FluidState FluidState
The type of the object returned by the fluidState() method.
Definition: porousmediumflow/2p1c/volumevariables.hh:88
const FluidState & fluidState() const
Returns the fluid state for the control-volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:303
Scalar averageMolarMass(int phaseIdx) const
Returns the average molar mass of the fluid phase.
Definition: porousmediumflow/2p1c/volumevariables.hh:317
Scalar vaporTemperature() const
Returns the vapor temperature of the fluid within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:399
void completeFluidState(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv, FluidState &fluidState, SolidState &solidState)
Sets complete fluid state.
Definition: porousmediumflow/2p1c/volumevariables.hh:172
Scalar molarDensity(const int phaseIdx) const
Returns the molar density of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:344
FluidState fluidState_
Definition: porousmediumflow/2p1c/volumevariables.hh:409
typename Traits::SolidSystem SolidSystem
Export type of solid system.
Definition: porousmediumflow/2p1c/volumevariables.hh:96
Scalar capillaryPressure() const
Returns the effective capillary pressure within the control volume in .
Definition: porousmediumflow/2p1c/volumevariables.hh:381
void updateTemperature(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv, FluidState &fluidState, SolidState &solidState)
Definition: porousmediumflow/2p1c/volumevariables.hh:265
typename Traits::ModelTraits::Indices Indices
The type of the indices.
Definition: porousmediumflow/2p1c/volumevariables.hh:92
void update(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv)
Updates all quantities for a given control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:118
Scalar porosity() const
Returns the average porosity within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:387
typename Traits::SolidState SolidState
Export type of solid state.
Definition: porousmediumflow/2p1c/volumevariables.hh:94
Scalar mobility(const int phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:372
const SolidState & solidState() const
Returns the phase state for the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:309
int wettingPhase() const
Returns the wetting phase index.
Definition: porousmediumflow/2p1c/volumevariables.hh:405
static constexpr TwoPFormulation priVarFormulation()
Return the two-phase formulation used here.
Definition: porousmediumflow/2p1c/volumevariables.hh:101
Scalar pressure(const int phaseIdx) const
Returns the effective pressure of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:353
SolidState solidState_
Definition: porousmediumflow/2p1c/volumevariables.hh:410
Definition: porousmediumflow/nonisothermal/volumevariables.hh:75
The isothermal base class.
Definition: porousmediumflow/volumevariables.hh:40
static constexpr int numFluidComponents()
Return number of components considered by the model.
Definition: porousmediumflow/volumevariables.hh:52
const PrimaryVariables & priVars() const
Returns the vector of primary variables.
Definition: porousmediumflow/volumevariables.hh:76
void update(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv)
Updates all quantities for a given control volume.
Definition: porousmediumflow/volumevariables.hh:64
Base class for the model specific class which provides access to all volume averaged quantities.
Base class for the model specific class which provides access to all volume averaged quantities.
The primary variable switch for the extended Richards model.