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};
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