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> 75 template <
class TypeTag>
86 {
using InheritsFrom = std::tuple<VtkBlackOilPolymer, MultiPhaseBaseModel>; };
90 template<
class TypeTag>
95 template<
class TypeTag>
100 template<
class TypeTag>
105 template<
class TypeTag>
110 template<
class TypeTag>
115 template<
class TypeTag>
120 template<
class TypeTag>
125 template<
class TypeTag>
130 template<
class TypeTag>
136 template<
class TypeTag>
141 template<
class TypeTag>
145 getPropValue<TypeTag, Properties::EnableExtbo>(),
146 getPropValue<TypeTag, Properties::EnablePolymer>(),
147 getPropValue<TypeTag, Properties::EnergyModuleType>() == EnergyModules::FullyImplicitThermal,
148 getPropValue<TypeTag, Properties::EnableFoam>(),
149 getPropValue<TypeTag, Properties::EnableBrine>(),
151 getPropValue<TypeTag, Properties::EnableBioeffects>()>;
155 template<
class TypeTag>
161 using type = BlackOilFluidSystem<Scalar>;
165 template<
class TypeTag>
167 {
static constexpr
bool value =
false; };
169 template<
class TypeTag>
171 {
static constexpr
bool value =
false; };
173 template<
class TypeTag>
175 {
static constexpr
bool value =
false; };
177 template<
class TypeTag>
179 {
static constexpr
bool value =
false; };
181 template<
class TypeTag>
183 {
static constexpr
bool value =
false; };
185 template<
class TypeTag>
187 {
static constexpr
bool value =
false; };
189 template<
class TypeTag>
191 {
static constexpr
bool value =
false; };
193 template<
class TypeTag>
195 {
static constexpr
bool value =
false; };
197 template<
class TypeTag>
199 {
static constexpr
bool value =
false; };
201 template<
class TypeTag>
203 {
static constexpr
bool value =
false; };
205 template<
class TypeTag>
207 {
static constexpr EnergyModules value = EnergyModules::NoTemperature; };
210 template<
class TypeTag>
212 {
static constexpr
bool value =
false; };
215 template<
class TypeTag>
217 {
static constexpr
bool value =
false; };
219 template<
class TypeTag>
221 {
static constexpr
bool value =
false; };
223 template<
class TypeTag>
225 {
static constexpr
bool value =
false; };
227 template<
class TypeTag>
229 {
static constexpr
bool value =
false; };
237 template<
class TypeTag>
242 static constexpr Scalar alpha =
243 getPropValue<TypeTag, Properties::BlackoilConserveSurfaceVolume>() ? 1000.0 : 1.0;
247 static constexpr Scalar value = 1.0/(30.0*4184.0*alpha);
251 template<
class TypeTag>
256 static constexpr Scalar alpha =
257 getPropValue<TypeTag, Properties::BlackoilConserveSurfaceVolume>() ? 1000.0 : 1.0;
261 static constexpr Scalar value = 1.0/(10.0*alpha);
266 template<
class TypeTag>
268 {
static constexpr
bool value =
false; };
337 template<
class TypeTag >
355 enum { numComponents = FluidSystem::numComponents };
356 enum { numEq = getPropValue<TypeTag, Properties::NumEq>() };
357 enum { enableDiffusion = getPropValue<TypeTag, Properties::EnableDiffusion>() };
358 enum { enableDispersion = getPropValue<TypeTag, Properties::EnableDispersion>() };
360 static constexpr
bool compositionSwitchEnabled = Indices::compositionSwitchIdx >= 0;
361 static constexpr
bool waterEnabled = Indices::waterEnabled;
363 using SolventModule = BlackOilSolventModule<TypeTag>;
364 using ExtboModule = BlackOilExtboModule<TypeTag>;
365 using PolymerModule = BlackOilPolymerModule<TypeTag>;
366 using EnergyModule = BlackOilEnergyModule<TypeTag>;
367 using DiffusionModule = BlackOilDiffusionModule<TypeTag, enableDiffusion>;
368 using DispersionModule = BlackOilDispersionModule<TypeTag, enableDispersion>;
369 using BioeffectsModule = BlackOilBioeffectsModule<TypeTag>;
372 using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>;
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);
713 #endif // OPM_BLACK_OIL_MODEL_HPP Contains the classes required to extend the black-oil model to include the effects of foam...
Definition: blackoilproperties.hh:86
void deserialize(Restarter &res)
Deserializes the state of the model.
Definition: blackoilmodel.hh:637
Enable dispersive fluxes?
Definition: multiphasebaseproperties.hh:95
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
Base class for all problems which use the black-oil model.
The type of the base class for all problems which use this model.
Definition: fvbaseproperties.hh:84
The type of the local residual function.
Definition: fvbaseproperties.hh:94
Contains the classes required to extend the black-oil model by solvent component. ...
Specifies the type of the actual Newton method.
Definition: fvbaseproblem.hh:54
Enable the ECL-blackoil extension for polymer.
Definition: blackoilproperties.hh:51
static void registerParameters()
Register all run-time parameters for the Vtk output module.
Definition: vtkcompositionmodule.hpp:87
Enumerations used by the model.
Definition: multiphasebaseproperties.hh:51
Contains the quantities which are are constant within a finite volume in the black-oil model...
Similarly to the energy equation, a scaling is applied to the urea equation in MICP.
Definition: blackoilproperties.hh:104
static void registerParameters()
Register all run-time parameters for the black-oil bioeffects module.
Definition: blackoilbioeffectsmodules.hh:141
Implements a boundary vector for the fully implicit black-oil model.
Scalar primaryVarWeight(unsigned globalDofIdx, unsigned pvIdx) const
Returns the relative weight of a primary variable for calculating relative errors.
Definition: blackoilmodel.hh:467
Enable the ECL-blackoil extension for disolution of gas into water.
Definition: blackoilproperties.hh:79
Enable the ECL-blackoil extension for water evaporation.
Definition: blackoilproperties.hh:75
Contains the classes required to extend the black-oil model by solvents.
static void registerParameters()
Register all run-time parameters for the immiscible model.
Definition: blackoilmodel.hh:383
static void registerOutputModules(Model &model, Simulator &simulator)
Register all energy specific VTK and ECL output modules.
Definition: blackoilenergymodules.hh:99
Contains the quantities which are are constant within a finite volume in the black-oil model...
Definition: blackoilintensivequantities.hh:74
std::string eqName(int eqIdx) const
Given an equation index, return a human readable name.
Definition: blackoilmodel.hh:440
Classes required for molecular diffusion.
Enable the ECL-blackoil extension for salt precipitation.
Definition: blackoilproperties.hh:71
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Enable the ECL-blackoil extension for solvents. ("Second gas")
Definition: blackoilproperties.hh:43
The discretization specific part of the intensive quantities.
Definition: fvbaseproperties.hh:137
VTK output module for the black oil model's parameters.
static std::string name()
Definition: blackoilmodel.hh:403
Vector containing volumetric or areal rates of quantities.
Definition: fvbaseproperties.hh:116
Type of object for specifying boundary conditions.
Definition: fvbaseproperties.hh:119
static void registerParameters()
Register all run-time parameters for the Vtk output module.
Definition: vtkdiffusionmodule.hpp:88
The fluid systems including the information about the phases.
Definition: multiphasebaseproperties.hh:79
Declares the properties required by the black oil model.
Enable the ECL-blackoil extension for foam.
Definition: blackoilproperties.hh:63
Enable the ECL-blackoil extension for extended BO. ("Second gas" - alternative approach) ...
Definition: blackoilproperties.hh:47
This file contains the default flux module of the blackoil model.
The primary variable and equation indices for the three-phase black-oil model.
Definition: blackoilvariableandequationindices.hh:46
static void registerParameters()
Register all run-time parameters for the immiscible model.
Definition: multiphasebasemodel.hh:197
Calculates the local residual of the black oil model.
A newton solver which is specific to the black oil model.
Definition: blackoilnewtonmethod.hpp:60
Data required to calculate a flux over a face.
Definition: fvbaseproperties.hh:153
Specifies who temperature is modeled by the simulator.
Definition: blackoilproperties.hh:108
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
Enable the ECL-blackoil extension for bioeffects (biofilm/MICP)
Definition: blackoilproperties.hh:83
Calculates the local residual of the black oil model.
Definition: blackoillocalresidual.hh:55
The relative weight of the residual of the energy equation compared to the mass residuals.
Definition: blackoilproperties.hh:100
Implements a vector representing mass, molar or volumetric rates for the black oil model...
static void registerParameters()
Register all run-time parameters for the black-oil energy module.
Definition: blackoilenergymodules.hh:89
Contains the classes required to extend the black-oil model by brine.
static void registerOutputModules(Model &model, Simulator &simulator)
Register all bioeffects specific VTK and ECL output modules.
Definition: blackoilbioeffectsmodules.hh:150
Provides a Darcy flux module for the blackoil model.
Definition: blackoildarcyfluxmodule.hh:48
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
Represents the primary variables used by the black-oil model.
This template class contains the data which is required to calculate the fluxes of the fluid phases o...
Definition: blackoilextensivequantities.hh:52
The secondary variables within a sub-control volume.
Definition: fvbaseproperties.hh:133
This template class contains the data which is required to calculate the fluxes of the fluid phases o...
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:71
static void registerParameters()
Register all run-time parameters for the black-oil solvent module.
Definition: blackoilsolventmodules.hh:116
Specifies the relation used for velocity.
Definition: multiphasebaseproperties.hh:83
The type of the model.
Definition: basicproperties.hh:92
static void registerParameters()
Register all run-time parameters for the black-oil polymer module.
Definition: blackoilpolymermodules.hh:147
Classes required for mechanical dispersion.
Scalar eqWeight(unsigned globalDofIdx, unsigned eqIdx) const
Returns the relative weight of an equation.
Definition: blackoilmodel.hh:523
Enable surface volume scaling.
Definition: blackoilproperties.hh:59
Implements a vector representing mass, molar or volumetric rates for the black oil model...
Definition: blackoilratevector.hh:59
The primary variable and equation indices for the three-phase black-oil model.
A base class for fully-implicit multi-phase porous-media flow models which assume multiple fluid phas...
static void registerParameters()
Register all run-time parameters for the multi-phase VTK output module.
Definition: vtkblackoilmodule.hpp:93
The primary variable and equation indices for the black-oil model.
Implements a boundary vector for the fully implicit black-oil model.
Definition: blackoilboundaryratevector.hh:47
Contains the classes required to extend the black-oil model by bioeffects.
Contains the classes required to extend the black-oil model by energy.
A fully-implicit black-oil flow model.
Definition: blackoilmodel.hh:76
std::string primaryVarName(int pvIdx) const
Given an primary variable index, return a human readable name.
Definition: blackoilmodel.hh:409
Enable the ECL-blackoil extension for salt.
Definition: blackoilproperties.hh:67
Manages the initializing and running of time dependent problems.
Definition: simulator.hh:83
Definition: blackoilmodel.hh:80
static void registerParameters()
Register all run-time parameters for the black-oil solvent module.
Definition: blackoilextbomodules.hh:97
A newton solver which is specific to the black oil model.
VTK output module for quantities which make sense for models which incorperate molecular diffusion...
Enable the tracking polymer molecular weight tracking and related functionalities.
Definition: blackoilproperties.hh:55
A vector of primary variables within a sub-control volume.
Definition: fvbaseproperties.hh:130
Contains the classes required to extend the black-oil model by polymer.
Enable diffusive fluxes?
Definition: multiphasebaseproperties.hh:91
static void registerOutputModules(Model &model, Simulator &simulator)
Register all solvent specific VTK and ECL output modules.
Definition: blackoilsolventmodules.hh:126
VTK output module for the fluid composition.
Base class for all problems which use the black-oil model.
Definition: blackoilproblem.hh:42
Enable convective mixing?
Definition: multiphasebaseproperties.hh:99
The type tag for the black-oil problems.
Definition: blackoilmodel.hh:85
A base class for fully-implicit multi-phase porous-media flow models which assume multiple fluid phas...
Definition: multiphasebasemodel.hh:57