Skip to content

Commit 8f36592

Browse files
authored
Use negative indices in shallow water and wave eq examples (#65)
1 parent 84d7c8e commit 8f36592

File tree

2 files changed

+48
-60
lines changed

2 files changed

+48
-60
lines changed

examples/shallow_water.py

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -215,73 +215,63 @@ def rhs(u, v, e):
215215
H = e + h
216216

217217
# 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]
220220

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)
225222

226223
# 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])
237229
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]
241233

242234
# 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
245237
q[:, :] = (dvdx - dudy + coriolis) / H_at_f
246238

247239
# Advection of potential vorticity, Arakawa and Hsu (1990)
248240
# Define alpha, beta, gamma, delta for each cell in T points
249241
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])
256246

257247
# kinetic energy
258248
u2 = u * u
259249
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])
262252
ke = 0.5 * (u2_at_t + v2_at_t)
263253

264254
dudt = (
265255
# pressure gradient -g grad(elev)
266-
-g * (e[1:nx, :] - e[0 : nx - 1, :]) / dx
256+
-g * (e[1:, :] - e[:-1, :]) / dx
267257
# kinetic energy gradient
268-
- (ke[1:nx, :] - ke[0 : nx - 1, :]) / dx
258+
- (ke[1:, :] - ke[:-1, :]) / dx
269259
# 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]
274264
)
275265
dvdt = (
276266
# pressure gradient -g grad(elev)
277-
-g * (e[:, 1:ny] - e[:, 0 : ny - 1]) / dy
267+
-g * (e[:, 1:] - e[:, :-1]) / dy
278268
# kinetic energy gradient
279-
- (ke[:, 1:ny] - ke[:, 0 : ny - 1]) / dy
269+
- (ke[:, 1:] - ke[:, :-1]) / dy
280270
# 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]
285275
)
286276

287277
return dudt, dvdt, dedt
@@ -291,18 +281,18 @@ def step(u, v, e, u1, v1, e1, u2, v2, e2):
291281
Execute one SSPRK(3,3) time step
292282
"""
293283
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
296286
e1[:, :] = e[:, :] + dt * dedt
297287

298288
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)
301291
e2[:, :] = 0.75 * e[:, :] + 0.25 * (e1[:, :] + dt * dedt)
302292

303293
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)
306296
e[:, :] = e[:, :] / 3.0 + 2.0 / 3.0 * (e2[:, :] + dt * dedt)
307297

308298
t = 0
@@ -328,8 +318,8 @@ def step(u, v, e, u1, v1, e1, u2, v2, e2):
328318
# kinetic energy
329319
u2 = u * u
330320
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])
333323
_ke = 0.5 * (u2_at_t + v2_at_t) * (e + h)
334324
_total_ke = np.sum(_ke, all_axes)
335325

examples/wave_equation.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,11 @@ def rhs(u, v, e):
168168
# sign convention: positive on rhs
169169

170170
# pressure gradient -g grad(elev)
171-
dudt = -g * (e[1:nx, :] - e[0 : nx - 1, :]) / dx
172-
dvdt = -g * (e[:, 1:ny] - e[:, 0 : ny - 1]) / dy
171+
dudt = -g * (e[1:, :] - e[:-1, :]) / dx
172+
dvdt = -g * (e[:, 1:] - e[:, :-1]) / dy
173173

174174
# velocity divergence -h div(u)
175-
dedt = -h * (
176-
(u[1 : nx + 1, :] - u[0:nx, :]) / dx + (v[:, 1 : ny + 1] - v[:, 0:ny]) / dy
177-
)
175+
dedt = -h * ((u[1:, :] - u[:-1, :]) / dx + (v[:, 1:] - v[:, :-1]) / dy)
178176

179177
return dudt, dvdt, dedt
180178

@@ -183,18 +181,18 @@ def step(u, v, e, u1, v1, e1, u2, v2, e2):
183181
Execute one SSPRK(3,3) time step
184182
"""
185183
dudt, dvdt, dedt = rhs(u, v, e)
186-
u1[1:nx, :] = u[1:nx, :] + dt * dudt
187-
v1[:, 1:ny] = v[:, 1:ny] + dt * dvdt
184+
u1[1:-1, :] = u[1:-1, :] + dt * dudt
185+
v1[:, 1:-1] = v[:, 1:-1] + dt * dvdt
188186
e1[:, :] = e[:, :] + dt * dedt
189187

190188
dudt, dvdt, dedt = rhs(u1, v1, e1)
191-
u2[1:nx, :] = 0.75 * u[1:nx, :] + 0.25 * (u1[1:nx, :] + dt * dudt)
192-
v2[:, 1:ny] = 0.75 * v[:, 1:ny] + 0.25 * (v1[:, 1:ny] + dt * dvdt)
189+
u2[1:-1, :] = 0.75 * u[1:-1, :] + 0.25 * (u1[1:-1, :] + dt * dudt)
190+
v2[:, 1:-1] = 0.75 * v[:, 1:-1] + 0.25 * (v1[:, 1:-1] + dt * dvdt)
193191
e2[:, :] = 0.75 * e[:, :] + 0.25 * (e1[:, :] + dt * dedt)
194192

195193
dudt, dvdt, dedt = rhs(u2, v2, e2)
196-
u[1:nx, :] = u[1:nx, :] / 3.0 + 2.0 / 3.0 * (u2[1:nx, :] + dt * dudt)
197-
v[:, 1:ny] = v[:, 1:ny] / 3.0 + 2.0 / 3.0 * (v2[:, 1:ny] + dt * dvdt)
194+
u[1:-1, :] = u[1:-1, :] / 3.0 + 2.0 / 3.0 * (u2[1:-1, :] + dt * dudt)
195+
v[:, 1:-1] = v[:, 1:-1] / 3.0 + 2.0 / 3.0 * (v2[:, 1:-1] + dt * dvdt)
198196
e[:, :] = e[:, :] / 3.0 + 2.0 / 3.0 * (e2[:, :] + dt * dedt)
199197

200198
t = 0

0 commit comments

Comments
 (0)