71 & LBi, UBi, LBj, UBj, LBk, UBk, &
72 & IminS, ImaxS, JminS, JmaxS, &
73 & Nghost, NHsteps, NVsteps, &
76 & pm, pn, pmon_u, pnom_v, &
78 & rmask, umask, vmask, &
94 integer,
intent(in) :: ng, tile, model, boundary
95 integer,
intent(in) :: edge(4)
96 integer,
intent(in) :: LBij, UBij
97 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
98 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
99 integer,
intent(in) :: Nghost, NHsteps, NVsteps
101 real(r8),
intent(in) :: DTsizeH, DTsizeV
104 real(r8),
intent(in) :: pm(LBi:,LBj:)
105 real(r8),
intent(in) :: pn(LBi:,LBj:)
106 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
107 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
109 real(r8),
intent(in) :: rmask(LBi:,LBj:)
110 real(r8),
intent(in) :: umask(LBi:,LBj:)
111 real(r8),
intent(in) :: vmask(LBi:,LBj:)
113 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
114 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
116 real(r8),
intent(in) :: Kh(LBi:,LBj:)
117 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
118 real(r8),
intent(inout) :: tl_A(LBij:,LBk:)
120 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
121 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
122 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
123 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
125 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
126 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
127 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
129 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
130 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
132 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
133 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
134 real(r8),
intent(inout) :: tl_A(LBij:UBij,LBk:UBk)
139 logical,
dimension(4) :: Lconvolve
141 integer :: Nnew, Nold, Nsav, i, j, k, step
143 real(r8) :: cff, cff1
145 real(r8),
dimension(LBij:UBij,LBk:UBk,2) :: tl_Awrk
147 real(r8),
dimension(JminS:JmaxS,LBk:UBk) :: tl_FE
148 real(r8),
dimension(IminS:ImaxS,LBk:UBk) :: tl_FX
149 real(r8),
dimension(LBij:UBij) :: Hfac
151# ifndef SPLINES_VCONV
152 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
154# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
155 real(r8),
dimension(LBij:UBij,N(ng)) :: oHz
157# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
158 real(r8),
dimension(LBij:UBij,0:N(ng)) :: BC
159 real(r8),
dimension(LBij:UBij,0:N(ng)) :: CF
161 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
163 real(r8),
dimension(LBij:UBij,0:N(ng)) :: tl_DC
165 real(r8),
dimension(LBij:UBij,0:N(ng)) :: tl_FS
169# include "set_bounds.h"
185 IF (lconvolve(boundary))
THEN
186 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
189 hfac(j)=dtsizeh*pm(i,j)*pn(i,j)
191# ifndef SPLINES_VCONV
194# ifdef IMPLICIT_VCONV
195 fc(j,k)=-dtsizev*kv(i,j,k)/ &
196 & (z_r(i,j,k+1)-z_r(i,j,k))
198 fc(j,k)=dtsizev*kv(i,j,k)/ &
199 & (z_r(i,j,k+1)-z_r(i,j,k))
204# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
206 ohz(j,k)=1.0_r8/hz(i,j,k)
211 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
214 hfac(i)=dtsizeh*pm(i,j)*pn(i,j)
216# ifndef SPLINES_VCONV
219# ifdef IMPLICIT_VCONV
220 fc(i,k)=-dtsizev*kv(i,j,k)/ &
221 & (z_r(i,j,k+1)-z_r(i,j,k))
223 fc(i,k)=dtsizev*kv(i,j,k)/ &
224 & (z_r(i,j,k+1)-z_r(i,j,k))
229# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
231 ohz(i,k)=1.0_r8/hz(i,j,k)
249 & lbij, ubij, 1, n(ng), &
259 & lbij, ubij, 1, n(ng), &
264 IF (lconvolve(boundary))
THEN
265 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
270 tl_awrk(j,k,nold)=tl_a(j,k)
273 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
278 tl_awrk(i,k,nold)=tl_a(i,k)
292 IF (lconvolve(boundary))
THEN
293 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
301 tl_fe(j,k)=pnom_v(i,j)*0.5_r8*(kh(i,j-1)+kh(i,j))* &
302 & (tl_awrk(j ,k,nold)- &
303 & tl_awrk(j-1,k,nold))
307 tl_fe(j,k)=tl_fe(j,k)*vmask(i,j)
311 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
319 tl_fx(i,k)=pmon_u(i,j)*0.5_r8*(kh(i-1,j)+kh(i,j))* &
320 & (tl_awrk(i ,k,nold)- &
321 & tl_awrk(i-1,k,nold))
325 tl_fx(i,k)=tl_fx(i,k)*umask(i,j)
334 IF (lconvolve(boundary))
THEN
335 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
342 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
344 & (tl_fe(j+1,k)-tl_fe(j,k))
347 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
354 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
356 & (tl_fx(i+1,k)-tl_fx(i,k))
369 & lbij, ubij, 1, n(ng), &
379 & lbij, ubij, 1, n(ng), &
393# ifdef IMPLICIT_VCONV
407 IF (lconvolve(boundary))
THEN
408 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
413 fc(j,k)=cff1*hz(i,j,k )- &
414 & dtsizev*kv(i,j,k-1)*ohz(j,k )
415 cf(j,k)=cff1*hz(i,j,k+1)- &
416 & dtsizev*kv(i,j,k+1)*ohz(j,k+1)
423 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
428 fc(i,k)=cff1*hz(i,j,k )- &
429 & dtsizev*kv(i,j,k-1)*ohz(i,k )
430 cf(i,k)=cff1*hz(i,j,k+1)- &
431 & dtsizev*kv(i,j,k+1)*ohz(i,k+1)
442 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
447 bc(j,k)=cff1*(hz(i,j,k)+hz(i,j,k+1))+ &
448 & dtsizev*kv(i,j,k)* &
449 & (ohz(j,k)+ohz(j,k+1))
450 cff=1.0_r8/(bc(j,k)-fc(j,k)*cf(j,k-1))
456 tl_dc(j,k)=cff*(tl_awrk(j,k+1,nold)- &
457 & tl_awrk(j,k ,nold)- &
458 & fc(j,k)*tl_dc(j,k-1))
461 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
466 bc(i,k)=cff1*(hz(i,j,k)+hz(i,j,k+1))+ &
467 & dtsizev*kv(i,j,k)* &
468 & (ohz(i,k)+ohz(i,k+1))
469 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
475 tl_dc(i,k)=cff*(tl_awrk(i,k+1,nold)- &
476 & tl_awrk(i,k ,nold)- &
477 & fc(i,k)*tl_dc(i,k-1))
484 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
489 tl_dc(j,n(ng))=0.0_r8
495 tl_dc(j,k)=tl_dc(j,k)-cf(j,k)*tl_dc(j,k+1)
502 tl_dc(j,k)=tl_dc(j,k)*kv(i,j,k)
507 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
508 & dtsizev*ohz(j,k)* &
509 & (tl_dc(j,k)-tl_dc(j,k-1))
512 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
517 tl_dc(i,n(ng))=0.0_r8
523 tl_dc(i,k)=tl_dc(i,k)-cf(i,k)*tl_dc(i,k+1)
530 tl_dc(i,k)=tl_dc(i,k)*kv(i,j,k)
535 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
536 & dtsizev*ohz(i,k)* &
537 & (tl_dc(i,k)-tl_dc(i,k-1))
561 IF (lconvolve(boundary))
THEN
562 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
566 bc(j,k)=hz(i,j,k)-fc(j,k)-fc(j,k-1)
569 tl_dc(j,k)=tl_awrk(j,k,nold)*hz(i,j,k)
572 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
576 bc(i,k)=hz(i,j,k)-fc(i,k)-fc(i,k-1)
579 tl_dc(i,k)=tl_awrk(i,k,nold)*hz(i,j,k)
586 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
592 tl_dc(j,1)=cff*tl_dc(j,1)
596 cff=1.0_r8/(bc(j,k)-fc(j,k-1)*cf(j,k-1))
600 tl_dc(j,k)=cff*(tl_dc(j,k)-fc(j,k-1)*tl_dc(j,k-1))
603 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
609 tl_dc(i,1)=cff*tl_dc(i,1)
613 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
617 tl_dc(i,k)=cff*(tl_dc(i,k)-fc(i,k-1)*tl_dc(i,k-1))
624 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
632 tl_dc(j,n(ng))=(tl_dc(j,n(ng))- &
633 & fc(j,n(ng)-1)*tl_dc(j,n(ng)-1))/ &
635 & fc(j,n(ng)-1)*cf(j,n(ng)-1))
638 tl_awrk(j,n(ng),nnew)=tl_dc(j,n(ng))
642 tl_awrk(j,n(ng),nnew)=tl_awrk(j,n(ng),nnew)*rmask(i,j)
649 tl_dc(j,k)=tl_dc(j,k)-cf(j,k)*tl_dc(j,k+1)
652 tl_awrk(j,k,nnew)=tl_dc(j,k)
656 tl_awrk(j,k,nnew)=tl_awrk(j,k,nnew)*rmask(i,j)
660 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
668 tl_dc(i,n(ng))=(tl_dc(i,n(ng))- &
669 & fc(i,n(ng)-1)*tl_dc(i,n(ng)-1))/ &
671 & fc(i,n(ng)-1)*cf(i,n(ng)-1))
674 tl_awrk(i,n(ng),nnew)=tl_dc(i,n(ng))
678 tl_awrk(i,n(ng),nnew)=tl_awrk(i,n(ng),nnew)*rmask(i,j)
685 tl_dc(i,k)=tl_dc(i,k)-cf(i,k)*tl_dc(i,k+1)
688 tl_awrk(i,k,nnew)=tl_dc(i,k)
692 tl_awrk(i,k,nnew)=tl_awrk(i,k,nnew)*rmask(i,j)
718 IF (lconvolve(boundary))
THEN
719 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
726 tl_fs(j,k)=fc(j,k)*(tl_awrk(j,k+1,nold)- &
727 & tl_awrk(j,k ,nold))
731 tl_fs(j,k)=tl_fs(j,k)*rmask(i,j)
739 tl_fs(j,n(ng))=0.0_r8
741 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
748 tl_fs(i,k)=fc(i,k)*(tl_awrk(i,k+1,nold)- &
749 & tl_awrk(i,k ,nold))
753 tl_fs(i,k)=tl_fs(i,k)*rmask(i,j)
761 tl_fs(i,n(ng))=0.0_r8
768 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
775 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
776 & ohz(j,k)*(tl_fs(j,k )- &
780 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
787 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
788 & ohz(i,k)*(tl_fs(i,k )- &
808 IF (lconvolve(boundary))
THEN
809 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
814 tl_a(j,k)=tl_awrk(j,k,nold)
817 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
822 tl_a(i,k)=tl_awrk(i,k,nold)
832 & lbij, ubij, 1, n(ng), &
842 & lbij, ubij, 1, n(ng), &
854 & edge, LBij, UBij, &
855 & LBi, UBi, LBj, UBj, LBk, UBk, &
856 & IminS, ImaxS, JminS, JmaxS, &
857 & Nghost, NHsteps, NVsteps, &
858 & DTsizeH, DTsizeV, &
860 & pm, pn, pmon_r, pnom_p, &
878 integer,
intent(in) :: ng, tile, model, boundary
879 integer,
intent(in) :: edge(4)
880 integer,
intent(in) :: LBij, UBij
881 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
882 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
883 integer,
intent(in) :: Nghost, NHsteps, NVsteps
885 real(r8),
intent(in) :: DTsizeH, DTsizeV
888 real(r8),
intent(in) :: pm(LBi:,LBj:)
889 real(r8),
intent(in) :: pn(LBi:,LBj:)
890 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
891 real(r8),
intent(in) :: pnom_p(LBi:,LBj:)
893 real(r8),
intent(in) :: umask(LBi:,LBj:)
894 real(r8),
intent(in) :: pmask(LBi:,LBj:)
896 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
897 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
899 real(r8),
intent(in) :: Kh(LBi:,LBj:)
900 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
901 real(r8),
intent(inout) :: tl_A(LBij:,LBk:)
903 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
904 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
905 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
906 real(r8),
intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
908 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
909 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
911 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
912 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
914 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
915 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
916 real(r8),
intent(inout) :: tl_A(LBij:UBij,LBk:UBk)
921 logical,
dimension(4) :: Lconvolve
923 integer :: Nnew, Nold, Nsav, i, j, k, step
925 real(r8) :: cff, cff1
927 real(r8),
dimension(LBij:UBij,LBk:UBk,2) :: tl_Awrk
929 real(r8),
dimension(JminS:JmaxS,LBk:UBk) :: tl_FE
930 real(r8),
dimension(IminS:ImaxS,LBk:UBk) :: tl_FX
931 real(r8),
dimension(LBij:UBij) :: Hfac
933# ifndef SPLINES_VCONV
934 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
936# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
937 real(r8),
dimension(LBij:UBij,N(ng)) :: oHz
939# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
940 real(r8),
dimension(LBij:UBij,0:N(ng)) :: BC
941 real(r8),
dimension(LBij:UBij,0:N(ng)) :: CF
943 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
945 real(r8),
dimension(LBij:UBij,0:N(ng)) :: tl_DC
947 real(r8),
dimension(LBij:UBij,0:N(ng)) :: tl_FS
951# include "set_bounds.h"
967 IF (lconvolve(boundary))
THEN
969 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
972 hfac(j)=cff*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
974# ifndef SPLINES_VCONV
977# ifdef IMPLICIT_VCONV
978 fc(j,k)=-dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
979 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
980 & z_r(i-1,j,k )-z_r(i,j,k ))
982 fc(j,k)=dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
983 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
984 & z_r(i-1,j,k )-z_r(i,j,k ))
989# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
991 ohz(j,k)=2.0_r8/(hz(i-1,j,k)+hz(i,j,k))
996 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
999 hfac(i)=cff*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
1001# ifndef SPLINES_VCONV
1004# ifdef IMPLICIT_VCONV
1005 fc(i,k)=-dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
1006 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
1007 & z_r(i-1,j,k )-z_r(i,j,k ))
1009 fc(i,k)=dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
1010 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
1011 & z_r(i-1,j,k )-z_r(i,j,k ))
1016# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1018 ohz(i,k)=2.0_r8/(hz(i-1,j,k)+hz(i,j,k))
1036 & lbij, ubij, 1, n(ng), &
1046 & lbij, ubij, 1, n(ng), &
1051 IF (lconvolve(boundary))
THEN
1052 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1057 tl_awrk(j,k,nold)=tl_a(j,k)
1060 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1065 tl_awrk(i,k,nold)=tl_a(i,k)
1079 IF (lconvolve(boundary))
THEN
1080 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1090 tl_fe(j,k)=pnom_p(i,j)* &
1091 & 0.25_r8*(kh(i-1,j )+kh(i,j )+ &
1092 & kh(i-1,j-1)+kh(i,j-1))* &
1093 & (tl_awrk(j ,k,nold)- &
1094 & tl_awrk(j-1,k,nold))
1098 tl_fe(j,k)=tl_fe(j,k)*pmask(i,j)
1102 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1110 tl_fx(i,k)=pmon_r(i,j)*kh(i,j)* &
1111 & (tl_awrk(i+1,k,nold)- &
1112 & tl_awrk(i ,k,nold))
1119 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1126 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
1128 & (tl_fe(j+1,k)-tl_fe(j,k))
1131 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1138 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
1140 & (tl_fx(i,k)-tl_fx(i-1,k))
1153 & lbij, ubij, 1, n(ng), &
1154 & tl_awrk(:,:,nnew))
1163 & lbij, ubij, 1, n(ng), &
1166 & tl_awrk(:,:,nnew))
1177# ifdef IMPLICIT_VCONV
1178# ifdef SPLINES_VCONV
1191 IF (lconvolve(boundary))
THEN
1192 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1194 cff1=0.5_r8*(1.0_r8/6.0_r8)
1197 fc(j,k)=cff1*(hz(i-1,j,k )+hz(i,j,k ))- &
1198 & dtsizev*kv(i,j,k-1)*ohz(j,k )
1199 cf(j,k)=cff1*(hz(i-1,j,k+1)+hz(i,j,k+1))- &
1200 & dtsizev*kv(i,j,k+1)*ohz(j,k+1)
1207 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1209 cff1=0.5_r8*(1.0_r8/6.0_r8)
1212 fc(i,k)=cff1*(hz(i-1,j,k )+hz(i,j,k ))- &
1213 & dtsizev*kv(i,j,k-1)*ohz(i,k )
1214 cf(i,k)=cff1*(hz(i-1,j,k+1)+hz(i,j,k+1))- &
1215 & dtsizev*kv(i,j,k+1)*ohz(i,k+1)
1226 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1228 cff1=0.5_r8*(1.0_r8/3.0_r8)
1231 bc(j,k)=cff1*(hz(i-1,j,k )+hz(i,j,k )+ &
1232 & hz(i-1,j,k+1)+hz(i,j,k+1))+ &
1233 & dtsizev*kv(i,j,k)* &
1234 & (ohz(j,k)+ohz(j,k+1))
1235 cff=1.0_r8/(bc(j,k)-fc(j,k)*cf(j,k-1))
1241 tl_dc(j,k)=cff*(tl_awrk(j,k+1,nold)- &
1242 & tl_awrk(j,k ,nold)- &
1243 & fc(j,k)*tl_dc(j,k-1))
1246 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1248 cff1=0.5_r8*(1.0_r8/3.0_r8)
1251 bc(i,k)=cff1*(hz(i-1,j,k )+hz(i,j,k )+ &
1252 & hz(i-1,j,k+1)+hz(i,j,k+1))+ &
1253 & dtsizev*kv(i,j,k)* &
1254 & (ohz(i,k)+ohz(i,k+1))
1255 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1261 tl_dc(i,k)=cff*(tl_awrk(i,k+1,nold)- &
1262 & tl_awrk(i,k ,nold)- &
1263 & fc(i,k)*tl_dc(i,k-1))
1270 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1275 tl_dc(j,n(ng))=0.0_r8
1281 tl_dc(j,k)=tl_dc(j,k)-cf(j,k)*tl_dc(j,k+1)
1288 tl_dc(j,k)=tl_dc(j,k)*kv(i,j,k)
1293 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
1294 & dtsizev*ohz(j,k)* &
1295 & (tl_dc(j,k)-tl_dc(j,k-1))
1298 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1303 tl_dc(i,n(ng))=0.0_r8
1309 tl_dc(i,k)=tl_dc(i,k)-cf(i,k)*tl_dc(i,k+1)
1316 tl_dc(i,k)=tl_dc(i,k)*kv(i,j,k)
1321 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
1322 & dtsizev*ohz(i,k)* &
1323 & (tl_dc(i,k)-tl_dc(i,k-1))
1347 IF (lconvolve(boundary))
THEN
1348 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1352 cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))
1353 bc(j,k)=cff-fc(j,k)-fc(j,k-1)
1356 tl_dc(j,k)=tl_awrk(j,k,nold)*cff
1359 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1363 cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))
1364 bc(i,k)=cff-fc(i,k)-fc(i,k-1)
1367 tl_dc(i,k)=tl_awrk(i,k,nold)*cff
1374 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1380 tl_dc(j,1)=cff*tl_dc(j,1)
1384 cff=1.0_r8/(bc(j,k)-fc(j,k-1)*cf(j,k-1))
1388 tl_dc(j,k)=cff*(tl_dc(j,k)-fc(j,k-1)*tl_dc(j,k-1))
1391 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1397 tl_dc(i,1)=cff*tl_dc(i,1)
1401 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
1405 tl_dc(i,k)=cff*(tl_dc(i,k)-fc(i,k-1)*tl_dc(i,k-1))
1412 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1420 tl_dc(j,n(ng))=(tl_dc(j,n(ng))- &
1421 & fc(j,n(ng)-1)*tl_dc(j,n(ng)-1))/ &
1423 & fc(j,n(ng)-1)*cf(j,n(ng)-1))
1426 tl_awrk(j,n(ng),nnew)=tl_dc(j,n(ng))
1430 tl_awrk(j,n(ng),nnew)=tl_awrk(j,n(ng),nnew)*umask(i,j)
1437 tl_dc(j,k)=tl_dc(j,k)-cf(j,k)*tl_dc(j,k+1)
1440 tl_awrk(j,k,nnew)=tl_dc(j,k)
1444 tl_awrk(j,k,nnew)=tl_awrk(j,k,nnew)*umask(i,j)
1448 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1456 tl_dc(i,n(ng))=(tl_dc(i,n(ng))- &
1457 & fc(i,n(ng)-1)*tl_dc(i,n(ng)-1))/ &
1459 & fc(i,n(ng)-1)*cf(i,n(ng)-1))
1462 tl_awrk(i,n(ng),nnew)=tl_dc(i,n(ng))
1466 tl_awrk(i,n(ng),nnew)=tl_awrk(i,n(ng),nnew)*umask(i,j)
1473 tl_dc(i,k)=tl_dc(i,k)-cf(i,k)*tl_dc(i,k+1)
1476 tl_awrk(i,k,nnew)=tl_dc(i,k)
1480 tl_awrk(i,k,nnew)=tl_awrk(i,k,nnew)*umask(i,j)
1506 IF (lconvolve(boundary))
THEN
1507 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1514 tl_fs(j,k)=fc(j,k)*(tl_awrk(j,k+1,nold)- &
1515 & tl_awrk(j,k ,nold))
1519 tl_fs(j,k)=tl_fs(j,k)*umask(i,j)
1527 tl_fs(j,n(ng))=0.0_r8
1529 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1536 tl_fs(i,k)=fc(i,k)*(tl_awrk(i,k+1,nold)- &
1537 & tl_awrk(i,k ,nold))
1541 tl_fs(i,k)=tl_fs(i,k)*umask(i,j)
1549 tl_fs(i,n(ng))=0.0_r8
1556 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1563 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
1564 & ohz(j,k)*(tl_fs(j,k )- &
1568 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1575 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
1576 & ohz(i,k)*(tl_fs(i,k )- &
1596 IF (lconvolve(boundary))
THEN
1597 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1602 tl_a(j,k)=tl_awrk(j,k,nold)
1605 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1610 tl_a(i,k)=tl_awrk(i,k,nold)
1620 & lbij, ubij, 1, n(ng), &
1630 & lbij, ubij, 1, n(ng), &
1642 & edge, LBij, UBij, &
1643 & LBi, UBi, LBj, UBj, LBk, UBk, &
1644 & IminS, ImaxS, JminS, JmaxS, &
1645 & Nghost, NHsteps, NVsteps, &
1646 & DTsizeH, DTsizeV, &
1648 & pm, pn, pmon_p, pnom_r, &
1666 integer,
intent(in) :: ng, tile, model, boundary
1667 integer,
intent(in) :: edge(4)
1668 integer,
intent(in) :: LBij, UBij
1669 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
1670 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
1671 integer,
intent(in) :: Nghost, NHsteps, NVsteps
1673 real(r8),
intent(in) :: DTsizeH, DTsizeV
1675# ifdef ASSUMED_SHAPE
1676 real(r8),
intent(in) :: pm(LBi:,LBj:)
1677 real(r8),
intent(in) :: pn(LBi:,LBj:)
1678 real(r8),
intent(in) :: pmon_p(LBi:,LBj:)
1679 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
1681 real(r8),
intent(in) :: vmask(LBi:,LBj:)
1682 real(r8),
intent(in) :: pmask(LBi:,LBj:)
1684 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
1685 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
1687 real(r8),
intent(in) :: Kh(LBi:,LBj:)
1688 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
1689 real(r8),
intent(inout) :: tl_A(LBij:,LBk:)
1691 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
1692 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
1693 real(r8),
intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
1694 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
1696 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
1697 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
1699 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
1700 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
1702 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
1703 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
1704 real(r8),
intent(inout) :: tl_A(LBij:UBij,LBk:UBk)
1709 logical,
dimension(4) :: Lconvolve
1711 integer :: Nnew, Nold, Nsav, i, ib, j, k, step
1713 real(r8) :: cff, cff1
1715 real(r8),
dimension(LBij:UBij,LBk:UBk,2) :: tl_Awrk
1717 real(r8),
dimension(JminS:JmaxS,LBk:UBk) :: tl_FE
1718 real(r8),
dimension(IminS:ImaxS,LBk:UBk) :: tl_FX
1719 real(r8),
dimension(LBij:UBij) :: Hfac
1721# ifndef SPLINES_VCONV
1722 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
1724# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1725 real(r8),
dimension(LBij:UBij,N(ng)) :: oHz
1727# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
1728 real(r8),
dimension(LBij:UBij,0:N(ng)) :: BC
1729 real(r8),
dimension(LBij:UBij,0:N(ng)) :: CF
1730# ifdef SPLINES_VCONV
1731 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
1733 real(r8),
dimension(LBij:UBij,0:N(ng)) :: tl_DC
1735 real(r8),
dimension(LBij:UBij,0:N(ng)) :: tl_FS
1739# include "set_bounds.h"
1755 IF (lconvolve(boundary))
THEN
1757 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1760 hfac(j)=cff*(pm(i,j-1)+pm(i,j))*(pn(i,j-1)+pn(i,j))
1762# ifndef SPLINES_VCONV
1765# ifdef IMPLICIT_VCONV
1766 fc(j,k)=-dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1767 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1768 & z_r(i,j-1,k )-z_r(i,j,k ))
1770 fc(j,k)=dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1771 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1772 & z_r(i,j-1,k )-z_r(i,j,k ))
1777# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1779 ohz(j,k)=2.0_r8/(hz(i,j-1,k)+hz(i,j,k))
1784 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1787 hfac(i)=cff*(pm(i,j-1)+pm(i,j))*(pn(i,j-1)+pn(i,j))
1789# ifndef SPLINES_VCONV
1792# ifdef IMPLICIT_VCONV
1793 fc(i,k)=-dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1794 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1795 & z_r(i,j-1,k )-z_r(i,j,k ))
1797 fc(i,k)=dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1798 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1799 & z_r(i,j-1,k )-z_r(i,j,k ))
1804# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1806 ohz(i,k)=2.0_r8/(hz(i,j-1,k)+hz(i,j,k))
1824 & lbij, ubij, 1, n(ng), &
1834 & lbij, ubij, 1, n(ng), &
1839 IF (lconvolve(boundary))
THEN
1840 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1845 tl_awrk(j,k,nold)=tl_a(j,k)
1848 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1853 tl_awrk(i,k,nold)=tl_a(i,k)
1867 IF (lconvolve(boundary))
THEN
1868 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1876 tl_fe(j,k)=pnom_r(i,j)*kh(i,j)* &
1877 & (tl_awrk(j+1,k,nold)- &
1878 & tl_awrk(j ,k,nold))
1881 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1891 tl_fx(i,k)=pmon_p(i,j)* &
1892 & 0.25_r8*(kh(i-1,j )+kh(i,j )+ &
1893 & kh(i-1,j-1)+kh(i,j-1))* &
1894 & (tl_awrk(i ,k,nold)- &
1895 & tl_awrk(i-1,k,nold))
1899 tl_fx(i,k)=tl_fx(i,k)*pmask(i,j)
1908 IF (lconvolve(boundary))
THEN
1909 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1916 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
1918 & (tl_fe(j,k)-tl_fe(j-1,k))
1921 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1928 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
1930 & (tl_fx(i+1,k)-tl_fx(i,k))
1943 & lbij, ubij, 1, n(ng), &
1944 & tl_awrk(:,:,nnew))
1953 & lbij, ubij, 1, n(ng), &
1956 & tl_awrk(:,:,nnew))
1967# ifdef IMPLICIT_VCONV
1968# ifdef SPLINES_VCONV
1981 IF (lconvolve(boundary))
THEN
1982 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1984 cff1=0.5_r8*(1.0_r8/6.0_r8)
1987 fc(j,k)=cff1*(hz(i,j-1,k )+hz(i,j,k ))- &
1988 & dtsizev*kv(i,j,k-1)*ohz(j,k )
1989 cf(j,k)=cff1*(hz(i,j-1,k+1)+hz(i,j,k+1))- &
1990 & dtsizev*kv(i,j,k+1)*ohz(j,k+1)
1997 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1999 cff1=0.5_r8*(1.0_r8/6.0_r8)
2002 fc(i,k)=cff1*(hz(i,j-1,k )+hz(i,j,k ))- &
2003 & dtsizev*kv(i,j,k-1)*ohz(i,k )
2004 cf(i,k)=cff1*(hz(i,j-1,k+1)+hz(i,j,k+1))- &
2005 & dtsizev*kv(i,j,k+1)*ohz(i,k+1)
2016 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2018 cff1=0.5_r8*(1.0_r8/3.0_r8)
2021 bc(j,k)=cff1*(hz(i,j-1,k )+hz(i,j,k )+ &
2022 & hz(i,j-1,k+1)+hz(i,j,k+1))+ &
2023 & dtsizev*kv(i,j,k)* &
2024 & (ohz(j,k)+ohz(j,k+1))
2025 cff=1.0_r8/(bc(j,k)-fc(j,k)*cf(j,k-1))
2031 tl_dc(j,k)=cff*(tl_awrk(j,k+1,nold)- &
2032 & tl_awrk(j,k ,nold)- &
2033 & fc(j,k)*tl_dc(j,k-1))
2036 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2038 cff1=0.5_r8*(1.0_r8/3.0_r8)
2041 bc(i,k)=cff1*(hz(i,j-1,k )+hz(i,j,k )+ &
2042 & hz(i,j-1,k+1)+hz(i,j,k+1))+ &
2043 & dtsizev*kv(i,j,k)* &
2044 & (ohz(i,k)+ohz(i,k+1))
2045 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
2051 tl_dc(i,k)=cff*(tl_awrk(i,k+1,nold)- &
2052 & tl_awrk(i,k ,nold)- &
2053 & fc(i,k)*tl_dc(i,k-1))
2060 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2065 tl_dc(j,n(ng))=0.0_r8
2071 tl_dc(j,k)=tl_dc(j,k)-cf(j,k)*tl_dc(j,k+1)
2078 tl_dc(j,k)=tl_dc(j,k)*kv(i,j,k)
2083 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
2084 & dtsizev*ohz(j,k)* &
2085 & (tl_dc(j,k)-tl_dc(j,k-1))
2088 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2093 tl_dc(i,n(ng))=0.0_r8
2099 tl_dc(i,k)=tl_dc(i,k)-cf(i,k)*tl_dc(i,k+1)
2106 tl_dc(i,k)=tl_dc(i,k)*kv(i,j,k)
2111 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
2112 & dtsizev*ohz(i,k)* &
2113 & (tl_dc(i,k)-tl_dc(i,k-1))
2137 IF (lconvolve(boundary))
THEN
2138 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2142 cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))
2143 bc(j,k)=cff-fc(j,k)-fc(j,k-1)
2146 tl_dc(j,k)=tl_awrk(j,k,nold)*cff
2149 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2153 cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))
2154 bc(i,k)=cff-fc(i,k)-fc(i,k-1)
2157 tl_dc(i,k)=tl_awrk(i,k,nold)*cff
2164 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2170 tl_dc(j,1)=cff*tl_dc(j,1)
2174 cff=1.0_r8/(bc(j,k)-fc(j,k-1)*cf(j,k-1))
2178 tl_dc(j,k)=cff*(tl_dc(j,k)-fc(j,k-1)*tl_dc(j,k-1))
2181 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2187 tl_dc(i,1)=cff*tl_dc(i,1)
2191 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
2195 tl_dc(i,k)=cff*(tl_dc(i,k)-fc(i,k-1)*tl_dc(i,k-1))
2202 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2210 tl_dc(j,n(ng))=(tl_dc(j,n(ng))- &
2211 & fc(j,n(ng)-1)*tl_dc(j,n(ng)-1))/ &
2213 & fc(j,n(ng)-1)*cf(j,n(ng)-1))
2216 tl_awrk(j,n(ng),nnew)=tl_dc(j,n(ng))
2220 tl_awrk(j,n(ng),nnew)=tl_awrk(j,n(ng),nnew)*vmask(i,j)
2227 tl_dc(j,k)=tl_dc(j,k)-cf(j,k)*tl_dc(j,k+1)
2230 tl_awrk(j,k,nnew)=tl_dc(j,k)
2234 tl_awrk(j,k,nnew)=tl_awrk(j,k,nnew)*vmask(i,j)
2238 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2246 tl_dc(i,n(ng))=(tl_dc(i,n(ng))- &
2247 & fc(i,n(ng)-1)*tl_dc(i,n(ng)-1))/ &
2249 & fc(i,n(ng)-1)*cf(i,n(ng)-1))
2252 tl_awrk(i,n(ng),nnew)=tl_dc(i,n(ng))
2256 tl_awrk(i,n(ng),nnew)=tl_awrk(i,n(ng),nnew)*vmask(i,j)
2263 tl_dc(i,k)=tl_dc(i,k)-cf(i,k)*tl_dc(i,k+1)
2266 tl_awrk(i,k,nnew)=tl_dc(i,k)
2270 tl_awrk(i,k,nnew)=tl_awrk(i,k,nnew)*vmask(i,j)
2296 IF (lconvolve(boundary))
THEN
2297 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2304 tl_fs(j,k)=fc(j,k)*(tl_awrk(j,k+1,nold)- &
2305 & tl_awrk(j,k ,nold))
2309 tl_fs(j,k)=tl_fs(j,k)*vmask(i,j)
2317 tl_fs(j,n(ng))=0.0_r8
2319 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2326 tl_fs(i,k)=fc(i,k)*(tl_awrk(i,k+1,nold)- &
2327 & tl_awrk(i,k ,nold))
2331 tl_fs(i,k)=tl_fs(i,k)*vmask(i,j)
2339 tl_fs(i,n(ng))=0.0_r8
2346 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2353 tl_awrk(j,k,nnew)=tl_awrk(j,k,nold)+ &
2354 & ohz(j,k)*(tl_fs(j,k )- &
2358 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2365 tl_awrk(i,k,nnew)=tl_awrk(i,k,nold)+ &
2366 & ohz(i,k)*(tl_fs(i,k )- &
2386 IF (lconvolve(boundary))
THEN
2387 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
2392 tl_a(j,k)=tl_awrk(j,k,nold)
2395 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
2400 tl_a(i,k)=tl_awrk(i,k,nold)
2410 & lbij, ubij, 1, n(ng), &
2420 & lbij, ubij, 1, n(ng), &