Statistiques
| Révision :

root / src / gaussj.f90 @ 6

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

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