115 & LBi, UBi, LBj, UBj, &
116 & IminS, ImaxS, JminS, JmaxS, &
122 & om_p, om_r, on_p, on_r, &
123 & pm, pmon_p, pmon_r, &
124 & pn, pnom_p, pnom_r, &
125 & visc4_p, visc4_r, &
127!! & DiaRUfrc, DiaRVfrc, &
128!! & DiaU3wrk, DiaV3wrk, &
131 & tl_rufrc, tl_rvfrc, tl_u, tl_v)
140 integer,
intent(in) :: ng, tile
141 integer,
intent(in) :: LBi, UBi, LBj, UBj
142 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
143 integer,
intent(in) :: nrhs, nnew
147 real(r8),
intent(in) :: pmask(LBi:,LBj:)
149 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
150 real(r8),
intent(in) :: tl_Hz(LBi:,LBj:,:)
151 real(r8),
intent(in) :: om_p(LBi:,LBj:)
152 real(r8),
intent(in) :: om_r(LBi:,LBj:)
153 real(r8),
intent(in) :: on_p(LBi:,LBj:)
154 real(r8),
intent(in) :: on_r(LBi:,LBj:)
155 real(r8),
intent(in) :: pm(LBi:,LBj:)
156 real(r8),
intent(in) :: pmon_p(LBi:,LBj:)
157 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
158 real(r8),
intent(in) :: pn(LBi:,LBj:)
159 real(r8),
intent(in) :: pnom_p(LBi:,LBj:)
160 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
161 real(r8),
intent(in) :: visc4_p(LBi:,LBj:)
162 real(r8),
intent(in) :: visc4_r(LBi:,LBj:)
164 real(r8),
intent(in) :: u(LBi:,LBj:,:,:)
165 real(r8),
intent(in) :: v(LBi:,LBj:,:,:)
167# ifdef DIAGNOSTICS_UV
174 real(r8),
intent(inout) :: tl_rufrc(LBi:,LBj:)
175 real(r8),
intent(inout) :: tl_rvfrc(LBi:,LBj:)
176 real(r8),
intent(inout) :: tl_u(LBi:,LBj:,:,:)
177 real(r8),
intent(inout) :: tl_v(LBi:,LBj:,:,:)
182 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
184 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
185 real(r8),
intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
186 real(r8),
intent(in) :: om_p(LBi:UBi,LBj:UBj)
187 real(r8),
intent(in) :: om_r(LBi:UBi,LBj:UBj)
188 real(r8),
intent(in) :: on_p(LBi:UBi,LBj:UBj)
189 real(r8),
intent(in) :: on_r(LBi:UBi,LBj:UBj)
190 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
192 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
193 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
194 real(r8),
intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
195 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
196 real(r8),
intent(in) :: visc4_p(LBi:UBi,LBj:UBj)
197 real(r8),
intent(in) :: visc4_r(LBi:UBi,LBj:UBj)
199 real(r8),
intent(inout) :: u(LBi:UBi,LBj:UBj,N(ng),2)
200 real(r8),
intent(inout) :: v(LBi:UBi,LBj:UBj,N(ng),2)
202# ifdef DIAGNOSTICS_UV
209 real(r8),
intent(inout) :: tl_rufrc(LBi:UBi,LBj:UBj)
210 real(r8),
intent(inout) :: tl_rvfrc(LBi:UBi,LBj:UBj)
211 real(r8),
intent(inout) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
212 real(r8),
intent(inout) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
217 integer :: IminU, IminV, ImaxU, ImaxV
218 integer :: JminU, JminV, JmaxU, JmaxV
221 real(r8) :: cff, cff1, cff2
222 real(r8) :: tl_cff, tl_cff1, tl_cff2
224 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: LapU
225 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: LapV
226 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFe
227 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFe
228 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFx
229 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFx
231 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_LapU
232 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_LapV
233 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_UFe
234 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_VFe
235 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_UFx
236 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_VFx
238#include "set_bounds.h"
255 imaxu=min(iend+1,
lm(ng))
257 imaxv=min(iend+1,
lm(ng))
266 jmaxu=min(jend+1,
mm(ng))
268 jmaxv=min(jend+1,
mm(ng))
278 k_loop :
DO k=1,n(ng)
281 cff=visc4_r(i,j)*0.5_r8* &
283 & ((pn(i ,j)+pn(i+1,j))*u(i+1,j,k,nrhs)- &
284 & (pn(i-1,j)+pn(i ,j))*u(i ,j,k,nrhs))- &
286 & ((pm(i,j )+pm(i,j+1))*v(i,j+1,k,nrhs)- &
287 & (pm(i,j-1)+pm(i,j ))*v(i,j ,k,nrhs)))
288 tl_cff=visc4_r(i,j)*0.5_r8* &
290 & ((pn(i ,j)+pn(i+1,j))*tl_u(i+1,j,k,nrhs)- &
291 & (pn(i-1,j)+pn(i ,j))*tl_u(i ,j,k,nrhs))- &
293 & ((pm(i,j )+pm(i,j+1))*tl_v(i,j+1,k,nrhs)- &
294 & (pm(i,j-1)+pm(i,j ))*tl_v(i,j ,k,nrhs)))
295 ufx(i,j)=on_r(i,j)*on_r(i,j)*cff
296 tl_ufx(i,j)=on_r(i,j)*on_r(i,j)*tl_cff
297 vfe(i,j)=om_r(i,j)*om_r(i,j)*cff
298 tl_vfe(i,j)=om_r(i,j)*om_r(i,j)*tl_cff
303 cff=visc4_p(i,j)*0.5_r8* &
305 & ((pn(i ,j-1)+pn(i ,j))*v(i ,j,k,nrhs)- &
306 & (pn(i-1,j-1)+pn(i-1,j))*v(i-1,j,k,nrhs))+ &
308 & ((pm(i-1,j )+pm(i,j ))*u(i,j ,k,nrhs)- &
309 & (pm(i-1,j-1)+pm(i,j-1))*u(i,j-1,k,nrhs)))
310 tl_cff=visc4_p(i,j)*0.5_r8* &
312 & ((pn(i ,j-1)+pn(i ,j))*tl_v(i ,j,k,nrhs)- &
313 & (pn(i-1,j-1)+pn(i-1,j))*tl_v(i-1,j,k,nrhs))+ &
315 & ((pm(i-1,j )+pm(i,j ))*tl_u(i,j ,k,nrhs)- &
316 & (pm(i-1,j-1)+pm(i,j-1))*tl_u(i,j-1,k,nrhs)))
319 tl_cff=tl_cff*pmask(i,j)
321 ufe(i,j)=om_p(i,j)*om_p(i,j)*cff
322 tl_ufe(i,j)=om_p(i,j)*om_p(i,j)*tl_cff
323 vfx(i,j)=on_p(i,j)*on_p(i,j)*cff
324 tl_vfx(i,j)=on_p(i,j)*on_p(i,j)*tl_cff
332 lapu(i,j)=0.125_r8* &
333 & (pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))* &
334 & ((pn(i-1,j)+pn(i,j))* &
335 & (ufx(i,j )-ufx(i-1,j))+ &
336 & (pm(i-1,j)+pm(i,j))* &
337 & (ufe(i,j+1)-ufe(i ,j)))
338 tl_lapu(i,j)=0.125_r8* &
339 & (pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))* &
340 & ((pn(i-1,j)+pn(i,j))* &
341 & (tl_ufx(i,j )-tl_ufx(i-1,j))+ &
342 & (pm(i-1,j)+pm(i,j))* &
343 & (tl_ufe(i,j+1)-tl_ufe(i ,j)))
348 lapv(i,j)=0.125_r8* &
349 & (pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))* &
350 & ((pn(i,j-1)+pn(i,j))* &
351 & (vfx(i+1,j)-vfx(i,j ))- &
352 & (pm(i,j-1)+pm(i,j))* &
353 & (vfe(i ,j)-vfe(i,j-1)))
354 tl_lapv(i,j)=0.125_r8* &
355 & (pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))* &
356 & ((pn(i,j-1)+pn(i,j))* &
357 & (tl_vfx(i+1,j)-tl_vfx(i,j ))- &
358 & (pm(i,j-1)+pm(i,j))* &
359 & (tl_vfe(i ,j)-tl_vfe(i,j-1)))
368 IF (
domain(ng)%Western_Edge(tile))
THEN
372 tl_lapu(istr,j)=0.0_r8
376 lapu(istr,j)=lapu(istr+1,j)
377 tl_lapu(istr,j)=tl_lapu(istr+1,j)
382 lapv(istr-1,j)=
gamma2(ng)*lapv(istr,j)
383 tl_lapv(istr-1,j)=
gamma2(ng)*tl_lapv(istr,j)
387 lapv(istr-1,j)=0.0_r8
388 tl_lapv(istr-1,j)=0.0_r8
395 IF (
domain(ng)%Eastern_Edge(tile))
THEN
398 lapu(iend+1,j)=0.0_r8
399 tl_lapu(iend+1,j)=0.0_r8
403 lapu(iend+1,j)=lapu(iend,j)
404 tl_lapu(iend+1,j)=tl_lapu(iend,j)
409 lapv(iend+1,j)=
gamma2(ng)*lapv(iend,j)
410 tl_lapv(iend+1,j)=
gamma2(ng)*tl_lapv(iend,j)
414 lapv(iend+1,j)=0.0_r8
415 tl_lapv(iend+1,j)=0.0_r8
422 IF (
domain(ng)%Southern_Edge(tile))
THEN
425 lapu(i,jstr-1)=
gamma2(ng)*lapu(i,jstr)
426 tl_lapu(i,jstr-1)=
gamma2(ng)*tl_lapu(i,jstr)
430 lapu(i,jstr-1)=0.0_r8
431 tl_lapu(i,jstr-1)=0.0_r8
437 tl_lapv(i,jstr)=0.0_r8
441 lapv(i,jstr)=lapv(i,jstr+1)
442 tl_lapv(i,jstr)=tl_lapv(i,jstr+1)
449 IF (
domain(ng)%Northern_Edge(tile))
THEN
452 lapu(i,jend+1)=
gamma2(ng)*lapu(i,jend)
453 tl_lapu(i,jend+1)=
gamma2(ng)*tl_lapu(i,jend)
457 lapu(i,jend+1)=0.0_r8
458 tl_lapu(i,jend+1)=0.0_r8
463 lapv(i,jend+1)=0.0_r8
464 tl_lapv(i,jend+1)=0.0_r8
468 lapv(i,jend+1)=lapv(i,jend)
469 tl_lapv(i,jend+1)=tl_lapv(i,jend)
477 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
478 lapu(istr ,jstr-1)=0.5_r8* &
479 & (lapu(istr+1,jstr-1)+ &
481 tl_lapu(istr ,jstr-1)=0.5_r8* &
482 & (tl_lapu(istr+1,jstr-1)+ &
483 & tl_lapu(istr ,jstr ))
484 lapv(istr-1,jstr )=0.5_r8* &
485 & (lapv(istr-1,jstr+1)+ &
487 tl_lapv(istr-1,jstr )=0.5_r8* &
488 & (tl_lapv(istr-1,jstr+1)+ &
489 & tl_lapv(istr ,jstr ))
495 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
496 lapu(iend+1,jstr-1)=0.5_r8* &
497 & (lapu(iend ,jstr-1)+ &
498 & lapu(iend+1,jstr ))
499 tl_lapu(iend+1,jstr-1)=0.5_r8* &
500 & (tl_lapu(iend ,jstr-1)+ &
501 & tl_lapu(iend+1,jstr ))
502 lapv(iend+1,jstr )=0.5_r8* &
503 & (lapv(iend ,jstr )+ &
504 & lapv(iend+1,jstr+1))
505 tl_lapv(iend+1,jstr )=0.5_r8* &
506 & (tl_lapv(iend ,jstr )+ &
507 & tl_lapv(iend+1,jstr+1))
513 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
514 lapu(istr ,jend+1)=0.5_r8* &
515 & (lapu(istr+1,jend+1)+ &
517 tl_lapu(istr ,jend+1)=0.5_r8* &
518 & (tl_lapu(istr+1,jend+1)+ &
519 & tl_lapu(istr ,jend ))
520 lapv(istr-1,jend+1)=0.5_r8* &
521 & (lapv(istr ,jend+1)+ &
522 & lapv(istr-1,jend ))
523 tl_lapv(istr-1,jend+1)=0.5_r8* &
524 & (tl_lapv(istr ,jend+1)+ &
525 & tl_lapv(istr-1,jend ))
531 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
532 lapu(iend+1,jend+1)=0.5_r8* &
533 & (lapu(iend ,jend+1)+ &
534 & lapu(iend+1,jend ))
535 tl_lapu(iend+1,jend+1)=0.5_r8* &
536 & (tl_lapu(iend ,jend+1)+ &
537 & tl_lapu(iend+1,jend ))
538 lapv(iend+1,jend+1)=0.5_r8* &
539 & (lapv(iend ,jend+1)+ &
540 & lapv(iend+1,jend ))
541 tl_lapv(iend+1,jend+1)=0.5_r8* &
542 & (tl_lapv(iend ,jend+1)+ &
543 & tl_lapv(iend+1,jend ))
552 cff=visc4_r(i,j)*hz(i,j,k)*0.5_r8* &
554 & ((pn(i ,j)+pn(i+1,j))*lapu(i+1,j)- &
555 & (pn(i-1,j)+pn(i ,j))*lapu(i ,j))- &
557 & ((pm(i,j )+pm(i,j+1))*lapv(i,j+1)- &
558 & (pm(i,j-1)+pm(i,j ))*lapv(i,j )))
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 ))))- &
579 tl_ufx(i,j)=on_r(i,j)*on_r(i,j)*tl_cff
582 tl_vfe(i,j)=om_r(i,j)*om_r(i,j)*tl_cff
587 cff=visc4_p(i,j)*0.125_r8*(hz(i-1,j ,k)+hz(i,j ,k)+ &
588 & hz(i-1,j-1,k)+hz(i,j-1,k))* &
590 & ((pn(i ,j-1)+pn(i ,j))*lapv(i ,j)- &
591 & (pn(i-1,j-1)+pn(i-1,j))*lapv(i-1,j))+ &
593 & ((pm(i-1,j )+pm(i,j ))*lapu(i,j )- &
594 & (pm(i-1,j-1)+pm(i,j-1))*lapu(i,j-1)))
595 tl_cff=visc4_p(i,j)*0.125_r8* &
596 & ((tl_hz(i-1,j ,k)+tl_hz(i,j ,k)+ &
597 & tl_hz(i-1,j-1,k)+tl_hz(i,j-1,k))* &
599 & ((pn(i ,j-1)+pn(i ,j))*lapv(i ,j)- &
600 & (pn(i-1,j-1)+pn(i-1,j))*lapv(i-1,j))+ &
602 & ((pm(i-1,j )+pm(i,j ))*lapu(i,j )- &
603 & (pm(i-1,j-1)+pm(i,j-1))*lapu(i,j-1)))+ &
604 & (hz(i-1,j ,k)+hz(i,j ,k)+ &
605 & hz(i-1,j-1,k)+hz(i,j-1,k))* &
607 & ((pn(i ,j-1)+pn(i ,j))*tl_lapv(i ,j)- &
608 & (pn(i-1,j-1)+pn(i-1,j))*tl_lapv(i-1,j))+ &
610 & ((pm(i-1,j )+pm(i,j ))*tl_lapu(i,j )- &
611 & (pm(i-1,j-1)+pm(i,j-1))*tl_lapu(i,j-1))))- &
618 tl_cff=tl_cff*pmask(i,j)
622 tl_ufe(i,j)=om_p(i,j)*om_p(i,j)*tl_cff
625 tl_vfx(i,j)=on_p(i,j)*on_p(i,j)*tl_cff
635 cff=0.25_r8*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
641 tl_cff1=0.5_r8*((pn(i-1,j)+pn(i,j))* &
642 & (tl_ufx(i,j )-tl_ufx(i-1,j))+ &
643 & (pm(i-1,j)+pm(i,j))* &
644 & (tl_ufe(i,j+1)-tl_ufe(i ,j)))
647 tl_cff2=
dt(ng)*cff*tl_cff1
650 tl_rufrc(i,j)=tl_rufrc(i,j)-tl_cff1
653 tl_u(i,j,k,nnew)=tl_u(i,j,k,nnew)-tl_cff2
662 cff=0.25_r8*(pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))
668 tl_cff1=0.5_r8*((pn(i,j-1)+pn(i,j))* &
669 & (tl_vfx(i+1,j)-tl_vfx(i,j ))- &
670 & (pm(i,j-1)+pm(i,j))* &
671 & (tl_vfe(i ,j)-tl_vfe(i,j-1)))
674 tl_cff2=
dt(ng)*cff*tl_cff1
677 tl_rvfrc(i,j)=tl_rvfrc(i,j)-tl_cff1
680 tl_v(i,j,k,nnew)=tl_v(i,j,k,nnew)-tl_cff2