source: trunk/LMDZ.GENERIC/libf/aeronostd/inv.F @ 3893

Last change on this file since 3893 was 3893, checked in by gmilcareck, 3 months ago

Remove all "call abort" and "stop" statement in LMDZ.GENERIC and replacing them by call abort_physic().

  • Property svn:executable set to *
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              call abort_physic("inv.F","Singular matrix",1)
29          endif
30          VV(I,1)=1./AAMAX
31      enddo
32      do J=1,N
33        IF (J.GT.1) THEN
34          do I=1,J-1
35            SUM=A(I,J)
36            IF (I.GT.1)THEN
37              do K=1,I-1
38                SUM=SUM-A(I,K)*A(K,J)
39              enddo
40              A(I,J)=SUM
41            ENDIF
42          enddo
43        ENDIF
44        AAMAX=0.
45        do I=J,N
46          SUM=A(I,J)
47          IF (J.GT.1)THEN
48            do K=1,J-1
49              SUM=SUM-A(I,K)*A(K,J)
50            enddo
51            A(I,J)=SUM
52          ENDIF
53          DUM=VV(I,1)*ABS(SUM)
54          IF (DUM.GE.AAMAX) THEN
55            IMAX=I
56            AAMAX=DUM
57          ENDIF
58        enddo
59        IF (J.NE.IMAX)THEN
60          do K=1,N
61            DUM=A(IMAX,K)
62            A(IMAX,K)=A(J,K)
63            A(J,K)=DUM
64          enddo
65          VV(IMAX,1)=VV(J,1)
66        ENDIF
67        INDX(J)=IMAX
68        if(abs(A(J,J)).LT.TINY) then
69              call abort_physic("inv.F", "Pivot too small",1)
70        endif
71        IF(J.NE.N)THEN
72          DUM=1./A(J,J)
73          do I=J+1,N
74            A(I,J)=A(I,J)*DUM
75          enddo
76        ENDIF
77      enddo
78
79      do I=1,N
80         do J=1,N
81            VV(I,J) = 0.
82         enddo
83         VV(I,I) = 1.
84      enddo
85
86      do L=1,N
87        II=0
88        do I=1,N
89          LL=INDX(I)
90          SUM=VV(LL,L)
91          VV(LL,L)=VV(I,L)
92          IF (II.NE.0)THEN
93            do J=II,I-1
94              SUM=SUM-A(I,J)*VV(J,L)
95            enddo
96          ELSE IF (SUM.NE.0.) THEN
97            II=I
98          ENDIF
99          VV(I,L)=SUM
100        enddo
101        do I=N,1,-1
102          SUM=VV(I,L)
103          IF(I.LT.N)THEN
104            do J=I+1,N
105              SUM=SUM-A(I,J)*VV(J,L)
106            enddo
107          ENDIF
108          VV(I,L)=SUM/A(I,I)
109        enddo
110      enddo
111
112      do I=1,N
113        do L=1,N
114          A(I,L)=VV(I,L)
115        enddo
116      enddo
117
118      return
119      END
Note: See TracBrowser for help on using the repository browser.