source: trunk/LMDZ.MARS/libf/aeronomars/inv.F @ 134

Last change on this file since 134 was 38, checked in by emillour, 14 years ago

Ajout du modè Martien (mon LMDZ.MARS.BETA, du 28/01/2011) dans le rértoire mars, pour pouvoir suivre plus facilement les modifs.
EM

File size: 2.5 KB
Line 
1      SUBROUTINE inv(A,N)
2
3      implicit none
4
5c=======================================================================
6c   Scheme A
7c
8c   subject:
9c   --------
10c
11c   Inversion of a matrix:
12c   Combinaison des routines ludcmp.f et lubksb.f du Numerical Recipes
13c=======================================================================
14
15      real       TINY
16      PARAMETER (TINY=1.0E-20)
17      real       AAMAX,DUM,SUM
18      integer    IMAX,I,II,J,K,L,LL,N
19      real       A(N,N),INDX(N),VV(N,N)
20
21      IMAX = 0
22      do I=1,N
23          AAMAX=0.
24          do J=1,N
25            IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J))
26          enddo
27          if (AAMAX.EQ.0.) then
28              write(*,*) 'Singular matrix.'
29              stop
30          endif
31          VV(I,1)=1./AAMAX
32      enddo
33      do J=1,N
34        IF (J.GT.1) THEN
35          do I=1,J-1
36            SUM=A(I,J)
37            IF (I.GT.1)THEN
38              do K=1,I-1
39                SUM=SUM-A(I,K)*A(K,J)
40              enddo
41              A(I,J)=SUM
42            ENDIF
43          enddo
44        ENDIF
45        AAMAX=0.
46        do I=J,N
47          SUM=A(I,J)
48          IF (J.GT.1)THEN
49            do K=1,J-1
50              SUM=SUM-A(I,K)*A(K,J)
51            enddo
52            A(I,J)=SUM
53          ENDIF
54          DUM=VV(I,1)*ABS(SUM)
55          IF (DUM.GE.AAMAX) THEN
56            IMAX=I
57            AAMAX=DUM
58          ENDIF
59        enddo
60        IF (J.NE.IMAX)THEN
61          do K=1,N
62            DUM=A(IMAX,K)
63            A(IMAX,K)=A(J,K)
64            A(J,K)=DUM
65          enddo
66          VV(IMAX,1)=VV(J,1)
67        ENDIF
68        INDX(J)=IMAX
69        if(abs(A(J,J)).LT.TINY) then
70              write(*,*) 'Pivot too small.'
71              stop
72        endif
73        IF(J.NE.N)THEN
74          DUM=1./A(J,J)
75          do I=J+1,N
76            A(I,J)=A(I,J)*DUM
77          enddo
78        ENDIF
79      enddo
80
81      do I=1,N
82         do J=1,N
83            VV(I,J) = 0.
84         enddo
85         VV(I,I) = 1.
86      enddo
87
88      do L=1,N
89        II=0
90        do I=1,N
91          LL=INDX(I)
92          SUM=VV(LL,L)
93          VV(LL,L)=VV(I,L)
94          IF (II.NE.0)THEN
95            do J=II,I-1
96              SUM=SUM-A(I,J)*VV(J,L)
97            enddo
98          ELSE IF (SUM.NE.0.) THEN
99            II=I
100          ENDIF
101          VV(I,L)=SUM
102        enddo
103        do I=N,1,-1
104          SUM=VV(I,L)
105          IF(I.LT.N)THEN
106            do J=I+1,N
107              SUM=SUM-A(I,J)*VV(J,L)
108            enddo
109          ENDIF
110          VV(I,L)=SUM/A(I,I)
111        enddo
112      enddo
113
114      do I=1,N
115        do L=1,N
116          A(I,L)=VV(I,L)
117        enddo
118      enddo
119
120      return
121      END
Note: See TracBrowser for help on using the repository browser.