1
1
import numpy as np
2
2
import argparse
3
3
4
+ def calculate_cu_cv_z_h_numpy (u , v , p , fsdx , fsdy ):
5
+ cu = np .zeros_like (u )
6
+ cv = np .zeros_like (v )
7
+ h = np .zeros_like (u )
8
+ z = np .zeros_like (u )
9
+ cu [1 :,:- 1 ] = 0.5 * (p [1 :, :- 1 ] + p [:- 1 , :- 1 ]) * u [1 :, :- 1 ]
10
+ cv [:- 1 ,1 :] = 0.5 * (p [:- 1 , 1 :] + p [:- 1 , :- 1 ]) * v [:- 1 , 1 :]
11
+ z [1 :,1 :] = fsdx * (v [1 :, 1 :] - v [:- 1 , 1 :]) - fsdy * (u [1 :, 1 :] - u [1 :, :- 1 ]) / (
12
+ p [:- 1 , :- 1 ] + p [1 :, :- 1 ] + p [1 :, 1 :] + p [:- 1 , 1 :]
13
+ )
14
+ h [:- 1 ,:- 1 ] = p [:- 1 , :- 1 ] + 0.25 * (
15
+ u [1 :, :- 1 ] * u [1 :, :- 1 ]
16
+ + u [:- 1 , :- 1 ] * u [:- 1 , :- 1 ]
17
+ + v [:- 1 , 1 :] * v [:- 1 , 1 :]
18
+ + v [:- 1 , :- 1 ] * v [:- 1 , :- 1 ]
19
+ )
20
+ return cu , cv , z , h
21
+ def update_u_v_p_numpy (u ,v ,p ,cu ,cv ,h ,z ,tdts8 ,tdtsdx ,tdtsdy ):
22
+ unew = np .zeros_like (u )
23
+ vnew = np .zeros_like (v )
24
+ pnew = np .zeros_like (u )
25
+ unew [1 :,:- 1 ] = (u [1 :,:- 1 ] + tdts8 * (z [1 :,1 :]+ z [1 :,:- 1 ]) * (cv [1 :,1 :]+ cv [1 :,:- 1 ] + cv [:- 1 ,1 :]+ cv [:- 1 ,:- 1 ])- tdtsdx * (h [1 :,:- 1 ]- h [:- 1 ,:- 1 ]))
26
+ vnew [:- 1 ,1 :] = (v [:- 1 ,1 :]- tdts8 * (z [1 :,1 :]+ z [:- 1 ,1 :])* (cu [1 :,1 :]+ cu [1 :,:- 1 ]+ cu [:- 1 ,1 :]+ cu [:- 1 ,:- 1 ])- tdtsdy * (h [:- 1 ,1 :]- h [:- 1 ,:- 1 ]))
27
+ pnew [:- 1 ,:- 1 ] = (p [:- 1 ,:- 1 ]- tdtsdx * (cu [1 :,:- 1 ]- cu [:- 1 ,:- 1 ])- tdtsdy * (cv [:- 1 ,1 :]- cv [:- 1 ,:- 1 ]))
28
+ return unew ,vnew ,pnew
29
+
4
30
def main ():
5
31
parser = argparse .ArgumentParser (description = "Shallow Water Model" )
6
32
parser .add_argument ('--M' , type = int , default = 64 , help = 'Number of points in the x direction' )
@@ -45,10 +71,10 @@ def main():
45
71
uold = np .zeros ((M_LEN , N_LEN ))
46
72
vold = np .zeros ((M_LEN , N_LEN ))
47
73
pold = np .zeros ((M_LEN , N_LEN ))
48
- cu = np .zeros ((M_LEN , N_LEN ))
49
- cv = np .zeros ((M_LEN , N_LEN ))
50
- z = np .zeros ((M_LEN , N_LEN ))
51
- h = np .zeros ((M_LEN , N_LEN ))
74
+ # cu = np.zeros((M_LEN, N_LEN))
75
+ # cv = np.zeros((M_LEN, N_LEN))
76
+ # z = np.zeros((M_LEN, N_LEN))
77
+ # h = np.zeros((M_LEN, N_LEN))
52
78
psi = np .zeros ((M_LEN , N_LEN ))
53
79
54
80
# Initial values of the stream function and p
@@ -108,6 +134,7 @@ def main():
108
134
if ncycle % 100 == 0 :
109
135
print ("cycle number " , ncycle )
110
136
# Calculate cu, cv, z, and h
137
+ '''
111
138
for i in range(1, M):
112
139
for j in range(N):
113
140
cu[i, j] = .5 * (p[i, j] + p[i - 1, j]) * u[i, j]
@@ -126,7 +153,8 @@ def main():
126
153
for j in range(N):
127
154
h[i, j] = p[i, j] + 0.25 * (u[i + 1, j] * u[i + 1, j] + u[i, j] * u[i, j] +
128
155
v[i, j + 1] * v[i, j + 1] + v[i, j] * v[i, j])
129
-
156
+ '''
157
+ cu ,cv ,z ,h = calculate_cu_cv_z_h_numpy (u ,v ,p ,fsdx ,fsdy )
130
158
# for i in range(M):
131
159
# for j in range(N):
132
160
# cu[i + 1, j] = .5 * (p[i + 1, j] + p[i, j]) * u[i + 1, j]
@@ -136,38 +164,27 @@ def main():
136
164
# ) / (p[i, j] + p[i + 1, j] + p[i + 1, j + 1] + p[i, j + 1])
137
165
# h[i, j] = p[i, j] + 0.25 * (u[i + 1, j] * u[i + 1, j] + u[i, j] * u[i, j] +
138
166
# v[i, j + 1] * v[i, j + 1] + v[i, j] * v[i, j])
139
-
167
+
168
+
169
+
140
170
# # Periodic Boundary conditions
141
- for j in range (N ):
142
- cu [0 , j ] = cu [M , j ]
143
- h [M , j ] = h [0 , j ]
144
- # for j in range(N):
145
- # cv[M, j + 1] = cv[0, j + 1]
146
- for j in range (1 , N ):
147
- cv [M , j ] = cv [0 , j ]
148
- # for j in range(N):
149
- # z[0,j + 1] = z[M, j + 1]
150
- for j in range (1 , N ):
151
- z [0 , j ] = z [M , j ]
152
-
171
+ cu [0 , :] = cu [M , :]
172
+ h [M , :] = h [0 , :]
173
+ cv [M , 1 :] = cv [0 , 1 :]
174
+ z [0 , 1 :] = z [M , 1 :]
153
175
154
- for i in range (M ):
155
- cv [i , 0 ] = cv [i , N ]
156
- h [i , N ] = h [i , 0 ]
157
- # for i in range(M):
158
- # cu[i + 1, N] = cu[i + 1, 0]
159
- for i in range (1 , M ):
160
- cu [i , N ] = cu [i , 0 ]
161
- # for i in range(M):
162
- # z[i + 1, N] = z[i + 1, 0]
163
- for i in range (1 , M ):
164
- z [i , N ] = z [i , 0 ]
165
-
176
+ cv [:, 0 ] = cv [:, N ]
177
+ h [:, N ] = h [:, 0 ]
178
+ cu [1 :, N ] = cu [1 :, 0 ]
179
+ z [1 :, N ] = z [1 :, 0 ]
166
180
167
- cu [0 , 0 ] = cu [0 , N ]
168
- cv [M , 0 ] = cv [0 , 0 ]
181
+ cu [0 , N ] = cu [M , 0 ]
182
+ cv [M , 0 ] = cv [0 , N ]
169
183
z [0 , 0 ] = z [M , N ]
170
184
h [M , N ] = h [0 , 0 ]
185
+
186
+
187
+
171
188
172
189
# Calclulate new values of u,v, and p
173
190
tdts8 = tdt / 8.
@@ -180,30 +197,42 @@ def main():
180
197
# (cv[i + 1, j + 1] + cv[i + 1, j] + cv[i, j + 1] + cv[i, j]) -
181
198
# tdtsdx * (h[i + 1, j] - h[i, j])
182
199
# )
183
- for i in range (1 , M ):
184
- for j in range (N ):
185
- unew [i , j ] = (uold [i , j ] + tdts8 * (z [i , j + 1 ] + z [i , j ]) *
186
- (cv [i , j + 1 ] + cv [i , j ] + cv [i - 1 , j + 1 ] + cv [i - 1 , j ]) -
187
- tdtsdx * (h [i , j ] - h [i - 1 , j ])
188
- )
200
+ ## for i in range(1, M):
201
+ ## for j in range(N):
202
+ ## unew[i, j] = (uold[i, j] + tdts8 * (z[i, j + 1] + z[i, j]) *
203
+ ## (cv[i, j + 1] + cv[i, j] + cv[i - 1, j + 1] + cv[i - 1, j]) -
204
+ ## tdtsdx * (h[i, j] - h[i - 1, j])
205
+ ## )
189
206
# for i in range(M):
190
207
# for j in range(N):
191
208
# vnew[i, j + 1] = (vold[i, j + 1] - tdts8 * (z[i + 1, j + 1] + z[i, j + 1]) *
192
209
# (cu[i + 1, j + 1] + cu[i + 1, j] + cu[i, j + 1] + cu[i, j]) -
193
210
# tdtsdy * (h[i, j + 1] - h[i, j])
194
211
# )
195
- for i in range (M ):
196
- for j in range (1 , N ):
197
- vnew [i , j ] = (vold [i , j ] - tdts8 * (z [i + 1 , j ] + z [i , j ]) *
198
- (cu [i + 1 , j ] + cu [i + 1 , j - 1 ] + cu [i , j ] + cu [i , j - 1 ]) -
199
- tdtsdy * (h [i , j ] - h [i , j - 1 ])
200
- )
201
- for i in range (M ):
202
- for j in range (N ):
203
- pnew [i , j ] = (pold [i , j ] - tdtsdx * (cu [i + 1 , j ] - cu [i , j ]) -
204
- tdtsdy * (cv [i , j + 1 ] - cv [i , j ])
205
- )
206
-
212
+ ##for i in range(M):
213
+ ## for j in range(1, N):
214
+ ## vnew[i, j] = (vold[i, j] - tdts8 * (z[i + 1, j] + z[i, j]) *
215
+ ## (cu[i + 1, j] + cu[i + 1, j - 1] + cu[i, j] + cu[i, j - 1]) -
216
+ ## tdtsdy * (h[i, j] - h[i, j - 1])
217
+ ## )
218
+ ##for i in range(M):
219
+ ## for j in range(N):
220
+ ## pnew[i, j] = (pold[i, j] - tdtsdx * (cu[i + 1, j] - cu[i, j]) -
221
+ ## tdtsdy * (cv[i, j + 1] - cv[i, j])
222
+ ## )
223
+
224
+ unew ,vnew ,pnew = update_u_v_p_numpy (uold ,vold ,pold ,cu ,cv ,h ,z ,tdts8 ,tdtsdx ,tdtsdy )
225
+ unew [0 , :] = unew [M , :]
226
+ pnew [M , :] = pnew [0 , :]
227
+ vnew [M , 1 :] = vnew [0 , 1 :]
228
+ unew [1 :, N ] = unew [1 :, 0 ]
229
+ vnew [:, 0 ] = vnew [:, N ]
230
+ pnew [:, N ] = pnew [:, 0 ]
231
+
232
+ unew [0 , N ] = unew [M , 0 ]
233
+ vnew [M , 0 ] = vnew [0 , N ]
234
+ pnew [M , N ] = pnew [0 , 0 ]
235
+ '''
207
236
# Periodic Boundary conditions
208
237
for j in range(N):
209
238
unew[0, j] = unew[M, j]
@@ -220,10 +249,10 @@ def main():
220
249
for i in range(M):
221
250
vnew[i, 0] = vnew[i, N]
222
251
pnew[i, N] = pnew[i, 0]
223
-
224
252
unew[0, 0] = unew[0, N]
225
253
vnew[M, 0] = vnew[0, 0]
226
254
pnew[0, 0] = pnew[0, 0]
255
+ '''
227
256
228
257
# Print initial conditions
229
258
if L_OUT :
0 commit comments