Statistiques
| Révision :

root / src / gaussj.f90 @ 2

Historique | Voir | Annoter | Télécharger (2,06 ko)

1

    
2
      SUBROUTINE gaussj(a,n,np,b,m,mp)
3

    
4
     IMPLICIT NONE
5

    
6
     INTEGER, PARAMETER :: KINT=KIND(1)
7
     INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
8

    
9

    
10
      INTEGER(KINT) :: m,mp,n,np,NMAX
11
      REAL(KREAL) :: a(np,np),b(np,mp)
12
      PARAMETER (NMAX=50)
13
      INTEGER(KINT) :: i,icol,irow,j,k,l,ll,indxc(NMAX),indxr(NMAX),ipiv(NMAX)
14
      REAL(KREAL) :: big,dum,pivinv
15
      do 11 j=1,n
16
        ipiv(j)=0
17
11    continue
18
      do 22 i=1,n
19
        big=0.d0
20
        do 13 j=1,n
21
          if(ipiv(j).ne.1)then
22
            do 12 k=1,n
23
              if (ipiv(k).eq.0) then
24
                if (abs(a(j,k)).ge.big)then
25
                  big=abs(a(j,k))
26
                  irow=j
27
                  icol=k
28
                endif
29
              else if (ipiv(k).gt.1) then
30
                pause 'singular matrix in gaussj'
31
              endif
32
12          continue
33
          endif
34
13      continue
35
        ipiv(icol)=ipiv(icol)+1
36
        if (irow.ne.icol) then
37
          do 14 l=1,n
38
            dum=a(irow,l)
39
            a(irow,l)=a(icol,l)
40
            a(icol,l)=dum
41
14        continue
42
          do 15 l=1,m
43
            dum=b(irow,l)
44
            b(irow,l)=b(icol,l)
45
            b(icol,l)=dum
46
15        continue
47
        endif
48
        indxr(i)=irow
49
        indxc(i)=icol
50
        if (a(icol,icol).eq.0.d0) pause 'singular matrix in gaussj'
51
        pivinv=1.d0/a(icol,icol)
52
        a(icol,icol)=1.d0
53
        do 16 l=1,n
54
          a(icol,l)=a(icol,l)*pivinv
55
16      continue
56
        do 17 l=1,m
57
          b(icol,l)=b(icol,l)*pivinv
58
17      continue
59
        do 21 ll=1,n
60
          if(ll.ne.icol)then
61
            dum=a(ll,icol)
62
            a(ll,icol)=0.d0
63
            do 18 l=1,n
64
              a(ll,l)=a(ll,l)-a(icol,l)*dum
65
18          continue
66
            do 19 l=1,m
67
              b(ll,l)=b(ll,l)-b(icol,l)*dum
68
19          continue
69
          endif
70
21      continue
71
22    continue
72
      do 24 l=n,1,-1
73
        if(indxr(l).ne.indxc(l))then
74
          do 23 k=1,n
75
            dum=a(k,indxr(l))
76
            a(k,indxr(l))=a(k,indxc(l))
77
            a(k,indxc(l))=dum
78
23        continue
79
        endif
80
24    continue
81
      return
82
      END