3
    4
    5
    6
    7
    8
    9
   10      LOGICAL            WANTT, WANTZ
   11      INTEGER            IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, N
   12
   13
   14      COMPLEX            H( LDH, * ), W( * ), Z( LDZ, * )
   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      COMPLEX            ZERO
   99      parameter( zero = ( 0.0e+0, 0.0e+0 ) )
  100      REAL               RZERO, RONE
  101      parameter( rzero = 0.0e+0, rone = 1.0e+0 )
  102      REAL               DAT1, DAT2
  103      parameter( dat1 = 0.75e+0, dat2 = -0.4375e+0 )
  104
  105
  106      INTEGER            I, I1, I2, ITN, ITS, J, K, L, M, NH, NR, NZ
  107      REAL               CS, OVFL, S, SMLNUM, TST1, ULP, UNFL
  108      COMPLEX            CDUM, H00, H10, H11, H12, H21, H22, H33, H33S,
  109     $                   H43H34, H44, H44S, SN, SUM, T1, T2, T3, V1, V2,
  110     $                   V3
  111
  112
  113      REAL               RWORK( 1 )
  114      COMPLEX            V( 3 )
  115
  116
  117      REAL               SLAMCH, CLANHS
  119
  120
  121      EXTERNAL           slabad, ccopy, 
clanv2, clarfg, crot
 
  122
  123
  124      INTRINSIC          abs, real, conjg, aimag, 
max, 
min 
  125
  126
  127      REAL               CABS1
  128
  129
  130      cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
  131
  132
  133
  134      info = 0
  135
  136
  137
  138      IF( n.EQ.0 )
  139     $   RETURN
  140      IF( ilo.EQ.ihi ) THEN
  141         w( ilo ) = h( ilo, ilo )
  142         RETURN
  143      END IF
  144
  145      nh = ihi - ilo + 1
  146      nz = ihiz - iloz + 1
  147
  148
  149
  150
  151      unfl = 
slamch( 
'Safe minimum' )
 
  152      ovfl = rone / unfl
  153      CALL slabad( unfl, ovfl )
  154      ulp = 
slamch( 
'Precision' )
 
  155      smlnum = unfl*( nh / ulp )
  156
  157
  158
  159
  160
  161      IF( wantt ) THEN
  162         i1 = 1
  163         i2 = n
  164      END IF
  165
  166
  167
  168      itn = 30*nh
  169
  170
  171
  172
  173
  174
  175
  176      i = ihi
  177   10 CONTINUE
  178      l = ilo
  179      IF( i.LT.ilo )
  180     $   GO TO 150
  181
  182
  183
  184
  185
  186      DO 130 its = 0, itn
  187
  188
  189
  190         DO 20 k = i, l + 1, -1
  191            tst1 = cabs1( h( k-1, k-1 ) ) + cabs1( h( k, k ) )
  192            IF( tst1.EQ.rzero )
  193     $         tst1 = clanhs( '1', i-l+1, h( l, l ), ldh, rwork )
  194            IF( cabs1( h( k, k-1 ) ).LE.
max( ulp*tst1, smlnum ) )
 
  195     $         GO TO 30
  196   20    CONTINUE
  197   30    CONTINUE
  198         l = k
  199         IF( l.GT.ilo ) THEN
  200
  201
  202
  203            h( l, l-1 ) = zero
  204         END IF
  205
  206
  207
  208         IF( l.GE.i-1 )
  209     $      GO TO 140
  210
  211
  212
  213
  214
  215         IF( .NOT.wantt ) THEN
  216            i1 = l
  217            i2 = i
  218         END IF
  219
  220         IF( its.EQ.10 .OR. its.EQ.20 ) THEN
  221
  222
  223
  224
  225            s = cabs1( h( i, i-1 ) ) + cabs1( h( i-1, i-2 ) )
  226            h44 = dat1*s
  227            h33 = h44
  228            h43h34 = dat2*s*s
  229         ELSE
  230
  231
  232
  233            h44 = h( i, i )
  234            h33 = h( i-1, i-1 )
  235            h43h34 = h( i, i-1 )*h( i-1, i )
  236         END IF
  237
  238
  239
  240         DO 40 m = i - 2, l, -1
  241
  242
  243
  244
  245
  246            h11 = h( m, m )
  247            h22 = h( m+1, m+1 )
  248            h21 = h( m+1, m )
  249            h12 = h( m, m+1 )
  250            h44s = h44 - h11
  251            h33s = h33 - h11
  252            v1 = ( h33s*h44s-h43h34 ) / h21 + h12
  253            v2 = h22 - h11 - h33s - h44s
  254            v3 = h( m+2, m+1 )
  255            s = cabs1( v1 ) + cabs1( v2 ) + abs( v3 )
  256            v1 = v1 / s
  257            v2 = v2 / s
  258            v3 = v3 / s
  259            v( 1 ) = v1
  260            v( 2 ) = v2
  261            v( 3 ) = v3
  262            IF( m.EQ.l )
  263     $         GO TO 50
  264            h00 = h( m-1, m-1 )
  265            h10 = h( m, m-1 )
  266            tst1 = cabs1( v1 )*( cabs1( h00 )+cabs1( h11 )+
  267     $             cabs1( h22 ) )
  268            IF( cabs1( h10 )*( cabs1( v2 )+cabs1( v3 ) ).LE.ulp*tst1 )
  269     $         GO TO 50
  270   40    CONTINUE
  271   50    CONTINUE
  272
  273
  274
  275         DO 120 k = m, i - 1
  276
  277
  278
  279
  280
  281
  282
  283
  284
  285
  287            IF( k.GT.m )
  288     $         CALL ccopy( nr, h( k, k-1 ), 1, v, 1 )
  289            CALL clarfg( nr, v( 1 ), v( 2 ), 1, t1 )
  290            IF( k.GT.m ) THEN
  291               h( k, k-1 ) = v( 1 )
  292               h( k+1, k-1 ) = zero
  293               IF( k.LT.i-1 )
  294     $            h( k+2, k-1 ) = zero
  295            ELSE IF( m.GT.l ) THEN
  296
  297
  298               h( k, k-1 ) = h( k, k-1 ) - conjg( t1 )*h( k, k-1 )
  299            END IF
  300            v2 = v( 2 )
  301            t2 = t1*v2
  302            IF( nr.EQ.3 ) THEN
  303               v3 = v( 3 )
  304               t3 = t1*v3
  305
  306
  307
  308
  309               DO 60 j = k, i2
  310                  sum = conjg( t1 )*h( k, j ) +
  311     $                  conjg( t2 )*h( k+1, j ) +
  312     $                  conjg( t3 )*h( k+2, j )
  313                  h( k, j ) = h( k, j ) - sum
  314                  h( k+1, j ) = h( k+1, j ) - sum*v2
  315                  h( k+2, j ) = h( k+2, j ) - sum*v3
  316   60          CONTINUE
  317
  318
  319
  320
  321               DO 70 j = i1, 
