WaveSpec.jl
<p align="left"> <img src="assets/logo.svg" height="150" alt="WaveSpec.jl logo"/> </p>
Description
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.
Key Features
Continuous Spectrums
Pre-defined spectral models with adjustable parameters:
JONSWAPTMA(Finite depth)BretschneiderDonelanOchiHubble(Multi-modal)
Discretization & Sampling
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.
Angular Spreading
Directional spreading models for realistic 3D seas:
CosinePowerDistributionVonMisesDistributionDonelanBannerDistributionDiscreteAngularSpreading: Discretize directionality with a specified number of angles.
Wave Generation
AiryState: Combines spectral and angular information into a complete sea state description.generate_sea: Generates time-series data using linear wave theory (Airy waves).
Installation
using Pkg
Pkg.add("WaveSpec")Basic Usage
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)Documentation
For full documentation, please visit the documentation website.
Contact
Please contact the main developers Shagun Agarwal, Pau Manyer or Oriol Colomés for further questions.
WaveSpec.PhysicalConstants.gWaveSpec.PhysicalConstants.ν_waterWaveSpec.PhysicalConstants.ρ_airWaveSpec.PhysicalConstants.ρ_waterWaveSpec.PhysicalConstants.σ_waterWaveSpec.AiryWaves.AiryStateWaveSpec.AngularSpreading.DiscreteAngularSpreadingWaveSpec.AngularSpreading.DiscreteAngularSpreadingWaveSpec.AngularSpreading.DiscreteAngularSpreadingWaveSpec.AngularSpreading.DiscreteAngularSpreadingWaveSpec.ContinuousSpectrums.BretschneiderWaveSpec.ContinuousSpectrums.DonelanWaveSpec.ContinuousSpectrums.JONSWAPWaveSpec.ContinuousSpectrums.OchiHubbleWaveSpec.ContinuousSpectrums.RegularWaveWaveSpec.ContinuousSpectrums.TMAWaveSpec.SpectralSpreading.DiscreteSpectralSpreadingWaveSpec.SpectralSpreading.DiscreteSpectralSpreadingWaveSpec.SpectralSpreading.DiscreteSpectralSpreadingWaveSpec.AiryWaves.generate_interpolable_seaWaveSpec.AiryWaves.generate_seaWaveSpec.AngularSpreading.get_anglesWaveSpec.AngularSpreading.get_bandwidthsWaveSpec.AngularSpreading.get_central_anglesWaveSpec.AngularSpreading.get_weightsWaveSpec.ContinuousSpectrums.compute_donelan_normalizationWaveSpec.ContinuousSpectrums.compute_ochi_componentWaveSpec.ContinuousSpectrums.estimate_HsWaveSpec.ContinuousSpectrums.estimate_TpWaveSpec.ContinuousSpectrums.estimate_γWaveSpec.ContinuousSpectrums.get_HsWaveSpec.ContinuousSpectrums.get_HsWaveSpec.ContinuousSpectrums.get_TpWaveSpec.ContinuousSpectrums.get_TpWaveSpec.ContinuousSpectrums.get_alphaWaveSpec.ContinuousSpectrums.get_cumulative_energyWaveSpec.ContinuousSpectrums.get_densityWaveSpec.ContinuousSpectrums.get_densityWaveSpec.ContinuousSpectrums.get_densityWaveSpec.ContinuousSpectrums.get_densityWaveSpec.ContinuousSpectrums.get_densityWaveSpec.ContinuousSpectrums.get_densityWaveSpec.ContinuousSpectrums.get_fmaxWaveSpec.ContinuousSpectrums.get_γ_exponentWaveSpec.ContinuousSpectrums.integrateWaveSpec.Integration.IntegrateGaussQuadWaveSpec.Integration.IntegrateTrapezoidalWaveSpec.SpectralSampling.approx_inverse_cdfWaveSpec.SpectralSampling.generate_gridWaveSpec.SpectralSampling.generate_gridWaveSpec.SpectralSpreading.get_HsWaveSpec.SpectralSpreading.get_amplitudeWaveSpec.SpectralSpreading.get_amplitudesWaveSpec.SpectralSpreading.get_bandwidthsWaveSpec.SpectralSpreading.get_central_frequenciesWaveSpec.SpectralSpreading.get_central_frequencyWaveSpec.SpectralSpreading.get_densitiesWaveSpec.SpectralSpreading.get_densitiesWaveSpec.SpectralSpreading.get_densityWaveSpec.SpectralSpreading.get_energiesWaveSpec.SpectralSpreading.get_energyWaveSpec.SpectralSpreading.get_frequenciesWaveSpec.SpectralSpreading.get_frequencyWaveSpec.SpectralSpreading.get_frequencyWaveSpec.SpectralSpreading.get_integrated_energiesWaveSpec.SpectralSpreading.get_momentWaveSpec.SpectralSpreading.get_spectral_indexWaveSpec.SpectralSpreading.get_spectral_index