79
80
83
87# ifdef DISTRIBUTE
89# endif
90
91
92
93 integer, intent(in) :: ng, tile
94 integer, intent(in) :: LBi, UBi, LBj, UBj
95 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
96 integer, intent(in) :: Ninp
97
98# ifdef ASSUMED_SHAPE
99 real(r8), intent(in) :: pm(LBi:,LBj:)
100 real(r8), intent(in) :: pn(LBi:,LBj:)
101 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
102 real(r8), intent(in) :: z_w(LBi:,LBj:,0:)
103 real(r8), intent(in) :: DU_avg1(LBi:,LBj:)
104 real(r8), intent(in) :: DV_avg1(LBi:,LBj:)
105 real(r8), intent(in) :: u(LBi:,LBj:,:,:)
106 real(r8), intent(in) :: v(LBi:,LBj:,:,:)
107 real(r8), intent(in) :: W(LBi:,LBj:,0:)
108 real(r8), intent(inout) :: ad_z_r(LBi:,LBj:,:)
109 real(r8), intent(inout) :: ad_z_w(LBi:,LBj:,0:)
110 real(r8), intent(inout) :: ad_DU_avg1(LBi:,LBj:)
111 real(r8), intent(inout) :: ad_DV_avg1(LBi:,LBj:)
112 real(r8), intent(inout) :: ad_u(LBi:,LBj:,:,:)
113 real(r8), intent(inout) :: ad_v(LBi:,LBj:,:,:)
114 real(r8), intent(inout) :: ad_W(LBi:,LBj:,0:)
115 real(r8), intent(inout) :: ad_wvel(LBi:,LBj:,0:)
116# else
117 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
118 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
119 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
120 real(r8), intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
121 real(r8), intent(in) :: DU_avg1(LBi:UBi,LBj:UBj)
122 real(r8), intent(in) :: DV_avg1(LBi:UBi,LBj:UBj)
123 real(r8), intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
124 real(r8), intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
125 real(r8), intent(in) :: W(LBi:UBi,LBj:UBj,0:N(ng))
126 real(r8), intent(inout) :: ad_z_r(LBi:UBi,LBj:UBj,N(ng))
127 real(r8), intent(inout) :: ad_z_w(LBi:UBi,LBj:UBj,0:N(ng))
128 real(r8), intent(inout) :: ad_DU_avg1(LBi:UBi,LBj:UBj)
129 real(r8), intent(inout) :: ad_DV_avg1(LBi:UBi,LBj:UBj)
130 real(r8), intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
131 real(r8), intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
132 real(r8), intent(inout) :: ad_W(LBi:UBi,LBj:UBj,0:N(ng))
133 real(r8), intent(inout) :: ad_wvel(LBi:UBi,LBj:UBj,0:N(ng))
134# endif
135
136
137
138
139 integer :: i, j, k
140
141 real(r8) :: cff1, cff2, cff3, cff4, cff5, slope , ad_slope
142 real(r8) :: adfac, adfac1, adfac2, adfac3
143
144 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: vert
145 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: ad_vert
146
147 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: wrk
148 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_wrk
149
150# include "set_bounds.h"
151
152
153
154
155
156# ifdef DISTRIBUTE
158 & lbi, ubi, lbj, ubj, 0,
n(ng), &
161 & ad_wvel)
162# endif
163
164
165
167 & lbi, ubi, lbj, ubj, 0,
n(ng), &
168 & ad_wvel)
169
170
171
172 ad_slope=0.0_r8
173
174 DO j=jmins,jmaxs
175 DO i=imins,imaxs
176 ad_wrk(i,j)=0.0_r8
177 END DO
178 END DO
180 DO j=jmins,jmaxs
181 DO i=imins,imaxs
182 ad_vert(i,j,k)=0.0_r8
183 END DO
184 END DO
185 END DO
186
187
188
190 DO j=jstr,jend
191 DO i=istr,iend+1
192 wrk(i,j)=u(i,j,k,ninp)*(z_r(i,j,k)-z_r(i-1,j,k))* &
193 & (pm(i-1,j)+pm(i,j))
194 END DO
195 DO i=istr,iend
196 vert(i,j,k)=0.25_r8*(wrk(i,j)+wrk(i+1,j))
197 END DO
198 END DO
199 DO j=jstr,jend+1
200 DO i=istr,iend
201 wrk(i,j)=v(i,j,k,ninp)*(z_r(i,j,k)-z_r(i,j-1,k))* &
202 & (pn(i,j-1)+pn(i,j))
203 END DO
204 END DO
205 DO j=jstr,jend
206 DO i=istr,iend
207 vert(i,j,k)=vert(i,j,k)+0.25_r8*(wrk(i,j)+wrk(i,j+1))
208 END DO
209 END DO
210 END DO
211
212 cff1=3.0_r8/8.0_r8
213 cff2=3.0_r8/4.0_r8
214 cff3=1.0_r8/8.0_r8
215 cff4=9.0_r8/16.0_r8
216 cff5=1.0_r8/16.0_r8
217
218 j_loop : DO j=jstr,jend
219 DO i=istr,iend
220 wrk(i,j)=(du_avg1(i,j)-du_avg1(i+1,j)+ &
221 & dv_avg1(i,j)-dv_avg1(i,j+1))/ &
222 & (z_w(i,j,
n(ng))-z_w(i,j,0))
223 END DO
224 DO i=istr,iend
225 slope=(z_w(i,j,
n(ng))-z_r(i,j,
n(ng) ))/ &
226 & (z_r(i,j,
n(ng))-z_r(i,j,
n(ng)-1))
227
228
229
230
231
232
233
234
235
236
237 adfac=pm(i,j)*pn(i,j)*ad_wvel(i,j,
n(ng)-1)
238 adfac1=wrk(i,j)*adfac
239 ad_w(i,j,
n(ng)-1)=ad_w(i,j,
n(ng)-1)+adfac
240 ad_wrk(i,j)=ad_wrk(i,j)+(z_w(i,j,
n(ng)-1)-z_w(i,j,0))*adfac
241 ad_z_w(i,j,
n(ng)-1)=ad_z_w(i,j,
n(ng)-1)+adfac1
242 ad_z_w(i,j,0)=ad_z_w(i,j,0)-adfac1
243 ad_vert(i,j,
n(ng) )=ad_vert(i,j,
n(ng))+ &
244 & cff1*ad_wvel(i,j,
n(ng)-1)
245 ad_vert(i,j,
n(ng)-1)=ad_vert(i,j,
n(ng)-1)+ &
246 & cff2*ad_wvel(i,j,
n(ng)-1)
247 ad_vert(i,j,
n(ng)-2)=ad_vert(i,j,
n(ng)-2)- &
248 & cff3*ad_wvel(i,j,
n(ng)-1)
249 ad_wvel(i,j,
n(ng)-1)=0.0_r8
250
251
252
253
254
255
256
257
258
259
260
261
262
263 adfac=pm(i,j)*pn(i,j)*ad_wvel(i,j,
n(ng))
264 adfac1=wrk(i,j)*adfac
265 adfac2=cff1*ad_wvel(i,j,
n(ng))
266 adfac3=slope*adfac2
267 ad_wrk(i,j)=ad_wrk(i,j)+(z_w(i,j,
n(ng))-z_w(i,j,0))*adfac
268 ad_z_w(i,j,
n(ng))=ad_z_w(i,j,
n(ng))+adfac1
269 ad_z_w(i,j,0 )=ad_z_w(i,j,0 )-adfac1
270 ad_vert(i,j,
n(ng))=ad_vert(i,j,
n(ng))+adfac2
271 ad_slope=ad_slope+ &
272 & (vert(i,j,
n(ng) )-vert(i,j,
n(ng)-1))*adfac2
273 ad_vert(i,j,
n(ng) )=ad_vert(i,j,
n(ng) )+ &
274 & adfac3+cff2*ad_wvel(i,j,
n(ng))
275 ad_vert(i,j,
n(ng)-1)=ad_vert(i,j,
n(ng)-1)- &
276 & adfac3-cff3*ad_wvel(i,j,
n(ng))
277 ad_wvel(i,j,
n(ng))=0.0_r8
278
279
280
281
282
283 adfac1=ad_slope/(z_r(i,j,
n(ng))-z_r(i,j,
n(ng)-1))
284 adfac2=slope*adfac1
285 ad_z_w(i,j,
n(ng))=ad_z_w(i,j,
n(ng))+adfac1
286 ad_z_r(i,j,
n(ng) )=ad_z_r(i,j,
n(ng) )-adfac1-adfac2
287 ad_z_r(i,j,
n(ng)-1)=ad_z_r(i,j,
n(ng)-1)+adfac2
288 ad_slope=0.0_r8
289 END DO
291 DO i=istr,iend
292
293
294
295
296
297
298
299 adfac=pm(i,j)*pn(i,j)*ad_wvel(i,j,k)
300 adfac1=wrk(i,j)*adfac
301 adfac2=cff4*ad_wvel(i,j,k)
302 adfac3=cff5*ad_wvel(i,j,k)
303 ad_w(i,j,k)=ad_w(i,j,k)+adfac
304 ad_wrk(i,j)=ad_wrk(i,j)+(z_w(i,j,k)-z_w(i,j,0))*adfac
305 ad_z_w(i,j,k)=ad_z_w(i,j,k)+adfac1
306 ad_z_w(i,j,0)=ad_z_w(i,j,0)-adfac1
307 ad_vert(i,j,k )=ad_vert(i,j,k )+adfac2
308 ad_vert(i,j,k+1)=ad_vert(i,j,k+1)+adfac2
309 ad_vert(i,j,k-1)=ad_vert(i,j,k-1)-adfac3
310 ad_vert(i,j,k+2)=ad_vert(i,j,k+2)-adfac3
311 ad_wvel(i,j,k)=0.0_r8
312 END DO
313 END DO
314 DO i=istr,iend
315 slope=(z_r(i,j,1)-z_w(i,j,0))/ &
316 & (z_r(i,j,2)-z_r(i,j,1))
317
318
319
320
321
322
323
324
325 adfac=pm(i,j)*pn(i,j)*ad_wvel(i,j,1)
326 adfac1=wrk(i,j)*adfac
327 ad_w(i,j,1)=ad_w(i,j,1)+adfac
328 ad_wrk(i,j)=ad_wrk(i,j)+(z_w(i,j,1)-z_w(i,j,0))*adfac
329 ad_z_w(i,j,1)=ad_z_w(i,j,1)+adfac1
330 ad_z_w(i,j,0)=ad_z_w(i,j,0)-adfac1
331 ad_vert(i,j,1)=ad_vert(i,j,1)+cff1*ad_wvel(i,j,1)
332 ad_vert(i,j,2)=ad_vert(i,j,2)+cff2*ad_wvel(i,j,1)
333 ad_vert(i,j,3)=ad_vert(i,j,3)-cff3*ad_wvel(i,j,1)
334 ad_wvel(i,j,1)=0.0_r8
335
336
337
338
339
340
341
342
343 adfac=cff1*ad_wvel(i,j,0)
344 adfac1=slope*adfac
345 ad_vert(i,j,1)=ad_vert(i,j,1)+adfac
346 ad_slope=ad_slope-(vert(i,j,2)-vert(i,j,1))*adfac
347 ad_vert(i,j,2)=ad_vert(i,j,2)-adfac1
348 ad_vert(i,j,1)=ad_vert(i,j,1)+adfac1
349 ad_vert(i,j,1)=ad_vert(i,j,1)+cff2*ad_wvel(i,j,0)
350 ad_vert(i,j,2)=ad_vert(i,j,2)-cff3*ad_wvel(i,j,0)
351 ad_wvel(i,j,0)=0.0_r8
352
353
354
355
356
357 adfac=ad_slope/(z_r(i,j,2)-z_r(i,j,1))
358 adfac1=slope*adfac
359 ad_z_r(i,j,1)=ad_z_r(i,j,1)+adfac
360 ad_z_w(i,j,0)=ad_z_w(i,j,0)-adfac
361 ad_z_r(i,j,2)=ad_z_r(i,j,2)-adfac1
362 ad_z_r(i,j,1)=ad_z_r(i,j,1)+adfac1
363 ad_slope=0.0_r8
364 END DO
365 DO i=istr,iend
366
367
368
369
370
371
372 adfac=ad_wrk(i,j)/(z_w(i,j,
n(ng))-z_w(i,j,0))
373 adfac1=wrk(i,j)*adfac
374 ad_du_avg1(i ,j)=ad_du_avg1(i ,j)+adfac
375 ad_du_avg1(i+1,j)=ad_du_avg1(i+1,j)-adfac
376 ad_dv_avg1(i,j )=ad_dv_avg1(i,j )+adfac
377 ad_dv_avg1(i,j+1)=ad_dv_avg1(i,j+1)-adfac
378 ad_z_w(i,j,
n(ng))=ad_z_w(i,j,
n(ng))-adfac1
379 ad_z_w(i,j,0)=ad_z_w(i,j,0)+adfac1
380 ad_wrk(i,j)=0.0_r8
381 END DO
382
383 END DO j_loop
385 DO j=jstr,jend
386 DO i=istr,iend
387
388
389
390 adfac=0.25_r8*ad_vert(i,j,k)
391 ad_wrk(i,j )=ad_wrk(i,j )+adfac
392 ad_wrk(i,j+1)=ad_wrk(i,j+1)+adfac
393 END DO
394 END DO
395 DO j=jstr,jend+1
396 DO i=istr,iend
397
398
399
400
401 adfac=(pn(i,j-1)+pn(i,j))*ad_wrk(i,j)
402 adfac1=v(i,j,k,ninp)*adfac
403 ad_v(i,j,k,ninp)=ad_v(i,j,k,ninp)+ &
404 & (z_r(i,j,k)-z_r(i,j-1,k))*adfac
405 ad_z_r(i,j ,k)=ad_z_r(i,j ,k)+adfac1
406 ad_z_r(i,j-1,k)=ad_z_r(i,j-1,k)-adfac1
407 ad_wrk(i,j)=0.0_r8
408 END DO
409 END DO
410 DO j=jstr,jend
411 DO i=istr,iend
412
413
414 adfac=0.25_r8*ad_vert(i,j,k)
415 ad_wrk(i ,j)=ad_wrk(i ,j)+adfac
416 ad_wrk(i+1,j)=ad_wrk(i+1,j)+adfac
417 ad_vert(i,j,k)=0.0_r8
418 END DO
419 DO i=istr,iend+1
420
421
422
423
424 adfac=(pm(i-1,j)+pm(i,j))*ad_wrk(i,j)
425 adfac1=u(i,j,k,ninp)*adfac
426 ad_u(i,j,k,ninp)=ad_u(i,j,k,ninp)+ &
427 & (z_r(i,j,k)-z_r(i-1,j,k))*adfac
428 ad_z_r(i ,j,k)=ad_z_r(i ,j,k)+adfac1
429 ad_z_r(i-1,j,k)=ad_z_r(i-1,j,k)-adfac1
430 ad_wrk(i,j)=0.0_r8
431 END DO
432 END DO
433 END DO
434
435
436
437# ifdef DISTRIBUTE
439 & lbi, ubi, lbj, ubj, &
442 & ad_du_avg1, ad_dv_avg1)
443# endif
444
447 & lbi, ubi, lbj, ubj, &
448 & ad_du_avg1)
450 & lbi, ubi, lbj, ubj, &
451 & ad_dv_avg1)
452 END IF
453
454 RETURN
subroutine ad_bc_w3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)
subroutine ad_exchange_u2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_v2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine bc_w3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
integer, dimension(:), allocatable n
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
subroutine ad_mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine ad_mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)