c_______________________________________________________________________________
c
c     SUBRUTINAS
c                   
c     Notas:
c            Se declaran matrices de tamano variable (permitido en Fortran). (*)
c            Estas subrutinas se pueden compilar y funcionan correctamente.
c
c    (*) Solo en subrutinas y cuando la matriz proviene del exterior
c        [ => es uno de los argumentos de la subrutina].
c        Se supone que la matriz fue dimensionada correctamente en el exterior
c        [ => con reserva de espacio suficiente],
c        antes de llamar a la subrutina.
c_______________________________________________________________________________


c_____________________________________________________________________LeerMatriz

      Subroutine LeerMatriz(logr,fmtr,nf,nc,x)
      implicit real*8 (a-h,o-z)
      character*(*) fmtr
      dimension x(nf,nc)                                           ! <=> x(nf,1)

      do k=1,nf*nc
        read(logr,fmtr) i,j,x(i,j)     ! leemos componentes (en cualquier orden)
      enddo

      return
      end


c_________________________________________________________________EscribirMatriz

      Subroutine EscribirMatriz(logw,fmtw,nf,nc,x)
      implicit real*8 (a-h,o-z)
      character*(*) fmtw
      dimension x(nf,nc)                                           ! <=> x(nf,1)

      do j=1,nc
        do i=1,nf
          write(logw,fmtw) i,j,x(i,j)    ! escribimos componentes (por columnas)
        enddo
      enddo

      return
      end


c____________________________________________________________MultiplicarMatrices

      Subroutine MultiplicarMatrices(nfa,nca,a,nfb,ncb,b,nfc,ncc,c)
      implicit real*8 (a-h,o-z)
      dimension a(nfa,nca),b(nfb,ncb),c(nfc,ncc)! <=> a(nfa,1),b(nfb,1),c(nfc,1)

      parameter(dcero=0.d+00)

      if (nca.ne.nfb) call ErrorFatal('nca y nfb no coinciden',1)
      if (nfa.ne.nfc) call ErrorFatal('nfa y nfc no coinciden',2)
      if (ncb.ne.ncc) call ErrorFatal('ncb y ncc no coinciden',3)

      do j=1,ncc
        do i=1,nfc
          c(i,j)=dcero
          do k=1,nca
            c(i,j)=c(i,j)+a(i,k)*b(k,j)
          enddo
        enddo
      enddo

      return
      end


c_____________________________________________________________________ErrorFatal

      Subroutine ErrorFatal(mensaje,ierr)
      character*(*) mensaje

      write(6,100) mensaje
  100 format(' Error: ',a)

      call exit(ierr)
      end
