!--------------------------------------------------------------------
!
!  Este programa calcula el producto escalar de dos vectores de
!  dimension 3 que se indicaran a traves del teclado a través
!  de una subrutina e incorporando dimensionamiento dinámico.
!  El resultado se guarda en el archivo "prod_esc.txt"
!   (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 producto_escalar
      implicit integer*4(i-n)
      implicit real*8(a-h,o-z)
      allocatable u(:), v(:)

      write(6,'(/a/)')'Calculo del producto escalar de dos vectores'

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

      allocate(u(n),v(n),STAT=ierr)
      if(ierr.ne.0)then
        write(6,*)'No se pudo reservar la memoria para los vectores'
        stop
      endif

      write(6,*)' Indique las componentes del primer vector'
      do i=1,n
        read(5,*)u(i)
      enddo

      write(6,*)' Indique las componentes del segundo vector'
      do i=1,n
        read(5,*)v(i)
      enddo

      call prodesc(n,u,v,pe)

      call escriberes(n,u,v,pe)

      write(6,*)
      write(6,*)'Resultados en el archivo prod_esc.txt'
      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 prodesc(n,u,v,pe)
      implicit integer*4(i-n)
      implicit real*8(a-h,o-z)
      dimension u(n),v(n)

      pe=0.d+00

      do i=1,n
        pe = pe + u(i) * v(i)
      enddo

      return
      end

!-------------------------------------------------------------------------

      subroutine escriberes(n,u,v,pe)
      implicit integer*4(i-n)
      implicit real*8(a-h,o-z)
      dimension u(n),v(n)

      open(unit=10,file='prod_esc.txt',status='unknown')

      write(10,'(/a/)')'El producto escalar de:'
      do i=1,n
        write(10,'(a,i5,a,d15.6)')'u(',i,')=',u(i)
      enddo
      write(10,'(/a/)')'por:'
      do i=1,n
        write(10,'(a,i5,a,d15.6)')'v(',i,')=',v(i)
      enddo
      write(10,'(/a,d15.6/)')'es:',pe

      close(10)

      return
      end






