WaveSpec.jl is a Julia package for generating stochastic sea states using Airy wave theory, widely used in numerical ocean modeling and hydrodynamics. It provides a modular framework for defining, discretizing, and simulating ocean wave spectra.
The package allows users to:
- Define continuous wave spectra (e.g., JONSWAP, TMA, Bretschneider).
- Choose sampling strategies (e.g., Uniform, Logarithmic, Chebyshev) in either frequency or energy domains.
- Apply angular spreading models (e.g., Cosine-Power, Von Mises).
- Generate Airy wave states (amplitude, phase, frequency, direction) for time-domain reconstruction.
Pre-defined spectral models with adjustable parameters:
JONSWAPTMA(Finite depth)BretschneiderDonelanOchiHubble(Multi-modal)
Flexible discretization of continuous spectra:
- Domains: Frequency Domain (
Frequency), Energy Domain (Energy). - Methods:
UniformSampling,LogSampling,ChebyshevSampling. DiscreteSpectralSpreading: Converts a continuous spectrum into discrete frequency bands.
Directional spreading models for realistic 3D seas:
CosinePowerDistributionVonMisesDistributionDonelanBannerDistributionDiscreteAngularSpreading: Discretize directionality with a specified number of angles.
AiryState: Combines spectral and angular information into a complete sea state description.generate_sea: Generates time-series data using linear wave theory (Airy waves).
using Pkg
Pkg.add("WaveSpec")Here is a simple example of how to generate a classic JONSWAP sea state:
using WaveSpec
# 1. Define a JONSWAP spectrum
Hs = 2.5 # Significant wave height [m]
Tp = 8.0 # Peak period [s]
spec = JONSWAP(Hs, Tp)
# 2. Discretize the spectrum
# DiscreteSpectralSpreading(shape, strategy, fmin, fmax, nf; domain=Frequency)
discrete_spec = DiscreteSpectralSpreading(
spec,
LogSampling(), # Sampling strategy
0.05, # fmin [Hz]
1.0, # fmax [Hz]
50; # Number of frequencies
domain = Frequency # Sampling domain
)
# 3. Define Angular Spreading
# DiscreteAngularSpreading(dist::UnivariateDistribution, a::Real, b::Real, nθ::Int; units=:radians)
# Cosine-Power distribution centered at 0 radians with power exponent 2, truncated between -π/2 and π/2
angle_dist = CosinePowerDistribution(0.0, 2.0)
discrete_angle = DiscreteAngularSpreading(angle_dist, -π/2, π/2, 36) # 36 discrete angles
# 4. Generate the Sea State
depth = 50.0 # Water depth [m]
sea_state = AiryState(discrete_spec, discrete_angle, depth)
# 5. Access wave components
# sea_state.ω (frequencies), sea_state.k (wavenumbers), sea_state.θ (angles)For full documentation, please visit the documentation website.
Please contact the main developers Shagun Agarwal, Pau Manyer or Oriol Colomés for further questions.