69 & LBi, UBi, LBj, UBj, LBk, UBk, &
70 & IminS, ImaxS, JminS, JmaxS, &
71 & Nghost, NHsteps, NVsteps, &
74 & pm, pn, pmon_u, pnom_v, &
76 & rmask, umask, vmask, &
92 integer,
intent(in) :: ng, tile, model, boundary
93 integer,
intent(in) :: edge(4)
94 integer,
intent(in) :: LBij, UBij
95 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
96 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
97 integer,
intent(in) :: Nghost, NHsteps, NVsteps
99 real(r8),
intent(in) :: DTsizeH, DTsizeV
102 real(r8),
intent(in) :: pm(LBi:,LBj:)
103 real(r8),
intent(in) :: pn(LBi:,LBj:)
104 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
105 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
107 real(r8),
intent(in) :: rmask(LBi:,LBj:)
108 real(r8),
intent(in) :: umask(LBi:,LBj:)
109 real(r8),
intent(in) :: vmask(LBi:,LBj:)
111 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
112 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
114 real(r8),
intent(in) :: Kh(LBi:,LBj:)
115 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
116 real(r8),
intent(inout) :: A(LBij:,LBk:)
118 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
119 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
120 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
121 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
123 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
124 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
125 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
127 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
128 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
130 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
131 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
132 real(r8),
intent(inout) :: A(LBij:UBij,LBk:UBk)
137 logical,
dimension(4) :: Lconvolve
139 integer :: Nnew, Nold, Nsav, i, j, k, step
141 real(r8) :: cff, cff1
143 real(r8),
dimension(LBij:UBij,LBk:UBk,2) :: Awrk
145 real(r8),
dimension(JminS:JmaxS,LBk:UBk) :: FE
146 real(r8),
dimension(IminS:ImaxS,LBk:UBk) :: FX
147 real(r8),
dimension(LBij:UBij) :: Hfac
149# ifndef SPLINES_VCONV
150 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
152# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
153 real(r8),
dimension(LBij:UBij,N(ng)) :: oHz
155# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
156 real(r8),
dimension(LBij:UBij,0:N(ng)) :: BC
157 real(r8),
dimension(LBij:UBij,0:N(ng)) :: CF
158 real(r8),
dimension(LBij:UBij,0:N(ng)) :: DC
160 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
163 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FS
167# include "set_bounds.h"
183 IF (lconvolve(boundary))
THEN
184 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
187 hfac(j)=dtsizeh*pm(i,j)*pn(i,j)
189# ifndef SPLINES_VCONV
192# ifdef IMPLICIT_VCONV
193 fc(j,k)=-dtsizev*kv(i,j,k)/ &
194 & (z_r(i,j,k+1)-z_r(i,j,k))
196 fc(j,k)=dtsizev*kv(i,j,k)/ &
197 & (z_r(i,j,k+1)-z_r(i,j,k))
202# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
204 ohz(j,k)=1.0_r8/hz(i,j,k)
209 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
212 hfac(i)=dtsizeh*pm(i,j)*pn(i,j)
214# ifndef SPLINES_VCONV
217# ifdef IMPLICIT_VCONV
218 fc(i,k)=-dtsizev*kv(i,j,k)/ &
219 & (z_r(i,j,k+1)-z_r(i,j,k))
221 fc(i,k)=dtsizev*kv(i,j,k)/ &
222 & (z_r(i,j,k+1)-z_r(i,j,k))
227# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
229 ohz(i,k)=1.0_r8/hz(i,j,k)
243 & lbij, ubij, 1, n(ng), &
247 & lbij, ubij, 1, n(ng), &
252 IF (lconvolve(boundary))
THEN
253 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
256 awrk(j,k,nold)=a(j,k)
259 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
262 awrk(i,k,nold)=a(i,k)
276 IF (lconvolve(boundary))
THEN
277 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
281 fe(j,k)=pnom_v(i,j)*0.5_r8*(kh(i,j-1)+kh(i,j))* &
282 & (awrk(j ,k,nold)- &
285 fe(j,k)=fe(j,k)*vmask(i,j)
289 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
293 fx(i,k)=pmon_u(i,j)*0.5_r8*(kh(i-1,j)+kh(i,j))* &
294 & (awrk(i ,k,nold)- &
297 fx(i,k)=fx(i,k)*umask(i,j)
306 IF (lconvolve(boundary))
THEN
307 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
310 awrk(j,k,nnew)=awrk(j,k,nold)+ &
312 & (fe(j+1,k)-fe(j,k))
315 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
318 awrk(i,k,nnew)=awrk(i,k,nold)+ &
320 & (fx(i+1,k)-fx(i,k))
329 & lbij, ubij, 1, n(ng), &
333 & lbij, ubij, 1, n(ng), &
347# ifdef IMPLICIT_VCONV
361 IF (lconvolve(boundary))
THEN
362 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
367 fc(j,k)=cff1*hz(i,j,k )- &
368 & dtsizev*kv(i,j,k-1)*ohz(j,k )
369 cf(j,k)=cff1*hz(i,j,k+1)- &
370 & dtsizev*kv(i,j,k+1)*ohz(j,k+1)
375 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
380 fc(i,k)=cff1*hz(i,j,k )- &
381 & dtsizev*kv(i,j,k-1)*ohz(i,k )
382 cf(i,k)=cff1*hz(i,j,k+1)- &
383 & dtsizev*kv(i,j,k+1)*ohz(i,k+1)
392 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
397 bc(j,k)=cff1*(hz(i,j,k)+hz(i,j,k+1))+ &
398 & dtsizev*kv(i,j,k)* &
399 & (ohz(j,k)+ohz(j,k+1))
400 cff=1.0_r8/(bc(j,k)-fc(j,k)*cf(j,k-1))
402 dc(j,k)=cff*(awrk(j,k+1,nold)- &
407 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
412 bc(i,k)=cff1*(hz(i,j,k)+hz(i,j,k+1))+ &
413 & dtsizev*kv(i,j,k)* &
414 & (ohz(i,k)+ohz(i,k+1))
415 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
417 dc(i,k)=cff*(awrk(i,k+1,nold)- &
426 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
433 dc(j,k)=dc(j,k)-cf(j,k)*dc(j,k+1)
438 dc(j,k)=dc(j,k)*kv(i,j,k)
439 awrk(j,k,nnew)=awrk(j,k,nold)+ &
440 & dtsizev*ohz(j,k)* &
441 & (dc(j,k)-dc(j,k-1))
444 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
451 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
456 dc(i,k)=dc(i,k)*kv(i,j,k)
457 awrk(i,k,nnew)=awrk(i,k,nold)+ &
458 & dtsizev*ohz(i,k)* &
459 & (dc(i,k)-dc(i,k-1))
483 IF (lconvolve(boundary))
THEN
484 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
488 bc(j,k)=hz(i,j,k)-fc(j,k)-fc(j,k-1)
489 dc(j,k)=awrk(j,k,nold)*hz(i,j,k)
492 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
496 bc(i,k)=hz(i,j,k)-fc(i,k)-fc(i,k-1)
497 dc(i,k)=awrk(i,k,nold)*hz(i,j,k)
504 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
512 cff=1.0_r8/(bc(j,k)-fc(j,k-1)*cf(j,k-1))
514 dc(j,k)=cff*(dc(j,k)-fc(j,k-1)*dc(j,k-1))
517 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
525 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
527 dc(i,k)=cff*(dc(i,k)-fc(i,k-1)*dc(i,k-1))
534 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
537 dc(j,n(ng))=(dc(j,n(ng))- &
538 & fc(j,n(ng)-1)*dc(j,n(ng)-1))/ &
540 & fc(j,n(ng)-1)*cf(j,n(ng)-1))
541 awrk(j,n(ng),nnew)=dc(j,n(ng))
543 awrk(j,n(ng),nnew)=awrk(j,n(ng),nnew)* &
549 dc(j,k)=dc(j,k)-cf(j,k)*dc(j,k+1)
550 awrk(j,k,nnew)=dc(j,k)
552 awrk(j,k,nnew)=awrk(j,k,nnew)*rmask(i,j)
556 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
559 dc(i,n(ng))=(dc(i,n(ng))- &
560 & fc(i,n(ng)-1)*dc(i,n(ng)-1))/ &
562 & fc(i,n(ng)-1)*cf(i,n(ng)-1))
563 awrk(i,n(ng),nnew)=dc(i,n(ng))
565 awrk(i,n(ng),nnew)=awrk(i,n(ng),nnew)*rmask(i,j)
570 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
571 awrk(i,k,nnew)=dc(i,k)
573 awrk(i,k,nnew)=awrk(i,k,nnew)*rmask(i,j)
599 IF (lconvolve(boundary))
THEN
600 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
604 fs(j,k)=fc(j,k)*(awrk(j,k+1,nold)- &
607 fs(j,k)=fs(j,k)*rmask(i,j)
613 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
617 fs(i,k)=fc(i,k)*(awrk(i,k+1,nold)- &
620 fs(i,k)=fs(i,k)*rmask(i,j)
631 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
634 awrk(j,k,nnew)=awrk(j,k,nold)+ &
635 & ohz(j,k)*(fs(j,k )- &
639 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
642 awrk(i,k,nnew)=awrk(i,k,nold)+ &
643 & ohz(i,k)*(fs(i,k )- &
663 IF (lconvolve(boundary))
THEN
664 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
667 a(j,k)=awrk(j,k,nold)
670 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
673 a(i,k)=awrk(i,k,nold)
679 & lbij, ubij, 1, n(ng), &
683 & lbij, ubij, 1, n(ng), &
695 & edge, LBij, UBij, &
696 & LBi, UBi, LBj, UBj, LBk, UBk, &
697 & IminS, ImaxS, JminS, JmaxS, &
698 & Nghost, NHsteps, NVsteps, &
699 & DTsizeH, DTsizeV, &
701 & pm, pn, pmon_r, pnom_p, &
719 integer,
intent(in) :: ng, tile, model, boundary
720 integer,
intent(in) :: edge(4)
721 integer,
intent(in) :: LBij, UBij
722 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
723 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
724 integer,
intent(in) :: Nghost, NHsteps, NVsteps
726 real(r8),
intent(in) :: DTsizeH, DTsizeV
729 real(r8),
intent(in) :: pm(LBi:,LBj:)
730 real(r8),
intent(in) :: pn(LBi:,LBj:)
731 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
732 real(r8),
intent(in) :: pnom_p(LBi:,LBj:)
734 real(r8),
intent(in) :: umask(LBi:,LBj:)
735 real(r8),
intent(in) :: pmask(LBi:,LBj:)
737 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
738 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
740 real(r8),
intent(in) :: Kh(LBi:,LBj:)
741 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
742 real(r8),
intent(inout) :: A(LBij:,LBk:)
744 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
745 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
746 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
747 real(r8),
intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
749 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
750 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
752 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
753 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
755 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
756 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
757 real(r8),
intent(inout) :: A(LBij:UBij,LBk:UBk)
762 logical,
dimension(4) :: Lconvolve
764 integer :: Nnew, Nold, Nsav, i, j, k, step
766 real(r8) :: cff, cff1
768 real(r8),
dimension(LBij:UBij,LBk:UBk,2) :: Awrk
770 real(r8),
dimension(JminS:JmaxS,LBk:UBk) :: FE
771 real(r8),
dimension(IminS:ImaxS,LBk:UBk) :: FX
772 real(r8),
dimension(LBij:UBij) :: Hfac
774# ifndef SPLINES_VCONV
775 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
777# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
778 real(r8),
dimension(LBij:UBij,N(ng)) :: oHz
780# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
781 real(r8),
dimension(LBij:UBij,0:N(ng)) :: BC
782 real(r8),
dimension(LBij:UBij,0:N(ng)) :: CF
783 real(r8),
dimension(LBij:UBij,0:N(ng)) :: DC
785 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
788 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FS
792# include "set_bounds.h"
808 IF (lconvolve(boundary))
THEN
810 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
813 hfac(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(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(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(j,k)=2.0_r8/(hz(i-1,j,k)+hz(i,j,k))
837 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
840 hfac(i)=cff*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
842# ifndef SPLINES_VCONV
845# ifdef IMPLICIT_VCONV
846 fc(i,k)=-dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
847 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
848 & z_r(i-1,j,k )-z_r(i,j,k ))
850 fc(i,k)=dtsizev*(kv(i-1,j,k)+kv(i,j,k))/ &
851 & (z_r(i-1,j,k+1)+z_r(i,j,k+1)- &
852 & z_r(i-1,j,k )-z_r(i,j,k ))
857# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
859 ohz(i,k)=2.0_r8/(hz(i-1,j,k)+hz(i,j,k))
873 & lbij, ubij, 1, n(ng), &
877 & lbij, ubij, 1, n(ng), &
882 IF (lconvolve(boundary))
THEN
883 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
886 awrk(j,k,nold)=a(j,k)
889 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
892 awrk(i,k,nold)=a(i,k)
906 IF (lconvolve(boundary))
THEN
907 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
911 fe(j,k)=pnom_p(i,j)*0.25_r8*(kh(i-1,j )+kh(i,j )+ &
912 & kh(i-1,j-1)+kh(i,j-1))* &
913 & (awrk(j ,k,nold)- &
916 fe(j,k)=fe(j,k)*pmask(i,j)
920 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
924 fx(i,k)=pmon_r(i,j)*kh(i,j)* &
925 & (awrk(i+1,k,nold)- &
934 IF (lconvolve(boundary))
THEN
935 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
938 awrk(j,k,nnew)=awrk(j,k,nold)+ &
940 & (fe(j+1,k)-fe(j,k))
943 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
946 awrk(i,k,nnew)=awrk(i,k,nold)+ &
948 & (fx(i,k)-fx(i-1,k))
957 & lbij, ubij, 1, n(ng), &
961 & lbij, ubij, 1, n(ng), &
975# ifdef IMPLICIT_VCONV
989 IF (lconvolve(boundary))
THEN
990 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
992 cff1=0.5_r8*(1.0_r8/6.0_r8)
995 fc(j,k)=cff1*(hz(i-1,j,k )+hz(i,j,k ))- &
996 & dtsizev*kv(i,j,k-1)*ohz(j,k )
997 cf(j,k)=cff1*(hz(i-1,j,k+1)+hz(i,j,k+1))- &
998 & dtsizev*kv(i,j,k+1)*ohz(j,k+1)
1003 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1005 cff1=0.5_r8*(1.0_r8/6.0_r8)
1008 fc(i,k)=cff1*(hz(i-1,j,k )+hz(i,j,k ))- &
1009 & dtsizev*kv(i,j,k-1)*ohz(i,k )
1010 cf(i,k)=cff1*(hz(i-1,j,k+1)+hz(i,j,k+1))- &
1011 & dtsizev*kv(i,j,k+1)*ohz(i,k+1)
1020 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1022 cff1=0.5_r8*(1.0_r8/3.0_r8)
1025 bc(j,k)=cff1*(hz(i-1,j,k )+hz(i,j,k )+ &
1026 & hz(i-1,j,k+1)+hz(i,j,k+1))+ &
1027 & dtsizev*kv(i,j,k)* &
1028 & (ohz(j,k)+ohz(j,k+1))
1029 cff=1.0_r8/(bc(j,k)-fc(j,k)*cf(j,k-1))
1031 dc(j,k)=cff*(awrk(j,k+1,nold)- &
1032 & awrk(j,k ,nold)- &
1033 & fc(j,k)*dc(j,k-1))
1036 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1038 cff1=0.5_r8*(1.0_r8/3.0_r8)
1041 bc(i,k)=cff1*(hz(i-1,j,k )+hz(i,j,k )+ &
1042 & hz(i-1,j,k+1)+hz(i,j,k+1))+ &
1043 & dtsizev*kv(i,j,k)* &
1044 & (ohz(i,k)+ohz(i,k+1))
1045 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1047 dc(i,k)=cff*(awrk(i,k+1,nold)- &
1048 & awrk(i,k ,nold)- &
1049 & fc(i,k)*dc(i,k-1))
1056 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1063 dc(j,k)=dc(j,k)-cf(j,k)*dc(j,k+1)
1068 dc(j,k)=dc(j,k)*kv(i,j,k)
1069 awrk(j,k,nnew)=awrk(j,k,nold)+ &
1070 & dtsizev*ohz(j,k)* &
1071 & (dc(j,k)-dc(j,k-1))
1074 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1081 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1086 dc(i,k)=dc(i,k)*kv(i,j,k)
1087 awrk(i,k,nnew)=awrk(i,k,nold)+ &
1088 & dtsizev*ohz(i,k)* &
1089 & (dc(i,k)-dc(i,k-1))
1113 IF (lconvolve(boundary))
THEN
1114 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1118 cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))
1119 bc(j,k)=cff-fc(j,k)-fc(j,k-1)
1120 dc(j,k)=awrk(j,k,nold)*cff
1123 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1127 cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))
1128 bc(i,k)=cff-fc(i,k)-fc(i,k-1)
1129 dc(i,k)=awrk(i,k,nold)*cff
1136 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1144 cff=1.0_r8/(bc(j,k)-fc(j,k-1)*cf(j,k-1))
1146 dc(j,k)=cff*(dc(j,k)-fc(j,k-1)*dc(j,k-1))
1149 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1157 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
1159 dc(i,k)=cff*(dc(i,k)-fc(i,k-1)*dc(i,k-1))
1166 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1169 dc(j,n(ng))=(dc(j,n(ng))- &
1170 & fc(j,n(ng)-1)*dc(j,n(ng)-1))/ &
1172 & fc(j,n(ng)-1)*cf(j,n(ng)-1))
1173 awrk(j,n(ng),nnew)=dc(j,n(ng))
1175 awrk(j,n(ng),nnew)=awrk(j,n(ng),nnew)*umask(i,j)
1180 dc(j,k)=dc(j,k)-cf(j,k)*dc(j,k+1)
1181 awrk(j,k,nnew)=dc(j,k)
1183 awrk(j,k,nnew)=awrk(j,k,nnew)*umask(i,j)
1187 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1190 dc(i,n(ng))=(dc(i,n(ng))- &
1191 & fc(i,n(ng)-1)*dc(i,n(ng)-1))/ &
1193 & fc(i,n(ng)-1)*cf(i,n(ng)-1))
1194 awrk(i,n(ng),nnew)=dc(i,n(ng))
1196 awrk(i,n(ng),nnew)=awrk(i,n(ng),nnew)*umask(i,j)
1201 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1202 awrk(i,k,nnew)=dc(i,k)
1204 awrk(i,k,nnew)=awrk(i,k,nnew)*umask(i,j)
1230 IF (lconvolve(boundary))
THEN
1231 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1235 fs(j,k)=fc(j,k)*(awrk(j,k+1,nold)- &
1238 fs(j,k)=fs(j,k)*umask(i,j)
1244 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1248 fs(i,k)=fc(i,k)*(awrk(i,k+1,nold)- &
1251 fs(i,k)=fs(i,k)*umask(i,j)
1262 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1265 awrk(j,k,nnew)=awrk(j,k,nold)+ &
1266 & ohz(j,k)*(fs(j,k )- &
1270 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1273 awrk(i,k,nnew)=awrk(i,k,nold)+ &
1274 & ohz(i,k)*(fs(i,k )- &
1294 IF (lconvolve(boundary))
THEN
1295 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1298 a(j,k)=awrk(j,k,nold)
1301 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1304 a(i,k)=awrk(i,k,nold)
1310 & lbij, ubij, 1, n(ng), &
1314 & lbij, ubij, 1, n(ng), &
1326 & edge, LBij, UBij, &
1327 & LBi, UBi, LBj, UBj, LBk, UBk, &
1328 & IminS, ImaxS, JminS, JmaxS, &
1329 & Nghost, NHsteps, NVsteps, &
1330 & DTsizeH, DTsizeV, &
1332 & pm, pn, pmon_p, pnom_r, &
1350 integer,
intent(in) :: ng, tile, model, boundary
1351 integer,
intent(in) :: edge(4)
1352 integer,
intent(in) :: LBij, UBij
1353 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
1354 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
1355 integer,
intent(in) :: Nghost, NHsteps, NVsteps
1357 real(r8),
intent(in) :: DTsizeH, DTsizeV
1359# ifdef ASSUMED_SHAPE
1360 real(r8),
intent(in) :: pm(LBi:,LBj:)
1361 real(r8),
intent(in) :: pn(LBi:,LBj:)
1362 real(r8),
intent(in) :: pmon_p(LBi:,LBj:)
1363 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
1365 real(r8),
intent(in) :: vmask(LBi:,LBj:)
1366 real(r8),
intent(in) :: pmask(LBi:,LBj:)
1368 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
1369 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
1371 real(r8),
intent(in) :: Kh(LBi:,LBj:)
1372 real(r8),
intent(in) :: Kv(LBi:,LBj:,0:)
1373 real(r8),
intent(inout) :: A(LBij:,LBk:)
1375 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
1376 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
1377 real(r8),
intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
1378 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
1380 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
1381 real(r8),
intent(in) :: pmask(LBi:UBi,LBj:UBj)
1383 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
1384 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
1386 real(r8),
intent(in) :: Kh(LBi:UBi,LBj:UBj)
1387 real(r8),
intent(in) :: Kv(LBi:UBi,LBj:UBj,0:UBk)
1388 real(r8),
intent(inout) :: A(LBij:UBij,LBk:UBk)
1393 logical,
dimension(4) :: Lconvolve
1395 integer :: Nnew, Nold, Nsav, i, j, k, step
1397 real(r8) :: cff, cff1
1399 real(r8),
dimension(LBij:UBij,LBk:UBk,2) :: Awrk
1401 real(r8),
dimension(JminS:JmaxS,LBk:UBk) :: FE
1402 real(r8),
dimension(IminS:ImaxS,LBk:UBk) :: FX
1403 real(r8),
dimension(LBij:UBij) :: Hfac
1405# ifndef SPLINES_VCONV
1406 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
1408# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1409 real(r8),
dimension(LBij:UBij,N(ng)) :: oHz
1411# if defined IMPLICIT_VCONV || defined SPLINES_VCONV
1412 real(r8),
dimension(LBij:UBij,0:N(ng)) :: BC
1413 real(r8),
dimension(LBij:UBij,0:N(ng)) :: CF
1414 real(r8),
dimension(LBij:UBij,0:N(ng)) :: DC
1415# ifdef SPLINES_VCONV
1416 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FC
1419 real(r8),
dimension(LBij:UBij,0:N(ng)) :: FS
1423# include "set_bounds.h"
1439 IF (lconvolve(boundary))
THEN
1441 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1444 hfac(j)=cff*(pm(i,j-1)+pm(i,j))*(pn(i,j-1)+pn(i,j))
1446# ifndef SPLINES_VCONV
1449# ifdef IMPLICIT_VCONV
1450 fc(j,k)=-dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1451 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1452 & z_r(i,j-1,k )-z_r(i,j,k ))
1454 fc(j,k)=dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1455 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1456 & z_r(i,j-1,k )-z_r(i,j,k ))
1461# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1463 ohz(j,k)=2.0_r8/(hz(i,j-1,k)+hz(i,j,k))
1468 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1471 hfac(i)=cff*(pm(i,j-1)+pm(i,j))*(pn(i,j-1)+pn(i,j))
1473# ifndef SPLINES_VCONV
1476# ifdef IMPLICIT_VCONV
1477 fc(i,k)=-dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1478 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1479 & z_r(i,j-1,k )-z_r(i,j,k ))
1481 fc(i,k)=dtsizev*(kv(i,j-1,k)+kv(i,j,k))/ &
1482 & (z_r(i,j-1,k+1)+z_r(i,j,k+1)- &
1483 & z_r(i,j-1,k )-z_r(i,j,k ))
1488# if !defined IMPLICIT_VCONV || defined SPLINES_VCONV
1490 ohz(i,k)=2.0_r8/(hz(i,j-1,k)+hz(i,j,k))
1504 & lbij, ubij, 1, n(ng), &
1508 & lbij, ubij, 1, n(ng), &
1513 IF (lconvolve(boundary))
THEN
1514 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1517 awrk(j,k,nold)=a(j,k)
1520 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1523 awrk(i,k,nold)=a(i,k)
1537 IF (lconvolve(boundary))
THEN
1538 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1542 fe(j,k)=pnom_r(i,j)*kh(i,j)* &
1543 & (awrk(j+1,k,nold)- &
1547 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1551 fx(i,k)=pmon_p(i,j)*0.25_r8*(kh(i-1,j )+kh(i,j )+ &
1552 & kh(i-1,j-1)+kh(i,j-1))* &
1553 & (awrk(i ,k,nold)- &
1556 fx(i,k)=fx(i,k)*pmask(i,j)
1565 IF (lconvolve(boundary))
THEN
1566 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1569 awrk(j,k,nnew)=awrk(j,k,nold)+ &
1571 & (fe(j,k)-fe(j-1,k))
1574 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1577 awrk(i,k,nnew)=awrk(i,k,nold)+ &
1579 & (fx(i+1,k)-fx(i,k))
1588 & lbij, ubij, 1, n(ng), &
1592 & lbij, ubij, 1, n(ng), &
1606# ifdef IMPLICIT_VCONV
1607# ifdef SPLINES_VCONV
1620 IF (lconvolve(boundary))
THEN
1621 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1623 cff1=0.5_r8*(1.0_r8/6.0_r8)
1626 fc(j,k)=cff1*(hz(i,j-1,k )+hz(i,j,k ))- &
1627 & dtsizev*kv(i,j,k-1)*ohz(j,k )
1628 cf(j,k)=cff1*(hz(i,j-1,k+1)+hz(i,j,k+1))- &
1629 & dtsizev*kv(i,j,k+1)*ohz(j,k+1)
1634 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1636 cff1=0.5_r8*(1.0_r8/6.0_r8)
1639 fc(i,k)=cff1*(hz(i,j-1,k )+hz(i,j,k ))- &
1640 & dtsizev*kv(i,j,k-1)*ohz(i,k )
1641 cf(i,k)=cff1*(hz(i,j-1,k+1)+hz(i,j,k+1))- &
1642 & dtsizev*kv(i,j,k+1)*ohz(i,k+1)
1651 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1653 cff1=0.5_r8*(1.0_r8/3.0_r8)
1656 bc(j,k)=cff1*(hz(i,j-1,k )+hz(i,j,k )+ &
1657 & hz(i,j-1,k+1)+hz(i,j,k+1))+ &
1658 & dtsizev*kv(i,j,k)* &
1659 & (ohz(j,k)+ohz(j,k+1))
1660 cff=1.0_r8/(bc(j,k)-fc(j,k)*cf(j,k-1))
1662 dc(j,k)=cff*(awrk(j,k+1,nold)- &
1663 & awrk(j,k ,nold)- &
1664 & fc(j,k)*dc(j,k-1))
1667 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1669 cff1=0.5_r8*(1.0_r8/3.0_r8)
1672 bc(i,k)=cff1*(hz(i,j-1,k )+hz(i,j,k )+ &
1673 & hz(i,j-1,k+1)+hz(i,j,k+1))+ &
1674 & dtsizev*kv(i,j,k)* &
1675 & (ohz(i,k)+ohz(i,k+1))
1676 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
1678 dc(i,k)=cff*(awrk(i,k+1,nold)- &
1679 & awrk(i,k ,nold)- &
1680 & fc(i,k)*dc(i,k-1))
1687 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1694 dc(j,k)=dc(j,k)-cf(j,k)*dc(j,k+1)
1699 dc(j,k)=dc(j,k)*kv(i,j,k)
1700 awrk(j,k,nnew)=awrk(j,k,nold)+ &
1701 & dtsizev*ohz(j,k)* &
1702 & (dc(j,k)-dc(j,k-1))
1705 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1712 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1717 dc(i,k)=dc(i,k)*kv(i,j,k)
1718 awrk(i,k,nnew)=awrk(i,k,nold)+ &
1719 & dtsizev*ohz(i,k)* &
1720 & (dc(i,k)-dc(i,k-1))
1744 IF (lconvolve(boundary))
THEN
1745 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1749 cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))
1750 bc(j,k)=cff-fc(j,k)-fc(j,k-1)
1751 dc(j,k)=awrk(j,k,nold)*cff
1754 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1758 cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))
1759 bc(i,k)=cff-fc(i,k)-fc(i,k-1)
1760 dc(i,k)=awrk(i,k,nold)*cff
1767 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1775 cff=1.0_r8/(bc(j,k)-fc(j,k-1)*cf(j,k-1))
1777 dc(j,k)=cff*(dc(j,k)-fc(j,k-1)*dc(j,k-1))
1780 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1788 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
1790 dc(i,k)=cff*(dc(i,k)-fc(i,k-1)*dc(i,k-1))
1797 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1800 dc(j,n(ng))=(dc(j,n(ng))- &
1801 & fc(j,n(ng)-1)*dc(j,n(ng)-1))/ &
1803 & fc(j,n(ng)-1)*cf(j,n(ng)-1))
1804 awrk(j,n(ng),nnew)=dc(j,n(ng))
1806 awrk(j,n(ng),nnew)=awrk(j,n(ng),nnew)*vmask(i,j)
1811 dc(j,k)=dc(j,k)-cf(j,k)*dc(j,k+1)
1812 awrk(j,k,nnew)=dc(j,k)
1814 awrk(j,k,nnew)=awrk(j,k,nnew)*vmask(i,j)
1818 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1821 dc(i,n(ng))=(dc(i,n(ng))- &
1822 & fc(i,n(ng)-1)*dc(i,n(ng)-1))/ &
1824 & fc(i,n(ng)-1)*cf(i,n(ng)-1))
1825 awrk(i,n(ng),nnew)=dc(i,n(ng))
1827 awrk(i,n(ng),nnew)=awrk(i,n(ng),nnew)*vmask(i,j)
1832 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1833 awrk(i,k,nnew)=dc(i,k)
1835 awrk(i,k,nnew)=awrk(i,k,nnew)*vmask(i,j)
1861 IF (lconvolve(boundary))
THEN
1862 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1866 fs(j,k)=fc(j,k)*(awrk(j,k+1,nold)- &
1869 fs(j,k)=fs(j,k)*vmask(i,j)
1875 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1879 fs(i,k)=fc(i,k)*(awrk(i,k+1,nold)- &
1882 fs(i,k)=fs(i,k)*vmask(i,j)
1893 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1896 awrk(j,k,nnew)=awrk(j,k,nold)+ &
1897 & ohz(j,k)*(fs(j,k )- &
1901 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1904 awrk(i,k,nnew)=awrk(i,k,nold)+ &
1905 & ohz(i,k)*(fs(i,k )- &
1925 IF (lconvolve(boundary))
THEN
1926 IF ((boundary.eq.
iwest).or.(boundary.eq.
ieast))
THEN
1929 a(j,k)=awrk(j,k,nold)
1932 ELSE IF ((boundary.eq.
isouth).or.(boundary.eq.
inorth))
THEN
1935 a(i,k)=awrk(i,k,nold)
1941 & lbij, ubij, 1, n(ng), &
1945 & lbij, ubij, 1, n(ng), &