subroutine intrppx(nx,ggrid_g31,ggrid_g32,stfact,& 1,1
  sfct,wind10,vtype,vfrac,stype,stemp,smoi,snow,trop, &
  h,q,po,poz,zz,ts,wsp10,vty,vfr,sty,stp,sm,sn,trop5,&
  dx,dy,nlon,lat1,lon1,nsig,n,delt,mype,npes)
!$$$  subprogram documentation block
!                .      .    .                                       .
! subprogram:    intrppx     creates vertical profile of t,q,p,zs    
!   prgmmr: parrish          org: w/nmc22    date: 90-10-11
!
! abstract: creates vertical profile of t,q,p,zs includes time interp.
!
! program history log:
!   90-10-11  parrish
!   95-07-17  derber
!   97-08-15  matsumura
!   98-05-08  weiyu yang mpp version
!   99-08-24  derber, j., treadon, r., yang, w., first frozen mpp version
!
!   input argument list:
!     nx       - 2*nlath
!     t1       - input temperature at time 1
!     q1       - input q at time 1
!     p1       - input surface pressure at time 1
!     oz1      - input ozone at time 1
!     t2       - input temperature at time 2
!     q2       - input q at time 2
!     p2       - input surface pressure at time 2
!     oz2      - input ozone at time 2
!     t3       - input temperature at time 3
!     q3       - input q at time 3
!     p3       - input surface pressure at time 3
!     oz3      - input ozone at time 3
!     stfact   - time factor
!     dx       - input x-coords of interpolation points (grid units)
!     dy       - input y-coords of interpolation points (grid units)
!     nlon     - number of longitudes
!     lat1     - number of latitudes on gaussian grid in each sub-domain
!     lon1     - number of longitudes on gaussian grid in each sub-domain
!     nsig     - number of sigma levels
!     n        - number of interpolatees for each pe sub-domain
!     delt     - time factor logical  : true = time interpolate
!     mype     - pe number
!
!   output argument list:
!     h        - output temperatures
!     q        - output q
!     po       - output surface pressure
!     zz       - output surface elevation
!     poz      - output ozone
!
! attributes:
!   language: f90
!   machine:  ibm RS/6000 SP
!
!$$$
!--------
 use type_kinds, only: fp_kind
 implicit none
 include 'ijstart.h'

 logical delt
 integer mype,m1,ix1,nix1,k,k1,npes,n,n1,iy1,i,nlon,nx,lat1,nsig,lon1
 integer niy1,ixp,niy,iyp,ix,nix,iy
 real(fp_kind) zero,w00b,w10a,w10,w00,w01,tf1,w11,w10b,w01c,w11b,w11c,one
 real(fp_kind) w10c,w00c,w01a,w01b,w11a,dely1,delx1,delx,dely,w00a,tf2,tf3
 real(fp_kind) oneneg
 real(fp_kind),dimension(lat1+2,lon1+2):: sfct,wind10
 real(fp_kind),dimension(lat1+2,lon1+2):: vtype,vfrac,stype,stemp,smoi,snow,trop
 real(fp_kind),dimension(n):: stfact,dx,dy,po,zz,ts,wsp10,vty,vfr,sty,stp,sm,sn,trop5
 real(fp_kind),dimension(3,lat1+2,lon1+2,npes):: ggrid_g31
 real(fp_kind),dimension(3,lat1+2,lon1+2,npes,2):: ggrid_g32
 real(fp_kind),dimension(nsig,n):: h,q,poz

!ibm* prefetch_for_store(m1,zero,n1)
 m1=mype+1; zero=0.0; n1=nsig+1; one=1.0; oneneg=-1.0
 do i=1,n
!ibm* prefetch_for_store(ix1,iy1,nix1,niy1)
  ix1=dx(i); iy1=dy(i)
  nix1=nint(dx(i)); niy1=nint(dy(i))
  ix1=max(1,min(ix1,nx))
  nix1=max(1,min(nix1,nx))
!ibm* prefetch_for_store(delx,dely)
  delx=dx(i)-ix1; dely=dy(i)-iy1; delx=max(zero,min(delx,one))
!ibm* prefetch_for_store(ix,iy)
  ix=ix1-istart(m1)+2; iy=iy1-jstart(m1)+2
!ibm* prefetch_for_store(nix,niy)
  nix=nix1-istart(m1)+2; niy=niy1-jstart(m1)+2
  if(iy<1) then
   iy1=iy1+nlon
