Simulating Wave Overtopping

Example of simulating wave overtopping flow along a dike crest and landward slope.

import numpy as np
import matplotlib.pyplot as plt

from boreflow import BCOvertopping, Geometry, Simulation
# 1) Create geometry
x = np.array([0, 5, 14])  # X-coordinate x[i]
z = np.array([3, 3, 0])  # Elevation z[i] at x[i]
n = np.array([0.0175, 0.0175])  # Manning roughness (n) between x[i] and x[i+1]
geometry = Geometry(x, z, n)

# Plot the geometry
plt.figure()
plt.plot(x, z, color="black", label="Geometry")
plt.plot([x[0]], [z[0]], "o", color="red", label="Waterside crest line")
plt.plot([x[-1]], [z[-1]], "o", color="blue", label="Free outflow")
plt.legend()
plt.xlabel("x-coordinate [m]")
plt.ylabel("z-coordinate [m]")
plt.axis("equal")
plt.show()

# 2) Create boundary conditions for V = 1.0 m3/m
bc = BCOvertopping(volume=1.0, cota=3)  # cota of the waterside slope

# 3) Initialize simulation settings
sim = Simulation(t_end=10.0, cfl=0.2, max_dt=0.01, nx=140)  # nx = 140 give dx = 0.1m

# 4) Run the simulation
results = sim.run(geometry, bc)
Simulating:   0%|          | 0.00/10.00 sSimulating:   1%|          | 0.06/10.00 sSimulating:   1%|          | 0.12/10.00 sSimulating:   2%|▏         | 0.17/10.00 sSimulating:   2%|▏         | 0.21/10.00 sSimulating:   3%|▎         | 0.25/10.00 sSimulating:   3%|▎         | 0.29/10.00 sSimulating:   3%|▎         | 0.33/10.00 sSimulating:   4%|▎         | 0.37/10.00 sSimulating:   4%|▍         | 0.41/10.00 sSimulating:   4%|▍         | 0.45/10.00 sSimulating:   5%|▍         | 0.49/10.00 sSimulating:   5%|▌         | 0.52/10.00 sSimulating:   6%|▌         | 0.56/10.00 sSimulating:   6%|▌         | 0.60/10.00 sSimulating:   6%|▋         | 0.64/10.00 sSimulating:   7%|▋         | 0.68/10.00 sSimulating:   7%|▋         | 0.71/10.00 sSimulating:   8%|▊         | 0.75/10.00 sSimulating:   8%|▊         | 0.79/10.00 sSimulating:   8%|▊         | 0.82/10.00 sSimulating:   9%|▊         | 0.86/10.00 sSimulating:   9%|▉         | 0.90/10.00 sSimulating:   9%|▉         | 0.94/10.00 sSimulating:  10%|▉         | 0.97/10.00 sSimulating:  10%|█         | 1.01/10.00 sSimulating:  10%|█         | 1.05/10.00 sSimulating:  11%|█         | 1.09/10.00 sSimulating:  11%|█         | 1.12/10.00 sSimulating:  12%|█▏        | 1.16/10.00 sSimulating:  12%|█▏        | 1.20/10.00 sSimulating:  12%|█▏        | 1.24/10.00 sSimulating:  13%|█▎        | 1.28/10.00 sSimulating:  13%|█▎        | 1.32/10.00 sSimulating:  14%|█▎        | 1.36/10.00 sSimulating:  14%|█▍        | 1.39/10.00 sSimulating:  14%|█▍        | 1.43/10.00 sSimulating:  15%|█▍        | 1.46/10.00 sSimulating:  15%|█▍        | 1.49/10.00 sSimulating:  15%|█▌        | 1.53/10.00 sSimulating:  16%|█▌        | 1.56/10.00 sSimulating:  16%|█▌        | 1.60/10.00 sSimulating:  16%|█▋        | 1.63/10.00 sSimulating:  17%|█▋        | 1.66/10.00 sSimulating:  17%|█▋        | 1.70/10.00 sSimulating:  17%|█▋        | 1.73/10.00 sSimulating:  18%|█▊        | 1.76/10.00 sSimulating:  18%|█▊        | 1.80/10.00 sSimulating:  18%|█▊        | 1.83/10.00 sSimulating:  19%|█▊        | 1.86/10.00 sSimulating:  19%|█▉        | 1.89/10.00 sSimulating:  19%|█▉        | 1.93/10.00 sSimulating:  20%|█▉        | 1.96/10.00 sSimulating:  20%|█▉        | 1.99/10.00 sSimulating:  20%|██        | 2.02/10.00 sSimulating:  21%|██        | 2.06/10.00 sSimulating:  21%|██        | 2.09/10.00 sSimulating:  21%|██        | 2.12/10.00 sSimulating:  22%|██▏       | 2.15/10.00 sSimulating:  22%|██▏       | 2.19/10.00 sSimulating:  22%|██▏       | 2.22/10.00 sSimulating:  22%|██▏       | 2.25/10.00 sSimulating:  23%|██▎       | 2.28/10.00 sSimulating:  23%|██▎       | 2.31/10.00 sSimulating:  23%|██▎       | 2.35/10.00 sSimulating:  24%|██▍       | 2.38/10.00 sSimulating:  24%|██▍       | 2.41/10.00 sSimulating:  24%|██▍       | 2.44/10.00 sSimulating:  25%|██▍       | 2.47/10.00 sSimulating:  25%|██▌       | 2.50/10.00 sSimulating:  25%|██▌       | 2.53/10.00 sSimulating:  26%|██▌       | 2.56/10.00 sSimulating:  26%|██▌       | 2.59/10.00 sSimulating:  26%|██▌       | 2.62/10.00 sSimulating:  27%|██▋       | 2.65/10.00 sSimulating:  27%|██▋       | 2.68/10.00 sSimulating:  27%|██▋       | 2.71/10.00 sSimulating:  27%|██▋       | 2.74/10.00 sSimulating:  28%|██▊       | 2.78/10.00 sSimulating:  28%|██▊       | 2.81/10.00 sSimulating:  28%|██▊       | 2.84/10.00 sSimulating:  29%|██▊       | 2.87/10.00 sSimulating:  29%|██▉       | 2.90/10.00 sSimulating:  29%|██▉       | 2.94/10.00 sSimulating:  30%|██▉       | 2.97/10.00 sSimulating:  30%|███       | 3.01/10.00 sSimulating:  30%|███       | 3.04/10.00 sSimulating:  31%|███       | 3.07/10.00 sSimulating:  31%|███       | 3.11/10.00 sSimulating:  31%|███▏      | 3.14/10.00 sSimulating:  32%|███▏      | 3.18/10.00 sSimulating:  32%|███▏      | 3.22/10.00 sSimulating:  33%|███▎      | 3.25/10.00 sSimulating:  33%|███▎      | 3.29/10.00 sSimulating:  33%|███▎      | 3.33/10.00 sSimulating:  34%|███▎      | 3.37/10.00 sSimulating:  34%|███▍      | 3.40/10.00 sSimulating:  34%|███▍      | 3.44/10.00 sSimulating:  35%|███▍      | 3.48/10.00 sSimulating:  35%|███▌      | 3.52/10.00 sSimulating:  36%|███▌      | 3.56/10.00 sSimulating:  36%|███▌      | 3.59/10.00 sSimulating:  36%|███▋      | 3.63/10.00 sSimulating:  37%|███▋      | 3.67/10.00 sSimulating:  37%|███▋      | 3.71/10.00 sSimulating:  38%|███▊      | 3.75/10.00 sSimulating:  38%|███▊      | 3.80/10.00 sSimulating:  38%|███▊      | 3.84/10.00 sSimulating:  39%|███▉      | 3.88/10.00 sSimulating:  39%|███▉      | 3.92/10.00 sSimulating:  40%|███▉      | 3.96/10.00 sSimulating:  40%|████      | 4.01/10.00 sSimulating:  41%|████      | 4.05/10.00 sSimulating:  41%|████      | 4.09/10.00 sSimulating:  41%|████▏     | 4.14/10.00 sSimulating:  42%|████▏     | 4.18/10.00 sSimulating:  42%|████▏     | 4.23/10.00 sSimulating:  43%|████▎     | 4.28/10.00 sSimulating:  43%|████▎     | 4.32/10.00 sSimulating:  44%|████▎     | 4.37/10.00 sSimulating:  44%|████▍     | 4.42/10.00 sSimulating:  45%|████▍     | 4.47/10.00 sSimulating:  45%|████▌     | 4.51/10.00 sSimulating:  46%|████▌     | 4.56/10.00 sSimulating:  46%|████▌     | 4.61/10.00 sSimulating:  47%|████▋     | 4.66/10.00 sSimulating:  47%|████▋     | 4.72/10.00 sSimulating:  48%|████▊     | 4.77/10.00 sSimulating:  48%|████▊     | 4.82/10.00 sSimulating:  49%|████▊     | 4.87/10.00 sSimulating:  49%|████▉     | 4.93/10.00 sSimulating:  50%|████▉     | 4.98/10.00 sSimulating:  50%|█████     | 5.04/10.00 sSimulating:  51%|█████     | 5.09/10.00 sSimulating:  52%|█████▏    | 5.15/10.00 sSimulating:  52%|█████▏    | 5.21/10.00 sSimulating:  53%|█████▎    | 5.27/10.00 sSimulating:  53%|█████▎    | 5.32/10.00 sSimulating:  54%|█████▍    | 5.38/10.00 sSimulating:  54%|█████▍    | 5.45/10.00 sSimulating:  55%|█████▌    | 5.51/10.00 sSimulating:  56%|█████▌    | 5.57/10.00 sSimulating:  56%|█████▋    | 5.63/10.00 sSimulating:  57%|█████▋    | 5.69/10.00 sSimulating:  58%|█████▊    | 5.76/10.00 sSimulating:  58%|█████▊    | 5.82/10.00 sSimulating:  59%|█████▉    | 5.89/10.00 sSimulating:  60%|█████▉    | 5.96/10.00 sSimulating:  60%|██████    | 6.03/10.00 sSimulating:  61%|██████    | 6.10/10.00 sSimulating:  62%|██████▏   | 6.17/10.00 sSimulating:  62%|██████▏   | 6.24/10.00 sSimulating:  63%|██████▎   | 6.31/10.00 sSimulating:  64%|██████▍   | 6.38/10.00 sSimulating:  65%|██████▍   | 6.45/10.00 sSimulating:  65%|██████▌   | 6.53/10.00 sSimulating:  66%|██████▌   | 6.60/10.00 sSimulating:  67%|██████▋   | 6.68/10.00 sSimulating:  68%|██████▊   | 6.76/10.00 sSimulating:  68%|██████▊   | 6.84/10.00 sSimulating:  69%|██████▉   | 6.92/10.00 sSimulating:  70%|██████▉   | 7.00/10.00 sSimulating:  71%|███████   | 7.08/10.00 sSimulating:  72%|███████▏  | 7.16/10.00 sSimulating:  72%|███████▏  | 7.25/10.00 sSimulating:  73%|███████▎  | 7.33/10.00 sSimulating:  74%|███████▍  | 7.42/10.00 sSimulating:  75%|███████▌  | 7.51/10.00 sSimulating:  76%|███████▌  | 7.60/10.00 sSimulating:  77%|███████▋  | 7.69/10.00 sSimulating:  78%|███████▊  | 7.78/10.00 sSimulating:  79%|███████▊  | 7.87/10.00 sSimulating:  80%|███████▉  | 7.96/10.00 sSimulating:  81%|████████  | 8.06/10.00 sSimulating:  82%|████████▏ | 8.15/10.00 sSimulating:  83%|████████▎ | 8.25/10.00 sSimulating:  84%|████████▎ | 8.35/10.00 sSimulating:  85%|████████▍ | 8.45/10.00 sSimulating:  86%|████████▌ | 8.55/10.00 sSimulating:  87%|████████▋ | 8.66/10.00 sSimulating:  88%|████████▊ | 8.76/10.00 sSimulating:  89%|████████▊ | 8.86/10.00 sSimulating:  90%|████████▉ | 8.97/10.00 sSimulating:  91%|█████████ | 9.08/10.00 sSimulating:  92%|█████████▏| 9.19/10.00 sSimulating:  93%|█████████▎| 9.30/10.00 sSimulating:  94%|█████████▍| 9.41/10.00 sSimulating:  95%|█████████▌| 9.52/10.00 sSimulating:  96%|█████████▋| 9.63/10.00 sSimulating:  97%|█████████▋| 9.74/10.00 sSimulating:  99%|█████████▊| 9.85/10.00 sSimulating: 100%|█████████▉| 9.96/10.00 sSimulating: 100%|██████████| 10.00/10.00 s
Simulation done in 19.89 sec
# Plot peak flow velocity, peak flow thickness, peak flow discharge
fig, (ax0, ax1, ax2) = plt.subplots(1, 3, figsize=[8, 3.5])

