26#ifndef DUMUX_2PNC_VOLUME_VARIABLES_HH
27#define DUMUX_2PNC_VOLUME_VARIABLES_HH
54template <
class Traits>
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;
68 numMajorComponents = ModelTraits::numFluidPhases(),
71 phase0Idx = FS::phase0Idx,
72 phase1Idx = FS::phase1Idx,
75 comp0Idx = FS::comp0Idx,
76 comp1Idx = FS::comp1Idx,
79 secondPhaseOnly = ModelTraits::Indices::secondPhaseOnly,
80 firstPhaseOnly = ModelTraits::Indices::firstPhaseOnly,
81 bothPhases = ModelTraits::Indices::bothPhases,
84 pressureIdx = ModelTraits::Indices::pressureIdx,
85 switchIdx = ModelTraits::Indices::switchIdx
88 static constexpr auto formulation = ModelTraits::priVarFormulation();
89 static constexpr bool setFirstPhaseMoleFractions = ModelTraits::setMoleFractionsForFirstPhase();
93 using EffDiffModel =
typename Traits::EffectiveDiffusivityModel;
94 using DiffusionCoefficients =
typename Traits::DiffusionType::DiffusionCoefficientsContainer;
109 static constexpr bool useMoles() {
return Traits::ModelTraits::useMoles(); }
114 static_assert(
useMoles(),
"use moles has to be set true in the 2pnc model");
115 static_assert(ModelTraits::numFluidPhases() == 2,
"NumPhases set in the model is not two!");
127 template<
class ElemSol,
class Problem,
class Element,
class Scv>
129 const Problem &problem,
130 const Element &element,
141 using MaterialLaw =
typename Problem::SpatialParams::MaterialLaw;
142 const auto& matParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
144 const int nPhaseIdx = 1 - wPhaseIdx;
147 mobility_[wPhaseIdx] = MaterialLaw::krw(matParams,
saturation(wPhaseIdx))/
fluidState_.viscosity(wPhaseIdx);
148 mobility_[nPhaseIdx] = MaterialLaw::krn(matParams,
saturation(wPhaseIdx))/
fluidState_.viscosity(nPhaseIdx);
153 auto getEffectiveDiffusionCoefficient = [&](
int phaseIdx,
int compIIdx,
int compJIdx)
155 return EffDiffModel::effectiveDiffusionCoefficient(*
this, phaseIdx, compIIdx, compJIdx);
158 effectiveDiffCoeff_.update(getEffectiveDiffusionCoefficient);
161 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv,
solidState_);
162 permeability_ = problem.spatialParams().permeability(element, scv, elemSol);
163 EnergyVolVars::updateEffectiveThermalConductivity();
178 template<
class ElemSol,
class Problem,
class Element,
class Scv>
180 const Problem& problem,
181 const Element& element,
188 const auto&
priVars = elemSol[scv.localDofIndex()];
191 using MaterialLaw =
typename Problem::SpatialParams::MaterialLaw;
192 const auto& materialParams = problem.spatialParams().materialLawParams(element, scv, elemSol);
193 const auto wPhaseIdx = problem.spatialParams().template wettingPhase<FluidSystem>(element, scv, elemSol);
221 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " <<
phasePresence <<
" is invalid.");
224 pc_ = MaterialLaw::pc(materialParams,
fluidState.saturation(wPhaseIdx));
228 fluidState.setPressure(phase1Idx, (wPhaseIdx == phase0Idx) ?
priVars[pressureIdx] + pc_
234 fluidState.setPressure(phase0Idx, (wPhaseIdx == phase0Idx) ?
priVars[pressureIdx] - pc_
239 typename FluidSystem::ParameterCache paramCache;
251 const int knownPhaseIdx = setFirstPhaseMoleFractions ? phase0Idx : phase1Idx;
252 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
262 Dune::FieldVector<Scalar, ModelTraits::numFluidComponents()> moleFrac;
264 moleFrac[comp0Idx] =
priVars[switchIdx];
265 Scalar sumMoleFracOtherComponents = moleFrac[comp0Idx];
267 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
269 moleFrac[compIdx] =
priVars[compIdx];
270 sumMoleFracOtherComponents += moleFrac[compIdx];
273 moleFrac[comp1Idx] = 1 - sumMoleFracOtherComponents;
276 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
277 fluidState.setMoleFraction(phase1Idx, compIdx, moleFrac[compIdx]);
290 Dune::FieldVector<Scalar, ModelTraits::numFluidComponents()> moleFrac;
292 moleFrac[comp1Idx] =
priVars[switchIdx];
293 Scalar sumMoleFracOtherComponents = moleFrac[comp1Idx];
294 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
296 moleFrac[compIdx] =
priVars[compIdx];
298 sumMoleFracOtherComponents += moleFrac[compIdx];
301 moleFrac[comp0Idx] = 1 - sumMoleFracOtherComponents;
304 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
305 fluidState.setMoleFraction(phase0Idx, compIdx, moleFrac[compIdx]);
315 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
320 Scalar h = EnergyVolVars::enthalpy(
fluidState, paramCache, phaseIdx);
323 fluidState.setMolarDensity(phaseIdx, rhoMolar);
384 if (phaseIdx < ModelTraits::numFluidPhases())
388 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index " << phaseIdx);
417 {
return mobility_[phaseIdx]; }
436 {
return permeability_; }
442 [[deprecated(
"Will be removed after release 3.2. Use diffusionCoefficient(phaseIdx, compIIdx, compJIdx)!")]]
445 if (compIdx != phaseIdx)
448 DUNE_THROW(Dune::InvalidStateException,
"Diffusion coefficient called for phaseIdx = compIdx");
456 typename FluidSystem::ParameterCache paramCache;
458 return FluidSystem::binaryDiffusionCoefficient(
fluidState_, paramCache, phaseIdx, compIIdx, compJIdx);
465 {
return effectiveDiffCoeff_(phaseIdx, compIIdx, compJIdx); }
474 {
return fluidState_.massFraction(phaseIdx, compIdx); }
483 {
return fluidState_.moleFraction(phaseIdx, compIdx); }
499 PermeabilityType permeability_;
500 Scalar mobility_[ModelTraits::numFluidPhases()];
501 DiffusionCoefficients effectiveDiffCoeff_;
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
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 ¶mCache, 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 ¶mCache, 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:429
Scalar diffusionCoefficient(int phaseIdx, int compIIdx, int compJIdx) const
Returns the binary diffusion coefficients for a phase in .
Definition: porousmediumflow/2pnc/volumevariables.hh:454
Scalar molarDensity(int phaseIdx) const
Returns the molar density of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:382
static constexpr TwoPFormulation priVarFormulation()
Return the two-phase formulation used here.
Definition: porousmediumflow/2pnc/volumevariables.hh:111
Scalar viscosity(int phaseIdx) const
Returns the kinematic viscosity of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:373
Scalar capillaryPressure() const
Returns the effective capillary pressure within the control volume in .
Definition: porousmediumflow/2pnc/volumevariables.hh:423
Scalar density(int phaseIdx) const
Returns the mass density of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:364
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:128
const SolidState & solidState() const
Returns the phase state for the control-volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:338
Scalar moleFraction(int phaseIdx, int compIdx) const
Returns the mole fraction of a component in the phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:482
typename Traits::SolidState SolidState
Export type of solid state.
Definition: porousmediumflow/2pnc/volumevariables.hh:102
Scalar saturation(int phaseIdx) const
Returns the saturation of a given phase within the control volume in .
Definition: porousmediumflow/2pnc/volumevariables.hh:355
typename Traits::SolidSystem SolidSystem
Export type of solid system.
Definition: porousmediumflow/2pnc/volumevariables.hh:104
const PermeabilityType & permeability() const
Returns the permeability within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:435
Scalar effectiveDiffusionCoefficient(int phaseIdx, int compIIdx, int compJIdx) const
Returns the effective diffusion coefficients for a phase in .
Definition: porousmediumflow/2pnc/volumevariables.hh:464
Scalar temperature() const
Returns temperature inside the sub-control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:407
Scalar averageMolarMass(int phaseIdx) const
Returns the average molar mass of the fluid phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:346
Scalar diffusionCoefficient(int phaseIdx, int compIdx) const
Returns the diffusion coefficient.
Definition: porousmediumflow/2pnc/volumevariables.hh:443
SolidState solidState_
Definition: porousmediumflow/2pnc/volumevariables.hh:493
FluidState fluidState_
Definition: porousmediumflow/2pnc/volumevariables.hh:492
typename Traits::FluidSystem FluidSystem
Export fluid system type.
Definition: porousmediumflow/2pnc/volumevariables.hh:100
typename Traits::FluidState FluidState
Export fluid state type.
Definition: porousmediumflow/2pnc/volumevariables.hh:98
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:179
int wettingPhase() const
Returns the wetting phase index.
Definition: porousmediumflow/2pnc/volumevariables.hh:488
Scalar massFraction(int phaseIdx, int compIdx) const
Returns the mass fraction of a component in the phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:473
Scalar pressure(int phaseIdx) const
Returns the effective pressure of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:397
static constexpr bool useMoles()
Return whether moles or masses are balanced.
Definition: porousmediumflow/2pnc/volumevariables.hh:109
Scalar mobility(int phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:416
const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:332
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.