55
56
63
64
65
66 integer, intent(in) :: ng, tile, itrc
67 integer, intent(in) :: LBi, UBi, LBj, UBj, UBk, UBt
68 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
69 integer, intent(in) :: nstp, nout
70
71# ifdef ASSUMED_SHAPE
72 real(r8), intent(inout) :: t(LBi:,LBj:,:,:,:)
73# else
74 real(r8), intent(inout) :: t(LBi:UBi,LBj:UBj,UBk,3,UBt)
75# endif
76
77
78
79 integer :: i, j, k
80
81 real(r8), parameter :: eps =1.0e-20_r8
82
83 real(r8) :: Ce, Cx, cff, dTde, dTdt, dTdx
84 real(r8) :: obc_in, obc_out, tau
85
86 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: grad
87
88# include "set_bounds.h"
89
90
91
92
93
94 IF (
domain(ng)%Western_Edge(tile))
THEN
95
96
97
100 DO j=jstr,jend+1
101 grad(istr-1,j)=t(istr-1,j ,k,nstp,itrc)- &
102 & t(istr-1,j-1,k,nstp,itrc)
103# ifdef MASKING
104 grad(istr-1,j)=grad(istr-1,j)* &
105 &
grid(ng)%vmask(istr-1,j)
106# endif
107 grad(istr ,j)=t(istr ,j ,k,nstp,itrc)- &
108 & t(istr ,j-1,k,nstp,itrc)
109# ifdef MASKING
110 grad(istr ,j)=grad(istr ,j)* &
111 &
grid(ng)%vmask(istr ,j)
112# endif
113 END DO
114 DO j=jstr,jend
116 dtdt=t(istr,j,k,nstp,itrc)-t(istr ,j,k,nout,itrc)
117 dtdx=t(istr,j,k,nstp,itrc)-t(istr+1,j,k,nstp,itrc)
118
121 obc_out=
clima(ng)%Tnudgcof(istr-1,j,k,ic)
122 obc_in =
obcfac(ng)*obc_out
123 ELSE
126 END IF
127 IF ((dtdt*dtdx).lt.0.0_r8) THEN
128 tau=obc_in
129 ELSE
130 tau=obc_out
131 END IF
133 END IF
134
135 IF ((dtdt*dtdx).lt.0.0_r8) dtdt=0.0_r8
136 IF ((dtdt*(grad(istr,j )+ &
137 & grad(istr,j+1))).gt.0.0_r8) THEN
138 dtde=grad(istr,j )
139 ELSE
140 dtde=grad(istr,j+1)
141 END IF
142 cff=dtdt/max(dtdx*dtdx+dtde*dtde,eps)
143 cx=min(1.0_r8,cff*dtdx)
144# ifdef RADIATION_2D
145 ce=min(1.0_r8,max(cff*dtde,-1.0_r8))
146# else
147 ce=0.0_r8
148# endif
149# if defined CELERITY_WRITE && defined FORWARD_WRITE
152 boundary(ng)%t_west_C2(j,k,itrc)=cff
153# endif
154 t(istr-1,j,k,nout,itrc)=(1.0_r8-cx)* &
155 & t(istr-1,j,k,nstp,itrc)+ &
156 & cx*t(istr,j,k,nstp,itrc )- &
157 & max(ce,0.0_r8)* &
158 & grad(istr-1,j )- &
159 & min(ce,0.0_r8)* &
160 & grad(istr-1,j+1)
161
163 t(istr-1,j,k,nout,itrc)=t(istr-1,j,k,nout,itrc)+ &
164 & tau* &
166 & itrc)- &
167 & t(istr-1,j,k,nstp,itrc))
168 END IF
169# ifdef MASKING
170 t(istr-1,j,k,nout,itrc)=t(istr-1,j,k,nout,itrc)* &
171 &
grid(ng)%rmask(istr-1,j)
172# endif
173 END IF
174 END DO
175 END DO
176
177
178
181 DO j=jstr,jend
183 t(istr-1,j,k,nout,itrc)=
boundary(ng)%t_west(j,k,itrc)
184# ifdef MASKING
185 t(istr-1,j,k,nout,itrc)=t(istr-1,j,k,nout,itrc)* &
186 &
grid(ng)%rmask(istr-1,j)
187# endif
188 END IF
189 END DO
190 END DO
191
192
193
196 DO j=jstr,jend
198 t(istr-1,j,k,nout,itrc)=t(istr,j,k,nout,itrc)
199# ifdef MASKING
200 t(istr-1,j,k,nout,itrc)=t(istr-1,j,k,nout,itrc)* &
201 &
grid(ng)%rmask(istr-1,j)
202# endif
203 END IF
204 END DO
205 END DO
206
207
208
211 DO j=jstr,jend
213 t(istr-1,j,k,nout,itrc)=t(istr,j,k,nout,itrc)
214# ifdef MASKING
215 t(istr-1,j,k,nout,itrc)=t(istr-1,j,k,nout,itrc)* &
216 &
grid(ng)%rmask(istr-1,j)
217# endif
218 END IF
219 END DO
220 END DO
221 END IF
222 END IF
223
224
225
226
227
228 IF (
domain(ng)%Eastern_Edge(tile))
THEN
229
230
231
234 DO j=jstr,jend+1
235 grad(iend ,j)=t(iend ,j ,k,nstp,itrc)- &
236 & t(iend ,j-1,k,nstp,itrc)
237# ifdef MASKING
238 grad(iend ,j)=grad(iend ,j)* &
239 &
grid(ng)%vmask(iend ,j)
240# endif
241 grad(iend+1,j)=t(iend+1,j ,k,nstp,itrc)- &
242 & t(iend+1,j-1,k,nstp,itrc)
243# ifdef MASKING
244 grad(iend+1,j)=grad(iend+1,j)* &
245 &
grid(ng)%vmask(iend+1,j)
246# endif
247 END DO
248 DO j=jstr,jend
250 dtdt=t(iend,j,k,nstp,itrc)-t(iend ,j,k,nout,itrc)
251 dtdx=t(iend,j,k,nstp,itrc)-t(iend-1,j,k,nstp,itrc)
252
255 obc_out=
clima(ng)%Tnudgcof(iend+1,j,k,ic)
256 obc_in =
obcfac(ng)*obc_out
257 ELSE
260 END IF
261 IF ((dtdt*dtdx).lt.0.0_r8) THEN
262 tau=obc_in
263 ELSE
264 tau=obc_out
265 END IF
267 END IF
268
269 IF ((dtdt*dtdx).lt.0.0_r8) dtdt=0.0_r8
270 IF ((dtdt*(grad(iend,j )+ &
271 & grad(iend,j+1))).gt.0.0_r8) THEN
272 dtde=grad(iend,j )
273 ELSE
274 dtde=grad(iend,j+1)
275 END IF
276 cff=dtdt/max(dtdx*dtdx+dtde*dtde,eps)
277 cx=min(1.0_r8,cff*dtdx)
278# ifdef RADIATION_2D
279 ce=min(1.0_r8,max(cff*dtde,-1.0_r8))
280# else
281 ce=0.0_r8
282# endif
283# if defined CELERITY_WRITE && defined FORWARD_WRITE
286 boundary(ng)%t_east_C2(j,k,itrc)=cff
287# endif
288 t(iend+1,j,k,nout,itrc)=(1.0_r8-cx)* &
289 & t(iend+1,j,k,nstp,itrc)+ &
290 & cx*t(iend,j,k,nstp,itrc)- &
291 & max(ce,0.0_r8)* &
292 & grad(iend+1,j )- &
293 & min(ce,0.0_r8)* &
294 & grad(iend+1,j+1)
295
297 t(iend+1,j,k,nout,itrc)=t(iend+1,j,k,nout,itrc)+ &
298 & tau* &
300 & itrc)- &
301 & t(iend+1,j,k,nstp,itrc))
302 END IF
303# ifdef MASKING
304 t(iend+1,j,k,nout,itrc)=t(iend+1,j,k,nout,itrc)* &
305 &
grid(ng)%rmask(iend+1,j)
306# endif
307 END IF
308 END DO
309 END DO
310
311
312
315 DO j=jstr,jend
317 t(iend+1,j,k,nout,itrc)=
boundary(ng)%t_east(j,k,itrc)
318# ifdef MASKING
319 t(iend+1,j,k,nout,itrc)=t(iend+1,j,k,nout,itrc)* &
320 &
grid(ng)%rmask(iend+1,j)
321# endif
322 END IF
323 END DO
324 END DO
325
326
327
330 DO j=jstr,jend
332 t(iend+1,j,k,nout,itrc)=t(iend,j,k,nout,itrc)
333# ifdef MASKING
334 t(iend+1,j,k,nout,itrc)=t(iend+1,j,k,nout,itrc)* &
335 &
grid(ng)%rmask(iend+1,j)
336# endif
337 END IF
338 END DO
339 END DO
340
341
342
345 DO j=jstr,jend
347 t(iend+1,j,k,nout,itrc)=t(iend,j,k,nout,itrc)
348# ifdef MASKING
349 t(iend+1,j,k,nout,itrc)=t(iend+1,j,k,nout,itrc)* &
350 &
grid(ng)%rmask(iend+1,j)
351# endif
352 END IF
353 END DO
354 END DO
355 END IF
356 END IF
357
358
359
360
361
362 IF (
domain(ng)%Southern_Edge(tile))
THEN
363
364
365
368 DO i=istr,iend+1
369 grad(i,jstr )=t(i ,jstr ,k,nstp,itrc)- &
370 & t(i-1,jstr ,k,nstp,itrc)
371# ifdef MASKING
372 grad(i,jstr )=grad(i,jstr )* &
373 &
grid(ng)%umask(i,jstr )
374# endif
375 grad(i,jstr-1)=t(i ,jstr-1,k,nstp,itrc)- &
376 & t(i-1,jstr-1,k,nstp,itrc)
377# ifdef MASKING
378 grad(i,jstr-1)=grad(i,jstr-1)* &
379 &
grid(ng)%umask(i,jstr-1)
380# endif
381 END DO
382 DO i=istr,iend
384 dtdt=t(i,jstr,k,nstp,itrc)-t(i,jstr ,k,nout,itrc)
385 dtde=t(i,jstr,k,nstp,itrc)-t(i,jstr+1,k,nstp,itrc)
386
389 obc_out=
clima(ng)%Tnudgcof(i,jstr-1,k,ic)
390 obc_in =
obcfac(ng)*obc_out
391 ELSE
394 END IF
395 IF ((dtdt*dtde).lt.0.0_r8) THEN
396 tau=obc_in
397 ELSE
398 tau=obc_out
399 END IF
401 END IF
402
403 IF ((dtdt*dtde).lt.0.0_r8) dtdt=0.0_r8
404 IF ((dtdt*(grad(i ,jstr)+ &
405 & grad(i+1,jstr))).gt.0.0_r8) THEN
406 dtdx=grad(i ,jstr)
407 ELSE
408 dtdx=grad(i+1,jstr)
409 END IF
410 cff=dtdt/max(dtdx*dtdx+dtde*dtde,eps)
411# ifdef RADIATION_2D
412 cx=min(1.0_r8,max(cff*dtdx,-1.0_r8))
413# else
414 cx=0.0_r8
415# endif
416 ce=min(1.0_r8,cff*dtde)
417# if defined CELERITY_WRITE && defined FORWARD_WRITE
418 boundary(ng)%t_south_Cx(i,k,itrc)=cx
419 boundary(ng)%t_south_Ce(i,k,itrc)=ce
420 boundary(ng)%t_south_C2(i,k,itrc)=cff
421# endif
422 t(i,jstr-1,k,nout,itrc)=(1.0_r8-ce)* &
423 & t(i,jstr-1,k,nstp,itrc)+ &
424 & ce*t(i,jstr,k,nstp,itrc )- &
425 & max(cx,0.0_r8)* &
426 & grad(i ,jstr-1)- &
427 & min(cx,0.0_r8)* &
428 & grad(i+1,jstr-1)
429
431 t(i,jstr-1,k,nout,itrc)=t(i,jstr-1,k,nout,itrc)+ &
432 & tau* &
434 & itrc)- &
435 & t(i,jstr-1,k,nstp,itrc))
436 END IF
437# ifdef MASKING
438 t(i,jstr-1,k,nout,itrc)=t(i,jstr-1,k,nout,itrc)* &
439 &
grid(ng)%rmask(i,jstr-1)
440# endif
441 END IF
442 END DO
443 END DO
444
445
446
449 DO i=istr,iend
451 t(i,jstr-1,k,nout,itrc)=
boundary(ng)%t_south(i,k,itrc)
452# ifdef MASKING
453 t(i,jstr-1,k,nout,itrc)=t(i,jstr-1,k,nout,itrc)* &
454 &
grid(ng)%rmask(i,jstr-1)
455# endif
456 END IF
457 END DO
458 END DO
459
460
461
464 DO i=istr,iend
466 t(i,jstr-1,k,nout,itrc)=t(i,jstr,k,nout,itrc)
467# ifdef MASKING
468 t(i,jstr-1,k,nout,itrc)=t(i,jstr-1,k,nout,itrc)* &
469 &
grid(ng)%rmask(i,jstr-1)
470# endif
471 END IF
472 END DO
473 END DO
474
475
476
479 DO i=istr,iend
481 t(i,jstr-1,k,nout,itrc)=t(i,jstr,k,nout,itrc)
482# ifdef MASKING
483 t(i,jstr-1,k,nout,itrc)=t(i,jstr-1,k,nout,itrc)* &
484 &
grid(ng)%rmask(i,jstr-1)
485# endif
486 END IF
487 END DO
488 END DO
489 END IF
490 END IF
491
492
493
494
495
496 IF (
domain(ng)%Northern_Edge(tile))
THEN
497
498
499
502 DO i=istr,iend+1
503 grad(i,jend )=t(i ,jend ,k,nstp,itrc)- &
504 & t(i-1,jend ,k,nstp,itrc)
505# ifdef MASKING
506 grad(i,jend )=grad(i,jend )* &
507 &
grid(ng)%umask(i,jend )
508# endif
509 grad(i,jend+1)=t(i ,jend+1,k,nstp,itrc)- &
510 & t(i-1,jend+1,k,nstp,itrc)
511# ifdef MASKING
512 grad(i,jend+1)=grad(i,jend+1)* &
513 &
grid(ng)%umask(i,jend+1)
514# endif
515 END DO
516 DO i=istr,iend
518 dtdt=t(i,jend,k,nstp,itrc)-t(i,jend ,k,nout,itrc)
519 dtde=t(i,jend,k,nstp,itrc)-t(i,jend-1,k,nstp,itrc)
520
523 obc_out=
clima(ng)%Tnudgcof(i,jend+1,k,ic)
524 obc_in =
obcfac(ng)*obc_out
525 ELSE
528 END IF
529 IF ((dtdt*dtde).lt.0.0_r8) THEN
530 tau=obc_in
531 ELSE
532 tau=obc_out
533 END IF
535 END IF
536
537 IF ((dtdt*dtde).lt.0.0_r8) dtdt=0.0_r8
538 IF ((dtdt*(grad(i ,jend)+ &
539 & grad(i+1,jend))).gt.0.0_r8) THEN
540 dtdx=grad(i ,jend)
541 ELSE
542 dtdx=grad(i+1,jend)
543 END IF
544 cff=dtdt/max(dtdx*dtdx+dtde*dtde,eps)
545# ifdef RADIATION_2D
546 cx=min(1.0_r8,max(cff*dtdx,-1.0_r8))
547# else
548 cx=0.0_r8
549# endif
550 ce=min(1.0_r8,cff*dtde)
551# if defined CELERITY_WRITE && defined FORWARD_WRITE
552 boundary(ng)%t_north_Cx(i,k,itrc)=cx
553 boundary(ng)%t_north_Ce(i,k,itrc)=ce
554 boundary(ng)%t_north_C2(i,k,itrc)=cff
555# endif
556 t(i,jend+1,k,nout,itrc)=(1.0_r8-ce)* &
557 & t(i,jend+1,k,nstp,itrc)+ &
558 & ce*t(i,jend,k,nstp,itrc)- &
559 & max(cx,0.0_r8)* &
560 & grad(i ,jend+1)- &
561 & min(cx,0.0_r8)* &
562 & grad(i+1,jend+1)
563
565 t(i,jend+1,k,nout,itrc)=t(i,jend+1,k,nout,itrc)+ &
566 & tau* &
568 & itrc)- &
569 & t(i,jend+1,k,nstp,itrc))
570 END IF
571# ifdef MASKING
572 t(i,jend+1,k,nout,itrc)=t(i,jend+1,k,nout,itrc)* &
573 &
grid(ng)%rmask(i,jend+1)
574# endif
575 END IF
576 END DO
577 END DO
578
579
580
583 DO i=istr,iend
585 t(i,jend+1,k,nout,itrc)=
boundary(ng)%t_north(i,k,itrc)
586# ifdef MASKING
587 t(i,jend+1,k,nout,itrc)=t(i,jend+1,k,nout,itrc)* &
588 &
grid(ng)%rmask(i,jend+1)
589# endif
590 END IF
591 END DO
592 END DO
593
594
595
598 DO i=istr,iend
600 t(i,jend+1,k,nout,itrc)=t(i,jend,k,nout,itrc)
601# ifdef MASKING
602 t(i,jend+1,k,nout,itrc)=t(i,jend+1,k,nout,itrc)* &
603 &
grid(ng)%rmask(i,jend+1)
604# endif
605 END IF
606 END DO
607 END DO
608
609
610
613 DO i=istr,iend
615 t(i,jend+1,k,nout,itrc)=t(i,jend,k,nout,itrc)
616# ifdef MASKING
617 t(i,jend+1,k,nout,itrc)=t(i,jend+1,k,nout,itrc)* &
618 &
grid(ng)%rmask(i,jend+1)
619# endif
620 END IF
621 END DO
622 END DO
623 END IF
624 END IF
625
626
627
628
629
631 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
635 t(istr-1,jstr-1,k,nout,itrc)=0.5_r8* &
636 & (t(istr ,jstr-1,k,nout, &
637 & itrc)+ &
638 & t(istr-1,jstr ,k,nout, &
639 & itrc))
640 END DO
641 END IF
642 END IF
643 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
647 t(iend+1,jstr-1,k,nout,itrc)=0.5_r8* &
648 & (t(iend ,jstr-1,k,nout, &
649 & itrc)+ &
650 & t(iend+1,jstr ,k,nout, &
651 & itrc))
652 END DO
653 END IF
654 END IF
655 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
659 t(istr-1,jend+1,k,nout,itrc)=0.5_r8* &
660 & (t(istr-1,jend ,k,nout, &
661 & itrc)+ &
662 & t(istr ,jend+1,k,nout, &
663 & itrc))
664 END DO
665 END IF
666 END IF
667 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
671 t(iend+1,jend+1,k,nout,itrc)=0.5_r8* &
672 & (t(iend+1,jend ,k,nout, &
673 & itrc)+ &
674 & t(iend ,jend+1,k,nout, &
675 & itrc))
676 END DO
677 END IF
678 END IF
679 END IF
680
681 RETURN