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;
102 using Indices =
typename ModelTraits::Indices;
111 static constexpr bool useMoles() {
return Traits::ModelTraits::useMoles(); }
116 static_assert(
useMoles(),
"use moles has to be set true in the 2pnc model");
117 static_assert(ModelTraits::numFluidPhases() == 2,
"NumPhases set in the model is not two!");
129 template<
class ElemSol,
class Problem,
class Element,
class Scv>
131 const Problem &problem,
132 const Element &element,
143 const auto& spatialParams = problem.spatialParams();
144 const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
147 const int nPhaseIdx = 1 - wPhaseIdx;
150 mobility_[wPhaseIdx] = fluidMatrixInteraction.krw(
saturation(wPhaseIdx))/
fluidState_.viscosity(wPhaseIdx);
151 mobility_[nPhaseIdx] = fluidMatrixInteraction.krn(
saturation(wPhaseIdx))/
fluidState_.viscosity(nPhaseIdx);
156 auto getEffectiveDiffusionCoefficient = [&](
int phaseIdx,
int compIIdx,
int compJIdx)
158 return EffDiffModel::effectiveDiffusionCoefficient(*
this, phaseIdx, compIIdx, compJIdx);
161 effectiveDiffCoeff_.update(getEffectiveDiffusionCoefficient);
164 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv,
solidState_);
165 permeability_ = spatialParams.permeability(element, scv, elemSol);
166 EnergyVolVars::updateEffectiveThermalConductivity();
181 template<
class ElemSol,
class Problem,
class Element,
class Scv>
183 const Problem& problem,
184 const Element& element,
191 const auto&
priVars = elemSol[scv.localDofIndex()];
194 const auto& spatialParams = problem.spatialParams();
195 const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
196 const auto wPhaseIdx = spatialParams.template wettingPhase<FluidSystem>(element, scv, elemSol);
224 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " <<
phasePresence <<
" is invalid.");
227 pc_ = fluidMatrixInteraction.pc(
fluidState.saturation(wPhaseIdx));
231 fluidState.setPressure(phase1Idx, (wPhaseIdx == phase0Idx) ?
priVars[pressureIdx] + pc_
237 fluidState.setPressure(phase0Idx, (wPhaseIdx == phase0Idx) ?
priVars[pressureIdx] - pc_
242 typename FluidSystem::ParameterCache paramCache;
254 const int knownPhaseIdx = setFirstPhaseMoleFractions ? phase0Idx : phase1Idx;
255 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
264 Dune::FieldVector<Scalar, ModelTraits::numFluidComponents()> moleFrac;
266 moleFrac[comp0Idx] =
priVars[switchIdx];
267 Scalar sumMoleFracOtherComponents = moleFrac[comp0Idx];
269 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
271 moleFrac[compIdx] =
priVars[compIdx];
272 sumMoleFracOtherComponents += moleFrac[compIdx];
275 moleFrac[comp1Idx] = 1 - sumMoleFracOtherComponents;
278 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
279 fluidState.setMoleFraction(phase1Idx, compIdx, moleFrac[compIdx]);
292 Dune::FieldVector<Scalar, ModelTraits::numFluidComponents()> moleFrac;
294 moleFrac[comp1Idx] =
priVars[switchIdx];
295 Scalar sumMoleFracOtherComponents = moleFrac[comp1Idx];
296 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
298 moleFrac[compIdx] =
priVars[compIdx];
300 sumMoleFracOtherComponents += moleFrac[compIdx];
303 moleFrac[comp0Idx] = 1 - sumMoleFracOtherComponents;
306 for (
int compIdx = 0; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
307 fluidState.setMoleFraction(phase0Idx, compIdx, moleFrac[compIdx]);
317 for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
322 Scalar h = EnergyVolVars::enthalpy(
fluidState, paramCache, phaseIdx);
325 fluidState.setMolarDensity(phaseIdx, rhoMolar);
386 if (phaseIdx < ModelTraits::numFluidPhases())
390 DUNE_THROW(Dune::InvalidStateException,
"Invalid phase index " << phaseIdx);
419 {
return mobility_[phaseIdx]; }
438 {
return permeability_; }
445 typename FluidSystem::ParameterCache paramCache;
447 return FluidSystem::binaryDiffusionCoefficient(
fluidState_, paramCache, phaseIdx, compIIdx, compJIdx);
454 {
return effectiveDiffCoeff_(phaseIdx, compIIdx, compJIdx); }
463 {
return fluidState_.massFraction(phaseIdx, compIdx); }
472 {
return fluidState_.moleFraction(phaseIdx, compIdx); }
488 PermeabilityType permeability_;
489 Scalar mobility_[ModelTraits::numFluidPhases()];
490 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:76
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:111
Computes the composition of all phases of a N-phase, N-component fluid system assuming that all N pha...
Definition: misciblemultiphasecomposition.hh:59
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:81
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:431
Scalar diffusionCoefficient(int phaseIdx, int compIIdx, int compJIdx) const
Returns the binary diffusion coefficients for a phase in .
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:384
static constexpr TwoPFormulation priVarFormulation()
Return the two-phase formulation used here.
Definition: porousmediumflow/2pnc/volumevariables.hh:113
Scalar viscosity(int phaseIdx) const
Returns the kinematic viscosity of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:375
Scalar capillaryPressure() const
Returns the effective capillary pressure within the control volume in .
Definition: porousmediumflow/2pnc/volumevariables.hh:425
Scalar density(int phaseIdx) const
Returns the mass density of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:366
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:130
const SolidState & solidState() const
Returns the phase state for the control-volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:340
Scalar moleFraction(int phaseIdx, int compIdx) const
Returns the mole fraction of a component in the phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:471
typename ModelTraits::Indices Indices
Export the indices.
Definition: porousmediumflow/2pnc/volumevariables.hh:102
typename Traits::SolidState SolidState
Export type of solid state.
Definition: porousmediumflow/2pnc/volumevariables.hh:104
Scalar saturation(int phaseIdx) const
Returns the saturation of a given phase within the control volume in .
Definition: porousmediumflow/2pnc/volumevariables.hh:357
typename Traits::SolidSystem SolidSystem
Export type of solid system.
Definition: porousmediumflow/2pnc/volumevariables.hh:106
const PermeabilityType & permeability() const
Returns the permeability within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:437
Scalar effectiveDiffusionCoefficient(int phaseIdx, int compIIdx, int compJIdx) const
Returns the effective diffusion coefficients for a phase in .
Definition: porousmediumflow/2pnc/volumevariables.hh:453
Scalar temperature() const
Returns temperature inside the sub-control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:409
Scalar averageMolarMass(int phaseIdx) const
Returns the average molar mass of the fluid phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:348
SolidState solidState_
Definition: porousmediumflow/2pnc/volumevariables.hh:482
FluidState fluidState_
Definition: porousmediumflow/2pnc/volumevariables.hh:481
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:182
int wettingPhase() const
Returns the wetting phase index.
Definition: porousmediumflow/2pnc/volumevariables.hh:477
Scalar massFraction(int phaseIdx, int compIdx) const
Returns the mass fraction of a component in the phase.
Definition: porousmediumflow/2pnc/volumevariables.hh:462
Scalar pressure(int phaseIdx) const
Returns the effective pressure of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:399
static constexpr bool useMoles()
Return whether moles or masses are balanced.
Definition: porousmediumflow/2pnc/volumevariables.hh:111
Scalar mobility(int phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:418
const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: porousmediumflow/2pnc/volumevariables.hh:334
Definition: porousmediumflow/nonisothermal/volumevariables.hh:76
The isothermal base class.
Definition: porousmediumflow/volumevariables.hh:42
static constexpr int numFluidComponents()
Return number of components considered by the model.
Definition: porousmediumflow/volumevariables.hh:54
const PrimaryVariables & priVars() const
Returns the vector of primary variables.
Definition: porousmediumflow/volumevariables.hh:78
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:66
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.