      parameter(MAXN=1000,MAXK=100000)
      implicit real*8 (a-h,o-z)
      integer*4 nf(MAXK), nc(MAXK)
      real*8    a(MAXK),v(MAXN),w(MAXN)

c.....Orden de la matriz y numero de componentes no nulos
      write(6,100)
  100 format(' Orden de la matriz y numero de componentes no nulos: ',$)
      read(5,*) n, k_max
      if (n.gt.MAXN.or.k_max.gr.MAXK)
     .  call ErrorFatal('Dimensionamiento de memoria insuficiente')

c.....Lectura o Generacion de la matrix A y del vector v
c     (NOTA: la matriz A es dispersa no estructurada, y solo se almacenan los
c      elementos no nulos; para ello se utilizan los vectores nf,nc y a)
      ... 

c.....Calculo del vector w
      call MatNEPorVector(n,k_max,nf,nc,a,v,w)

c.....Escritura de Resultados
      ... 

      end

c_________________________________________________________________MatNEPorVector
c                         _     _
c     Calcula el producto w = A v , siendo A una matriz no estructurada
c     de orden n.             ~            ~
c
c     Variables:
c                            ~
c               n     => Tamano del problema.
c
c               k_max => Numero de componentes no nulos de la matriz A.
c
c               nf()  => Vector (dato) de [k_max] componentes que contiene
c                        los numeros de fila de los elementos de la matriz.
c               nc()  => Vector (dato) de [k_max] componentes que contiene
c                        los numeros de columna de los elementos de la matriz.
c               a()   => Vector (dato) de [k_max] componentes que contiene
c                        los coeficientes no nulos de la matriz, de forma que
c
c                              a   <-> a(k) , siendo i=nf(k),
c                               ij                   j=nc(k),   k=1,...,k_max
c                                                          
c               v()   => Vector (dato) de [n] componentes.
c
c               w()   => Vector (resultado) de [n] componentes.
c_______________________________________________________________________________

      subroutine MatNEPorVector(n,k_max,nf,nc,a,v,w)
      implicit real*8 (a-h,o-z)
      integer*4 nf(k_max), nc(k_max)
      real*8    a(k_max),v(n),w(n)

c.....Inicializacion
      do i=1,n
        w(i)=0.d+00
      enddo

c.....Producto Matricial
      do k=1,k_max
        i=nf(k)
        j=nc(k)
        w(i)=w(i)+a(k)*v(j)
      enddo

      return
      end

c_____________________________________________________________________ErrorFatal
      Subroutine ErrorFatal(mensaje)
      character*(*) mensaje

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

      stop
      end


