c Soluzione dell'esercizion numero 8 della raccolta di esercizi di Fortran
c da temi d'esame degli anni passati

      program Rayleigh

      implicit none

      integer n,i,j,ITMAX,iter
      real*8  A(50,50),x(50),y(50)
      real*8  TOLL
      real*8  alpha,beta,r_old,r_new,d
      real*8  SCAL

c     Lettura dati in input
      open(5,file='ray.dat')
      open(6,file='ray.ris')
      read(5,*) n,ITMAX,TOLL
      do i = 1,n
         read(5,*) (A(i,j),j=1,n)
      enddo
c     Costruzione vettore iniziale
      do i = 1,n
         x(i) = 1.0
      enddo
      r_old = TOLL      
c     Inizializzazione ciclo while
      iter = 0
      d = 2.0*TOLL
      do while ( (iter .lt. ITMAX) .and. (d .ge. TOLL) )
         iter = iter + 1
         call MATV(n,A,x,y)
         alpha = SCAL(n,x,y)
         beta  = SCAL(n,x,x)
         r_new = alpha/beta
         d = abs(r_new - r_old)
c        Aggiorno le variabili
         r_old = r_new
         do i = 1,n
            x(i) = y(i)
         enddo
      enddo
      write(6,*) 'Iterazioni eseguite:',iter
      write(6,*) 'Autovalore:',r_new
      stop
      end

      subroutine MATV(n,A,x,y)
      implicit none
      integer n,i,j
      real*8  A(50,50),x(50),y(50)
      do i = 1,n
         y(i) = 0.0
         do j = 1,n
            y(i) = y(i) + A(i,j)*x(j)
         enddo
      enddo
      return
      end

      real*8 function SCAL(n,x,y)
      implicit none
      integer n,i
      real*8  x(50),y(50)
      SCAL = 0.0
      do i = 1,n
         SCAL = SCAL + x(i)*y(i)
      enddo
      return
      end