justinmimbs / WaveTank.jl

A depth-averaged, nonhydrostatic fluid model capable of simulating water waves as they run up on shore

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

WaveTank.jl

A depth-averaged, nonhydrostatic fluid model capable of simulating water waves as they run up on shore.

For a brief introduction, see this JuliaCon 2022 talk.

Example

Below is a complete example that models a solitary wave running up on a planar beach. Output from the simulation is saved to a file, and the results are animated using Makie with Observables.

using WaveTank: Grid, Model, Results, run!, solitary_wave, planar_beach
using GLMakie
using Printf

# 1. define model

grid = Grid(
    (-20.0, 10.0),  # x bounds (m)
    (0.0, 5.0),     # y bounds (m)
    (300, 50)       # resolution
)
depth = 0.5         # maximum water depth (m)
wave = solitary_wave(0.15; h=depth, x0=-15.0) # (amplitude; h, x0)
basin = planar_beach(depth, 1 / 20) # (depth, slope) waterline is at x = 0
model = Model(;
    grid,
    bcx=:open,                  # boundary conditions at the x bounds
    h=(x, y) -> basin(x),       # depth of the basin
    eta=(x, y) -> wave.eta(x),  # initial surface elevation
    u=(x, y) -> wave.u(x),      # initial particle velocity in the x direction
)

# 2. run simulation

run!(model, "out/example.jld2";
    seconds=40.0,       # duration
    frequency=5,        # output frequency (per second)
    output=(; eta=:eta) # output fields
)

# 3. plot results

results = Results("out/example.jld2")
(; grid, h, dt) = results # results contain static attributes of the model

snapshot = Observable(results[0]) # results contain model snapshots, indexed by timestep
eta = @lift $snapshot.eta[:, end ÷ 2]
title = @lift @sprintf("time = %.1f s", $snapshot.t * dt)

fig = Figure(; resolution=(900, 300))
ax = Axis(fig[1, 1]; xlabel="x (m)", ylabel="surface elevation (m)", title)
lines!(ax, grid.xc, -h[:, 1]; color=:gray)
lines!(ax, grid.xc, eta; color=:dodgerblue)
display(fig)

# 4. animate figure

for s in results # results are iterable
    snapshot[] = s
    sleep(0.016)
end

For more examples, see the validation directory.

Installation

This package is unregistered and it currently lacks documentation, but if you're interested, you can add it by URL.

pkg> add https://github.com/justinmimbs/WaveTank.jl

References

The model used in WaveTank.jl is based on the one formulated in:

Yamazaki, Y., Kowalik, Z., & Cheung, K.F. (2009). Depth-integrated, non-hydrostatic model for wave breaking and run-up. International Journal for Numerical Methods in Fluids, 61, 473-497. https://doi.org/10.1002/fld.1952

About

A depth-averaged, nonhydrostatic fluid model capable of simulating water waves as they run up on shore


Languages

Language:Julia 100.0%