subroutine slgscan_h(i_1, i_2, s_lat_in_pe, n_lat_in_pe, & lan, lat, lon_dim_h, & ztodt , iter , etamid , lats_node_a, & uu_gr_h_2, vv_gr_h_2, ww_gr_h_2, & ug_m_2, vg_m_2, ww_m_2, & lammp_a, phimp_a, sigmp_a, me, & rgt_h, rgt_a, & ud3_h1, ud3_h2, ud3_a, & vd3_h1, vd3_h2, vd3_a, & td3_h1, td3_h2, td3_a, & dpdt_d3_h1, dpdt_d3_h2, dpdt_d3_a, & global_lats_a, lonsperlat, ini_slg, ini_dp, & lprint) ! use machine , only : kind_evod use resol_def , only : latg,levs,lonf,ntrac use namelist_def , only : redgg_a, phigs &, herm_x, herm_y, herm_z &, lin_xyz,wgt_cub_lin_xyz,lin_xy &, settls_dep3ds,settls_dep3dg &, cont_eq_opt1 &, opt1_3d_qcubic &, wgt_cub_lin_xyz_trc !sela use pmgrid , only : pmap,plon,platd, use pmgrid , only : plon,platd, & plev,plat,plevp,quamon,pi use slgshr , only : phi,dphi,lbasiy,lam,rdlam,dphii, & dlam,ra,lbasdy,nlonex,rdlam6 use gg_def , only : rcs2_a !moor use layout_grid_tracers , only : yhalo use layout1 , only : ipt_lats_node_a,lats_dim_a implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer lan,lat,lon_dim_h,lats_node_a,me,ini_slg,ini_dp integer,dimension(latg) :: global_lats_a,lonsperlat real(kind=kind_evod) ztodt real(kind=kind_evod),dimension(levs) :: etamid ! eta at levels real(kind=kind_evod),dimension(lon_dim_h*levs , & s_lat_in_pe:n_lat_in_pe) :: & uu_gr_h_2,vv_gr_h_2,ww_gr_h_2,ug_m_2,vg_m_2,ww_m_2 real(kind=kind_evod),dimension(lonf,levs,lats_node_a) :: & lammp_a,phimp_a,sigmp_a, & ud3_a,vd3_a,td3_a,dpdt_d3_a real(kind=kind_evod),dimension(lon_dim_h,levs , & s_lat_in_pe:n_lat_in_pe,ntrac) :: rgt_h real(kind=kind_evod),dimension(lonf,levs,lats_dim_a,ntrac)::rgt_a real(kind=kind_evod),dimension(lon_dim_h,levs , & s_lat_in_pe:n_lat_in_pe) :: & ud3_h1,ud3_h2,vd3_h1,vd3_h2,td3_h1,td3_h2, & dpdt_d3_h1,dpdt_d3_h2 ! local variables integer lan_loc,lat_loc integer jj,jj1,k1,i,j,k,n,jcen,iter,i_branch,jtem &, jm1,jp1,jp2 integer kdim,kdimm2,kk,pmap,bisection,nt integer,dimension(i_1:i_2,levs) :: jdp,kdp integer,dimension(i_1:i_2,levs,4) :: idp integer,dimension(i_1:i_2,plev) :: kkdp integer,allocatable :: kdpmpf(:) ! mapping from artificial array ! to model level ! real(kind=kind_evod) udmin,udmax real(kind=kind_evod) lam0,cos_f_a,sin_f_a,mindetam,twopi,degrad real(kind=kind_evod) dlam_con real(kind=kind_evod) x1mx2, ! | weights for lcbas_h & x1mx3, ! | & x2mx3 ! | real(kind=kind_evod) x_1, ! | - for lcdbas_h & x_2, ! |- grid values & x_3, ! | & x_4, ! | ! & x1mx2, ! | ! & x1mx3, ! | & x1mx4, ! |- differences of grid values ! & x2mx3, ! | & x2mx4, ! | & x3mx4 ! | real(kind=kind_evod) :: x1mx2i,x1mx3i,x1mx4i,x2mx3i,x2mx4i,x3mx4i &, del,leps,dp ! for eta_stuff &, rdel,dphibr,phibs,tem real(kind=kind_evod) :: cos_l_diff,sin_l_diff ! from rotate_uv_h ! &, alfa_ua,alfa_va,beta_ua,beta_va real(kind=kind_evod),dimension(i_1:i_2 ) :: cos_l_a,sin_l_a real(kind=kind_evod),dimension(i_1:i_2,levs) :: & lamdp,phidp,sigdp, & cos_l_d,sin_l_d,cos_f_d,sin_f_d real(kind=kind_evod),dimension(i_1:i_2,plev) :: & term1y,term2y,term3y,term4y, & yb,yt,ht,hb,dht,dhb,zt,zb,term1z,term2z, & term3z,term4z,ys,yn,hs,hn,dhs,dhn ! & term3z,term4z,ys,yn,hs,hn,dhs,dhn,rdphi real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: & term1x,term2x,term3x,term4x, & hl,hr,dhl,dhr real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: & x2,x3,xl,xr ! real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: ! & hl,hr,dhl,dhr !! & x2,x3,xl,xr,hl,hr,dhl,dhr,finty real(kind=kind_evod),dimension(lonf,plev) :: ud3_d,vd3_d real(kind=kind_evod), allocatable :: finty(:,:,:) real(kind=kind_evod), allocatable :: fintx(:,:,:,:) ! real(kind=kind_evod),dimension(i_1:i_2,plev,4,4) :: fintx real(kind=kind_evod),allocatable :: lbasdz(:,:,:) ! basis funcs for vert ! deriv est. at level real(kind=kind_evod),allocatable :: lbasiz(:,:,:) ! lagrange cubic interp ! wghts (vert) real(kind=kind_evod) ,allocatable :: detam(:) ! delta eta at levels &, detami(:) ! one / detam ! ------------------------------------------------------------------ logical her_x,her_y,her_z,her_a ! ------------------------------------------------------------------- logical lprint logical qmx_trac,qmy_trac,qmz_trac logical qmx_u,qmy_u,qmz_u logical qmx_v,qmy_v,qmz_v logical qmx_t,qmy_t,qmz_t ! ------------------------------------------------------------------- ! integer i_count ! save i_count ! data i_count / 0 / save kdpmpf, lbasdz, lbasiz, detam, rdel, pmap, detami ! i_count = i_count + 1 ! ! pi = 4.*atan(1.) ! degrad = 180./pi ! ------------------------------------------------------------------- if ( ini_slg == 1 ) then if (.not.allocated(kdpmpf)) allocate (kdpmpf(plev-1)) if (.not.allocated(lbasdz)) allocate (lbasdz(4,2,plev)) if (.not.allocated(lbasiz)) allocate (lbasiz(4,2,plev)) if (.not.allocated(lbasdy)) allocate (lbasdy(4,2,platd)) if (.not.allocated(lbasiy)) allocate (lbasiy(4,2,platd)) if (.not.allocated(phi)) allocate (phi(platd)) if (.not.allocated(dphi)) allocate (dphi(platd)) if (.not.allocated(dphii)) allocate (dphii(platd)) if (.not.allocated(detam)) allocate (detam(plev)) if (.not.allocated(detami)) allocate (detami(plev)) ! if (me == 0) print*,' calling grdini_h from slgscan_h ' ! call grdini_h(rcs2_a,lonsperlat) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! inline grdini_h ! if (me == 0) write(0,*)' reduced grid inside grdini_h ' twopi = pi + pi do i=1,plat/2 tem = acos(sqrt(1./rcs2_a(i))) phi(i+2) = -tem phi(platd-1-i) = tem enddo phi(1) = -pi - phi(3) phi(2) = -pi*0.5 phi(plat+3) = pi*0.5 phi(platd) = pi - phi(plat+2) ! do j=1,platd ! write(6,100)j,phi(j)*degrad ! enddo 100 format(' in grdini lat=',i4,2x,' phi=',f9.3) do jj = 2,plat+2 ! call lcdbas_h( phi(jj-1), lbasdy(1,1,jj), lbasdy(1,2,jj) ) ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! inline lcdbas_h(grd,dbas2,dbas3) jj1 = jj - 1 x_1 = phi(jj1+0) x_2 = phi(jj1+1) x_3 = phi(jj1+2) x_4 = phi(jj1+3) x1mx2 = x_1 - x_2 x1mx3 = x_1 - x_3 x1mx4 = x_1 - x_4 x2mx3 = x_2 - x_3 x2mx4 = x_2 - x_4 x3mx4 = x_3 - x_4 x1mx2i = 1.0 / x1mx2 x1mx3i = 1.0 / x1mx3 x1mx4i = 1.0 / x1mx4 x2mx3i = 1.0 / x2mx3 x2mx4i = 1.0 / x2mx4 x3mx4i = 1.0 / x3mx4 lbasdy(1,1,jj) = x2mx3 * x2mx4 * x1mx2i * x1mx3i * x1mx4i lbasdy(2,1,jj) = - x1mx2i + x2mx3i + x2mx4i lbasdy(3,1,jj) = - x1mx2 * x2mx4 * x1mx3i * x2mx3i * x3mx4i lbasdy(4,1,jj) = x1mx2 * x2mx3 * x1mx4i * x2mx4i * x3mx4i lbasdy(1,2,jj) = - x2mx3 * x3mx4 * x1mx2i * x1mx3i * x1mx4i lbasdy(2,2,jj) = x1mx3 * x3mx4 * x1mx2i * x2mx3i * x2mx4i lbasdy(3,2,jj) = - x1mx3i - x2mx3i + x3mx4i lbasdy(4,2,jj) = - x1mx3 * x2mx3 * x1mx4i * x2mx4i * x3mx4i ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! call lcbas_h( phi(jj-1), lbasiy(1,1,jj), lbasiy(1,2,jj) ) ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! inline lcbas_h( grd, bas1, bas2 ) ! lbasiy(1,1,jj) = x_1 lbasiy(2,1,jj) = x_2 lbasiy(3,1,jj) = x_3 lbasiy(4,1,jj) = x_4 lbasiy(1,2,jj) = x1mx2i * x1mx3i * x1mx4i lbasiy(2,2,jj) = - x1mx2i * x2mx3i * x2mx4i lbasiy(3,2,jj) = x1mx3i * x2mx3i * x3mx4i lbasiy(4,2,jj) = - x1mx4i * x2mx4i * x3mx4i ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . end do ! do jj do j = 1,platd-1 dphi(j) = phi(j+1) - phi(j) dphii(j) = 1.0 / dphi(j) end do !my nlonex is extended lonsperlat and reversed so south to north sn !my real lats do j=1,plat jj = platd -2 -j+1 nlonex(jj) = lonsperlat(j) enddo !my sp nlonex(1) = lonsperlat(plat) nlonex(2) = lonsperlat(plat) !my np nlonex(plat+3) = lonsperlat(1) nlonex(plat+4) = lonsperlat(1) lam0 = 0.0 do j=1,platd dlam(j) = twopi/float(nlonex(j)) rdlam(j) = 1.0/dlam(j) rdlam6(j) = (1.0/6.0)*rdlam(j) do i = 1,nlonex(j)+3 lam(i,j) = float(i-2)*dlam(j) + lam0 end do enddo if (me == 0) print*,' fini grdini_h from slgscan_h ' ! call eta_stuff(lats_dim_a,lats_node_a,etamid,etaint, ! & kdpmpf,kdpmph,detam,detai,lbasdz,lbassd,lbasiz,lbassi) ! inline eta_stuff do k = 2,plev-2 ! call lcbas_h( etamid(k-1), lbasiz(1,1,k), ! & lbasiz(1,2,k) ) ! call lcdbas_h( etamid(k-1), lbasdz(1,1,k), ! & lbasdz(1,2,k) ) ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! inline lcbas_h( grd, bas1, bas2 ) k1 = k - 1 x_1 = etamid(k1+0) x_2 = etamid(k1+1) x_3 = etamid(k1+2) x_4 = etamid(k1+3) x1mx2 = x_1 - x_2 x1mx3 = x_1 - x_3 x1mx4 = x_1 - x_4 x2mx3 = x_2 - x_3 x2mx4 = x_2 - x_4 x3mx4 = x_3 - x_4 x1mx2i = 1.0 / x1mx2 x1mx3i = 1.0 / x1mx3 x1mx4i = 1.0 / x1mx4 x2mx3i = 1.0 / x2mx3 x2mx4i = 1.0 / x2mx4 x3mx4i = 1.0 / x3mx4 lbasdz(1,1,k) = x2mx3 * x2mx4 * x1mx2i * x1mx3i * x1mx4i lbasdz(2,1,k) = - x1mx2i + x2mx3i + x2mx4i lbasdz(3,1,k) = - x1mx2 * x2mx4 * x1mx3i * x2mx3i * x3mx4i lbasdz(4,1,k) = x1mx2 * x2mx3 * x1mx4i * x2mx4i * x3mx4i lbasdz(1,2,k) = - x2mx3 * x3mx4 * x1mx2i * x1mx3i * x1mx4i lbasdz(2,2,k) = x1mx3 * x3mx4 * x1mx2i * x2mx3i * x2mx4i lbasdz(3,2,k) = - x1mx3i - x2mx3i + x3mx4i lbasdz(4,2,k) = - x1mx3 * x2mx3 * x1mx4i * x2mx4i * x3mx4i lbasiz(1,1,k) = x_1 lbasiz(2,1,k) = x_2 lbasiz(3,1,k) = x_3 lbasiz(4,1,k) = x_4 lbasiz(1,2,k) = x1mx2i * x1mx3i * x1mx4i lbasiz(2,2,k) = - x1mx2i * x2mx3i * x2mx4i lbasiz(3,2,k) = x1mx3i * x2mx3i * x3mx4i lbasiz(4,2,k) = - x1mx4i * x2mx4i * x3mx4i ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ! inline lcdbas_h(grd,dbas2,dbas3) ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . end do ! do k ! mindetam = 999999.9999 do k = 1,plev-1 detam (k) = etamid(k+1) - etamid(k) !min(detam) < pmap if( detam(k) < mindetam ) mindetam = detam(k) detami(k) = 1.0 / detam(k) end do ! k = plev + 1 leps = 1.e-05 pmap = (etamid(plev) - etamid(1)) / mindetam + 1 del = (etamid(plev) - etamid(1)) / float(pmap) rdel = float(pmap)/(etamid(levs) - etamid(1)) if (me == 0) then print*,'calculated pmap value is = ',pmap print*,'mindetam,del=',mindetam,del,' plev=',plev print *,' etamid=',etamid(1:plev) endif ! kdpmpf(1) = 1 k = 2 do kk = 2,pmap dp = etamid (1) + float(kk-1)*del if (dp > etamid(k)+leps) then kdpmpf(k) = kk k = k + 1 endif enddo endif ! fin ini_slg ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if ( ini_dp == 1 ) then do lan_loc=1,lats_node_a !sela begin lan_loc over grids without halos lat_loc = latg + 1 & - global_lats_a(ipt_lats_node_a+lats_node_a-lan_loc) dlam_con = dlam(2+lat_loc) do k=1,levs do i=1,lonsperlat(lat_loc) lammp_a(i,k,lan_loc) = float(i-1)*dlam_con phimp_a(i,k,lan_loc) = phi(2+lat_loc) sigmp_a(i,k,lan_loc) = etamid(k) enddo enddo do i=1,lonsperlat(lat_loc) sigmp_a(i,plev,lan_loc) = sigmp_a(i,plev,lan_loc) - 1.e-12 enddo enddo endif ! fin ini_dp if ( ini_slg == 1 .or. ini_dp == 1) return !sela completed initialization of slg array and base functions ! ------------------------------------------------------------------- !sk--------------------------------------------------------------------- if (quamon) then !quasi-monotone in lagrange qmx_trac = .true. !in x qmy_trac = .true. !in y qmz_trac = .true. !in z qmx_u = .true. qmy_u = .true. qmz_u = .false. qmx_v = .true. qmy_v = .true. qmz_v = .false. qmx_t = .true. qmy_t = .true. qmz_t = .false. else !default qmx_trac = .false. !in x qmy_trac = .false. !in y qmz_trac = .false. !in z qmx_u = .false. qmy_u = .false. qmz_u = .false. qmx_v = .false. qmy_v = .false. qmz_v = .false. qmx_t = .false. qmy_t = .false. qmz_t = .false. endif jcen = 2 + lat her_x = herm_x her_y = herm_y her_z = herm_z her_a = her_x .and. her_y .and. her_z ! if(lat.eq.1 .and. me.eq.0) ! if(i_count.eq.2 .and. me.eq.0) ! & print*,'her_x=',her_x,' her_y=',her_y,' her_z=',her_z do i=i_1,i_2 cos_l_a(i) = cos(lam(i+1,jcen)) sin_l_a(i) = sin(lam(i+1,jcen)) enddo cos_f_a = cos(phi(jcen)) sin_f_a = sin(phi(jcen)) if(abs(phi(jcen)) >= phigs) then ! i_branch = 0 !$$$ print*,' phi(jcen)=',phi(jcen)*57.295,' jcen=',jcen, !$$$ $ ' dep3dg i_branch=',i_branch !sk10052012 if (settls_dep3dg) then call settls_dep3dg_h(i_1, i_2, s_lat_in_pe, n_lat_in_pe, & jcen, ztodt, iter, ra, & uu_gr_h_2(1,s_lat_in_pe), & vv_gr_h_2(1,s_lat_in_pe), & ww_gr_h_2(1,s_lat_in_pe), & lam, phi, dphii, etamid, detami, kdpmpf, & lammp_a(1,1,lan), phimp_a(1,1,lan), & sigmp_a(1,1,lan), & lamdp, phidp, sigdp, me, & sin_l_d, cos_l_d, sin_f_d, cos_f_d, & ug_m_2(1,s_lat_in_pe), & vg_m_2(1,s_lat_in_pe), & ww_m_2(1,s_lat_in_pe), & rdel) else call dep3dg_h(i_1, i_2, s_lat_in_pe, n_lat_in_pe, & jcen, ztodt, iter, ra, & uu_gr_h_2(1,s_lat_in_pe), & vv_gr_h_2(1,s_lat_in_pe), & ww_gr_h_2(1,s_lat_in_pe), & lam, phi, dphii, etamid, detami, kdpmpf, & lammp_a(1,1,lan), phimp_a(1,1,lan), & sigmp_a(1,1,lan), & lamdp, phidp, sigdp, me, & sin_l_d, cos_l_d, sin_f_d, cos_f_d, rdel) endif else ! i_branch = 1 !$$$ write(0,*)' phi(jcen)=',phi(jcen)*57.295,' jcen=',jcen, !$$$ $ ' dep3ds i_branch=',i_branch !sk10052012 if (settls_dep3ds) then call settls_dep3ds_h(i_1, i_2, s_lat_in_pe, n_lat_in_pe, & jcen, ztodt, iter, ra, & uu_gr_h_2(1,s_lat_in_pe), & vv_gr_h_2(1,s_lat_in_pe), & ww_gr_h_2(1,s_lat_in_pe), & lam, phi, dphii, etamid, detami, kdpmpf, & lammp_a(1,1,lan), phimp_a(1,1,lan), & sigmp_a(1,1,lan), & lamdp, phidp, sigdp, me, & sin_l_d, cos_l_d, sin_f_d, cos_f_d, & ug_m_2(1,s_lat_in_pe), & vg_m_2(1,s_lat_in_pe), & ww_m_2(1,s_lat_in_pe), & rdel) else call dep3ds_h(i_1, i_2, s_lat_in_pe, n_lat_in_pe, & jcen, ztodt, iter, ra, & uu_gr_h_2(1,s_lat_in_pe), & vv_gr_h_2(1,s_lat_in_pe), & ww_gr_h_2(1,s_lat_in_pe), & lam, phi, dphii, etamid, detami, kdpmpf, & lammp_a(1,1,lan), phimp_a(1,1,lan), & sigmp_a(1,1,lan), & lamdp, phidp, sigdp, me, & sin_l_d, cos_l_d, sin_f_d, cos_f_d, rdel) endif endif dphibr = 1./( phi(platd/2+1) - phi(platd/2) ) phibs = phi(1) !my compute jdp first before idp since rdlam is now lat dependent do k = 1,levs do i=i_1,i_2 jtem = int ( (phidp(i,k) - phibs)*dphibr + 1. ) if( phidp(i,k) >= phi(jtem+1) ) jtem = jtem + 1 jdp(i,k) = jtem jm1 = max(1,jtem-1) jp1 = min(platd,jtem+1) jp2 = min(platd,jtem+2) idp(i,k,2) = 2 + int( lamdp(i,k) * rdlam(jtem) ) if (redgg_a) then idp(i,k,1) = 2 + int( lamdp(i,k) * rdlam(jm1) ) idp(i,k,3) = 2 + int( lamdp(i,k) * rdlam(jp1) ) idp(i,k,4) = 2 + int( lamdp(i,k) * rdlam(jp2)) else idp(i,k,1) = idp(i,k,2) idp(i,k,3) = idp(i,k,2) idp(i,k,4) = idp(i,k,2) endif ! kdp(i,k) = bisection(kdpmpf,plev-1, & int((sigdp(i,k) - etamid(1))*rdel + 1. )) if(sigdp(i,k) >= etamid(kdp(i,k)+1)) then kdp(i,k) = kdp(i,k) + 1 endif ! enddo enddo ! write(0,*)' before calling herx i_1=',i_1,' i_2=',i_2 call herxinit_h(i_1,i_2,idp,jdp,lamdp,xl,xr,hl,hr,dhl,dhr) call lagxinit_h(i_1,i_2,lam,lamdp,idp,jdp,x2,x3, & term1x,term2x,term3x,term4x) call heryinit_h(i_1,i_2,phi,dphi,dphii,phidp,jdp,ys,yn, & hs,hn,dhs,dhn) call lagyinit_h(i_1,i_2,phi,dphii,lbasiy,phidp,jdp, & yb,yt,term1y,term2y,term3y,term4y) kdim = plev kdimm2 = kdim - 2 do k = 1,plev do i = i_1,i_2 kkdp(i,k) = min(kdimm2, max(2, kdp(i,k))) enddo enddo ! if (her_z) then call herzinit_h(i_1,i_2,kdim,etamid,detam,detami,sigdp,kdp, & hb,ht,dhb,dht) else call lagzinit_h_n(i_1,i_2,kdim,lbasiz,etamid,detam,sigdp, & kdp,kkdp,hb,ht,dhb,dht,zb,zt, & term1z,term2z,term3z,term4z) endif !----------------------------------------------------------------------- if (her_a) then ! pure hermite interpolation in 3d ! -------------------------------- do nt=1,ntrac call her_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & idp,jdp,kdp,kkdp,xl,xr,hl,hr,dhl,dhr, & rgt_h(1,1,s_lat_in_pe,nt), & ys,yn,hs,hn,dhs,dhn,dphii, & kdim,lbasdz,hb,ht,dhb,dht,detam, & rgt_a(1,1,lan,nt)) enddo call her_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & idp,jdp,kdp,kkdp,xl,xr,hl,hr,dhl,dhr,ud3_h1, & ys,yn,hs,hn,dhs,dhn,dphii, & kdim,lbasdz,hb,ht,dhb,dht,detam,ud3_d) call her_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & idp,jdp,kdp,kkdp,xl,xr,hl,hr,dhl,dhr,vd3_h1, & ys,yn,hs,hn,dhs,dhn,dphii, & kdim,lbasdz,hb,ht,dhb,dht,detam,vd3_d) call her_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & idp,jdp,kdp,kkdp,xl,xr,hl,hr,dhl,dhr,td3_h1, & ys,yn,hs,hn,dhs,dhn,dphii, & kdim,lbasdz,hb,ht,dhb,dht,detam, & td3_a(1,1,lan)) call int2d_h_levs(i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim, & dpdt_d3_h1,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y, & dpdt_d3_a(1,1,lan)) else ! mix hermite and/or lagrange or pure lagrange interpolation ! ---------------------------------------------------------- if (.not. allocated(fintx)) allocate (fintx(i_1:i_2,plev,4,4)) if (.not. allocated(finty)) allocate (finty(i_1:i_2,plev,4)) do nt=1,ntrac if (her_x) then call herxin_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe,idp,jdp,kdp, & kkdp,xl,xr,hl,hr,dhl,dhr, & rgt_h(1,1,s_lat_in_pe,nt),fintx) else call lagxin_h_m(i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim, & rgt_h(1,1,s_lat_in_pe,nt),idp,jdp,kdp,kkdp, & x2,x3,term1x,term2x,term3x,term4x,fintx, & qmx_trac) endif if (her_y) then call heryin_h(i_1,i_2,jdp,ys,yn,hs,hn,dhs,dhn,dphii &, fintx,finty) else call lagyin_h_m(i_1,i_2,fintx,finty,yb,yt,term1y,term2y &, term3y,term4y,qmy_trac) endif if (her_z) then call herzin_h(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht &, detam,term1z,term2z,term3z,term4z &, rgt_a(1,1,lan,nt)) else call lagzin_h_m(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht &, detam,term1z,term2z,term3z,term4z &, rgt_a(1,1,lan,nt),qmz_trac) endif !my weighted cubic linear interpolation for generalized number of tracers if (wgt_cub_lin_xyz_trc) then call wgt_cub_lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_ in_pe &, rgt_h(1,1,s_lat_in_pe,nt),idp,jdp &, kdp,xl,xr,ys,yn ,zb,zt &, rgt_a(1,1,lan,nt)) endif enddo !----------------------------------------------------------------------- if (her_x) then call herxin_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe,idp,jdp,kdp, & kkdp,xl,xr,hl,hr,dhl,dhr,ud3_h1,fintx) else call lagxin_h_m(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,ud3_h1,idp,jdp,kdp,kkdp, & x2,x3,term1x,term2x,term3x,term4x,fintx,qmx_u) endif if (her_y) then call heryin_h(i_1,i_2,jdp,ys,yn,hs,hn,dhs,dhn,dphii, & fintx,finty) else call lagyin_h_m(i_1,i_2,fintx,finty,yb,yt,term1y,term2y, & term3y,term4y,qmy_u) endif if (her_z) then call herzin_h(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht, & detam,term1z,term2z,term3z,term4z,ud3_d) else call lagzin_h_m(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht, & detam,term1z,term2z,term3z,term4z,ud3_d, & qmz_u) endif ! if (her_x) then call herxin_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe,idp,jdp,kdp, & kkdp,xl,xr,hl,hr,dhl,dhr,vd3_h1,fintx) else call lagxin_h_m(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,vd3_h1,idp,jdp,kdp,kkdp, & x2,x3,term1x,term2x,term3x,term4x, & fintx,qmx_v) endif if (her_y) then call heryin_h(i_1,i_2,jdp,ys,yn,hs,hn,dhs,dhn,dphii, & fintx,finty) else call lagyin_h_m(i_1,i_2,fintx,finty,yb,yt,term1y,term2y, & term3y,term4y,qmy_v) endif if (her_z) then call herzin_h(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht, & detam,term1z,term2z,term3z,term4z,vd3_d) else call lagzin_h_m(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb, & dht,detam,term1z,term2z,term3z,term4z, & vd3_d,qmz_v) endif !----------------------------------------------------------------------- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !----------------------------------------------------------------------- if (her_x) then call herxin_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe,idp,jdp,kdp, & kkdp,xl,xr,hl,hr,dhl,dhr,td3_h1,fintx) else call lagxin_h_m(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,td3_h1,idp,jdp,kdp,kkdp,x2,x3, & term1x,term2x,term3x,term4x,fintx,qmx_t) endif if (her_y) then call heryin_h(i_1,i_2,jdp,ys,yn,hs,hn,dhs,dhn,dphii, & fintx,finty) else call lagyin_h_m(i_1,i_2,fintx,finty,yb,yt,term1y,term2y, & term3y,term4y,qmy_t) endif if (her_z) then call herzin_h(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht, & detam,term1z,term2z,term3z,term4z, & td3_a(1,1,lan)) else call lagzin_h_m(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht,dhb,dht, & detam,term1z,term2z,term3z,term4z, & td3_a(1,1,lan),qmz_t) endif !----------------------------------------------------------------------- !my weighted cubic linear interpolation if (wgt_cub_lin_xyz) then call wgt_cub_lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & ud3_h1,idp,jdp,kdp,xl,xr,ys,yn, & zb,zt,ud3_d) call wgt_cub_lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & vd3_h1,idp,jdp,kdp,xl,xr,ys,yn, & zb,zt,vd3_d) call wgt_cub_lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & td3_h1,idp,jdp,kdp,xl,xr,ys,yn, & zb,zt,td3_a(1,1,lan)) endif !my use linear interpolation for u,v,t for nonlinear terms and add to advected terms ug,vg,tg if (lin_xyz) then call lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & ud3_h2,vd3_h2,td3_h2,idp,jdp,kdp,xl,xr, & ys,yn,zb,zt,ud3_d,vd3_d,td3_a(1,1,lan)) endif !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (lin_xyz.and.cont_eq_opt1) then if (opt1_3d_qcubic) then !sk10302012 (ia) tricubic interpolation for dpdt_d3_h1 call lagxin_h_m(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,dpdt_d3_h1,idp,jdp,kdp,kkdp,x2,x3, & term1x,term2x,term3x,term4x,fintx,quamon) call lagyin_h_m(i_1,i_2,fintx,finty,yb,yt,term1y,term2y, & term3y,term4y,quamon) call lagzin_h_m(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht, & dhb,dht,detam,term1z,term2z,term3z,term4z, & dpdt_d3_a(1,1,lan),quamon) else !sk11022012 (ib) tricubic interpolation for dpdt_d3_h1 call linxyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & dpdt_d3_h1,idp,jdp,kdp,xl,xr,ys,yn,zb,zt, & dpdt_d3_a(1,1,lan)) endif !sk10302012 (ii) bicubic interpolation for dpdt_d3_h2 call int2d_h_levs_mxy_(i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim, & dpdt_d3_h2,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y, & dpdt_d3_a(1,1,lan)) elseif (lin_xyz .and. lin_xy) then call int2d_h_levs_mxy(i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim, & dpdt_d3_h1,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y, & dpdt_d3_a(1,1,lan)) !use linear interp in x and y for nonlinear term and add to advected lnps call lin_xy_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,dpdt_d3_h2,idp,jdp,x2,x3,yb,yt, & dpdt_d3_a(1,1,lan)) else call int2d_h_levs(i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim, & dpdt_d3_h1,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y, & dpdt_d3_a(1,1,lan)) endif if (allocated(fintx)) deallocate (fintx) if (allocated(finty)) deallocate (finty) endif ! if (her_a) then ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !sela udmax=-9999. !sela udmin= 9999. !sela do k=1,levs !sela do i=1,lonf !sela if(ud3_d(i,k) > udmax)udmax=ud3_d(i,k) !sela if(ud3_d(i,k) < udmin)udmin=ud3_d(i,k) !sela enddo !sela enddo !sela print*,'lan=',lan,' lonf=',lonf,' udmax udmin=',udmax,udmin !sela udmax=-9999. !sela udmin= 9999. !sela do k=1,levs !sela do i=1,lonf !sela if(vd3_d(i,k) > udmax)udmax=vd3_d(i,k) !sela if(vd3_d(i,k) < udmin)udmin=vd3_d(i,k) !sela enddo !sela enddo !sela print*,'lan=',lan,' lonf=',lonf,' vdmax vdmin=',udmax,udmin ! call rotate_uv_h(i_1,i_2, ! & ud3_d,vd3_d, ud3_a(1,1,lan),vd3_a(1,1,lan), ! & cos_l_a,sin_l_a,cos_f_a,sin_f_a, ! & cos_l_d,sin_l_d,cos_f_d,sin_f_d) do k = 1,plev do i = i_1,i_2 cos_l_diff = cos_l_a(i)*cos_l_d(i,k) + sin_l_a(i)*sin_l_d(i,k) sin_l_diff = sin_l_a(i)*cos_l_d(i,k) - cos_l_a(i)*sin_l_d(i,k) ! ! ud3_d, vd3_d are bottom to top, coming from lagzin. ! alfas,betas are bottom to top, coming from previous loops. !therefore: ! ud3_a, vd3_a are bottom to top, as expected in gloopa. ud3_a(i,k,lan) = cos_l_diff * ud3_d(i,k) & + sin_l_diff*sin_f_d(i,k) * vd3_d(i,k) vd3_a(i,k,lan) = -sin_l_diff*sin_f_a * ud3_d(i,k) & + (cos_f_a*cos_f_d(i,k) + & cos_l_diff*sin_f_a*sin_f_d(i,k)) * vd3_d(i,k) end do end do !sela udmax=-9999. !sela udmin= 9999. !sela do k=1,levs !sela do i=1,lonf !sela if(ud3_a(i,k,lan) > udmax)udmax=ud3_a(i,k,lan) !sela if(ud3_a(i,k,lan) < udmin)udmin=ud3_a(i,k,lan) !sela enddo !sela enddo !sela print*,'lan=',lan,' lonf=',lonf,' uamax uamin=',udmax,udmin !sela udmax=-9999. !sela udmin= 9999. !sela do k=1,levs !sela do i=1,lonf !sela if(vd3_a(i,k,lan) > udmax)udmax=vd3_a(i,k,lan) !sela if(vd3_a(i,k,lan) < udmin)udmin=vd3_a(i,k,lan) !sela enddo !sela enddo !sela print*,'lan=',lan,' lonf=',lonf,' vamax vamin=',udmax,udmin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! return end subroutine dep3dg_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & jcen,dt,iterdp,ra,ub,vb,wb, & lam,phib,dphibi,etamid,detami, & kdpmpf,lammp_a,phimp_a,sigmp_a, & lamdp,phidp,sigdp,me, & sin_l_d,cos_l_d,sin_f_d,cos_f_d,rdel) ! use machine , only : kind_evod use pmgrid , only : mprec,plat,platd, & plev,plon,plond,pi use slgshr , only : dlam,rdlam use namelist_def , only : redgg_a ! implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer jcen,iterdp,me integer,dimension(plev-1) :: kdpmpf ! artificial vert grid indic real(kind=kind_evod) dt,ra,rdel ! real(kind=kind_evod) dt,ra,rdel,pi real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: ub,vb,wb real(kind=kind_evod),dimension(plev) :: detami real(kind=kind_evod),dimension(plev) :: etamid ! eta at levels real(kind=kind_evod),dimension(plond,platd) :: lam real(kind=kind_evod),dimension(platd) :: phib,dphibi real(kind=kind_evod),dimension(plon,plev) :: lammp_a,phimp_a, & sigmp_a real(kind=kind_evod),dimension(i_1:i_2,plev):: & lamdp,phidp,sigdp,sin_l_d,cos_l_d, & sin_f_d,cos_f_d ! local variables integer iter,i,k,kk,bisection,jtem,jm1,jp1,jp2 integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4):: idp real(kind=kind_evod) :: sphisc,cphisc,clamsc,phibs,dphibr,fac real(kind=kind_evod) :: phicen,cphic,sphic,hfdt,cphic2i real(kind=kind_evod) :: twopi,pi2,sgnphi,sphipr,cphipr, & clampr,slam2,phipi2,slampr,dlamx, & coeff,distmx,dist real(kind=kind_evod) :: cdlam,clamp,cphimp,cphip,sdlam, & slamp,sphimp,sphip,cosphidp ! real(kind=kind_evod),dimension(i_1:i_2,plev):: ys,yn,ump,vmp,wmp real(kind=kind_evod),dimension(i_1:i_2,plev):: ump,vmp,wmp &, upr,vpr,lampr,phipr &, sigpr ! real(kind=kind_evod),dimension(i_1:i_2,plev,2:3):: xl ! real(kind=kind_evod),dimension(i_1:i_2,plev,4):: xl,xr parameter ( fac = 1. - 1.e-12 ) ! twopi = pi + pi pi2 = 0.5 * pi hfdt = 0.5 * dt phicen = phib(jcen) cphic = cos( phicen ) sphic = sin( phicen ) cphic2i = 1.0 / (cphic*cphic) ! do k = 1,plev do i = i_1,i_2 sphisc = sin( phimp_a(i,k) ) cphisc = cos( phimp_a(i,k) ) clamsc = cos( lam(i+1,jcen) - lammp_a(i,k) ) phipr(i,k) = asin( sphisc*cphic - cphisc*sphic*clamsc ) end do end do ! dphibr = 1./( phib(platd/2+1) - phib(platd/2) ) phibs = phib(1) do iter=1,iterdp !my compute jdp first since rdlam is now lat dependent do k = 1,plev do i=i_1,i_2 jtem = int ( (phimp_a(i,k) - phibs)*dphibr + 1. ) ! commented by moorthi on 10/18/2011 ! if (phimp_a(i,k) < -900.0) then ! write(999,*) ! . 'inside dep3dg i,k,phimp_a(i,k),phibs,dphibr,jdp = ', ! . i,k,phimp_a(i,k),phibs,dphibr,jdp(i,k) ! close(999) ! stop 999 ! endif if( phimp_a(i,k) >= phib(jtem+1) ) jtem = jtem + 1 jdp(i,k) = jtem jm1 = max(1,jtem-1) jp1 = min(platd,jtem+1) jp2 = min(platd,jtem+2) idp(i,k,2) = 2 + int( lammp_a(i,k) * rdlam(jtem) ) if (redgg_a) then idp(i,k,1) = 2 + int( lammp_a(i,k) * rdlam(jm1) ) idp(i,k,3) = 2 + int( lammp_a(i,k) * rdlam(jp1) ) idp(i,k,4) = 2 + int( lammp_a(i,k) * rdlam(jp2) ) else idp(i,k,1) = idp(i,k,2) idp(i,k,3) = idp(i,k,2) idp(i,k,4) = idp(i,k,2) endif ! kdp(i,k) = bisection(kdpmpf,plev-1, & int((sigmp_a(i,k) - etamid(1))*rdel + 1. )) if(sigmp_a(i,k) >= etamid(kdp(i,k)+1)) then kdp(i,k) = kdp(i,k) + 1 end if enddo enddo ! ! call xywgts_h(i_1,i_2,lam,phib,dphib,idp,jdp, ! & lammp_a,phimp_a,xl,ys) !! & lammp_a,phimp_a,xl,xr,ys,yn) ! call int3dv_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & ub,vb,etamid,detami,sigmp_a,idp,jdp,kdp, & lam, phib, dphibi, lammp_a,phimp_a, & ump,vmp,wb,wmp) ! & xl,xr,ys,yn,ump,vmp,wb,wmp) !sela& wb,wmp,etaint,detai,kdph) ! do k = 1,plev do i = i_1,i_2 ump(i,k) = ump(i,k)*ra vmp(i,k) = vmp(i,k)*ra ! sdlam = sin( lam(i+1,jcen) - lammp_a(i,k) ) cdlam = cos( lam(i+1,jcen) - lammp_a(i,k) ) sphimp = sin( phimp_a(i,k) ) cphimp = cos( phimp_a(i,k) ) sphip = sphimp*cphic - cphimp*sphic*cdlam cphip = cos( asin( sphip ) ) slamp = -sdlam*cphimp/cphip clamp = cos( asin( slamp ) ) vpr(i,k) = (vmp(i,k)*(cphimp*cphic + sphimp*sphic*cdlam) - & ump(i,k)*sphic*sdlam)/cphip upr(i,k) = (ump(i,k)*cdlam + vmp(i,k)*sphimp*sdlam + & vpr(i,k)*slamp*sphip)/clamp ! lampr(i,k) = -hfdt* upr(i,k) / cos( phipr(i,k) ) phipr(i,k) = -hfdt* vpr(i,k) enddo enddo coeff = (1.1*hfdt)**2 distmx = (sign(pi2,phicen) - phicen)**2/coeff sgnphi = sign( 1., phicen ) ! do k=1,plev do i=i_1,i_2 sphipr = sin( phipr(i,k) ) cphipr = cos( phipr(i,k) ) slampr = sin( lampr(i,k) ) clampr = cos( lampr(i,k) ) phimp_a(i,k)=asin((sphipr*cphic + cphipr*sphic*clampr)*fac) if ( abs(phimp_a(i,k)) >= phib(3+plat)*fac ) & phimp_a(i,k) = sign( phib(3+plat),phimp_a(i,k) )*fac dlamx = asin((slampr*cphipr/cos(phimp_a(i,k)))*fac) dist = upr(i,k)*upr(i,k) + vpr(i,k)*vpr(i,k) ! if (dist > distmx) then slam2 = slampr*slampr phipi2 = asin((sqrt((slam2-1.)/(slam2-cphic2i)))*fac) if (sgnphi*phipr(i,k) > phipi2) then dlamx = sign(pi,lampr(i,k)) - dlamx end if end if ! lammp_a(i,k) = lam(i+1,jcen) + dlamx if( lammp_a(i,k) >= twopi ) then lammp_a(i,k) = lammp_a(i,k) - twopi elseif( lammp_a(i,k) < 0.0 ) then lammp_a(i,k) = lammp_a(i,k) + twopi endif ! sigpr(i,k) = -hfdt*wmp(i,k) sigmp_a(i,k) = etamid(k) + sigpr(i,k) ! sigmp_a(i,k) = max(etamid(1), & min(sigmp_a(i,k),etamid(plev)-mprec)) enddo enddo enddo ! do iter=1,iterdp ends here ! do k = 1,plev do i = i_1,i_2 lampr(i,k) = lampr(i,k) + lampr(i,k) phipr(i,k) = phipr(i,k) + phipr(i,k) sigdp(i,k) = etamid(k) + sigpr(i,k) + sigpr(i,k) end do end do coeff = (1.1*dt)**2 distmx = (sign(pi2,phicen) - phicen)**2/coeff sgnphi = sign( 1., phicen ) ! do k=1,plev kk = plev+1-k do i=i_1,i_2 sphipr = sin( phipr(i,k) ) cphipr = cos( phipr(i,k) ) slampr = sin( lampr(i,k) ) clampr = cos( lampr(i,k) ) phidp(i,k) = asin((sphipr*cphic + cphipr*sphic*clampr)*fac) if ( abs(phidp(i,k)) >= phib(3+plat)*fac ) & phidp(i,k) = sign( phib(3+plat),phidp(i,k) )*fac cosphidp = cos(phidp(i,k)) cos_f_d(i,kk) = cosphidp ! for vector allignment sin_f_d(i,kk) = sin(phidp(i,k)) ! for vector allignment dlamx = asin((slampr*cphipr/cosphidp)*fac) dist = upr(i,k)*upr(i,k) + vpr(i,k)*vpr(i,k) ! if (dist > distmx) then slam2 = slampr*slampr phipi2 = asin((sqrt((slam2-1.)/(slam2-cphic2i)))*fac) if (sgnphi*phipr(i,k) > phipi2) then dlamx = sign(pi,lampr(i,k)) - dlamx end if end if ! lamdp(i,k) = lam(i+1,jcen) + dlamx if( lamdp(i,k) >= twopi ) then lamdp(i,k) = lamdp(i,k) - twopi elseif( lamdp(i,k) < 0.0 ) then lamdp(i,k) = lamdp(i,k) + twopi endif cos_l_d(i,kk) = cos(lamdp(i,k)) ! for vector allignment sin_l_d(i,kk) = sin(lamdp(i,k)) ! for vector allignment ! sigdp(i,k) = max(etamid(1), & min(sigdp(i,k),etamid(plev)-mprec)) enddo enddo return end subroutine dep3ds_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & jcen,dt,iterdp,ra,ub,vb,wb, & lam,phib,dphibi,etamid,detami, & kdpmpf,lammp_a,phimp_a,sigmp_a, & lamdp,phidp,sigdp,me, & sin_l_d,cos_l_d,sin_f_d,cos_f_d,rdel) use machine , only : kind_evod use pmgrid , only : mprec,platd,plev, & plon,plond,pi use slgshr , only : dlam,rdlam use namelist_def , only : redgg_a implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer jcen,iterdp,me integer,dimension(plev-1) :: kdpmpf ! artificial vert grid indic real(kind=kind_evod) dt,ra,rdel ! real(kind=kind_evod) dt,ra,rdel,pi real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: ub,vb,wb real(kind=kind_evod),dimension(plev) :: detami real(kind=kind_evod),dimension(plev) :: etamid ! eta at levels real(kind=kind_evod),dimension(plond,platd) :: lam real(kind=kind_evod),dimension(platd) :: phib,dphibi real(kind=kind_evod),dimension(plon,plev) :: lammp_a,phimp_a, & sigmp_a real(kind=kind_evod),dimension(i_1:i_2,plev):: & lamdp,phidp,sigdp,sin_l_d,cos_l_d,sin_f_d,cos_f_d ! local variables integer iter,i,k,kk,bisection,jtem,jm1,jp1,jp2 integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod) :: phibs,dphibr real(kind=kind_evod) :: phicen,twopi,hfdt ! real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,ump,vmp,wmp real(kind=kind_evod),dimension(i_1:i_2,plev) :: ump,vmp,wmp &, lampr,phipr,sigpr ! real(kind=kind_evod),dimension(i_1:i_2,plev,2:3):: xl ! real(kind=kind_evod),dimension(i_1:i_2,plev,4):: xl,xr twopi = pi + pi hfdt = 0.5 * dt phicen = phib(jcen) ! dphibr = 1./( phib(platd/2+1) - phib(platd/2) ) phibs = phib(1) ! do iter=1,iterdp !my compute jdp first since rdlam is now lat dependent do k = 1,plev do i=i_1,i_2 jtem = int ( (phimp_a(i,k) - phibs)*dphibr + 1. ) ! commented by moorthi on 10/18/2011 ! if (phimp_a(i,k) < -900.0) then ! write(999,*) ! . 'inside dep3ds i,k,phimp_a(i,k),phibs,dphibr,jdp = ', ! . i,k,phimp_a(i,k),phibs,dphibr,jdp(i,k) ! close(999) ! stop 999 ! endif !$$$ print*,'inside dep3ds jcen,i,k,phimp_a(i,k),phibs,dphibr,jdp = ', !$$$ . jcen,i,k,phimp_a(i,k),phibs,dphibr,jdp(i,k) if( phimp_a(i,k) >= phib(jtem+1) ) jtem = jtem + 1 jdp(i,k) = jtem jm1 = max(1,jtem-1) jp1 = min(platd,jtem+1) jp2 = min(platd,jtem+2) !111 format('jcen=',i5,' i=',i4,2x,' k=',i3,2x,' jdp-jcen=',i6) idp(i,k,2) = 2 + int( lammp_a(i,k) * rdlam(jtem) ) if (redgg_a) then idp(i,k,1) = 2 + int( lammp_a(i,k) * rdlam(jm1) ) idp(i,k,3) = 2 + int( lammp_a(i,k) * rdlam(jp1) ) idp(i,k,4) = 2 + int( lammp_a(i,k) * rdlam(jp2) ) else idp(i,k,1) = idp(i,k,2) idp(i,k,3) = idp(i,k,2) idp(i,k,4) = idp(i,k,2) endif ! kdp(i,k) = bisection(kdpmpf,plev-1, & int((sigmp_a(i,k) - etamid(1))*rdel + 1. )) if(sigmp_a(i,k) >= etamid(kdp(i,k)+1)) then kdp(i,k) = kdp(i,k) + 1 end if enddo enddo ! call xywgts_h(i_1,i_2,lam,phib,dphib,idp,jdp, ! & lammp_a,phimp_a,xl,ys) ! & lammp_a,phimp_a,xl,xr,ys,yn) call int3dv_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & ub,vb,etamid,detami,sigmp_a,idp,jdp,kdp, & lam, phib, dphibi, lammp_a,phimp_a, & ump,vmp,wb,wmp) ! & xl,xr,ys,yn,ump,vmp,wb,wmp) !sela& wb,wmp,etaint,detai,kdph) do k = 1,plev do i = i_1,i_2 ump(i,k) = ump(i,k)*ra vmp(i,k) = vmp(i,k)*ra ! lampr(i,k) = -hfdt*ump(i,k) / cos(phimp_a(i,k)) phipr(i,k) = -hfdt*vmp(i,k) sigpr(i,k) = -hfdt*wmp(i,k) lammp_a(i,k) = lam(i+1,jcen) + lampr(i,k) phimp_a(i,k) = phicen + phipr(i,k) sigmp_a(i,k) = etamid(k) + sigpr(i,k) ! if(lammp_a(i,k) >= twopi) then lammp_a(i,k) = lammp_a(i,k) - twopi elseif(lammp_a(i,k) < 0.0) then lammp_a(i,k) = lammp_a(i,k) + twopi endif ! sigmp_a(i,k) = max(etamid(1), & min(sigmp_a(i,k),etamid(plev)-mprec)) enddo enddo enddo !do iter=1,iterdp loop do k = 1,plev kk = plev+1-k do i=i_1,i_2 lamdp(i,k) = lam(i+1,jcen) + lampr(i,k) + lampr(i,k) phidp(i,k) = phicen + phipr(i,k) + phipr(i,k) sigdp(i,k) = etamid(k) + sigpr(i,k) + sigpr(i,k) if(lamdp(i,k) >= twopi) then lamdp(i,k) = lamdp(i,k) - twopi elseif(lamdp(i,k) < 0.0) then lamdp(i,k) = lamdp(i,k) + twopi endif cos_l_d(i,kk) = cos(lamdp(i,k)) ! for vector allignment sin_l_d(i,kk) = sin(lamdp(i,k)) ! for vector allignment cos_f_d(i,kk) = cos(phidp(i,k)) ! for vector allignment sin_f_d(i,kk) = sin(phidp(i,k)) ! for vector allignment sigdp(i,k) = max(etamid(1), & min(sigdp(i,k),etamid(plev)-mprec)) enddo enddo return end subroutine settls_dep3dg_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & jcen,dt,iterdp,ra,ub,vb,wb, & lam,phib,dphibi,etamid,detami, & kdpmpf,lamdp_a,phidp_a,sigdp_a, & lamdp,phidp,sigdp,me, & sin_l_d,cos_l_d,sin_f_d,cos_f_d, & un,vn,wn,rdel) ! sk 06142012 ! settls for trajectory computations ! ub,vb,wb -> time t+dt, time-extrapolated wind components ! un,vn,wn -> time t, grid-point wind components ! lamdp_a,phidp_a,sigdp_a -> iterated values of lamda,phi,sig at dp ! code adapted from subroutine dep3dg_h use machine , only : kind_evod use pmgrid , only : mprec,plat,platd, & plev,plon,plond,pi use slgshr , only : dlam,rdlam use namelist_def , only : redgg_a,iter_one_no_interp ! implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer jcen,iterdp,me integer kdpmpf(plev-1) ! artificial vert grid indic real dt,ra,rdel ! real dt,ra,rdel,pi real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: ub,vb,wb,un,vn,wn real(kind=kind_evod),dimension(plev) :: detami real(kind=kind_evod),dimension(plev) :: etamid ! eta at levels real(kind=kind_evod),dimension(plond,platd) :: lam real(kind=kind_evod),dimension(platd) :: phib,dphibi real(kind=kind_evod),dimension(plon,plev) :: lamdp_a,phidp_a, & sigdp_a real(kind=kind_evod),dimension(i_1:i_2,plev):: & lamdp,phidp,sigdp,sin_l_d,cos_l_d,sin_f_d,cos_f_d ! local variables integer iter,i,k,kk,ii,bisection,jtem,jm1,jp1,jp2 integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod) sphisc,cphisc,clamsc,phibs,dphibr,upr,vpr &, twopi,pi2,sgnphi,sphipr,cphipr,clampr,cphic2i &, slam2,phipi2,slampr,dlamx,coeff,distmx,dist &, lampr,cdlam,clamp,cphidp,cphip,sdlam,slamp &, sphidp,sphip,hfdt,phicen,cphic,sphic ! real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,udp,vdp,wdp, real(kind=kind_evod),dimension(i_1:i_2,plev) :: udp,vdp,wdp, & phipr,sigpr ! real(kind=kind_evod),dimension(i_1:i_2,plev,2:3):: xl ! real(kind=kind_evod),dimension(i_1:i_2,plev,4):: xl,xr real(kind=kind_evod), parameter :: fac = 1.0-1.e-12 ! twopi = pi + pi pi2 = 0.5 * pi hfdt = 0.5 * dt phicen = phib(jcen) cphic = cos( phicen ) sphic = sin( phicen ) cphic2i = 1.0 / (cphic*cphic) dphibr = 1./( phib(platd/2+1) - phib(platd/2) ) phibs = phib(1) ! coeff = (1.1*hfdt)**2 distmx = (sign(pi2,phicen) - phicen)**2/coeff sgnphi = sign( 1., phicen ) ! do k = 1,plev do i = i_1,i_2 sphisc = sin( phidp_a(i,k) ) cphisc = cos( phidp_a(i,k) ) clamsc = cos( lam(i+1,jcen) - lamdp_a(i,k) ) phipr(i,k) = asin( sphisc*cphic - cphisc*sphic*clamsc ) end do end do ! settls_loop: do iter=1,iterdp if ((iter == 1) .and. iter_one_no_interp) then do k = 1,plev do i = i_1,i_2 udp(i,k) = ub(i+1,k,jcen) vdp(i,k) = vb(i+1,k,jcen) wdp(i,k) = wb(i+1,k,jcen) enddo enddo else do k = 1,plev do i=i_1,i_2 jtem = int ( (phidp_a(i,k) - phibs)*dphibr + 1. ) if( phidp_a(i,k) >= phib(jtem+1) ) jtem = jtem + 1 jdp(i,k) = jtem jm1 = max(1,jtem-1) jp1 = min(platd,jtem+1) jp2 = min(platd,jtem+2) ! idp(i,k,2) = 2 + int( lamdp_a(i,k) * rdlam(jtem) ) if (redgg_a) then idp(i,k,1) = 2 + int( lamdp_a(i,k) * rdlam(jm1) ) idp(i,k,3) = 2 + int( lamdp_a(i,k) * rdlam(jp1) ) idp(i,k,4) = 2 + int( lamdp_a(i,k) * rdlam(jp2) ) else idp(i,k,1) = idp(i,k,2) idp(i,k,3) = idp(i,k,2) idp(i,k,4) = idp(i,k,2) endif ! kdp(i,k) = bisection(kdpmpf,plev-1, & int((sigdp_a(i,k) - etamid(1))*rdel + 1. )) if(sigdp_a(i,k) >= etamid(kdp(i,k)+1)) then kdp(i,k) = kdp(i,k) + 1 end if enddo enddo ! ! call xywgts_h(i_1,i_2,lam,phib,dphib,idp,jdp,lamdp_a,phidp_a, ! & xl,ys) !! & xl,xr,ys,yn) call int3dv_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & ub,vb,etamid,detami,sigdp_a,idp,jdp,kdp, & lam, phib, dphibi, lamdp_a, phidp_a, & udp,vdp,wb,wdp) ! & xl,xr,ys,yn,udp,vdp,wb,wdp) endif ! do k = 1,plev do i = i_1,i_2 udp(i,k) = udp(i,k)*ra vdp(i,k) = vdp(i,k)*ra sdlam = sin( lam(i+1,jcen) - lamdp_a(i,k) ) cdlam = cos( lam(i+1,jcen) - lamdp_a(i,k) ) sphidp = sin( phidp_a(i,k) ) cphidp = cos( phidp_a(i,k) ) sphip = sphidp*cphic - cphidp*sphic*cdlam cphip = cos( asin( sphip ) ) slamp = -sdlam*cphidp/cphip clamp = cos( asin( slamp ) ) vpr = (vdp(i,k)*(cphidp*cphic + sphidp*sphic*cdlam) - & udp(i,k)*sphic*sdlam)/cphip upr = (udp(i,k)*cdlam + vdp(i,k)*sphidp*sdlam + & vpr*slamp*sphip)/clamp lampr = -hfdt*( upr/cos(phipr(i,k))+un(i+1,k,jcen)*ra ) phipr(i,k) = -hfdt * (vpr + vn(i+1,k,jcen)*ra) sphipr = sin( phipr(i,k) ) cphipr = cos( phipr(i,k) ) slampr = sin( lampr ) clampr = cos( lampr ) phidp_a(i,k) = asin((sphipr*cphic+cphipr*sphic*clampr)*fac) if ( abs(phidp_a(i,k)) >= phib(3+plat)*fac ) & phidp_a(i,k) = sign( phib(3+plat),phidp_a(i,k) )*fac dlamx = asin((slampr*cphipr/cos(phidp_a(i,k)))*fac) dist = upr*upr + vpr*vpr ! if (dist > distmx) then slam2 = slampr*slampr phipi2 = asin((sqrt((slam2-1.)/(slam2-cphic2i)))*fac) if (sgnphi*phipr(i,k) > phipi2) then dlamx = sign(pi,lampr) - dlamx endif endif ! lamdp_a(i,k) = lam(i+1,jcen) + dlamx if( lamdp_a(i,k) >= twopi ) then lamdp_a(i,k) = lamdp_a(i,k) - twopi elseif( lamdp_a(i,k) < 0.0 ) then lamdp_a(i,k) = lamdp_a(i,k) + twopi endif ! sigpr(i,k) = -hfdt * (wdp(i,k) + wn(i+1,k,jcen)) sigdp_a(i,k) = etamid(k) + sigpr(i,k) sigdp_a(i,k) = max(etamid(1), & min(sigdp_a(i,k),etamid(plev)-mprec)) enddo enddo enddo settls_loop ! do k = 1,plev kk = plev+1-k do i=i_1,i_2 lamdp(i,k) = lamdp_a(i,k) phidp(i,k) = phidp_a(i,k) sigdp(i,k) = sigdp_a(i,k) cos_l_d(i,kk) = cos(lamdp(i,k)) ! for vector allignment sin_l_d(i,kk) = sin(lamdp(i,k)) ! for vector allignment cos_f_d(i,kk) = cos(phidp(i,k)) ! for vector allignment sin_f_d(i,kk) = sin(phidp(i,k)) ! for vector allignment enddo enddo return end subroutine subroutine settls_dep3ds_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & jcen,dt,iterdp,ra,ub,vb,wb, & lam,phib,dphibi,etamid,detami, & kdpmpf,lamdp_a,phidp_a,sigdp_a, & lamdp,phidp,sigdp,me, & sin_l_d,cos_l_d,sin_f_d,cos_f_d, & un,vn,wn,rdel) ! sk 06122012 ! settls for trajectory computations ! ub,vb,wb -> time t+dt, time-extrapolated wind components ! un,vn,wn -> time t, grid-point wind components ! lamdp_a,phidp_a,sigdp_a -> iterated values of lamda,phi,sig at dp ! code adapted from subroutine dep3ds_h use machine , only : kind_evod use pmgrid , only : mprec,platd,plev, & plon,plond,pi use slgshr , only : dlam,rdlam use namelist_def , only : redgg_a,iter_one_no_interp implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,jcen,iterdp,me integer,dimension(plev-1) :: kdpmpf ! artificial vert grid indic real dt,ra,rdel ! real dt,ra,rdel,pi real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: ub,vb,wb,un &, vn,wn real(kind=kind_evod),dimension(plev) :: detami &, etamid ! eta at levels real(kind=kind_evod),dimension(plond,platd) :: lam real(kind=kind_evod),dimension(platd) :: phib,dphibi real(kind=kind_evod),dimension(plon,plev) :: lamdp_a,phidp_a & , sigdp_a real(kind=kind_evod),dimension(i_1:i_2,plev) :: & lamdp,phidp,sigdp,sin_l_d,cos_l_d,sin_f_d,cos_f_d ! local variables integer iter,i,k,kk,ii,bisection,jtem,jm1,jp1,jp2 integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod) :: phicen,lampr,phipr,sigpr,twopi,hfdt &, dphibr,phibs,cphici ! real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,udp,vdp,wdp real(kind=kind_evod),dimension(i_1:i_2,plev) :: udp,vdp,wdp ! real(kind=kind_evod),dimension(i_1:i_2,plev,2:3):: xl ! real(kind=kind_evod),dimension(i_1:i_2,plev,4):: xl,xr twopi = pi + pi hfdt = 0.5 * dt phicen = phib(jcen) cphici = 1.0 / cos(phicen) ! dphibr = 1./( phib(platd/2+1) - phib(platd/2) ) phibs = phib(1) ! settls_loop: do iter=1,iterdp if ((iter == 1) .and. iter_one_no_interp) then do k = 1,plev do i = i_1,i_2 udp(i,k) = ub(i+1,k,jcen) vdp(i,k) = vb(i+1,k,jcen) wdp(i,k) = wb(i+1,k,jcen) enddo enddo else do k = 1,plev do i=i_1,i_2 jtem = int ( (phidp_a(i,k) - phibs)*dphibr + 1. ) if( phidp_a(i,k) >= phib(jtem+1) ) jtem = jtem + 1 jdp(i,k) = jtem jm1 = max(1,jtem-1) jp1 = min(platd,jtem+1) jp2 = min(platd,jtem+2) ! idp(i,k,2) = 2 + int( lamdp_a(i,k) * rdlam(jtem) ) if (redgg_a) then idp(i,k,1) = 2 + int( lamdp_a(i,k) * rdlam(jm1) ) idp(i,k,3) = 2 + int( lamdp_a(i,k) * rdlam(jp1) ) idp(i,k,4) = 2 + int( lamdp_a(i,k) * rdlam(jp2) ) else idp(i,k,1) = idp(i,k,2) idp(i,k,3) = idp(i,k,2) idp(i,k,4) = idp(i,k,2) endif ! kdp(i,k) = bisection(kdpmpf,plev-1, & int((sigdp_a(i,k) - etamid(1))*rdel + 1. )) if(sigdp_a(i,k) >= etamid(kdp(i,k)+1)) then kdp(i,k) = kdp(i,k) + 1 end if enddo enddo ! ! call xywgts_h(i_1,i_2,lam,phib,dphib,idp,jdp, ! & lamdp_a,phidp_a,xl,ys) !! & lamdp_a,phidp_a,xl,xr,ys,yn) call int3dv_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & ub,vb,etamid,detami,sigdp_a,idp,jdp,kdp, & lam, phib, dphibi, lamdp_a, phidp_a, & udp,vdp,wb,wdp) ! & xl,xr,ys,yn,udp,vdp,wb,wdp) endif ! do k = 1,plev do i = i_1,i_2 udp(i,k) = udp(i,k)*ra vdp(i,k) = vdp(i,k)*ra ! lampr = -hfdt * (udp(i,k)/cos(phidp_a(i,k)) & + un(i+1,k,jcen)*ra*cphici) phipr = -hfdt * (vdp(i,k) + vn(i+1,k,jcen)*ra) sigpr = -hfdt * (wdp(i,k) + wn(i+1,k,jcen)) lamdp_a(i,k) = lam(i+1,jcen) + lampr phidp_a(i,k) = phicen + phipr sigdp_a(i,k) = etamid(k) + sigpr if(lamdp_a(i,k) >= twopi) then lamdp_a(i,k) = lamdp_a(i,k) - twopi elseif(lamdp_a(i,k) < 0.0) then lamdp_a(i,k) = lamdp_a(i,k) + twopi endif ! sigdp_a(i,k) = max(etamid(1), & min(sigdp_a(i,k),etamid(plev)-mprec)) enddo enddo enddo settls_loop do k = 1,plev kk = plev+1-k do i=i_1,i_2 lamdp(i,k) = lamdp_a(i,k) phidp(i,k) = phidp_a(i,k) sigdp(i,k) = sigdp_a(i,k) cos_l_d(i,kk) = cos(lamdp(i,k)) ! for vector allignment sin_l_d(i,kk) = sin(lamdp(i,k)) ! for vector allignment cos_f_d(i,kk) = cos(phidp(i,k)) ! for vector allignment sin_f_d(i,kk) = sin(phidp(i,k)) ! for vector allignment enddo enddo return end subroutine herxinit_h(i_1,i_2,idp,jdp,lamdp,xl,xr,hl,hr, & dhl,dhr) ! use machine , only : kind_evod use pmgrid , only : plev,platd use slgshr , only : lam,dlam,rdlam implicit none ! integer i_1,i_2 integer,dimension(i_1:i_2,plev) :: jdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(i_1:i_2,plev) :: lamdp ! x-coord of dep pt real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: hl,hr,dhl,dhr ! local variables integer i,k,n,j,jj real teml, temr, tem1, tem2 ! do k=1,plev ! write(0,*)' in herx k=',k,' i_1=',i_1,'i_2=',i_2 do i=i_1,i_2 j = jdp(i,k) - 2 ! n=1 jj = min(j+1,platd) xl(i,k,1) = (lam(idp(i,k,1)+1,jj) - lamdp(i,k))* & rdlam(jj) xr(i,k,1) = 1. - xl(i,k,1) ! n=2 jj = min(j+2,platd) teml = (lam(idp(i,k,2)+1,jj) - lamdp(i,k)) * rdlam(jj) temr = 1.0 - teml xl(i,k,2) = teml xr(i,k,2) = temr ! tem1 = teml * teml tem2 = temr * temr hl (i,k,2) = ( 3.0 - teml - teml ) * tem1 hr (i,k,2) = ( 3.0 - temr - temr ) * tem2 dhl(i,k,2) = dlam(jj) * temr * tem1 dhr(i,k,2) = - dlam(jj) * teml * tem2 ! n=3 jj = min(j+3,platd) teml = (lam(idp(i,k,3)+1,jj) - lamdp(i,k)) * rdlam(jj) temr = 1.0 - teml xl(i,k,3) = teml xr(i,k,3) = temr ! tem1 = teml * teml tem2 = temr * temr hl (i,k,3) = ( 3.0 - teml - teml ) * tem1 hr (i,k,3) = ( 3.0 - temr - temr ) * tem2 dhl(i,k,3) = dlam(jj) * temr * tem1 dhr(i,k,3) = - dlam(jj) * teml * tem2 ! n=4 jj = min(j+4,platd) xl(i,k,4) = (lam(idp(i,k,4)+1,jj) - lamdp(i,k))* & rdlam(jj) xr(i,k,4) = 1. - xl(i,k,4) end do end do return end subroutine int2d_h_levs(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,fb1,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y, fdp1) ! use machine , only : kind_evod use pmgrid , only : plev,plon,plond implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim integer,dimension(i_1:i_2,plev) :: jdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,kdim,s_lat_in_pe:n_lat_in_pe) & :: fb1 real(kind=kind_evod),dimension(plon,plev) :: fdp1 real(kind=kind_evod),dimension(i_1:i_2,plev) :: term1y,term2y, & term3y,term4y real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: x2,x3 real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: term1x,term2x, & term3x,term4x ! local variables integer i,k, kk, ii1, ii2, ii3, ii4, jj, jjm1, jjp1, jjp2 &, ii1p1, ii2m1, ii2p1, ii2p2, ii3m1, ii3p1, ii3p2, ii4p1 ! real(kind=kind_evod) :: f1,f2,f3,f4 ! do k=1,plev kk = plev+1-k do i=i_1,i_2 ii1 = idp(i,k,1) ii1p1 = ii1 + 1 ii2 = idp(i,k,2) ii2m1 = ii2 - 1 ii2p1 = ii2 + 1 ii2p2 = ii2 + 2 ii3 = idp(i,k,3) ii3m1 = ii3 - 1 ii3p1 = ii3 + 1 ii3p2 = ii3 + 2 ii4 = idp(i,k,4) ii4p1 = ii4 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjm1 = max(jj-1,s_lat_in_pe) jjp1 = min(jj+1,n_lat_in_pe) jjp2 = min(jj+2,n_lat_in_pe) fdp1(i,kk) = & (fb1 (ii1p1,k,jjm1) * x2 (i,k,1) & - fb1 (ii1 ,k,jjm1) * x3 (i,k,1)) * term1y(i,k) & + (fb1 (ii2m1,k,jj ) * term1x(i,k,2) & + fb1 (ii2 ,k,jj ) * term2x(i,k,2) & + fb1 (ii2p1,k,jj ) * term3x(i,k,2) & + fb1 (ii2p2,k,jj ) * term4x(i,k,2)) * term2y(i,k) & + (fb1 (ii3m1,k,jjp1) * term1x(i,k,3) & + fb1 (ii3 ,k,jjp1) * term2x(i,k,3) & + fb1 (ii3p1,k,jjp1) * term3x(i,k,3) & + fb1 (ii3p2,k,jjp1) * term4x(i,k,3)) * term3y(i,k) & + (fb1 (ii4p1,k,jjp2) * x2 (i,k,4) & - fb1 (ii4 ,k,jjp2) * x3 (i,k,4)) * term4y(i,k) ! ! f1 = fb1 (ii1+1,k,jj-1) * x2 (i,k,1) ! & - fb1 (ii1 ,k,jj-1) * x3 (i,k,1) ! f2 = fb1 (ii2-1,k,jj ) * term1x(i,k,2) ! & + fb1 (ii2 ,k,jj ) * term2x(i,k,2) ! & + fb1 (ii2+1,k,jj ) * term3x(i,k,2) ! & + fb1 (ii2+2,k,jj ) * term4x(i,k,2) ! f3 = fb1 (ii3-1,k,jj+1) * term1x(i,k,3) ! & + fb1 (ii3 ,k,jj+1) * term2x(i,k,3) ! & + fb1 (ii3+1,k,jj+1) * term3x(i,k,3) ! & + fb1 (ii3+2,k,jj+1) * term4x(i,k,3) ! f4 = fb1 (ii4+1,k,jj+2) * x2 (i,k,4) ! & - fb1 (ii4 ,k,jj+2) * x3 (i,k,4) ! ! fdp1(i,kk) = f1*term1y(i,k) + f2*term2y(i,k) ! & + f3*term3y(i,k) + f4*term4y(i,k) end do end do return end subroutine int2d_h_levs_mxy(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,fb1,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y,fdp1) ! !sk 10/13/2012 !sk modified original subroutine int2d_d_levs for quasi-monotone !sk quasi-cubic 2d lagrange interpolation in x and y, and renamed !sk as int2d_h_mxy !sk use machine , only : kind_evod use pmgrid , only : plev,plon,plond,quamon implicit none ! ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim integer,dimension(i_1:i_2,plev) :: jdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,kdim,s_lat_in_pe:n_lat_in_pe) & :: fb1 real(kind=kind_evod),dimension(plon,plev) :: fdp1 real(kind=kind_evod),dimension(i_1:i_2,plev) :: term1y,term2y, & term3y,term4y real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: x2,x3 real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: term1x,term2x, & term3x,term4x ! local variables integer i,k, kk, ii1, ii2, ii3, ii4, jj, jjm1, jjp1, jjp2 &, ii1p1, ii4p1, ii2m1, ii2p1, ii2p2, ii3m1, ii3p1, ii3p2 real(kind=kind_evod) :: f1,f2,f3,f4,tem1,tem2 ! do k=1,plev kk = plev+1-k do i=i_1,i_2 ii1 = idp(i,k,1) ii1p1 = ii1 + 1 ii2 = idp(i,k,2) ii2m1 = ii2 - 1 ii2p1 = ii2 + 1 ii2p2 = ii2 + 2 ii3 = idp(i,k,3) ii3m1 = ii3 - 1 ii3p1 = ii3 + 1 ii3p2 = ii3 + 2 ii4 = idp(i,k,4) ii4p1 = ii4 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjm1 = max(jj-1, s_lat_in_pe) jjp1 = min(jj+1, n_lat_in_pe) jjp2 = min(jj+2, n_lat_in_pe) f1 = fb1(ii1p1,k,jjm1)*x2(i,k,1) - fb1(ii1,k,jjm1)*x3(i,k,1) f2 = fb1(ii2m1,k,jj ) * term1x(i,k,2) & + fb1(ii2 ,k,jj ) * term2x(i,k,2) & + fb1(ii2p1,k,jj ) * term3x(i,k,2) & + fb1(ii2p2,k,jj ) * term4x(i,k,2) f3 = fb1(ii3m1,k,jjp1) * term1x(i,k,3) & + fb1(ii3 ,k,jjp1) * term2x(i,k,3) & + fb1(ii3p1,k,jjp1) * term3x(i,k,3) & + fb1(ii3p2,k,jjp1) * term4x(i,k,3) f4 = fb1(ii4p1,k,jjp2)*x2(i,k,4) - fb1(ii4,k,jjp2)*x3(i,k,4) if (.not. quamon) then fdp1(i,kk) = f1*term1y(i,k) + f2*term2y(i,k) & + f3*term3y(i,k) + f4*term4y(i,k) else ! call quasim(fb1(ii2,k,jj), fb1(ii2+1,k,jj), f2) ! call quasim(fb1(ii3,k,jj+1),fb1(ii3+1,k,jj+1),f3) tem1 = min(fb1(ii2, k,jj),fb1(ii2p1,k,jj)) tem2 = max(fb1(ii2, k,jj),fb1(ii2p1,k,jj)) f2 = max(tem1,min(tem2,f2)) tem1 = min(fb1(ii3, k,jjp1),fb1(ii3p1,k,jjp1)) tem2 = max(fb1(ii3, k,jjp1),fb1(ii3p1,k,jjp1)) f3 = max(tem1,min(tem2,f3)) ! fdp1(i,kk) = f1*term1y(i,k) + f2*term2y(i,k) & + f3*term3y(i,k) + f4*term4y(i,k) ! call quasim(f2,f3,fdp1(i,kk)) tem1 = min(f2,f3) tem2 = max(f2,f3) fdp1(i,kk) = max(tem1,min(tem2,fdp1(i,kk))) endif end do end do return end subroutine int2d_h_levs_mxy_(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,fb1,idp,jdp, & x2,x3,term1x,term2x,term3x,term4x, & term1y,term2y,term3y,term4y,fdp1) !sk 10/30/2012 !sk minor changes to int2d_h_levs_mxy to facilitate cont_eq_opt1 !sk 10/13/2012 !sk modified original subroutine int2d_d_levs for quasi-monotone !sk quasi-cubic 2d lagrange interpolation in x and y, and renamed !sk as int2d_h_mxy !sk use machine , only : kind_evod use pmgrid , only : plev,plon,plond,quamon implicit none ! ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim integer,dimension(i_1:i_2,plev) :: jdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,kdim,s_lat_in_pe:n_lat_in_pe) & :: fb1 real(kind=kind_evod),dimension(plon,plev) :: fdp1 real(kind=kind_evod),dimension(i_1:i_2,plev) :: term1y,term2y, & term3y,term4y real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: x2,x3 real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: term1x,term2x, & term3x,term4x ! local variables integer i,k, kk, ii1, ii2, ii3, ii4, jj, jjm1, jjp1, jjp2 &, ii1p1, ii2m1, ii2p1, ii2p2, ii3m1, ii3p1, ii3p2, ii4p1 real(kind=kind_evod):: f1,f2,f3,f4,fdp2,tem1,tem2 ! do k=1,plev kk = plev+1-k do i=i_1,i_2 ii1 = idp(i,k,1) ii1p1 = ii1 + 1 ii2 = idp(i,k,2) ii2m1 = ii2 - 1 ii2p1 = ii2 + 1 ii2p2 = ii2 + 2 ii3 = idp(i,k,3) ii3m1 = ii3 - 1 ii3p1 = ii3 + 1 ii3p2 = ii3 + 2 ii4 = idp(i,k,4) ii4p1 = ii4 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjm1 = max(jj-1,s_lat_in_pe) jjp1 = min(jj+1,n_lat_in_pe) jjp2 = min(jj+2,n_lat_in_pe) f1 = fb1 (ii1p1,k,jjm1) * x2 (i,k,1) & - fb1 (ii1 ,k,jjm1) * x3 (i,k,1) f2 = fb1 (ii2m1,k,jj ) * term1x(i,k,2) & + fb1 (ii2 ,k,jj ) * term2x(i,k,2) & + fb1 (ii2p1,k,jj ) * term3x(i,k,2) & + fb1 (ii2p2,k,jj ) * term4x(i,k,2) f3 = fb1 (ii3m1,k,jjp1) * term1x(i,k,3) & + fb1 (ii3 ,k,jjp1) * term2x(i,k,3) & + fb1 (ii3p1,k,jjp1) * term3x(i,k,3) & + fb1 (ii3p2,k,jjp1) * term4x(i,k,3) f4 = fb1 (ii4p1,k,jjp2) * x2(i,k,4) & - fb1 (ii4 ,k,jjp2) * x3(i,k,4) if (.not. quamon) then fdp2 = f1*term1y(i,k) + f2*term2y(i,k) & + f3*term3y(i,k) + f4*term4y(i,k) else ! call quasim(fb1(ii2,k,jj), fb1(ii2+1,k,jj),f2) ! call quasim(fb1(ii3,k,jj+1),fb1(ii3+1,k,jj+1),f3) tem1 = min(fb1(ii2, k,jj),fb1(ii2p1,k,jj)) tem2 = max(fb1(ii2, k,jj),fb1(ii2p1,k,jj)) f2 = max(tem1,min(tem2,f2)) tem1 = min(fb1(ii3, k,jjp1),fb1(ii3p1,k,jjp1)) tem2 = max(fb1(ii3, k,jjp1),fb1(ii3p1,k,jjp1)) f3 = max(tem1,min(tem2,f3)) ! fdp2 = f1*term1y(i,k) + f2*term2y(i,k) & + f3*term3y(i,k) + f4*term4y(i,k) ! call quasim(f2,f3,fdp2) tem1 = min(f2,f3) tem2 = max(f2,f3) fdp2 = max(tem1,min(tem2,fdp2)) endif fdp1(i,kk) = fdp1(i,kk) + fdp2 end do end do return end subroutine int3dv_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & fb1,fb2,etamid,detami,zdp,idp,jdp,kdp, & x, y, dyi, xdp, ydp, & fdp1,fdp2,fb3,fdp3) ! & xl,xr,ys,yn,fdp1,fdp2, ! & fb3,fdp3) !sela& fb3,fdp3,etaint,detai,kdph) ! use machine , only : kind_evod use pmgrid , only : plev,plon,plond,platd use slgshr , only : rdlam implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb1,fb2,fb3 real(kind=kind_evod),dimension(plond,platd) :: x real(kind=kind_evod),dimension(platd) :: y,dyi real(kind=kind_evod),dimension(plon,plev) :: xdp,ydp,zdp real(kind=kind_evod),dimension(plev) :: detami,etamid real(kind=kind_evod),dimension(i_1:i_2,plev) :: fdp1,fdp2,fdp3 ! & ys ! & ys,yn ! real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: xl ! real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr real(kind=kind_evod) :: xl2,xl3,xr2, xr3 &, ys, yn ! local variables integer i,jj,kk,k,l,ii2,ii3,jjp1,kkp1,ii2p1,ii3p1 real(kind=kind_evod):: zt,zb ! ! do k=1,plev do i=i_1,i_2 ii2 = idp(i,k,2) ii3 = idp(i,k,3) ii2p1 = ii2 + 1 ii3p1 = ii3 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjp1 = min(jj+1,n_lat_in_pe) kk = kdp(i,k) kkp1 = kk + 1 xl2 = (x(ii2p1,jj) - xdp(i,k)) * rdlam(jj) xl3 = (x(ii3p1,jjp1) - xdp(i,k)) * rdlam(jjp1) xr2 = 1.0 - xl2 xr3 = 1.0 - xl3 ys = (y(jjp1) - ydp(i,k)) * dyi(jj) yn = 1.0 - ys ! zt = (etamid(kkp1) - zdp(i,k)) * detami(kk) zb = 1.0 - zt ! fdp1(i,k) = (( fb1 (ii2 ,kk ,jj ) * xl2 & + fb1 (ii2p1,kk ,jj ) * xr2 ) * ys & + ( fb1 (ii3 ,kk ,jjp1) * xl3 & + fb1 (ii3p1,kk ,jjp1) * xr3 ) * yn ) * zt & + (( fb1 (ii2 ,kkp1,jj ) * xl2 & + fb1 (ii2p1,kkp1,jj ) * xr2 ) * ys & + ( fb1 (ii3 ,kkp1,jjp1) * xl3 & + fb1 (ii3p1,kkp1,jjp1) * xr3 ) * yn ) * zb ! !$$$ print*,' inside int3dv i,k,i2,i3,kdp,jdp,xl2,xl3,xr,ys,yn,zt = ', !$$$ . i,k,idp(i,k,2),idp(i,k,3),kdp(i,k),jdp(i,k),xl(i,k,2),xl(i,k,3), !$$$ . ys(i,k),yn(i,k),zt fdp2(i,k) = (( fb2 (ii2 ,kk ,jj ) * xl2 & + fb2 (ii2p1,kk ,jj ) * xr2 ) * ys & + ( fb2 (ii3 ,kk ,jjp1) * xl3 & + fb2 (ii3p1,kk ,jjp1) * xr3 ) * yn ) * zt & + (( fb2 (ii2 ,kkp1,jj ) * xl2 & + fb2 (ii2p1,kkp1,jj ) * xr2 ) * ys & + ( fb2 (ii3 ,kkp1,jjp1) * xl3 & + fb2 (ii3p1,kkp1,jjp1) * xr3 ) * yn ) * zb ! fdp3(i,k) = (( fb3 (ii2 ,kk ,jj ) * xl2 & + fb3 (ii2p1,kk ,jj ) * xr2 ) * ys & + ( fb3 (ii3 ,kk ,jjp1) * xl3 & + fb3 (ii3p1,kk ,jjp1) * xr3 ) * yn ) * zt & + (( fb3 (ii2 ,kkp1,jj ) * xl2 & + fb3 (ii2p1,kkp1,jj ) * xr2 ) * ys & + ( fb3 (ii3 ,kkp1,jjp1) * xl3 & + fb3 (ii3p1,kkp1,jjp1) * xr3 ) * yn ) * zb enddo enddo return end subroutine lagxin_h_m(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,fb,idp,jdp,kdp,kkdp, & x2,x3,term1,term2,term3,term4,fint,quamon) !sk 2/25/2012 !sk modified original subroutine lagxin_h for quasi-monotone !sk quasi-cubic lagrange interpolation in x !sk 10/08/2012 !sk renamed lagxin_h as lagxin_h_m and added quamon to argument list use machine , only : kind_evod use pmgrid , only : plev,plond implicit none integer, parameter :: ppdy=4, ! length of interp. grid stencil in y & ppdz=4 ! length of interp. grid stencil in z ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim integer,dimension(i_1:i_2,plev) :: jdp,kdp,kkdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: x2,x3 real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: term1,term2, & term3,term4 real(kind=kind_evod),dimension(i_1:i_2,plev,ppdy,ppdz) :: fint logical quamon ! local variables integer i,k,kdimm1,kdimm2,ii1,ii2,ii3,ii4,jj,kk &, ii1p1,ii2m1,ii2p1,ii2p2,ii3m1,ii3p1,ii3p2,ii4p1 &, jjm1,jjp1,jjp2,kkm1,kkp1,kkp2 ! integer, parameter :: nclamp=93 real(kind=kind_evod) tem1, tem2 kdimm1 = kdim - 1 kdimm2 = kdim - 2 do k=1,plev do i=i_1,i_2 ii1 = idp(i,k,1) ii2 = idp(i,k,2) ii3 = idp(i,k,3) ii4 = idp(i,k,4) ii1p1 = ii1 + 1 ii2m1 = ii2 - 1 ii2p1 = ii2 + 1 ii2p2 = ii2 + 2 ii3m1 = ii3 - 1 ii3p1 = ii3 + 1 ii3p2 = ii3 + 2 ii4p1 = ii4 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjm1 = max(jj-1,s_lat_in_pe) jjp1 = min(jj+1,n_lat_in_pe) jjp2 = min(jj+2,n_lat_in_pe) kk = kkdp(i,k) kkm1 = kk - 1 kkp1 = kk + 1 kkp2 = kk + 2 ! fint(i,k,2,1) = fb (ii2p1,kkm1,jj ) * x2 (i,k,2) & - fb (ii2 ,kkm1,jj ) * x3 (i,k,2) fint(i,k,3,1) = fb (ii3p1,kkm1,jjp1) * x2 (i,k,3) & - fb (ii3 ,kkm1,jjp1) * x3 (i,k,3) fint(i,k,1,2) = fb (ii1p1,kk ,jjm1) * x2 (i,k,1) & - fb (ii1 ,kk ,jjm1) * x3 (i,k,1) fint(i,k,2,2) = fb (ii2m1,kk ,jj ) * term1(i,k,2) & + fb (ii2 ,kk ,jj ) * term2(i,k,2) & + fb (ii2p1,kk ,jj ) * term3(i,k,2) & + fb (ii2p2,kk ,jj ) * term4(i,k,2) fint(i,k,3,2) = fb (ii3m1,kk ,jjp1) * term1(i,k,3) & + fb (ii3 ,kk ,jjp1) * term2(i,k,3) & + fb (ii3p1,kk ,jjp1) * term3(i,k,3) & + fb (ii3p2,kk ,jjp1) * term4(i,k,3) if (quamon) then ! call quasim(fb(ii2,kk,jj), fb(ii2+1,kk,jj), fint(i,k,2,2)) ! call quasim(fb(ii3,kk,jj+1),fb(ii3+1,kk,jj+1),fint(i,k,3,2)) tem1 = min(fb(ii2, kk,jj),fb(ii2p1,kk,jj)) tem2 = max(fb(ii2, kk,jj),fb(ii2p1,kk,jj)) fint(i,k,2,2) = max(tem1, min(tem2,fint(i,k,2,2))) tem1 = min(fb(ii3, kk,jjp1),fb(ii3p1,kk,jjp1)) tem2 = max(fb(ii3, kk,jjp1),fb(ii3p1,kk,jjp1)) fint(i,k,3,2) = max(tem1,min(tem2,fint(i,k,3,2))) endif fint(i,k,4,2) = fb (ii4p1,kk ,jjp2) * x2 (i,k,4) & - fb (ii4 ,kk ,jjp2) * x3 (i,k,4) fint(i,k,1,3) = fb (ii1p1,kkp1,jjm1) * x2 (i,k,1) & - fb (ii1 , kkp1,jjm1) * x3 (i,k,1) fint(i,k,2,3) = fb (ii2m1,kkp1,jj ) * term1(i,k,2) & + fb (ii2 ,kkp1,jj ) * term2(i,k,2) & + fb (ii2p1,kkp1,jj ) * term3(i,k,2) & + fb (ii2p2,kkp1,jj ) * term4(i,k,2) fint(i,k,3,3) = fb (ii3m1,kkp1,jjp1) * term1(i,k,3) & + fb (ii3 , kkp1,jjp1) * term2(i,k,3) & + fb (ii3p1,kkp1,jjp1) * term3(i,k,3) & + fb (ii3p2,kkp1,jjp1) * term4(i,k,3) if (quamon) then ! call quasim(fb(ii2,kk+1,jj), fb(ii2+1,kk+1,jj), ! & fint(i,k,2,3)) ! call quasim(fb(ii3,kk+1,jj+1), fb(ii3+1,kk+1,jj+1), ! & fint(i,k,3,3)) tem1 = min(fb(ii2, kkp1,jj),fb(ii2p1,kkp1,jj)) tem2 = max(fb(ii2, kkp1,jj),fb(ii2p1,kkp1,jj)) fint(i,k,2,3) = max(tem1, min(tem2,fint(i,k,2,3))) tem1 = min(fb(ii3, kkp1,jjp1),fb(ii3p1,kkp1,jjp1)) tem2 = max(fb(ii3, kkp1,jjp1),fb(ii3p1,kkp1,jjp1)) fint(i,k,3,3) = max(tem1,min(tem2,fint(i,k,3,3))) endif fint(i,k,4,3) = fb (ii4p1,kkp1,jjp2) * x2 (i,k,4) & - fb (ii4 ,kkp1,jjp2) * x3 (i,k,4) fint(i,k,2,4) = fb (ii2p1,kkp2,jj ) * x2 (i,k,2) & - fb (ii2 ,kkp2,jj ) * x3 (i,k,2) fint(i,k,3,4) = fb (ii3p1,kkp2,jjp1) * x2 (i,k,3) & - fb (ii3 ,kkp2,jjp1) * x3 (i,k,3) ! if(kdp (i,k) == 1) then fint(i,k,2,1) = fint(i,k,2,4) fint(i,k,3,1) = fint(i,k,3,4) fint(i,k,1,3) = fint(i,k,1,2) fint(i,k,2,3) = fint(i,k,2,2) fint(i,k,3,3) = fint(i,k,3,2) fint(i,k,4,3) = fint(i,k,4,2) fint(i,k,1,2) = fb (ii1p1,1,jjm1) * x2 (i,k,1) & - fb (ii1 ,1,jjm1) * x3 (i,k,1) fint(i,k,2,2) = fb (ii2m1,1,jj ) * term1(i,k,2) & + fb (ii2 ,1,jj ) * term2(i,k,2) & + fb (ii2p1,1,jj ) * term3(i,k,2) & + fb (ii2p2,1,jj ) * term4(i,k,2) fint(i,k,3,2) = fb (ii3m1,1,jjp1) * term1(i,k,3) & + fb (ii3 ,1,jjp1) * term2(i,k,3) & + fb (ii3p1,1,jjp1) * term3(i,k,3) & + fb (ii3p2,1,jjp1) * term4(i,k,3) if (quamon) then ! call quasim(fb(ii2,1,jj), fb(ii2+1,1,jj), ! & fint(i,k,2,2)) ! call quasim(fb(ii3,1,jj+1), fb(ii3+1,1,jj+1), ! & fint(i,k,3,2)) tem1 = min(fb(ii2, 1,jj),fb(ii2p1,1,jj)) tem2 = max(fb(ii2, 1,jj),fb(ii2p1,1,jj)) fint(i,k,2,2) = max(tem1,min(tem2,fint(i,k,2,2))) tem1 = min(fb(ii3, 1,jjp1),fb(ii3p1,1,jjp1)) tem2 = max(fb(ii3, 1,jjp1),fb(ii3p1,1,jjp1)) fint(i,k,3,2) = max(tem1,min(tem2,fint(i,k,3,2))) endif fint(i,k,4,2) = fb (ii4p1,1,jjp2) * x2 (i,k,4) & - fb (ii4 ,1,jjp2) * x3 (i,k,4) fint(i,k,2,4) = fb (ii2p1,3,jj ) * x2 (i,k,2) & - fb (ii2 ,3,jj ) * x3 (i,k,2) fint(i,k,3,4) = fb (ii3p1,3,jjp1) * x2 (i,k,3) & - fb (ii3 ,3,jjp1) * x3 (i,k,3) elseif(kdp (i,k) == kdimm1) then fint(i,k,2,4) = fint(i,k,2,1) fint(i,k,3,4) = fint(i,k,3,1) fint(i,k,1,2) = fint(i,k,1,3) fint(i,k,2,2) = fint(i,k,2,3) fint(i,k,3,2) = fint(i,k,3,3) fint(i,k,4,2) = fint(i,k,4,3) fint(i,k,2,1) = fb (ii2p1,kdimm2,jj ) * x2 (i,k,2) & - fb (ii2 ,kdimm2,jj ) * x3 (i,k,2) fint(i,k,3,1) = fb (ii3p1,kdimm2,jjp1) * x2 (i,k,3) & - fb (ii3 ,kdimm2,jjp1) * x3 (i,k,3) fint(i,k,1,3) = fb (ii1p1,kdim ,jjm1) * x2 (i,k,1) & - fb (ii1 ,kdim ,jjm1) * x3 (i,k,1) fint(i,k,2,3) = fb (ii2m1,kdim ,jj ) * term1(i,k,2) & + fb (ii2 ,kdim ,jj ) * term2(i,k,2) & + fb (ii2p1,kdim ,jj ) * term3(i,k,2) & + fb (ii2p2,kdim ,jj ) * term4(i,k,2) fint(i,k,3,3) = fb (ii3m1,kdim ,jjp1) * term1(i,k,3) & + fb (ii3 ,kdim ,jjp1) * term2(i,k,3) & + fb (ii3p1,kdim ,jjp1) * term3(i,k,3) & + fb (ii3p2,kdim ,jjp1) * term4(i,k,3) if (quamon) then ! call quasim(fb(ii2,kdim,jj), fb(ii2p1,kdim,jj), ! & fint(i,k,2,3)) ! call quasim(fb(ii3,kdim,jj+1), fb(ii3p1,kdim,jjp1), ! & fint(i,k,3,3)) tem1 = min(fb(ii2, kdim,jj),fb(ii2p1,kdim,jj)) tem2 = max(fb(ii2, kdim,jj),fb(ii2p1,kdim,jj)) fint(i,k,2,3) = max(tem1,min(tem2,fint(i,k,2,3))) tem1 = min(fb(ii3, kdim,jjp1),fb(ii3p1,kdim,jjp1)) tem2 = max(fb(ii3, kdim,jjp1),fb(ii3p1,kdim,jjp1)) fint(i,k,3,3) = max(tem1,min(tem2,fint(i,k,3,3))) endif fint(i,k,4,3) = fb (ii4p1,kdim,jjp2) * x2(i,k,4) & - fb (ii4 ,kdim,jjp2) * x3(i,k,4) endif enddo enddo return end subroutine lagxinit_h(i_1,i_2,x,xdp,idp,jdp,x2,x3, & term1,term2,term3,term4) ! use machine , only : kind_evod use pmgrid , only : platd,plev,plond use slgshr , only : rdlam implicit none ! ! input variables integer i_1,i_2 integer,dimension(i_1:i_2,plev,4) :: idp integer,dimension(i_1:i_2,plev) :: jdp real(kind=kind_evod),dimension(plond,platd) :: x real(kind=kind_evod),dimension(i_1:i_2,plev) :: xdp real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: x2,x3 real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: term1,term2, & term3,term4 ! local variables integer i,kk,k,l,n,j,jj real(kind=kind_evod), parameter :: denom1=-1./6., denom2=0.5, & denom3=-0.5, denom4=1./6. real(kind=kind_evod) :: coef12, coef34, tem ! do k=1,plev do i=i_1,i_2 j = jdp(i,k) - 2 ! n=1 jj = min(j+1,platd) x2(i,k,1) = (xdp(i,k) - x(idp(i,k,1),jj)) * rdlam(jj) x3(i,k,1) = x2(i,k,1) - 1. ! n=2 jj = min(j+2,platd) tem = (xdp(i,k) - x(idp(i,k,2),jj)) * rdlam(jj) x2(i,k,2) = tem x3(i,k,2) = tem - 1. coef12 = x3(i,k,2)*(tem - 2.) coef34 = (tem + 1.)*tem term1(i,k,2) = denom1*coef12*tem term2(i,k,2) = denom2*coef12*(tem + 1.) term3(i,k,2) = denom3*coef34*(tem - 2.) term4(i,k,2) = denom4*coef34*x3(i,k,2) ! n=3 jj = min(j+3,platd) tem = (xdp(i,k) - x(idp(i,k,3),jj)) * rdlam(jj) x2(i,k,3) = tem x3(i,k,3) = tem - 1. coef12 = x3(i,k,3)*(tem - 2.) coef34 = (tem + 1.)*tem term1(i,k,3) = denom1*coef12*tem term2(i,k,3) = denom2*coef12*(tem + 1.) term3(i,k,3) = denom3*coef34*(tem - 2.) term4(i,k,3) = denom4*coef34*x3(i,k,3) ! n=4 jj = min(j+4,platd) x2(i,k,4) = (xdp(i,k) - x(idp(i,k,4),jj)) * rdlam(jj) x3(i,k,4) = x2(i,k,4) - 1. enddo enddo return end subroutine xywgts_h(i_1,i_2,x,y,dy,idp,jdp,xdp,ydp,xl,ys) ! subroutine xywgts_h(i_1,i_2,x,y,dy,idp,jdp,xdp,ydp,xl,xr,ys,yn) ! use machine , only : kind_evod use pmgrid , only : platd,plev,plon,plond use slgshr , only : rdx => dlam ! use layout1 , only : me implicit none ! ! input variables integer i_1,i_2 integer,dimension(i_1:i_2,plev) :: jdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,platd) :: x real(kind=kind_evod),dimension(platd) :: y,dy real(kind=kind_evod),dimension(plon,plev) :: xdp,ydp real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: xl ! real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn ! real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr ! local variables integer i,j,k,jj2,jj3 ! real(kind=kind_evod),dimension(platd) :: rdlam ! do j=1,platd ! rdx(j) = 1. / (x(2,j) - x(1,j)) ! enddo do k=1,plev do i=i_1,i_2 jj2 = jdp(i,k) jj3 = jj2 + 1 xl(i,k,2) = (x(idp(i,k,2)+1,jj2) - xdp(i,k))*rdx(jj2) xl(i,k,3) = (x(idp(i,k,3)+1,jj3) - xdp(i,k))*rdx(jj3) ! xr(i,k,2) = 1. - xl(i,k,2) ! xr(i,k,3) = 1. - xl(i,k,3) ys(i,k) = (y(jj3) - ydp(i,k)) / dy(jj2) ! yn(i,k) = 1. - ys(i,k) enddo enddo return end subroutine rotate_uv_h(i_1,i_2, & ud3_d,vd3_d,ud3_a,vd3_a, & cos_l_a,sin_l_a,cos_f_a,sin_f_a, & cos_l_d,sin_l_d,cos_f_d,sin_f_d) use machine , only : kind_evod use pmgrid , only : plev,plon implicit none ! input variables integer i_1,i_2 real(kind=kind_evod) :: cos_f_a,sin_f_a real(kind=kind_evod),dimension(plon,plev) :: ud3_d,vd3_d, & ud3_a,vd3_a real(kind=kind_evod),dimension(i_1:i_2) :: cos_l_a,sin_l_a real(kind=kind_evod),dimension(i_1:i_2,plev):: cos_l_d,sin_l_d, & cos_f_d,sin_f_d ! local variables integer i,k real(kind=kind_evod) :: alfa_ua,alfa_va,beta_ua,beta_va &, cos_l_diff,sin_l_diff ! the trigonometric functions are bottom to top, they are inverted ! in dep3dg and dep3ds, therefore alfas and betas are bottom to top. do k = 1,plev do i = i_1,i_2 cos_l_diff = cos_l_a(i)*cos_l_d(i,k)+sin_l_a(i)*sin_l_d(i,k) sin_l_diff = sin_l_a(i)*cos_l_d(i,k)-sin_l_d(i,k)*cos_l_a(i) alfa_ua = cos_l_diff alfa_va = sin_f_d(i,k)*sin_l_diff beta_ua = -sin_f_a*sin_l_diff beta_va = cos_f_d(i,k)*cos_f_a & + sin_f_d(i,k)*sin_f_a*cos_l_diff ! !sela do k = 1,plev !sela do i = i_1,i_2 !sela alfa_ua(i,k)=1. !sela alfa_va(i,k)=0. !sela !sela beta_ua(i,k)=0. !sela beta_va(i,k)=1. !sela enddo !sela enddo ! ud3_d, vd3_d are bottom to top, coming from lagzin. ! alfas,betas are bottom to top, coming from previous loops. !therefore: ! ud3_a, vd3_a are bottom to top, as expected in gloopa. ud3_a(i,k) = alfa_ua * ud3_d(i,k) + alfa_va * vd3_d(i,k) vd3_a(i,k) = beta_ua * ud3_d(i,k) + beta_va * vd3_d(i,k) end do end do return end ! function bisection(x,plev,u) implicit none integer u,i,j,k,plev,bisection integer,dimension(plev) :: x i = 1 j = plev do k = (i+j)/2 if (u < x(k)) then j = k else i = k end if if (i+1 >= j) then bisection = i return endif end do return end subroutine endrun_h implicit none print*,' **** endrun_h was called - execution stopped ' stop13 end subroutine lagyin_h_m(i_1,i_2, & fintx,finty,yb,yt,term1,term2,term3,term4,quamon) !sk 2/25/2012 !sk modified original subroutine lagyin_h for quasi-monotone !sk quasi-cubic lagrange interpolation in y !sk 10/08/2012 !sk renamed lagyin_h as lagyin_h_m and added quamon to argument list use machine , only : kind_evod use pmgrid , only : plev implicit none ! input variable integer i_1,i_2 real,dimension(i_1:i_2,plev,4,4) :: fintx ! x-interpolants real,dimension(i_1:i_2,plev,4) :: finty ! interpolants at the horiz. depart real,dimension(i_1:i_2,plev) :: yb,yt,term1,term2,term3,term4 logical quamon ! local variable integer i,k real(kind=kind_evod) tem1, tem2 ! do k=1,plev do i=i_1,i_2 finty(i,k,1) = fintx(i,k,2,1)*yb (i,k) & + fintx(i,k,3,1)*yt (i,k) finty(i,k,2) = fintx(i,k,1,2)*term1(i,k) & + fintx(i,k,2,2)*term2(i,k) & + fintx(i,k,3,2)*term3(i,k) & + fintx(i,k,4,2)*term4(i,k) finty(i,k,3) = fintx(i,k,1,3)*term1(i,k) & + fintx(i,k,2,3)*term2(i,k) & + fintx(i,k,3,3)*term3(i,k) & + fintx(i,k,4,3)*term4(i,k) if (quamon) then ! call quasim(fintx(i,k,2,2),fintx(i,k,3,2),finty(i,k,2)) ! call quasim(fintx(i,k,2,3),fintx(i,k,3,3),finty(i,k,3)) tem1 = min(fintx(i,k,2,2),fintx(i,k,3,2)) tem2 = max(fintx(i,k,2,2),fintx(i,k,3,2)) finty(i,k,2) = max(tem1,min(tem2,finty(i,k,2))) tem1 = min(fintx(i,k,2,3),fintx(i,k,3,3)) tem2 = max(fintx(i,k,2,3),fintx(i,k,3,3)) finty(i,k,3) = max(tem1,min(tem2,finty(i,k,3))) endif finty(i,k,4) = fintx(i,k,2,4) * yb(i,k) & + fintx(i,k,3,4) * yt(i,k) enddo enddo return end subroutine lagyinit_h(i_1,i_2,y,dyi,lbasiy,ydp,jdp, & yb,yt,term1,term2,term3,term4) ! use machine , only : kind_evod use pmgrid , only : platd,plev implicit none ! input variables integer i_1,i_2 real(kind=kind_evod),dimension(platd) :: y,dyi real(kind=kind_evod),dimension(4,2,platd) :: lbasiy ! y-interpolation weights real(kind=kind_evod),dimension(i_1:i_2,plev) :: ydp ! y-coordinates of departure pts. &, yb,yt,term1,term2 &, term3,term4 integer,dimension(i_1:i_2,plev) :: jdp ! j-index of departure point coord. ! local variables integer i, k, m, jj real(kind=kind_evod) :: ymy1, ! | & ymy2, ! | & ymy3, ! | & ymy4, ! | & coef12, ! | & coef34 ! | -- interpolation weights/coeffs. ! do k=1,plev do i=i_1,i_2 jj = jdp(i,k) yb(i,k) = ( y(jj+1) - ydp(i,k) ) * dyi(jj) yt(i,k) = 1. - yb(i,k) ymy1 = ydp(i,k) - lbasiy(1,1,jj) ymy2 = ydp(i,k) - lbasiy(2,1,jj) ymy3 = ydp(i,k) - lbasiy(3,1,jj) ymy4 = ydp(i,k) - lbasiy(4,1,jj) coef12 = ymy3 * ymy4 coef34 = ymy1 * ymy2 term1(i,k) = coef12 * ymy2 * lbasiy(1,2,jj) term2(i,k) = coef12 * ymy1 * lbasiy(2,2,jj) term3(i,k) = coef34 * ymy4 * lbasiy(3,2,jj) term4(i,k) = coef34 * ymy3 * lbasiy(4,2,jj) end do end do return end subroutine lagzin_h(i_1,i_2, & kdim,finty,lbasdz,kdp,hb,ht,dhb,dht,detam, & term1,term2,term3,term4,fdp) ! use machine , only : kind_evod use pmgrid , only : plev,plevp,plon implicit none ! input variables integer i_1,i_2,kdim integer,dimension(i_1:i_2,plev) :: kdp real(kind=kind_evod),dimension(i_1:i_2,plev,4):: finty real(kind=kind_evod),dimension(i_1:i_2,plev) :: hb,ht,dhb,dht, & term1,term2, & term3,term4 real(kind=kind_evod),dimension(4,2,kdim) :: lbasdz real(kind=kind_evod),dimension(plon,plev) :: fdp real(kind=kind_evod),dimension(plev) :: detam ! delta eta at levels ! local variables integer i,k,m,kdimm1,kdimm2,kk,kr real(kind=kind_evod) :: ftop,fbot ! kdimm1 = kdim - 1 kdimm2 = kdim - 2 do k = 1,plev kr = plevp-k do i = i_1,i_2 kk = kdp(i,k) if(kk == 1) then ftop = (finty(i,k,3) - finty(i,k,2)) / detam(1) fbot = lbasdz(1,1,2) * finty(i,k,2) & + lbasdz(2,1,2) * finty(i,k,3) & + lbasdz(3,1,2) * finty(i,k,4) & + lbasdz(4,1,2) * finty(i,k,1) fdp(i,kr) = finty(i,k,2) * ht (i,k) & + ftop * dht(i,k) & + finty(i,k,3) * hb (i,k) & + fbot * dhb(i,k) elseif(kk == kdimm1) then ftop = lbasdz(1,2,kdimm2) * finty(i,k,4) & + lbasdz(2,2,kdimm2) * finty(i,k,1) & + lbasdz(3,2,kdimm2) * finty(i,k,2) & + lbasdz(4,2,kdimm2) * finty(i,k,3) !$$$ fbot = 0.0 fdp(i,kr) = finty(i,k,2) * ht (i,k) & + ftop * dht(i,k) & + finty(i,k,3) * hb (i,k) !$$$ & + fbot * dhb(i,k) else fdp(i,kr) = finty(i,k,1) * term1(i,k) & + finty(i,k,2) * term2(i,k) & + finty(i,k,3) * term3(i,k) & + finty(i,k,4) * term4(i,k) endif enddo enddo return end subroutine lagzinit_h(i_1,i_2,kdim,lbasiz, & etamid,detam,sigdp,kdp,kkdp, & hb,ht,dhb,dht,term1z,term2z,term3z,term4z) ! use machine , only : kind_evod use pmgrid , only : plev implicit none ! ! input variables integer i_1,i_2,kdim integer,dimension(i_1:i_2,plev) :: kdp,kkdp real(kind=kind_evod),dimension(4,2,kdim) :: lbasiz real(kind=kind_evod),dimension(kdim) :: etamid,detam real(kind=kind_evod),dimension(i_1:i_2,plev) :: sigdp, & hb,ht,dhb,dht,term1z,term2z,term3z,term4z ! ! local variables integer i,k,m,kk,jj real(kind=kind_evod) :: dzk,zt,zb,zt2,zb2 real(kind=kind_evod) :: zmz1, ! | & zmz2, ! | & zmz3, ! | & zmz4, ! | & coef12, ! | & coef34 ! | -- interpolation weights/coeffs. &, stem ! do k=1,plev do i=i_1,i_2 jj = kdp(i,k) dzk = detam(jj) stem = sigdp(i,k) zt = ( etamid(jj+1) - stem )/dzk zb = 1. - zt zt2 = zt * zt zb2 = zb * zb kk = kkdp(i,k) ht(i,k) = ( 3.0 - 2.0*zt ) * zt2 hb(i,k) = ( 3.0 - 2.0*zb ) * zb2 dht(i,k) = -dzk*( zt - 1. ) * zt2 dhb(i,k) = dzk*( zb - 1. ) * zb2 zmz1 = stem - lbasiz(1,1,kk) zmz2 = stem - lbasiz(2,1,kk) zmz3 = stem - lbasiz(3,1,kk) zmz4 = stem - lbasiz(4,1,kk) coef12 = zmz3 * zmz4 coef34 = zmz1 * zmz2 term1z(i,k) = coef12 * zmz2 * lbasiz(1,2,kk) term2z(i,k) = coef12 * zmz1 * lbasiz(2,2,kk) term3z(i,k) = coef34 * zmz4 * lbasiz(3,2,kk) term4z(i,k) = coef34 * zmz3 * lbasiz(4,2,kk) end do end do return end subroutine lcbas_h( grd, bas1, bas2 ) use machine , only : kind_evod implicit none real(kind=kind_evod),dimension(4) :: grd ! grid stencil real(kind=kind_evod),dimension(4) :: bas1, ! grid values on stencil & bas2 ! lagrangian basis functions real(kind=kind_evod) :: x0mx1, ! | & x0mx2, ! | & x0mx3, ! |- grid value differences used in & x1mx2, ! | weights & x1mx3, ! | & x2mx3 ! | x0mx1 = grd(1) - grd(2) x0mx2 = grd(1) - grd(3) x0mx3 = grd(1) - grd(4) x1mx2 = grd(2) - grd(3) x1mx3 = grd(2) - grd(4) x2mx3 = grd(3) - grd(4) bas1(1) = grd(1) bas1(2) = grd(2) bas1(3) = grd(3) bas1(4) = grd(4) bas2(1) = 1./ ( x0mx1 * x0mx2 * x0mx3 ) bas2(2) = -1./ ( x0mx1 * x1mx2 * x1mx3 ) bas2(3) = 1./ ( x0mx2 * x1mx2 * x2mx3 ) bas2(4) = -1./ ( x0mx3 * x1mx3 * x2mx3 ) return end subroutine lcdbas_h(grd,dbas2,dbas3) use machine , only : kind_evod implicit none ! ! input variables real(kind=kind_evod),dimension(4) :: grd, ! grid stencil & dbas2, ! derivatives at grid point 2. $ dbas3 ! derivatives at grid point 3. real(kind=kind_evod) :: x1, ! | $ x2, ! |- grid values $ x3, ! | $ x4, ! | $ x1mx2, ! | $ x1mx3, ! | $ x1mx4, ! |- differences of grid values $ x2mx3, ! | $ x2mx4, ! | $ x3mx4 ! | x1 = grd(1) x2 = grd(2) x3 = grd(3) x4 = grd(4) x1mx2 = x1 - x2 x1mx3 = x1 - x3 x1mx4 = x1 - x4 x2mx3 = x2 - x3 x2mx4 = x2 - x4 x3mx4 = x3 - x4 dbas2(1) = x2mx3 * x2mx4 / ( x1mx2 * x1mx3 * x1mx4 ) dbas2(2) = -1./x1mx2 + 1./x2mx3 + 1./x2mx4 dbas2(3) = - x1mx2 * x2mx4 / ( x1mx3 * x2mx3 * x3mx4 ) dbas2(4) = x1mx2 * x2mx3 / ( x1mx4 * x2mx4 * x3mx4 ) dbas3(1) = - x2mx3 * x3mx4 / ( x1mx2 * x1mx3 * x1mx4 ) dbas3(2) = x1mx3 * x3mx4 / ( x1mx2 * x2mx3 * x2mx4 ) dbas3(3) = -1./x1mx3 - 1./x2mx3 + 1./x3mx4 dbas3(4) = - x1mx3 * x2mx3 / ( x1mx4 * x2mx4 * x3mx4 ) return end subroutine set_pmgrid_h(lonf,latg,levs) use pmgrid , only : mprec,pgls,plat,platd, & plev,plevd,plevp,plon,plond,pi implicit none ! input variables integer lonf,latg,levs ! local variables integer nxpt,jintmx ! pi = 4.*atan(1.) plon = lonf plev = levs plat = latg plevp = plev + 1 nxpt = 1 jintmx = 1 plond = plon + 1 + 2*nxpt platd = plat + 2*nxpt + 2*jintmx plevd = plev mprec = 1.e-12 pgls = plon*plev return end subroutine herzinit_h(i_1,i_2,kdim, & etamid,detam,detami,sigdp,kdp, & hb,ht,dhb,dht) ! use machine , only : kind_evod use pmgrid , only : plev implicit none ! ! input variables integer i_1,i_2,kdim integer,dimension(i_1:i_2,plev) :: kdp real(kind=kind_evod),dimension(kdim) :: etamid,detam &, detami real(kind=kind_evod),dimension(i_1:i_2,plev) :: sigdp,hb,ht, & dhb,dht ! local variables integer i,k,m,kk real dzk,zb2,zt2,zt,zb do k=1,plev do i=i_1,i_2 kk = kdp(i,k) dzk = detam(kk) ! zt = ( etamid(kk+1) - sigdp(i,k) ) / dzk zt = ( etamid(kk+1) - sigdp(i,k) ) * detami(kk) zb = 1. - zt zt2 = zt * zt zb2 = zb * zb ht(i,k) = ( 3.0 - zt -zt ) * zt2 hb(i,k) = ( 3.0 - zb -zb ) * zb2 dht(i,k) = -dzk * (zt - 1.) * zt2 dhb(i,k) = dzk * (zb - 1.) * zb2 enddo enddo return end subroutine heryinit_h(i_1,i_2,phi,dphi,dphii,phidp,jdp,ys,yn, & hs,hn,dhs,dhn) use machine , only : kind_evod use pmgrid , only : platd,plev implicit none ! input variables integer i_1,i_2 integer,dimension(i_1:i_2,plev) :: jdp ! j-index of departure point coord. real(kind=kind_evod),dimension(platd) :: phi,dphi,dphii real(kind=kind_evod),dimension(i_1:i_2,plev) :: phidp, ! y-coordinates of departure pts. & ys,yn,hs,hn,dhs, & dhn ! local variables real dyj,ys2,yn2 integer i,k,jj ! do k=1,plev do i=i_1,i_2 jj = jdp(i,k) dyj = dphi(jj) ! ys(i,k) = (phi(jj+1) - phidp(i,k)) * dphii(jj) yn(i,k) = 1. - ys(i,k) ys2 = ys(i,k) * ys(i,k) yn2 = yn(i,k) * yn(i,k) ! hs(i,k) = (3.0 - ys(i,k) - ys(i,k)) * ys2 hn(i,k) = (3.0 - yn(i,k) - yn(i,k)) * yn2 ! dhs(i,k) = -dyj * (ys(i,k) - 1.) * ys2 dhn(i,k) = dyj * (yn(i,k) - 1.) * yn2 enddo enddo ! return end subroutine her_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & idp,jdp,kdp,kkdp,xl,xr,hl,hr,dhl,dhr,fb, & ys,yn,hs,hn,dhs,dhn,dphii, ! & fintx,ys,yn,hs,hn,dhs,dhn,rdphi,finty, & kdim,lbasdz,hb,ht,dhb,dht,detam,fdp) ! &, lprnt,jp,lan) !----------------------------------------------------------------------- use machine , only : kind_evod use pmgrid , only : plev,plevp,plon,plond,platd use slgshr , only : lbasdy,rdlam,rdlam6 !----------------------------------------------------------------------- implicit none !----------------------------------------------------------------------- ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim integer,dimension(i_1:i_2,plev,4) :: idp integer,dimension(i_1:i_2,plev) :: jdp,kdp,kkdp real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,hs,hn &, dhs, dhn ! &, dhs, dhn,rdphi &, hb,ht,dhb,dht real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: hl,hr,dhl,dhr ! & dhr,finty real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb ! real(kind=kind_evod),dimension(i_1:i_2,plev,4,4) :: fintx real(kind=kind_evod),dimension(4,2,kdim) :: lbasdz real(kind=kind_evod),dimension(plon,plev) :: fdp real(kind=kind_evod),dimension(plev) :: detam ! delta eta at levels real(kind=kind_evod),dimension(platd) :: dphii logical lprnt ! local variables integer kdimm1,kdimm2,m,ii1,ii2,ii3,ii4,jj,kk,i,k &, ii1p1,ii2m1,ii2p1,ii2p2,ii3m1,ii3p1,ii3p2,ii4p1 &, jjm1,jjp1,jjp2,kkm1,kkp1,kkp2 real(kind=kind_evod) fxl,fxr,deli,tmp1,tmp2, & rdlamjj,rdlamjjp1,rdlam6jj,rdlam6jjp1,fac real(kind=kind_evod),dimension(4,4) :: fintx real(kind=kind_evod),dimension(4) :: finty ! real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: ftop,fbot real(kind=kind_evod),dimension(4) :: ftop,fbot !----------------------------------------------------------------------- ! if (lprnt) then ! print*,'hello from her_xyz_in_h ' ! print*,' i_1=',i_1,' plon=',plon,' plev=',plev ! print*,' i_2=',i_2 ! print*,' s_lat_in_pe=',s_lat_in_pe ! print*,' n_lat_in_pe=',n_lat_in_pe ! print*,' kdim=',kdim ! print*,' fb=', fb(2,1:5,jp) !!! print*,' fdp=', fdp(1,1) !!! print*,' =', ! print*,'goodby from her_xyz_in_h ' ! endif !----------------------------------------------------------------------- ! fac = 3.*(1. - 10.*epsilon(fac)) ! print*,' her_xyz_in_h fac = ',fac kdimm1 = kdim - 1 kdimm2 = kdim - 2 ! ! part 1: x-interpolation ! ! loop over fields. ! ..x interpolation at each height needed for z interpolation. ! ...x interpolation at each latitude needed for y interpolation. ! do k=1,plev do i=i_1,i_2 ii1 = idp(i,k,1) ii2 = idp(i,k,2) ii3 = idp(i,k,3) ii4 = idp(i,k,4) kk = kkdp(i,k) ! ii1p1 = ii1 + 1 ii2m1 = ii2 - 1 ii2p1 = ii2 + 1 ii2p2 = ii2 + 2 ii3m1 = ii3 - 1 ii3p1 = ii3 + 1 ii3p2 = ii3 + 2 ii4p1 = ii4 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjm1 = max(jj-1,s_lat_in_pe) jjp1 = min(jj+1,n_lat_in_pe) jjp2 = min(jj+2,n_lat_in_pe) kkm1 = kk - 1 kkp1 = kk + 1 kkp2 = kk + 2 rdlamjj = rdlam(jj) rdlamjjp1 = rdlam(jj+1) ! rdlam6jj = rdlam6(jj) rdlam6jjp1 = rdlam6(jj+1) !sela if (ii2-1 .le. 0) then !sela print*,' zero index in herxin ii',ii2 !sela stop221 !sela endif !sela if (jj-1 .le. 0) then !sela print*,' zero index in herxin jj',jj !sela stop222 !sela endif !sela if (kk-1 .le. 0) then !sela print*,' zero index in herxin kk',kk !sela stop223 !sela endif ! ! ! height level 1: linear interpolation on inner two latitudes only ! !!! fintx(1,1) = not used fintx(2,1) = fb(ii2 ,kkm1,jj ) * xl(i,k,2) + & fb(ii2p1,kkm1,jj ) * xr(i,k,2) fintx(3,1) = fb(ii3 ,kkm1,jjp1) * xl(i,k,3) + & fb(ii3p1,kkm1,jjp1) * xr(i,k,3) !!! fintx(4,1) = not used ! ! height level 2 ! ! latitude 1: linear interpolation ! fintx(1,2) = fb(ii1 ,kk,jjm1) * xl(i,k,1) + & fb(ii1p1,kk,jjm1) * xr(i,k,1) ! ! latitude 2: cubic interpolation ! fxl = ( - 2.*fb(ii2m1,kk,jj) & - 3.*fb(ii2 ,kk,jj) & + 6.*fb(ii2p1,kk,jj) & - fb(ii2p2,kk,jj) )*rdlam6jj fxr = ( fb(ii2m1,kk,jj) & - 6.*fb(ii2 ,kk,jj) & + 3.*fb(ii2p1,kk,jj) & + 2.*fb(ii2p2,kk,jj) )*rdlam6jj ! deli = ( fb(ii2p1,kk,jj) - & fb(ii2 ,kk,jj) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(2,2) = fb(ii2 ,kk,jj) * hl(i,k,2) & + fb(ii2p1,kk,jj) * hr(i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! ! latitude 3: cubic interpolation ! fxl = ( - 2.*fb(ii3m1,kk ,jjp1) & - 3.*fb(ii3 ,kk ,jjp1) & + 6.*fb(ii3p1,kk ,jjp1) & - fb(ii3p2,kk ,jjp1) )*rdlam6jjp1 fxr = ( fb(ii3m1,kk ,jjp1) & - 6.*fb(ii3 ,kk ,jjp1) & + 3.*fb(ii3p1,kk ,jjp1) & + 2.*fb(ii3p2,kk ,jjp1) )*rdlam6jjp1 ! deli = ( fb(ii3p1,kk ,jjp1) - & fb(ii3 ,kk ,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(3,2) = fb(ii3 ,kk ,jjp1) * hl(i,k,3) & + fb(ii3p1,kk ,jjp1) * hr(i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(4,2) = fb(ii4 ,kk,jjp2) * xl(i,k,4) & + fb(ii4p1,kk,jjp2) * xr(i,k,4) ! ! height level 3 ! ! latitude 1: linear interpolation ! fintx(1,3) = fb(ii1 ,kkp1,jjm1) * xl (i,k,1) & + fb(ii1p1,kkp1,jjm1) * xr (i,k,1) ! ! latitude 2: cubic interpolation ! fxl = ( - 2.*fb(ii2m1,kkp1,jj ) & - 3.*fb(ii2 ,kkp1,jj ) & + 6.*fb(ii2p1,kkp1,jj ) & - fb(ii2p2,kkp1,jj ) )*rdlam6jj fxr = ( fb(ii2m1,kkp1,jj ) & - 6.*fb(ii2 ,kkp1,jj ) & + 3.*fb(ii2p1,kkp1,jj ) & + 2.*fb(ii2p2,kkp1,jj ) )*rdlam6jj ! deli = ( fb(ii2p1,kkp1,jj ) - & fb(ii2 ,kkp1,jj ) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(2,3) = fb(ii2 ,kkp1,jj ) * hl(i,k,2) & + fb(ii2p1,kkp1,jj ) * hr(i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! ! latitude 3: cubic interpolation ! fxl = (- 2.*fb(ii3m1,kkp1,jjp1) & - 3.*fb(ii3 ,kkp1,jjp1) & + 6.*fb(ii3p1,kkp1,jjp1) & - fb(ii3p2,kkp1,jjp1) )*rdlam6jjp1 fxr = ( fb(ii3m1,kkp1,jjp1) & - 6.*fb(ii3 ,kkp1,jjp1) & + 3.*fb(ii3p1,kkp1,jjp1) & + 2.*fb(ii3p2,kkp1,jjp1) )*rdlam6jjp1 ! deli = ( fb(ii3p1,kkp1,jjp1) - & fb(ii3 ,kkp1,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(3,3) = fb(ii3 ,kkp1,jjp1) * hl(i,k,3) & + fb(ii3p1,kkp1,jjp1) * hr(i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(4,3) = fb(ii4 ,kkp1,jjp2) * xl(i,k,4) & + fb(ii4p1,kkp1,jjp2) * xr(i,k,4) ! ! height level 4: linear interpolation on inner two latitudes only ! !!! fintx(1,4) = not used fintx(2,4) = fb(ii2 ,kkp2,jj ) * xl(i,k,2) & + fb(ii2p1,kkp2,jj ) * xr(i,k,2) fintx(3,4) = fb(ii3 ,kkp2,jjp1) * xl(i,k,3) & + fb(ii3p1,kkp2,jjp1) * xr(i,k,3) !!! fintx(4,4) = not used ! top interval ! !the following loop computes x-derivatives for those cases when the ! departure point lies in either the top or bottom interval of the ! model grid. in this special case, data are shifted up or down to ! keep the departure point in the middle interval of the 4-point ! stencil. therefore, some derivatives that were computed above will ! be over-written. if(kdp (i,k) == 1) then ! ! shift levels 4 and 2 data to levels 1 and 3, respectively ! fintx(2,1) = fintx(2,4) fintx(3,1) = fintx(3,4) ! fintx(1,3) = fintx(1,2) fintx(2,3) = fintx(2,2) fintx(3,3) = fintx(3,2) fintx(4,3) = fintx(4,2) ! ! height level 1 (placed in level 2 of stencil): ! ! latitude 1: linear interpolation ! ! print *,' i=',i,' k=',k,' ii1=',ii1,' jj=',jj,' in her_xyz' fintx(1,2) = fb(ii1 ,1,jjm1) * xl(i,k,1) & + fb(ii1p1,1,jjm1) * xr(i,k,1) ! ! latitude 2: cubic interpolation ! fxl = (- 2.*fb(ii2m1,1,jj) - 3.*fb(ii2 ,1,jj) & + 6.*fb(ii2p1,1,jj) - fb(ii2p2,1,jj) )*rdlam6jj fxr = ( fb(ii2m1,1,jj) - 6.*fb(ii2 ,1,jj) & + 3.*fb(ii2p1,1,jj) + 2.*fb(ii2p2,1,jj) )*rdlam6jj ! deli = ( fb(ii2p1,1,jj) - fb(ii2 ,1,jj) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(2,2) = fb(ii2 ,1,jj) * hl(i,k,2) & + fb(ii2p1,1,jj) * hr(i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! ! latitude 3: cubic interpolation ! fxl = (- 2.*fb(ii3m1,1,jjp1) - 3.*fb(ii3 ,1,jjp1) & + 6.*fb(ii3p1,1,jjp1) - fb(ii3p2,1,jjp1) ) & * rdlam6jjp1 fxr = ( fb(ii3m1,1,jjp1) - 6.*fb(ii3 ,1,jjp1) & + 3.*fb(ii3p1,1,jjp1) + 2.*fb(ii3p2,1,jjp1))*rdlam6jjp1 ! deli = (fb (ii3p1,1,jjp1) - fb(ii3 ,1,jjp1))*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(3,2) = fb(ii3 ,1,jjp1) * hl(i,k,3) & + fb(ii3p1,1,jjp1) * hr(i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(4,2) = fb(ii4 ,1,jjp2) * xl(i,k,4) & + fb(ii4p1,1,jjp2) * xr(i,k,4) ! ! height level 3 (placed in level 4 of stencil): ! linear interpolation on inner two latitudes only ! !!! fintx(1,4) = not used fintx(2,4) = fb(ii2 ,3,jj ) * xl(i,k,2) & + fb(ii2p1,3,jj ) * xr(i,k,2) fintx(3,4) = fb(ii3 ,3,jjp1) * xl(i,k,3) & + fb(ii3p1,3,jjp1) * xr(i,k,3) !!! fintx(4,4) = not used ! ! bot interval ! elseif(kdp (i,k) == kdimm1) then ! ! shift levels 1 and 3 data to levels 4 and 2, respectively ! fintx(2,4) = fintx(2,1) fintx(3,4) = fintx(3,1) ! fintx(1,2) = fintx(1,3) fintx(2,2) = fintx(2,3) fintx(3,2) = fintx(3,3) fintx(4,2) = fintx(4,3) ! ! height level 2 (placed in level 1 of stencil): ! linear interpolation on inner two latitudes only ! !!! fintx(1,1) = not used fintx(2,1) = fb(ii2 ,kdimm2,jj ) * xl (i,k,2) & + fb(ii2p1,kdimm2,jj ) * xr (i,k,2) fintx(3,1) = fb(ii3 ,kdimm2,jjp1) * xl (i,k,3) & + fb(ii3p1,kdimm2,jjp1) * xr (i,k,3) !!! fintx(4,1) = not used ! ! height level 4 (placed in level 3 of stencil): ! ! latitude 1: linear interpolation ! fintx(1,3) = fb(ii1 ,kdim,jjm1) * xl (i,k,1) & + fb(ii1p1,kdim,jjm1) * xr (i,k,1) ! ! latitude 2: cubic interpolation ! fxl = ( - 2.*fb(ii2m1,kdim,jj ) & - 3.*fb(ii2 ,kdim,jj ) & + 6.*fb(ii2p1,kdim,jj ) & - fb(ii2p2,kdim,jj ) )*rdlam6jj fxr = ( fb(ii2m1,kdim,jj ) & - 6.*fb(ii2 ,kdim,jj ) & + 3.*fb(ii2p1,kdim,jj ) & + 2.*fb(ii2p2,kdim,jj ) )*rdlam6jj ! deli = ( fb(ii2p1,kdim,jj ) - & fb(ii2 ,kdim,jj ) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(2,3) = fb(ii2 ,kdim,jj ) * hl (i,k,2) & + fb(ii2p1,kdim,jj ) * hr (i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! ! latitude 3: cubic interpolation ! fxl = ( - 2.*fb(ii3m1,kdim,jjp1) & - 3.*fb(ii3 ,kdim,jjp1) & + 6.*fb(ii3p1,kdim,jjp1) & - fb(ii3p2,kdim,jjp1) )*rdlam6jjp1 fxr = ( fb(ii3m1,kdim,jjp1) & - 6.*fb(ii3 ,kdim,jjp1) & + 3.*fb(ii3p1,kdim,jjp1) & + 2.*fb(ii3p2,kdim,jjp1) )*rdlam6jjp1 ! deli = ( fb(ii3p1,kdim,jjp1) - & fb(ii3 ,kdim,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(3,3) = fb(ii3 ,kdim,jjp1) * hl(i,k,3) & + fb(ii3p1,kdim,jjp1) * hr(i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(4,3) = fb(ii4 ,kdim,jjp2) * xl(i,k,4) & + fb(ii4p1,kdim,jjp2) * xr(i,k,4) endif ! !----------------------------------------------------------------------- ! ! y derivatives at the inner height levels (kk = 2,3) needed for ! z-interpolation ! kk = 2 fbot(kk) = lbasdy(1,1,jj) * fintx(1,kk) & + lbasdy(2,1,jj) * fintx(2,kk) & + lbasdy(3,1,jj) * fintx(3,kk) & + lbasdy(4,1,jj) * fintx(4,kk) ftop(kk) = lbasdy(1,2,jj) * fintx(1,kk) & + lbasdy(2,2,jj) * fintx(2,kk) & + lbasdy(3,2,jj) * fintx(3,kk) & + lbasdy(4,2,jj) * fintx(4,kk) ! ! apply scm0 limiter to derivative estimates. ! deli = ( fintx(3,kk) - fintx(2,kk) )*dphii(jj) tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fbot(kk) <= 0.0 ) fbot(kk) = 0. if( deli*ftop(kk) <= 0.0 ) ftop(kk) = 0. if( abs( fbot(kk) ) > tmp2 ) fbot(kk) = tmp1 if( abs( ftop(kk) ) > tmp2 ) ftop(kk) = tmp1 kk = 3 fbot(kk) = lbasdy(1,1,jj) * fintx(1,kk) & + lbasdy(2,1,jj) * fintx(2,kk) & + lbasdy(3,1,jj) * fintx(3,kk) & + lbasdy(4,1,jj) * fintx(4,kk) ftop(kk) = lbasdy(1,2,jj) * fintx(1,kk) & + lbasdy(2,2,jj) * fintx(2,kk) & + lbasdy(3,2,jj) * fintx(3,kk) & + lbasdy(4,2,jj) * fintx(4,kk) ! apply scm0 limiter to derivative estimates. ! deli = ( fintx(3,kk) - fintx(2,kk) )*dphii(jj) tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fbot(kk) <= 0.0 ) fbot(kk) = 0. if( deli*ftop(kk) <= 0.0 ) ftop(kk) = 0. if( abs( fbot(kk) ) > tmp2 ) fbot(kk) = tmp1 if( abs( ftop(kk) ) > tmp2 ) ftop(kk) = tmp1 ! ! part 3: y-interpolants ! finty(1) = fintx(2,1)*ys (i,k) + fintx(3,1)*yn (i,k) finty(2) = fintx(2,2)*hs (i,k) + fbot (2)*dhs(i,k) & + fintx(3,2)*hn (i,k) + ftop (2)*dhn(i,k) finty(3) = fintx(2,3)*hs (i,k) + fbot (3)*dhs(i,k) & + fintx(3,3)*hn (i,k) + ftop (3)*dhn(i,k) finty(4) = fintx(2,4)*ys (i,k) + fintx(3,4)*yn (i,k) ! !----------------------------------------------------------------------- ! kk = kdp (i,k) if(kk == 1) then ftop(1) = (finty(3) - finty(2)) / detam(1) fbot(1) = lbasdz(1,1,2)*finty(2) + lbasdz(2,1,2)*finty(3) & + lbasdz(3,1,2)*finty(4) + lbasdz(4,1,2)*finty(1) elseif(kk == kdimm1) then ftop(1) = lbasdz(1,2,kdimm2) * finty(4) & + lbasdz(2,2,kdimm2) * finty(1) & + lbasdz(3,2,kdimm2) * finty(2) & + lbasdz(4,2,kdimm2) * finty(3) fbot(1) = 0.0 else ftop(1) = lbasdz(1,1,kk)*finty(1) + lbasdz(2,1,kk)*finty(2) & + lbasdz(3,1,kk)*finty(3) + lbasdz(4,1,kk)*finty(4) fbot(1) = lbasdz(1,2,kk)*finty(1) + lbasdz(2,2,kk)*finty(2) & + lbasdz(3,2,kk)*finty(3) + lbasdz(4,2,kk)*finty(4) endif ! deli = (finty(3) - finty(2)) / detam(kk) tmp1 = fac*deli tmp2 = abs(tmp1) if( deli*fbot(1) <= 0.0 ) fbot(1) = 0. if( deli*ftop(1) <= 0.0 ) ftop(1) = 0. if( abs( fbot(1) ) > tmp2 ) fbot(1) = tmp1 if( abs( ftop(1) ) > tmp2 ) ftop(1) = tmp1 fdp(i,plevp-k) = finty(2)*ht(i,k) + ftop(1)*dht(i,k) & + finty(3)*hb(i,k) + fbot(1)*dhb(i,k) end do enddo !----------------------------------------------------------------------- ! if (lprnt) then ! print*,' fdp=', fdp(1,plevp-5:plev) ! print*,'goodby from her_xyz_in_h ' ! endif !----------------------------------------------------------------------- return end subroutine herxin_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & idp,jdp,kdp,kkdp,xl,xr,hl,hr,dhl,dhr,fb,fintx) ! use machine , only : kind_evod use pmgrid , only : plev,plond use slgshr , only : rdlam,rdlam6 implicit none ! ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer,dimension(i_1:i_2,plev,4) :: idp integer,dimension(i_1:i_2,plev) :: jdp,kdp,kkdp real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl, xr real(kind=kind_evod),dimension(i_1:i_2,plev,2:3) :: hl,hr,dhl,dhr real(kind=kind_evod),dimension(i_1:i_2,plev,4,4) :: fintx real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb ! local variables integer kdim,kdimm1,kdimm2,ii1,ii2,ii3,ii4,jj,kk,i,k,ii1p1,ii2m1 &, ii2p1,ii2p2,ii3m1,ii3p1,ii3p2,ii4p1,jjm1,jjp1,jjp2 &, kkm1,kkp1,kkp2 real(kind=kind_evod) :: rdlamjj,rdlamjjp1,rdlam6jj,rdlam6jjp1, & fxl,fxr,deli,tmp1,tmp2,fac ! fac = 3.*(1. - 10.*epsilon(fac)) ! kdim = plev kdimm1 = kdim - 1 kdimm2 = kdim - 2 ! ! part 1: x-interpolation ! ! loop over fields. ! ..x interpolation at each height needed for z interpolation. ! ...x interpolation at each latitude needed for y interpolation. ! do k=1,plev do i=i_1,i_2 ii1 = idp(i,k,1) ii1p1 = ii1 + 1 ii2 = idp(i,k,2) ii2m1 = ii2 - 1 ii2p1 = ii2 + 1 ii2p2 = ii2 + 2 ii3 = idp(i,k,3) ii3m1 = ii3 - 1 ii3p1 = ii3 + 1 ii3p2 = ii3 + 2 ii4 = idp(i,k,4) ii4p1 = ii4 + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjm1 = max(jj-1,s_lat_in_pe) jjp1 = min(jj+1,n_lat_in_pe) jjp2 = min(jj+2,n_lat_in_pe) kk = kkdp(i,k) kkm1 = kk - 1 kkp1 = kk + 1 kkp2 = kk + 2 rdlamjj = rdlam(jj) rdlamjjp1 = rdlam(jjp1) ! rdlam6jj = rdlam6(jj) rdlam6jjp1 = rdlam6(jjp1) !sela if (ii2-1 .le. 0) then !sela print*,' zero index in herxin ii',ii2 !sela stop221 !sela endif !sela if (jj-1 .le. 0) then !sela print*,' zero index in herxin jj',jj !sela stop222 !sela endif !sela if (kk-1 .le. 0) then !sela print*,' zero index in herxin kk',kk !sela stop223 !sela endif ! ! ! height level 1: linear interpolation on inner two latitudes only ! !!! fintx(i,k,1,1) = not used fintx(i,k,2,1) = fb(ii2 ,kkm1,jj ) * xl(i,k,2) + & fb(ii2p1,kkm1,jj ) * xr(i,k,2) fintx(i,k,3,1) = fb(ii3 ,kkm1,jjp1) * xl(i,k,3) + & fb(ii3p1,kkm1,jjp1) * xr(i,k,3) !!! fintx(i,k,4,1) = not used ! ! height level 2 ! ! latitude 1: linear interpolation ! fintx(i,k,1,2) = fb(ii1 ,kk,jjm1) * xl(i,k,1) + & fb(ii1p1,kk,jjm1) * xr(i,k,1) ! ! latitude 2: cubic interpolation ! fxl = (- 2.*fb(ii2m1,kk,jj) - 3.*fb(ii2 ,kk,jj) & + 6.*fb(ii2p1,kk,jj) - fb(ii2p2,kk,jj) )*rdlam6jj fxr = ( fb(ii2m1,kk,jj) - 6.*fb(ii2 ,kk,jj) & + 3.*fb(ii2p1,kk,jj) + 2.*fb(ii2p2,kk,jj) )*rdlam6jj ! deli = ( fb (ii2+1,kk,jj) - fb (ii2 ,kk,jj) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(i,k,2,2) = fb(ii2 ,kk,jj) * hl (i,k,2) & + fb(ii2p1,kk,jj) * hr (i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! ! latitude 3: cubic interpolation ! fxl = (- 2.*fb(ii3m1,kk ,jjp1) & - 3.*fb(ii3 ,kk ,jjp1) & + 6.*fb(ii3p1,kk ,jjp1) & - fb(ii3p2,kk ,jjp1) )*rdlam6jjp1 fxr = ( fb(ii3m1,kk ,jjp1) & - 6.*fb(ii3 ,kk ,jjp1) & + 3.*fb(ii3p1,kk ,jjp1) & + 2.*fb(ii3p2,kk ,jjp1) )*rdlam6jjp1 ! deli = ( fb(ii3p1,kk ,jjp1) - & fb(ii3 ,kk ,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(i,k,3,2) = fb(ii3 ,kk ,jjp1) * hl(i,k,3) & + fb(ii3p1,kk ,jjp1) * hr(i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(i,k,4,2) = fb(ii4 ,kk,jjp2) * xl(i,k,4) & + fb(ii4p1,kk,jjp2) * xr(i,k,4) ! ! height level 3 ! ! latitude 1: linear interpolation ! fintx(i,k,1,3) = fb(ii1 ,kkp1,jjm1) * xl(i,k,1) & + fb(ii1p1,kkp1,jjm1) * xr(i,k,1) ! ! latitude 2: cubic interpolation ! fxl = (- 2.*fb(ii2m1,kkp1,jj ) & - 3.*fb(ii2 ,kkp1,jj ) & + 6.*fb(ii2p1,kkp1,jj ) & - fb(ii2p2,kkp1,jj ) )*rdlam6jj fxr = ( fb(ii2m1,kkp1,jj ) & - 6.*fb(ii2 ,kkp1,jj ) & + 3.*fb(ii2p1,kkp1,jj ) & + 2.*fb(ii2p2,kkp1,jj ) )*rdlam6jj ! deli = ( fb(ii2p1,kkp1,jj ) - & fb(ii2 ,kkp1,jj ) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(i,k,2,3) = fb(ii2 ,kkp1,jj ) * hl (i,k,2) & + fb(ii2p1,kkp1,jj ) * hr (i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! ! latitude 3: cubic interpolation ! fxl = ( - 2.*fb(ii3m1,kkp1,jjp1) & - 3.*fb(ii3 ,kkp1,jjp1) & + 6.*fb(ii3p1,kkp1,jjp1) & - fb(ii3p2,kkp1,jjp1) )*rdlam6jjp1 fxr = ( fb(ii3m1,kkp1,jjp1) & - 6.*fb(ii3 ,kkp1,jjp1) & + 3.*fb(ii3p1,kkp1,jjp1) & + 2.*fb(ii3p2,kkp1,jjp1) )*rdlam6jjp1 ! deli = ( fb (ii3p1,kkp1,jjp1) - & fb (ii3 ,kkp1,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 fintx(i,k,3,3) = fb(ii3 ,kkp1,jjp1) * hl (i,k,3) & + fb(ii3p1,kkp1,jjp1) * hr (i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! latitude 4: linear interpolation ! fintx(i,k,4,3) = fb(ii4 ,kkp1,jjp2) * xl (i,k,4) & + fb(ii4p1,kkp1,jjp2) * xr (i,k,4) ! ! height level 4: linear interpolation on inner two latitudes only ! !!! fintx(i,k,1,4) = not used fintx(i,k,2,4) = fb(ii2 ,kkp2,jj ) * xl (i,k,2) & + fb(ii2p1,kkp2,jj ) * xr (i,k,2) fintx(i,k,3,4) = fb(ii3 ,kkp2,jjp1) * xl (i,k,3) & + fb(ii3p1,kkp2,jjp1) * xr (i,k,3) !!! fintx(i,k,4,4) = not used ! ! the following loop computes x-derivatives for those cases when the ! departure point lies in either the top or bottom interval of the ! model grid. in this special case, data are shifted up or down to ! keep the departure point in the middle interval of the 4-point ! stencil. therefore, some derivatives that were computed above will ! be over-written. ! top interval ! if(kdp (i,k) == 1) then ! ! shift levels 4 and 2 data to levels 1 and 3, respectively ! fintx(i,k,2,1) = fintx(i,k,2,4) fintx(i,k,3,1) = fintx(i,k,3,4) ! fintx(i,k,1,3) = fintx(i,k,1,2) fintx(i,k,2,3) = fintx(i,k,2,2) fintx(i,k,3,3) = fintx(i,k,3,2) fintx(i,k,4,3) = fintx(i,k,4,2) ! ! height level 1 (placed in level 2 of stencil): ! ! latitude 1: linear interpolation ! fintx(i,k,1,2) = fb (ii1 ,1,jjm1)*xl (i,k,1) & + fb (ii1p1,1,jjm1)*xr (i,k,1) ! ! latitude 2: cubic interpolation ! fxl = ( - 2.*fb (ii2m1,1,jj ) & - 3.*fb (ii2 ,1,jj ) & + 6.*fb (ii2+1,1,jj ) & - fb (ii2+2,1,jj ) )*rdlam6jj fxr = ( fb (ii2-1,1,jj ) & - 6.*fb (ii2 ,1,jj ) & + 3.*fb (ii2+1,1,jj ) & + 2.*fb (ii2+2,1,jj ) )*rdlam6jj ! deli = ( fb (ii2+1,1,jj ) - & fb (ii2 ,1,jj ) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(i,k,2,2) = fb (ii2 ,1,jj )*hl (i,k,2) & + fb (ii2p1,1,jj )*hr (i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! latitude 3: cubic interpolation ! fxl = ( - 2.*fb (ii3m1,1,jjp1) & - 3.*fb (ii3 ,1,jjp1) & + 6.*fb (ii3p1,1,jjp1) & - fb (ii3p2,1,jjp1) )*rdlam6jjp1 fxr = ( fb (ii3m1,1,jjp1) & - 6.*fb (ii3 ,1,jjp1) & + 3.*fb (ii3p1,1,jjp1) & + 2.*fb (ii3p2,1,jjp1) )*rdlam6jjp1 deli = ( fb (ii3p1,1,jjp1) - & fb (ii3 ,1,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(i,k,3,2) = fb (ii3 ,1,jjp1)*hl (i,k,3) & + fb (ii3p1,1,jjp1)*hr (i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(i,k,4,2) = fb (ii4 ,1,jjp2)*xl (i,k,4) & + fb (ii4p1,1,jjp2)*xr (i,k,4) ! height level 3 (placed in level 4 of stencil): ! linear interpolation on inner two latitudes only ! !!! fintx(i,k,1,4) = not used fintx(i,k,2,4) = fb (ii2 ,3,jj )*xl (i,k,2) & + fb (ii2p1,3,jj )*xr (i,k,2) fintx(i,k,3,4) = fb (ii3 ,3,jjp1)*xl (i,k,3) & + fb (ii3p1,3,jjp1)*xr (i,k,3) !!! fintx(i,k,4,4) = not used ! bot interval ! else if(kdp (i,k) .eq. kdimm1) then ! ! shift levels 1 and 3 data to levels 4 and 2, respectively ! fintx(i,k,2,4) = fintx(i,k,2,1) fintx(i,k,3,4) = fintx(i,k,3,1) ! fintx(i,k,1,2) = fintx(i,k,1,3) fintx(i,k,2,2) = fintx(i,k,2,3) fintx(i,k,3,2) = fintx(i,k,3,3) fintx(i,k,4,2) = fintx(i,k,4,3) ! height level 2 (placed in level 1 of stencil): ! linear interpolation on inner two latitudes only ! !!! fintx(i,k,1,1) = not used fintx(i,k,2,1) = fb (ii2 ,kdimm2,jj )*xl (i,k,2) & + fb (ii2p1,kdimm2,jj )*xr (i,k,2) fintx(i,k,3,1) = fb (ii3 ,kdimm2,jjp1)*xl (i,k,3) & + fb (ii3p1,kdimm2,jjp1)*xr (i,k,3) !!! fintx(i,k,4,1) = not used ! ! height level 4 (placed in level 3 of stencil): ! ! latitude 1: linear interpolation ! fintx(i,k,1,3) = fb (ii1 ,kdim,jjm1)*xl (i,k,1) & + fb (ii1p1,kdim,jjm1)*xr (i,k,1) ! ! latitude 2: cubic interpolation ! fxl = ( - 2.*fb (ii2m1,kdim,jj ) & - 3.*fb (ii2 ,kdim,jj ) & + 6.*fb (ii2p1,kdim,jj ) & - fb (ii2p2,kdim,jj ) )*rdlam6jj fxr = ( fb (ii2m1,kdim,jj ) & - 6.*fb (ii2 ,kdim,jj ) & + 3.*fb (ii2p1,kdim,jj ) & + 2.*fb (ii2p2,kdim,jj ) )*rdlam6jj ! deli = ( fb (ii2p1,kdim,jj ) - & fb (ii2 ,kdim,jj ) )*rdlamjj tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 fintx(i,k,2,3) = fb (ii2 ,kdim,jj )*hl (i,k,2) & + fb (ii2p1,kdim,jj )*hr (i,k,2) & + fxl*dhl(i,k,2) + fxr*dhr(i,k,2) ! latitude 3: cubic interpolation ! fxl = ( - 2.*fb (ii3m1,kdim,jjp1) & - 3.*fb (ii3 ,kdim,jjp1) & + 6.*fb (ii3p1,kdim,jjp1) & - fb (ii3p2,kdim,jjp1) )*rdlam6jjp1 fxr = ( fb (ii3m1,kdim,jjp1) & - 6.*fb (ii3 ,kdim,jjp1) & + 3.*fb (ii3p1,kdim,jjp1) & + 2.*fb (ii3p2,kdim,jjp1) )*rdlam6jjp1 ! deli = ( fb (ii3p1,kdim,jjp1) - & fb (ii3 ,kdim,jjp1) )*rdlamjjp1 tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fxl <= 0.0 ) fxl = 0. if( deli*fxr <= 0.0 ) fxr = 0. if( abs( fxl ) > tmp2 ) fxl = tmp1 if( abs( fxr ) > tmp2 ) fxr = tmp1 ! fintx(i,k,3,3) = fb (ii3 ,kdim,jjp1)*hl (i,k,3) & + fb (ii3p1,kdim,jjp1)*hr (i,k,3) & + fxl*dhl(i,k,3) + fxr*dhr(i,k,3) ! ! latitude 4: linear interpolation ! fintx(i,k,4,3) = fb (ii4 ,kdim,jjp2)*xl (i,k,4) & + fb (ii4p1,kdim,jjp2)*xr (i,k,4) endif end do end do ! return end subroutine heryin_h(i_1,i_2,jdp,ys,yn,hs,hn,dhs,dhn,dphii, & fintx,finty) ! use machine , only : kind_evod use pmgrid , only : plev use slgshr , only : lbasdy implicit none ! ! input variables integer i_1,i_2 integer,dimension(i_1:i_2,plev) :: jdp ! j-index of departure point coord. real(kind=kind_evod),dimension(plev) :: dphii real(kind=kind_evod),dimension(i_1:i_2,plev) :: & ys,yn,hs,hn,dhs,dhn ! & ys,yn,hs,hn,dhs,dhn,rdphi real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: finty real(kind=kind_evod),dimension(i_1:i_2,plev,4,4) :: fintx ! local variables integer i,k,kk,jj real(kind=kind_evod) :: fac,deli,tmp1, & tmp2 real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: ftop,fbot ! fac = 3.*(1. - 10.*epsilon(fac)) ! ! y derivatives at the inner height levels (kk = 2,3) needed for ! z-interpolation ! do k=1,plev do kk = 2,3 do i=i_1,i_2 jj = jdp(i,k) fbot(i,k,kk) = lbasdy(1,1,jj) * fintx(i,k,1,kk) & + lbasdy(2,1,jj) * fintx(i,k,2,kk) & + lbasdy(3,1,jj) * fintx(i,k,3,kk) & + lbasdy(4,1,jj) * fintx(i,k,4,kk) ftop(i,k,kk) = lbasdy(1,2,jj) * fintx(i,k,1,kk) & + lbasdy(2,2,jj) * fintx(i,k,2,kk) & + lbasdy(3,2,jj) * fintx(i,k,3,kk) & + lbasdy(4,2,jj) * fintx(i,k,4,kk) enddo enddo enddo ! ! apply scm0 limiter to derivative estimates. ! do kk = 2,3 do k=1,plev do i=i_1,i_2 jj = jdp(i,k) deli = ( fintx(i,k,3,kk) - fintx(i,k,2,kk) )*dphii(jj) tmp1 = fac*deli tmp2 = abs( tmp1 ) if( deli*fbot(i,k,kk) <= 0.0 ) fbot(i,k,kk) = 0. if( deli*ftop(i,k,kk) <= 0.0 ) ftop(i,k,kk) = 0. if( abs( fbot(i,k,kk) ) > tmp2 ) fbot(i,k,kk) = tmp1 if( abs( ftop(i,k,kk) ) > tmp2 ) ftop(i,k,kk) = tmp1 enddo enddo enddo ! ! part 3: y-interpolants ! do k=1,plev do i=i_1,i_2 finty(i,k,1) = fintx(i,k,2,1) * ys (i,k) & + fintx(i,k,3,1) * yn (i,k) finty(i,k,2) = fintx(i,k,2,2) * hs (i,k) & + fbot (i,k ,2) * dhs(i,k) & + fintx(i,k,3,2) * hn (i,k) & + ftop (i,k ,2) * dhn(i,k) finty(i,k,3) = fintx(i,k,2,3) * hs (i,k) & + fbot (i,k ,3) * dhs(i,k) & + fintx(i,k,3,3) * hn (i,k) & + ftop (i,k ,3) * dhn(i,k) finty(i,k,4) = fintx(i,k,2,4) * ys (i,k) & + fintx(i,k,3,4) * yn (i,k) enddo enddo return end subroutine herzin_h(i_1,i_2, & kdim,finty,lbasdz,kdp,hb,ht,dhb,dht,detam, & term1,term2,term3,term4,fdp) ! use machine , only : kind_evod use pmgrid , only : plev,plevp,plon implicit none ! ! input variables integer i_1,i_2,kdim integer,dimension(i_1:i_2,plev) :: kdp real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: finty real(kind=kind_evod),dimension(4,2,kdim) :: lbasdz real(kind=kind_evod),dimension(plon,plev) :: fdp real(kind=kind_evod),dimension(i_1:i_2,plev) :: & hb,ht,dhb,dht,term1,term2,term3,term4 real(kind=kind_evod),dimension(plev) :: detam ! delta eta at levels ! local variables integer i,k,m,kdimm1,kdimm2,kk real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: ftop,fbot real(kind=kind_evod) deli,tmp1,tmp2,fac ! kdimm1 = kdim - 1 kdimm2 = kdim - 2 ! do k = 1,plev do i = i_1,i_2 kk = kdp (i,k) if(kk == 1) then ftop(i,k,1) = (finty(i,k,3) - finty(i,k,2)) / detam(kk) fbot(i,k,1) = lbasdz(1,1,2) * finty(i,k,2) & + lbasdz(2,1,2) * finty(i,k,3) & + lbasdz(3,1,2) * finty(i,k,4) & + lbasdz(4,1,2) * finty(i,k,1) elseif(kk == kdimm1) then ftop(i,k,1) = lbasdz(1,2,kdimm2) * finty(i,k,4) & + lbasdz(2,2,kdimm2) * finty(i,k,1) & + lbasdz(3,2,kdimm2) * finty(i,k,2) & + lbasdz(4,2,kdimm2) * finty(i,k,3) fbot(i,k,1) = 0.0 else ftop(i,k,1) = lbasdz(1,1,kk)*finty(i,k,1) & + lbasdz(2,1,kk)*finty(i,k,2) & + lbasdz(3,1,kk)*finty(i,k,3) & + lbasdz(4,1,kk)*finty(i,k,4) fbot(i,k,1) = lbasdz(1,2,kk)*finty(i,k,1) & + lbasdz(2,2,kk)*finty(i,k,2) & + lbasdz(3,2,kk)*finty(i,k,3) & + lbasdz(4,2,kk)*finty(i,k,4) endif enddo enddo fac = 3.*(1. - 10.*epsilon(fac)) ! print*,' herzin_h fac = ',fac do k=1,plev do i = i_1,i_2 deli = (finty(i,k,3) - finty(i,k,2)) / detam(kdp(i,k)) tmp1 = fac*deli tmp2 = abs(tmp1) if( deli*fbot(i,k,1) <= 0.0 ) fbot(i,k,1) = 0. if( deli*ftop(i,k,1) <= 0.0 ) ftop(i,k,1) = 0. if( abs( fbot(i,k,1) ) > tmp2 ) fbot(i,k,1) = tmp1 if( abs( ftop(i,k,1) ) > tmp2 ) ftop(i,k,1) = tmp1 fdp(i,plevp-k) = finty(i,k,2)*ht(i,k) + ftop(i,k,1)*dht(i,k) & + finty(i,k,3)*hb(i,k) + fbot(i,k,1)*dhb(i,k) end do enddo return end subroutine linxyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & fb1,idp,jdp,kdp,xl,xr,ys,yn,zb,zt, & fdp1) !reduced from subroutine lin_xyz_in_h use machine , only : kind_evod use pmgrid , only : plev,plevp,plon,plond implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,zb,zt real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb1 real(kind=kind_evod),dimension(plon,plev) :: fdp1 ! local variables integer i,k,ii2,ii3,jj,kk,kr,jjp1,kkp1 ! do k=1,plev kr = plevp - k do i=i_1,i_2 ii2 = idp(i,k,2) ii3 = idp(i,k,3) kk = kdp(i,k) kkp1 = kk + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjp1 = min(jj+1,n_lat_in_pe) fdp1(i,kr) = (( fb1 (ii2 ,kk ,jj ) * xl (i,k,2) & + fb1 (ii2+1,kk ,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb1 (ii3 ,kk ,jjp1) * xl (i,k,3) & + fb1 (ii3+1,kk ,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zt(i,k) & + (( fb1 (ii2 ,kkp1,jj ) * xl (i,k,2) & + fb1 (ii2+1,kkp1,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb1 (ii3 ,kkp1,jjp1) * xl (i,k,3) & + fb1 (ii3+1,kkp1,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zb(i,k) enddo enddo return end subroutine lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & fb1,fb2,fb3,idp,jdp,kdp,xl,xr,ys,yn,zb,zt, & fdp1,fdp2,fdp3) !my use machine , only : kind_evod use pmgrid , only : plev,plevp,plon,plond implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb1,fb2,fb3 real(kind=kind_evod),dimension(plon,plev) :: fdp1,fdp2,fdp3 real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,zb,zt real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr ! local variables integer i,k,ii2,ii3,jj,kk,kr,ii2p1,ii3p1,jjp1,kkp1 ! !my assumes lagrange or hermite interpolation performed on ug,vg,tg and !my now add in the nonliner terms contribution using trilinear interpolation do k=1,plev kr = plevp - k do i=i_1,i_2 ii2 = idp(i,k,2) ii2p1 = ii2 + 1 ii3 = idp(i,k,3) ii3p1 = ii3 + 1 kk = kdp(i,k) kkp1 = kk + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjp1 = min(jj+1,n_lat_in_pe) fdp1(i,kr) = fdp1(i,kr) & + (( fb1 (ii2 ,kk ,jj ) * xl (i,k,2) & + fb1 (ii2p1,kk ,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb1 (ii3 ,kk ,jjp1) * xl (i,k,3) & + fb1 (ii3p1,kk ,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zt(i,k) & + (( fb1 (ii2 ,kkp1,jj ) * xl (i,k,2) & + fb1 (ii2p1,kkp1,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb1 (ii3 ,kkp1,jjp1) * xl (i,k,3) & + fb1 (ii3p1,kkp1,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zb(i,k) !$$$ print*, !$$$ . ' in lin_xyz_in_h i,k,i2,i3,kdp,jdp,xl2,xl3,xr,ys,yn,zt,zb = ', !$$$ . i,k,idp(i,k,2),idp(i,k,3),kdp(i,k),jdp(i,k),xl(i,k,2),xl(i,k,3), !$$$ . ys(i,k),yn(i,k),zt(i,k),zb(i,k) fdp2(i,kr) = fdp2(i,kr) & + (( fb2 (ii2 ,kk ,jj )*xl (i,k,2) & + fb2 (ii2p1,kk ,jj )*xr (i,k,2) )*ys(i,k) & + ( fb2 (ii3 ,kk ,jjp1)*xl (i,k,3) & + fb2 (ii3p1,kk ,jjp1)*xr (i,k,3) )*yn(i,k) ) & *zt(i,k) & + (( fb2 (ii2 ,kkp1,jj ) * xl (i,k,2) & + fb2 (ii2p1,kkp1,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb2 (ii3 ,kkp1,jjp1) * xl (i,k,3) & + fb2 (ii3p1,kkp1,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zb(i,k) fdp3(i,kr) = fdp3(i,kr) & + (( fb3 (ii2 ,kk ,jj ) * xl (i,k,2) & + fb3 (ii2p1,kk ,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb3 (ii3 ,kk ,jjp1) * xl (i,k,3) & + fb3 (ii3p1,kk ,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zt(i,k) & + (( fb3 (ii2 ,kkp1,jj ) * xl (i,k,2) & + fb3 (ii2p1,kkp1,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb3 (ii3 ,kkp1,jjp1) * xl (i,k,3) & + fb3 (ii3p1,kkp1,jjp1) * xr (i,k,3) )*yn(i,k) ) & *zb(i,k) enddo enddo return end subroutine lin_xy_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & kdim,fb1,idp,jdp,x2,x3,yb,yt,fdp1) !sk a 2d analog of subroutine lin_xyz_in_h, created from int2d_h_lev use machine , only : kind_evod use pmgrid , only : plev,plon,plond implicit none ! ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe,kdim integer,dimension(i_1:i_2,plev) :: jdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb1 real(kind=kind_evod),dimension(plon,plev) :: fdp1 real(kind=kind_evod),dimension(i_1:i_2,plev) :: yb,yt real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: x2,x3 ! local variables integer i,k, kk,ii2,ii3,jj,jjp1 real (kind=kind_evod) f2,f3 ! do k=1,plev kk = plev+1-k do i=i_1,i_2 ii2 = idp(i,k,2) ii3 = idp(i,k,3) jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjp1 = min(jj+1,n_lat_in_pe) f2 = - fb1 (ii2 ,k,jj ) * x3(i,k,2) & + fb1 (ii2+1,k,jj ) * x2(i,k,2) f3 = - fb1 (ii3 ,k,jjp1) * x3(i,k,3) & + fb1 (ii3+1,k,jjp1) * x2(i,k,3) ! fdp1(i,kk) = fdp1(i,kk) + f2*yb(i,k)+ f3*yt(i,k) end do end do return end subroutine quasim(f1,f2,fint) !sk quasi-monotone correction of fint use machine , only : kind_evod implicit none ! input variables real(kind=kind_evod) :: f1,f2,fint ! local variables real(kind=kind_evod) :: fmin,fmax ! real(kind=kind_evod),dimension(2) :: f ! f(1) = f1 ! f(2) = f2 ! fmax = maxval(f) ! fmin = minval(f) ! if (fint < fmin) fint = fmin ! if (fint > fmax) fint = fmax fmax = max(f1,f2) fmin = min(f1,f2) fint = max(fmin,min(fint,fmax)) return end subroutine wgt_cub_lin_xyz_in_h(i_1,i_2,s_lat_in_pe,n_lat_in_pe, & fb1,idp,jdp,kdp,xl,xr,ys,yn,zb,zt, & fdp1) use machine , only : kind_evod use pmgrid , only : plev,plevp,plon,plond,wgt implicit none ! input variables integer i_1,i_2,s_lat_in_pe,n_lat_in_pe integer,dimension(i_1:i_2,plev) :: jdp,kdp integer,dimension(i_1:i_2,plev,4) :: idp real(kind=kind_evod),dimension(plond,plev,s_lat_in_pe:n_lat_in_pe) & :: fb1 real(kind=kind_evod),dimension(plon,plev) :: fdp1 real(kind=kind_evod),dimension(i_1:i_2,plev) :: ys,yn,zt,zb real(kind=kind_evod),dimension(i_1:i_2,plev,4) :: xl,xr ! local variables integer i,k,ii2,ii3,jj,kk,kr,ii2p1,ii3p1,jjp1,kkp1 ! real wgt(plev) ! real alphau,alphav,alphat ! parameter (alphau=0.3,alphav=0.3,alphat=0.3) ! !my copy of lin_xyz_in_h for one variable with weights added !my ! do k = 1,34 ! wgt(k) = 0.1 ! enddo ! do k = 35,43 ! wgt(k) = 0.5 ! enddo ! do k = 44,plev ! wgt(k) = 1.0 ! enddo do k=1,plev kr = plevp - k do i=i_1,i_2 ii2 = idp(i,k,2) ii2p1 = ii2 + 1 ii3 = idp(i,k,3) ii3p1 = ii3 + 1 kk = kdp(i,k) kkp1 = kk + 1 jj = max(s_lat_in_pe, min(jdp(i,k),n_lat_in_pe)) jjp1 = min(jj+1,n_lat_in_pe) fdp1(i,kr) = wgt(k) * fdp1(i,kr) & + (1.0-wgt(k)) * ( & (( fb1 (ii2 ,kk ,jj ) * xl (i,k,2) & + fb1 (ii2p1,kk ,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb1 (ii3 ,kk ,jjp1) * xl (i,k,3) & + fb1 (ii3p1,kk ,jjp1) * xr (i,k,3) )*yn(i,k) ) & * zt(i,k) & + (( fb1 (ii2 ,kkp1,jj ) * xl (i,k,2) & + fb1 (ii2p1,kkp1,jj ) * xr (i,k,2) )*ys(i,k) & + ( fb1 (ii3 ,kkp1,jjp1) * xl (i,k,3) & + fb1 (ii3p1,kkp1,jjp1) * xr (i,k,3) )*yn(i,k) ) & * zb(i,k) & ) enddo enddo return end subroutine lagzin_h_m(i_1,i_2,kdim,finty,lbasdz,kdp,hb,ht, & dhb,dht,detam,term1,term2,term3,term4,fdp, & quamon) !cmy renamed with _m !sk linear interpolation at the top and bottom !sk 2/25/2012 !sk modified original subroutine lagzin_h for quasi-monotone !sk quasi-cubic lagrange interpolation !sk 10/08/2012 !sk added quamon to argument list use machine , only : kind_evod use pmgrid , only : plev,plevp,plon implicit none ! input variables integer i_1,i_2,kdim integer,dimension(i_1:i_2,plev) :: kdp real(kind=kind_evod),dimension(i_1:i_2,plev,4) ::finty real(kind=kind_evod),dimension(4,2,kdim) ::lbasdz real(kind=kind_evod),dimension(plon,plev) ::fdp real(kind=kind_evod),dimension(plev) :: detam ! delta eta at levels real(kind=kind_evod),dimension(i_1:i_2,plev) :: ht,hb,dht,dhb, & term1,term2, & term3,term4 logical quamon ! local variables integer i,k,m,kdimm1,kk real(kind=kind_evod) tem1, tem2 ! kdimm1 = kdim - 1 do k = 1,plev kk = plevp - k do i = i_1,i_2 if(kdp (i,k) == 1) then fdp(i,kk) = finty(i,k,2)*ht(i,k) + finty(i,k,3)*hb(i,k) elseif(kdp (i,k) == kdimm1) then fdp(i,kk) = finty(i,k,2)*ht(i,k) + finty(i,k,3)*hb(i,k) else fdp(i,kk) = finty(i,k,1)*term1(i,k) & + finty(i,k,2)*term2(i,k) & + finty(i,k,3)*term3(i,k) & + finty(i,k,4)*term4(i,k) if (quamon) then ! call quasim(finty(i,k,2),finty(i,k,3),fdp(i,plev-k)) tem1 = min(finty(i,k,2),finty(i,k,3)) tem2 = max(finty(i,k,2),finty(i,k,3)) fdp(i,kk) = max(tem1,min(tem2,fdp(i,kk))) endif endif end do end do return end subroutine lagzinit_h_n(i_1,i_2,kdim,lbasiz, & etamid,detam,sigdp,kdp,kkdp, & hb,ht,dhb,dht,zb,zt, & term1z,term2z,term3z,term4z) !sk linear-interpolation weights if dp falls between layers 1 and 2 !sk or layers k-1 and k. !sk 10/08/2012 !sk renamed lagzinit_h_m as lagzinit_h_n to avoid confusion with _m !sk that means quasi-monotone version. use machine , only : kind_evod use pmgrid , only : plev implicit none ! input variables integer i_1,i_2,kdim integer,dimension(i_1:i_2,plev) :: kdp,kkdp real(kind=kind_evod),dimension(4,2,kdim) :: lbasiz real(kind=kind_evod),dimension(kdim) :: etamid,detam real(kind=kind_evod),dimension(i_1:i_2,plev) :: sigdp, & hb,ht,dhb,dht,zb,zt,term1z,term2z,term3z,term4z ! local variables integer i,k,m,ktem real(kind=kind_evod) :: dzk, & zmz1, ! | & zmz2, ! | & zmz3, ! | & zmz4, ! | & coef12, ! | & coef34, ! | -- interpolation weights/coeffs. & zt1, zb1, zt2, zb2, stem do k=1,plev do i=i_1,i_2 ktem = kdp(i,k) dzk = detam(ktem) stem = sigdp(i,k) zt1 = ( etamid(ktem+1) - stem ) / dzk zb1 = 1.0 - zt1 zt(i,k) = zt1 zb(i,k) = zb1 zt2 = zt1 * zt1 zb2 = zb1 * zb1 ht(i,k) = ( 3.0 - 2.0*zt1 ) * zt2 ! ??????????????? hb(i,k) = ( 3.0 - 2.0*zb1 ) * zb2 ! ??????????????? dht(i,k) = -dzk * (zt1 - 1.) * zt2 dhb(i,k) = dzk * (zb1 - 1.) * zb2 !skar 12/23/2011 ht(i,k) = zt1 hb(i,k) = zb1 !skar ktem = kkdp(i,k) zmz1 = stem - lbasiz(1,1,ktem) zmz2 = stem - lbasiz(2,1,ktem) zmz3 = stem - lbasiz(3,1,ktem) zmz4 = stem - lbasiz(4,1,ktem) coef12 = zmz3 * zmz4 coef34 = zmz1 * zmz2 term1z(i,k) = coef12 * zmz2 * lbasiz(1,2,ktem) term2z(i,k) = coef12 * zmz1 * lbasiz(2,2,ktem) term3z(i,k) = coef34 * zmz4 * lbasiz(3,2,ktem) term4z(i,k) = coef34 * zmz3 * lbasiz(4,2,ktem) end do end do return end