103 & LBi, UBi, LBj, UBj, &
104 & IminS, ImaxS, JminS, JmaxS, &
105 & nrhs, nstp, nnew, &
109#ifdef WET_DRY_NOT_YET
110 & umask_wet, vmask_wet, &
112 & om_v, on_u, pm, pn, &
116# ifdef TS_U3ADV_SPLIT
117 & diff3d_u, diff3d_v, &
140 integer,
intent(in) :: ng, tile
141 integer,
intent(in) :: LBi, UBi, LBj, UBj
142 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
143 integer,
intent(in) :: nrhs, nstp, nnew
147 real(r8),
intent(in) :: umask(LBi:,LBj:)
148 real(r8),
intent(in) :: vmask(LBi:,LBj:)
150# ifdef WET_DRY_NOT_YET
151 real(r8),
intent(in) :: umask_wet(LBi:,LBj:)
152 real(r8),
intent(in) :: vmask_wet(LBi:,LBj:)
155# ifdef TS_U3ADV_SPLIT
156 real(r8),
intent(in) :: diff3d_u(LBi:,LBj:,:)
157 real(r8),
intent(in) :: diff3d_v(LBi:,LBj:,:)
159 real(r8),
intent(in) :: diff3d_r(LBi:,LBj:,:)
162 real(r8),
intent(in) :: diff4(LBi:,LBj:,:)
164 real(r8),
intent(in) :: om_v(LBi:,LBj:)
165 real(r8),
intent(in) :: on_u(LBi:,LBj:)
166 real(r8),
intent(in) :: pm(LBi:,LBj:)
167 real(r8),
intent(in) :: pn(LBi:,LBj:)
168 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
169 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
170 real(r8),
intent(in) :: pden(LBi:,LBj:,:)
171 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
173 real(r8),
intent(in) :: tclm(LBi:,LBj:,:,:)
175# ifdef DIAGNOSTICS_TS
176 real(r8),
intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
178 real(r8),
intent(inout) :: ad_Hz(LBi:,LBj:,:)
179 real(r8),
intent(inout) :: ad_z_r(LBi:,LBj:,:)
180 real(r8),
intent(inout) :: ad_pden(LBi:,LBj:,:)
181 real(r8),
intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
184 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
185 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
187# ifdef WET_DRY_NOT_YET
188 real(r8),
intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
189 real(r8),
intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
192# ifdef TS_U3ADV_SPLIT
193 real(r8),
intent(in) :: diff3d_u(LBi:UBi,LBj:UBj,N(ng))
194 real(r8),
intent(in) :: diff3d_v(LBi:UBi,LBj:UBj,N(ng))
196 real(r8),
intent(in) :: diff3d_r(LBi:UBi,LBj:UBj,N(ng))
199 real(r8),
intent(in) :: diff4(LBi:UBi,LBj:UBj,NT(ng))
201 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
202 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
203 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
204 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
205 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
206 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
207 real(r8),
intent(in) :: pden(LBi:UBi,LBj:UBj,N(ng))
208 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
210 real(r8),
intent(in) :: tclm(LBi:UBi,LBj:UBj,N(ng),NT(ng))
212# ifdef DIAGNOSTICS_TS
216 real(r8),
intent(inout) :: ad_Hz(LBi:UBi,LBj:UBj,N(ng))
217 real(r8),
intent(inout) :: ad_z_r(LBi:UBi,LBj:UBj,N(ng))
218 real(r8),
intent(inout) :: ad_pden(LBi:UBi,LBj:UBj,N(ng))
219 real(r8),
intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
224 integer :: Imin, Imax, Jmin, Jmax
225 integer :: i, itrc, j, k, kk, kt, k1, k1b, k2, k2b
227 real(r8),
parameter :: eps = 0.5_r8
228 real(r8),
parameter :: small = 1.0e-14_r8
229 real(r8),
parameter :: slope_max = 0.0001_r8
230 real(r8),
parameter :: strat_min = 0.1_r8
232 real(r8) :: cff, cff1, cff2, cff3, cff4, dife, difx
233 real(r8) :: ad_cff, ad_cff1, ad_cff2, ad_cff3, ad_cff4
234 real(r8) :: adfac, adfac1, adfac2, adfac3, adfac4
236 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: LapT
238 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: ad_LapT
240 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
241 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
243 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_FE
244 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_FX
246 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FS
247 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FS1
248 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dRde
249 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dRdx
250 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTde
251 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdr
252 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdx
254 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_FS
255 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dRde
256 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dRdx
257 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dTde
258 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dTdr
259 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dTdx
261#include "set_bounds.h"
273 ad_fe(imins:imaxs,jmins:jmaxs)=0.0_r8
274 ad_fx(imins:imaxs,jmins:jmaxs)=0.0_r8
276 ad_fs(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
278 ad_drde(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
279 ad_drdx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
280 ad_dtde(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
281 ad_dtdr(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
282 ad_dtdx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
284 ad_lapt(imins:imaxs,jmins:jmaxs,1:n(ng))=0.0_r8
299 imax=min(iend+1,
lm(ng))
306 jmax=min(jend+1,
mm(ng))
318#ifdef TS_MIX_STABILITY
324 t_loop :
DO itrc=1,nt(ng)
326 k_loop1 :
DO k=0,n(ng)
332 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
336#ifdef WET_DRY_NOT_YET
337 cff=cff*umask_wet(i,j)
339 drdx(i,j,k2)=cff*(pden(i ,j,k+1)- &
341#if defined TS_MIX_STABILITY
342 dtdx(i,j,k2)=cff*(0.75_r8*(t(i ,j,k+1,nrhs,itrc)- &
343 & t(i-1,j,k+1,nrhs,itrc))+ &
344 & 0.25_r8*(t(i ,j,k+1,nstp,itrc)- &
345 & t(i-1,j,k+1,nstp,itrc)))
346#elif defined TS_MIX_CLIMA
348 dtdx(i,j,k2)=cff*((t(i ,j,k+1,nrhs,itrc)- &
349 & tclm(i ,j,k+1,itrc))- &
350 & (t(i-1,j,k+1,nrhs,itrc)- &
351 & tclm(i-1,j,k+1,itrc)))
353 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
354 & t(i-1,j,k+1,nrhs,itrc))
357 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
358 & t(i-1,j,k+1,nrhs,itrc))
364 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
368#ifdef WET_DRY_NOT_YET
369 cff=cff*vmask_wet(i,j)
371 drde(i,j,k2)=cff*(pden(i,j ,k+1)- &
373#if defined TS_MIX_STABILITY
374 dtde(i,j,k2)=cff*(0.75_r8*(t(i,j ,k+1,nrhs,itrc)- &
375 & t(i,j-1,k+1,nrhs,itrc))+ &
376 & 0.25_r8*(t(i,j ,k+1,nstp,itrc)- &
377 & t(i,j-1,k+1,nstp,itrc)))
378#elif defined TS_MIX_CLIMA
380 dtde(i,j,k2)=cff*((t(i,j ,k+1,nrhs,itrc)- &
381 & tclm(i,j ,k+1,itrc))- &
382 & (t(i,j-1,k+1,nrhs,itrc)- &
383 & tclm(i,j-1,k+1,itrc)))
385 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
386 & t(i,j-1,k+1,nrhs,itrc))
389 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
390 & t(i,j-1,k+1,nrhs,itrc))
395 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
405#if defined TS_MIX_MAX_SLOPE
406 cff1=sqrt(drdx(i,j,k2)**2+drdx(i+1,j,k2)**2+ &
407 & drdx(i,j,k1)**2+drdx(i+1,j,k1)**2+ &
408 & drde(i,j,k2)**2+drde(i,j+1,k2)**2+ &
409 & drde(i,j,k1)**2+drde(i,j+1,k1)**2)
410 cff2=0.25_r8*slope_max* &
411 & (z_r(i,j,k+1)-z_r(i,j,k))*cff1
412 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
415#elif defined TS_MIX_MIN_STRAT
416 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
417 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
420 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
423#if defined TS_MIX_STABILITY
424 dtdr(i,j,k2)=cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
425 & t(i,j,k ,nrhs,itrc))+ &
426 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
427 & t(i,j,k ,nstp,itrc)))
428#elif defined TS_MIX_CLIMA
430 dtdr(i,j,k2)=cff*((t(i,j,k+1,nrhs,itrc)- &
431 & tclm(i,j,k+1,itrc))- &
432 & (t(i,j,k ,nrhs,itrc)- &
433 & tclm(i,j,k ,itrc)))
435 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
436 & t(i,j,k ,nrhs,itrc))
439 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
440 & t(i,j,k ,nrhs,itrc))
442 fs(i,j,k2)=cff*(z_r(i,j,k+1)- &
451# ifdef TS_U3ADV_SPLIT
452 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
454 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
458 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
462 & (hz(i,j,k)+hz(i-1,j,k))* &
464 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
467 & min(drdx(i,j,k1),0.0_r8)* &
475# ifdef TS_U3ADV_SPLIT
476 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
478 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
482 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
486 & (hz(i,j,k)+hz(i,j-1,k))* &
488 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
491 & min(drde(i,j,k1),0.0_r8)* &
500# ifdef TS_U3ADV_SPLIT
501 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
502 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
503 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
504 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
506 difx=0.5_r8*diff3d_r(i,j,k)
510 difx=0.5_r8*diff4(i,j,itrc)
513 cff1=max(drdx(i ,j,k1),0.0_r8)
514 cff2=max(drdx(i+1,j,k2),0.0_r8)
515 cff3=min(drdx(i ,j,k2),0.0_r8)
516 cff4=min(drdx(i+1,j,k1),0.0_r8)
518 & (cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
519 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
520 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
521 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1)))
522 cff1=max(drde(i,j ,k1),0.0_r8)
523 cff2=max(drde(i,j+1,k2),0.0_r8)
524 cff3=min(drde(i,j ,k2),0.0_r8)
525 cff4=min(drde(i,j+1,k1),0.0_r8)
528 & (cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
529 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
530 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
531 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1)))
532 fs(i,j,k2)=cff*fs(i,j,k2)
544 cff1=1.0_r8/hz(i,j,k)
545 lapt(i,j,k)=cff1*(cff* &
546 & (fx(i+1,j)-fx(i,j)+ &
547 & fe(i,j+1)-fe(i,j))+ &
548 & (fs(i,j,k2)-fs(i,j,k1)))
558 IF (
domain(ng)%Western_Edge(tile))
THEN
562 lapt(istr-1,j,k)=0.0_r8
568 lapt(istr-1,j,k)=lapt(istr,j,k)
576 IF (
domain(ng)%Eastern_Edge(tile))
THEN
580 lapt(iend+1,j,k)=0.0_r8
586 lapt(iend+1,j,k)=lapt(iend,j,k)
594 IF (
domain(ng)%Southern_Edge(tile))
THEN
598 lapt(i,jstr-1,k)=0.0_r8
604 lapt(i,jstr-1,k)=lapt(i,jstr,k)
612 IF (
domain(ng)%Northern_Edge(tile))
THEN
616 lapt(i,jend+1,k)=0.0_r8
622 lapt(i,jend+1,k)=lapt(i,jend,k)
631 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
633 lapt(istr-1,jstr-1,k)=0.5_r8* &
634 & (lapt(istr ,jstr-1,k)+ &
635 & lapt(istr-1,jstr ,k))
642 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
644 lapt(iend+1,jstr-1,k)=0.5_r8* &
645 & (lapt(iend ,jstr-1,k)+ &
646 & lapt(iend+1,jstr ,k))
653 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
655 lapt(istr-1,jend+1,k)=0.5_r8* &
656 & (lapt(istr ,jend+1,k)+ &
657 & lapt(istr-1,jend ,k))
664 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
666 lapt(iend+1,jend+1,k)=0.5_r8* &
667 & (lapt(iend ,jend+1,k)+ &
668 & lapt(iend+1,jend ,k))
694 k_loop2:
DO k=n(ng),0,-1
703 IF (kk.lt.n(ng))
THEN
706 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
710#ifdef WET_DRY_NOT_YET
711 cff=cff*umask_wet(i,j)
713 drdx(i,j,k2b)=cff*(pden(i ,j,kk+1)- &
715 dtdx(i,j,k2b)=cff*(lapt(i ,j,kk+1)- &
729 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
733#ifdef WET_DRY_NOT_YET
734 cff=cff*vmask_wet(i,j)
736 drde(i,j,k2b)=cff*(pden(i,j ,kk+1)- &
738 dtde(i,j,k2b)=cff*(lapt(i,j ,kk+1)- &
751 IF ((kk.eq.0).or.(kk.eq.n(ng)))
THEN
769#if defined TS_MIX_MAX_SLOPE
770 cff1=sqrt(drdx(i,j,k2b)**2+drdx(i+1,j,k2b)**2+ &
771 & drdx(i,j,k1b)**2+drdx(i+1,j,k1b)**2+ &
772 & drde(i,j,k2b)**2+drde(i,j+1,k2b)**2+ &
773 & drde(i,j,k1b)**2+drde(i,j+1,k1b)**2)
774 cff2=0.25_r8*slope_max* &
775 & (z_r(i,j,kk+1)-z_r(i,j,kk))*cff1
776 cff3=max(pden(i,j,kk)-pden(i,j,kk+1),small)
779#elif defined TS_MIX_MIN_STRAT
780 cff1=max(pden(i,j,kk)-pden(i,j,kk+1), &
781 & strat_min*(z_r(i,j,kk+1)-z_r(i,j,kk)))
784 cff1=max(pden(i,j,kk)-pden(i,j,kk+1),eps)
787 dtdr(i,j,k2b)=cff*(lapt(i,j,kk+1)- &
789 fs(i,j,k2b)=cff*(z_r(i,j,kk+1)- &
807 ad_cff=ad_cff-ad_t(i,j,k,nnew,itrc)
814 adfac1=adfac*pm(i,j)*pn(i,j)
815 ad_fs(i,j,k1)=ad_fs(i,j,k1)-adfac
816 ad_fs(i,j,k2)=ad_fs(i,j,k2)+adfac
817 ad_fx(i ,j)=ad_fx(i ,j)-adfac1
818 ad_fx(i+1,j)=ad_fx(i+1,j)+adfac1
819 ad_fe(i,j )=ad_fe(i,j )-adfac1
820 ad_fe(i,j+1)=ad_fe(i,j+1)+adfac1
828# ifdef TS_U3ADV_SPLIT
829 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
830 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
831 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
832 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
834 difx=0.5_r8*diff3d_r(i,j,k)
838 difx=0.5_r8*diff4(i,j,itrc)
841 cff1=max(drdx(i ,j,k1),0.0_r8)
842 cff2=max(drdx(i+1,j,k2),0.0_r8)
843 cff3=min(drdx(i ,j,k2),0.0_r8)
844 cff4=min(drdx(i+1,j,k1),0.0_r8)
846 & (cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
847 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
848 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
849 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1)))
850 cff1=max(drde(i,j ,k1),0.0_r8)
851 cff2=max(drde(i,j+1,k2),0.0_r8)
852 cff3=min(drde(i,j ,k2),0.0_r8)
853 cff4=min(drde(i,j+1,k1),0.0_r8)
856 & (cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
857 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
858 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
859 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1)))
863 ad_cff=ad_cff+fs(i,j,k2)*ad_fs(i,j,k2)
864 ad_fs(i,j,k2)=cff*ad_fs(i,j,k2)
890 & (2.0_r8*cff1*dtdr(i,j,k2)-dtde(i,j ,k1))* &
893 & (2.0_r8*cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))* &
896 & (2.0_r8*cff3*dtdr(i,j,k2)-dtde(i,j ,k2))* &
899 & (2.0_r8*cff4*dtdr(i,j,k2)-dtde(i,j+1,k1))* &
901 ad_dtdr(i,j,k2)=ad_dtdr(i,j,k2)+ &
906 ad_dtde(i,j ,k1)=ad_dtde(i,j ,k1)-cff1*adfac
907 ad_dtde(i,j+1,k2)=ad_dtde(i,j+1,k2)-cff2*adfac
908 ad_dtde(i,j ,k2)=ad_dtde(i,j ,k2)-cff3*adfac
909 ad_dtde(i,j+1,k1)=ad_dtde(i,j+1,k1)-cff4*adfac
913 ad_drde(i,j+1,k1)=ad_drde(i,j+1,k1)+ &
914 & (0.5_r8+sign(0.5_r8, &
915 & -drde(i,j+1,k1)))* &
921 ad_drde(i,j ,k2)=ad_drde(i,j ,k2)+ &
922 & (0.5_r8+sign(0.5_r8, &
923 & -drde(i,j ,k2)))* &
929 ad_drde(i,j+1,k2)=ad_drde(i,j+1,k2)+ &
930 & (0.5_r8+sign(0.5_r8, &
931 & drde(i,j+1,k2)))* &
937 ad_drde(i,j ,k1)=ad_drde(i,j ,k1)+ &
938 & (0.5_r8+sign(0.5_r8, &
943 cff1=max(drdx(i ,j,k1),0.0_r8)
944 cff2=max(drdx(i+1,j,k2),0.0_r8)
945 cff3=min(drdx(i ,j,k2),0.0_r8)
946 cff4=min(drdx(i+1,j,k1),0.0_r8)
971 & (2.0_r8*cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))* &
974 & (2.0_r8*cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))* &
977 & (2.0_r8*cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))* &
980 & (2.0_r8*cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1))* &
982 ad_dtdr(i,j,k2)=ad_dtdr(i,j,k2)+ &
987 ad_dtdx(i ,j,k1)=ad_dtdx(i ,j,k1)-cff1*adfac
988 ad_dtdx(i+1,j,k2)=ad_dtdx(i+1,j,k2)-cff2*adfac
989 ad_dtdx(i ,j,k2)=ad_dtdx(i ,j,k2)-cff3*adfac
990 ad_dtdx(i+1,j,k1)=ad_dtdx(i+1,j,k1)-cff4*adfac
995 ad_drdx(i+1,j,k1)=ad_drdx(i+1,j,k1)+ &
996 & (0.5_r8+sign(0.5_r8, &
997 & -drdx(i+1,j,k1)))* &
1003 ad_drdx(i ,j,k2)=ad_drdx(i ,j,k2)+ &
1004 & (0.5_r8+sign(0.5_r8, &
1005 & -drdx(i ,j,k2)))* &
1011 ad_drdx(i+1,j,k2)=ad_drdx(i+1,j,k2)+ &
1012 & (0.5_r8+sign(0.5_r8, &
1013 & drdx(i+1,j,k2)))* &
1019 ad_drdx(i ,j,k1)=ad_drdx(i ,j,k1)+ &
1020 & (0.5_r8+sign(0.5_r8, &
1021 & drdx(i ,j,k1)))* &
1030# ifdef TS_U3ADV_SPLIT
1031 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
1033 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
1037 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
1066 adfac=cff*ad_fe(i,j)
1067 adfac1=adfac*(dtde(i,j,k1)- &
1068 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
1069 & (dtdr(i,j-1,k1)+ &
1071 & min(drde(i,j,k1),0.0_r8)* &
1072 & (dtdr(i,j-1,k2)+ &
1074 adfac2=adfac*(hz(i,j,k)+hz(i,j-1,k))
1075 adfac3=adfac2*0.5_r8*max(drde(i,j,k1),0.0_r8)
1076 adfac4=adfac2*0.5_r8*min(drde(i,j,k1),0.0_r8)
1077 ad_hz(i,j-1,k)=ad_hz(i,j-1,k)+adfac1
1078 ad_hz(i,j ,k)=ad_hz(i,j ,k)+adfac1
1079 ad_dtde(i,j,k1)=ad_dtde(i,j,k1)+adfac2
1080 ad_dtdr(i,j-1,k1)=ad_dtdr(i,j-1,k1)-adfac3
1081 ad_dtdr(i,j ,k2)=ad_dtdr(i,j ,k2)-adfac3
1082 ad_dtdr(i,j-1,k2)=ad_dtdr(i,j-1,k2)-adfac4
1083 ad_dtdr(i,j ,k1)=ad_dtdr(i,j ,k1)-adfac4
1084 ad_drde(i,j,k1)=ad_drde(i,j,k1)- &
1086 & ((0.5_r8+sign(0.5_r8, drde(i,j,k1)))* &
1087 & (dtdr(i,j-1,k1)+dtdr(i,j,k2))+ &
1088 & (0.5_r8+sign(0.5_r8,-drde(i,j,k1)))* &
1089 & (dtdr(i,j-1,k2)+dtdr(i,j,k1)))
1096# ifdef TS_U3ADV_SPLIT
1097 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
1099 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
1103 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
1132 adfac=cff*ad_fx(i,j)
1133 adfac1=adfac*(dtdx(i ,j,k1)- &
1134 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
1135 & (dtdr(i-1,j,k1)+ &
1137 & min(drdx(i,j,k1),0.0_r8)* &
1138 & (dtdr(i-1,j,k2)+ &
1140 adfac2=adfac*(hz(i,j,k)+hz(i-1,j,k))
1141 adfac3=adfac2*0.5_r8*max(drdx(i,j,k1),0.0_r8)
1142 adfac4=adfac2*0.5_r8*min(drdx(i,j,k1),0.0_r8)
1143 ad_hz(i-1,j,k)=ad_hz(i-1,j,k)+adfac1
1144 ad_hz(i ,j,k)=ad_hz(i ,j,k)+adfac1
1145 ad_dtdx(i ,j,k1)=ad_dtdx(i ,j,k1)+adfac2
1146 ad_dtdr(i-1,j,k1)=ad_dtdr(i-1,j,k1)-adfac3
1147 ad_dtdr(i ,j,k2)=ad_dtdr(i ,j,k2)-adfac3
1148 ad_dtdr(i-1,j,k2)=ad_dtdr(i-1,j,k2)-adfac4
1149 ad_dtdr(i ,j,k1)=ad_dtdr(i ,j,k1)-adfac4
1150 ad_drdx(i,j,k1)=ad_drdx(i,j,k1)- &
1152 & ((0.5_r8+sign(0.5_r8, drdx(i,j,k1)))* &
1153 & (dtdr(i-1,j,k1)+dtdr(i,j,k2))+ &
1154 & (0.5_r8+sign(0.5_r8,-drdx(i,j,k1)))* &
1155 & (dtdr(i-1,j,k2)+dtdr(i,j,k1)))
1160 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
1165 ad_fs(i,j,k2)=0.0_r8
1168 ad_dtdr(i,j,k2)=0.0_r8
1174#if defined TS_MIX_MAX_SLOPE
1175 cff1=sqrt(drdx(i,j,k2)**2+drdx(i+1,j,k2)**2+ &
1176 & drdx(i,j,k1)**2+drdx(i+1,j,k1)**2+ &
1177 & drde(i,j,k2)**2+drde(i,j+1,k2)**2+ &
1178 & drde(i,j,k1)**2+drde(i,j+1,k1)**2)
1179 cff2=0.25_r8*slope_max* &
1180 & (z_r(i,j,k+1)-z_r(i,j,k))*cff1
1181 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
1184#elif defined TS_MIX_MIN_STRAT
1185 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
1186 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
1189 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
1197 adfac=cff*ad_fs(i,j,k2)
1198 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac
1199 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac
1200 ad_cff=ad_cff+(z_r(i,j,k+1)- &
1201 & z_r(i,j,k ))*ad_fs(i,j,k2)
1202 ad_fs(i,j,k2)=0.0_r8
1208 adfac=cff*ad_dtdr(i,j,k2)
1209 ad_lapt(i,j,k )=ad_lapt(i,j,k )-adfac
1210 ad_lapt(i,j,k+1)=ad_lapt(i,j,k+1)+adfac
1211 ad_cff=ad_cff+(lapt(i,j,k+1)- &
1212 & lapt(i,j,k ))*ad_dtdr(i,j,k2)
1213 ad_dtdr(i,j,k2)=0.0_r8
1214#if defined TS_MIX_MAX_SLOPE
1217 ad_cff4=ad_cff4+cff*cff*ad_cff
1223 & (0.5_r8-sign(0.5_r8,cff2-cff3))*ad_cff4
1225 & (0.5_r8+sign(0.5_r8,cff2-cff3))*ad_cff4
1231 adfac=(0.5_r8+sign(0.5_r8,pden(i,j,k)-pden(i,j,k+1)- &
1233 ad_pden(i,j,k )=ad_pden(i,j,k )+adfac
1234 ad_pden(i,j,k+1)=ad_pden(i,j,k+1)-adfac
1240 adfac=0.25_r8*slope_max*ad_cff2
1242 ad_cff1=ad_cff1+(z_r(i,j,k+1)-z_r(i,j,k))*adfac
1243 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac1
1244 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac1
1246 IF (cff1.ne.0.0_r8)
THEN
1257 ad_drdx(i ,j,k1)=ad_drdx(i ,j,k1)+ &
1258 & drdx(i ,j,k1)*adfac
1259 ad_drdx(i+1,j,k1)=ad_drdx(i+1,j,k1)+ &
1260 & drdx(i+1,j,k1)*adfac
1261 ad_drdx(i ,j,k2)=ad_drdx(i ,j,k2)+ &
1262 & drdx(i ,j,k2)*adfac
1263 ad_drdx(i+1,j,k2)=ad_drdx(i+1,j,k2)+ &
1264 & drdx(i+1,j,k2)*adfac
1265 ad_drde(i,j ,k2)=ad_drde(i,j ,k2)+ &
1266 & drde(i,j ,k2)*adfac
1267 ad_drde(i,j+1,k2)=ad_drde(i,j+1,k2)+ &
1268 & drde(i,j+1,k2)*adfac
1269 ad_drde(i,j ,k1)=ad_drde(i,j ,k1)+ &
1270 & drde(i,j ,k1)*adfac
1271 ad_drde(i,j+1,k1)=ad_drde(i,j+1,k1)+ &
1272 & drde(i,j+1,k1)*adfac
1279#elif defined TS_MIX_MIN_STRAT
1282 ad_cff1=ad_cff1+cff*cff*ad_cff
1295 adfac1=(0.5_r8+sign(0.5_r8, &
1296 & pden(i,j,k)-pden(i,j,k+1)- &
1297 & strat_min*(z_r(i,j,k+1)- &
1300 adfac2=(0.5_r8-sign(0.5_r8, &
1301 & pden(i,j,k)-pden(i,j,k+1)- &
1302 & strat_min*(z_r(i,j,k+1)- &
1305 ad_pden(i,j,k )=ad_pden(i,j,k )+adfac1
1306 ad_pden(i,j,k+1)=ad_pden(i,j,k+1)-adfac1
1307 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac2
1308 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac2
1313 ad_cff1=ad_cff1+cff*cff*ad_cff
1319 adfac=(0.5_r8+sign(0.5_r8, &
1320 & pden(i,j,k)-pden(i,j,k+1)-eps))* &
1322 ad_pden(i,j,k )=ad_pden(i,j,k )+adfac
1323 ad_pden(i,j,k+1)=ad_pden(i,j,k+1)-adfac
1329 IF (k.lt.n(ng))
THEN
1332 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
1336#ifdef WET_DRY_NOT_YET
1337 cff=cff*vmask_wet(i,j)
1342 adfac=cff*ad_dtde(i,j,k2)
1343 ad_lapt(i,j-1,k+1)=ad_lapt(i,j-1,k+1)-adfac
1344 ad_lapt(i,j ,k+1)=ad_lapt(i,j ,k+1)+adfac
1345 ad_dtde(i,j,k2)=0.0_r8
1349 adfac=cff*ad_drde(i,j,k2)
1350 ad_pden(i,j-1,k+1)=ad_pden(i,j-1,k+1)-adfac
1351 ad_pden(i,j ,k+1)=ad_pden(i,j ,k+1)+adfac
1352 ad_drde(i,j,k2)=0.0_r8
1357 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
1361#ifdef WET_DRY_NOT_YET
1362 cff=cff*umask_wet(i,j)
1367 adfac=cff*ad_dtdx(i,j,k2)
1368 ad_lapt(i-1,j,k+1)=ad_lapt(i-1,j,k+1)-adfac
1369 ad_lapt(i ,j,k+1)=ad_lapt(i ,j,k+1)+adfac
1370 ad_dtdx(i,j,k2)=0.0_r8
1374 adfac=cff*ad_drdx(i,j,k2)
1375 ad_pden(i-1,j,k+1)=ad_pden(i-1,j,k+1)-adfac
1376 ad_pden(i ,j,k+1)=ad_pden(i ,j,k+1)+adfac
1377 ad_drdx(i,j,k2)=0.0_r8
1394 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1400 adfac=0.5_r8*ad_lapt(iend+1,jend+1,k)
1401 ad_lapt(iend+1,jend ,k)=ad_lapt(iend+1,jend ,k)+adfac
1402 ad_lapt(iend ,jend+1,k)=ad_lapt(iend ,jend+1,k)+adfac
1403 ad_lapt(iend+1,jend+1,k)=0.0_r8
1410 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1416 adfac=0.5_r8*ad_lapt(istr-1,jend+1,k)
1417 ad_lapt(istr-1,jend ,k)=ad_lapt(istr-1,jend ,k)+adfac
1418 ad_lapt(istr ,jend+1,k)=ad_lapt(istr ,jend+1,k)+adfac
1419 ad_lapt(istr-1,jend+1,k)=0.0_r8
1426 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1432 adfac=0.5_r8*ad_lapt(iend+1,jstr-1,k)
1433 ad_lapt(iend ,jstr-1,k)=ad_lapt(iend ,jstr-1,k)+adfac
1434 ad_lapt(iend+1,jstr ,k)=ad_lapt(iend+1,jstr ,k)+adfac
1435 ad_lapt(iend+1,jstr-1,k)=0.0_r8
1442 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1448 adfac=0.5_r8*ad_lapt(istr-1,jstr-1,k)
1449 ad_lapt(istr ,jstr-1,k)=ad_lapt(istr ,jstr-1,k)+adfac
1450 ad_lapt(istr-1,jstr ,k)=ad_lapt(istr-1,jstr ,k)+adfac
1451 ad_lapt(istr-1,jstr-1,k)=0.0_r8
1457 IF (
domain(ng)%Northern_Edge(tile))
THEN
1463 ad_lapt(i,jend+1,k)=0.0_r8
1471 ad_lapt(i,jend,k)=ad_lapt(i,jend,k)+ &
1472 & ad_lapt(i,jend+1,k)
1473 ad_lapt(i,jend+1,k)=0.0_r8
1481 IF (
domain(ng)%Southern_Edge(tile))
THEN
1487 ad_lapt(i,jstr-1,k)=0.0_r8
1495 ad_lapt(i,jstr,k)=ad_lapt(i,jstr,k)+ &
1496 & ad_lapt(i,jstr-1,k)
1497 ad_lapt(i,jstr-1,k)=0.0_r8
1505 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1511 ad_lapt(iend+1,j,k)=0.0_r8
1519 ad_lapt(iend,j,k)=ad_lapt(iend,j,k)+ &
1520 & ad_lapt(iend+1,j,k)
1521 ad_lapt(iend+1,j,k)=0.0_r8
1529 IF (
domain(ng)%Western_Edge(tile))
THEN
1535 ad_lapt(istr-1,j,k)=0.0_r8
1543 ad_lapt(istr,j,k)=ad_lapt(istr,j,k)+ &
1544 & ad_lapt(istr-1,j,k)
1545 ad_lapt(istr-1,j,k)=0.0_r8
1578 k_loop3:
DO k=n(ng),0,-1
1583 IF (kk.lt.n(ng))
THEN
1586 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
1590#ifdef WET_DRY_NOT_YET
1591 cff=cff*umask_wet(i,j)
1593 drdx(i,j,k2b)=cff*(pden(i ,j,kk+1)- &
1595#if defined TS_MIX_STABILITY
1596 dtdx(i,j,k2b)=cff*(0.75_r8*(t(i ,j,kk+1,nrhs,itrc)- &
1597 & t(i-1,j,kk+1,nrhs,itrc))+ &
1598 & 0.25_r8*(t(i ,j,kk+1,nstp,itrc)- &
1599 & t(i-1,j,kk+1,nstp,itrc)))
1600#elif defined TS_MIX_CLIMA
1602 dtdx(i,j,k2b)=cff*((t(i ,j,kk+1,nrhs,itrc)- &
1603 & tclm(i ,j,kk+1,itrc))- &
1604 & (t(i-1,j,kk+1,nrhs,itrc)- &
1605 & tclm(i-1,j,kk+1,itrc)))
1607 dtdx(i,j,k2b)=cff*(t(i ,j,kk+1,nrhs,itrc)- &
1608 & t(i-1,j,kk+1,nrhs,itrc))
1611 dtdx(i,j,k2b)=cff*(t(i ,j,kk+1,nrhs,itrc)- &
1612 & t(i-1,j,kk+1,nrhs,itrc))
1619 drdx(i,j,k1b)=0.0_r8
1620 dtdx(i,j,k1b)=0.0_r8
1626 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
1630#ifdef WET_DRY_NOT_YET
1631 cff=cff*vmask_wet(i,j)
1633 drde(i,j,k2b)=cff*(pden(i,j ,kk+1)- &
1635#if defined TS_MIX_STABILITY
1636 dtde(i,j,k2b)=cff*(0.75_r8*(t(i,j ,kk+1,nrhs,itrc)- &
1637 & t(i,j-1,kk+1,nrhs,itrc))+ &
1638 & 0.25_r8*(t(i,j ,kk+1,nstp,itrc)- &
1639 & t(i,j-1,kk+1,nstp,itrc)))
1640#elif defined TS_MIX_CLIMA
1642 dtde(i,j,k2b)=cff*((t(i,j ,kk+1,nrhs,itrc)- &
1643 & tclm(i,j ,kk+1,itrc))- &
1644 & (t(i,j-1,kk+1,nrhs,itrc)- &
1645 & tclm(i,j-1,kk+1,itrc)))
1647 dtde(i,j,k2b)=cff*(t(i,j ,kk+1,nrhs,itrc)- &
1648 & t(i,j-1,kk+1,nrhs,itrc))
1651 dtde(i,j,k2b)=cff*(t(i,j ,kk+1,nrhs,itrc)- &
1652 & t(i,j-1,kk+1,nrhs,itrc))
1659 drde(i,j,k1b)=0.0_r8
1660 dtde(i,j,k1b)=0.0_r8
1665 IF ((kk.eq.0).or.(kk.eq.n(ng)))
THEN
1668 dtdr(i,j,k2b)=0.0_r8
1675 dtdr(i,j,k1b)=0.0_r8
1683#if defined TS_MIX_MAX_SLOPE
1684 cff1=sqrt(drdx(i,j,k2b)**2+drdx(i+1,j,k2b)**2+ &
1685 & drdx(i,j,k1b)**2+drdx(i+1,j,k1b)**2+ &
1686 & drde(i,j,k2b)**2+drde(i,j+1,k2b)**2+ &
1687 & drde(i,j,k1b)**2+drde(i,j+1,k1b)**2)
1688 cff2=0.25_r8*slope_max* &
1689 & (z_r(i,j,kk+1)-z_r(i,j,kk))*cff1
1690 cff3=max(pden(i,j,kk)-pden(i,j,kk+1),small)
1693#elif defined TS_MIX_MIN_STRAT
1694 cff1=max(pden(i,j,kk)-pden(i,j,kk+1), &
1695 & strat_min*(z_r(i,j,kk+1)-z_r(i,j,kk)))
1698 cff1=max(pden(i,j,kk)-pden(i,j,kk+1),eps)
1701#if defined TS_MIX_STABILITY
1702 dtdr(i,j,k2b)=cff*(0.75_r8*(t(i,j,kk+1,nrhs,itrc)- &
1703 & t(i,j,kk ,nrhs,itrc))+ &
1704 & 0.25_r8*(t(i,j,kk+1,nstp,itrc)- &
1705 & t(i,j,kk ,nstp,itrc)))
1706#elif defined TS_MIX_CLIMA
1708 dtdr(i,j,k2b)=cff*((t(i,j,kk+1,nrhs,itrc)- &
1709 & tclm(i,j,kk+1,itrc))- &
1710 & (t(i,j,kk ,nrhs,itrc)- &
1711 & tclm(i,j,kk ,itrc)))
1713 dtdr(i,j,k2b)=cff*(t(i,j,kk+1,nrhs,itrc)- &
1714 & t(i,j,kk ,nrhs,itrc))
1717 dtdr(i,j,k2b)=cff*(t(i,j,kk+1,nrhs,itrc)- &
1718 & t(i,j,kk ,nrhs,itrc))
1720 fs(i,j,k2b)=cff*(z_r(i,j,kk+1)- &
1729# ifdef TS_U3ADV_SPLIT
1730 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
1732 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
1736 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
1740 & (hz(i,j,kk)+hz(i-1,j,kk))* &
1741 & (dtdx(i ,j,k1b)- &
1742 & 0.5_r8*(max(drdx(i,j,k1b),0.0_r8)* &
1743 & (dtdr(i-1,j,k1b)+ &
1744 & dtdr(i ,j,k2b))+ &
1745 & min(drdx(i,j,k1b),0.0_r8)* &
1746 & (dtdr(i-1,j,k2b)+ &
1753# ifdef TS_U3ADV_SPLIT
1754 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
1756 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
1760 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
1764 & (hz(i,j,kk)+hz(i,j-1,kk))* &
1766 & 0.5_r8*(max(drde(i,j,k1b),0.0_r8)* &
1767 & (dtdr(i,j-1,k1b)+ &
1768 & dtdr(i,j ,k2b))+ &
1769 & min(drde(i,j,k1b),0.0_r8)* &
1770 & (dtdr(i,j-1,k2b)+ &
1774 IF (kk.lt.n(ng))
THEN
1778# ifdef TS_U3ADV_SPLIT
1780 & (diff3d_u(i,j,kk )+diff3d_u(i+1,j,kk )+ &
1781 & diff3d_u(i,j,kk+1)+diff3d_u(i+1,j,kk+1))
1783 & (diff3d_v(i,j,kk )+diff3d_v(i,j+1,kk )+ &
1784 & diff3d_v(i,j,kk+1)+diff3d_v(i,j+1,kk+1))
1786 difx=0.5_r8*diff3d_r(i,j,kk)
1790 difx=0.5_r8*diff4(i,j,itrc)
1793 cff1=max(drdx(i ,j,k1b),0.0_r8)
1794 cff2=max(drdx(i+1,j,k2b),0.0_r8)
1795 cff3=min(drdx(i ,j,k2b),0.0_r8)
1796 cff4=min(drdx(i+1,j,k1b),0.0_r8)
1798 & (cff1*(cff1*dtdr(i,j,k2b)-dtdx(i ,j,k1b))+ &
1799 & cff2*(cff2*dtdr(i,j,k2b)-dtdx(i+1,j,k2b))+ &
1800 & cff3*(cff3*dtdr(i,j,k2b)-dtdx(i ,j,k2b))+ &
1801 & cff4*(cff4*dtdr(i,j,k2b)-dtdx(i+1,j,k1b)))
1802 cff1=max(drde(i,j ,k1b),0.0_r8)
1803 cff2=max(drde(i,j+1,k2b),0.0_r8)
1804 cff3=min(drde(i,j ,k2b),0.0_r8)
1805 cff4=min(drde(i,j+1,k1b),0.0_r8)
1808 & (cff1*(cff1*dtdr(i,j,k2b)-dtde(i,j ,k1b))+ &
1809 & cff2*(cff2*dtdr(i,j,k2b)-dtde(i,j+1,k2b))+ &
1810 & cff3*(cff3*dtdr(i,j,k2b)-dtde(i,j ,k2b))+ &
1811 & cff4*(cff4*dtdr(i,j,k2b)-dtde(i,j+1,k1b)))
1812 fs1(i,j,k2b)=fs(i,j,k2b)
1813 fs(i,j,k2b)=cff*fs(i,j,k2b)
1836 cff1=1.0_r8/hz(i,j,k)
1846 adfac=cff1*ad_lapt(i,j,k)
1848 ad_fs(i,j,k1)=ad_fs(i,j,k1)-adfac
1849 ad_fs(i,j,k2)=ad_fs(i,j,k2)+adfac
1850 ad_fe(i,j )=ad_fe(i,j )-adfac1
1851 ad_fe(i,j+1)=ad_fe(i,j+1)+adfac1
1852 ad_fx(i ,j)=ad_fx(i ,j)-adfac1
1853 ad_fx(i+1,j)=ad_fx(i+1,j)+adfac1
1854 ad_cff1=ad_cff1+(cff* &
1855 & (fx(i+1,j)-fx(i,j)+ &
1856 & fe(i,j+1)-fe(i,j))+ &
1857 & (fs(i,j,k2)-fs(i,j,k1)))* &
1859 ad_lapt(i,j,k)=0.0_r8
1862 ad_hz(i,j,k)=ad_hz(i,j,k)-cff1*cff1*ad_cff1
1866 IF (k.lt.n(ng))
THEN
1870# ifdef TS_U3ADV_SPLIT
1871 difx=0.125_r8*(diff3d_u(i,j,k )+diff3d_u(i+1,j,k )+ &
1872 & diff3d_u(i,j,k+1)+diff3d_u(i+1,j,k+1))
1873 dife=0.125_r8*(diff3d_v(i,j,k )+diff3d_v(i,j+1,k )+ &
1874 & diff3d_v(i,j,k+1)+diff3d_v(i,j+1,k+1))
1876 difx=0.5_r8*diff3d_r(i,j,k)
1880 difx=0.5_r8*diff4(i,j,itrc)
1883 cff1=max(drdx(i ,j,k1),0.0_r8)
1884 cff2=max(drdx(i+1,j,k2),0.0_r8)
1885 cff3=min(drdx(i ,j,k2),0.0_r8)
1886 cff4=min(drdx(i+1,j,k1),0.0_r8)
1888 & (cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
1889 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
1890 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
1891 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1)))
1892 cff1=max(drde(i,j ,k1),0.0_r8)
1893 cff2=max(drde(i,j+1,k2),0.0_r8)
1894 cff3=min(drde(i,j ,k2),0.0_r8)
1895 cff4=min(drde(i,j+1,k1),0.0_r8)
1898 & (cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
1899 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
1900 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
1901 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1)))
1906 ad_fs(i,j,k2)=cff*ad_fs(i,j,k2)
1907 ad_cff=ad_cff+fs1(i,j,k2)*ad_fs(i,j,k2)
1933 & (2.0_r8*cff1*dtdr(i,j,k2)-dtde(i,j ,k1))* &
1936 & (2.0_r8*cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))* &
1939 & (2.0_r8*cff3*dtdr(i,j,k2)-dtde(i,j ,k2))* &
1942 & (2.0_r8*cff4*dtdr(i,j,k2)-dtde(i,j+1,k1))* &
1944 ad_dtdr(i,j,k2)=ad_dtdr(i,j,k2)+ &
1949 ad_dtde(i,j ,k1)=ad_dtde(i,j ,k1)-cff1*adfac
1950 ad_dtde(i,j+1,k2)=ad_dtde(i,j+1,k2)-cff2*adfac
1951 ad_dtde(i,j ,k2)=ad_dtde(i,j ,k2)-cff3*adfac
1952 ad_dtde(i,j+1,k1)=ad_dtde(i,j+1,k1)-cff4*adfac
1956 ad_drde(i,j+1,k1)=ad_drde(i,j+1,k1)+ &
1957 & (0.5_r8+sign(0.5_r8, &
1958 & -drde(i,j+1,k1)))* &
1964 ad_drde(i,j ,k2)=ad_drde(i,j ,k2)+ &
1965 & (0.5_r8+sign(0.5_r8, &
1966 & -drde(i,j ,k2)))* &
1972 ad_drde(i,j+1,k2)=ad_drde(i,j+1,k2)+ &
1973 & (0.5_r8+sign(0.5_r8, &
1974 & drde(i,j+1,k2)))* &
1980 ad_drde(i ,j,k1)=ad_drde(i ,j,k1)+ &
1981 & (0.5_r8+sign(0.5_r8, &
1982 & drde(i ,j,k1)))* &
1985 cff1=max(drdx(i ,j,k1),0.0_r8)
1986 cff2=max(drdx(i+1,j,k2),0.0_r8)
1987 cff3=min(drdx(i ,j,k2),0.0_r8)
1988 cff4=min(drdx(i+1,j,k1),0.0_r8)
2013 & (2.0_r8*cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))* &
2016 & (2.0_r8*cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))* &
2019 & (2.0_r8*cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))* &
2022 & (2.0_r8*cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1))* &
2024 ad_dtdr(i,j,k2)=ad_dtdr(i,j,k2)+ &
2029 ad_dtdx(i ,j,k1)=ad_dtdx(i ,j,k1)-cff1*adfac
2030 ad_dtdx(i+1,j,k2)=ad_dtdx(i+1,j,k2)-cff2*adfac
2031 ad_dtdx(i ,j,k2)=ad_dtdx(i ,j,k2)-cff3*adfac
2032 ad_dtdx(i+1,j,k1)=ad_dtdx(i+1,j,k1)-cff4*adfac
2037 ad_drdx(i+1,j,k1)=ad_drdx(i+1,j,k1)+ &
2038 & (0.5_r8+sign(0.5_r8, &
2039 & -drdx(i+1,j,k1)))* &
2045 ad_drdx(i ,j,k2)=ad_drdx(i ,j,k2)+ &
2046 & (0.5_r8+sign(0.5_r8, &
2047 & -drdx(i ,j,k2)))* &
2053 ad_drdx(i+1,j,k2)=ad_drdx(i+1,j,k2)+ &
2054 & (0.5_r8+sign(0.5_r8, &
2055 & drdx(i+1,j,k2)))* &
2061 ad_drdx(i ,j,k1)=ad_drdx(i ,j,k1)+ &
2062 & (0.5_r8+sign(0.5_r8, &
2063 & drdx(i ,j,k1)))* &
2072# ifdef TS_U3ADV_SPLIT
2073 cff=0.5_r8*diff3d_v(i,j,k)*om_v(i,j)
2075 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
2079 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i,j-1,itrc))* &
2108 adfac=cff*ad_fe(i,j)
2109 adfac1=adfac*(dtde(i,j,k1)- &
2110 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
2111 & (dtdr(i,j-1,k1)+ &
2113 & min(drde(i,j,k1),0.0_r8)* &
2114 & (dtdr(i,j-1,k2)+ &
2116 adfac2=adfac*(hz(i,j,k)+hz(i,j-1,k))
2117 adfac3=adfac2*0.5_r8*max(drde(i,j,k1),0.0_r8)
2118 adfac4=adfac2*0.5_r8*min(drde(i,j,k1),0.0_r8)
2119 ad_hz(i,j-1,k)=ad_hz(i,j-1,k)+adfac1
2120 ad_hz(i,j ,k)=ad_hz(i,j ,k)+adfac1
2121 ad_dtde(i,j,k1)=ad_dtde(i,j,k1)+adfac2
2122 ad_dtdr(i,j-1,k1)=ad_dtdr(i,j-1,k1)-adfac3
2123 ad_dtdr(i,j, k2)=ad_dtdr(i,j ,k2)-adfac3
2124 ad_dtdr(i,j-1,k2)=ad_dtdr(i,j-1,k2)-adfac4
2125 ad_dtdr(i,j ,k1)=ad_dtdr(i,j ,k1)-adfac4
2126 ad_drde(i,j,k1)=ad_drde(i,j,k1)- &
2128 & ((0.5_r8+sign(0.5_r8, drde(i,j,k1)))* &
2129 & (dtdr(i,j-1,k1)+dtdr(i,j,k2))+ &
2130 & (0.5_r8+sign(0.5_r8,-drde(i,j,k1)))* &
2131 & (dtdr(i,j-1,k2)+dtdr(i,j,k1)))
2138# ifdef TS_U3ADV_SPLIT
2139 cff=0.5_r8*diff3d_u(i,j,k)*on_u(i,j)
2141 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
2145 cff=0.25_r8*(diff4(i,j,itrc)+diff4(i-1,j,itrc))* &
2174 adfac=cff*ad_fx(i,j)
2175 adfac1=adfac*(dtdx(i,j,k1)- &
2176 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
2177 & (dtdr(i-1,j,k1)+ &
2179 & min(drdx(i,j,k1),0.0_r8)* &
2180 & (dtdr(i-1,j,k2)+ &
2182 adfac2=adfac*(hz(i,j,k)+hz(i-1,j,k))
2183 adfac3=adfac2*0.5_r8*max(drdx(i,j,k1),0.0_r8)
2184 adfac4=adfac2*0.5_r8*min(drdx(i,j,k1),0.0_r8)
2185 ad_hz(i-1,j,k)=ad_hz(i-1,j,k)+adfac1
2186 ad_hz(i ,j,k)=ad_hz(i ,j,k)+adfac1
2187 ad_dtdx(i,j,k1)=ad_dtdx(i,j,k1)+adfac2
2188 ad_dtdr(i-1,j,k1)=ad_dtdr(i-1,j,k1)-adfac3
2189 ad_dtdr(i ,j,k2)=ad_dtdr(i ,j,k2)-adfac3
2190 ad_dtdr(i-1,j,k2)=ad_dtdr(i-1,j,k2)-adfac4
2191 ad_dtdr(i ,j,k1)=ad_dtdr(i ,j,k1)-adfac4
2192 ad_drdx(i,j,k1)=ad_drdx(i,j,k1)- &
2194 & ((0.5_r8+sign(0.5_r8, drdx(i,j,k1)))* &
2195 & (dtdr(i-1,j,k1)+dtdr(i,j,k2))+ &
2196 & (0.5_r8+sign(0.5_r8,-drdx(i,j,k1)))* &
2197 & (dtdr(i-1,j,k2)+dtdr(i,j,k1)))
2202 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
2207 ad_dtdr(i,j,k2)=0.0_r8
2210 ad_fs(i,j,k2)=0.0_r8
2216#if defined TS_MIX_MAX_SLOPE
2217 cff1=sqrt(drdx(i,j,k2)**2+drdx(i+1,j,k2)**2+ &
2218 & drdx(i,j,k1)**2+drdx(i+1,j,k1)**2+ &
2219 & drde(i,j,k2)**2+drde(i,j+1,k2)**2+ &
2220 & drde(i,j,k1)**2+drde(i,j+1,k1)**2)
2221 cff2=0.25_r8*slope_max* &
2222 & (z_r(i,j,k+1)-z_r(i,j,k))*cff1
2223 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
2226#elif defined TS_MIX_MIN_STRAT
2227 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
2228 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
2231 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
2239 adfac=cff*ad_fs(i,j,k2)
2240 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac
2241 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac
2242 ad_cff=ad_cff+(z_r(i,j,k+1)- &
2243 & z_r(i,j,k ))*ad_fs(i,j,k2)
2244 ad_fs(i,j,k2)=0.0_r8
2245#if defined TS_MIX_STABILITY
2257 adfac=cff*ad_dtdr(i,j,k2)
2258 adfac1=adfac*0.75_r8
2259 adfac2=adfac*0.25_r8
2260 ad_t(i,j,k ,nrhs,itrc)=ad_t(i,j,k ,nrhs,itrc)-adfac1
2261 ad_t(i,j,k+1,nrhs,itrc)=ad_t(i,j,k+1,nrhs,itrc)+adfac1
2262 ad_t(i,j,k ,nstp,itrc)=ad_t(i,j,k ,nstp,itrc)-adfac2
2263 ad_t(i,j,k+1,nstp,itrc)=ad_t(i,j,k+1,nstp,itrc)+adfac2
2264 ad_cff=ad_cff+(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
2265 & t(i,j,k ,nrhs,itrc))+ &
2266 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
2267 & t(i,j,k ,nstp,itrc)))* &
2269 ad_dtdz(i,j,k2)=0.0_r8
2270#elif defined TS_MIX_CLIMA
2279 adfac=cff*ad_dtdr(i,j,k2)
2280 ad_t(i,j,k ,nrhs,itrc)=ad_t(i,j,k ,nrhs,itrc)-adfac
2281 ad_t(i,j,k+1,nrhs,itrc)=ad_t(i,j,k+1,nrhs,itrc)+adfac
2282 ad_cff=ad_cff+((t(i,j,k+1,nrhs,itrc)- &
2283 & tclm(i,j,k+1,itrc))- &
2284 & (t(i,j,k ,nrhs,itrc)- &
2285 & tclm(i,j,k ,itrc)))*ad_dtdr(i,j,k2)
2286 ad_dtdr(i,j,k2)=0.0_r8
2300 adfac=cff*ad_dtdr(i,j,k2)
2301 ad_t(i,j,k ,nrhs,itrc)=ad_t(i,j,k ,nrhs,itrc)-adfac
2302 ad_t(i,j,k+1,nrhs,itrc)=ad_t(i,j,k+1,nrhs,itrc)+adfac
2303 ad_cff=ad_cff+(t(i,j,k+1,nrhs,itrc)- &
2304 & t(i,j,k ,nrhs,itrc))*ad_dtdr(i,j,k2)
2305 ad_dtdr(i,j,k2)=0.0_r8
2307#if defined TS_MIX_MAX_SLOPE
2310 ad_cff4=ad_cff4+cff*cff*ad_cff
2316 & (0.5_r8-sign(0.5_r8,cff2-cff3))*ad_cff4
2318 & (0.5_r8+sign(0.5_r8,cff2-cff3))*ad_cff4
2324 adfac=(0.5_r8+sign(0.5_r8,pden(i,j,k)-pden(i,j,k+1)- &
2326 ad_pden(i,j,k )=ad_pden(i,j,k )+adfac
2327 ad_pden(i,j,k+1)=ad_pden(i,j,k+1)-adfac
2333 adfac=0.25_r8*slope_max*ad_cff2
2335 ad_cff1=ad_cff1+(z_r(i,j,k+1)-z_r(i,j,k))*adfac
2336 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac1
2337 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac1
2339 IF (cff1.ne.0.0_r8)
THEN
2350 ad_drdx(i ,j,k1)=ad_drdx(i ,j,k1)+ &
2351 & drdx(i ,j,k1)*adfac
2352 ad_drdx(i+1,j,k1)=ad_drdx(i+1,j,k1)+ &
2353 & drdx(i+1,j,k1)*adfac
2354 ad_drdx(i ,j,k2)=ad_drdx(i ,j,k2)+ &
2355 & drdx(i ,j,k2)*adfac
2356 ad_drdx(i+1,j,k2)=ad_drdx(i+1,j,k2)+ &
2357 & drdx(i+1,j,k2)*adfac
2358 ad_drde(i,j ,k2)=ad_drde(i,j ,k2)+ &
2359 & drde(i,j ,k2)*adfac
2360 ad_drde(i,j+1,k2)=ad_drde(i,j+1,k2)+ &
2361 & drde(i,j+1,k2)*adfac
2362 ad_drde(i,j ,k1)=ad_drde(i,j ,k1)+ &
2363 & drde(i,j ,k1)*adfac
2364 ad_drde(i,j+1,k1)=ad_drde(i,j+1,k1)+ &
2365 & drde(i,j+1,k1)*adfac
2372#elif defined TS_MIX_MIN_STRAT
2375 ad_cff1=ad_cff1+cff*cff*ad_cff
2388 adfac1=(0.5_r8+sign(0.5_r8, &
2389 & pden(i,j,k)-pden(i,j,k+1)- &
2390 & strat_min*(z_r(i,j,k+1)- &
2393 adfac2=(0.5_r8-sign(0.5_r8, &
2394 & pden(i,j,k)-pden(i,j,k+1)- &
2395 & strat_min*(z_r(i,j,k+1)- &
2398 ad_pden(i,j,k )=ad_pden(i,j,k )+adfac1
2399 ad_pden(i,j,k+1)=ad_pden(i,j,k+1)-adfac1
2400 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac2
2401 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac2
2406 ad_cff1=ad_cff1+cff*cff*ad_cff
2412 adfac=(0.5_r8+sign(0.5_r8, &
2413 & pden(i,j,k)-pden(i,j,k+1)-eps))* &
2415 ad_pden(i,j,k )=ad_pden(i,j,k )+adfac
2416 ad_pden(i,j,k+1)=ad_pden(i,j,k+1)-adfac
2422 IF (k.lt.n(ng))
THEN
2425 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
2429#ifdef WET_DRY_NOT_YET
2430 cff=cff*vmask_wet(i,j)
2432#if defined TS_MIX_STABILITY
2439 adfac=cff*ad_dtde(i,j,k2)
2440 adfac1=adfac*0.75_r8
2441 adfac2=adfac*0.25_r8
2442 ad_t(i,j-1,k+1,nrhs,itrc)=ad_t(i,j-1,k+1,nrhs,itrc)- &
2444 ad_t(i,j ,k+1,nrhs,itrc)=ad_t(i,j ,k+1,nrhs,itrc)+ &
2446 ad_t(i,j-1,k+1,nstp,itrc)=ad_t(i,j-1,k+1,nstp,itrc)- &
2448 ad_t(i,j ,k+1,nstp,itrc)=ad_t(i,j ,k+1,nstp,itrc)+ &
2450 ad_dtde(i,j,k2)=0.0_r8
2451#elif defined TS_MIX_CLIMA
2455 adfac=cff*ad_dtde(i,j,k2)
2456 ad_t(i,j-1,k+1,nrhs,itrc)=ad_t(i,j-1,k+1,nrhs,itrc)- &
2458 ad_t(i,j ,k+1,nrhs,itrc)=ad_t(i,j ,k+1,nrhs,itrc)+ &
2460 ad_dtde(i,j,k2)=0.0_r8
2465 adfac=cff*ad_dtde(i,j,k2)
2466 ad_t(i,j-1,k+1,nrhs,itrc)=ad_t(i,j-1,k+1,nrhs,itrc)- &
2468 ad_t(i,j ,k+1,nrhs,itrc)=ad_t(i,j ,k+1,nrhs,itrc)+ &
2470 ad_dtde(i,j,k2)=0.0_r8
2475 adfac=cff*ad_drde(i,j,k2)
2476 ad_pden(i,j-1,k+1)=ad_pden(i,j-1,k+1)-adfac
2477 ad_pden(i,j ,k+1)=ad_pden(i,j ,k+1)+adfac
2478 ad_drde(i,j,k2)=0.0_r8
2483 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
2487#ifdef WET_DRY_NOT_YET
2488 cff=cff*umask_wet(i,j)
2490#if defined TS_MIX_STABILITY
2497 adfac=cff*ad_dtdx(i,j,k2)
2498 adfac1=adfac*0.75_r8
2499 adfac2=adfac*0.25_r8
2500 ad_t(i-1,j,k+1,nrhs,itrc)=ad_t(i-1,j,k+1,nrhs,itrc)- &
2502 ad_t(i ,j,k+1,nrhs,itrc)=ad_t(i ,j,k+1,nrhs,itrc)+ &
2504 ad_t(i-1,j,k+1,nstp,itrc)=ad_t(i-1,j,k+1,nstp,itrc)- &
2506 ad_t(i ,j,k+1,nstp,itrc)=ad_t(i ,j,k+1,nstp,itrc)+ &
2508 ad_dtdx(i,j,k2)=0.0_r8
2509#elif defined TS_MIX_CLIMA
2513 adfac=cff*ad_dtdx(i,j,k2)
2514 ad_t(i-1,j,k+1,nrhs,itrc)=ad_t(i-1,j,k+1,nrhs,itrc)- &
2516 ad_t(i ,j,k+1,nrhs,itrc)=ad_t(i ,j,k+1,nrhs,itrc)+ &
2518 ad_dtdx(i,j,k2)=0.0_r8
2523 adfac=cff*ad_dtdx(i,j,k2)
2524 ad_t(i-1,j,k+1,nrhs,itrc)=ad_t(i-1,j,k+1,nrhs,itrc)- &
2526 ad_t(i ,j,k+1,nrhs,itrc)=ad_t(i ,j,k+1,nrhs,itrc)+ &
2528 ad_dtdx(i,j,k2)=0.0_r8
2533 adfac=cff*ad_drdx(i,j,k2)
2534 ad_pden(i-1,j,k+1)=ad_pden(i-1,j,k+1)-adfac
2535 ad_pden(i ,j,k+1)=ad_pden(i ,j,k+1)+adfac
2536 ad_drdx(i,j,k2)=0.0_r8