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 rp_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 rp_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 DO j=jstrb,jendb
327 DO i=istrm,iendb
328 dc(i,0)=0.0_r8
329 tl_dc(i,0)=0.0_r8
330 cf(i,0)=0.0_r8
331 tl_cf(i,0)=0.0_r8
332 END DO
333 DO k=1,n(ng)
334 DO i=istrm,iendb
335 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i-1,j,k))
336 tl_dc(i,k)=0.5_r8*(tl_hz(i,j,k)+tl_hz(i-1,j,k))
337 dc(i,0)=dc(i,0)+dc(i,k)
338 tl_dc(i,0)=tl_dc(i,0)+tl_dc(i,k)
339 cf(i,0)=cf(i,0)+dc(i,k)*u(i,j,k,nstp)
340 tl_cf(i,0)=tl_cf(i,0)+tl_dc(i,k)*u(i,j,k,nstp)+ &
341 & dc(i,k)*tl_u(i,j,k,nstp)- &
342# ifdef TL_IOMS
343 & dc(i,k)*u(i,j,k,nstp)
344# endif
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# ifdef TL_IOMS
351 & 2.0_r8*cff1
352# endif
353
354
355 tl_cff2=tl_cf(i,0)*cff1+cf(i,0)*tl_cff1- &
356# ifdef TL_IOMS
357 & cf(i,0)*cff1
358# endif
359# ifdef MASKING
360
361
362 tl_cff2=tl_cff2*umask(i,j)
363# endif
364
365
366 tl_ubar(i,j,kstp)=tl_cff2
367 END DO
368
369 IF (j.ge.jstrm) THEN
370 DO i=istrb,iendb
371 dc(i,0)=0.0_r8
372 tl_dc(i,0)=0.0_r8
373 cf(i,0)=0.0_r8
374 tl_cf(i,0)=0.0_r8
375 END DO
376 DO k=1,n(ng)
377 DO i=istrb,iendb
378 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i,j-1,k))
379 tl_dc(i,k)=0.5_r8*(tl_hz(i,j,k)+tl_hz(i,j-1,k))
380 dc(i,0)=dc(i,0)+dc(i,k)
381 tl_dc(i,0)=tl_dc(i,0)+tl_dc(i,k)
382 cf(i,0)=cf(i,0)+dc(i,k)*v(i,j,k,nstp)
383 tl_cf(i,0)=tl_cf(i,0)+tl_dc(i,k)*v(i,j,k,nstp)+ &
384 & dc(i,k)*tl_v(i,j,k,nstp)- &
385# ifdef TL_IOMS
386 & dc(i,k)*v(i,j,k,nstp)
387# endif
388 END DO
389 END DO
390 DO i=istrb,iendb
391 cff1=1.0_r8/dc(i,0)
392 tl_cff1=-cff1*cff1*tl_dc(i,0)+ &
393# ifdef TL_IOMS
394 & 2.0_r8*cff1
395# endif
396
397
398 tl_cff2=tl_cf(i,0)*cff1+cf(i,0)*tl_cff1- &
399# ifdef TL_IOMS
400 & cf(i,0)*cff1
401# endif
402# ifdef MASKING
403
404
405 tl_cff2=tl_cff2*vmask(i,j)
406# endif
407
408
409 tl_vbar(i,j,kstp)=tl_cff2
410 END DO
411 END IF
412 END DO
413
414
415
416 IF (.not.(any(tl_lbc(:,isubar,ng)%radiation).or. &
417 & any(tl_lbc(:,isvbar,ng)%radiation).or. &
418 & any(tl_lbc(:,isubar,ng)%Flather).or. &
419 & any(tl_lbc(:,isvbar,ng)%Flather))) THEN
420
421
422
423
424
425
426 CALL rp_u2dbc_tile (ng, tile, &
427 & lbi, ubi, lbj, ubj, &
428 & imins, imaxs, jmins, jmaxs, &
429 & krhs, kstp, kstp, &
430 & ubar, vbar, zeta, &
431 & tl_ubar, tl_vbar, tl_zeta)
432
433
434
435
436
437
438 CALL rp_v2dbc_tile (ng, tile, &
439 & lbi, ubi, lbj, ubj, &
440 & imins, imaxs, jmins, jmaxs, &
441 & krhs, kstp, kstp, &
442 & ubar, vbar, zeta, &
443 & tl_ubar, tl_vbar, tl_zeta)
444 END IF
445
446 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
447
448
449
450
451 CALL exchange_u2d_tile (ng, tile, &
452 & lbi, ubi, lbj, ubj, &
453 & tl_ubar(:,:,kstp))
454
455
456
457
458 CALL exchange_v2d_tile (ng, tile, &
459 & lbi, ubi, lbj, ubj, &
460 & tl_vbar(:,:,kstp))
461 END IF
462
463# ifdef DISTRIBUTE
464
465
466
467
468
469
470
471 CALL mp_exchange2d (ng, tile, model, 2, &
472 & lbi, ubi, lbj, ubj, &
473 & nghostpoints, &
474 & ewperiodic(ng), nsperiodic(ng), &
475 & tl_ubar(:,:,kstp), tl_vbar(:,:,kstp))
476# endif
477
478# else
479
480
481
482
483
484 DO j=jstrb,jendb
485 DO i=istrm,iendb
486
487
488 tl_cff1=tl_ubar(i,j,kstp)
489# ifdef MASKING
490
491
492 tl_cff1=tl_cff1*umask(i,j)
493# endif
494
495
496 tl_ubar(i,j,kstp)=tl_cff1
497 END DO
498
499 IF (j.ge.jstrm) THEN
500 DO i=istrb,iendb
501
502
503 tl_cff2=tl_vbar(i,j,kstp)
504# ifdef MASKING
505
506
507 tl_cff2=tl_cff2*vmask(i,j)
508# endif
509
510
511 tl_vbar(i,j,kstp)=tl_cff2
512 END DO
513 END IF
514 END DO
515
516
517
518 IF (.not.(any(tl_lbc(:,isubar,ng)%radiation).or. &
519 & any(tl_lbc(:,isvbar,ng)%radiation).or. &
520 & any(tl_lbc(:,isubar,ng)%Flather).or. &
521 & any(tl_lbc(:,isvbar,ng)%Flather))) THEN
522
523
524
525
526
527
528 CALL rp_u2dbc_tile (ng, tile, &
529 & lbi, ubi, lbj, ubj, &
530 & imins, imaxs, jmins, jmaxs, &
531 & krhs, kstp, kstp, &
532 & ubar, vbar, zeta, &
533 & tl_ubar, tl_vbar, tl_zeta)
534
535
536
537
538
539
540 CALL rp_v2dbc_tile (ng, tile, &
541 & lbi, ubi, lbj, ubj, &
542 & imins, imaxs, jmins, jmaxs, &
543 & krhs, kstp, kstp, &
544 & ubar, vbar, zeta, &
545 & tl_ubar, tl_vbar, tl_zeta)
546 END IF
547
548 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
549
550
551
552
553 CALL exchange_u2d_tile (ng, tile, &
554 & lbi, ubi, lbj, ubj, &
555 & tl_ubar(:,:,kstp))
556
557
558
559
560 CALL exchange_v2d_tile (ng, tile, &
561 & lbi, ubi, lbj, ubj, &
562 & tl_vbar(:,:,kstp))
563 END IF
564
565# ifdef DISTRIBUTE
566
567
568
569
570
571
572
573 CALL mp_exchange2d (ng, tile, model, 2, &
574 & lbi, ubi, lbj, ubj, &
575 & nghostpoints, &
576 & ewperiodic(ng), nsperiodic(ng), &
577 & tl_ubar(:,:,kstp), tl_vbar(:,:,kstp))
578# endif
579# endif
580
581# ifdef SOLVE3D
582
583
584
585
586
587 ic=0
588 DO itrc=1,nt(ng)
589 IF (ltracerclm(itrc,ng).and.lnudgetclm(itrc,ng)) THEN
590 ic=ic+1
591 END IF
592 DO k=1,n(ng)
593 DO j=jstrb,jendb
594 DO i=istrb,iendb
595
596
597 tl_cff1=tl_t(i,j,k,nstp,itrc)
598# ifdef MASKING
599 tl_cff1=tl_cff1*rmask(i,j)
600# endif
601
602
603 tl_t(i,j,k,nstp,itrc)=tl_cff1
604 END DO
605 END DO
606 END DO
607
608
609
610
611
612
613
614
615
616 CALL rp_t3dbc_tile (ng, tile, itrc, ic, &
617 & lbi, ubi, lbj, ubj, n(ng), nt(ng), &
618 & imins, imaxs, jmins, jmaxs, &
619 & nstp, nstp, &
620 & tl_t)
621
622 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
623
624
625
626
627 CALL exchange_r3d_tile (ng, tile, &
628 & lbi, ubi, lbj, ubj, 1, n(ng), &
629 & tl_t(:,:,:,nstp,itrc))
630 END IF
631 END DO
632
633# ifdef DISTRIBUTE
634
635
636
637
638
639
640
641 CALL mp_exchange4d (ng, tile, model, 1, &
642 & lbi, ubi, lbj, ubj, 1, n(ng), 1, nt(ng), &
643 & nghostpoints, &
644 & ewperiodic(ng), nsperiodic(ng), &
645 & tl_t(:,:,:,nstp,:))
646# endif
647# endif
648
649 RETURN