home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
eispack-1.0-src.tgz
/
tar.out
/
contrib
/
eispack
/
tests
/
rgeispak.f
< prev
next >
Wrap
Text File
|
1996-09-28
|
15KB
|
384 lines
c
c this driver tests eispack for the class of real general matrices
c exhibiting the use of eispack to find all the eigenvalues and
c eigenvectors, only all the eigenvalues, or all the eigenvalues and
c some of the corresponding eigenvectors, using orthogonal or
c elementary similarity transformations to reduce the full matrix to
c hessenberg form, with and without balancing of the full matrix.
c
c this driver is catalogued as eispdrv4(rgeispak).
c
c the dimension of a,z,rm1, and asave should be nm by nm.
c the dimension of wr,wi,select,slhold,int,scale,ort,norm,rv1,
c and rv2 should be nm.
c the dimension of ahold should be nm by nm.
c here nm = 20.
c
double precision a(20,20),z(20,20),asave(20,20),rm1(20,20),
x ahold( 20, 20),ort( 20),wr( 20),wi(20),
x scale( 20),rv1( 20),rv2( 20),norm( 20),
x tcrit,machep,resdul
integer int( 20),low,upp,error,cp,cp1,cp2
logical select( 20),slhold( 20),cplx
data ireadc/5/,iwrite/6/
c
c .......... machep is a machine dependent parameter specifying
c the relative precision of floating point arithmetic.
machep = 1.0d0
1 machep = 0.5d0*machep
if (1.0d0 + machep .gt. 1.0d0 ) go to 1
machep = 2.0d0*machep
c
c
nm = 20
open(unit=1,file='rgdatai')
open(unit=5,file='rgdatas')
rewind 1
rewind 5
10 call rmatin(nm,n,a,ahold,0)
write(iwrite,20) n
20 format(37h1the real general matrix a of order,
x i4,23h is (printed by rows) )
do 30 i = 1,n
30 write(iwrite,40) (a(i,j),j=1,n)
40 format(/(1x,1p5d24.16))
read(ireadc,50) mm,(select(i),i=1,n)
50 format(i4/(72l1))
do 60 i = 1,n
60 slhold(i) = select(i)
c
c mm and select are read from sysin after the matrix is
c generated. mm specifies to invit the maximum number of
c eigenvectors that will be computed. select contains information
c about which eigenvectors are desired.
c
do 510 icall = 1,12
icall2 = mod(icall,3)
if( icall2 .ne. 0 ) go to 80
do 70 i = 1,n
70 select(i) = slhold(i)
80 if( icall .ne. 1 ) call rmatin(nm,n,a,ahold,1)
go to (90,100,110,120,130,140,160,165,170,175,180,185), icall
c
c rgewz
c invoked from driver subroutine rg.
c
90 write(iwrite,903)
903 format(41h1the eigenvalues and eigenvectors of the ,
x 50hreal general matrix follow. this matrix has been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27helementary transformations. )
call rg(nm,n,a,wr,wi,1,z,int,scale,error)
write(iwrite,905) error
905 format(//28h *****error from hqr2***** = ,i4)
go to 230
c
c rgew
c invoked from driver subroutine rg.
c
100 write(iwrite,1003)
1003 format(24h1the eigenvalues of the ,
x 50hreal general matrix follow. this matrix has been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27helementary transformations. )
call rg(nm,n,a,wr,wi,0,a,int,scale,error)
write(iwrite,1005) error
1005 format(//27h *****error from hqr***** = ,i4)
go to 230
c
c rgew1z
c
110 write(iwrite,1103)
1103 format(50h1the eigenvalues and selected eigenvectors of the ,
x 50hreal general matrix follow. this matrix has been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27helementary transformations. )
call balanc(nm,n,a,low,upp,scale)
call elmhes(nm,n,low,upp,a,int)
do 112 i = 1,n
do 112 j = 1,n
112 asave(i,j) = a(i,j)
call hqr(nm,n,low,upp,a,wr,wi,error)
write(iwrite,113) error,low,upp
113 format(//35h *****error from hqr,low,upp***** = ,3i4)
call invit(nm,n,asave,wr,wi,select,mm,m,z,error,rm1,rv1,rv2)
write(iwrite,114) error
114 format(//29h *****error from invit***** = ,i4)
call elmbak(nm,low,upp,asave,int,m,z)
call balbak(nm,n,low,upp,scale,m,z)
go to 230
c
c rgnewz
c
120 write(iwrite,1203)
1203 format(41h1the eigenvalues and eigenvectors of the ,
x 54hreal general matrix follow. this matrix has not been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27helementary transformations. )
call elmhes(nm,n,1,n,a,int)
call eltran(nm,n,1,n,a,int,z)
call hqr2(nm,n,1,n,a,wr,wi,z,error)
write(iwrite,1205) error
1205 format(//28h *****error from hqr2***** = ,i4)
go to 230
c
c rgnew
c
130 write(iwrite,1303)
1303 format(24h1the eigenvalues of the ,
x 54hreal general matrix follow. this matrix has not been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27helementary transformations. )
call elmhes(nm,n,1,n,a,int)
call hqr(nm,n,1,n,a,wr,wi,error)
write(iwrite,1305) error
1305 format(//27h *****error from hqr***** = ,i4)
go to 230
c
c rgnew1z
c
140 write(iwrite,1403)
1403 format(50h1the eigenvalues and selected eigenvectors of the ,
x 54hreal general matrix follow. this matrix has not been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27helementary transformations. )
call elmhes(nm,n,1,n,a,int)
do 142 i = 1,n
do 142 j = 1,n
142 asave(i,j) = a(i,j)
call hqr(nm,n,1,n,a,wr,wi,error)
write(iwrite,143) error
143 format(//27h *****error from hqr***** = ,i4)
call invit(nm,n,asave,wr,wi,select,mm,m,z,error,rm1,rv1,rv2)
write(iwrite,144) error
144 format(//29h *****error from invit***** = ,i4)
call elmbak(nm,1,n,asave,int,m,z)
go to 230
c
c rgowz
c
160 write(iwrite,1603)
1603 format(41h1the eigenvalues and eigenvectors of the ,
x 50hreal general matrix follow. this matrix has been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27horthogonal transformations. )
call balanc(nm,n,a,low,upp,scale)
call orthes(nm,n,low,upp,a,ort)
call ortran(nm,n,low,upp,a,ort,z)
call hqr2(nm,n,low,upp,a,wr,wi,z,error)
write(iwrite,1605) error,low,upp
1605 format(//36h *****error from hqr2,low,upp***** = ,3i4)
call balbak(nm,n,low,upp,scale,n,z)
go to 230
c
c rgow
c
165 write(iwrite,1653)
1653 format(24h1the eigenvalues of the ,
x 50hreal general matrix follow. this matrix has been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27horthogonal transformations. )
call balanc(nm,n,a,low,upp,scale)
call orthes(nm,n,low,upp,a,ort)
call hqr(nm,n,low,upp,a,wr,wi,error)
write(iwrite,1655) error,low,upp
1655 format(//35h *****error from hqr,low,upp***** = ,3i4)
go to 230
c
c rgow1z
c
170 write(iwrite,1703)
1703 format(50h1the eigenvalues and selected eigenvectors of the ,
x 50hreal general matrix follow. this matrix has been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27horthogonal transformations. )
call balanc(nm,n,a,low,upp,scale)
call orthes(nm,n,low,upp,a,ort)
do 172 i = 1,n
do 172 j = 1,n
172 asave(i,j) = a(i,j)
call hqr(nm,n,low,upp,a,wr,wi,error)
write(iwrite,173) error,low,upp
173 format(//35h *****error from hqr,low,upp***** = ,3i4)
call invit(nm,n,asave,wr,wi,select,mm,m,z,error,rm1,rv1,rv2)
write(iwrite,174) error
174 format(//29h *****error from invit***** = ,i3)
call ortbak(nm,low,upp,asave,ort,m,z)
call balbak(nm,n,low,upp,scale,m,z)
go to 230
c
c rgnowz
c
175 write(iwrite,1753)
1753 format(41h1the eigenvalues and eigenvectors of the ,
x 54hreal general matrix follow. this matrix has not been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27horthogonal transformations. )
call orthes(nm,n,1,n,a,ort)
call ortran(nm,n,1,n,a,ort,z)
call hqr2(nm,n,1,n,a,wr,wi,z,error)
write(iwrite,1755) error
1755 format(//28h *****error from hqr2***** ,i4)
go to 230
c
c rgnow
c
180 write(iwrite,1803)
1803 format(24h1the eigenvalues of the ,
x 54hreal general matrix follow. this matrix has not been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27horthogonal transformations. )
call orthes(nm,n,1,n,a,ort)
call hqr(nm,n,1,n,a,wr,wi,error)
write(iwrite,1805) error
1805 format(//27h *****error from hqr***** = ,i3)
go to 230
c
c rgnow1z
c
185 write(iwrite,1853)
1853 format(50h1the eigenvalues and selected eigenvectors of the ,
x 54hreal general matrix follow. this matrix has not been /
x 56h balanced and has been reduced to hessenberg form using ,
x 27horthogonal transformations. )
call orthes(nm,n,1,n,a,ort)
do 187 i = 1,n
do 187 j = 1,n
187 asave(i,j) = a(i,j)
call hqr(nm,n,1,n,a,wr,wi,error)
write(iwrite,188) error
188 format(//27h *****error from hqr***** = ,i3)
call invit(nm,n,asave,wr,wi,select,mm,m,z,error,rm1,rv1,rv2)
write(iwrite,189) error
189 format(//29h *****error from invit***** = ,i3)
call ortbak(nm,1,n,asave,ort,m,z)
c
230 if( icall2 .eq. 0 ) go to 250
write(iwrite,240) (i,wr(i),wi(i),i=1,n)
240 format(//29h all the eigenvalues computed/
x 2(i3,3x,1p2d24.16,2x))
go to 270
250 write(iwrite,260) (i,select(i),wr(i),wi(i),i=1,n)
260 format(//51h all the eigenvalues computed and those eigenvalues
x ,9h selected/2(i3,1x,l1,1x,1p2d24.16,2x))
270 if( error .gt. 0 ) go to 510
if( icall2 .eq. 2 ) go to 510
call rmatin(nm,n,a,ahold,1)
if( icall2 .ne. 0 ) go to 280
call rgw1zr(nm,n,a,wr,wi,select,m,z,norm,resdul)
go to 290
280 call rgwzr(nm,n,a,wr,wi,z,norm,resdul)
290 tcrit = resdul/(dfloat(10*n)*machep)
write(iwrite,300) tcrit,resdul
300 format(///48h as a guide to evaluating the performance of the,
x 53h eispack codes, a number x, related to the 1-norm /
x 56h of the residual matrix, may be normalized to the number,
x 56h y by dividing by the product of the machine precision/
x 57h machep and 10*n where n is the order of the matrix.,
x 36h the eispack codes have performed /
x 56h (well,satisfactorily,poorly) according as the ratio y ,
x 54h is (less than 1, less than 100, greater than 100)./
x 23h for this run, y is =,1pd14.6,11h with x =,d14.6)
nm2 = n-2
k = 1
if( icall2 .eq. 0 ) go to 390
310 if( k .gt. n ) go to 510
if( wi(k) .eq. 0.0d0 ) go to 360
if( k .gt. nm2 ) go to 340
if( wi(k+2) .eq. 0.0d0 ) go to 330
c both digenvectors are complex.
write(iwrite,320)
x wr(k),wi(k),wr(k+2),wi(k+2),norm(k),norm(k+2),
x (z(i,k),z(i,k+1),z(i,k+2),z(i,k+3),i=1,n)
320 format(///1x,2(19x,15heigenvalue of a,20x)/1x,2(1p2d24.16,6x)
x //1x,2(8x,39h1-norm of corresponding residual vector,7x)/
x 1x,2(6x,26h!!ax-l*x!!/(!!x!!*!!a!!) =,d16.8,6x)//
x 1x,2(14x,25hcorresponding eigenvector,15x)/(1x,
x 2d24.16,6x,2d24.16,6x))
k = k+4
go to 310
c one complex eigenvector and one real eigenvector in that
c order.
330 write(iwrite,320)
x wr(k+2),wi(k+2),wr(k),wi(k),norm(k+2),norm(k),
x (z(i,k+2),wi(k+2),z(i,k),z(i,k+1),i=1,n)
k = k+3
go to 310
c one complex eigenvector.
340 write(iwrite,350) wr(k),wi(k),norm(k),(z(i,k),z(i,k+1),i=1,n)
350 format(///1x,19x,15heigenvalue of a,20x/1x,1p2d24.16,6x//
x 1x,8x,39h1-norm of corresponding residual vector,7x/
x 1x,6x,26h!!ax-l*x!!/(!!x!!*!!a!!) =,d16.8,6x//
x 1x,14x,25hcorresponding eigenvector,15x/(1x,2d24.16,6x))
go to 510
360 if( k .eq. n ) go to 380
if( wi(k+1) .eq. 0.0d0 ) go to 370
c one real eigenvector and one complex eigenvector in that
c order.
write(iwrite,320)
x wr(k),wi(k),wr(k+1),wi(k+1),norm(k),norm(k+1),
x (z(i,k),wi(k),z(i,k+1),z(i,k+2),i=1,n)
k = k+3
go to 310
c both eigenvectors are real.
370 write(iwrite,320)
x wr(k),wi(k),wr(k+1),wi(k+1),norm(k),norm(k+1),
x (z(i,k),wi(k),z(i,k+1),wi(k+1),i=1,n)
k = k+2
go to 310
c one real eigenvector.
380 write(iwrite,350) wr(k),wi(k),norm(k),(z(i,k),wi(k),i=1,n)
go to 510
390 l = 1
cplx = .false.
400 cp1 = -1
410 if( k .gt. n ) if( cp1 ) 510, 490, 500
if( .not. cplx ) go to 412
cplx = .false.
go to 415
412 if( wi(k) .ne. 0.0d0 ) cplx = .true.
415 kold = k
k = k+1
if( .not. select(kold) ) go to 410
lold = l
l = l+1
cp = 0
if( wi(kold) .eq. 0.0d0 ) go to 420
cp = 1
if( cplx ) k = k+1
l = l+1
420 if( cp1 ) 430, 440, 440
430 lp1 = lold
kp1 = kold
cp1 = cp
go to 410
440 lp2 = lold
kp2 = kold
cp2 = cp
cp = cp1*2 + cp2 + 1
go to (450,460,470,480), cp
450 write(iwrite,320) wr(kp1),wi(kp1),wr(kp2),wi(kp2),norm(kp1),
x norm(kp2),(z(i,lp1),wi(kp1),z(i,lp2),wi(kp2),i=1,n)
go to 400
460 write(iwrite,320) wr(kp1),wi(kp1),wr(kp2),wi(kp2),norm(kp1),
x norm(kp2),(z(i,lp1),wi(kp1),z(i,lp2),z(i,lp2+1),i=1,n)
go to 400
470 kold = kp1
kp1 = kp2
kp2 = kold
lold = lp1
lp1 = lp2
lp2 = lold
go to 460
480 write(iwrite,320) wr(kp1),wi(kp1),wr(kp2),wi(kp2),norm(kp1),
x norm(kp2),(z(i,lp1),z(i,lp1+1),z(i,lp2),z(i,lp2+1),i=1,n)
go to 400
490 write(iwrite,350) wr(kp1),wi(kp1),norm(kp1),
x (z(i,lp1),wi(kp1),i=1,n)
go to 510
500 write(iwrite,350) wr(kp1),wi(kp1),norm(kp1),
x (z(i,lp1),z(i,lp1+1),i=1,n)
510 continue
go to 10
end