Standardized wave spectra#
Idealized 1-D spectra#
It is common practice to approximate the actual wave spectrum with a standardized wave spectrum (which there exists many of).
waveresponse
provides the most common standardized 1D wave spectra.
Pierson-Moskowitz#
Pierson-Moskowitz (PM) type spectra has the following form:
Many of the most common standardized wave spectra today are of the PM type (or extends it). The modified Pierson-Moskowitz spectrum and the JONSWAP spectrum are two examples.
Modified Pierson-Moskowitz#
The modified Pierson-Moskowits spectrum (also known as Bretschneider or ISSC) is given by:
where
The ModifiedPiersonMoskowitz
class provides functionality
for generating a 1-D (modified) Pierson-Moskowitz spectrum given two parameters (i.e.,
import numpy as np
import waveresponse as wr
freq = np.arange(0.01, 1, 0.01)
spectrum = wr.ModifiedPiersonMoskowitz(freq, freq_hz=True)
hs = 3.5
tp = 10.0
freq, vals = spectrum(hs, tp)
JONSWAP#
The JONSWAP spectrum is given by:
where,
is the modified Pierson-Moskowitz (PM) spectrum. is a peak enhancement factor. is a normalizing factor. is the angular spectral peak frequency. is the spectral width parameter, given by:
It is common to use
The JONSWAP
class provides functionality for generating a 1-D
JONSWAP spectrum given three parameters (i.e.,
import numpy as np
import waveresponse as wr
freq = np.arange(0.01, 1, 0.01)
spectrum = wr.JONSWAP(freq, freq_hz=True)
hs = 3.5
tp = 10.0
freq, vals = spectrum(hs, tp, gamma=3.3)
Note
For the special case where
The JONSWAP spectrum is expected to be a reasonable model for:
Ochi-Hubble#
The Ochi-Hubble spectrum allows you to set up a double-peaked spectrum that represents sea states which includes both a remotely generated swell component (with low frequency energy) and a locally generated wind component (with high frequency energy). The Ochi-Hubble spectrum is described by six parameters (three for each wave component), and is given by:
where,
is the significant wave height for wave component . is the angular spectral peak frequency for wave component . is a spectral shape parameter for wave component .
The index,
Note
The Ochi-Hubble spectrum is implemented according to the orinal paper by M. K. Ochi and E. N. Hubble published in 1976. Refer to this paper for full implementation details.
The OchiHubble
class provides functionality for generating a 1-D
Ochi-Hubble spectrum component given three parameters (i.e.,
import numpy as np
import waveresponse as wr
freq = np.arange(0.01, 1, 0.01)
spectrum = wr.OchiHubble(freq, freq_hz=True)
# Swell component (i.e., j=1)
hs_swell = 3.5
tp_swell = 10.0
q_swell = 2.0
freq, vals_swell = spectrum(hs_swell, tp_swell, q=q_swell)
# Wind component (i.e., j=2)
hs_wind = 1.5
tp_wind = 5.0
q_wind = 2.0
freq, vals_wind = spectrum(hs_wind, tp_wind, q=q_wind)
# Total wave
vals_tot = vals_swell + vals_wind
Note
For the special case where
Torsethaugen#
The Torsethaugen spectrum allows you to set up a double-peaked spectrum that represents
sea states which includes both a remotely generated swell component (with low frequency energy)
and a locally generated wind component (with high frequency energy). The spectral model
was developed based on average measured spectra for Norwegian waters (Haltenbanken and Statfjord).
The Torsethaugen spectrum is described by two parameter (i.e.
where,
Furthermore,
is the significant wave height for wave component . is the angular spectral peak frequency for wave component . is a peak enhancement factor. is a normalizing factor. is the spectral width parameter, given by:
Note
The Torsethaugen spectrum is implemented according to the original paper by Torsethaugen and Haver published in 2004. Refer to this paper for full implementation details.
The Torsethaugen
class provides functionality for generating a 1-D
Torsethaugen spectrum given two parameters (i.e.,
import numpy as np
import waveresponse as wr
freq = np.arange(0.01, 1, 0.01)
spectrum = wr.Torsethaugen(freq, freq_hz=True)
hs = 3.5
tp = 10.0
freq, vals = spectrum(hs, tp)
Directional spectrum#
The directional spectrum is usually standardized in a similar way as the 1-D frequency
spectrum. The standardization is based on expressing the directional spectrum as
a product of a frequency spectrum,
Since the frequency spectrum is obtained by integrating
the directional spectrum over the directional domain (i.e., [0, 360) degrees,
or [0, 2
we get the following requirement for the spreading function for each frequency,
In general, the spreading function is a function of both frequency,
With waveresponse
it is easy to construct a (directional) WaveSpectrum
object from a 1-D frequency spectrum and a spreading function:
import numpy as np
import waveresponse as wr
freq = np.arange(0.01, 1, 0.01)
dirs = np.linspace(0.0, 360.0, endpoint=False)
hs = 3.5
tp = 10.0
dirp = 45.0
_, spectrum1d = wr.JONSWAP(freq, freq_hz=True)(hs, tp)
spread_fun = wr.CosineFullSpreading(s=2, degrees=True)
wave = wr.WaveSpectrum.from_spectrum1d(
freq,
dirs,
spectrum1d,
spread_fun,
dirp,
freq_hz=True,
degrees=True,
clockwise=False,
waves_coming_from=False,
)
A multimodal wave spectrum (with more than one peak) can be constructed by adding together two (or more) wave spectrum components. E.g., if you have one swell and one wind spectrum component, you can construct a two-peaked directional wave spectrum by:
This can be done by adding together two different WaveSpectrum
objects:
wave_tot = swell + wind
Cosine-2s based spreading#
Standardized spreading functions (denoted
Cosine-based spreading functions are most common. waveresponse
provides two
variations of the cosine-based spreading: one that spreads the wave energy over
the full directional domain, and one that spreads the energy over half the domain.
The CosineFullSpreading
class provides directional spreading
according to:
where
The CosineHalfSpreading
class provides directional spreading
according to:
where
In addition, the spreading functions in waveresponse
cand determine discrete
direction bins with equal energy:
import waveresponse as wr
spread_fun = wr.CosineFullSpreading(s=2, degrees=True)
discrete_dirs = spread_fun.discrete_directions(5, direction_offset=0.0)
which may be used to spread 1-D ‘non-directional’ wave spectrum into waves with equal energy.