4
    5
    6
    7
    8
    9
   10
   11
   12      IMPLICIT NONE
   13
   14
   15      CHARACTER          JOB
   16      INTEGER            IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
   17     $                   LDWH, LDWV, LDZ, N, NH, NSHFTS, NV
   18      LOGICAL            WANTT, WANTZ
   19
   20
   21      REAL               H( LDH, * ), SI( * ), SR( * ), U( LDU, * ),
   22     $                   V( LDV, * ), WH( LDWH, * ), WV( LDWV, * ),
   23     $                   Z( LDZ, * )
   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      REAL               ZERO, ONE
  170      parameter( zero = 0.0e0, one = 1.0e0 )
  171
  172
  173      REAL               ALPHA, BETA, H11, H12, H21, H22, REFSUM,
  174     $                   SAFMAX, SAFMIN, SCL, SMLNUM, SWAP, TST1, TST2,
  175     $                   ULP
  176      INTEGER            I, I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
  177     $                   JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
  178     $                   M, M22, MBOT, MEND, MSTART, MTOP, NBMPS, NDCOL,
  179     $                   NS, NU, SINCOL, EINCOL, UINCOL, IPHV, CHUNK,
  180     $                   THREADS, JLEN2, JCOL2, GCHUNK, JROW2, MAXCHUNK
  181      LOGICAL            ACCUM, BLK22, BMP22, INTRO, CHASE, OFF, ALL
  182
  183
  184      LOGICAL            LSAME
  185      INTEGER            PILAENVX
  186      REAL               SLAMCH
  188
  189
  190
  191      INTRINSIC          abs, float, 
max, 
min, mod
 
  192
  193
  194      REAL               VT( 3 )
  195
  196
  197      EXTERNAL           sgemm, slabad, slamov, slaqr1, slarfg, slaset,
  198     $                   strmm
  199
  200
  201
  202
  203
  204      IF( nshfts.LT.2 )
  205     $   RETURN
  206
  207
  208
  209
  210      IF( ktop.GE.kbot )
  211     $   RETURN
  212      threads = 1
  213
  214
  215
  216
  217
  218
  219      DO 10 i = 1, nshfts - 2, 2
  220         IF( si( i ).NE.-si( i+1 ) ) THEN
  221
  222            swap = sr( i )
  223            sr( i ) = sr( i+1 )
  224            sr( i+1 ) = sr( i+2 )
  225            sr( i+2 ) = swap
  226
  227            swap = si( i )
  228            si( i ) = si( i+1 )
  229            si( i+1 ) = si( i+2 )
  230            si( i+2 ) = swap
  231         END IF
  232   10 CONTINUE
  233
  234
  235
  236
  237
  238
  239      ns = nshfts - mod( nshfts, 2 )
  240
  241
  242
  243      safmin = 
slamch( 
'SAFE MINIMUM' )
 
  244      safmax = one / safmin
  245      CALL slabad( safmin, safmax )
  246      ulp = 
slamch( 
'PRECISION' )
 
  247      smlnum = safmin*( float( n ) / ulp )
  248
  249
  250
  251
  252
  253      accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
  254      accum = accum .AND. nh.GE.1 .AND. nv.GE.1
  255
  256
  257
  258      blk22 = ( ns.GT.2 ) .AND. ( kacc22.EQ.2 )
  259
  260
  261
  262      all = 
lsame( job, 
'A' )
 
  263      IF( .NOT. all )
  264     $     intro = 
lsame( job, 
'I' )
 
  265      IF( .NOT. all .AND. .NOT. intro )
  266     $     chase = 
lsame( job, 
'C' )
 
  267      IF( .NOT. all .AND. .NOT. intro .AND. .NOT. chase ) THEN
  268         off = 
lsame( job, 
'O' )
 
  269         IF( .NOT. off )
  270     $        RETURN
  271      END IF
  272
  273
  274
  275      IF( intro.OR.all .AND. ktop+2.LE.kbot )
  276     $   h( ktop+2, ktop ) = zero
  277
  278
  279
  280      nbmps = ns / 2
  281
  282
  283
  284      kdu = 6*nbmps - 3
  285
  286
  287
  288      IF( all ) THEN
  289         sincol = 3*( 1-nbmps ) + ktop - 1
  290         eincol = kbot - 2
  291         uincol = 3*nbmps - 2
  292      ELSEIF( intro ) THEN
  293         sincol = 3*( 1-nbmps ) + ktop - 1
  294         eincol = kbot - 3*nbmps - 1
  295         uincol = 3*nbmps - 2
  296      ELSEIF( chase ) THEN
  297         sincol = ktop
  298         eincol = kbot - 3*nbmps - 1
  299         uincol = 3*nbmps - 2
  300      ELSEIF( off ) THEN
  301         sincol = ktop
  302         eincol = kbot - 2
  303         uincol = 3*nbmps - 2
  304      END IF
  305      iphv = 0
  306
  307
  308
  309      DO 220 incol = sincol, eincol, uincol
  310         ndcol = 