min( k+3, i )
 
  322                  sum = t1*h( j, k ) + t2*h( j, k+1 ) + t3*h( j, k+2 )
  323                  h( j, k ) = h( j, k ) - sum
  324                  h( j, k+1 ) = h( j, k+1 ) - sum*conjg( v2 )
  325                  h( j, k+2 ) = h( j, k+2 ) - sum*conjg( v3 )
  326   70          CONTINUE
  327
  328               IF( wantz ) THEN
  329
  330
  331
  332                  DO 80 j = iloz, ihiz
  333                     sum = t1*z( j, k ) + t2*z( j, k+1 ) +
  334     $                     t3*z( j, k+2 )
  335                     z( j, k ) = z( j, k ) - sum
  336                     z( j, k+1 ) = z( j, k+1 ) - sum*conjg( v2 )
  337                     z( j, k+2 ) = z( j, k+2 ) - sum*conjg( v3 )
  338   80             CONTINUE
  339               END IF
  340            ELSE IF( nr.EQ.2 ) THEN
  341
  342
  343
  344
  345               DO 90 j = k, i2
  346                  sum = conjg( t1 )*h( k, j ) +
  347     $                  conjg( t2 )*h( k+1, j )
  348                  h( k, j ) = h( k, j ) - sum
  349                  h( k+1, j ) = h( k+1, j ) - sum*v2
  350   90          CONTINUE
  351
  352
  353
  354
  355               DO 100 j = i1, 
min( k+2, i )
 
  356                  sum = t1*h( j, k ) + t2*h( j, k+1 )
  357                  h( j, k ) = h( j, k ) - sum
  358                  h( j, k+1 ) = h( j, k+1 ) - sum*conjg( v2 )
  359  100          CONTINUE
  360
  361               IF( wantz ) THEN
  362
  363
  364
  365                  DO 110 j = iloz, ihiz
  366                     sum = t1*z( j, k ) + t2*z( j, k+1 )
  367                     z( j, k ) = z( j, k ) - sum
  368                     z( j, k+1 ) = z( j, k+1 ) - sum*conjg( v2 )
  369  110             CONTINUE
  370               END IF
  371            END IF
  372
  373
  374
  375
  376
  377
  378
  379
  380
  381
  382
  383  120    CONTINUE
  384
  385
  386
  387  130 CONTINUE
  388
  389
  390
  391      info = i
  392      RETURN
  393
  394  140 CONTINUE
  395
  396      IF( l.EQ.i ) THEN
  397
  398
  399
  400         w( i ) = h( i, i )
  401
  402      ELSE IF( l.EQ.i-1 ) THEN
  403
  404
  405
  406
  407
  408
  409         CALL clanv2( h( i-1, i-1 ), h( i-1, i ), h( i, i-1 ),
 
  410     $                h( i, i ), w( i-1 ), w( i ), cs, sn )
  411
  412         IF( wantt ) THEN
  413
  414
  415
  416            IF( i2.GT.i )
  417     $         CALL crot( i2-i, h( i-1, i+1 ), ldh, h( i, i+1 ), ldh,
  418     $                    cs, sn )
  419            CALL crot( i-i1-1, h( i1, i-1 ), 1, h( i1, i ), 1, cs,
  420     $                 conjg( sn ) )
  421         END IF
  422         IF( wantz ) THEN
  423
  424
  425
  426            CALL crot( nz, z( iloz, i-1 ), 1, z( iloz, i ), 1, cs,
  427     $                 conjg( sn ) )
  428         END IF
  429
  430      END IF
  431
  432
  433
  434
  435      itn = itn - its
  436      i = l - 1
  437      GO TO 10
  438
  439  150 CONTINUE
  440      RETURN
  441
  442
  443
subroutine clanv2(a, b, c, d, rt1, rt2, cs, sn)