subroutine s2g(ts,t,nc,nc1,nlon,nlath,pln,trigs,& 7,3
  factor,ns2,ns3,ncd2)
!$$$  subprogram documentation block
!                .      .    .                                       .
! subprogram:    s2g   universal routine for spectr. transfer to grid.
!   prgmmr: weiyu yang     date: 97-11-06
!
! abstract: summation of scalar spherical harmonic series for the 
!           spectral coefs matrices with vertical distribution format.
!
! program history log:
!   02-02-22  weiyu yang
!
!   input argument list on all pes:
!     tsx      - spectral coefs
!     jcap     - triangular truncation
!     nlon     - number of longitudes
!     nlath    - number of gaussian lats in one hemisphere
!     pln      - spherical harmonics
!     trigs    - used by fft
!
!   output argument list:
!     t        - values of desired field on gaussian grid
!
! attributes:
!   language: f90
!   machine:  ibm RS/6000 SP
!
!$$$
 use type_kinds, only: fp_kind
 implicit none

#include <machine.h>

 integer izero,nlath,nc,nlon,nc1,ncd2,nlla,jj1a,nc11,modn,i2,i3
 integer nlath1,i1,i,j,ii,jj,jj1,jj2,jj3,ll,in2,in3,iil,in1,in4
 integer iil1,iin1,ii1,ip1,nl1,ns2,ns3,ip5,ip6,ip4,ip2,ip3

 real(fp_kind) zero
 real(fp_kind),dimension(nc):: ts
 real(fp_kind),dimension(2*nlath,nlon+2):: t
#ifdef ibm_sp
 real(fp_kind),dimension(nlon,2*nlath)::ttemp
 real(fp_kind),dimension(50000+nlon*4):: trigs
#else
 real(fp_kind),dimension(nlon+15):: trigs
#endif
 real(fp_kind),dimension(ncd2,nlath):: pln
 real(fp_kind),dimension(nc1,nlath):: te,to
 real(fp_kind),dimension(nc1,nlath):: factor
 real(fp_kind),dimension(nlon+2,2*nlath)::tw

!ibm* prefetch_for_store(zero,izero,nlla)
 zero=0.0; izero=0
 nlla=2*nlath
!ibm* prefetch_for_store(jj1a,nc11,modn,nl1,nlath1)
 jj1a=nc1-1; nc11=nc-1
 modn=mod(nlath,2); nl1=nlath-modn
 nlath1=nlath+1
!ibm* prefetch_for_store(i1)
 i1=izero
 do i=1,nl1,2
  i1=i1+2
  do j=1,nc1
!ibm* prefetch_for_store(te(j,i),to(j,i))
   te(j,i)=zero
   to(j,i)=zero
!ibm* prefetch_for_store(te(j,i1),to(j,i1))
   te(j,i1)=zero
   to(j,i1)=zero
  end do
 end do
 if(modn==1) then
  do j=1,nc1
!ibm* prefetch_for_store(te(j,nlath),to(j,nlath))
   te(j,nlath)=zero
   to(j,nlath)=zero
  end do
 end if
if(ns2==1.or.ns2==3.and.ns3==3) then
 do j=1,nlath
!ibm* prefetch_for_store(ii,jj,jj1,jj2,jj3)
  ii=1; jj=1; jj1=2; jj2=3; jj3=4
  do ll=nc1, 4, -4
!ibm* prefetch_for_store(ii1,ip1,ip2,ip3,ip4,ip5,ip6,iil)
   ii1=ii+ll-4
   ip1=ii-3
   ip2=ii-2
   ip3=ii-1
   ip4=ii1+1
   ip5=ii1+2
   ip6=ii1+3
   iil=ip6
!ibm* prefetch_for_store(in1,in2)
   in1=ii/2-1
   in2=in1+1
