root / src / gaussj.f90 @ 5
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 |