min( incol + kdu, eincol )
 
  311         IF( accum )
  312     $      CALL slaset( 'ALL', kdu, kdu, zero, one, u, ldu )
  313
  314
  315
  316
  317
  318
  319
  320
  321
  322
  323
  324
  325
  326         DO 150 krcol = incol, 
min( eincol, incol+3*nbmps-3, kbot-2 )
 
  327
  328
  329
  330
  331
  332
  333
  334
  335            mtop = 
max( 1, ( ( ktop-1 )-krcol+2 ) / 3+1 )
 
  336            mbot = 
min( nbmps, ( kbot-krcol ) / 3 )
 
  337            m22 = mbot + 1
  338            bmp22 = ( mbot.LT.nbmps ) .AND. ( krcol+3*( m22-1 ) ).EQ.
  339     $              ( kbot-2 )
  340
  341
  342
  343
  344            DO 20 m = mtop, mbot
  345               k = krcol + 3*( m-1 )
  346               IF( k.EQ.ktop-1 ) THEN
  347                  CALL slaqr1( 3, h( ktop, ktop ), ldh, sr( 2*m-1 ),
  348     $                         si( 2*m-1 ), sr( 2*m ), si( 2*m ),
  349     $                         v( 1, m ) )
  350                  alpha = v( 1, m )
  351                  CALL slarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
  352               ELSE
  353                  beta = h( k+1, k )
  354                  v( 2, m ) = h( k+2, k )
  355                  v( 3, m ) = h( k+3, k )
  356                  CALL slarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
  357
  358
  359
  360
  361
  362
  363                  IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
  364     $                zero .OR. h( k+3, k+2 ).EQ.zero ) THEN
  365
  366
  367
  368                     h( k+1, k ) = beta
  369                     h( k+2, k ) = zero
  370                     h( k+3, k ) = zero
  371                  ELSE
  372
  373
  374
  375
  376
  377
  378
  379                     CALL slaqr1( 3, h( k+1, k+1 ), ldh, sr( 2*m-1 ),
  380     $                            si( 2*m-1 ), sr( 2*m ), si( 2*m ),
  381     $                            vt )
  382                     alpha = vt( 1 )
  383                     CALL slarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
  384                     refsum = vt( 1 )*( h( k+1, k )+vt( 2 )*
  385     $                        h( k+2, k ) )
  386
  387                     IF( abs( h( k+2, k )-refsum*vt( 2 ) )+
  388     $                   abs( refsum*vt( 3 ) ).GT.ulp*
  389     $                   ( abs( h( k, k ) )+abs( h( k+1,
  390     $                   k+1 ) )+abs( h( k+2, k+2 ) ) ) ) THEN
  391
  392
  393
  394
  395
  396                        h( k+1, k ) = beta
  397                        h( k+2, k ) = zero
  398                        h( k+3, k ) = zero
  399                     ELSE
  400
  401
  402
  403
  404
  405
  406                        h( k+1, k ) = h( k+1, k ) - refsum
  407                        h( k+2, k ) = zero
  408                        h( k+3, k ) = zero
  409                        v( 1, m ) = vt( 1 )
  410                        v( 2, m ) = vt( 2 )
  411                        v( 3, m ) = vt( 3 )
  412                     END IF
  413                  END IF
  414               END IF
  415   20       CONTINUE
  416
  417
  418
  419            k = krcol + 3*( m22-1 )
  420            IF( bmp22 ) THEN
  421               IF( k.EQ.ktop-1 ) THEN
  422                  CALL slaqr1( 2, h( k+1, k+1 ), ldh, sr( 2*m22-1 ),
  423     $                         si( 2*m22-1 ), sr( 2*m22 ), si( 2*m22 ),
  424     $                         v( 1, m22 ) )
  425                  beta = v( 1, m22 )
  426                  CALL slarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
  427               ELSE
  428                  beta = h( k+1, k )
  429                  v( 2, m22 ) = h( k+2, k )
  430                  CALL slarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
  431                  h( k+1, k ) = beta
  432                  h( k+2, k ) = zero
  433               END IF
  434            ELSE
  435
  436
  437
  438
  439               v( 1, m22 ) = zero
  440            END IF
  441
  442
  443
  444            IF( accum ) THEN
  445               jbot = 
