28 #ifndef EWOMS_IMMISCIBLE_INTENSIVE_QUANTITIES_HH 29 #define EWOMS_IMMISCIBLE_INTENSIVE_QUANTITIES_HH 35 #include <opm/material/fluidstates/ImmiscibleFluidState.hpp> 36 #include <opm/material/common/Valgrind.hpp> 38 #include <dune/common/fvector.hh> 39 #include <dune/common/fmatrix.hh> 49 template <
class TypeTag>
51 :
public GetPropType<TypeTag, Properties::DiscIntensiveQuantities>
53 ,
public GetPropType<TypeTag, Properties::FluxModule>::FluxIntensiveQuantities
66 enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
67 enum { pressure0Idx = Indices::pressure0Idx };
68 enum { saturation0Idx = Indices::saturation0Idx };
69 enum { enableEnergy = getPropValue<TypeTag, Properties::EnableEnergy>() };
70 enum { dimWorld = GridView::dimensionworld };
72 using Toolbox = Opm::MathToolbox<Evaluation>;
73 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
74 using PhaseVector = Dune::FieldVector<Scalar, numPhases>;
75 using EvalPhaseVector = Dune::FieldVector<Evaluation, numPhases>;
77 using FluxIntensiveQuantities =
typename FluxModule::FluxIntensiveQuantities;
79 using FluidState = Opm::ImmiscibleFluidState<Evaluation, FluidSystem,
93 void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
95 ParentType::update(elemCtx, dofIdx, timeIdx);
96 EnergyIntensiveQuantities::updateTemperatures_(fluidState_, elemCtx, dofIdx, timeIdx);
99 const auto& problem = elemCtx.problem();
100 const typename MaterialLaw::Params& materialParams =
101 problem.materialLawParams(elemCtx, dofIdx, timeIdx);
102 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
103 Opm::Valgrind::CheckDefined(priVars);
105 Evaluation sumSat = 0.0;
106 for (
unsigned phaseIdx = 0; phaseIdx < numPhases - 1; ++phaseIdx) {
107 const Evaluation& Salpha = priVars.makeEvaluation(saturation0Idx + phaseIdx, timeIdx);
108 fluidState_.setSaturation(phaseIdx, Salpha);
111 fluidState_.setSaturation(numPhases - 1, 1 - sumSat);
114 MaterialLaw::capillaryPressures(pC, materialParams, fluidState_);
115 Opm::Valgrind::CheckDefined(pC);
118 MaterialLaw::relativePermeabilities(relativePermeability_, materialParams, fluidState_);
119 Opm::Valgrind::CheckDefined(relativePermeability_);
121 const Evaluation& p0 = priVars.makeEvaluation(pressure0Idx, timeIdx);
122 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
123 fluidState_.setPressure(phaseIdx, p0 + (pC[phaseIdx] - pC[0]));
125 typename FluidSystem::template ParameterCache<Evaluation> paramCache;
126 paramCache.updateAll(fluidState_);
128 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
130 const Evaluation& mu = FluidSystem::viscosity(fluidState_, paramCache, phaseIdx);
131 fluidState_.setViscosity(phaseIdx, mu);
134 const Evaluation& rho = FluidSystem::density(fluidState_, paramCache, phaseIdx);
135 fluidState_.setDensity(phaseIdx, rho);
137 mobility_[phaseIdx] = relativePermeability_[phaseIdx]/mu;
141 porosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
144 intrinsicPerm_ = problem.intrinsicPermeability(elemCtx, dofIdx, timeIdx);
147 EnergyIntensiveQuantities::update_(fluidState_, paramCache, elemCtx, dofIdx, timeIdx);
150 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
157 {
return fluidState_; }
163 {
return intrinsicPerm_; }
172 {
return relativePermeability_[phaseIdx]; }
180 const Evaluation&
mobility(
unsigned phaseIdx)
const 181 {
return mobility_[phaseIdx]; }
187 {
return porosity_; }
190 FluidState fluidState_;
191 Evaluation porosity_;
192 DimMatrix intrinsicPerm_;
193 Evaluation relativePermeability_[numPhases];
194 Evaluation mobility_[numPhases];
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(...))
Definition: propertysystem.hh:233
const Evaluation & mobility(unsigned phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: immiscibleintensivequantities.hh:180
Contains the classes required to consider energy as a conservation quantity in a multi-phase module...
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Provides the volumetric quantities required for the energy equation.
Definition: energymodule.hh:535
void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: immiscibleintensivequantities.hh:93
const DimMatrix & intrinsicPermeability() const
Returns the intrinsic permeability tensor a degree of freedom.
Definition: immiscibleintensivequantities.hh:162
const Evaluation & porosity() const
Returns the average porosity within the control volume.
Definition: immiscibleintensivequantities.hh:186
const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: immiscibleintensivequantities.hh:156
Defines the properties required for the immiscible multi-phase model.
Contains the quantities which are are constant within a finite volume for the immiscible multi-phase ...
Definition: immiscibleintensivequantities.hh:50
const Evaluation & relativePermeability(unsigned phaseIdx) const
Returns the relative permeability of a given phase within the control volume.
Definition: immiscibleintensivequantities.hh:171