3.1-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
porousmediumflow/2pnc/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 *****************************************************************************/
26#ifndef DUMUX_2PNC_VOLUME_VARIABLES_HH
27#define DUMUX_2PNC_VOLUME_VARIABLES_HH
28
29#include <iostream>
30#include <vector>
31
32#include <dumux/common/math.hh>
34
37
42
44
46
47namespace Dumux {
48
54template <class Traits>
57, public EnergyVolumeVariables<Traits, TwoPNCVolumeVariables<Traits> >
58{
61 using Scalar = typename Traits::PrimaryVariables::value_type;
62 using PermeabilityType = typename Traits::PermeabilityType;
63 using FS = typename Traits::FluidSystem;
64 using ModelTraits = typename Traits::ModelTraits;
65 static constexpr int numFluidComps = ParentType::numFluidComponents();
66 enum
67 {
68 numMajorComponents = ModelTraits::numFluidPhases(),
69
70 // phase indices
71 phase0Idx = FS::phase0Idx,
72 phase1Idx = FS::phase1Idx,
73
74 // component indices
75 comp0Idx = FS::comp0Idx,
76 comp1Idx = FS::comp1Idx,
77
78 // phase presence enums
79 secondPhaseOnly = ModelTraits::Indices::secondPhaseOnly,
80 firstPhaseOnly = ModelTraits::Indices::firstPhaseOnly,
81 bothPhases = ModelTraits::Indices::bothPhases,
82
83 // primary variable indices
84 pressureIdx = ModelTraits::Indices::pressureIdx,
85 switchIdx = ModelTraits::Indices::switchIdx
86 };
87
88 static constexpr auto formulation = ModelTraits::priVarFormulation();
89 static constexpr bool setFirstPhaseMoleFractions = ModelTraits::setMoleFractionsForFirstPhase();
90
93
94
95public:
97 using FluidState = typename Traits::FluidState;
99 using FluidSystem = typename Traits::FluidSystem;
101 using SolidState = typename Traits::SolidState;
103 using SolidSystem = typename Traits::SolidSystem;
106
108 static constexpr bool useMoles() { return Traits::ModelTraits::useMoles(); }
110 static constexpr TwoPFormulation priVarFormulation() { return formulation; }
111
112 // check for permissive specifications
113 static_assert(useMoles(), "use moles has to be set true in the 2pnc model");
114 static_assert(ModelTraits::numFluidPhases() == 2, "NumPhases set in the model is not two!");
115 static_assert((formulation == TwoPFormulation::p0s1 || formulation == TwoPFormulation::p1s0), "Chosen TwoPFormulation not supported!");
116
126 template<class ElemSol, class Problem, class Element, class Scv>
127 void update(const ElemSol &elemSol,
128 const Problem &problem,
129 const Element &element,
130 const Scv& scv)
131 {
132 ParentType::update(elemSol, problem, element, scv);
133
134 completeFluidState(elemSol, problem, element, scv, fluidState_, solidState_);
135
137 // calculate the remaining quantities
139 // Second instance of a parameter cache.
140 // Could be avoided if diffusion coefficients also
141 // became part of the fluid state.
142 typename FluidSystem::ParameterCache paramCache;
143 paramCache.updateAll(fluidState_);
144
145 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
146 const auto& matParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
147
148 const int wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol);
149 const int nPhaseIdx = 1 - wPhaseIdx;
150
151 // mobilities -> require wetting phase saturation as parameter!
152 mobility_[wPhaseIdx] = MaterialLaw::krw(matParams, saturation(wPhaseIdx))/fluidState_.viscosity(wPhaseIdx);
153 mobility_[nPhaseIdx] = MaterialLaw::krn(matParams, saturation(wPhaseIdx))/fluidState_.viscosity(nPhaseIdx);
154
155 // binary diffusion coefficients
156 for (unsigned int compJIdx = 0; compJIdx < ModelTraits::numFluidComponents(); ++compJIdx)
157 {
158 if(compJIdx != comp0Idx)
159 setDiffusionCoefficient_( phase0Idx, compJIdx,
160 FluidSystem::binaryDiffusionCoefficient(fluidState_,
161 paramCache,
162 phase0Idx,
163 comp0Idx,
164 compJIdx) );
165 if(compJIdx != comp1Idx)
166 setDiffusionCoefficient_( phase1Idx, compJIdx,
167 FluidSystem::binaryDiffusionCoefficient(fluidState_,
168 paramCache,
169 phase1Idx,
170 comp1Idx,
171 compJIdx) );
172 }
173
174 // calculate the remaining quantities
175 updateSolidVolumeFractions(elemSol, problem, element, scv, solidState_, numFluidComps);
176 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv, solidState_);
177 permeability_ = problem.spatialParams().permeability(element, scv, elemSol);
178 }
179
192 template<class ElemSol, class Problem, class Element, class Scv>
193 void completeFluidState(const ElemSol& elemSol,
194 const Problem& problem,
195 const Element& element,
196 const Scv& scv,
199 {
200 EnergyVolVars::updateTemperature(elemSol, problem, element, scv, fluidState, solidState);
201
202 const auto& priVars = elemSol[scv.localDofIndex()];
203 const auto phasePresence = priVars.state();
204
205 using MaterialLaw = typename Problem::SpatialParams::MaterialLaw;
206 const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
207 const int wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol);
208 fluidState.setWettingPhase(wPhaseIdx);
209
210 // set the saturations
211 if (phasePresence == secondPhaseOnly)
212 {
213 fluidState.setSaturation(phase0Idx, 0.0);
214 fluidState.setSaturation(phase1Idx, 1.0);
215 }
216 else if (phasePresence == firstPhaseOnly)
217 {
218 fluidState.setSaturation(phase0Idx, 1.0);
219 fluidState.setSaturation(phase1Idx, 0.0);
220 }
221 else if (phasePresence == bothPhases)
222 {
223 if (formulation == TwoPFormulation::p0s1)
224 {
225 fluidState.setSaturation(phase1Idx, priVars[switchIdx]);
226 fluidState.setSaturation(phase0Idx, 1 - priVars[switchIdx]);
227 }
228 else
229 {
230 fluidState.setSaturation(phase0Idx, priVars[switchIdx]);
231 fluidState.setSaturation(phase1Idx, 1 - priVars[switchIdx]);
232 }
233 }
234 else
235 DUNE_THROW(Dune::InvalidStateException, "phasePresence: " << phasePresence << " is invalid.");
236
237 // set pressures of the fluid phases
238 pc_ = MaterialLaw::pc(materialParams, fluidState.saturation(wPhaseIdx));
239 if (formulation == TwoPFormulation::p0s1)
240 {
241 fluidState.setPressure(phase0Idx, priVars[pressureIdx]);
242 fluidState.setPressure(phase1Idx, (wPhaseIdx == phase0Idx) ? priVars[pressureIdx] + pc_
243 : priVars[pressureIdx] - pc_);
244 }
245 else
246 {
247 fluidState.setPressure(phase1Idx, priVars[pressureIdx]);
248 fluidState.setPressure(phase0Idx, (wPhaseIdx == phase0Idx) ? priVars[pressureIdx] - pc_
249 : priVars[pressureIdx] + pc_);
250 }
251
252 // calculate the phase compositions
253 typename FluidSystem::ParameterCache paramCache;
254
255 // now comes the tricky part: calculate phase composition
256 if (phasePresence == bothPhases)
257 {
258 // both phases are present, phase composition results from
259 // the first <-> second phase equilibrium. This is the job
260 // of the "MiscibleMultiPhaseComposition" constraint solver
261
262 // set the known mole fractions in the fluidState so that they
263 // can be used by the MiscibleMultiPhaseComposition constraint solver
264
265 const int knownPhaseIdx = setFirstPhaseMoleFractions ? phase0Idx : phase1Idx;
266 for (int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
267 fluidState.setMoleFraction(knownPhaseIdx, compIdx, priVars[compIdx]);
268
270 paramCache,
271 knownPhaseIdx);
272 }
273 else if (phasePresence == secondPhaseOnly)
274 {
275
276 Dune::FieldVector<Scalar, ModelTraits::numFluidComponents()> moleFrac;
277
278 moleFrac[comp0Idx] = priVars[switchIdx];
279 Scalar sumMoleFracOtherComponents = moleFrac[comp0Idx];
280
281 for (int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
282 {
283 moleFrac[compIdx] = priVars[compIdx];
284 sumMoleFracOtherComponents += moleFrac[compIdx];
285 }
286
287 moleFrac[comp1Idx] = 1 - sumMoleFracOtherComponents;
288
289 // Set fluid state mole fractions
290 for (int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
291 fluidState.setMoleFraction(phase1Idx, compIdx, moleFrac[compIdx]);
292
293 // calculate the composition of the remaining phases (as
294 // well as the densities of all phases). this is the job
295 // of the "ComputeFromReferencePhase" constraint solver
297 paramCache,
298 phase1Idx);
299 }
300 else if (phasePresence == firstPhaseOnly)
301 {
302 // only the first phase is present, i.e. first phase composition
303 // is stored explicitly. extract _mass_ fractions in the second phase
304 Dune::FieldVector<Scalar, ModelTraits::numFluidComponents()> moleFrac;
305
306 moleFrac[comp1Idx] = priVars[switchIdx];
307 Scalar sumMoleFracOtherComponents = moleFrac[comp1Idx];
308 for (int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
309 {
310 moleFrac[compIdx] = priVars[compIdx];
311
312 sumMoleFracOtherComponents += moleFrac[compIdx];
313 }
314
315 moleFrac[comp0Idx] = 1 - sumMoleFracOtherComponents;
316
317 // convert mass to mole fractions and set the fluid state
318 for (int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
319 fluidState.setMoleFraction(phase0Idx, compIdx, moleFrac[compIdx]);
320
321 // calculate the composition of the remaining phases (as
322 // well as the densities of all phases). this is the job
323 // of the "ComputeFromReferencePhase" constraint solver
325 paramCache,
326 phase0Idx);
327 }
328 paramCache.updateAll(fluidState);
329 for (int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
330 {
331 Scalar rho = FluidSystem::density(fluidState, paramCache, phaseIdx);
332 Scalar rhoMolar = FluidSystem::molarDensity(fluidState, paramCache, phaseIdx);
333 Scalar mu = FluidSystem::viscosity(fluidState, paramCache, phaseIdx);
334 Scalar h = EnergyVolVars::enthalpy(fluidState, paramCache, phaseIdx);
335
336 fluidState.setDensity(phaseIdx, rho);
337 fluidState.setMolarDensity(phaseIdx, rhoMolar);
338 fluidState.setViscosity(phaseIdx, mu);
339 fluidState.setEnthalpy(phaseIdx, h);
340 }
341 }
342
346 const FluidState &fluidState() const
347 { return fluidState_; }
348
352 const SolidState &solidState() const
353 { return solidState_; }
354
360 Scalar averageMolarMass(int phaseIdx) const
361 { return fluidState_.averageMolarMass(phaseIdx); }
362
369 Scalar saturation(int phaseIdx) const
370 { return fluidState_.saturation(phaseIdx); }
371
378 Scalar density(int phaseIdx) const
379 { return fluidState_.density(phaseIdx); }
380
387 Scalar viscosity(int phaseIdx) const
388 { return fluidState_.viscosity(phaseIdx); }
389
396 Scalar molarDensity(int phaseIdx) const
397 {
398 if (phaseIdx < ModelTraits::numFluidPhases())
399 return fluidState_.molarDensity(phaseIdx);
400
401 else
402 DUNE_THROW(Dune::InvalidStateException, "Invalid phase index " << phaseIdx);
403 }
404
411 Scalar pressure(int phaseIdx) const
412 { return fluidState_.pressure(phaseIdx); }
413
421 Scalar temperature() const
422 { return fluidState_.temperature(/*phaseIdx=*/0); }
423
430 Scalar mobility(int phaseIdx) const
431 { return mobility_[phaseIdx]; }
432
437 Scalar capillaryPressure() const
438 { return pc_; }
439
443 Scalar porosity() const
444 { return solidState_.porosity(); }
445
449 const PermeabilityType& permeability() const
450 { return permeability_; }
451
452
456 Scalar diffusionCoefficient(int phaseIdx, int compIdx) const
457 {
458 if (compIdx < phaseIdx)
459 return diffCoefficient_[phaseIdx][compIdx];
460 else if (compIdx > phaseIdx)
461 return diffCoefficient_[phaseIdx][compIdx-1];
462 else
463 DUNE_THROW(Dune::InvalidStateException, "Diffusion coefficient called for phaseIdx = compIdx");
464 }
465
472 Scalar massFraction(int phaseIdx, int compIdx) const
473 { return fluidState_.massFraction(phaseIdx, compIdx); }
474
481 Scalar moleFraction(int phaseIdx, int compIdx) const
482 { return fluidState_.moleFraction(phaseIdx, compIdx); }
483
484protected:
487
488private:
489 void setDiffusionCoefficient_(int phaseIdx, int compIdx, Scalar d)
490 {
491 if (compIdx < phaseIdx)
492 diffCoefficient_[phaseIdx][compIdx] = std::move(d);
493 else if (compIdx > phaseIdx)
494 diffCoefficient_[phaseIdx][compIdx-1] = std::move(d);
495 else
496 DUNE_THROW(Dune::InvalidStateException, "Diffusion coefficient for phaseIdx = compIdx doesn't exist");
497 }
498
499 Scalar pc_; // The capillary pressure
500 Scalar porosity_; // Effective porosity within the control volume
501 PermeabilityType permeability_; // Effective permeability within the control volume
502 Scalar mobility_[ModelTraits::numFluidPhases()]; // Effective mobility within the control volume
503 std::array<std::array<Scalar, ModelTraits::numFluidComponents()-1>, ModelTraits::numFluidPhases()> diffCoefficient_;
504
505};
506
507} // end namespace Dumux
508
509#endif
Define some often used mathematical functions.
The available discretization methods in Dumux.
Computes all quantities of a generic fluid state if a reference phase has been specified.
Computes the composition of all phases of a N-phase, N-component fluid system assuming that all N pha...
Represents all relevant thermodynamic quantities of a multi-phase, multi-component fluid system assum...
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
make the local view function available whenever we use the grid geometry
Definition: adapt.hh:29
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
Computes all quantities of a generic fluid state if a reference phase has been specified.
Definition: computefromreferencephase.hh:77
static void solve(FluidState &fluidState, ParameterCache &paramCache, int refPhaseIdx)
Computes all quantities of a generic fluid state if a reference phase has been specified.
Definition: computefromreferencephase.hh:112
Computes the composition of all phases of a N-phase, N-component fluid system assuming that all N pha...
Definition: misciblemultiphasecomposition.hh:60
static void solve(FluidState &fluidState, ParameterCache &paramCache, int knownPhaseIdx=0)
Computes the composition of all phases of a N-phase, N-component fluid system assuming that all N pha...
Definition: misciblemultiphasecomposition.hh:82
The primary variable switch controlling the phase presence state variable.
Definition: 2pnc/primaryvariableswitch.hh:41
Contains the quantities which are are constant within a finite volume in the two-phase,...
Definition: porousmediumflow/2pnc/volumevariables.hh:58
Scalar porosity() const
Returns the average porosity within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:443
Scalar molarDensity(int phaseIdx) const
Returns the molar density of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:396
static constexpr TwoPFormulation priVarFormulation()
Return the two-phase formulation used here.
Definition: porousmediumflow/2pnc/volumevariables.hh:110
Scalar viscosity(int phaseIdx) const
Returns the kinematic viscosity of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:387
Scalar capillaryPressure() const
Returns the effective capillary pressure within the control volume in .
Definition: porousmediumflow/2pnc/volumevariables.hh:437
Scalar density(int phaseIdx) const
Returns the mass density of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:378
void update(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv)
Updates all quantities for a given control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:127
const SolidState & solidState() const
Returns the phase state for the control-volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:352
Scalar moleFraction(int phaseIdx, int compIdx) const
Returns the mole fraction of a component in the phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:481
typename Traits::SolidState SolidState
Export type of solid state.
Definition: porousmediumflow/2pnc/volumevariables.hh:101
Scalar saturation(int phaseIdx) const
Returns the saturation of a given phase within the control volume in .
Definition: porousmediumflow/2pnc/volumevariables.hh:369
typename Traits::SolidSystem SolidSystem
Export type of solid system.
Definition: porousmediumflow/2pnc/volumevariables.hh:103
const PermeabilityType & permeability() const
Returns the permeability within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:449
Scalar temperature() const
Returns temperature inside the sub-control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:421
Scalar averageMolarMass(int phaseIdx) const
Returns the average molar mass of the fluid phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:360
Scalar diffusionCoefficient(int phaseIdx, int compIdx) const
Returns the diffusion coefficient.
Definition: porousmediumflow/2pnc/volumevariables.hh:456
SolidState solidState_
Definition: porousmediumflow/2pnc/volumevariables.hh:486
FluidState fluidState_
Definition: porousmediumflow/2pnc/volumevariables.hh:485
typename Traits::FluidSystem FluidSystem
Export fluid system type.
Definition: porousmediumflow/2pnc/volumevariables.hh:99
typename Traits::FluidState FluidState
Export fluid state type.
Definition: porousmediumflow/2pnc/volumevariables.hh:97
void completeFluidState(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv, FluidState &fluidState, SolidState &solidState)
Sets complete fluid state.
Definition: porousmediumflow/2pnc/volumevariables.hh:193
Scalar massFraction(int phaseIdx, int compIdx) const
Returns the mass fraction of a component in the phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:472
Scalar pressure(int phaseIdx) const
Returns the effective pressure of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:411
static constexpr bool useMoles()
Return whether moles or masses are balanced.
Definition: porousmediumflow/2pnc/volumevariables.hh:108
Scalar mobility(int phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:430
const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:346
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.