min( 
max(incol+kdu,ndcol), kbot )
 
  446            ELSE IF( wantt ) THEN
  447               jbot = n
  448            ELSE
  449               jbot = kbot
  450            END IF
  451            DO 40 j = 
max( ktop, krcol ), jbot
 
  452               mend = 
min( mbot, ( j-krcol+2 ) / 3 )
 
  453               DO 30 m = mtop, mend
  454                  k = krcol + 3*( m-1 )
  455                  refsum = v( 1, m )*( h( k+1, j )+v( 2, m )*
  456     $                     h( k+2, j )+v( 3, m )*h( k+3, j ) )
  457                  h( k+1, j ) = h( k+1, j ) - refsum
  458                  h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m )
  459                  h( k+3, j ) = h( k+3, j ) - refsum*v( 3, m )
  460   30          CONTINUE
  461   40       CONTINUE
  462            IF( bmp22 ) THEN
  463               k = krcol + 3*( m22-1 )
  464               DO 50 j = 
max( k+1, ktop ), jbot
 
  465                  refsum = v( 1, m22 )*( h( k+1, j )+v( 2, m22 )*
  466     $                     h( k+2, j ) )
  467                  h( k+1, j ) = h( k+1, j ) - refsum
  468                  h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m22 )
  469   50          CONTINUE
  470            END IF
  471
  472
  473
  474
  475
  476            IF( accum ) THEN
  477               jtop = 
max( ktop, incol )
 
  478            ELSE IF( wantt ) THEN
  479               jtop = 1
  480            ELSE
  481               jtop = ktop
  482            END IF
  483            DO 90 m = mtop, mbot
  484               IF( v( 1, m ).NE.zero ) THEN
  485                  k = krcol + 3*( m-1 )
  486                  DO 60 j = jtop, 
min( kbot, k+3 )
 
  487                     refsum = v( 1, m )*( h( j, k+1 )+v( 2, m )*
  488     $                        h( j, k+2 )+v( 3, m )*h( j, k+3 ) )
  489                     h( j, k+1 ) = h( j, k+1 ) - refsum
  490                     h( j, k+2 ) = h( j, k+2 ) - refsum*v( 2, m )
  491                     h( j, k+3 ) = h( j, k+3 ) - refsum*v( 3, m )
  492   60             CONTINUE
  493
  494                  IF( accum ) THEN
  495
  496
  497
  498
  499
  500                     kms = k - incol
  501                     DO 70 j = 
max( 1, ktop-incol ), kdu
 
  502                        refsum = v( 1, m )*( u( j, kms+1 )+v( 2, m )*
  503     $                           u( j, kms+2 )+v( 3, m )*u( j, kms+3 ) )
  504                        u( j, kms+1 ) = u( j, kms+1 ) - refsum
  505                        u( j, kms+2 ) = u( j, kms+2 ) - refsum*v( 2, m )
  506                        u( j, kms+3 ) = u( j, kms+3 ) - refsum*v( 3, m )
  507   70                CONTINUE
  508                  ELSE IF( wantz ) THEN
  509
  510
  511
  512
  513
  514                     DO 80 j = iloz, ihiz
  515                        refsum = v( 1, m )*( z( j, k+1 )+v( 2, m )*
  516     $                           z( j, k+2 )+v( 3, m )*z( j, k+3 ) )
  517                        z( j, k+1 ) = z( j, k+1 ) - refsum
  518                        z( j, k+2 ) = z( j, k+2 ) - refsum*v( 2, m )
  519                        z( j, k+3 ) = z( j, k+3 ) - refsum*v( 3, m )
  520   80                CONTINUE
  521                  END IF
  522               END IF
  523   90       CONTINUE
  524
  525
  526
  527            k = krcol + 3*( m22-1 )
  528            IF( bmp22 ) THEN
  529               IF( v( 1, m22 ).NE.zero ) THEN
  530                  DO 100 j = jtop, 
