opm-simulators
blackoilbioeffectsmodules.hh
Go to the documentation of this file.
1 // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 // vi: set et ts=4 sw=4 sts=4:
3 /*
4  This file is part of the Open Porous Media project (OPM).
5 
6  OPM is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 2 of the License, or
9  (at your option) any later version.
10 
11  OPM is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OPM. If not, see <http://www.gnu.org/licenses/>.
18 
19  Consult the COPYING file in the top-level source directory of this
20  module for the precise wording of the license and the list of
21  copyright holders.
22 */
28 #ifndef OPM_BLACK_OIL_BIOEFFECTS_MODULE_HH
29 #define OPM_BLACK_OIL_BIOEFFECTS_MODULE_HH
30 
31 #include <dune/common/fvector.hh>
32 
33 #include <opm/common/utility/gpuDecorators.hpp>
34 
38 
40 
41 #include <cmath>
42 #include <memory>
43 #include <numeric>
44 
45 namespace Opm {
46 
94 template <class TypeTag>
95 class BlackOilBioeffectsModule<TypeTag, true>
96 {
100  using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
108 
109  using Toolbox = MathToolbox<Evaluation>;
110 
111  using TabulatedFunction = typename BlackOilBioeffectsParams<Scalar>::TabulatedFunction;
112 
113  enum { gasCompIdx = FluidSystem::gasCompIdx };
114 
115  static constexpr unsigned microbialConcentrationIdx = Indices::microbialConcentrationIdx;
116  static constexpr unsigned oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
117  static constexpr unsigned ureaConcentrationIdx = Indices::ureaConcentrationIdx;
118  static constexpr unsigned biofilmVolumeFractionIdx = Indices::biofilmVolumeFractionIdx;
119  static constexpr unsigned calciteVolumeFractionIdx = Indices::calciteVolumeFractionIdx;
120  static constexpr unsigned contiMicrobialEqIdx = Indices::contiMicrobialEqIdx;
121  static constexpr unsigned contiOxygenEqIdx = Indices::contiOxygenEqIdx;
122  static constexpr unsigned contiUreaEqIdx = Indices::contiUreaEqIdx;
123  static constexpr unsigned contiBiofilmEqIdx = Indices::contiBiofilmEqIdx;
124  static constexpr unsigned contiCalciteEqIdx = Indices::contiCalciteEqIdx;
125  static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
126 
127  static constexpr bool enableBioeffects = true;
128  static constexpr bool enableMICP = Indices::enableMICP;
129 
130  static constexpr unsigned numEq = getPropValue<TypeTag, Properties::NumEq>();
131 
132 public:
135  {
136  params_ = params;
137  }
138 
142  static void registerParameters()
143  {
144  if constexpr (enableBioeffects)
146  }
147 
151  static void registerOutputModules(Model& model,
152  Simulator& simulator)
153  {
154  if constexpr (enableBioeffects)
155  model.addOutputModule(std::make_unique<VtkBlackOilBioeffectsModule<TypeTag>>(simulator));
156  }
157 
158  static bool eqApplies(unsigned eqIdx)
159  {
160  if constexpr (enableBioeffects)
161  if constexpr (enableMICP)
162  return eqIdx == contiMicrobialEqIdx || eqIdx == contiOxygenEqIdx || eqIdx == contiUreaEqIdx
163  || eqIdx == contiBiofilmEqIdx || eqIdx == contiCalciteEqIdx;
164  else
165  return eqIdx == contiMicrobialEqIdx || eqIdx == contiBiofilmEqIdx;
166  else
167  return false;
168  }
169 
170  static Scalar eqWeight([[maybe_unused]] unsigned eqIdx)
171  {
172  assert(eqApplies(eqIdx));
173 
174  // TODO: it may be beneficial to chose this differently.
175  return static_cast<Scalar>(1.0);
176  }
177 
178  // must be called after water storage is computed
179  template <class StorageType>
180  OPM_HOST_DEVICE static void addStorage(StorageType& storage,
181  const IntensiveQuantities& intQuants)
182  {
183  using LhsEval = typename StorageType::value_type;
184  if constexpr (enableBioeffects) {
185  const auto& fs = intQuants.fluidState();
186  LhsEval surfaceVolumeWater = Toolbox::template decay<LhsEval>(fs.saturation(waterPhaseIdx)) *
187  Toolbox::template decay<LhsEval>(fs.invB(waterPhaseIdx)) *
188  Toolbox::template decay<LhsEval>(intQuants.porosity());
189  // avoid singular matrix if no water is present
190  surfaceVolumeWater = max(surfaceVolumeWater, 1e-10);
191  // suspended microbes in water phase
192  const LhsEval accumulationMicrobes = surfaceVolumeWater * Toolbox::template decay<LhsEval>(intQuants.microbialConcentration());
193  storage[contiMicrobialEqIdx] += accumulationMicrobes;
194  // biofilm
195  const LhsEval accumulationBiofilm = Toolbox::template decay<LhsEval>(intQuants.biofilmVolumeFraction());
196  storage[contiBiofilmEqIdx] += accumulationBiofilm;
197  if constexpr (enableMICP) {
198  // oxygen in water phase
199  const LhsEval accumulationOxygen = surfaceVolumeWater * Toolbox::template decay<LhsEval>(intQuants.oxygenConcentration());
200  storage[contiOxygenEqIdx] += accumulationOxygen;
201  // urea in water phase (applying the scaling factor for the urea equation)
202  const LhsEval accumulationUrea = surfaceVolumeWater * Toolbox::template decay<LhsEval>(intQuants.ureaConcentration());
203  storage[contiUreaEqIdx] += accumulationUrea;
204  storage[contiUreaEqIdx] *= getPropValue<TypeTag, Properties::BlackOilUreaScalingFactor>();
205  // calcite
206  const LhsEval accumulationCalcite = Toolbox::template decay<LhsEval>(intQuants.calciteVolumeFraction());
207  storage[contiCalciteEqIdx] += accumulationCalcite;
208  }
209  }
210  }
211 
212  template <class UpEval>
213  static void addBioeffectsFluxes_(RateVector& flux,
214  unsigned phaseIdx,
215  const Evaluation& volumeFlux,
216  const IntensiveQuantities& upFs)
217  {
218  if (phaseIdx == waterPhaseIdx) {
219  if constexpr (enableBioeffects) {
220  flux[contiMicrobialEqIdx] =
221  decay<UpEval>(upFs.microbialConcentration())
222  * decay<UpEval>(upFs.fluidState().invB(waterPhaseIdx))
223  * volumeFlux;
224  if constexpr (enableMICP) {
225  flux[contiOxygenEqIdx] =
226  decay<UpEval>(upFs.oxygenConcentration())
227  * decay<UpEval>(upFs.fluidState().invB(waterPhaseIdx))
228  * volumeFlux;
229  flux[contiUreaEqIdx] =
230  decay<UpEval>(upFs.ureaConcentration())
231  * decay<UpEval>(upFs.fluidState().invB(waterPhaseIdx))
232  * volumeFlux;
233  }
234  }
235  }
236  }
237 
238  // since the urea concentration can be much larger than 1, then we apply a scaling factor
239  static void applyScaling(RateVector& flux)
240  {
241  if constexpr (enableMICP) {
242  flux[contiUreaEqIdx] *= getPropValue<TypeTag, Properties::BlackOilUreaScalingFactor>();
243  }
244  }
245 
246  static void computeFlux([[maybe_unused]] RateVector& flux,
247  [[maybe_unused]] const ElementContext& elemCtx,
248  [[maybe_unused]] unsigned scvfIdx,
249  [[maybe_unused]] unsigned timeIdx)
250  {
251  if constexpr (enableBioeffects) {
252  const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
253  unsigned focusIdx = elemCtx.focusDofIndex();
254  unsigned upIdx = extQuants.upstreamIndex(waterPhaseIdx);
255  flux[contiMicrobialEqIdx] = 0.0;
256  if constexpr (enableMICP) {
257  flux[contiOxygenEqIdx] = 0.0;
258  flux[contiUreaEqIdx] = 0.0;
259  }
260  if (upIdx == focusIdx)
261  addBioeffectsFluxes_<Evaluation>(flux, elemCtx, scvfIdx, timeIdx);
262  else
263  addBioeffectsFluxes_<Scalar>(flux, elemCtx, scvfIdx, timeIdx);
264  }
265  }
266 
267  template <class UpstreamEval>
268  static void addBioeffectsFluxes_(RateVector& flux,
269  const ElementContext& elemCtx,
270  unsigned scvfIdx,
271  unsigned timeIdx)
272  {
273  const auto& extQuants = elemCtx.extensiveQuantities(scvfIdx, timeIdx);
274  unsigned upIdx = extQuants.upstreamIndex(waterPhaseIdx);
275  const auto& up = elemCtx.intensiveQuantities(upIdx, timeIdx);
276  const auto& volFlux = extQuants.volumeFlux(waterPhaseIdx);
277  addBioeffectsFluxes_<UpstreamEval>(flux, waterPhaseIdx, volFlux, up);
278  }
279 
280  static void addSource(RateVector& source,
281  const Problem& problem,
282  const IntensiveQuantities& intQuants,
283  unsigned globalSpaceIdex)
284  {
285  if constexpr (enableBioeffects) {
286  const auto b = intQuants.fluidState().invB(waterPhaseIdx);
287  unsigned satnumIdx = problem.satnumRegionIndex(globalSpaceIdex);
288  Scalar rho_b = densityBiofilm(satnumIdx);
289  Scalar k_d = microbialDeathRate(satnumIdx);
290  Scalar mu = maximumGrowthRate(satnumIdx);
291  Scalar k_n = halfVelocityGrowth(satnumIdx);
292  Scalar Y = yieldGrowthCoefficient(satnumIdx);
293  Scalar k_a = microbialAttachmentRate(satnumIdx);
294  Scalar k_str = detachmentRate(satnumIdx);
295  Scalar eta = detachmentExponent(satnumIdx);
296  const auto& velocityInf = problem.model().linearizer().getVelocityInfo();
297  auto velocityInfos = velocityInf[globalSpaceIdex];
298  Scalar normVelocityCell =
299  std::accumulate(velocityInfos.begin(), velocityInfos.end(), 0.0,
300  [](const auto acc, const auto& info)
301  { return max(acc, std::abs(info.velocity[waterPhaseIdx])); });
302  if constexpr (enableMICP) {
303  Scalar rho_c = densityCalcite(satnumIdx);
304  Scalar k_u = halfVelocityUrea(satnumIdx);
305  Scalar mu_u = maximumUreaUtilization(satnumIdx);
306  Scalar F = oxygenConsumptionFactor(satnumIdx);
307  Scalar Y_uc = yieldUreaToCalciteCoefficient(satnumIdx);
308 
309  // compute Monod terms (the negative region is replaced by a straight line)
310  // Schäfer et al (1998) https://doi.org/10.1016/S0169-7722(97)00060-0
311  Evaluation k_g = mu * intQuants.oxygenConcentration() / (k_n + intQuants.oxygenConcentration());
312  Evaluation k_c = mu_u * intQuants.ureaConcentration() / (k_u + intQuants.ureaConcentration());
313  if (intQuants.oxygenConcentration() < 0) {
314  k_g = mu * intQuants.oxygenConcentration() / k_n;
315  }
316  if (intQuants.ureaConcentration() < 0) {
317  k_c = mu_u * intQuants.ureaConcentration() / k_u;
318  }
319 
320  // compute the processes
321  // see https://doi.org/10.1016/j.ijggc.2021.103256 for the MICP processes in the model
322  source[Indices::contiMicrobialEqIdx] += intQuants.microbialConcentration() * intQuants.porosity() *
323  b * (Y * k_g - k_d - k_a) +
324  rho_b * intQuants.biofilmVolumeFraction() * k_str * pow(normVelocityCell / intQuants.porosity(), eta);
325 
326  source[Indices::contiOxygenEqIdx] -= (intQuants.microbialConcentration() * intQuants.porosity() *
327  b + rho_b * intQuants.biofilmVolumeFraction()) * F * k_g;
328 
329  source[Indices::contiUreaEqIdx] -= rho_b * intQuants.biofilmVolumeFraction() * k_c;
330 
331  source[Indices::contiBiofilmEqIdx] += intQuants.biofilmVolumeFraction() * (Y * k_g - k_d -
332  k_str * pow(normVelocityCell / intQuants.porosity(), eta) - Y_uc * (rho_b / rho_c) *
333  intQuants.biofilmVolumeFraction() * k_c / (intQuants.porosity() +
334  intQuants.biofilmVolumeFraction())) + k_a * intQuants.microbialConcentration() *
335  intQuants.porosity() * b / rho_b;
336 
337  source[Indices::contiCalciteEqIdx] += (rho_b / rho_c) * intQuants.biofilmVolumeFraction() * Y_uc * k_c;
338 
339  // since the urea concentration can be much larger than 1, then we apply a scaling factor
340  source[Indices::contiUreaEqIdx] *= getPropValue<TypeTag, Properties::BlackOilUreaScalingFactor>();
341  }
342  else {
343  const Scalar normVelocityCellG =
344  std::accumulate(velocityInfos.begin(), velocityInfos.end(), 0.0,
345  [](const auto acc, const auto& info)
346  { return max(acc, std::abs(info.velocity[1])); });
347  normVelocityCell = max(normVelocityCellG, normVelocityCell);
348  // convert Rsw to concentration to use in source term
349  const auto& fs = intQuants.fluidState();
350  const auto& Sw = fs.saturation(waterPhaseIdx);
351  const auto& Rsw = fs.Rsw();
352  const auto& rhow = fs.density(waterPhaseIdx);
353  unsigned pvtRegionIndex = fs.pvtRegionIndex();
354 
355  const auto& xG = RswToMassFraction(pvtRegionIndex, Rsw);
356 
357  // get the porosity and and gas density for convenience
358  const Evaluation& poro = intQuants.porosity();
359  Scalar rho_gRef = FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, pvtRegionIndex);
360 
361  // calculate biofilm growth rate
362  Evaluation k_g = mu * (xG * rhow * poro * Sw / (xG * rhow * poro * Sw + k_n));
363  if (xG < 0) {
364  k_g = mu * (xG * rhow * poro * Sw / k_n);
365  }
366 
367  // compute source terms
368  // decay, detachment, and attachment rate of suspended microbes
369  source[contiMicrobialEqIdx] += Sw * intQuants.microbialConcentration() * intQuants.porosity() * b
370  * (- k_a - k_d)
371  + intQuants.biofilmVolumeFraction() * rho_b * k_str
372  * pow(normVelocityCell / intQuants.porosity(), eta);
373  // biofilm growth and decay rate
374  source[contiBiofilmEqIdx] += (k_g - k_d - k_str * pow(normVelocityCell / intQuants.porosity(), eta))
375  * intQuants.biofilmVolumeFraction()
376  + k_a * Sw * intQuants.microbialConcentration() * intQuants.porosity() * b / rho_b;
377 
378  // biofilm consumption of dissolved gas is proportional to biofilm growth rate
379  unsigned activeGasCompIdx = FluidSystem::canonicalToActiveCompIdx(gasCompIdx);
380  source[activeGasCompIdx] -= intQuants.biofilmVolumeFraction() * rho_b * k_g / (Y * rho_gRef);
381  }
382  }
383  }
384 
385  static void addSource([[maybe_unused]] RateVector& source,
386  [[maybe_unused]] const ElementContext& elemCtx,
387  [[maybe_unused]] unsigned dofIdx,
388  [[maybe_unused]] unsigned timeIdx)
389  {
390  if constexpr (enableMICP) {
391  const auto& problem = elemCtx.problem();
392  const auto& intQuants = elemCtx.intensiveQuantities(dofIdx, timeIdx);
393  addSource(source, problem, intQuants, dofIdx);
394  }
395  }
396 
397  static const Scalar densityBiofilm(unsigned satnumRegionIdx)
398  {
399  return params_.densityBiofilm_[satnumRegionIdx];
400  }
401 
402  static const Scalar densityCalcite(unsigned satnumRegionIdx)
403  {
404  return params_.densityCalcite_[satnumRegionIdx];
405  }
406 
407  static const Scalar detachmentRate(unsigned satnumRegionIdx)
408  {
409  return params_.detachmentRate_[satnumRegionIdx];
410  }
411 
412  static const Scalar detachmentExponent(unsigned satnumRegionIdx)
413  {
414  return params_.detachmentExponent_[satnumRegionIdx];
415  }
416 
417  static const Scalar halfVelocityGrowth(unsigned satnumRegionIdx)
418  {
419  return params_.halfVelocityGrowth_[satnumRegionIdx];
420  }
421 
422  static const Scalar halfVelocityUrea(unsigned satnumRegionIdx)
423  {
424  return params_.halfVelocityUrea_[satnumRegionIdx];
425  }
426 
427  static const Scalar maximumGrowthRate(unsigned satnumRegionIdx)
428  {
429  return params_.maximumGrowthRate_[satnumRegionIdx];
430  }
431 
432  static const Scalar maximumUreaUtilization(unsigned satnumRegionIdx)
433  {
434  return params_.maximumUreaUtilization_[satnumRegionIdx];
435  }
436 
437  static const Scalar microbialAttachmentRate(unsigned satnumRegionIdx)
438  {
439  return params_.microbialAttachmentRate_[satnumRegionIdx];
440  }
441 
442  static const Scalar microbialDeathRate(unsigned satnumRegionIdx)
443  {
444  return params_.microbialDeathRate_[satnumRegionIdx];
445  }
446 
447  static const Scalar oxygenConsumptionFactor(unsigned satnumRegionIdx)
448  {
449  return params_.oxygenConsumptionFactor_[satnumRegionIdx];
450  }
451 
452  static const Scalar yieldGrowthCoefficient(unsigned satnumRegionIdx)
453  {
454  return params_.yieldGrowthCoefficient_[satnumRegionIdx];
455  }
456 
457  static const Scalar yieldUreaToCalciteCoefficient(unsigned satnumRegionIdx)
458  {
459  return params_.yieldUreaToCalciteCoefficient_[satnumRegionIdx];
460  }
461 
462  static const Scalar bioDiffCoefficient(unsigned pvtRegionIdx, unsigned compIdx)
463  {
464  return params_.bioDiffCoefficient_[pvtRegionIdx][compIdx];
465  }
466 
467  static const TabulatedFunction& permfactTable(const ElementContext& elemCtx,
468  unsigned scvIdx,
469  unsigned timeIdx)
470  {
471  unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, scvIdx, timeIdx);
472  return params_.permfactTable_[satnumRegionIdx];
473  }
474 
475  static const TabulatedFunction& permfactTable(unsigned satnumRegionIdx)
476  {
477  return params_.permfactTable_[satnumRegionIdx];
478  }
479 
480  static const TabulatedFunction& pcfactTable(unsigned satnumRegionIdx)
481  {
482  return params_.pcfactTable_[satnumRegionIdx];
483  }
484 
485  static bool hasPcfactTables()
486  {
487  if constexpr (enableBioeffects && !enableMICP) {
488  return !params_.pcfactTable_.empty();
489  }
490  else {
491  return false;
492  }
493  }
494 
495 private:
496  static BlackOilBioeffectsParams<Scalar> params_;
497 
498  static Evaluation RswToMassFraction(unsigned regionIdx, const Evaluation& Rsw) {
499  Scalar rho_wRef = FluidSystem::referenceDensity(FluidSystem::waterPhaseIdx, regionIdx);
500  Scalar rho_gRef = FluidSystem::referenceDensity(FluidSystem::gasPhaseIdx, regionIdx);
501 
502  const Evaluation rho_oG = Rsw * rho_gRef;
503 
504  return rho_oG / (rho_wRef + rho_oG);
505  }
506 };
507 
508 
509 template <class TypeTag>
510 BlackOilBioeffectsParams<typename BlackOilBioeffectsModule<TypeTag, true>::Scalar>
511 BlackOilBioeffectsModule<TypeTag, true>::params_;
512 
520 template <class TypeTag>
522 {
524 
530 
532 
533  static constexpr unsigned microbialConcentrationIdx = Indices::microbialConcentrationIdx;
534  static constexpr unsigned oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
535  static constexpr unsigned ureaConcentrationIdx = Indices::ureaConcentrationIdx;
536  static constexpr unsigned biofilmVolumeFractionIdx = Indices::biofilmVolumeFractionIdx;
537  static constexpr unsigned calciteVolumeFractionIdx = Indices::calciteVolumeFractionIdx;
538  static constexpr bool enableMICP = Indices::enableMICP;
539 
540 public:
541 
547  void bioeffectsPropertiesUpdate_(const ElementContext& elemCtx,
548  unsigned dofIdx,
549  unsigned timeIdx)
550  {
551  const auto linearizationType = elemCtx.linearizationType();
552  const PrimaryVariables& priVars = elemCtx.primaryVars(dofIdx, timeIdx);
553  const Scalar referencePorosity_ = elemCtx.problem().referencePorosity(dofIdx, timeIdx);
554  unsigned satnumRegionIdx = elemCtx.problem().satnumRegionIndex(elemCtx, dofIdx, timeIdx);
555 
556  microbialConcentration_ = priVars.makeEvaluation(microbialConcentrationIdx, timeIdx, linearizationType);
557  biofilmVolumeFraction_ = priVars.makeEvaluation(biofilmVolumeFractionIdx, timeIdx, linearizationType);
558  biofilmMass_ = biofilmVolumeFraction_ * BioeffectsModule::densityBiofilm(satnumRegionIdx);
559  calciteVolumeFraction_ = 0.0;
560  if constexpr (enableMICP) {
561  oxygenConcentration_ = priVars.makeEvaluation(oxygenConcentrationIdx, timeIdx, linearizationType);
562  ureaConcentration_ = priVars.makeEvaluation(ureaConcentrationIdx, timeIdx, linearizationType);
563  calciteVolumeFraction_ = priVars.makeEvaluation(calciteVolumeFractionIdx, timeIdx, linearizationType);
564  calciteMass_ = calciteVolumeFraction_ * BioeffectsModule::densityCalcite(satnumRegionIdx);
565  }
566  const Evaluation poroFact = min(1.0 - (biofilmVolumeFraction_ + calciteVolumeFraction_) /
567  (referencePorosity_), 1.0); //phi/phi_0
568 
569  const auto& permfactTable = BioeffectsModule::permfactTable(satnumRegionIdx);
570  permFactor_ = permfactTable.eval(poroFact, /*extrapolation=*/true);
571  }
572 
573  const Evaluation& microbialConcentration() const
574  { return microbialConcentration_; }
575 
576  const Evaluation& oxygenConcentration() const
577  { return oxygenConcentration_; }
578 
579  const Evaluation& ureaConcentration() const
580  { return ureaConcentration_; }
581 
582  const Evaluation& biofilmVolumeFraction() const
583  { return biofilmVolumeFraction_; }
584 
585  const Evaluation& calciteVolumeFraction() const
586  { return calciteVolumeFraction_; }
587 
588  const Evaluation biofilmMass() const
589  { return biofilmMass_; }
590 
591  const Evaluation calciteMass() const
592  { return calciteMass_; }
593 
594  const Evaluation& permFactor() const
595  { return permFactor_; }
596 
597 protected:
598  Evaluation microbialConcentration_;
599  Evaluation oxygenConcentration_;
600  Evaluation ureaConcentration_;
601  Evaluation biofilmVolumeFraction_;
602  Evaluation calciteVolumeFraction_;
603  Evaluation biofilmMass_;
604  Evaluation calciteMass_;
605  Evaluation permFactor_;
606  Evaluation pcFactor_;
607 };
608 
616 template <class TypeTag>
618 {
619 };
620 
621 } // namespace Opm
622 
623 #endif
void bioeffectsPropertiesUpdate_(const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the intensive properties needed to handle bioeffects from the primary variables.
Definition: blackoilbioeffectsmodules.hh:547
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
Struct holding the parameters for the BlackOilBioeffectsModule class.
Definition: blackoilbioeffectsparams.hpp:41
static void setParams(BlackOilBioeffectsParams< Scalar > &&params)
Set parameters.
Definition: blackoilbioeffectsmodules.hh:134
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
Contains classes extending the black-oil model.
Declares the properties required by the black oil model.
Provides the bioeffects specific extensive quantities to the generic black-oil module&#39;s extensive qua...
VTK output module for the Bioeffect model&#39;s related quantities.
Definition: vtkblackoilbioeffectsmodule.hpp:52
Contains the parameters required to extend the black-oil model by bioeffects.
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 multi-phase VTK output module.
Definition: vtkblackoilbioeffectsmodule.hpp:85
static void registerParameters()
Register all run-time parameters for the black-oil bioeffects module.
Definition: blackoilbioeffectsmodules.hh:142
Provides the volumetric quantities required for the equations needed by the bioeffects extension of t...
static void registerOutputModules(Model &model, Simulator &simulator)
Register all bioeffects specific VTK and ECL output modules.
Definition: blackoilbioeffectsmodules.hh:151
VTK output module for the Bioeffect model&#39;s related quantities.