1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883
|
C VERSION 2 DOES NOT USE EISPACK
C
C ------------------------------------------------------------------
C
SUBROUTINE DNLASO(OP, IOVECT, N, NVAL, NFIG, NPERM,
* NMVAL, VAL, NMVEC, VEC, NBLOCK, MAXOP, MAXJ, WORK,
* IND, IERR)
C
INTEGER N, NVAL, NFIG, NPERM, NMVAL, NMVEC, NBLOCK,
* MAXOP, MAXJ, IND(1), IERR
DOUBLE PRECISION VEC(NMVEC,1), VAL(NMVAL,4), WORK(1)
EXTERNAL OP, IOVECT
C
C AUTHOR/IMPLEMENTER D.S.SCOTT-B.N.PARLETT/D.S.SCOTT
C
C COMPUTER SCIENCES DEPARTMENT
C UNIVERSITY OF TEXAS AT AUSTIN
C AUSTIN, TX 78712
C
C VERSION 2 ORIGINATED APRIL 1982
C
C CURRENT VERSION JUNE 1983
C
C DNLASO FINDS A FEW EIGENVALUES AND EIGENVECTORS AT EITHER END OF
C THE SPECTRUM OF A LARGE SPARSE SYMMETRIC MATRIX. THE SUBROUTINE
C DNLASO IS PRIMARILY A DRIVER FOR SUBROUTINE DNWLA WHICH IMPLEMENTS
C THE LANCZOS ALGORITHM WITH SELECTIVE ORTHOGONALIZATION AND
C SUBROUTINE DNPPLA WHICH POST PROCESSES THE OUTPUT OF DNWLA.
C HOWEVER DNLASO DOES CHECK FOR INCONSISTENCIES IN THE CALLING
C PARAMETERS AND DOES PREPROCESS ANY USER SUPPLIED EIGENPAIRS.
C DNLASO ALWAYS LOOKS FOR THE SMALLEST (LEFTMOST) EIGENVALUES. IF
C THE LARGEST EIGENVALUES ARE DESIRED DNLASO IMPLICITLY USES THE
C NEGATIVE OF THE MATRIX.
C
C
C ON INPUT
C
C
C OP A USER SUPPLIED SUBROUTINE WITH CALLING SEQUENCE
C OP(N,M,P,Q). P AND Q ARE N X M MATRICES AND Q IS
C RETURNED AS THE MATRIX TIMES P.
C
C IOVECT A USER SUPPLIED SUBROUTINE WITH CALLING SEQUENCE
C IOVECT(N,M,Q,J,K). Q IS AN N X M MATRIX. IF K = 0
C THE COLUMNS OF Q ARE STORED AS THE (J-M+1)TH THROUGH
C THE JTH LANCZOS VECTORS. IF K = 1 THEN Q IS RETURNED
C AS THE (J-M+1)TH THROUGH THE JTH LANCZOS VECTORS. SEE
C DOCUMENTATION FOR FURTHER DETAILS AND EXAMPLES.
C
C N THE ORDER OF THE MATRIX.
C
C NVAL NVAL SPECIFIES THE EIGENVALUES TO BE FOUND.
C DABS(NVAL) IS THE NUMBER OF EIGENVALUES DESIRED.
C IF NVAL < 0 THE ALGEBRAICALLY SMALLEST (LEFTMOST)
C EIGENVALUES ARE FOUND. IF NVAL > 0 THE ALGEBRAICALLY
C LARGEST (RIGHTMOST) EIGENVALUES ARE FOUND. NVAL MUST NOT
C BE ZERO. DABS(NVAL) MUST BE LESS THAN MAXJ/2.
C
C NFIG THE NUMBER OF DECIMAL DIGITS OF ACCURACY DESIRED IN THE
C EIGENVALUES. NFIG MUST BE GREATER THAN OR EQUAL TO 1.
C
C NPERM AN INTEGER VARIABLE WHICH SPECIFIES THE NUMBER OF USER
C SUPPLIED EIGENPAIRS. IN MOST CASES NPERM WILL BE ZERO. SEE
C DOCUMENTAION FOR FURTHER DETAILS OF USING NPERM GREATER
C THAN ZERO. NPERM MUST NOT BE LESS THAN ZERO.
C
C NMVAL THE ROW DIMENSION OF THE ARRAY VAL. NMVAL MUST BE GREATER
C THAN OR EQUAL TO DABS(NVAL).
C
C VAL A TWO DIMENSIONAL DOUBLE PRECISION ARRAY OF ROW
C DIMENSION NMVAL AND COLUMN DIMENSION AT LEAST 4. IF NPERM
C IS GREATER THAN ZERO THEN CERTAIN INFORMATION MUST BE STORED
C IN VAL. SEE DOCUMENTATION FOR DETAILS.
C
C NMVEC THE ROW DIMENSION OF THE ARRAY VEC. NMVEC MUST BE GREATER
C THAN OR EQUAL TO N.
C
C VEC A TWO DIMENSIONAL DOUBLE PRECISION ARRAY OF ROW
C DIMENSION NMVEC AND COLUMN DIMENSION AT LEAST DABS(NVAL). IF
C NPERM > 0 THEN THE FIRST NPERM COLUMNS OF VEC MUST
C CONTAIN THE USER SUPPLIED EIGENVECTORS.
C
C NBLOCK THE BLOCK SIZE. SEE DOCUMENTATION FOR CHOOSING
C AN APPROPRIATE VALUE FOR NBLOCK. NBLOCK MUST BE GREATER
C THAN ZERO AND LESS THAN MAXJ/6.
C
C MAXOP AN UPPER BOUND ON THE NUMBER OF CALLS TO THE SUBROUTINE
C OP. DNLASO TERMINATES WHEN MAXOP IS EXCEEDED. SEE
C DOCUMENTATION FOR GUIDELINES IN CHOOSING A VALUE FOR MAXOP.
C
C MAXJ AN INDICATION OF THE AVAILABLE STORAGE (SEE WORK AND
C DOCUMENTATION ON IOVECT). FOR THE FASTEST CONVERGENCE MAXJ
C SHOULD BE AS LARGE AS POSSIBLE, ALTHOUGH IT IS USELESS TO HAVE
C MAXJ LARGER THAN MAXOP*NBLOCK.
C
C WORK A DOUBLE PRECISION ARRAY OF DIMENSION AT LEAST AS
C LARGE AS
C
C 2*N*NBLOCK + MAXJ*(NBLOCK+NV+2) + 2*NBLOCK*NBLOCK + 3*NV
C
C + THE MAXIMUM OF
C N*NBLOCK
C AND
C MAXJ*(2*NBLOCK+3) + 2*NV + 6 + (2*NBLOCK+2)*(NBLOCK+1)
C
C WHERE NV = DABS(NVAL)
C
C THE FIRST N*NBLOCK ELEMENTS OF WORK MUST CONTAIN THE DESIRED
C STARTING VECTORS. SEE DOCUMENTATION FOR GUIDELINES IN
C CHOOSING STARTING VECTORS.
C
C IND AN INTEGER ARRAY OF DIMENSION AT LEAST DABS(NVAL).
C
C IERR AN INTEGER VARIABLE.
C
C
C ON OUTPUT
C
C
C NPERM THE NUMBER OF EIGENPAIRS NOW KNOWN.
C
C VEC THE FIRST NPERM COLUMNS OF VEC CONTAIN THE EIGENVECTORS.
C
C VAL THE FIRST COLUMN OF VAL CONTAINS THE CORRESPONDING
C EIGENVALUES. THE SECOND COLUMN CONTAINS THE RESIDUAL NORMS OF
C THE EIGENPAIRS WHICH ARE BOUNDS ON THE ACCURACY OF THE EIGEN-
C VALUES. THE THIRD COLUMN CONTAINS MORE DOUBLE PRECISIONISTIC ESTIMATES
C OF THE ACCURACY OF THE EIGENVALUES. THE FOURTH COLUMN CONTAINS
C ESTIMATES OF THE ACCURACY OF THE EIGENVECTORS. SEE
C DOCUMENTATION FOR FURTHER INFORMATION ON THESE QUANTITIES.
C
C WORK IF WORK IS TERMINATED BEFORE COMPLETION (IERR = -2)
C THE FIRST N*NBLOCK ELEMENTS OF WORK CONTAIN THE BEST VECTORS
C FOR RESTARTING THE ALGORITHM AND DNLASO CAN BE IMMEDIATELY
C RECALLED TO CONTINUE WORKING ON THE PROBLEM.
C
C IND IND(1) CONTAINS THE ACTUAL NUMBER OF CALLS TO OP. ON SOME
C OCCASIONS THE NUMBER OF CALLS TO OP MAY BE SLIGHTLY LARGER
C THAN MAXOP.
C
C IERR AN ERROR COMPLETION CODE. THE NORMAL COMPLETION CODE IS
C ZERO. SEE THE DOCUMENTATION FOR INTERPRETATIONS OF NON-ZERO
C COMPLETION CODES.
C
C
C INTERNAL VARIABLES.
C
C
INTEGER I, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10, I11,
* I12, I13, M, NBAND, NOP, NV, IABS, MAX0
LOGICAL RARITZ, SMALL
DOUBLE PRECISION DELTA, EPS, TEMP, DNRM2, DABS, TARR(1)
EXTERNAL DNPPLA, DNWLA, DORTQR, DCOPY, DNRM2, DVSORT
C
C NOP RETURNED FROM DNWLA AS THE NUMBER OF CALLS TO THE
C SUBROUTINE OP.
C
C NV SET EQUAL TO DABS(NVAL), THE NUMBER OF EIGENVALUES DESIRED,
C AND PASSED TO DNWLA.
C
C SMALL SET TO .TRUE. IF THE SMALLEST EIGENVALUES ARE DESIRED.
C
C RARITZ RETURNED FROM DNWLA AND PASSED TO DNPPLA. RARITZ IS .TRUE.
C IF A FINAL RAYLEIGH-RITZ PROCEDURE IS NEEDED.
C
C DELTA RETURNED FROM DNWLA AS THE EIGENVALUE OF THE MATRIX
C WHICH IS CLOSEST TO THE DESIRED EIGENVALUES.
C
C DNPPLA A SUBROUTINE FOR POST-PROCESSING THE EIGENVECTORS COMPUTED
C BY DNWLA.
C
C DNWLA A SUBROUTINE FOR IMPLEMENTING THE LANCZOS ALGORITHM
C WITH SELECTIVE ORTHOGONALIZATION.
C
C DMVPC A SUBROUTINE FOR COMPUTING THE RESIDUAL NORM AND
C ORTHOGONALITY COEFFICIENT OF GIVEN RITZ VECTORS.
C
C DORTQR A SUBROUTINE FOR ORTHONORMALIZING A BLOCK OF VECTORS
C USING HOUSEHOLDER REFLECTIONS.
C
C DAXPY,DCOPY,DDOT,DNRM2,DSCAL,DSWAP A SUBSET OF THE BASIC LINEAR
C ALGEBRA SUBPROGRAMS USED FOR VECTOR MANIPULATION.
C
C DLARAN A SUBROUTINE TO GENERATE RANDOM VECTORS
C
C DLAEIG, DLAGER, DLABCM, DLABFC SUBROUTINES FOR BAND EIGENVALUE
C CALCULATIONS.
C
C ------------------------------------------------------------------
C
C THIS SECTION CHECKS FOR INCONSISTENCY IN THE INPUT PARAMETERS.
C
NV = IABS(NVAL)
IND(1) = 0
IERR = 0
IF (N.LT.6*NBLOCK) IERR = 1
IF (NFIG.LE.0) IERR = IERR + 2
IF (NMVEC.LT.N) IERR = IERR + 4
IF (NPERM.LT.0) IERR = IERR + 8
IF (MAXJ.LT.6*NBLOCK) IERR = IERR + 16
IF (NV.LT.MAX0(1,NPERM)) IERR = IERR + 32
IF (NV.GT.NMVAL) IERR = IERR + 64
IF (NV.GT.MAXOP) IERR = IERR + 128
IF (NV.GE.MAXJ/2) IERR = IERR + 256
IF (NBLOCK.LT.1) IERR = IERR + 512
IF (IERR.NE.0) RETURN
C
SMALL = NVAL.LT.0
C
C ------------------------------------------------------------------
C
C THIS SECTION SORTS AND ORTHONORMALIZES THE USER SUPPLIED VECTORS.
C IF A USER SUPPLIED VECTOR IS ZERO OR IF DSIGNIFICANT CANCELLATION
C OCCURS IN THE ORTHOGONALIZATION PROCESS THEN IERR IS SET TO -1
C AND DNLASO TERMINATES.
C
IF (NPERM.EQ.0) GO TO 110
C
C THIS NEGATES THE USER SUPPLIED EIGENVALUES WHEN THE LARGEST
C EIGENVALUES ARE DESIRED, SINCE DNWLA WILL IMPLICITLY USE THE
C NEGATIVE OF THE MATRIX.
C
IF (SMALL) GO TO 20
DO 10 I=1,NPERM
VAL(I,1) = -VAL(I,1)
10 CONTINUE
C
C THIS SORTS THE USER SUPPLIED VALUES AND VECTORS.
C
20 CALL DVSORT(NPERM, VAL, VAL(1,2), 0, TARR, NMVEC, N, VEC)
C
C THIS STORES THE NORMS OF THE VECTORS FOR LATER COMPARISON.
C IT ALSO INSURES THAT THE RESIDUAL NORMS ARE POSITIVE.
C
DO 60 I=1,NPERM
VAL(I,2) = DABS(VAL(I,2))
VAL(I,3) = DNRM2(N,VEC(1,I),1)
60 CONTINUE
C
C THIS PERFORMS THE ORTHONORMALIZATION.
C
M = N*NBLOCK + 1
CALL DORTQR(NMVEC, N, NPERM, VEC, WORK(M))
M = N*NBLOCK - NPERM
DO 70 I = 1, NPERM
M = M + NPERM + 1
IF(DABS(WORK(M)) .GT. 0.9*VAL(I,3)) GO TO 70
IERR = -1
RETURN
C
70 CONTINUE
C
C THIS COPIES THE RESIDUAL NORMS INTO THE CORRECT LOCATIONS IN
C THE ARRAY WORK FOR LATER REFERENCE IN DNWLA.
C
M = 2*N*NBLOCK + 1
CALL DCOPY(NPERM, VAL(1,2), 1, WORK(M), 1)
C
C THIS SETS EPS TO AN APPROXIMATION OF THE RELATIVE MACHINE
C PRECISION
C
C ***THIS SHOULD BE REPLACED BY AN ASDSIGNMENT STATEMENT
C ***IN A PRODUCTION CODE
C
110 EPS = 1.0D0
DO 120 I = 1,1000
EPS = 0.5D0*EPS
TEMP = 1.0D0 + EPS
IF(TEMP.EQ.1.0D0) GO TO 130
120 CONTINUE
C
C ------------------------------------------------------------------
C
C THIS SECTION CALLS DNWLA WHICH IMPLEMENTS THE LANCZOS ALGORITHM
C WITH SELECTIVE ORTHOGONALIZATION.
C
130 NBAND = NBLOCK + 1
I1 = 1 + N*NBLOCK
I2 = I1 + N*NBLOCK
I3 = I2 + NV
I4 = I3 + NV
I5 = I4 + NV
I6 = I5 + MAXJ*NBAND
I7 = I6 + NBLOCK*NBLOCK
I8 = I7 + NBLOCK*NBLOCK
I9 = I8 + MAXJ*(NV+1)
I10 = I9 + NBLOCK
I11 = I10 + 2*NV + 6
I12 = I11 + MAXJ*(2*NBLOCK+1)
I13 = I12 + MAXJ
CALL DNWLA(OP, IOVECT, N, NBAND, NV, NFIG, NPERM, VAL, NMVEC,
* VEC, NBLOCK, MAXOP, MAXJ, NOP, WORK(1), WORK(I1),
* WORK(I2), WORK(I3), WORK(I4), WORK(I5), WORK(I6),
* WORK(I7), WORK(I8), WORK(I9), WORK(I10), WORK(I11),
* WORK(I12), WORK(I13), IND, SMALL, RARITZ, DELTA, EPS, IERR)
C
C ------------------------------------------------------------------
C
C THIS SECTION CALLS DNPPLA (THE POST PROCESSOR).
C
IF (NPERM.EQ.0) GO TO 140
I1 = N*NBLOCK + 1
I2 = I1 + NPERM*NPERM
I3 = I2 + NPERM*NPERM
I4 = I3 + MAX0(N*NBLOCK,2*NPERM*NPERM)
I5 = I4 + N*NBLOCK
I6 = I5 + 2*NPERM + 4
CALL DNPPLA(OP, IOVECT, N, NPERM, NOP, NMVAL, VAL, NMVEC,
* VEC, NBLOCK, WORK(I1), WORK(I2), WORK(I3), WORK(I4),
* WORK(I5), WORK(I6), DELTA, SMALL, RARITZ, EPS)
C
140 IND(1) = NOP
RETURN
END
C
C ------------------------------------------------------------------
C
SUBROUTINE DNWLA(OP, IOVECT, N, NBAND, NVAL, NFIG, NPERM, VAL,
* NMVEC, VEC, NBLOCK, MAXOP, MAXJ, NOP, P1, P0,
* RES, TAU, OTAU, T, ALP, BET, S, P2, BOUND, ATEMP, VTEMP, D,
* IND, SMALL, RARITZ, DELTA, EPS, IERR)
C
INTEGER N, NBAND, NVAL, NFIG, NPERM, NMVEC, NBLOCK, MAXOP, MAXJ,
* NOP, IND(1), IERR
LOGICAL RARITZ, SMALL
DOUBLE PRECISION VAL(1), VEC(NMVEC,1), P0(N,1), P1(N,1),
* P2(N,1), RES(1), TAU(1), OTAU(1), T(NBAND,1),
* ALP(NBLOCK,1), BET(NBLOCK,1), BOUND(1), ATEMP(1),
* VTEMP(1), D(1), S(MAXJ,1), DELTA, EPS
EXTERNAL OP, IOVECT
C
C DNWLA IMPLEMENTS THE LANCZOS ALGORITHM WITH SELECTIVE
C ORTHOGONALIZATION.
C
C NBAND NBLOCK + 1 THE BAND WIDTH OF T.
C
C NVAL THE NUMBER OF DESIRED EIGENVALUES.
C
C NPERM THE NUMBER OF PERMANENT VECTORS (THOSE EIGENVECTORS
C INPUT BY THE USER OR THOSE EIGENVECTORS SAVED WHEN THE
C ALGORITHM IS ITERATED). PERMANENT VECTORS ARE ORTHOGONAL
C TO THE CURRENT KRYLOV SUBSPACE.
C
C NOP THE NUMBER OF CALLS TO OP.
C
C P0, P1, AND P2 THE CURRENT BLOCKS OF LANCZOS VECTORS.
C
C RES THE (APPROXIMATE) RESIDUAL NORMS OF THE PERMANENT VECTORS.
C
C TAU AND OTAU USED TO MONITOR THE NEED FOR ORTHOGONALIZATION.
C
C T THE BAND MATRIX.
C
C ALP THE CURRENT DIAGONAL BLOCK.
C
C BET THE CURRENT OFF DIAGONAL BLOCK.
C
C BOUND, ATEMP, VTEMP, D TEMPORARY STORAGE USED BY THE BAND
C EIGENVALUE SOLVER DLAEIG.
C
C S EIGENVECTORS OF T.
C
C SMALL .TRUE. IF THE SMALL EIGENVALUES ARE DESIRED.
C
C RARITZ RETURNED AS .TRUE. IF A FINAL RAYLEIGH-RITZ PROCEDURE
C IS TO BE DONE.
C
C DELTA RETURNED AS THE VALUE OF THE (NVAL+1)TH EIGENVALUE
C OF THE MATRIX. USED IN ESTIMATING THE ACCURACY OF THE
C COMPUTED EIGENVALUES.
C
C
C INTERNAL VARIABLES USED
C
INTEGER I, I1, II, J, K, L, M, NG, NGOOD,
* NLEFT, NSTART, NTHETA, NUMBER, MIN0, MTEMP
LOGICAL ENOUGH, TEST
DOUBLE PRECISION ALPMAX, ALPMIN, ANORM, BETMAX, BETMIN,
* EPSRT, PNORM, RNORM, TEMP,
* TMAX, TMIN, TOLA, TOLG, UTOL, DABS,
* DMAX1, DMIN1, DSQRT, DDOT, DNRM2, TARR(1), DZERO(1)
EXTERNAL DMVPC, DORTQR, DAXPY, DCOPY, DDOT,
* DNRM2, DSCAL, DLAEIG, DLAGER, DLARAN, DVSORT
C
C J THE CURRENT DIMENSION OF T. (THE DIMENSION OF THE CURRENT
C KRYLOV SUBSPACE.
C
C NGOOD THE NUMBER OF GOOD RITZ VECTORS (GOOD VECTORS
C LIE IN THE CURRENT KRYLOV SUBSPACE).
C
C NLEFT THE NUMBER OF VALUES WHICH REMAIN TO BE DETERMINED,
C I.E. NLEFT = NVAL - NPERM.
C
C NUMBER = NPERM + NGOOD.
C
C ANORM AN ESTIMATE OF THE NORM OF THE MATRIX.
C
C EPS THE RELATIVE MACHINE PRECISION.
C
C UTOL THE USER TOLERANCE.
C
C TARR AN ARRAY OF LENGTH ONE USED TO INSURE TYPE CONSISTENCY IN CALLS TO
C DLAEIG
C
C DZERO AN ARRAY OF LENGTH ONE CONTAINING DZERO, USED TO INSURE TYPE
C CONSISTENCY IN CALLS TO DCOPY
C
DZERO(1) = 0.0D0
RNORM = 0.0D0
IF (NPERM.NE.0) RNORM = DMAX1(-VAL(1),VAL(NPERM))
PNORM = RNORM
DELTA = 10.D30
EPSRT = DSQRT(EPS)
NLEFT = NVAL - NPERM
NOP = 0
NUMBER = NPERM
RARITZ = .FALSE.
UTOL = DMAX1(DBLE(FLOAT(N))*EPS,10.0D0**DBLE((-FLOAT(NFIG))))
J = MAXJ
C
C ------------------------------------------------------------------
C
C ANY ITERATION OF THE ALGORITHM BEGINS HERE.
C
30 DO 50 I=1,NBLOCK
TEMP = DNRM2(N,P1(1,I),1)
IF (TEMP.EQ.0D0) CALL DLARAN(N, P1(1,I))
50 CONTINUE
IF (NPERM.EQ.0) GO TO 70
DO 60 I=1,NPERM
TAU(I) = 1.0D0
OTAU(I) = 0.0D0
60 CONTINUE
70 CALL DCOPY(N*NBLOCK, DZERO, 0, P0, 1)
CALL DCOPY(NBLOCK*NBLOCK, DZERO, 0, BET, 1)
CALL DCOPY(J*NBAND, DZERO, 0, T, 1)
MTEMP = NVAL + 1
DO 75 I = 1, MTEMP
CALL DCOPY(J, DZERO, 0, S(1,I), 1)
75 CONTINUE
NGOOD = 0
TMIN = 1.0D30
TMAX = -1.0D30
TEST = .TRUE.
ENOUGH = .FALSE.
BETMAX = 0.0D0
J = 0
C
C ------------------------------------------------------------------
C
C THIS SECTION TAKES A SINGLE BLOCK LANCZOS STEP.
C
80 J = J + NBLOCK
C
C THIS IS THE SELECTIVE ORTHOGONALIZATION.
C
IF (NUMBER.EQ.0) GO TO 110
DO 100 I=1,NUMBER
IF (TAU(I).LT.EPSRT) GO TO 100
TEST = .TRUE.
TAU(I) = 0.0D0
IF (OTAU(I).NE.0.0D0) OTAU(I) = 1.0D0
DO 90 K=1,NBLOCK
TEMP = -DDOT(N,VEC(1,I),1,P1(1,K),1)
CALL DAXPY(N, TEMP, VEC(1,I), 1, P1(1,K), 1)
C
C THIS CHECKS FOR TOO GREAT A LOSS OF ORTHOGONALITY BETWEEN A
C NEW LANCZOS VECTOR AND A GOOD RITZ VECTOR. THE ALGORITHM IS
C TERMINATED IF TOO MUCH ORTHOGONALITY IS LOST.
C
IF (DABS(TEMP*BET(K,K)).GT.DBLE(FLOAT(N))*EPSRT*
* ANORM .AND. I.GT.NPERM) GO TO 380
90 CONTINUE
100 CONTINUE
C
C IF NECESSARY, THIS REORTHONORMALIZES P1 AND UPDATES BET.
C
110 IF(.NOT. TEST) GO TO 160
CALL DORTQR(N, N, NBLOCK, P1, ALP)
TEST = .FALSE.
IF(J .EQ. NBLOCK) GO TO 160
DO 130 I = 1,NBLOCK
IF(ALP(I,I) .GT. 0.0D0) GO TO 130
M = J - 2*NBLOCK + I
L = NBLOCK + 1
DO 120 K = I,NBLOCK
BET(I,K) = -BET(I,K)
T(L,M) = -T(L,M)
L = L - 1
M = M + 1
120 CONTINUE
130 CONTINUE
C
C THIS IS THE LANCZOS STEP.
C
160 CALL OP(N, NBLOCK, P1, P2)
NOP = NOP + 1
CALL IOVECT(N, NBLOCK, P1, J, 0)
C
C THIS COMPUTES P2=P2-P0*BET(TRANSPOSE)
C
DO 180 I=1,NBLOCK
DO 170 K=I,NBLOCK
CALL DAXPY(N, -BET(I,K), P0(1,K), 1, P2(1,I), 1)
170 CONTINUE
180 CONTINUE
C
C THIS COMPUTES ALP AND P2=P2-P1*ALP.
C
DO 200 I=1,NBLOCK
DO 190 K=1,I
II = I - K + 1
ALP(II,K) = DDOT(N,P1(1,I),1,P2(1,K),1)
CALL DAXPY(N, -ALP(II,K), P1(1,I), 1, P2(1,K), 1)
IF (K.NE.I) CALL DAXPY(N, -ALP(II,K), P1(1,K),
* 1, P2(1,I), 1)
190 CONTINUE
200 CONTINUE
C
C REORTHOGONALIZATION OF THE SECOND BLOCK
C
IF(J .NE. NBLOCK) GO TO 220
DO 215 I=1,NBLOCK
DO 210 K=1,I
TEMP = DDOT(N,P1(1,I),1,P2(1,K),1)
CALL DAXPY(N, -TEMP, P1(1,I), 1, P2(1,K), 1)
IF (K.NE.I) CALL DAXPY(N, -TEMP, P1(1,K),
* 1, P2(1,I), 1)
II = I - K + 1
ALP(II,K) = ALP(II,K) + TEMP
210 CONTINUE
215 CONTINUE
C
C THIS ORTHONORMALIZES THE NEXT BLOCK
C
220 CALL DORTQR(N, N, NBLOCK, P2, BET)
C
C THIS STORES ALP AND BET IN T.
C
DO 250 I=1,NBLOCK
M = J - NBLOCK + I
DO 230 K=I,NBLOCK
L = K - I + 1
T(L,M) = ALP(L,I)
230 CONTINUE
DO 240 K=1,I
L = NBLOCK - I + K + 1
T(L,M) = BET(K,I)
240 CONTINUE
250 CONTINUE
C
C THIS NEGATES T IF SMALL IS FALSE.
C
IF (SMALL) GO TO 280
M = J - NBLOCK + 1
DO 270 I=M,J
DO 260 K=1,L
T(K,I) = -T(K,I)
260 CONTINUE
270 CONTINUE
C
C THIS SHIFTS THE LANCZOS VECTORS
C
280 CALL DCOPY(NBLOCK*N, P1, 1, P0, 1)
CALL DCOPY(NBLOCK*N, P2, 1, P1, 1)
CALL DLAGER(J, NBAND, J-NBLOCK+1, T, TMIN, TMAX)
ANORM = DMAX1(RNORM, TMAX, -TMIN)
IF (NUMBER.EQ.0) GO TO 305
C
C THIS COMPUTES THE EXTREME EIGENVALUES OF ALP.
C
CALL DCOPY(NBLOCK, DZERO, 0, P2, 1)
CALL DLAEIG(NBLOCK, NBLOCK, 1, 1, ALP, TARR, NBLOCK,
1 P2, BOUND, ATEMP, D, VTEMP, EPS, TMIN, TMAX)
ALPMIN = TARR(1)
CALL DCOPY(NBLOCK, DZERO, 0, P2, 1)
CALL DLAEIG(NBLOCK, NBLOCK, NBLOCK, NBLOCK, ALP, TARR,
1 NBLOCK, P2, BOUND, ATEMP, D, VTEMP, EPS, TMIN, TMAX)
ALPMAX = TARR(1)
C
C THIS COMPUTES ALP = BET(TRANSPOSE)*BET.
C
305 DO 310 I = 1, NBLOCK
DO 300 K = 1, I
L = I - K + 1
ALP(L,K) = DDOT(NBLOCK-I+1, BET(I,I), NBLOCK, BET(K,I),
1 NBLOCK)
300 CONTINUE
310 CONTINUE
IF(NUMBER .EQ. 0) GO TO 330
C
C THIS COMPUTES THE SMALLEST SINGULAR VALUE OF BET.
C
CALL DCOPY(NBLOCK, DZERO, 0, P2, 1)
CALL DLAEIG(NBLOCK, NBLOCK, 1, 1, ALP, TARR, NBLOCK,
1 P2, BOUND, ATEMP, D, VTEMP, EPS, 0.0D0, ANORM*ANORM)
BETMIN = DSQRT(TARR(1))
C
C THIS UPDATES TAU AND OTAU.
C
DO 320 I=1,NUMBER
TEMP = (TAU(I)*DMAX1(ALPMAX-VAL(I),VAL(I)-ALPMIN)
* +OTAU(I)*BETMAX+EPS*ANORM)/BETMIN
IF (I.LE.NPERM) TEMP = TEMP + RES(I)/BETMIN
OTAU(I) = TAU(I)
TAU(I) = TEMP
320 CONTINUE
C
C THIS COMPUTES THE LARGEST SINGULAR VALUE OF BET.
C
330 CALL DCOPY(NBLOCK, DZERO, 0, P2, 1)
CALL DLAEIG(NBLOCK, NBLOCK, NBLOCK, NBLOCK, ALP, TARR,
1 NBLOCK, P2, BOUND, ATEMP, D, VTEMP, EPS, 0.0D0,
2 ANORM*ANORM)
BETMAX = DSQRT(TARR(1))
IF (J.LE.2*NBLOCK) GO TO 80
C
C ------------------------------------------------------------------
C
C THIS SECTION COMPUTES AND EXAMINES THE SMALLEST NONGOOD AND
C LARGEST DESIRED EIGENVALUES OF T TO SEE IF A CLOSER LOOK
C IS JUSTIFIED.
C
TOLG = EPSRT*ANORM
TOLA = UTOL*RNORM
IF(MAXJ-J .LT. NBLOCK .OR. (NOP .GE. MAXOP .AND.
1 NLEFT .NE. 0)) GO TO 390
GO TO 400
C
C ------------------------------------------------------------------
C
C THIS SECTION COMPUTES SOME EIGENVALUES AND EIGENVECTORS OF T TO
C SEE IF FURTHER ACTION IS INDICATED, ENTRY IS AT 380 OR 390 IF AN
C ITERATION (OR TERMINATION) IS KNOWN TO BE NEEDED, OTHERWISE ENTRY
C IS AT 400.
C
380 J = J - NBLOCK
IERR = -8
390 IF (NLEFT.EQ.0) RETURN
TEST = .TRUE.
400 NTHETA = MIN0(J/2,NLEFT+1)
CALL DLAEIG(J, NBAND, 1, NTHETA, T, VAL(NUMBER+1),
1 MAXJ, S, BOUND, ATEMP, D, VTEMP, EPS, TMIN, TMAX)
CALL DMVPC(NBLOCK, BET, MAXJ, J, S, NTHETA, ATEMP, VTEMP, D)
C
C THIS CHECKS FOR TERMINATION OF A CHECK RUN
C
IF(NLEFT .NE. 0 .OR. J .LT. 6*NBLOCK) GO TO 410
IF(VAL(NUMBER+1)-ATEMP(1) .GT. VAL(NPERM) - TOLA) GO TO 790
C
C THIS UPDATES NLEFT BY EXAMINING THE COMPUTED EIGENVALUES OF T
C TO DETERMINE IF SOME PERMANENT VALUES ARE NO LONGER DESIRED.
C
410 IF (NTHETA.LE.NLEFT) GO TO 470
IF (NPERM.EQ.0) GO TO 430
M = NUMBER + NLEFT + 1
IF (VAL(M).GE.VAL(NPERM)) GO TO 430
NPERM = NPERM - 1
NGOOD = 0
NUMBER = NPERM
NLEFT = NLEFT + 1
GO TO 400
C
C THIS UPDATES DELTA.
C
430 M = NUMBER + NLEFT + 1
DELTA = DMIN1(DELTA,VAL(M))
ENOUGH = .TRUE.
IF(NLEFT .EQ. 0) GO TO 80
NTHETA = NLEFT
VTEMP(NTHETA+1) = 1
C
C ------------------------------------------------------------------
C
C THIS SECTION EXAMINES THE COMPUTED EIGENPAIRS IN DETAIL.
C
C THIS CHECKS FOR ENOUGH ACCEPTABLE VALUES.
C
IF (.NOT.(TEST .OR. ENOUGH)) GO TO 470
DELTA = DMIN1(DELTA,ANORM)
PNORM = DMAX1(RNORM,DMAX1(-VAL(NUMBER+1),DELTA))
TOLA = UTOL*PNORM
NSTART = 0
DO 460 I=1,NTHETA
M = NUMBER + I
IF (DMIN1(ATEMP(I)*ATEMP(I)/(DELTA-VAL(M)),ATEMP(I))
* .GT.TOLA) GO TO 450
IND(I) = -1
GO TO 460
C
450 ENOUGH = .FALSE.
IF (.NOT.TEST) GO TO 470
IND(I) = 1
NSTART = NSTART + 1
460 CONTINUE
C
C COPY VALUES OF IND INTO VTEMP
C
DO 465 I = 1,NTHETA
VTEMP(I) = DBLE(FLOAT(IND(I)))
465 CONTINUE
GO TO 500
C
C THIS CHECKS FOR NEW GOOD VECTORS.
C
470 NG = 0
DO 490 I=1,NTHETA
IF (VTEMP(I).GT.TOLG) GO TO 480
NG = NG + 1
VTEMP(I) = -1
GO TO 490
C
480 VTEMP(I) = 1
490 CONTINUE
C
IF (NG.LE.NGOOD) GO TO 80
NSTART = NTHETA - NG
C
C ------------------------------------------------------------------
C
C THIS SECTION COMPUTES AND NORMALIZES THE INDICATED RITZ VECTORS.
C IF NEEDED (TEST = .TRUE.), NEW STARTING VECTORS ARE COMPUTED.
C
500 TEST = TEST .AND. .NOT.ENOUGH
NGOOD = NTHETA - NSTART
NSTART = NSTART + 1
NTHETA = NTHETA + 1
C
C THIS ALIGNS THE DESIRED (ACCEPTABLE OR GOOD) EIGENVALUES AND
C EIGENVECTORS OF T. THE OTHER EIGENVECTORS ARE SAVED FOR
C FORMING STARTING VECTORS, IF NECESSARY. IT ALSO SHIFTS THE
C EIGENVALUES TO OVERWRITE THE GOOD VALUES FROM THE PREVIOUS
C PAUSE.
C
CALL DCOPY(NTHETA, VAL(NUMBER+1), 1, VAL(NPERM+1), 1)
IF (NSTART.EQ.0) GO TO 580
IF (NSTART.EQ.NTHETA) GO TO 530
CALL DVSORT(NTHETA, VTEMP, ATEMP, 1, VAL(NPERM+1), MAXJ,
* J, S)
C
C THES ACCUMULATES THE J-VECTORS USED TO FORM THE STARTING
C VECTORS.
C
530 IF (.NOT.TEST) NSTART = 0
IF (.NOT.TEST) GO TO 580
C
C FIND MINIMUM ATEMP VALUE TO AVOID POSSIBLE OVERFLOW
C
TEMP = ATEMP(1)
DO 535 I = 1, NSTART
TEMP = DMIN1(TEMP, ATEMP(I))
535 CONTINUE
M = NGOOD + 1
L = NGOOD + MIN0(NSTART,NBLOCK)
DO 540 I=M,L
CALL DSCAL(J, TEMP/ATEMP(I), S(1,I), 1)
540 CONTINUE
M = (NSTART-1)/NBLOCK
IF (M.EQ.0) GO TO 570
L = NGOOD + NBLOCK
DO 560 I=1,M
DO 550 K=1,NBLOCK
L = L + 1
IF (L.GT.NTHETA) GO TO 570
I1 = NGOOD + K
CALL DAXPY(J, TEMP/ATEMP(L), S(1,L), 1, S(1,I1), 1)
550 CONTINUE
560 CONTINUE
570 NSTART = MIN0(NSTART,NBLOCK)
C
C THIS STORES THE RESIDUAL NORMS OF THE NEW PERMANENT VECTORS.
C
580 IF (NGOOD.EQ.0 .OR. .NOT.(TEST .OR. ENOUGH)) GO TO 600
DO 590 I=1,NGOOD
M = NPERM + I
RES(M) = ATEMP(I)
590 CONTINUE
C
C THIS COMPUTES THE RITZ VECTORS BY SEQUENTIALLY RECALLING THE
C LANCZOS VECTORS.
C
600 NUMBER = NPERM + NGOOD
IF (TEST .OR. ENOUGH) CALL DCOPY(N*NBLOCK, DZERO, 0, P1, 1)
IF (NGOOD.EQ.0) GO TO 620
M = NPERM + 1
DO 610 I=M,NUMBER
CALL DCOPY(N, DZERO, 0, VEC(1,I), 1)
610 CONTINUE
620 DO 670 I=NBLOCK,J,NBLOCK
CALL IOVECT(N, NBLOCK, P2, I, 1)
DO 660 K=1,NBLOCK
M = I - NBLOCK + K
IF (NSTART.EQ.0) GO TO 640
DO 630 L=1,NSTART
I1 = NGOOD + L
CALL DAXPY(N, S(M,I1), P2(1,K), 1, P1(1,L), 1)
630 CONTINUE
640 IF (NGOOD.EQ.0) GO TO 660
DO 650 L=1,NGOOD
I1 = L + NPERM
CALL DAXPY(N, S(M,L), P2(1,K), 1, VEC(1,I1), 1)
650 CONTINUE
660 CONTINUE
670 CONTINUE
IF (TEST .OR. ENOUGH) GO TO 690
C
C THIS NORMALIZES THE RITZ VECTORS AND INITIALIZES THE
C TAU RECURRENCE.
C
M = NPERM + 1
DO 680 I=M,NUMBER
TEMP = 1.0D0/DNRM2(N,VEC(1,I),1)
CALL DSCAL(N, TEMP, VEC(1,I), 1)
TAU(I) = 1.0D0
OTAU(I) = 1.0D0
680 CONTINUE
C
C SHIFT S VECTORS TO ALIGN FOR LATER CALL TO DLAEIG
C
CALL DCOPY(NTHETA, VAL(NPERM+1), 1, VTEMP, 1)
CALL DVSORT(NTHETA, VTEMP, ATEMP, 0, TARR, MAXJ, J, S)
GO TO 80
C
C ------------------------------------------------------------------
C
C THIS SECTION PREPARES TO ITERATE THE ALGORITHM BY SORTING THE
C PERMANENT VALUES, RESETTING SOME PARAMETERS, AND ORTHONORMALIZING
C THE PERMANENT VECTORS.
C
690 IF (NGOOD.EQ.0 .AND. NOP.GE.MAXOP) GO TO 810
IF (NGOOD.EQ.0) GO TO 30
C
C THIS ORTHONORMALIZES THE VECTORS
C
CALL DORTQR(NMVEC, N, NPERM+NGOOD, VEC, S)
C
C THIS SORTS THE VALUES AND VECTORS.
C
IF(NPERM .NE. 0) CALL DVSORT(NPERM+NGOOD, VAL, RES, 0, TEMP,
* NMVEC, N, VEC)
NPERM = NPERM + NGOOD
NLEFT = NLEFT - NGOOD
RNORM = DMAX1(-VAL(1),VAL(NPERM))
C
C THIS DECIDES WHERE TO GO NEXT.
C
IF (NOP.GE.MAXOP .AND. NLEFT.NE.0) GO TO 810
IF (NLEFT.NE.0) GO TO 30
IF (VAL(NVAL)-VAL(1).LT.TOLA) GO TO 790
C
C THIS DOES A CLUSTER TEST TO SEE IF A CHECK RUN IS NEEDED
C TO LOOK FOR UNDISCLOSED MULTIPLICITIES.
C
M = NPERM - NBLOCK + 1
IF (M.LE.0) RETURN
DO 780 I=1,M
L = I + NBLOCK - 1
IF (VAL(L)-VAL(I).LT.TOLA) GO TO 30
780 CONTINUE
C
C THIS DOES A CLUSTER TEST TO SEE IF A FINAL RAYLEIGH-RITZ
C PROCEDURE IS NEEDED.
C
790 M = NPERM - NBLOCK
IF (M.LE.0) RETURN
DO 800 I=1,M
L = I + NBLOCK
IF (VAL(L)-VAL(I).GE.TOLA) GO TO 800
RARITZ = .TRUE.
RETURN
800 CONTINUE
C
RETURN
C
C ------------------------------------------------------------------
C
C THIS REPORTS THAT MAXOP WAS EXCEEDED.
C
810 IERR = -2
GO TO 790
C
END
|