# Mark the transition between the crest and landward slope
[ax.axvline(5.0, color="grey", ls=":") for ax in [ax0, ax1, ax2]]

# Get results and plot peak flow characteristics
h, u, q = results.get_peak_flow()
ax0.plot(results.s, h, color="black")
ax1.plot(results.s, u, color="black")
ax2.plot(results.s, q, color="black")

# Plot layout
[ax.set_xlabel("Distance (s-coordinate) [m]") for ax in [ax0, ax1, ax2]]
ax0.set_ylabel("Peak flow thickness [m]")
ax1.set_ylabel("Peak depth-avg flow velocity [m/s]")
ax2.set_ylabel("Peak flow discharge [m2/s]")
[ax.set_xlim(0, np.max(results.s)) for ax in [ax0, ax1, ax2]]
[ax.set_ylim(0, None) for ax in [ax0, ax1, ax2]]
fig.suptitle("Peak Flow Characteristics along Geometry")
fig.tight_layout()
plt.show()

# Plot
fig, (ax0, ax1) = plt.subplots(1, 2, figsize=[8, 4])

# Get and plot the flow at s=12m
res_t, res_h, res_u = results.get_st(s=4.0)
ax0.plot(res_t, res_h, color="red", label="s = 4m")
ax1.plot(res_t, res_u, color="red")

# Get and plot the flow at s=12m
res_t, res_h, res_u = results.get_st(s=12.0)
ax0.plot(res_t, res_h, color="black", label="s = 12m")
ax1.plot(res_t, res_u, color="black")

# Plot layout
ax0.legend()
[ax.set_xlabel("Time [s]") for ax in [ax0, ax1]]
ax0.set_ylabel("Flow thickness [m]")
ax1.set_ylabel("Depth-avg flow velocity [m/s]")
[ax.set_xlim(0, np.max(res_t)) for ax in [ax0, ax1]]
[ax.set_ylim(0, None) for ax in [ax0, ax1]]
fig.suptitle("Temporal Evolution of Flow at s = 4m and s = 12m")
fig.tight_layout()
plt.show()