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/Valgrind.hpp>
38 
41 
42 #include <array>
43 #include <stdexcept>
44 
45 namespace Opm {
46 
53 template <class TypeTag, bool enableDiffusion>
55 
56 template <class TypeTag, bool enableDiffusion>
58 
62 template <class TypeTag>
63 class BlackOilDiffusionModule<TypeTag, /*enableDiffusion=*/false>
64 {
66 
67 public:
71  static void initFromState(const EclipseState&)
72  {}
73 
77  static void registerParameters()
78  {}
79 
84  template <class Context>
85  OPM_HOST_DEVICE static void addDiffusiveFlux(RateVector&,
86  const Context&,
87  unsigned,
88  unsigned)
89  {}
90 };
91 
95 template <class TypeTag>
96 class BlackOilDiffusionModule<TypeTag, /*enableDiffusion=*/true>
97 {
103  using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
106 
107  enum { numPhases = FluidSystem::numPhases };
108  enum { conti0EqIdx = Indices::conti0EqIdx };
109 
110  enum { enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>() };
111  enum { enableMICP = Indices::enableMICP };
112 
113  static constexpr unsigned contiMicrobialEqIdx = Indices::contiMicrobialEqIdx;
114  static constexpr unsigned contiOxygenEqIdx = Indices::contiOxygenEqIdx;
115  static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
116  static constexpr unsigned contiUreaEqIdx = Indices::contiUreaEqIdx;
117 
118  using Toolbox = MathToolbox<Evaluation>;
119 
120 public:
122 
126  static void initFromState(const EclipseState& eclState)
127  {
128  // TODO: support use_move_fraction on GPUs
129  #if OPM_IS_INSIDE_HOST_FUNCTION
130  use_mole_fraction_ = eclState.getTableManager().diffMoleFraction();
131  #else
132  OPM_THROW(std::runtime_error, "Diffusion module: Calling initFromState not expected on GPU.");
133  #endif
134  }
135 
139  static void registerParameters()
140  {}
141 
164  template <class Context>
165  OPM_HOST_DEVICE static void addDiffusiveFlux(RateVector& flux, const Context& context,
166  unsigned spaceIdx, unsigned timeIdx)
167  {
168  // Only work if diffusion is enabled run-time by DIFFUSE in the deck
169  if (!FluidSystem::enableDiffusion()) {
170  return;
171  }
172 
173  const auto& extQuants = context.extensiveQuantities(spaceIdx, timeIdx);
174  const auto& inIq = context.intensiveQuantities(extQuants.interiorIndex(), timeIdx);
175  const auto& exIq = context.intensiveQuantities(extQuants.exteriorIndex(), timeIdx);
176  const auto& diffusivity = extQuants.diffusivity();
177  const auto& effectiveDiffusionCoefficient = extQuants.effectiveDiffusionCoefficient();
178  addDiffusiveFlux(flux, inIq, exIq, diffusivity, effectiveDiffusionCoefficient);
179  if constexpr(enableBioeffects) {
180  const auto& effectiveBioDiffCoefficient = extQuants.effectiveBioDiffCoefficient();
181  addBioDiffFlux(flux, inIq, exIq, diffusivity, effectiveBioDiffCoefficient);
182  }
183  }
184 
185  template<class IntensiveQuantities,class EvaluationArray, class RateVectorT>
186  OPM_HOST_DEVICE static void addDiffusiveFlux(RateVectorT& flux,
187  const IntensiveQuantities& inIq,
188  const IntensiveQuantities& exIq,
189  const Evaluation& diffusivity,
190  const EvaluationArray& effectiveDiffusionCoefficient)
191  {
192  const FluidSystem& fsys = inIq.getFluidSystem();
193 
194  const auto& inFs = inIq.fluidState();
195  const auto& exFs = exIq.fluidState();
196  unsigned pvtRegionIndex = inFs.pvtRegionIndex();
197  Evaluation diffR = 0.0;
198 
199  for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
200  if (!fsys.phaseIsActive(phaseIdx)) {
201  continue;
202  }
203 
204  // no diffusion in water for blackoil models
205  if (!fsys.enableDissolvedGasInWater() && fsys.waterPhaseIdx == phaseIdx) {
206  continue;
207  }
208 
209  // no diffusion in gas phase in water + gas system.
210  if (fsys.gasPhaseIdx == phaseIdx && !fsys.phaseIsActive(fsys.oilPhaseIdx)) {
211  continue;
212  }
213 
214  // arithmetic mean of the phase's b factor weighed by saturation
215  Evaluation bSAvg = inFs.saturation(phaseIdx) * inFs.invB(phaseIdx);
216  bSAvg += Toolbox::value(exFs.saturation(phaseIdx)) * Toolbox::value(exFs.invB(phaseIdx));
217  bSAvg /= 2;
218 
219  // phase not present, skip
220  if (bSAvg < 1.0e-6) {
221  continue;
222  }
223  Evaluation convFactor = 1.0;
224  if (fsys.enableDissolvedGas() &&
225  fsys.phaseIsActive(fsys.gasPhaseIdx) &&
226  phaseIdx == fsys.oilPhaseIdx)
227  {
228  const Evaluation rsAvg = (inFs.Rs() + Toolbox::value(exFs.Rs())) / 2;
229  convFactor = 1.0 / (toFractionGasOil(pvtRegionIndex, fsys) + rsAvg);
230  diffR = inFs.Rs() - Toolbox::value(exFs.Rs());
231  }
232  if (fsys.enableVaporizedOil() &&
233  fsys.phaseIsActive(fsys.oilPhaseIdx) &&
234  phaseIdx == fsys.gasPhaseIdx)
235  {
236  const Evaluation rvAvg = (inFs.Rv() + Toolbox::value(exFs.Rv())) / 2;
237  convFactor = toFractionGasOil(pvtRegionIndex, fsys) /
238  (1.0 + rvAvg * toFractionGasOil(pvtRegionIndex, fsys));
239  diffR = inFs.Rv() - Toolbox::value(exFs.Rv());
240  }
241  if (fsys.enableDissolvedGasInWater() && phaseIdx == fsys.waterPhaseIdx) {
242  const Evaluation rsAvg = (inFs.Rsw() + Toolbox::value(exFs.Rsw())) / 2;
243  convFactor = 1.0 / (toFractionGasWater(pvtRegionIndex, fsys) + rsAvg);
244  diffR = inFs.Rsw() - Toolbox::value(exFs.Rsw());
245  }
246  if (fsys.enableVaporizedWater() && phaseIdx == fsys.gasPhaseIdx) {
247  const Evaluation rvAvg = (inFs.Rvw() + Toolbox::value(exFs.Rvw())) / 2;
248  convFactor = toFractionGasWater(pvtRegionIndex, fsys) /
249  (1.0 + rvAvg * toFractionGasWater(pvtRegionIndex, fsys));
250  diffR = inFs.Rvw() - Toolbox::value(exFs.Rvw());
251  }
252 
253  // mass flux of solvent component (oil in oil or gas in gas)
254  const unsigned solventCompIdx = fsys.solventComponentIndex(phaseIdx);
255  const unsigned activeSolventCompIdx = fsys.canonicalToActiveCompIdx(solventCompIdx);
256  flux[conti0EqIdx + activeSolventCompIdx] +=
257  -bSAvg *
258  convFactor *
259  diffR *
260  diffusivity *
261  effectiveDiffusionCoefficient[phaseIdx][solventCompIdx];
262 
263  // mass flux of solute component (gas in oil or oil in gas)
264  const unsigned soluteCompIdx = fsys.soluteComponentIndex(phaseIdx);
265  const unsigned activeSoluteCompIdx = fsys.canonicalToActiveCompIdx(soluteCompIdx);
266  flux[conti0EqIdx + activeSoluteCompIdx] +=
267  bSAvg *
268  diffR *
269  convFactor *
270  diffusivity *
271  effectiveDiffusionCoefficient[phaseIdx][soluteCompIdx];
272  }
273  }
274 
275  template<class IntensiveQuantities,class EvaluationArray>
276  OPM_HOST_DEVICE static void addBioDiffFlux(RateVector& flux,
277  const IntensiveQuantities& inIq,
278  const IntensiveQuantities& exIq,
279  const Evaluation& diffusivity,
280  const EvaluationArray& effectiveBioDiffCoefficient)
281  {
282  const auto& inFs = inIq.fluidState();
283  const auto& exFs = exIq.fluidState();
284  Evaluation diffR = 0.0;
285 
286  // The diffusion coefficients are given for mass concentrations
287  Evaluation bAvg = (inFs.saturation(waterPhaseIdx) * inFs.invB(waterPhaseIdx) +
288  Toolbox::value(exFs.saturation(waterPhaseIdx)) * Toolbox::value(exFs.invB(waterPhaseIdx))) / 2;
289  diffR = inIq.microbialConcentration() - Toolbox::value(exIq.microbialConcentration());
290  flux[contiMicrobialEqIdx] +=
291  bAvg *
292  diffR *
293  diffusivity *
294  effectiveBioDiffCoefficient[BioeffectsParams::micrDiffIdx];
295  if constexpr(enableMICP) {
296  diffR = inIq.oxygenConcentration() - Toolbox::value(exIq.oxygenConcentration());
297  flux[contiOxygenEqIdx] +=
298  bAvg *
299  diffR *
300  diffusivity *
301  effectiveBioDiffCoefficient[BioeffectsParams::oxygDiffIdx];
302  diffR = inIq.ureaConcentration() - Toolbox::value(exIq.ureaConcentration());
303  flux[contiUreaEqIdx] +=
304  bAvg *
305  diffR *
306  diffusivity *
307  effectiveBioDiffCoefficient[BioeffectsParams::ureaDiffIdx];
308  }
309  }
310 
311 private:
312  template<class FluidSystemT>
313  OPM_HOST_DEVICE static Scalar toFractionGasOil (unsigned regionIdx, const FluidSystemT& fsys)
314  {
315  const Scalar mMOil = use_mole_fraction_ ? fsys.molarMass(fsys.oilCompIdx, regionIdx) : 1;
316  const Scalar rhoO = fsys.referenceDensity(fsys.oilPhaseIdx, regionIdx);
317  const Scalar mMGas = use_mole_fraction_ ? fsys.molarMass(fsys.gasCompIdx, regionIdx) : 1;
318  const Scalar rhoG = fsys.referenceDensity(fsys.gasPhaseIdx, regionIdx);
319  return rhoO * mMGas / (rhoG * mMOil);
320  }
321 
322  template<class FluidSystemT>
323  OPM_HOST_DEVICE static Scalar toFractionGasWater (unsigned regionIdx, const FluidSystemT& fsys)
324  {
325  const Scalar mMWater = use_mole_fraction_ ? fsys.molarMass(fsys.waterCompIdx, regionIdx) : 1;
326  const Scalar rhoW = fsys.referenceDensity(fsys.waterPhaseIdx, regionIdx);
327  const Scalar mMGas = use_mole_fraction_ ? fsys.molarMass(fsys.gasCompIdx, regionIdx) : 1;
328  const Scalar rhoG = fsys.referenceDensity(fsys.gasPhaseIdx, regionIdx);
329  return rhoW * mMGas / (rhoG * mMWater);
330  }
331 
332  #if OPM_IS_INSIDE_DEVICE_FUNCTION
333  constexpr static bool use_mole_fraction_ = false; // currently only false i supported on GPU.
334  #else
335  static bool use_mole_fraction_;
336  #endif
337 };
338 
339 #if OPM_IS_INSIDE_HOST_FUNCTION
340 template <typename TypeTag>
341 bool
342 BlackOilDiffusionModule<TypeTag, true>::use_mole_fraction_;
343 #endif
344 
352 template <class TypeTag, bool enableDiffusion>
354 
358 template <class TypeTag>
359 class BlackOilDiffusionIntensiveQuantities<TypeTag, /*enableDiffusion=*/false>
360 {
363 
364 public:
369  OPM_HOST_DEVICE Scalar tortuosity(unsigned) const
370  {
371  throw std::logic_error("Method tortuosity() does not make sense "
372  "if diffusion is disabled");
373  }
374 
379  OPM_HOST_DEVICE Scalar diffusionCoefficient(unsigned, unsigned) const
380  {
381  throw std::logic_error("Method diffusionCoefficient() does not "
382  "make sense if diffusion is disabled");
383  }
384 
389  OPM_HOST_DEVICE Scalar effectiveDiffusionCoefficient(unsigned, unsigned) const
390  {
391  throw std::logic_error("Method effectiveDiffusionCoefficient() "
392  "does not make sense if diffusion is disabled");
393  }
394 
395 protected:
400  template <class FluidState>
401  void update_(FluidState&,
402  const unsigned,
403  const ElementContext&,
404  unsigned,
405  unsigned)
406  {}
407 };
408 
412 template <class TypeTag>
413 class BlackOilDiffusionIntensiveQuantities<TypeTag, /*enableDiffusion=*/true>
414 {
419  using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
422 
423  enum { numPhases = FluidSystem::numPhases };
424  enum { numComponents = FluidSystem::numComponents };
425  enum { enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>() };
426  enum { enableMICP = Indices::enableMICP };
427  enum { numBioInWat = Indices::numBioInWat };
428 
429  static constexpr unsigned waterPhaseIdx = FluidSystem::waterPhaseIdx;
430 
431 public:
435 
437 
438  BlackOilDiffusionIntensiveQuantities(const std::array<Evaluation, numPhases>& tortuosity,
439  const std::array<std::array<Evaluation, numComponents>, numPhases>& diffusionCoefficient)
440  : tortuosity_(tortuosity)
441  , diffusionCoefficient_(diffusionCoefficient)
442  {}
443 
445  operator=(const BlackOilDiffusionIntensiveQuantities& rhs)
446  {
447  if (this == &rhs) {
448  return *this;
449  }
450 
451  if (FluidSystem::enableDiffusion()) {
452  tortuosity_ = rhs.tortuosity_;
453  diffusionCoefficient_ = rhs.diffusionCoefficient_;
454  }
455  return *this;
456  }
457 
462  OPM_HOST_DEVICE Evaluation diffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
463  { return diffusionCoefficient_[phaseIdx][compIdx]; }
464 
469  OPM_HOST_DEVICE Evaluation tortuosity(unsigned phaseIdx) const
470  { return tortuosity_[phaseIdx]; }
471 
476  OPM_HOST_DEVICE Evaluation effectiveDiffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
477  {
478  // For the blackoil model tortuosity is disabled.
479  // TODO add a run-time parameter to enable tortuosity
480  static constexpr bool enableTortuosity = false;
481  if constexpr (enableTortuosity) {
482  return tortuosity_[phaseIdx] * diffusionCoefficient_[phaseIdx][compIdx];
483  } else {
484  return diffusionCoefficient_[phaseIdx][compIdx];
485  }
486  }
487 
492  OPM_HOST_DEVICE Evaluation bioDiffCoefficient(unsigned compIdx) const
493  { return bioDiffCoefficient_[compIdx]; }
494 
499  OPM_HOST_DEVICE Evaluation effectiveBioDiffCoefficient(unsigned compIdx) const
500  {
501  // TODO add a run-time parameter to enable tortuosity
502  static bool enableTortuosity = false;
503  if (enableTortuosity)
504  return tortuosity_[waterPhaseIdx] * bioDiffCoefficient_[compIdx];
505 
506  return bioDiffCoefficient_[compIdx];
507  }
508 
509 protected:
514  template <class FluidState>
515  void update_(FluidState& fluidState,
516  const unsigned regionIdx,
517  const ElementContext& elemCtx,
518  unsigned dofIdx,
519  unsigned timeIdx)
520  {
521  // Only work if diffusion is enabled run-time by DIFFUSE in the deck
522  if (!FluidSystem::enableDiffusion()) {
523  return;
524  }
525 
526  const auto& intQuants = elemCtx.intensiveQuantities(dofIdx, timeIdx);
527  update_(fluidState, regionIdx, intQuants);
528  }
529 
530  template<class FluidState>
531  void update_(FluidState& fluidState,
532  const unsigned regionIdx,
533  const IntensiveQuantities& intQuants)
534  {
535  using Toolbox = MathToolbox<Evaluation>;
536 
537  for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
538  if (!FluidSystem::phaseIsActive(phaseIdx)) {
539  continue;
540  }
541 
542  // no diffusion in water for blackoil models
543  if (!FluidSystem::enableDissolvedGasInWater() && FluidSystem::waterPhaseIdx == phaseIdx) {
544  continue;
545  }
546 
547  // Based on Millington, R. J., & Quirk, J. P. (1961).
548  // \Note: it is possible to use NumericalConstants later
549  // constexpr auto& numconst = GetPropValue<TypeTag, Properties::NumericalConstants>;
550  constexpr double myeps = 0.0001; //numconst.blackoildiffusionmoduleeps;
551  const Evaluation& base =
552  Toolbox::max(myeps, //0.0001,
553  intQuants.porosity() *
554  intQuants.fluidState().saturation(phaseIdx));
555  tortuosity_[phaseIdx] =
556  1.0 / (intQuants.porosity() * intQuants.porosity()) *
557  Toolbox::pow(base, 10.0 / 3.0);
558 
559  using PCache = typename FluidSystem::template ParameterCache<Scalar>;
560  PCache pcache(regionIdx);
561  for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx) {
562  diffusionCoefficient_[phaseIdx][compIdx] =
563  FluidSystem::diffusionCoefficient(fluidState,
564  pcache,
565  phaseIdx,
566  compIdx);
567  }
568  }
569 
570  if constexpr(enableBioeffects) {
571  unsigned pvtRegionIndex = intQuants.pvtRegionIndex();
572  for (unsigned compIdx = 0; compIdx < numBioInWat; ++compIdx) {
573  bioDiffCoefficient_[compIdx] =
574  BioeffectsModule::bioDiffCoefficient(pvtRegionIndex, compIdx);
575  }
576  }
577  }
578 
579 private:
580  std::array<Evaluation, numPhases> tortuosity_{};
581  std::array<std::array<Evaluation, numComponents>, numPhases> diffusionCoefficient_{};
582  std::array<Evaluation, numBioInWat> bioDiffCoefficient_{};
583 };
584 
591 template <class TypeTag, bool enableDiffusion>
592 class BlackOilDiffusionExtensiveQuantities;
593 
597 template <class TypeTag>
598 class BlackOilDiffusionExtensiveQuantities<TypeTag, /*enableDiffusion=*/false>
599 {
603 
604 protected:
609  void update_(const ElementContext&,
610  unsigned,
611  unsigned)
612  {}
613 
614  template <class Context, class FluidState>
615  void updateBoundary_(const Context&,
616  unsigned,
617  unsigned,
618  const FluidState&)
619  {}
620 
621 public:
626  OPM_HOST_DEVICE Scalar diffusivity() const
627  {
628  throw std::logic_error("The method diffusivity() does not "
629  "make sense if diffusion is disabled.");
630  }
631 
639  OPM_HOST_DEVICE const Evaluation& effectiveDiffusionCoefficient(unsigned,
640  unsigned) const
641  {
642  throw std::logic_error("The method effectiveDiffusionCoefficient() "
643  "does not make sense if diffusion is disabled.");
644  }
645 };
646 
650 template <class TypeTag>
651 class BlackOilDiffusionExtensiveQuantities<TypeTag, /*enableDiffusion=*/true>
652 {
657  using IntensiveQuantities = GetPropType<TypeTag, Properties::IntensiveQuantities>;
659 
660  enum { numPhases = getPropValue<TypeTag, Properties::NumPhases>() };
661  enum { numComponents = getPropValue<TypeTag, Properties::NumComponents>() };
662  enum { enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>() };
663  enum { enableMICP = Indices::enableMICP };
664  enum { numBioInWat = Indices::numBioInWat };
665 
666 public:
667  using EvaluationArray = std::array<std::array<Evaluation, numComponents>, numPhases>;
668 
669 protected:
674  void update_(const ElementContext& elemCtx, unsigned faceIdx, unsigned timeIdx)
675  {
676  // Only work if diffusion is enabled run-time by DIFFUSE in the deck
677  if (!FluidSystem::enableDiffusion()) {
678  return;
679  }
680 
681  const auto& stencil = elemCtx.stencil(timeIdx);
682  const auto& face = stencil.interiorFace(faceIdx);
683  const auto& extQuants = elemCtx.extensiveQuantities(faceIdx, timeIdx);
684  const auto& intQuantsInside = elemCtx.intensiveQuantities(extQuants.interiorIndex(), timeIdx);
685  const auto& intQuantsOutside = elemCtx.intensiveQuantities(extQuants.exteriorIndex(), timeIdx);
686 
687  const Scalar diff = elemCtx.problem().diffusivity(elemCtx, face.interiorIndex(), face.exteriorIndex());
688  const Scalar faceArea = face.area();
689  diffusivity_ = diff / faceArea;
690  update(effectiveDiffusionCoefficient_, intQuantsInside, intQuantsOutside);
691  Valgrind::CheckDefined(diffusivity_);
692  if constexpr(enableBioeffects) {
693  updateBio(effectiveBioDiffCoefficient_, intQuantsInside, intQuantsOutside);
694  }
695  }
696 
697 public:
698  static void update(EvaluationArray& effectiveDiffusionCoefficient,
699  const IntensiveQuantities& intQuantsInside,
700  const IntensiveQuantities& intQuantsOutside)
701  {
702  const FluidSystem& fsys = intQuantsInside.getFluidSystem();
703 
704  // opm-models expects per area flux
705  // use the arithmetic average for the effective
706  // diffusion coefficients.
707  for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
708  if (!fsys.phaseIsActive(phaseIdx)) {
709  continue;
710  }
711  // no diffusion in water for blackoil models
712  if (!fsys.enableDissolvedGasInWater() && fsys.waterPhaseIdx == phaseIdx) {
713  continue;
714  }
715  for (unsigned compIdx = 0; compIdx < numComponents; ++compIdx) {
716  effectiveDiffusionCoefficient[phaseIdx][compIdx] =
717  0.5 * (intQuantsInside.effectiveDiffusionCoefficient(phaseIdx, compIdx) +
718  intQuantsOutside.effectiveDiffusionCoefficient(phaseIdx, compIdx));
719  Valgrind::CheckDefined(effectiveDiffusionCoefficient[phaseIdx][compIdx]);
720  }
721  }
722  }
723 
724  static void updateBio(std::array<Evaluation, numBioInWat>& effectiveBioDiffCoefficient,
725  const IntensiveQuantities& intQuantsInside,
726  const IntensiveQuantities& intQuantsOutside) {
727 
728  for (unsigned compIdx = 0; compIdx < numBioInWat; ++compIdx) {
729  effectiveBioDiffCoefficient[compIdx] =
730  0.5 * (intQuantsInside.effectiveBioDiffCoefficient(compIdx) +
731  intQuantsOutside.effectiveBioDiffCoefficient(compIdx));
732  Valgrind::CheckDefined(effectiveBioDiffCoefficient[compIdx]);
733  }
734  }
735 
736 protected:
737  template <class Context, class FluidState>
738  void updateBoundary_(const Context&,
739  unsigned,
740  unsigned,
741  const FluidState&)
742  {
743  throw std::runtime_error("Not implemented: Diffusion across boundary not implemented for blackoil");
744  }
745 
746 public:
753  OPM_HOST_DEVICE Scalar diffusivity() const
754  { return diffusivity_; }
755 
763  OPM_HOST_DEVICE const Evaluation& effectiveDiffusionCoefficient(unsigned phaseIdx, unsigned compIdx) const
764  { return effectiveDiffusionCoefficient_[phaseIdx][compIdx]; }
765 
766  OPM_HOST_DEVICE const auto& effectiveDiffusionCoefficient() const
767  { return effectiveDiffusionCoefficient_; }
768 
769  OPM_HOST_DEVICE const Evaluation& effectiveBioDiffCoefficient(unsigned compIdx) const
770  { return effectiveBioDiffCoefficient_[compIdx]; }
771 
772  OPM_HOST_DEVICE const auto& effectiveBioDiffCoefficient() const{
773  return effectiveBioDiffCoefficient_;
774  }
775 
776 private:
777  Scalar diffusivity_;
778  EvaluationArray effectiveDiffusionCoefficient_;
779  std::array<Evaluation, numBioInWat> effectiveBioDiffCoefficient_;
780 };
781 
782 } // namespace Opm
783 
784 #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:462
OPM_HOST_DEVICE Scalar diffusivity() const
The diffusivity the face.
Definition: blackoildiffusionmodule.hh:626
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:469
OPM_HOST_DEVICE const Evaluation & effectiveDiffusionCoefficient(unsigned, unsigned) const
The effective diffusion coeffcient of a component in a fluid phase at the face&#39;s integration point...
Definition: blackoildiffusionmodule.hh:639
Struct holding the parameters for the BlackOilBioeffectsModule class.
Definition: blackoilbioeffectsparams.hpp:41
Provides the volumetric quantities required for the calculation of molecular diffusive fluxes...
Definition: blackoildiffusionmodule.hh:353
static void registerParameters()
Register all run-time parameters for the diffusion module.
Definition: blackoildiffusionmodule.hh:77
void update_(const ElementContext &, unsigned, unsigned)
Update the quantities required to calculate the diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:609
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:165
void update_(FluidState &, const unsigned, const ElementContext &, unsigned, unsigned)
Update the quantities required to calculate diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:401
OPM_HOST_DEVICE Scalar diffusionCoefficient(unsigned, unsigned) const
Returns the molecular diffusion coefficient for a component in a phase.
Definition: blackoildiffusionmodule.hh:379
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
OPM_HOST_DEVICE Scalar diffusivity() const
The diffusivity of the face.
Definition: blackoildiffusionmodule.hh:753
Declare the properties used by the infrastructure code of the finite volume discretizations.
OPM_HOST_DEVICE Scalar effectiveDiffusionCoefficient(unsigned, unsigned) const
Returns the effective molecular diffusion coefficient of the porous medium for a component in a phase...
Definition: blackoildiffusionmodule.hh:389
static void registerParameters()
Register all run-time parameters for the diffusion module.
Definition: blackoildiffusionmodule.hh:139
Provides the quantities required to calculate diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:57
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:476
OPM_HOST_DEVICE Evaluation bioDiffCoefficient(unsigned compIdx) const
Returns the molecular diffusion coefficient for a biocomponent in the water phase.
Definition: blackoildiffusionmodule.hh:492
static void initFromState(const EclipseState &)
Initialize all internal data structures needed by the diffusion module.
Definition: blackoildiffusionmodule.hh:71
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:499
static OPM_HOST_DEVICE void addDiffusiveFlux(RateVector &, const Context &, unsigned, unsigned)
Adds the diffusive mass flux flux to the flux vector over a flux integration point.
Definition: blackoildiffusionmodule.hh:85
Contains the classes required to extend the black-oil model by bioeffects.
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:763
Contains the high level supplements required to extend the black oil model by bioeffects.
Definition: blackoilbioeffectsmodules.hh:94
static void initFromState(const EclipseState &eclState)
Initialize all internal data structures needed by the diffusion module.
Definition: blackoildiffusionmodule.hh:126
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:515
Provides the auxiliary methods required for consideration of the diffusion equation.
Definition: blackoildiffusionmodule.hh:54
void update_(const ElementContext &elemCtx, unsigned faceIdx, unsigned timeIdx)
Update the quantities required to calculate the diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:674
Provides the quantities required to calculate diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:651
OPM_HOST_DEVICE Scalar tortuosity(unsigned) const
Returns the tortuousity of the sub-domain of a fluid phase in the porous medium.
Definition: blackoildiffusionmodule.hh:369