ROMS
Loading...
Searching...
No Matches
tl_u3dbc_im.F
Go to the documentation of this file.
1#include "cppdefs.h"
3#if defined TANGENT && defined SOLVE3D
4!
5!git $Id$
6!================================================== Hernan G. Arango ===
7! Copyright (c) 2002-2025 The ROMS Group Andrew M. Moore !
8! Licensed under a MIT/X style license !
9! See License_ROMS.md !
10!=======================================================================
11! !
12! This subroutine sets tangent linear lateral boundary conditions for !
13! total 3D U-velocity. It updates the specified "nout" time index. !
14! !
15! BASIC STATE variables needed: u !
16! !
17!=======================================================================
18!
19 implicit none
20!
21 PRIVATE
22 PUBLIC :: tl_u3dbc, tl_u3dbc_tile
23!
24 CONTAINS
25!
26!***********************************************************************
27 SUBROUTINE tl_u3dbc (ng, tile, nout)
28!***********************************************************************
29!
30 USE mod_param
31 USE mod_ocean
32 USE mod_stepping
33!
34! Imported variable declarations.
35!
36 integer, intent(in) :: ng, tile, nout
37!
38! Local variable declarations.
39!
40# include "tile.h"
41!
42 CALL tl_u3dbc_tile (ng, tile, &
43 & lbi, ubi, lbj, ubj, n(ng), &
44 & imins, imaxs, jmins, jmaxs, &
45 & nstp(ng), nout, &
46 & ocean(ng) % tl_u)
47
48 RETURN
49 END SUBROUTINE tl_u3dbc
50!
51!***********************************************************************
52 SUBROUTINE tl_u3dbc_tile (ng, tile, &
53 & LBi, UBi, LBj, UBj, UBk, &
54 & IminS, ImaxS, JminS, JmaxS, &
55 & nstp, nout, &
56 & tl_u)
57!***********************************************************************
58!
59 USE mod_param
60 USE mod_boundary
61 USE mod_clima
62 USE mod_grid
63 USE mod_ncparam
64 USE mod_scalars
65!
66! Imported variable declarations.
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) :: tl_u(lbi:,lbj:,:,:)
75# else
76 real(r8), intent(inout) :: tl_u(lbi:ubi,lbj:ubj,ubk,2)
77# endif
78!
79! Local variable declarations.
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
87 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_grad
88
89# include "set_bounds.h"
90!
91!-----------------------------------------------------------------------
92! Lateral boundary conditions at the western edge.
93!-----------------------------------------------------------------------
94!
95 IF (domain(ng)%Western_Edge(tile)) THEN
96!
97! Western edge, implicit upstream radiation condition.
98!
99 IF (tl_lbc(iwest,isuvel,ng)%radiation) THEN
100 IF (iic(ng).ne.0) THEN
101 DO k=1,n(ng)
102 DO j=jstr,jend+1
103!^ grad(Istr,j)=u(Istr,j ,k,nstp)- &
104!^ & u(Istr,j-1,k,nstp)
105!^
106 tl_grad(istr,j)=0.0_r8
107 END DO
108 DO j=jstr,jend
109 IF (lbc_apply(ng)%west(j)) THEN
110# if defined CELERITY_READ && defined FORWARD_READ
111 IF (tl_lbc(iwest,isuvel,ng)%nudging) THEN
112 IF (lnudgem3clm(ng)) THEN
113 obc_out=0.5_r8* &
114 & (clima(ng)%M3nudgcof(istr-1,j,k)+ &
115 & clima(ng)%M3nudgcof(istr ,j,k))
116 obc_in =obcfac(ng)*obc_out
117 ELSE
118 obc_out=m3obc_out(ng,iwest)
119 obc_in =m3obc_in(ng,iwest)
120 END IF
121 IF (boundary(ng)%u_west_Cx(j,k).lt.0.0_r8) THEN
122 tau=obc_in
123 ELSE
124 tau=obc_out
125 END IF
126 tau=tau*dt(ng)
127 END IF
128 cx=boundary(ng)%u_west_Cx(j,k)
129# ifdef RADIATION_2D
130 ce=boundary(ng)%u_west_Ce(j,k)
131# else
132 ce=0.0_r8
133# endif
134 cff=boundary(ng)%u_west_C2(j,k)
135# endif
136!^ u(Istr,j,k,nout)=(cff*u(Istr ,j,k,nstp)+ &
137!^ & Cx *u(Istr+1,j,k,nout)- &
138!^ & MAX(Ce,0.0_r8)*grad(Istr,j )- &
139!^ & MIN(Ce,0.0_r8)*grad(Istr,j+1))/ &
140!^ & (cff+Cx)
141!^
142 tl_u(istr,j,k,nout)=(cff*tl_u(istr ,j,k,nstp)+ &
143 & cx *tl_u(istr+1,j,k,nout)- &
144 & max(ce,0.0_r8)* &
145 & tl_grad(istr,j )- &
146 & min(ce,0.0_r8)* &
147 & tl_grad(istr,j+1))/ &
148 & (cff+cx)
149
150 IF (tl_lbc(iwest,isuvel,ng)%nudging) THEN
151!^ u(Istr,j,k,nout)=u(Istr,j,k,nout)+ &
152!^ & tau*(BOUNDARY(ng)%u_west(j,k)- &
153!^ & u(Istr,j,k,nstp))
154!^
155 tl_u(istr,j,k,nout)=tl_u(istr,j,k,nout)- &
156 & tau*tl_u(istr,j,k,nstp)
157 END IF
158# ifdef MASKING
159!^ u(Istr,j,k,nout)=u(Istr,j,k,nout)* &
160!^ & GRID(ng)%umask(Istr,j)
161!^
162 tl_u(istr,j,k,nout)=tl_u(istr,j,k,nout)* &
163 & grid(ng)%umask(istr,j)
164# endif
165 END IF
166 END DO
167 END DO
168 END IF
169!
170! Western edge, clamped boundary condition.
171!
172 ELSE IF (tl_lbc(iwest,isuvel,ng)%clamped) THEN
173 DO k=1,n(ng)
174 DO j=jstr,jend
175 IF (lbc_apply(ng)%west(j)) THEN
176!^ u(Istr,j,k,nout)=BOUNDARY(ng)%u_west(j,k)
177!^
178# ifdef ADJUST_BOUNDARY
179 IF (lobc(iwest,isuvel,ng)) THEN
180 tl_u(istr,j,k,nout)=boundary(ng)%tl_u_west(j,k)
181 ELSE
182 tl_u(istr,j,k,nout)=0.0_r8
183 END IF
184# else
185 tl_u(istr,j,k,nout)=0.0_r8
186# endif
187# ifdef MASKING
188!^ u(Istr,j,k,nout)=u(Istr,j,k,nout)* &
189!^ & GRID(ng)%umask(Istr,j)
190!^
191 tl_u(istr,j,k,nout)=tl_u(istr,j,k,nout)* &
192 & grid(ng)%umask(istr,j)
193# endif
194 END IF
195 END DO
196 END DO
197!
198! Western edge, gradient boundary condition.
199!
200 ELSE IF (tl_lbc(iwest,isuvel,ng)%gradient) THEN
201 DO k=1,n(ng)
202 DO j=jstr,jend
203 IF (lbc_apply(ng)%west(j)) THEN
204!^ u(Istr,j,k,nout)=u(Istr+1,j,k,nout)
205!^
206 tl_u(istr,j,k,nout)=tl_u(istr+1,j,k,nout)
207# ifdef MASKING
208!^ u(Istr,j,k,nout)=u(Istr,j,k,nout)* &
209!^ & GRID(ng)%umask(Istr,j)
210!^
211 tl_u(istr,j,k,nout)=tl_u(istr,j,k,nout)* &
212 & grid(ng)%umask(istr,j)
213# endif
214 END IF
215 END DO
216 END DO
217!
218! Western edge, closed boundary condition.
219!
220 ELSE IF (tl_lbc(iwest,isuvel,ng)%closed) THEN
221 DO k=1,n(ng)
222 DO j=jstr,jend
223 IF (lbc_apply(ng)%west(j)) THEN
224!^ u(Istr,j,k,nout)=0.0_r8
225!^
226 tl_u(istr,j,k,nout)=0.0_r8
227 END IF
228 END DO
229 END DO
230 END IF
231 END IF
232!
233!-----------------------------------------------------------------------
234! Lateral boundary conditions at the eastern edge.
235!-----------------------------------------------------------------------
236!
237 IF (domain(ng)%Eastern_Edge(tile)) THEN
238!
239! Eastern edge, implicit upstream radiation condition.
240!
241 IF (tl_lbc(ieast,isuvel,ng)%radiation) THEN
242 IF (iic(ng).ne.0) THEN
243 DO k=1,n(ng)
244 DO j=jstr,jend+1
245!^ grad(Iend+1,j)=u(Iend+1,j ,k,nstp)- &
246!^ & u(Iend+1,j-1,k,nstp)
247!^
248 tl_grad(iend+1,j)=0.0_r8
249 END DO
250 DO j=jstr,jend
251 IF (lbc_apply(ng)%east(j)) THEN
252# if defined CELERITY_READ && defined FORWARD_READ
253 IF (tl_lbc(ieast,isuvel,ng)%nudging) THEN
254 IF (lnudgem3clm(ng)) THEN
255 obc_out=0.5_r8* &
256 & (clima(ng)%M3nudgcof(iend ,j,k)+ &
257 & clima(ng)%M3nudgcof(iend+1,j,k))
258 obc_in =obcfac(ng)*obc_out
259 ELSE
260 obc_out=m3obc_out(ng,ieast)
261 obc_in =m3obc_in(ng,ieast)
262 END IF
263 IF (boundary(ng)%u_east_Cx(j,k).lt.0.0_r8) THEN
264 tau=obc_in
265 ELSE
266 tau=obc_out
267 END IF
268 tau=tau*dt(ng)
269 END IF
270 cx=boundary(ng)%u_east_Cx(j,k)
271# ifdef RADIATION_2D
272 ce=boundary(ng)%u_east_Ce(j,k)
273# else
274 ce=0.0_r8
275# endif
276 cff=boundary(ng)%u_east_C2(j,k)
277# endif
278!^ u(Iend+1,j,k,nout)=(cff*u(Iend+1,j,k,nstp)+ &
279!^ & Cx *u(Iend ,j,k,nout)- &
280!^ & MAX(Ce,0.0_r8)*grad(Iend+1,j )- &
281!^ & MIN(Ce,0.0_r8)*grad(Iend+1,j+1))/ &
282!^ & (cff+Cx)
283!^
284 tl_u(iend+1,j,k,nout)=(cff*tl_u(iend+1,j,k,nstp)+ &
285 & cx *tl_u(iend ,j,k,nout)- &
286 & max(ce,0.0_r8)* &
287 & tl_grad(iend+1,j )- &
288 & min(ce,0.0_r8)* &
289 & tl_grad(iend+1,j+1))/ &
290 & (cff+cx)
291
292 IF (tl_lbc(ieast,isuvel,ng)%nudging) THEN
293!^ u(Iend+1,j,k,nout)=u(Iend+1,j,k,nout)+ &
294!^ & tau*(BOUNDARY(ng)%u_east(j,k)- &
295!^ & u(Iend+1,j,k,nstp))
296!^
297 tl_u(iend+1,j,k,nout)=tl_u(iend+1,j,k,nout)- &
298 & tau*tl_u(iend+1,j,k,nstp)
299 END IF
300# ifdef MASKING
301!^ u(Iend+1,j,k,nout)=u(Iend+1,j,k,nout)* &
302!^ & GRID(ng)%umask(Iend+1,j)
303!^
304 tl_u(iend+1,j,k,nout)=tl_u(iend+1,j,k,nout)* &
305 & grid(ng)%umask(iend+1,j)
306# endif
307 END IF
308 END DO
309 END DO
310 END IF
311!
312! Eastern edge, clamped boundary condition.
313!
314 ELSE IF (tl_lbc(ieast,isuvel,ng)%clamped) THEN
315 DO k=1,n(ng)
316 DO j=jstr,jend
317 IF (lbc_apply(ng)%east(j)) THEN
318!^ u(Iend+1,j,k,nout)=BOUNDARY(ng)%u_east(j,k)
319!^
320# ifdef ADJUST_BOUNDARY
321 IF (lobc(ieast,isuvel,ng)) THEN
322 tl_u(iend+1,j,k,nout)=boundary(ng)%tl_u_east(j,k)
323 ELSE
324 tl_u(iend+1,j,k,nout)=0.0_r8
325 END IF
326# else
327 tl_u(iend+1,j,k,nout)=0.0_r8
328# endif
329# ifdef MASKING
330!^ u(Iend+1,j,k,nout)=u(Iend+1,j,k,nout)* &
331!^ & GRID(ng)%umask(Iend+1,j)
332!^
333 tl_u(iend+1,j,k,nout)=tl_u(iend+1,j,k,nout)* &
334 & grid(ng)%umask(iend+1,j)
335# endif
336 END IF
337 END DO
338 END DO
339!
340! Eastern edge, gradient boundary condition.
341!
342 ELSE IF (tl_lbc(ieast,isuvel,ng)%gradient) THEN
343 DO k=1,n(ng)
344 DO j=jstr,jend
345 IF (lbc_apply(ng)%east(j)) THEN
346!^ u(Iend+1,j,k,nout)=u(Iend,j,k,nout)
347!^
348 tl_u(iend+1,j,k,nout)=tl_u(iend,j,k,nout)
349# ifdef MASKING
350!^ u(Iend+1,j,k,nout)=u(Iend+1,j,k,nout)* &
351!^ & GRID(ng)%umask(Iend+1,j)
352!^
353 tl_u(iend+1,j,k,nout)=tl_u(iend+1,j,k,nout)* &
354 & grid(ng)%umask(iend+1,j)
355# endif
356 END IF
357 END DO
358 END DO
359!
360! Eastern edge, closed boundary condition.
361!
362 ELSE IF (tl_lbc(ieast,isuvel,ng)%closed) THEN
363 DO k=1,n(ng)
364 DO j=jstr,jend
365 IF (lbc_apply(ng)%east(j)) THEN
366!^ u(Iend+1,j,k,nout)=0.0_r8
367!^
368 tl_u(iend+1,j,k,nout)=0.0_r8
369 END IF
370 END DO
371 END DO
372 END IF
373 END IF
374!
375!-----------------------------------------------------------------------
376! Lateral boundary conditions at the southern edge.
377!-----------------------------------------------------------------------
378!
379 IF (domain(ng)%Southern_Edge(tile)) THEN
380!
381! Southern edge, implicit upstream radiation condition.
382!
383 IF (tl_lbc(isouth,isuvel,ng)%radiation) THEN
384 IF (iic(ng).ne.0) THEN
385 DO k=1,n(ng)
386 DO i=istru-1,iend
387!^ grad(i,Jstr-1)=u(i+1,Jstr-1,k,nstp)- &
388!^ & u(i ,Jstr-1,k,nstp)
389!^
390 tl_grad(i,jstr-1)=0.0_r8
391 END DO
392 DO i=istru,iend
393 IF (lbc_apply(ng)%south(i)) THEN
394# if defined CELERITY_READ && defined FORWARD_READ
395 IF (tl_lbc(isouth,isuvel,ng)%nudging) THEN
396 IF (lnudgem3clm(ng)) THEN
397 obc_out=0.5_r8* &
398 & (clima(ng)%M3nudgcof(i-1,jstr-1,k)+ &
399 & clima(ng)%M3nudgcof(i ,jstr-1,k))
400 obc_in =obcfac(ng)*obc_out
401 ELSE
402 obc_out=m3obc_out(ng,isouth)
403 obc_in =m3obc_in(ng,isouth)
404 END IF
405 IF (boundary(ng)%u_south_Ce(i,k).lt.0.0_r8) THEN
406 tau=obc_in
407 ELSE
408 tau=obc_out
409 END IF
410 tau=tau*dt(ng)
411 END IF
412# ifdef RADIATION_2D
413 cx=boundary(ng)%u_south_Cx(i,k)
414# else
415 cx=0.0_r8
416# endif
417 ce=boundary(ng)%u_south_Ce(i,k)
418 cff=boundary(ng)%u_south_C2(i,k)
419# endif
420!^ u(i,Jstr-1,k,nout)=(cff*u(i,Jstr-1,k,nstp)+ &
421!^ & Ce *u(i,Jstr ,k,nout)- &
422!^ & MAX(Cx,0.0_r8)*grad(i-1,Jstr-1)- &
423!^ & MIN(Cx,0.0_r8)*grad(i ,Jstr-1))/ &
424!^ & (cff+Ce)
425!^
426 tl_u(i,jstr-1,k,nout)=(cff*tl_u(i,jstr-1,k,nstp)+ &
427 & ce *tl_u(i,jstr ,k,nout)- &
428 & max(cx,0.0_r8)* &
429 & tl_grad(i-1,jstr-1)- &
430 & min(cx,0.0_r8)* &
431 & tl_grad(i ,jstr-1))/ &
432 & (cff+ce)
433
434 IF (tl_lbc(isouth,isuvel,ng)%nudging) THEN
435!^ u(i,Jstr-1,k,nout)=u(i,Jstr-1,k,nout)+ &
436!^ & tau*(BOUNDARY(ng)%u_south(i,k)- &
437!^ & u(i,Jstr-1,k,nstp))
438!^
439 tl_u(i,jstr-1,k,nout)=tl_u(i,jstr-1,k,nout)- &
440 & tau*tl_u(i,jstr-1,k,nstp)
441 END IF
442# ifdef MASKING
443!^ u(i,Jstr-1,k,nout)=u(i,Jstr-1,k,nout)* &
444!^ & GRID(ng)%umask(i,Jstr-1)
445!^
446 tl_u(i,jstr-1,k,nout)=tl_u(i,jstr-1,k,nout)* &
447 & grid(ng)%umask(i,jstr-1)
448# endif
449 END IF
450 END DO
451 END DO
452 END IF
453!
454! Southern edge, clamped boundary condition.
455!
456 ELSE IF (tl_lbc(isouth,isuvel,ng)%clamped) THEN
457 DO k=1,n(ng)
458 DO i=istru,iend
459 IF (lbc_apply(ng)%south(i)) THEN
460!^ u(i,Jstr-1,k,nout)=BOUNDARY(ng)%u_south(i,k)
461!^
462# ifdef ADJUST_BOUNDARY
463 IF (lobc(isouth,isuvel,ng)) THEN
464 tl_u(i,jstr-1,k,nout)=boundary(ng)%tl_u_south(i,k)
465 ELSE
466 tl_u(i,jstr-1,k,nout)=0.0_r8
467 END IF
468# else
469 tl_u(i,jstr-1,k,nout)=0.0_r8
470# endif
471# ifdef MASKING
472!^ u(i,Jstr-1,k,nout)=u(i,Jstr-1,k,nout)* &
473!^ & GRID(ng)%umask(i,Jstr-1)
474!^
475 tl_u(i,jstr-1,k,nout)=tl_u(i,jstr-1,k,nout)* &
476 & grid(ng)%umask(i,jstr-1)
477# endif
478 END IF
479 END DO
480 END DO
481!
482! Southern edge, gradient boundary condition.
483!
484 ELSE IF (tl_lbc(isouth,isuvel,ng)%gradient) THEN
485 DO k=1,n(ng)
486 DO i=istru,iend
487 IF (lbc_apply(ng)%south(i)) THEN
488!^ u(i,Jstr-1,k,nout)=u(i,Jstr,k,nout)
489!^
490 tl_u(i,jstr-1,k,nout)=tl_u(i,jstr,k,nout)
491# ifdef MASKING
492!^ u(i,Jstr-1,k,nout)=u(i,Jstr-1,k,nout)* &
493!^ & GRID(ng)%umask(i,Jstr-1)
494!^
495 tl_u(i,jstr-1,k,nout)=tl_u(i,jstr-1,k,nout)* &
496 & grid(ng)%umask(i,jstr-1)
497# endif
498 END IF
499 END DO
500 END DO
501!
502! Southern edge, closed boundary condition: free slip (gamma2=1) or
503! no slip (gamma2=-1).
504!
505 ELSE IF (tl_lbc(isouth,isuvel,ng)%closed) THEN
506 IF (ewperiodic(ng)) THEN
507 imin=istru
508 imax=iend
509 ELSE
510 imin=istr
511 imax=iendr
512 END IF
513 DO k=1,n(ng)
514 DO i=imin,imax
515 IF (lbc_apply(ng)%south(i)) THEN
516!^ u(i,Jstr-1,k,nout)=gamma2(ng)*u(i,Jstr,k,nout)
517!^
518 tl_u(i,jstr-1,k,nout)=gamma2(ng)*tl_u(i,jstr,k,nout)
519# ifdef MASKING
520!^ u(i,Jstr-1,k,nout)=u(i,Jstr-1,k,nout)* &
521!^ & GRID(ng)%umask(i,Jstr-1)
522!^
523 tl_u(i,jstr-1,k,nout)=tl_u(i,jstr-1,k,nout)* &
524 & grid(ng)%umask(i,jstr-1)
525# endif
526 END IF
527 END DO
528 END DO
529 END IF
530 END IF
531!
532!-----------------------------------------------------------------------
533! Lateral boundary conditions at the northern edge.
534!-----------------------------------------------------------------------
535!
536 IF (domain(ng)%Northern_Edge(tile)) THEN
537!
538! Northern edge, implicit upstream radiation condition.
539!
540 IF (tl_lbc(inorth,isuvel,ng)%radiation) THEN
541 IF (iic(ng).ne.0) THEN
542 DO k=1,n(ng)
543 DO i=istru-1,iend
544!^ grad(i,Jend+1)=u(i+1,Jend+1,k,nstp)- &
545!^ & u(i ,Jend+1,k,nstp)
546!^
547 tl_grad(i,jend+1)=0.0_r8
548 END DO
549 DO i=istru,iend
550 IF (lbc_apply(ng)%north(i)) THEN
551# if defined CELERITY_READ && defined FORWARD_READ
552 IF (tl_lbc(inorth,isuvel,ng)%nudging) THEN
553 IF (lnudgem3clm(ng)) THEN
554 obc_out=0.5_r8* &
555 & (clima(ng)%M3nudgcof(i-1,jend+1,k)+ &
556 & clima(ng)%M3nudgcof(i ,jend+1,k))
557 obc_in =obcfac(ng)*obc_out
558 ELSE
559 obc_out=m3obc_out(ng,inorth)
560 obc_in =m3obc_in(ng,inorth)
561 END IF
562 IF (boundary(ng)%u_north_Ce(i,k).lt.0.0_r8) THEN
563 tau=obc_in
564 ELSE
565 tau=obc_out
566 END IF
567 tau=tau*dt(ng)
568 END IF
569# ifdef RADIATION_2D
570 cx=boundary(ng)%u_north_Cx(i,k)
571# else
572 cx=0.0_r8
573# endif
574 ce=boundary(ng)%u_north_Ce(i,k)
575 cff=boundary(ng)%u_north_C2(i,k)
576# endif
577!^ u(i,Jend+1,k,nout)=(cff*u(i,Jend+1,k,nstp)+ &
578!^ & Ce *u(i,Jend ,k,nout)- &
579!^ & MAX(Cx,0.0_r8)*grad(i-1,Jend+1)- &
580!^ & MIN(Cx,0.0_r8)*grad(i ,Jend+1))/ &
581!^ & (cff+Ce)
582!^
583 tl_u(i,jend+1,k,nout)=(cff*tl_u(i,jend+1,k,nstp)+ &
584 & ce *tl_u(i,jend ,k,nout)- &
585 & max(cx,0.0_r8)* &
586 & tl_grad(i-1,jend+1)- &
587 & min(cx,0.0_r8)* &
588 & tl_grad(i ,jend+1))/ &
589 & (cff+ce)
590
591 IF (tl_lbc(inorth,isuvel,ng)%nudging) THEN
592!^ u(i,Jend+1,k,nout)=u(i,Jend+1,k,nout)+ &
593!^ & tau*(BOUNDARY(ng)%u_north(i,k)- &
594!^ & u(i,Jend+1,k,nstp))
595!^
596 tl_u(i,jend+1,k,nout)=tl_u(i,jend+1,k,nout)- &
597 & tau*tl_u(i,jend+1,k,nstp)
598 END IF
599# ifdef MASKING
600!^ u(i,Jend+1,k,nout)=u(i,Jend+1,k,nout)* &
601!^ & GRID(ng)%umask(i,Jend+1)
602!^
603 tl_u(i,jend+1,k,nout)=tl_u(i,jend+1,k,nout)* &
604 & grid(ng)%umask(i,jend+1)
605# endif
606 END IF
607 END DO
608 END DO
609 END IF
610!
611! Northern edge, clamped boundary condition.
612!
613 ELSE IF (tl_lbc(inorth,isuvel,ng)%clamped) THEN
614 DO k=1,n(ng)
615 DO i=istru,iend
616 IF (lbc_apply(ng)%north(i)) THEN
617!^ u(i,Jend+1,k,nout)=BOUNDARY(ng)%u_north(i,k)
618!^
619# ifdef ADJUST_BOUNDARY
620 IF (lobc(inorth,isuvel,ng)) THEN
621 tl_u(i,jend+1,k,nout)=boundary(ng)%tl_u_north(i,k)
622 ELSE
623 tl_u(i,jend+1,k,nout)=0.0_r8
624 END IF
625# else
626 tl_u(i,jend+1,k,nout)=0.0_r8
627# endif
628# ifdef MASKING
629!^ u(i,Jend+1,k,nout)=u(i,Jend+1,k,nout)* &
630!^ & GRID(ng)%umask(i,Jend+1)
631!^
632 tl_u(i,jend+1,k,nout)=tl_u(i,jend+1,k,nout)* &
633 & grid(ng)%umask(i,jend+1)
634# endif
635 END IF
636 END DO
637 END DO
638!
639! Northern edge, gradient boundary condition.
640!
641 ELSE IF (tl_lbc(inorth,isuvel,ng)%gradient) THEN
642 DO k=1,n(ng)
643 DO i=istru,iend
644 IF (lbc_apply(ng)%north(i)) THEN
645!^ u(i,Jend+1,k,nout)=u(i,Jend,k,nout)
646!^
647 tl_u(i,jend+1,k,nout)=tl_u(i,jend,k,nout)
648# ifdef MASKING
649!^ u(i,Jend+1,k,nout)=u(i,Jend+1,k,nout)* &
650!^ & GRID(ng)%umask(i,Jend+1)
651!^
652 tl_u(i,jend+1,k,nout)=tl_u(i,jend+1,k,nout)* &
653 & grid(ng)%umask(i,jend+1)
654# endif
655 END IF
656 END DO
657 END DO
658!
659! Northern edge, closed boundary condition: free slip (gamma2=1) or
660! no slip (gamma2=-1).
661!
662 ELSE IF (tl_lbc(inorth,isuvel,ng)%closed) THEN
663 IF (ewperiodic(ng)) THEN
664 imin=istru
665 imax=iend
666 ELSE
667 imin=istr
668 imax=iendr
669 END IF
670 DO k=1,n(ng)
671 DO i=imin,imax
672 IF (lbc_apply(ng)%north(i)) THEN
673!^ u(i,Jend+1,k,nout)=gamma2(ng)*u(i,Jend,k,nout)
674!^
675 tl_u(i,jend+1,k,nout)=gamma2(ng)*tl_u(i,jend,k,nout)
676# ifdef MASKING
677!^ u(i,Jend+1,k,nout)=u(i,Jend+1,k,nout)* &
678!^ & GRID(ng)%umask(i,Jend+1)
679!^
680 tl_u(i,jend+1,k,nout)=tl_u(i,jend+1,k,nout)* &
681 & grid(ng)%umask(i,jend+1)
682# endif
683 END IF
684 END DO
685 END DO
686 END IF
687 END IF
688!
689!-----------------------------------------------------------------------
690! Boundary corners.
691!-----------------------------------------------------------------------
692!
693 IF (.not.(ewperiodic(ng).or.nsperiodic(ng))) THEN
694 IF (domain(ng)%SouthWest_Corner(tile)) THEN
695 IF (lbc_apply(ng)%south(istr ).and. &
696 & lbc_apply(ng)%west (jstr-1)) THEN
697 DO k=1,n(ng)
698!^ u(Istr,Jstr-1,k,nout)=0.5_r8*(u(Istr+1,Jstr-1,k,nout)+ &
699!^ & u(Istr ,Jstr ,k,nout))
700!^
701 tl_u(istr,jstr-1,k,nout)=0.5_r8* &
702 & (tl_u(istr+1,jstr-1,k,nout)+ &
703 & tl_u(istr ,jstr ,k,nout))
704 END DO
705 END IF
706 END IF
707 IF (domain(ng)%SouthEast_Corner(tile)) THEN
708 IF (lbc_apply(ng)%south(iend+1).and. &
709 & lbc_apply(ng)%east (jstr-1)) THEN
710 DO k=1,n(ng)
711!^ u(Iend+1,Jstr-1,k,nout)=0.5_r8*(u(Iend ,Jstr-1,k,nout)+ &
712!^ & u(Iend+1,Jstr ,k,nout))
713!^
714 tl_u(iend+1,jstr-1,k,nout)=0.5_r8* &
715 & (tl_u(iend ,jstr-1,k,nout)+ &
716 & tl_u(iend+1,jstr ,k,nout))
717 END DO
718 END IF
719 END IF
720 IF (domain(ng)%NorthWest_Corner(tile)) THEN
721 IF (lbc_apply(ng)%north(istr ).and. &
722 & lbc_apply(ng)%west (jend+1)) THEN
723 DO k=1,n(ng)
724!^ u(Istr,Jend+1,k,nout)=0.5_r8*(u(Istr ,Jend ,k,nout)+ &
725!^ & u(Istr+1,Jend+1,k,nout))
726!^
727 tl_u(istr,jend+1,k,nout)=0.5_r8* &
728 & (tl_u(istr ,jend ,k,nout)+ &
729 & tl_u(istr+1,jend+1,k,nout))
730 END DO
731 END IF
732 END IF
733 IF (domain(ng)%NorthEast_Corner(tile)) THEN
734 IF (lbc_apply(ng)%north(iend+1).and. &
735 & lbc_apply(ng)%east (jend+1)) THEN
736 DO k=1,n(ng)
737!^ u(Iend+1,Jend+1,k,nout)=0.5_r8*(u(Iend+1,Jend ,k,nout)+ &
738!^ & u(Iend ,Jend+1,k,nout))
739!^
740 tl_u(iend+1,jend+1,k,nout)=0.5_r8* &
741 & (tl_u(iend+1,jend ,k,nout)+ &
742 & tl_u(iend ,jend+1,k,nout))
743 END DO
744 END IF
745 END IF
746 END IF
747
748 RETURN
749 END SUBROUTINE tl_u3dbc_tile
750#endif
751 END MODULE tl_u3dbc_mod
type(t_boundary), dimension(:), allocatable boundary
type(t_apply), dimension(:), allocatable lbc_apply
type(t_clima), dimension(:), allocatable clima
Definition mod_clima.F:153
type(t_grid), dimension(:), allocatable grid
Definition mod_grid.F:365
integer isuvel
type(t_ocean), dimension(:), allocatable ocean
Definition mod_ocean.F:351
integer, dimension(:), allocatable n
Definition mod_param.F:479
type(t_lbc), dimension(:,:,:), allocatable tl_lbc
Definition mod_param.F:379
type(t_domain), dimension(:), allocatable domain
Definition mod_param.F:329
real(dp), dimension(:,:), allocatable m3obc_out
integer, dimension(:), allocatable iic
real(dp), dimension(:), allocatable dt
logical, dimension(:,:,:), allocatable lobc
logical, dimension(:), allocatable ewperiodic
integer, parameter iwest
logical, dimension(:), allocatable nsperiodic
real(dp), dimension(:), allocatable obcfac
real(r8), dimension(:), allocatable gamma2
logical, dimension(:), allocatable lnudgem3clm
integer, parameter isouth
integer, parameter ieast
integer, parameter inorth
real(dp), dimension(:,:), allocatable m3obc_in
integer, dimension(:), allocatable nstp
subroutine, public tl_u3dbc_tile(ng, tile, lbi, ubi, lbj, ubj, ubk, imins, imaxs, jmins, jmaxs, nstp, nout, tl_u)
Definition tl_u3dbc_im.F:57
subroutine, public tl_u3dbc(ng, tile, nout)
Definition tl_u3dbc_im.F:28