Skip to content

Commit 88612bb

Browse files
committed
Change package name
1 parent 7b20e3f commit 88612bb

25 files changed

+222
-204
lines changed

README.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
1-
# superlink
2-
🚰 Implementation of the SUPERLINK hydraulic solver by [Ji (1998).](https://ascelibrary.org/doi/10.1061/%28ASCE%290733-9429%281998%29124%3A3%28307%29)
1+
# pipedream
32

4-
```
5-
Ji, Z. (1998). General Hydrodynamic Model for Sewer/Channel Network Systems.
6-
Journal of Hydraulic Engineering, 124(3), 307–315.
7-
doi: 10.1061/(asce)0733-9429(1998)124:3(307)
8-
```
3+
An interactive hydrodynamic solver for sewer/stormwater networks.
94

105
# A Minimal Example
116

@@ -16,8 +11,8 @@ doi: 10.1061/(asce)0733-9429(1998)124:3(307)
1611
```python
1712
# Import modules
1813
import pandas as pd
19-
from superlink.hydraulics import SuperLink
20-
from superlink.simulation import Simulation
14+
from pipedream_solver.hydraulics import SuperLink
15+
from pipedream_solver.simulation import Simulation
2116

2217
# Specify data path
2318
input_path = '../data/six_pipes'
@@ -62,3 +57,14 @@ with Simulation(superlink, Q_in=Q_in, H_bc=H_bc) as simulation:
6257
See plotting code [here](https://github.com/mdbartos/superlink/blob/master/test/six_pipe_test.ipynb).
6358

6459
![Superlink Example](https://s3.us-east-2.amazonaws.com/mdbartos-img/superlink/superlink_test.png)
60+
61+
# Acknowledgments
62+
63+
🚰 Hydraulic solver based on the SUPERLINK scheme proposed by Zhong Ji [Ji (1998).](https://ascelibrary.org/doi/10.1061/%28ASCE%290733-9429%281998%29124%3A3%28307%29)
64+
65+
```
66+
Ji, Z. (1998). General Hydrodynamic Model for Sewer/Channel Network Systems.
67+
Journal of Hydraulic Engineering, 124(3), 307–315.
68+
doi: 10.1061/(asce)0733-9429(1998)124:3(307)
69+
```
70+
File renamed without changes.

pipedream_solver/hydraulics.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
try:
2+
import numba
3+
_HAS_NUMBA = True
4+
except:
5+
_HAS_NUMBA = False
6+
if _HAS_NUMBA:
7+
from pipedream_solver.nsuperlink import nSuperLink as SuperLink
8+
else:
9+
from pipedream_solver.superlink import SuperLink as SuperLink

pipedream_solver/hydrology.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
try:
2+
import numba
3+
_HAS_NUMBA = True
4+
except:
5+
_HAS_NUMBA = False
6+
if _HAS_NUMBA:
7+
from pipedream_solver.ninfiltration import nGreenAmpt as GreenAmpt
8+
else:
9+
from pipedream_solver.infiltration import GreenAmpt as GreenAmpt
File renamed without changes.
File renamed without changes.

superlink/ninfiltration.py renamed to pipedream_solver/ninfiltration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import numpy as np
2-
from superlink.nutils import newton_raphson, bounded_newton_raphson, numba_any
3-
from superlink.infiltration import GreenAmpt
2+
from pipedream_solver.nutils import newton_raphson, bounded_newton_raphson, numba_any
3+
from pipedream_solver.infiltration import GreenAmpt
44
from numba import njit
55
import scipy.optimize
66

File renamed without changes.

superlink/numbalink.py renamed to pipedream_solver/nsuperlink.py

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import scipy.sparse
77
import scipy.sparse.linalg
88
from numba import njit, prange
9-
import superlink.geometry
10-
import superlink.ngeometry
11-
import superlink.storage
12-
from superlink.superlink import SuperLink
9+
import pipedream_solver.geometry
10+
import pipedream_solver.ngeometry
11+
import pipedream_solver.storage
12+
from pipedream_solver.superlink import SuperLink
1313

14-
class NumbaLink(SuperLink):
14+
class nSuperLink(SuperLink):
1515
"""
16-
SUPERLINK hydraulic solver, as described in:
16+
Numba implementation of SUPERLINK hydraulic solver, as described in:
1717
1818
Ji, Z. (1998). General Hydrodynamic Model for Sewer/Channel Network Systems.
1919
Journal of Hydraulic Engineering, 124(3), 307–315.
@@ -1520,7 +1520,7 @@ def handle_elliptical_perimeter(_Pe_ik, _ellipse_ix, _Ik, _Ip1k, _h_Ik, _g1_ik,
15201520
_ik_g = _ellipse_ix
15211521
_Ik_g = _Ik[_ik_g]
15221522
_Ip1k_g = _Ip1k[_ik_g]
1523-
_Pe_ik[_ik_g] = superlink.geometry.Elliptical.Pe_ik(_h_Ik[_Ik_g],
1523+
_Pe_ik[_ik_g] = pipedream_solver.geometry.Elliptical.Pe_ik(_h_Ik[_Ik_g],
15241524
_h_Ik[_Ip1k_g],
15251525
_g1_ik[_ik_g],
15261526
_g2_ik[_ik_g])
@@ -1541,45 +1541,45 @@ def numba_hydraulic_geometry(_A_ik, _Pe_ik, _R_ik, _B_ik, _h_Ik,
15411541
g3_i = _g3_ik[i]
15421542
if geom_code:
15431543
if geom_code == 1:
1544-
_A_ik[i] = superlink.ngeometry.Circular_A_ik(h_I, h_Ip1, g1_i)
1545-
_Pe_ik[i] = superlink.ngeometry.Circular_Pe_ik(h_I, h_Ip1, g1_i)
1546-
_R_ik[i] = superlink.ngeometry.Circular_R_ik(_A_ik[i], _Pe_ik[i])
1547-
_B_ik[i] = superlink.ngeometry.Circular_B_ik(h_I, h_Ip1, g1_i)
1544+
_A_ik[i] = pipedream_solver.ngeometry.Circular_A_ik(h_I, h_Ip1, g1_i)
1545+
_Pe_ik[i] = pipedream_solver.ngeometry.Circular_Pe_ik(h_I, h_Ip1, g1_i)
1546+
_R_ik[i] = pipedream_solver.ngeometry.Circular_R_ik(_A_ik[i], _Pe_ik[i])
1547+
_B_ik[i] = pipedream_solver.ngeometry.Circular_B_ik(h_I, h_Ip1, g1_i)
15481548
elif geom_code == 2:
1549-
_A_ik[i] = superlink.ngeometry.Rect_Closed_A_ik(h_I, h_Ip1, g1_i, g2_i)
1550-
_Pe_ik[i] = superlink.ngeometry.Rect_Closed_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1551-
_R_ik[i] = superlink.ngeometry.Rect_Closed_R_ik(_A_ik[i], _Pe_ik[i])
1552-
_B_ik[i] = superlink.ngeometry.Rect_Closed_B_ik(h_I, h_Ip1, g1_i, g2_i)
1549+
_A_ik[i] = pipedream_solver.ngeometry.Rect_Closed_A_ik(h_I, h_Ip1, g1_i, g2_i)
1550+
_Pe_ik[i] = pipedream_solver.ngeometry.Rect_Closed_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1551+
_R_ik[i] = pipedream_solver.ngeometry.Rect_Closed_R_ik(_A_ik[i], _Pe_ik[i])
1552+
_B_ik[i] = pipedream_solver.ngeometry.Rect_Closed_B_ik(h_I, h_Ip1, g1_i, g2_i)
15531553
elif geom_code == 3:
1554-
_A_ik[i] = superlink.ngeometry.Rect_Open_A_ik(h_I, h_Ip1, g1_i, g2_i)
1555-
_Pe_ik[i] = superlink.ngeometry.Rect_Open_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1556-
_R_ik[i] = superlink.ngeometry.Rect_Open_R_ik(_A_ik[i], _Pe_ik[i])
1557-
_B_ik[i] = superlink.ngeometry.Rect_Open_B_ik(h_I, h_Ip1, g1_i, g2_i)
1554+
_A_ik[i] = pipedream_solver.ngeometry.Rect_Open_A_ik(h_I, h_Ip1, g1_i, g2_i)
1555+
_Pe_ik[i] = pipedream_solver.ngeometry.Rect_Open_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1556+
_R_ik[i] = pipedream_solver.ngeometry.Rect_Open_R_ik(_A_ik[i], _Pe_ik[i])
1557+
_B_ik[i] = pipedream_solver.ngeometry.Rect_Open_B_ik(h_I, h_Ip1, g1_i, g2_i)
15581558
elif geom_code == 4:
1559-
_A_ik[i] = superlink.ngeometry.Triangular_A_ik(h_I, h_Ip1, g1_i, g2_i)
1560-
_Pe_ik[i] = superlink.ngeometry.Triangular_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1561-
_R_ik[i] = superlink.ngeometry.Triangular_R_ik(_A_ik[i], _Pe_ik[i])
1562-
_B_ik[i] = superlink.ngeometry.Triangular_B_ik(h_I, h_Ip1, g1_i, g2_i)
1559+
_A_ik[i] = pipedream_solver.ngeometry.Triangular_A_ik(h_I, h_Ip1, g1_i, g2_i)
1560+
_Pe_ik[i] = pipedream_solver.ngeometry.Triangular_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1561+
_R_ik[i] = pipedream_solver.ngeometry.Triangular_R_ik(_A_ik[i], _Pe_ik[i])
1562+
_B_ik[i] = pipedream_solver.ngeometry.Triangular_B_ik(h_I, h_Ip1, g1_i, g2_i)
15631563
elif geom_code == 5:
1564-
_A_ik[i] = superlink.ngeometry.Trapezoidal_A_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1565-
_Pe_ik[i] = superlink.ngeometry.Trapezoidal_Pe_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1566-
_R_ik[i] = superlink.ngeometry.Trapezoidal_R_ik(_A_ik[i], _Pe_ik[i])
1567-
_B_ik[i] = superlink.ngeometry.Trapezoidal_B_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1564+
_A_ik[i] = pipedream_solver.ngeometry.Trapezoidal_A_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1565+
_Pe_ik[i] = pipedream_solver.ngeometry.Trapezoidal_Pe_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1566+
_R_ik[i] = pipedream_solver.ngeometry.Trapezoidal_R_ik(_A_ik[i], _Pe_ik[i])
1567+
_B_ik[i] = pipedream_solver.ngeometry.Trapezoidal_B_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
15681568
elif geom_code == 6:
1569-
_A_ik[i] = superlink.ngeometry.Parabolic_A_ik(h_I, h_Ip1, g1_i, g2_i)
1570-
_Pe_ik[i] = superlink.ngeometry.Parabolic_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1571-
_R_ik[i] = superlink.ngeometry.Parabolic_R_ik(_A_ik[i], _Pe_ik[i])
1572-
_B_ik[i] = superlink.ngeometry.Parabolic_B_ik(h_I, h_Ip1, g1_i, g2_i)
1569+
_A_ik[i] = pipedream_solver.ngeometry.Parabolic_A_ik(h_I, h_Ip1, g1_i, g2_i)
1570+
_Pe_ik[i] = pipedream_solver.ngeometry.Parabolic_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1571+
_R_ik[i] = pipedream_solver.ngeometry.Parabolic_R_ik(_A_ik[i], _Pe_ik[i])
1572+
_B_ik[i] = pipedream_solver.ngeometry.Parabolic_B_ik(h_I, h_Ip1, g1_i, g2_i)
15731573
elif geom_code == 7:
15741574
# NOTE: Assumes that perimeter has already been calculated
1575-
_A_ik[i] = superlink.ngeometry.Elliptical_A_ik(h_I, h_Ip1, g1_i, g2_i)
1576-
_R_ik[i] = superlink.ngeometry.Elliptical_R_ik(_A_ik[i], _Pe_ik[i])
1577-
_B_ik[i] = superlink.ngeometry.Elliptical_B_ik(h_I, h_Ip1, g1_i, g2_i)
1575+
_A_ik[i] = pipedream_solver.ngeometry.Elliptical_A_ik(h_I, h_Ip1, g1_i, g2_i)
1576+
_R_ik[i] = pipedream_solver.ngeometry.Elliptical_R_ik(_A_ik[i], _Pe_ik[i])
1577+
_B_ik[i] = pipedream_solver.ngeometry.Elliptical_B_ik(h_I, h_Ip1, g1_i, g2_i)
15781578
elif geom_code == 8:
1579-
_A_ik[i] = superlink.ngeometry.Wide_A_ik(h_I, h_Ip1, g1_i, g2_i)
1580-
_Pe_ik[i] = superlink.ngeometry.Wide_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1581-
_R_ik[i] = superlink.ngeometry.Wide_R_ik(_A_ik[i], _Pe_ik[i])
1582-
_B_ik[i] = superlink.ngeometry.Wide_B_ik(h_I, h_Ip1, g1_i, g2_i)
1579+
_A_ik[i] = pipedream_solver.ngeometry.Wide_A_ik(h_I, h_Ip1, g1_i, g2_i)
1580+
_Pe_ik[i] = pipedream_solver.ngeometry.Wide_Pe_ik(h_I, h_Ip1, g1_i, g2_i)
1581+
_R_ik[i] = pipedream_solver.ngeometry.Wide_R_ik(_A_ik[i], _Pe_ik[i])
1582+
_B_ik[i] = pipedream_solver.ngeometry.Wide_B_ik(h_I, h_Ip1, g1_i, g2_i)
15831583
return 1
15841584

15851585
@njit
@@ -1600,29 +1600,29 @@ def numba_boundary_geometry(_A_bk, _B_bk, _h_Ik, _H_j, _z_inv_bk,
16001600
g3_i = _g3_ik[i]
16011601
if geom_code:
16021602
if geom_code == 1:
1603-
_A_bk[k] = superlink.ngeometry.Circular_A_ik(h_I, h_Ip1, g1_i)
1604-
_B_bk[k] = superlink.ngeometry.Circular_B_ik(h_I, h_Ip1, g1_i)
1603+
_A_bk[k] = pipedream_solver.ngeometry.Circular_A_ik(h_I, h_Ip1, g1_i)
1604+
_B_bk[k] = pipedream_solver.ngeometry.Circular_B_ik(h_I, h_Ip1, g1_i)
16051605
elif geom_code == 2:
1606-
_A_bk[k] = superlink.ngeometry.Rect_Closed_A_ik(h_I, h_Ip1, g1_i, g2_i)
1607-
_B_bk[k] = superlink.ngeometry.Rect_Closed_B_ik(h_I, h_Ip1, g1_i, g2_i)
1606+
_A_bk[k] = pipedream_solver.ngeometry.Rect_Closed_A_ik(h_I, h_Ip1, g1_i, g2_i)
1607+
_B_bk[k] = pipedream_solver.ngeometry.Rect_Closed_B_ik(h_I, h_Ip1, g1_i, g2_i)
16081608
elif geom_code == 3:
1609-
_A_bk[k] = superlink.ngeometry.Rect_Open_A_ik(h_I, h_Ip1, g1_i, g2_i)
1610-
_B_bk[k] = superlink.ngeometry.Rect_Open_B_ik(h_I, h_Ip1, g1_i, g2_i)
1609+
_A_bk[k] = pipedream_solver.ngeometry.Rect_Open_A_ik(h_I, h_Ip1, g1_i, g2_i)
1610+
_B_bk[k] = pipedream_solver.ngeometry.Rect_Open_B_ik(h_I, h_Ip1, g1_i, g2_i)
16111611
elif geom_code == 4:
1612-
_A_bk[k] = superlink.ngeometry.Triangular_A_ik(h_I, h_Ip1, g1_i, g2_i)
1613-
_B_bk[k] = superlink.ngeometry.Triangular_B_ik(h_I, h_Ip1, g1_i, g2_i)
1612+
_A_bk[k] = pipedream_solver.ngeometry.Triangular_A_ik(h_I, h_Ip1, g1_i, g2_i)
1613+
_B_bk[k] = pipedream_solver.ngeometry.Triangular_B_ik(h_I, h_Ip1, g1_i, g2_i)
16141614
elif geom_code == 5:
1615-
_A_bk[k] = superlink.ngeometry.Trapezoidal_A_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1616-
_B_bk[k] = superlink.ngeometry.Trapezoidal_B_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1615+
_A_bk[k] = pipedream_solver.ngeometry.Trapezoidal_A_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
1616+
_B_bk[k] = pipedream_solver.ngeometry.Trapezoidal_B_ik(h_I, h_Ip1, g1_i, g2_i, g3_i)
16171617
elif geom_code == 6:
1618-
_A_bk[k] = superlink.ngeometry.Parabolic_A_ik(h_I, h_Ip1, g1_i, g2_i)
1619-
_B_bk[k] = superlink.ngeometry.Parabolic_B_ik(h_I, h_Ip1, g1_i, g2_i)
1618+
_A_bk[k] = pipedream_solver.ngeometry.Parabolic_A_ik(h_I, h_Ip1, g1_i, g2_i)
1619+
_B_bk[k] = pipedream_solver.ngeometry.Parabolic_B_ik(h_I, h_Ip1, g1_i, g2_i)
16201620
elif geom_code == 7:
1621-
_A_bk[k] = superlink.ngeometry.Elliptical_A_ik(h_I, h_Ip1, g1_i, g2_i)
1622-
_B_bk[k] = superlink.ngeometry.Elliptical_B_ik(h_I, h_Ip1, g1_i, g2_i)
1621+
_A_bk[k] = pipedream_solver.ngeometry.Elliptical_A_ik(h_I, h_Ip1, g1_i, g2_i)
1622+
_B_bk[k] = pipedream_solver.ngeometry.Elliptical_B_ik(h_I, h_Ip1, g1_i, g2_i)
16231623
elif geom_code == 8:
1624-
_A_bk[k] = superlink.ngeometry.Wide_A_ik(h_I, h_Ip1, g1_i, g2_i)
1625-
_B_bk[k] = superlink.ngeometry.Wide_B_ik(h_I, h_Ip1, g1_i, g2_i)
1624+
_A_bk[k] = pipedream_solver.ngeometry.Wide_A_ik(h_I, h_Ip1, g1_i, g2_i)
1625+
_B_bk[k] = pipedream_solver.ngeometry.Wide_B_ik(h_I, h_Ip1, g1_i, g2_i)
16261626
return 1
16271627

16281628
@njit
@@ -1636,21 +1636,21 @@ def numba_orifice_geometry(_Ao, h_eo, u_o, _g1_o, _g2_o, _g3_o, _geom_codes_o, n
16361636
h_e = h_eo[i]
16371637
if geom_code:
16381638
if geom_code == 1:
1639-
_Ao[i] = superlink.ngeometry.Circular_A_ik(h_e, h_e, g1 * u)
1639+
_Ao[i] = pipedream_solver.ngeometry.Circular_A_ik(h_e, h_e, g1 * u)
16401640
elif geom_code == 2:
1641-
_Ao[i] = superlink.ngeometry.Rect_Closed_A_ik(h_e, h_e, g1 * u, g2)
1641+
_Ao[i] = pipedream_solver.ngeometry.Rect_Closed_A_ik(h_e, h_e, g1 * u, g2)
16421642
elif geom_code == 3:
1643-
_Ao[i] = superlink.ngeometry.Rect_Open_A_ik(h_e, h_e, g1 * u, g2)
1643+
_Ao[i] = pipedream_solver.ngeometry.Rect_Open_A_ik(h_e, h_e, g1 * u, g2)
16441644
elif geom_code == 4:
1645-
_Ao[i] = superlink.ngeometry.Triangular_A_ik(h_e, h_e, g1 * u, g2)
1645+
_Ao[i] = pipedream_solver.ngeometry.Triangular_A_ik(h_e, h_e, g1 * u, g2)
16461646
elif geom_code == 5:
1647-
_Ao[i] = superlink.ngeometry.Trapezoidal_A_ik(h_e, h_e, g1 * u, g2, g3)
1647+
_Ao[i] = pipedream_solver.ngeometry.Trapezoidal_A_ik(h_e, h_e, g1 * u, g2, g3)
16481648
elif geom_code == 6:
1649-
_Ao[i] = superlink.ngeometry.Parabolic_A_ik(h_e, h_e, g1 * u, g2)
1649+
_Ao[i] = pipedream_solver.ngeometry.Parabolic_A_ik(h_e, h_e, g1 * u, g2)
16501650
elif geom_code == 7:
1651-
_Ao[i] = superlink.ngeometry.Elliptical_A_ik(h_e, h_e, g1 * u, g2)
1651+
_Ao[i] = pipedream_solver.ngeometry.Elliptical_A_ik(h_e, h_e, g1 * u, g2)
16521652
elif geom_code == 8:
1653-
_Ao[i] = superlink.ngeometry.Wide_A_ik(h_e, h_e, g1 * u, g2)
1653+
_Ao[i] = pipedream_solver.ngeometry.Wide_A_ik(h_e, h_e, g1 * u, g2)
16541654
return 1
16551655

16561656
@njit
File renamed without changes.

superlink/simulation.py renamed to pipedream_solver/simulation.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
except:
1212
_HAS_NUMBA = False
1313
if _HAS_NUMBA:
14-
from superlink.nutils import interpolate_sample, _kalman_semi_implicit
14+
from pipedream_solver.nutils import interpolate_sample, _kalman_semi_implicit
1515
else:
16-
from superlink.utils import interpolate_sample, _kalman_semi_implicit
16+
from pipedream_solver.utils import interpolate_sample, _kalman_semi_implicit
1717

1818
eps = np.finfo(float).eps
1919

@@ -23,7 +23,7 @@ class Simulation():
2323
2424
Inputs:
2525
-------
26-
model : superlink.Superlink instance
26+
model : pipedream_solver.Superlink instance
2727
Hydraulic model to simulate
2828
Q_in : pd.DataFrame (T x M)
2929
Flow input at each superjunction (m^3/s)
@@ -71,7 +71,7 @@ class Simulation():
7171
7272
Attributes:
7373
-----------
74-
states : superlink.simulation.States instance
74+
states : pipedream_solver.simulation.States instance
7575
Class containing a collection of model states, including:
7676
H_j - Superjunction heads (meters)
7777
Q_ik - Link flows (m^3/s)
File renamed without changes.

0 commit comments

Comments
 (0)