30#ifndef OPM_GPU_FLOW_PROBLEM_HPP
31#define OPM_GPU_FLOW_PROBLEM_HPP
33#include <opm/common/utility/VectorWithDefaultAllocator.hpp>
34#include <opm/common/utility/gpuDecorators.hpp>
35#include <opm/common/ErrorMacros.hpp>
39#include <opm/material/fluidmatrixinteractions/GpuEclMaterialLawManager.hpp>
40#include <opm/material/thermal/GpuEclThermalLawManager.hpp>
81 OPM_HOST_DEVICE ThermalConductionLawParams
93inline ::Opm::NoThermalLawManager
96 return ::Opm::NoThermalLawManager{};
100inline ::Opm::NoThermalLawManager
103 return ::Opm::NoThermalLawManager{};
131template <
class ScalarT,
132 class MaterialLawManagerT,
133 template <
class>
class Storage = ::Opm::VectorWithDefaultAllocator,
149 = !std::is_same_v<typename EclThermalLawManager::FluidSystem, void>;
182 bool usesDefaultRockCompaction)
194 if (!usesDefaultRockCompaction) {
195 OPM_THROW(std::logic_error,
196 "GPU FlowProblem does not support non-default rock compaction multipliers");
213 template <
class CpuProblem,
214 class StS = Storage<Scalar>,
216 std::is_same_v<StS, ::Opm::VectorWithDefaultAllocator<Scalar>>,
221 if (!cpu.usesDefaultRockCompaction()) {
222 OPM_THROW(std::logic_error,
223 "GPU FlowProblem does not support non-default rock compaction multipliers");
225 const std::size_t n = cpu.model().numGridDof();
227 rockCompressibility_.resize(n);
228 rockReferencePressure_.resize(n);
229 maxOilSaturation_.resize(n);
230 maxOilVaporizationFactor_.resize(n);
231 maxGasDissolutionFactor_.resize(n);
232 for (std::size_t i = 0; i < n; ++i) {
233 const unsigned u =
static_cast<unsigned>(i);
234 porosity_[i] = cpu.porosity(u, 0u);
235 rockCompressibility_[i] = cpu.rockCompressibility(u);
236 rockReferencePressure_[i] = cpu.rockReferencePressure(u);
237 maxOilSaturation_[i] = cpu.maxOilSaturation(u);
238 maxOilVaporizationFactor_[i] = cpu.maxOilVaporizationFactor(0u, u);
239 maxGasDissolutionFactor_[i] = cpu.maxGasDissolutionFactor(0u, u);
242 using FluidSystemTag =
typename EclThermalLawManager::FluidSystem;
244 = ::Opm::EclThermalLaw::buildCpuManagerFromFlowProblem<Scalar, FluidSystemTag>(
246 rockFraction_.resize(n);
247 pvtRegionIndex_.resize(n);
248 for (std::size_t i = 0; i < n; ++i) {
249 const unsigned u =
static_cast<unsigned>(i);
250 rockFraction_[i] = cpu.rockFraction(u, 0u);
251 pvtRegionIndex_[i] =
static_cast<int>(cpu.pvtRegionIndex(u));
268 template <
class CpuProblem,
269 class StS = Storage<Scalar>,
271 std::is_same_v<StS, ::Opm::gpuistl::GpuBuffer<Scalar>>,
275 , porosity_(extractRockField(cpu, [](const CpuProblem& p, unsigned u) {
276 return Scalar(p.porosity(u, 0u));
278 , rockCompressibility_(extractRockField(cpu, [](
const CpuProblem& p,
unsigned u) {
279 return Scalar(p.rockCompressibility(u));
281 , rockReferencePressure_(extractRockField(cpu, [](
const CpuProblem& p,
unsigned u) {
282 return Scalar(p.rockReferencePressure(u));
284 , maxOilSaturation_(extractRockField(cpu, [](
const CpuProblem& p,
unsigned u) {
285 return Scalar(p.maxOilSaturation(u));
287 , maxOilVaporizationFactor_(extractRockField(cpu, [](
const CpuProblem& p,
unsigned u) {
288 return Scalar(p.maxOilVaporizationFactor(0u, u));
290 , maxGasDissolutionFactor_(extractRockField(cpu, [](
const CpuProblem& p,
unsigned u) {
291 return Scalar(p.maxGasDissolutionFactor(0u, u));
293 , thermalLawManager_(buildGpuThermalManager(cpu))
294 , rockFraction_(extractThermalScalarField(cpu, [](
const CpuProblem& p,
unsigned u) {
295 return Scalar(p.rockFraction(u, 0u));
297 , pvtRegionIndex_(extractThermalIntField(cpu, [](
const CpuProblem& p,
unsigned u) {
298 return static_cast<int>(p.pvtRegionIndex(u));
301 if (!cpu.usesDefaultRockCompaction()) {
302 OPM_THROW(std::logic_error,
303 "GPU FlowProblem does not support non-default rock compaction multipliers");
314 return materialLawManager_.satnumRegionIdx(
static_cast<unsigned>(elemIdx));
319 return materialLawManager_.materialLawParams(
static_cast<unsigned>(elemIdx));
324 return rockCompressibility_.size() == 0 ?
Scalar(0) : rockCompressibility_[elemIdx];
329 return rockReferencePressure_.size() == 0 ?
Scalar(0) : rockReferencePressure_[elemIdx];
334 return porosity_.size() == 0 ?
Scalar(0) : porosity_[elemIdx];
339 return maxOilVaporizationFactor_.size() == 0 ?
Scalar(0) : maxOilVaporizationFactor_[elemIdx];
344 return maxGasDissolutionFactor_.size() == 0 ?
Scalar(0) : maxGasDissolutionFactor_[elemIdx];
349 return maxOilSaturation_.size() == 0 ?
Scalar(0) : maxOilSaturation_[elemIdx];
356 return pvtRegionIndex_.size() == 0
358 :
static_cast<unsigned>(pvtRegionIndex_[elemIdx]);
366 return rockFraction_.size() == 0 ?
Scalar(0) : rockFraction_[elemIdx];
374 return thermalLawManager_.solidEnergyLawParams(
static_cast<unsigned>(elemIdx));
382 return thermalLawManager_.thermalConductionLawParams(
static_cast<unsigned>(elemIdx));
386 template <
class Evaluation>
390 return Evaluation(1.0);
394 template <
class Evaluation>
398 return Evaluation(1.0);
412 template <
class FluidState,
class... Args>
415 FluidState& fluidState,
416 unsigned globalSpaceIdx)
const
418 using ContainerT = std::decay_t<
decltype(mobility)>;
420 EclMaterialLawManager::MaterialLaw::template relativePermeabilities<
421 ContainerT, FluidState, Args...>(mobility, materialParams, fluidState);
427 {
return materialLawManager_; }
430 {
return materialLawManager_; }
433 {
return porosity_; }
436 {
return porosity_; }
439 {
return rockCompressibility_; }
442 {
return rockCompressibility_; }
445 {
return rockReferencePressure_; }
448 {
return rockReferencePressure_; }
451 {
return maxOilSaturation_; }
454 {
return maxOilSaturation_; }
457 {
return maxOilVaporizationFactor_; }
460 {
return maxOilVaporizationFactor_; }
463 {
return maxGasDissolutionFactor_; }
466 {
return maxGasDissolutionFactor_; }
469 {
return thermalLawManager_; }
472 {
return thermalLawManager_; }
475 {
return rockFraction_; }
478 {
return rockFraction_; }
481 {
return pvtRegionIndex_; }
484 {
return pvtRegionIndex_; }
488 template <
class CpuProblem,
class F>
489 static Storage<Scalar> extractRockField(
const CpuProblem& cpu, F f)
491 const std::size_t n = cpu.model().numGridDof();
492 std::vector<Scalar> v(n);
493 for (std::size_t i = 0; i < n; ++i) {
494 v[i] = f(cpu,
static_cast<unsigned>(i));
496 if constexpr (std::is_same_v<Storage<Scalar>,
497 ::Opm::VectorWithDefaultAllocator<Scalar>>) {
498 return Storage<Scalar>(v.begin(), v.end());
500 return Storage<Scalar>(v);
506 template <
class CpuProblem,
class F>
507 static Storage<Scalar> extractThermalScalarField(
const CpuProblem& cpu, F f)
510 return Storage<Scalar>{};
512 return extractRockField(cpu, f);
518 template <
class CpuProblem,
class F>
519 static Storage<int> extractThermalIntField(
const CpuProblem& cpu, F f)
522 return Storage<int>{};
524 const std::size_t n = cpu.model().numGridDof();
525 std::vector<int> v(n);
526 for (std::size_t i = 0; i < n; ++i) {
527 v[i] = f(cpu,
static_cast<unsigned>(i));
529 if constexpr (std::is_same_v<Storage<int>,
530 ::Opm::VectorWithDefaultAllocator<int>>) {
531 return Storage<int>(v.begin(), v.end());
533 return Storage<int>(v);
541 template <
class CpuProblem>
547 using FluidSystemTag =
typename EclThermalLawManager::FluidSystem;
549 = ::Opm::EclThermalLaw::buildCpuManagerFromFlowProblem<Scalar, FluidSystemTag>(
550 cpu, cpu.model().numGridDof());
556 Storage<Scalar> porosity_{};
557 Storage<Scalar> rockCompressibility_{};
558 Storage<Scalar> rockReferencePressure_{};
559 Storage<Scalar> maxOilSaturation_{};
560 Storage<Scalar> maxOilVaporizationFactor_{};
561 Storage<Scalar> maxGasDissolutionFactor_{};
563 Storage<Scalar> rockFraction_{};
564 Storage<int> pvtRegionIndex_{};
576template <
class ScalarT,
class CpuMaterialLawManager,
class CpuThermalLawManager>
578 const ::Opm::GpuFlowProblem<ScalarT,
579 CpuMaterialLawManager,
580 ::Opm::VectorWithDefaultAllocator,
581 CpuThermalLawManager>& cpu)
583 using GpuMaterialLawManagerBuffer
585 using GpuThermalLawManagerBuffer
588 GpuMaterialLawManagerBuffer,
590 GpuThermalLawManagerBuffer>;
609template <
class ScalarT,
class GpuBufferMaterialLawManager,
class GpuBufferThermalLawManager>
611 GpuBufferMaterialLawManager,
613 GpuBufferThermalLawManager>& buf)
615 using GpuMaterialLawManagerView
617 using GpuThermalLawManagerView
620 GpuMaterialLawManagerView,
622 GpuThermalLawManagerView>;
624 auto toView = [](
auto& storage) {
625 using T =
typename std::decay_t<
decltype(storage)>::value_type;
626 return GpuView<T>(storage.data(), storage.size());
630 toView(buf.porosityStorage()),
631 toView(buf.rockCompressibilityStorage()),
632 toView(buf.rockReferencePressureStorage()),
633 toView(buf.maxOilSaturationStorage()),
634 toView(buf.maxOilVaporizationFactorStorage()),
635 toView(buf.maxGasDissolutionFactorStorage()),
637 toView(buf.rockFractionStorage()),
638 toView(buf.pvtRegionIndexStorage()),
Minimal, GPU-compatible problem class.
Definition: GpuFlowProblem.hpp:136
Storage< Scalar > & maxOilVaporizationFactorStorage()
Definition: GpuFlowProblem.hpp:459
Storage< Scalar > & porosityStorage()
Definition: GpuFlowProblem.hpp:435
OPM_HOST_DEVICE Scalar rockReferencePressure(std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:327
const EclMaterialLawManager & materialLawManager() const
Definition: GpuFlowProblem.hpp:426
Storage< Scalar > & rockFractionStorage()
Definition: GpuFlowProblem.hpp:477
Storage< Scalar > & maxGasDissolutionFactorStorage()
Definition: GpuFlowProblem.hpp:465
Storage< Scalar > & rockReferencePressureStorage()
Definition: GpuFlowProblem.hpp:447
OPM_HOST_DEVICE Scalar rockCompressibility(std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:322
static constexpr bool hasThermal
True iff the thermal-law manager carries a real fluid-system tag (anything other than void) and there...
Definition: GpuFlowProblem.hpp:149
OPM_HOST_DEVICE Scalar maxOilVaporizationFactor(unsigned, std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:337
OPM_HOST_DEVICE Evaluation rockCompPoroMultiplier(const auto &, std::size_t) const
Default rock-pore-volume multiplier (1 if no compressibility).
Definition: GpuFlowProblem.hpp:387
OPM_HOST_DEVICE unsigned pvtRegionIndex(std::size_t elemIdx) const
Per-cell PVT region index. Returns 0 when the GpuFlowProblem instantiation has no thermal support.
Definition: GpuFlowProblem.hpp:354
typename EclMaterialLawManager::MaterialLawParams MaterialLawParams
Definition: GpuFlowProblem.hpp:140
Storage< Scalar > & maxOilSaturationStorage()
Definition: GpuFlowProblem.hpp:453
typename EclThermalLawManager::ThermalConductionLawParams ThermalConductionLawParams
Definition: GpuFlowProblem.hpp:143
EclMaterialLawManager & materialLawManager()
Definition: GpuFlowProblem.hpp:429
OPM_HOST_DEVICE Scalar porosity(std::size_t elemIdx, unsigned) const
Definition: GpuFlowProblem.hpp:332
OPM_HOST_DEVICE ModelView model() const
Definition: GpuFlowProblem.hpp:307
GpuFlowProblem(EclMaterialLawManager materialLawManager, Storage< Scalar > porosity, Storage< Scalar > rockCompressibility, Storage< Scalar > rockReferencePressure, Storage< Scalar > maxOilSaturation, Storage< Scalar > maxOilVaporizationFactor, Storage< Scalar > maxGasDissolutionFactor, EclThermalLawManager thermalLawManager, Storage< Scalar > rockFraction, Storage< int > pvtRegionIndex, bool usesDefaultRockCompaction)
Definition: GpuFlowProblem.hpp:172
Storage< Scalar > & rockCompressibilityStorage()
Definition: GpuFlowProblem.hpp:441
const Storage< Scalar > & rockFractionStorage() const
Definition: GpuFlowProblem.hpp:474
Storage< int > & pvtRegionIndexStorage()
Definition: GpuFlowProblem.hpp:483
MaterialLawManagerT EclMaterialLawManager
Definition: GpuFlowProblem.hpp:139
const Storage< int > & pvtRegionIndexStorage() const
Definition: GpuFlowProblem.hpp:480
ScalarT Scalar
Definition: GpuFlowProblem.hpp:138
OPM_HOST_DEVICE ThermalConductionLawParams thermalConductionLawParams(std::size_t elemIdx, unsigned) const
Thermal-conduction law parameters for a single cell. Forwards to the embedded thermal-law manager.
Definition: GpuFlowProblem.hpp:380
const Storage< Scalar > & maxGasDissolutionFactorStorage() const
Definition: GpuFlowProblem.hpp:462
OPM_HOST_DEVICE Scalar maxGasDissolutionFactor(unsigned, std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:342
OPM_HOST_DEVICE void updateRelperms(auto &mobility, auto &, FluidState &fluidState, unsigned globalSpaceIdx) const
Update the relative permeabilities of all phases for a single cell, in the same way as the CPU FlowPr...
Definition: GpuFlowProblem.hpp:413
const Storage< Scalar > & porosityStorage() const
Definition: GpuFlowProblem.hpp:432
typename EclThermalLawManager::SolidEnergyLawParams SolidEnergyLawParams
Definition: GpuFlowProblem.hpp:142
const Storage< Scalar > & rockCompressibilityStorage() const
Definition: GpuFlowProblem.hpp:438
OPM_HOST_DEVICE Scalar maxOilSaturation(std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:347
ThermalLawManagerT EclThermalLawManager
Definition: GpuFlowProblem.hpp:141
OPM_HOST_DEVICE int satnumRegionIndex(std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:312
const Storage< Scalar > & rockReferencePressureStorage() const
Definition: GpuFlowProblem.hpp:444
OPM_HOST_DEVICE Scalar rockFraction(std::size_t elemIdx, unsigned) const
Per-cell rock fraction (1 - effective porosity). Returns 0 when the GpuFlowProblem instantiation has ...
Definition: GpuFlowProblem.hpp:364
OPM_HOST_DEVICE SolidEnergyLawParams solidEnergyLawParams(std::size_t elemIdx, unsigned) const
Solid-energy law parameters for a single cell. Forwards to the embedded thermal-law manager.
Definition: GpuFlowProblem.hpp:372
const Storage< Scalar > & maxOilSaturationStorage() const
Definition: GpuFlowProblem.hpp:450
EclThermalLawManager & thermalLawManager()
Definition: GpuFlowProblem.hpp:471
const EclThermalLawManager & thermalLawManager() const
Definition: GpuFlowProblem.hpp:468
const Storage< Scalar > & maxOilVaporizationFactorStorage() const
Definition: GpuFlowProblem.hpp:456
GpuFlowProblem(const CpuProblem &cpu)
Construct from any CPU FlowProblem (or FlowProblemBlackoil).
Definition: GpuFlowProblem.hpp:218
OPM_HOST_DEVICE MaterialLawParams materialLawParams(std::size_t elemIdx) const
Definition: GpuFlowProblem.hpp:317
OPM_HOST_DEVICE Evaluation rockCompTransMultiplier(const auto &, std::size_t) const
Default rock-trans multiplier (1 if no compressibility).
Definition: GpuFlowProblem.hpp:395
Definition: GpuFlowProblem.hpp:50
The GpuView class is provides a view of some data allocated on the GPU Essenstially is only stores a ...
Definition: GpuView.hpp:53
A small, fixed‑dimension MiniVector class backed by std::array that can be used in both host and CUDA...
Definition: GpuFlowProblem.hpp:48
inline ::Opm::NoThermalLawManager make_view(::Opm::NoThermalLawManager &)
make_view overload for the no-op thermal manager.
Definition: GpuFlowProblem.hpp:101
auto copy_to_gpu(const ::Opm::GpuFlowProblem< ScalarT, CpuMaterialLawManager, ::Opm::VectorWithDefaultAllocator, CpuThermalLawManager > &cpu)
Copy a CPU GpuFlowProblem to GPU-resident GpuBuffer storage.
Definition: GpuFlowProblem.hpp:577
auto make_view(::Opm::GpuFlowProblem< ScalarT, GpuBufferMaterialLawManager, GpuBuffer, GpuBufferThermalLawManager > &buf)
Make a non-owning GpuView based GpuFlowProblem from an owning GpuBuffer based GpuFlowProblem.
Definition: GpuFlowProblem.hpp:610
inline ::Opm::NoThermalLawManager copy_to_gpu(const ::Opm::NoThermalLawManager &)
copy_to_gpu overload for the no-op thermal manager.
Definition: GpuFlowProblem.hpp:94
Definition: blackoilbioeffectsmodules.hh:45
Definition: GpuFlowProblem.hpp:157
OPM_HOST_DEVICE LinearizationType getLinearizationType() const
Definition: GpuFlowProblem.hpp:158
Trivial nested model() helper that satisfies the problem.model().linearizer().getLinearizationType() ...
Definition: GpuFlowProblem.hpp:155
OPM_HOST_DEVICE LinearizerView linearizer() const
Definition: GpuFlowProblem.hpp:164
Definition: linearizationtype.hh:34
Definition: GpuFlowProblem.hpp:74
Definition: GpuFlowProblem.hpp:75
No-op thermal-law manager used as the default 4th template arg of GpuFlowProblem.
Definition: GpuFlowProblem.hpp:72
OPM_HOST_DEVICE SolidEnergyLawParams solidEnergyLawParams(unsigned) const
Definition: GpuFlowProblem.hpp:77
OPM_HOST_DEVICE ThermalConductionLawParams thermalConductionLawParams(unsigned) const
Definition: GpuFlowProblem.hpp:82
void FluidSystem
Definition: GpuFlowProblem.hpp:73