121 & LBi, UBi, LBj, UBj, &
122 & IminS, ImaxS, JminS, JmaxS, &
123 & nrhs, nstp, nnew, &
125 & rmask, umask, vmask, &
128 & rmask_wet, umask_wet, vmask_wet, &
130 & omn, om_u, om_v, on_u, on_v, &
136# ifdef OMEGA_IMPLICIT
142# if defined SEDIMENT && defined SED_MORPH
145# if defined FLOATS && defined FLOAT_VWALK
148# ifdef DIAGNOSTICS_TS
157# if defined NESTING && !defined ONE_WAY
176 integer,
intent(in) :: ng, tile
177 integer,
intent(in) :: LBi, UBi, LBj, UBj
178 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
179 integer,
intent(in) :: nrhs, nstp, nnew
183 real(r8),
intent(in) :: rmask(LBi:,LBj:)
184 real(r8),
intent(in) :: umask(LBi:,LBj:)
185 real(r8),
intent(in) :: vmask(LBi:,LBj:)
188 real(r8),
intent(in) :: rmask_wet(LBi:,LBj:)
189 real(r8),
intent(in) :: umask_wet(LBi:,LBj:)
190 real(r8),
intent(in) :: vmask_wet(LBi:,LBj:)
192 real(r8),
intent(in) :: omn(LBi:,LBj:)
193 real(r8),
intent(in) :: om_u(LBi:,LBj:)
194 real(r8),
intent(in) :: om_v(LBi:,LBj:)
195 real(r8),
intent(in) :: on_u(LBi:,LBj:)
196 real(r8),
intent(in) :: on_v(LBi:,LBj:)
197 real(r8),
intent(in) :: pm(LBi:,LBj:)
198 real(r8),
intent(in) :: pn(LBi:,LBj:)
199 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
200 real(r8),
intent(in) :: Huon(LBi:,LBj:,:)
201 real(r8),
intent(in) :: Hvom(LBi:,LBj:,:)
202 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
204 real(r8),
intent(in) :: Akt(LBi:UBi,LBj:UBj,0:N(ng),NAT)
206 real(r8),
intent(in) :: Akt(LBi:,LBj:,0:,:)
208 real(r8),
intent(in) :: W(LBi:,LBj:,0:)
209# ifdef OMEGA_IMPLICIT
210 real(r8),
intent(in) :: Wi(LBi:,LBj:,0:)
213 real(r8),
intent(in) :: W_stokes(LBi:,LBj:,0:)
215# if defined SEDIMENT && defined SED_MORPH
216 real(r8),
intent(in) :: bed_thick(LBi:,LBj:,:)
218# ifdef DIAGNOSTICS_TS
219 real(r8),
intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
222 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
224 real(r8),
intent(inout) :: t(LBi:,LBj:,:,:,:)
226# if defined FLOATS && defined FLOAT_VWALK
227 real(r8),
intent(out) :: dAktdz(LBi:,LBj:,:)
233 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
234 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
235 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
238 real(r8),
intent(in) :: rmask_wet(LBi:UBi,LBj:UBj)
239 real(r8),
intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
240 real(r8),
intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
242 real(r8),
intent(in) :: omn(LBi:UBi,LBj:UBj)
243 real(r8),
intent(in) :: om_u(LBi:UBi,LBj:UBj)
244 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
245 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
246 real(r8),
intent(in) :: on_v(LBi:UBi,LBj:UBj)
247 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
248 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
249 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
250 real(r8),
intent(in) :: Huon(LBi:UBi,LBj:UBj,N(ng))
251 real(r8),
intent(in) :: Hvom(LBi:UBi,LBj:UBj,N(ng))
252 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
253 real(r8),
intent(in) :: Akt(LBi:UBi,LBj:UBj,0:N(ng),NAT)
254 real(r8),
intent(in) :: W(LBi:UBi,LBj:UBj,0:N(ng))
255# ifdef OMEGA_IMPLICIT
256 real(r8),
intent(in) :: Wi(LBi:UBi,LBj:UBj,0:N(ng))
259 real(r8),
intent(in) :: W_stokes(LBi:UBi,LBj:UBj,0:N(ng))
261# if defined SEDIMENT && defined SED_MORPH
262 real(r8),
intent(in) :: bed_thick(LBi:UBi,LBj:UBj,3)
264# ifdef DIAGNOSTICS_TS
265 real(r8),
intent(inout) :: DiaTwrk(LBi:UBi,LBj:UBj,N(ng),NT(ng), &
268 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
270# if defined FLOATS && defined FLOAT_VWALK
271 real(r8),
intent(out) :: dAktdz(LBi:UBi,LBj:UBj,N(ng))
277 logical :: LapplySrc, Lhsimt, Lmpdata
280 integer :: ILB, IUB, JLB, JUB
281 integer :: dg, cr, rg
283 integer :: IminT, ImaxT, JminT, JmaxT
284 integer :: Isrc, Jsrc
285 integer :: i, ic, ii, is, itrc, j, jj, k, ltrc
286# if defined AGE_MEAN && defined T_PASSIVE
289# ifdef DIAGNOSTICS_TS
292 real(r8) :: eps = 1.0e-16_r8
293 real(r8) :: eps1 = 1.0e-12_r8
295 real(r8) :: cff, cff1, cff2, cff3
296 real(r8) :: betaL, betaR, betaD, betaU
297 real(r8) :: rL, rR, rD, rU, rkaL, rkaR, rkaD, rkaU
298 real(r8) :: a1, b1, sw, sw_eta, sw_xi
300 real(r8),
dimension(IminS:ImaxS) :: gradX, KaX, oKaX
301 real(r8),
dimension(JminS:JmaxS) :: gradE, KaE, oKaE
302 real(r8),
dimension(0:N(ng)) :: gradZ, KaZ, oKaZ
304 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
305 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BC
306 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
307 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
308# ifdef OMEGA_IMPLICIT
309 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FCmin
310 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FCmax
313 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
314 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
315 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: curv
316 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: grad
318 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: oHz
320# ifdef DIAGNOSTICS_TS
321 real(r8),
allocatable :: Dhadv(:,:,:)
322 real(r8),
allocatable :: Dvadv(:,:,:,:)
324 real(r8),
allocatable :: Ta(:,:,:,:)
325 real(r8),
allocatable :: Ua(:,:,:)
326 real(r8),
allocatable :: Va(:,:,:)
327 real(r8),
allocatable :: Wa(:,:,:)
329# include "set_bounds.h"
354# ifdef DIAGNOSTICS_TS
355 IF (.not.
allocated(dhadv))
THEN
356 allocate ( dhadv(imins:imaxs,jmins:jmaxs,3) )
359 IF (.not.
allocated(dvadv))
THEN
360 allocate ( dvadv(imins:imaxs,jmins:jmaxs,n(ng),nt(ng)) )
364 IF (.not.
allocated(ta))
THEN
365 allocate ( ta(imins:imaxs,jmins:jmaxs,n(ng),nt(ng)) )
368 IF (.not.
allocated(ua))
THEN
369 allocate ( ua(imins:imaxs,jmins:jmaxs,n(ng)) )
372 IF (.not.
allocated(va))
THEN
373 allocate ( va(imins:imaxs,jmins:jmaxs,n(ng)) )
376 IF (.not.
allocated(wa))
THEN
377 allocate ( wa(imins:imaxs,jmins:jmaxs,0:n(ng)) )
384 IF (lmpdata.or.lhsimt)
THEN
388 ohz(i,j,k)=1.0_r8/hz(i,j,k)
396 ohz(i,j,k)=1.0_r8/hz(i,j,k)
405 t_loop1 :
DO itrc=1,nt(ng)
415 & lbi, ubi, lbj, ubj, 1, n(ng), &
416 & t(:,:,:,nnew,itrc))
421 & lbi, ubi, lbj, ubj, 1, n(ng), &
424 & t(:,:,:,nnew,itrc))
430 k_loop :
DO k=1,n(ng)
432 hadv_flux :
IF (
hadvection(itrc,ng)%CENTERED2)
THEN
438 fx(i,j)=huon(i,j,k)* &
439 & 0.5_r8*(t(i-1,j,k,3,itrc)+ &
445 fe(i,j)=hvom(i,j,k)* &
446 & 0.5_r8*(t(i,j-1,k,3,itrc)+ &
457 cff1=max(huon(i,j,k),0.0_r8)
458 cff2=min(huon(i,j,k),0.0_r8)
459 fx(i,j)=cff1*t(i-1,j,k,3,itrc)+ &
460 & cff2*t(i ,j,k,3,itrc)
465 cff1=max(hvom(i,j,k),0.0_r8)
466 cff2=min(hvom(i,j,k),0.0_r8)
467 fe(i,j)=cff1*t(i,j-1,k,3,itrc)+ &
468 & cff2*t(i,j ,k,3,itrc)
485 cff=0.125_r8*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))* &
487 cff1=cff*(ohz(i-1,j,k)+ohz(i,j,k))
488 gradx(i)=t(i,j,k,3,itrc)-t(i-1,j,k,3,itrc)
489 kax(i)=1.0_r8-abs(huon(i,j,k)*cff1)
491 gradx(i)=gradx(i)*umask(i,j)
492 kax(i)=kax(i)*umask(i,j)
496 IF (
domain(ng)%Western_Edge(tile))
THEN
497 IF (huon(istr,j,k).ge.0.0_r8)
THEN
502 IF (
domain(ng)%Eastern_Edge(tile))
THEN
503 IF (huon(iend+1,j,k).lt.0.0_r8)
THEN
510 IF (kax(i).le.eps1)
THEN
513 okax(i)=1.0_r8/max(kax(i),eps1)
515 IF (huon(i,j,k).ge.0.0_r8)
THEN
516 IF (abs(gradx(i)).le.eps1)
THEN
520 rl=gradx(i-1)/gradx(i)
521 rkal=kax(i-1)*okax(i)
526 cff=0.5_r8*max(0.0_r8, &
527 & min(2.0_r8, 2.0_r8*rl*rkal, betal))* &
533 sw_xi=t(i-1,j,k,3,itrc)+cff
535 IF (abs(gradx(i)).le.eps1)
THEN
539 rr=gradx(i+1)/gradx(i)
540 rkar=kax(i+1)*okax(i)
545 cff=0.5_r8*max(0.0_r8, &
546 & min(2.0_r8, 2.0_r8*rr*rkar, betar))* &
552 sw_xi=t(i,j,k,3,itrc)-cff
554 fx(i,j)=sw_xi*huon(i,j,k)
560 cff=0.125_r8*(pn(i,j)+pn(i,j-1))*(pm(i,j)+pm(i,j-1))* &
562 cff1=cff*(ohz(i,j,k)+ohz(i,j-1,k))
563 grade(j)=t(i,j,k,3,itrc)-t(i,j-1,k,3,itrc)
564 kae(j)=1.0_r8-abs(hvom(i,j,k)*cff1)
566 grade(j)=grade(j)*vmask(i,j)
567 kae(j)=kae(j)*vmask(i,j)
571 IF (
domain(ng)%Southern_Edge(tile))
THEN
572 IF (hvom(i,jstr,k).ge.0.0_r8)
THEN
577 IF (
domain(ng)%Northern_Edge(tile))
THEN
578 IF (hvom(i,jend+1,k).lt.0.0_r8)
THEN
585 IF (kae(j).le.eps1)
THEN
588 okae(j)=1.0_r8/max(kae(j),eps1)
590 IF (hvom(i,j,k).ge.0.0_r8)
THEN
591 IF (abs(grade(j)).le.eps1)
THEN
595 rd=grade(j-1)/grade(j)
596 rkad=kae(j-1)*okae(j)
601 cff=0.5_r8*max(0.0_r8, &
602 & min(2.0_r8, 2.0_r8*rd*rkad, betad))* &
608 sw_eta=t(i,j-1,k,3,itrc)+cff
610 IF (abs(grade(j)).le.eps1)
THEN
614 ru=grade(j+1)/grade(j)
615 rkau=kae(j+1)*okae(j)
620 cff=0.5*max(0.0_r8, &
621 & min(2.0_r8, 2.0_r8*ru*rkau, betau))* &
627 sw_eta=t(i,j,k,3,itrc)-cff
629 fe(i,j)=sw_eta*hvom(i,j,k)
643 fx(i,j)=t(i ,j,k,3,itrc)- &
646 fx(i,j)=fx(i,j)*umask(i,j)
651 IF (
domain(ng)%Western_Edge(tile))
THEN
653 fx(istr-1,j)=fx(istr,j)
658 IF (
domain(ng)%Eastern_Edge(tile))
THEN
660 fx(iend+2,j)=fx(iend+1,j)
668 curv(i,j)=fx(i+1,j)-fx(i,j)
670 cff=2.0_r8*fx(i+1,j)*fx(i,j)
672 grad(i,j)=cff/(fx(i+1,j)+fx(i,j))
676 ELSE IF ((
hadvection(itrc,ng)%CENTERED4).or. &
678 grad(i,j)=0.5_r8*(fx(i+1,j)+fx(i,j))
688 fx(i,j)=huon(i,j,k)*0.5_r8* &
689 & (t(i-1,j,k,3,itrc)+ &
690 & t(i ,j,k,3,itrc))- &
691 & cff1*(curv(i-1,j)*max(huon(i,j,k),0.0_r8)+ &
692 & curv(i ,j)*min(huon(i,j,k),0.0_r8))
696 fx(i,j)=huon(i,j,k)*0.5_r8* &
697 & (t(i-1,j,k,3,itrc)+ &
698 & t(i ,j,k,3,itrc)- &
699 & cff2*(grad(i ,j)- &
707 fe(i,j)=t(i,j ,k,3,itrc)- &
710 fe(i,j)=fe(i,j)*vmask(i,j)
715 IF (
domain(ng)%Southern_Edge(tile))
THEN
717 fe(i,jstr-1)=fe(i,jstr)
722 IF (
domain(ng)%Northern_Edge(tile))
THEN
724 fe(i,jend+2)=fe(i,jend+1)
732 curv(i,j)=fe(i,j+1)-fe(i,j)
734 cff=2.0_r8*fe(i,j+1)*fe(i,j)
736 grad(i,j)=cff/(fe(i,j+1)+fe(i,j))
740 ELSE IF ((
hadvection(itrc,ng)%CENTERED4).or. &
742 grad(i,j)=0.5_r8*(fe(i,j+1)+fe(i,j))
752 fe(i,j)=hvom(i,j,k)*0.5_r8* &
753 & (t(i,j-1,k,3,itrc)+ &
754 & t(i,j ,k,3,itrc))- &
755 & cff1*(curv(i,j-1)*max(hvom(i,j,k),0.0_r8)+ &
756 & curv(i,j )*min(hvom(i,j,k),0.0_r8))
760 fe(i,j)=hvom(i,j,k)*0.5_r8* &
761 & (t(i,j-1,k,3,itrc)+ &
762 & t(i,j ,k,3,itrc)- &
763 & cff2*(grad(i,j )- &
780 IF (int(
sources(ng)%Dsrc(is)).eq.0)
THEN
783 lapplysrc=(istrum2.le.isrc).and. &
784 & (isrc.le.iendp3).and. &
785 & (jstrvm2.le.jsrc).and. &
788 lapplysrc=(istr.le.isrc).and. &
789 & (isrc.le.iend+1).and. &
790 & (jstr.le.jsrc).and. &
795 fx(isrc,jsrc)=huon(isrc,jsrc,k)* &
799 IF ((rmask(isrc ,jsrc).eq.0.0_r8).and. &
800 & (rmask(isrc-1,jsrc).eq.1.0_r8))
THEN
801 fx(isrc,jsrc)=huon(isrc,jsrc,k)* &
802 & t(isrc-1,jsrc,k,3,itrc)
803 ELSE IF ((rmask(isrc ,jsrc).eq.1.0_r8).and. &
804 & (rmask(isrc-1,jsrc).eq.0.0_r8))
THEN
805 fx(isrc,jsrc)=huon(isrc,jsrc,k)* &
806 & t(isrc ,jsrc,k,3,itrc)
811 ELSE IF (int(
sources(ng)%Dsrc(is)).eq.1)
THEN
814 lapplysrc=(istrum2.le.isrc).and. &
815 & (isrc.le.iendp2i).and. &
816 & (jstrvm2.le.jsrc).and. &
819 lapplysrc=(istr.le.isrc).and. &
820 & (isrc.le.iend).and. &
821 & (jstr.le.jsrc).and. &
826 fe(isrc,jsrc)=hvom(isrc,jsrc,k)* &
830 IF ((rmask(isrc,jsrc ).eq.0.0_r8).and. &
831 & (rmask(isrc,jsrc-1).eq.1.0_r8))
THEN
832 fe(isrc,jsrc)=hvom(isrc,jsrc,k)* &
833 & t(isrc,jsrc-1,k,3,itrc)
834 ELSE IF ((rmask(isrc,jsrc ).eq.1.0_r8).and. &
835 & (rmask(isrc,jsrc-1).eq.0.0_r8))
THEN
836 fe(isrc,jsrc)=hvom(isrc,jsrc,k)* &
837 & t(isrc,jsrc ,k,3,itrc)
846# if defined NESTING && !defined ONE_WAY
858 & imins, imaxs, jmins, jmaxs, &
859 & ilb, iub, jlb, jub, &
873 hadv_stepping :
IF (
hadvection(itrc,ng)%MPDATA)
THEN
876 cff=
dt(ng)*pm(i,j)*pn(i,j)
877 cff1=cff*(fx(i+1,j)-fx(i,j))
878 cff2=cff*(fe(i,j+1)-fe(i,j))
880 ta(i,j,k,itrc)=t(i,j,k,nnew,itrc)-cff3
881# ifdef DIAGNOSTICS_TS
888# ifdef DIAGNOSTICS_TS
905 cff=
dt(ng)*pm(i,j)*pn(i,j)
906 cff1=cff*(fx(i+1,j)-fx(i,j))
907 cff2=cff*(fe(i,j+1)-fe(i,j))
909 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)-cff3
910# ifdef DIAGNOSTICS_TS
911 diatwrk(i,j,k,itrc,
itxadv)=-cff1
912 diatwrk(i,j,k,itrc,
ityadv)=-cff2
913 diatwrk(i,j,k,itrc,
ithadv)=-cff3
925 t_loop2 :
DO itrc=1,nt(ng)
934 j_loop1 :
DO j=jmint,jmaxt
936 vadv_flux :
IF (
vadvection(itrc,ng)%SPLINES)
THEN
944 fc(i,0)=1.5_r8*t(i,j,1,3,itrc)
947 fc(i,0)=2.0_r8*t(i,j,1,3,itrc)
953 cff=1.0_r8/(2.0_r8*hz(i,j,k)+ &
954 & hz(i,j,k+1)*(2.0_r8-cf(i,k)))
955 cf(i,k+1)=cff*hz(i,j,k)
956 fc(i,k)=cff*(3.0_r8*(hz(i,j,k )*t(i,j,k+1,3,itrc)+ &
957 & hz(i,j,k+1)*t(i,j,k ,3,itrc))- &
958 & hz(i,j,k+1)*fc(i,k-1))
963 fc(i,n(ng))=(3.0_r8*t(i,j,n(ng),3,itrc)-fc(i,n(ng)-1))/ &
964 & (2.0_r8-cf(i,n(ng)))
966 fc(i,n(ng))=(2.0_r8*t(i,j,n(ng),3,itrc)-fc(i,n(ng)-1))/ &
967 & (1.0_r8-cf(i,n(ng)))
972 fc(i,k)=fc(i,k)-cf(i,k+1)*fc(i,k+1)
974 fc(i,k+1)=(w(i,j,k+1)+w_stokes(i,j,k+1))*fc(i,k+1)
976 fc(i,k+1)=w(i,j,k+1)*fc(i,k+1)
991 fc(i,k)=t(i,j,k+1,3,itrc)- &
997 fc(i,n(ng))=fc(i,n(ng)-1)
1001 cff=2.0_r8*fc(i,k)*fc(i,k-1)
1002 IF (cff.gt.eps)
THEN
1003 cf(i,k)=cff/(fc(i,k)+fc(i,k-1))
1013 fc(i,k)=(w(i,j,k)+w_stokes(i,j,k))* &
1017 & 0.5_r8*(t(i,j,k ,3,itrc)+ &
1018 & t(i,j,k+1,3,itrc)- &
1019 & cff1*(cf(i,k+1)-cf(i,k)))
1035 fc(i,k)=(w(i,j,k)+w_stokes(i,j,k))* &
1039 & 0.5_r8*(t(i,j,k ,3,itrc)+ &
1040 & t(i,j,k+1,3,itrc))
1053 DO i=istrum2,iendp2i
1056 cff1=max(w(i,j,k)+w_stokes(i,j,k),0.0_r8)
1057 cff2=min(w(i,j,k)+w_stokes(i,j,k),0.0_r8)
1059 cff1=max(w(i,j,k),0.0_r8)
1060 cff2=min(w(i,j,k),0.0_r8)
1062 fc(i,k)=cff1*t(i,j,k ,3,itrc)+ &
1063 & cff2*t(i,j,k+1,3,itrc)
1080 cff=pm(i,j)*pn(i,j)*
dt(ng)
1082 kaz(k)=1.0_r8-abs(cff*(w(i,j,k)+w_stokes(i,j,k))/ &
1083 & (z_r(i,j,k+1)-z_r(i,j,k)))
1085 kaz(k)=1.0_r8-abs(cff*w(i,j,k)/ &
1086 & (z_r(i,j,k+1)-z_r(i,j,k)))
1088 okaz(k)=1.0_r8/kaz(k)
1089 gradz(k)=t(i,j,k+1,3,itrc)-t(i,j,k,3,itrc)
1097 cff1=w(i,j,k)+w_stokes(i,j,k)
1101 IF ((k.eq.1).and.(cff1.ge.0.0_r8))
THEN
1102 fc(i,k)=cff1*t(i,j,k,3,itrc)
1103 ELSE IF ((k.eq.n(ng)-1).and.(cff1.lt.0.0_r8))
THEN
1104 fc(i,k)=cff1*t(i,j,k+1,3,itrc)
1107 IF (abs(gradz(k)).le.eps1)
THEN
1111 rd=gradz(k-1)/gradz(k)
1112 rkad=kaz(k-1)*okaz(k)
1117 cff=0.5_r8*max(0.0_r8, &
1118 & min(2.0_r8, 2.0_r8*rd*rkad, betad))* &
1120 sw=t(i,j,k,3,itrc)+cff
1122 IF (abs(gradz(k)).le.eps1)
THEN
1126 ru=gradz(k+1)/gradz(k)
1127 rkau=kaz(k+1)*okaz(k)
1132 cff=0.5_r8*max(0.0_r8, &
1133 & min(2.0_r8, 2.0_r8*ru*rkau, betau))* &
1135 sw=t(i,j,k+1,3,itrc)-cff
1144 ELSE IF ((
vadvection(itrc,ng)%CENTERED4).or. &
1156 fc(i,k)=(w(i,j,k)+w_stokes(i,j,k))* &
1160 & (cff2*(t(i,j,k ,3,itrc)+ &
1161 & t(i,j,k+1,3,itrc))- &
1162 & cff3*(t(i,j,k-1,3,itrc)+ &
1163 & t(i,j,k+2,3,itrc)))
1169 fc(i,1)=(w(i,j,1)+w_stokes(i,j,1))* &
1173 & (cff1*t(i,j,1,3,itrc)+ &
1174 & cff2*t(i,j,2,3,itrc)- &
1175 & cff3*t(i,j,3,3,itrc))
1177 fc(i,n(ng)-1)=(w(i,j,n(ng)-1)+w_stokes(i,j,n(ng)-1))* &
1179 fc(i,n(ng)-1)=w(i,j,n(ng)-1)* &
1181 & (cff1*t(i,j,n(ng) ,3,itrc)+ &
1182 & cff2*t(i,j,n(ng)-1,3,itrc)- &
1183 & cff3*t(i,j,n(ng)-2,3,itrc))
1198 IF (int(
sources(ng)%Dsrc(is)).eq.2)
THEN
1201 IF (((istr.le.isrc).and.(isrc.le.iend+1)).and. &
1202 & ((jstr.le.jsrc).and.(jsrc.le.jend+1)).and. &
1205 cff=
dt(ng)*pm(isrc,jsrc)*pn(isrc,jsrc)
1207 cff3=
sources(ng)%Tsrc(is,k,itrc)
1209 cff3=t(isrc,jsrc,k,3,itrc)
1211 ta(isrc,jsrc,k,itrc)=ta(isrc,jsrc,k,itrc)+ &
1212 & cff*
sources(ng)%Qsrc(is,k)* &
1231 DO i=istrum2,iendp2i
1232 cff=cff1*(bed_thick(i,j,nstp)-bed_thick(i,j,3))
1233 cff3=t(i,j,k,3,itrc)
1234 ta(i,j,k,itrc)=ta(i,j,k,itrc)-cff*cff3
1242# ifdef DIAGNOSTICS_TS
1246 vadv_stepping :
IF (
vadvection(itrc,ng)%MPDATA)
THEN
1247 DO i=istrum2,iendp2i
1248 cf(i,0)=
dt(ng)*pm(i,j)*pn(i,j)
1251 DO i=istrum2,iendp2i
1252 cff1=cf(i,0)*(fc(i,k)-fc(i,k-1))
1253 ta(i,j,k,itrc)=(ta(i,j,k,itrc)-cff1)*ohz(i,j,k)
1254# ifdef DIAGNOSTICS_TS
1255 dvadv(i,j,k,itrc)=-cff1
1260# ifdef OMEGA_IMPLICIT
1272 cff1=cff*pm(i,j)*pn(i,j)
1273 fcmax(i,k)=max(wi(i,j,k),0.0_r8)*cff1
1274 fcmin(i,k)=min(wi(i,j,k),0.0_r8)*cff1
1280 fcmax(i,n(ng))=0.0_r8
1281 fcmin(i,n(ng))=0.0_r8
1289 bc(i,k)=hz(i,j,k)+fcmax(i,k)-fcmin(i,k-1)
1290 dc(i,k)=ta(i,j,k,itrc)*hz(i,j,k)
1298 cf(i,1)=cff*fcmin(i,1)
1303 cff=1.0_r8/(bc(i,k)+fcmax(i,k-1)*cf(i,k-1))
1304 cf(i,k)=cff*fcmin(i,k)
1305 dc(i,k)=cff*(dc(i,k)+fcmax(i,k-1)*dc(i,k-1))
1312# ifdef DIAGNOSTICS_TS
1313 cff1=ta(i,j,n(ng),itrc)*ohz(i,j,n(ng))
1315 cff=1.0_r8/(bc(i,n(ng))+fcmax(i,n(ng)-1)*cf(i,n(ng)-1))
1316 dc(i,n(ng))=cff*(dc(i,n(ng))+ &
1317 & fcmax(i,n(ng)-1)*dc(i,n(ng)-1))
1318 ta(i,j,n(ng),itrc)=dc(i,n(ng))
1319# ifdef DIAGNOSTICS_TS
1320 diatwrk(i,j,n(ng),itrc,
itvadv)= &
1321 & diatwrk(i,j,n(ng),itrc,
itvadv)+ &
1322 & ta(i,j,n(ng),itrc)-cff1
1327# ifdef DIAGNOSTICS_TS
1328 cff1=ta(i,j,k,itrc)*ohz(i,j,k)
1330 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1331 ta(i,j,k,itrc)=dc(i,k)
1332# ifdef DIAGNOSTICS_TS
1333 diatwrk(i,j,k,itrc,
itvadv)=diatwrk(i,j,k,itrc,
itvadv)+&
1334 & ta(i,j,k,itrc)-cff1
1342# ifdef DIAGNOSTICS_TS
1348 cf(i,0)=
dt(ng)*pm(i,j)*pn(i,j)
1352 cff1=cf(i,0)*(fc(i,k)-fc(i,k-1))
1353 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)-cff1
1354# ifdef SPLINES_VDIFF
1355 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)*ohz(i,j,k)
1357# ifdef DIAGNOSTICS_TS
1358 diatwrk(i,j,k,itrc,
itvadv)=-cff1
1360 diatwrk(i,j,k,itrc,idiag)=diatwrk(i,j,k,itrc,idiag)* &
1366 END IF vadv_stepping
1375 t_loop3 :
DO itrc=1,nt(ng)
1376 mpdata :
IF ((
hadvection(itrc,ng)%MPDATA).and. &
1379 & lbi, ubi, lbj, ubj, &
1380 & imins, imaxs, jmins, jmaxs, &
1382 & rmask, umask, vmask, &
1385 & rmask_wet, umask_wet, vmask_wet, &
1387 & pm, pn, omn, om_u, on_v, &
1393# ifdef OMEGA_IMPLICIT
1396 & t(:,:,:,3,itrc), &
1397 & ta(:,:,:,itrc), ua, va, wa)
1404 cff1=max(ua(i,j,k),0.0_r8)
1405 cff2=min(ua(i,j,k),0.0_r8)
1406 fx(i,j)=(cff1*ta(i-1,j,k,itrc)+ &
1407 & cff2*ta(i ,j,k,itrc))* &
1408 & 0.5_r8*(hz(i,j,k)+hz(i-1,j,k))*on_u(i,j)
1413 cff1=max(va(i,j,k),0.0_r8)
1414 cff2=min(va(i,j,k),0.0_r8)
1415 fe(i,j)=(cff1*ta(i,j-1,k,itrc)+ &
1416 & cff2*ta(i,j ,k,itrc))* &
1417 & 0.5_r8*(hz(i,j,k)+hz(i,j-1,k))*om_v(i,j)
1425 cff=
dt(ng)*pm(i,j)*pn(i,j)
1426 cff1=cff*(fx(i+1,j)-fx(i,j))
1427 cff2=cff*(fe(i,j+1)-fe(i,j))
1429 t(i,j,k,nnew,itrc)=ta(i,j,k,itrc)*hz(i,j,k)-cff3
1430# ifdef DIAGNOSTICS_TS
1431 diatwrk(i,j,k,itrc,
itxadv)=diatwrk(i,j,k,itrc,
itxadv)- &
1433 diatwrk(i,j,k,itrc,
ityadv)=diatwrk(i,j,k,itrc,
ityadv)- &
1435 diatwrk(i,j,k,itrc,
ithadv)=diatwrk(i,j,k,itrc,
ithadv)- &
1447 cff1=max(wa(i,j,k),0.0_r8)
1448 cff2=min(wa(i,j,k),0.0_r8)
1449 fc(i,k)=cff1*ta(i,j,k ,itrc)+ &
1450 & cff2*ta(i,j,k+1,itrc)
1459# ifdef DIAGNOSTICS_TS
1464 cf(i,0)=
dt(ng)*pm(i,j)*pn(i,j)
1468 cff1=cf(i,0)*(fc(i,k)-fc(i,k-1))
1469 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)-cff1
1470# ifdef DIAGNOSTICS_TS
1471 diatwrk(i,j,k,itrc,
itvadv)=dvadv(i,j,k,itrc)- &
1474 diatwrk(i,j,k,itrc,idiag)=diatwrk(i,j,k,itrc,idiag)* &
1497 IF (.not.((
hadvection(itrc,ng)%MPDATA).and. &
1500 IF (int(
sources(ng)%Dsrc(is)).eq.2)
THEN
1503 IF (((istr.le.isrc).and.(isrc.le.iend+1)).and. &
1504 & ((jstr.le.jsrc).and.(jsrc.le.jend+1)))
THEN
1506 cff=
dt(ng)*pm(isrc,jsrc)*pn(isrc,jsrc)
1507# ifdef SPLINES_VDIFF
1508 cff=cff*ohz(isrc,jsrc,k)
1511 cff3=
sources(ng)%Tsrc(is,k,itrc)
1513 cff3=t(isrc,jsrc,k,3,itrc)
1515 t(isrc,jsrc,k,nnew,itrc)=t(isrc,jsrc,k,nnew,itrc)+ &
1516 & cff*
sources(ng)%Qsrc(is,k)*&
1526# if defined SEDIMENT && defined SED_MORPH
1534 IF (.not.((
hadvection(itrc,ng)%MPDATA).and. &
1539 cff3=t(i,j,k,3,itrc)
1540# ifdef SPLINES_VDIFF
1541 cff3=cff3*ohz(i,j,k)
1543 cff=cff1*(bed_thick(i,j,nstp)-bed_thick(i,j,3))
1544 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)- &
1553# ifdef OMEGA_IMPLICIT
1571 cff1=cff*pm(i,j)*pn(i,j)
1572 fcmax(i,k)=max(wi(i,j,k),0.0_r8)*cff1
1573 fcmin(i,k)=min(wi(i,j,k),0.0_r8)*cff1
1579 fcmax(i,n(ng))=0.0_r8
1580 fcmin(i,n(ng))=0.0_r8
1588 bc(i,k)=hz(i,j,k)+fcmax(i,k)-fcmin(i,k-1)
1589# ifdef SPLINES_VDIFF
1590 dc(i,k)=t(i,j,k,nnew,itrc)*hz(i,j,k)
1592 dc(i,k)=t(i,j,k,nnew,itrc)
1601 cf(i,1)=cff*fcmin(i,1)
1606 cff=1.0_r8/(bc(i,k)+fcmax(i,k-1)*cf(i,k-1))
1607 cf(i,k)=cff*fcmin(i,k)
1608 dc(i,k)=cff*(dc(i,k)+fcmax(i,k-1)*dc(i,k-1))
1615# ifdef DIAGNOSTICS_TS
1616 cff1=t(i,j,n(ng),nnew,itrc)*ohz(i,j,n(ng))
1618 cff=1.0_r8/(bc(i,n(ng))+ &
1619 & fcmax(i,n(ng)-1)*cf(i,n(ng)-1))
1620 dc(i,n(ng))=cff*(dc(i,n(ng))+ &
1621 & fcmax(i,n(ng)-1)*dc(i,n(ng)-1))
1622# ifdef SPLINES_VDIFF
1623 t(i,j,n(ng),nnew,itrc)=dc(i,n(ng))
1625 t(i,j,n(ng),nnew,itrc)=dc(i,n(ng))*hz(i,j,n(ng))
1627# ifdef DIAGNOSTICS_TS
1628 diatwrk(i,j,n(ng),itrc,
itvadv)=diatwrk(i,j,n(ng),itrc, &
1636# ifdef DIAGNOSTICS_TS
1637 cff1=t(i,j,k,nnew,itrc)*ohz(i,j,k)
1639 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1640# ifdef SPLINES_VDIFF
1641 t(i,j,k,nnew,itrc)=dc(i,k)
1643 t(i,j,k,nnew,itrc)=dc(i,k)*hz(i,j,k)
1645# ifdef DIAGNOSTICS_TS
1646 diatwrk(i,j,k,itrc,
itvadv)=diatwrk(i,j,k,itrc,
itvadv)+ &
1660 j_loop2 :
DO j=jstr,jend
1664# ifdef SPLINES_VDIFF
1665 IF (.not.((
hadvection(itrc,ng)%MPDATA).and. &
1675 fc(i,k)=cff1*hz(i,j,k )- &
1676 &
dt(ng)*akt(i,j,k-1,ltrc)*ohz(i,j,k )
1677 cf(i,k)=cff1*hz(i,j,k+1)- &
1678 &
dt(ng)*akt(i,j,k+1,ltrc)*ohz(i,j,k+1)
1691 bc(i,k)=cff1*(hz(i,j,k)+hz(i,j,k+1))+ &
1692 &
dt(ng)*akt(i,j,k,ltrc)*(ohz(i,j,k)+ohz(i,j,k+1))
1693 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1695 dc(i,k)=cff*(t(i,j,k+1,nnew,itrc)-t(i,j,k,nnew,itrc)- &
1696 & fc(i,k)*dc(i,k-1))
1707 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1713 dc(i,k)=dc(i,k)*akt(i,j,k,ltrc)
1714 cff1=
dt(ng)*ohz(i,j,k)*(dc(i,k)-dc(i,k-1))
1715 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+cff1
1716# ifdef DIAGNOSTICS_TS
1717 diatwrk(i,j,k,itrc,
itvdif)=diatwrk(i,j,k,itrc,
itvdif)+ &
1733 cff1=1.0_r8/(z_r(i,j,k+1)-z_r(i,j,k))
1734 fc(i,k)=cff*cff1*akt(i,j,k,ltrc)
1747 bc(i,k)=hz(i,j,k)-fc(i,k)-fc(i,k-1)
1748 dc(i,k)=t(i,j,k,nnew,itrc)
1761 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
1763 dc(i,k)=cff*(dc(i,k)-fc(i,k-1)*dc(i,k-1))
1770# ifdef DIAGNOSTICS_TS
1771 cff1=t(i,j,n(ng),nnew,itrc)*ohz(i,j,n(ng))
1773 dc(i,n(ng))=(dc(i,n(ng))-fc(i,n(ng)-1)*dc(i,n(ng)-1))/ &
1774 & (bc(i,n(ng))-fc(i,n(ng)-1)*cf(i,n(ng)-1))
1775 t(i,j,n(ng),nnew,itrc)=dc(i,n(ng))
1776# ifdef DIAGNOSTICS_TS
1777 diatwrk(i,j,n(ng),itrc,
itvdif)= &
1778 & diatwrk(i,j,n(ng),itrc,
itvdif)+ &
1779 & t(i,j,n(ng),nnew,itrc)-cff1
1784# ifdef DIAGNOSTICS_TS
1785 cff1=t(i,j,k,nnew,itrc)*ohz(i,j,k)
1787 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1788 t(i,j,k,nnew,itrc)=dc(i,k)
1789# ifdef DIAGNOSTICS_TS
1790 diatwrk(i,j,k,itrc,
itvdif)=diatwrk(i,j,k,itrc,
itvdif)+ &
1791 & t(i,j,k,nnew,itrc)-cff1
1795# ifdef SPLINES_VDIFF
1801# if defined AGE_MEAN && defined T_PASSIVE
1824 t(i,j,k,nnew,iage)=t(i,j,k,nnew,iage)+ &
1825 &
dt(ng)*t(i,j,k,nnew,
inert(itrc))
1827 t(i,j,k,nnew,iage)=t(i,j,k,nnew,iage)+ &
1828 &
dt(ng)*t(i,j,k,3,
inert(itrc))
1859 & lbi, ubi, lbj, ubj, n(ng), nt(ng), &
1860 & imins, imaxs, jmins, jmaxs, &
1870 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+ &
1872 &
clima(ng)%Tnudgcof(i,j,k,ic)* &
1873 & (
clima(ng)%tclm(i,j,k,ic)- &
1874 & t(i,j,k,nnew,itrc))
1887 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)*rmask(i,j)
1892# ifdef DIAGNOSTICS_TS
1899 diatwrk(i,j,k,itrc,
itrate)=t(i,j,k,nnew,itrc)- &
1900 & diatwrk(i,j,k,itrc,
itrate)
1912 & lbi, ubi, lbj, ubj, 1, n(ng), &
1913 & t(:,:,:,nnew,itrc))
1921 & lbi, ubi, lbj, ubj, 1, n(ng), 1, nt(ng), &
1926# if defined FLOATS && defined FLOAT_VWALK
1936 daktdz(i,j,k)=(akt(i,j,k,1)-akt(i,j,k-1,1))/hz(i,j,k)
1945 & lbi, ubi, lbj, ubj, 1, n(ng), &
1951 & lbi, ubi, lbj, ubj, 1, n(ng), &
1963# ifdef DIAGNOSTICS_TS
1964 IF (
allocated(dhadv))
deallocate (dhadv)
1965 IF (
allocated(dvadv))
deallocate (dvadv)
1967 IF (
allocated(ta))
deallocate (ta)
1968 IF (
allocated(ua))
deallocate (ua)
1969 IF (
allocated(va))
deallocate (va)
1970 IF (
allocated(wa))
deallocate (wa)