opm-simulators
blackoildiffusionmodule.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_BLACKOIL_DIFFUSION_MODULE_HH
29 #define OPM_BLACKOIL_DIFFUSION_MODULE_HH
30 
31 #include <dune/common/fvector.hh>
32 
33 #include <opm/common/utility/gpuDecorators.hpp>
34 
35 #include <opm/input/eclipse/EclipseState/EclipseState.hpp>
36 
37 #include <opm/material/common/MathToolbox.hpp>
38 #include <opm/material/common/Valgrind.hpp>
39 
44 
45 #include <array>
46 #include <stdexcept>
47 
48 namespace Opm {
49 
56 template <class TypeTag>
57 class BlackOilDiffusionModule<TypeTag, /*enableDiffusion=*/true>
58 {
65 
66  static constexpr bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
67  using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
68 
69  enum { numPhases = FluidSystem::numPhases };
70  enum { conti0EqIdx = Indices::conti0EqIdx };
71 
72  enum { enableMICP = Indices::enableMICP };
73 
74  static constexpr unsigned contiMicrobialEqIdx = Indices::contiMicrobialEqIdx;
75  static constexpr unsigned contiOxygenEqIdx = Indices::contiOxygenEqIdx;
76  static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
77  static constexpr unsigned contiUreaEqIdx = Indices::contiUreaEqIdx;
78 
79  using Toolbox = MathToolbox<Evaluation>;
80 
81 public:
83 
87  static void initFromState(const EclipseState& eclState)
88  {
89  // TODO: support use_move_fraction on GPUs
90  #if OPM_IS_INSIDE_HOST_FUNCTION
91  use_mole_fraction_ = eclState.getTableManager().diffMoleFraction();
92  #else
93  OPM_THROW(std::runtime_error, "Diffusion module: Calling initFromState not expected on GPU.");
94  #endif
95  }
96 
100  static void registerParameters()
101  {}
102 
125  template <class Context>
126  OPM_HOST_DEVICE static void addDiffusiveFlux(RateVector& flux, const Context& context,
127  unsigned spaceIdx, unsigned timeIdx)
128  {
129  // Only work if diffusion is enabled run-time by DIFFUSE in the deck
130  if (!FluidSystem::enableDiffusion()) {
131  return;
132  }
133 
134  const auto& extQuants = context.extensiveQuantities(spaceIdx, timeIdx);
135  const auto& inIq = context.intensiveQuantities(extQuants.interiorIndex(), timeIdx);
136  const auto& exIq = context.intensiveQuantities(extQuants.exteriorIndex(), timeIdx);
137  const auto& diffusivity = extQuants.diffusivity();
138  const auto& effectiveDiffusionCoefficient = extQuants.effectiveDiffusionCoefficient();
139  addDiffusiveFlux(flux, inIq, exIq, diffusivity, effectiveDiffusionCoefficient);
140  if constexpr (enableBioeffects) {
141  const auto& effectiveBioDiffCoefficient = extQuants.effectiveBioDiffCoefficient();
142  addBioDiffFlux(flux, inIq, exIq, diffusivity, effectiveBioDiffCoefficient);
143  }
144  }
145 
146  template<class IntensiveQuantities,class EvaluationArray, class RateVectorT>
147  OPM_HOST_DEVICE static void addDiffusiveFlux(RateVectorT& flux,
148  const IntensiveQuantities& inIq,
149  const IntensiveQuantities& exIq,
150  const Evaluation& diffusivity,
151  const EvaluationArray& effectiveDiffusionCoefficient)
152  {
153  const FluidSystem& fsys = inIq.getFluidSystem();
154 
155  const auto& inFs = inIq.fluidState();
156  const auto& exFs = exIq.fluidState();
157  unsigned pvtRegionIndex = inFs.pvtRegionIndex();
158  Evaluation diffR = 0.0;
159 
160  for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
161  if (!fsys.phaseIsActive(phaseIdx)) {
162  continue;
163  }
164 
165  // no diffusion in water for blackoil models
166  if (!fsys.enableDissolvedGasInWater() && fsys.waterPhaseIdx == phaseIdx) {
167  continue;
168  }
169 
170  // no diffusion in gas phase in water + gas system.
171  if (fsys.gasPhaseIdx == phaseIdx && !fsys.phaseIsActive(fsys.oilPhaseIdx)) {
172  continue;
173  }
174 
175  // arithmetic mean of the phase's b factor weighed by saturation
176  Evaluation bSAvg = inFs.saturation(phaseIdx) * inFs.invB(phaseIdx);
177  bSAvg += Toolbox::value(exFs.saturation(phaseIdx)) * Toolbox::value(exFs.invB(phaseIdx));
178  bSAvg /= 2;
179 
180  // phase not present, skip
181  if (bSAvg < 1.0e-6) {
182  continue;
183  }
184  Evaluation convFactor = 1.0;
185  if (fsys.enableDissolvedGas() &&
186  fsys.phaseIsActive(fsys.gasPhaseIdx) &&
187  phaseIdx == fsys.oilPhaseIdx)
188  {
189  const Evaluation rsAvg = (inFs.Rs() + Toolbox::value(exFs.Rs())) / 2;
190  convFactor = 1.0 / (toFractionGasOil(pvtRegionIndex, fsys) + rsAvg);
191  diffR = inFs.Rs() - Toolbox::value(exFs.Rs());
192  }
193  if (fsys.enableVaporizedOil() &&
194  fsys.phaseIsActive(fsys.oilPhaseIdx) &&
195  phaseIdx == fsys.gasPhaseIdx)
196  {
197  const Evaluation rvAvg = (inFs.Rv() + Toolbox::value(exFs.Rv())) / 2;
198  convFactor = toFractionGasOil(pvtRegionIndex, fsys) /
199  (1.0 + rvAvg * toFractionGasOil(pvtRegionIndex, fsys));
200  diffR = inFs.Rv() - Toolbox::value(exFs.Rv());
201  }
202  if (fsys.enableDissolvedGasInWater() && phaseIdx == fsys.waterPhaseIdx) {
203  const Evaluation rsAvg = (inFs.Rsw() + Toolbox::value(exFs.Rsw())) / 2;
204  convFactor = 1.0 / (toFractionGasWater(pvtRegionIndex, fsys) + rsAvg);
205  diffR = inFs.Rsw() - Toolbox::value(exFs.Rsw());
206  }
207  if (fsys.enableVaporizedWater() && phaseIdx == fsys.gasPhaseIdx) {
208  const Evaluation rvAvg = (inFs.Rvw() + Toolbox::value(exFs.Rvw())) / 2;
209  convFactor = toFractionGasWater(pvtRegionIndex, fsys) /
210  (1.0 + rvAvg * toFractionGasWater(pvtRegionIndex, fsys));
211  diffR = inFs.Rvw() - Toolbox::value(exFs.Rvw());
212  }
213 
214  // mass flux of solvent component (oil in oil or gas in gas)
215  const unsigned solventCompIdx = fsys.solventComponentIndex(phaseIdx);
216  const unsigned activeSolventCompIdx = fsys.canonicalToActiveCompIdx(solventCompIdx);
217  flux[conti0EqIdx + activeSolventCompIdx] +=
218  -bSAvg *
219  convFactor *
220  diffR *
221  diffusivity *
222  effectiveDiffusionCoefficient[phaseIdx][solventCompIdx];
223 
224  // mass flux of solute component (gas in oil or oil in gas)
225  const unsigned soluteCompIdx = fsys.soluteComponentIndex(phaseIdx);
226  const unsigned activeSoluteCompIdx = fsys.canonicalToActiveCompIdx(soluteCompIdx);
227  flux[conti0EqIdx + activeSoluteCompIdx] +=
228  bSAvg *
229  diffR *
230  convFactor *
231  diffusivity *
232  effectiveDiffusionCoefficient[phaseIdx][soluteCompIdx];
233  }
234  }
235 
236  template<class IntensiveQuantities,class EvaluationArray>
237  OPM_HOST_DEVICE static void addBioDiffFlux(RateVector& flux,
238  const IntensiveQuantities& inIq,
239  const IntensiveQuantities& exIq,
240  const Evaluation& diffusivity,
241  const EvaluationArray& effectiveBioDiffCoefficient)
242  {
243  if constexpr (enableBioeffects) {
244  using BioeffectsParams = BlackOilBioeffectsParams<Scalar>;
245  const auto& inFs = inIq.fluidState();
246  const auto& exFs = exIq.fluidState();
247  Evaluation diffR = 0.0;
248 
249  // The diffusion coefficients are given for mass concentrations
250  Evaluation bAvg = (inFs.saturation(waterPhaseIdx) * inFs.invB(waterPhaseIdx) +
251  Toolbox::value(exFs.saturation(waterPhaseIdx)) * Toolbox::value(exFs.invB(waterPhaseIdx))) / 2;
252  diffR = inIq.microbialConcentration() - Toolbox::value(exIq.microbialConcentration());
253  flux[contiMicrobialEqIdx] +=
254  bAvg *
255  diffR *
256  diffusivity *
257  effectiveBioDiffCoefficient[BioeffectsParams::micrDiffIdx];
258  if constexpr(enableMICP) {
259  diffR = inIq.oxygenConcentration() - Toolbox::value(exIq.oxygenConcentration());
260  flux[contiOxygenEqIdx] +=
261  bAvg *
262  diffR *
263  diffusivity *
264  effectiveBioDiffCoefficient[BioeffectsParams::oxygDiffIdx];
265  diffR = inIq.ureaConcentration() - Toolbox::value(exIq.ureaConcentration());
266  flux[contiUreaEqIdx] +=
267  bAvg *
268  diffR *
269  diffusivity *
270  effectiveBioDiffCoefficient[BioeffectsParams::ureaDiffIdx];
271  }
272  }
273  }
274 
275 private:
276  template<class FluidSystemT>
277  OPM_HOST_DEVICE static Scalar toFractionGasOil (unsigned regionIdx, const FluidSystemT& fsys)
278  {
279  const Scalar mMOil = use_mole_fraction_ ? fsys.molarMass(fsys.oilCompIdx, regionIdx) : 1;
280  const Scalar rhoO = fsys.referenceDensity(fsys.oilPhaseIdx, regionIdx);
281  const Scalar mMGas = use_mole_fraction_ ? fsys.molarMass(fsys.gasCompIdx, regionIdx) : 1;
282  const Scalar rhoG = fsys.referenceDensity(fsys.gasPhaseIdx, regionIdx);
283  return rhoO * mMGas / (rhoG * mMOil);
284  }
285 
286  template<class FluidSystemT>
287  OPM_HOST_DEVICE static Scalar toFractionGasWater (unsigned regionIdx, const FluidSystemT& fsys)
288  {
289  const Scalar mMWater = use_mole_fraction_ ? fsys.molarMass(fsys.waterCompIdx, regionIdx) : 1;
290  const Scalar rhoW = fsys.referenceDensity(fsys.waterPhaseIdx, regionIdx);
291  const Scalar mMGas = use_mole_fraction_ ? fsys.molarMass(fsys.gasCompIdx, regionIdx) : 1;
292  const Scalar rhoG = fsys.referenceDensity(fsys.gasPhaseIdx, regionIdx);
293  return rhoW * mMGas / (rhoG * mMWater);
294  }
295 
296  #if OPM_IS_INSIDE_DEVICE_FUNCTION
297  constexpr static bool use_mole_fraction_ = false; // currently only false i supported on GPU.
298  #else
299  static bool use_mole_fraction_;
300  #endif
301 };
302 
303 #if OPM_IS_INSIDE_HOST_FUNCTION
304 template <typename TypeTag>
305 bool
306 BlackOilDiffusionModule<TypeTag, true>::use_mole_fraction_;
307 #endif
308 
316 template <class TypeTag>
317 class BlackOilDiffusionIntensiveQuantities<TypeTag, /*enableDiffusion=*/true>
318 {
323  using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
325  static constexpr bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
326  using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
327 
328  enum { numPhases = FluidSystem::numPhases };
329  enum { numComponents = FluidSystem::numComponents };
330  enum { enableMICP = Indices::enableMICP };
331  enum { numBioInWat = Indices::numBioInWat };
332 
333  static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
334 
335 public:
339 
341 
342  BlackOilDiffusionIntensiveQuantities(const std::array<Evaluation, numPhases>& tortuosity,
343  const std::array<std::array<Evaluation, numComponents>, numPhases>& diffusionCoefficient)
344  : tortuosity_(tortuosity)
345  , diffusionCoefficient_(diffusionCoefficient)
346  {}
347 
348  template <class OtherTypeTag>
350  : tortuosity_(other.tortuosity())
351  , diffusionCoefficient_(other.diffusionCoefficients())
352  {}
353 
355  operator=(const BlackOilDiffusionIntensiveQuantities& rhs)
356  {
357  if (this == &rhs) {
358  return *this;
359  }
360 
361  if (FluidSystem::enableDiffusion()) {
362  tortuosity_ = rhs.tortuosity_;
363  diffusionCoefficient_ = rhs.diffusionCoefficient_;
364  }
365  return *this;
366  }
367 
372  OPM_HOST_DEVICE Evaluation diffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
373  { return diffusionCoefficient_[phaseIdx][compIdx]; }
374 
378  OPM_HOST_DEVICE const std::array<std::array<Evaluation, numComponents>, numPhases>& diffusionCoefficients() const
379  { return diffusionCoefficient_; }
380 
385  OPM_HOST_DEVICE Evaluation tortuosity(unsigned phaseIdx) const
386  { return tortuosity_[phaseIdx]; }
387 
391  OPM_HOST_DEVICE const std::array<Evaluation, numPhases>& tortuosities() const
392  { return tortuosity_; }
393 
398  OPM_HOST_DEVICE Evaluation effectiveDiffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
399  {
400  // For the blackoil model tortuosity is disabled.
401  // TODO add a run-time parameter to enable tortuosity
402  static constexpr bool enableTortuosity = false;
403  if constexpr (enableTortuosity) {
404  return tortuosity_[phaseIdx] * diffusionCoefficient_[phaseIdx][compIdx];
405  } else {
406  return diffusionCoefficient_[phaseIdx][compIdx];
407  }
408  }
409 
414  OPM_HOST_DEVICE Evaluation bioDiffCoefficient(unsigned compIdx) const
415  { return bioDiffCoefficient_[compIdx]; }
416 
421  OPM_HOST_DEVICE Evaluation effectiveBioDiffCoefficient(unsigned compIdx) const
422  {
423  // TODO add a run-time parameter to enable tortuosity
424  static bool enableTortuosity = false;
425  if (enableTortuosity)
426  return tortuosity_[waterPhaseIdx] * bioDiffCoefficient_[compIdx];
427 
428  return bioDiffCoefficient_[compIdx];
429  }
430 
431 protected:
436  template <class FluidState>
437  void update_(FluidState& fluidState,
438  const unsigned regionIdx,
439  const ElementContext& elemCtx,
440  unsigned dofIdx,
441  unsigned timeIdx)
442  {
443  // Only work if diffusion is enabled run-time by DIFFUSE in the deck
444  if (!FluidSystem::enableDiffusion()) {
445  return;
446  }
447 
448  const auto& intQuants = elemCtx.intensiveQuantities(dofIdx, timeIdx);
449  update_(fluidState, regionIdx, intQuants);
450  }
451 
452  template<class FluidState>
453  void update_(FluidState& fluidState,
454  const unsigned regionIdx,
455  const IntensiveQuantities& intQuants)
456  {
457  using Toolbox = MathToolbox<Evaluation>;
458 
459  for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
460  if (!FluidSystem::phaseIsActive(phaseIdx)) {
461  continue;
462  }
463 
464  // no diffusion in water for blackoil models
465  if (!FluidSystem::enableDissolvedGasInWater() && FluidSystem::waterPhaseIdx == phaseIdx) {
466  continue;
467  }
468 
469  // Based on Millington, R. J., & Quirk, J. P. (1961).
470  // \Note: it is possible to use NumericalConstants later
471  // constexpr auto& numconst = GetPropValue<TypeTag, Properties::NumericalConstants>;
472  constexpr double myeps = 0.0001; //numconst.blackoildiffusionmoduleeps;
473  const Evaluation& base =
474  Toolbox::max(myeps, //0.0001,
475  intQuants.porosity() *
476  intQuants.fluidState().saturation(phaseIdx));
477  tortuosity_[phaseIdx] =
478  1.0 / (intQuants.porosity() * intQuants.porosity()) *
479  Toolbox::pow(base, 10.0 / 3.0);
480 
481  using PCache = typename FluidSystem::template ParameterCache<Scalar>;
482  PCache pcache(regionIdx);
483  for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx) {
484  diffusionCoefficient_[phaseIdx][compIdx] =
485  FluidSystem::diffusionCoefficient(fluidState,
486  pcache,
487  phaseIdx,
488  compIdx);
489  }
490  }
491 
492  if constexpr (enableBioeffects) {
493  unsigned pvtRegionIndex = intQuants.pvtRegionIndex();
494  for (unsigned compIdx = 0; compIdx < numBioInWat; ++compIdx) {
495  bioDiffCoefficient_[compIdx] =
496  BioeffectsModule::bioDiffCoefficient(pvtRegionIndex, compIdx);
497  }
498  }
499  }
500 
501 private:
502  std::array<Evaluation, numPhases> tortuosity_{};
503  std::array<std::array<Evaluation, numComponents>, numPhases> diffusionCoefficient_{};
504  std::array<Evaluation, numBioInWat> bioDiffCoefficient_{};
505 };
506 
513 template <class TypeTag>
514 class BlackOilDiffusionExtensiveQuantities<TypeTag, /*enableDiffusion=*/true>
515 {
520  using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
522 
523  enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
524  enum { numComponents = getPropValue<TypeTag, Properties::NumComponents>() };
525  static constexpr bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
526  enum { enableMICP = Indices::enableMICP };
527  enum { numBioInWat = Indices::numBioInWat };
528 
529 public:
530  using EvaluationArray = std::array<std::array<Evaluation, numComponents>, numPhases>;
531 
532 protected:
537  void update_(const ElementContext& elemCtx, unsigned faceIdx, unsigned timeIdx)
538  {
539  // Only work if diffusion is enabled run-time by DIFFUSE in the deck
540  if (!FluidSystem::enableDiffusion()) {
541  return;
542  }
543 
544  const auto& stencil = elemCtx.stencil(timeIdx);
545  const auto& face = stencil.interiorFace(faceIdx);
546  const auto& extQuants = elemCtx.extensiveQuantities(faceIdx, timeIdx);
547  const auto& intQuantsInside = elemCtx.intensiveQuantities(extQuants.interiorIndex(), timeIdx);
548  const auto& intQuantsOutside = elemCtx.intensiveQuantities(extQuants.exteriorIndex(), timeIdx);
549 
550  const Scalar diff = elemCtx.problem().diffusivity(elemCtx, face.interiorIndex(), face.exteriorIndex());
551  const Scalar faceArea = face.area();
552  diffusivity_ = diff / faceArea;
553  update(effectiveDiffusionCoefficient_, intQuantsInside, intQuantsOutside);
554  Valgrind::CheckDefined(diffusivity_);
555  if constexpr (enableBioeffects) {
556  updateBio(effectiveBioDiffCoefficient_, intQuantsInside, intQuantsOutside);
557  }
558  }
559 
560 public:
561  OPM_HOST_DEVICE static void update(EvaluationArray& effectiveDiffusionCoefficient,
562  const IntensiveQuantities& intQuantsInside,
563  const IntensiveQuantities& intQuantsOutside)
564  {
565  const FluidSystem& fsys = intQuantsInside.getFluidSystem();
566 
567  // opm-models expects per area flux
568  // use the arithmetic average for the effective
569  // diffusion coefficients.
570  for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
571  if (!fsys.phaseIsActive(phaseIdx)) {
572  continue;
573  }
574  // no diffusion in water for blackoil models
575  if (!fsys.enableDissolvedGasInWater() && fsys.waterPhaseIdx == phaseIdx) {
576  continue;
577  }
578  for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx) {
579  effectiveDiffusionCoefficient[phaseIdx][compIdx] =
580  0.5 * (intQuantsInside.effectiveDiffusionCoefficient(phaseIdx, compIdx) +
581  intQuantsOutside.effectiveDiffusionCoefficient(phaseIdx, compIdx));
582  Valgrind::CheckDefined(effectiveDiffusionCoefficient[phaseIdx][compIdx]);
583  }
584  }
585  }
586 
587  static void updateBio(std::array<Evaluation, numBioInWat>& effectiveBioDiffCoefficient,
588  const IntensiveQuantities& intQuantsInside,
589  const IntensiveQuantities& intQuantsOutside) {
590 
591  for (unsigned compIdx = 0; compIdx < numBioInWat; ++compIdx) {
592  effectiveBioDiffCoefficient[compIdx] =
593  0.5 * (intQuantsInside.effectiveBioDiffCoefficient(compIdx) +
594  intQuantsOutside.effectiveBioDiffCoefficient(compIdx));
595  Valgrind::CheckDefined(effectiveBioDiffCoefficient[compIdx]);
596  }
597  }
598 
599 protected:
600  template <class Context, class FluidState>
601  void updateBoundary_(const Context&,
602  unsigned,
603  unsigned,
604  const FluidState&)
605  {
606  throw std::runtime_error("Not implemented: Diffusion across boundary not implemented for blackoil");
607  }
608 
609 public:
616  OPM_HOST_DEVICE Scalar diffusivity() const
617  { return diffusivity_; }
618 
626  OPM_HOST_DEVICE const Evaluation& effectiveDiffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
627  { return effectiveDiffusionCoefficient_[phaseIdx][compIdx]; }
628 
629  OPM_HOST_DEVICE const auto& effectiveDiffusionCoefficient() const
630  { return effectiveDiffusionCoefficient_; }
631 
632  OPM_HOST_DEVICE const Evaluation& effectiveBioDiffCoefficient(unsigned compIdx) const
633  { return effectiveBioDiffCoefficient_[compIdx]; }
634 
635  OPM_HOST_DEVICE const auto& effectiveBioDiffCoefficient() const{
636  return effectiveBioDiffCoefficient_;
637  }
638 
639 private:
640  Scalar diffusivity_;
641  EvaluationArray effectiveDiffusionCoefficient_;
642  std::array<Evaluation, numBioInWat> effectiveBioDiffCoefficient_;
643 };
644 
645 } // namespace Opm
646 
647 #endif
OPM_HOST_DEVICE Evaluation diffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
Returns the molecular diffusion coefficient for a component in a phase.
Definition: blackoildiffusionmodule.hh:372
OPM_HOST_DEVICE const std::array< std::array< Evaluation, numComponents >, numPhases > & diffusionCoefficients() const
Returns all the diffusion coefficients.
Definition: blackoildiffusionmodule.hh:378
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
OPM_HOST_DEVICE Evaluation tortuosity(unsigned phaseIdx) const
Returns the tortuousity of the sub-domain of a fluid phase in the porous medium.
Definition: blackoildiffusionmodule.hh:385
Provides the volumetric quantities required for the calculation of molecular diffusive fluxes...
Defines the common properties required by the porous medium multi-phase models.
static OPM_HOST_DEVICE void addDiffusiveFlux(RateVector &flux, const Context &context, unsigned spaceIdx, unsigned timeIdx)
Adds the mass flux due to molecular diffusion to the flux vector over the integration point...
Definition: blackoildiffusionmodule.hh:126
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
OPM_HOST_DEVICE Scalar diffusivity() const
The diffusivity of the face.
Definition: blackoildiffusionmodule.hh:616
Contains classes extending the black-oil model.
OPM_HOST_DEVICE const std::array< Evaluation, numPhases > & tortuosities() const
Returns all the tortuosities.
Definition: blackoildiffusionmodule.hh:391
Declares the properties required by the black oil model.
Declare the properties used by the infrastructure code of the finite volume discretizations.
static void registerParameters()
Register all run-time parameters for the diffusion module.
Definition: blackoildiffusionmodule.hh:100
Provides the quantities required to calculate diffusive mass fluxes.
OPM_HOST_DEVICE Evaluation effectiveDiffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
Returns the effective molecular diffusion coefficient of the porous medium for a component in a phase...
Definition: blackoildiffusionmodule.hh:398
OPM_HOST_DEVICE Evaluation bioDiffCoefficient(unsigned compIdx) const
Returns the molecular diffusion coefficient for a biocomponent in the water phase.
Definition: blackoildiffusionmodule.hh:414
OPM_HOST_DEVICE Evaluation effectiveBioDiffCoefficient(unsigned compIdx) const
Returns the effective molecular diffusion coefficient of the porous medium for a biocomponent in the ...
Definition: blackoildiffusionmodule.hh:421
OPM_HOST_DEVICE const Evaluation & effectiveDiffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
The effective diffusion coefficient of a component in a fluid phase at the face&#39;s integration point...
Definition: blackoildiffusionmodule.hh:626
static void initFromState(const EclipseState &eclState)
Initialize all internal data structures needed by the diffusion module.
Definition: blackoildiffusionmodule.hh:87
void update_(FluidState &fluidState, const unsigned regionIdx, const ElementContext &elemCtx, unsigned dofIdx, unsigned timeIdx)
Update the quantities required to calculate diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:437
Provides the auxiliary methods required for consideration of the diffusion equation.
void update_(const ElementContext &elemCtx, unsigned faceIdx, unsigned timeIdx)
Update the quantities required to calculate the diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:537
Definition: blackoildiffusionmodule.hh:514