C-----LSVEC (SINGULAR VECTORS OF REAL RECTANGULAR MATRICES)------------- C C CONTAINS MAIN PROGRAM FOR COMPUTING A LEFT AND A C RIGHT SINGULAR VECTOR CORRESPONDING TO EACH OF A SET C OF SINGULAR VALUES WHICH HAVE BEEN COMPUTED ACCURATELY BY THE C CORRESPONDING LANCZOS SINGULAR VALUE PROGRAM (LSVAL) C FOR REAL RECTANGULAR MATRICES. THIS PROGRAM COULD BE C MODIFIED TO COMPUTE ADDITIONAL SINGULAR VECTORS FOR ANY C SINGULAR VALUE THAT IS A MULTIPLE SINGULAR VALUE OF A. C THE AMOUNT OF ADDITIONAL COMPUTATION REQUIRED BY SUCH A C MODIFICATION DEPENDS UPON THE GIVEN A-MATRIX AND UPON C THE PART OF THE SPECTRUM INVOLVED. C C FOR A GIVEN REAL MATRIX A OF ORDER M X N THE LANCZOS RECURSION C IS APPLIED TO THE ASSOCIATED REAL SYMMETRIC MATRIX B OF ORDER C MN = M+N C C ---- ---- C | 0 A | C B = | | C | A-TRANSPOSE 0 | C ---- ---- C USING SPECIAL STARTING VECTORS. C C THESE SINGULAR VECTOR COMPUTATIONS ASSUME THAT EACH C SINGULAR VALUE THAT IS BEING CONSIDERED HAS CONVERGED AS C AN EIGENVALUE OF THE LANCZOS TRIDIAGONAL MATRICES GENERATED. C C THE EIGENVALUES OF EACH EVEN-ORDERED LANCZOS MATRIX OCCUR C IN + AND - PAIRS, AND THE RITZ VECTOR COMPUTATION RESTS ON C AN INVERSE ITERATION COMPUTATION FOR A LANCZOS MATRIX. C THIS CAUSES AN ANOMALY IN THE SINGULAR VECTOR COMPUTATIONS C FOR VERY SMALL SINGULAR VALUES. IN PRACTICE WE SEE THAT C FOR ANY SUCH SINGULAR VALUE THAT ONE MEMBER OF EACH PAIR OF C APPROXIMATE SINGULAR VECTORS WILL BE MORE ACCURATE THAN THE C OTHER MEMBER OF THAT PAIR IS. IF IPAR = 1 (STARTING LANCZOS C VECTOR IS OF FORM (0,V2) WHERE V2 IS NX1) THEN THE RIGHT C SINGULAR VECTOR WILL BE OBTAINED MORE ACCURATELY THAN THE C LEFT SINGULAR VECTOR. IF IPAR = 2 (STARTING LANCZOS VECTOR C IS OF FORM (V1,0) WHERE V1 IS MX1) THEN THE LEFT SINGULAR C VECTOR WILL BE MORE ACCURATE THAN THE RIGHT SINGULAR VECTOR. C PRIOR TO NORMALIZATION THE SIZES OF THESE INACCURATE VECTORS C WILL BE THE SAME AS THE SIZE OF THE ASSOCIATED VERY SMALL C SINGULAR VALUE. IN FACT IN THE LIMIT, FOR A ZERO SINGULAR VALUE C AND IPAR = 1, THE VECTOR COMPUTED AS THE APPROXIMATION TO THE C LEFT SINGULAR VECTOR WILL BE THE 0 VECTOR. (IF IPAR = 2 THEN C THIS WOULD BE THE RIGHT SINGULAR VECTOR). THE CORRESPONDING C ERROR ESTIMATES WILL REFLECT THE INACCURACY OF THE ONE MEMBER C OF EACH SUCH PAIR, SINCE THESE ESTIMATES ARE A SUM OF ESTIMATES C FOR THE INDIVIDUAL MEMBERS OF THE PAIR. THEREFORE, FOR ANY VERY C SMALL SINGULAR VALUE A CORRESPONDING SINGULAR VECTOR WILL BE C COMPUTED ONLY IF THE USER HAS SET THE FLAG ERCONT TO 1. C C----------------------------------------------------------------------- C C PFORT VERIFIER IDENTIFIED THE FOLLOWING NONPORTABLE C 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 FOR BETA HISTORY. C C IMPORTANT NOTE: THIS PROGRAM ALLOWS ENLARGEMENT OF THE C BETA ARRAY. IN PARTICULAR, IF ANY ONE OF THE SINGULAR VALUES C SUPPLIED IS T-SIMPLE AND AS AN EIGENVALUE OF THE ASSOCIATED C LANCZOS TRIDIAGONAL MATRIX IS NOT CLOSE TO A SPURIOUS C EIGENVALUE OF THAT MATRIX, THIS PROGRAM WILL REQUIRE C THAT KMAX BE AT LEAST THE LARGEST EVEN NUMBER LESS C THAN OR EQUAL TO (11*MEV)/8 + 13. IF KMAX IS NOT THAT C LARGE, THEN THIS PROGRAM WILL RESET KMAX TO THIS SIZE C AND EXTEND THE BETA HISTORY IF REQUIRED. C THUS, THE DIMENSION OF THE BETA ARRAY 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----------------------------------------------------------------------- DOUBLE PRECISION BETA(5001),V1(5000),V2(5000),RITVEC(30000) DOUBLE PRECISION TVEC(30000),GOODSV(50),SVNEW(50),TLAST(50) DOUBLE PRECISION SVAL,SVALN,TOLN,TTOL,ERTOL,BATA DOUBLE PRECISION MULTOL,SCALE0,STUTOL,BTOL,LB,UB DOUBLE PRECISION ONE,ZERO,MACHEP,EPSM,TEMP,SUM DOUBLE PRECISION RELTOL,ERROR,TERROR,ERRMIN,BKMIN REAL G(10000),BMINGP(50),TMINGP(50),EXPLAN(20) REAL TERR(50),BERR(50),BERRGP(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) INTEGER MBOUND,NTVCON,SVTVEC,TVSTOP,LVCONT,ERCONT,TFLAG DOUBLE PRECISION FINPRO DOUBLE PRECISION DABS, DMAX1, DSQRT, DFLOAT REAL ABS INTEGER IABS C----------------------------------------------------------------------- EXTERNAL SVMAT, STRAN DATA MACHEP/Z3410000000000000/ EPSM = 2.D0*MACHEP C----------------------------------------------------------------------- C C ARRAYS MUST BE DIMENSIONED AS FOLLOWS: C 1. BETA: >= (KMAX+1) WHERE KMAX, THE LARGEST SIZE C T-MATRIX CONSIDERED BY THE PROGRAM, IS THE C LARGER OF THE SIZE OF THE BETA HISTORY PROVIDED C ON FILE 2 (IF ANY ) AND THE SIZE WHICH THE PROGRAM C SPECIFIES INTERNALLY, THIS LATTER IS ALWAYS C < = (11*MEV)/8 + 13, WHERE MEV IS THE SIZE C T-MATRIX THAT WAS USED IN THE CORRESPONDING C SINGULAR VALUE COMPUTATIONS. NOTE THAT ALL C T-MATRICES CONSIDERED MUST HAVE EVEN ORDER. C 2. V1: >= MAX(M,KMAX) C 3. V2: >= N C 4. G: >= MAX(M,N,KMAX) C 5. RITVEC: >= (N+M)*NGOOD, WHERE NGOOD IS THE NUMBER OF C SINGULAR VALUES SUPPLIED TO THIS PROGRAM. C 6. TVEC: >= CUMULATIVE LENGTH OF ALL THE T-EIGENVECTORS C NEEDED TO GENERATE THE DESIRED RITZ VECTORS. AN C EDUCATED GUESS AT AN APPROPRIATE LENGTH CAN BE C OBTAINED BY RUNNING THE PROGRAM WITH THE FLAG C MBOUND = 1 AND MULTIPLYING THE RESULTING SIZE BY 5/4. C 7. GOODSV, TMINGP, BMINGP,TERR, BERR, BERRGP, RNORM, C TBETA, TLAST, SVNEW, MP, MA, M1, M2, MINT, MFIN AND C IDELTA MUST ALL BE >= NGOOD. C C----------------------------------------------------------------------- C OUTPUT HEADER WRITE(6,10) 10 FORMAT(/' LANCZOS PROCEDURE FOR REAL, RECTANGULAR MATRICES'/ 1' COMPUTE SINGULAR VECTORS'/) C C SET PROGRAM PARAMETERS C USER MUST NOT MODIFY SCALE0 SCALE0 = 5.0D0 ZERO = 0.0D0 ONE = 1.0D0 MPMIN = -1000 C CONVERGENCE TOLERANCE FOR T-EIGENVECTORS FOR RITZ COMPUTATIONS ERTOL = 1.D-10 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 MATNO = MATRIX/RUN IDENTIFICATION NUMBER, 8 DIGITS OR LESS C AND THE ORDER OF THE MATRIX M X N . C READ(5,20) EXPLAN READ(5,*) MATNO, M, N MN = M + N 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 USED IN DETERMINING APPROPRIATE C SIZES FOR THE T-MATRICES USED IN THE SINGULAR VECTOR COMPUTATIONS. C READ(5,20) EXPLAN READ(5,*) RELTOL 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 (SINGULAR VECTORS) REQUESTED. C ERCONT = 0: MEANS FOR ANY GIVEN SINGULAR VALUE, A RITZ VECTOR C WILL NOT BE COMPUTED FOR THAT SINGULAR VALUE 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 SINGULAR VALUE, 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: BETA FILE IS REGENERATED. C IREAD = 1: BETA FILE USED IN SINGULAR VALUE 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 (RHSEED) FOR GENERATING RANDOM STARTING VECTOR C FOR THE INVERSE ITERATION ON THE T-MATRICES. C READ(5,20) EXPLAN READ(5,*) RHSEED C C----------------------------------------------------------------------- C INITIALIZE THE ARRAYS FOR THE USER-SPECIFIED MATRIX AND C PASS THE STORAGE LOCATIONS OF THESE ARRAYS TO THE MATRIX-VECTOR C MULTIPLY SUBROUTINES SVMAT AND STRAN. C CALL USPEC(M,N,MATNO) C C----------------------------------------------------------------------- C MASK UNDERFLOW AND OVERFLOW CALL MASK C C----------------------------------------------------------------------- C WRITE RUN PARAMETERS OUT TO FILE 6 C WRITE(6,30) M,N,MATNO 30 FORMAT(/' MATRIX ORDER =',I5,' BY ',I5/ 1 ' A-MATRIX AND CASE IDENTIFIER = ',I10/) C WRITE(6,40) MBOUND,NTVCON,SVTVEC,IREAD 40 FORMAT(/3X,'MBOUND',3X,'NTVCON',3X,'SVTVEC',3X,'IREAD'/3I9,I8/) C WRITE(6,50) TVSTOP,LVCONT,ERCONT,IWRITE 50 FORMAT(/3X,'TVSTOP',3X,'LVCONT',3X,'ERCONT',3X,'IWRITE'/4I9) C WRITE(6,60) MDIMTV,MDIMRV,MBETA 60 FORMAT(/3X,'MDIMTV',3X,'MDIMRV',3X,'MBETA'/2I9,I8) C WRITE(6,70) RELTOL,RHSEED 70 FORMAT(/7X,'RELTOL',3X,'RHSEED'/E13.4,I9) C C FROM FILE 3 READ IN THE NUMBER OF SINGULAR VALUES (NGOOD) C FOR WHICH SINGULAR VECTORS ARE REQUESTED, THE ORDER (MEV) OF C THE LANCZOS TRIDIAGONAL MATRIX USED IN COMPUTING THESE C SINGULAR VALUES, THE ORDER MOLD X NOLD OF THE USER-SPECIFIED C MATRIX USED IN THOSE COMPUTATIONS, THE SEED (SVSEED) USED FOR C GENERATING THE STARTING VECTOR THAT WAS USED IN THOSE C COMPUTATIONS, AND THE MATRIX/RUN IDENTIFICATION NUMBER (MATOLD) C USED IN THOSE COMPUTATIONS. ALSO READ IN THE NUMBER (NDIS) OF C DISTINCT EIGENVALUES OF THE MATRIX T(1,MEV) THAT WERE COMPUTED C BUT THIS VALUE IS NOT USED IN THE SINGULAR VECTOR C COMPUTATIONS. C READ(3,80) NGOOD,NDIS,MEV,MOLD,NOLD,SVSEED,MATOLD,IPARO 80 FORMAT(5I6,I12,I8,I2) C C READ IN THE T-MULTIPLICITY TOLERANCE USED IN THE BISEC SUBROUTINE C DURING THE COMPUTATION OF THE GIVEN SINGULAR VALUES. 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 PROGRAM PROCEEDS INDEPENDENTLY OF THE SIZE OF THE BETA USED. C READ(3,90) MULTOL,IB,BTOL 90 FORMAT(E20.12,I6,E13.4) C TEMP = DFLOAT(MEV+1000) TTOL = MULTOL/TEMP WRITE(6,100) MULTOL,TTOL 100 FORMAT(/' T-MULTIPLICITY TOLERANCE USED IN THE SINGULAR VALUE COMP 1UTATIONS 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,110)NGOOD,NDIS,MEV,MOLD,NOLD,MATOLD,SVSEED,MULTOL,IB, 1BTOL,IPARO 110 FORMAT(/' SINGULAR VALUES SUPPLIED ARE READ IN FROM FILE 3'/ 1 6X,'NG',2X,'NDIS',3X,'MEV',2X,'MOLD',2X,'NOLD',2X,'MATOLD',4X/ 1I8,4I6,I8//6X,'SVSEED',6X,'MULTOL',9X,'IB',8X,'BTOL',4X,'IPARO'/ 1I12,E12.3,I11,E12.4,I9/) C C IS THE ARRAY RITVEC LONG ENOUGH TO HOLD ALL OF THE DESIRED C RITZ VECTORS (APPROXIMATE EIGENVECTORS OF B)? MNMAX = NGOOD*MN IF(MBOUND.EQ.1) GO TO 120 IF(TVSTOP.NE.1.AND.MNMAX.GT.MDIMRV) GO TO 1600 C C CHECK THAT THE ORDERS M,N AND THE MATRIX IDENTIFICATION NUMBER C MATNO SPECIFIED BY THE USER AGREE WITH THOSE READ IN FROM C FILE 3. 120 ITEMP = (MOLD-M)**2+(NOLD-N)**2+(MATOLD-MATNO)**2 IF (ITEMP.NE.0) GO TO 1620 C C READ IN FROM FILE 3, THE T-MULTIPLICITIES OF THE SINGULAR VALUES C WHOSE SINGULAR VECTORS ARE TO BE COMPUTED, THE VALUES OF THESE C SINGULAR VALUES AND THEIR MINIMAL GAPS AS SINGULAR VALUES OF THE C USER-SPECIFIED MATRIX AND OF THE RELATED T-MATRIX. C READ(3,20) EXPLAN READ(3,130) (MP(J),GOODSV(J),BMINGP(J),TMINGP(J), J=1,NGOOD) 130 FORMAT(6X,I8,E25.16,2E14.3) C WRITE(6,140) (J,GOODSV(J),MP(J),BMINGP(J), J=1,NGOOD) 140 FORMAT(/' SINGULAR VALUES READ IN FROM FILE 3 AND THEIR T-MULTIPLI 1CITIES'/4X,' J ',4X,' SINGULAR VALUE',5X,'TMULT',4X,'BMINGP'/ 1(I6,E20.12,I6,E13.4)) C WRITE(6,150) MEV,SVSEED 150 FORMAT(/' THESE SINGULAR VALUES WERE COMPUTED USING A T-MATRIX OF 1ORDER ',I5/' AND SEED FOR RANDOM NUMBER GENERATOR =',I12) C C READ IN THE ERROR ESTIMATES C C CHECK WHETHER OR NOT THERE ARE ANY ISOLATED T-EIGENVALUES IN C THE T-EIGENVALUES PROVIDED (HERE THE SINGULAR VALUES ARE C CONSIDERED AS EIGENVALUES OF THE ASSOCIATED LANCZOS TRIDIAGONAL C MATRICES.) DO 160 J=1,NGOOD IF(MP(J).EQ.1) GO TO 170 160 CONTINUE GO TO 190 170 READ(4,20) EXPLAN READ(4,20) EXPLAN READ(4,20) EXPLAN READ(4,180) NISO 180 FORMAT(18X,I6) READ(4,20) EXPLAN READ(4,20) EXPLAN READ(4,20) EXPLAN 190 DO 220 J=1,NGOOD BERR(J) = 0.D0 IF(MP(J).NE.1) GO TO 220 READ(4,200) SVAL, BERR(J) 200 FORMAT(10X,E25.16,E14.3) IF(DABS(SVAL - GOODSV(J)).LT.1.D-10) GO TO 220 WRITE(6,210) SVAL,GOODSV(J) 210 FORMAT(' PROBLEM WITH READ IN OF ERROR ESTIMATES'/' SINGULAR VALUE 1READ IN',E20.12,' DOES NOT MATCH GOODSV(J) ='/E20.12) GO TO 1860 C 220 CONTINUE C WRITE(6,230) (J,GOODSV(J),BERR(J), J=1,NGOOD) 230 FORMAT(' ERROR ESTIMATES ='/4X,' J',3X,'SINGULAR VALUE',8X, 1'ESTIMATE'/(I6,E20.12,E14.3)) C IF(IREAD.EQ.0) IPAR = IPARO IF(IREAD.EQ.0) GO TO 350 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 FLAGS IPARO C AND IPAR WHICH INDICATE RESPECTIVELY THE PARITY OF THE C STARTING VECTOR USED IN THE GENERATION OF THE EXISTING C BETA AND THE PARITY OF THE NEXT LANCZOS VECTOR THAT C HAS TO BE GENERATED IF THE BETA HISTORY IS EXTENDED, C THE SEED USED BY THE RANDOM NUMBER GENERATOR WHEN C GENERATING THE STARTING VECTOR THAT WAS USED, AND THE C MATRIX/TEST IDENTIFICATION NUMBER THAT WERE USED IN C THE LANCZOS SINGULAR VALUE COMPUTATIONS. IF THE FLAG C IREAD = 0, REGENERATE HISTORY AND DO NOT READ ANYTHING C FROM FILE 2. HISTORY MUST BE STORED IN MACHINE FORMAT, C ((4Z20) FOR IBM 3081). C READ(2,240) KMAX,MOLD,NOLD,IPARO,IPAR,SVSOLD,MATOLD 240 FORMAT(3I6,2I3,I12,I8) C WRITE(6,250) KMAX,MOLD,NOLD,IPARO,IPAR,SVSOLD,MATOLD 250 FORMAT(/' READ IN HEADER FROM BETA FILE 2'/ 1 2X,'KMAX',2X,'MOLD',2X,'NOLD',2X,'IPARO',2X,'IPAR',6X,'SVSOLD 1 ',2X,'MATOLD'/3I6,I7,I6,I12,I12) C C CHECK THAT THE PARAMETERS READ IN AGREE WITH WHAT THE USER C HAS SPECIFIED IF(MOLD.NE.M.OR.NOLD.NE.N.OR.MATOLD.NE.MATNO.OR.SVSOLD.NE.SVSEED) 1 GO TO 1640 C IF(IPARO.EQ.1) WRITE(6,260) IF(IPARO.EQ.2) WRITE(6,270) 260 FORMAT(/' STARTING VECTOR USED IN EXISTING SINGULAR VALUE HISTORY 1WAS'/' OF THE FORM (0,V2)') 270 FORMAT(/' STARTING VECTOR USED IN EXISTING SINGULAR VALUE HISTORY 1WAS'/' OF THE FORM (V1,0)') 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. HISTORY MUST BE STORED IN 4Z20 FORMAT. C READ(2,280) (BETA(J), J=1,KMAX1) 280 FORMAT(4Z20) C READ(2,280) (V1(J), J=1,M) READ(2,280) (V2(J), J=1,N) C C KMAX MAY BE ENLARGED IF THE SIZE AT WHICH THE SINGULAR VALUE C COMPUTATIONS WERE PERFORMED IS ESSENTIALLY KMAX AND C THERE IS AT LEAST ONE SINGULAR VALUE THAT IS SIMPLE AS AN C EIGENVALUE OF T(1,MEV), AND IF ITS NEAREST NEIGHBOR IN THE C T-MATRIX IS TOO CLOSE, THAT NEIGHBOR IS A 'GOOD' T-EIGENVALUE. DO 290 J = 1,NGOOD IF(MP(J).EQ.1) GO TO 310 290 CONTINUE WRITE(6,300) 300 FORMAT(/' ALL SINGULAR VALUES USED ARE T-MULTIPLE OR CLOSE TO SPUR 1IOUS EIGENVALUES'/' (AS EIGENVALUES OF T(1,MEV)) SO KMAX IS NOT CH 1ANGED'/) IF(KMAX.LT.MEV) GO TO 1660 GO TO 330 C 310 KMAXN= (11*MEV)/8 + 12 IF((KMAXN/2)*2.NE.KMAXN) KMAXN = KMAXN + 1 IF(MBETA.LE.KMAXN) GO TO 1840 IF(KMAX.GE.KMAXN ) GO TO 330 WRITE(6,320) KMAX, KMAXN 320 FORMAT(' ENLARGE KMAX FROM ',I6,' TO ',I6) MOLD1 = KMAX + 1 KMAX = KMAXN GO TO 420 C 330 WRITE(6,340) KMAX 340 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 460 C C REGENERATE THE BETA C 350 MOLD1 = 1 C IF(IPAR.EQ.1) WRITE(6,360) IF(IPAR.EQ.2) WRITE(6,370) 360 FORMAT(/' STARTING VECTOR USED IN HISTORY REGENERATION IS OF THE 1FORM (0,V2)') 370 FORMAT(/' STARTING VECTOR USED IN HISTORY REGENERATION IS OF THE 1FORM (V1,0)') C DO 380 J = 1,NGOOD IF(MP(J).EQ.1) GO TO 400 380 CONTINUE KMAX = MEV + 12 IF((KMAX/2)*2.NE.KMAX) GO TO 1680 WRITE(6,390) KMAX 390 FORMAT(/' ALL SINGULAR VALUES FOR WHICH SINGULAR VECTORS ARE TO BE 1COMPUTED ARE EITHER T-MULTIPLE OR CLOSE TO'/' A SPURIOUS T-EIGENVA 1LUE THEREFORE SET KMAX = MEV + 12 = ',I7) GO TO 420 C 400 KMAXN = (11*MEV)/8 + 12 IF((KMAXN/2)*2.NE.KMAXN) KMAXN = KMAXN + 1 IF(MBETA.LE.KMAXN) GO TO 1840 WRITE(6,410) KMAXN 410 FORMAT(' SET KMAX EQUAL TO ',I6) KMAX = KMAXN C 420 KMAX1 = KMAX + 1 WRITE(6,430) MOLD1,KMAX1 430 FORMAT(/' LANCZS SUBROUTINE GENERATES BETA(J+1), J =', 1 I6,' TO ', I6/) IF(IREAD.EQ.1.AND.IPAR.EQ.1) WRITE(6,440) IF(IREAD.EQ.1.AND.IPAR.EQ.2) WRITE(6,450) 440 FORMAT(/' FIRST LANCZOS VECTOR IN HISTORY EXTENSION IF OF THE FORM 1 (0,V2)') 450 FORMAT(/' FIRST LANCZOS VECTOR IN HISTORY EXTENSION IF OF THE FORM 1 (V1,0)') C C----------------------------------------------------------------------- C CALL LANCZS(SVMAT,STRAN,BETA,V1,V2,G,KMAX,MOLD1,M,N,IPAR,SVSEED) C C----------------------------------------------------------------------- C 460 CONTINUE C C THE SUBROUTINE STURMI DETERMINES THE SMALLEST SIZE T-MATRIX FOR C WHICH THE SINGULAR VALUE IN QUESTION IS AN EIGENVALUE (TO C WITHIN A SPECIFIED TOLERANCE) AND IF POSSIBLE THE SMALLEST C SIZE T-MATRIX FOR WHICH THE SINGULAR VALUE IS A DOUBLE C EIGENVALUE (TO WITHIN THE SAME TOLERANCE). THE SIZE C T-MATRIX THAT WILL BE USED IN EACH OF THE RITZ VECTOR COMPUTATIONS C IS THEN DETERMINED BY LOOPING ON THE SIZE OF THE T-EIGENVECTOR C COMPUTATIONS, STARTING WITH A SIZE DETERMINED FROM THE C INFORMATION OBTAINED FROM STURMI. C STUTOL = SCALE0*MULTOL IF(IWRITE.EQ.1) WRITE(6,470) 470 FORMAT(' FROM STURMI') DO 510 J = 1,NGOOD SVAL = GOODSV(J) C COMPUTE THE TOLERANCES USED BY STURMI TO DETERMINE AN INTERVAL C CONTAINING THE SINGULAR VALUE SVAL. TEMP = DABS(SVAL)*RELTOL TOLN = DMAX1(TEMP,STUTOL) C C----------------------------------------------------------------------- C CALL STURMI(BETA,SVAL,TOLN,EPSM,KMAX,MK1,MK2,IC,IWRITE) C C----------------------------------------------------------------------- C C STORE THE COMPUTED ORDERS OF T-MATRICES FOR LATER PRINTOUT IF(MK1.GT.1) GO TO 475 C SVAL IS VERY SMALL SINGULAR VALUE, RESET MK1 TO CORRECT VALUE MK1 = MK2 MK2 = MIN0(2*MK1,KMAX) M1(J) = MK1 M2(J) = MK2 ML(J) = MK2 GO TO 476 475 M1(J) = MK1 M2(J) = MK2 ML(J) = (MK1 + 3*MK2)/4 IF(MK2.EQ.KMAX) ML(J) = KMAX C 476 IF(IC.GT.0) GO TO 490 C IC = 0 MEANS THERE WAS NO T-EIGENVALUE IN THE DESIGNATED INTERVAL C EVEN BY T-SIZE KMAX. THIS MEANS THAT THE SINGULAR VALUE C PROVIDED HAS NOT YET CONVERGED SO PROGRAM DOES NOT COMPUTE C A SINGULAR VECTOR FOR IT. WRITE(6,480) J,GOODSV(J),MK1,MK2 480 FORMAT(I6,'TH SINGULAR VALUE',E20.12,' HAS NOT CONVERGED '/ 1' SO DO NOT COMPUTE ANY T-EIGENVECTOR OR RITZ VECTOR FOR IT' 1/' MK1 AND MK2 FOR THIS SINGULAR VALUE WERE',2I6) MP(J) = MPMIN MA(J) = -2*KMAX GO TO 510 C COMPUTE AN APPROPRIATE SIZE T-MATRIX FOR THE GIVEN SINGULAR C VALUE. 490 IF(M2(J).EQ.KMAX) GO TO 500 C M1 AND M2 WERE BOTH DETERMINED MAJ = (3*M1(J) + M2(J))/4 + 1 IF((MAJ/2)*2.NE.MAJ) MAJ = MAJ + 1 MA(J) = MAJ GO TO 510 C M2 NOT DETERMINED 500 MAJ = (5*M1(J))/4 + 1 IF((MAJ/2)*2.NE.MAJ) MAJ = MAJ + 1 MA(J) = MAJ C 510 CONTINUE C IF (IWRITE.EQ.1) WRITE(6,520) (MA(JJ), JJ=1,NGOOD) 520 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 THE T-MATRICES TO C BE USED IN THE SINGULAR VECTOR COMPUTATIONS. C PROGRAM LOOPS ON T-SIZE TO DETERMINE APPROPRIATE SIZE T-MATRIX. WRITE(10,530) N,KMAX 530 FORMAT(2I8,' = ORDER OF USER MATRIX AND MAX ORDER OF T(1,MEV)') C WRITE(10,540) 540 FORMAT(/' 1ST GUESS AT APPROPRIATE SIZE T-MATRICES'/ 1 ' ACTUAL VALUES WILL PROBABLY BE 1/4 AGAIN AS MUCH'/) C WRITE(10,550) 550 FORMAT(4X,'J',7X,'GOODSV(J)',4X,'M1(J)',1X,'M2(J)',1X,'MA(J)') C WRITE(10,560) (J,GOODSV(J),M1(J),M2(J), MA(J), J=1,NGOOD) 560 FORMAT(I5,E19.12,3I6) C IF(MBOUND.EQ.1) WRITE(10,570) 570 FORMAT(/' GOODSV(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 (SV-TOLN,SV+TOLN)'/ 1 ' TOLN(J) = DMAX1(GOODSV(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 APPROPRIATE 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 SINGULAR VALUES? IF(MBOUND.EQ.1) GO TO 1700 C C C IS THERE ROOM FOR ALL OF THE REQUESTED T-EIGENVECTORS? MTOL = 0 DO 580 J = 1,NGOOD IF(MP(J).EQ.MPMIN) GO TO 580 MTOL = MTOL + IABS(MA(J)) 580 CONTINUE MTOL = (5*MTOL)/4 IF(MTOL.GT.MDIMTV.AND.NTVCON.EQ.0) GO TO 1720 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 FOR EACH SINGULAR VALUE LOOP ON T-EIGENVECTOR COMPUTATIONS C TO COMPUTE AN APPROPRIATE T-EIGENVECTOR TO USE IN THE C RITZ VECTOR COMPUTATIONS. C MTOL = 0 NTVEC = 0 ILBIS = 0 DO 770 J = 1,NGOOD ICOUNT = 0 ERRMIN = 10.D0 MABEST = MPMIN IF(MP(J).EQ.MPMIN) GO TO 770 TFLAG = 0 SVAL = GOODSV(J) TEMP = RELTOL*DABS(SVAL) UB = SVAL + DMAX1(STUTOL,TEMP) LB = SVAL - DMAX1(STUTOL,TEMP) LB = DMAX1(LB,ZERO) 590 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. ALL ORDERS CONSIDERED MUST BE EVEN. IF(ICOUNT.GT.0) GO TO 610 C SELECT IDELTA(J) BASED UPON THE T-MULTIPLICITY OBTAINED IF(M2(J).EQ.KMAX) GO TO 600 C M2 DETERMINED IDEL = ((3*M1(J) + 5*M2(J))/8 + 1 - IABS(MA(J)))/10 + 1 IF((IDEL/2)*2.NE.IDEL) IDEL = IDEL + 1 IDELTA(J) = IDEL GO TO 610 C M2 NOT DETERMINED 600 MAMAX = MIN0((11*MEV)/8 + 12, (13*M1(J))/8 + 1) IDEL = (MAMAX - IABS(MA(J)))/10 + 1 IF((IDEL/2)*2.NE.IDEL) IDEL = IDEL + 1 IDELTA(J) = IDEL 610 ICOUNT = ICOUNT + 1 C C----------------------------------------------------------------------- C TO MIMIMIZE THE EFFECT OF THE ONE-SIDED ACCEPTANCE TEST FOR C EIGENVALUES IN THE BISEC SUBROUTINE, RECOMPUTE THE GIVEN C SINGULAR VALUE AT THE SPECIFIED KMAXU C CALL LBISEC(BETA,EPSM,SVAL,SVALN,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 650 IF(NEVT.NE.0) GO TO 630 ILBIS = 1 WRITE(6,620) SVAL,KMAXU 620 FORMAT(/' PROBLEM ENCOUNTERED IN RECOMPUTATION OF USER-SUPPLIED SI 1NGULAR VALUE',E20.12/' THE SIZE T-MATRIX SPECIFIED',I6,' DOES NOT 1HAVE A SINGULAR VALUE IN THE INTERVAL SPECIFIED'/' INCREASE SIZE A 1ND TRY AGAIN'/) GO TO 670 C 630 IF(NEVT.GT.1) WRITE(6,640) SVAL,KMAXU 640 FORMAT(/' PROBLEM ENCOUNTERED IN RECOMPUTATION OF USER-SUPPLIED 1SINGULAR VALUE',E20.12/' FOR THE SIZE T-MATRIX SPECIFIED =',I6,' T 1HE GIVEN SINGULAR VALUE IS T-MULTIPLE IN THE INTERVAL SPECIFIED'/' 1SOMETHING IS WRONG, THEREFORE NO SINGULAR VECTORS WILL BE COMPUTED 1 FOR THIS SINGULAR VALUE'/) C MP(J) = MPMIN MA(J) = -2*KMAX GO TO 770 C 650 CONTINUE ILBIS = 0 C C SVNEW(J) = SVALN SVAL = SVALN 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 780 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) - SVAL)*U = RHS FOR EACH SINGULAR VALUE TO C OBTAIN THE DESIRED T-EIGENVECTOR. C IF(IWRITE.EQ.1) WRITE(6,660) J 660 FORMAT(/I6,'TH SINGULAR VALUE ') C CALL INVERM(BETA,V1,TVEC(KINT),SVAL,ERROR,TERROR,EPSM,G,KMAXU, 1 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 760 C IF(ERROR.GE.ERRMIN) GO TO 670 C LAST COMPONENT IS LESS THAN MINIMAL TO DATE ERRMIN = ERROR MABEST = MA(J) 670 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 690 C NEW MA(J) IS GREATER THAN MAXIMUM ALLOWED. IF(ERCONT.EQ.0.OR.MABEST.EQ.MPMIN) GO TO 710 TFLAG = 1 MA(J) = MABEST IF(ILBIS.EQ.0) MTOL = MTOL - KMAXU WRITE(6,680) MA(J) 680 FORMAT(' 10 ORDERS WERE CONSIDERED. NONE SATISFIED THE ERROR TEST 1'/' THEREFORE USE THE BEST ORDER OBTAINED FOR THE T-EIGENVECTORS' 1,I6) GO TO 590 C 690 MA(J) = ITEST C MT = IABS(MA(J)) IF(IWRITE.EQ.1.AND.ILBIS.EQ.0) WRITE(6,700) MT 700 FORMAT(/' CHANGE SIZE OF T-MATRIX TO ',I6,' RECOMPUTE T-EIGENVECTO 1R') C IF(ILBIS.EQ.0) MTOL = MTOL - KMAXU C GO TO 590 C C APPROPRIATE SIZE T-MATRIX WAS NOT OBTAINED 710 CONTINUE WRITE(10,720) J,SVAL,MP(J) 720 FORMAT(/' ON 10 INCREMENTS NOT ABLE TO IDENTIFY APPROPRIATE SIZE 1T-MATRIX FOR'/ 1I4,' TH SINGULAR VALUE = ',E20.12,' T-MULTIPLICITY =',I4/) IF(M2(J).EQ.KMAX) WRITE(10,730) IF(M2(J).LT.KMAX) WRITE(10,740) 730 FORMAT(/' ORDERS TESTED RANGED FROM 5*M1(J)/4 TO APPROXIMATELY'/ 1 ' MIN(11*MEV/8, 13*M1(J)/8)'/) 740 FORMAT(/' ORDERS TESTED RANGED FROM (3*M1(J)+M2(J))/4 TO APPROXIM 1ATELY'/' (3*M1(J)+5*M2(J))/8'/) WRITE(10,750) 750 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 SINGULAR VALUE, CHECK THE ERROR E 1STIMATE') MP(J) = MPMIN IF(ILBIS.EQ.0) MTOL = MTOL - KMAXU GO TO 770 760 NTVEC = NTVEC + 1 C 770 CONTINUE NGOODC = NGOOD GO TO 800 C C COME HERE IF THERE IS NOT ENOUGH ROOM FOR ALL OF T-EIGENVECTORS 780 NGOODC = J-1 WRITE(6,790) J,MTOL,MDIMTV 790 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 1740 MTOL = MTOL-KMAXU C 800 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,810) 810 FORMAT(/' SIZES OF T-MATRICES THAT WILL BE USED IN THE RITZ COMPUT 1ATIONS'/5X,'J',8X,' SINGULAR VALUE ',1X,'MA(J)') C WRITE(10,820) (J,GOODSV(J),MA(J), J=1,NGOOD) 820 FORMAT(I6,E25.14,I6) WRITE(10,570) C WRITE(6,830) MTOL 830 FORMAT(/' THE CUMULATIVE LENGTH OF THE T-EIGENVECTORS IS',I18) C WRITE(6,840) NTVEC,NGOOD 840 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 900 C WRITE(11,850) NTVEC,MTOL,MATNO,SVSEED 850 FORMAT(I6,3I12,' = NTVEC,MTOL,MATNO,SVSEED') C DO 880 J=1,NGOODC C IF MP(J) = MPMIN THEN NO SUITABLE T-EIGENVECTOR IS AVAILABLE C FOR THAT SINGULAR VALUE. IF(MP(J).EQ.MPMIN) WRITE(11,860) J,MA(J),GOODSV(J),MP(J) 860 FORMAT(2I6,E20.12,I6/' TH SINGVAL,T-SIZE,SVALUE,FLAG,NO EIGVEC') IF(MP(J).NE.MPMIN) WRITE(11,870) J,MA(J),GOODSV(J),MP(J) 870 FORMAT(I6,I6,E20.12,I6/' T-EIGVEC,SIZE T,SVALUE OF A,MP(J)') IF(MP(J).EQ.MPMIN) GO TO 880 KI = MINT(J) KF = MFIN(J) C WRITE(11,280) (TVEC(K), K=KI,KF) C 880 CONTINUE C IF(TVSTOP.NE.1) GO TO 900 C WRITE(6,890) TVSTOP, NTVEC,NGOOD 890 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 1860 C 900 CONTINUE C IF NOT ALL OF THE REQUESTED T-EIGENVECTORS WERE COMPUTED, C ARE THE LANCZOS SINGULAR VECTOR COMPUTATIONS CONTINUED? C IF(NTVEC.NE.NGOOD.AND.LVCONT.EQ.0) GO TO 1760 C C COMPUTE THE MAXIMUM SIZE OF THE T-MATRIX USED FOR THOSE C SINGULAR VALUES WITH GOOD ERROR ESTIMATES. C KMAXU = 0 DO 910 J = 1,NGOODC MT = IABS(MA(J)) IF(MT.LT.KMAXU.OR.MP(J).EQ.MPMIN) GO TO 910 KMAXU = MT 910 CONTINUE C IF(KMAXU.EQ.0) GO TO 1800 C WRITE(6,920) KMAXU 920 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 930 J=1,NGOODC 930 IF(MP(J).EQ.MPMIN) MREJEC = MREJEC + 1 MREJET = MREJEC + (NGOOD-NGOODC) IF(MREJET.NE.0) WRITE(6,940) MREJET 940 FORMAT(/' RITZ VECTORS ARE NOT COMPUTED FOR',I6,' OF THE SINGULAR 1VALUES'/) NACT = NGOODC - MREJEC WRITE(6,950) NGOOD,NTVEC,NACT 950 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 1780 C C CONTINUE WITH THE LANCZOS VECTOR COMPUTATIONS? IF(LVCONT.EQ.0.AND.MREJEC.NE.0) GO TO 1760 C C NOW COMPUTE THE RITZ VECTORS. REGENERATE THE C LANCZOS VECTORS. C DO 960 I = 1,MNMAX 960 RITVEC(I) = ZERO C C REGENERATE THE STARTING VECTOR. THIS MUST BE GENERATED AND C NORMALIZED PRECISELY THE WAY IT WAS DONE IN THE CORRESPONDING C SINGULAR VALUE COMPUTATIONS, OTHERWISE THERE WILL BE A C MISMATCH BETWEEN THE T-EIGENVECTORS THAT HAVE BEEN COMPUTED C FROM THE T-MATRICES READ IN FROM FILE 2 (IF THEY WERE READ IN) C AND THE LANCZOS TRIDIAGONAL MATRICES THAT ARE BEING REGENERATED. C C STARTING VECTORS ARE OF THE FORM (V1,0) OR (0,V2) WHERE V1 IS C OF LENGTH M AND V2 IS OF LENGTH N. SUCCEEDING LANCZOS VECTORS C ALTERNATE BETWEEN THESE TWO FORMS AND THE DIAGONAL ENTRIES OF THE C T-MATRICES ALL VANISH. THE PARAMETER IPARO DETERMINES THE SHAPE C OF THE STARTING VECTOR. IF IPARO=1, THEN STARTING VECTOR WAS C OF THE FORM (0,V2). IF IPARO=2, THEN STARTING VECTOR WAS OF C THE FORM (V1,0). C REGENERATE STARTING VECTOR BATA = ZERO IPAR = IPARO ITNUM = 1 IF (IPAR.EQ.2) GO TO 1020 C C----------------------------------------------------------------------- C IPAR = 1 SO SET V2 TO RANDOM UNIT VECTOR AND SET V1 = 0. C IIL = SVSEED CALL GENRAN(IIL,G,N) C C----------------------------------------------------------------------- C DO 970 J = 1,N 970 V2(J) = G(J) C----------------------------------------------------------------------- SUM = ONE/DSQRT(FINPRO(N,V2,1,V2,1)) C----------------------------------------------------------------------- C DO 980 J = 1,M 980 V1(J) = ZERO C DO 990 J = 1,N 990 V2(J) = V2(J)*SUM C C INITIALIZE RITZ VECTORS DO 1010 J = 1,NGOODC IF (MP(J).EQ.MPMIN) GO TO 1010 LL = MN*J - N II = MINT(J) TEMP = TVEC(II) C DO 1000 K = 1,N LL = LL + 1 1000 RITVEC(LL) = TEMP*V2(K) C 1010 CONTINUE C GO TO 1150 C 1020 CONTINUE C C----------------------------------------------------------------------- C IPAR = 2 SO SET V1 TO RANDOM UNIT VECTOR AND SET V2 = 0. C CALL GENRAN(SVSEED,G,M) C C----------------------------------------------------------------------- C DO 1030 J = 1,M 1030 V1(J) = G(J) C----------------------------------------------------------------------- SUM = ONE/DSQRT(FINPRO(M,V1,1,V1,1)) C----------------------------------------------------------------------- C DO 1040 J = 1,N 1040 V2(J) = ZERO C DO 1050 J = 1,M 1050 V1(J) = V1(J)*SUM C C INITIALIZE RITZ VECTORS DO 1070 J = 1,NGOODC IF (MP(J).EQ.MPMIN) GO TO 1070 LL = MN*(J-1) II = MINT(J) TEMP = TVEC(II) C DO 1060 K = 1,M LL = LL + 1 1060 RITVEC(LL) = TEMP*V1(K) C 1070 CONTINUE C 1080 CONTINUE C C DO ONE ITERATION OF LANCZOS WHERE NEW LANCZOS VECTOR WILL HAVE THE C FORM (0,V2). C C----------------------------------------------------------------------- C CALL STRAN(V1,V2,BATA) C C----------------------------------------------------------------------- C C----------------------------------------------------------------------- BATA = DSQRT(FINPRO(N,V2,1,V2,1)) C----------------------------------------------------------------------- SUM = ONE/BATA ITNUM = ITNUM + 1 IPAR = 2 C TEMP = BETA(ITNUM) TEMP = DABS(BATA - TEMP)/TEMP IF (TEMP.LT.1.0D-10) GO TO 1110 C C HISTORY MISMATCH ON REGENERATION THUS DEFAULT 1090 WRITE(6,1100) ITNUM,IPAR,BATA,BETA(ITNUM),TEMP 1100 FORMAT(1X,'ITNUM',2X,'IPAR',16X,'BATA',16X,'BETA',14X,'RELERR'/ 1 2I6,3E20.12/' BATA AND BETA DO NOT AGREE SO PROGRAM STOPS'/) GO TO 1860 C 1110 CONTINUE C NORMALIZE LANCZOS VECTOR DO 1120 J = 1,N 1120 V2(J) = V2(J)*SUM C C UPDATE RITZ VECTORS DO 1140 J = 1,NGOODC IF (IABS(MA(J)).LT.ITNUM.OR.MP(J).EQ.MPMIN) GO TO 1140 LL = MN*J - N II = MINT(J) + ITNUM - 1 TEMP = TVEC(II) C DO 1130 K = 1,N LL = LL + 1 1130 RITVEC(LL) = TEMP*V2(K) + RITVEC(LL) C 1140 CONTINUE C HAVE ALL REQUIRED LANCZOS VECTORS BEEN REGENERATED ? C IF(ITNUM.EQ.KMAXU) GO TO 1190 C 1150 CONTINUE C C DO ONE ITERATION OF LANCZOS WHERE NEW LANCZOS VECTOR WILL HAVE C THE FORM (V1,0). C C----------------------------------------------------------------------- C CALL SVMAT(V2,V1,BATA) C C----------------------------------------------------------------------- C C----------------------------------------------------------------------- BATA = DSQRT(FINPRO(M,V1,1,V1,1)) C----------------------------------------------------------------------- SUM = ONE/BATA ITNUM = ITNUM + 1 IPAR = 1 C TEMP = BETA(ITNUM) TEMP = DABS(BATA - TEMP)/TEMP IF (TEMP.GE.1.0D-10) GO TO 1090 C C NORMALIZE LANCZOS VECTOR DO 1160 J = 1,M 1160 V1(J) = V1(J)*SUM C C UPDATE RITZ VECTORS DO 1180 J = 1,NGOODC IF (IABS(MA(J)).LT.ITNUM.OR.MP(J).EQ.MPMIN) GO TO 1180 LL = MN*(J-1) II = MINT(J) + ITNUM - 1 TEMP = TVEC(II) C DO 1170 K = 1,M LL = LL + 1 1170 RITVEC(LL) = TEMP*V1(K) + RITVEC(LL) C 1180 CONTINUE C HAVE ALL REQUIRED LANCZOS VECTORS BEEN COMPUTED ? IF (ITNUM.LT.KMAXU) GO TO 1080 C 1190 CONTINUE C C RITZVECTOR GENERATION IS COMPLETE. NORMALIZE EACH RITZVECTOR C AS AN EIGENVECTOR OF THE ASSOCIATED SYMMETRIC MATRIX B. C THEN COMPUTE THE ERRORS IN THESE VECTORS AS EIGENVECTORS C OF B AND WRITE THESE OUT TO FILE 9. THEN INDIVIDUALLY C NORMALIZE THE FIRST M AND THE LAST N COMPONENTS OF EACH OF C THESE RITZ VECTORS AND TAKE THESE NORMALIZED VECTORS AS C RESPECTIVELY APPROXIMATIONS TO THE LEFT AND TO THE RIGHT C SINGULAR VECTORS OF THE CORRESPONDING SINGULAR VALUE OF C THE ORIGINAL MATRIX. C C C NORMALIZE THE RITZ VECTORS AS EIGENVECTORS OF B DO 1280 J = 1,NGOODC IF (MP(J).EQ.MPMIN) GO TO 1280 LINT = MN*(J-1) + 1 LFIN = MN*J SUM = ZERO SVAL = SVNEW(J) C DO 1200 K = LINT,LFIN 1200 SUM = SUM + RITVEC(K)*RITVEC(K) C SUM = DSQRT(SUM) RNORM(J) = SUM TEMP = ONE - SUM SUM = ONE/SUM C DO 1210 K = LINT,LFIN 1210 RITVEC(K) = RITVEC(K)*SUM C C COMPUTE ERROR IN RITZ VECTOR CONSIDERED AS AN EIGENVECTOR OF B. LINTM = LINT + M L = LINT - 1 DO 1220 K = 1,M L = L + 1 1220 V1(K) = RITVEC(L) DO 1230 K = 1,N L = L + 1 1230 V2(K) = RITVEC(L) C C----------------------------------------------------------------------- C CALL SVMAT(RITVEC(LINTM),V1,SVAL) CALL STRAN(RITVEC(LINT),V2,SVAL) C C----------------------------------------------------------------------- C SUM = ZERO DO 1240 JJ = 1,M 1240 SUM = SUM + V1(JJ)*V1(JJ) C DO 1250 JJ = 1,N 1250 SUM = SUM + V2(JJ)*V2(JJ) C IF(IWRITE.NE.0) WRITE(6,1260) J,GOODSV(J) 1260 FORMAT(/I5,'TH SINGULAR VALUE CONSIDERED =',E20.12/) C IF(IWRITE.NE.0) WRITE(6,1270) TERR(J), TBETA(J), RNORM(J) 1270 FORMAT(' RESIDUAL FOR T-EIGENVECTOR = ',E14.3/ 1' DABS(BETA(MA(J)+1)*U(MA(J)) = ' ,E14.3/ 1' NORM(RITZVEC) = ', E14.3/) C SUM = DSQRT(SUM) BERR(J) = SUM BERRGP(J) = SUM/ABS(BMINGP(J)) 1280 CONTINUE C C RITZVECTORS ARE NORMALIZED AND B-MATRIX ESTIMATES ARE IN BERR C AND IN BERRGP ARRAYS. STORE THESE ESTIMATES BUT NOT THE C VECTORS. C WRITE(9,1290) 1290 FORMAT(11X,'GOODSV(J)',3X,'MA(J)',2X,' BMINGAP',6X,' BERROR',2X, 1 'BERROR/BGAP',4X,' TERROR') C WRITE(13,1300) 1300 FORMAT(11X,'GOODSV(J)',5X,'RITZNORM',5X,' BMINGAP',5X,'TBETA(J)', 1 5X,'TLAST(J)') C DO 1330 J=1,NGOODC C IF(MP(J).EQ.MPMIN) GO TO 1330 C WRITE(9,1310)SVNEW(J),MA(J),BMINGP(J),BERR(J),BERRGP(J),TERR(J) 1310 FORMAT(E20.12,I6,4E13.5) C WRITE(13,1320) SVNEW(J),RNORM(J),BMINGP(J),TBETA(J),TLAST(J) 1320 FORMAT(E20.12,4E13.5) C 1330 CONTINUE C IF (MREJEC.EQ.0) GO TO 1410 C WRITE(9,1340) 1340 FORMAT(/' RITZ VECTORS WERE NOT COMPUTED FOR THE FOLLOWING SINGULA 1R VALUES'/' EITHER BECAUSE THEY HAD NOT CONVERGED OR BECAUSE THE E 1RROR ESTIMATE'/' WAS NOT AS SMALL AS DESIRED'/) C WRITE(13,1350) 1350 FORMAT(/' RITZ VECTORS WERE NOT COMPUTED FOR THE FOLLOWING SINGULA 1R VALUES'/' EITHER BECAUSE THEY HAD NOT CONVERGED OR BECAUSE THE E 1ERROR ESTIMATE'/' WAS NOT AS SMALL AS DESIRED'/) C DO 1400 J = 1,NGOODC IF(MP(J).NE.MPMIN) GO TO 1400 C EACH SINGULAR VALUE FOR WHICH NO SINGULAR VECTOR WAS CALCULATED C HAS INFORMATION OUTPUTTED TO FILES 4 AND 13 C WRITE(9,1360) 1360 FORMAT(6X,'GOODSV(J)',3X,'MA(J)',5X,'BMINGP(J)',6X,'TLAST(J)', 1 6X,'TBETA(J)',3X,'MP(J)') WRITE(9,1370) GOODSV(J),MA(J),BMINGP(J),TLAST(J),TBETA(J),MP(J) 1370 FORMAT(E15.8,I8,3E14.4,I8) C WRITE(13,1380) 1380 FORMAT(6X,'GOODSV(J)',3X,'MA(J)',3X,'M1(J)',3X,'M2(J)',3X,'MP(J)' 1/) WRITE(13,1390) GOODSV(J),MA(J),M1(J),M2(J),MP(J) 1390 FORMAT(E15.8,4I8) C 1400 CONTINUE C 1410 CONTINUE C WRITE(9,1420) 1420 FORMAT(/' ABOVE ARE ERROR ESTIMATES FOR THE B AND T EIGENVECTORS'/ 1 ' ASSOCIATED WITH THE GOODSV LISTED IN COLUMN 1'/ 1 ' BERROR = NORM(B*X - SV*X) TERROR = NORM(T*Y - SV*Y) '/ 1 ' WHERE T = T(1,MA(J)) X = RITZ VECTOR = V*Y V = SUCCESSIVE'/ 1 ' LANCZOS VECTORS. BMINGAP = GAP TO NEAREST B-EIGENVALUE'//) C WRITE(13,1430) 1430 FORMAT(/' ABOVE ARE ERROR ESTIMATES FOR THE GOODSVS'/ 1 ' RITZNORM = NORM(COMPUTED RITZ VECTOR FOR B-MATRIX'/ 1 ' TBETA(J) = BETA(MA(J)+1)*Y(MA(J)), T*Y = SV*Y '/ 1 ' TLAST(J) = DABS(Y(MA(J)) '/) C C NUMBER OF RITZ VECTORS COMPUTED NCOMPU = NGOODC - MREJEC WRITE(12,1440) N,NCOMPU,NGOODC,MATNO 1440 FORMAT(3I6,I12,' SIZE A, NO.RITZVECS, NO.SVALUES,MATNO') C C INDIVIDUALLY NORMALIZE THE FIRST M AND THE LAST N COMPONENTS OF C EACH RITZ VECTOR. C LFIN = 0 DO 1560 J = 1,NGOODC C IF(MP(J).EQ.MPMIN) GO TO 1540 C C RITZ VECTOR WAS COMPUTED LINT = MN*(J-1) + 1 LFIN = MN*J LFIN1 = LINT + M - 1 LINT1 = LFIN1 + 1 C SUM = 0.D0 TEMP = 0.D0 DO 1450 I = LINT,LFIN1 1450 SUM = SUM + RITVEC(I)*RITVEC(I) SUM = ONE/DSQRT(SUM) DO 1460 I = LINT,LFIN1 1460 RITVEC(I) = SUM*RITVEC(I) DO 1470 I = LINT1,LFIN 1470 TEMP = TEMP + RITVEC(I)*RITVEC(I) TEMP = ONE/DSQRT(TEMP) DO 1480 I = LINT1,LFIN 1480 RITVEC(I) = TEMP*RITVEC(I) C WRITE(12,1490) J, GOODSV(J), MP(J) 1490 FORMAT(/I6,4X,E20.12,I6,' J, SINGULAR VALUE, MP(J)') C WRITE(12,1500) BERR(J),BERRGP(J) 1500 FORMAT(2E15.5,' = NORM(B*Z-SVAL*Z) AND NORM(B*Z-SVAL*Z)/BMINGAP') C WRITE(12,1510) J 1510 FORMAT(/I6,'TH LEFT SINGULAR VECTOR'/) C WRITE(12,170) (RITVEC(LL), LL=LINT,LFIN1) WRITE(12,1520) (RITVEC(LL), LL=LINT,LFIN1) 1520 FORMAT(4E20.12) C WRITE(12,1530) J 1530 FORMAT(/I6,'TH RIGHT SINGULAR VECTOR'/) C WRITE(12,170) (RITVEC(LL), LL=LINT1,LFIN) WRITE(12,1520) (RITVEC(LL), LL=LINT1,LFIN) C GO TO 1560 C C NO RITZ VECTOR WAS COMPUTED FOR THIS SINGULAR VALUE 1540 WRITE(12,1550) J,GOODSV(J),MP(J) 1550 FORMAT(I6,4X,E20.12,I6,' J,SINGVALUE,MP(J),NO RITZ VECTOR COMPUTED 1') C 1560 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 1590 WRITE(6,1570) KMAXU 1570 FORMAT(/' FOR LARGEST T-MATRIX CONSIDERED',I7,' CHECK THE SIZE OF 1BETAS') C C----------------------------------------------------------------------- C CALL TNORM(BETA,BKMIN,TEMP,KMAXU,IBMT) C C----------------------------------------------------------------------- C IF(IBMT.LT.0) WRITE (6,1580) 1580 FORMAT(/' WARNING THE T-MATRICES FOR ONE OR MORE OF THE SINGULAR V 1ALUES CONSIDERED'/' HAD AN OFF-DIAGONAL ENTRY THAT WAS SMALLER THA 1N THE BETA TOLERANCE THAT WAS SPECIFIED'/) 1590 CONTINUE C GO TO 1860 C 1600 WRITE(6,1610) NGOOD,MNMAX,MDIMRV 1610 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 SINGULAR VECTOR PROCEDURE TERMINATES FOR THE USE 1R TO INTERVENE') C GO TO 1860 C 1620 WRITE(6,1630) MOLD,M,NOLD,N,MATOLD,MATNO 1630 FORMAT(/' GOODSV PARAMETERS READ FROM FILE 3 DO NOT AGREE WITH THO 1SE'/' SPECIFIED BY THE USER. MOLD,M,NOLD,N,MATOLD,MATNO ='/ 14I6, 2I12/' THEREFORE PROGRAM TERMINATES FOR USER TO RESOLVE DIFFE 1RENCES'/) C GO TO 1860 C 1640 WRITE(6,1650) 1650 FORMAT(/' PARAMETERS IN BETA FILE DO NOT AGREE WITH THOSE SPECIFIE 1D BY THE USER.'/' THEREFORE, THE PROGRAM TERMINATES FOR THE USER T 1O RESOLVE THE DIFFERENCES'/) C GO TO 1860 C 1660 WRITE(6,1670) KMAX,MEV 1670 FORMAT(/' IN BETA HISTORY HEADER KMAX =',I6/ 1' BUT SINGULAR VALUES WERE COMPUTED AT MEV = ',I6,' PROGRAM STOPS' 1) C GO TO 1860 C 1680 WRITE(6,1690) MEV 1690 FORMAT(/' SOMETHING IS WRONG.'/' HEADER SAYS THAT SIZE T-MATRIX US 1ED IN THE SINGULAR VALUE COMPUTATIONS WAS = ',I6/' BUT THIS IS AN 1ODD ORDER AND THAT IS NOT ALLOWED. PROGRAM STOPS'/) C GO TO 1860 C 1700 WRITE(6,1710) 1710 FORMAT(/' PROGRAM COMPUTED 1ST GUESSES AT T-MATRIX SIZES, READ THE 1M TO FILE 10'/' THEN TERMINATED AS REQUESTED.') GO TO 1860 C 1720 WRITE(6,1730) MTOL, MDIMTV 1730 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 1860 C 1740 WRITE(6,1750) 1750 FORMAT(/' PROGRAM TERMINATES BECAUSE NO SUITABLE T-EIGENVECTORS WE 1RE IDENTIFIED'/' FOR ANY OF THE SINGULAR VALUES SUPPLIED. PROBLEM 1 COULD BE CAUSED BY'/' TOO SMALL A TVEC DIMENSION OR SIMPLY BE THA 1T NO SUITABLE T-VECTORS'/' WERE IDENTIFIED. USER SHOULD CHECK OUT 1PUT'/) GO TO 1860 C 1760 WRITE(6,1770) LVCONT,NTVEC,NGOOD 1770 FORMAT(/' LVCONT FLAG =',I2,' AND NUMBER ',I5,' OF T-EIGENVECTORS 1 COMPUTED N.E.'/' NUMBER',I5,' REQUESTED SO PROGRAM TERMINATES'/) GO TO 1860 1780 WRITE(6,1790) 1790 FORMAT(/' PROGRAM TERMINATES WITHOUT COMPUTING ANY RITZ VECTORS'/ 1/' BECAUSE ALL OF THE T-EIGENVECTORS WERE REJECTED AS NOT SUITABLE 1 FOR'/' THE RITZ VECTOR COMPUTATIONS. PROBABLE CAUSE WAS LACK OF 1CONVERGENCE'/' OF THE SINGULAR VALUES'/) GO TO 1860 C 1800 WRITE(6,1810) 1810 FORMAT(/' PROGRAM INDICATES THAT IT IS NOT POSSIBLE TO COMPUTE ANY 1 OF THE'/' REQUESTED EIGENVECTORS. THEREFORE PROGRAM TERMINATES') DO 1820 J=1,NGOODC 1820 WRITE(6,1830) J,GOODSV(J),MP(J) 1830 FORMAT(/4X,' J',11X,'GOODSV(J)',4X,'MP(J)'/I6,E20.12,I9) GO TO 1860 C 1840 WRITE(6,1850) MBETA,KMAXN 1850 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 BETA ARRAY AND RERUN 1 THE PROGRAM'/) C 1860 CONTINUE C STOP C-----END OF MAIN PROGRAM FOR LANCZOS SINGULAR VECTOR COMPUTATIONS------ END .