73 using TabulatedFunction =
typename BlackOilFoamParams<Scalar>::TabulatedFunction;
75 static constexpr unsigned foamConcentrationIdx = Indices::foamConcentrationIdx;
76 static constexpr unsigned contiFoamEqIdx = Indices::contiFoamEqIdx;
77 static constexpr unsigned gasPhaseIdx = FluidSystem::gasPhaseIdx;
78 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
105 if constexpr (enableFoam) {
106 if (Parameters::Get<Parameters::EnableVtkOutput>()) {
107 OpmLog::warning(
"VTK output requested, currently unsupported by the foam module.");
113 static bool primaryVarApplies(
unsigned pvIdx)
115 if constexpr (enableFoam) {
116 return pvIdx == foamConcentrationIdx;
126 return "foam_concentration";
134 return static_cast<Scalar
>(1.0);
137 static bool eqApplies(
unsigned eqIdx)
139 if constexpr (enableFoam) {
140 return eqIdx == contiFoamEqIdx;
159 return static_cast<Scalar
>(1.0);
163 template <
class LhsEval>
164 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
165 const IntensiveQuantities& intQuants)
167 if constexpr (enableFoam) {
168 const auto& fs = intQuants.fluidState();
171 if (params_.transport_phase_ == Phase::WATER) {
174 }
else if (params_.transport_phase_ == Phase::GAS) {
177 }
else if (params_.transport_phase_ == Phase::SOLVENT) {
178 if constexpr (enableSolvent) {
180 Toolbox::template
decay<LhsEval>(intQuants.solventInverseFormationVolumeFactor());
183 throw std::runtime_error(
"Transport phase is GAS/WATER/SOLVENT");
209 if constexpr (enableFoam) {
216 switch (transportPhase()) {
221 flux[contiFoamEqIdx] =
223 up.fluidState().invB(waterPhaseIdx) *
224 up.foamConcentration();
226 flux[contiFoamEqIdx] =
237 flux[contiFoamEqIdx] =
239 up.fluidState().invB(gasPhaseIdx) *
240 up.foamConcentration();
242 flux[contiFoamEqIdx] =
250 if constexpr (enableSolvent) {
254 flux[contiFoamEqIdx] =
256 up.solventInverseFormationVolumeFactor() *
257 up.foamConcentration();
259 flux[contiFoamEqIdx] =
265 throw std::runtime_error(
"Foam transport phase is SOLVENT but SOLVENT is not activated.");
269 throw std::runtime_error(
"Foam transport phase must be GAS/WATER/SOLVENT.");
282 return static_cast<Scalar
>(0.0);
285 template <
class DofEntity>
286 static void serializeEntity([[
maybe_unused]]
const Model& model,
290 if constexpr (enableFoam) {
291 const unsigned dofIdx = model.dofMapper().index(
dof);
292 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
293 outstream << priVars[foamConcentrationIdx];
297 template <
class DofEntity>
298 static void deserializeEntity([[
maybe_unused]] Model& model,
302 if constexpr (enableFoam) {
303 const unsigned dofIdx = model.dofMapper().index(
dof);
304 PrimaryVariables&
priVars0 = model.solution(0)[dofIdx];
305 PrimaryVariables&
priVars1 = model.solution(1)[dofIdx];
314 static const Scalar foamRockDensity(
const ElementContext& elemCtx,
322 static bool foamAllowDesorption(
const ElementContext& elemCtx,
330 static const TabulatedFunction& adsorbedFoamTable(
const ElementContext& elemCtx,
338 static const TabulatedFunction& gasMobilityMultiplierTable(
const ElementContext& elemCtx,
346 static const typename BlackOilFoamParams<Scalar>::FoamCoefficients&
347 foamCoefficients(
const ElementContext& elemCtx,
355 static Phase transportPhase()
356 {
return params_.transport_phase_; }
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