76 using TabulatedFunction =
typename BlackOilFoamParams<Scalar>::TabulatedFunction;
78 static constexpr unsigned foamConcentrationIdx = Indices::foamConcentrationIdx;
79 static constexpr unsigned contiFoamEqIdx = Indices::contiFoamEqIdx;
80 static constexpr unsigned gasPhaseIdx = FluidSystem::gasPhaseIdx;
81 static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
86 static constexpr unsigned numPhases = FluidSystem::numPhases;
110 if constexpr (enableFoam) {
111 if (Parameters::Get<Parameters::EnableVtkOutput>()) {
112 OpmLog::warning(
"VTK output requested, currently unsupported by the foam module.");
118 static bool primaryVarApplies(
unsigned pvIdx)
120 if constexpr (enableFoam)
121 return pvIdx == foamConcentrationIdx;
129 return "foam_concentration";
137 return static_cast<Scalar
>(1.0);
140 static bool eqApplies(
unsigned eqIdx)
142 if constexpr (enableFoam)
143 return eqIdx == contiFoamEqIdx;
161 return static_cast<Scalar
>(1.0);
165 template <
class LhsEval>
166 static void addStorage(Dune::FieldVector<LhsEval, numEq>&
storage,
167 const IntensiveQuantities& intQuants)
169 if constexpr (enableFoam) {
170 const auto& fs = intQuants.fluidState();
173 if (params_.transport_phase_ == Phase::WATER) {
176 }
else if (params_.transport_phase_ == Phase::GAS) {
179 }
else if (params_.transport_phase_ == Phase::SOLVENT) {
180 if constexpr (enableSolvent) {
182 * Toolbox::template
decay<LhsEval>(intQuants.solventInverseFormationVolumeFactor()));
185 throw std::runtime_error(
"Transport phase is GAS/WATER/SOLVENT");
193 * Toolbox::template
decay<LhsEval>(intQuants.foamConcentration());
212 if constexpr (enableFoam) {
219 switch (transportPhase()) {
224 flux[contiFoamEqIdx] =
226 *
up.fluidState().invB(waterPhaseIdx)
227 *
up.foamConcentration();
229 flux[contiFoamEqIdx] =
240 flux[contiFoamEqIdx] =
242 *
up.fluidState().invB(gasPhaseIdx)
243 *
up.foamConcentration();
245 flux[contiFoamEqIdx] =
252 case Phase::SOLVENT: {
253 if constexpr (enableSolvent) {
257 flux[contiFoamEqIdx] =
259 *
up.solventInverseFormationVolumeFactor()
260 *
up.foamConcentration();
262 flux[contiFoamEqIdx] =
268 throw std::runtime_error(
"Foam transport phase is SOLVENT but SOLVENT is not activated.");
273 throw std::runtime_error(
"Foam transport phase must be GAS/WATER/SOLVENT.");
287 return static_cast<Scalar
>(0.0);
290 template <
class DofEntity>
291 static void serializeEntity([[
maybe_unused]]
const Model& model,
295 if constexpr (enableFoam) {
296 unsigned dofIdx = model.dofMapper().index(
dof);
297 const PrimaryVariables& priVars = model.solution(0)[dofIdx];
298 outstream << priVars[foamConcentrationIdx];
302 template <
class DofEntity>
303 static void deserializeEntity([[
maybe_unused]] Model& model,
307 if constexpr (enableFoam) {
308 unsigned dofIdx = model.dofMapper().index(
dof);
309 PrimaryVariables&
priVars0 = model.solution(0)[dofIdx];
310 PrimaryVariables&
priVars1 = model.solution(1)[dofIdx];
319 static const Scalar foamRockDensity(
const ElementContext& elemCtx,
327 static bool foamAllowDesorption(
const ElementContext& elemCtx,
335 static const TabulatedFunction& adsorbedFoamTable(
const ElementContext& elemCtx,
343 static const TabulatedFunction& gasMobilityMultiplierTable(
const ElementContext& elemCtx,
351 static const typename BlackOilFoamParams<Scalar>::FoamCoefficients&
352 foamCoefficients(
const ElementContext& elemCtx,
360 static Phase transportPhase() {
361 return params_.transport_phase_;
void foamPropertiesUpdate_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the intensive properties needed to handle polymers from the primary variables.
Definition blackoilfoammodules.hh:409
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:235