OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
AquiferLinkExchange.hpp File Reference

G-X4 (2026-09-20) — the signed conduit ⇄ two-zone-aquifer conductance law, shared by the two places that compute a conduit's seepage rate (DynamicWave's fused kernel and routing::computeConduitLosses for KINWAVE / STEADY / FV). More...

#include <algorithm>
#include <cstddef>
#include "../core/SimulationContext.hpp"
Include dependency graph for AquiferLinkExchange.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Namespaces

namespace  openswmm
 
namespace  openswmm::hydraulics
 

Functions

double openswmm::hydraulics::aquiferSeepFactor (double depth, double gw_head_rel, double d_c) noexcept
 Compute the signed conductance multiplier for conduit-to-aquifer seepage.
 
double openswmm::hydraulics::capAquiferGain (double seep_rate, double gain_max) noexcept
 Limit the gaining direction of a signed conduit seepage rate.
 
void openswmm::hydraulics::applySeepageForcing (const SimulationContext &ctx, std::size_t link, double &seep_rate) noexcept
 Apply the registered host seepage override or addition to a conduit rate.
 

Detailed Description

G-X4 (2026-09-20) — the signed conduit ⇄ two-zone-aquifer conductance law, shared by the two places that compute a conduit's seepage rate (DynamicWave's fused kernel and routing::computeConduitLosses for KINWAVE / STEADY / FV).

Legacy SWMM gives a conduit a one-way seepage LOSS at a fixed rate: q = K · W · L, an assumed unit gradient, whatever the groundwater does. With a [2D_AQUIFER] under the conduit and LINK_SEEPAGE TWO_WAY, that becomes a MODFLOW-River exchange about the conduit's own invert:

h_link = z_inv + depth                     (water surface)
h_eff  = max(h_gw, z_inv)                  (bottom clamp)
Q      = K · W · L · min((h_link − h_eff)/d_c, 1)

+ is out of the pipe, the sign the whole engine already uses for seep_loss_rate, so a gaining reach is simply a negative seepage. The three properties that matter:

  1. It reproduces legacy exactly where legacy is right. With the table at or below the invert and the pipe full (depth ≥ d_c, whose default IS the conduit's full depth), the factor is 1 and the rate is the legacy K · W · L to the bit. This is MODFLOW's disconnected-stream limit: once the aquifer head falls below the bed, the leakage saturates.
  2. It is continuous through the water table. A rising table throttles the loss smoothly to zero and then reverses.
  3. The gain is bounded by the aquifer, not by the pipe. gw_gain_max is the aquifer's frozen per-step share of the drainable water in the cells the conduit crosses, so the 1D can never take water the 2D does not have — the same budget-then-deliver rule the node exchange uses (G-X1).

The publisher (SurfaceRouter2D, before routing) owns the datum: it hands over the table elevation already relative to the conduit's mid invert, so neither loss site needs node inverts or the mesh datum.

Author
Caleb Buahin caleb.nosp@m..bua.nosp@m.hin@g.nosp@m.mail.nosp@m..com
License
Apache-2.0