min( kbot, k+3 )
 
  531                     refsum = v( 1, m22 )*( h( j, k+1 )+v( 2, m22 )*
  532     $                        h( j, k+2 ) )
  533                     h( j, k+1 ) = h( j, k+1 ) - refsum
  534                     h( j, k+2 ) = h( j, k+2 ) - refsum*v( 2, m22 )
  535  100             CONTINUE
  536
  537                  IF( accum ) THEN
  538                     kms = k - incol
  539                     DO 110 j = 
max( 1, ktop-incol ), kdu
 
  540                        refsum = v( 1, m22 )*( u( j, kms+1 ) +
  541     $                           v( 2, m22 )*u( j, kms+2 ) )
  542                        u( j, kms+1 ) = u( j, kms+1 ) - refsum
  543                        u( j, kms+2 ) = u( j, kms+2 ) -
  544     $                                  refsum*v( 2, m22 )
  545  110                CONTINUE
  546                  ELSE IF( wantz ) THEN
  547                     DO 120 j = iloz, ihiz
  548                        refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
  549     $                           z( j, k+2 ) )
  550                        z( j, k+1 ) = z( j, k+1 ) - refsum
  551                        z( j, k+2 ) = z( j, k+2 ) - refsum*v( 2, m22 )
  552  120                CONTINUE
  553                  END IF
  554               END IF
  555            END IF
  556
  557
  558
  559            mstart = mtop
  560            IF( krcol+3*( mstart-1 ).LT.ktop )
  561     $         mstart = mstart + 1
  562            mend = mbot
  563            IF( bmp22 )
  564     $         mend = mend + 1
  565            IF( krcol.EQ.kbot-2 )
  566     $         mend = mend + 1
  567            DO 130 m = mstart, mend
  568               k = 
min( kbot-1, krcol+3*( m-1 ) )
 
  569
  570
  571
  572
  573
  574
  575
  576
  577
  578
  579               IF( h( k+1, k ).NE.zero ) THEN
  580                  tst1 = abs( h( k, k ) ) + abs( h( k+1, k+1 ) )
  581                  IF( tst1.EQ.zero ) THEN
  582                     IF( k.GE.ktop+1 )
  583     $                  tst1 = tst1 + abs( h( k, k-1 ) )
  584                     IF( k.GE.ktop+2 )
  585     $                  tst1 = tst1 + abs( h( k, k-2 ) )
  586                     IF( k.GE.ktop+3 )
  587     $                  tst1 = tst1 + abs( h( k, k-3 ) )
  588                     IF( k.LE.kbot-2 )
  589     $                  tst1 = tst1 + abs( h( k+2, k+1 ) )
  590                     IF( k.LE.kbot-3 )
  591     $                  tst1 = tst1 + abs( h( k+3, k+1 ) )
  592                     IF( k.LE.kbot-4 )
  593     $                  tst1 = tst1 + abs( h( k+4, k+1 ) )
  594                  END IF
  595                  IF( abs( h( k+1, k ) ).LE.
max( smlnum, ulp*tst1 ) )
 
  596     $                 THEN
  597                     h12 = 
max( abs( h( k+1, k ) ), abs( h( k, k+1 ) ) )
 
  598                     h21 = 
min( abs( h( k+1, k ) ), abs( h( k, k+1 ) ) )
 
  599                     h11 = 
max( abs( h( k+1, k+1 ) ),
 
  600     $                     abs( h( k, k )-h( k+1, k+1 ) ) )
  601                     h22 = 
