120 & LBi, UBi, LBj, UBj, &
121 & IminS, ImaxS, JminS, JmaxS, &
130 & om_p, om_r, on_p, on_r, &
131 & pm, pmon_p, pmon_r, &
132 & pn, pnom_p, pnom_r, &
134# ifdef UV_U3ADV_SPLIT
135 & Uvis3d_r, Vvis3d_r, &
140 & visc4_p, visc4_r, &
143 & DiaRUfrc, DiaRVfrc, &
144 & DiaU3wrk, DiaV3wrk, &
146 & rufrc, rvfrc, u, v)
155 integer,
intent(in) :: ng, tile
156 integer,
intent(in) :: LBi, UBi, LBj, UBj
157 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
158 integer,
intent(in) :: nrhs, nnew
162 real(r8),
intent(in) :: pmask(LBi:,LBj:)
165 real(r8),
intent(in) :: pmask_wet(LBi:,LBj:)
167 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
168 real(r8),
intent(in) :: om_p(LBi:,LBj:)
169 real(r8),
intent(in) :: om_r(LBi:,LBj:)
170 real(r8),
intent(in) :: on_p(LBi:,LBj:)
171 real(r8),
intent(in) :: on_r(LBi:,LBj:)
172 real(r8),
intent(in) :: pm(LBi:,LBj:)
173 real(r8),
intent(in) :: pmon_p(LBi:,LBj:)
174 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
175 real(r8),
intent(in) :: pn(LBi:,LBj:)
176 real(r8),
intent(in) :: pnom_p(LBi:,LBj:)
177 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
179# ifdef UV_U3ADV_SPLIT
180 real(r8),
intent(in) :: Uvis3d_r(LBi:,LBj:,:)
181 real(r8),
intent(in) :: Vvis3d_r(LBi:,LBj:,:)
183 real(r8),
intent(in) :: visc3d_r(LBi:,LBj:,:)
186 real(r8),
intent(in) :: visc4_p(LBi:,LBj:)
187 real(r8),
intent(in) :: visc4_r(LBi:,LBj:)
189# ifdef DIAGNOSTICS_UV
190 real(r8),
intent(inout) :: DiaRUfrc(LBi:,LBj:,:,:)
191 real(r8),
intent(inout) :: DiaRVfrc(LBi:,LBj:,:,:)
192 real(r8),
intent(inout) :: DiaU3wrk(LBi:,LBj:,:,:)
193 real(r8),
intent(inout) :: DiaV3wrk(LBi:,LBj:,:,:)
195 real(r8),
intent(inout) :: rufrc(LBi:,LBj:)
196 real(r8),
intent(inout) :: rvfrc(LBi:,LBj:)
197 real(r8),
intent(inout) :: u(LBi:,LBj:,:,:)
198 real(r8),
intent(inout) :: v(LBi:,LBj:,:,:)
202 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
205 real(r8),
intent(in) :: pmask_wet(LBi:UBi,LBj:UBj)
207 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
208 real(r8),
intent(in) :: om_p(LBi:UBi,LBj:UBj)
209 real(r8),
intent(in) :: om_r(LBi:UBi,LBj:UBj)
210 real(r8),
intent(in) :: on_p(LBi:UBi,LBj:UBj)
211 real(r8),
intent(in) :: on_r(LBi:UBi,LBj:UBj)
212 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
213 real(r8),
intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
214 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
215 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
216 real(r8),
intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
217 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
219# ifdef UV_U3ADV_SPLIT
220 real(r8),
intent(in) :: Uvis3d_r(LBi:UBi,LBj:UBj,N(ng))
221 real(r8),
intent(in) :: Vvis3d_r(LBi:UBi,LBj:UBj,N(ng))
223 real(r8),
intent(in) :: visc3d_r(LBi:UBi,LBj:UBj,N(ng))
226 real(r8),
intent(in) :: visc4_p(LBi:UBi,LBj:UBj)
227 real(r8),
intent(in) :: visc4_r(LBi:UBi,LBj:UBj)
229# ifdef DIAGNOSTICS_UV
230 real(r8),
intent(inout) :: DiaRUfrc(LBi:UBi,LBj:UBj,3,NDM2d-1)
231 real(r8),
intent(inout) :: DiaRVfrc(LBi:UBi,LBj:UBj,3,NDM2d-1)
232 real(r8),
intent(inout) :: DiaU3wrk(LBi:UBi,LBj:UBj,N(ng),NDM3d)
233 real(r8),
intent(inout) :: DiaV3wrk(LBi:UBi,LBj:UBj,N(ng),NDM3d)
235 real(r8),
intent(inout) :: rufrc(LBi:UBi,LBj:UBj)
236 real(r8),
intent(inout) :: rvfrc(LBi:UBi,LBj:UBj)
237 real(r8),
intent(inout) :: u(LBi:UBi,LBj:UBj,N(ng),2)
238 real(r8),
intent(inout) :: v(LBi:UBi,LBj:UBj,N(ng),2)
243 integer :: IminU, IminV, ImaxU, ImaxV
244 integer :: JminU, JminV, JmaxU, JmaxV
247 real(r8) :: cff, cff1, cff2, cff3
249 real(r8) :: Uvis_p, Vvis_p, visc_p
251 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: LapU
252 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: LapV
253 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFe
254 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFe
255 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFx
256 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFx
258#include "set_bounds.h"
275 imaxu=min(iend+1,
lm(ng))
277 imaxv=min(iend+1,
lm(ng))
286 jmaxu=min(jend+1,
mm(ng))
288 jmaxv=min(jend+1,
mm(ng))
298 k_loop :
DO k=1,n(ng)
303 & ((pn(i ,j)+pn(i+1,j))*u(i+1,j,k,nrhs)- &
304 & (pn(i-1,j)+pn(i ,j))*u(i ,j,k,nrhs))- &
306 & ((pm(i,j )+pm(i,j+1))*v(i,j+1,k,nrhs)- &
307 & (pm(i,j-1)+pm(i,j ))*v(i,j ,k,nrhs)))
309# ifdef UV_U3ADV_SPLIT
310 ufx(i,j)=on_r(i,j)*on_r(i,j)*uvis3d_r(i,j,k)*cff
311 vfe(i,j)=om_r(i,j)*om_r(i,j)*vvis3d_r(i,j,k)*cff
313 ufx(i,j)=on_r(i,j)*on_r(i,j)*visc3d_r(i,j,k)*cff
314 vfe(i,j)=om_r(i,j)*om_r(i,j)*visc3d_r(i,j,k)*cff
317 ufx(i,j)=on_r(i,j)*on_r(i,j)*visc4_r(i,j)*cff
318 vfe(i,j)=om_r(i,j)*om_r(i,j)*visc4_r(i,j)*cff
326 & ((pn(i ,j-1)+pn(i ,j))*v(i ,j,k,nrhs)- &
327 & (pn(i-1,j-1)+pn(i-1,j))*v(i-1,j,k,nrhs))+ &
329 & ((pm(i-1,j )+pm(i,j ))*u(i,j ,k,nrhs)- &
330 & (pm(i-1,j-1)+pm(i,j-1))*u(i,j-1,k,nrhs)))
335 cff=cff*pmask_wet(i,j)
338# ifdef UV_U3ADV_SPLIT
339 uvis_p=0.25_r8*(uvis3d_r(i-1,j-1,k)+uvis3d_r(i-1,j,k)+ &
340 & uvis3d_r(i ,j-1,k)+uvis3d_r(i ,j,k))
341 vvis_p=0.25_r8*(vvis3d_r(i-1,j-1,k)+vvis3d_r(i-1,j,k)+ &
342 & vvis3d_r(i ,j-1,k)+vvis3d_r(i ,j,k))
343 ufe(i,j)=om_p(i,j)*om_p(i,j)*uvis_p*cff
344 vfx(i,j)=on_p(i,j)*on_p(i,j)*vvis_p*cff
346 visc_p=0.25_r8*(visc3d_r(i-1,j-1,k)+visc3d_r(i-1,j,k)+ &
347 & visc3d_r(i ,j-1,k)+visc3d_r(i ,j,k))
348 ufe(i,j)=om_p(i,j)*om_p(i,j)*visc_p*cff
349 vfx(i,j)=on_p(i,j)*on_p(i,j)*visc_p*cff
352 ufe(i,j)=om_p(i,j)*om_p(i,j)*visc4_p(i,j)*cff
353 vfx(i,j)=on_p(i,j)*on_p(i,j)*visc4_p(i,j)*cff
362 lapu(i,j)=0.125_r8* &
363 & (pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))* &
364 & ((pn(i-1,j)+pn(i,j))*(ufx(i,j )-ufx(i-1,j))+ &
365 & (pm(i-1,j)+pm(i,j))*(ufe(i,j+1)-ufe(i ,j)))
370 lapv(i,j)=0.125_r8* &
371 & (pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))* &
372 & ((pn(i,j-1)+pn(i,j))*(vfx(i+1,j)-vfx(i,j ))- &
373 & (pm(i,j-1)+pm(i,j))*(vfe(i ,j)-vfe(i,j-1)))
382 IF (
domain(ng)%Western_Edge(tile))
THEN
389 lapu(istr,j)=lapu(istr+1,j)
394 lapv(istr-1,j)=
gamma2(ng)*lapv(istr,j)
398 lapv(istr-1,j)=0.0_r8
405 IF (
domain(ng)%Eastern_Edge(tile))
THEN
408 lapu(iend+1,j)=0.0_r8
412 lapu(iend+1,j)=lapu(iend,j)
417 lapv(iend+1,j)=
gamma2(ng)*lapv(iend,j)
421 lapv(iend+1,j)=0.0_r8
428 IF (
domain(ng)%Southern_Edge(tile))
THEN
431 lapu(i,jstr-1)=
gamma2(ng)*lapu(i,jstr)
435 lapu(i,jstr-1)=0.0_r8
444 lapv(i,jstr)=lapv(i,jstr+1)
451 IF (
domain(ng)%Northern_Edge(tile))
THEN
454 lapu(i,jend+1)=
gamma2(ng)*lapu(i,jend)
458 lapu(i,jend+1)=0.0_r8
463 lapv(i,jend+1)=0.0_r8
467 lapv(i,jend+1)=lapv(i,jend)
475 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
476 lapu(istr ,jstr-1)=0.5_r8* &
477 & (lapu(istr+1,jstr-1)+ &
479 lapv(istr-1,jstr )=0.5_r8* &
480 & (lapv(istr-1,jstr+1)+ &
487 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
488 lapu(iend+1,jstr-1)=0.5_r8* &
489 & (lapu(iend ,jstr-1)+ &
490 & lapu(iend+1,jstr ))
491 lapv(iend+1,jstr )=0.5_r8* &
492 & (lapv(iend ,jstr )+ &
493 & lapv(iend+1,jstr+1))
499 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
500 lapu(istr ,jend+1)=0.5_r8* &
501 & (lapu(istr+1,jend+1)+ &
503 lapv(istr-1,jend+1)=0.5_r8* &
504 & (lapv(istr ,jend+1)+ &
505 & lapv(istr-1,jend ))
511 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
512 lapu(iend+1,jend+1)=0.5_r8* &
513 & (lapu(iend ,jend+1)+ &
514 & lapu(iend+1,jend ))
515 lapv(iend+1,jend+1)=0.5_r8* &
516 & (lapv(iend ,jend+1)+ &
517 & lapv(iend+1,jend ))
526 cff=hz(i,j,k)*0.5_r8* &
528 & ((pn(i ,j)+pn(i+1,j))*lapu(i+1,j)- &
529 & (pn(i-1,j)+pn(i ,j))*lapu(i ,j))- &
531 & ((pm(i,j )+pm(i,j+1))*lapv(i,j+1)- &
532 & (pm(i,j-1)+pm(i,j ))*lapv(i,j )))
534# ifdef UV_U3ADV_SPLIT
535 ufx(i,j)=on_r(i,j)*on_r(i,j)*uvis3d_r(i,j,k)*cff
536 vfe(i,j)=om_r(i,j)*om_r(i,j)*vvis3d_r(i,j,k)*cff
538 ufx(i,j)=on_r(i,j)*on_r(i,j)*visc3d_r(i,j,k)*cff
539 vfe(i,j)=om_r(i,j)*om_r(i,j)*visc3d_r(i,j,k)*cff
542 ufx(i,j)=on_r(i,j)*on_r(i,j)*visc4_r(i,j)*cff
543 vfe(i,j)=om_r(i,j)*om_r(i,j)*visc4_r(i,j)*cff
549 cff=0.125_r8*(hz(i-1,j ,k)+hz(i,j ,k)+ &
550 & hz(i-1,j-1,k)+hz(i,j-1,k))* &
552 & ((pn(i ,j-1)+pn(i ,j))*lapv(i ,j)- &
553 & (pn(i-1,j-1)+pn(i-1,j))*lapv(i-1,j))+ &
555 & ((pm(i-1,j )+pm(i,j ))*lapu(i,j )- &
556 & (pm(i-1,j-1)+pm(i,j-1))*lapu(i,j-1)))
561 cff=cff*pmask_wet(i,j)
564# ifdef UV_U3ADV_SPLIT
565 uvis_p=0.25_r8*(uvis3d_r(i-1,j-1,k)+uvis3d_r(i-1,j,k)+ &
566 & uvis3d_r(i ,j-1,k)+uvis3d_r(i ,j,k))
567 vvis_p=0.25_r8*(vvis3d_r(i-1,j-1,k)+vvis3d_r(i-1,j,k)+ &
568 & vvis3d_r(i ,j-1,k)+vvis3d_r(i ,j,k))
569 ufe(i,j)=om_p(i,j)*om_p(i,j)*uvis_p*cff
570 vfx(i,j)=on_p(i,j)*on_p(i,j)*vvis_p*cff
572 visc_p=0.25_r8*(visc3d_r(i-1,j-1,k)+visc3d_r(i-1,j,k)+ &
573 & visc3d_r(i ,j-1,k)+visc3d_r(i ,j,k))
574 ufe(i,j)=om_p(i,j)*om_p(i,j)*visc_p*cff
575 vfx(i,j)=on_p(i,j)*on_p(i,j)*visc_p*cff
578 ufe(i,j)=om_p(i,j)*om_p(i,j)*visc4_p(i,j)*cff
579 vfx(i,j)=on_p(i,j)*on_p(i,j)*visc4_p(i,j)*cff
590 cff=
dt(ng)*0.25_r8*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
591 cff1=0.5_r8*(pn(i-1,j)+pn(i,j))*(ufx(i,j )-ufx(i-1,j))
592 cff2=0.5_r8*(pm(i-1,j)+pm(i,j))*(ufe(i,j+1)-ufe(i ,j))
594 rufrc(i,j)=rufrc(i,j)-cff1-cff2
595 u(i,j,k,nnew)=u(i,j,k,nnew)-cff3
600 diau3wrk(i,j,k,
m3hvis)=-cff3
601 diau3wrk(i,j,k,
m3xvis)=-cff*cff1
602 diau3wrk(i,j,k,
m3yvis)=-cff*cff2
608 cff=
dt(ng)*0.25_r8*(pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))
609 cff1=0.5_r8*(pn(i,j-1)+pn(i,j))*(vfx(i+1,j)-vfx(i,j ))
610 cff2=0.5_r8*(pm(i,j-1)+pm(i,j))*(vfe(i ,j)-vfe(i,j-1))
612 rvfrc(i,j)=rvfrc(i,j)-cff1+cff2
613 v(i,j,k,nnew)=v(i,j,k,nnew)-cff3
618 diav3wrk(i,j,k,
m3hvis)=-cff3
619 diav3wrk(i,j,k,
m3xvis)=-cff*cff1
620 diav3wrk(i,j,k,
m3yvis)= cff*cff2