52 lines
1.2 KiB
Fortran
52 lines
1.2 KiB
Fortran
SUBROUTINE bandec(a,n,m1,m2,np,mp,al,mpl,indx,d)
|
|
INTEGER m1,m2,mp,mpl,n,np,indx(n)
|
|
REAL d,a(np,mp),al(np,mpl),TINY
|
|
PARAMETER (TINY=1.e-20)
|
|
INTEGER i,j,k,l,mm
|
|
REAL dum
|
|
mm=m1+m2+1
|
|
if(mm.gt.mp.or.m1.gt.mpl.or.n.gt.np) pause 'bad args in bandec'
|
|
l=m1
|
|
do 13 i=1,m1
|
|
do 11 j=m1+2-i,mm
|
|
a(i,j-l)=a(i,j)
|
|
11 continue
|
|
l=l-1
|
|
do 12 j=mm-l,mm
|
|
a(i,j)=0.
|
|
12 continue
|
|
13 continue
|
|
d=1.
|
|
l=m1
|
|
do 18 k=1,n
|
|
dum=a(k,1)
|
|
i=k
|
|
if(l.lt.n)l=l+1
|
|
do 14 j=k+1,l
|
|
if(abs(a(j,1)).gt.abs(dum))then
|
|
dum=a(j,1)
|
|
i=j
|
|
endif
|
|
14 continue
|
|
indx(k)=i
|
|
if(dum.eq.0.) a(k,1)=TINY
|
|
if(i.ne.k)then
|
|
d=-d
|
|
do 15 j=1,mm
|
|
dum=a(k,j)
|
|
a(k,j)=a(i,j)
|
|
a(i,j)=dum
|
|
15 continue
|
|
endif
|
|
do 17 i=k+1,l
|
|
dum=a(i,1)/a(k,1)
|
|
al(k,i-k)=dum
|
|
do 16 j=2,mm
|
|
a(i,j-1)=a(i,j)-dum*a(k,j)
|
|
16 continue
|
|
a(i,mm)=0.
|
|
17 continue
|
|
18 continue
|
|
return
|
|
END
|