171 & LBi, UBi, LBj, UBj, UBk, &
172 & IminS, ImaxS, JminS, JmaxS, &
173 & krhs, kstp, knew, &
178 & pmask, rmask, umask, vmask, &
181 & pmask_wet, pmask_full, &
182 & rmask_wet, rmask_full, &
183 & umask_wet, umask_full, &
184 & vmask_wet, vmask_full, &
189#if (defined UV_COR && !defined SOLVE3D) || defined step2d_coriolis
193 & om_u, om_v, on_u, on_v, pm, pn, &
194#if defined CURVGRID && defined UV_ADV && !defined SOLVE3D
198#if defined UV_QDRAG && !defined SOLVE3D
201#if (defined UV_VIS2 || defined UV_VIS4) && !defined SOLVE3D
202 & pmon_r, pnom_r, pmon_p, pnom_p, &
203 & om_r, on_r, om_p, on_p, &
205 & visc2_p, visc2_r, &
208 & visc4_p, visc4_r, &
211#if defined SEDIMENT && defined SED_MORPH
214#if defined TIDE_GENERATING_FORCES && !defined SOLVE3D
226 & du_avg1, du_avg2, &
227 & dv_avg1, dv_avg2, &
230 & rufrc_bak, rvfrc_bak, &
233 & diau2wrk, diav2wrk, &
234 & diarubar, diarvbar, &
236 & diau2int, diav2int, &
237 & diarufrc, diarvfrc, &
240#if defined NESTING && !defined SOLVE3D
241 & du_flux, dv_flux, &
248 integer,
intent(in ) :: ng, tile
249 integer,
intent(in ) :: LBi, UBi, LBj, UBj, UBk
250 integer,
intent(in ) :: IminS, ImaxS, JminS, JmaxS
251 integer,
intent(in ) :: krhs, kstp, knew
253 integer,
intent(in ) :: nstp, nnew
258 real(r8),
intent(in ) :: pmask(LBi:,LBj:)
259 real(r8),
intent(in ) :: rmask(LBi:,LBj:)
260 real(r8),
intent(in ) :: umask(LBi:,LBj:)
261 real(r8),
intent(in ) :: vmask(LBi:,LBj:)
263# if (defined UV_COR && !defined SOLVE3D) || defined STEP2D_CORIOLIS
264 real(r8),
intent(in ) :: fomn(LBi:,LBj:)
266# if defined SEDIMENT && defined SED_MORPH
267 real(r8),
intent(inout) :: h(LBi:,LBj:)
269 real(r8),
intent(in ) :: h(LBi:,LBj:)
271 real(r8),
intent(in ) :: om_u(LBi:,LBj:)
272 real(r8),
intent(in ) :: om_v(LBi:,LBj:)
273 real(r8),
intent(in ) :: on_u(LBi:,LBj:)
274 real(r8),
intent(in ) :: on_v(LBi:,LBj:)
275 real(r8),
intent(in ) :: pm(LBi:,LBj:)
276 real(r8),
intent(in ) :: pn(LBi:,LBj:)
277# if defined CURVGRID && defined UV_ADV && !defined SOLVE3D
278 real(r8),
intent(in ) :: dndx(LBi:,LBj:)
279 real(r8),
intent(in ) :: dmde(LBi:,LBj:)
281 real(r8),
intent(in ) :: rdrag(LBi:,LBj:)
282# if defined UV_QDRAG && !defined SOLVE3D
283 real(r8),
intent(in ) :: rdrag2(LBi:,LBj:)
285# if (defined UV_VIS2 || defined UV_VIS4) && !defined SOLVE3D
286 real(r8),
intent(in ) :: pmon_r(LBi:,LBj:)
287 real(r8),
intent(in ) :: pnom_r(LBi:,LBj:)
288 real(r8),
intent(in ) :: pmon_p(LBi:,LBj:)
289 real(r8),
intent(in ) :: pnom_p(LBi:,LBj:)
290 real(r8),
intent(in ) :: om_r(LBi:,LBj:)
291 real(r8),
intent(in ) :: on_r(LBi:,LBj:)
292 real(r8),
intent(in ) :: om_p(LBi:,LBj:)
293 real(r8),
intent(in ) :: on_p(LBi:,LBj:)
295 real(r8),
intent(in ) :: visc2_p(LBi:,LBj:)
296 real(r8),
intent(in ) :: visc2_r(LBi:,LBj:)
299 real(r8),
intent(in ) :: visc4_p(LBi:,LBj:)
300 real(r8),
intent(in ) :: visc4_r(LBi:,LBj:)
303# if defined SEDIMENT && defined SED_MORPH
304 real(r8),
intent(in ) :: bed_thick(LBi:,LBj:,:)
306# if defined TIDE_GENERATING_FORCES && !defined SOLVE3D
307 real(r8),
intent(in ) :: eq_tide(LBi:,LBj:)
310 real(r8),
intent(in ) :: sustr(LBi:,LBj:)
311 real(r8),
intent(in ) :: svstr(LBi:,LBj:)
313 real(r8),
intent(in ) :: Pair(LBi:,LBj:)
317 real(r8),
intent(in ) :: rhoA(LBi:,LBj:)
318 real(r8),
intent(in ) :: rhoS(LBi:,LBj:)
320 real(r8),
intent(inout) :: DU_avg1(LBi:,LBj:)
321 real(r8),
intent(inout) :: DU_avg2(LBi:,LBj:)
322 real(r8),
intent(inout) :: DV_avg1(LBi:,LBj:)
323 real(r8),
intent(inout) :: DV_avg2(LBi:,LBj:)
324 real(r8),
intent(inout) :: Zt_avg1(LBi:,LBj:)
325 real(r8),
intent(inout) :: rufrc(LBi:,LBj:)
326 real(r8),
intent(inout) :: rvfrc(LBi:,LBj:)
327 real(r8),
intent(inout) :: rufrc_bak(LBi:,LBj:,:)
328 real(r8),
intent(inout) :: rvfrc_bak(LBi:,LBj:,:)
331 real(r8),
intent(inout) :: pmask_full(LBi:,LBj:)
332 real(r8),
intent(inout) :: rmask_full(LBi:,LBj:)
333 real(r8),
intent(inout) :: umask_full(LBi:,LBj:)
334 real(r8),
intent(inout) :: vmask_full(LBi:,LBj:)
336 real(r8),
intent(inout) :: pmask_wet(LBi:,LBj:)
337 real(r8),
intent(inout) :: rmask_wet(LBi:,LBj:)
338 real(r8),
intent(inout) :: umask_wet(LBi:,LBj:)
339 real(r8),
intent(inout) :: vmask_wet(LBi:,LBj:)
341 real(r8),
intent(inout) :: rmask_wet_avg(LBi:,LBj:)
344 real(r8),
intent(inout) :: ubar(LBi:,LBj:,:)
345 real(r8),
intent(inout) :: vbar(LBi:,LBj:,:)
346 real(r8),
intent(inout) :: zeta(LBi:,LBj:,:)
347# if defined NESTING && !defined SOLVE3D
348 real(r8),
intent(out ) :: DU_flux(LBi:,LBj:)
349 real(r8),
intent(out ) :: DV_flux(LBi:,LBj:)
355 real(r8),
intent(in ) :: pmask(LBi:UBi,LBj:UBj)
356 real(r8),
intent(in ) :: rmask(LBi:UBi,LBj:UBj)
357 real(r8),
intent(in ) :: umask(LBi:UBi,LBj:UBj)
358 real(r8),
intent(in ) :: vmask(LBi:UBi,LBj:UBj)
360# if (defined UV_COR && !defined SOLVE3D) || defined STEP2D_CORIOLIS
361 real(r8),
intent(in ) :: fomn(LBi:UBi,LBj:UBj)
363# if defined SEDIMENT && defined SED_MORPH
364 real(r8),
intent(inout) :: h(LBi:UBi,LBj:UBj)
366 real(r8),
intent(in ) :: h(LBi:UBi,LBj:UBj)
368 real(r8),
intent(in ) :: om_u(LBi:UBi,LBj:UBj)
369 real(r8),
intent(in ) :: om_v(LBi:UBi,LBj:UBj)
370 real(r8),
intent(in ) :: on_u(LBi:UBi,LBj:UBj)
371 real(r8),
intent(in ) :: on_v(LBi:UBi,LBj:UBj)
372 real(r8),
intent(in ) :: pm(LBi:UBi,LBj:UBj)
373 real(r8),
intent(in ) :: pn(LBi:UBi,LBj:UBj)
374# if defined CURVGRID && defined UV_ADV && !defined SOLVE3D
375 real(r8),
intent(in ) :: dndx(LBi:UBi,LBj:UBj)
376 real(r8),
intent(in ) :: dmde(LBi:UBi,LBj:UBj)
378 real(r8),
intent(in ) :: rdrag(LBi:UBi,LBj:UBj)
379# if defined UV_QDRAG && !defined SOLVE3D
380 real(r8),
intent(in ) :: rdrag2(LBi:UBi,LBj:UBj)
382# if (defined UV_VIS2 || defined UV_VIS4) && !defined SOLVE3D
383 real(r8),
intent(in ) :: pmon_r(LBi:UBi,LBj:UBj)
384 real(r8),
intent(in ) :: pnom_r(LBi:UBi,LBj:UBj)
385 real(r8),
intent(in ) :: pmon_p(LBi:UBi,LBj:UBj)
386 real(r8),
intent(in ) :: pnom_p(LBi:UBi,LBj:UBj)
387 real(r8),
intent(in ) :: om_r(LBi:UBi,LBj:UBj)
388 real(r8),
intent(in ) :: on_r(LBi:UBi,LBj:UBj)
389 real(r8),
intent(in ) :: om_p(LBi:UBi,LBj:UBj)
390 real(r8),
intent(in ) :: on_p(LBi:UBi,LBj:UBj)
392 real(r8),
intent(in ) :: visc2_p(LBi:UBi,LBj:UBj)
393 real(r8),
intent(in ) :: visc2_r(LBi:UBi,LBj:UBj)
396 real(r8),
intent(in ) :: visc4_p(LBi:UBi,LBj:UBj)
397 real(r8),
intent(in ) :: visc4_r(LBi:UBi,LBj:UBj)
400# if defined SEDIMENT && defined SED_MORPH
401 real(r8),
intent(in ) :: bed_thick(LBi:UBi,LBj:UBj,1:3)
403# if defined TIDE_GENERATING_FORCES && !defined SOLVE3D
404 real(r8),
intent(in ) :: eq_tide(LBi:UBi,LBj:UBj)
407 real(r8),
intent(in ) :: sustr(LBi:UBi,LBj:UBj)
408 real(r8),
intent(in ) :: svstr(LBi:UBi,LBj:UBj)
410 real(r8),
intent(in ) :: Pair(LBi:UBi,LBj:UBj)
414 real(r8),
intent(in ) :: rhoA(LBi:UBi,LBj:UBj)
415 real(r8),
intent(in ) :: rhoS(LBi:UBi,LBj:UBj)
417 real(r8),
intent(inout) :: DU_avg1(LBi:UBi,LBj:UBj)
418 real(r8),
intent(inout) :: DU_avg2(LBi:UBi,LBj:UBj)
419 real(r8),
intent(inout) :: DV_avg1(LBi:UBi,LBj:UBj)
420 real(r8),
intent(inout) :: DV_avg2(LBi:UBi,LBj:UBj)
421 real(r8),
intent(inout) :: Zt_avg1(LBi:UBi,LBj:UBj)
422 real(r8),
intent(inout) :: rufrc(LBi:UBi,LBj:UBj)
423 real(r8),
intent(inout) :: rvfrc(LBi:UBi,LBj:UBj)
424 real(r8),
intent(inout) :: rufrc_bak(LBi:UBi,LBj:UBj,2)
425 real(r8),
intent(inout) :: rvfrc_bak(LBi:UBi,LBj:UBj,2)
428 real(r8),
intent(inout) :: pmask_full(LBi:UBi,LBj:UBj)
429 real(r8),
intent(inout) :: rmask_full(LBi:UBi,LBj:UBj)
430 real(r8),
intent(inout) :: umask_full(LBi:UBi,LBj:UBj)
431 real(r8),
intent(inout) :: vmask_full(LBi:UBi,LBj:UBj)
433 real(r8),
intent(inout) :: pmask_wet(LBi:UBi,LBj:UBj)
434 real(r8),
intent(inout) :: rmask_wet(LBi:UBi,LBj:UBj)
435 real(r8),
intent(inout) :: umask_wet(LBi:UBi,LBj:UBj)
436 real(r8),
intent(inout) :: vmask_wet(LBi:UBi,LBj:UBj)
438 real(r8),
intent(inout) :: rmask_wet_avg(LBi:UBi,LBj:UBj)
441 real(r8),
intent(inout) :: ubar(LBi:UBi,LBj:UBj,:)
442 real(r8),
intent(inout) :: vbar(LBi:UBi,LBj:UBj,:)
443 real(r8),
intent(inout) :: zeta(LBi:UBi,LBj:UBj,:)
444# if defined NESTING && !defined SOLVE3D
445 real(r8),
intent(out ) :: DU_flux(LBi:UBi,LBj:UBj)
446 real(r8),
intent(out ) :: DV_flux(LBi:UBi,LBj:UBj)
453 integer :: kbak, kold
458 real(r8) :: bkw0, bkw1, bkw2, bkw_new
459 real(r8) :: fwd0, fwd1, fwd2
461 real(r8) :: cfwd0, cfwd1, cfwd2
463 real(r8) :: cff, cff1, cff2, cff3, cff4
465 real(r8) :: cff5, cff6, cff7
467 real(r8) :: fac, fac1, fac2
469 real(r8),
parameter :: IniVal = 0.0_r8
472#if defined UV_C4ADVECTION && !defined SOLVE3D
473 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Dgrad
475 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Dnew
476 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Dnew_rd
477 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Drhs
478#if (defined UV_VIS2 || defined UV_VIS4) && !defined SOLVE3D
479 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Drhs_p
481 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Dstp
482 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: DUon
483 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: DVom
484#if defined STEP2D_CORIOLIS || !defined SOLVE3D
485 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFx
486 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFe
489 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: UFe
490 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: VFx
492#if defined UV_C4ADVECTION && !defined SOLVE3D
493 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: grad
495 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: rzeta2
496#if defined VAR_RHO_2D && defined SOLVE3D
497 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: rzetaSA
499 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: rubar
500 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: rvbar
501 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: rzeta
502 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: urhs
503 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: vrhs
504 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: zwrk
506 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: wetdry
509 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Uwrk
510 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Vwrk
511 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,NDM2d-1) :: DiaU2rhs
512 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,NDM2d-1) :: DiaV2rhs
515 real(r8),
allocatable :: zeta_new(:,:)
517#include "set_bounds.h"
525# if defined UV_C4ADVECTION && !defined SOLVE3D
531# if (defined UV_VIS2 || defined UV_VIS4) && !defined SOLVE3D
537# if defined STEP2D_CORIOLIS || !defined SOLVE3D
545# if defined UV_C4ADVECTION && !defined SOLVE3D
549# if defined VAR_RHO_2D && defined SOLVE3D
561# ifdef DIAGNOSTICS_UV
591 IF (first_2d_step)
THEN
606 ELSE IF (first_2d_step+1)
THEN
608 IF (kbak.lt.1) kbak=4
613 bkw_new=1.0833333333333_r8
614 bkw0=-0.1666666666666_r8
615 bkw1= 0.0833333333333_r8
619 IF (kbak.lt.1) kbak=4
621 IF (kold.lt.1) kold=4
634 WRITE (20,10)
iic(ng),
iif(ng), kold, kbak, kstp, knew
635 10
FORMAT (
' iic = ',i5.5,
' iif = ',i3.3, &
636 &
' kold = ',i1,
' kbak = ',i1,
' kstp = ',i1,
' knew = ',i1)
649#if defined DISTRIBUTE && !defined NESTING
650# define IR_RANGE IstrUm2-1,Iendp2
651# define JR_RANGE JstrVm2-1,Jendp2
652# define IU_RANGE IstrUm1-1,Iendp2
653# define JU_RANGE Jstrm1-1,Jendp2
654# define IV_RANGE Istrm1-1,Iendp2
655# define JV_RANGE JstrVm1-1,Jendp2
657# define IR_RANGE IstrUm2-1,Iendp2
658# define JR_RANGE JstrVm2-1,Jendp2
659# define IU_RANGE IstrUm2,Iendp2
660# define JU_RANGE JstrVm2-1,Jendp2
661# define IV_RANGE IstrUm2-1,Iendp2
662# define JV_RANGE JstrVm2,Jendp2
667 drhs(i,j)=h(i,j)+fwd0*zeta(i,j,kstp)+ &
668 & fwd1*zeta(i,j,kbak)+ &
669 & fwd2*zeta(i,j,kold)
676 cff1=cff*(drhs(i,j)+drhs(i-1,j))
677 urhs(i,j)=fwd0*ubar(i,j,kstp)+ &
678 & fwd1*ubar(i,j,kbak)+ &
679 & fwd2*ubar(i,j,kold)
680 duon(i,j)=urhs(i,j)*cff1
687 cff1=cff*(drhs(i,j)+drhs(i,j-1))
688 vrhs(i,j)=fwd0*vbar(i,j,kstp)+ &
689 & fwd1*vbar(i,j,kbak)+ &
690 & fwd2*vbar(i,j,kold)
691 dvom(i,j)=vrhs(i,j)*cff1
702#if defined DISTRIBUTE && \
703 defined uv_adv && defined uv_c4advection &&
714 & imins, imaxs, jmins, jmaxs, &
717 & imins, imaxs, jmins, jmaxs, &
721 & imins, imaxs, jmins, jmaxs, &
733 & lbi, ubi, lbj, ubj, &
734 & imins, imaxs, jmins, jmaxs, &
752 allocate ( zeta_new(imins:imaxs,jmins:jmaxs) )
764 fac=
dtfast(ng)*pm(i,j)*pn(i,j)
765 zeta_new(i,j)=zeta(i,j,kstp)+ &
766 & fac*(duon(i,j)-duon(i+1,j)+ &
767 & dvom(i,j)-dvom(i,j+1))
769 zeta_new(i,j)=zeta_new(i,j)*rmask(i,j)
771 zeta_new(i,j)=zeta_new(i,j)+ &
772 & (
dcrit(ng)-h(i,j))*(1.0_r8-rmask(i,j))
775 zwrk(i,j)=bkw_new*zeta_new(i,j)+ &
776 & bkw0*zeta(i,j,kstp)+ &
777 & bkw1*zeta(i,j,kbak)+ &
778 & bkw2*zeta(i,j,kold)
780#if defined VAR_RHO_2D && defined SOLVE3D
781 rzeta(i,j)=(1.0_r8+rhos(i,j))*zwrk(i,j)
782 rzeta2(i,j)=rzeta(i,j)*zwrk(i,j)
783 rzetasa(i,j)=zwrk(i,j)*(rhos(i,j)-rhoa(i,j))
786 rzeta2(i,j)=zwrk(i,j)*zwrk(i,j)
797 IF (int(
sources(ng)%Dsrc(is)).eq.2)
THEN
800 IF (((istrr.le.i).and.(i.le.iendr)).and. &
801 & ((jstrr.le.j).and.(j.le.jendr)))
THEN
802 zeta_new(i,j)=zeta_new(i,j)+ &
804 & pm(i,j)*pn(i,j)*
dtfast(ng)
819 CALL zetabc_local (ng, tile, &
820 & lbi, ubi, lbj, ubj, &
821 & imins, imaxs, jmins, jmaxs, &
830 zeta(i,j,knew)=zeta_new(i,j)
848 IF (first_2d_step)
THEN
851 zt_avg1(i,j)=cff1*zeta(i,j,knew)
854 du_avg2(i,j)=cff2*duon(i,j)
858 dv_avg2(i,j)=cff2*dvom(i,j)
865 zt_avg1(i,j)=zt_avg1(i,j)+cff1*zeta(i,j,knew)
867 du_avg2(i,j)=du_avg2(i,j)+cff2*duon(i,j)
870 dv_avg2(i,j)=dv_avg2(i,j)+cff2*dvom(i,j)
889# ifdef STEP2D_CORIOLIS
902#if defined VAR_RHO_2D && defined SOLVE3D
903 cff2=0.333333333333_r8
905#if defined ATM_PRESS && !defined SOLVE3D
906 cff3=0.5_r8*100.0_r8/
rho0
911 rubar(i,j)=cff1*on_u(i,j)* &
916#if defined VAR_RHO_2D && defined SOLVE3D
921 & cff2*(rhoa(i-1,j)- &
928#if defined ATM_PRESS && !defined SOLVE3D
929 rubar(i,j)=rubar(i,j)- &
931 & (h(i-1,j)+h(i,j)+ &
932 & rzeta(i-1,j)+rzeta(i,j))* &
933 & (pair(i,j)-pair(i-1,j))
935#if defined TIDE_GENERATING_FORCES && !defined SOLVE3D
936 rubar(i,j)=rubar(i,j)- &
938 & (h(i-1,j)+h(i,j)+ &
939 & rzeta(i-1,j)+rzeta(i,j))* &
940 & (eq_tide(i,j)-eq_tide(i-1,j))
943 diau2rhs(i,j,
m2pgrd)=rubar(i,j)
948 rvbar(i,j)=cff1*om_v(i,j)* &
953#if defined VAR_RHO_2D && defined SOLVE3D
958 & cff2*(rhoa(i,j-1)- &
965#if defined ATM_PRESS && !defined SOLVE3D
966 rvbar(i,j)=rvbar(i,j)- &
968 & (h(i,j-1)+h(i,j)+ &
969 & rzeta(i,j-1)+rzeta(i,j))* &
970 & (pair(i,j)-pair(i,j-1))
972#if defined TIDE_GENERATING_FORCES && !defined SOLVE3D
973 rvbar(i,j)=rvbar(i,j)- &
975 & (h(i,j-1)+h(i,j)+ &
976 & rzeta(i,j-1)+rzeta(i,j))* &
977 & (eq_tide(i,j)-eq_tide(i,j-1))
980 diav2rhs(i,j,
m2pgrd)=rvbar(i,j)
986#if defined UV_ADV && !defined SOLVE3D
992# ifdef UV_C2ADVECTION
998 IF (i.ge.istru-1)
THEN
1000 & (duon(i,j)+duon(i+1,j))* &
1005 vfx(i+1,j)=0.25_r8* &
1009 & (duon(i+1,j)+duon(i+1,j-1))* &
1017 IF (j.ge.jstrv-1)
THEN
1019 & (dvom(i,j)+dvom(i,j+1))* &
1024 ufe(i,j+1)=0.25_r8* &
1028 & (dvom(i,j+1)+dvom(i-1,j+1))* &
1034# elif defined UV_C4ADVECTION
1040 grad(i,j)=urhs(i-1,j)-2.0_r8*urhs(i,j)+ &
1042 dgrad(i,j)=duon(i-1,j)-2.0_r8*duon(i,j)+duon(i+1,j)
1046 IF (
domain(ng)%Western_Edge(tile))
THEN
1048 grad(istr,j)=grad(istr+1,j)
1049 dgrad(istr,j)=dgrad(istr+1,j)
1054 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1056 grad(iend+1,j)=grad(iend,j)
1057 dgrad(iend+1,j)=dgrad(iend,j)
1065 ufx(i,j)=0.25_r8*(urhs(i ,j)+ &
1067 & cff*(grad(i,j)+grad(i+1,j)))* &
1068 & (duon(i,j)+duon(i+1,j)- &
1069 & cff*(dgrad(i,j)+dgrad(i+1,j)))
1075 grad(i,j)=urhs(i,j-1)-2.0_r8*urhs(i,j)+ &
1080 IF (
domain(ng)%Southern_Edge(tile))
THEN
1082 grad(i,jstr-1)=grad(i,jstr)
1087 IF (
domain(ng)%Northern_Edge(tile))
THEN
1089 grad(i,jend+1)=grad(i,jend)
1095 dgrad(i,j)=dvom(i-1,j)-2.0_r8*dvom(i,j)+dvom(i+1,j)
1102 ufe(i,j)=0.25_r8*(urhs(i,j )+ &
1104 & cff*(grad(i,j)+grad(i,j-1)))* &
1105 & (dvom(i,j)+dvom(i-1,j)- &
1106 & cff*(dgrad(i,j)+dgrad(i-1,j)))
1114 grad(i,j)=vrhs(i-1,j)-2.0_r8*vrhs(i,j)+ &
1119 IF (
domain(ng)%Western_Edge(tile))
THEN
1121 grad(istr-1,j)=grad(istr,j)
1126 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1128 grad(iend+1,j)=grad(iend,j)
1134 dgrad(i,j)=duon(i,j-1)-2.0_r8*duon(i,j)+duon(i,j+1)
1141 vfx(i,j)=0.25_r8*(vrhs(i ,j)+ &
1143 & cff*(grad(i,j)+grad(i-1,j)))* &
1144 & (duon(i,j)+duon(i,j-1)- &
1145 & cff*(dgrad(i,j)+dgrad(i,j-1)))
1151 grad(i,j)=vrhs(i,j-1)-2.0_r8*vrhs(i,j)+ &
1153 dgrad(i,j)=dvom(i,j-1)-2.0_r8*dvom(i,j)+dvom(i,j+1)
1157 IF (
domain(ng)%Southern_Edge(tile))
THEN
1159 grad(i,jstr)=grad(i,jstr+1)
1160 dgrad(i,jstr)=dgrad(i,jstr+1)
1165 IF (
domain(ng)%Northern_Edge(tile))
THEN
1167 grad(i,jend+1)=grad(i,jend)
1168 dgrad(i,jend+1)=dgrad(i,jend)
1176 vfe(i,j)=0.25_r8*(vrhs(i,j )+ &
1178 & cff*(grad(i,j)+grad(i,j+1)))* &
1179 & (dvom(i,j)+dvom(i,j+1)- &
1180 & cff*(dgrad(i,j)+dgrad(i,j+1)))
1189 IF (i.ge.istru)
THEN
1190 cff1=ufx(i,j)-ufx(i-1,j)
1191 cff2=ufe(i,j+1)-ufe(i,j)
1193 rubar(i,j)=rubar(i,j)-fac1
1194# if defined DIAGNOSTICS_UV
1195 diau2rhs(i,j,
m2xadv)=-cff1
1196 diau2rhs(i,j,
m2yadv)=-cff2
1197 diau2rhs(i,j,
m2hadv)=-fac1
1201 IF (j.ge.jstrv)
THEN
1202 cff3=vfx(i+1,j)-vfx(i,j)
1203 cff4=vfe(i,j)-vfe(i,j-1)
1205 rvbar(i,j)=rvbar(i,j)-fac2
1206# if defined DIAGNOSTICS_UV
1207 diav2rhs(i,j,
m2xadv)=-cff3
1208 diav2rhs(i,j,
m2yadv)=-cff4
1209 diav2rhs(i,j,
m2hadv)=-fac2
1216#if (defined UV_COR && !defined SOLVE3D) || defined STEP2D_CORIOLIS
1224 cff=0.5_r8*drhs(i,j)*fomn(i,j)
1225 ufx(i,j)=cff*(vrhs(i,j )+ &
1227 vfe(i,j)=cff*(urhs(i ,j)+ &
1234 IF (i.ge.istru)
THEN
1235 fac1=0.5_r8*(ufx(i,j)+ufx(i-1,j))
1236 rubar(i,j)=rubar(i,j)+fac1
1237# if defined DIAGNOSTICS_UV
1238 diau2rhs(i,j,
m2fcor)=fac1
1243 IF (j.ge.jstrv)
THEN
1244 fac2=0.5_r8*(vfe(i,j)+vfe(i,j-1))
1245 rvbar(i,j)=rvbar(i,j)-fac2
1246# if defined DIAGNOSTICS_UV
1247 diav2rhs(i,j,
m2fcor)=-fac2
1254#if (defined CURVGRID && defined UV_ADV) && !defined SOLVE3D
1262 cff1=0.5_r8*(vrhs(i,j )+ &
1264 cff2=0.5_r8*(urhs(i ,j)+
1268 cff=drhs(i,j)*(cff3-cff4)
1271# if defined DIAGNOSTICS_UV
1281 IF (i.ge.istru)
THEN
1282 fac1=0.5_r8*(ufx(i,j)+ufx(i-1,j))
1283 rubar(i,j)=rubar(i,j)+fac1
1284# if defined DIAGNOSTICS_UV
1285 fac2=0.5_r8*(uwrk(i,j)+uwrk(i-1,j))
1292 IF (j.ge.jstrv)
THEN
1293 fac1=0.5_r8*(vfe(i,j)+vfe(i,j-1))
1294 rvbar(i,j)=rvbar(i,j)-fac1
1295# if defined DIAGNOSTICS_UV
1296 fac2=0.5_r8*(vwrk(i,j)+vwrk(i,j-1))
1306#if defined UV_VIS2 && !defined SOLVE3D
1316 drhs_p(i,j)=0.25_r8*(drhs(i,j )+drhs(i-1,j )+ &
1317 & drhs(i,j-1)+drhs(i-1,j-1))
1326 cff=visc2_r(i,j)*drhs(i,j)*0.5_r8* &
1328 & ((pn(i ,j)+pn(i+1,j))*ubar(i+1,j,kstp)- &
1329 & (pn(i-1,j)+pn(i ,j))*ubar(i ,j,kstp))- &
1331 & ((pm(i,j )+pm(i,j+1))*vbar(i,j+1,kstp)- &
1332 & (pm(i,j-1)+pm(i,j ))*vbar(i,j ,kstp)))
1333 ufx(i,j)=on_r(i,j)*on_r(i,j)*cff
1334 vfe(i,j)=om_r(i,j)*om_r(i,j)*cff
1340 cff=visc2_p(i,j)*drhs_p(i,j)*0.5_r8* &
1342 & ((pn(i ,j-1)+pn(i ,j))*vbar(i ,j,kstp)- &
1343 & (pn(i-1,j-1)+pn(i-1,j))*vbar(i-1,j,kstp))+ &
1345 & ((pm(i-1,j )+pm(i,j ))*ubar(i,j ,kstp)- &
1346 & (pm(i-1,j-1)+pm(i,j-1))*ubar(i,j-1,kstp)))
1351 cff=cff*pmask_wet(i,j)
1353 ufe(i,j)=om_p(i,j)*om_p(i,j)*cff
1354 vfx(i,j)=on_p(i,j)*on_p(i,j)*cff
1362 IF (i.ge.istru)
THEN
1363 cff1=0.5_r8*(pn(i-1,j)+pn(i,j))*(ufx(i,j )-ufx(i-1,j))
1364 cff2=0.5_r8*(pm(i-1,j)+pm(i,j))*(ufe(i,j+1)-ufe(i ,j))
1366 rubar(i,j)=rubar(i,j)+fac1
1367# if defined DIAGNOSTICS_UV
1368 diau2rhs(i,j,
m2hvis)=fac1
1369 diau2rhs(i,j,
m2xvis)=cff1
1370 diau2rhs(i,j,
m2yvis)=cff2
1374 IF (j.ge.jstrv)
THEN
1375 cff1=0.5_r8*(pn(i,j-1)+pn(i,j))*(vfx(i+1,j)-vfx(i,j ))
1376 cff2=0.5_r8*(pm(i,j-1)+pm(i,j))*(vfe(i ,j)-vfe(i,j-1))
1378 rvbar(i,j)=rvbar(i,j)+fac1
1379# if defined DIAGNOSTICS_UV
1380 diav2rhs(i,j,
m2hvis)=fac1
1381 diav2rhs(i,j,
m2xvis)= cff1
1382 diav2rhs(i,j,
m2yvis)=-cff2
1413 coupled_step :
IF (first_2d_step)
THEN
1429 cfwd1=-0.5_r8-2.0_r8*cfwd2
1445 IF (i.ge.istru)
THEN
1446 rufrc(i,j)=rufrc(i,j)+ &
1447 & 0.5_r8*(rdrag(i,j)+rdrag(i-1,j))* &
1448 & om_u(i,j)*on_u(i,j)*ubar(i,j,kstp)
1451 IF (j.ge.jstrv)
THEN
1452 rvfrc(i,j)=rvfrc(i,j)+ &
1453 & 0.5_r8*(rdrag(i,j)+rdrag(i,j-1))* &
1454 & om_v(i,j)*on_v(i,j)*vbar(i,j,kstp)
1459 IF (i.ge.istru)
THEN
1460 cff1=rufrc(i,j)-rubar(i,j)
1461 rufrc(i,j)=cfwd0*cff1+ &
1462 & cfwd1*rufrc_bak(i,j, nstp)+ &
1463 & cfwd2*rufrc_bak(i,j,3-nstp)
1464 rufrc_bak(i,j,3-nstp)=cff1
1467 IF (j.ge.jstrv)
THEN
1468 cff2=rvfrc(i,j)-rvbar(i,j)
1469 rvfrc(i,j)=cfwd0*cff2+ &
1470 & cfwd1*rvfrc_bak(i,j, nstp)+ &
1471 & cfwd2*rvfrc_bak(i,j,3-nstp)
1472 rvfrc_bak(i,j,3-nstp)=cff2
1483 zwrk(i,j)=zeta_new(i,j)-zeta(i,j,kstp)
1484# if defined VAR_RHO_2D && defined SOLVE3D
1485 rzeta(i,j)=(1.0_r8+rhos(i,j))*zwrk(i,j)
1486 rzeta2(i,j)=rzeta(i,j)*(zeta_new(i,j)+zeta(i,j,kstp))
1487 rzetasa(i,j)=zwrk(i,j)*(rhos(i,j)-rhoa(i,j))
1489 rzeta(i,j)=zwrk(i,j)
1490 rzeta2(i,j)=zwrk(i,j)*(zeta_new(i,j)+zeta(i,j,kstp))
1496# if defined VAR_RHO_2D && defined SOLVE3D
1497 cff2=0.333333333333_r8
1501 IF (i.ge.istru)
THEN
1502 rubar(i,j)=rubar(i,j)+ &
1508# if defined VAR_RHO_2D && defined SOLVE3D
1511 & (rzetasa(i-1,j)+ &
1513 & cff2*(rhoa(i-1,j)- &
1520# ifdef DIAGNOSTICS_UV
1526 IF (j.ge.jstrv)
THEN
1527 rvbar(i,j)=rvbar(i,j)+ &
1533# if defined VAR_RHO_2D && defined SOLVE3D
1536 & (rzetasa(i,j-1)+ &
1538 & cff2*(rhoa(i,j-1)- &
1545# ifdef DIAGNOSTICS_UV
1583 dnew(i,j)=h(i,j)+zeta_new(i,j)
1584 dnew_rd(i,j)=dnew(i,j)+
dtfast(ng)*rdrag(i,j)
1585 dstp(i,j)=h(i,j)+zeta(i,j,kstp)
1589#if defined UV_QDRAG && !defined SOLVE3D
1601 cff=
dtfast(ng)/sqrt(3.0_r8)
1604 cff1=ubar(i ,j,kstp)**2+ &
1605 & ubar(i+1,j,kstp)**2+ &
1606 & ubar(i ,j,kstp)*ubar(i+1,j,kstp)+ &
1607 & vbar(i,j ,kstp)**2+ &
1608 & vbar(i,j+1,kstp)**2+ &
1609 & vbar(i,j ,kstp)*vbar(i,j+1,kstp)
1611 dnew_rd(i,j)=dnew_rd(i,j)+ &
1612 & cff*rdrag2(i,j)*cff2
1627 cff3=cff*(pm(i,j)+pm(i-1,j))*(pn(i,j)+pn(i-1,j))
1628 fac1=1.0_r8/(dnew_rd(i,j)+dnew_rd(i-1,j))
1629 ubar(i,j,knew)=fac1*((dstp(i,j)+dstp(i-1,j))*ubar(i,j,kstp)+ &
1631 & cff3*(rubar(i,j)+rufrc(i,j)))
1633 & cff3*rubar(i,j)+cff2*sustr(i,j))
1636 ubar(i,j,knew)=ubar(i,j,knew)*umask(i,j)
1639 cff5=abs(abs(umask_wet(i,j))-1.0_r8)
1640 cff6=0.5_r8+dsign(0.5_r8,ubar(i,j,knew))*umask_wet(i,j)
1641 cff7=0.5_r8*umask_wet(i,j)*cff5+cff6*(1.0_r8-cff5)
1642 ubar(i,j,knew)=ubar(i,j,knew)*cff7
1645 du_avg1(i,j)=du_avg1(i,j)+ &
1647 & (dnew(i,j)+dnew(i-1,j))*ubar(i,j,knew)
1649#if defined NESTING && !defined SOLVE3D
1650 du_flux(i,j)=0.5_r8*on_u(i,j)* &
1651 & (dnew(i,j)+dnew(i-1,j))*ubar(i,j,knew)
1658 cff3=cff*(pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))
1659 fac2=1.0_r8/(dnew_rd(i,j)+dnew_rd(i,j-1))
1660 vbar(i,j,knew)=fac2*((dstp(i,j)+dstp(i,j-1))*vbar(i,j,kstp)+ &
1662 & cff3*(rvbar(i,j)+rvfrc(i,j)))
1664 & cff3*rvbar(i,j)+cff2*svstr(i,j))
1667 vbar(i,j,knew)=vbar(i,j,knew)*vmask(i,j)
1670 cff5=abs(abs(vmask_wet(i,j))-1.0_r8)
1671 cff6=0.5_r8+dsign(0.5_r8,vbar(i,j,knew))*vmask_wet(i,j)
1672 cff7=0.5_r8*vmask_wet(i,j)*cff5+cff6*(1.0_r8-cff5)
1673 vbar(i,j,knew)=vbar(i,j,knew)*cff7
1676 dv_avg1(i,j)=dv_avg1(i,j)+ &
1678 & (dnew(i,j)+dnew(i,j-1))*vbar(i,j,knew)
1680#if defined NESTING && !defined SOLVE3D
1681 dv_flux(i,j)=0.5_r8*om_v(i,j)* &
1682 & (dnew(i,j)+dnew(i,j-1))*vbar(i,j,knew)
1690 & lbi, ubi, lbj, ubj, &
1691 & imins, imaxs, jmins, jmaxs, &
1692 & krhs, kstp, knew, &
1695 & lbi, ubi, lbj, ubj, &
1696 & imins, imaxs, jmins, jmaxs, &
1697 & krhs, kstp, knew, &
1705 & lbi, ubi, lbj, ubj, &
1706 & imins, imaxs, jmins, jmaxs, &
1715#if defined SOLVE3D || (defined NESTING && !defined SOLVE3D)
1720 IF (
domain(ng)%Western_Edge(tile))
THEN
1722 dnew(istr-1,j)=h(istr-1,j)+zeta_new(istr-1,j)
1727 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1729 dnew(iend+1,j)=h(iend+1,j)+zeta_new(iend+1,j)
1734 IF (
domain(ng)%Southern_Edge(tile))
THEN
1736 dnew(i,jstr-1)=h(i,jstr-1)+zeta_new(i,jstr-1)
1741 IF (
domain(ng)%Northern_Edge(tile))
THEN
1743 dnew(i,jend+1)=h(i,jend+1)+zeta_new(i,jend+1)
1754 IF (
domain(ng)%Western_Edge(tile))
THEN
1756# if defined NESTING && !defined SOLVE3D
1757 du_flux(istru-1,j)=0.5_r8*on_u(istru-1,j)* &
1758 & (dnew(istru-1,j)+dnew(istru-2,j))* &
1759 & ubar(istru-1,j,knew)
1761 du_avg1(istru-1,j)=du_avg1(istru-1,j)+ &
1762 & cff1*on_u(istru-1,j)* &
1763 & (dnew(istru-1,j)+dnew(istru-2,j))* &
1764 & ubar(istru-1,j,knew)
1768# if defined NESTING && !defined SOLVE3D
1769 dv_flux(istr-1,j)=0.5_r8*om_v(istr-1,j)* &
1770 & (dnew(istr-1,j)+dnew(istr-1,j-1))* &
1771 & vbar(istr-1,j,knew)
1773 dv_avg1(istr-1,j)=dv_avg1(istr-1,j)+ &
1774 & cff1*om_v(istr-1,j)* &
1775 & (dnew(istr-1,j)+dnew(istr-1,j-1))* &
1776 & vbar(istr-1,j,knew)
1782 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1784# if defined NESTING && !defined SOLVE3D
1785 du_flux(iend+1,j)=0.5_r8*on_u(iend+1,j)* &
1786 & (dnew(iend+1,j)+dnew(iend,j))* &
1787 & ubar(iend+1,j,knew)
1789 du_avg1(iend+1,j)=du_avg1(iend+1,j)+ &
1790 & cff1*on_u(iend+1,j)* &
1791 & (dnew(iend+1,j)+dnew(iend,j))* &
1792 & ubar(iend+1,j,knew)
1796# if defined NESTING && !defined SOLVE3D
1797 dv_flux(iend+1,j)=0.5_r8*om_v(iend+1,j)* &
1798 & (dnew(iend+1,j)+dnew(iend+1,j-1))* &
1799 & vbar(iend+1,j,knew)
1801 dv_avg1(iend+1,j)=dv_avg1(iend+1,j)+ &
1802 & cff1*om_v(iend+1,j)* &
1803 & (dnew(iend+1,j)+dnew(iend+1,j-1))* &
1804 & vbar(iend+1,j,knew)
1810 IF (
domain(ng)%Southern_Edge(tile))
THEN
1812# if defined NESTING && !defined SOLVE3D
1813 du_flux(i,jstr-1)=0.5_r8*on_u(i,jstr-1)* &
1814 & (dnew(i,jstr-1)+dnew(i-1,jstr-1))* &
1815 & ubar(i,jstr-1,knew)
1817 du_avg1(i,jstr-1)=du_avg1(i,jstr-1)+ &
1818 & cff1*on_u(i,jstr-1)* &
1819 & (dnew(i,jstr-1)+dnew(i-1,jstr-1))* &
1820 & ubar(i,jstr-1,knew)
1824# if defined NESTING && !defined SOLVE3D
1825 dv_flux(i,jstrv-1)=0.5_r8*om_v(i,jstrv-1)* &
1826 & (dnew(i,jstrv-1)+dnew(i,jstrv-2))* &
1827 & vbar(i,jstrv-1,knew)
1829 dv_avg1(i,jstrv-1)=dv_avg1(i,jstrv-1)+ &
1830 & cff1*om_v(i,jstrv-1)* &
1831 & (dnew(i,jstrv-1)+dnew(i,jstrv-2))* &
1832 & vbar(i,jstrv-1,knew)
1838 IF (
domain(ng)%Northern_Edge(tile))
THEN
1840# if defined NESTING && !defined SOLVE3D
1841 du_flux(i,jend+1)=0.5_r8*on_u(i,jend+1)* &
1842 & (dnew(i,jend+1)+dnew(i-1,jend+1))* &
1843 & ubar(i,jend+1,knew)
1845 du_avg1(i,jend+1)=du_avg1(i,jend+1)+ &
1846 & cff1*on_u(i,jend+1)* &
1847 & (dnew(i,jend+1)+dnew(i-1,jend+1))* &
1848 & ubar(i,jend+1,knew)
1852# if defined NESTING && !defined SOLVE3D
1853 dv_flux(i,jend+1)=0.5_r8*om_v(i,jend+1)* &
1854 & (dnew(i,jend+1)+dnew(i,jend))* &
1855 & vbar(i,jend+1,knew)
1857 dv_avg1(i,jend+1)=dv_avg1(i,jend+1)+ &
1858 & cff1*om_v(i,jend+1)* &
1859 & (dnew(i,jend+1)+dnew(i,jend))* &
1860 & vbar(i,jend+1,knew)
1878 IF (((istrr.le.i).and.(i.le.iendr)).and. &
1879 & ((jstrr.le.j).and.(j.le.jendr)))
THEN
1880 IF (int(
sources(ng)%Dsrc(is)).eq.0)
THEN
1881 cff=1.0_r8/(on_u(i,j)* &
1882 & 0.5_r8*(dnew(i-1,j)+dnew(i,j)))
1883 ubar(i,j,knew)=
sources(ng)%Qbar(is)*cff
1885 du_avg1(i,j)=
sources(ng)%Qbar(is)
1887#if defined NESTING && !defined SOLVE3D
1888 du_flux(i,j)=
sources(ng)%Qbar(is)
1890 ELSE IF (int(
sources(ng)%Dsrc(is)).eq.1)
THEN
1891 cff=1.0_r8/(om_v(i,j)* &
1892 & 0.5_r8*(dnew(i,j-1)+dnew(i,j)))
1893 vbar(i,j,knew)=
sources(ng)%Qbar(is)*cff
1895 dv_avg1(i,j)=
sources(ng)%Qbar(is)
1897#if defined NESTING && !defined SOLVE3D
1898 dv_flux(i,j)=
sources(ng)%Qbar(is)
1907 deallocate ( zeta_new )
1916 & lbi, ubi, lbj, ubj, &
1917 & imins, imaxs, jmins, jmaxs, &
1919 & pmask, rmask, umask, vmask, &
1921 & h, zeta(:,:,knew), &
1923 & du_avg1, dv_avg1, &
1926 & pmask_wet, pmask_full, &
1927 & rmask_wet, rmask_full, &
1928 & umask_wet, umask_full, &
1929 & vmask_wet, vmask_full)
1944 zeta(i,j,knew)=zt_avg1(i,j)
1968 & lbi, ubi, lbj, ubj, &
1971 & lbi, ubi, lbj, ubj, &
1974 & lbi, ubi, lbj, ubj, &
1977 & lbi, ubi, lbj, ubj, &
1980 & lbi, ubi, lbj, ubj, &
1987 & lbi, ubi, lbj, ubj, &
1990 & zt_avg1, du_avg1, dv_avg1)
1992 & lbi, ubi, lbj, ubj, &
2007 & lbi, ubi, lbj, ubj, &
2010 & lbi, ubi, lbj, ubj, &
2017 & lbi, ubi, lbj, ubj, &
2031 & lbi, ubi, lbj, ubj, &
2034 & lbi, ubi, lbj, ubj, &
2037 & lbi, ubi, lbj, ubj, &
2044 & lbi, ubi, lbj, ubj, &