
      subroutine bakvec(nm,n,t,e,m,z,ierr)
c
      integer i,j,m,n,nm,ierr
      double precision t(nm,3),e(n),z(nm,m)
c
c     this subroutine forms the eigenvectors of a nonsymmetric
c     tridiagonal matrix by back transforming those of the
c     corresponding symmetric matrix determined by  figi.
c
c     on input
c
c        nm must be set to the row dimension of two-dimensional
c          array parameters as declared in the calling program
c          dimension statement.
c
c        n is the order of the matrix.
c
c        t contains the nonsymmetric matrix.  its subdiagonal is
c          stored in the last n-1 positions of the first column,
c          its diagonal in the n positions of the second column,
c          and its superdiagonal in the first n-1 positions of
c          the third column.  t(1,1) and t(n,3) are arbitrary.
c
c        e contains the subdiagonal elements of the symmetric
c          matrix in its last n-1 positions.  e(1) is arbitrary.
c
c        m is the number of eigenvectors to be back transformed.
c
c        z contains the eigenvectors to be back transformed
c          in its first m columns.
c
c     on output
c
c        t is unaltered.
c
c        e is destroyed.
c
c        z contains the transformed eigenvectors
c          in its first m columns.
c
c        ierr is set to
c          zero       for normal return,
c          2*n+i      if e(i) is zero with t(i,1) or t(i-1,3) non-zero.
c                     in this case, the symmetric matrix is not similar
c                     to the original matrix, and the eigenvectors
c                     cannot be found by this program.
c
c     questions and comments should be directed to burton s. garbow,
c     mathematics and computer science div, argonne national laboratory
c
c     this version dated august 1983.
c
c     ------------------------------------------------------------------
c
      ierr = 0
      if (m .eq. 0) go to 1001
      e(1) = 1.0d0
      if (n .eq. 1) go to 1001
c
      do 100 i = 2, n
         if (e(i) .ne. 0.0d0) go to 80
         if (t(i,1) .ne. 0.0d0 .or. t(i-1,3) .ne. 0.0d0) go to 1000
         e(i) = 1.0d0
         go to 100
   80    e(i) = e(i-1) * e(i) / t(i-1,3)
  100 continue
c
      do 120 j = 1, m
c
         do 120 i = 2, n
         z(i,j) = z(i,j) * e(i)
  120 continue
c
      go to 1001
c     .......... set error -- eigenvectors cannot be
c                found by this program ..........
 1000 ierr = 2 * n + i
 1001 return
      end
