14#ifndef DUMUX_CO2_VOLUME_VARIABLES_HH 
   15#define DUMUX_CO2_VOLUME_VARIABLES_HH 
   19#include <dune/common/exceptions.hh> 
   35template <
class Traits>
 
   43    using Scalar = 
typename Traits::PrimaryVariables::value_type;
 
   44    using ModelTraits = 
typename Traits::ModelTraits;
 
   50        comp0Idx = Traits::FluidSystem::comp0Idx,
 
   51        comp1Idx = Traits::FluidSystem::comp1Idx,
 
   52        phase0Idx = Traits::FluidSystem::phase0Idx,
 
   53        phase1Idx = Traits::FluidSystem::phase1Idx
 
   59        firstPhaseOnly = ModelTraits::Indices::firstPhaseOnly,
 
   60        secondPhaseOnly = ModelTraits::Indices::secondPhaseOnly,
 
   61        bothPhases = ModelTraits::Indices::bothPhases
 
   67        switchIdx = ModelTraits::Indices::switchIdx,
 
   68        pressureIdx = ModelTraits::Indices::pressureIdx
 
   72    static constexpr auto formulation = ModelTraits::priVarFormulation();
 
   75    using PermeabilityType = 
typename Traits::PermeabilityType;
 
   78    using EffDiffModel = 
typename Traits::EffectiveDiffusivityModel;
 
   79    using DiffusionCoefficients = 
typename Traits::DiffusionType::DiffusionCoefficientsContainer;
 
   87    using Indices = 
typename ModelTraits::Indices;
 
   97    static constexpr bool useMoles() { 
return ModelTraits::useMoles(); }
 
  102    static_assert(ModelTraits::numFluidPhases() == 2, 
"NumPhases set in the model is not two!");
 
  103    static_assert(ModelTraits::numFluidComponents() == 2, 
"NumComponents set in the model is not two!");
 
  115    template<
class ElemSol, 
class Problem, 
class Element, 
class Scv>
 
  116    void update(
const ElemSol& elemSol, 
const Problem& problem, 
const Element& element, 
const Scv& scv)
 
  123        typename FluidSystem::ParameterCache paramCache;
 
  124        paramCache.updateAll(fluidState_);
 
  126        const auto& spatialParams = problem.spatialParams();
 
  127        const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
 
  129        const int wPhaseIdx = fluidState_.wettingPhase();
 
  130        const int nPhaseIdx = 1 - wPhaseIdx;
 
  133        relativePermeability_[wPhaseIdx] = fluidMatrixInteraction.krw(
saturation(wPhaseIdx));
 
  134        relativePermeability_[nPhaseIdx] = fluidMatrixInteraction.krn(
saturation(wPhaseIdx));
 
  138        EnergyVolVars::updateSolidEnergyParams(elemSol, problem, element, scv, solidState_);
 
  139        permeability_ = spatialParams.permeability(element, scv, elemSol);
 
  141        auto getEffectiveDiffusionCoefficient = [&](
int phaseIdx, 
int compIIdx, 
int compJIdx)
 
  143            return EffDiffModel::effectiveDiffusionCoefficient(*
this, phaseIdx, compIIdx, compJIdx);
 
  146        effectiveDiffCoeff_.update(getEffectiveDiffusionCoefficient);
 
  148        EnergyVolVars::updateEffectiveThermalConductivity();
 
 
  165    template<
class ElemSol, 
class Problem, 
class Element, 
class Scv>
 
  167                            const Problem& problem,
 
  168                            const Element& element,
 
  175        const auto& 
priVars = elemSol[scv.localDofIndex()];
 
  176        const auto phasePresence = 