!ibm* prefetch_for_store(iy)
   iy=iy1-jstart(m1)+2
  end if
  if(niy<1) then
   niy1=niy1+nlon
!ibm* prefetch_for_store(niy)
   niy=niy1-jstart(m1)+2
  end if
  if(iy>lon1+1) then
   iy1=iy1-nlon
!ibm* prefetch_for_store(iy)
   iy=iy1-jstart(m1)+2
  end if
  if(niy>lon1+2) then
   niy1=niy1-nlon
!ibm* prefetch_for_store(niy)
   niy=niy1-jstart(m1)+2
  end if
!ibm* prefetch_for_store(ixp,iyp)
  ixp=ix+1; iyp=iy+1
  if(ix1==nx) then
!ibm* prefetch_for_store(ixp)
   ixp=ix
  end if
!ibm* prefetch_for_store(delx1,dely1)
  delx1=1.0-delx; dely1=1.0-dely
!ibm* prefetch_for_store(w00,w10,w01,w11)
  w00=delx1*dely1; w10=delx*dely1; w01=delx1*dely; w11=delx*dely

!ibm* prefetch_for_store(zz(i),ts(i),vfr(i),stp(i))
  zz(i)=ggrid_g31(1,ix,iy,n1)*w00+ggrid_g31(1,ixp,iy,n1)*w10& 
   +ggrid_g31(1,ix,iyp,n1)*w01+ggrid_g31(1,ixp,iyp,n1)*w11  ! z0.
  ts(i)=sfct(ix,iy)*w00+sfct(ixp,iy)*w10+sfct(ix,iyp)*w01+sfct(ixp,iyp)*w11
  vfr(i)=vfrac(ix,iy)*w00+vfrac(ixp,iy)*w10+vfrac(ix,iyp)*w01+vfrac(ixp,iyp)*w11
  stp(i)=stemp(ix,iy)*w00+stemp(ixp,iy)*w10+stemp(ix,iyp)*w01+stemp(ixp,iyp)*w11
!ibm* prefetch_for_store(sm(i),sn(i),vty(i),sty(i))
  sm(i)=smoi(ix,iy)*w00+smoi(ixp,iy)*w10+smoi(ix,iyp)*w01+smoi(ixp,iyp)*w11
  sn(i)=snow(ix,iy)*w00+snow(ixp,iy)*w10+snow(ix,iyp)*w01+snow(ixp,iyp)*w11
  trop5(i)=trop(ix,iy)*w00+trop(ixp,iy)*w10+trop(ix,iyp)*w01+trop(ixp,iyp)*w11
  vty(i)=vtype(nix,niy)
  sty(i)=stype(nix,niy)
!ibm* prefetch_for_store(wsp10(i),po(i))
  wsp10(i)=wind10(ix,iy)*w00+wind10(ixp,iy)*w10+wind10(ix,iyp)*w01+&
           wind10(ixp,iyp)*w11

  if(delt) then
!ibm* prefetch_for_store(tf1,tf2,tf3)
    tf1=-min(max(oneneg,stfact(i)),zero)
    tf2=min(max(zero,1.0-abs(stfact(i))),one) 
    tf3=min(max(zero,stfact(i)),one)
!ibm* prefetch_for_store(w00a,w10a,w00b,w10b,w00c,w10c)
    w00a=w00*tf2; w10a=w10*tf2
    w00b=w00*tf1; w10b=w10*tf1
    w00c=w00*tf3; w10c=w10*tf3
!ibm* prefetch_for_store(w01a,w11a,w01b,w11b,w01c,w11c)
    w01a=w01*tf2; w11a=w11*tf2
    w01b=w01*tf1; w11b=w11*tf1
    w01c=w01*tf3; w11c=w11*tf3
    po(i)=ggrid_g31(3,ix,iy ,n1  )*w00a+ggrid_g31(3,ixp,iy ,n1  )*w10a+&
          ggrid_g31(3,ix,iyp,n1  )*w01a+ggrid_g31(3,ixp,iyp,n1  )*w11a+&
          ggrid_g32(3,ix,iy ,n1,1)*w00b+ggrid_g32(3,ixp,iy ,n1,1)*w10b+&
          ggrid_g32(3,ix,iyp,n1,1)*w01b+ggrid_g32(3,ixp,iyp,n1,1)*w11b+&
          ggrid_g32(3,ix,iy ,n1,2)*w00c+ggrid_g32(3,ixp,iy ,n1,2)*w10c+&
          ggrid_g32(3,ix,iyp,n1,2)*w01c+ggrid_g32(3,ixp,iyp,n1,2)*w11c
