69 & LBi, UBi, LBj, UBj, LBk, UBk, &
70 & IminS, ImaxS, JminS, JmaxS, &
71 & Nghost, NHsteps, NVsteps, &
75# ifdef GEOPOTENTIAL_HCONV
81 & rmask, umask, vmask, &
97 integer,
intent(in) :: ng, tile, model
98 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
99 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
100 integer,
intent(in) :: Nghost, NHsteps, NVsteps
102 real(r8),
intent(in) :: DTsizeH, DTsizeV
105 real(r8),
intent(in) :: pm(LBi:,LBj:)
106 real(r8),
intent(in) :: pn(LBi:,LBj:)
107# ifdef GEOPOTENTIAL_HCONV
108 real(r8),
intent(in) :: on_u(LBi:,LBj:)
109 real(r8),
intent(in) :: om_v(LBi:,LBj:)
111 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
112 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
115 real(r8),
intent(in) :: rmask(LBi:,LBj:)
116 real(r8),
intent(in) :: umask(LBi:,LBj:)
117 real(r8),
intent(in) :: vmask(LBi:,LBj:)
119 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
120 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
122 real(r8),
intent(in) :: Kh(LBi:,LBj:)
123 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
124 real(r8),
intent(inout) :: A(LBi:,LBj:,LBk:)
126 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
127 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
128# ifdef GEOPOTENTIAL_HCONV
129 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
130 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
132 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
133 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
136 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
137 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
138 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
140 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
141 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
143 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
144 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
145 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj,LBk:UBk)
150 integer :: Nnew, Nold, Nsav, i, j, k, k1, k2, step
152 real(r8) :: cff, cff1, cff2, cff3, cff4
154 real(r8),
dimension(LBi:UBi,LBj:UBj,LBk:UBk,2) :: Awrk
156 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
157 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
158 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Hfac
161# ifndef SPLINES_VCONV
162 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: FC
164# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
165 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: oHz
167# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
168 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BC
169 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
170 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
172 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
175 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FS
178# ifdef GEOPOTENTIAL_HCONV
179 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FZ
180 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAdz
181 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAdx
182 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAde
183 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx
184 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde
187# include "set_bounds.h"
200 hfac(i,j)=dtsizeh*pm(i,j)*pn(i,j)
202# ifndef SPLINES_VCONV
205# ifdef IMPLICIT_VCONV
206 fc(i,j,k)=-dtsizev*kv(i,j,k)/(z_r(i,j,k+1)-z_r(i,j,k))
208 fc(i,j,k)=dtsizev*kv(i,j,k)/(z_r(i,j,k+1)-z_r(i,j,k))
213# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
215 ohz(i,j,k)=1.0_r8/hz(i,j,k)
227 & lbi, ubi, lbj, ubj, lbk, ubk, &
231 & lbi, ubi, lbj, ubj, lbk, ubk, &
239 awrk(i,j,k,nold)=a(i,j,k)
250# ifdef GEOPOTENTIAL_HCONV
262 k_loop :
DO k=0,n(ng)
268 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
272 dzdx(i,j,k2)=cff*(z_r(i ,j,k+1)- &
275 dadx(i,j,k2)=cff*(awrk(i ,j,k+1,nold)*rmask(i ,j)- &
276 & awrk(i-1,j,k+1,nold)*rmask(i-1,j))
278 dadx(i,j,k2)=cff*(awrk(i ,j,k+1,nold)- &
279 & awrk(i-1,j,k+1,nold))
285 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
289 dzde(i,j,k2)=cff*(z_r(i,j ,k+1)- &
292 dade(i,j,k2)=cff*(awrk(i,j ,k+1,nold)*rmask(i,j )- &
293 & awrk(i,j-1,k+1,nold)*rmask(i,j-1))
295 dade(i,j,k2)=cff*(awrk(i,j ,k+1,nold)- &
296 & awrk(i,j-1,k+1,nold))
301 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
311 cff=1.0_r8/(z_r(i,j,k+1)-z_r(i,j,k))
312 dadz(i,j,k2)=cff*(awrk(i,j,k+1,nold)- &
315 dadz(i,j,k2)=dadz(i,j,k2)*rmask(i,j)
327 cff=0.25_r8*(kh(i-1,j)+kh(i-1,j))*on_u(i,j)
328 cff1=min(dzdx(i,j,k1),0.0_r8)
329 cff2=max(dzdx(i,j,k1),0.0_r8)
331 & (hz(i,j,k)+hz(i-1,j,k))* &
333 & 0.5_r8*(cff1*(dadz(i-1,j,k1)+ &
335 & cff2*(dadz(i-1,j,k2)+ &
341 cff=0.25_r8*(kh(i,j-1)+kh(i,j))*om_v(i,j)
342 cff1=min(dzde(i,j,k1),0.0_r8)
343 cff2=max(dzde(i,j,k1),0.0_r8)
345 & (hz(i,j,k)+hz(i,j-1,k))* &
347 & 0.5_r8*(cff1*(dadz(i,j-1,k1)+ &
349 & cff2*(dadz(i,j-1,k2)+ &
357 cff1=min(dzdx(i ,j,k1),0.0_r8)
358 cff2=min(dzdx(i+1,j,k2),0.0_r8)
359 cff3=max(dzdx(i ,j,k2),0.0_r8)
360 cff4=max(dzdx(i+1,j,k1),0.0_r8)
362 & (cff1*(cff1*dadz(i,j,k2)-dadx(i ,j,k1))+ &
363 & cff2*(cff2*dadz(i,j,k2)-dadx(i+1,j,k2))+ &
364 & cff3*(cff3*dadz(i,j,k2)-dadx(i ,j,k2))+ &
365 & cff4*(cff4*dadz(i,j,k2)-dadx(i+1,j,k1)))
366 cff1=min(dzde(i,j ,k1),0.0_r8)
367 cff2=min(dzde(i,j+1,k2),0.0_r8)
368 cff3=max(dzde(i,j ,k2),0.0_r8)
369 cff4=max(dzde(i,j+1,k1),0.0_r8)
370 fz(i,j,k2)=fz(i,j,k2)+ &
372 & (cff1*(cff1*dadz(i,j,k2)-dade(i,j ,k1))+ &
373 & cff2*(cff2*dadz(i,j,k2)-dade(i,j+1,k2))+ &
374 & cff3*(cff3*dadz(i,j,k2)-dade(i,j ,k2))+ &
375 & cff4*(cff4*dadz(i,j,k2)-dade(i,j+1,k1)))
384 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
386 & (fx(i+1,j )-fx(i,j)+ &
387 & fe(i ,j+1)-fe(i,j))+ &
389 & (fz(i,j,k2)-fz(i,j,k1))
404 fx(i,j)=pmon_u(i,j)*0.5_r8*(kh(i-1,j)+kh(i,j))* &
405 & (awrk(i,j,k,nold)-awrk(i-1,j,k,nold))
407 fx(i,j)=fx(i,j)*umask(i,j)
413 fe(i,j)=pnom_v(i,j)*0.5_r8*(kh(i,j-1)+kh(i,j))* &
414 & (awrk(i,j,k,nold)-awrk(i,j-1,k,nold))
416 fe(i,j)=fe(i,j)*vmask(i,j)
425 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
427 & (fx(i+1,j)-fx(i,j)+ &
437 & lbi, ubi, lbj, ubj, lbk, ubk, &
441 & lbi, ubi, lbj, ubj, lbk, ubk, &
455# ifdef IMPLICIT_VCONV
473 fc(i,k)=cff1*hz(i,j,k )- &
474 & dtsizev*kv(i,j,k-1)*ohz(i,j,k )
475 cf(i,k)=cff1*hz(i,j,k+1)- &
476 & dtsizev*kv(i,j,k+1)*ohz(i,j,k+1)
489 bc(i,k)=cff1*(hz(i,j,k)+hz(i,j,k+1))+ &
490 & dtsizev*kv(i,j,k)*(ohz(i,j,k)+ohz(i,j,k+1))
491 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
493 dc(i,k)=cff*(awrk(i,j,k+1,nold)-awrk(i,j,k,nold)- &
505 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
511 dc(i,k)=dc(i,k)*kv(i,j,k)
512 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
513 & dtsizev*ohz(i,j,k)* &
514 & (dc(i,k)-dc(i,k-1))
539 bc(i,k)=hz(i,j,k)-fc(i,j,k)-fc(i,j,k-1)
540 dc(i,k)=awrk(i,j,k,nold)*hz(i,j,k)
548 cf(i,1)=cff*fc(i,j,1)
553 cff=1.0_r8/(bc(i,k)-fc(i,j,k-1)*cf(i,k-1))
554 cf(i,k)=cff*fc(i,j,k)
555 dc(i,k)=cff*(dc(i,k)-fc(i,j,k-1)*dc(i,k-1))
562 dc(i,n(ng))=(dc(i,n(ng))- &
563 & fc(i,j,n(ng)-1)*dc(i,n(ng)-1))/ &
564 & (bc(i,n(ng))-fc(i,j,n(ng)-1)*cf(i,n(ng)-1))
565 awrk(i,j,n(ng),nnew)=dc(i,n(ng))
567 awrk(i,j,n(ng),nnew)=awrk(i,j,n(ng),nnew)*rmask(i,j)
572 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
573 awrk(i,j,k,nnew)=dc(i,k)
575 awrk(i,j,k,nnew)=awrk(i,j,k,nnew)*rmask(i,j)
602 fs(i,k)=fc(i,j,k)*(awrk(i,j,k+1,nold)- &
605 fs(i,k)=fs(i,k)*rmask(i,j)
619 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
620 & ohz(i,j,k)*(fs(i,k )- &
642 a(i,j,k)=awrk(i,j,k,nold)
647 & lbi, ubi, lbj, ubj, lbk, ubk, &
651 & lbi, ubi, lbj, ubj, lbk, ubk, &
662 & LBi, UBi, LBj, UBj, LBk, UBk, &
663 & IminS, ImaxS, JminS, JmaxS, &
664 & Nghost, NHsteps, NVsteps, &
665 & DTsizeH, DTsizeV, &
668# ifdef GEOPOTENTIAL_HCONV
674# ifdef GEOPOTENTIAL_HCONV
675 & pmask, rmask, umask, vmask, &
694 integer,
intent(in) :: ng, tile, model
695 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
696 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
697 integer,
intent(in) :: Nghost, NHsteps, NVsteps
699 real(r8),
intent(in) :: DTsizeH, DTsizeV
702 real(r8),
intent(in) :: pm(LBi:,LBj:)
703 real(r8),
intent(in) :: pn(LBi:,LBj:)
704# ifdef GEOPOTENTIAL_HCONV
705 real(r8),
intent(in) :: on_r(LBi:,LBj:)
706 real(r8),
intent(in) :: om_p(LBi:,LBj:)
708 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
709 real(r8),
intent(in) :: pnom_p(LBi:,LBj:)
712# ifdef GEOPOTENTIAL_HCONV
713 real(r8),
intent(in) :: pmask(LBi:,LBj:)
714 real(r8),
intent(in) :: rmask(LBi:,LBj:)
715 real(r8),
intent(in) :: umask(LBi:,LBj:)
716 real(r8),
intent(in) :: vmask(LBi:,LBj:)
718 real(r8),
intent(in) :: umask(LBi:,LBj:)
719 real(r8),
intent(in) :: pmask(LBi:,LBj:)
722 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
723 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
725 real(r8),
intent(in) :: Kh(LBi:,LBj:)
726 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
727 real(r8),
intent(inout) :: A(LBi:,LBj:,LBk:)
729 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
730 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
731# ifdef GEOPOTENTIAL_HCONV
732 real(r8),
intent(in) :: on_r(LBi:UBi,LBj:UBj)
733 real(r8),
intent(in) :: om_p(LBi:UBi,LBj:UBj)
735 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
736 real(r8),
intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
739# ifdef GEOPOTENTIAL_HCONV
740 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
741 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
742 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
743 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
745 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
746 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
749 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
750 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
752 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
753 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
754 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj,LBk:UBk)
759 integer :: Nnew, Nold, Nsav, i, j, k, k1, k2, step
761 real(r8) :: cff, cff1, cff2, cff3, cff4
763 real(r8),
dimension(LBi:UBi,LBj:UBj,LBk:UBk,2) :: Awrk
765 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
766 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
767 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Hfac
769# ifndef SPLINES_VCONV
770 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: FC
772# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
773 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: oHz
775# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
776 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BC
777 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
778 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
780 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
781 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hzk
784 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FS
787# ifdef GEOPOTENTIAL_HCONV
788 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: dZdx
789 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: dZde
791 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FZ
792 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAdz
793 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAdx
794 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAde
795 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx_r
796 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde_p
799# include "set_bounds.h"
813 hfac(i,j)=cff*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
815# ifndef SPLINES_VCONV
818# ifdef IMPLICIT_VCONV
819 fc(i,j,k)=-dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
820 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
821 & z_r(i-1,j,k )-z_r(i,j,k ))
823 fc(i,j,k)=dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
824 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
825 & z_r(i-1,j,k )-z_r(i,j,k ))
830# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
832 ohz(i,j,k)=2.0_r8/(hz(i-1,j,k)+hz(i,j,k))
844 & lbi, ubi, lbj, ubj, lbk, ubk, &
848 & lbi, ubi, lbj, ubj, lbk, ubk, &
856 awrk(i,j,k,nold)=a(i,j,k)
867# ifdef GEOPOTENTIAL_HCONV
879 k_loop :
DO k=0,n(ng)
885 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
889 dzdx(i,j)=cff*(z_r(i ,j,k+1)- &
896 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
900 dzde(i,j)=cff*(z_r(i,j ,k+1)- &
908 dadx(i,j,k2)=pm(i,j)* &
909 & (awrk(i+1,j,k+1,nold)*umask(i+1,j)- &
910 & awrk(i ,j,k+1,nold)*umask(i ,j))
911 dadx(i,j,k2)=dadx(i,j,k2)*rmask(i,j)
913 dadx(i,j,k2)=pm(i,j)*(awrk(i+1,j,k+1,nold)- &
914 & awrk(i ,j,k+1,nold))
916 dzdx_r(i,j,k2)=0.5_r8*(dzdx(i ,j)+ &
923 cff=0.25_r8*(pn(i-1,j )+pn(i,j )+ &
924 & pn(i-1,j-1)+pn(i,j-1))
927 & (awrk(i,j ,k+1,nold)*umask(i,j )- &
928 & awrk(i,j-1,k+1,nold)*umask(i,j-1))
929 dade(i,j,k2)=dade(i,j,k2)*pmask(i,j)
931 dade(i,j,k2)=cff*(awrk(i,j ,k+1,nold)- &
932 & awrk(i,j-1,k+1,nold))
934 dzde_p(i,j,k2)=0.5_r8*(dzde(i-1,j)+ &
940 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
950 cff=1.0_r8/(z_r(i,j,k+1)-z_r(i,j,k))
951 dadz(i,j,k2)=cff*(awrk(i,j,k+1,nold)- &
954 dadz(i,j,k2)=dadz(i,j,k2)*umask(i,j)
966 cff=kh(i,j)*on_r(i,j)
967 cff1=min(dzdx_r(i,j,k1),0.0_r8)
968 cff2=max(dzdx_r(i,j,k1),0.0_r8)
972 & 0.5_r8*(cff1*(dadz(i ,j,k1)+ &
974 & cff2*(dadz(i ,j,k2)+ &
980 cff=0.0625_r8*(kh(i-1,j-1)+kh(i-1,j)+ &
981 & kh(i ,j-1)+kh(i ,j))*om_p(i,j)
982 cff1=min(dzde_p(i,j,k1),0.0_r8)
983 cff2=max(dzde_p(i,j,k1),0.0_r8)
985 & (hz(i-1,j-1,k)+hz(i-1,j,k)+ &
986 & hz(i ,j-1,k)+hz(i ,j,k))* &
988 & 0.5_r8*(cff1*(dadz(i,j-1,k1)+ &
990 & cff2*(dadz(i,j-1,k2)+ &
997 cff=0.25_r8*(kh(i-1,j)+kh(i,j))
998 cff1=min(dzdx_r(i-1,j,k1),0.0_r8)
999 cff2=min(dzdx_r(i ,j,k2),0.0_r8)
1000 cff3=max(dzdx_r(i-1,j,k2),0.0_r8)
1001 cff4=max(dzdx_r(i ,j,k1),0.0_r8)
1003 & (cff1*(cff1*dadz(i,j,k2)-dadx(i-1,j,k1))+ &
1004 & cff2*(cff2*dadz(i,j,k2)-dadx(i ,j,k2))+ &
1005 & cff3*(cff3*dadz(i,j,k2)-dadx(i-1,j,k2))+ &
1006 & cff4*(cff4*dadz(i,j,k2)-dadx(i ,j,k1)))
1007 cff1=min(dzde_p(i,j ,k1),0.0_r8)
1008 cff2=min(dzde_p(i,j+1,k2),0.0_r8)
1009 cff3=max(dzde_p(i,j ,k2),0.0_r8)
1010 cff4=max(dzde_p(i,j+1,k1),0.0_r8)
1011 fz(i,j,k2)=fz(i,j,k2)+ &
1013 & (cff1*(cff1*dadz(i,j,k2)-dade(i,j ,k1))+ &
1014 & cff2*(cff2*dadz(i,j,k2)-dade(i,j+1,k2))+ &
1015 & cff3*(cff3*dadz(i,j,k2)-dade(i,j ,k2))+ &
1016 & cff4*(cff4*dadz(i,j,k2)-dade(i,j+1,k1)))
1025 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1027 & (fx(i,j )-fx(i-1,j)+ &
1028 & fe(i,j+1)-fe(i ,j))+ &
1030 & (fz(i,j,k2)-fz(i,j,k1))
1045 fx(i,j)=pmon_r(i,j)*kh(i,j)* &
1046 & (awrk(i+1,j,k,nold)-awrk(i,j,k,nold))
1051 fe(i,j)=pnom_p(i,j)*0.25_r8*(kh(i-1,j )+kh(i,j )+ &
1052 & kh(i-1,j-1)+kh(i,j-1))* &
1053 & (awrk(i,j,k,nold)-awrk(i,j-1,k,nold))
1055 fe(i,j)=fe(i,j)*pmask(i,j)
1064 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1066 & (fx(i,j)-fx(i-1,j)+ &
1067 & fe(i,j+1)-fe(i,j))
1076 & lbi, ubi, lbj, ubj, lbk, ubk, &
1080 & lbi, ubi, lbj, ubj, lbk, ubk, &
1094# ifdef IMPLICIT_VCONV
1095# ifdef SPLINES_VCONV
1111 hzk(i,k)=0.5_r8*(hz(i-1,j,k)+ &
1118 fc(i,k)=cff1*hzk(i,k )-dtsizev*kv(i,j,k-1)*ohz(i,j,k )
1119 cf(i,k)=cff1*hzk(i,k+1)-dtsizev*kv(i,j,k+1)*ohz(i,j,k+1)
1132 bc(i,k)=cff1*(hzk(i,k)+hzk(i,k+1))+ &
1133 & dtsizev*kv(i,j,k)*(ohz(i,j,k)+ohz(i,j,k+1))
1134 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1136 dc(i,k)=cff*(awrk(i,j,k+1,nold)-awrk(i,j,k,nold)- &
1137 & fc(i,k)*dc(i,k-1))
1148 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1154 dc(i,k)=dc(i,k)*kv(i,j,k)
1155 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1156 & dtsizev*ohz(i,j,k)* &
1157 & (dc(i,k)-dc(i,k-1))
1182 cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))
1183 bc(i,k)=cff-fc(i,j,k)-fc(i,j,k-1)
1184 dc(i,k)=awrk(i,j,k,nold)*cff
1192 cf(i,1)=cff*fc(i,j,1)
1197 cff=1.0_r8/(bc(i,k)-fc(i,j,k-1)*cf(i,k-1))
1198 cf(i,k)=cff*fc(i,j,k)
1199 dc(i,k)=cff*(dc(i,k)-fc(i,j,k-1)*dc(i,k-1))
1206 dc(i,n(ng))=(dc(i,n(ng))- &
1207 & fc(i,j,n(ng)-1)*dc(i,n(ng)-1))/ &
1208 & (bc(i,n(ng))-fc(i,j,n(ng)-1)*cf(i,n(ng)-1))
1209 awrk(i,j,n(ng),nnew)=dc(i,n(ng))
1211 awrk(i,j,n(ng),nnew)=awrk(i,j,n(ng),nnew)*umask(i,j)
1216 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1217 awrk(i,j,k,nnew)=dc(i,k)
1219 awrk(i,j,k,nnew)=awrk(i,j,k,nnew)*umask(i,j)
1246 fs(i,k)=fc(i,j,k)*(awrk(i,j,k+1,nold)- &
1247 & awrk(i,j,k ,nold))
1249 fs(i,k)=fs(i,k)*umask(i,j)
1263 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1264 & ohz(i,j,k)*(fs(i,k )- &
1286 a(i,j,k)=awrk(i,j,k,nold)
1291 & lbi, ubi, lbj, ubj, lbk, ubk, &
1295 & lbi, ubi, lbj, ubj, lbk, ubk, &
1306 & LBi, UBi, LBj, UBj, LBk, UBk, &
1307 & IminS, ImaxS, JminS, JmaxS, &
1308 & Nghost, NHsteps, NVsteps, &
1309 & DTsizeH, DTsizeV, &
1312# ifdef GEOPOTENTIAL_HCONV
1318# ifdef GEOPOTENTIAL_HCONV
1319 & pmask, rmask, umask, vmask, &
1338 integer,
intent(in) :: ng, tile, model
1339 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
1340 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
1341 integer,
intent(in) :: Nghost, NHsteps, NVsteps
1343 real(r8),
intent(in) :: DTsizeH, DTsizeV
1345# ifdef ASSUMED_SHAPE
1346 real(r8),
intent(in) :: pm(LBi:,LBj:)
1347 real(r8),
intent(in) :: pn(LBi:,LBj:)
1348# ifdef GEOPOTENTIAL_HCONV
1349 real(r8),
intent(in) :: on_p(LBi:,LBj:)
1350 real(r8),
intent(in) :: om_r(LBi:,LBj:)
1352 real(r8),
intent(in) :: pmon_p(LBi:,LBj:)
1353 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
1356# ifdef GEOPOTENTIAL_HCONV
1357 real(r8),
intent(in) :: pmask(LBi:,LBj:)
1358 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1359 real(r8),
intent(in) :: umask(LBi:,LBj:)
1360 real(r8),
intent(in) :: vmask(LBi:,LBj:)
1362 real(r8),
intent(in) :: vmask(LBi:,LBj:)
1363 real(r8),
intent(in) :: pmask(LBi:,LBj:)
1366 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
1367 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
1369 real(r8),
intent(in) :: Kh(LBi:,LBj:)
1370 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
1371 real(r8),
intent(inout) :: A(LBi:,LBj:,LBk:)
1373 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
1374 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
1375# ifdef GEOPOTENTIAL_HCONV
1376 real(r8),
intent(in) :: on_p(LBi:UBi,LBj:UBj)
1377 real(r8),
intent(in) :: om_r(LBi:UBi,LBj:UBj)
1379 real(r8),
intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
1380 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
1383# ifdef GEOPOTENTIAL_HCONV
1384 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
1385 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1386 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
1387 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
1389 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
1390 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
1393 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
1394 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
1396 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
1397 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
1398 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj,LBk:UBk)
1403 integer :: Nnew, Nold, Nsav, i, j, k, k1, k2, step
1405 real(r8) :: cff, cff1, cff2, cff3, cff4
1407 real(r8),
dimension(LBi:UBi,LBj:UBj,LBk:UBk,2) :: Awrk
1409 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
1410 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
1411 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: Hfac
1413# ifndef SPLINES_VCONV
1414 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: FC
1416# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1417 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: oHz
1419# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
1420 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BC
1421 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
1422 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
1423# ifdef SPLINES_VCONV
1424 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
1425 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hzk
1428 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FS
1431# ifdef GEOPOTENTIAL_HCONV
1432 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: dZdx
1433 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: dZde
1435 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: FZ
1436 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAdz
1437 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAdx
1438 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dAde
1439 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx_p
1440 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde_r
1443# include "set_bounds.h"
1457 hfac(i,j)=cff*(pm(i,j-1)+pm(i,j))*(pn(i,j-1)+pn(i,j))
1459# ifndef SPLINES_VCONV
1460 fc(i,j,n(ng))=0.0_r8
1462# ifdef IMPLICIT_VCONV
1463 fc(i,j,k)=-dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1464 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1465 & z_r(i,j-1,k )-z_r(i,j,k ))
1467 fc(i,j,k)=dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1468 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1469 & z_r(i,j-1,k )-z_r(i,j,k ))
1474# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1476 ohz(i,j,k)=2.0_r8/(hz(i,j-1,k)+hz(i,j,k))
1488 & lbi, ubi, lbj, ubj, lbk, ubk, &
1492 & lbi, ubi, lbj, ubj, lbk, ubk, &
1500 awrk(i,j,k,nold)=a(i,j,k)
1511# ifdef GEOPOTENTIAL_HCONV
1523 k_loop :
DO k=0,n(ng)
1526 IF (k.lt.n(ng))
THEN
1529 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
1533 dzdx(i,j)=cff*(z_r(i ,j,k+1)- &
1540 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
1544 dzde(i,j)=cff*(z_r(i,j ,k+1)- &
1551 cff=0.25_r8*(pm(i-1,j-1)+pm(i-1,j)+ &
1552 & pm(i ,j-1)+pm(i ,j))
1555 & (awrk(i ,j,k+1,nold)*vmask(i ,j)- &
1556 & awrk(i-1,j,k+1,nold)*vmask(i-1,j))
1557 dadx(i,j,k2)=dadx(i,j,k2)*pmask(i,j)
1559 dadx(i,j,k2)=cff*(awrk(i ,j,k+1,nold)- &
1560 & awrk(i-1,j,k+1,nold))
1562 dzdx_p(i,j,k2)=0.5_r8*(dzdx(i,j-1)+ &
1570 dade(i,j,k2)=pn(i,j)* &
1571 & (awrk(i,j+1,k+1,nold)*vmask(i,j+1)- &
1572 & awrk(i,j ,k+1,nold)*vmask(i,j ))
1573 dade(i,j,k2)=dade(i,j,k2)*rmask(i,j)
1575 dade(i,j,k2)=pn(i,j)*(awrk(i,j+1,k+1,nold)- &
1576 & awrk(i,j ,k+1,nold))
1578 dzde_r(i,j,k2)=0.5_r8*(dzde(i,j )+ &
1584 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
1594 cff=1.0_r8/(z_r(i,j,k+1)-z_r(i,j,k))
1595 dadz(i,j,k2)=cff*(awrk(i,j,k+1,nold)- &
1596 & awrk(i,j,k ,nold))
1598 dadz(i,j,k2)=dadz(i,j,k2)*vmask(i,j)
1610 cff=0.0625_r8*(kh(i-1,j-1)+kh(i-1,j)+ &
1611 & kh(i ,j-1)+kh(i ,j))*on_p(i,j)
1612 cff1=min(dzdx_p(i,j,k1),0.0_r8)
1613 cff2=max(dzdx_p(i,j,k1),0.0_r8)
1615 & (hz(i-1,j-1,k)+hz(i-1,j,k)+ &
1616 & hz(i ,j-1,k)+hz(i ,j,k))* &
1618 & 0.5_r8*(cff1*(dadz(i-1,j,k1)+ &
1620 & cff2*(dadz(i-1,j,k2)+ &
1626 cff=kh(i,j)*om_r(i,j)
1627 cff1=min(dzde_r(i,j,k1),0.0_r8)
1628 cff2=max(dzde_r(i,j,k1),0.0_r8)
1632 & 0.5_r8*(cff1*(dadz(i,j ,k1)+ &
1633 & dadz(i,j+1,k2))+ &
1634 & cff2*(dadz(i,j ,k2)+ &
1638 IF (k.lt.n(ng))
THEN
1641 cff=0.5_r8*(kh(i,j-1)+kh(i,j))
1642 cff1=min(dzdx_p(i ,j,k1),0.0_r8)
1643 cff2=min(dzdx_p(i+1,j,k2),0.0_r8)
1644 cff3=max(dzdx_p(i ,j,k2),0.0_r8)
1645 cff4=max(dzdx_p(i+1,j,k1),0.0_r8)
1647 & (cff1*(cff1*dadz(i,j,k2)-dadx(i ,j,k1))+ &
1648 & cff2*(cff2*dadz(i,j,k2)-dadx(i+1,j,k2))+ &
1649 & cff3*(cff3*dadz(i,j,k2)-dadx(i ,j,k2))+ &
1650 & cff4*(cff4*dadz(i,j,k2)-dadx(i+1,j,k1)))
1651 cff1=min(dzde_r(i,j-1,k1),0.0_r8)
1652 cff2=min(dzde_r(i,j ,k2),0.0_r8)
1653 cff3=max(dzde_r(i,j-1,k2),0.0_r8)
1654 cff4=max(dzde_r(i,j ,k1),0.0_r8)
1655 fz(i,j,k2)=fz(i,j,k2)+ &
1657 & (cff1*(cff1*dadz(i,j,k2)-dade(i,j-1,k1))+ &
1658 & cff2*(cff2*dadz(i,j,k2)-dade(i,j ,k2))+ &
1659 & cff3*(cff3*dadz(i,j,k2)-dade(i,j-1,k2))+ &
1660 & cff4*(cff4*dadz(i,j,k2)-dade(i,j ,k1)))
1669 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1671 & (fx(i+1,j)-fx(i,j )+ &
1672 & fe(i ,j)-fe(i,j-1))+ &
1674 & (fz(i,j,k2)-fz(i,j,k1))
1688 fx(i,j)=pmon_p(i,j)*0.25_r8*(kh(i-1,j )+kh(i,j )+ &
1689 & kh(i-1,j-1)+kh(i,j-1))* &
1690 & (awrk(i,j,k,nold)-awrk(i-1,j,k,nold))
1692 fx(i,j)=fx(i,j)*pmask(i,j)
1698 fe(i,j)=pnom_r(i,j)*kh(i,j)* &
1699 & (awrk(i,j+1,k,nold)-awrk(i,j,k,nold))
1707 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1709 & (fx(i+1,j)-fx(i,j)+ &
1710 & fe(i,j)-fe(i,j-1))
1719 & lbi, ubi, lbj, ubj, lbk, ubk, &
1723 & lbi, ubi, lbj, ubj, lbk, ubk, &
1737# ifdef IMPLICIT_VCONV
1738# ifdef SPLINES_VCONV
1754 hzk(i,k)=0.5_r8*(hz(i,j-1,k)+ &
1761 fc(i,k)=cff1*hzk(i,k )-dtsizev*kv(i,j,k-1)*ohz(i,j,k )
1762 cf(i,k)=cff1*hzk(i,k+1)-dtsizev*kv(i,j,k+1)*ohz(i,j,k+1)
1775 bc(i,k)=cff1*(hzk(i,k)+hzk(i,k+1))+ &
1776 & dtsizev*kv(i,j,k)*(ohz(i,j,k)+ohz(i,j,k+1))
1777 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1779 dc(i,k)=cff*(awrk(i,j,k+1,nold)-awrk(i,j,k,nold)- &
1780 & fc(i,k)*dc(i,k-1))
1791 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1797 dc(i,k)=dc(i,k)*kv(i,j,k)
1798 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1799 & dtsizev*ohz(i,j,k)* &
1800 & (dc(i,k)-dc(i,k-1))
1825 cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))
1826 bc(i,k)=cff-fc(i,j,k)-fc(i,j,k-1)
1827 dc(i,k)=awrk(i,j,k,nold)*cff
1835 cf(i,1)=cff*fc(i,j,1)
1840 cff=1.0_r8/(bc(i,k)-fc(i,j,k-1)*cf(i,k-1))
1841 cf(i,k)=cff*fc(i,j,k)
1842 dc(i,k)=cff*(dc(i,k)-fc(i,j,k-1)*dc(i,k-1))
1849 dc(i,n(ng))=(dc(i,n(ng))- &
1850 & fc(i,j,n(ng)-1)*dc(i,n(ng)-1))/ &
1851 & (bc(i,n(ng))-fc(i,j,n(ng)-1)*cf(i,n(ng)-1))
1852 awrk(i,j,n(ng),nnew)=dc(i,n(ng))
1854 awrk(i,j,n(ng),nnew)=awrk(i,j,n(ng),nnew)*vmask(i,j)
1859 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1860 awrk(i,j,k,nnew)=dc(i,k)
1862 awrk(i,j,k,nnew)=awrk(i,j,k,nnew)*vmask(i,j)
1889 fs(i,k)=fc(i,j,k)*(awrk(i,j,k+1,nold)- &
1890 & awrk(i,j,k ,nold))
1892 fs(i,k)=fs(i,k)*vmask(i,j)
1906 awrk(i,j,k,nnew)=awrk(i,j,k,nold)+ &
1907 & ohz(i,j,k)*(fs(i,k )- &
1929 a(i,j,k)=awrk(i,j,k,nold)
1934 & lbi, ubi, lbj, ubj, lbk, ubk, &
1938 & lbi, ubi, lbj, ubj, lbk, ubk, &