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()];
192 const auto phasePresence =
priVars.state();
194 const auto& spatialParams = problem.spatialParams();
195 const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
200 if (phasePresence == secondPhaseOnly)
205 else if (phasePresence == firstPhaseOnly)
210 else if (phasePresence == bothPhases)
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;
245 if (phasePresence == bothPhases)
254 const int knownPhaseIdx = setFirstPhaseMoleFractions ? phase0Idx : phase1Idx;
255 for (
int compIdx = numMajorComponents; compIdx < ModelTraits::numFluidComponents(); ++compIdx)
262 else if (phasePresence == secondPhaseOnly)
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]);
288 else if (phasePresence == firstPhaseOnly)
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)
319 Scalar rho = FluidSystem::density(
fluidState, paramCache, phaseIdx);
320 Scalar rhoMolar = FluidSystem::molarDensity(
fluidState, paramCache, phaseIdx);
321 Scalar mu = FluidSystem::viscosity(
fluidState, paramCache, 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
Definition formulation.hh:37
@ p0s1
first phase pressure and second phase saturation as primary variables
Definition formulation.hh:36
EnergyVolumeVariablesImplementation< IsothermalTraits, Impl, IsothermalTraits::ModelTraits::enableEnergyBalance()> EnergyVolumeVariables
Base class for the model specific class which provides access to all volume averaged quantities.
Definition porousmediumflow/nonisothermal/volumevariables.hh:85
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
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)
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)
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
TwoPNCPrimaryVariableSwitch PrimaryVariableSwitch
Definition porousmediumflow/2pnc/volumevariables.hh:108
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
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
Definition porousmediumflow/2pnc/volumevariables.hh:102
typename NCTraits< BaseTraits, DT, EDM >::SolidState SolidState
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 NCTraits< BaseTraits, DT, EDM >::SolidSystem SolidSystem
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 NCTraits< BaseTraits, DT, EDM >::FluidSystem FluidSystem
Definition porousmediumflow/2pnc/volumevariables.hh:100
typename NCTraits< BaseTraits, DT, EDM >::FluidState FluidState
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
Definition porousmediumflow/2pnc/volumevariables.hh:334
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
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 2pnc model.