      subroutine gauss (a,n)
      integer maxcor, maxcr2, maxcr4, maxcr5, maxcr6, maxcr7, maxcr8
c     parameter (maxcor=2, maxcr2=maxcor*maxcor, maxcr4=maxcr2*maxcr2,
c    1 maxcr5=maxcr2*(maxcr2+1)/2, maxcr6=maxcor*2, maxcr7=maxcr6+1,
c    2 maxcr8=maxcr6*maxcr7+1)
      parameter (maxcor=2, maxcr2=4, maxcr4=16,
     1 maxcr5=10, maxcr6=4, maxcr7=5,
     2 maxcr8=21)
      double precision a(maxcr7,maxcr6), max, dummy(maxcr6), factor,
     1 dabs
      nminus=n-1
      do 80 ij=1,nminus
      ijpl1=ij+1
c  find maximum non-zero element in ij column from ij to n rows
      max=a(ij,ij)
      jmax=ij
      do 20 i=ijpl1,n
      if (dabs(max).le.1.0d-9) go to 10
      if (dabs(a(i,ij)).le.1.0d-9) go to 20
      if (dabs(a(i,ij)).le.dabs(max)) go to 20
   10 max=a(i,ij)
      jmax=i
   20 continue
      if (max.eq.0.0) go to 60
      a(n+1,ij)=dble(jmax)
c swap places with ij row & jmax row
      if (ij.eq.i) go to 40
      do 30 i=ij,n
      dummy(i)=a(ij,i)
      a(ij,i)=a(jmax,i)
   30 a(jmax,i)=dummy(i)
c  multiply all rows after the ij row by multiplier
   40 if (a(ij,ij).eq.0.0) go to 60
      do 70 i=ijpl1,n
      factor=-(a(i,ij)/a(ij,ij))
      do 50 j=ij,n
   50 a(i,j)=a(i,j)+factor*a(ij,j)
      go to 70
c if the column is all zeros, set a(i,ij)=factor=0
   60 factor=0.0
      a(n+1,ij)=dble(ij)
   70 a(i,ij)=factor
   80 continue
      a(n+1,n)=dble(n)
      return
      end
