OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
KokkosSourceKernels.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2
11
12#pragma once
13#include <Kokkos_Core.hpp>
14
15namespace openswmm::twoD::gpu {
16// Water-only counterpart of ExplicitInertialSolver::prepareCellSources.
17// Input volume has already received face transfers; depth is the pre-source
18// depth, as on the CPU. All returned transfers are volumes, not rates.
23
31KOKKOS_INLINE_FUNCTION double sourceSink(double rate, double h, double dry) {
32 if (rate <= 0.0 || h <= 0.0)
33 return 0.0;
34 if (h >= dry)
35 return rate;
36 const double t = h / dry;
37 return rate * t * t * (3.0 - 2.0 * t);
38}
39
60KOKKOS_INLINE_FUNCTION SourceBudget sourceBudget(double volume, double h, double area, double dt,
61 double dry, double rain_rate, double coupling_rate,
62 double infil_rate, double evap_rate) {
63 const double adt = area * dt;
64 const double rain = (rain_rate > 0.0 ? rain_rate : 0.0) * adt;
65 const double coupling = coupling_rate * adt;
66 const double inf = sourceSink(infil_rate, h, dry) * adt;
67 const double evap = sourceSink(evap_rate, h, dry) * adt;
68 if (rain == 0.0 && coupling == 0.0 && inf == 0.0 && evap == 0.0)
69 return {volume, 0.0, 0.0, 0.0, false};
70 const double incoming = rain + (coupling > 0.0 ? coupling : 0.0);
71 const double available = volume + incoming > 0.0 ? volume + incoming : 0.0;
72 const double out = coupling < 0.0 ? -coupling : 0.0;
73 const double requested = inf + evap + out;
74 const double scale = requested > available && requested > 0.0 ? available / requested : 1.0;
75 return {requested >= available ? 0.0 : available - requested, inf * scale, evap * scale,
76 (coupling > 0.0 ? coupling : 0.0) - out * scale, true};
77}
78} // namespace openswmm::twoD::gpu
Definition ExplicitKokkosSurfaceSolver.cpp:48
KOKKOS_INLINE_FUNCTION double sourceSink(double rate, double h, double dry)
Apply the cubic wet/dry ramp to a held nonnegative sink demand.
Definition KokkosSourceKernels.hpp:31
KOKKOS_INLINE_FUNCTION SourceBudget sourceBudget(double volume, double h, double area, double dt, double dry, double rain_rate, double coupling_rate, double infil_rate, double evap_rate)
Compute a donor-limited water-only cell source update without mutating device arrays.
Definition KokkosSourceKernels.hpp:60
Definition KokkosSourceKernels.hpp:19
double infiltration
Definition KokkosSourceKernels.hpp:20
double coupling
Definition KokkosSourceKernels.hpp:20
double evaporation
Definition KokkosSourceKernels.hpp:20
bool applied
Definition KokkosSourceKernels.hpp:21
double volume
Definition KokkosSourceKernels.hpp:20