28 #ifndef EWOMS_NCP_INTENSIVE_QUANTITIES_HH 29 #define EWOMS_NCP_INTENSIVE_QUANTITIES_HH 36 #include <opm/material/constraintsolvers/NcpFlash.hpp> 37 #include <opm/material/fluidstates/CompositionalFluidState.hpp> 38 #include <opm/material/constraintsolvers/CompositionFromFugacities.hpp> 39 #include <opm/common/Valgrind.hpp> 41 #include <dune/common/fvector.hh> 42 #include <dune/common/fmatrix.hh> 52 template <
class TypeTag>
57 ,
public GET_PROP_TYPE(TypeTag, FluxModule)::FluxIntensiveQuantities
59 typedef typename GET_PROP_TYPE(TypeTag, DiscIntensiveQuantities) ParentType;
61 typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar;
62 typedef typename GET_PROP_TYPE(TypeTag, Evaluation) Evaluation;
63 typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem;
64 typedef typename GET_PROP_TYPE(TypeTag, MaterialLaw) MaterialLaw;
65 typedef typename GET_PROP_TYPE(TypeTag, MaterialLawParams) MaterialLawParams;
66 typedef typename GET_PROP_TYPE(TypeTag, ElementContext) ElementContext;
67 typedef typename GET_PROP_TYPE(TypeTag, Indices) Indices;
69 typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
70 typedef typename GET_PROP_TYPE(TypeTag, FluxModule) FluxModule;
75 enum { enableDiffusion =
GET_PROP_VALUE(TypeTag, EnableDiffusion) };
76 enum { fugacity0Idx = Indices::fugacity0Idx };
77 enum { saturation0Idx = Indices::saturation0Idx };
78 enum { pressure0Idx = Indices::pressure0Idx };
79 enum { dimWorld = GridView::dimensionworld };
81 typedef Opm::CompositionFromFugacities<Scalar, FluidSystem, Evaluation>
82 CompositionFromFugacitiesSolver;
83 typedef Opm::CompositionalFluidState<Evaluation, FluidSystem,
84 enableEnergy> FluidState;
85 typedef Dune::FieldVector<Evaluation, numComponents> ComponentVector;
86 typedef Dune::FieldMatrix<Scalar, dimWorld, dimWorld> DimMatrix;
89 typedef typename FluxModule::FluxIntensiveQuantities FluxIntensiveQuantities;
102 void update(
const ElementContext& elemCtx,
106 ParentType::update(elemCtx, dofIdx, timeIdx);
107 ParentType::checkDefined();
109 typename FluidSystem::template ParameterCache<Evaluation> paramCache;
110 const auto& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
113 Evaluation sumSat = 0;
114 for (
unsigned phaseIdx = 0; phaseIdx < numPhases - 1; ++phaseIdx) {
115 const Evaluation& val = priVars.makeEvaluation(saturation0Idx + phaseIdx, timeIdx);
116 fluidState_.setSaturation(phaseIdx, val);
119 fluidState_.setSaturation(numPhases - 1, 1.0 - sumSat);
120 Opm::Valgrind::CheckDefined(sumSat);
123 EnergyIntensiveQuantities::updateTemperatures_(fluidState_, elemCtx, dofIdx, timeIdx);
126 const auto& problem = elemCtx.problem();
127 const MaterialLawParams& materialParams =
128 problem.materialLawParams(elemCtx, dofIdx, timeIdx);
130 Evaluation capPress[numPhases];
131 MaterialLaw::capillaryPressures(capPress, materialParams, fluidState_);
133 const Evaluation& pressure0 = priVars.makeEvaluation(pressure0Idx, timeIdx);
134 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
135 fluidState_.setPressure(phaseIdx, pressure0 + (capPress[phaseIdx] - capPress[0]));
139 for (
unsigned compIdx = 0; compIdx < numComponents; ++compIdx)
140 fug[compIdx] = priVars.makeEvaluation(fugacity0Idx + compIdx, timeIdx);
143 const auto *hint = elemCtx.thermodynamicHint(dofIdx, timeIdx);
144 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
147 for (
unsigned compIdx = 0; compIdx < numComponents; ++compIdx) {
149 const Evaluation& moleFracIJ = hint->fluidState().moleFraction(phaseIdx, compIdx);
150 fluidState_.setMoleFraction(phaseIdx, compIdx, moleFracIJ);
154 CompositionFromFugacitiesSolver::guessInitial(fluidState_, phaseIdx, fug);
158 CompositionFromFugacitiesSolver::solve(fluidState_, paramCache, phaseIdx, fug);
162 porosity_ = problem.porosity(elemCtx, dofIdx, timeIdx);
163 Opm::Valgrind::CheckDefined(porosity_);
166 MaterialLaw::relativePermeabilities(relativePermeability_, materialParams, fluidState_);
169 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
171 const Evaluation& mu = FluidSystem::viscosity(fluidState_, paramCache, phaseIdx);
172 fluidState_.setViscosity(phaseIdx, mu);
174 mobility_[phaseIdx] = relativePermeability_[phaseIdx]/mu;
178 intrinsicPerm_ = problem.intrinsicPermeability(elemCtx, dofIdx, timeIdx);
181 FluxIntensiveQuantities::update_(elemCtx, dofIdx, timeIdx);
184 EnergyIntensiveQuantities::update_(fluidState_, paramCache, elemCtx, dofIdx, timeIdx);
187 DiffusionIntensiveQuantities::update_(fluidState_, paramCache, elemCtx, dofIdx, timeIdx);
196 {
return fluidState_; }
202 {
return intrinsicPerm_; }
208 {
return relativePermeability_[phaseIdx]; }
213 const Evaluation&
mobility(
unsigned phaseIdx)
const 214 {
return mobility_[phaseIdx]; }
220 {
return porosity_; }
227 #if !defined NDEBUG && HAVE_VALGRIND 228 ParentType::checkDefined();
230 Opm::Valgrind::CheckDefined(porosity_);
231 Opm::Valgrind::CheckDefined(relativePermeability_);
233 fluidState_.checkDefined();
238 DimMatrix intrinsicPerm_;
239 FluidState fluidState_;
240 Evaluation porosity_;
241 Evaluation relativePermeability_[numPhases];
242 Evaluation mobility_[numPhases];
Provides the volumetric quantities required for the calculation of molecular diffusive fluxes...
Definition: diffusionmodule.hh:146
Definition: baseauxiliarymodule.hh:37
const Evaluation & porosity() const
ImmiscibleIntensiveQuantities::porosity.
Definition: ncpintensivequantities.hh:219
#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 Evaluation & relativePermeability(unsigned phaseIdx) const
ImmiscibleIntensiveQuantities::relativePermeability.
Definition: ncpintensivequantities.hh:207
Contains the quantities which are are constant within a finite volume in the compositional multi-phas...
Definition: ncpintensivequantities.hh:53
Provides the volumetric quantities required for the energy equation.
Definition: energymodule.hh:539
Declares the properties required for the NCP compositional multi-phase model.
const Evaluation & mobility(unsigned phaseIdx) const
ImmiscibleIntensiveQuantities::mobility.
Definition: ncpintensivequantities.hh:213
const FluidState & fluidState() const
ImmiscibleIntensiveQuantities::fluidState.
Definition: ncpintensivequantities.hh:195
const DimMatrix & intrinsicPermeability() const
ImmiscibleIntensiveQuantities::intrinsicPermeability.
Definition: ncpintensivequantities.hh:201
void update(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
IntensiveQuantities::update.
Definition: ncpintensivequantities.hh:102
Classes required for molecular diffusion.
void checkDefined() const
IntensiveQuantities::checkDefined.
Definition: ncpintensivequantities.hh:225