#include <misc.h>
#include <params.h>

subroutine dyn(irow    ,grlps1  ,grt1    ,grq1    ,grz1    , & 1,7
               grd1    ,grfu1   ,grfv1   ,grlps2  ,grt2    , &
               grq2    ,grz2    ,grd2    ,grfu2   ,grfv2   )
!-----------------------------------------------------------------------
!
! Purpose:
! Combine undifferentiated and longitudinally differentiated Fourier
! coefficient terms for later use in the Gaussian quadrature
!
! Computational note: Index "2*m-1" refers to the real part of the
! complex coefficient, and "2*m" to the imaginary.
!
! The naming convention is as follows:
!  - t, q, d, z refer to temperature, specific humidity, divergence
!     and vorticity
!  - "1" suffix to an array => symmetric component of current latitude
!     pair
!  - "2" suffix to an array => antisymmetric component
!
! Author:   J. Rosinski
! Modified: P. Worley, October 2002
!
!-----------------------------------------------------------------------
!
! $Id: dyn.F90,v 1.5.2.3 2004/03/03 19:54:09 pworley Exp $
! $Author: pworley $
!
!-----------------------------------------------------------------------

  use shr_kind_mod, only: r8 => shr_kind_r8
  use pmgrid
  use pspect
  use rgrid
  use comspe
  use commap
  use dynconst, only: rearth

  implicit none

!------------------------------Arguments--------------------------------
!
  integer , intent(in)   :: irow                 ! latitude pair index
  real(r8), intent(in)   :: grlps1(2*maxm)      ! sym. undifferentiated term in Ps eqn.
  real(r8), intent(in)   :: grt1  (2*maxm,plev) ! sym. undifferentiated term in t eqn.
  real(r8), intent(in)   :: grq1  (2*maxm,plev) ! sym. undifferentiated term in q
  real(r8), intent(out)  :: grz1  (2*maxm,plev) ! sym. undifferentiated term in z eqn.
  real(r8), intent(out)  :: grd1  (2*maxm,plev) ! sym. undifferentiated term in d eqn.
  real(r8), intent(in)   :: grfu1 (2*maxm,plev) ! sym. nonlinear terms in u eqn.
  real(r8), intent(in)   :: grfv1 (2*maxm,plev) ! sym. nonlinear terms in v eqn.
  real(r8), intent(in)   :: grlps2(2*maxm)      ! antisym. undifferentiated term in Ps eq
  real(r8), intent(in)   :: grt2  (2*maxm,plev) ! antisym. undifferentiated term in t eq
  real(r8), intent(in)   :: grq2  (2*maxm,plev) ! antisym. undifferentiated term in q
  real(r8), intent(out)  :: grz2  (2*maxm,plev) ! antisym. undifferentiated term in z eq
  real(r8), intent(out)  :: grd2  (2*maxm,plev) ! antisym. undifferentiated term in d eq
  real(r8), intent(in)   :: grfu2 (2*maxm,plev) ! antisym. nonlinear terms in u eqn.
  real(r8), intent(in)   :: grfv2 (2*maxm,plev) ! antisym. nonlinear terms in v eqn.
!
!---------------------------Local workspace-----------------------------
!
  real(r8) tmp1
  real(r8) tmp2
  real(r8) zxm(pmmax)         ! m*2dt/(a*cos(lat)**2)
  real(r8) zrcsj              ! 1./(a*cos(lat)**2)
  integer lm, mlength         ! local Fourier wavenumber index
                              !  and number of local indices
  integer m                   ! Fourier index
  integer k                   ! level index
!
!-----------------------------------------------------------------------
!
! Set constants
!
  mlength = numm(iam)
  zrcsj = 1./(cs(irow)*rearth)
!
! Combine constants with Fourier wavenumber m
!
  do lm=1,mlength
     zxm(lm) = zrcsj*xm(locm(lm,iam))
  end do
!
! Combine undifferentiated and longitudinal derivative terms for
! later use in Gaussian quadrature
!
  do k=1,plev
     do lm=1,mlength
        grd1(2*lm-1,k) = - zxm(lm)*grfu1(2*lm,k)
        grd1(2*lm,k)   =   zxm(lm)*grfu1(2*lm-1,k)
        grz1(2*lm-1,k) = - zxm(lm)*grfv1(2*lm,k)
        grz1(2*lm,k)   =   zxm(lm)*grfv1(2*lm-1,k)
!
        grd2(2*lm-1,k) = - zxm(lm)*grfu2(2*lm,k)
        grd2(2*lm,k)   =   zxm(lm)*grfu2(2*lm-1,k)
        grz2(2*lm-1,k) = - zxm(lm)*grfv2(2*lm,k)
        grz2(2*lm,k)   =   zxm(lm)*grfv2(2*lm-1,k)
     end do
  end do
  return
end subroutine dyn