c-------------------------------------------------------------------------------
c
c     PROGRAMA PRINCIPAL
c
c     Fase 2: Se introduce el DIMENSIONAMIENTO DINAMICO
c
c
c                   
c-------------------------------------------------------------------------------

      implicit real*8 (a-h,o-z)
      parameter (MXKP=10000)
      dimension work(MXKP)
      
      kplibre=1

c.....Leemos la matriz A
      open(unit=1,status='old',file='ma.dat',carriagecontrol='list')
      read(1,100) nfa,nca
  100 format(/,2i5)
      call DimensionamientoDinamico(MXKP,kplibre,nfa*nca,kpa)
      call LeeMatriz(1,nfa,nca,work(kpa))
      close(unit=1,status='keep')

c.....Leemos la matriz B
      open(unit=1,status='old',file='mb.dat',carriagecontrol='list')
      read(1,100) nfb,ncb
      call DimensionamientoDinamico(MXKP,kplibre,nfb*ncb,kpb)
      call LeeMatriz(1,nfb,ncb,work(kpb))
      close(unit=1,status='keep')

c.....Calculamos la matriz producto C = A * B
      nfc=nfa
      ncc=ncb
      call DimensionamientoDinamico(MXKP,kplibre,nfc*ncc,kpc)
      call MultiplicaMatrices(nfa,nca,work(kpa),
     .                        nfb,ncb,work(kpb),
     .                        nfc,ncc,work(kpc))

c.....Escribimos el resultado
      open(unit=2,status='new',file='mc.dat',carriagecontrol='list')
      write(2,200) nfc,ncc
  200 format('Matriz Producto: C = A * B',/,2i5)
      call EscribeMatriz(2,nfc,ncc,work(kpc))
      close(unit=2,status='keep')

c.....Fin de programa
      stop
      end

c_______________________________________________________DimensionamientoDinamico
      Subroutine DimensionamientoDinamico(MXKP,kplibre,ncomponentes,kp)

      kp=kplibre
      kplibre=kplibre+ncomponentes
      if (kplibre.gt.MXKP+1) call ErrorFatal('Memoria insuficiente')

      return
      end
