      parameter(MAXN=1000,MAXK=(MAXN*(MAXN+1))/2)
      implicit real*8 (a-h,o-z)
      real*8 a(MAXK),v(MAXN),w(MAXN)

c.....Orden de la matriz
      write(6,100)
  100 format(' Orden de la matriz: ',$)
      read(5,*) n
      k_max=(n*(n+1))/2
      if (n.gt.MAXN.or.k_max.gt.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 simetrica y solo se almacena la parte
c     triangular superior, por columnas)
      ... 

c.....Calculo del vector w
      call MatSimPorVector(n,a,v,w)

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

      end

c________________________________________________________________MatSimPorVector
c                         _     _
c     Calcula el producto w = A v , siendo A una matriz simetrica de orden n.
c                             ~            ~
c
c     Variables:
c                          ~
c               n   => Tamano del problema. 
c
c               a() => Vector (dato) de [n*(n+1)/2] componentes que contiene
c                      los coeficientes de la parte triangular superior de la
c                      matriz A almacenados por columnas, de forma que
c                             ~
c                                a   <-> a(k) , siendo k=(j*(j-1))/2+i.
c                                 ij
c               v() => Vector (dato) de [n] componentes.
c
c               w() => Vector (resultado) de [n] componentes.
c_______________________________________________________________________________

      subroutine MatSimPorVector(n,a,v,w)
      implicit real*8 (a-h,o-z)
      real*8 a(1),v(1),w(1)

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

c.....Producto Matricial
      k=0
      do j=1,n

        do i=1,j-1
          k=k+1
          w(i)=w(i)+a(k)*v(j)
          w(j)=w(j)+a(k)*v(i)
        enddo
        i=j
          k=k+1
          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


