subroutine outgrad2(t,q,psi,chi,u,v,h,nx,ny,np,rx,ry,startp,pinc, &
            erlon0,erlat0,nlonmap,nlatmap,dlonmap,dlatmap, &
             rlonmap0,rlatmap0,rp,nphgeo,iordmap,lbigmap)

  integer(4) nx,ny,np,nlonmap,nlatmap,nphgeo
  real(4) startp,pinc,erlon0,erlat0,dlonmap,dlatmap,rlonmap0,rlatmap0

         character(50) dsname,title
         data dsname/'anl.dat'/
         data title/'r3dvanl'/
  real(4) t(nx,ny,np),u(nx,ny,np),v(nx,ny,np),h(nx,ny,np)
  real(4) psi(nx,ny,np),chi(nx,ny,np)
  real(4) q(nx,ny,np),rx(nx),ry(ny),rp(np)
         character(80) datdes(1000)
         character(1) blank
         data blank/' '/

  integer(4) k,l,i,next,last,ntime,iuv,j,kstart,kend,loop
  integer(4),allocatable::ipmb(:)
  real(4) undef,rog,conmc,sjstar,sjmstar,spbar,sjpstar
         data undef/-9.99e33/
  real(4),allocatable,dimension(:,:)::work,wgth
  real(4),allocatable,dimension(:)::sp
  real(4),allocatable,dimension(:,:,:)::hall
  real(4) zero4,two4
  real(4),allocatable::deltags(:),epsilongs(:)
  real(4),allocatable::deltagu(:),epsilongu(:)
  real(4),allocatable::deltagv(:),epsilongv(:),wgts(:)
  integer(4),allocatable::iwgts(:),iflag(:)

!-------- compute heights from ref height and temps

  zero4=0._8 ; two4=2._8

         rog=conmc('rd$')/conmc('g$')
  allocate(sp(0:np+1))
  allocate(ipmb(np))
         do k=1,np
          sp(k)=-rog*rp(k)
          ipmb(k)=nint(exp(rp(k)))
          if(ipmb(k).eq.0) ipmb(k)=ipmb(k-1)-1
         end do
         print *,' in outgrad2, ipmb=',ipmb
         sp(0)=two4*sp(1)-sp(2)
         sp(np+1)=two4*sp(np)-sp(np-1)
  allocate(wgth(np,np))
         wgth=zero4
         do l=1,np
          if(sp(l).ge.sp(1).and.sp(l).lt.sp(nphgeo)) then
           do k=1,nphgeo
            sjstar=max(sp(l),sp(k))
            sjmstar=max(sp(l),sp(k-1))
            spbar=min(sp(k+1),sp(nphgeo))
            wgth(k,l)=-max(zero4,spbar-sjstar)**2/(two4*(sp(k+1)-sp(k))) &
                -max(zero4,sp(k)-sjmstar)*(sp(k)-two4*sp(k-1)+sjmstar)/ &
                                  (two4*(sp(k)-sp(k-1)))
           end do
          end if
          if(sp(l).ge.sp(nphgeo).and.sp(l).le.sp(np)) then
           do k=nphgeo,np
            sjstar=min(sp(l),sp(k))
            sjpstar=min(sp(l),sp(k+1))
            spbar=max(sp(nphgeo),sp(k-1))
            wgth(k,l)= max(zero4,sjstar-spbar)**2/(two4*(sp(k)-sp(k-1))) &
                -max(zero4,sjpstar-sp(k))*(sjpstar-two4*sp(k+1)+sp(k))/ &
                         (two4*(sp(k+1)-sp(k)))
           end do
          end if
!         do k=1,np
!          print *,' wgth(',k,',',l,')=',wgth(k,l)
!         end do
         end do
  allocate(hall(nx,ny,np))
         do k=1,np
          do j=1,ny
           do i=1,nx
            hall(i,j,k)=h(i,j,nphgeo)
           end do
          end do
         end do
         do l=1,np
          do k=1,np
           do j=1,ny
            do i=1,nx
             hall(i,j,l)=hall(i,j,l)+wgth(k,l)*t(i,j,k)
            end do
           end do
          end do
         end do
  deallocate(wgth)
  deallocate(sp)

         ntime=1
         do i=1,1000
          write(datdes(i),10)(blank,k=1,80)
10        format(80a1)
         end do
         write(datdes(1),100)dsname
100      format('DSET ',a50)
         write(datdes(2),200)
200      format('options big_endian sequential')
         write(datdes(3),300)title
