114 & LBi, UBi, LBj, UBj, &
115 & IminS, ImaxS, JminS, JmaxS, &
121 & om_p, om_r, on_p, on_r, &
122 & pm, pmon_p, pmon_r, &
123 & pn, pnom_p, pnom_r, &
124 & visc4_p, visc4_r, &
126!! & DiaRUfrc, DiaRVfrc, &
127!! & DiaU3wrk, DiaV3wrk, &
130 & tl_rufrc, tl_rvfrc, tl_u, tl_v)
139 integer,
intent(in) :: ng, tile
140 integer,
intent(in) :: LBi, UBi, LBj, UBj
141 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
142 integer,
intent(in) :: nrhs, nnew
146 real(r8),
intent(in) :: pmask(LBi:,LBj:)
148 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
149 real(r8),
intent(in) :: tl_Hz(LBi:,LBj:,:)
150 real(r8),
intent(in) :: om_p(LBi:,LBj:)
151 real(r8),
intent(in) :: om_r(LBi:,LBj:)
152 real(r8),
intent(in) :: on_p(LBi:,LBj:)
153 real(r8),
intent(in) :: on_r(LBi:,LBj:)
154 real(r8),
intent(in) :: pm(LBi:,LBj:)
155 real(r8),
intent(in) :: pmon_p(LBi:,LBj:)
156 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
157 real(r8),
intent(in) :: pn(LBi:,LBj:)
158 real(r8),
intent(in) :: pnom_p(LBi:,LBj:)
159 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
160 real(r8),
intent(in) :: visc4_p(LBi:,LBj:)
161 real(r8),
intent(in) :: visc4_r(LBi:,LBj:)
163 real(r8),
intent(in) :: u(LBi:,LBj:,:,:)
164 real(r8),
intent(in) :: v(LBi:,LBj:,:,:)
166# ifdef DIAGNOSTICS_UV
173 real(r8),
intent(inout) :: tl_rufrc(LBi:,LBj:)
174 real(r8),
intent(inout) :: tl_rvfrc(LBi:,LBj:)
175 real(r8),
intent(inout) :: tl_u(LBi:,LBj:,:,:)
176 real(r8),
intent(inout) :: tl_v(LBi:,LBj:,:,:)
181 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
183 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
184 real(r8),
intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
185 real(r8),
intent(in) :: om_p(LBi:UBi,LBj:UBj)
186 real(r8),
intent(in) :: om_r(LBi:UBi,LBj:UBj)
187 real(r8),
intent(in) :: on_p(LBi:UBi,LBj:UBj)
188 real(r8),
intent(in) :: on_r(LBi:UBi,LBj:UBj)
189 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
190 real(r8),
intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
192 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
193 real(r8),
intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
194 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
195 real(r8),
intent(in) :: visc4_p(LBi:UBi,LBj:UBj)
196 real(r8),
intent(in) :: visc4_r(LBi:UBi,LBj:UBj)
198 real(r8),
intent(inout) :: u(LBi:UBi,LBj:UBj,N(ng),2)
199 real(r8),
intent(inout) :: v(LBi:UBi,LBj:UBj,N(ng),2)
201# ifdef DIAGNOSTICS_UV
208 real(r8),
intent(inout) :: tl_rufrc(LBi:UBi,LBj:UBj)
209 real(r8),
intent(inout) :: tl_rvfrc(LBi:UBi,LBj:UBj)
210 real(r8),
intent(inout) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
211 real(r8),
intent(inout) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
216 integer :: IminU, IminV, ImaxU, ImaxV
217 integer :: JminU, JminV, JmaxU, JmaxV
220 real(r8) :: cff, cff1, cff2
221 real(r8) :: tl_cff, tl_cff1, tl_cff2
223 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: LapU
224 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: LapV
225 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFe
226 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFe
227 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFx
228 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFx
230 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_LapU
231 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_LapV
232 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_UFe
233 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_VFe
234 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_UFx
235 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_VFx
237#include "set_bounds.h"
254 imaxu=min(iend+1,
lm(ng))
256 imaxv=min(iend+1,
lm(ng))
265 jmaxu=min(jend+1,
mm(ng))
267 jmaxv=min(jend+1,
mm(ng))
277 k_loop :
DO k=1,n(ng)
280 cff=visc4_r(i,j)*0.5_r8* &
282 & ((pn(i ,j)+pn(i+1,j))*u(i+1,j,k,nrhs)- &
283 & (pn(i-1,j)+pn(i ,j))*u(i ,j,k,nrhs))- &
285 & ((pm(i,j )+pm(i,j+1))*v(i,j+1,k,nrhs)- &
286 & (pm(i,j-1)+pm(i,j ))*v(i,j ,k,nrhs)))
287 tl_cff=visc4_r(i,j)*0.5_r8* &
289 & ((pn(i ,j)+pn(i+1,j))*tl_u(i+1,j,k,nrhs)- &
290 & (pn(i-1,j)+pn(i ,j))*tl_u(i ,j,k,nrhs))- &
292 & ((pm(i,j )+pm(i,j+1))*tl_v(i,j+1,k,nrhs)- &
293 & (pm(i,j-1)+pm(i,j ))*tl_v(i,j ,k,nrhs)))
294 ufx(i,j)=on_r(i,j)*on_r(i,j)*cff
295 tl_ufx(i,j)=on_r(i,j)*on_r(i,j)*tl_cff
296 vfe(i,j)=om_r(i,j)*om_r(i,j)*cff
297 tl_vfe(i,j)=om_r(i,j)*om_r(i,j)*tl_cff
302 cff=visc4_p(i,j)*0.5_r8* &
304 & ((pn(i ,j-1)+pn(i ,j))*v(i ,j,k,nrhs)- &
305 & (pn(i-1,j-1)+pn(i-1,j))*v(i-1,j,k,nrhs))+ &
307 & ((pm(i-1,j )+pm(i,j ))*u(i,j ,k,nrhs)- &
308 & (pm(i-1,j-1)+pm(i,j-1))*u(i,j-1,k,nrhs)))
309 tl_cff=visc4_p(i,j)*0.5_r8* &
311 & ((pn(i ,j-1)+pn(i ,j))*tl_v(i ,j,k,nrhs)- &
312 & (pn(i-1,j-1)+pn(i-1,j))*tl_v(i-1,j,k,nrhs))+ &
314 & ((pm(i-1,j )+pm(i,j ))*tl_u(i,j ,k,nrhs)- &
315 & (pm(i-1,j-1)+pm(i,j-1))*tl_u(i,j-1,k,nrhs)))
318 tl_cff=tl_cff*pmask(i,j)
320 ufe(i,j)=om_p(i,j)*om_p(i,j)*cff
321 tl_ufe(i,j)=om_p(i,j)*om_p(i,j)*tl_cff
322 vfx(i,j)=on_p(i,j)*on_p(i,j)*cff
323 tl_vfx(i,j)=on_p(i,j)*on_p(i,j)*tl_cff
331 lapu(i,j)=0.125_r8* &
332 & (pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))* &
333 & ((pn(i-1,j)+pn(i,j))* &
334 & (ufx(i,j )-ufx(i-1,j))+ &
335 & (pm(i-1,j)+pm(i,j))* &
336 & (ufe(i,j+1)-ufe(i ,j)))
337 tl_lapu(i,j)=0.125_r8* &
338 & (pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))* &
339 & ((pn(i-1,j)+pn(i,j))* &
340 & (tl_ufx(i,j )-tl_ufx(i-1,j))+ &
341 & (pm(i-1,j)+pm(i,j))* &
342 & (tl_ufe(i,j+1)-tl_ufe(i ,j)))
347 lapv(i,j)=0.125_r8* &
348 & (pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))* &
349 & ((pn(i,j-1)+pn(i,j))* &
350 & (vfx(i+1,j)-vfx(i,j ))- &
351 & (pm(i,j-1)+pm(i,j))* &
352 & (vfe(i ,j)-vfe(i,j-1)))
353 tl_lapv(i,j)=0.125_r8* &
354 & (pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))* &
355 & ((pn(i,j-1)+pn(i,j))* &
356 & (tl_vfx(i+1,j)-tl_vfx(i,j ))- &
357 & (pm(i,j-1)+pm(i,j))* &
358 & (tl_vfe(i ,j)-tl_vfe(i,j-1)))
367 IF (
domain(ng)%Western_Edge(tile))
THEN
371 tl_lapu(istr,j)=0.0_r8
375 lapu(istr,j)=lapu(istr+1,j)
376 tl_lapu(istr,j)=tl_lapu(istr+1,j)
381 lapv(istr-1,j)=
gamma2(ng)*lapv(istr,j)
382 tl_lapv(istr-1,j)=
gamma2(ng)*tl_lapv(istr,j)
386 lapv(istr-1,j)=0.0_r8
387 tl_lapv(istr-1,j)=0.0_r8
394 IF (
domain(ng)%Eastern_Edge(tile))
THEN
397 lapu(iend+1,j)=0.0_r8
398 tl_lapu(iend+1,j)=0.0_r8
402 lapu(iend+1,j)=lapu(iend,j)
403 tl_lapu(iend+1,j)=tl_lapu(iend,j)
408 lapv(iend+1,j)=
gamma2(ng)*lapv(iend,j)
409 tl_lapv(iend+1,j)=
gamma2(ng)*tl_lapv(iend,j)
413 lapv(iend+1,j)=0.0_r8
414 tl_lapv(iend+1,j)=0.0_r8
421 IF (
domain(ng)%Southern_Edge(tile))
THEN
424 lapu(i,jstr-1)=
gamma2(ng)*lapu(i,jstr)
425 tl_lapu(i,jstr-1)=
gamma2(ng)*tl_lapu(i,jstr)
429 lapu(i,jstr-1)=0.0_r8
430 tl_lapu(i,jstr-1)=0.0_r8
436 tl_lapv(i,jstr)=0.0_r8
440 lapv(i,jstr)=lapv(i,jstr+1)
441 tl_lapv(i,jstr)=tl_lapv(i,jstr+1)
448 IF (
domain(ng)%Northern_Edge(tile))
THEN
451 lapu(i,jend+1)=
gamma2(ng)*lapu(i,jend)
452 tl_lapu(i,jend+1)=
gamma2(ng)*tl_lapu(i,jend)
456 lapu(i,jend+1)=0.0_r8
457 tl_lapu(i,jend+1)=0.0_r8
462 lapv(i,jend+1)=0.0_r8
463 tl_lapv(i,jend+1)=0.0_r8
467 lapv(i,jend+1)=lapv(i,jend)
468 tl_lapv(i,jend+1)=tl_lapv(i,jend)
476 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
477 lapu(istr ,jstr-1)=0.5_r8* &
478 & (lapu(istr+1,jstr-1)+ &
480 tl_lapu(istr ,jstr-1)=0.5_r8* &
481 & (tl_lapu(istr+1,jstr-1)+ &
482 & tl_lapu(istr ,jstr ))
483 lapv(istr-1,jstr )=0.5_r8* &
484 & (lapv(istr-1,jstr+1)+ &
486 tl_lapv(istr-1,jstr )=0.5_r8* &
487 & (tl_lapv(istr-1,jstr+1)+ &
488 & tl_lapv(istr ,jstr ))
494 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
495 lapu(iend+1,jstr-1)=0.5_r8* &
496 & (lapu(iend ,jstr-1)+ &
497 & lapu(iend+1,jstr ))
498 tl_lapu(iend+1,jstr-1)=0.5_r8* &
499 & (tl_lapu(iend ,jstr-1)+ &
500 & tl_lapu(iend+1,jstr ))
501 lapv(iend+1,jstr )=0.5_r8* &
502 & (lapv(iend ,jstr )+ &
503 & lapv(iend+1,jstr+1))
504 tl_lapv(iend+1,jstr )=0.5_r8* &
505 & (tl_lapv(iend ,jstr )+ &
506 & tl_lapv(iend+1,jstr+1))
512 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
513 lapu(istr ,jend+1)=0.5_r8* &
514 & (lapu(istr+1,jend+1)+ &
516 tl_lapu(istr ,jend+1)=0.5_r8* &
517 & (tl_lapu(istr+1,jend+1)+ &
518 & tl_lapu(istr ,jend ))
519 lapv(istr-1,jend+1)=0.5_r8* &
520 & (lapv(istr ,jend+1)+ &
521 & lapv(istr-1,jend ))
522 tl_lapv(istr-1,jend+1)=0.5_r8* &
523 & (tl_lapv(istr ,jend+1)+ &
524 & tl_lapv(istr-1,jend ))
530 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
531 lapu(iend+1,jend+1)=0.5_r8* &
532 & (lapu(iend ,jend+1)+ &
533 & lapu(iend+1,jend ))
534 tl_lapu(iend+1,jend+1)=0.5_r8* &
535 & (tl_lapu(iend ,jend+1)+ &
536 & tl_lapu(iend+1,jend ))
537 lapv(iend+1,jend+1)=0.5_r8* &
538 & (lapv(iend ,jend+1)+ &
539 & lapv(iend+1,jend ))
540 tl_lapv(iend+1,jend+1)=0.5_r8* &
541 & (tl_lapv(iend ,jend+1)+ &
542 & tl_lapv(iend+1,jend ))
559 tl_cff=visc4_r(i,j)*0.5_r8* &
562 & ((pn(i ,j)+pn(i+1,j))*lapu(i+1,j)- &
563 & (pn(i-1,j)+pn(i ,j))*lapu(i ,j))- &
565 & ((pm(i,j )+pm(i,j+1))*lapv(i,j+1)- &
566 & (pm(i,j-1)+pm(i,j ))*lapv(i,j )))+ &
569 & ((pn(i ,j)+pn(i+1,j))*tl_lapu(i+1,j)- &
570 & (pn(i-1,j)+pn(i ,j))*tl_lapu(i ,j))- &
572 & ((pm(i,j )+pm(i,j+1))*tl_lapv(i,j+1)- &
573 & (pm(i,j-1)+pm(i,j ))*tl_lapv(i,j ))))
576 tl_ufx(i,j)=on_r(i,j)*on_r(i,j)*tl_cff
579 tl_vfe(i,j)=om_r(i,j)*om_r(i,j)*tl_cff
593 tl_cff=visc4_p(i,j)*0.125_r8* &
594 & ((tl_hz(i-1,j ,k)+tl_hz(i,j ,k)+ &
595 & tl_hz(i-1,j-1,k)+tl_hz(i,j-1,k))* &
597 & ((pn(i ,j-1)+pn(i ,j))*lapv(i ,j)- &
598 & (pn(i-1,j-1)+pn(i-1,j))*lapv(i-1,j))+ &
600 & ((pm(i-1,j )+pm(i,j ))*lapu(i,j )- &
601 & (pm(i-1,j-1)+pm(i,j-1))*lapu(i,j-1)))+ &
602 & (hz(i-1,j ,k)+hz(i,j ,k)+ &
603 & hz(i-1,j-1,k)+hz(i,j-1,k))* &
605 & ((pn(i ,j-1)+pn(i ,j))*tl_lapv(i ,j)- &
606 & (pn(i-1,j-1)+pn(i-1,j))*tl_lapv(i-1,j))+ &
608 & ((pm(i-1,j )+pm(i,j ))*tl_lapu(i,j )- &
609 & (pm(i-1,j-1)+pm(i,j-1))*tl_lapu(i,j-1))))
613 tl_cff=tl_cff*pmask(i,j)
617 tl_ufe(i,j)=om_p(i,j)*om_p(i,j)*tl_cff
620 tl_vfx(i,j)=on_p(i,j)*on_p(i,j)*tl_cff
630 cff=0.25_r8*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
636 tl_cff1=0.5_r8*((pn(i-1,j)+pn(i,j))* &
637 & (tl_ufx(i,j )-tl_ufx(i-1,j))+ &
638 & (pm(i-1,j)+pm(i,j))* &
639 & (tl_ufe(i,j+1)-tl_ufe(i ,j)))
642 tl_cff2=
dt(ng)*cff*tl_cff1
645 tl_rufrc(i,j)=tl_rufrc(i,j)-tl_cff1
648 tl_u(i,j,k,nnew)=tl_u(i,j,k,nnew)-tl_cff2
657 cff=0.25_r8*(pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))
663 tl_cff1=0.5_r8*((pn(i,j-1)+pn(i,j))* &
664 & (tl_vfx(i+1,j)-tl_vfx(i,j ))- &
665 & (pm(i,j-1)+pm(i,j))* &
666 & (tl_vfe(i ,j)-tl_vfe(i,j-1)))
669 tl_cff2=
dt(ng)*cff*tl_cff1
672 tl_rvfrc(i,j)=tl_rvfrc(i,j)-tl_cff1
675 tl_v(i,j,k,nnew)=tl_v(i,j,k,nnew)-tl_cff2