min( abs( h( k+1, k+1 ) ),
 
  602     $                     abs( h( k, k )-h( k+1, k+1 ) ) )
  603                     scl = h11 + h12
  604                     tst2 = h22*( h11 / scl )
  605
  606                     IF( tst2.EQ.zero .OR. h21*( h12 / scl ).LE.
  607     $                   
max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
 
  608                  END IF
  609               END IF
  610  130       CONTINUE
  611
  612
  613
  614            mend = 
min( nbmps, ( kbot-krcol-1 ) / 3 )
 
  615            DO 140 m = mtop, mend
  616               k = krcol + 3*( m-1 )
  617               refsum = v( 1, m )*v( 3, m )*h( k+4, k+3 )
  618               h( k+4, k+1 ) = -refsum
  619               h( k+4, k+2 ) = -refsum*v( 2, m )
  620               h( k+4, k+3 ) = h( k+4, k+3 ) - refsum*v( 3, m )
  621  140       CONTINUE
  622
  623
  624
  625  150    CONTINUE
  626
  627
  628
  629
  630
  631         IF( accum ) THEN
  632            IF( wantt ) THEN
  633               jtop = 1
  634               jbot = n
  635            ELSE
  636               jtop = ktop
  637               jbot = kbot
  638            END IF
  639            k1 = 
max( 1, ktop-incol )
 
  640            nu = ( kdu-
max( 0, 
max(incol+kdu,ndcol)-kbot ) ) - k1 + 1
 
  641            IF( ( .NOT.blk22 ) .OR. ( incol.LT.ktop ) .OR.
  642     $          ( ndcol.GT.kbot ) .OR. ( ns.LE.2 ) .OR.
  643     $           nu.LT.kdu ) THEN
  644
  645
  646
  647
  648
  649
  650
  651
  652
  653
  654
  655
  656               DO 160 jcol = 
min(
max(incol+kdu,ndcol),kbot)+ 1, jbot, nh
 
  657                  jlen = 
min( nh, jbot-jcol+1 )
 
  658                  CALL sgemm( 'C', 'N', nu, jlen, nu, one, u( k1, k1 ),
  659     $                        ldu, h( incol+k1, jcol ), ldh, zero, wh,
  660     $                        ldwh )
  661                  CALL slamov( 'ALL', nu, jlen, wh, ldwh,
  662     $                         h( incol+k1, jcol ), ldh )
  663  160          CONTINUE
  664
  665
  666
  667               DO 170 jrow = jtop, 
max( ktop, incol ) - 1, nv
 
  668                  jlen = 
min( nv, 
max( ktop, incol )-jrow )
 
  669                  CALL sgemm( 'N', 'N', jlen, nu, nu, one,
  670     $                        h( jrow, incol+k1 ), ldh, u( k1, k1 ),
  671     $                        ldu, zero, wv, ldwv )
  672                  CALL slamov( 'ALL', jlen, nu, wv, ldwv,
  673     $                         h( jrow, incol+k1 ), ldh )
  674  170          CONTINUE
  675
  676
  677
  678               IF( wantz ) THEN
  679                  DO 180 jrow = iloz, ihiz, nv
  680                     jlen = 
min( nv, ihiz-jrow+1 )
 
  681                     CALL sgemm( 'N', 'N', jlen, nu, nu, one,
  682     $                           z( jrow, incol+k1 ), ldz, u( k1, k1 ),
  683     $                           ldu, zero, wv, ldwv )
  684                     CALL slamov( 'ALL', jlen, nu, wv, ldwv,
  685     $                            z( jrow, incol+k1 ), ldz )
  686  180             CONTINUE
  687               END IF
  688            ELSE
  689
  690
  691
  692
  693
  694               i2 = ( kdu+1 ) / 2
  695               i4 = kdu
  696               j2 = i4 - i2
  697               j4 = kdu
  698
  699
  700
  701
  702
  703               kzs = ( j4-j2 ) - ( ns+1 )
  704               knz = ns + 1
  705
  706
  707
  708               DO 190 jcol = 
min(
max(incol+kdu,ndcol),kbot)+ 1, jbot, nh
 
  709                  jlen = 
min( nh, jbot-jcol+1 )
 
  710
  711
  712
  713
  714                  CALL slamov( 'ALL', knz, jlen, h( incol+1+j2, jcol ),
  715     $                 ldh, wh( kzs+1, 1 ), ldwh )
  716                  CALL slaset( 'ALL', kzs, jlen, zero, zero, wh, ldwh )
  717
  718
  719
  720                  CALL strmm( 'L', 'U', 'C', 'N', knz, jlen, one,
  721     $                        u( j2+1, 1+kzs ), ldu, wh( kzs+1, 1 ),
  722     $                        ldwh )
  723
  724
  725
  726                  CALL sgemm( 'C', 'N', i2, jlen, j2, one, u, ldu,
  727     $                        h( incol+1, jcol ), ldh, one, wh, ldwh )
  728
  729
  730
  731                  CALL slamov( 'ALL', j2, jlen, h( incol+1, jcol ), ldh,
  732     $                         wh( i2+1, 1 ), ldwh )
  733
  734
  735
  736                  CALL strmm( 'L', 'L', 'C', 'N', j2, jlen, one,
  737     $                        u( 1, i2+1 ), ldu, wh( i2+1, 1 ), ldwh )
  738
  739
  740
  741                  CALL sgemm( 'C', 'N', i4-i2, jlen, j4-j2, one,
  742     $                        u( j2+1, i2+1 ), ldu,
  743     $                        h( incol+1+j2, jcol ), ldh, one,
  744     $                        wh( i2+1, 1 ), ldwh )
  745
  746
  747
  748                  CALL slamov( 'ALL', kdu, jlen, wh, ldwh,
  749     $                         h( incol+1, jcol ), ldh )
  750  190          CONTINUE
  751
  752
  753
  754               DO 200 jrow = jtop, 
max( incol, ktop ) - 1, nv
 
  755                  jlen = 
min( nv, 
max( incol, ktop )-jrow )
 
  756
  757
  758
  759
  760                  CALL slamov( 'ALL', jlen, knz, h( jrow, incol+1+j2 ),
  761     $                         ldh, wv( 1, 1+kzs ), ldwv )
  762                  CALL slaset( 'ALL', jlen, kzs, zero, zero, wv, ldwv )
  763
  764
  765
  766                  CALL strmm( 'R', 'U', 'N', 'N', jlen, knz, one,
  767     $                        u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
  768     $                        ldwv )
  769
  770
  771
  772                  CALL sgemm( 'N', 'N', jlen, i2, j2, one,
  773     $                        h( jrow, incol+1 ), ldh, u, ldu, one, wv,
  774     $                        ldwv )
  775
  776
  777
  778                  CALL slamov( 'ALL', jlen, j2, h( jrow, incol+1 ), ldh,
  779     $                         wv( 1, 1+i2 ), ldwv )
  780
  781
  782
  783                  CALL strmm( 'R', 'L', 'N', 'N', jlen, i4-i2, one,
  784     $                        u( 1, i2+1 ), ldu, wv( 1, 1+i2 ), ldwv )
  785
  786
  787
  788                  CALL sgemm( 'N', 'N', jlen, i4-i2, j4-j2, one,
  789     $                        h( jrow, incol+1+j2 ), ldh,
  790     $                        u( j2+1, i2+1 ), ldu, one, wv( 1, 1+i2 ),
  791     $                        ldwv )
  792
  793
  794
  795                  CALL slamov( 'ALL', jlen, kdu, wv, ldwv,
  796     $                         h( jrow, incol+1 ), ldh )
  797  200          CONTINUE
  798
  799
  800
  801               IF( wantz ) THEN
  802                  DO 210 jrow = iloz, ihiz, nv
  803                     jlen = 
min( nv, ihiz-jrow+1 )
 
  804
  805
  806
  807
  808                     CALL slamov( 'ALL', jlen, knz,
  809     $                            z( jrow, incol+1+j2 ), ldz,
  810     $                            wv( 1, 1+kzs ), ldwv )
  811
  812
  813
  814                     CALL slaset( 'ALL', jlen, kzs, zero, zero, wv,
  815     $                            ldwv )
  816                     CALL strmm( 'R', 'U', 'N', 'N', jlen, knz, one,
  817     $                           u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
  818     $                           ldwv )
  819
  820
  821
  822                     CALL sgemm( 'N', 'N', jlen, i2, j2, one,
  823     $                           z( jrow, incol+1 ), ldz, u, ldu, one,
  824     $                           wv, ldwv )
  825
  826
  827
  828                     CALL slamov( 'ALL', jlen, j2, z( jrow, incol+1 ),
  829     $                            ldz, wv( 1, 1+i2 ), ldwv )
  830
  831
  832
  833                     CALL strmm( 'R', 'L', 'N', 'N', jlen, i4-i2, one,
  834     $                           u( 1, i2+1 ), ldu, wv( 1, 1+i2 ),
  835     $                           ldwv )
  836
  837
  838
  839                     CALL sgemm( 'N', 'N', jlen, i4-i2, j4-j2, one,
  840     $                           z( jrow, incol+1+j2 ), ldz,
  841     $                           u( j2+1, i2+1 ), ldu, one,
  842     $                           wv( 1, 1+i2 ), ldwv )
  843
  844
  845
  846                     CALL slamov( 'ALL', jlen, kdu, wv, ldwv,
  847     $                            z( jrow, incol+1 ), ldz )
  848  210             CONTINUE
  849               END IF
  850            END IF
  851         END IF
  852  220 CONTINUE
  853
  854
  855
  856      IF( n.GE.5 )
  857     $   CALL slaset( 'Lower', n-4, n-4, zero, zero, h(5,1), ldh )
  858
  859
  860
integer function pilaenvx(ictxt, ispec, name, opts, n1, n2, n3, n4)