C-----HLEVEC (EIGENVECTORS OF HERMITIAN MATRICES)----------------------- C C CONTAINS MAIN PROGRAM FOR COMPUTING AN EIGENVECTOR CORRESPONDING C TO EACH OF A SET OF EIGENVALUES THAT HAVE BEEN COMPUTED C ACCURATELY BY THE CORRESPONDING LANCZOS EIGENVALUE PROGRAM C (HLEVAL) FOR HERMITIAN MATRICES. THIS PROGRAM COULD BE C MODIFIED TO COMPUTE ADDITIONAL EIGENVECTORS FOR ANY C MULTIPLE EIGENVALUE OF THE GIVEN A-MATRIX. THE AMOUNT OF C ADDITIONAL COMPUTATION REQUIRED BY SUCH A MODIFICATION WOULD C DEPEND UPON THE GIVEN MATRIX AND UPON WHICH PART OF THE C SPECTRUM WAS INVOLVED. C C THE LANCZOS EIGENVECTOR COMPUTATIONS ASSUME THAT EACH C EIGENVALUE THAT IS BEING CONSIDERED HAS CONVERGED AS AN C EIGENVALUE OF THE LANCZOS TRIDIAGONAL MATRICES. C C PORTABILITY: C THIS PROGRAM IS NOT PORTABLE BECAUSE OF THE USE OF COMPLEX*16 C VARIABLES. MOREOVER, THE PFORT VERIFIER IDENTIFIED THE C FOLLOWING ADDITIONAL NONPORTABLE CONSTRUCTIONS: C C 1. DATA/MACHEP/ STATEMENT C 2. ALL READ(5,*) STATEMENTS (FREE FORMAT) C 3. FORMAT(20A4) USED WITH THE EXPLANATORY HEADER, EXPLAN C 4. HEXADECIMAL FORMAT (4Z20) USED IN ALPHA/BETA FILES 1 AND 2. C C IMPORTANT NOTE: PROGRAM ALLOWS ENLARGEMENT OF THE ALPHA, BETA C ARRAYS. IN PARTICULAR, IF ANY ONE OF THE EIGENVALUES SUPPLIED C IS T-SIMPLE AND NOT CLOSE TO A SPURIOUS T-EIGENVALUE, THE PROGRAM C REQUIRES THAT KMAX BE AT LEAST 11*MEV/8 + 12. IF KMAX IS NOT C THIS LARGE, THEN THE PROGRAM WILL RESET KMAX TO THIS SIZE C AND EXTEND THE ALPHA, BETA HISTORY IF REQUIRED. C THUS, THE DIMENSIONS OF THE ALPHA AND BETA ARRAYS MUST BE C LARGE ENOUGH TO ALLOW FOR THIS POSSIBILITY. C REMEMBER THAT THE BETA ARRAY, BETA(J), IS SUCH THAT C J = 1,..., KMAX+1. SO IF THE KMAX USED BY THE PROGRAM C IS TO BE 3000, THEN BETA MUST BE OF LENGTH AT LEAST 3001. C C C----------------------------------------------------------------------- COMPLEX*16 V1(1000),V2(1000),VS(1000),RITVEC(10000),ZEROC,TEMPC DOUBLE PRECISION ALPHA(1000),BETA(1001),GR(1000),GC(1000) DOUBLE PRECISION TVEC(20000),GOODEV(50),EVNEW(50) DOUBLE PRECISION EVAL,EVALN,TOLN,TTOL,ERTOL,ALFA,BATA DOUBLE PRECISION MULTOL,SCALE0,STUTOL,BTOL,LB,UB DOUBLE PRECISION ONE,ZERO,MACHEP,EPSM,TEMP,SUM,ERRMIN,BKMIN DOUBLE PRECISION RELTOL,ERROR,TERROR,TLAST(50) REAL G(1000),AMINGP(50),TMINGP(50),EXPLAN(20) REAL TERR(50),ERR(50),ERRDGP(50),RNORM(50),TBETA(50) INTEGER MP(50),M1(50),M2(50),MA(50),ML(50),MINT(50),MFIN(50) INTEGER SVSEED,SVSOLD,RHSEED,IDELTA(50),MULEVA(50) INTEGER MBOUND,NTVCON,SVTVEC,TVSTOP,LVCONT,ERCONT,TFLAG DOUBLE PRECISION DABS, DMAX1, DSQRT, DFLOAT REAL ABS INTEGER IABS C----------------------------------------------------------------------- EXTERNAL CMATV DATA MACHEP/Z3410000000000000/ EPSM = 2.D0*MACHEP C----------------------------------------------------------------------- C C ARRAYS MUST BE DIMENSIONED AS FOLLOWS: C 1. ALPHA: >= KMAXN, BETA: >= (KMAXN+1) WHERE KMAXN, THE C LARGEST SIZE T-MATRIX CONSIDERED BY THE PROGRAM, C IS THE LARGER OF THE SIZE OF THE ALPHA, BETA HISTORY C PROVIDED ON FILE 2 (IF ANY ) AND THE SIZE WHICH THE C PROGRAM SPECIFIES INTERNALLY, THIS LATTER IS ALWAYS C < = 11*MEV / 8 + 12, WHERE MEV IS THE SIZE C T-MATRIX THAT WAS USED IN THE CORRESPONDING EIGENVALUE C COMPUTATIONS. C 2. V1: >= MAX(N,KMAX/2) C 3. V2, VS: >= N C 4. G: >= MAX(N,KMAX). GR, GC: >= N C 5. RITVEC: >= N*NGOOD, WHERE NGOOD IS NUMBER OF EIGENVALUES C SUPPLIED TO THIS PROGRAM. C 6. TVEC: >= CUMULATIVE LENGTH OF ALL THE T-EIGENVECTORS C NEEDED TO GENERATE THE DESIRED RITZ VECTORS. AN EDUCATED C GUESS AT AN APPROPRIATE LENGTH CAN BE OBTAINED BY RUNNING THE C PROGRAM WITH THE FLAG MBOUND = 1 AND MULTIPLYING THE C RESULTING SIZE BY 5/4. C 7. GOODEV, EVNEW, AMINGP, TMINGP, TERR, ERR, ERRGDP, RNORM, TBETA C TLAST, MP, MA, M1, M2, MINT, MFIN, MULEVA, AND IDELTA ALL C MUST BE AT LEAST NGOOD. C C----------------------------------------------------------------------- C OUTPUT HEADER WRITE(6,10) 10 FORMAT(/' LANCZOS EIGENVECTOR PROCEDURE FOR HERMITIAN MATRICES'/) C C SET PROGRAM PARAMETERS C USER MUST NOT MODIFY SCALE0 SCALE0 = 5.0D0 ZERO = 0.0D0 ZEROC = DCMPLX(ZERO,ZERO) ONE = 1.0D0 MPMIN = -1000 C CONVERGENCE TOLERANCE FOR T-EIGENVECTORS FOR RITZ VECTORS ERTOL = 1.D-10 ISREAL = 0 C C READ USER-SPECIFIED PARAMETER FROM INPUT FILE 5 (FREE FORMAT) C C READ USER-PROVIDED HEADER FOR RUN READ(5,20) EXPLAN WRITE(6,20) EXPLAN 20 FORMAT(20A4) C C READ IN THE MAXIMUM PERMISSIBLE DIMENSIONS FOR THE TVEC ARRAY C (MDIMTV), FOR THE RITVEC ARRAY (MDIMRV), AND FOR THE BETA C ARRAY (MBETA). C READ(5,20) EXPLAN READ(5,*) MDIMTV, MDIMRV, MBETA C C READ IN RELATIVE TOLERANCE (RELTOL) USED IN DETERMINING C APPROPRIATE SIZES FOR THE T-MATRICES USED IN THE EIGENVECTOR C COMPUTATIONS C READ(5,20) EXPLAN READ(5,*) RELTOL C C C SET FLAGS TO 0 OR 1: C MBOUND = 1: PROGRAM TERMINATES AFTER COMPUTING 1ST GUESSES C ON APPROPRIATE T-SIZES FOR USE IN THE RITZ VECTOR C COMPUTATIONS C NTVCON = 0: PROGRAM TERMINATES IF THE TVEC ARRAY IS NOT C LARGE ENOUGH TO HOLD ALL THE T-EIGENVECTORS REQUIRED. C SVTVEC = 0: THE T-EIGENVECTORS ARE NOT WRITTEN TO FILE 11 C UNLESS TVSTOP = 1 C SVTVEC = 1: WRITE THE T-EIGENVECTORS TO FILE 11. C TVSTOP = 1: PROGRAM TERMINATES AFTER COMPUTING THE C T-EIGENVECTORS C LVCONT = 0: PROGRAM TERMINATES IF THE NUMBER OF T-EIGENVECTORS C COMPUTED IS NOT EQUAL TO THE NUMBER OF RITZ C VECTORS REQUESTED. C ERCONT = 0: MEANS FOR ANY GIVEN EIGENVALUE, A RITZ VECTOR C WILL NOT BE COMPUTED FOR THAT EIGENVALUE UNLESS C A T-EIGENVECTOR HAS BEEN IDENTIFIED WITH A LAST C COMPONENT WHICH SATISFIES THE SPECIFIED C CONVERGENCE CRITERION. C ERCONT = 1: MEANS FOR ANY GIVEN EIGENVALUE, A RITZ VECTOR C WILL BE COMPUTED. IF A T-EIGENVECTOR CANNOT C BE IDENTIFIED WHICH SATISFIES THE LAST C COMPONENT CRITERION, THEN THE PROGRAM WILL C USE THE T-VECTOR THAT CAME CLOSEST TO C SATISFYING THE CRITERION C IWRITE = 1: EXTENDED OUTPUT OF INTERMEDIATE COMPUTATIONS C IS WRITTEN TO FILE 6 C IREAD = 0: ALPHA/BETA FILE IS REGENERATED C IREAD = 1: ALPHA/BETA FILE USED IN EIGENVALUE COMPUTATIONS C IS READ IN AND EXTENDED IF NECESSARY. IN BOTH C CASES IREAD = 0 OR 1, THE LANCZOS VECTORS ARE C ALWAYS REGENERATED FOR THE RITZ VECTOR C COMPUTATIONS C READ(5,20) EXPLAN READ(5,*) MBOUND,NTVCON,SVTVEC,IREAD C READ(5,20) EXPLAN READ(5,*) TVSTOP,LVCONT,ERCONT,IWRITE IF (TVSTOP.EQ.1) SVTVEC = 1 C C READ IN SEED FOR GENERATING RANDOM STARTING VECTOR FOR THE C INVERSE ITERATION ON THE T-MATRICES. C READ(5,20) EXPLAN READ(5,*) RHSEED C C READ IN MATNO = MATRIX/RUN IDENTIFICATION NUMBER AND C N = ORDER OF A-MATRIX C READ(5,20) EXPLAN READ(5,*) MATNO,N C IF MATNO < 0, THEN MATRIX SUPPLIED IS REAL AND USER WANTS TO C CHECK ON THE T-MULTIPLICITY OF THE EIGENVALUES OF GIVEN MATRIX IF(MATNO.GT.0) GO TO 30 ISREAL = 1 MATNO = - MATNO 30 CONTINUE C C----------------------------------------------------------------------- C INITIALIZE THE ARRAYS FOR THE USER-SPECIFIED MATRIX C AND PASS THE STORAGE LOCATIONS OF THESE ARRAYS TO THE C MATRIX-VECTOR MULTIPLY SUBROUTINE CMATV. C CALL USPEC(N,MATNO) C C----------------------------------------------------------------------- C MASK UNDERFLOW AND OVERFLOW CALL MASK C C----------------------------------------------------------------------- C C WRITE RUN PARAMETERS OUT TO FILE 6 C WRITE(6,40) MATNO,N 40 FORMAT(/' MATRIX IDENTIFICATION NO. = ',I10,' ORDER OF A = ',I5) C WRITE(6,50) MBOUND,NTVCON,SVTVEC,IREAD 50 FORMAT(/3X,'MBOUND',3X,'NTVCON',3X,'SVTVEC',3X,'IREAD'/3I9,I8) C WRITE(6,60) TVSTOP,LVCONT,ERCONT,IWRITE 60 FORMAT(/3X,'TVSTOP',3X,'LVCONT',3X,'ERCONT',3X,'IWRITE'/4I9) C WRITE(6,70) MDIMTV,MDIMRV,MBETA 70 FORMAT(/3X,'MDIMTV',3X,'MDIMRV',3X,'MBETA'/2I9,I8) C WRITE(6,80) RELTOL,RHSEED 80 FORMAT(/7X,'RELTOL',3X,'RHSEED'/E13.4,I9) C C C FROM FILE 3 READ IN THE NUMBER OF EIGENVALUES (NGOOD) FOR WHICH C EIGENVECTORS ARE REQUESTED, THE ORDER (MEV) OF THE LANCZOS C TRIDIAGONAL MATRIX USED IN COMPUTING THESE EIGENVALUES, THE C ORDER (NOLD) OF THE USER-SPECIFIED MATRIX USED IN THE EIGENVALUE C COMPUTATIONS, THE SEED (SVSEED) USED FOR GENERATING THE STARTING C VECTOR THAT WAS USED IN THOSE LANCZOS EIGENVALUE COMPUTATIONS, C AND THE MATRIX/RUN IDENTIFICATION NUMBER (MATOLD) USED IN THOSE C COMPUTATIONS. ALSO READ IN THE NUMBER (NDIS) OF DISTINCT C EIGENVALUES OF T(1,MEV) THAT WERE COMPUTED BUT THIS VALUE IS C NOT USED IN THE EIGENVECTOR COMPUTATIONS. C READ(3,90) NGOOD,NDIS,MEV,NOLD,SVSEED,MATOLD 90 FORMAT(4I6,I12,I8) C C READ IN THE T-MULTIPLICITY TOLERANCE USED IN THE BISEC SUBROUTINE C DURING THE COMPUTATION OF THE GIVEN EIGENVALUES. C ALSO READ IN THE FLAG IB. IF IB < 0, THEN SOME BETA(I) IN THE C T-MATRIX FILE PROVIDED ON FILE 2 FAILED THE ORTHOGONALITY C TEST IN THE TNORM SUBROUTINE. USER SHOULD NOTE THAT THIS C VECTOR PROGRAM PROCEEDS INDEPENDENTLY OF THE SIZE OF THE BETA. C READ(3,100) MULTOL,IB,BTOL 100 FORMAT(E20.12,I6,E13.4) C TEMP = DFLOAT(MEV+1000) TTOL = MULTOL/TEMP WRITE(6,110) MULTOL,TTOL 110 FORMAT(/' T-MULTIPLICITY TOLERANCE USED IN THE EIGENVALUE COMPUTAT 1IONS WAS',E13.4/' SCALED MACHINE EPSILON IS',E13.4) C C CONTINUE WRITE TO FILE 6 OF THE PARAMETERS FOR THIS RUN C WRITE(6,120)NGOOD,NDIS,MEV,NOLD,MATOLD,SVSEED,MULTOL,IB,BTOL 120 FORMAT(/' EIGENVALUES SUPPLIED ARE READ IN FROM FILE 3'/' FILE 3 1HEADER IS'/4X,'NG',2X,'NDIS',3X,'MEV',2X,'NOLD',2X,'MATOLD',4X, 1'SVSEED',6X,'MULTOL',6X,'IB',9X,'BTOL'/4I6,I8,I10,E12.3,I8,E13.4/) C C IS THE ARRAY RITVEC LONG ENOUGH TO HOLD ALL OF THE DESIRED C RITZ VECTORS (APPROXIMATE EIGENVECTORS)? NMAX = NGOOD*N IF(MBOUND.NE.0) GO TO 130 IF(TVSTOP.NE.1.AND.NMAX.GT.MDIMRV) GO TO 1390 C C CHECK THAT THE ORDER N AND THE MATRIX IDENTIFICATION NUMBER C MATNO SPECIFIED BY THE USER AGREE WITH THOSE READ IN FROM C FILE 3. 130 ITEMP = (NOLD-N)**2+(MATOLD-MATNO)**2 IF (ITEMP.NE.0) GO TO 1410 C C C THE LANCZOS EIGENVECTOR COMPUTATIONS ASSUME THAT EACH C EIGENVALUE THAT IS BEING CONSIDERED HAS CONVERGED AS AN C EIGENVALUE OF THE LANCZOS TRIDIAGONAL MATRICES. C C READ IN FROM FILE 3, THE T-MULTIPLICITIES OF THE EIGENVALUES C WHOSE EIGENVECTORS ARE TO BE COMPUTED, THE VALUES OF THESE C EIGENVALUES AND THEIR MINIMAL GAPS AS EIGENVALUES OF THE C USER-SPECIFIED MATRIX AND AS EIGENVALUES OF THE T-MATRIX. C READ(3,20) EXPLAN READ(3,140) (MP(J),GOODEV(J),TMINGP(J),AMINGP(J), J=1,NGOOD) 140 FORMAT(6X,I6,E25.16,2E14.3) C WRITE(6,150) (J,GOODEV(J),MP(J),TMINGP(J),AMINGP(J), J=1,NGOOD) 150 FORMAT(/' EIGENVALUES READ IN, T-MULTIPLICITIES, T-GAPS AND A-GAPS 1 '/4X,' J ',5X,'GOOD EIGENVALUE',5X,'MULT',4X,' TMINGAP ',4X, 1' AMINGAP '/(I6,E25.16,I4,2E15.4)) C C READ IN ERROR ESTIMATES WRITE(6,180) MEV,SVSEED C CHECK WHETHER OR NOT THERE ARE ANY ISOLATED T-EIGENVALUES IN C THE EIGENVALUES PROVIDED DO 160 J=1,NGOOD IF(MP(J).EQ.1) GO TO 170 160 CONTINUE GO TO 200 170 READ(4,20) EXPLAN READ(4,20) EXPLAN READ(4,20) EXPLAN 180 FORMAT(/' THESE EIGENVALUES WERE COMPUTED USING A T-MATRIX OF 1ORDER ',I5/' AND SEED FOR RANDOM NUMBER GENERATOR =',I12) READ(4,190) NISO 190 FORMAT(18X,I6) READ(4,20) EXPLAN READ(4,20) EXPLAN READ(4,20) EXPLAN 200 DO 230 J=1,NGOOD ERR(J) = 0.D0 IF(MP(J).NE.1) GO TO 230 READ(4,210) EVAL, ERR(J) 210 FORMAT(10X,E25.16,E14.3) IF(DABS(EVAL - GOODEV(J)).LT.1.D-10) GO TO 230 WRITE(6,220) EVAL,GOODEV(J) 220 FORMAT(' PROBLEM WITH READ IN OF ERROR ESTIMATES'/' EIGENVALUE REA 1D IN',E20.12,' DOES NOT MATCH GOODEV(J) ='/E20.12) GO TO 1630 C 230 CONTINUE C WRITE(6,240) (J,GOODEV(J),ERR(J), J=1,NGOOD) 240 FORMAT(' ERROR ESTIMATES ='/4X,' J',5X,'EIGENVALUE',10X,'ESTIMATE' 1 /(I6,E20.12,E14.3)) C IF(IREAD.EQ.0) GO TO 340 C C READ IN THE SIZE OF THE T-MATRIX PROVIDED ON FILE 2. READ IN C THE ORDER OF THE USER-SPECIFIED MATRIX , THE SEED FOR THE C RANDOM NUMBER GENERATOR, AND THE MATRIX/TEST IDENTIFICATION C NUMBER THAT WERE USED IN THE LANCZOS EIGENVALUE COMPUTATIONS. C IF FLAG IREAD = 0, REGENERATE HISTORY. HISTORY MUST BE C STORED IN HEXADECIMAL FORMAT TO AVOID ERRORS INCURRED IN C INPUT/OUTPUT CONVERSIONS. C READ(2,250) KMAX,NOLD,SVSOLD,MATOLD 250 FORMAT(2I6,I12,I8) C WRITE(6,260) KMAX,NOLD,SVSOLD,MATOLD 260 FORMAT(/' READ IN THE T-MATRICES STORED ON FILE 2'/' FILE 2 HEADER 1 IS'/2X,'KMAX',2X,'NOLD',6X,'SVSOLD',2X,'MATOLD'/2I6,I12,I8/) C C CHECK THAT THE ORDER, THE MATRIX/TEST IDENTIFICATION NUMBER C AND THE SEED FOR THE RANDOM NUMBER GENERATOR USED IN THE C LANCZOS COMPUTATIONS THAT GENERATED THE HISTORY FILE C BEING USED AGREE WITH WHAT THE USER HAS SPECIFIED. IF (NOLD.NE.N.OR.MATOLD.NE.MATNO.OR.SVSOLD.NE.SVSEED) GO TO 1430 C KMAX1 = KMAX + 1 C C READ IN THE T-MATRICES FROM FILE 2. THESE ARE USED TO GENERATE C THE T-EIGENVECTORS THAT WILL BE USED IN THE RITZ VECTOR C COMPUTATIONS. ALPHA/BETA HISTORY MUST BE STORED IN C MACHINE FORMAT, ((4Z20) FOR IBM/3081). C READ(2,270) (ALPHA(J), J=1,KMAX) READ(2,270) (BETA(J), J=1,KMAX1) 270 FORMAT(4Z20) C READ(2,270) (V1(J), J=1,N) READ(2,270) (V2(J), J=1,N) C C ENLARGE KMAX IF THE SIZE AT WHICH THE EIGENVALUE C COMPUTATIONS WERE PERFORMED IS ESSENTIALLY KMAX AND C THERE IS AT LEAST ONE EIGENVALUE THAT IS T-SIMPLE AND C T-ISOLATED, IN THE SENSE THAT IF ITS NEAREST T-NEIGHBOR IS TOO C CLOSE THAT NEIGHBOR IS A 'GOOD' T-EIGENVALUE. DO 280 J = 1,NGOOD IF(MP(J).EQ.1) GO TO 300 280 CONTINUE WRITE(6,290) 290 FORMAT(/' ALL EIGENVALUES USED ARE T-MULTIPLE OR CLOSE TO SPURIOUS 1 T-EIGENVALUES'/' SO DO NOT CHANGE KMAX') IF(KMAX.LT.MEV) GO TO 1450 GO TO 320 C 300 KMAXN= 11*MEV/8 + 12 IF(MBETA.LE.KMAXN) GO TO 1610 IF(KMAX.GE.KMAXN ) GO TO 320 WRITE(6,310) KMAX, KMAXN 310 FORMAT(' ENLARGE KMAX FROM ',I6,' TO ',I6) MOLD1 = KMAX + 1 KMAX = KMAXN GO TO 390 C 320 WRITE(6,330) KMAX 330 FORMAT(/' T-MATRICES HAVE BEEN READ IN FROM FILE 2'/' THE LARGEST 1SIZE T-MATRIX ALLOWED IS',I6/) C IF(IREAD.EQ.1) GO TO 410 C C REGENERATE THE ALPHA AND BETA C 340 MOLD1 = 1 C DO 350 J = 1,NGOOD IF(MP(J).EQ.1) GO TO 370 350 CONTINUE KMAX = MEV + 12 WRITE(6,360) KMAX 360 FORMAT(/' ALL EIGENVALUES FOR WHICH EIGENVECTORS ARE TO BE COMPUTE 1D ARE EITHER T-MULTIPLE OR CLOSE TO'/' A SPURIOUS EIGENVALUE. THER 1EFORE SET KMAX = MEV + 12 = ',I7) GO TO 390 C 370 KMAXN = 11*MEV/8 + 12 IF(MBETA.LE.KMAXN) GO TO 1610 WRITE(6,380) KMAXN 380 FORMAT(' SET KMAX EQUAL TO ',I6) KMAX = KMAXN C 390 WRITE(6,400) MOLD1,KMAX 400 FORMAT(/' LANCZS SUBROUTINE GENERATES ALPHA(J), BETA(J+1), J =', 1 I6,' TO ', I6/) C C----------------------------------------------------------------------- C CALL LANCZS(CMATV,V1,V2,VS,ALPHA,BETA,GR,GC,G,KMAX,MOLD1,N,SVSEED) C C----------------------------------------------------------------------- C 410 CONTINUE C C THE SUBROUTINE STURMI DETERMINES THE SMALLEST SIZE T-MATRIX FOR C WHICH THE EIGENVALUE IN QUESTION IS AN EIGENVALUE (TO WITHIN A C GIVEN TOLERANCE) AND IF POSSIBLE THE SMALLEST SIZE T-MATRIX C FOR WHICH IT IS A DOUBLE EIGENVALUE (TO WITHIN THE SAME C TOLERANCE). THE SIZE T-MATRIX USED IN THE EIGENVECTOR C COMPUTATIONS IS THEN DETERMINED BY LOOPING ON THE SIZES OF THE C T-EIGENVECTORS, USING THE INFORMATION FROM STURMI TO OBTAIN C STARTING GUESSES AT THE T-SIZES. C C STUTOL = SCALE0*MULTOL IF(IWRITE.EQ.1) WRITE(6,420) 420 FORMAT(' FROM STURMI') DO 460 J = 1,NGOOD EVAL = GOODEV(J) C COMPUTE THE TOLERANCES USED BY STURMI TO DETERMINE AN INTERVAL C CONTAINING THE EIGENVALUE EVAL. TEMP = DABS(EVAL)*RELTOL TOLN = DMAX1(TEMP,STUTOL) C C----------------------------------------------------------------------- C CALL STURMI(ALPHA,BETA,EVAL,TOLN,EPSM,KMAX,MK1,MK2,IC,IWRITE) C C----------------------------------------------------------------------- C C STORE THE COMPUTED ORDERS OF T-MATRICES FOR LATER PRINTOUT M1(J) = MK1 M2(J) = MK2 ML(J) = (MK1 + 3*MK2)/4 IF(MK2.EQ.KMAX) ML(J) = KMAX C IF(IC.GT.0) GO TO 440 C IC = 0 MEANS THERE WAS NO T-EIGENVALUE IN THE DESIGNATED INTERVAL C BY T-SIZE KMAX. THIS MEANS THAT THE T-EIGENVALUE PROVIDED HAS C NOT YET CONVERGED AS AN EIGENVALUE OF THE TRIDIAGONAL MATRICES C SO PROGRAM SHOULD NOT COMPUTE ITS EIGENVECTOR. WRITE(6,430) J,GOODEV(J),MK1,MK2 430 FORMAT(I6,'TH EIGENVALUE',E20.12,' HAS NOT CONVERGED '/ 1' SO DO NOT COMPUTE ANY T-EIGENVECTOR OR RITZ VECTOR FOR IT' 1/' MK1 AND MK2 FOR THIS EIGENVALUE WERE',2I6) MP(J) = MPMIN MA(J) = -2*KMAX GO TO 460 C COMPUTE AN APPROPRIATE SIZE T-MATRIX FOR THE GIVEN EIGENVALUE. 440 IF(M2(J).EQ.KMAX) GO TO 450 C M1 AND M2 WERE BOTH DETERMINED MA(J) = (3*M1(J) + M2(J))/4 + 1 GO TO 460 C M2 NOT DETERMINED 450 MA(J) = 5*M1(J)/4 + 1 C 460 CONTINUE C IF (IWRITE.EQ.1) WRITE(6,470) (MA(JJ), JJ=1,NGOOD) 470 FORMAT(/' 1ST GUESS AT APPROPRIATE SIZE T-MATRICES'/ 1 ' ACTUAL VALUES WILL PROBABLY BE 1/4 AGAIN AS MUCH'/(13I6)) C C PRINT OUT TO FILE 10 1ST GUESSES AT SIZES OF T-MATRICES TO C BE USED IN THE EIGENVECTOR COMPUTATIONS. C ACTUAL SIZES MAY BE 1/4 OR MORE LARGER THAN THESE SIZES. WRITE(10,480) N,KMAX 480 FORMAT(2I8,' = ORDER OF USER MATRIX AND MAX ORDER OF T(1,MEV)') C WRITE(10,490) 490 FORMAT(/' 1ST GUESS AT APPROPRIATE SIZE T-MATRICES'/ 1 ' ACTUAL VALUES WILL PROBABLY BE 1/4 AGAIN AS MUCH'/) C WRITE(10,500) 500 FORMAT(4X,'J',7X,'GOODEV(J)',4X,'M1(J)',1X,'M2(J)',1X,'MA(J)') C WRITE(10,510) (J,GOODEV(J),M1(J),M2(J), MA(J), J=1,NGOOD) 510 FORMAT(I5,E19.12,3I6) C IF(MBOUND.EQ.1) WRITE(10,520) 520 FORMAT(/' GOODEV(J) IS A GOOD EIGENVALUE OF T(1,MEV)'/ 1 ' M1 = SMALLEST VALUE OF M SUCH THAT T(1,M) HAS AT LEAST'/ 1 ' ONE EIGENVALUE IN THE INTERVAL (EV-TOLN,EV+TOLN)'/ 1 ' TOLN(J) = DMAX1(GOODEV(J)*RELTOL, SCALE0*MULTOL)'/ 1 ' M2 = SMALLEST M (IF ANY) SUCH THAT IN THE ABOVE INTERVAL'/ 1 ' T(1,M) HAS AT LEAST TWO EIGENVALUES '/ 1 ' INITIAL VALUE OF MA(J) IS CHOSEN HEURISTICALLY'/ 1 ' PROGRAM LOOPS ON SIZE OF T-MATRIX TO GET BETTER SIZE'/ 1 ' END OF SIZES OF T-MATRICES FILE 10'///) C C C TERMINATE AFTER COMPUTING 1ST GUESSES AT SIZES OF THE C T-MATRICES REQUIRED FOR THE GIVEN EIGENVALUES? IF(MBOUND.EQ.1) GO TO 1470 C C C IS THERE ROOM FOR ALL OF THE REQUESTED T-EIGENVECTORS? MTOL = 0 DO 530 J = 1,NGOOD IF(MP(J).EQ.MPMIN) GO TO 530 MTOL = MTOL + IABS(MA(J)) 530 CONTINUE MTOL = (5*MTOL)/4 IF(MTOL.GT.MDIMTV.AND.NTVCON.EQ.0) GO TO 1490 C C----------------------------------------------------------------------- C GENERATE A RANDOM VECTOR TO BE USED REPEATEDLY BY C SUBROUTINE INVERM C IIL = RHSEED CALL GENRAN(IIL,G,KMAX) C C--------------------------------------------------------------------- C C LOOP ON GIVEN EIGENVALUES TO COMPUTE THE CORRESPONDING C T-EIGENVECTOR. C MTOL = 0 NTVEC = 0 ILBIS = 0 DO 720 J = 1,NGOOD ICOUNT = 0 ERRMIN = 10.D0 MABEST = MPMIN IF(MP(J).EQ.MPMIN) GO TO 720 TFLAG = 0 EVAL = GOODEV(J) TEMP = RELTOL* DABS(EVAL) UB = EVAL + DMAX1(STUTOL,TEMP) LB = EVAL - DMAX1(STUTOL,TEMP) 540 KMAXU = IABS(MA(J)) C C SELECT A SUITABLE INCREMENT FOR THE ORDERS OF THE T-MATRICES C TO BE CONSIDERED IN DETERMINING APPROPRIATE SIZES FOR THE RITZ C VECTOR COMPUTATIONS. IF(ICOUNT.GT.0) GO TO 560 C SELECT IDELTA(J) BASED UPON THE T-MULTIPLICITY OBTAINED IF(M2(J).EQ.KMAX) GO TO 550 C M2 DETERMINED IDELTA(J) = ((3*M1(J) + 5*M2(J))/8 + 1 - IABS(MA(J)))/10 + 1 GO TO 560 C M2 NOT DETERMINED 550 MAMAX = MIN0((11*MEV)/8 + 12, (13*M1(J))/8 + 1) IDELTA(J) = (MAMAX - IABS(MA(J)))/10 + 1 560 ICOUNT = ICOUNT + 1 C C----------------------------------------------------------------------- C TO MIMIMIZE THE EFFECT OF THE ONE-SIDED ACCEPTANCE TEST FOR C T-EIGENVALUES IN THE BISEC SUBROUTINE, RECOMPUTE THE GIVEN C EIGENVALUE AT THE SPECIFIED KMAXU C CALL LBISEC(ALPHA,BETA,EPSM,EVAL,EVALN,LB,UB,TTOL,KMAXU,NEVT) C C----------------------------------------------------------------------- C C CHECK WHETHER OR NOT GIVEN T-MATRIX HAS AN EIGENVALUE IN THE C SPECIFIED INTERVAL AND IF SO WHAT ITS T-MULTIPLICITY IS. C IF(NEVT.EQ.1) GO TO 600 IF(NEVT.NE.0) GO TO 580 ILBIS = 1 WRITE(6,570) EVAL,KMAXU 570 FORMAT(/' PROBLEM ENCOUNTERED IN RECOMPUTATION OF USER-SUPPLIED EI 1GENVALUE',E20.12/' THE SIZE T-MATRIX SPECIFIED',I6,' DOES NOT 1HAVE AN EIGENVALUE IN THE INTERVAL SPECIFIED'/' THEREFORE NO EIGEN 1VECTOR WILL BE COMPUTED FOR THIS PARTICULAR EIGENVALUE'/) GO TO 620 C 580 IF(NEVT.GT.1) WRITE(6,590) EVAL,KMAXU 590 FORMAT(/' PROBLEM ENCOUNTERED IN RECOMPUTATION OF USER-SUPPLIED 1EIGENVALUE',E20.12/' FOR THE SIZE T-MATRIX SPECIFIED =',I6,' THE 1GIVEN EIGENVALUE IS T-MULTIPLE IN THE INTERVAL SPECIFIED'/' SOMETH 1ING IS WRONG, THEREFORE NO EIGENVECTOR WILL BE COMPUTED FOR THIS E 1IGENVALUE'/) C MP(J) = MPMIN MA(J) = -2*KMAX GO TO 720 C 600 CONTINUE ILBIS = 0 C EVNEW(J) = EVALN EVAL = EVALN MTOL = MTOL+KMAXU C C IS THERE ROOM IN TVEC ARRAY FOR THE NEXT T-EIGENVECTOR? C IF NOT, SKIP TO RITZ VECTOR COMPUTATIONS. IF (MTOL.GT.MDIMTV) GO TO 730 C IT = 3 KINT = MTOL - KMAXU +1 C C RECORD THE BEGINNING AND END OF THE T-EIGENVECTOR BEING COMPUTED MINT(J) = KINT MFIN(J) = MTOL C C----------------------------------------------------------------------- C SUBROUTINE INVERM DOES INVERSE ITERATION, I.E. SOLVES C (T(1,KMAXU) - EVAL)*U = RHS FOR EACH EIGENVALUE TO OBTAIN THE C DESIRED T-EIGENVECTOR. C IF(IWRITE.EQ.1) WRITE(6,610) J 610 FORMAT(/I6,'TH EIGENVALUE') C CALL INVERM(ALPHA,BETA,V1,TVEC(KINT),EVAL,ERROR,TERROR,EPSM, 1 G,KMAXU,IT,IWRITE) C C----------------------------------------------------------------------- C TERR(J) = TERROR TLAST(J) = ERROR KMAXU1 = KMAXU + 1 TBETA(J) = BETA(KMAXU1)*ERROR C C AFTER COMPUTING EACH OF THE T-EIGENVECTORS, C CHECK THE SIZE OF THE ERROR ESTIMATE, ERROR. C IF THIS ESTIMATE IS NOT AS SMALL AS DESIRED AND C |MA(J)| < ML(J), ATTEMPT TO INCREASE THE SIZE OF |MA(J)| C AND REPEAT THE T-EIGENVECTOR COMPUTATIONS. C IF(ERROR.LT.ERTOL.OR.TFLAG.EQ.1) GO TO 710 C IF(ERROR.GE.ERRMIN) GO TO 620 C LAST COMPONENT IS LESS THAN MINIMAL TO DATE ERRMIN = ERROR MABEST = MA(J) 620 CONTINUE C IF(MA(J).GT.0) ITEST = MA(J) + IDELTA(J) IF(MA(J).LT.0) ITEST = -(IABS(MA(J)) + IDELTA(J)) IF(IABS(ITEST).LE.ML(J).AND.ICOUNT.LE.10) GO TO 640 C NEW MA(J) IS GREATER THAN MAXIMUM ALLOWED. IF(ERCONT.EQ.0.OR.MABEST.EQ.MPMIN) GO TO 660 TFLAG = 1 MA(J) = MABEST IF(ILBIS.EQ.0) MTOL = MTOL - KMAXU WRITE(6,630) MA(J) 630 FORMAT(' 10 ORDERS WERE CONSIDERED. NONE SATISFIED THE ERROR TEST 1'/' THEREFORE USE THE BEST ORDER OBTAINED FOR THE EIGENVECTORS' 1,I6) GO TO 540 C 640 MA(J) = ITEST C MT = IABS(MA(J)) IF(IWRITE.EQ.1) WRITE(6,650) MT 650 FORMAT(/' CHANGE SIZE OF T-MATRIX TO ',I6,' RECOMPUTE T-EIGENVECTO 1R') C IF(ILBIS.EQ.0) MTOL = MTOL - KMAXU C GO TO 540 C C APPROPRIATE SIZE T-MATRIX WAS NOT OBTAINED 660 CONTINUE WRITE(10,670) J,EVAL,MP(J) 670 FORMAT(/' ON 10 INCREMENTS NOT ABLE TO IDENTIFY APPROPRIATE SIZE 1T-MATRIX FOR'/ 1' EIGENVALUE(',I4,') = ',E20.12,' T-MULTIPLICITY =',I4/) IF(M2(J).EQ.KMAX) WRITE(10,680) IF(M2(J).LT.KMAX) WRITE(10,690) 680 FORMAT(/' ORDERS TESTED RANGED FROM 5*M1(J)/4 TO APPROXIMATELY'/ 1' MIN(11*MEV/8, 13*M1(J)/8)'/) 690 FORMAT(/' ORDERS TESTED RANGED FROM (3*M1(J)+M2(J)/4 TO APPROXIMAT 1ELY'/' (3*M1(J) + 5*M2(J))/8'/) WRITE(10,700) 700 FORMAT(' ALLOWING LARGER ORDERS FOR THE T-MATRICES MAY RESULT IN 1 SUCCESS'/' BUT PROBABLY WILL NOT. PROBLEM IS PROBABLY DUE TO' 1 /' LACK OF CONVERGENCE OF GIVEN EIGENVALUE, CHECK THE ERROR ESTIM 1ATE') MP(J) = MPMIN IF(ILBIS.EQ.0) MTOL = MTOL - KMAXU GO TO 720 710 NTVEC = NTVEC + 1 C 720 CONTINUE NGOODC = NGOOD GO TO 750 C C COME HERE IF THERE IS NOT ENOUGH ROOM FOR ALL OF T-EIGENVECTORS 730 NGOODC = J-1 WRITE(6,740) J,MTOL,MDIMTV 740 FORMAT(/' NOT ENOUGH ROOM IN TVEC ARRAY FOR ',I4,'TH T-EIGENVECTOR 1'/' TVEC DIMENSION REQUESTED = ',I6,' BUT TVEC HAS DIMENSION ',I6 1/) IF(NGOODC.EQ.0) GO TO 1510 MTOL = MTOL-KMAXU C 750 CONTINUE C C THE LOOP ON T-EIGENVECTOR COMPUTATIONS IS COMPLETE. C WRITE OUT THE SIZE T-MATRICES THAT WILL BE USED FOR C THE RITZ VECTOR COMPUTATIONS. C WRITE(10,760) 760 FORMAT(/' SIZES OF T-MATRICES THAT WILL BE USED IN THE RITZ COMPUT 1ATIONS'/5X,'J',16X,'GOODEV(J)',1X,'MA(J)') C WRITE(10,770) (J,GOODEV(J),MA(J), J=1,NGOOD) 770 FORMAT(I6,E25.14,I6) WRITE(10,520) C WRITE(6,780) MTOL 780 FORMAT(/' THE CUMULATIVE LENGTH OF THE T-EIGENVECTORS IS',I18) C WRITE(6,790) NTVEC,NGOOD 790 FORMAT(/I6,' T-EIGENVECTORS OUT OF',I6,' REQUESTED WERE COMPUTED') C C SAVE THE T-EIGENVECTORS ON FILE 11? IF(TVSTOP.NE.1.AND.SVTVEC.EQ.0) GO TO 850 C WRITE(11,800) NTVEC,MTOL,MATNO,SVSEED 800 FORMAT(I6,3I12,' = NTVEC,MTOL,MATNO,SVSEED') C DO 830 J=1,NGOODC C IF MP(J) = MPMIN THEN NO SUITABLE T-EIGENVECTOR IS AVAILABLE C FOR THAT EIGENVALUE. IF(MP(J).EQ.MPMIN) WRITE(11,810) J,MA(J),GOODEV(J),MP(J) 810 FORMAT(2I6,E20.12,I6/' TH EIGVAL,T-SIZE,EVALUE,FLAG,NO EIGVEC') IF(MP(J).NE.MPMIN) WRITE(11,820) J,MA(J),GOODEV(J),MP(J) 820 FORMAT(I6,I6,E20.12,I6/' T-EIGVEC,SIZE T,EVALUE OF A,MP(J)') IF(MP(J).EQ.MPMIN) GO TO 830 KI = MINT(J) KF = MFIN(J) C WRITE(11,270) (TVEC(K), K=KI,KF) C 830 CONTINUE C IF(TVSTOP.NE.1) GO TO 850 C WRITE(6,840) TVSTOP, NTVEC,NGOOD 840 FORMAT(/' USER SET TVSTOP = ',I1/ 1' THEREFORE PROGRAM TERMINATES AFTER T-EIGENVECTOR COMPUTATIONS'/ 1' T-EIGENVECTORS THAT WERE COMPUTED ARE SAVED ON FILE 11'/ 1I8,' T-EIGENVECTORS WERE COMPUTED OUT OF',I7,' REQUESTED'/) C GO TO 1630 C 850 CONTINUE C IF NOT ABLE TO COMPUTE ALL THE REQUESTED T-EIGENVECTORS C CONTINUE WITH THE LANCZOS VECTOR COMPUTATIONS ANYWAY? IF(NTVEC.NE.NGOOD.AND.LVCONT.EQ.0) GO TO 1530 C C COMPUTE THE MAXIMUM SIZE OF THE T-MATRIX USED FOR THOSE C EIGENVALUES WITH GOOD ERROR ESTIMATES. C KMAXU = 0 DO 860 J = 1,NGOODC MT = IABS(MA(J)) IF(MT.LT.KMAXU.OR.MP(J).EQ.MPMIN) GO TO 860 KMAXU = MT 860 CONTINUE C IF(KMAXU.EQ.0) GO TO 1570 C WRITE(6,870) KMAXU 870 FORMAT(/I6,' = LARGEST SIZE T-MATRIX TO BE USED IN THE RITZ VECTOR 1 COMPUTATIONS') C C COUNT THE NUMBER OF RITZ VECTORS NOT BEING COMPUTED MREJEC = 0 DO 880 J=1,NGOODC 880 IF(MP(J).EQ.MPMIN) MREJEC = MREJEC + 1 MREJET = MREJEC + (NGOOD-NGOODC) IF(MREJET.NE.0) WRITE(6,890) MREJET 890 FORMAT(/' RITZ VECTORS ARE NOT COMPUTED FOR',I6,' OF THE EIGENVALU 1ES'/) NACT = NGOODC - MREJEC WRITE(6,900) NGOOD,NTVEC,NACT 900 FORMAT(/I6,' RITZ VECTORS WERE REQUESTED'/I6,' T-EIGENVECTORS WERE 1 COMPUTED'/I6,' RITZ VECTORS WILL BE COMPUTED'/) C CHECK IF THERE ARE ANY RITZ VECTORS TO COMPUTE IF(MREJEC.EQ.NGOODC) GO TO 1550 C C CONTINUE WITH THE LANCZOS VECTOR COMPUTATIONS? IF(LVCONT.EQ.0.AND.MREJEC.NE.0) GO TO 1530 C C NOW COMPUTE THE RITZ VECTORS. REGENERATE THE C LANCZOS VECTORS. C DO 910 I = 1,NMAX 910 RITVEC(I) = ZEROC C C REGENERATE THE STARTING VECTOR. THIS MUST BE GENERATED AND C NORMALIZED PRECISELY THE WAY IT WAS DONE IN THE EIGENVALUE C COMPUTATIONS, OTHERWISE THERE WILL BE A MISMATCH BETWEEN C THE T-EIGENVECTORS THAT HAVE BEEN COMPUTED FROM THE T-MATRICES C READ IN FROM FILE 2 AND THE LANCZOS VECTORS THAT ARE C BEING REGENERATED. C C----------------------------------------------------------------------- C IIL = SVSEED CALL GENRAN(IIL,G,N) C C----------------------------------------------------------------------- C DO 920 I = 1,N 920 GR(I) = G(I) C C----------------------------------------------------------------------- C CALL GENRAN(IIL,G,N) C C----------------------------------------------------------------------- C DO 930 I = 1,N 930 GC(I) = G(I) C DO 940 I = 1,N 940 V2(I) = DCMPLX(GR(I),GC(I)) C C----------------------------------------------------------------------- CALL CINPRD(V2,V2,SUM,N) C----------------------------------------------------------------------- C SUM = ONE/DSQRT(SUM) DO 950 I = 1,N V1(I) = ZEROC 950 V2(I) = V2(I)*SUM C C LOOP FOR GENERATING REQUIRED RITZ VECTORS (IVEC = 1,KMAXU) C USES GRAM-SCHMIDT ORTHOGONALIZATION WITHOUT MODIFICATION C IVEC = 1 BATA = ZERO C GO TO 1010 C 960 CONTINUE C C----------------------------------------------------------------------- C CMATV(V2,VS,SUM) CALCULATES VS = A*V2 - SUM*VS SUM = ZERO CALL CMATV(V2,VS,SUM) CALL CINPRD(V2,VS,ALFA,N) C C----------------------------------------------------------------------- C DO 970 J=1,N 970 V1(J) = (VS(J) - BATA*V1(J)) - ALFA*V2(J) C C----------------------------------------------------------------------- CALL CINPRD(V1,V1,BATA,N) C----------------------------------------------------------------------- C BATA = DSQRT(BATA) SUM = ONE/BATA C TEMP = BETA(IVEC) TEMP = DABS(BATA - TEMP)/TEMP IF (TEMP.LT.1.0D-10)GO TO 990 C C THE BETA BEING REGENERATED DO NOT MATCH THE HISTORY FILE C SOMETHING IS WRONG IN THE LANCZOS VECTOR GENERATION C PROGRAM TERMINATES FOR USER TO CORRECT THE PROBLEM C WHICH MUST BE IN THE STARTING VECTOR GENERATION OR IN C THE MATRIX-VECTOR MULTIPLY SUBROUTINE CMATV SUPPLIED. C THIS SUBROUTINE MUST BE THE SAME ONE USED IN THE C EIGENVALUE COMPUTATIONS OR A MISMATCH WILL ENSUE. C WRITE(6,980) IVEC,BATA,BETA(IVEC),TEMP 980 FORMAT(/2X,'IVEC',16X,'BATA',10X,'BETA(IVEC)',14X,'RELDIF'/I6, 13E20.12/' IN LANCZOS VECTOR REGENERATION THE ENTRIES OF THE TRIDIA 1GONAL MATRICES BEING'/' GENERATED ARE NOT THE SAME AS THOSE IN THE 1 MATRIX SUPPLIED ON FILE 2.'/' THEREFORE SOMETHING IS BEING INITIA 1LIZED OR COMPUTED DIFFERENTLY FROM THE WAY'/' IT WAS COMPUTED IN T 1HE EIGENVALUE COMPUTATIONS'/' THE PROGRAM TERMINATES FOR THE USER 1TO DETERMINE WHAT THE PROBLEM IS'/) GO TO 1630 C C 990 CONTINUE DO 1000 J = 1,N TEMPC = SUM*V1(J) V1(J) = V2(J) 1000 V2(J) = TEMPC C 1010 CONTINUE C LFIN = 0 DO 1030 J = 1,NGOODC LL = LFIN LFIN = LFIN + N C IF(IABS(MA(J)).LT.IVEC.OR.MP(J).EQ.MPMIN) GO TO 1030 II = IVEC + MINT(J) - 1 TEMP = TVEC(II) C II IS THE (IVEC)TH COMPONENT OF THE T-EIGENVECTOR CONTAINED C IN TVEC(MINT(J)). C DO 1020 K = 1,N LL = LL + 1 1020 RITVEC(LL) = TEMP*V2(K) + RITVEC(LL) C 1030 CONTINUE C IVEC = IVEC + 1 IF (IVEC.LE.KMAXU) GO TO 960 C C C RITZVECTOR GENERATION IS COMPLETE. NORMALIZE EACH RITZVECTOR. C NOTE THAT IF CERTAIN RITZ VECTORS WERE NOT COMPUTED THEN THAT C PORTION OF THE RITVEC ARRAY WAS NOT UTILIZED. C LFIN = 0 DO 1130 J = 1,NGOODC C KK = LFIN LFIN = LFIN + N IF(MP(J).EQ.MPMIN) GO TO 1130 C DO 1040 K = 1,N KK = KK + 1 1040 V2(K) = RITVEC(KK) C C----------------------------------------------------------------------- CALL CINPRD(V2,V2,SUM,N) C----------------------------------------------------------------------- C SUM = DSQRT(SUM) RNORM(J) = SUM TEMP = DABS(ONE-SUM) SUM = ONE/SUM C KK = LFIN - N DO 1050 K = 1,N KK = KK + 1 V2(K) = SUM*V2(K) 1050 RITVEC(KK) = V2(K) C C ONLY ENTER NEXT PORTION IF GIVEN MATRIX IS REAL. IF(ISREAL.NE.1) GO TO 1100 C C AT THIS POINT RITZ VECTOR IS IN V2. C THIS PROGRAM CAN BE USED ON REAL MATRICES TO DETERMINE C WHICH IF ANY EIGENVALUES ARE A-MULTIPLE AND IF SO TO COMPUTE C TWO EIGENVECTORS FOR THOSE EIGENVALUES THAT ARE MULTIPLE AND ONE C FOR THOSE THAT ARE NOT MULTIPLE. HERE ONLY IDENTIFIES WHETHER C EIGENVALUE IS AT LEAST DOUBLE. THIS IS DONE BY CHECKING THE C RATIOS OF SUCCEEDING REAL AND IMAGINARY PARTS OF THE COMPUTED C RITZ VECTORS. C SUM = DIMAG(V2(1))/DREAL(V2(1)) DO 1060 K=2,N TEMP = DREAL(V2(K)) IF(DABS(TEMP).LT.1.D-9) GO TO 1060 TEMP = DIMAG(V2(K))/DREAL(V2(K)) IF(DABS(TEMP - SUM).LE.1.D-6) GO TO 1060 MULEVA(J) = 2 GO TO 1070 1060 CONTINUE MULEVA(J) = 1 1070 IF(MULEVA(J).EQ.2) WRITE(6,1090) J,GOODEV(J) IF(MULEVA(J).EQ.1) WRITE(6,1080) J,GOODEV(J) 1080 FORMAT(I6,'TH EIGENVALUE CONSIDERED =',E20.12,' IS SIMPLE') 1090 FORMAT(I6,'TH EIGENVALUE CONSIDERED =',E20.12,' IS MULTIPLE') C 1100 CONTINUE C IF (IWRITE.NE.0) WRITE(6,1110) J,GOODEV(J) 1110 FORMAT(/I5,' TH EIGENVALUE CONSIDERED = ',E20.12/) C IF (IWRITE.NE.0) WRITE(6,1120) TERR(J),TBETA(J),TEMP 1120 FORMAT(' NORM OF ERROR IN T-EIGENVECTOR = ',E14.3/ 1 ' BETA(MA(J)+1)*U(MA(J)) = ',E14.3/ 1 ' ABS(NORM(RITVEC) - 1.0) = ',E14.3/) C LINT = LFIN - N + 1 EVAL = EVNEW(J) C C----------------------------------------------------------------------- C CALL CMATV(RITVEC(LINT),V2,EVAL) C C----------------------------------------------------------------------- C C COMPUTE ERROR IN RITZ VECTOR CONSIDERED AS A EIGENVECTOR OF A. C V2 = A*RITVEC - EVAL*RITVEC C C----------------------------------------------------------------------- CALL CINPRD(V2,V2,SUM,N) C----------------------------------------------------------------------- C SUM = DSQRT(SUM) ERR(J) = SUM GAP = ABS(AMINGP(J)) ERRDGP(J) = SUM/GAP C 1130 CONTINUE C C C RITZVECTORS ARE NORMALIZED AND ERROR ESTIMATES ARE IN ERR ARRAY C AND IN ERRDGP ARRAY. STORE EVERYTHING C C WRITE(9,1140) 1140 FORMAT(6X,'GOODEV(J)',1X,'MA(J)',4X,'A MINGAP',6X,'AERROR',2X, 1 'AERROR/GAP',6X,'TERROR') C WRITE(13,1150) 1150 FORMAT(16X,'GOODEV(J)',5X,'RITZNORM',6X,'AMINGAP',5X, 1 'TBETA(J)',5X,'TLAST(J)') C DO 1180 J=1,NGOODC C IF(MP(J).EQ.MPMIN) GO TO 1180 C WRITE(9,1160)EVNEW(J),MA(J),AMINGP(J),ERR(J),ERRDGP(J),TERR(J) 1160 FORMAT(E15.8,I6,4E12.4) C WRITE(13,1170) EVNEW(J),RNORM(J),AMINGP(J),TBETA(J),TLAST(J) 1170 FORMAT(E25.14,4E13.5) C 1180 CONTINUE C IF(MREJEC.EQ.0) GO TO 1260 WRITE(9,1190) 1190 FORMAT(/' RITZ VECTORS WERE NOT COMPUTED FOR THE FOLLOWING EIGENVA 1LUES'/' EITHER BECAUSE THEY HAD NOT CONVERGED OR BECAUSE THE ERROR 1 ESTIMATE'/' WAS NOT AS SMALL AS DESIRED'/) C DO 1250 J = 1,NGOODC IF(MP(J).NE.MPMIN) GO TO 1250 C WRITE OUT MESSAGE FOR EACH EIGENVALUE FOR WHICH NO EIGENVECTOR C WAS COMPUTED. C WRITE(9,1200) 1200 FORMAT(6X,'GOODEV(J)',3X,'MA(J)',5X,'AMINGP(J)',6X,'TLAST(J)',3X, 1'MP(J)') WRITE(9,1210) GOODEV(J),MA(J),AMINGP(J),TBETA(J),MP(J) 1210 FORMAT(E15.8,I8,2E14.4,I8) C WRITE(13,1220) 1220 FORMAT(/' RITZ VECTORS WERE NOT COMPUTED FOR THE FOLLOWING EIGENVA 1LUES'/' EITHER BECAUSE THEY HAD NOT CONVERGED OR BECAUSE'/' THE ER 1ROR ESTIMATE WAS NOT AS SMALL AS DESIRED'/) C WRITE(13,1230) 1230 FORMAT(6X,'GOODEV(J)',3X,'MA(J)',3X,'M1(J)',3X,'M2(J)',3X,'MP(J)' 1/) WRITE(13,1240) GOODEV(J),MA(J),M1(J),M2(J),MP(J) 1240 FORMAT(E15.8,4I8) C 1250 CONTINUE 1260 CONTINUE C WRITE(9,1270) 1270 FORMAT(/' ABOVE ARE ERROR ESTIMATES FOR THE A AND T EIGENVECTORS'/ 1 ' ASSOCIATED WITH THE GOODEV LISTED IN COLUMN 1'/ 1 ' AERROR = NORM(A*X - EV*X) TERROR = NORM(T*Y - EV*Y) '/ 1 ' WHERE T = T(1,MA(J)) X = RITZ VECTOR = V*Y V = SUCCESSIVE'/ 1 ' LANCZOS VECTORS. A MINGAP = GAP TO NEAREST A-EIGENVALUE'//) C WRITE(13,1280) 1280 FORMAT(/' ABOVE ARE ERROR ESTIMATES ASSOCIATED WITH THE GOODEV'/ 1 ' RITZNORM = NORM(RITZ VECTOR)'/ 1 ' TBETA(J) = CDABS(BETA(MA(J)+1)*Y(MA(J))), T*Y = GOODEV*Y'/ 1 ' TLAST(J) = CDABS(Y(MA(J))'/ 1 ' AMINGAP = DISTANCE TO CLOSEST COMPUTED GOOD T-EIGENVALUE'/) C C NUMBER OF RITZ VECTORS COMPUTED NCOMPU = NGOODC - MREJEC WRITE(12,1290) N,NCOMPU,NGOODC,MATNO 1290 FORMAT(3I6,I12,' SIZE A, NO.RITZVECS, NO.EVALUES,MATNO') C LFIN = 0 DO 1350 J = 1,NGOODC LINT = LFIN + 1 LFIN = LFIN + N C IF(MP(J).EQ.MPMIN) GO TO 1330 C RITZ VECTOR WAS COMPUTED WRITE(12,1300) J, GOODEV(J), MP(J) 1300 FORMAT(I6,4X,E20.12,I6,' J, EIGENVAL, MP(J)') C WRITE(12,1310) ERR(J),ERRDGP(J) 1310 FORMAT(2E15.5,' = NORM(A*Z-EVAL*Z) AND NORM(A*Z-EVAL*Z)/MINGAP') C WRITE(12,1320) (RITVEC(LL), LL=LINT,LFIN) 1320 FORMAT(4Z20) GO TO 1350 C NO RITZ VECTOR WAS COMPUTED FOR THIS EIGENVALUE 1330 WRITE(12,1340) J,GOODEV(J),MP(J) 1340 FORMAT(I6,4X,E20.12,I6,' J,EIGVALUE,NO RITZ VECTOR COMPUTED') C 1350 CONTINUE C C DID ANY T-MATRICES INCLUDE OFF-DIAGONAL ENTRIES SMALLER THAN C DESIRED, AS SPECIFIED BY BTOL? C IF(IB.GT.0) GO TO 1380 WRITE(6,1360) KMAXU 1360 FORMAT(/' FOR LARGEST T-MATRIX CONSIDERED',I7,' CHECK THE SIZE OF 1BETAS') C C----------------------------------------------------------------------- C CALL TNORM(ALPHA,BETA,BKMIN,TEMP,KMAXU,IBMT) C C----------------------------------------------------------------------- C IF(IBMT.LT.0) WRITE (6,1370) 1370 FORMAT(/' WARNING THE T-MATRICES FOR ONE OR MORE OF THE EIGENVALUE 1S CONSIDERED'/' HAD AN OFF-DIAGONAL ENTRY THAT WAS SMALLER THAN TH 1E BETA TOLERANCE THAT WAS SPECIFIED'/) 1380 CONTINUE C GO TO 1630 C 1390 WRITE(6,1400) NGOOD,NMAX,MDIMRV 1400 FORMAT(/I4,' RITZ VECTORS WERE REQUESTED BUT THE REQUIRED DIMENSIO 1N',I6/' IS LARGER THAN THE USER-SPECIFIED DIMENSION OF RITVEC',I6 1/' THEREFORE, THE EIGENVECTOR PROCEDURE TERMINATES FOR THE USER TO 1 INTERVENE') C GO TO 1630 C 1410 WRITE(6,1420) NOLD,N,MATOLD,MATNO 1420 FORMAT(/' PARAMETERS READ FROM FILE 3 DO NOT AGREE WITH THOSE SPEC 1 IFIED'/' BY THE USER. NOLD,N,MATOLD,MATNO = '/2I6,2I12/ 1' THEREFORE, PROGRAM TERMINATES FOR USER TO RESOLVE THE DIFFERENCE 1S'/) C GO TO 1630 C 1430 WRITE(6,1440) 1440 FORMAT(/' PARAMETERS IN ALPHA,BETA FILE READ IN DO NOT AGREE WITH 1 THOSE'/' SPECIFIED BY THE USER. THEREFORE, THE PROCEDURE TERMINA 1TES'/' FOR THE USER TO RESOLVE THE DIFFERENCES.'/) C GO TO 1630 C 1450 WRITE(6,1460) KMAX,MEV 1460 FORMAT(/' ON ALPHA,BETA HEADER KMAX = ',I6/ 1' BUT EIGENVALUES WERE COMPUTED AT MEV = ',I6,' PROGRAM STOPS'/) C GO TO 1630 C 1470 WRITE(6,1480) 1480 FORMAT(/' PROGRAM COMPUTED 1ST GUESSES ON T-MATRIX SIZES, READ THE 1M TO FILE 10'/' THEN TERMINATED AS REQUESTED.') GO TO 1630 C 1490 WRITE(6,1500) MTOL, MDIMTV 1500 FORMAT(/' PROGRAM TERMINATES BECAUSE THE TVEC DIMENSION ANTICIPATE 1D',I7/' IS LARGER THAN THE TVEC DIMENSION',I7,' SPECIFIED BY THE 1USER.'/' USER MAY RESET THE TVEC DIMENSION AND RESTART THE PROGRA 1M') GO TO 1630 C 1510 WRITE(6,1520) 1520 FORMAT(/' PROGRAM TERMINATES BECAUSE NO SUITABLE T-EIGENVECTORS WE 1RE IDENTIFIED'/' FOR ANY OF THE EIGENVALUES SUPPLIED. PROBLEM CO 1ULD BE CAUSED'/' BY TOO SMALL A TVEC DIMENSION OR SIMPLY BE THAT 1IT WAS NOT POSSIBLE'/' TO IDENTIFY T-VECTORS. USER SHOULD CHECK 1OUTPUT'/) GO TO 1630 C 1530 WRITE(6,1540) LVCONT,NTVEC,NGOOD 1540 FORMAT(/' LVCONT FLAG =',I2,' AND NUMBER ',I5,' OF T-EIGENVECTORS 1 COMPUTED N.E.'/' NUMBER',I5,' REQUESTED SO PROGRAM TERMINATES'/) GO TO 1630 1550 WRITE(6,1560) 1560 FORMAT(/' PROGRAM TERMINATES WITHOUT COMPUTING ANY RITZ VECTORS'/ 1 ' BECAUSE ALL T-EIGENVECTORS WERE REJECTED AS NOT SUITABLE'/ 1 ' PROBABLE CAUSE IS LACK OF CONVERGENCE OF THE EIGENVALUES'/) GO TO 1630 C 1570 WRITE(6,1580) 1580 FORMAT(/' PROGRAM INDICATES THAT IT IS NOT POSSIBLE TO COMPUTE ANY 1 OF THE'/' REQUESTED EIGENVECTORS. THEREFORE PROGRAM TERMINATES') DO 1590 J=1,NGOODC 1590 WRITE(6,1600) J,GOODEV(J),MP(J) 1600 FORMAT(/4X,' J',11X,'GOODEV(J)',4X,'MP(J)'/I6,E20.12,I9) GO TO 1630 C 1610 WRITE(6,1620) MBETA,KMAXN 1620 FORMAT(/' PROGRAM TERMINATES BECAUSE THE STORAGE ALLOTTED FOR THE 1BETA ARRAY',I8/' IS NOT SUFFICIENT FOR THE ENLARGED KMAX =',I8,' T 1HAT THE PROGRAM WANTS'/' USER CAN ENLARGE THE ALPHA AND BETA ARRAY 1S AND RERUN THE PROGRAM.'/) C 1630 CONTINUE C STOP C-----END OF MAIN PROGRAM FOR LANCZOS HERMITIAN EIGENVECTOR COMPUTATIONS END .