next up previous contents
Next: Datenlokalität - Wie Compiler Up: Erfahrungen mit dem CONVEX Previous: Erfahrungen mit dem CONVEX

Anhang: Source-Code der Subroutine GAUSS

Bemerkung: Das Array aa, das in Zeile 10 deklariert wird, ist ein sogenanntes automatisches Array, dessen Dimensionen tatsächlich erst zur Laufzeit durch den Wert des Parameters n bestimmt sind. Dadurch erübrigt sich das Übergeben eines Work-Arrays als Parameter oder - noch schlimmer - das Einführen eines künstlichen Parameters NMAX in GAUSS. Dies ist eine wichtige Neuerung in Fortran 90 und wird auch vom Convex-Fortran-Compiler unterstützt, ebenso wie viele andere Array-Erweiterungen von Fortran 90.

    1         subroutine  gauss (n, a, x, b )
    2   
    3         implicit none
    4         intrinsic abs
    5   
    6         integer   n
    7         real*8    a(n,n), x(n), b(n) 
    8   
    9         integer  i, j, k, ipivot
   10         real*8   aa(n,n+1), fac, sto
   11   
   12         real*8   eps
   13         parameter(eps = 1.0d-10)
   14   
   15         ! Umspeichern der Matrix a und der rechten Seite b
   16         do i = 1, n
   17            do j = 1, n
   18               aa(i,j) = a(i,j)
   19            enddo
   20            aa(i,n+1) = b(i)
   21         enddo
   22   
   23         do i = 1, n-1
   24   
   25            ! Pivotisierung
   26            fac = 0.d0
   27            ipivot = i
   28            do j = i, n
   29               if ( abs(aa(j,i)) .gt. fac ) then
   30                  fac = abs(aa(j,i))
   31                  ipivot = j
   32               endif
   33            enddo
   34   
   35            if ( fac .lt. eps )  stop 'in gauss: Matrix singulaer'
   36   
   37            if ( ipivot .ne. i ) then
   38               do j = i, n+1
   39                  sto = aa(i,j)
   40                  aa(i,j) = aa(ipivot,j)
   41                  aa(ipivot,j) = sto
   42               enddo
   43            endif
   44   
   45            ! Transformation der Matrix auf obere Dreiecksgestalt
   46            do j = i+1, n
   47               fac = aa(j,i) / aa(i,i)
   48               do k = i+1, n+1
   49                  aa(j,k) = aa(j,k) - fac * aa(i,k)
   50               enddo
   51            enddo
   52   
   53         enddo
   54   
   55         ! Rueckwaertseinsetzen
   56         x(n) = aa(n,n+1) / aa(n,n)
   57         do i = n-1, 1, -1
   58            x(i) = aa(i,n+1)
   59            do j = n, i+1, -1
   60               x(i) = x(i) - x(j) * aa(i,j)
   61            enddo
   62            x(i) = x(i) / aa(i,i)
   63         enddo
   64         
   65         return
   66         end



rztms 26.2.96