152 & LBi, UBi, LBj, UBj, LBij, UBij, &
153 & IminS, ImaxS, JminS, JmaxS, &
157 & pmon_u, pnom_v, h, &
163 & rmask, umask, vmask, &
169 & tl_zeta_ref, tl_rhs_r2d, &
170 & pc_r2d, r_r2d, br_r2d, &
172 & zdf1, zdf2, zdf3, bc_ak, bc_bk, &
175 & tl_rho, tl_t, tl_u, tl_v, &
197 integer,
intent(in) :: ng, tile
198 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBij, UBij
199 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
200 integer,
intent(in) :: Lbck, Linp
203 real(r8),
intent(in) :: f(LBi:,LBj:)
204 real(r8),
intent(in) :: pm(LBi:,LBj:)
205 real(r8),
intent(in) :: pn(LBi:,LBj:)
207 real(r8),
intent(in) :: h(LBi:,LBj:)
208 real(r8),
intent(in) :: pmon_u(LBi:,LBj:)
209 real(r8),
intent(in) :: pnom_v(LBi:,LBj:)
212 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
213 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
214 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
217 real(r8),
intent(in) :: rmask(LBi:,LBj:)
218 real(r8),
intent(in) :: umask(LBi:,LBj:)
219 real(r8),
intent(in) :: vmask(LBi:,LBj:)
222 real(r8),
intent(in) :: alpha(LBi:,LBj:)
223 real(r8),
intent(in) :: beta(LBi:,LBj:)
224 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
225 real(r8),
intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
226 real(r8),
intent(inout) :: tl_u(LBi:,LBj:,:,:)
227 real(r8),
intent(inout) :: tl_v(LBi:,LBj:,:,:)
229 real(r8),
intent(inout) :: tl_zeta(LBi:,LBj:,:)
231 real(r8),
intent(out) :: tl_rho(LBi:,LBj:,:)
234 real(r8),
intent(in) :: bc_ak(:)
235 real(r8),
intent(in) :: bc_bk(:)
236 real(r8),
intent(in) :: zdf1(:)
237 real(r8),
intent(in) :: zdf2(:)
238 real(r8),
intent(in) :: zdf3(:)
239 real(r8),
intent(inout) :: pc_r2d(LBi:,LBj:)
240 real(r8),
intent(inout) :: r_r2d(LBi:,LBj:,:)
241 real(r8),
intent(inout) :: br_r2d(LBi:,LBj:,:)
242 real(r8),
intent(inout) :: p_r2d(LBi:,LBj:,:)
243 real(r8),
intent(inout) :: bp_r2d(LBi:,LBj:,:)
244 real(r8),
intent(inout) :: tl_rhs_r2d(LBi:,LBj:)
245 real(r8),
intent(inout) :: tl_zeta_ref(LBi:,LBj:)
250 real(r8),
intent(in) :: f(LBi:UBi,LBj:UBj)
251 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
252 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
254 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
255 real(r8),
intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
256 real(r8),
intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
259 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
260 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
261 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
264 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
265 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
266 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
269 real(r8),
intent(in) :: alpha(LBi:UBi,LBj:UBj)
270 real(r8),
intent(in) :: beta(LBi:UBi,LBj:UBj)
271 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
272 real(r8),
intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
273 real(r8),
intent(inout) :: tl_u(LBi:UBi,LBj:UBj,2,N(ng))
274 real(r8),
intent(inout) :: tl_v(LBi:UBi,LBj:UBj,2,N(ng))
276 real(r8),
intent(inout) :: tl_zeta(LBi:UBi,LBj:UBj,:)
278 real(r8),
intent(out) :: tl_rho(LBi:UBi,LBj:UBj,N(ng))
281 real(r8),
intent(in) :: bc_ak(Nbico(ng))
282 real(r8),
intent(in) :: bc_bk(Nbico(ng))
283 real(r8),
intent(in) :: zdf1(Nbico(ng))
284 real(r8),
intent(in) :: zdf2(Nbico(ng))
285 real(r8),
intent(in) :: zdf3(Nbico(ng))
286 real(r8),
intent(inout) :: pc_r2d(LBi:UBi,LBj:UBj)
287 real(r8),
intent(inout) :: r_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
288 real(r8),
intent(inout) :: br_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
289 real(r8),
intent(inout) :: p_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
290 real(r8),
intent(inout) :: bp_r2d(LBi:UBi,LBj:UBj,Nbico(ng))
291 real(r8),
intent(inout) :: tl_rhs_r2d(LBi:UBi,LBj:UBj)
292 real(r8),
intent(inout) :: tl_zeta_ref(LBi:UBi,LBj:UBj)
299 integer :: i, j, k, order
300 integer :: Norder = 2
302 real(r8) :: fac, fac1, fac2, fac3, gamma
303 real(r8) :: cff, cff1, cff2, cff3, cff4
304 real(r8) :: tl_cff, tl_cff1, tl_cff2
305 real(r8) :: dzdT, zphi, zphi1, zwbot, zwtop
307 real(r8),
dimension(20) :: filter_coef = &
308 & (/ 2.500000E-1_r8, 6.250000E-2_r8, 1.562500E-2_r8, &
309 & 3.906250E-3_r8, 9.765625E-4_r8, 2.44140625E-4_r8, &
310 & 6.103515625E-5_r8, 1.5258789063E-5_r8, 3.814697E-6_r8, &
311 & 9.536743E-7_r8, 2.384186E-7_r8, 5.960464E-8_r8, &
312 & 1.490116E-8_r8, 3.725290E-9_r8, 9.313226E-10_r8, &
313 & 2.328306E-10_r8, 5.820766E-11_r8, 1.455192E-11_r8, &
314 & 3.637979E-12_r8, 9.094947E-13_r8 /)
316 real(r8),
dimension(N(ng)) :: dSdT, dSdT_filter
318 real(r8),
dimension(IminS:ImaxS) :: tl_phie
319 real(r8),
dimension(IminS:ImaxS) :: tl_phix
322 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
324 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dTdz
325 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dSdz
327 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: tl_gradP
330 real(r8),
dimension(IminS:ImaxS,N(ng)) :: tl_phi
332 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_gradPx
333 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_gradPy
334 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_r2d_rhs
337# include "set_bounds.h"
357 cff=1.0_r8/(2.0_r8*hz(i,j,k+1)+ &
358 & hz(i,j,k)*(2.0_r8-fc(i,k-1)))
359 fc(i,k)=cff*hz(i,j,k+1)
360 dtdz(i,j,k)=cff*(6.0_r8*(t(i,j,k+1,lbck,
itemp)- &
361 & t(i,j,k ,lbck,
itemp))- &
362 & hz(i,j,k)*dtdz(i,j,k-1))
363 dsdz(i,j,k)=cff*(6.0_r8*(t(i,j,k+1,lbck,
isalt)- &
364 & t(i,j,k ,lbck,
isalt))- &
365 & hz(i,j,k)*dsdz(i,j,k-1))
369 dtdz(i,j,n(ng))=0.0_r8
370 dsdz(i,j,n(ng))=0.0_r8
374 dtdz(i,j,k)=dtdz(i,j,k)-fc(i,k)*dtdz(i,j,k+1)
375 dsdz(i,j,k)=dsdz(i,j,k)-fc(i,k)*dsdz(i,j,k+1)
396 cff=0.5_r8*(dtdz(i,j,k-1)+dtdz(i,j,k))
402 dsdt(k)=(0.5_r8*(dsdz(i,j,k-1)+ &
403 & dsdz(i,j,k )))*dzdt
409 IF (order.ne.norder/2)
THEN
410 dsdt_filter(1)=2.0_r8*(dsdt(1)-dsdt(2))
411 dsdt_filter(n(ng))=2.0_r8*(dsdt(n(ng))-dsdt(n(ng)-1))
413 dsdt_filter(1)=0.0_r8
414 dsdt_filter(n(ng))=0.0_r8
417 dsdt_filter(k)=2.0_r8*dsdt(k)-dsdt(k-1)-dsdt(k+1)
420 dsdt(k)=dsdt(k)-filter_coef(norder/2)*dsdt_filter(k)
425 cff=(1.0_r8-exp(z_r(i,j,k)/
ml_depth(ng)))*dsdt(k)
426 tl_t(i,j,k,linp,
isalt)=tl_t(i,j,k,linp,
isalt)+ &
427 & cff*tl_t(i,j,k,linp,
itemp)
429 tl_t(i,j,k,linp,
isalt)=tl_t(i,j,k,linp,
isalt)*rmask(i,j)
437 & lbi, ubi, lbj, ubj, 1, n(ng), &
438 & tl_t(:,:,:,linp,
isalt))
442 & lbi, ubi, lbj, ubj, 1, n(ng), &
445 & tl_t(:,:,:,linp,
isalt))
460 tl_rho(i,j,k)=-
rho0*alpha(i,j)*tl_t(i,j,k,linp,
itemp)
462 tl_rho(i,j,k)=tl_rho(i,j,k)+ &
466 tl_rho(i,j,k)=tl_rho(i,j,k)*rmask(i,j)
474 & lbi, ubi, lbj, ubj, 1, n(ng), &
479 & lbi, ubi, lbj, ubj, 1, n(ng), &
506 tl_gradpx(i,j)=0.0_r8
507 tl_gradpy(i,j)=0.0_r8
518 cff1=z_w(i,j ,n(ng))-z_r(i,j ,n(ng))+ &
519 & z_w(i,j-1,n(ng))-z_r(i,j-1,n(ng))
520 tl_phie(i)=fac1*(tl_rho(i,j ,n(ng))- &
521 & tl_rho(i,j-1,n(ng)))*cff1+ &
522 & fac2*(tl_zeta(i,j ,linp)- &
523 & tl_zeta(i,j-1,linp))
524 tl_gradp(i,j,n(ng))=0.5_r8*tl_phie(i)* &
525 & (pn(i,j-1)+pn(i,j))/(f(i,j-1)+f(i,j))
527 tl_phi(i,n(ng))=tl_phie(i)
536 cff1=1.0_r8/((z_r(i,j ,k+1)-z_r(i,j ,k))* &
537 & (z_r(i,j-1,k+1)-z_r(i,j-1,k)))
538 cff2=z_r(i,j ,k )-z_r(i,j-1,k )+ &
539 & z_r(i,j ,k+1)-z_r(i,j-1,k+1)
540 cff3=z_r(i,j ,k+1)-z_r(i,j ,k )- &
541 & z_r(i,j-1,k+1)+z_r(i,j-1,k )
542 gamma=0.125_r8*cff1*cff2*cff3
544 tl_cff1=(1.0_r8+gamma)*(tl_rho(i,j ,k+1)- &
545 & tl_rho(i,j-1,k+1))+ &
546 & (1.0_r8-gamma)*(tl_rho(i,j ,k )- &
548 tl_cff2=tl_rho(i,j,k+1)+tl_rho(i,j-1,k+1)- &
549 & tl_rho(i,j,k )-tl_rho(i,j-1,k )
550 cff3=z_r(i,j,k+1)+z_r(i,j-1,k+1)- &
551 & z_r(i,j,k )-z_r(i,j-1,k )
552 cff4=(1.0_r8+gamma)*(z_r(i,j,k+1)-z_r(i,j-1,k+1))+ &
553 & (1.0_r8-gamma)*(z_r(i,j,k )-z_r(i,j-1,k ))
554 tl_phie(i)=tl_phie(i)+ &
555 & fac3*(tl_cff1*cff3-tl_cff2*cff4)
556 tl_gradp(i,j,k)=0.5_r8*tl_phie(i)* &
557 & (pn(i,j-1)+pn(i,j))/(f(i,j-1)+f(i,j))
559 tl_phi(i,k)=tl_phie(i)
572 tl_cff=0.5_r8*(hz(i,j-1,k)+hz(i,j,k))*tl_phi(i,k)
574 tl_cff=tl_cff*vmask(i,j)
576 tl_gradpy(i,j)=tl_gradpy(i,j)+tl_cff
590 tl_u(i,j,k,linp)=tl_u(i,j,k,linp)- &
591 & 0.25_r8*(tl_gradp(i-1,j ,k)+ &
592 & tl_gradp(i ,j ,k)+ &
593 & tl_gradp(i-1,j+1,k)+ &
594 & tl_gradp(i ,j+1,k))
596 tl_u(i,j,k,linp)=tl_u(i,j,k,linp)*umask(i,j)
609 cff1=z_w(i ,j,n(ng))-z_r(i ,j,n(ng))+ &
610 & z_w(i-1,j,n(ng))-z_r(i-1,j,n(ng))
611 tl_phix(i)=fac1*(tl_rho(i ,j,n(ng))- &
612 & tl_rho(i-1,j,n(ng)))*cff1+ &
613 & fac2*(tl_zeta(i ,j,linp)- &
614 & tl_zeta(i-1,j,linp))
615 tl_gradp(i,j,n(ng))=0.5_r8*tl_phix(i)* &
616 & (pm(i-1,j)+pm(i,j))/(f(i-1,j)+f(i,j))
618 tl_phi(i,n(ng))=tl_phix(i)
627 cff1=1.0_r8/((z_r(i ,j,k+1)-z_r(i ,j,k))* &
628 & (z_r(i-1,j,k+1)-z_r(i-1,j,k)))
629 cff2=z_r(i ,j,k )-z_r(i-1,j,k )+ &
630 & z_r(i ,j,k+1)-z_r(i-1,j,k+1)
631 cff3=z_r(i ,j,k+1)-z_r(i ,j,k )- &
632 & z_r(i-1,j,k+1)+z_r(i-1,j,k )
633 gamma=0.125_r8*cff1*cff2*cff3
635 tl_cff1=(1.0_r8+gamma)*(tl_rho(i ,j,k+1)- &
636 & tl_rho(i-1,j,k+1))+ &
637 & (1.0_r8-gamma)*(tl_rho(i ,j,k )- &
639 tl_cff2=tl_rho(i,j,k+1)+tl_rho(i-1,j,k+1)- &
640 & tl_rho(i,j,k )-tl_rho(i-1,j,k )
641 cff3=z_r(i,j,k+1)+z_r(i-1,j,k+1)- &
642 & z_r(i,j,k )-z_r(i-1,j,k )
643 cff4=(1.0_r8+gamma)*(z_r(i,j,k+1)-z_r(i-1,j,k+1))+ &
644 & (1.0_r8-gamma)*(z_r(i,j,k )-z_r(i-1,j,k ))
645 tl_phix(i)=tl_phix(i)+ &
646 & fac3*(tl_cff1*cff3-tl_cff2*cff4)
647 tl_gradp(i,j,k)=0.5_r8*tl_phix(i)* &
648 & (pm(i-1,j)+pm(i,j))/(f(i-1,j)+f(i,j))
650 tl_phi(i,k)=tl_phix(i)
663 tl_cff=0.5_r8*(hz(i-1,j,k)+hz(i,j,k))*tl_phi(i,k)
665 tl_cff=tl_cff*umask(i,j)
667 tl_gradpx(i,j)=tl_gradpx(i,j)+tl_cff
681 tl_v(i,j,k,linp)=tl_v(i,j,k,linp)+ &
682 & 0.25_r8*(tl_gradp(i ,j-1,k)+ &
683 & tl_gradp(i+1,j-1,k)+ &
684 & tl_gradp(i ,j ,k)+ &
685 & tl_gradp(i+1,j ,k))
687 tl_v(i,j,k,linp)=tl_v(i,j,k,linp)*vmask(i,j)
695 & lbi, ubi, lbj, ubj, 1, n(ng), &
698 & lbi, ubi, lbj, ubj, 1, n(ng), &
703 & lbi, ubi, lbj, ubj, 1, n(ng), &
706 & tl_u(:,:,:,linp), tl_v(:,:,:,linp))
722 & imins, imaxs, jmins, jmaxs, &
725 & imins, imaxs, jmins, jmaxs, &
732 tl_rhs_r2d(i,j)=-pm(i,j)*pn(i,j)* &
733 & (pmon_u(i+1,j)*tl_gradpx(i+1,j)- &
734 & pmon_u(i ,j)*tl_gradpx(i ,j)+ &
735 & pnom_v(i,j+1)*tl_gradpy(i,j+1)- &
736 & pnom_v(i,j )*tl_gradpy(i,j ))
738 tl_rhs_r2d(i,j)=tl_rhs_r2d(i,j)*rmask(i,j)
744 & lbi, ubi, lbj, ubj, &
748 & lbi, ubi, lbj, ubj, &
758 tl_zeta_ref(i,j)=0.0_r8
765 & lbi, ubi, lbj, ubj, &
766 & imins, imaxs, jmins, jmaxs, &
768 & h, pmon_u, pnom_v, pm, pn, &
770 & umask, vmask, rmask, &
772 & bc_ak, bc_bk, zdf1, zdf2, zdf3, &
773 & pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, &
774 & tl_zeta_ref, tl_rhs_r2d)
781 tl_zeta(i,j,linp)=tl_zeta(i,j,linp)+tl_zeta_ref(i,j)
794 tl_cff=-cff1*tl_rho(i,j,k)*hz(i,j,k)
796 tl_cff=tl_cff*rmask(i,j)
798 tl_zeta(i,j,linp)=tl_zeta(i,j,linp)+tl_cff
815 zwtop=abs(z_w(i,j,k ))
816 zwbot=abs(z_w(i,j,k-1))
818 tl_cff=-cff1*tl_rho(i,j,k)*hz(i,j,k)
820 tl_cff=tl_cff*rmask(i,j)
822 tl_zeta(i,j,linp)=tl_zeta(i,j,linp)+tl_cff
828 tl_cff=-cff1*tl_rho(i,j,k)*hz(i,j,k)
830 zphi1=abs(z_r(i,j,k+1))
833 & (tl_rho(i,j,k+1)+ &
834 & fac*(tl_rho(i,j,k)-tl_rho(i,j,k+1)))* &
839 tl_cff=-cff1*tl_rho(i,j,k)*hz(i,j,k)
841 zphi1=abs(z_r(i,j,k-1))
845 & fac*(tl_rho(i,j,k-1)-tl_rho(i,j,k)))* &
850 tl_cff=tl_cff*rmask(i,j)
852 tl_zeta(i,j,linp)=tl_zeta(i,j,linp)+tl_cff
862 & lbi, ubi, lbj, ubj, &
867 & lbi, ubi, lbj, ubj, &