Skip to content

Commit bebb35e

Browse files
committed
omp parallelism of [get_grid_point_tendencies]
1 parent 1a5caf2 commit bebb35e

File tree

1 file changed

+88
-2
lines changed

1 file changed

+88
-2
lines changed

source/tendencies.f90

+88-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ subroutine get_grid_point_tendencies(vordt, divdt, tdt, psdt, trdt, j1, j2)
8585
! =========================================================================
8686
! Convert prognostics to grid point space
8787
! =========================================================================
88-
88+
89+
90+
!$omp parallel shared(vorg, divg, tg, trg, ug, vg, coriol)
91+
!$omp do private(k, itr, i, j, dumc)
8992
do k = 1, kx
9093
vorg(:,:,k) = spec_to_grid(vor(:,:,k,j2), 1)
9194
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)
105108
end do
106109
end do
107110
end do
111+
!$omp end do
108112

113+
!$omp single
109114
umean(:,:) = 0.0
110115
vmean(:,:) = 0.0
111116
dmean(:,:) = 0.0
117+
!$omp end single
112118

119+
!$omp do reduction(+:umean, vmean, dmean) private(k)
113120
do k = 1, kx
114121
umean(:,:) = umean(:,:) + ug(:,:,k) * dhs(k)
115122
vmean(:,:) = vmean(:,:) + vg(:,:,k) * dhs(k)
116123
dmean(:,:) = dmean(:,:) + divg(:,:,k) * dhs(k)
117124
end do
125+
!$omp end do nowait
118126

119127
! Compute tendency of log(surface pressure)
120128
! ps(1,1,j2)=zero
129+
130+
!$omp single
121131
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
122136
px = spec_to_grid(dumc(:,:,1), 2)
123137
py = spec_to_grid(dumc(:,:,2), 2)
138+
!$omp end single
124139

140+
!$omp taskwait
141+
142+
!$omp single
125143
psdt = grid_to_spec(-umean*px - vmean*py)
126144
psdt(1,1) = (0.0, 0.0)
145+
!$omp end single
127146

128147
! 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
129168
sigdt(:,:,1) = 0.0
130169
sigdt(:,:,kx+1) = 0.0
131170
sigm(:,:,1) = 0.0
132171
sigm(:,:,kx+1) = 0.0
172+
#endif
133173

134174
! (The following combination of terms is utilized later in the
135175
! temperature equation)
176+
177+
!$omp do private(k)
136178
do k = 1, kx
137179
puv(:,:,k) = (ug(:,:,k) - umean) * px + (vg(:,:,k) - vmean) * py
138180
end do
181+
!$omp end do
139182

183+
!!! cannot be par due to dependencies, but can be async
184+
!$omp single
140185
do k = 1, kx
141186
sigdt(:,:,k+1) = sigdt(:,:,k) - dhs(k)*(puv(:,:,k)+divg(:,:,k)-dmean)
142187
sigm(:,:,k+1) = sigm(:,:,k) - dhs(k)*puv(:,:,k)
143188
end do
189+
!$omp end single nowait
144190

145191
! Subtract part of temperature field that is used as reference for
146192
! implicit terms
193+
194+
!$omp do private(k)
147195
do k = 1, kx
148196
tgg(:,:,k) = tg(:,:,k) - tref(k)
149197
end do
198+
!$omp end do
150199

151200
! 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
152212
temp(:,:,1) = 0.0
153213
temp(:,:,kx+1) = 0.0
214+
#endif
154215

216+
!$omp do private(k)
155217
do k = 2, kx
156218
temp(:,:,k) = sigdt(:,:,k) * (ug(:,:,k) - ug(:,:,k-1))
157219
end do
158-
220+
!$omp end do
221+
222+
!$omp do private(k)
159223
do k = 1, kx
160224
utend(:,:,k) = vg(:,:,k) * vorg(:,:,k) - tgg(:,:,k)*rgas*px &
161225
& - (temp(:,:,k+1) + temp(:,:,k))*dhsr(k)
162226
end do
227+
!$omp end do
163228

164229
! Meridional wind tendency
230+
231+
!$omp do private(k)
165232
do k = 2, kx
166233
temp(:,:,k) = sigdt(:,:,k) * (vg(:,:,k) - vg(:,:,k-1))
167234
end do
235+
!$omp end do
168236

237+
!$omp do private(k)
169238
do k = 1, kx
170239
vtend(:,:,k) = -ug(:,:,k)*vorg(:,:,k) - tgg(:,:,k)*rgas*py &
171240
& - (temp(:,:,k+1) + temp(:,:,k))*dhsr(k)
172241
end do
242+
!$omp end do
173243

174244
! Temperature tendency
245+
246+
!$omp do private(k)
175247
do k = 2, kx
176248
temp(:,:,k) = sigdt(:,:,k)*(tgg(:,:,k) - tgg(:,:,k-1)) &
177249
& + sigm(:,:,k)*(tref(k) - tref(k-1))
178250
end do
251+
!$omp end do
179252

253+
!$omp do private(k)
180254
do k = 1, kx
181255
ttend(:,:,k) = tgg(:,:,k)*divg(:,:,k) - (temp(:,:,k+1)+temp(:,:,k))*dhsr(k) &
182256
& + fsgr(k)*tgg(:,:,k)*(sigdt(:,:,k+1) + sigdt(:,:,k)) + tref3(k)*(sigm(:,:,k+1) &
183257
& + sigm(:,:,k)) + akap*(tg(:,:,k)*puv(:,:,k) - tgg(:,:,k)*dmean(:,:))
184258
end do
259+
!$omp end do
185260

186261
! Tracer tendency
262+
263+
!$omp do private(itr, k)
187264
do itr = 1, ntr
188265
do k = 2, kx
189266
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)
195272
trtend(:,:,k,itr) = trg(:,:,k,itr)*divg(:,:,k)-(temp(:,:,k+1) + temp(:,:,k))*dhsr(k)
196273
end do
197274
end do
275+
!$omp end do
276+
277+
!$omp end parallel
198278

199279
! =========================================================================
200280
! Compute physical tendencies
201281
! =========================================================================
202282

203283
phi = get_geopotential(t(:,:,:,j1), phis)
204284

285+
!!! TODO: make [get_physical_tendencies] multi-threaded and thread-safe
286+
205287
call get_physical_tendencies(vor(:,:,:,j1), div(:,:,:,j1), t(:,:,:,j1), tr(:,:,:,j1,1), &
206288
& phi, ps(:,:,j1), utend, vtend, ttend, trtend)
207289

208290
! =========================================================================
209291
! Convert tendencies to spectral space
210292
! =========================================================================
211293

294+
!$omp parallel default(shared) private(k, itr, dumc)
295+
!$omp do schedule(static)
212296
do k = 1, kx
213297
! Convert u and v tendencies to vor and div spectral tendencies
214298
! 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)
232316
trdt(:,:,k,itr) = trdt(:,:,k,itr) + grid_to_spec(trtend(:,:,k,itr))
233317
end do
234318
end do
319+
!$omp end do
320+
!$omp end parallel
235321
end subroutine
236322

237323
! Compute spectral tendencies of divergence, temperature and log(surface pressure)

0 commit comments

Comments
 (0)