96 & LBi, UBi, LBj, UBj, &
97 & IminS, ImaxS, JminS, JmaxS, &
103 & umask_wet, vmask_wet, &
105 & om_v, on_u, pm, pn, &
108# ifdef TS_U3ADV_SPLIT
109 & diff3d_u, diff3d_v, &
131 integer,
intent(in) :: ng, tile
132 integer,
intent(in) :: LBi, UBi, LBj, UBj
133 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
134 integer,
intent(in) :: nrhs, nstp, nnew
138 real(r8),
intent(in) :: umask(LBi:,LBj:)
139 real(r8),
intent(in) :: vmask(LBi:,LBj:)
142 real(r8),
intent(in) :: umask_wet(LBi:,LBj:)
143 real(r8),
intent(in) :: vmask_wet(LBi:,LBj:)
146# ifdef TS_U3ADV_SPLIT
147 real(r8),
intent(in) :: diff3d_u(LBi:,LBj:,:)
148 real(r8),
intent(in) :: diff3d_v(LBi:,LBj:,:)
150 real(r8),
intent(in) :: diff3d_r(LBi:,LBj:,:)
153 real(r8),
intent(in) :: diff4(LBi:,LBj:,:)
155 real(r8),
intent(in) :: om_v(LBi:,LBj:)
156 real(r8),
intent(in) :: on_u(LBi:,LBj:)
157 real(r8),
intent(in) :: pm(LBi:,LBj:)
158 real(r8),
intent(in) :: pn(LBi:,LBj:)
159 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
160 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
162 real(r8),
intent(in) :: tclm(LBi:,LBj:,:,:)
164# ifdef DIAGNOSTICS_TS
165 real(r8),
intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
167 real(r8),
intent(inout) :: t(LBi:,LBj:,:,:,:)
170 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
171 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
174 real(r8),
intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
175 real(r8),
intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
178# ifdef TS_U3ADV_SPLIT
179 real(r8),
intent(in) :: diff3d_u(LBi:UBi,LBj:UBj,N(ng))
180 real(r8),
intent(in) :: diff3d_v(LBi:UBi,LBj:UBj,N(ng))
182 real(r8),
intent(in) :: diff3d_r(LBi:UBi,LBj:UBj,N(ng))
185 real(r8),
intent(in) :: diff4(LBi:UBi,LBj:UBj,NT(ng))
187 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
188 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
189 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
190 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
192 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
194 real(r8),
intent(in) :: tclm(LBi:UBi,LBj:UBj,N(ng),NT(ng))
196# ifdef DIAGNOSTICS_TS
197 real(r8),
intent(inout) :: DiaTwrk(LBi:UBi,LBj:UBj,N(ng),NT(ng), &
200 real(r8),
intent(inout) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
205 integer :: Imin, Imax, Jmin, Jmax
206 integer :: i, itrc, j, k, k1, k2
208 real(r8) :: cff, cff1, cff2, cff3, cff4, dife, difx
210 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: LapT
212 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
213 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
215 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FS
216 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTde
217 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdx
218 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdz
219 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde
220 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx
222#include "set_bounds.h"
237 imax=min(iend+1,
lm(ng))
244 jmax=min(jend+1,
mm(ng))
256#ifdef TS_MIX_STABILITY
262 t_loop :
DO itrc=1,nt(ng)
264 k_loop1 :
DO k=0,n(ng)
270 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
275 cff=cff*umask_wet(i,j)
277 dzdx(i,j,k2)=cff*(z_r(i ,j,k+1)- &
279#if defined TS_MIX_STABILITY
280 dtdx(i,j,k2)=cff*(0.75_r8*(t(i ,j,k+1,nrhs,itrc)- &
281 & t(i-1,j,k+1,nrhs,itrc))+ &
282 & 0.25_r8*(t(i ,j,k+1,nstp,itrc)- &
283 & t(i-1,j,k+1,nstp,itrc)))
284#elif defined TS_MIX_CLIMA
286 dtdx(i,j,k2)=cff*((t(i ,j,k+1,nrhs,itrc)- &
287 & tclm(i ,j,k+1,itrc))- &
288 & (t(i-1,j,k+1,nrhs,itrc)- &
289 & tclm(i-1,j,k+1,itrc)))
291 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
292 & t(i-1,j,k+1,nrhs,itrc))
295 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
296 & t(i-1,j,k+1,nrhs,itrc))
302 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
307 cff=cff*vmask_wet(i,j)
309 dzde(i,j,k2)=cff*(z_r(i,j ,k+1)- &
311#if defined TS_MIX_STABILITY
312 dtde(i,j,k2)=cff*(0.75_r8*(t(i,j ,k+1,nrhs,itrc)- &
313 & t(i,j-1,k+1,nrhs,itrc))+ &
314 & 0.25_r8*(t(i,j ,k+1,nstp,itrc)- &
315 & t(i,j-1,k+1,nstp,itrc)))
316#elif defined TS_MIX_CLIMA
318 dtde(i,j,k2)=cff*((t(i,j ,k+1,nrhs,itrc)- &
319 & tclm(i,j ,k+1,itrc))- &
320 & (t(i,j-1,k+1,nrhs,itrc)- &
321 & tclm(i,j-1,k+1,itrc)))
323 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
324 & t(i,j-1,k+1,nrhs,itrc))
327 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
328 & t(i,j-1,k+1,nrhs,itrc))
333 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
343 cff=1.0_r8/(z_r(i,j,k+1)- &
345#if defined TS_MIX_STABILITY
346 dtdz(i,j,k2)=cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
347 & t(i,j,k ,nrhs,itrc))+ &
348 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
349 & t(i,j,k ,nstp,itrc)))
350#elif defined TS_MIX_CLIMA
352 dtdz(i,j,k2)=cff*((t(i,j,k+1,nrhs,itrc)- &
353 & tclm(i,j,k+1,itrc))- &
354 & (t(i,j,k ,nrhs,itrc)- &
355 & tclm(i,j,k ,itrc)))
357 dtdz(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
358 & t(i,j,k ,nrhs,itrc))
361 dtdz(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
362 & t(i,j,k ,nrhs,itrc))
371# ifdef TS_U3ADV_SPLIT
372 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
374 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
378 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
382 & (hz(i,j,k)+hz(i-1,j,k))* &
384 & 0.5_r8*(min(dzdx(i,j,k1),0.0_r8)* &
387 & max(dzdx(i,j,k1),0.0_r8)* &
395# ifdef TS_U3ADV_SPLIT
396 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
398 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
402 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
406 & (hz(i,j,k)+hz(i,j-1,k))* &
408 & 0.5_r8*(min(dzde(i,j,k1),0.0_r8)* &
411 & max(dzde(i,j,k1),0.0_r8)* &
420# ifdef TS_U3ADV_SPLIT
421 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
422 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
423 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
424 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
426 difx=0.5_r8*diff3d_r(i,j,k)
430 difx=0.5_r8*diff4(i,j,itrc)
433 cff1=min(dzdx(i ,j,k1),0.0_r8)
434 cff2=min(dzdx(i+1,j,k2),0.0_r8)
435 cff3=max(dzdx(i ,j,k2),0.0_r8)
436 cff4=max(dzdx(i+1,j,k1),0.0_r8)
438 & (cff1*(cff1*dtdz(i,j,k2)- &
440 & cff2*(cff2*dtdz(i,j,k2)- &
442 & cff3*(cff3*dtdz(i,j,k2)- &
444 & cff4*(cff4*dtdz(i,j,k2)- &
447 cff1=min(dzde(i,j ,k1),0.0_r8)
448 cff2=min(dzde(i,j+1,k2),0.0_r8)
449 cff3=max(dzde(i,j ,k2),0.0_r8)
450 cff4=max(dzde(i,j+1,k1),0.0_r8)
451 fs(i,j,k2)=fs(i,j,k2)+ &
453 & (cff1*(cff1*dtdz(i,j,k2)- &
455 & cff2*(cff2*dtdz(i,j,k2)- &
457 & cff3*(cff3*dtdz(i,j,k2)- &
459 & cff4*(cff4*dtdz(i,j,k2)- &
472 cff1=1.0_r8/hz(i,j,k)
473 lapt(i,j,k)=cff1*(cff* &
474 & (fx(i+1,j)-fx(i,j)+ &
475 & fe(i,j+1)-fe(i,j))+ &
476 & (fs(i,j,k2)-fs(i,j,k1)))
486 IF (
domain(ng)%Western_Edge(tile))
THEN
490 lapt(istr-1,j,k)=0.0_r8
496 lapt(istr-1,j,k)=lapt(istr,j,k)
504 IF (
domain(ng)%Eastern_Edge(tile))
THEN
508 lapt(iend+1,j,k)=0.0_r8
514 lapt(iend+1,j,k)=lapt(iend,j,k)
522 IF (
domain(ng)%Southern_Edge(tile))
THEN
526 lapt(i,jstr-1,k)=0.0_r8
532 lapt(i,jstr-1,k)=lapt(i,jstr,k)
540 IF (
domain(ng)%Northern_Edge(tile))
THEN
544 lapt(i,jend+1,k)=0.0_r8
550 lapt(i,jend+1,k)=lapt(i,jend,k)
559 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
561 lapt(istr-1,jstr-1,k)=0.5_r8* &
562 & (lapt(istr ,jstr-1,k)+ &
563 & lapt(istr-1,jstr ,k))
570 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
572 lapt(iend+1,jstr-1,k)=0.5_r8* &
573 & (lapt(iend ,jstr-1,k)+ &
574 & lapt(iend+1,jstr ,k))
581 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
583 lapt(istr-1,jend+1,k)=0.5_r8* &
584 & (lapt(istr ,jend+1,k)+ &
585 & lapt(istr-1,jend ,k))
592 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
594 lapt(iend+1,jend+1,k)=0.5_r8* &
595 & (lapt(iend ,jend+1,k)+ &
596 & lapt(iend+1,jend ,k))
605 k_loop2:
DO k=0,n(ng)
611 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
616 cff=cff*umask_wet(i,j)
618 dzdx(i,j,k2)=cff*(z_r(i ,j,k+1)- &
620 dtdx(i,j,k2)=cff*(lapt(i ,j,k+1)- &
626 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
631 cff=cff*vmask_wet(i,j)
633 dzde(i,j,k2)=cff*(z_r(i,j ,k+1)- &
635 dtde(i,j,k2)=cff*(lapt(i,j ,k+1)- &
640 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
650 cff=1.0_r8/(z_r(i,j,k+1)- &
652 dtdz(i,j,k2)=cff*(lapt(i,j,k+1)- &
665# ifdef TS_U3ADV_SPLIT
666 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
668 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
672 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
676 & (hz(i,j,k)+hz(i-1,j,k))* &
678 & 0.5_r8*(min(dzdx(i,j,k1),0.0_r8)* &
681 & max(dzdx(i,j,k1),0.0_r8)* &
689# ifdef TS_U3ADV_SPLIT
690 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
692 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
696 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
700 & (hz(i,j,k)+hz(i,j-1,k))* &
702 & 0.5_r8*(min(dzde(i,j,k1),0.0_r8)* &
705 & max(dzde(i,j,k1),0.0_r8)* &
714# ifdef TS_U3ADV_SPLIT
715 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
716 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
717 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
718 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
720 difx=0.5_r8*diff3d_r(i,j,k)
724 difx=0.5_r8*diff4(i,j,itrc)
727 cff1=min(dzdx(i ,j,k1),0.0_r8)
728 cff2=min(dzdx(i+1,j,k2),0.0_r8)
729 cff3=max(dzdx(i ,j,k2),0.0_r8)
730 cff4=max(dzdx(i+1,j,k1),0.0_r8)
732 & (cff1*(cff1*dtdz(i,j,k2)- &
734 & cff2*(cff2*dtdz(i,j,k2)- &
736 & cff3*(cff3*dtdz(i,j,k2)- &
738 & cff4*(cff4*dtdz(i,j,k2)- &
741 cff1=min(dzde(i,j ,k1),0.0_r8)
742 cff2=min(dzde(i,j+1,k2),0.0_r8)
743 cff3=max(dzde(i,j ,k2),0.0_r8)
744 cff4=max(dzde(i,j+1,k1),0.0_r8)
745 fs(i,j,k2)=fs(i,j,k2)+ &
747 & (cff1*(cff1*dtdz(i,j,k2)- &
749 & cff2*(cff2*dtdz(i,j,k2)- &
751 & cff3*(cff3*dtdz(i,j,k2)- &
753 & cff4*(cff4*dtdz(i,j,k2)- &
763 cff=
dt(ng)*pm(i,j)*pn(i,j)
764 cff1=cff*(fx(i+1,j )-fx(i,j))
765 cff2=cff*(fe(i ,j+1)-fe(i,j))
766 cff3=
dt(ng)*(fs(i,j,k2)-fs(i,j,k1))
768 t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)-cff4
770 diatwrk(i,j,k,itrc,
itxdif)=-cff1
771 diatwrk(i,j,k,itrc,
itydif)=-cff2
772 diatwrk(i,j,k,itrc,
itsdif)=-cff3
773 diatwrk(i,j,k,itrc,
ithdif)=-cff4