97 & LBi, UBi, LBj, UBj, &
98 & IminS, ImaxS, JminS, JmaxS, &
104 & umask_wet, vmask_wet, &
106 & om_v, on_u, pm, pn, &
109# ifdef TS_U3ADV_SPLIT
110 & diff3d_u, diff3d_v, &
133 integer,
intent(in) :: ng, tile
134 integer,
intent(in) :: LBi, UBi, LBj, UBj
135 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
136 integer,
intent(in) :: nrhs, nstp, nnew
140 real(r8),
intent(in) :: umask(LBi:,LBj:)
141 real(r8),
intent(in) :: vmask(LBi:,LBj:)
144 real(r8),
intent(in) :: umask_wet(LBi:,LBj:)
145 real(r8),
intent(in) :: vmask_wet(LBi:,LBj:)
148# ifdef TS_U3ADV_SPLIT
149 real(r8),
intent(in) :: diff3d_u(LBi:,LBj:,:)
150 real(r8),
intent(in) :: diff3d_v(LBi:,LBj:,:)
152 real(r8),
intent(in) :: diff3d_r(LBi:,LBj:,:)
155 real(r8),
intent(in) :: diff4(LBi:,LBj:,:)
157 real(r8),
intent(in) :: om_v(LBi:,LBj:)
158 real(r8),
intent(in) :: on_u(LBi:,LBj:)
159 real(r8),
intent(in) :: pm(LBi:,LBj:)
160 real(r8),
intent(in) :: pn(LBi:,LBj:)
161 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
162 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
163 real(r8),
intent(in) :: pden(LBi:,LBj:,:)
165 real(r8),
intent(in) :: tclm(LBi:,LBj:,:,:)
167# ifdef DIAGNOSTICS_TS
168 real(r8),
intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
170 real(r8),
intent(inout) :: t(LBi:,LBj:,:,:,:)
173 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
174 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
177 real(r8),
intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
178 real(r8),
intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
181# ifdef TS_U3ADV_SPLIT
182 real(r8),
intent(in) :: diff3d_u(LBi:UBi,LBj:UBj,N(ng))
183 real(r8),
intent(in) :: diff3d_v(LBi:UBi,LBj:UBj,N(ng))
185 real(r8),
intent(in) :: diff3d_r(LBi:UBi,LBj:UBj,N(ng))
188 real(r8),
intent(in) :: diff4(LBi:UBi,LBj:UBj,NT(ng))
190 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
192 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
193 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
194 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
195 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
196 real(r8),
intent(in) :: pden(LBi:UBi,LBj:UBj,N(ng))
198 real(r8),
intent(in) :: tclm(LBi:UBi,LBj:UBj,N(ng),NT(ng))
200# ifdef DIAGNOSTICS_TS
201 real(r8),
intent(inout) :: DiaTwrk(LBi:UBi,LBj:UBj,N(ng),NT(ng), &
204 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
209 integer :: Imin, Imax, Jmin, Jmax
210 integer :: i, itrc, j, k, k1, k2
212 real(r8),
parameter :: eps = 0.5_r8
213 real(r8),
parameter :: small = 1.0e-14_r8
214 real(r8),
parameter :: slope_max = 0.0001_r8
215 real(r8),
parameter :: strat_min = 0.1_r8
217 real(r8) :: cff, cff1, cff2, cff3, cff4, dife, difx
219 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: LapT
221 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
222 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
224 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FS
225 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dRde
226 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dRdx
227 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTde
228 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdr
229 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdx
231#include "set_bounds.h"
246 imax=min(iend+1,
lm(ng))
253 jmax=min(jend+1,
mm(ng))
264#ifdef TS_MIX_STABILITY
270 t_loop :
DO itrc=1,nt(ng)
272 k_loop1 :
DO k=0,n(ng)
278 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
283 cff=cff*umask_wet(i,j)
285 drdx(i,j,k2)=cff*(pden(i ,j,k+1)- &
287#if defined TS_MIX_STABILITY
288 dtdx(i,j,k2)=cff*(0.75_r8*(t(i ,j,k+1,nrhs,itrc)- &
289 & t(i-1,j,k+1,nrhs,itrc))+ &
290 & 0.25_r8*(t(i ,j,k+1,nstp,itrc)- &
291 & t(i-1,j,k+1,nstp,itrc)))
292#elif defined TS_MIX_CLIMA
294 dtdx(i,j,k2)=cff*((t(i ,j,k+1,nrhs,itrc)- &
295 & tclm(i ,j,k+1,itrc))- &
296 & (t(i-1,j,k+1,nrhs,itrc)- &
297 & tclm(i-1,j,k+1,itrc)))
299 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
300 & t(i-1,j,k+1,nrhs,itrc))
303 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
304 & t(i-1,j,k+1,nrhs,itrc))
310 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
315 cff=cff*vmask_wet(i,j)
317 drde(i,j,k2)=cff*(pden(i,j ,k+1)- &
319#if defined TS_MIX_STABILITY
320 dtde(i,j,k2)=cff*(0.75_r8*(t(i,j ,k+1,nrhs,itrc)- &
321 & t(i,j-1,k+1,nrhs,itrc))+ &
322 & 0.25_r8*(t(i,j ,k+1,nstp,itrc)- &
323 & t(i,j-1,k+1,nstp,itrc)))
324#elif defined TS_MIX_CLIMA
326 dtde(i,j,k2)=cff*((t(i,j ,k+1,nrhs,itrc)- &
327 & tclm(i,j ,k+1,itrc))- &
328 & (t(i,j-1,k+1,nrhs,itrc)- &
329 & tclm(i,j-1,k+1,itrc)))
331 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
332 & t(i,j-1,k+1,nrhs,itrc))
335 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
336 & t(i,j-1,k+1,nrhs,itrc))
341 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
351#if defined TS_MIX_MAX_SLOPE
352 cff1=sqrt(drdx(i,j,k2)**2+drdx(i+1,j,k2)**2+ &
353 & drdx(i,j,k1)**2+drdx(i+1,j,k1)**2+ &
354 & drde(i,j,k2)**2+drde(i,j+1,k2)**2+ &
355 & drde(i,j,k1)**2+drde(i,j+1,k1)**2)
356 cff2=0.25_r8*slope_max* &
357 & (z_r(i,j,k+1)-z_r(i,j,k))*cff1
358 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
361#elif defined TS_MIX_MIN_STRAT
362 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
363 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
366 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
369#if defined TS_MIX_STABILITY
370 dtdr(i,j,k2)=cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
371 & t(i,j,k ,nrhs,itrc))+ &
372 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
373 & t(i,j,k ,nstp,itrc)))
374#elif defined TS_MIX_CLIMA
376 dtdr(i,j,k2)=cff*((t(i,j,k+1,nrhs,itrc)- &
377 & tclm(i,j,k+1,itrc))- &
378 & (t(i,j,k ,nrhs,itrc)- &
379 & tclm(i,j,k ,itrc)))
381 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
382 & t(i,j,k ,nrhs,itrc))
385 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
386 & t(i,j,k ,nrhs,itrc))
388 fs(i,j,k2)=cff*(z_r(i,j,k+1)- &
397# ifdef TS_U3ADV_SPLIT
398 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
400 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
404 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
408 & (hz(i,j,k)+hz(i-1,j,k))* &
410 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
413 & min(drdx(i,j,k1),0.0_r8)* &
421# ifdef TS_U3ADV_SPLIT
422 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
424 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
428 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
432 & (hz(i,j,k)+hz(i,j-1,k))* &
434 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
437 & min(drde(i,j,k1),0.0_r8)* &
446# ifdef TS_U3ADV_SPLIT
447 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
448 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
449 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
450 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
452 difx=0.5_r8*diff3d_r(i,j,k)
456 difx=0.5_r8*diff4(i,j,itrc)
459 cff1=max(drdx(i ,j,k1),0.0_r8)
460 cff2=max(drdx(i+1,j,k2),0.0_r8)
461 cff3=min(drdx(i ,j,k2),0.0_r8)
462 cff4=min(drdx(i+1,j,k1),0.0_r8)
464 & (cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
465 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
466 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
467 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1)))
469 cff1=max(drde(i,j ,k1),0.0_r8)
470 cff2=max(drde(i,j+1,k2),0.0_r8)
471 cff3=min(drde(i,j ,k2),0.0_r8)
472 cff4=min(drde(i,j+1,k1),0.0_r8)
475 & (cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
476 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
477 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
478 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1)))
479 fs(i,j,k2)=cff*fs(i,j,k2)
491 cff1=1.0_r8/hz(i,j,k)
492 lapt(i,j,k)=cff1*(cff* &
493 & (fx(i+1,j)-fx(i,j)+ &
494 & fe(i,j+1)-fe(i,j))+ &
495 & (fs(i,j,k2)-fs(i,j,k1)))
505 IF (
domain(ng)%Western_Edge(tile))
THEN
509 lapt(istr-1,j,k)=0.0_r8
515 lapt(istr-1,j,k)=lapt(istr,j,k)
523 IF (
domain(ng)%Eastern_Edge(tile))
THEN
527 lapt(iend+1,j,k)=0.0_r8
533 lapt(iend+1,j,k)=lapt(iend,j,k)
541 IF (
domain(ng)%Southern_Edge(tile))
THEN
545 lapt(i,jstr-1,k)=0.0_r8
551 lapt(i,jstr-1,k)=lapt(i,jstr,k)
559 IF (
domain(ng)%Northern_Edge(tile))
THEN
563 lapt(i,jend+1,k)=0.0_r8
569 lapt(i,jend+1,k)=lapt(i,jend,k)
578 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
580 lapt(istr-1,jstr-1,k)=0.5_r8* &
581 & (lapt(istr ,jstr-1,k)+ &
582 & lapt(istr-1,jstr ,k))
589 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
591 lapt(iend+1,jstr-1,k)=0.5_r8* &
592 & (lapt(iend ,jstr-1,k)+ &
593 & lapt(iend+1,jstr ,k))
600 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
602 lapt(istr-1,jend+1,k)=0.5_r8* &
603 & (lapt(istr ,jend+1,k)+ &
604 & lapt(istr-1,jend ,k))
611 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
613 lapt(iend+1,jend+1,k)=0.5_r8* &
614 & (lapt(iend ,jend+1,k)+ &
615 & lapt(iend+1,jend ,k))
624 k_loop2:
DO k=0,n(ng)
630 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
635 cff=cff*umask_wet(i,j)
637 drdx(i,j,k2)=cff*(pden(i ,j,k+1)- &
639 dtdx(i,j,k2)=cff*(lapt(i ,j,k+1)- &
645 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
650 cff=cff*vmask_wet(i,j)
652 drde(i,j,k2)=cff*(pden(i,j ,k+1)- &
654 dtde(i,j,k2)=cff*(lapt(i,j ,k+1)- &
659 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
669#if defined TS_MIX_MAX_SLOPE
670 cff1=sqrt(drdx(i,j,k2)**2+drdx(i+1,j,k2)**2+ &
671 & drdx(i,j,k1)**2+drdx(i+1,j,k1)**2+ &
672 & drde(i,j,k2)**2+drde(i,j+1,k2)**2+ &
673 & drde(i,j,k1)**2+drde(i,j+1,k1)**2)
674 cff2=0.25_r8*slope_max* &
675 & (z_r(i,j,k+1)-z_r(i,j,k))*cff1
676 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
679#elif defined TS_MIX_MIN_STRAT
680 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
681 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
684 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
687 dtdr(i,j,k2)=cff*(lapt(i,j,k+1)- &
689 fs(i,j,k2)=cff*(z_r(i,j,k+1)- &
702# ifdef TS_U3ADV_SPLIT
703 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
705 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
709 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
713 & (hz(i,j,k)+hz(i-1,j,k))* &
715 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
718 & min(drdx(i,j,k1),0.0_r8)* &
726# ifdef TS_U3ADV_SPLIT
727 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
729 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
733 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
737 & (hz(i,j,k)+hz(i,j-1,k))* &
739 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
742 & min(drde(i,j,k1),0.0_r8)* &
751# ifdef TS_U3ADV_SPLIT
752 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
753 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
754 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
755 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
757 difx=0.5_r8*diff3d_r(i,j,k)
761 difx=0.5_r8*diff4(i,j,itrc)
764 cff1=max(drdx(i ,j,k1),0.0_r8)
765 cff2=max(drdx(i+1,j,k2),0.0_r8)
766 cff3=min(drdx(i ,j,k2),0.0_r8)
767 cff4=min(drdx(i+1,j,k1),0.0_r8)
769 & (cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
770 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
771 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
772 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1)))
774 cff1=max(drde(i,j ,k1),0.0_r8)
775 cff2=max(drde(i,j+1,k2),0.0_r8)
776 cff3=min(drde(i,j ,k2),0.0_r8)
777 cff4=min(drde(i,j+1,k1),0.0_r8)
780 & (cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
781 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
782 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
783 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1)))
784 fs(i,j,k2)=cff*fs(i,j,k2)
793 cff=
dt(ng)*pm(i,j)*pn(i,j)
794 cff1=cff*(fx(i+1,j )-fx(i,j))
795 cff2=cff*(fe(i ,j+1)-fe(i,j))
796 cff3=
dt(ng)*(fs(i,j,k2)-fs(i,j,k1))
798 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)-cff4
800 diatwrk(i,j,k,itrc,
itxdif)=-cff1
801 diatwrk(i,j,k,itrc,
itydif)=-cff2
802 diatwrk(i,j,k,itrc,
itsdif)=-cff3
803 diatwrk(i,j,k,itrc,
ithdif)=-cff4