You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
6.0 KiB
Python
193 lines
6.0 KiB
Python
import wafo.plotbackend.plotbackend as plt
|
|
import numpy as np
|
|
# pyreport -o chapter1.html chapter1.py
|
|
|
|
#! CHAPTER1 demonstrates some applications of WAFO
|
|
#!================================================
|
|
#!
|
|
#! CHAPTER1 gives an overview through examples some of the capabilities of
|
|
#! WAFO. WAFO is a toolbox of Matlab routines for statistical analysis and
|
|
#! simulation of random waves and loads.
|
|
#!
|
|
#! The commands are edited for fast computation.
|
|
|
|
|
|
#! Section 1.4 Some applications of WAFO
|
|
#!---------------------------------------
|
|
#! Section 1.4.1 Simulation from spectrum, estimation of spectrum
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! Simulation of the sea surface from spectrum
|
|
#! The following code generates 200 seconds of data sampled with 10Hz from
|
|
#! the Torsethaugen spectrum
|
|
import wafo.spectrum.models as wsm
|
|
S = wsm.Torsethaugen(Hm0=6, Tp=8)
|
|
S1 = S.tospecdata()
|
|
S1.plot()
|
|
plt.show()
|
|
|
|
|
|
##
|
|
import wafo.objects as wo
|
|
xs = S1.sim(ns=2000, dt=0.1)
|
|
ts = wo.mat2timeseries(xs)
|
|
ts.plot_wave('-')
|
|
plt.show()
|
|
|
|
|
|
#! Estimation of spectrum
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! A common situation is that one wants to estimate the spectrum for wave
|
|
#! measurements. The following code simulate 20 minutes signal sampled at 4Hz
|
|
#! and compare the spectral estimate with the original Torsethaugen spectum.
|
|
plt.clf()
|
|
Fs = 4
|
|
xs = S1.sim(ns=np.fix(20 * 60 * Fs), dt=1. / Fs)
|
|
ts = wo.mat2timeseries(xs)
|
|
Sest = ts.tospecdata(L=400)
|
|
S1.plot()
|
|
Sest.plot('--')
|
|
plt.axis([0, 3, 0, 5])
|
|
plt.show()
|
|
|
|
#! Section 1.4.2 Probability distributions of wave characteristics.
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! Probability distribution of wave trough period:
|
|
#! WAFO gives the possibility of computing the exact probability
|
|
#! distributions for a number of characteristics given a spectral density.
|
|
#! In the following example we study the trough period extracted from the
|
|
#! time series and compared with the theoretical density computed with exact
|
|
#! spectrum, S1, and the estimated spectrum, Sest.
|
|
plt.clf()
|
|
import wafo.misc as wm
|
|
dtyex = S1.to_t_pdf(pdef='Tt', paramt=(0, 10, 51), nit=3)
|
|
dtyest = Sest.to_t_pdf(pdef='Tt', paramt=(0, 10, 51), nit=3)
|
|
|
|
T, index = ts.wave_periods(vh=0, pdef='d2u')
|
|
bins = wm.good_bins(T, num_bins=25, odd=True)
|
|
wm.plot_histgrm(T, bins=bins, normed=True)
|
|
|
|
dtyex.plot()
|
|
dtyest.plot('-.')
|
|
plt.axis([0, 10, 0, 0.35])
|
|
plt.show()
|
|
|
|
#! Section 1.4.3 Directional spectra
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! Here are a few lines of code, which produce directional spectra
|
|
#! with frequency independent and frequency dependent spreading.
|
|
plt.clf()
|
|
plotflag = 1
|
|
Nt = 101 # number of angles
|
|
th0 = np.pi / 2 # primary direction of waves
|
|
Sp = 15 # spreading parameter
|
|
|
|
D1 = wsm.Spreading(type='cos', theta0=th0, method=None)
|
|
D12 = wsm.Spreading(type='cos', theta0=0, method='mitsuyasu')
|
|
|
|
SD1 = D1.tospecdata2d(S1)
|
|
SD12 = D12.tospecdata2d(S1)
|
|
SD1.plot()
|
|
SD12.plot() # linestyle='dashdot')
|
|
plt.show()
|
|
|
|
#! 3D Simulation of the sea surface
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! The simulations show that frequency dependent spreading leads to
|
|
#! much more irregular surface so the orientation of waves is less
|
|
#! transparent compared to the frequency independent case.
|
|
#
|
|
#! Frequency independent spreading
|
|
#plotflag = 1; iseed = 1;
|
|
#
|
|
#Nx = 2 ^ 8;Ny = Nx;Nt = 1;dx = 0.5; dy = dx; dt = 0.25; fftdim = 2;
|
|
#randn('state', iseed)
|
|
#Y1 = seasim(SD1, Nx, Ny, Nt, dx, dy, dt, fftdim, plotflag);
|
|
#wafostamp('', '(ER)')
|
|
#axis('fill')
|
|
#disp('Block = 6'), pause(pstate)
|
|
#
|
|
###
|
|
## Frequency dependent spreading
|
|
#randn('state', iseed)
|
|
#Y12 = seasim(SD12, Nx, Ny, Nt, dx, dy, dt, fftdim, plotflag);
|
|
#wafostamp('', '(ER)')
|
|
#axis('fill')
|
|
#disp('Block = 7'), pause(pstate)
|
|
#
|
|
#! Estimation of directional spectrum
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! The figure is not shown in the Tutorial
|
|
#
|
|
# Nx = 3; Ny = 2; Nt = 2 ^ 12; dx = 10; dy = 10;dt = 0.5;
|
|
# F = seasim(SD12, Nx, Ny, Nt, dx, dy, dt, 1, 0);
|
|
# Z = permute(F.Z, [3 1 2]);
|
|
# [X, Y] = meshgrid(F.x, F.y);
|
|
# N = Nx * Ny;
|
|
# types = repmat(sensortypeid('n'), N, 1);
|
|
# bfs = ones(N, 1);
|
|
# pos = [X(:), Y(:), zeros(N, 1)];
|
|
# h = inf;
|
|
# nfft = 128;
|
|
# nt = 101;
|
|
# SDe = dat2dspec([F.t Z(:, :)], [pos types, bfs], h, nfft, nt);
|
|
#plotspec(SDe), hold on
|
|
#plotspec(SD12, '--'), hold off
|
|
#disp('Block = 8'), pause(pstate)
|
|
|
|
#! Section 1.4.4 Fatigue, Load cycles and Markov models.
|
|
#! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
#! Switching Markow chain of turningpoints
|
|
#! In fatigue applications the exact sample path is not important, but
|
|
#! only the tops and bottoms of the load, called the sequence of turning
|
|
#! points (TP). From the turning points one can extract load cycles, from
|
|
#! which damage calculations and fatigue life predictions can be
|
|
#! performed.
|
|
#!
|
|
#! The commands below computes the intensity of rainflowcycles for
|
|
#! the Gaussian model with spectrum S1 using the Markov approximation.
|
|
#! The rainflow cycles found in the simulated load signal are shown in the
|
|
#! figure.
|
|
|
|
#clf()
|
|
#paramu = [-6 6 61];
|
|
#frfc = spec2cmat(S1, [], 'rfc', [], paramu);
|
|
#pdfplot(frfc);
|
|
#hold on
|
|
#tp = dat2tp(xs);
|
|
#rfc = tp2rfc(tp);
|
|
#plot(rfc(:, 2), rfc(:, 1), '.')
|
|
#wafostamp('', '(ER)')
|
|
#hold off
|
|
#disp('Block = 9'), pause(pstate)
|
|
|
|
#! Section 1.4.5 Extreme value statistics
|
|
#!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
# Plot of yura87 data
|
|
plt.clf()
|
|
import wafo.data as wd
|
|
xn = wd.yura87()
|
|
#xn = load('yura87.dat');
|
|
plt.subplot(211)
|
|
plt.plot(xn[::30, 0] / 3600, xn[::30, 1], '.')
|
|
plt.title('Water level')
|
|
plt.ylabel('(m)')
|
|
|
|
#! Formation of 5 min maxima
|
|
yura = xn[:85500, 1]
|
|
yura = np.reshape(yura, (285, 300)).T
|
|
maxyura = yura.max(axis=0)
|
|
plt.subplot(212)
|
|
plt.plot(xn[299:85500:300, 0] / 3600, maxyura, '.')
|
|
plt.xlabel('Time (h)')
|
|
plt.ylabel('(m)')
|
|
plt.title('Maximum 5 min water level')
|
|
plt.show()
|
|
|
|
#! Estimation of GEV for yuramax
|
|
plt.clf()
|
|
import wafo.stats as ws
|
|
phat = ws.genextreme.fit2(maxyura, method='ml')
|
|
phat.plotfitsummary()
|
|
plt.show()
|
|
#disp('Block = 11, Last block')
|