!--------------------------------------------------------------------
!
!  Este programa calcula la traza de una matriz de 4x4 cuyos términos
!  se definen como a(i,j)=i+j. Los cálculos se hacen definiendo la matriz
!  completa y realizando posteriormente el cálculo de la traza.
!  Hay formas más eficientes de realizar este cálculo en particular pero
!  el objetivo de este programa es tratar el uso de matrices en Fortran.
!   (Se omiten las tildes en los textos por pantalla)
!
!   Autores: J. París & Grupo de Métodos Numéricos en Ingeniería
!
!            Copyright:
!   Este programa es propiedad de sus autores.
!   No puede utilizarse con fines comerciales sin conocimiento
!   y autorización de sus autores.
!   Puede utilizarse con fines educativos sin ninguna restricción.
!
!--------------------------------------------------------------------

      program trazamatriz
      implicit integer*4(i-n)
      implicit real*8(a-h,o-z)
      allocatable amatriz(:,:)

      write(6,'(//2a//)')'Calculo de la traza de una matriz',
     &                   ' definida como a(i,j)=i+j'

      write(6,*)'Indique la dimension de la matriz'
      read(5,*)n

      allocate(amatriz(n,n),STAT=ierr)
      if(ierr.ne.0)then
        write(6,'(/a/)')'No se pudo reservar memoria para la matriz'
        stop
      endif

      call definematriz(n,amatriz)

      call calculatraza(n,amatriz,traza)

      write(6,'(a,i6,a,f15.2)')'La traza de la matriz de dimension',
     &                          n,' es:',traza


      write(6,*)
      write(6,*)'Pulsa ENTER para finalizar el programa'
      read(5,*)   ! Se añade esta instrucción para ejecutar el programa
                   ! haciendo doble-click directamente en el fichero *.exe

      end
!
!============================================================
!
      subroutine definematriz(n,amatriz)
      implicit integer*4(i-n)
      implicit real*8(a-h,o-z)
      dimension amatriz(n,n)

      do j=1,n
        do i=1,n
          amatriz(i,j)=dble(i+j)
        enddo
      enddo
      
      return
      end

!
!============================================================
!
      subroutine calculatraza(n,amatriz,traza)
      implicit integer*4(i-n)
      implicit real*8(a-h,o-z)
      dimension amatriz(n,n)

      traza=0.d+00
      do i=1,n
        traza=traza+amatriz(i,i)
      enddo

      return
      end



