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
45namespace Opm {
46
53template <class TypeTag, bool enableDiffusion>
55
56template <class TypeTag, bool enableDiffusion>
58
62template <class TypeTag>
63class BlackOilDiffusionModule<TypeTag, /*enableDiffusion=*/false>
64{
66
67public:
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
95template <class TypeTag>
96class BlackOilDiffusionModule<TypeTag, /*enableDiffusion=*/true>
97{
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
120public:
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
311private:
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
340template <typename TypeTag>
341bool
342BlackOilDiffusionModule<TypeTag, true>::use_mole_fraction_;
343#endif
344
352template <class TypeTag, bool enableDiffusion>
354
358template <class TypeTag>
359class BlackOilDiffusionIntensiveQuantities<TypeTag, /*enableDiffusion=*/false>
360{
363
364public:
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
395protected:
400 template <class FluidState>
401 void update_(FluidState&,
402 const unsigned,
403 const ElementContext&,
404 unsigned,
405 unsigned)
406 {}
407};
408
412template <class TypeTag>
413class BlackOilDiffusionIntensiveQuantities<TypeTag, /*enableDiffusion=*/true>
414{
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
431public:
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
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
509protected:
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
579private:
580 std::array<Evaluation, numPhases> tortuosity_{};
581 std::array<std::array<Evaluation, numComponents>, numPhases> diffusionCoefficient_{};
582 std::array<Evaluation, numBioInWat> bioDiffCoefficient_{};
583};
584
591template <class TypeTag, bool enableDiffusion>
592class BlackOilDiffusionExtensiveQuantities;
593
597template <class TypeTag>
598class BlackOilDiffusionExtensiveQuantities<TypeTag, /*enableDiffusion=*/false>
599{
603
604protected:
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
621public:
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
650template <class TypeTag>
651class BlackOilDiffusionExtensiveQuantities<TypeTag, /*enableDiffusion=*/true>
652{
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
666public:
667 using EvaluationArray = std::array<std::array<Evaluation, numComponents>, numPhases>;
668
669protected:
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
697public:
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
736protected:
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
746public:
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
776private:
777 Scalar diffusivity_;
778 EvaluationArray effectiveDiffusionCoefficient_;
779 std::array<Evaluation, numBioInWat> effectiveBioDiffCoefficient_;
780};
781
782} // namespace Opm
783
784#endif
Contains the classes 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
OPM_HOST_DEVICE const Evaluation & effectiveDiffusionCoefficient(unsigned, unsigned) const
The effective diffusion coeffcient of a component in a fluid phase at the face's integration point.
Definition: blackoildiffusionmodule.hh:639
OPM_HOST_DEVICE Scalar diffusivity() const
The diffusivity the face.
Definition: blackoildiffusionmodule.hh:626
void update_(const ElementContext &, unsigned, unsigned)
Update the quantities required to calculate the diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:609
void updateBoundary_(const Context &, unsigned, unsigned, const FluidState &)
Definition: blackoildiffusionmodule.hh:615
Provides the quantities required to calculate diffusive mass fluxes.
Definition: blackoildiffusionmodule.hh:652
static void update(EvaluationArray &effectiveDiffusionCoefficient, const IntensiveQuantities &intQuantsInside, const IntensiveQuantities &intQuantsOutside)
Definition: blackoildiffusionmodule.hh:698
OPM_HOST_DEVICE const Evaluation & effectiveBioDiffCoefficient(unsigned compIdx) const
Definition: blackoildiffusionmodule.hh:769
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's integration point.
Definition: blackoildiffusionmodule.hh:763
static void updateBio(std::array< Evaluation, numBioInWat > &effectiveBioDiffCoefficient, const IntensiveQuantities &intQuantsInside, const IntensiveQuantities &intQuantsOutside)
Definition: blackoildiffusionmodule.hh:724
std::array< std::array< Evaluation, numComponents >, numPhases > EvaluationArray
Definition: blackoildiffusionmodule.hh:667
OPM_HOST_DEVICE Scalar diffusivity() const
The diffusivity of the face.
Definition: blackoildiffusionmodule.hh:753
OPM_HOST_DEVICE const auto & effectiveDiffusionCoefficient() const
Definition: blackoildiffusionmodule.hh:766
void updateBoundary_(const Context &, unsigned, unsigned, const FluidState &)
Definition: blackoildiffusionmodule.hh:738
OPM_HOST_DEVICE const auto & effectiveBioDiffCoefficient() const
Definition: blackoildiffusionmodule.hh:772
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:57
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 tortuosity(unsigned) const
Returns the tortuousity of the sub-domain of a fluid phase in the porous medium.
Definition: blackoildiffusionmodule.hh:369
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
OPM_HOST_DEVICE Scalar diffusionCoefficient(unsigned, unsigned) const
Returns the molecular diffusion coefficient for a component in a phase.
Definition: blackoildiffusionmodule.hh:379
BlackOilDiffusionIntensiveQuantities & operator=(const BlackOilDiffusionIntensiveQuantities &rhs)
Definition: blackoildiffusionmodule.hh:445
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 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
BlackOilDiffusionIntensiveQuantities(BlackOilDiffusionIntensiveQuantities &&) noexcept=default
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 Evaluation bioDiffCoefficient(unsigned compIdx) const
Returns the molecular diffusion coefficient for a biocomponent in the water phase.
Definition: blackoildiffusionmodule.hh:492
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
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
void update_(FluidState &fluidState, const unsigned regionIdx, const IntensiveQuantities &intQuants)
Definition: blackoildiffusionmodule.hh:531
Provides the volumetric quantities required for the calculation of molecular diffusive fluxes.
Definition: blackoildiffusionmodule.hh:353
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
static void initFromState(const EclipseState &)
Initialize all internal data structures needed by the diffusion module.
Definition: blackoildiffusionmodule.hh:71
static void registerParameters()
Register all run-time parameters for the diffusion module.
Definition: blackoildiffusionmodule.hh:77
static OPM_HOST_DEVICE void addBioDiffFlux(RateVector &flux, const IntensiveQuantities &inIq, const IntensiveQuantities &exIq, const Evaluation &diffusivity, const EvaluationArray &effectiveBioDiffCoefficient)
Definition: blackoildiffusionmodule.hh:276
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
static void initFromState(const EclipseState &eclState)
Initialize all internal data structures needed by the diffusion module.
Definition: blackoildiffusionmodule.hh:126
static void registerParameters()
Register all run-time parameters for the diffusion module.
Definition: blackoildiffusionmodule.hh:139
static OPM_HOST_DEVICE void addDiffusiveFlux(RateVectorT &flux, const IntensiveQuantities &inIq, const IntensiveQuantities &exIq, const Evaluation &diffusivity, const EvaluationArray &effectiveDiffusionCoefficient)
Definition: blackoildiffusionmodule.hh:186
Provides the auxiliary methods required for consideration of the diffusion equation.
Definition: blackoildiffusionmodule.hh:54
Declare the properties used by the infrastructure code of the finite volume discretizations.
Definition: blackoilbioeffectsmodules.hh:45
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
Struct holding the parameters for the BlackOilBioeffectsModule class.
Definition: blackoilbioeffectsparams.hpp:42