28#ifndef OPM_BLACK_OIL_MODEL_HPP
29#define OPM_BLACK_OIL_MODEL_HPP
31#include <opm/material/densead/Math.hpp>
33#include <opm/material/fluidsystems/BlackOilFluidSystem.hpp>
75template <
class TypeTag>
80namespace Opm::Properties {
86{
using InheritsFrom = std::tuple<VtkBlackOilPolymer, MultiPhaseBaseModel>; };
90template<
class TypeTag>
95template<
class TypeTag>
100template<
class TypeTag>
105template<
class TypeTag>
110template<
class TypeTag>
115template<
class TypeTag>
120template<
class TypeTag>
125template<
class TypeTag>
130template<
class TypeTag>
136template<
class TypeTag>
141template<
class TypeTag>
155template<
class TypeTag>
161 using type = BlackOilFluidSystem<Scalar>;
165template<
class TypeTag>
167{
static constexpr bool value =
false; };
169template<
class TypeTag>
171{
static constexpr bool value =
false; };
173template<
class TypeTag>
175{
static constexpr bool value =
false; };
177template<
class TypeTag>
179{
static constexpr bool value =
false; };
181template<
class TypeTag>
183{
static constexpr bool value =
false; };
185template<
class TypeTag>
187{
static constexpr bool value =
false; };
189template<
class TypeTag>
191{
static constexpr bool value =
false; };
193template<
class TypeTag>
195{
static constexpr bool value =
false; };
197template<
class TypeTag>
199{
static constexpr bool value =
false; };
201template<
class TypeTag>
203{
static constexpr bool value =
false; };
205template<
class TypeTag>
207{
static constexpr EnergyModules value = EnergyModules::NoTemperature; };
210template<
class TypeTag>
212{
static constexpr bool value =
false; };
215template<
class TypeTag>
217{
static constexpr bool value =
false; };
219template<
class TypeTag>
221{
static constexpr bool value =
false; };
223template<
class TypeTag>
225{
static constexpr bool value =
false; };
227template<
class TypeTag>
229{
static constexpr bool value =
false; };
237template<
class TypeTag>
242 static constexpr Scalar alpha =
247 static constexpr Scalar value = 1.0/(30.0*4184.0*alpha);
251template<
class TypeTag>
256 static constexpr Scalar alpha =
261 static constexpr Scalar value = 1.0/(10.0*alpha);
266template<
class TypeTag>
268{
static constexpr bool value =
false; };
337template<
class TypeTag >
339 :
public MultiPhaseBaseModel<TypeTag>
348 using ParentType = MultiPhaseBaseModel<TypeTag>;
355 enum { numComponents = FluidSystem::numComponents };
360 static constexpr bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0;
361 static constexpr bool waterEnabled = Indices::waterEnabled;
374 explicit BlackOilModel(Simulator& simulator)
375 : ParentType(simulator)
377 eqWeights_.resize(numEq, 1.0);
391 DiffusionModule::registerParameters();
404 {
return "blackoil"; }
411 if (pvIdx == Indices::waterSwitchIdx) {
412 return "water_switching";
414 else if (pvIdx == Indices::pressureSwitchIdx) {
415 return "pressure_switching";
417 else if (
static_cast<int>(pvIdx) == Indices::compositionSwitchIdx) {
418 return "composition_switching";
420 else if (SolventModule::primaryVarApplies(pvIdx)) {
421 return SolventModule::primaryVarName(pvIdx);
423 else if (ExtboModule::primaryVarApplies(pvIdx)) {
424 return ExtboModule::primaryVarName(pvIdx);
426 else if (PolymerModule::primaryVarApplies(pvIdx)) {
427 return PolymerModule::primaryVarName(pvIdx);
429 else if (EnergyModule::primaryVarApplies(pvIdx)) {
430 return EnergyModule::primaryVarName(pvIdx);
433 throw std::logic_error(
"Invalid primary variable index");
442 if (Indices::conti0EqIdx <= eqIdx && eqIdx < Indices::conti0EqIdx + numComponents) {
443 std::ostringstream oss;
444 oss <<
"conti_" << FluidSystem::phaseName(eqIdx - Indices::conti0EqIdx);
447 else if (SolventModule::eqApplies(eqIdx)) {
448 return SolventModule::eqName(eqIdx);
450 else if (ExtboModule::eqApplies(eqIdx)) {
451 return ExtboModule::eqName(eqIdx);
453 else if (PolymerModule::eqApplies(eqIdx)) {
454 return PolymerModule::eqName(eqIdx);
456 else if (EnergyModule::eqApplies(eqIdx)) {
457 return EnergyModule::eqName(eqIdx);
460 throw std::logic_error(
"Invalid equation index");
471 if (globalDofIdx >= this->numGridDof()) {
476 if (
int(Indices::waterSwitchIdx) ==
int(pvIdx)) {
482 else if (
int(Indices::pressureSwitchIdx) ==
int(pvIdx)) {
487 else if (SolventModule::primaryVarApplies(pvIdx)) {
488 return SolventModule::primaryVarWeight(pvIdx);
492 else if (ExtboModule::primaryVarApplies(pvIdx)) {
493 return ExtboModule::primaryVarWeight(pvIdx);
497 else if (PolymerModule::primaryVarApplies(pvIdx)) {
498 return PolymerModule::primaryVarWeight(pvIdx);
502 else if (EnergyModule::primaryVarApplies(pvIdx)) {
503 return EnergyModule::primaryVarWeight(pvIdx);
507 assert(
int(Indices::compositionSwitchIdx) ==
int(pvIdx));
509 switch (this->solution(0)[globalDofIdx].primaryVarsMeaningGas()) {
510 case PrimaryVariables::GasMeaning::Sg:
return 1.0;
511 case PrimaryVariables::GasMeaning::Rs:
return 1.0 / 250.;
512 case PrimaryVariables::GasMeaning::Rv:
return 1.0 / 0.025;
513 default:
throw std::logic_error(
"Invalid primary variable meaning flag for gas");
523 Scalar
eqWeight(
unsigned globalDofIdx,
unsigned eqIdx)
const
527 if (globalDofIdx >= this->numGridDof()) {
531 return eqWeights_[eqIdx];
534 void setEqWeight(
unsigned eqIdx, Scalar value)
535 { eqWeights_[eqIdx] = value; }
545 template <
class DofEntity>
548 const unsigned dofIdx =
static_cast<unsigned>(asImp_().dofMapper().index(dof));
551 if (!outstream.good()) {
552 throw std::runtime_error(
"Could not serialize degree of freedom " + std::to_string(dofIdx));
556 const auto& priVars = this->solution(0)[dofIdx];
557 for (
unsigned eqIdx = 0; eqIdx < numEq; ++eqIdx) {
558 outstream << priVars[eqIdx] <<
" ";
562 outstream << static_cast<int>(priVars.primaryVarsMeaningGas()) <<
" ";
563 outstream << static_cast<int>(priVars.primaryVarsMeaningWater()) <<
" ";
564 outstream << static_cast<int>(priVars.primaryVarsMeaningPressure()) <<
" ";
566 outstream << priVars.pvtRegionIndex() <<
" ";
568 SolventModule::serializeEntity(asImp_(), outstream, dof);
569 ExtboModule::serializeEntity(asImp_(), outstream, dof);
570 PolymerModule::serializeEntity(asImp_(), outstream, dof);
571 EnergyModule::serializeEntity(asImp_(), outstream, dof);
582 template <
class DofEntity>
584 const DofEntity& dof)
586 const unsigned dofIdx =
static_cast<unsigned>(asImp_().dofMapper().index(dof));
589 auto& priVars = this->solution(0)[dofIdx];
590 for (
unsigned eqIdx = 0; eqIdx < numEq; ++eqIdx) {
591 if (!instream.good()) {
592 throw std::runtime_error(
"Could not deserialize degree of freedom " + std::to_string(dofIdx));
594 instream >> priVars[eqIdx];
598 unsigned primaryVarsMeaningGas;
599 instream >> primaryVarsMeaningGas;
601 unsigned primaryVarsMeaningWater;
602 instream >> primaryVarsMeaningWater;
604 unsigned primaryVarsMeaningPressure;
605 instream >> primaryVarsMeaningPressure;
607 unsigned pvtRegionIdx;
608 instream >> pvtRegionIdx;
610 if (!instream.good()) {
611 throw std::runtime_error(
"Could not deserialize degree of freedom " + std::to_string(dofIdx));
614 SolventModule::deserializeEntity(asImp_(), instream, dof);
615 ExtboModule::deserializeEntity(asImp_(), instream, dof);
616 PolymerModule::deserializeEntity(asImp_(), instream, dof);
617 EnergyModule::deserializeEntity(asImp_(), instream, dof);
619 using PVM_G =
typename PrimaryVariables::GasMeaning;
620 using PVM_W =
typename PrimaryVariables::WaterMeaning;
621 using PVM_P =
typename PrimaryVariables::PressureMeaning;
622 priVars.setPrimaryVarsMeaningGas(
static_cast<PVM_G
>(primaryVarsMeaningGas));
623 priVars.setPrimaryVarsMeaningWater(
static_cast<PVM_W
>(primaryVarsMeaningWater));
624 priVars.setPrimaryVarsMeaningPressure(
static_cast<PVM_P
>(primaryVarsMeaningPressure));
626 priVars.setPvtRegionIndex(pvtRegionIdx);
636 template <
class Restarter>
639 ParentType::deserialize(res);
644 ElementContext elemCtx(this->simulator_);
645 for (
const auto& elem : elements(this->gridView())) {
646 elemCtx.updateStencil(elem);
647 for (
unsigned dofIdx = 0; dofIdx < elemCtx.numPrimaryDof(0); ++dofIdx) {
648 const unsigned globalDofIdx = elemCtx.globalSpaceIndex(dofIdx, 0);
649 updatePvtRegionIndex_(this->solution(0)[globalDofIdx],
656 this->solution(1) = this->solution(0);
666 template <
class Context>
667 void supplementInitialSolution_(PrimaryVariables& priVars,
668 const Context& context,
671 { updatePvtRegionIndex_(priVars, context, dofIdx, timeIdx); }
673 void registerOutputModules_()
675 ParentType::registerOutputModules_();
683 this->addOutputModule(std::make_unique<VtkBlackOilModule<TypeTag>>(this->simulator_));
684 this->addOutputModule(std::make_unique<VtkCompositionModule<TypeTag>>(this->simulator_));
686 if constexpr (enableDiffusion) {
687 this->addOutputModule(std::make_unique<VtkDiffusionModule<TypeTag>>(this->simulator_));
692 std::vector<Scalar> eqWeights_;
694 Implementation& asImp_()
695 {
return *
static_cast<Implementation*
>(
this); }
697 const Implementation& asImp_()
const
698 {
return *
static_cast<const Implementation*
>(
this); }
700 template <
class Context>
701 void updatePvtRegionIndex_(PrimaryVariables& priVars,
702 const Context& context,
706 const unsigned regionIdx = context.problem().pvtRegionIndex(context, dofIdx, timeIdx);
707 priVars.setPvtRegionIndex(regionIdx);
Contains the classes required to extend the black-oil model by bioeffects.
Implements a boundary vector for the fully implicit black-oil model.
Contains the classes required to extend the black-oil model by brine.
This file contains the default flux module of the blackoil model.
Classes required for molecular diffusion.
Classes required for mechanical dispersion.
Contains the classes required to extend the black-oil model by energy.
Contains the classes required to extend the black-oil model by solvent component.
This template class contains the data which is required to calculate the fluxes of the fluid phases o...
Contains the classes required to extend the black-oil model to include the effects of foam.
Contains the quantities which are are constant within a finite volume in the black-oil model.
Calculates the local residual of the black oil model.
A newton solver which is specific to the black oil model.
Contains the classes required to extend the black-oil model by polymer.
Represents the primary variables used by the black-oil model.
Base class for all problems which use the black-oil model.
Declares the properties required by the black oil model.
Implements a vector representing mass, molar or volumetric rates for the black oil model.
Contains the classes required to extend the black-oil model by solvents.
The primary variable and equation indices for the black-oil model.
The primary variable and equation indices for the three-phase black-oil model.
Contains the high level supplements required to extend the black oil model by bioeffects.
Definition blackoilbioeffectsmodules.hh:95
static void registerParameters()
Register all run-time parameters for the black-oil bioeffects module.
Definition blackoilbioeffectsmodules.hh:141
static void registerOutputModules(Model &model, Simulator &simulator)
Register all bioeffects specific VTK and ECL output modules.
Definition blackoilbioeffectsmodules.hh:150
Implements a boundary vector for the fully implicit black-oil model.
Definition blackoilboundaryratevector.hh:48
Provides the auxiliary methods required for consideration of the diffusion equation.
Definition blackoildiffusionmodule.hh:54
Provides the auxiliary methods required for consideration of the dispersion equation.
Definition blackoildispersionmodule.hh:56
Contains the high level supplements required to extend the black oil model by energy.
Definition blackoilenergymodules.hh:63
static void registerOutputModules(Model &model, Simulator &simulator)
Register all energy specific VTK and ECL output modules.
Definition blackoilenergymodules.hh:99
static void registerParameters()
Register all run-time parameters for the black-oil energy module.
Definition blackoilenergymodules.hh:89
Contains the high level supplements required to extend the black oil model.
Definition blackoilextbomodules.hh:64
static void registerParameters()
Register all run-time parameters for the black-oil solvent module.
Definition blackoilextbomodules.hh:97
This template class contains the data which is required to calculate the fluxes of the fluid phases o...
Definition blackoilextensivequantities.hh:59
Contains the quantities which are are constant within a finite volume in the black-oil model.
Definition blackoilintensivequantities.hh:87
Calculates the local residual of the black oil model.
Definition blackoillocalresidual.hh:56
A fully-implicit black-oil flow model.
Definition blackoilmodel.hh:340
std::string primaryVarName(int pvIdx) const
Given an primary variable index, return a human readable name.
Definition blackoilmodel.hh:409
Scalar primaryVarWeight(unsigned globalDofIdx, unsigned pvIdx) const
Returns the relative weight of a primary variable for calculating relative errors.
Definition blackoilmodel.hh:467
Scalar eqWeight(unsigned globalDofIdx, unsigned eqIdx) const
Returns the relative weight of an equation.
Definition blackoilmodel.hh:523
void serializeEntity(std::ostream &outstream, const DofEntity &dof)
Write the current solution for a degree of freedom to a restart file.
Definition blackoilmodel.hh:546
std::string eqName(int eqIdx) const
Given an equation index, return a human readable name.
Definition blackoilmodel.hh:440
static std::string name()
Definition blackoilmodel.hh:403
void deserializeEntity(std::istream &instream, const DofEntity &dof)
Reads the current solution variables for a degree of freedom from a restart file.
Definition blackoilmodel.hh:583
static void registerParameters()
Register all run-time parameters for the immiscible model.
Definition blackoilmodel.hh:383
void deserialize(Restarter &res)
Deserializes the state of the model.
Definition blackoilmodel.hh:637
A newton solver which is specific to the black oil model.
Definition blackoilnewtonmethod.hpp:61
Contains the high level supplements required to extend the black oil model by polymer.
Definition blackoilpolymermodules.hh:65
static void registerParameters()
Register all run-time parameters for the black-oil polymer module.
Definition blackoilpolymermodules.hh:147
static void registerOutputModules(Model &model, Simulator &simulator)
Register all polymer specific VTK and ECL output modules.
Definition blackoilpolymermodules.hh:157
Represents the primary variables used by the black-oil model.
Definition blackoilprimaryvariables.hh:72
Base class for all problems which use the black-oil model.
Definition blackoilproblem.hh:43
Implements a vector representing mass, molar or volumetric rates for the black oil model.
Definition blackoilratevector.hh:62
Contains the high level supplements required to extend the black oil model by solvents.
Definition blackoilsolventmodules.hh:69
static void registerOutputModules(Model &model, Simulator &simulator)
Register all solvent specific VTK and ECL output modules.
Definition blackoilsolventmodules.hh:126
static void registerParameters()
Register all run-time parameters for the black-oil solvent module.
Definition blackoilsolventmodules.hh:116
static void registerParameters()
Register all run-time parameters for the immiscible model.
Definition multiphasebasemodel.hh:197
static void registerParameters()
Register all run-time parameters for the multi-phase VTK output module.
Definition vtkblackoilmodule.hpp:93
static void registerParameters()
Register all run-time parameters for the Vtk output module.
Definition vtkcompositionmodule.hpp:87
static void registerParameters()
Register all run-time parameters for the Vtk output module.
Definition vtkdiffusionmodule.hpp:88
A base class for fully-implicit multi-phase porous-media flow models which assume multiple fluid phas...
The generic type tag for problems using the immiscible multi-phase model.
Definition blackoilmodel.hh:82
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:45
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
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:240
Provides a Darcy flux module for the blackoil model.
Definition blackoildarcyfluxmodule.hh:49
The primary variable and equation indices for the three-phase black-oil model.
Definition blackoilvariableandequationindices.hh:47
The type of the base class for all problems which use this model.
Definition fvbaseproperties.hh:84
The relative weight of the residual of the energy equation compared to the mass residuals.
Definition blackoilproperties.hh:100
Similarly to the energy equation, a scaling is applied to the urea equation in MICP.
Definition blackoilproperties.hh:104
Enable surface volume scaling.
Definition blackoilproperties.hh:59
Type of object for specifying boundary conditions.
Definition fvbaseproperties.hh:119
Enable the ECL-blackoil extension for bioeffects (biofilm/MICP).
Definition blackoilproperties.hh:83
Enable the ECL-blackoil extension for salt.
Definition blackoilproperties.hh:67
Enable convective mixing?
Definition multiphasebaseproperties.hh:99
Enable diffusive fluxes?
Definition multiphasebaseproperties.hh:91
Enable the ECL-blackoil extension for disolution of gas into water.
Definition blackoilproperties.hh:79
Enable dispersive fluxes?
Definition multiphasebaseproperties.hh:95
Enable the ECL-blackoil extension for extended BO. ("Second gas" - alternative approach).
Definition blackoilproperties.hh:47
Enable the ECL-blackoil extension for foam.
Definition blackoilproperties.hh:63
Definition blackoilproperties.hh:86
Enable the tracking polymer molecular weight tracking and related functionalities.
Definition blackoilproperties.hh:55
Enable the ECL-blackoil extension for polymer.
Definition blackoilproperties.hh:51
Enable the ECL-blackoil extension for salt precipitation.
Definition blackoilproperties.hh:71
Enable the ECL-blackoil extension for solvents. ("Second gas").
Definition blackoilproperties.hh:43
Enable the ECL-blackoil extension for water evaporation.
Definition blackoilproperties.hh:75
Specifies who temperature is modeled by the simulator.
Definition blackoilproperties.hh:108
Data required to calculate a flux over a face.
Definition fvbaseproperties.hh:153
The fluid systems including the information about the phases.
Definition multiphasebaseproperties.hh:79
Specifies the relation used for velocity.
Definition multiphasebaseproperties.hh:83
Enumerations used by the model.
Definition multiphasebaseproperties.hh:51
The secondary variables within a sub-control volume.
Definition fvbaseproperties.hh:133
The type of the local residual function.
Definition fvbaseproperties.hh:94
The type of the model.
Definition basicproperties.hh:92
Specifies the type of the actual Newton method.
Definition newtonmethodproperties.hh:32
A vector of primary variables within a sub-control volume.
Definition fvbaseproperties.hh:130
Vector containing volumetric or areal rates of quantities.
Definition fvbaseproperties.hh:116
The discretization specific part of the intensive quantities.
Definition fvbaseproperties.hh:137
The type tag for the black-oil problems.
Definition blackoilmodel.hh:86
VTK output module for the black oil model's parameters.
VTK output module for the fluid composition.
VTK output module for quantities which make sense for models which incorperate molecular diffusion.