subroutine getphi(tv,pri,zsfc,phl) use kinds, only: r_kind,i_kind use constants, only: rd,grav,half,one,zero,two,ione use gridmod, only: lat2,lon2,nsig use tendsmod, only: prdif9,r_prsum9,r_prdif9 use tends4pertmod, only: prsum9 implicit none ! Declare passed variables real(r_kind),dimension(lat2,lon2,nsig) ,intent(in ):: tv real(r_kind),dimension(lat2,lon2,nsig+ione),intent(in ):: pri real(r_kind),dimension(lat2,lon2) ,intent(in ):: zsfc real(r_kind),dimension(lat2,lon2,nsig) ,intent( out):: phl ! Declare local variables real(r_kind),dimension(lat2,lon2,nsig+ione):: phi real(r_kind) r_psum9,pdif9,tword integer(i_kind) i,j,k tword=two*rd do k=1,nsig do j=1,lon2 do i=1,lat2 prsum9(i,j,k)=pri(i,j,k)+pri(i,j,k+ione) prdif9(i,j,k)=pri(i,j,k)-pri(i,j,k+ione) r_prsum9(i,j,k)=one/prsum9(i,j,k) r_prdif9(i,j,k)=one/prdif9(i,j,k) end do end do end do phi=zero ; phl=zero do j=1,lon2 do i=1,lat2 phi(i,j,ione)=grav*zsfc(i,j) do k=2,nsig+ione pdif9=prdif9(i,j,k-ione) r_psum9=r_prsum9(i,j,k-ione) phi(i,j,k) = phi(i,j,k-ione) + tword*pdif9*r_psum9*tv(i,j,k-ione) end do end do end do do k=1,nsig do j=1,lon2 do i=1,lat2 phl(i,j,k) = half*(phi(i,j,k)+phi(i,j,k+ione)) end do end do end do return end subroutine getphi subroutine getphi_tl(tv,pri,zsfc_tl,phl) use kinds, only: r_kind,i_kind use constants, only: rd,grav,half,one,zero,two,ione use gridmod, only: lat2,lon2,nsig use nonlinmod, only: prsum_bck,prdif_bck,r_prsum_bck,r_prdif_bck,bck_tv implicit none ! Declare passed variables real(r_kind),dimension(lat2,lon2,nsig) ,intent(in ):: tv real(r_kind),dimension(lat2,lon2,nsig+ione),intent(in ):: pri real(r_kind),dimension(lat2,lon2) ,intent(in ):: zsfc_tl real(r_kind),dimension(lat2,lon2,nsig) ,intent( out):: phl ! Declare local variables real(r_kind),dimension(lat2,lon2,nsig+ione):: phi real(r_kind) pdif,psum,tword,r_psum9,aux19,aux29 integer(i_kind) i,j,k tword=two*rd phi=zero ; phl=zero do j=1,lon2 do i=1,lat2 phi(i,j,1)=zero !! ( zsfc_tl ) do k=2,nsig+ione pdif=pri(i,j,k-ione)-pri(i,j,k) psum=pri(i,j,k-ione)+pri(i,j,k) r_psum9=r_prsum_bck(i,j,k-ione) aux19=r_psum9*prdif_bck(i,j,k-ione) aux29=r_psum9*bck_tv(i,j,k-ione) phi(i,j,k)=phi(i,j,k-ione) + tword*( & aux19*tv(i,j,k-ione) & +aux29*pdif & -aux19*aux29*psum) end do end do end do do k=1,nsig do j=1,lon2 do i=1,lat2 phl(i,j,k) = half*(phi(i,j,k)+phi(i,j,k+ione)) end do end do end do return end subroutine getphi_tl subroutine getphi_ad(tv,pri,zsfc_ad,phl) use kinds, only: r_kind,i_kind use constants, only: rd,grav,half,one,zero,two,ione use gridmod, only: lat2,lon2,nsig use nonlinmod, only: prsum_bck,prdif_bck,r_prsum_bck,r_prdif_bck,bck_tv implicit none ! Declare passed variables real(r_kind),dimension(lat2,lon2,nsig) ,intent(inout):: tv real(r_kind),dimension(lat2,lon2,nsig+ione),intent(inout):: pri real(r_kind),dimension(lat2,lon2) ,intent(inout):: zsfc_ad real(r_kind),dimension(lat2,lon2,nsig) ,intent(in ):: phl ! Declare local variables real(r_kind),dimension(lat2,lon2,nsig+ione):: phi real(r_kind) r_psum,pdif,psum,tword,pdif9,r_psum9,rgrav,aux19,aux29,tword_phi integer(i_kind) i,j,k tword=two*rd rgrav=one/grav phi(:,:,nsig+ione)=zero do k=nsig,1,-ione do j=1,lon2 do i=1,lat2 phi(i,j,k )=half*phl(i,j,k) phi(i,j,k+ione)=half*phl(i,j,k)+phi(i,j,k+ione) end do end do end do do j=1,lon2 do i=1,lat2 pri(i,j,nsig+ione)=zero do k=nsig+ione,2,-ione r_psum9=r_prsum_bck(i,j,k-ione) aux19=r_psum9*prdif_bck(i,j,k-ione) aux29=r_psum9*bck_tv(i,j,k-ione) tword_phi=tword*phi(i,j,k) phi(i,j,k-ione)=phi(i,j,k)+phi(i,j,k-ione) tv(i,j,k-ione)=tword_phi*aux19+tv(i,j,k-ione) pdif = tword_phi*aux29 psum = -tword_phi*aux19*aux29 pri(i,j,k )=-pdif+psum+pri(i,j,k) pri(i,j,k-ione)= pdif+psum+pri(i,j,k-ione) end do zsfc_ad(i,j)=phi(i,j,ione)*rgrav end do end do return end subroutine getphi_ad