
 
 Purpose
 =======
 
        LA_GEEV computes for a real or complex square matrix A, the 
 eigenvalues and, optionally, the left and/or right eigenvectors. A 
 right eigenvector v(j) of A satisfies
                   A * v(j) = lambda(j) * v(j)
 where lambda(j) is its eigenvalue. A left eigenvector u(j) of A 
 satisffies
                   u(j)^H * A = lambda(j) * u(j)^H
 where u(j)^H denotes the conjugate-transpose of u(j).
 
 =========
 
       SUBROUTINE LA_GEEV( A, <w>, VL=vl, VR=vr, INFO=info )
            <type>(<wp>), INTENT(INOUT) :: A(:,:)
            <type>(<wp>), INTENT(OUT) :: <w(:)>
            <type>(<wp>), INTENT(OUT), OPTIONAL :: VL(:,:), VR(:,:)
            INTEGER, INTENT(OUT), OPTIONAL :: INFO
       where
            <type> ::= REAL | COMPLEX
            <wp>   ::= KIND(1.0) | KIND(1.0D0)
            <w>    ::= WR, WI | W
            <w(:)> ::= WR(:), WI(:) | W(:)
 
 Arguments
 =========
 
 A        (input/output) REAL or COMPLEX square array, shape (:,:).
          On entry, the matrix A.
          On exit, the contents of A are destroyed.
 <w>      (output) REAL or COMPLEX array, shape (:) with size(w) = 
          size(A,1).
          The computed eigenvalues.
          <w(:)> ::= WR(:), WI(:) | W(:),
          where
          WR(:), WI(:) are of REAL type (for the real and imaginary
          parts) and W(:) is of COMPLEX type.
          Note: If A is real, then a complex-conjugate pair appear 
          consecutively, with the eigenvalue having the positive 
          imaginary part appearing first.
 VL       Optional (output) REAL or COMPLEX square array, shape (:,:)
          with size(VL,1) = size(A,1).
          The left eigenvectors u(j) are stored in the columns of VL in
          the order of their eigenvalues. Each eigenvector is scaled so
          that the Euclidean norm is 1 and the largest component is real.
          Note: If A is real then complex eigenvectors, like their 
          eigenvalues, occur in complex conjugate pairs. The real and 
          imaginary parts of the first eigenvector of the pair are
          stored in VL(:,j) and VL(:,j+1). Thus a complex conjugate pair
          is given by 
            u(j) = VL(:,j) + i*VL(:,j+1), u(j+1) = VL(:,j) - i*VL(:,j+1)
 VR       Optional (output) REAL or COMPLEX square array, shape (:,:) 
          with size(VR,1) = size(A,1).
          The right eigenvectors v(j) are stored in the columns of VR in
          the order of their eigenvalues.
          Each eigenvector is scaled so that the Euclidean norm is 1 and 
          the largest component is real.
          Note: If A is real then complex eigenvectors, like their 
          eigenvalues, occur in complex conjugate pairs. The real and 
          imaginary parts of the first eigenvector of the pair are stored
          in VR(:,j) and VR(:,j+1). Thus a complex conjugate pair is 
          given by 
 	     v(j) = VR(:,j) + i*VR(:,j+1), v(j+1) = VR(:,j) - i*VR(:,j+1)
 INFO     Optional (output) INTEGER.
          = 0: successful exit.
          < 0: if INFO = -i, the i-th argument had an illegal value.
          > 0: if INFO = i, the QR algorithm failed to compute all the 
          eigenvalues and no eigenvectors were computed. Elements 
 	  i+1 : n of <w> contain eigenvalues which have converged.
          n is the order of A
          If INFO is not present and an error occurs, then the program
          is terminated with an error message.

