-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathSpectra.h
More file actions
239 lines (188 loc) · 7.5 KB
/
Spectra.h
File metadata and controls
239 lines (188 loc) · 7.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/* SimShip by Edouard Halbert
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License
http://creativecommons.org/licenses/by-nc-nd/4.0/ */
#pragma once
#include <cmath>
#include <vector>
#include <algorithm>
// Mer en développement dépendant du fetch
class JONSWAPModel
{
private:
static constexpr double g = 9.81; // Accélération due à la gravité (m/s^2)
public:
struct WaveParameters
{
double significantWaveHeight; // Hs en mètres
double peakPeriod; // Tp en secondes
};
static WaveParameters GetWaveParameters(double windSpeed, double fetch)
{
// Conversion de la vitesse du vent à 10m de hauteur
double U10 = windSpeed;
// Calcul des paramètres sans dimension
double gF = g * fetch / (U10 * U10);
double gT = g * peakPeriod(U10, fetch) / U10;
// Calcul de la hauteur significative des vagues
double Hs = 0.0016 * sqrt(gF) * U10 * U10 / g;
// Calcul de la période de pic
double Tp = peakPeriod(U10, fetch);
return { Hs, Tp };
}
static double peakPeriod(double U10, double fetch)
{
return 0.33 * pow(g * fetch / (U10 * U10), 0.33) * U10 / g;
}
};
// Le spectre de Phillips modélise l'énergie des vagues générées par le vent avec une forme théorique, souvent exprimée en termes de nombre d'onde k ou fréquence f.
// La constante de Phillips alpha(Ph) vaut classiquement environ 0.0081.
class PhillipsModel
{
private:
static constexpr double g = 9.81; // Accélération gravitationnelle m/s^2
public:
struct WaveParameters
{
double significantWaveHeight; // Hs en mètres
double peakPeriod; // Tp en secondes
};
// Calcule Hs et Tp à partir du vent U10 (en m/s) selon formules simplifiées du spectre de Phillips
static WaveParameters GetWaveParameters(double windSpeed)
{
double U10 = windSpeed;
// Coefficients empiriques typiques pour Phillips (à ajuster selon besoins)
constexpr double C_H = 0.2; // Coefficient pour Hs
constexpr double C_T = 1.5; // Coefficient pour Tp
// Calcul hauteur significative (m)
double Hs = C_H * (U10 * U10) / g;
// Calcul période de pic (s)
double Tp = C_T * U10 / g;
return { Hs, Tp };
}
};
// Mer pleinement développée
class PiersonMoskowitzModel
{
private:
static constexpr double g = 9.81;
public:
struct WaveParameters
{
double significantWaveHeight; // Hs en m
double peakPeriod; // Tp en s
};
static WaveParameters GetWaveParameters(double windSpeed) // windSpeed en m/s
{
double U10 = windSpeed;
double Tp = 0.13 * U10; // période de pic Tp (en s)
double Hs = 0.24 * U10 * U10 / g; // hauteur significative Hs (en m)
return { Hs, Tp };
}
};
// Spectre utilisé en eau peu profonde
class TMA_Model
{
private:
static constexpr double g = 9.81;
public:
struct WaveParameters
{
double significantWaveHeight;
double peakPeriod;
};
static WaveParameters GetWaveParameters(double windSpeed)
{
double U10 = windSpeed;
// Approximations simples (exemple)
double Tp = 0.12 * U10; // période de pic Tp (s)
double Hs = 0.20 * U10 * U10 / g; // hauteur significative (m)
return { Hs, Tp };
}
};
// Modèle initial Pierson-Moskowitz + paramétrisation de alpha
class HasselmannModel
{
private:
static constexpr double g = 9.81;
public:
struct WaveParameters
{
double significantWaveHeight;
double peakPeriod;
};
static WaveParameters GetWaveParameters(double windSpeed)
{
double U10 = windSpeed;
double Tp = 0.14 * U10;
double Hs = 0.21 * U10 * U10 / g;
return { Hs, Tp };
}
};
// Le modèle de Donelan et Banner [1985,[1996] propose une description spectrale basée sur deux régimes, avec un ajustement pour la pente du spectre, complexe à calculer intégralement.
// La hauteur significative et la période de pic peuvent être approchées par des formules empiriques basées sur U10 et fetch.
class DonelanBannerModel
{
private:
static constexpr double g = 9.81;
public:
struct WaveParameters
{
double significantWaveHeight; // Hs en m
double peakPeriod; // Tp en s
};
static WaveParameters GetWaveParameters(double windSpeed, double fetch)
{
double U10 = windSpeed;
// Formule empirique adaptée de Donelan & Banner (simplification)
double gF = g * fetch / (U10 * U10);
// Hauteur significative approximative
double Hs = 0.0012 * std::sqrt(gF) * U10 * U10 / g;
// Période de pic (exemple simplifié)
double Tp = 0.3 * std::pow(gF, 0.25) * U10 / g;
return { Hs, Tp };
}
};
// Le spectre Elfouhaily est un modèle unifié directionnel très utilisé, qui décrit à la fois les vagues de gravité et capillaires.
class ElfouhailyModel
{
private:
static constexpr double g = 9.81;
public:
struct WaveParameters
{
double significantWaveHeight;
double peakPeriod;
};
static WaveParameters GetWaveParameters(double windSpeed, double fetch)
{
double U10 = windSpeed;
double gF = g * fetch / (U10 * U10);
// Hauteur significative estimée (approximation adaptée)
double Hs = 0.0014 * std::sqrt(gF) * U10 * U10 / g;
// Période de pic selon Elfouhaily (simplifiée)
double Tp = 0.32 * std::pow(gF, 0.33) * U10 / g;
return { Hs, Tp };
}
};
void DisplayWaveParametersFromModels(double windSpeed, double fetch)
{
cout << "Significant wave heights (1/3)" << endl;
cout << "==============================" << endl;
auto waveParams0 = JONSWAPModel::GetWaveParameters(windSpeed, fetch);
cout << fixed << setprecision(2);
cout << "JONSWAP : \t\t" << waveParams0.significantWaveHeight << " m - Period : " << waveParams0.peakPeriod << " s" << endl;
auto waveParams00 = PhillipsModel::GetWaveParameters(windSpeed);
cout << "Phillips : \t\t" << waveParams00.significantWaveHeight << " m - Period : " << waveParams00.peakPeriod << " s" << endl;
auto waveParams1 = PiersonMoskowitzModel::GetWaveParameters(windSpeed);
cout << "PiersonMoskowitz : \t" << waveParams1.significantWaveHeight << " m - Period : " << waveParams1.peakPeriod << " s" << endl;
auto waveParams2 = TMA_Model::GetWaveParameters(windSpeed);
cout << "TMA : \t\t\t" << waveParams2.significantWaveHeight << " m - Period : " << waveParams2.peakPeriod << " s" << endl;
auto waveParams3 = HasselmannModel::GetWaveParameters(windSpeed);
cout << "Hasselmann : \t\t" << waveParams3.significantWaveHeight << " m - Period : " << waveParams3.peakPeriod << " s" << endl;
auto waveParams4 = DonelanBannerModel::GetWaveParameters(windSpeed, fetch);
cout << "DonelanBanner : \t" << waveParams4.significantWaveHeight << " m - Period : " << waveParams4.peakPeriod << " s" << endl;
auto waveParams5 = ElfouhailyModel::GetWaveParameters(windSpeed, fetch);
cout << "Elfouhaily : \t\t" << waveParams5.significantWaveHeight << " m - Period : " << waveParams5.peakPeriod << " s" << endl;
cout << "==============================" << endl;
cout << endl;
}