152 & LBi, UBi, LBj, UBj, LBij, UBij, &
153 & IminS, ImaxS, JminS, JmaxS, &
157 & pmon_u, pnom_v, h, &
163 & rmask, umask, vmask, &
169 & ad_zeta_ref, ad_rhs_r2d, &
170 & pc_r2d, r_r2d, br_r2d, &
172 & zdf1, zdf2, zdf3, bc_ak, bc_bk, &
175 & ad_rho, ad_t, ad_u, ad_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) :: ad_t(LBi:,LBj:,:,:,:)
226 real(r8),
intent(inout) :: ad_u(LBi:,LBj:,:,:)
227 real(r8),
intent(inout) :: ad_v(LBi:,LBj:,:,:)
229 real(r8),
intent(inout) :: ad_zeta(LBi:,LBj:,:)
231 real(r8),
intent(out) :: ad_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) :: ad_rhs_r2d(LBi:,LBj:)
245 real(r8),
intent(inout) :: ad_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) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
273 real(r8),
intent(inout) :: ad_u(LBi:UBi,LBj:UBj,2,N(ng))
274 real(r8),
intent(inout) :: ad_v(LBi:UBi,LBj:UBj,2,N(ng))
276 real(r8),
intent(inout) :: ad_zeta(LBi:UBi,LBj:UBj,:)
278 real(r8),
intent(out) :: ad_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) :: ad_rhs_r2d(LBi:UBi,LBj:UBj)
292 real(r8),
intent(inout) :: ad_zeta_ref(LBi:UBi,LBj:UBj)
299 integer :: i, j, k, order
301 integer :: Norder = 2
303 real(r8) :: fac, fac1, fac2, fac3, gamma
304 real(r8) :: cff, cff1, cff2, cff3, cff4
305 real(r8) :: ad_cff, ad_cff1, ad_cff2, adfac, adfac1, adfac2
306 real(r8) :: dzdT, zphi, zphi1, zwbot, zwtop
308 real(r8),
dimension(20) :: filter_coef = &
309 & (/ 2.500000E-1_r8, 6.250000E-2_r8, 1.562500E-2_r8, &
310 & 3.906250E-3_r8, 9.765625E-4_r8, 2.44140625E-4_r8, &
311 & 6.103515625E-5_r8, 1.5258789063E-5_r8, 3.814697E-6_r8, &
312 & 9.536743E-7_r8, 2.384186E-7_r8, 5.960464E-8_r8, &
313 & 1.490116E-8_r8, 3.725290E-9_r8, 9.313226E-10_r8, &
314 & 2.328306E-10_r8, 5.820766E-11_r8, 1.455192E-11_r8, &
315 & 3.637979E-12_r8, 9.094947E-13_r8 /)
317 real(r8),
dimension(N(ng)) :: dSdT, dSdT_filter
319 real(r8),
dimension(IminS:ImaxS) :: ad_phie
320 real(r8),
dimension(IminS:ImaxS) :: ad_phix
323 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
325 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dTdz
326 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dSdz
328 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,N(ng)) :: ad_gradP
331 real(r8),
dimension(IminS:ImaxS,N(ng)) :: ad_phi
333 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_gradPx
334 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_gradPy
335 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ad_r2d_rhs
338# include "set_bounds.h"
359 ad_gradp(i,j,k)=0.0_r8
371 ad_gradpx(i,j)=0.0_r8
372 ad_gradpy(i,j)=0.0_r8
392 & lbi, ubi, lbj, ubj, &
404 & lbi, ubi, lbj, ubj, &
416 ad_zeta_ref(i,j)=ad_zeta(i,j,linp)
435 & lbi, ubi, lbj, ubj, &
436 & imins, imaxs, jmins, jmaxs, &
438 & h, pmon_u, pnom_v, pm, pn, &
440 & umask, vmask, rmask, &
442 & bc_ak, bc_bk, zdf1, zdf2, zdf3, &
443 & pc_r2d, r_r2d, br_r2d, p_r2d, bp_r2d, &
444 & ad_zeta_ref, ad_rhs_r2d)
450 ad_zeta_ref(i,j)=0.0_r8
462 & lbi, ubi, lbj, ubj, &
472 & lbi, ubi, lbj, ubj, &
482 ad_rhs_r2d(i,j)=ad_rhs_r2d(i,j)*rmask(i,j)
490 adfac=-pm(i,j)*pn(i,j)*ad_rhs_r2d(i,j)
491 ad_gradpx(i ,j)=ad_gradpx(i ,j)-pmon_u(i ,j)*adfac
492 ad_gradpx(i+1,j)=ad_gradpx(i+1,j)+pmon_u(i+1,j)*adfac
493 ad_gradpy(i,j )=ad_gradpy(i,j )-pnom_v(i,j )*adfac
494 ad_gradpy(i,j+1)=ad_gradpy(i,j+1)+pnom_v(i,j+1)*adfac
495 ad_rhs_r2d(i,j)=0.0_r8
506 & imins, imaxs, jmins, jmaxs, &
513 & imins, imaxs, jmins, jmaxs, &
527 ad_cff=ad_cff+ad_zeta(i,j,linp)
531 ad_cff=ad_cff*rmask(i,j)
535 ad_rho(i,j,k)=ad_rho(i,j,k)- &
536 & cff1*hz(i,j,k)*ad_cff
554 zwtop=abs(z_w(i,j,k ))
555 zwbot=abs(z_w(i,j,k-1))
559 ad_cff=ad_cff+ad_zeta(i,j,linp)
563 ad_cff=ad_cff*rmask(i,j)
567 ad_rho(i,j,k)=ad_rho(i,j,k)- &
568 & cff1*hz(i,j,k)*ad_cff
574 ad_cff=ad_cff+ad_zeta(i,j,linp)
578 ad_cff=ad_cff*rmask(i,j)
585 ad_rho(i,j,k)=ad_rho(i,j,k)- &
586 & cff1*hz(i,j,k)*ad_cff
589 zphi1=abs(z_r(i,j,k+1))
598 ad_rho(i,j,k )=ad_rho(i,j,k )-adfac1
599 ad_rho(i,j,k+1)=ad_rho(i,j,k+1)-adfac+adfac1
606 ad_rho(i,j,k)=ad_rho(i,j,k)- &
607 & cff1*hz(i,j,k)*ad_cff
610 zphi1=abs(z_r(i,j,k-1))
619 ad_rho(i,j,k-1)=ad_rho(i,j,k-1)-adfac1
620 ad_rho(i,j,k )=ad_rho(i,j,k )-adfac+adfac1
650 & lbi, ubi, lbj, ubj, 1, n(ng), &
653 & ad_u(:,:,:,linp), ad_v(:,:,:,linp))
661 & lbi, ubi, lbj, ubj, 1, n(ng), &
668 & lbi, ubi, lbj, ubj, 1, n(ng), &
678 ad_v(i,j,k,linp)=ad_v(i,j,k,linp)*vmask(i,j)
686 adfac=0.25_r8*ad_v(i,j,k,linp)
687 ad_gradp(i ,j-1,k)=ad_gradp(i ,j-1,k)+adfac
688 ad_gradp(i+1,j-1,k)=ad_gradp(i+1,j-1,k)+adfac
689 ad_gradp(i ,j ,k)=ad_gradp(i ,j ,k)+adfac
690 ad_gradp(i+1,j ,k)=ad_gradp(i+1,j ,k)+adfac
717 ad_cff=ad_cff+ad_gradpx(i,j)
721 ad_cff=ad_cff*umask(i,j)
725 ad_phi(i,k)=ad_phi(i,k)+ &
726 & 0.5_r8*(hz(i-1,j,k)+hz(i,j,k))*ad_cff
740 cff1=1.0_r8/((z_r(i ,j,k+1)-z_r(i ,j,k))* &
741 & (z_r(i-1,j,k+1)-z_r(i-1,j,k)))
742 cff2=z_r(i ,j,k )-z_r(i-1,j,k )+ &
743 & z_r(i ,j,k+1)-z_r(i-1,j,k+1)
744 cff3=z_r(i ,j,k+1)-z_r(i ,j,k )- &
745 & z_r(i-1,j,k+1)+z_r(i-1,j,k )
746 gamma=0.125_r8*cff1*cff2*cff3
748 cff3=z_r(i,j,k+1)+z_r(i-1,j,k+1)- &
749 & z_r(i,j,k )-z_r(i-1,j,k )
750 cff4=(1.0_r8+gamma)*(z_r(i,j,k+1)-z_r(i-1,j,k+1))+ &
751 & (1.0_r8-gamma)*(z_r(i,j,k )-z_r(i-1,j,k ))
756 ad_phix(i)=ad_phix(i)+ad_phi(i,k)
762 ad_phix(i)=ad_phix(i)+ &
763 & ad_gradp(i,j,k)*0.5_r8*(pm(i-1,j)+pm(i,j))/ &
765 ad_gradp(i,j,k)=0.0_r8
769 ad_cff1=fac3*cff3*ad_phix(i)
770 ad_cff2=-fac3*cff4*ad_phix(i)
778 adfac1=(1.0_r8+gamma)*ad_cff1
779 adfac2=(1.0_r8-gamma)*ad_cff1
780 ad_rho(i-1,j,k )=ad_rho(i-1,j,k )-adfac2-ad_cff2
781 ad_rho(i ,j,k )=ad_rho(i ,j,k )+adfac2-ad_cff2
782 ad_rho(i-1,j,k+1)=ad_rho(i-1,j,k+1)-adfac1+ad_cff2
783 ad_rho(i ,j,k+1)=ad_rho(i ,j,k+1)+adfac1+ad_cff2
793 cff1=z_w(i ,j,n(ng))-z_r(i ,j,n(ng))+ &
794 & z_w(i-1,j,n(ng))-z_r(i-1,j,n(ng))
798 ad_phix(i)=ad_phix(i)+ad_phi(i,n(ng))
799 ad_phi(i,n(ng))=0.0_r8
804 ad_phix(i)=ad_phix(i)+ &
805 & ad_gradp(i,j,n(ng))*0.5_r8*(pm(i-1,j)+pm(i,j))/ &
807 ad_gradp(i,j,n(ng))=0.0_r8
813 adfac1=fac1*cff1*ad_phix(i)
814 adfac2=fac2*ad_phix(i)
815 ad_rho(i-1,j,n(ng))=ad_rho(i-1,j,n(ng))-adfac1
816 ad_rho(i ,j,n(ng))=ad_rho(i ,j,n(ng))+adfac1
817 ad_zeta(i-1,j,linp)=ad_zeta(i-1,j,linp)-adfac2
818 ad_zeta(i ,j,linp)=ad_zeta(i ,j,linp)+adfac2
833 ad_u(i,j,k,linp)=ad_u(i,j,k,linp)*umask(i,j)
841 adfac=0.25_r8*ad_u(i,j,k,linp)
842 ad_gradp(i-1,j ,k)=ad_gradp(i-1,j ,k)-adfac
843 ad_gradp(i ,j ,k)=ad_gradp(i ,j ,k)-adfac
844 ad_gradp(i-1,j+1,k)=ad_gradp(i-1,j+1,k)-adfac
845 ad_gradp(i ,j+1,k)=ad_gradp(i ,j+1,k)-adfac
864 ad_cff=ad_cff+ad_gradpy(i,j)
868 ad_cff=ad_cff*vmask(i,j)
872 ad_phi(i,k)=ad_phi(i,k)+ &
873 & 0.5_r8*(hz(i,j-1,k)+hz(i,j,k))*ad_cff
887 cff1=1.0_r8/((z_r(i,j ,k+1)-z_r(i,j ,k))* &
888 & (z_r(i,j-1,k+1)-z_r(i,j-1,k)))
889 cff2=z_r(i,j ,k )-z_r(i,j-1,k )+ &
890 & z_r(i,j ,k+1)-z_r(i,j-1,k+1)
891 cff3=z_r(i,j ,k+1)-z_r(i,j ,k )- &
892 & z_r(i,j-1,k+1)+z_r(i,j-1,k )
893 gamma=0.125_r8*cff1*cff2*cff3
895 cff3=z_r(i,j,k+1)+z_r(i,j-1,k+1)- &
896 & z_r(i,j,k )-z_r(i,j-1,k )
897 cff4=(1.0_r8+gamma)*(z_r(i,j,k+1)-z_r(i,j-1,k+1))+ &
898 & (1.0_r8-gamma)*(z_r(i,j,k )-z_r(i,j-1,k ))
902 ad_phie(i)=ad_phie(i)+ad_phi(i,k)
908 ad_phie(i)=ad_phie(i)+ &
909 & ad_gradp(i,j,k)*0.5_r8*(pn(i,j-1)+pn(i,j))/ &
911 ad_gradp(i,j,k)=0.0_r8
915 ad_cff1=fac3*cff3*ad_phie(i)
916 ad_cff2=-fac3*cff4*ad_phie(i)
924 adfac1=(1.0_r8+gamma)*ad_cff1
925 adfac2=(1.0_r8-gamma)*ad_cff1
926 ad_rho(i,j-1,k )=ad_rho(i,j-1,k )-adfac2-ad_cff2
927 ad_rho(i,j ,k )=ad_rho(i,j ,k )+adfac2-ad_cff2
928 ad_rho(i,j-1,k+1)=ad_rho(i,j-1,k+1)-adfac1+ad_cff2
929 ad_rho(i,j ,k+1)=ad_rho(i,j ,k+1)+adfac1+ad_cff2
939 cff1=z_w(i,j ,n(ng))-z_r(i,j ,n(ng))+ &
940 & z_w(i,j-1,n(ng))-z_r(i,j-1,n(ng))
944 ad_phie(i)=ad_phie(i)+ad_phi(i,n(ng))
945 ad_phi(i,n(ng))=0.0_r8
950 ad_phie(i)=ad_phie(i)+ &
951 & ad_gradp(i,j,n(ng))*0.5_r8*(pn(i,j-1)+pn(i,j))/ &
953 ad_gradp(i,j,n(ng))=0.0_r8
959 adfac1=fac1*cff1*ad_phie(i)
960 adfac2=fac2*ad_phie(i)
961 ad_rho(i,j-1,n(ng))=ad_rho(i,j-1,n(ng))-adfac1
962 ad_rho(i,j ,n(ng))=ad_rho(i,j ,n(ng))+adfac1
963 ad_zeta(i,j-1,linp)=ad_zeta(i,j-1,linp)-adfac2
964 ad_zeta(i,j ,linp)=ad_zeta(i,j ,linp)+adfac2
977 ad_gradpy(i,j)=0.0_r8
980 ad_gradpx(i,j)=0.0_r8
1002 & lbi, ubi, lbj, ubj, 1, n(ng), &
1013 & lbi, ubi, lbj, ubj, 1, n(ng), &
1023 ad_rho(i,j,k)=ad_rho(i,j,k)*rmask(i,j)
1029 ad_t(i,j,k,linp,
isalt)=ad_t(i,j,k,linp,
isalt)+ &
1030 &
rho0*beta(i,j)*ad_rho(i,j,k)
1034 ad_t(i,j,k,linp,
itemp)=ad_t(i,j,k,linp,
itemp)- &
1035 &
rho0*alpha(i,j)*ad_rho(i,j,k)
1058 & lbi, ubi, lbj, ubj, 1, n(ng), &
1061 & ad_t(:,:,:,linp,
isalt))
1069 & lbi, ubi, lbj, ubj, 1, n(ng), &
1070 & ad_t(:,:,:,linp,
isalt))
1083 cff=1.0_r8/(2.0_r8*hz(i,j,k+1)+ &
1084 & hz(i,j,k)*(2.0_r8-fc(i,k-1)))
1085 fc(i,k)=cff*hz(i,j,k+1)
1086 dtdz(i,j,k)=cff*(6.0_r8*(t(i,j,k+1,lbck,
itemp)- &
1087 & t(i,j,k ,lbck,
itemp))- &
1088 & hz(i,j,k)*dtdz(i,j,k-1))
1089 dsdz(i,j,k)=cff*(6.0_r8*(t(i,j,k+1,lbck,
isalt)- &
1090 & t(i,j,k ,lbck,
isalt))- &
1091 & hz(i,j,k)*dsdz(i,j,k-1))
1095 dtdz(i,j,n(ng))=0.0_r8
1096 dsdz(i,j,n(ng))=0.0_r8
1100 dtdz(i,j,k)=dtdz(i,j,k)-fc(i,k)*dtdz(i,j,k+1)
1101 dsdz(i,j,k)=dsdz(i,j,k)-fc(i,k)*dsdz(i,j,k+1)
1122 cff=0.5_r8*(dtdz(i,j,k-1)+dtdz(i,j,k))
1128 dsdt(k)=(0.5_r8*(dsdz(i,j,k-1)+ &
1129 & dsdz(i,j,k )))*dzdt
1135 IF (order.ne.norder/2)
THEN
1136 dsdt_filter(1)=2.0_r8*(dsdt(1)-dsdt(2))
1137 dsdt_filter(n(ng))=2.0_r8*(dsdt(n(ng))-dsdt(n(ng)-1))
1139 dsdt_filter(1)=0.0_r8
1140 dsdt_filter(n(ng))=0.0_r8
1143 dsdt_filter(k)=2.0_r8*dsdt(k)-dsdt(k-1)-dsdt(k+1)
1146 dsdt(k)=dsdt(k)-filter_coef(norder/2)*dsdt_filter(k)
1151 cff=(1.0_r8-exp(z_r(i,j,k)/
ml_depth(ng)))*dsdt(k)
1155 ad_t(i,j,k,linp,
isalt)=ad_t(i,j,k,linp,
isalt)*rmask(i,j)
1160 ad_t(i,j,k,linp,
itemp)=ad_t(i,j,k,linp,
itemp)+ &
1161 & cff*ad_t(i,j,k,linp,
isalt)