NCEPLIBS-sp  2.3.3
All Files Functions
lapack_gen.F
1 #if defined LINUX || defined APPLE
2 !----------------------------------------------------------------------
3 ! From Numerical Recipes
4 ! added two Numerical Recipes routines for matrix inversion
5 ! LUBKSB - solves a system of linear equations, follows call to LUDCMP
6 ! LUDCMP - replaces an NxN matrix a with the LU decomposition
7 !
8 ! 2012-11-05 E.Mirvis separated this generic LU from the splat.F
9 !----------------------------------------------------------------------
10  SUBROUTINE lubksb(A,N,NP,INDX,B)
11  REAL A(NP,NP),B(N)
12  INTEGER INDX(N)
13  ii=0
14  DO 12 i=1,n
15  ll=indx(i)
16  sum=b(ll)
17  b(ll)=b(i)
18  IF (ii.NE.0)THEN
19  DO 11 j=ii,i-1
20  sum=sum-a(i,j)*b(j)
21  11 CONTINUE
22  ELSE IF (sum.NE.0.) THEN
23  ii=i
24  ENDIF
25  b(i)=sum
26  12 CONTINUE
27  DO 14 i=n,1,-1
28  sum=b(i)
29  IF(i.LT.n)THEN
30  DO 13 j=i+1,n
31  sum=sum-a(i,j)*b(j)
32  13 CONTINUE
33  ENDIF
34  b(i)=sum/a(i,i)
35  14 CONTINUE
36  RETURN
37  END
38 
39  SUBROUTINE ludcmp(A,N,NP,INDX)
40 C PARAMETER (NMAX=400,TINY=1.0E-20)
41  parameter(tiny=1.0e-20)
42 C==EM==^^^
43 C
44  REAL A(NP,NP),VV(N),D
45 C REAL A(NP,NP),VV(NMAX),D
46 C==EM==^^^
47  INTEGER INDX(N)
48  d=1.
49  DO 12 i=1,n
50  aamax=0.
51  DO 11 j=1,n
52  IF (abs(a(i,j)).GT.aamax) aamax=abs(a(i,j))
53  11 CONTINUE
54  IF (aamax.EQ.0.) print *, 'SINGULAR MATRIX.'
55  vv(i)=1./aamax
56  12 CONTINUE
57  DO 19 j=1,n
58  IF (j.GT.1) THEN
59  DO 14 i=1,j-1
60  sum=a(i,j)
61  IF (i.GT.1)THEN
62  DO 13 k=1,i-1
63  sum=sum-a(i,k)*a(k,j)
64  13 CONTINUE
65  a(i,j)=sum
66  ENDIF
67  14 CONTINUE
68  ENDIF
69  aamax=0.
70  DO 16 i=j,n
71  sum=a(i,j)
72  IF (j.GT.1)THEN
73  DO 15 k=1,j-1
74  sum=sum-a(i,k)*a(k,j)
75  15 CONTINUE
76  a(i,j)=sum
77  ENDIF
78  dum=vv(i)*abs(sum)
79  IF (dum.GE.aamax) THEN
80  imax=i
81  aamax=dum
82  ENDIF
83  16 CONTINUE
84  IF (j.NE.imax)THEN
85  DO 17 k=1,n
86  dum=a(imax,k)
87  a(imax,k)=a(j,k)
88  a(j,k)=dum
89  17 CONTINUE
90  d=-d
91  vv(imax)=vv(j)
92  ENDIF
93  indx(j)=imax
94  IF(j.NE.n)THEN
95  IF(a(j,j).EQ.0.)a(j,j)=tiny
96  dum=1./a(j,j)
97  DO 18 i=j+1,n
98  a(i,j)=a(i,j)*dum
99  18 CONTINUE
100  ENDIF
101  19 CONTINUE
102  IF(a(n,n).EQ.0.)a(n,n)=tiny
103  RETURN
104  END
105 #endif