28 #ifndef EWOMS_IMMISCIBLE_INTENSIVE_QUANTITIES_HH 29 #define EWOMS_IMMISCIBLE_INTENSIVE_QUANTITIES_HH 35 #include <opm/material/fluidstates/ImmiscibleFluidState.hpp> 36 #include <opm/common/Valgrind.hpp> 38 #include <dune/common/fvector.hh> 39 #include <dune/common/fmatrix.hh> 49 template <
class TypeTag>
53 ,
public GET_PROP_TYPE(TypeTag, FluxModule)::FluxIntensiveQuantities
55 typedef typename GET_PROP_TYPE(TypeTag, DiscIntensiveQuantities) ParentType;
57 typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar;
58 typedef typename GET_PROP_TYPE(TypeTag, Evaluation) Evaluation;
59 typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem;
60 typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw;
61 typedef typename GET_PROP_TYPE(TypeTag, ElementContext) ElementContext;
62 typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices;
63 typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
64 typedef typename GET_PROP_TYPE(TypeTag, FluxModule) FluxModule;
67 enum { pressure0Idx = Indices::pressure0Idx };
68 enum { saturation0Idx = Indices::saturation0Idx };
70 enum { dimWorld = GridView::dimensionworld };
72 typedef Opm::MathToolbox<Evaluation> Toolbox;
73 typedef Dune::FieldMatrix<Scalar, dimWorld, dimWorld> DimMatrix;
74 typedef Dune::FieldVector<Scalar, numPhases> PhaseVector;
75 typedef Dune::FieldVector<Evaluation, numPhases> EvalPhaseVector;
77 typedef typename FluxModule::FluxIntensiveQuantities FluxIntensiveQuantities;
79 typedef Opm::ImmiscibleFluidState<Evaluation, FluidSystem,
80 enableEnergy> FluidState;
93 void update(
const ElementContext& elemCtx,
unsigned dofIdx,
unsigned timeIdx)
95 ParentType::update(elemCtx, dofIdx, timeIdx);
96 EnergyIntensiveQuantities::updateTemperatures_(fluidState_, elemCtx, dofIdx, timeIdx);
99 typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw;
100 const auto& problem = elemCtx.problem();
101 const typename MaterialLaw::Params& materialParams =
102 problem.materialLawParams(elemCtx, dofIdx, timeIdx);
103 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
104 Opm::Valgrind::CheckDefined(priVars);
106 Evaluation sumSat = 0.0;
107 for (
unsigned phaseIdx = 0; phaseIdx < numPhases - 1; ++phaseIdx) {
108 const Evaluation& Salpha = priVars.makeEvaluation(saturation0Idx + phaseIdx, timeIdx);
109 fluidState_.setSaturation(phaseIdx, Salpha);
112 fluidState_.setSaturation(numPhases - 1, 1 - sumSat);
115 MaterialLaw::capillaryPressures(pC, materialParams, fluidState_);
116 Opm::Valgrind::CheckDefined(pC);
119 MaterialLaw::relativePermeabilities(relativePermeability_, materialParams, fluidState_);
120 Opm::Valgrind::CheckDefined(relativePermeability_);
122 const Evaluation& p0 = priVars.makeEvaluation(pressure0Idx, timeIdx);
123 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
124 fluidState_.setPressure(phaseIdx, p0 + (pC[phaseIdx] - pC[0]));
126 typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem;
127 typename FluidSystem::template ParameterCache<Evaluation> paramCache;
128 paramCache.updateAll(fluidState_);
130 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
132 const Evaluation& mu = FluidSystem::viscosity(fluidState_, paramCache, phaseIdx);
133 fluidState_.setViscosity(phaseIdx, mu);
136 const Evaluation& rho = FluidSystem::density(fluidState_, paramCache, phaseIdx);
137 fluidState_.setDensity(phaseIdx, rho);
139 mobility_[phaseIdx] = relativePermeability_[phaseIdx]/mu;
143 porosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
146 intrinsicPerm_ = problem.intrinsicPermeability(elemCtx, dofIdx, timeIdx);
149 EnergyIntensiveQuantities::update_(fluidState_, paramCache, elemCtx, dofIdx, timeIdx);
152 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
159 {
return fluidState_; }
165 {
return intrinsicPerm_; }
174 {
return relativePermeability_[phaseIdx]; }
182 const Evaluation&
mobility(
unsigned phaseIdx)
const 183 {
return mobility_[phaseIdx]; }
189 {
return porosity_; }
192 FluidState fluidState_;
193 Evaluation porosity_;
194 DimMatrix intrinsicPerm_;
195 Evaluation relativePermeability_[numPhases];
196 Evaluation mobility_[numPhases];
const Evaluation & porosity() const
Returns the average porosity within the control volume.
Definition: immiscibleintensivequantities.hh:188
void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Definition: immiscibleintensivequantities.hh:93
Contains the quantities which are are constant within a finite volume for the immiscible multi-phase ...
Definition: immiscibleintensivequantities.hh:50
Definition: baseauxiliarymodule.hh:37
#define GET_PROP_VALUE(TypeTag, PropTagName)
Access the value attribute of a property for a type tag.
Definition: propertysystem.hh:469
Contains the classes required to consider energy as a conservation quantity in a multi-phase module...
#define GET_PROP_TYPE(TypeTag, PropTagName)
Access the type attribute of a property for a type tag.
Definition: propertysystem.hh:486
const DimMatrix & intrinsicPermeability() const
Returns the intrinsic permeability tensor a degree of freedom.
Definition: immiscibleintensivequantities.hh:164
Provides the volumetric quantities required for the energy equation.
Definition: energymodule.hh:539
const Evaluation & mobility(unsigned phaseIdx) const
Returns the effective mobility of a given phase within the control volume.
Definition: immiscibleintensivequantities.hh:182
Defines the properties required for the immiscible multi-phase model.
const FluidState & fluidState() const
Returns the phase state for the control-volume.
Definition: immiscibleintensivequantities.hh:158
const Evaluation & relativePermeability(unsigned phaseIdx) const
Returns the relative permeability of a given phase within the control volume.
Definition: immiscibleintensivequantities.hh:173