vcoord_gen 1.14.0
Loading...
Searching...
No Matches
matrix_utils.f90
Go to the documentation of this file.
1
4
20subroutine ludcmp(a,n,np,indx,d)
21 implicit none
22 integer,intent(in):: n,np
23 real,intent(inout):: a(np,np)
24 integer,intent(out):: indx(n)
25 real,intent(out):: d
26 integer i,j,k,imax
27 real aamax,sum,dum
28 real vv(n)
29! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30 d=1
31 do i=1,n
32 aamax=0
33 do j=1,n
34 if(abs(a(i,j))>aamax) aamax=abs(a(i,j))
35 enddo
36 if(aamax==0) then
37 d=0
38 return
39 endif
40 vv(i)=1/aamax
41 enddo
42 do j=1,n
43 do i=1,j-1
44 sum=a(i,j)
45 do k=1,i-1
46 sum=sum-a(i,k)*a(k,j)
47 enddo
48 a(i,j)=sum
49 enddo
50 aamax=0.
51 do i=j,n
52 sum=a(i,j)
53 do k=1,j-1
54 sum=sum-a(i,k)*a(k,j)
55 enddo
56 a(i,j)=sum
57 dum=vv(i)*abs(sum)
58 if(dum>=aamax) then
59 imax=i
60 aamax=dum
61 endif
62 enddo
63 if (j/=imax)then
64 do k=1,n
65 dum=a(imax,k)
66 a(imax,k)=a(j,k)
67 a(j,k)=dum
68 enddo
69 d=-d
70 vv(imax)=vv(j)
71 endif
72 indx(j)=imax
73 if(a(j,j)==0) then
74 d=0
75 return
76 endif
77 if(j/=n)then
78 dum=1/a(j,j)
79 do i=j+1,n
80 a(i,j)=a(i,j)*dum
81 enddo
82 endif
83 enddo
84end subroutine
85
100subroutine lubksb(a,n,np,indx,b)
101 implicit none
102 integer,intent(in):: n,np
103 real,intent(in):: a(np,np)
104 integer,intent(in):: indx(n)
105 real,intent(inout):: b(n)
106 integer i,j,ii,ll
107 real sum
108! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
109 ii=0
110 do i=1,n
111 ll=indx(i)
112 sum=b(ll)
113 b(ll)=b(i)
114 if (ii/=0)then
115 do j=ii,i-1
116 sum=sum-a(i,j)*b(j)
117 enddo
118 elseif(sum/=0) then
119 ii=i
120 endif
121 b(i)=sum
122 enddo
123 do i=n,1,-1
124 sum=b(i)
125 do j=i+1,n
126 sum=sum-a(i,j)*b(j)
127 enddo
128 b(i)=sum/a(i,i)
129 enddo
130end subroutine
subroutine lubksb(a, n, np, indx, b)
Lower and upper triangular back substitution.
subroutine ludcmp(a, n, np, indx, d)
This subprogram decomposes a matrix into a product of lower and upper triangular matrices.