57
58
65
66
67
68 integer, intent(in) :: ng, tile
69 integer, intent(in) :: LBi, UBi, LBj, UBj, UBk
70 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
71 integer, intent(in) :: nstp, nout
72
73# ifdef ASSUMED_SHAPE
74 real(r8), intent(inout) :: ad_u(LBi:,LBj:,:,:)
75# else
76 real(r8), intent(inout) :: ad_u(LBi:UBi,LBj:UBj,UBk,2)
77# endif
78
79
80
81 integer :: Imin, Imax
82 integer :: i, j, k
83
84 real(r8) :: Ce, Cx, cff
85 real(r8) :: obc_in, obc_out, tau
86 real(r8) :: adfac
87
88 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_grad
89
90# include "set_bounds.h"
91
92
93
94
95
96 ad_grad(lbi:ubi,lbj:ubj)=0.0_r8
97
98
99
100
101
103 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
107
108
109
110
111 adfac=0.5_r8*ad_u(iend+1,jend+1,k,nout)
112 ad_u(iend+1,jend ,k,nout)=ad_u(iend+1,jend ,k,nout)+ &
113 & adfac
114 ad_u(iend ,jend+1,k,nout)=ad_u(iend ,jend+1,k,nout)+ &
115 & adfac
116 ad_u(iend+1,jend+1,k,nout)=0.0_r8
117 END DO
118 END IF
119 END IF
120 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
124
125
126
127
128 adfac=0.5_r8*ad_u(istr,jend+1,k,nout)
129 ad_u(istr ,jend ,k,nout)=ad_u(istr ,jend ,k,nout)+ &
130 & adfac
131 ad_u(istr+1,jend+1,k,nout)=ad_u(istr+1,jend+1,k,nout)+ &
132 & adfac
133 ad_u(istr ,jend+1,k,nout)=0.0_r8
134 END DO
135 END IF
136 END IF
137 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
141
142
143
144
145 adfac=0.5_r8*ad_u(iend+1,jstr-1,k,nout)
146 ad_u(iend ,jstr-1,k,nout)=ad_u(iend ,jstr-1,k,nout)+ &
147 & adfac
148 ad_u(iend+1,jstr ,k,nout)=ad_u(iend+1,jstr ,k,nout)+ &
149 & adfac
150 ad_u(iend+1,jstr-1,k,nout)=0.0_r8
151 END DO
152 END IF
153 END IF
154 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
158
159
160
161
162 adfac=0.5_r8*ad_u(istr,jstr-1,k,nout)
163 ad_u(istr+1,jstr-1,k,nout)=ad_u(istr+1,jstr-1,k,nout)+ &
164 & adfac
165 ad_u(istr ,jstr ,k,nout)=ad_u(istr ,jstr ,k,nout)+ &
166 & adfac
167 ad_u(istr ,jstr-1,k,nout)=0.0_r8
168 END DO
169 END IF
170 END IF
171 END IF
172
173
174
175
176
177 IF (
domain(ng)%Northern_Edge(tile))
THEN
178
179
180
182 IF (
iic(ng).ne.0)
THEN
184 DO i=istru,iend
186# if defined CELERITY_READ && defined FORWARD_READ
189 obc_out=0.5_r8* &
190 & (
clima(ng)%M3nudgcof(i-1,jend+1,k)+ &
191 &
clima(ng)%M3nudgcof(i ,jend+1,k))
192 obc_in =
obcfac(ng)*obc_out
193 ELSE
196 END IF
197 IF (
boundary(ng)%u_north_Ce(i,k).lt.0.0_r8)
THEN
198 tau=obc_in
199 ELSE
200 tau=obc_out
201 END IF
203 END IF
204# ifdef RADIATION_2D
206# else
207 cx=0.0_r8
208# endif
211# endif
212# ifdef MASKING
213
214
215
216 ad_u(i,jend+1,k,nout)=ad_u(i,jend+1,k,nout)* &
217 &
grid(ng)%umask(i,jend+1)
218# endif
220
221
222
223 ad_u(i,jend+1,k,nstp)=ad_u(i,jend+1,k,nstp)- &
224 & tau*ad_u(i,jend+1,k,nout)
225 END IF
226
227
228
229
230
231
232
233
234 adfac=ad_u(i,jend+1,k,nout)/(cff+ce)
235 ad_grad(i-1,jend+1)=ad_grad(i-1,jend+1)- &
236 & max(cx,0.0_r8)*adfac
237 ad_grad(i ,jend+1)=ad_grad(i ,jend+1)- &
238 & min(cx,0.0_r8)*adfac
239 ad_u(i,jend ,k,nout)=ad_u(i,jend ,k,nout)+ce *adfac
240 ad_u(i,jend+1,k,nstp)=ad_u(i,jend+1,k,nstp)+cff*adfac
241 ad_u(i,jend+1,k,nout)=0.0_r8
242 END IF
243 END DO
244 END DO
245 END IF
246
247
248
251 DO i=istru,iend
253# ifdef MASKING
254
255
256
257 ad_u(i,jend+1,k,nout)=ad_u(i,jend+1,k,nout)* &
258 &
grid(ng)%umask(i,jend+1)
259# endif
260# ifdef ADJUST_BOUNDARY
262
263
265 & ad_u_north(i,k)+ &
266 & ad_u(i,jend+1,k,nout)
267 ad_u(i,jend+1,k,nout)=0.0_r8
268 ELSE
269
270
271 ad_u(i,jend+1,k,nout)=0.0_r8
272 END IF
273# else
274
275
276 ad_u(i,jend+1,k,nout)=0.0_r8
277# endif
278 END IF
279 END DO
280 END DO
281
282
283
286 DO i=istru,iend
288# ifdef MASKING
289
290
291
292 ad_u(i,jend+1,k,nout)=ad_u(i,jend+1,k,nout)* &
293 &
grid(ng)%umask(i,jend+1)
294# endif
295
296
297 ad_u(i,jend ,k,nout)=ad_u(i,jend ,k,nout)+ &
298 & ad_u(i,jend+1,k,nout)
299 ad_u(i,jend+1,k,nout) = 0.0_r8
300 END IF
301 END DO
302 END DO
303
304
305
306
309 imin=istru
310 imax=iend
311 ELSE
312 imin=istr
313 imax=iendr
314 END IF
316 DO i=imin,imax
318# ifdef MASKING
319
320
321
322 ad_u(i,jend+1,k,nout)=ad_u(i,jend+1,k,nout)* &
323 &
grid(ng)%umask(i,jend+1)
324# endif
325
326
327 ad_u(i,jend ,k,nout)=ad_u(i,jend ,k,nout)+ &
328 &
gamma2(ng)*ad_u(i,jend+1,k,nout)
329 ad_u(i,jend+1,k,nout)=0.0_r8
330 END IF
331 END DO
332 END DO
333 END IF
334 END IF
335
336
337
338
339
340 IF (
domain(ng)%Southern_Edge(tile))
THEN
341
342
343
345 IF (
iic(ng).ne.0)
THEN
347 DO i=istru,iend
349# if defined CELERITY_READ && defined FORWARD_READ
352 obc_out=0.5_r8* &
353 & (
clima(ng)%M3nudgcof(i-1,jstr-1,k)+ &
354 &
clima(ng)%M3nudgcof(i ,jstr-1,k))
355 obc_in =
obcfac(ng)*obc_out
356 ELSE
359 END IF
360 IF (
boundary(ng)%u_south_Ce(i,k).lt.0.0_r8)
THEN
361 tau=obc_in
362 ELSE
363 tau=obc_out
364 END IF
366 END IF
367# ifdef RADIATION_2D
369# else
370 cx=0.0_r8
371# endif
374# endif
375# ifdef MASKING
376
377
378
379 ad_u(i,jstr-1,k,nout)=ad_u(i,jstr-1,k,nout)* &
380 &
grid(ng)%umask(i,jstr-1)
381# endif
383
384
385
386 ad_u(i,jstr-1,k,nstp)=ad_u(i,jstr-1,k,nstp)- &
387 & tau*ad_u(i,jstr-1,k,nout)
388 END IF
389
390
391
392
393
394
395
396
397 adfac=ad_u(i,jstr-1,k,nout)/(cff+ce)
398 ad_grad(i-1,jstr-1)=ad_grad(i-1,jstr-1)- &
399 & max(cx,0.0_r8)*adfac
400 ad_grad(i ,jstr-1)=ad_grad(i ,jstr-1)- &
401 & min(cx,0.0_r8)*adfac
402 ad_u(i,jstr-1,k,nstp)=ad_u(i,jstr-1,k,nstp)+cff*adfac
403 ad_u(i,jstr ,k,nout)=ad_u(i,jstr ,k,nout)+ce *adfac
404 ad_u(i,jstr-1,k,nout)=0.0_r8
405 END IF
406 END DO
407 END DO
408 END IF
409
410
411
414 DO i=istru,iend
416# ifdef MASKING
417
418
419
420 ad_u(i,jstr-1,k,nout)=ad_u(i,jstr-1,k,nout)* &
421 &
grid(ng)%umask(i,jstr-1)
422# endif
423# ifdef ADJUST_BOUNDARY
425
426
428 & ad_u_south(i,k)+ &
429 & ad_u(i,jstr-1,k,nout)
430 ad_u(i,jstr-1,k,nout)=0.0_r8
431 ELSE
432
433
434 ad_u(i,jstr-1,k,nout)=0.0_r8
435 END IF
436# else
437
438
439 ad_u(i,jstr-1,k,nout)=0.0_r8
440# endif
441 END IF
442 END DO
443 END DO
444
445
446
449 DO i=istru,iend
451# ifdef MASKING
452
453
454
455 ad_u(i,jstr-1,k,nout)=ad_u(i,jstr-1,k,nout)* &
456 &
grid(ng)%umask(i,jstr-1)
457# endif
458
459
460 ad_u(i,jstr ,k,nout)=ad_u(i,jstr ,k,nout)+ &
461 & ad_u(i,jstr-1,k,nout)
462 ad_u(i,jstr-1,k,nout)=0.0_r8
463 END IF
464 END DO
465 END DO
466
467
468
469
472 imin=istru
473 imax=iend
474 ELSE
475 imin=istr
476 imax=iendr
477 END IF
479 DO i=imin,imax
481# ifdef MASKING
482
483
484
485 ad_u(i,jstr-1,k,nout)=ad_u(i,jstr-1,k,nout)* &
486 &
grid(ng)%umask(i,jstr-1)
487# endif
488
489
490 ad_u(i,jstr ,k,nout)=ad_u(i,jstr ,k,nout)+ &
491 &
gamma2(ng)*ad_u(i,jstr-1,k,nout)
492 ad_u(i,jstr-1,k,nout)=0.0_r8
493 END IF
494 END DO
495 END DO
496 END IF
497 END IF
498
499
500
501
502
503 IF (
domain(ng)%Eastern_Edge(tile))
THEN
504
505
506
508 IF (
iic(ng).ne.0)
THEN
510 DO j=jstr,jend
512# if defined CELERITY_READ && defined FORWARD_READ
515 obc_out=0.5_r8* &
516 & (
clima(ng)%M3nudgcof(iend ,j,k)+ &
517 &
clima(ng)%M3nudgcof(iend+1,j,k))
518 obc_in =
obcfac(ng)*obc_out
519 ELSE
522 END IF
523 IF (
boundary(ng)%u_east_Cx(j,k).lt.0.0_r8)
THEN
524 tau=obc_in
525 ELSE
526 tau=obc_out
527 END IF
529 END IF
531# ifdef RADIATION_2D
533# else
534 ce=0.0_r8
535# endif
537# endif
538# ifdef MASKING
539
540
541
542 ad_u(iend+1,j,k,nout)=ad_u(iend+1,j,k,nout)* &
543 &
grid(ng)%umask(iend+1,j)
544# endif
546
547
548
549 ad_u(iend+1,j,k,nstp)=ad_u(iend+1,j,k,nstp)- &
550 & tau*ad_u(iend+1,j,k,nout)
551 END IF
552
553
554
555
556
557
558
559
560 adfac=ad_u(iend+1,j,k,nout)/(cff+cx)
561 ad_grad(iend+1,j )=ad_grad(iend+1,j )- &
562 & max(ce,0.0_r8)*adfac
563 ad_grad(iend+1,j+1)=ad_grad(iend+1,j+1)- &
564 & min(ce,0.0_r8)*adfac
565 ad_u(iend ,j,k,nout)=ad_u(iend ,j,k,nout)+cx *adfac
566 ad_u(iend+1,j,k,nstp)=ad_u(iend+1,j,k,nstp)+cff*adfac
567 ad_u(iend+1,j,k,nout)=0.0_r8
568 END IF
569 END DO
570 END DO
571 END IF
572
573
574
577 DO j=jstr,jend
579# ifdef MASKING
580
581
582
583 ad_u(iend+1,j,k,nout)=ad_u(iend+1,j,k,nout)* &
584 &
grid(ng)%umask(iend+1,j)
585# endif
586# ifdef ADJUST_BOUNDARY
588
589
592 & ad_u(iend+1,j,k,nout)
593 ad_u(iend+1,j,k,nout)=0.0_r8
594 ELSE
595
596
597 ad_u(iend+1,j,k,nout)=0.0_r8
598 END IF
599# else
600
601
602 ad_u(iend+1,j,k,nout)=0.0_r8
603# endif
604 END IF
605 END DO
606 END DO
607
608
609
612 DO j=jstr,jend
614# ifdef MASKING
615
616
617
618 ad_u(iend+1,j,k,nout)=ad_u(iend+1,j,k,nout)* &
619 &
grid(ng)%umask(iend+1,j)
620# endif
621
622
623 ad_u(iend ,j,k,nout)=ad_u(iend ,j,k,nout)+ &
624 & ad_u(iend+1,j,k,nout)
625 ad_u(iend+1,j,k,nout)=0.0_r8
626 END IF
627 END DO
628 END DO
629
630
631
634 DO j=jstr,jend
636
637
638 ad_u(iend+1,j,k,nout)=0.0_r8
639 END IF
640 END DO
641 END DO
642 END IF
643 END IF
644
645
646
647
648
649 IF (
domain(ng)%Western_Edge(tile))
THEN
650
651
652
654 IF (
iic(ng).ne.0)
THEN
656 DO j=jstr,jend
658# if defined CELERITY_READ && defined FORWARD_READ
661 obc_out=0.5_r8* &
662 & (
clima(ng)%M3nudgcof(istr-1,j,k)+ &
663 &
clima(ng)%M3nudgcof(istr ,j,k))
664 obc_in =
obcfac(ng)*obc_out
665 ELSE
668 END IF
669 IF (
boundary(ng)%u_west_Cx(j,k).lt.0.0_r8)
THEN
670 tau=obc_in
671 ELSE
672 tau=obc_out
673 END IF
675 END IF
677# ifdef RADIATION_2D
679# else
680 ce=0.0_r8
681# endif
683# endif
684# ifdef MASKING
685
686
687
688 ad_u(istr,j,k,nout)=ad_u(istr,j,k,nout)* &
689 &
grid(ng)%umask(istr,j)
690# endif
692
693
694
695 ad_u(istr,j,k,nstp)=ad_u(istr,j,k,nstp)- &
696 & tau*ad_u(istr,j,k,nout)
697 END IF
698
699
700
701
702
703
704
705
706 adfac=ad_u(istr,j,k,nout)/(cff+cx)
707 ad_grad(istr,j )=ad_grad(istr,j )- &
708 & max(ce,0.0_r8)*adfac
709 ad_grad(istr,j+1)=ad_grad(istr,j+1)- &
710 & min(ce,0.0_r8)*adfac
711 ad_u(istr ,j,k,nstp)=ad_u(istr ,j,k,nstp)+cff*adfac
712 ad_u(istr+1,j,k,nout)=ad_u(istr+1,j,k,nout)+cx *adfac
713 ad_u(istr ,j,k,nout)=0.0_r8
714 END IF
715 END DO
716 END DO
717 END IF
718
719
720
723 DO j=jstr,jend
725# ifdef MASKING
726
727
728
729 ad_u(istr,j,k,nout)=ad_u(istr,j,k,nout)* &
730 &
grid(ng)%umask(istr,j)
731# endif
732# ifdef ADJUST_BOUNDARY
734
735
738 & ad_u(istr,j,k,nout)
739 ad_u(istr,j,k,nout)=0.0_r8
740 ELSE
741
742
743 ad_u(istr,j,k,nout)=0.0_r8
744 END IF
745# else
746
747
748 ad_u(istr,j,k,nout)=0.0_r8
749# endif
750 END IF
751 END DO
752 END DO
753
754
755
758 DO j=jstr,jend
760# ifdef MASKING
761
762
763
764 ad_u(istr ,j,k,nout)=ad_u(istr ,j,k,nout)* &
765 &
grid(ng)%umask(istr,j)
766# endif
767
768
769 ad_u(istr+1,j,k,nout)=ad_u(istr+1,j,k,nout)+ &
770 & ad_u(istr ,j,k,nout)
771 ad_u(istr ,j,k,nout)=0.0_r8
772 END IF
773 END DO
774 END DO
775
776
777
780 DO j=jstr,jend
782
783
784 ad_u(istr,j,k,nout)=0.0_r8
785 END IF
786 END DO
787 END DO
788 END IF
789 END IF
790
791 RETURN
type(t_boundary), dimension(:), allocatable boundary
type(t_apply), dimension(:), allocatable lbc_apply
type(t_clima), dimension(:), allocatable clima
type(t_grid), dimension(:), allocatable grid
type(t_lbc), dimension(:,:,:), allocatable ad_lbc
type(t_domain), dimension(:), allocatable domain
real(dp), dimension(:,:), allocatable m3obc_out
integer, dimension(:), allocatable iic
real(dp), dimension(:), allocatable dt
logical, dimension(:,:,:), allocatable lobc
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(dp), dimension(:), allocatable obcfac
real(r8), dimension(:), allocatable gamma2
logical, dimension(:), allocatable lnudgem3clm
integer, parameter isouth
integer, parameter inorth
real(dp), dimension(:,:), allocatable m3obc_in