137
138
139
140
141 integer, intent(in) :: ng, tile, model
142 integer, intent(in) :: LBi, UBi, LBj, UBj
143 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
144 integer, intent(in) :: kstp, krhs, knew
145# ifdef SOLVE3D
146 integer, intent(in) :: nstp, nnew
147# endif
148
149# ifdef ASSUMED_SHAPE
150# ifdef MASKING
151 real(r8), intent(in) :: rmask(LBi:,LBj:)
152 real(r8), intent(in) :: umask(LBi:,LBj:)
153 real(r8), intent(in) :: vmask(LBi:,LBj:)
154# endif
155# ifdef SOLVE3D
156 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
157 real(r8), intent(in) :: tl_Hz(LBi:,LBj:,:)
158 real(r8), intent(in) :: u(LBi:,LBj:,:,:)
159 real(r8), intent(in) :: v(LBi:,LBj:,:,:)
160# endif
161 real(r8), intent(in) :: ubar(LBi:,LBj:,:)
162 real(r8), intent(in) :: vbar(LBi:,LBj:,:)
163 real(r8), intent(in) :: zeta(LBi:,LBj:,:)
164 real(r8), intent(in) :: tl_zeta(LBi:,LBj:,:)
165# ifdef SOLVE3D
166 real(r8), intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
167 real(r8), intent(inout) :: tl_u(LBi:,LBj:,:,:)
168 real(r8), intent(inout) :: tl_v(LBi:,LBj:,:,:)
169# endif
170 real(r8), intent(inout) :: tl_ubar(LBi:,LBj:,:)
171 real(r8), intent(inout) :: tl_vbar(LBi:,LBj:,:)
172
173# else
174
175# ifdef MASKING
176 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
177 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
178 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
179# endif
180# ifdef SOLVE3D
181 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
182 real(r8), intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
183 real(r8), intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
184 real(r8), intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
185# endif
186 real(r8), intent(in) :: ubar(LBi:UBi,LBj:UBj,:)
187 real(r8), intent(in) :: vbar(LBi:UBi,LBj:UBj,:)
188 real(r8), intent(in) :: zeta(LBi:UBi,LBj:UBj,:)
189 real(r8), intent(in) :: tl_zeta(LBi:UBi,LBj:UBj,:)
190# ifdef SOLVE3D
191 real(r8), intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
192 real(r8), intent(inout) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
193 real(r8), intent(inout) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
194# endif
195 real(r8), intent(inout) :: tl_ubar(LBi:UBi,LBj:UBj,:)
196 real(r8), intent(inout) :: tl_vbar(LBi:UBi,LBj:UBj,:)
197# endif
198
199
200
201 integer :: i, ic, itrc, j, k
202
203 real(r8) :: cff1
204 real(r8) :: tl_cff1, tl_cff2
205
206# ifdef SOLVE3D
207 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: CF
208 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: DC
209
210 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: tl_CF
211 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: tl_DC
212# endif
213
214# include "set_bounds.h"
215
216# ifdef SOLVE3D
217
218
219
220
221
222 DO j=jstrb,jendb
223 DO k=1,n(ng)
224 DO i=istrm,iendb
225
226
227 tl_cff1=tl_u(i,j,k,nstp)
228# ifdef MASKING
229
230
231 tl_cff1=tl_cff1*umask(i,j)
232# endif
233
234
235 tl_u(i,j,k,nstp)=tl_cff1
236 END DO
237 END DO
238
239 IF (j.ge.jstrm) THEN
240 DO k=1,n(ng)
241 DO i=istrb,iendb
242
243
244 tl_cff2=tl_v(i,j,k,nstp)
245# ifdef MASKING
246
247
248 tl_cff2=tl_cff2*vmask(i,j)
249# endif
250
251
252 tl_v(i,j,k,nstp)=tl_cff2
253 END DO
254 END DO
255 END IF
256 END DO
257
258
259
260
261
262
263
264
265
266 CALL tl_u3dbc_tile (ng, tile, &
267 & lbi, ubi, lbj, ubj, n(ng), &
268 & imins, imaxs, jmins, jmaxs, &
269 & nstp, nstp, &
270 & tl_u)
271
272
273
274
275
276
277 CALL tl_v3dbc_tile (ng, tile, &
278 & lbi, ubi, lbj, ubj, n(ng), &
279 & imins, imaxs, jmins, jmaxs, &
280 & nstp, nstp, &
281 & tl_v)
282
283 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
284
285
286
287
288 CALL exchange_u3d_tile (ng, tile, &
289 & lbi, ubi, lbj, ubj, 1, n(ng), &
290 & tl_u(:,:,:,nstp))
291
292
293
294
295 CALL exchange_v3d_tile (ng, tile, &
296 & lbi, ubi, lbj, ubj, 1, n(ng), &
297 & tl_v(:,:,:,nstp))
298 END IF
299
300# ifdef DISTRIBUTE
301
302
303
304
305
306
307
308 CALL mp_exchange3d (ng, tile, model, 2, &
309 & lbi, ubi, lbj, ubj, 1, n(ng), &
310 & nghostpoints, &
311 & ewperiodic(ng), nsperiodic(ng), &
312 & tl_u(:,:,:,nstp), tl_v(:,:,:,nstp))
313# endif
314# endif
315
316# ifdef SOLVE3D
317
318
319
320
321
322
323
324
325
326# if defined STOCHASTIC_OPT && !defined STOCH_OPT_WHITE
327 IF (soinitial(ng)) THEN
328# endif
329 DO j=jstrb,jendb
330 DO i=istrm,iendb
331 dc(i,0)=0.0_r8
332 tl_dc(i,0)=0.0_r8
333 cf(i,0)=0.0_r8
334 tl_cf(i,0)=0.0_r8
335 END DO
336 DO k=1,n(ng)
337 DO i=istrm,iendb
338 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i-1,j,k))
339 tl_dc(i,k)=0.5_r8*(tl_hz(i,j,k)+tl_hz(i-1,j,k))
340 dc(i,0)=dc(i,0)+dc(i,k)
341 tl_dc(i,0)=tl_dc(i,0)+tl_dc(i,k)
342 cf(i,0)=cf(i,0)+dc(i,k)*u(i,j,k,nstp)
343 tl_cf(i,0)=tl_cf(i,0)+tl_dc(i,k)*u(i,j,k,nstp)+ &
344 & dc(i,k)*tl_u(i,j,k,nstp)
345 END DO
346 END DO
347 DO i=istrm,iendb
348 cff1=1.0_r8/dc(i,0)
349 tl_cff1=-cff1*cff1*tl_dc(i,0)
350
351
352 tl_cff2=tl_cf(i,0)*cff1+cf(i,0)*tl_cff1
353# ifdef MASKING
354
355
356 tl_cff2=tl_cff2*umask(i,j)
357# endif
358
359
360 tl_ubar(i,j,kstp)=tl_cff2
361 END DO
362
363 IF (j.ge.jstrm) THEN
364 DO i=istrb,iendb
365 dc(i,0)=0.0_r8
366 tl_dc(i,0)=0.0_r8
367 cf(i,0)=0.0_r8
368 tl_cf(i,0)=0.0_r8
369 END DO
370 DO k=1,n(ng)
371 DO i=istrb,iendb
372 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i,j-1,k))
373 tl_dc(i,k)=0.5_r8*(tl_hz(i,j,k)+tl_hz(i,j-1,k))
374 dc(i,0)=dc(i,0)+dc(i,k)
375 tl_dc(i,0)=tl_dc(i,0)+tl_dc(i,k)
376 cf(i,0)=cf(i,0)+dc(i,k)*v(i,j,k,nstp)
377 tl_cf(i,0)=tl_cf(i,0)+tl_dc(i,k)*v(i,j,k,nstp)+ &
378 & dc(i,k)*tl_v(i,j,k,nstp)
379 END DO
380 END DO
381 DO i=istrb,iendb
382 cff1=1.0_r8/dc(i,0)
383 tl_cff1=-cff1*cff1*tl_dc(i,0)
384
385
386 tl_cff2=tl_cf(i,0)*cff1+cf(i,0)*tl_cff1
387# ifdef MASKING
388
389
390 tl_cff2=tl_cff2*vmask(i,j)
391# endif
392
393
394 tl_vbar(i,j,kstp)=tl_cff2
395 END DO
396 END IF
397 END DO
398
399
400
401 IF (.not.(any(tl_lbc(:,isubar,ng)%radiation).or. &
402 & any(tl_lbc(:,isvbar,ng)%radiation).or. &
403 & any(tl_lbc(:,isubar,ng)%Flather).or. &
404 & any(tl_lbc(:,isvbar,ng)%Flather))) THEN
405
406
407
408
409
410
411 CALL tl_u2dbc_tile (ng, tile, &
412 & lbi, ubi, lbj, ubj, &
413 & imins, imaxs, jmins, jmaxs, &
414 & krhs, kstp, kstp, &
415 & ubar, vbar, zeta, &
416 & tl_ubar, tl_vbar, tl_zeta)
417
418
419
420
421
422
423 CALL tl_v2dbc_tile (ng, tile, &
424 & lbi, ubi, lbj, ubj, &
425 & imins, imaxs, jmins, jmaxs, &
426 & krhs, kstp, kstp, &
427 & ubar, vbar, zeta, &
428 & tl_ubar, tl_vbar, tl_zeta)
429 END IF
430
431 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
432
433
434
435
436 CALL exchange_u2d_tile (ng, tile, &
437 & lbi, ubi, lbj, ubj, &
438 & tl_ubar(:,:,kstp))
439
440
441
442
443 CALL exchange_v2d_tile (ng, tile, &
444 & lbi, ubi, lbj, ubj, &
445 & tl_vbar(:,:,kstp))
446 END IF
447
448# ifdef DISTRIBUTE
449
450
451
452
453
454
455
456 CALL mp_exchange2d (ng, tile, model, 2, &
457 & lbi, ubi, lbj, ubj, &
458 & nghostpoints, &
459 & ewperiodic(ng), nsperiodic(ng), &
460 & tl_ubar(:,:,kstp), tl_vbar(:,:,kstp))
461# endif
462
463# if defined STOCHASTIC_OPT && !defined STOCH_OPT_WHITE
464 END IF
465# endif
466
467# else
468
469
470
471
472
473 DO j=jstrb,jendb
474 DO i=istrm,iendb
475
476
477 tl_cff1=tl_ubar(i,j,kstp)
478# ifdef MASKING
479
480
481 tl_cff1=tl_cff1*umask(i,j)
482# endif
483
484
485 tl_ubar(i,j,kstp)=tl_cff1
486 END DO
487
488 IF (j.ge.jstrm) THEN
489 DO i=istrb,iendb
490
491
492 tl_cff2=tl_vbar(i,j,kstp)
493# ifdef MASKING
494
495
496 tl_cff2=tl_cff2*vmask(i,j)
497# endif
498
499
500 tl_vbar(i,j,kstp)=tl_cff2
501 END DO
502 END IF
503 END DO
504
505
506
507 IF (.not.(any(tl_lbc(:,isubar,ng)%radiation).or. &
508 & any(tl_lbc(:,isvbar,ng)%radiation).or. &
509 & any(tl_lbc(:,isubar,ng)%Flather).or. &
510 & any(tl_lbc(:,isvbar,ng)%Flather))) THEN
511
512
513
514
515
516
517 CALL tl_u2dbc_tile (ng, tile, &
518 & lbi, ubi, lbj, ubj, &
519 & imins, imaxs, jmins, jmaxs, &
520 & krhs, kstp, kstp, &
521 & ubar, vbar, zeta, &
522 & tl_ubar, tl_vbar, tl_zeta)
523
524
525
526
527
528
529 CALL tl_v2dbc_tile (ng, tile, &
530 & lbi, ubi, lbj, ubj, &
531 & imins, imaxs, jmins, jmaxs, &
532 & krhs, kstp, kstp, &
533 & ubar, vbar, zeta, &
534 & tl_ubar, tl_vbar, tl_zeta)
535 END IF
536
537 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
538
539
540
541
542 CALL exchange_u2d_tile (ng, tile, &
543 & lbi, ubi, lbj, ubj, &
544 & tl_ubar(:,:,kstp))
545
546
547
548
549 CALL exchange_v2d_tile (ng, tile, &
550 & lbi, ubi, lbj, ubj, &
551 & tl_vbar(:,:,kstp))
552 END IF
553
554# ifdef DISTRIBUTE
555
556
557
558
559
560
561
562 CALL mp_exchange2d (ng, tile, model, 2, &
563 & lbi, ubi, lbj, ubj, &
564 & nghostpoints, &
565 & ewperiodic(ng), nsperiodic(ng), &
566 & tl_ubar(:,:,kstp), tl_vbar(:,:,kstp))
567# endif
568# endif
569
570# ifdef SOLVE3D
571
572
573
574
575
576 ic=0
577 DO itrc=1,nt(ng)
578 IF (ltracerclm(itrc,ng).and.lnudgetclm(itrc,ng)) THEN
579 ic=ic+1
580 END IF
581 DO k=1,n(ng)
582 DO j=jstrb,jendb
583 DO i=istrb,iendb
584
585
586 tl_cff1=tl_t(i,j,k,nstp,itrc)
587# ifdef MASKING
588 tl_cff1=tl_cff1*rmask(i,j)
589# endif
590
591
592 tl_t(i,j,k,nstp,itrc)=tl_cff1
593 END DO
594 END DO
595 END DO
596
597
598
599
600
601
602
603
604
605 CALL tl_t3dbc_tile (ng, tile, itrc, ic, &
606 & lbi, ubi, lbj, ubj, n(ng), nt(ng), &
607 & imins, imaxs, jmins, jmaxs, &
608 & nstp, nstp, &
609 & tl_t)
610
611 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
612
613
614
615
616 CALL exchange_r3d_tile (ng, tile, &
617 & lbi, ubi, lbj, ubj, 1, n(ng), &
618 & tl_t(:,:,:,nstp,itrc))
619 END IF
620 END DO
621
622# ifdef DISTRIBUTE
623
624
625
626
627
628
629
630 CALL mp_exchange4d (ng, tile, model, 1, &
631 & lbi, ubi, lbj, ubj, 1, n(ng), 1, nt(ng), &
632 & nghostpoints, &
633 & ewperiodic(ng), nsperiodic(ng), &
634 & tl_t(:,:,:,nstp,:))
635# endif
636# endif
637
638 RETURN