4#if defined BALANCE_OPERATOR && defined ZETA_ELLIPTIC
71 integer,
intent(in) :: ng, tile, lbck
90 & lbi, ubi, lbj, ubj, &
91 & imins, imaxs, jmins, jmaxs, &
95 &
grid(ng) % pmon_r, &
96 &
grid(ng) % pnom_r, &
97 &
grid(ng) % pmon_u, &
98 &
grid(ng) % pnom_v, &
106 &
grid(ng) % rmask, &
107 &
grid(ng) % umask, &
108 &
grid(ng) % vmask, &
115 &
ocean(ng) % zeta, &
123 & LBi, UBi, LBj, UBj, &
124 & IminS, ImaxS, JminS, JmaxS, &
126 & pm, pn, pmon_r, pnom_r, &
127 & pmon_u, pnom_v, h, &
132 & rmask, umask, vmask, &
135 & alpha, beta, rho, &
154 integer,
intent(in) :: ng, tile
155 integer,
intent(in) :: LBi, UBi, LBj, UBj
156 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
157 integer,
intent(in) :: Lbck
160 real(r8),
intent(in) :: pm(LBi:,LBj:)
161 real(r8),
intent(in) :: pn(LBi:,LBj:)
162 real(r8),
intent(in) :: pmon_r(LBi:,LBj:)
163 real(r8),
intent(in) :: pnom_r(LBi:,LBj:)
164 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
165 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
166 real(r8),
intent(in) :: h(LBi:,LBj:)
168 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
169 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
170 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
173 real(r8),
intent(in) :: rmask(LBi:,LBj:)
174 real(r8),
intent(in) :: umask(LBi:,LBj:)
175 real(r8),
intent(in) :: vmask(LBi:,LBj:)
178 real(r8),
intent(in) :: alpha(LBi:,LBj:)
179 real(r8),
intent(in) :: beta(LBi:,LBj:)
180 real(r8),
intent(in) :: rho(LBi:,LBj:,:)
182 real(r8),
intent(inout) :: rhs_r2d(LBi:,LBj:)
183 real(r8),
intent(in) :: zeta(LBi:,LBj:,:)
185 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
186 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
187 real(r8),
intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
188 real(r8),
intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
189 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
190 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
193 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
194 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
195 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
198 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
199 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
200 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
203 real(r8),
intent(in) :: alpha(LBi:UBi,LBj:UBj)
204 real(r8),
intent(in) :: beta(LBi:UBi,LBj:UBj)
205 real(r8),
intent(in) :: rho(LBi:UBi,LBj:UBj,N(ng))
207 real(r8),
intent(inout) :: rhs_r2d(LBi:UBi,LBj:UBj)
208 real(r8),
intent(in) :: zeta(LBi:UBi,LBj:UBj,:)
215 real(r8) :: fac, fac1, fac2, fac3, gamma
216 real(r8) :: cff, cff1, cff2, cff3, cff4
218 real(r8),
dimension(IminS:ImaxS) :: phie
219 real(r8),
dimension(IminS:ImaxS) :: phix
221 real(r8),
dimension(IminS:ImaxS,1:N(ng)) :: phi
223 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: gradPx
224 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: gradPy
226# include "set_bounds.h"
253 cff1=z_w(i,j ,n(ng))-z_r(i,j ,n(ng))+ &
254 & z_w(i,j-1,n(ng))-z_r(i,j-1,n(ng))
255 phie(i)=fac1*(rho(i,j,n(ng))-rho(i,j-1,n(ng)))*cff1+ &
256 & fac2*(zeta(i,j,lbck)-zeta(i,j-1,lbck))
265 cff1=1.0_r8/((z_r(i,j ,k+1)-z_r(i,j ,k))* &
266 & (z_r(i,j-1,k+1)-z_r(i,j-1,k)))
267 cff2=z_r(i,j ,k )-z_r(i,j-1,k )+ &
268 & z_r(i,j ,k+1)-z_r(i,j-1,k+1)
269 cff3=z_r(i,j ,k+1)-z_r(i,j ,k )- &
270 & z_r(i,j-1,k+1)+z_r(i,j-1,k )
271 gamma=0.125_r8*cff1*cff2*cff3
273 cff1=(1.0_r8+gamma)*(rho(i,j,k+1)-rho(i,j-1,k+1))+ &
274 & (1.0_r8-gamma)*(rho(i,j,k )-rho(i,j-1,k ))
275 cff2=rho(i,j,k+1)+rho(i,j-1,k+1)- &
276 & rho(i,j,k )-rho(i,j-1,k )
277 cff3=z_r(i,j,k+1)+z_r(i,j-1,k+1)- &
278 & z_r(i,j,k )-z_r(i,j-1,k )
279 cff4=(1.0_r8+gamma)*(z_r(i,j,k+1)-z_r(i,j-1,k+1))+ &
280 & (1.0_r8-gamma)*(z_r(i,j,k )-z_r(i,j-1,k ))
281 phie(i)=phie(i)+fac3*(cff1*cff3-cff2*cff4)
290 cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))*phi(i,k)
294 gradpy(i,j)=gradpy(i,j)+cff
304 cff1=z_w(i ,j,n(ng))-z_r(i ,j,n(ng))+ &
305 & z_w(i-1,j,n(ng))-z_r(i-1,j,n(ng))
306 phix(i)=fac1*(rho(i,j,n(ng))-rho(i-1,j,n(ng)))*cff1+ &
307 & fac2*(zeta(i,j,lbck)-zeta(i-1,j,lbck))
316 cff1=1.0_r8/((z_r(i ,j,k+1)-z_r(i ,j,k))* &
317 & (z_r(i-1,j,k+1)-z_r(i-1,j,k)))
318 cff2=z_r(i ,j,k )-z_r(i-1,j,k )+ &
319 & z_r(i ,j,k+1)-z_r(i-1,j,k+1)
320 cff3=z_r(i ,j,k+1)-z_r(i ,j,k )- &
321 & z_r(i-1,j,k+1)+z_r(i-1,j,k )
322 gamma=0.125_r8*cff1*cff2*cff3
324 cff1=(1.0_r8+gamma)*(rho(i,j,k+1)-rho(i-1,j,k+1))+ &
325 & (1.0_r8-gamma)*(rho(i,j,k )-rho(i-1,j,k ))
326 cff2=rho(i,j,k+1)+rho(i-1,j,k+1)- &
327 & rho(i,j,k )-rho(i-1,j,k )
328 cff3=z_r(i,j,k+1)+z_r(i-1,j,k+1)- &
329 & z_r(i,j,k )-z_r(i-1,j,k )
330 cff4=(1.0_r8+gamma)*(z_r(i,j,k+1)-z_r(i-1,j,k+1))+ &
331 & (1.0_r8-gamma)*(z_r(i,j,k )-z_r(i-1,j,k ))
332 phix(i)=phix(i)+fac3*(cff1*cff3-cff2*cff4)
341 cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))*phi(i,k)
345 gradpx(i,j)=gradpx(i,j)+cff
353 & imins, imaxs, jmins, jmaxs, &
356 & imins, imaxs, jmins, jmaxs, &
364 rhs_r2d(i,j)=-pm(i,j)*pn(i,j)* &
365 & (pmon_u(i+1,j)*gradpx(i+1,j)- &
366 & pmon_u(i ,j)*gradpx(i ,j)+ &
367 & pnom_v(i,j+1)*gradpy(i,j+1)- &
368 & pnom_v(i,j )*gradpy(i,j ))
370 rhs_r2d(i,j)=rhs_r2d(i,j)*rmask(i,j)
376 & lbi, ubi, lbj, ubj, &
380 & lbi, ubi, lbj, ubj, &
391 SUBROUTINE biconj (ng, tile, model, Lbck)
406 integer,
intent(in) :: ng, tile, lbck, model
415 & lbi, ubi, lbj, ubj, &
416 & imins, imaxs, jmins, jmaxs, &
419 &
grid(ng) % pmon_u, &
420 &
grid(ng) % pnom_v, &
424 &
grid(ng) % umask, &
425 &
grid(ng) % vmask, &
426 &
grid(ng) % rmask, &
438 &
ocean(ng) % zeta, &
447 & LBi, UBi, LBj, UBj, &
448 & IminS, ImaxS, JminS, JmaxS, &
450 & h, pmon_u, pnom_v, pm, pn, &
452 & umask, vmask, rmask, &
454 & bc_ak, bc_bk, zdf1, zdf2, zdf3, &
455 & pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, &
456 & zeta, r2d_ref, rhs_r2d)
473 integer,
intent(in) :: ng, tile, model
474 integer,
intent(in) :: LBi, UBi, LBj, UBj
475 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
476 integer,
intent(in) :: Lbck
480 real(r8),
intent(in) :: umask(LBi:,LBj:)
481 real(r8),
intent(in) :: vmask(LBi:,LBj:)
482 real(r8),
intent(in) :: rmask(LBi:,LBj:)
484 real(r8),
intent(in) :: h(LBi:,LBj:)
485 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
486 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
487 real(r8),
intent(in) :: pm(LBi:,LBj:)
488 real(r8),
intent(in) :: pn(LBi:,LBj:)
489 real(r8),
intent(in) :: zeta(LBi:,LBj:,:)
490 real(r8),
intent(inout) :: bc_ak(:)
491 real(r8),
intent(inout) :: bc_bk(:)
492 real(r8),
intent(inout) :: zdf1(:)
493 real(r8),
intent(inout) :: zdf2(:)
494 real(r8),
intent(inout) :: zdf3(:)
495 real(r8),
intent(inout) :: pc_r2d(LBi:,LBj:)
496 real(r8),
intent(inout) :: r_r2d(LBi:,LBj:,:)
497 real(r8),
intent(inout) :: br_r2d(LBi:,LBj:,:)
498 real(r8),
intent(inout) :: p_r2d(LBi:,LBj:,:)
499 real(r8),
intent(inout) :: bp_r2d(LBi:,LBj:,:)
500 real(r8),
intent(inout) :: rhs_r2d(LBi:,LBj:)
502 real(r8),
intent(inout) :: r2d_ref(LBi:,LBj:)
505 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
506 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
507 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
509 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
510 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
511 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
512 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
513 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
514 real(r8),
intent(in) :: zeta(LBi:UBi,LBj:UBj,:)
515 real(r8),
intent(inout) :: bc_ak(Nbico(ng))
516 real(r8),
intent(inout) :: bc_bk(Nbico(ng))
517 real(r8),
intent(inout) :: zdf1(Nbico(ng))
518 real(r8),
intent(inout) :: zdf2(Nbico(ng))
519 real(r8),
intent(inout) :: zdf3(Nbico(ng))
520 real(r8),
intent(inout) :: pc_r2d(LBi:UBi,LBj:UBj)
521 real(r8),
intent(inout) :: r_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
522 real(r8),
intent(inout) :: br_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
523 real(r8),
intent(inout) :: p_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
524 real(r8),
intent(inout) :: bp_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
525 real(r8),
intent(inout) :: rhs_r2d(LBi:UBi,LBj:UBj)
527 real(r8),
intent(inout) :: r2d_ref(LBi:UBi,LBj:UBj)
536 real(r8) :: error, zdf4, zdf5
538 real(r8),
dimension(LBi:UBi,LBj:UBj) :: bv_r2d
539 real(r8),
dimension(LBi:UBi,LBj:UBj) :: v_r2d
540 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z1_r2d
541 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z2_r2d
542 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z3_r2d
544# include "set_bounds.h"
566 r2d_ref(i,j)=zeta(i,j,lbck)
568 r2d_ref(i,j)=r2d_ref(i,j)*rmask(i,j)
574 & lbi, ubi, lbj, ubj, &
578 & lbi, ubi, lbj, ubj, &
590 & lbi, ubi, lbj, ubj, &
591 & imins, imaxs, jmins, jmaxs, &
593 & umask, vmask, rmask, &
596 & pmon_u, pnom_v, pm, pn, &
597 & pc_r2d, r2d_ref, z1_r2d)
604 r_r2d(i,j,1)=rhs_r2d(i,j)-z1_r2d(i,j)
605 br_r2d(i,j,1)=r_r2d(i,j,1)
611 p_r2d(i,j,1)=r_r2d(i,j,1)/pc_r2d(i,j)
612 bp_r2d(i,j,1)=br_r2d(i,j,1)/pc_r2d(i,j)
620 iterate :
DO it=1,nbico(ng)-1
624 z1_r2d(i,j)=p_r2d(i,j,it)
629 & lbi, ubi, lbj, ubj, &
633 & lbi, ubi, lbj, ubj, &
644 & lbi, ubi, lbj, ubj, &
645 & imins, imaxs, jmins, jmaxs, &
647 & umask, vmask, rmask, &
650 & pmon_u, pnom_v, pm, pn, &
651 & pc_r2d, z1_r2d, v_r2d)
657 z1_r2d(i,j)=r_r2d(i,j,it)/pc_r2d(i,j)
658 z2_r2d(i,j)=br_r2d(i,j,it)
659 z3_r2d(i,j)=bp_r2d(i,j,it)
664 & lbi, ubi, lbj, ubj, &
672 & lbi, ubi, lbj, ubj, &
679 bc_ak(it)=zdf1(it)/zdf2(it)
685 r2d_ref(i,j)=r2d_ref(i,j)+bc_ak(it)*p_r2d(i,j,it)
693 IF (it.eq.nbico(ng)-1)
THEN
696 & lbi, ubi, lbj, ubj, &
700 & lbi, ubi, lbj, ubj, &
711 & lbi, ubi, lbj, ubj, &
712 & imins, imaxs, jmins, jmaxs, &
714 & umask, vmask, rmask, &
717 & pmon_u, pnom_v, pm, pn, &
718 & pc_r2d, r2d_ref, bv_r2d)
724 bv_r2d(i,j)=bv_r2d(i,j)-rhs_r2d(i,j)
729 & lbi, ubi, lbj, ubj, &
737 & lbi, ubi, lbj, ubj, &
745 error=sqrt(zdf4/zdf5)
747 10
FORMAT (/,
' BICONJ - balance operator, error in ', &
748 &
'reference free-surface = ',1p,e14.7)
758 z1_r2d(i,j)=bp_r2d(i,j,it)
763 & lbi, ubi, lbj, ubj, &
767 & lbi, ubi, lbj, ubj, &
782 & lbi, ubi, lbj, ubj, &
783 & imins, imaxs, jmins, jmaxs, &
785 & umask, vmask, rmask, &
788 & pmon_u, pnom_v, pm, pn, &
789 & pc_r2d, z1_r2d, bv_r2d)
793 & lbi, ubi, lbj, ubj, &
799 & lbi, ubi, lbj, ubj, &
806 r_r2d(i,j,it+1)=r_r2d(i,j,it)-bc_ak(it)*v_r2d(i,j)
807 br_r2d(i,j,it+1)=br_r2d(i,j,it)-bc_ak(it)*bv_r2d(i,j)
815 z1_r2d(i,j)=r_r2d(i,j,it+1)/pc_r2d(i,j)
816 z2_r2d(i,j)=br_r2d(i,j,it+1)
821 & lbi, ubi, lbj, ubj, &
828 bc_bk(it)=zdf3(it)/zdf1(it)
835 p_r2d(i,j,it+1)=r_r2d(i,j,it+1)/pc_r2d(i,j)+ &
836 & bc_bk(it)*p_r2d(i,j,it)
837 bp_r2d(i,j,it+1)=br_r2d(i,j,it+1)/pc_r2d(i,j)+ &
838 & bc_bk(it)*bp_r2d(i,j,it)
851 & LBi, UBi, LBj, UBj, &
852 & IminS, ImaxS, JminS, JmaxS, &
854 & umask, vmask, rmask, &
857 & pmon_u, pnom_v, pm, pn, &
868 integer,
intent(in) :: ng, tile, Lbck
869 integer,
intent(in) :: LBi, UBi, LBj, UBj
870 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
872 logical,
intent(in) :: Ltrans
876 real(r8),
intent(in) :: umask(LBi:,LBj:)
877 real(r8),
intent(in) :: vmask(LBi:,LBj:)
878 real(r8),
intent(in) :: rmask(LBi:,LBj:)
880 real(r8),
intent(in) :: h(LBi:,LBj:)
881 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
882 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
883 real(r8),
intent(in) :: pm(LBi:,LBj:)
884 real(r8),
intent(in) :: pn(LBi:,LBj:)
885 real(r8),
intent(inout) :: pc_r2d(LBi:,LBj:)
886 real(r8),
intent(inout) :: r2d_in(LBi:,LBj:)
888 real(r8),
intent(out) :: r2d_out(LBi:,LBj:)
891 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
892 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
893 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
895 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
896 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
897 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
898 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
899 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
900 real(r8),
intent(inout) :: r2d_in(LBi:UBi,LBj:UBj)
902 real(r8),
intent(out) :: r2d_out(LBi:UBi,LBj:UBj)
911 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FE
912 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: FX
914# include "set_bounds.h"
937 fac=pm(i,j)*pn(i,j)*r2d_in(i,j)
941 fx(i ,j )=fx(i ,j )-fac
942 fx(i+1,j )=fx(i+1,j )+fac
943 fe(i ,j )=fe(i ,j )-fac
944 fe(i ,j+1)=fe(i ,j+1)+fac
953 fac=cff*pnom_v(i,j)*(h(i,j)+h(i,j-1))*fe(i,j)
957 r2d_out(i,j-1)=r2d_out(i,j-1)-fac
958 r2d_out(i,j )=r2d_out(i,j )+fac
966 fac=cff*pmon_u(i,j)*(h(i,j)+h(i-1,j))*fx(i,j)
970 r2d_out(i-1,j)=r2d_out(i-1,j)-fac
971 r2d_out(i ,j)=r2d_out(i ,j)+fac
984 fx(i,j)=cff*pmon_u(i,j)*(h(i,j)+h(i-1,j))* &
985 & (r2d_in(i,j)-r2d_in(i-1,j))
987 fx(i,j)=fx(i,j)*umask(i,j)
994 fe(i,j)=cff*pnom_v(i,j)*(h(i,j)+h(i,j-1))* &
995 & (r2d_in(i,j)-r2d_in(i,j-1))
997 fe(i,j)=fe(i,j)*vmask(i,j)
1004 r2d_out(i,j)=pm(i,j)*pn(i,j)* &
1005 & (fx(i+1,j)-fx(i,j)+ &
1006 & fe(i,j+1)-fe(i,j))
1008 r2d_out(i,j)=r2d_out(i,j)*rmask(i,j)
1020 pc_r2d(i,j)=-pm(i,j)*pn(i,j)* &
1021 & cff*(pnom_v(i ,j+1)*(h(i ,j+1)+h(i ,j ))+ &
1022 & pnom_v(i ,j )*(h(i ,j )+h(i ,j-1))+ &
1023 & pmon_u(i+1,j )*(h(i+1,j )+h(i ,j ))+ &
1024 & pmon_u(i ,j )*(h(i ,j )+h(i-1,j )))
1034 & LBi, UBi, LBj, UBj, &
1045 integer,
intent(in) :: ng, tile
1046 integer,
intent(in) :: lbi, ubi, lbj, ubj
1048# ifdef ASSUMED_SHAPE
1049 real(r8),
intent(inout) :: a(lbi:,lbj:)
1051 real(r8),
intent(inout) :: a(lbi:ubi,lbj:ubj)
1058# include "set_bounds.h"
1065 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1068 a(iend+1,j)=a(iend,j)
1074 IF (
domain(ng)%Western_Edge(tile))
THEN
1077 a(istr-1,j)=a(istr,j)
1090 IF (
domain(ng)%Northern_Edge(tile))
THEN
1093 a(i,jend+1)=a(i,jend)
1099 IF (
domain(ng)%Southern_Edge(tile))
THEN
1102 a(i,jstr-1)=a(i,jstr)
1115 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1116 a(istr-1,jstr-1)=0.5_r8*(a(istr ,jstr-1)+ &
1119 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1120 a(iend+1,jstr-1)=0.5_r8*(a(iend ,jstr-1)+ &
1123 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1124 a(istr-1,jend+1)=0.5_r8*(a(istr-1,jend )+ &
1127 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1128 a(iend+1,jend+1)=0.5_r8*(a(iend+1,jend )+ &
1139 & lbi, ubi, lbj, ubj, &
1149 & LBi, UBi, LBj, UBj, &
1161 integer,
intent(in) :: ng, tile
1162 integer,
intent(in) :: lbi, ubi, lbj, ubj
1165 real(r8),
intent(inout) :: a(lbi:,lbj:)
1167 real(r8),
intent(inout) :: a(lbi:ubi,lbj:ubj)
1174#include "set_bounds.h"
1181 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1186 IF (
domain(ng)%Western_Edge(tile))
THEN
1199 IF (
domain(ng)%Northern_Edge(tile))
THEN
1205 IF (
domain(ng)%Southern_Edge(tile))
THEN
1217 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1218 a(istr ,jstr-1)=0.5_r8*(a(istr+1,jstr-1)+ &
1221 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1222 a(iend+1,jstr-1)=0.5_r8*(a(iend ,jstr-1)+ &
1225 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1226 a(istr ,jend+1)=0.5_r8*(a(istr ,jend )+ &
1229 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1230 a(iend+1,jend+1)=0.5_r8*(a(iend+1,jend )+ &
1241 & lbi, ubi, lbj, ubj, &
1251 & LBi, UBi, LBj, UBj, &
1263 integer,
intent(in) :: ng, tile
1264 integer,
intent(in) :: lbi, ubi, lbj, ubj
1267 real(r8),
intent(inout) :: a(lbi:,lbj:)
1269 real(r8),
intent(inout) :: a(lbi:ubi,lbj:ubj)
1276#include "set_bounds.h"
1284 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1290 IF (
domain(ng)%Western_Edge(tile))
THEN
1302 IF (
domain(ng)%Northern_Edge(tile))
THEN
1307 IF (
domain(ng)%Southern_Edge(tile))
THEN
1319 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
1320 a(istr-1,jstr )=0.5_r8*(a(istr ,jstr )+ &
1323 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
1324 a(iend+1,jstr )=0.5_r8*(a(iend ,jstr )+ &
1327 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
1328 a(istr-1,jend+1)=0.5_r8*(a(istr-1,jend )+ &
1331 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
1332 a(iend+1,jend+1)=0.5_r8*(a(iend+1,jend )+ &
1343 & lbi, ubi, lbj, ubj, &
1353 & LBi, UBi, LBj, UBj, &
1372 integer,
intent(in) :: ng, tile, model
1373 integer,
intent(in) :: LBi, UBi, LBj, UBj
1375# ifdef ASSUMED_SHAPE
1377 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1379 real(r8),
intent(in) :: s1_zeta(LBi:,LBj:)
1380 real(r8),
intent(in) :: s2_zeta(LBi:,LBj:)
1383 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1385 real(r8),
intent(in) :: s1_zeta(LBi:UBi,LBj:UBj)
1386 real(r8),
intent(in) :: s2_zeta(LBi:UBi,LBj:UBj)
1389 real(r8),
intent(out) :: DotProd
1393 integer :: NSUB, i, j
1396 real(r8) :: my_DotProd
1398 character (len=3) :: op_handle
1401# include "set_bounds.h"
1411 cff=s1_zeta(i,j)*s2_zeta(i,j)
1415 my_dotprod=my_dotprod+cff
1426 IF (
domain(ng)%SouthWest_Corner(tile).and. &
1427 &
domain(ng)%NorthEast_Corner(tile))
THEN
1437 dotprod=dotprod+my_dotprod
1443 CALL mp_reduce (ng, model, 1, dotprod, op_handle)
1454 & LBi, UBi, LBj, UBj, &
1455 & IminS, ImaxS, JminS, JmaxS, &
1457 & h, pmon_u, pnom_v, pm, pn, &
1459 & umask, vmask, rmask, &
1461 & bc_ak, bc_bk, zdf1, zdf2, zdf3, &
1462 & pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, &
1463 & tl_r2d_ref, tl_rhs_r2d)
1479 integer,
intent(in) :: ng, tile, model
1480 integer,
intent(in) :: lbi, ubi, lbj, ubj
1481 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
1482 integer,
intent(in) :: lbck
1484# ifdef ASSUMED_SHAPE
1486 real(r8),
intent(in) :: umask(lbi:,lbj:)
1487 real(r8),
intent(in) :: vmask(lbi:,lbj:)
1488 real(r8),
intent(in) :: rmask(lbi:,lbj:)
1490 real(r8),
intent(in) :: h(lbi:,lbj:)
1491 real(r8),
intent(in) :: pmon_u(lbi:,lbj:)
1492 real(r8),
intent(in) :: pnom_v(lbi:,lbj:)
1493 real(r8),
intent(in) :: pm(lbi:,lbj:)
1494 real(r8),
intent(in) :: pn(lbi:,lbj:)
1495 real(r8),
intent(in) :: bc_ak(:)
1496 real(r8),
intent(in) :: bc_bk(:)
1497 real(r8),
intent(in) :: zdf1(:)
1498 real(r8),
intent(in) :: zdf2(:)
1499 real(r8),
intent(in) :: zdf3(:)
1501 real(r8),
intent(inout) :: pc_r2d(lbi:,lbj:)
1502 real(r8),
intent(inout) :: r_r2d(lbi:,lbj:,:)
1503 real(r8),
intent(inout) :: br_r2d(lbi:,lbj:,:)
1504 real(r8),
intent(inout) :: p_r2d(lbi:,lbj:,:)
1505 real(r8),
intent(inout) :: bp_r2d(lbi:,lbj:,:)
1506 real(r8),
intent(inout) :: tl_rhs_r2d(lbi:,lbj:)
1507 real(r8),
intent(inout) :: tl_r2d_ref(lbi:,lbj:)
1510 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
1511 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
1512 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
1514 real(r8),
intent(in) :: h(lbi:ubi,lbj:ubj)
1515 real(r8),
intent(in) :: pmon_u(lbi:ubi,lbj:ubj)
1516 real(r8),
intent(in) :: pnom_v(lbi:ubi,lbj:ubj)
1517 real(r8),
intent(in) :: pm(lbi:ubi,lbj:ubj)
1518 real(r8),
intent(in) :: pn(lbi:ubi,lbj:ubj)
1520 real(r8),
intent(inout) :: bc_ak(
nbico(ng))
1521 real(r8),
intent(inout) :: bc_bk(
nbico(ng))
1522 real(r8),
intent(inout) :: zdf1(
nbico(ng))
1523 real(r8),
intent(inout) :: zdf2(
nbico(ng))
1524 real(r8),
intent(inout) :: zdf3(
nbico(ng))
1525 real(r8),
intent(inout) :: pc_r2d(lbi:ubi,lbj:ubj)
1526 real(r8),
intent(inout) :: r_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
1527 real(r8),
intent(inout) :: br_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
1528 real(r8),
intent(inout) :: p_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
1529 real(r8),
intent(inout) :: tl_bp_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
1530 real(r8),
intent(inout) :: tl_rhs_r2d(lbi:ubi,lbj:ubj)
1531 real(r8),
intent(inout) :: tl_r2d_ref(lbi:ubi,lbj:ubj)
1540 real(r8) :: tl_zdf1, tl_zdf2, tl_zdf3, tl_bc_ak, tl_bc_bk
1542 real(r8),
dimension(LBi:UBi,LBj:UBj) :: bv_r2d
1543 real(r8),
dimension(LBi:UBi,LBj:UBj) :: v_r2d
1544 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z1_r2d
1545 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z2_r2d
1546 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z3_r2d
1548 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_bp_r2d
1549 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_br_r2d
1550 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_bv_r2d
1551 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_p_r2d
1552 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_r_r2d
1553 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_v_r2d
1554 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_z1_r2d
1555 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_z2_r2d
1556 real(r8),
dimension(LBi:UBi,LBj:UBj) :: tl_z3_r2d
1558# include "set_bounds.h"
1574 tl_bp_r2d(i,j)=0.0_r8
1575 tl_br_r2d(i,j)=0.0_r8
1576 tl_bv_r2d(i,j)=0.0_r8
1577 tl_p_r2d(i,j)=0.0_r8
1578 tl_r_r2d(i,j)=0.0_r8
1579 tl_v_r2d(i,j)=0.0_r8
1580 tl_z1_r2d(i,j)=0.0_r8
1581 tl_z2_r2d(i,j)=0.0_r8
1582 tl_z3_r2d(i,j)=0.0_r8
1590 & lbi, ubi, lbj, ubj, &
1594 & lbi, ubi, lbj, ubj, &
1602 & lbi, ubi, lbj, ubj, &
1603 & imins, imaxs, jmins, jmaxs, &
1605 & umask, vmask, rmask, &
1608 & pmon_u, pnom_v, pm, pn, &
1609 & pc_r2d, tl_r2d_ref, tl_z1_r2d)
1617 tl_r_r2d(i,j)=tl_rhs_r2d(i,j)-tl_z1_r2d(i,j)
1618 tl_br_r2d(i,j)=tl_r_r2d(i,j)
1624 tl_p_r2d(i,j)=tl_r_r2d(i,j)/pc_r2d(i,j)
1625 tl_bp_r2d(i,j)=tl_br_r2d(i,j)/pc_r2d(i,j)
1633 iterate :
DO it=1,
nbico(ng)-1
1637 z1_r2d(i,j)=p_r2d(i,j,it)
1638 tl_z1_r2d(i,j)=tl_p_r2d(i,j)
1643 & lbi, ubi, lbj, ubj, &
1646 & lbi, ubi, lbj, ubj, &
1650 & lbi, ubi, lbj, ubj, &
1662 & lbi, ubi, lbj, ubj, &
1663 & imins, imaxs, jmins, jmaxs, &
1665 & umask, vmask, rmask, &
1668 & pmon_u, pnom_v, pm, pn, &
1669 & pc_r2d, z1_r2d, v_r2d)
1675 & lbi, ubi, lbj, ubj, &
1676 & imins, imaxs, jmins, jmaxs, &
1678 & umask, vmask, rmask, &
1681 & pmon_u, pnom_v, pm, pn, &
1682 & pc_r2d, tl_z1_r2d, tl_v_r2d)
1688 z1_r2d(i,j)=r_r2d(i,j,it)/pc_r2d(i,j)
1689 z2_r2d(i,j)=br_r2d(i,j,it)
1690 z3_r2d(i,j)=bp_r2d(i,j,it)
1691 tl_z1_r2d(i,j)=tl_r_r2d(i,j)/pc_r2d(i,j)
1692 tl_z2_r2d(i,j)=tl_br_r2d(i,j)
1693 tl_z3_r2d(i,j)=tl_bp_r2d(i,j)
1698 & lbi, ubi, lbj, ubj, &
1703 & z2_r2d, z1_r2d, tl_z2_r2d, tl_z1_r2d)
1706 & lbi, ubi, lbj, ubj, &
1711 & z3_r2d, v_r2d, tl_z3_r2d, tl_v_r2d)
1713 tl_bc_ak=tl_zdf1/zdf2(it)-tl_zdf2*bc_ak(it)/zdf2(it)
1719 tl_r2d_ref(i,j)=tl_r2d_ref(i,j)+ &
1720 & tl_bc_ak*p_r2d(i,j,it)+ &
1721 & bc_ak(it)*tl_p_r2d(i,j)
1731 z1_r2d(i,j)=bp_r2d(i,j,it)
1732 tl_z1_r2d(i,j)=tl_bp_r2d(i,j)
1733 tl_bv_r2d(i,j)=0.0_r8
1738 & lbi, ubi, lbj, ubj, &
1741 & lbi, ubi, lbj, ubj, &
1745 & lbi, ubi, lbj, ubj, &
1761 & lbi, ubi, lbj, ubj, &
1762 & imins, imaxs, jmins, jmaxs, &
1764 & umask, vmask, rmask, &
1767 & pmon_u, pnom_v, pm, pn, &
1768 & pc_r2d, z1_r2d, bv_r2d)
1772 & lbi, ubi, lbj, ubj, &
1773 & imins, imaxs, jmins, jmaxs, &
1775 & umask, vmask, rmask, &
1778 & pmon_u, pnom_v, pm, pn, &
1779 & pc_r2d, tl_bv_r2d, tl_z1_r2d)
1783 & lbi, ubi, lbj, ubj, &
1790 & lbi, ubi, lbj, ubj, &
1793 & lbi, ubi, lbj, ubj, &
1800 tl_r_r2d(i,j)=tl_r_r2d(i,j)- &
1801 & tl_bc_ak*v_r2d(i,j)-bc_ak(it)*tl_v_r2d(i,j)
1802 tl_br_r2d(i,j)=tl_br_r2d(i,j)- &
1803 & tl_bc_ak*bv_r2d(i,j)-bc_ak(it)*tl_bv_r2d(i,j)
1811 z1_r2d(i,j)=r_r2d(i,j,it+1)/pc_r2d(i,j)
1812 z2_r2d(i,j)=br_r2d(i,j,it+1)
1813 tl_z1_r2d(i,j)=tl_r_r2d(i,j)/pc_r2d(i,j)
1814 tl_z2_r2d(i,j)=tl_br_r2d(i,j)
1819 & lbi, ubi, lbj, ubj, &
1824 & z1_r2d, z2_r2d, tl_z1_r2d, tl_z2_r2d)
1826 tl_bc_bk=tl_zdf3/zdf1(it)-tl_zdf1*bc_bk(it)/zdf1(it)
1833 tl_p_r2d(i,j)=tl_r_r2d(i,j)/pc_r2d(i,j)+ &
1834 & tl_bc_bk*p_r2d(i,j,it)+ &
1835 & bc_bk(it)*tl_p_r2d(i,j)
1836 tl_bp_r2d(i,j)=tl_br_r2d(i,j)/pc_r2d(i,j)+ &
1837 & tl_bc_bk*bp_r2d(i,j,it)+ &
1838 & bc_bk(it)*tl_bp_r2d(i,j)
1851 & LBi, UBi, LBj, UBj, &
1852 & IminS, ImaxS, JminS, JmaxS, &
1854 & umask, vmask, rmask, &
1857 & pmon_u, pnom_v, pm, pn, &
1859 & tl_r2d_in, tl_r2d_out)
1868 integer,
intent(in) :: ng, tile, Lbck
1869 integer,
intent(in) :: LBi, UBi, LBj, UBj
1870 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
1872# ifdef ASSUMED_SHAPE
1874 real(r8),
intent(in) :: umask(LBi:,LBj:)
1875 real(r8),
intent(in) :: vmask(LBi:,LBj:)
1876 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1878 real(r8),
intent(in) :: h(LBi:,LBj:)
1879 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
1880 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
1881 real(r8),
intent(in) :: pm(LBi:,LBj:)
1882 real(r8),
intent(in) :: pn(LBi:,LBj:)
1883 real(r8),
intent(inout) :: pc_r2d(LBi:,LBj:)
1884 real(r8),
intent(inout) :: tl_r2d_in(LBi:,LBj:)
1886 real(r8),
intent(out) :: tl_r2d_out(LBi:,LBj:)
1889 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
1890 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
1891 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1893 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
1894 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
1895 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
1896 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
1897 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
1898 real(r8),
intent(inout) :: tl_r2d_in(LBi:UBi,LBj:UBj)
1900 real(r8),
intent(out) :: tl_r2d_out(LBi:UBi,LBj:UBj)
1907 real(r8) :: cff, tl_fac
1909 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FE
1910 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FX
1912# include "set_bounds.h"
1922 tl_fx(i,j)=cff*pmon_u(i,j)*(h(i,j)+h(i-1,j))* &
1923 & (tl_r2d_in(i,j)-tl_r2d_in(i-1,j))
1925 tl_fx(i,j)=tl_fx(i,j)*umask(i,j)
1932 tl_fe(i,j)=cff*pnom_v(i,j)*(h(i,j)+h(i,j-1))* &
1933 & (tl_r2d_in(i,j)-tl_r2d_in(i,j-1))
1935 tl_fe(i,j)=tl_fe(i,j)*vmask(i,j)
1942 tl_r2d_out(i,j)=pm(i,j)*pn(i,j)* &
1943 & (tl_fx(i+1,j)-tl_fx(i,j)+ &
1944 & tl_fe(i,j+1)-tl_fe(i,j))
1946 tl_r2d_out(i,j)=tl_r2d_out(i,j)*rmask(i,j)
1957 & LBi, UBi, LBj, UBj, &
1962 & s1_zeta, s2_zeta, &
1963 & tl_s1_zeta, tl_s2_zeta)
1977 integer,
intent(in) :: ng, tile, model
1978 integer,
intent(in) :: LBi, UBi, LBj, UBj
1980# ifdef ASSUMED_SHAPE
1982 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1984 real(r8),
intent(in) :: s1_zeta(LBi:,LBj:)
1985 real(r8),
intent(in) :: s2_zeta(LBi:,LBj:)
1986 real(r8),
intent(in) :: tl_s1_zeta(LBi:,LBj:)
1987 real(r8),
intent(in) :: tl_s2_zeta(LBi:,LBj:)
1990 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1992 real(r8),
intent(in) :: s1_zeta(LBi:UBi,LBj:UBj)
1993 real(r8),
intent(in) :: s2_zeta(LBi:UBi,LBj:UBj)
1994 real(r8),
intent(in) :: tl_s1_zeta(LBi:UBi,LBj:UBj)
1995 real(r8),
intent(in) :: tl_s2_zeta(LBi:UBi,LBj:UBj)
1998 real(r8),
intent(out) :: tl_DotProd
2002 integer :: NSUB, i, j
2005 real(r8) :: tl_my_DotProd
2007 character (len=3) :: op_handle
2010# include "set_bounds.h"
2016 tl_my_dotprod=0.0_r8
2020 tl_cff=tl_s1_zeta(i,j)*s2_zeta(i,j)+ &
2021 & s1_zeta(i,j)*tl_s2_zeta(i,j)
2023 tl_cff=tl_cff*rmask(i,j)
2025 tl_my_dotprod=tl_my_dotprod+tl_cff
2036 IF (
domain(ng)%SouthWest_Corner(tile).and. &
2037 &
domain(ng)%NorthEast_Corner(tile))
THEN
2047 tl_dotprod=tl_dotprod+tl_my_dotprod
2053 CALL mp_reduce (ng, model, 1, tl_dotprod, op_handle)
2064 & LBi, UBi, LBj, UBj, &
2065 & IminS, ImaxS, JminS, JmaxS, &
2067 & h, pmon_u, pnom_v, pm, pn, &
2069 & umask, vmask, rmask, &
2071 & bc_ak, bc_bk, zdf1, zdf2, zdf3, &
2072 & pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, &
2073 & ad_r2d_ref, ad_rhs_r2d)
2090 integer,
intent(in) :: ng, tile, model
2091 integer,
intent(in) :: lbi, ubi, lbj, ubj
2092 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
2093 integer,
intent(in) :: lbck
2095# ifdef ASSUMED_SHAPE
2097 real(r8),
intent(in) :: umask(lbi:,lbj:)
2098 real(r8),
intent(in) :: vmask(lbi:,lbj:)
2099 real(r8),
intent(in) :: rmask(lbi:,lbj:)
2101 real(r8),
intent(in) :: h(lbi:,lbj:)
2102 real(r8),
intent(in) :: pmon_u(lbi:,lbj:)
2103 real(r8),
intent(in) :: pnom_v(lbi:,lbj:)
2104 real(r8),
intent(in) :: pm(lbi:,lbj:)
2105 real(r8),
intent(in) :: pn(lbi:,lbj:)
2106 real(r8),
intent(in) :: bc_ak(:)
2107 real(r8),
intent(in) :: bc_bk(:)
2108 real(r8),
intent(in) :: zdf1(:)
2109 real(r8),
intent(in) :: zdf2(:)
2110 real(r8),
intent(in) :: zdf3(:)
2111 real(r8),
intent(inout) :: pc_r2d(lbi:,lbj:)
2112 real(r8),
intent(inout) :: r_r2d(lbi:,lbj:,:)
2113 real(r8),
intent(inout) :: br_r2d(lbi:,lbj:,:)
2114 real(r8),
intent(inout) :: p_r2d(lbi:,lbj:,:)
2115 real(r8),
intent(inout) :: bp_r2d(lbi:,lbj:,:)
2116 real(r8),
intent(inout) :: ad_rhs_r2d(lbi:,lbj:)
2118 real(r8),
intent(inout) :: ad_r2d_ref(lbi:,lbj:)
2121 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
2122 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
2123 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
2125 real(r8),
intent(in) :: h(lbi:ubi,lbj:ubj)
2126 real(r8),
intent(in) :: pmon_u(lbi:ubi,lbj:ubj)
2127 real(r8),
intent(in) :: pnom_v(lbi:ubi,lbj:ubj)
2128 real(r8),
intent(in) :: pm(lbi:ubi,lbj:ubj)
2129 real(r8),
intent(in) :: pn(lbi:ubi,lbj:ubj)
2130 real(r8),
intent(in) :: bc_ak(
nbico(ng))
2131 real(r8),
intent(in) :: bc_bk(
nbico(ng))
2132 real(r8),
intent(in) :: zdf1(
nbico(ng))
2133 real(r8),
intent(in) :: zdf2(
nbico(ng))
2134 real(r8),
intent(in) :: zdf3(
nbico(ng))
2135 real(r8),
intent(inout) :: pc_r2d(lbi:ubi,lbj:ubj)
2136 real(r8),
intent(inout) :: r_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
2137 real(r8),
intent(inout) :: br_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
2138 real(r8),
intent(inout) :: p_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
2139 real(r8),
intent(inout) :: ad_bp_r2d(lbi:ubi,lbj:ubj,
nbico(ng))
2140 real(r8),
intent(inout) :: ad_rhs_r2d(lbi:ubi,lbj:ubj)
2142 real(r8),
intent(inout) :: ad_r2d_ref(lbi:ubi,lbj:ubj)
2148 character (len=3) :: op_handle
2152 integer :: i, j, it, nsub
2154 real(r8) :: ad_zdf1, ad_zdf2, ad_zdf3, ad_bc_ak, ad_bc_bk
2155 real(r8) :: my_ad_bc_ak, my_ad_bc_bk
2157 real(r8),
dimension(LBi:UBi,LBj:UBj) :: bv_r2d
2158 real(r8),
dimension(LBi:UBi,LBj:UBj) :: v_r2d
2159 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z1_r2d
2160 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z2_r2d
2161 real(r8),
dimension(LBi:UBi,LBj:UBj) :: z3_r2d
2163 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_bp_r2d
2164 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_br_r2d
2165 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_bv_r2d
2166 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_p_r2d
2167 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_r_r2d
2168 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_v_r2d
2169 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_z1_r2d
2170 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_z2_r2d
2171 real(r8),
dimension(LBi:UBi,LBj:UBj) :: ad_z3_r2d
2173# include "set_bounds.h"
2189 ad_bp_r2d(i,j)=0.0_r8
2190 ad_br_r2d(i,j)=0.0_r8
2191 ad_bv_r2d(i,j)=0.0_r8
2192 ad_p_r2d(i,j)=0.0_r8
2193 ad_r_r2d(i,j)=0.0_r8
2194 ad_v_r2d(i,j)=0.0_r8
2195 ad_z1_r2d(i,j)=0.0_r8
2196 ad_z2_r2d(i,j)=0.0_r8
2197 ad_z3_r2d(i,j)=0.0_r8
2212 iterate :
DO it=
nbico(ng)-1,1,-1
2218 z1_r2d(i,j)=p_r2d(i,j,it)
2219 z2_r2d(i,j)=bp_r2d(i,j,it)
2224 & lbi, ubi, lbj, ubj, &
2227 & lbi, ubi, lbj, ubj, &
2231 & lbi, ubi, lbj, ubj, &
2243 & lbi, ubi, lbj, ubj, &
2244 & imins, imaxs, jmins, jmaxs, &
2246 & umask, vmask, rmask, &
2249 & pmon_u, pnom_v, pm, pn, &
2250 & pc_r2d, z1_r2d, v_r2d)
2257 & lbi, ubi, lbj, ubj, &
2258 & imins, imaxs, jmins, jmaxs, &
2260 & umask, vmask, rmask, &
2263 & pmon_u, pnom_v, pm, pn, &
2264 & pc_r2d, z2_r2d, bv_r2d)
2268 & lbi, ubi, lbj, ubj, &
2274 & lbi, ubi, lbj, ubj, &
2286 my_ad_bc_bk=my_ad_bc_bk+bp_r2d(i,j,it)*ad_bp_r2d(i,j)
2287 ad_br_r2d(i,j)=ad_br_r2d(i,j)+ad_bp_r2d(i,j)/pc_r2d(i,j)
2288 ad_bp_r2d(i,j)=bc_bk(it)*ad_bp_r2d(i,j)
2294 my_ad_bc_bk=my_ad_bc_bk+p_r2d(i,j,it)*ad_p_r2d(i,j)
2295 ad_r_r2d(i,j)=ad_r_r2d(i,j)+ad_p_r2d(i,j)/pc_r2d(i,j)
2296 ad_p_r2d(i,j)=bc_bk(it)*ad_p_r2d(i,j)
2305 IF (
domain(ng)%SouthWest_Corner(tile).and. &
2306 &
domain(ng)%NorthEast_Corner(tile))
THEN
2316 ad_bc_bk=ad_bc_bk+my_ad_bc_bk
2322 CALL mp_reduce (ng, model, 1, ad_bc_bk, op_handle)
2333 ad_zdf1=ad_zdf1-ad_bc_bk*bc_bk(it)/zdf1(it)
2334 ad_zdf3=ad_zdf3+ad_bc_bk/zdf1(it)
2339 z1_r2d(i,j)=r_r2d(i,j,it+1)/pc_r2d(i,j)
2340 z2_r2d(i,j)=br_r2d(i,j,it+1)
2345 & lbi, ubi, lbj, ubj, &
2350 & z1_r2d, z2_r2d, ad_z1_r2d, ad_z2_r2d)
2356 ad_br_r2d(i,j)=ad_br_r2d(i,j)+ad_z2_r2d(i,j)
2357 ad_z2_r2d(i,j)=0.0_r8
2360 ad_r_r2d(i,j)=ad_r_r2d(i,j)+ad_z1_r2d(i,j)/pc_r2d(i,j)
2361 ad_z1_r2d(i,j)=0.0_r8
2372 ad_bv_r2d(i,j)=ad_bv_r2d(i,j)-bc_ak(it)*ad_br_r2d(i,j)
2373 my_ad_bc_ak=my_ad_bc_ak-bv_r2d(i,j)*ad_br_r2d(i,j)
2377 ad_v_r2d(i,j)=ad_v_r2d(i,j)-bc_ak(it)*ad_r_r2d(i,j)
2378 my_ad_bc_ak=my_ad_bc_ak-v_r2d(i,j)*ad_r_r2d(i,j)
2386 & lbi, ubi, lbj, ubj, &
2390 & lbi, ubi, lbj, ubj, &
2397 & lbi, ubi, lbj, ubj, &
2398 & imins, imaxs, jmins, jmaxs, &
2400 & umask, vmask, rmask, &
2403 & pmon_u, pnom_v, pm, pn, &
2404 & pc_r2d, ad_bv_r2d, ad_z1_r2d)
2412 ad_bp_r2d(i,j)=ad_bp_r2d(i,j)+ad_z1_r2d(i,j)
2413 ad_z1_r2d(i,j)=0.0_r8
2414 ad_bv_r2d(i,j)=0.0_r8
2426 ad_p_r2d(i,j)=ad_p_r2d(i,j)+bc_ak(it)*ad_r2d_ref(i,j)
2427 my_ad_bc_ak=my_ad_bc_ak+p_r2d(i,j,it)*ad_r2d_ref(i,j)
2436 IF (
domain(ng)%SouthWest_Corner(tile).and. &
2437 &
domain(ng)%NorthEast_Corner(tile))
THEN
2447 ad_bc_ak=ad_bc_ak+my_ad_bc_ak
2453 CALL mp_reduce (ng, model, 1, ad_bc_ak, op_handle)
2464 ad_zdf2=ad_zdf2-ad_bc_ak*bc_ak(it)/zdf2(it)
2465 ad_zdf1=ad_zdf1+ad_bc_ak/zdf2(it)
2470 z1_r2d(i,j)=r_r2d(i,j,it)/pc_r2d(i,j)
2471 z2_r2d(i,j)=br_r2d(i,j,it)
2472 z3_r2d(i,j)=bp_r2d(i,j,it)
2477 & lbi, ubi, lbj, ubj, &
2482 & z3_r2d, v_r2d, ad_z3_r2d, ad_v_r2d)
2485 & lbi, ubi, lbj, ubj, &
2490 & z2_r2d, z1_r2d, ad_z2_r2d, ad_z1_r2d)
2496 ad_r_r2d(i,j)=ad_r_r2d(i,j)+ad_z1_r2d(i,j)/pc_r2d(i,j)
2497 ad_z1_r2d(i,j)=0.0_r8
2500 ad_br_r2d(i,j)=ad_br_r2d(i,j)+ad_z2_r2d(i,j)
2501 ad_z2_r2d(i,j)=0.0_r8
2504 ad_bp_r2d(i,j)=ad_bp_r2d(i,j)+ad_z3_r2d(i,j)
2505 ad_z3_r2d(i,j)=0.0_r8
2514 & lbi, ubi, lbj, ubj, &
2515 & imins, imaxs, jmins, jmaxs, &
2517 & umask, vmask, rmask, &
2520 & pmon_u, pnom_v, pm, pn, &
2521 & pc_r2d, ad_z1_r2d, ad_v_r2d)
2525 & lbi, ubi, lbj, ubj, &
2531 & lbi, ubi, lbj, ubj, &
2538 ad_p_r2d(i,j)=ad_p_r2d(i,j)+ad_z1_r2d(i,j)
2539 ad_z1_r2d(i,j)=0.0_r8
2553 ad_r_r2d(i,j)=ad_r_r2d(i,j)+ad_p_r2d(i,j)/pc_r2d(i,j)
2557 ad_br_r2d(i,j)=ad_br_r2d(i,j)+ad_bp_r2d(i,j)/pc_r2d(i,j)
2566 ad_r_r2d(i,j)=ad_r_r2d(i,j)+ad_br_r2d(i,j)
2570 ad_rhs_r2d(i,j)=ad_rhs_r2d(i,j)+ad_r_r2d(i,j)
2571 ad_z1_r2d(i,j)=ad_z1_r2d(i,j)-ad_r_r2d(i,j)
2572 ad_r_r2d(i,j)=0.0_r8
2581 & lbi, ubi, lbj, ubj, &
2582 & imins, imaxs, jmins, jmaxs, &
2584 & umask, vmask, rmask, &
2587 & pmon_u, pnom_v, pm, pn, &
2588 & pc_r2d, ad_r2d_ref, ad_z1_r2d)
2592 & lbi, ubi, lbj, ubj, &
2598 & lbi, ubi, lbj, ubj, &
2608 & LBi, UBi, LBj, UBj, &
2609 & IminS, ImaxS, JminS, JmaxS, &
2611 & umask, vmask, rmask, &
2614 & pmon_u, pnom_v, pm, pn, &
2616 & ad_r2d_in, ad_r2d_out)
2625 integer,
intent(in) :: ng, tile
2626 integer,
intent(in) :: LBi, UBi, LBj, UBj
2627 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
2628 integer,
intent(in) :: Lbck
2630# ifdef ASSUMED_SHAPE
2632 real(r8),
intent(in) :: umask(LBi:,LBj:)
2633 real(r8),
intent(in) :: vmask(LBi:,LBj:)
2634 real(r8),
intent(in) :: rmask(LBi:,LBj:)
2636 real(r8),
intent(in) :: h(LBi:,LBj:)
2637 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
2638 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
2639 real(r8),
intent(in) :: pm(LBi:,LBj:)
2640 real(r8),
intent(in) :: pn(LBi:,LBj:)
2641 real(r8),
intent(inout) :: pc_r2d(LBi:,LBj:)
2642 real(r8),
intent(inout) :: ad_r2d_in(LBi:,LBj:)
2644 real(r8),
intent(inout) :: ad_r2d_out(LBi:,LBj:)
2647 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
2648 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
2649 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
2651 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
2652 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
2653 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
2654 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
2655 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
2656 real(r8),
intent(inout) :: ad_r2d_in(LBi:UBi,LBj:UBj)
2658 real(r8),
intent(inout) :: ad_r2d_out(LBi:UBi,LBj:UBj)
2665 real(r8) :: adfac, cff
2667 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_FE
2668 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_FX
2670# include "set_bounds.h"
2694 ad_r2d_out(i,j)=ad_r2d_out(i,j)*rmask(i,j)
2700 adfac=pm(i,j)*pn(i,j)*ad_r2d_out(i,j)
2701 ad_fx(i ,j)=ad_fx(i ,j)-adfac
2702 ad_fx(i+1,j)=ad_fx(i+1,j)+adfac
2703 ad_fe(i,j+1)=ad_fe(i,j+1)+adfac
2704 ad_fe(i,j )=ad_fe(i,j )-adfac
2705 ad_r2d_out(i,j)=0.0_r8
2714 ad_fe(i,j)=ad_fe(i,j)*vmask(i,j)
2719 adfac=cff*pnom_v(i,j)*(h(i,j)+h(i,j-1))*ad_fe(i,j)
2720 ad_r2d_in(i,j-1)=ad_r2d_in(i,j-1)-adfac
2721 ad_r2d_in(i,j )=ad_r2d_in(i,j )+adfac
2731 ad_fx(i,j)=ad_fx(i,j)*umask(i,j)
2736 adfac=cff*pmon_u(i,j)*(h(i,j)+h(i-1,j))*ad_fx(i,j)
2737 ad_r2d_in(i-1,j)=ad_r2d_in(i-1,j)-adfac
2738 ad_r2d_in(i ,j)=ad_r2d_in(i ,j)+adfac
2749 & LBi, UBi, LBj, UBj, &
2760 integer,
intent(in) :: ng, tile
2761 integer,
intent(in) :: lbi, ubi, lbj, ubj
2763# ifdef ASSUMED_SHAPE
2764 real(r8),
intent(inout) :: ad_a(lbi:,lbj:)
2766 real(r8),
intent(inout) :: ad_a(lbi:ubi,lbj:ubj)
2775# include "set_bounds.h"
2783 & lbi, ubi, lbj, ubj, &
2792 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
2796 adfac=0.5_r8*ad_a(iend+1,jend+1)
2797 ad_a(iend+1,jend )=ad_a(iend+1,jend )+adfac
2798 ad_a(iend ,jend+1)=ad_a(iend ,jend+1)+adfac
2799 ad_a(iend+1,jend+1)=0.0_r8
2801 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
2805 adfac=0.5_r8*ad_a(istr-1,jend+1)
2806 ad_a(istr-1,jend )=ad_a(istr-1,jend )+adfac
2807 ad_a(istr ,jend+1)=ad_a(istr ,jend+1)+adfac
2808 ad_a(istr-1,jend+1)=0.0_r8
2810 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
2814 adfac=0.5_r8*ad_a(iend+1,jstr-1)
2815 ad_a(iend ,jstr-1)=ad_a(iend ,jstr-1)+adfac
2816 ad_a(iend+1,jstr )=ad_a(iend+1,jstr )+adfac
2817 ad_a(iend+1,jstr-1)=0.0_r8
2819 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
2823 adfac=0.5_r8*ad_a(istr-1,jstr-1)
2824 ad_a(istr ,jstr-1)=ad_a(istr ,jstr-1)+adfac
2825 ad_a(istr-1,jstr )=ad_a(istr-1,jstr )+adfac
2826 ad_a(istr-1,jstr-1)=0.0_r8
2835 IF (
domain(ng)%Southern_Edge(tile))
THEN
2840 ad_a(i,jstr )=ad_a(i,jstr)+ad_a(i,jstr-1)
2841 ad_a(i,jstr-1)=0.0_r8
2845 ad_a(i,jstr-1)=0.0_r8
2849 IF (
domain(ng)%Northern_Edge(tile))
THEN
2854 ad_a(i,jend )=ad_a(i,jend)+ad_a(i,jend+1)
2855 ad_a(i,jend+1)=0.0_r8
2859 ad_a(i,jend+1)=0.0_r8
2870 IF (
domain(ng)%Western_Edge(tile))
THEN
2875 ad_a(istr ,j)=ad_a(istr,j)+ad_a(istr-1,j)
2876 ad_a(istr-1,j)=0.0_r8
2880 ad_a(istr-1,j)=0.0_r8
2884 IF (
domain(ng)%Eastern_Edge(tile))
THEN
2889 ad_a(iend ,j)=ad_a(iend,j)+ad_a(iend+1,j)
2890 ad_a(iend+1,j)=0.0_r8
2894 ad_a(iend+1,j)=0.0_r8
2906 & LBi, UBi, LBj, UBj, &
2911 & s1_zeta, s2_zeta, &
2912 & ad_s1_zeta, ad_s2_zeta)
2926 integer,
intent(in) :: ng, tile, model
2927 integer,
intent(in) :: LBi, UBi, LBj, UBj
2929# ifdef ASSUMED_SHAPE
2931 real(r8),
intent(in) :: rmask(LBi:,LBj:)
2933 real(r8),
intent(in) :: s1_zeta(LBi:,LBj:)
2934 real(r8),
intent(in) :: s2_zeta(LBi:,LBj:)
2935 real(r8),
intent(inout) :: ad_s1_zeta(LBi:,LBj:)
2936 real(r8),
intent(inout) :: ad_s2_zeta(LBi:,LBj:)
2939 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
2941 real(r8),
intent(in) :: s1_zeta(LBi:UBi,LBj:UBj)
2942 real(r8),
intent(in) :: s2_zeta(LBi:UBi,LBj:UBj)
2943 real(r8),
intent(inout) :: ad_s1_zeta(LBi:UBi,LBj:UBj)
2944 real(r8),
intent(inout) :: ad_s2_zeta(LBi:UBi,LBj:UBj)
2946 real(r8),
intent(inout) :: ad_DotProd
2950 integer :: NSUB, i, j
2953 real(r8) :: ad_my_DotProd
2955 character (len=3) :: op_handle
2958# include "set_bounds.h"
2964 ad_my_dotprod=ad_dotprod
2972 ad_cff=ad_cff+ad_my_dotprod
2976 ad_cff=ad_cff*rmask(i,j)
2981 ad_s1_zeta(i,j)=ad_s1_zeta(i,j)+ad_cff*s2_zeta(i,j)
2982 ad_s2_zeta(i,j)=ad_s2_zeta(i,j)+ad_cff*s1_zeta(i,j)
2988 ad_my_dotprod=0.0_r8
subroutine ad_exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_u2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_v2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
type(t_coupling), dimension(:), allocatable coupling
type(t_fourdvar), dimension(:), allocatable fourdvar
type(t_grid), dimension(:), allocatable grid
type(t_mixing), dimension(:), allocatable mixing
type(t_ocean), dimension(:), allocatable ocean
integer, dimension(:), allocatable nbico
integer, dimension(:), allocatable ntilex
type(t_domain), dimension(:), allocatable domain
integer, dimension(:), allocatable ntilee
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
integer, dimension(:), allocatable nrhs
subroutine ad_mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine, public rho_eos(ng, tile, model)
subroutine, public set_depth(ng, tile, model)
subroutine, public u2d_bc(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine, public r2d_bc(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine ad_r2d_dotp(ng, tile, model, lbi, ubi, lbj, ubj, ad_dotprod, rmask, s1_zeta, s2_zeta, ad_s1_zeta, ad_s2_zeta)
subroutine r2d_dotp(ng, tile, model, lbi, ubi, lbj, ubj, dotprod, rmask, s1_zeta, s2_zeta)
subroutine biconj_tile(ng, tile, model, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, lbck, h, pmon_u, pnom_v, pm, pn, umask, vmask, rmask, bc_ak, bc_bk, zdf1, zdf2, zdf3, pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, zeta, r2d_ref, rhs_r2d)
subroutine, public v2d_bc(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine tl_r2d_oper(ng, tile, lbck, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, umask, vmask, rmask, h, pmon_u, pnom_v, pm, pn, pc_r2d, tl_r2d_in, tl_r2d_out)
subroutine tl_r2d_dotp(ng, tile, model, lbi, ubi, lbj, ubj, tl_dotprod, rmask, s1_zeta, s2_zeta, tl_s1_zeta, tl_s2_zeta)
subroutine, public biconj(ng, tile, model, lbck)
subroutine ad_r2d_oper(ng, tile, lbck, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, umask, vmask, rmask, h, pmon_u, pnom_v, pm, pn, pc_r2d, ad_r2d_in, ad_r2d_out)
subroutine balance_ref_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, lbck, pm, pn, pmon_r, pnom_r, pmon_u, pnom_v, h, hz, z_r, z_w, rmask, umask, vmask, alpha, beta, rho, zeta, rhs_r2d)
subroutine, public ad_r2d_bc(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine r2d_oper(ng, tile, ltrans, lbck, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, umask, vmask, rmask, h, pmon_u, pnom_v, pm, pn, pc_r2d, r2d_in, r2d_out)
subroutine, public balance_ref(ng, tile, lbck)
subroutine, public tl_biconj_tile(ng, tile, model, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, lbck, h, pmon_u, pnom_v, pm, pn, umask, vmask, rmask, bc_ak, bc_bk, zdf1, zdf2, zdf3, pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, tl_r2d_ref, tl_rhs_r2d)
subroutine, public ad_biconj_tile(ng, tile, model, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, lbck, h, pmon_u, pnom_v, pm, pn, umask, vmask, rmask, bc_ak, bc_bk, zdf1, zdf2, zdf3, pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, ad_r2d_ref, ad_rhs_r2d)