!ibm* prefetch_for_store(k1)
    k1=n1
    do k=1,nsig
     k1=k1+1
!ibm* prefetch_for_store(h(k,i),q(k,i),poz(k,i))
     h(k,i)  =ggrid_g31(3,ix,iy ,k1  )*w00a+ggrid_g31(3,ixp,iy ,k1  )*w10a+&
              ggrid_g31(3,ix,iyp,k1  )*w01a+ggrid_g31(3,ixp,iyp,k1  )*w11a+&
              ggrid_g32(3,ix,iy ,k1,1)*w00b+ggrid_g32(3,ixp,iy ,k1,1)*w10b+&
              ggrid_g32(3,ix,iyp,k1,1)*w01b+ggrid_g32(3,ixp,iyp,k1,1)*w11b+&
              ggrid_g32(3,ix,iy ,k1,2)*w00c+ggrid_g32(3,ixp,iy ,k1,2)*w10c+&
              ggrid_g32(3,ix,iyp,k1,2)*w01c+ggrid_g32(3,ixp,iyp,k1,2)*w11c
     q(k,i)  =ggrid_g31(1,ix,iy ,k1  )*w00a+ggrid_g31(1,ixp,iy ,k1  )*w10a+&
              ggrid_g31(1,ix,iyp,k1  )*w01a+ggrid_g31(1,ixp,iyp,k1  )*w11a+&
              ggrid_g32(1,ix,iy ,k1,1)*w00b+ggrid_g32(1,ixp,iy ,k1,1)*w10b+&
              ggrid_g32(1,ix,iyp,k1,1)*w01b+ggrid_g32(1,ixp,iyp,k1,1)*w11b+&
              ggrid_g32(1,ix,iy ,k1,2)*w00c+ggrid_g32(1,ixp,iy ,k1,2)*w10c+&
              ggrid_g32(1,ix,iyp,k1,2)*w01c+ggrid_g32(1,ixp,iyp,k1,2)*w11c
     poz(k,i)=ggrid_g31(2,ix,iy ,k1  )*w00a+ggrid_g31(2,ixp,iy ,k1  )*w10a+&
              ggrid_g31(2,ix,iyp,k1  )*w01a+ggrid_g31(2,ixp,iyp,k1  )*w11a+&
              ggrid_g32(2,ix,iy ,k1,1)*w00b+ggrid_g32(2,ixp,iy ,k1,1)*w10b+&
              ggrid_g32(2,ix,iyp,k1,1)*w01b+ggrid_g32(2,ixp,iyp,k1,1)*w11b+&
              ggrid_g32(2,ix,iy ,k1,2)*w00c+ggrid_g32(2,ixp,iy ,k1,2)*w10c+&
              ggrid_g32(2,ix,iyp,k1,2)*w01c+ggrid_g32(2,ixp,iyp,k1,2)*w11c
    end do
  else
   po(i)=ggrid_g31(3,ix,iy ,n1)*w00+ggrid_g31(3,ixp,iy ,n1)*w10+&
         ggrid_g31(3,ix,iyp,n1)*w01+ggrid_g31(3,ixp,iyp,n1)*w11
!ibm* prefetch_for_store(k1)
   k1=n1
   do k=1,nsig
    k1=k1+1
!ibm* prefetch_for_store(h(k,i),q(k,i),poz(k,i))
    h(k,i)  =ggrid_g31(3,ix,iy ,k1)*w00+ggrid_g31(3,ixp,iy ,k1)*w10+&
             ggrid_g31(3,ix,iyp,k1)*w01+ggrid_g31(3,ixp,iyp,k1)*w11
    q(k,i)  =ggrid_g31(1,ix,iy ,k1)*w00+ggrid_g31(1,ixp,iy ,k1)*w10+&
             ggrid_g31(1,ix,iyp,k1)*w01+ggrid_g31(1,ixp,iyp,k1)*w11
    poz(k,i)=ggrid_g31(2,ix,iy ,k1)*w00+ggrid_g31(2,ixp,iy ,k1)*w10+&
             ggrid_g31(2,ix,iyp,k1)*w01+ggrid_g31(2,ixp,iyp,k1)*w11
   end do
  end if
 end do

 return
 end