#include <misc.h>
#include <params.h>
subroutine depinc(jcen ,dt ,ra ,locgeo ,lvert , & 1,3
lam ,phi ,ump ,vmp ,wmp , &
upr ,vpr ,lamdp ,phidp ,lampr , &
phipr ,sigpr ,nlon )
!
!-----------------------------------------------------------------------
!
! Purpose:
! Compute departure point increments based upon interpolated wind components.
!
! Author: J. Olson
!
!-----------------------------------------------------------------------
!
! $Id: depinc.F90,v 1.2.42.2 2002/06/15 13:48:21 erik Exp $
! $Author: erik $
!
!-----------------------------------------------------------------------
use shr_kind_mod
, only: r8 => shr_kind_r8
use pmgrid
implicit none
!------------------------------Arguments--------------------------------
!
integer , intent(in) :: jcen ! index of lat slice(extend)
real(r8), intent(in) :: dt ! time step (seconds)
real(r8), intent(in) :: ra ! 1./(radius of earth)
logical , intent(in) :: locgeo ! local geodesic flag
logical , intent(in) :: lvert ! flag to compute vertical trajectory
real(r8), intent(in) :: lam (plond) ! long. coord of model grid
real(r8), intent(in) :: phi (platd) ! lat. coord of model grid
real(r8), intent(inout):: ump (plon,plev) ! interpolated u field
real(r8), intent(inout):: vmp (plon,plev) ! interpolated v field
real(r8), intent(in) :: wmp (plon,plev) ! interpolated w field
real(r8), intent(out) :: upr (plon,plev) ! interpolated u field (local geodesic)
real(r8), intent(out) :: vpr (plon,plev) ! interpolated v field (local geodesic)
real(r8), intent(in) :: lamdp(plon,plev) ! zonal dep pt. coord.
real(r8), intent(in) :: phidp(plon,plev) ! meridional dep pt. coord.
real(r8), intent(out) :: lampr(plon,plev) ! trajectory increment (x-direction)
real(r8), intent(inout):: phipr(plon,plev) ! trajectory increment (y-direction)
real(r8), intent(out) :: sigpr(plon,plev) ! trajectory increment (vertical)
integer , intent(in) :: nlon ! number of longitudes for this lat
!
!---------------------------Local workspace-----------------------------
!
real(r8) phi0 ! Current latitude (radians)
real(r8) cphi0 ! cosine of latitude
real(r8) sphi0 ! sine of latitude
real(r8) cdlam ! |
real(r8) clamgc ! |
real(r8) cphid ! |
real(r8) cphigc ! |
real(r8) dlamgc ! | -- temporary variables
real(r8) sdlam ! |
real(r8) slamgc ! |
real(r8) sphid ! |
real(r8) sphigc ! |
integer i ! |
integer ii ! | -- indices
integer k ! |
!
!-----------------------------------------------------------------------
!
phi0 = phi
(jcen)
cphi0 = cos(phi0)
sphi0 = sin(phi0)
!
! Compute trajectory increment
!
do k = 1,plev
!
! Place u/v on unit sphere
!
do i = 1,nlon
ump(i,k) = ump(i,k)*ra
vmp(i,k) = vmp(i,k)*ra
if (lvert) sigpr(i,k) = -dt*wmp(i,k)
end do
!
! If near the pole, convert to g.c.
!
if (locgeo) then
!
! Compute winds at departure points in g.c.
!
do i = 1,nlon
ii = i + i1 - 1
dlamgc = lam(ii) - lamdp(i,k)
sdlam = sin( dlamgc )
cdlam = cos( dlamgc )
sphid = sin( phidp(i,k) )
cphid = cos( phidp(i,k) )
sphigc = sphid*cphi0 - cphid*sphi0*cdlam
cphigc = cos( asin( sphigc ) )
slamgc = -sdlam*cphid/cphigc
clamgc = cos( asin( slamgc ) )
vpr(i,k) = (vmp(i,k)*(cphid*cphi0 + sphid*sphi0*cdlam) &
- ump(i,k)*sphi0*sdlam)/cphigc
upr(i,k) = (ump(i,k)*cdlam + vmp(i,k)*sphid*sdlam + &
vpr(i,k)*slamgc*sphigc)/clamgc
!
! Compute trajectory increment between arrival and departure points.
!
lampr(i,k) = -dt*upr(i,k)/cos(phipr(i,k))
phipr(i,k) = -dt*vpr(i,k)
end do
else
do i = 1,nlon
lampr(i,k) = -dt*ump(i,k)/cos(phidp(i,k))
phipr(i,k) = -dt*vmp(i,k)
end do
end if
end do
!
return
end subroutine depinc