13#ifndef DUMUX_2P1C_VOLUME_VARIABLES_HH
14#define DUMUX_2P1C_VOLUME_VARIABLES_HH
18#include <dune/common/exceptions.hh>
33template <
class Traits>
40 using Scalar =
typename Traits::PrimaryVariables::value_type;
41 using PermeabilityType =
typename Traits::PermeabilityType;
42 using FS =
typename Traits::FluidSystem;
43 using Idx =
typename Traits::ModelTraits::Indices;
49 numFluidPhases = Traits::ModelTraits::numFluidPhases(),
50 switchIdx = Idx::switchIdx,
51 pressureIdx = Idx::pressureIdx
57 comp0Idx = FS::comp0Idx,
58 liquidPhaseIdx = FS::liquidPhaseIdx,
59 gasPhaseIdx = FS::gasPhaseIdx
65 twoPhases = Idx::twoPhases,
66 liquidPhaseOnly = Idx::liquidPhaseOnly,
67 gasPhaseOnly = Idx::gasPhaseOnly,
71 static constexpr auto formulation = Traits::ModelTraits::priVarFormulation();
79 using Indices =
typename Traits::ModelTraits::Indices;
91 static_assert(Traits::ModelTraits::numFluidPhases() == 2,
"NumPhases set in the model is not two!");
92 static_assert(Traits::ModelTraits::numFluidComponents() == 1,
"NumComponents set in the model is not one!");
104 template<
class ElemSol,
class Problem,
class Element,
class Scv>
106 const Problem &problem,
107 const Element &element,
118 const auto& spatialParams = problem.spatialParams();
119 const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
124 typename FluidSystem::ParameterCache paramCache;
127 for (
int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
131 if (phaseIdx == wPhaseIdx)
132 kr = fluidMatrixInteraction.krw(
saturation(wPhaseIdx));
135 kr = fluidMatrixInteraction.krn(
saturation(wPhaseIdx));
136 relativePermeability_[phaseIdx] = kr;
142 EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv,
solidState_);
143 permeability_ = spatialParams.permeability(element, scv, elemSol);
144 EnergyVolVars::updateEffectiveThermalConductivity();
158 template<
class ElemSol,
class Problem,
class Element,
class Scv>
160 const Problem& problem,
161 const Element& element,
168 const auto& spatialParams = problem.spatialParams();
169 const auto wPhaseIdx = spatialParams.template wettingPhase<FluidSystem>(element, scv, elemSol);
172 const auto&
priVars = elemSol[scv.localDofIndex()];
191 fluidState.setSaturation(liquidPhaseIdx, 1.0);
196 fluidState.setSaturation(liquidPhaseIdx, 0.0);
200 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " <<
phasePresence <<
" is invalid.");
203 const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
204 pc_ = fluidMatrixInteraction.pc(
fluidState.saturation(wPhaseIdx));
208 fluidState.setPressure(gasPhaseIdx, (wPhaseIdx == liquidPhaseIdx) ?
priVars[pressureIdx] + pc_
214 fluidState.setPressure(liquidPhaseIdx, (wPhaseIdx == liquidPhaseIdx) ?
priVars[pressureIdx] - pc_
222 for (
int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
228 fluidState.setMolarDensity(phaseIdx, rhoMolar);
232 for (
int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
242 for (
int phaseIdx = 0; phaseIdx < numFluidPhases; ++phaseIdx)
244 const Scalar h = FluidSystem::enthalpy(
fluidState, phaseIdx);
251 template<
class ElemSol,
class Problem,
class Element,
class Scv>
253 const Problem& problem,
254 const Element& element,
259 const auto&
priVars = elemSol[scv.localDofIndex()];
269 DUNE_THROW(Dune::InvalidStateException,
"phasePresence: " <<
phasePresence <<
" is invalid.");
272 for (
int phaseIdx=0; phaseIdx < FluidSystem::numPhases; ++phaseIdx)
276 if (Traits::ModelTraits::numEnergyEq() == 1)
280 const Scalar
solidTemperature = elemSol[scv.localDofIndex()][Traits::ModelTraits::numEq()-1];
359 return relativePermeability_[phaseIdx]/
fluidState_.viscosity(phaseIdx);
379 {
return permeability_; }
385 {
return FluidSystem::vaporTemperature(
fluidState_, liquidPhaseIdx);}
399 PermeabilityType permeability_;
402 std::array<Scalar, numFluidPhases> relativePermeability_;
Definition: porousmediumflow/nonisothermal/volumevariables.hh:63
The isothermal base class.
Definition: porousmediumflow/volumevariables.hh:28
static constexpr int numFluidComponents()
Return number of components considered by the model.
Definition: porousmediumflow/volumevariables.hh:40
const PrimaryVariables & priVars() const
Returns the vector of primary variables.
Definition: porousmediumflow/volumevariables.hh:64
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:52
The primary variable switch for the two-phase one-component model.
Definition: 2p1c/primaryvariableswitch.hh:29
The volume variables (i.e. secondary variables) for the two-phase one-component model.
Definition: porousmediumflow/2p1c/volumevariables.hh:37
Scalar saturation(const int phaseIdx) const
Returns the effective saturation of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:311
typename Traits::FluidSystem FluidSystem
The type of the fluid system.
Definition: porousmediumflow/2p1c/volumevariables.hh:77
const PermeabilityType & permeability() const
Returns the average permeability within the control volume in .
Definition: porousmediumflow/2p1c/volumevariables.hh:378
Scalar density(const int phaseIdx) const
Returns the mass density of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:320
Scalar temperature(const int phaseIdx=0) const
Returns temperature inside the sub-control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:348
typename Traits::FluidState FluidState
The type of the object returned by the fluidState() method.
Definition: porousmediumflow/2p1c/volumevariables.hh:75
const FluidState & fluidState() const
Returns the fluid state for the control-volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:288
Scalar averageMolarMass(int phaseIdx) const
Returns the average molar mass of the fluid phase.
Definition: porousmediumflow/2p1c/volumevariables.hh:302
Scalar vaporTemperature() const
Returns the vapor temperature of the fluid within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:384
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:159
Scalar molarDensity(const int phaseIdx) const
Returns the molar density of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:329
FluidState fluidState_
Definition: porousmediumflow/2p1c/volumevariables.hh:394
typename Traits::SolidSystem SolidSystem
Export type of solid system.
Definition: porousmediumflow/2p1c/volumevariables.hh:83
Scalar capillaryPressure() const
Returns the effective capillary pressure within the control volume in .
Definition: porousmediumflow/2p1c/volumevariables.hh:366
void updateTemperature(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv, FluidState &fluidState, SolidState &solidState)
Definition: porousmediumflow/2p1c/volumevariables.hh:252
typename Traits::ModelTraits::Indices Indices
The type of the indices.
Definition: porousmediumflow/2p1c/volumevariables.hh:79
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:105
Scalar porosity() const
Returns the average porosity within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:372
typename Traits::SolidState SolidState
Export type of solid state.
Definition: porousmediumflow/2p1c/volumevariables.hh:81
Scalar mobility(const int phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:357
const SolidState & solidState() const
Returns the phase state for the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:294
int wettingPhase() const
Returns the wetting phase index.
Definition: porousmediumflow/2p1c/volumevariables.hh:390
static constexpr TwoPFormulation priVarFormulation()
Return the two-phase formulation used here.
Definition: porousmediumflow/2p1c/volumevariables.hh:88
Scalar pressure(const int phaseIdx) const
Returns the effective pressure of a given phase within the control volume.
Definition: porousmediumflow/2p1c/volumevariables.hh:338
SolidState solidState_
Definition: porousmediumflow/2p1c/volumevariables.hh:395
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:24
TwoPFormulation
Enumerates the formulations which the two-phase model accepts.
Definition: formulation.hh:23
@ p1s0
first phase saturation and second phase pressure as primary variables
@ p0s1
first phase pressure and second phase saturation as primary variables
std::string solidTemperature() noexcept
I/O name of solid temperature for non-equilibrium models.
Definition: name.hh:48
std::string phasePresence() noexcept
I/O name of phase presence.
Definition: name.hh:135
std::string viscosity(int phaseIdx) noexcept
I/O name of viscosity for multiphase systems.
Definition: name.hh:62
std::string molarDensity(int phaseIdx) noexcept
I/O name of molar density for multiphase systems.
Definition: name.hh:71
std::string density(int phaseIdx) noexcept
I/O name of density for multiphase systems.
Definition: name.hh:53
std::string fluidTemperature(int phaseIdx) noexcept
I/O name of temperature for non-equilibrium models.
Definition: name.hh:44
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.
Update the solid volume fractions (inert and reacitve) and set them in the solidstate.