!ibm* prefetch_for_store(in3,in4)
   in3=ii1/2+1
   in4=in3+1
   do i=ii,iil-2,4
    ii1=ii1+4
    ip1=ip1+4; ip2=ip2+4; ip3=ip3+4
    ip4=ip4+4; ip5=ip5+4; ip6=ip6+4
    in1=in1+2; in2=in2+2
    in3=in3+2; in4=in4+2
    te(jj,j)=te(jj,j)+pln(in1,j)*ts(ip1)
    te(jj1,j)=te(jj1,j)-pln(in1,j)*ts(i)
    to(jj,j)=to(jj,j)+pln(in2,j)*ts(ip3)
    to(jj1,j)=to(jj1,j)-pln(in2,j)*ts(ip2)
    te(jj2,j)=te(jj2,j)+pln(in3,j)*ts(ip4)
    te(jj3,j)=te(jj3,j)-pln(in3,j)*ts(ii1)
    to(jj2,j)=to(jj2,j)+pln(in4,j)*ts(ip6)
    to(jj3,j)=to(jj3,j)-pln(in4,j)*ts(ip5)
   end do
!ibm* prefetch_for_store(iil1,iin1)
   iil1=iil-1
   iin1=iil/2
   te(jj,j)=te(jj,j)+pln(iin1,j)*ts(iil)
   te(jj1,j)=te(jj1,j)-pln(iin1,j)*ts(iil1)
   ii=ii+ll*2-2; jj=jj+4; jj1=jj1+4; jj2=jj2+4; jj3=jj3+4
  end do
  te(jj1a,j)=te(jj1a,j)+pln(ncd2,j)*ts(nc)
  te(nc1,j)=te(nc1,j)-pln(ncd2,j)*ts(nc11)
 end do
else
 do j=1,nlath
!ibm* prefetch_for_store(ii,jj,jj1,jj2,jj3)
  ii=1; jj=1; jj1=2; jj2=3; jj3=4
  do ll=nc1, 4, -4
!ibm* prefetch_for_store(ii1,ip1,ip2,ip3,ip4,ip5,ip6,iil)
   ii1=ii+ll-4
   ip1=ii-3
   ip2=ii-2
   ip3=ii-1
   ip4=ii1+1
   ip5=ii1+2
   ip6=ii1+3
   iil=ip6
!ibm* prefetch_for_store(in1,in2)
   in1=ii/2-1
   in2=in1+1
!ibm* prefetch_for_store(in3,in4)
   in3=ii1/2+1
   in4=in3+1
   do i=ii,iil-2,4
    ii1=ii1+4
    ip1=ip1+4; ip2=ip2+4; ip3=ip3+4
    ip4=ip4+4; ip5=ip5+4; ip6=ip6+4
    in1=in1+2; in2=in2+2
    in3=in3+2; in4=in4+2
    te(jj,j)=te(jj,j)+pln(in1,j)*ts(i)
    te(jj1,j)=te(jj1,j)+pln(in1,j)*ts(ip1)
    to(jj,j)=to(jj,j)+pln(in2,j)*ts(ip2)
    to(jj1,j)=to(jj1,j)+pln(in2,j)*ts(ip3)
    te(jj2,j)=te(jj2,j)+pln(in3,j)*ts(ii1)
    te(jj3,j)=te(jj3,j)+pln(in3,j)*ts(ip4)
    to(jj2,j)=to(jj2,j)+pln(in4,j)*ts(ip5)
    to(jj3,j)=to(jj3,j)+pln(in4,j)*ts(ip6)
   end do
!ibm* prefetch_for_store(iil1,iin1)
   iil1=iil-1
   iin1=iil/2
   te(jj,j)=te(jj,j)+pln(iin1,j)*ts(iil1)
   te(jj1,j)=te(jj1,j)+pln(iin1,j)*ts(iil)
   ii=ii+ll*2-2; jj=jj+4; jj1=jj1+4; jj2=jj2+4; jj3=jj3+4
  end do
  te(jj1a,j)=te(jj1a,j)+pln(ncd2,j)*ts(nc11)
  te(nc1,j)=te(nc1,j)+pln(ncd2,j)*ts(nc)
 end do
end if

!----------
!---------- now combine even and odd parts
!----------
 selectcase(ns2)
  case(1)
