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();
 
  172        const auto& 
priVars = elemSol[scv.localDofIndex()];
 
  173        const auto phasePresence = 
priVars.state();
 
  176        if (phasePresence == twoPhases)
 
  189        else if (phasePresence == liquidPhaseOnly)
 
  191            fluidState.setSaturation(liquidPhaseIdx, 1.0);
 
  194        else if (phasePresence == gasPhaseOnly)
 
  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)
 
  224            Scalar rho = FluidSystem::density(
fluidState, phaseIdx);
 
  225            Scalar rhoMolar = FluidSystem::molarDensity(
fluidState, 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()];
 
  260        const auto phasePresence = 
priVars.state();
 
  263        Scalar fluidTemperature;
 
  264        if (phasePresence == liquidPhaseOnly || phasePresence == gasPhaseOnly)
 
  265            fluidTemperature = 
priVars[switchIdx];
 
  266        else if (phasePresence == twoPhases)
 
  269            DUNE_THROW(Dune::InvalidStateException, 
"phasePresence: " << phasePresence << 
" is invalid.");
 
  272        for (
int phaseIdx=0; phaseIdx < FluidSystem::numPhases; ++phaseIdx)
 
  273            fluidState.setTemperature(phaseIdx, fluidTemperature);
 
  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_;
 
 
The primary variable switch for the two-phase one-component model.
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
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 NITraits< BaseTraits, ETCM >::FluidSystem FluidSystem
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
TwoPOneCPrimaryVariableSwitch PrimaryVariableSwitch
Definition porousmediumflow/2p1c/volumevariables.hh:85
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 NITraits< BaseTraits, ETCM >::FluidState FluidState
Definition porousmediumflow/2p1c/volumevariables.hh:75
const FluidState & fluidState() const
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 NITraits< BaseTraits, ETCM >::SolidSystem SolidSystem
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 NITraits< BaseTraits, ETCM >::ModelTraits::Indices 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 NITraits< BaseTraits, ETCM >::SolidState SolidState
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
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
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:73
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
Definition formulation.hh:25
@ p0s1
first phase pressure and second phase saturation as primary variables
Definition formulation.hh:24
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.
Update the solid volume fractions (inert and reacitve) and set them in the solidstate.