      program diag
*---------------------------------------------------------------
c
c     diagonalisiert eine hermitesche Matrix
c     Das Programm bestimmt die Dimension der Matrix selbständig und
c     geht dabei davon aus, dass die letzte Zeile bzw. Spalte besetzt ist.
c
c
*---------------------------------------------------------------
      implicit   none
      integer    k,L,Dim,ThisDim
      Parameter  (Dim=9300)
      integer    wkDim,rkDim,Error
      Parameter  (wkDim=3*Dim+1,rkDim=3*Dim+1)
*
      complex*16 Matrix(Dim,Dim)
      complex*16 wk(wkDim)
      real*8     Eigenwerte(Dim)
      real*8     rk(rkDim)
*     
      character  Filename*50
      character  Version*50
*
      Version= '# diag 01 Juergen Schnack  05. 06. 2009'
*---------------------------------------------------------------
*
*     Version
*
      write(6,'(a)') Version
*
      Matrix = DCMPLX(0.d0,0.d0)
*
      ThisDim = 0
*---------------------------------------------------------------
*
*     Einlesen
*
      call GETARG(1,FileName)
      open(1,file=Filename)
 100  read(1,*,err=110,end=110) k,L,Matrix(k,L)
      IF(k.gt.ThisDim) ThisDim=k
      IF(L.gt.ThisDim) ThisDim=L
      goto 100
 110  continue
      close(1)
      write(6,*) 'Dimension der Matrix = ',ThisDim
*---------------------------------------------------------------
*
*     Diagonalisieren
*
      call ZHEEV('N','U',ThisDim,Matrix,Dim,Eigenwerte,wk,
     &     wkDim,rk,Error)
*---------------------------------------------------------------
*
*     Ausgeben
*
      do k=1,ThisDim
         write(6,'(i6,a,f15.7)') k,' :  ',Eigenwerte(k)
      enddo
*
      end
