10
10
n_p:: Tn_p
11
11
end
12
12
13
- function get_KVLCC2_L7_basic_params (ρ = 1025.0 )
13
+ @with_kw struct EnvironmentData{Tt,TU_W,Tψ_W}
14
+ time:: Tt
15
+ U_W:: TU_W
16
+ ψ_W:: T ψ_W
17
+ end
18
+
19
+ function get_KVLCC2_L7_basic_params (ρ= 1025.0 )
14
20
L_pp = 7.00 # 船長Lpp[m]
15
21
B = 1.27 # 船幅[m]
16
22
d = 0.46 # 喫水[m]
@@ -144,19 +150,140 @@ function get_KVLCC2_L7_params()
144
150
basic_params, maneuvering_params
145
151
end
146
152
147
- function calc_position (time_vec, u_vec, v_vec, r_vec; x0 = 0.0 , y0 = 0.0 , ψ0 = 0.0 )
153
+ """
154
+ wind_force_and_moment_coefficients(ψ_A,p)
155
+
156
+ compute the parameter C_X,C_Y,C_N from Fujiwara's estimation method (1994).
157
+
158
+ # Arguments
159
+ -`ψ_A`: Wind attack of angle [rad]
160
+ - L_pp
161
+ - B
162
+ - A_OD
163
+ - A_F
164
+ - A_L
165
+ - H_BR
166
+ - H_C
167
+ - C
168
+ """
169
+ function wind_force_and_moment_coefficients (
170
+ ψ_A,
171
+ L_pp,
172
+ B,
173
+ A_OD,
174
+ A_F,
175
+ A_L,
176
+ H_BR,
177
+ H_C,
178
+ C,
179
+ )
180
+ # C_LF1の場合で調整
181
+ C_CF = 0.404 + 0.368 * A_F / (B * H_BR) + 0.902 * H_BR / L_pp
182
+
183
+ if deg2rad (0 ) <= ψ_A <= deg2rad (90 )
184
+ C_LF = - 0.992 + 0.507 * A_L / (L_pp * B) + 1.162 * C / L_pp
185
+ C_XLI = 0.458 + 3.245 * A_L / (L_pp * H_BR) - 2.313 * A_F / (B * H_BR)
186
+ C_ALF = - 0.585 - 0.906 * A_OD / A_L + 3.239 * B / L_pp
187
+ C_YLI = pi * A_L / L_pp^ 2 + 0.116 + 3.345 * A_F / (L_pp * B)
188
+
189
+ elseif deg2rad (90 ) < ψ_A <= deg2rad (180 )
190
+ C_LF =
191
+ 0.018 - 5.091 * B / L_pp + 10.367 * H_C / L_pp - 3.011 * A_OD / L_pp^ 2 -
192
+ 0.341 * A_F / B^ 2
193
+ C_XLI =
194
+ - 1.901 + 12.727 * A_L / (L_pp * H_BR) + 24.407 * A_F / A_L -
195
+ 40.310 * B / L_pp - 0.341 * A_F / (B * H_BR)
196
+ C_ALF = - 0.314 - 1.117 * A_OD / A_L
197
+ C_YLI = pi * A_L / L_pp^ 2 + 0.446 + 2.192 * A_F / L_pp^ 2
198
+
199
+ elseif deg2rad (180 ) < ψ_A <= deg2rad (270 )
200
+ C_LF =
201
+ 0.018 - 5.091 * B / L_pp + 10.367 * H_C / L_pp - 3.011 * A_OD / L_pp^ 2 -
202
+ 0.341 * A_F / B^ 2
203
+ C_XLI =
204
+ - 1.901 + 12.727 * A_L / (L_pp * H_BR) + 24.407 * A_F / A_L -
205
+ 40.310 * B / L_pp - 0.341 * A_F / (B * H_BR)
206
+ C_ALF = - (- 0.314 - 1.117 * A_OD / A_L)
207
+ C_YLI = - (pi * A_L / L_pp^ 2 + 0.446 + 2.192 * A_F / L_pp^ 2 )
208
+
209
+ elseif deg2rad (270 ) < ψ_A <= deg2rad (360 )
210
+ C_LF = - 0.992 + 0.507 * A_L / (L_pp * B) + 1.162 * C / L_pp
211
+ C_XLI = 0.458 + 3.245 * A_L / (L_pp * H_BR) - 2.313 * A_F / (B * H_BR)
212
+ C_ALF = - (- 0.585 - 0.906 * A_OD / A_L + 3.239 * B / L_pp)
213
+ C_YLI = - (pi * A_L / L_pp^ 2 + 0.116 + 3.345 * A_F / (L_pp * B))
214
+ end
215
+
216
+ C_X =
217
+ C_LF * cos (ψ_A) +
218
+ C_XLI * (sin (ψ_A) - sin (ψ_A) * cos (ψ_A)^ 2 / 2 ) * sin (ψ_A) * cos (ψ_A) +
219
+ C_ALF * sin (ψ_A) * cos (ψ_A)^ 3
220
+ C_Y =
221
+ C_CF * sin (ψ_A)^ 2 +
222
+ C_YLI * (cos (ψ_A) + sin (ψ_A)^ 2 * cos (ψ_A) / 2 ) * sin (ψ_A) * cos (ψ_A)
223
+ C_N = C_Y * (0.297 * C / L_pp - 0.149 * (ψ_A - deg2rad (90 )))
224
+
225
+ C_X, C_Y, C_N
226
+ end
227
+
228
+ function get_example_ship_wind_force_moment_params ()
229
+ L_pp = 7.00 # 船長Lpp[m]
230
+ B = 1.27 # 船幅[m]
231
+ d = 0.46 # 喫水[m]
232
+ D = 0.6563 # 深さ[m]
233
+ A_OD = 0.65 # デッキ上の構造物の側面投影面積[m^2]
234
+ H_BR = 0.85 # 喫水からブリッジ主要構造物の最高位[m]
235
+ H_C = 0.235 # 喫水から側面積中心までの高さ[m]
236
+ C = 0.0 # 船体中心から側面積中心までの前後方向座標(船首方向を正)[m]
237
+
238
+ A_OD = A_OD # デッキ上の構造物の側面投影面積[m^2]
239
+ A_F = (D - d) * B # 船体の正面投影面積[m^2]
240
+ A_L = (D - d) * L_pp # 船体の側面投影面積[m^2]
241
+ H_BR = H_BR # 喫水からブリッジ主要構造物の最高位[m]
242
+ H_C = H_C # 喫水から側面積中心までの高さ[m]
243
+ C = C # 船体中心から側面積中心までの前後方向座標[m]
244
+
245
+ ψ_A_vec = deg2rad .(collect (0 : 10 : 360 ))
246
+ C_X_vec = Array {Float64} (undef, length (ψ_A_vec))
247
+ C_Y_vec = Array {Float64} (undef, length (ψ_A_vec))
248
+ C_N_vec = Array {Float64} (undef, length (ψ_A_vec))
249
+ for (index, ψ_A) in enumerate (ψ_A_vec)
250
+ C_X, C_Y, C_N = wind_force_and_moment_coefficients (
251
+ ψ_A,
252
+ L_pp,
253
+ B,
254
+ A_OD,
255
+ A_F,
256
+ A_L,
257
+ H_BR,
258
+ H_C,
259
+ C,
260
+ )
261
+ C_X_vec[index] = C_X
262
+ C_Y_vec[index] = C_Y
263
+ C_N_vec[index] = C_N
264
+ end
265
+ spl_C_X = Spline1D (ψ_A_vec, C_X_vec)
266
+ spl_C_Y = Spline1D (ψ_A_vec, C_Y_vec)
267
+ spl_C_N = Spline1D (ψ_A_vec, C_N_vec)
268
+
269
+ Mmg3DofWindForceMomentParams (A_F, A_L, spl_C_X, spl_C_Y, spl_C_N)
270
+ end
271
+
272
+ function calc_position (time_vec, u_vec, v_vec, r_vec; x0= 0.0 , y0= 0.0 , ψ0= 0.0 )
148
273
dim = length (time_vec)
149
274
x_vec = zeros (Float64, dim)
150
275
y_vec = zeros (Float64, dim)
151
276
ψ_vec = zeros (Float64, dim)
152
277
x_vec[1 ] = x0
153
278
y_vec[1 ] = y0
154
279
ψ_vec[1 ] = ψ0
155
- for i = 2 : dim
280
+ for i in 2 : dim
156
281
Δt = time_vec[i] - time_vec[i- 1 ]
157
282
ψ_vec[i] = ψ_vec[i- 1 ] + r_vec[i] * Δt
158
- x_vec[i] = x_vec[i- 1 ] + (u_vec[i] * cos (ψ_vec[i]) - v_vec[i] * sin (ψ_vec[i])) * Δt
159
- y_vec[i] = y_vec[i- 1 ] + (u_vec[i] * sin (ψ_vec[i]) + v_vec[i] * cos (ψ_vec[i])) * Δt
283
+ x_vec[i] =
284
+ x_vec[i- 1 ] + (u_vec[i] * cos (ψ_vec[i]) - v_vec[i] * sin (ψ_vec[i])) * Δt
285
+ y_vec[i] =
286
+ y_vec[i- 1 ] + (u_vec[i] * sin (ψ_vec[i]) + v_vec[i] * cos (ψ_vec[i])) * Δt
160
287
end
161
288
x_vec, y_vec, ψ_vec
162
289
end
@@ -165,12 +292,12 @@ function nuts_sampling_single_thread(
165
292
model,
166
293
n_samples:: Int ,
167
294
n_chains:: Int ;
168
- target_acceptance:: Float64 = 0.65 ,
169
- progress = true ,
295
+ target_acceptance:: Float64 = 0.65 ,
296
+ progress= true ,
170
297
)
171
298
sampler = NUTS (target_acceptance)
172
299
mapreduce (
173
- c -> sample (model, sampler, n_samples, progress = progress),
300
+ c -> sample (model, sampler, n_samples, progress= progress),
174
301
chainscat,
175
302
1 : n_chains,
176
303
)
@@ -180,9 +307,9 @@ function nuts_sampling_multi_threads(
180
307
model,
181
308
n_samples:: Int ,
182
309
n_chains:: Int ;
183
- target_acceptance:: Float64 = 0.65 ,
184
- progress = false ,
310
+ target_acceptance:: Float64 = 0.65 ,
311
+ progress= false ,
185
312
)
186
313
sampler = NUTS (target_acceptance)
187
- sample (model, sampler, MCMCThreads (), n_samples, n_chains, progress = progress)
314
+ sample (model, sampler, MCMCThreads (), n_samples, n_chains, progress= progress)
188
315
end
0 commit comments