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 |