!ibm* prefetch_for_store(i1,i2,i3)
   i1=0; i2=nlla+1; i3=i2+1
   do i=1,nl1,2
    i1=i1+2; i2=i2-2; i3=i3-2
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=te(j,i)+to(j,i)
     tw(j,i1)=te(j,i1)+to(j,i1)
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=te(j,i1)-to(j,i1)
     tw(j,i3)=te(j,i)-to(j,i)
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=zero
     tw(j,i1)=zero
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=zero
     tw(j,i3)=zero
    end do
   end do
   if(modn==1) then
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=te(j,nlath)+to(j,nlath)
     tw(j,nlath1)=te(j,nlath)-to(j,nlath)
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=zero
     tw(j,nlath1)=zero
    end do
   end if
  case(2)
!ibm* prefetch_for_store(i1,i2,i3)
   i1=0; i2=nlla+1; i3=i2+1
   do i=1,nl1,2
    i1=i1+2; i2=i2-2; i3=i3-2
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=-te(j,i)-to(j,i)
     tw(j,i1)=-te(j,i1)-to(j,i1)
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=te(j,i1)-to(j,i1)
     tw(j,i3)=te(j,i)-to(j,i)
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=zero
     tw(j,i1)=zero
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=zero
     tw(j,i3)=zero
    end do
   end do
   if(modn==1) then
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=-te(j,nlath)-to(j,nlath)
     tw(j,nlath1)=te(j,nlath)-to(j,nlath)
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=zero
     tw(j,nlath1)=zero
    end do
   end if
  case(3)
!ibm* prefetch_for_store(i1,i2,i3)
   i1=0; i2=nlla+1; i3=i2+1
   do i=1,nl1,2
    i1=i1+2; i2=i2-2; i3=i3-2
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=factor(j,i)*(te(j,i)+to(j,i))
     tw(j,i1)=factor(j,i1)*(te(j,i1)+to(j,i1))
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=factor(j,i1)*(te(j,i1)-to(j,i1))
     tw(j,i3)=factor(j,i)*(te(j,i)-to(j,i))
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=zero
     tw(j,i1)=zero
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=zero
     tw(j,i3)=zero
    end do
   end do
   if(modn==1) then
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=factor(j,nlath)*(te(j,nlath)+to(j,nlath))
     tw(j,nlath1)=factor(j,nlath)*(te(j,nlath)-to(j,nlath))
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=zero
     tw(j,nlath1)=zero
    end do
   end if
  case(4)
!ibm* prefetch_for_store(i1,i2,i3)
   i1=0; i2=nlla+1; i3=i2+1
   do i=1,nl1,2
    i1=i1+2; i2=i2-2; i3=i3-2
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=-factor(j,i)*(te(j,i)+to(j,i))
     tw(j,i1)=-factor(j,i1)*(te(j,i1)+to(j,i1))
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=factor(j,i1)*(te(j,i1)-to(j,i1))
     tw(j,i3)=factor(j,i)*(te(j,i)-to(j,i))
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,i),tw(j,i1))
     tw(j,i)=zero
     tw(j,i1)=zero
!ibm* prefetch_for_store(tw(j,i2),tw(j,i3))
     tw(j,i2)=zero
     tw(j,i3)=zero
    end do
   end do
   if(modn==1) then
    do j=1,nc1
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=-factor(j,nlath)*(te(j,nlath)+to(j,nlath))
     tw(j,nlath1)=factor(j,nlath)*(te(j,nlath)-to(j,nlath))
    end do
    do j=nc1+1,nlon+2
!ibm* prefetch_for_store(tw(j,nlath),tw(j,nlath1))
     tw(j,nlath)=zero
     tw(j,nlath1)=zero
    end do
   end if
 end select
#ifdef ibm_sp
 call spffte(nlon,nlon/2+1,nlon,nlla,tw,ttemp,1,trigs)
 call dgetmo(ttemp,nlon,nlon,nlla,t,nlla)
#else
 call zdfftm1du(1,nlon,nlla,tw,1,nlon+2,trigs)
 call dgetmo(tw,nlon+2,nlon,nlla,t,nlla)
#endif
 return
 end