@@ -85,7 +85,10 @@ subroutine get_grid_point_tendencies(vordt, divdt, tdt, psdt, trdt, j1, j2)
85
85
! =========================================================================
86
86
! Convert prognostics to grid point space
87
87
! =========================================================================
88
-
88
+
89
+
90
+ ! $omp parallel shared(vorg, divg, tg, trg, ug, vg, coriol)
91
+ ! $omp do private(k, itr, i, j, dumc)
89
92
do k = 1 , kx
90
93
vorg(:,:,k) = spec_to_grid(vor(:,:,k,j2), 1 )
91
94
divg(:,:,k) = spec_to_grid(div(:,:,k,j2), 1 )
@@ -105,85 +108,159 @@ subroutine get_grid_point_tendencies(vordt, divdt, tdt, psdt, trdt, j1, j2)
105
108
end do
106
109
end do
107
110
end do
111
+ ! $omp end do
108
112
113
+ ! $omp single
109
114
umean(:,:) = 0.0
110
115
vmean(:,:) = 0.0
111
116
dmean(:,:) = 0.0
117
+ ! $omp end single
112
118
119
+ ! $omp do reduction(+:umean, vmean, dmean) private(k)
113
120
do k = 1 , kx
114
121
umean(:,:) = umean(:,:) + ug(:,:,k) * dhs(k)
115
122
vmean(:,:) = vmean(:,:) + vg(:,:,k) * dhs(k)
116
123
dmean(:,:) = dmean(:,:) + divg(:,:,k) * dhs(k)
117
124
end do
125
+ ! $omp end do nowait
118
126
119
127
! Compute tendency of log(surface pressure)
120
128
! ps(1,1,j2)=zero
129
+
130
+ ! $omp single
121
131
call grad(ps(:,:,j2), dumc(:,:,1 ), dumc(:,:,2 ))
132
+ ! $omp end single
133
+
134
+ ! !! TODO: make [spec_to_grid] -> [legendre_inv] thread-safe
135
+ ! $omp single
122
136
px = spec_to_grid(dumc(:,:,1 ), 2 )
123
137
py = spec_to_grid(dumc(:,:,2 ), 2 )
138
+ ! $omp end single
124
139
140
+ ! $omp taskwait
141
+
142
+ ! $omp single
125
143
psdt = grid_to_spec(- umean* px - vmean* py)
126
144
psdt(1 ,1 ) = (0.0 , 0.0 )
145
+ ! $omp end single
127
146
128
147
! Compute "vertical" velocity
148
+
149
+ #ifdef _OPENMP
150
+ ! $omp single
151
+ ! $omp task
152
+ sigdt(:,:,1 ) = 0.0
153
+ ! $omp end task
154
+
155
+ ! $omp task
156
+ sigdt(:,:,kx+1 ) = 0.0
157
+ ! $omp end task
158
+
159
+ ! $omp task
160
+ sigm(:,:,1 ) = 0.0
161
+ ! $omp end task
162
+
163
+ ! $omp task
164
+ sigm(:,:,kx+1 ) = 0.0
165
+ ! $omp end task
166
+ ! $omp end single
167
+ #else
129
168
sigdt(:,:,1 ) = 0.0
130
169
sigdt(:,:,kx+1 ) = 0.0
131
170
sigm(:,:,1 ) = 0.0
132
171
sigm(:,:,kx+1 ) = 0.0
172
+ #endif
133
173
134
174
! (The following combination of terms is utilized later in the
135
175
! temperature equation)
176
+
177
+ ! $omp do private(k)
136
178
do k = 1 , kx
137
179
puv(:,:,k) = (ug(:,:,k) - umean) * px + (vg(:,:,k) - vmean) * py
138
180
end do
181
+ ! $omp end do
139
182
183
+ ! !! cannot be par due to dependencies, but can be async
184
+ ! $omp single
140
185
do k = 1 , kx
141
186
sigdt(:,:,k+1 ) = sigdt(:,:,k) - dhs(k)* (puv(:,:,k)+ divg(:,:,k)- dmean)
142
187
sigm(:,:,k+1 ) = sigm(:,:,k) - dhs(k)* puv(:,:,k)
143
188
end do
189
+ ! $omp end single nowait
144
190
145
191
! Subtract part of temperature field that is used as reference for
146
192
! implicit terms
193
+
194
+ ! $omp do private(k)
147
195
do k = 1 , kx
148
196
tgg(:,:,k) = tg(:,:,k) - tref(k)
149
197
end do
198
+ ! $omp end do
150
199
151
200
! Zonal wind tendency
201
+ #ifdef _OPENMP
202
+ ! $omp single
203
+ ! $omp task
204
+ temp(:,:,1 ) = 0.0
205
+ ! $omp end task
206
+
207
+ ! $omp task
208
+ temp(:,:,kx+1 ) = 0.0
209
+ ! $omp end task
210
+ ! $omp end single
211
+ #else
152
212
temp(:,:,1 ) = 0.0
153
213
temp(:,:,kx+1 ) = 0.0
214
+ #endif
154
215
216
+ ! $omp do private(k)
155
217
do k = 2 , kx
156
218
temp(:,:,k) = sigdt(:,:,k) * (ug(:,:,k) - ug(:,:,k-1 ))
157
219
end do
158
-
220
+ ! $omp end do
221
+
222
+ ! $omp do private(k)
159
223
do k = 1 , kx
160
224
utend(:,:,k) = vg(:,:,k) * vorg(:,:,k) - tgg(:,:,k)* rgas* px &
161
225
& - (temp(:,:,k+1 ) + temp(:,:,k))* dhsr(k)
162
226
end do
227
+ ! $omp end do
163
228
164
229
! Meridional wind tendency
230
+
231
+ ! $omp do private(k)
165
232
do k = 2 , kx
166
233
temp(:,:,k) = sigdt(:,:,k) * (vg(:,:,k) - vg(:,:,k-1 ))
167
234
end do
235
+ ! $omp end do
168
236
237
+ ! $omp do private(k)
169
238
do k = 1 , kx
170
239
vtend(:,:,k) = - ug(:,:,k)* vorg(:,:,k) - tgg(:,:,k)* rgas* py &
171
240
& - (temp(:,:,k+1 ) + temp(:,:,k))* dhsr(k)
172
241
end do
242
+ ! $omp end do
173
243
174
244
! Temperature tendency
245
+
246
+ ! $omp do private(k)
175
247
do k = 2 , kx
176
248
temp(:,:,k) = sigdt(:,:,k)* (tgg(:,:,k) - tgg(:,:,k-1 )) &
177
249
& + sigm(:,:,k)* (tref(k) - tref(k-1 ))
178
250
end do
251
+ ! $omp end do
179
252
253
+ ! $omp do private(k)
180
254
do k = 1 , kx
181
255
ttend(:,:,k) = tgg(:,:,k)* divg(:,:,k) - (temp(:,:,k+1 )+ temp(:,:,k))* dhsr(k) &
182
256
& + fsgr(k)* tgg(:,:,k)* (sigdt(:,:,k+1 ) + sigdt(:,:,k)) + tref3(k)* (sigm(:,:,k+1 ) &
183
257
& + sigm(:,:,k)) + akap* (tg(:,:,k)* puv(:,:,k) - tgg(:,:,k)* dmean(:,:))
184
258
end do
259
+ ! $omp end do
185
260
186
261
! Tracer tendency
262
+
263
+ ! $omp do private(itr, k)
187
264
do itr = 1 , ntr
188
265
do k = 2 , kx
189
266
temp(:,:,k) = sigdt(:,:,k)* (trg(:,:,k,itr) - trg(:,:,k-1 ,itr))
@@ -195,20 +272,27 @@ subroutine get_grid_point_tendencies(vordt, divdt, tdt, psdt, trdt, j1, j2)
195
272
trtend(:,:,k,itr) = trg(:,:,k,itr)* divg(:,:,k)- (temp(:,:,k+1 ) + temp(:,:,k))* dhsr(k)
196
273
end do
197
274
end do
275
+ ! $omp end do
276
+
277
+ ! $omp end parallel
198
278
199
279
! =========================================================================
200
280
! Compute physical tendencies
201
281
! =========================================================================
202
282
203
283
phi = get_geopotential(t(:,:,:,j1), phis)
204
284
285
+ ! !! TODO: make [get_physical_tendencies] multi-threaded and thread-safe
286
+
205
287
call get_physical_tendencies(vor(:,:,:,j1), div(:,:,:,j1), t(:,:,:,j1), tr(:,:,:,j1,1 ), &
206
288
& phi, ps(:,:,j1), utend, vtend, ttend, trtend)
207
289
208
290
! =========================================================================
209
291
! Convert tendencies to spectral space
210
292
! =========================================================================
211
293
294
+ ! $omp parallel default(shared) private(k, itr, dumc)
295
+ ! $omp do schedule(static)
212
296
do k = 1 , kx
213
297
! Convert u and v tendencies to vor and div spectral tendencies
214
298
! vdspec takes a grid u and a grid v and converts them to
@@ -232,6 +316,8 @@ subroutine get_grid_point_tendencies(vordt, divdt, tdt, psdt, trdt, j1, j2)
232
316
trdt(:,:,k,itr) = trdt(:,:,k,itr) + grid_to_spec(trtend(:,:,k,itr))
233
317
end do
234
318
end do
319
+ ! $omp end do
320
+ ! $omp end parallel
235
321
end subroutine
236
322
237
323
! Compute spectral tendencies of divergence, temperature and log(surface pressure)
0 commit comments