300      format('TITLE ',a50)
         write(datdes(4),400)undef
400      format('UNDEF ',e11.2)
         write(datdes(5),500)nlonmap,rlonmap0,dlonmap
500      format('XDEF ',i5,' LINEAR ',f7.2,f7.2)
         write(datdes(6),600)nlatmap,rlatmap0,dlatmap
600      format('YDEF ',i5,' LINEAR ',f7.2,f7.2)
         next=7
         kstart=1
         kend=min(10,np)
         write(datdes(next),700)np,(ipmb(k),k=kstart,kend)
700      format('ZDEF ',i5,' LEVELS ',10i5)
         next=next+1
         do loop=1,100
          kstart=kend+1
          kend=min(kstart+9,np)
          if(kstart.gt.np) go to 703
          write(datdes(next),702)(ipmb(k),k=kstart,kend)
702       format('   ',10i5)
          next=next+1
         end do
703      continue
         write(datdes(next),800)ntime
800      format('TDEF ',i5,' LINEAR 0Z23may1992 24hr')
         next=next+1
         write(datdes(next),810)
810      format('VARS 8')
         next=next+1
         write(datdes(next),910)np
910      format('t   ',i5,' 99 t   ')
         next=next+1
         write(datdes(next),915)np
915      format('q   ',i5,' 99 q   ')
         next=next+1
         write(datdes(next),920)np
920      format('u   ',i5,' 99 u   ')
         next=next+1
         write(datdes(next),930)np
930      format('v   ',i5,' 99 v   ')
         next=next+1
         write(datdes(next),932)np
932      format('psi ',i5,' 99 psi ')
         next=next+1
         write(datdes(next),934)np
934      format('chi ',i5,' 99 chi ')
         next=next+1
         write(datdes(next),940)np
940      format('h   ',i5,' 99 h   ')
         next=next+1
         write(datdes(next),942)np
942      format('hd  ',i5,' 99 hd  ')
         next=next+1
         write(datdes(next),980)
980      format('ENDVARS')
         last=next
         write(563,2000)(datdes(i),i=1,last)
2000     format(a80)
         rewind 564
  allocate(work(nlonmap,nlatmap))
  allocate(deltags(nlonmap*nlatmap))
  allocate(epsilongs(nlonmap*nlatmap))
  allocate(deltagu(nlonmap*nlatmap))
  allocate(epsilongu(nlonmap*nlatmap))
  allocate(deltagv(nlonmap*nlatmap))
  allocate(epsilongv(nlonmap*nlatmap))
  allocate(wgts(nlonmap*nlatmap*lbigmap))
  allocate(iwgts(nlonmap*nlatmap*lbigmap))
  allocate(iflag(nlonmap*nlatmap))
  call grid2mapg_init(nx,ny,rx,ry,nlonmap,nlatmap,rlonmap0,rlatmap0,erlon0,erlat0, &
                       dlonmap,dlatmap,iordmap,lbigmap,deltags,epsilongs, &
                       deltagu,epsilongu,deltagv,epsilongv,wgts,iwgts,iflag)
         do k=1,np
          call grid2mapg(t(1,1,k),t(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltags,epsilongs,wgts,iwgts,iflag)
          write(564)work
         end do
         do k=1,np
          call grid2mapg(q(1,1,k),q(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltags,epsilongs,wgts,iwgts,iflag)
          write(564)work
         end do
         do k=1,np
          call grid2mapg(u(1,1,k),v(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltagu,epsilongu,wgts,iwgts,iflag)
          write(564)work
         end do
         iuv=2
         do k=1,np
          call grid2mapg(u(1,1,k),v(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltagv,epsilongv,wgts,iwgts,iflag)
          write(564)work
         end do
         do k=1,np
          call grid2mapg(psi(1,1,k),psi(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltags,epsilongs,wgts,iwgts,iflag)
          write(564)work
         end do
         do k=1,np
          call grid2mapg(chi(1,1,k),chi(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltags,epsilongs,wgts,iwgts,iflag)
          write(564)work
         end do
         do k=1,np
          call grid2mapg(h(1,1,k),h(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltags,epsilongs,wgts,iwgts,iflag)
          write(564)work
         end do
         do k=1,np
          call grid2mapg(hall(1,1,k),hall(1,1,k),work,nlonmap,nlatmap, &
                         lbigmap,deltags,epsilongs,wgts,iwgts,iflag)
          write(564)work
         end do
         close(563)
         close(564)
       return
       end subroutine outgrad2