@@ -215,73 +215,63 @@ def rhs(u, v, e):
215
215
H = e + h
216
216
217
217
# volume flux divergence -div(H u)
218
- hu [1 :nx , :] = 0.5 * (H [0 : nx - 1 , :] + H [1 :nx , :]) * u [1 :nx , :]
219
- hv [:, 1 :ny ] = 0.5 * (H [:, 0 : ny - 1 ] + H [:, 1 :ny ]) * v [:, 1 :ny ]
218
+ hu [1 :- 1 , :] = 0.5 * (H [: - 1 , :] + H [1 :, :]) * u [1 :- 1 , :]
219
+ hv [:, 1 :- 1 ] = 0.5 * (H [:, : - 1 ] + H [:, 1 :]) * v [:, 1 :- 1 ]
220
220
221
- dedt = - 1.0 * (
222
- (hu [1 : nx + 1 , :] - hu [0 :nx , :]) / dx
223
- + (hv [:, 1 : ny + 1 ] - hv [:, 0 :ny ]) / dy
224
- )
221
+ dedt = - 1.0 * ((hu [1 :, :] - hu [:- 1 , :]) / dx + (hv [:, 1 :] - hv [:, :- 1 ]) / dy )
225
222
226
223
# total depth at F points
227
- H_at_f [1 :nx , 1 :ny ] = 0.25 * (
228
- H [1 :nx , 1 :ny ]
229
- + H [0 : nx - 1 , 1 :ny ]
230
- + H [1 :nx , 0 : ny - 1 ]
231
- + H [0 : nx - 1 , 0 : ny - 1 ]
232
- )
233
- H_at_f [0 , 1 :ny ] = 0.5 * (H [0 , 1 :ny ] + H [0 , 0 : ny - 1 ])
234
- H_at_f [nx , 1 :ny ] = 0.5 * (H [nx - 1 , 1 :ny ] + H [nx - 1 , 0 : ny - 1 ])
235
- H_at_f [1 :nx , 0 ] = 0.5 * (H [1 :nx , 0 ] + H [0 : nx - 1 , 0 ])
236
- H_at_f [1 :nx , ny ] = 0.5 * (H [1 :nx , ny - 1 ] + H [0 : nx - 1 , ny - 1 ])
224
+ H_at_f [1 :- 1 , 1 :- 1 ] = 0.25 * (H [1 :, 1 :] + H [:- 1 , 1 :] + H [1 :, :- 1 ] + H [:- 1 , :- 1 ])
225
+ H_at_f [0 , 1 :- 1 ] = 0.5 * (H [0 , 1 :] + H [0 , :- 1 ])
226
+ H_at_f [- 1 , 1 :- 1 ] = 0.5 * (H [- 1 , 1 :] + H [- 1 , :- 1 ])
227
+ H_at_f [1 :- 1 , 0 ] = 0.5 * (H [1 :, 0 ] + H [:- 1 , 0 ])
228
+ H_at_f [1 :- 1 , - 1 ] = 0.5 * (H [1 :, - 1 ] + H [:- 1 , - 1 ])
237
229
H_at_f [0 , 0 ] = H [0 , 0 ]
238
- H_at_f [0 , ny ] = H [0 , ny - 1 ]
239
- H_at_f [nx , 0 ] = H [nx - 1 , 0 ]
240
- H_at_f [nx , ny ] = H [nx - 1 , ny - 1 ]
230
+ H_at_f [0 , - 1 ] = H [0 , - 1 ]
231
+ H_at_f [- 1 , 0 ] = H [- 1 , 0 ]
232
+ H_at_f [- 1 , - 1 ] = H [- 1 , - 1 ]
241
233
242
234
# potential vorticity
243
- dudy [:, 1 :ny ] = (u [:, 1 :ny ] - u [:, 0 : ny - 1 ]) / dy
244
- dvdx [1 :nx , :] = (v [1 :nx , :] - v [0 : nx - 1 , :]) / dx
235
+ dudy [:, 1 :- 1 ] = (u [:, 1 :] - u [:, : - 1 ]) / dy
236
+ dvdx [1 :- 1 , :] = (v [1 :, :] - v [: - 1 , :]) / dx
245
237
q [:, :] = (dvdx - dudy + coriolis ) / H_at_f
246
238
247
239
# Advection of potential vorticity, Arakawa and Hsu (1990)
248
240
# Define alpha, beta, gamma, delta for each cell in T points
249
241
w = 1.0 / 12
250
- q_a = w * (q [0 :nx , 1 : ny + 1 ] + q [0 :nx , 0 :ny ] + q [1 : nx + 1 , 1 : ny + 1 ])
251
- q_b = w * (
252
- q [1 : nx + 1 , 1 : ny + 1 ] + q [1 : nx + 1 , 0 :ny ] + q [0 :nx , 1 : ny + 1 ]
253
- )
254
- q_g = w * (q [1 : nx + 1 , 0 :ny ] + q [1 : nx + 1 , 1 : ny + 1 ] + q [0 :nx , 0 :ny ])
255
- q_d = w * (q [0 :nx , 0 :ny ] + q [0 :nx , 1 : ny + 1 ] + q [1 : nx + 1 , 0 :ny ])
242
+ q_a = w * (q [:- 1 , 1 :] + q [:- 1 , :- 1 ] + q [1 :, 1 :])
243
+ q_b = w * (q [1 :, 1 :] + q [1 :, :- 1 ] + q [:- 1 , 1 :])
244
+ q_g = w * (q [1 :, :- 1 ] + q [1 :, 1 :] + q [:- 1 , :- 1 ])
245
+ q_d = w * (q [:- 1 , :- 1 ] + q [:- 1 , 1 :] + q [1 :, :- 1 ])
256
246
257
247
# kinetic energy
258
248
u2 = u * u
259
249
v2 = v * v
260
- u2_at_t = 0.5 * (u2 [1 : nx + 1 , :] + u2 [0 : nx , :])
261
- v2_at_t = 0.5 * (v2 [:, 1 : ny + 1 ] + v2 [:, 0 : ny ])
250
+ u2_at_t = 0.5 * (u2 [1 : , :] + u2 [: - 1 , :])
251
+ v2_at_t = 0.5 * (v2 [:, 1 : ] + v2 [:, : - 1 ])
262
252
ke = 0.5 * (u2_at_t + v2_at_t )
263
253
264
254
dudt = (
265
255
# pressure gradient -g grad(elev)
266
- - g * (e [1 :nx , :] - e [0 : nx - 1 , :]) / dx
256
+ - g * (e [1 :, :] - e [: - 1 , :]) / dx
267
257
# kinetic energy gradient
268
- - (ke [1 :nx , :] - ke [0 : nx - 1 , :]) / dx
258
+ - (ke [1 :, :] - ke [: - 1 , :]) / dx
269
259
# potential vorticity advection terms
270
- + q_a [1 :nx , :] * hv [1 :nx , 1 : ny + 1 ]
271
- + q_b [0 : nx - 1 , :] * hv [0 : nx - 1 , 1 : ny + 1 ]
272
- + q_g [0 : nx - 1 , :] * hv [0 : nx - 1 , 0 : ny ]
273
- + q_d [1 :nx , :] * hv [1 :nx , 0 : ny ]
260
+ + q_a [1 :, :] * hv [1 :, 1 : ]
261
+ + q_b [: - 1 , :] * hv [: - 1 , 1 : ]
262
+ + q_g [: - 1 , :] * hv [: - 1 , : - 1 ]
263
+ + q_d [1 :, :] * hv [1 :, : - 1 ]
274
264
)
275
265
dvdt = (
276
266
# pressure gradient -g grad(elev)
277
- - g * (e [:, 1 :ny ] - e [:, 0 : ny - 1 ]) / dy
267
+ - g * (e [:, 1 :] - e [:, : - 1 ]) / dy
278
268
# kinetic energy gradient
279
- - (ke [:, 1 :ny ] - ke [:, 0 : ny - 1 ]) / dy
269
+ - (ke [:, 1 :] - ke [:, : - 1 ]) / dy
280
270
# potential vorticity advection terms
281
- - q_g [:, 1 :ny ] * hu [1 : nx + 1 , 1 :ny ]
282
- - q_d [:, 1 :ny ] * hu [0 : nx , 1 :ny ]
283
- - q_a [:, 0 : ny - 1 ] * hu [0 : nx , 0 : ny - 1 ]
284
- - q_b [:, 0 : ny - 1 ] * hu [1 : nx + 1 , 0 : ny - 1 ]
271
+ - q_g [:, 1 :] * hu [1 : , 1 :]
272
+ - q_d [:, 1 :] * hu [: - 1 , 1 :]
273
+ - q_a [:, : - 1 ] * hu [: - 1 , : - 1 ]
274
+ - q_b [:, : - 1 ] * hu [1 :, : - 1 ]
285
275
)
286
276
287
277
return dudt , dvdt , dedt
@@ -291,18 +281,18 @@ def step(u, v, e, u1, v1, e1, u2, v2, e2):
291
281
Execute one SSPRK(3,3) time step
292
282
"""
293
283
dudt , dvdt , dedt = rhs (u , v , e )
294
- u1 [1 :nx , :] = u [1 :nx , :] + dt * dudt
295
- v1 [:, 1 :ny ] = v [:, 1 :ny ] + dt * dvdt
284
+ u1 [1 :- 1 , :] = u [1 :- 1 , :] + dt * dudt
285
+ v1 [:, 1 :- 1 ] = v [:, 1 :- 1 ] + dt * dvdt
296
286
e1 [:, :] = e [:, :] + dt * dedt
297
287
298
288
dudt , dvdt , dedt = rhs (u1 , v1 , e1 )
299
- u2 [1 :nx , :] = 0.75 * u [1 :nx , :] + 0.25 * (u1 [1 :nx , :] + dt * dudt )
300
- v2 [:, 1 :ny ] = 0.75 * v [:, 1 :ny ] + 0.25 * (v1 [:, 1 :ny ] + dt * dvdt )
289
+ u2 [1 :- 1 , :] = 0.75 * u [1 :- 1 , :] + 0.25 * (u1 [1 :- 1 , :] + dt * dudt )
290
+ v2 [:, 1 :- 1 ] = 0.75 * v [:, 1 :- 1 ] + 0.25 * (v1 [:, 1 :- 1 ] + dt * dvdt )
301
291
e2 [:, :] = 0.75 * e [:, :] + 0.25 * (e1 [:, :] + dt * dedt )
302
292
303
293
dudt , dvdt , dedt = rhs (u2 , v2 , e2 )
304
- u [1 :nx , :] = u [1 :nx , :] / 3.0 + 2.0 / 3.0 * (u2 [1 :nx , :] + dt * dudt )
305
- v [:, 1 :ny ] = v [:, 1 :ny ] / 3.0 + 2.0 / 3.0 * (v2 [:, 1 :ny ] + dt * dvdt )
294
+ u [1 :- 1 , :] = u [1 :- 1 , :] / 3.0 + 2.0 / 3.0 * (u2 [1 :- 1 , :] + dt * dudt )
295
+ v [:, 1 :- 1 ] = v [:, 1 :- 1 ] / 3.0 + 2.0 / 3.0 * (v2 [:, 1 :- 1 ] + dt * dvdt )
306
296
e [:, :] = e [:, :] / 3.0 + 2.0 / 3.0 * (e2 [:, :] + dt * dedt )
307
297
308
298
t = 0
@@ -328,8 +318,8 @@ def step(u, v, e, u1, v1, e1, u2, v2, e2):
328
318
# kinetic energy
329
319
u2 = u * u
330
320
v2 = v * v
331
- u2_at_t = 0.5 * (u2 [1 : nx + 1 , :] + u2 [0 : nx , :])
332
- v2_at_t = 0.5 * (v2 [:, 1 : ny + 1 ] + v2 [:, 0 : ny ])
321
+ u2_at_t = 0.5 * (u2 [1 : , :] + u2 [: - 1 , :])
322
+ v2_at_t = 0.5 * (v2 [:, 1 : ] + v2 [:, : - 1 ])
333
323
_ke = 0.5 * (u2_at_t + v2_at_t ) * (e + h )
334
324
_total_ke = np .sum (_ke , all_axes )
335
325
0 commit comments