priVars.state();
 
  178        const auto& spatialParams = problem.spatialParams();
 
  182        const auto fluidMatrixInteraction = spatialParams.fluidMatrixInteraction(element, scv, elemSol);
 
  185        if (phasePresence == secondPhaseOnly)
 
  190        else if (phasePresence == firstPhaseOnly)
 
  195        else if (phasePresence == bothPhases)
 
  209            DUNE_THROW(Dune::InvalidStateException, 
"Invalid phase presence.");
 
  212        pc_ = fluidMatrixInteraction.pc(
fluidState.saturation(wPhaseIdx));
 
  216            fluidState.setPressure(phase1Idx, (wPhaseIdx == phase0Idx) ? 
priVars[pressureIdx] + pc_
 
  222            fluidState.setPressure(phase0Idx, (wPhaseIdx == phase0Idx) ? 
priVars[pressureIdx] - pc_
 
  227        typename FluidSystem::ParameterCache paramCache;
 
  229        if (phasePresence == bothPhases)
 
  234            const auto xwCO2 = FluidSystem::equilibriumMoleFraction(
fluidState, paramCache, phase0Idx);
 
  235            const auto xgH2O = FluidSystem::equilibriumMoleFraction(
fluidState, paramCache, phase1Idx);
 
  236            const auto xwH2O = 1 - xwCO2;
 
  237            const auto xgCO2 = 1 - xgH2O;
 
  238            fluidState.setMoleFraction(phase0Idx, comp0Idx, xwH2O);
 
  239            fluidState.setMoleFraction(phase0Idx, comp1Idx, xwCO2);
 
  240            fluidState.setMoleFraction(phase1Idx, comp0Idx, xgH2O);
 
  241            fluidState.setMoleFraction(phase1Idx, comp1Idx, xgCO2);
 
  246        else if (phasePresence == secondPhaseOnly)
 
  254                const auto xwCO2 = FluidSystem::equilibriumMoleFraction(
fluidState, paramCache, phase0Idx);
 
  255                const auto xwH2O = 1 - xwCO2;
 
  256                fluidState.setMoleFraction(phase0Idx, comp1Idx, xwCO2);
 
  257                fluidState.setMoleFraction(phase0Idx, comp0Idx, xwH2O);
 
  264                const auto xwCO2 = FluidSystem::equilibriumMoleFraction(
fluidState, paramCache, phase0Idx);
 
  265                const auto xwH2O = 1 - xwCO2;
 
  266                fluidState.setMoleFraction(phase0Idx, comp1Idx, xwCO2);
 
  267                fluidState.setMoleFraction(phase0Idx, comp0Idx, xwH2O);
 
  273        else if (phasePresence == firstPhaseOnly)
 
  281                Scalar xnH2O = FluidSystem::equilibriumMoleFraction(
fluidState, paramCache, phase1Idx);
 
  282                Scalar xnCO2 = 1 - xnH2O;
 
  283                fluidState.setMoleFraction(phase1Idx, comp1Idx, xnCO2);
 
  284                fluidState.setMoleFraction(phase1Idx, comp0Idx, xnH2O);
 
  291                Scalar xnH2O = FluidSystem::equilibriumMoleFraction(
fluidState, paramCache, phase1Idx);
 
  292                Scalar xnCO2 = 1 - xnH2O;
 
  293                fluidState.setMoleFraction(phase1Idx, comp1Idx, xnCO2);
 
  294                fluidState.setMoleFraction(phase1Idx, comp0Idx, xnH2O);
 
  298        for (
int phaseIdx = 0; phaseIdx < ModelTraits::numFluidPhases(); ++phaseIdx)
 
  301            paramCache.updateComposition(
fluidState, phaseIdx);
 
  302            const Scalar rho = FluidSystem::density(
fluidState, paramCache, phaseIdx);
 
  304            const Scalar rhoMolar = FluidSystem::molarDensity(
fluidState, phaseIdx);
 
  305            fluidState.setMolarDensity(phaseIdx, rhoMolar);
 
  306            const Scalar mu = FluidSystem::viscosity(
fluidState, paramCache, phaseIdx);
 
  310            Scalar h = EnergyVolVars::enthalpy(
fluidState, paramCache, phaseIdx);
 
 
  319    { 
return fluidState_; }
 
 
  325    { 
return solidState_; }
 
 
  333    { 
return fluidState_.averageMolarMass(phaseIdx); }
 
 
  342    { 
return fluidState_.saturation(phaseIdx); }
 
 
  352    { 
return fluidState_.massFraction(phaseIdx, compIdx); }
 
 
  362    { 
return fluidState_.moleFraction(phaseIdx, compIdx); }
 
 
  371    { 
return fluidState_.density(phaseIdx); }
 
 
  380    { 
return fluidState_.viscosity(phaseIdx); }
 
 
  389    { 
return fluidState_.molarDensity(phaseIdx) ; }
 
 
  398    { 
return fluidState_.pressure(phaseIdx); }
 
 
  408    { 
return fluidState_.temperature(0); }
 
 
  417    { 
return relativePermeability_[phaseIdx]; }
 
 
  426    { 
return relativePermeability_[phaseIdx]/fluidState_.viscosity(phaseIdx); }
 
 
  433    { 
return fluidState_.pressure(phase1Idx) - fluidState_.pressure(phase0Idx); }
 
 
  439    { 
return solidState_.porosity(); }
 
 
  445    { 
return permeability_; }
 
 
  452        typename FluidSystem::ParameterCache paramCache;
 
  453        paramCache.updatePhase(fluidState_, phaseIdx);
 
  454        return FluidSystem::binaryDiffusionCoefficient(fluidState_, paramCache, phaseIdx, compIIdx, compJIdx);
 
 
  461    { 
return effectiveDiffCoeff_(phaseIdx, compIIdx, compJIdx); }
 
 
  468    { 
return fluidState_.wettingPhase(); }
 
 
  474    PermeabilityType permeability_; 
 
  477    std::array<Scalar, ModelTraits::numFluidPhases()> relativePermeability_;
 
  480    DiffusionCoefficients effectiveDiffCoeff_;
 
 
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 2p2c-CO2 model controlling the phase presence state variable.
Definition co2/primaryvariableswitch.hh:33
Contains the quantities which are are constant within a finite volume in the CO2 model.
Definition porousmediumflow/co2/volumevariables.hh:39
Scalar massFraction(const int phaseIdx, const int compIdx) const
Returns the mass fraction of a given component in a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:351
const SolidState & solidState() const
Definition porousmediumflow/co2/volumevariables.hh:324
typename NCTraits< BaseTraits, DT, EDM >::FluidState FluidState
Definition porousmediumflow/co2/volumevariables.hh:83
Scalar saturation(const int phaseIdx) const
Returns the saturation of a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:341
void completeFluidState(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv, FluidState &fluidState, SolidState &solidState)
Completes the fluid state.
Definition porousmediumflow/co2/volumevariables.hh:166
Scalar mobility(const int phaseIdx) const
Returns the effective mobility of a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:425
Scalar effectiveDiffusionCoefficient(int phaseIdx, int compIIdx, int compJIdx) const
Returns the effective diffusion coefficients for a phase in .
Definition porousmediumflow/co2/volumevariables.hh:460
Scalar porosity() const
Returns the average porosity within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:438
typename ModelTraits::Indices Indices
Definition porousmediumflow/co2/volumevariables.hh:87
Scalar density(const int phaseIdx) const
Returns the mass density of a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:370
Scalar viscosity(const int phaseIdx) const
Returns the dynamic viscosity of the fluid within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:379
typename NCTraits< BaseTraits, DT, EDM >::FluidSystem FluidSystem
Definition porousmediumflow/co2/volumevariables.hh:85
int wettingPhase() const
Returns the wetting phase index.
Definition porousmediumflow/co2/volumevariables.hh:467
TwoPTwoCCO2PrimaryVariableSwitch PrimaryVariableSwitch
Definition porousmediumflow/co2/volumevariables.hh:93
typename NCTraits< BaseTraits, DT, EDM >::SolidState SolidState
Definition porousmediumflow/co2/volumevariables.hh:89
typename NCTraits< BaseTraits, DT, EDM >::SolidSystem SolidSystem
Definition porousmediumflow/co2/volumevariables.hh:91
Scalar temperature() const
Returns temperature within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:407
Scalar pressure(const int phaseIdx) const
Returns the effective pressure of a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:397
static constexpr bool useMoles()
Return whether moles or masses are balanced.
Definition porousmediumflow/co2/volumevariables.hh:97
const PermeabilityType & permeability() const
Returns the average permeability within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:444
const FluidState & fluidState() const
Definition porousmediumflow/co2/volumevariables.hh:318
void update(const ElemSol &elemSol, const Problem &problem, const Element &element, const Scv &scv)
Updates all quantities for a given control volume.
Definition porousmediumflow/co2/volumevariables.hh:116
Scalar molarDensity(const int phaseIdx) const
Returns the mass density of a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:388
Scalar averageMolarMass(int phaseIdx) const
Returns the average molar mass  of the fluid phase.
Definition porousmediumflow/co2/volumevariables.hh:332
Scalar moleFraction(const int phaseIdx, const int compIdx) const
Returns the mole fraction of a given component in a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:361
static constexpr TwoPFormulation priVarFormulation()
Return the two-phase formulation used here.
Definition porousmediumflow/co2/volumevariables.hh:99
Scalar diffusionCoefficient(int phaseIdx, int compIIdx, int compJIdx) const
Returns the binary diffusion coefficients for a phase in .
Definition porousmediumflow/co2/volumevariables.hh:450
Scalar capillaryPressure() const
Returns the effective capillary pressure within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:432
Scalar relativePermeability(const int phaseIdx) const
Returns the relative permeability of a given phase within the control volume in .
Definition porousmediumflow/co2/volumevariables.hh:416
The primary variable switch for the 2p2c-CO2 model.
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.