The R Project SVN R

Rev

Rev 86265 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 86265 Rev 87868
Line 672... Line 672...
672
*>          LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.
672
*>          LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0.
673
*> \endverbatim
673
*> \endverbatim
674
*>
674
*>
675
*> \param[out] RWORK
675
*> \param[out] RWORK
676
*> \verbatim
676
*> \verbatim
677
*>          RWORK is DOUBLE PRECISION array, dimension (4*N)
677
*>          RWORK is DOUBLE PRECISION array, dimension (LRWORK)
-
 
678
*>          LRWORK = 4*N, if NCVT = NRU = NCC = 0, and
-
 
679
*>          LRWORK = 4*(N-1), otherwise
678
*> \endverbatim
680
*> \endverbatim
679
*>
681
*>
680
*> \param[out] INFO
682
*> \param[out] INFO
681
*> \verbatim
683
*> \verbatim
682
*>          INFO is INTEGER
684
*>          INFO is INTEGER
Line 785... Line 787...
785
      LOGICAL            LSAME
787
      LOGICAL            LSAME
786
      DOUBLE PRECISION   DLAMCH
788
      DOUBLE PRECISION   DLAMCH
787
      EXTERNAL           LSAME, DLAMCH
789
      EXTERNAL           LSAME, DLAMCH
788
*     ..
790
*     ..
789
*     .. External Subroutines ..
791
*     .. External Subroutines ..
790
      EXTERNAL           DLARTG, DLAS2, DLASQ1, DLASV2, XERBLA, ZDROT,
792
      EXTERNAL           DLARTG, DLAS2, DLASQ1, DLASV2, XERBLA,
-
 
793
     $                   ZDROT,
791
     $                   ZDSCAL, ZLASR, ZSWAP
794
     $                   ZDSCAL, ZLASR, ZSWAP
792
*     ..
795
*     ..
793
*     .. Intrinsic Functions ..
796
*     .. Intrinsic Functions ..
794
      INTRINSIC          ABS, DBLE, MAX, MIN, SIGN, SQRT
797
      INTRINSIC          ABS, DBLE, MAX, MIN, SIGN, SQRT
795
*     ..
798
*     ..
Line 866... Line 869...
866
   10    CONTINUE
869
   10    CONTINUE
867
*
870
*
868
*        Update singular vectors if desired
871
*        Update singular vectors if desired
869
*
872
*
870
         IF( NRU.GT.0 )
873
         IF( NRU.GT.0 )
871
     $      CALL ZLASR( 'R', 'V', 'F', NRU, N, RWORK( 1 ), RWORK( N ),
874
     $      CALL ZLASR( 'R', 'V', 'F', NRU, N, RWORK( 1 ),
-
 
875
     $                  RWORK( N ),
872
     $                  U, LDU )
876
     $                  U, LDU )
873
         IF( NCC.GT.0 )
877
         IF( NCC.GT.0 )
874
     $      CALL ZLASR( 'L', 'V', 'F', N, NCC, RWORK( 1 ), RWORK( N ),
878
     $      CALL ZLASR( 'L', 'V', 'F', N, NCC, RWORK( 1 ),
-
 
879
     $                  RWORK( N ),
875
     $                  C, LDC )
880
     $                  C, LDC )
876
      END IF
881
      END IF
877
*
882
*
878
*     Compute singular values to relative accuracy TOL
883
*     Compute singular values to relative accuracy TOL
879
*     (By setting TOL to be negative, algorithm will compute
884
*     (By setting TOL to be negative, algorithm will compute
Line 993... Line 998...
993
*
998
*
994
         IF( NCVT.GT.0 )
999
         IF( NCVT.GT.0 )
995
     $      CALL ZDROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT,
1000
     $      CALL ZDROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT,
996
     $                  COSR, SINR )
1001
     $                  COSR, SINR )
997
         IF( NRU.GT.0 )
1002
         IF( NRU.GT.0 )
998
     $      CALL ZDROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL )
1003
     $      CALL ZDROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL,
-
 
1004
     $                  SINL )
999
         IF( NCC.GT.0 )
1005
         IF( NCC.GT.0 )
1000
     $      CALL ZDROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
1006
     $      CALL ZDROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL,
1001
     $                  SINL )
1007
     $                  SINL )
1002
         M = M - 2
1008
         M = M - 2
1003
         GO TO 60
1009
         GO TO 60
Line 1126... Line 1132...
1126
            OLDCS = ONE
1132
            OLDCS = ONE
1127
            DO 120 I = LL, M - 1
1133
            DO 120 I = LL, M - 1
1128
               CALL DLARTG( D( I )*CS, E( I ), CS, SN, R )
1134
               CALL DLARTG( D( I )*CS, E( I ), CS, SN, R )
1129
               IF( I.GT.LL )
1135
               IF( I.GT.LL )
1130
     $            E( I-1 ) = OLDSN*R
1136
     $            E( I-1 ) = OLDSN*R
1131
               CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) )
1137
               CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN,
-
 
1138
     $                      D( I ) )
1132
               RWORK( I-LL+1 ) = CS
1139
               RWORK( I-LL+1 ) = CS
1133
               RWORK( I-LL+1+NM1 ) = SN
1140
               RWORK( I-LL+1+NM1 ) = SN
1134
               RWORK( I-LL+1+NM12 ) = OLDCS
1141
               RWORK( I-LL+1+NM12 ) = OLDCS
1135
               RWORK( I-LL+1+NM13 ) = OLDSN
1142
               RWORK( I-LL+1+NM13 ) = OLDSN
1136
  120       CONTINUE
1143
  120       CONTINUE
Line 1142... Line 1149...
1142
*
1149
*
1143
            IF( NCVT.GT.0 )
1150
            IF( NCVT.GT.0 )
1144
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
1151
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
1145
     $                     RWORK( N ), VT( LL, 1 ), LDVT )
1152
     $                     RWORK( N ), VT( LL, 1 ), LDVT )
1146
            IF( NRU.GT.0 )
1153
            IF( NRU.GT.0 )
1147
     $         CALL ZLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
1154
     $         CALL ZLASR( 'R', 'V', 'F', NRU, M-LL+1,
-
 
1155
     $                     RWORK( NM12+1 ),
1148
     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
1156
     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
1149
            IF( NCC.GT.0 )
1157
            IF( NCC.GT.0 )
1150
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
1158
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCC,
-
 
1159
     $                     RWORK( NM12+1 ),
1151
     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
1160
     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
1152
*
1161
*
1153
*           Test convergence
1162
*           Test convergence
1154
*
1163
*
1155
            IF( ABS( E( M-1 ) ).LE.THRESH )
1164
            IF( ABS( E( M-1 ) ).LE.THRESH )
Line 1164... Line 1173...
1164
            OLDCS = ONE
1173
            OLDCS = ONE
1165
            DO 130 I = M, LL + 1, -1
1174
            DO 130 I = M, LL + 1, -1
1166
               CALL DLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
1175
               CALL DLARTG( D( I )*CS, E( I-1 ), CS, SN, R )
1167
               IF( I.LT.M )
1176
               IF( I.LT.M )
1168
     $            E( I ) = OLDSN*R
1177
     $            E( I ) = OLDSN*R
1169
               CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) )
1178
               CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN,
-
 
1179
     $                      D( I ) )
1170
               RWORK( I-LL ) = CS
1180
               RWORK( I-LL ) = CS
1171
               RWORK( I-LL+NM1 ) = -SN
1181
               RWORK( I-LL+NM1 ) = -SN
1172
               RWORK( I-LL+NM12 ) = OLDCS
1182
               RWORK( I-LL+NM12 ) = OLDCS
1173
               RWORK( I-LL+NM13 ) = -OLDSN
1183
               RWORK( I-LL+NM13 ) = -OLDSN
1174
  130       CONTINUE
1184
  130       CONTINUE
Line 1177... Line 1187...
1177
            E( LL ) = H*OLDSN
1187
            E( LL ) = H*OLDSN
1178
*
1188
*
1179
*           Update singular vectors
1189
*           Update singular vectors
1180
*
1190
*
1181
            IF( NCVT.GT.0 )
1191
            IF( NCVT.GT.0 )
1182
     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
1192
     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCVT,
-
 
1193
     $                     RWORK( NM12+1 ),
1183
     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
1194
     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
1184
            IF( NRU.GT.0 )
1195
            IF( NRU.GT.0 )
1185
     $         CALL ZLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
1196
     $         CALL ZLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
1186
     $                     RWORK( N ), U( 1, LL ), LDU )
1197
     $                     RWORK( N ), U( 1, LL ), LDU )
1187
            IF( NCC.GT.0 )
1198
            IF( NCC.GT.0 )
Line 1232... Line 1243...
1232
*
1243
*
1233
            IF( NCVT.GT.0 )
1244
            IF( NCVT.GT.0 )
1234
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
1245
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCVT, RWORK( 1 ),
1235
     $                     RWORK( N ), VT( LL, 1 ), LDVT )
1246
     $                     RWORK( N ), VT( LL, 1 ), LDVT )
1236
            IF( NRU.GT.0 )
1247
            IF( NRU.GT.0 )
1237
     $         CALL ZLASR( 'R', 'V', 'F', NRU, M-LL+1, RWORK( NM12+1 ),
1248
     $         CALL ZLASR( 'R', 'V', 'F', NRU, M-LL+1,
-
 
1249
     $                     RWORK( NM12+1 ),
1238
     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
1250
     $                     RWORK( NM13+1 ), U( 1, LL ), LDU )
1239
            IF( NCC.GT.0 )
1251
            IF( NCC.GT.0 )
1240
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCC, RWORK( NM12+1 ),
1252
     $         CALL ZLASR( 'L', 'V', 'F', M-LL+1, NCC,
-
 
1253
     $                     RWORK( NM12+1 ),
1241
     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
1254
     $                     RWORK( NM13+1 ), C( LL, 1 ), LDC )
1242
*
1255
*
1243
*           Test convergence
1256
*           Test convergence
1244
*
1257
*
1245
            IF( ABS( E( M-1 ) ).LE.THRESH )
1258
            IF( ABS( E( M-1 ) ).LE.THRESH )
Line 1282... Line 1295...
1282
     $         E( LL ) = ZERO
1295
     $         E( LL ) = ZERO
1283
*
1296
*
1284
*           Update singular vectors if desired
1297
*           Update singular vectors if desired
1285
*
1298
*
1286
            IF( NCVT.GT.0 )
1299
            IF( NCVT.GT.0 )
1287
     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCVT, RWORK( NM12+1 ),
1300
     $         CALL ZLASR( 'L', 'V', 'B', M-LL+1, NCVT,
-
 
1301
     $                     RWORK( NM12+1 ),
1288
     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
1302
     $                     RWORK( NM13+1 ), VT( LL, 1 ), LDVT )
1289
            IF( NRU.GT.0 )
1303
            IF( NRU.GT.0 )
1290
     $         CALL ZLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
1304
     $         CALL ZLASR( 'R', 'V', 'B', NRU, M-LL+1, RWORK( 1 ),
1291
     $                     RWORK( N ), U( 1, LL ), LDU )
1305
     $                     RWORK( N ), U( 1, LL ), LDU )
1292
            IF( NCC.GT.0 )
1306
            IF( NCC.GT.0 )
Line 1301... Line 1315...
1301
*
1315
*
1302
*     All singular values converged, so make them positive
1316
*     All singular values converged, so make them positive
1303
*
1317
*
1304
  160 CONTINUE
1318
  160 CONTINUE
1305
      DO 170 I = 1, N
1319
      DO 170 I = 1, N
-
 
1320
         IF( D( I ).EQ.ZERO ) THEN
-
 
1321
*
-
 
1322
*           Avoid -ZERO
-
 
1323
*
-
 
1324
            D( I ) = ZERO
-
 
1325
         END IF
1306
         IF( D( I ).LT.ZERO ) THEN
1326
         IF( D( I ).LT.ZERO ) THEN
1307
            D( I ) = -D( I )
1327
            D( I ) = -D( I )
1308
*
1328
*
1309
*           Change sign of singular vectors, if desired
1329
*           Change sign of singular vectors, if desired
1310
*
1330
*
Line 1338... Line 1358...
1338
     $         CALL ZSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ),
1358
     $         CALL ZSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ),
1339
     $                     LDVT )
1359
     $                     LDVT )
1340
            IF( NRU.GT.0 )
1360
            IF( NRU.GT.0 )
1341
     $         CALL ZSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
1361
     $         CALL ZSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 )
1342
            IF( NCC.GT.0 )
1362
            IF( NCC.GT.0 )
1343
     $         CALL ZSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC )
1363
     $         CALL ZSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ),
-
 
1364
     $                     LDC )
1344
         END IF
1365
         END IF
1345
  190 CONTINUE
1366
  190 CONTINUE
1346
      GO TO 220
1367
      GO TO 220
1347
*
1368
*
1348
*     Maximum number of iterations exceeded, failure to converge
1369
*     Maximum number of iterations exceeded, failure to converge
Line 1671... Line 1692...
1671
*> \author NAG Ltd.
1692
*> \author NAG Ltd.
1672
*
1693
*
1673
*> \ingroup gbcon
1694
*> \ingroup gbcon
1674
*
1695
*
1675
*  =====================================================================
1696
*  =====================================================================
1676
      SUBROUTINE ZGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
1697
      SUBROUTINE ZGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM,
-
 
1698
     $                   RCOND,
1677
     $                   WORK, RWORK, INFO )
1699
     $                   WORK, RWORK, INFO )
1678
*
1700
*
1679
*  -- LAPACK computational routine --
1701
*  -- LAPACK computational routine --
1680
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
1702
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
1681
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1703
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 1713... Line 1735...
1713
      DOUBLE PRECISION   DLAMCH
1735
      DOUBLE PRECISION   DLAMCH
1714
      COMPLEX*16         ZDOTC
1736
      COMPLEX*16         ZDOTC
1715
      EXTERNAL           LSAME, IZAMAX, DLAMCH, ZDOTC
1737
      EXTERNAL           LSAME, IZAMAX, DLAMCH, ZDOTC
1716
*     ..
1738
*     ..
1717
*     .. External Subroutines ..
1739
*     .. External Subroutines ..
1718
      EXTERNAL           XERBLA, ZAXPY, ZDRSCL, ZLACN2, ZLATBS
1740
      EXTERNAL           XERBLA, ZAXPY, ZDRSCL, ZLACN2,
-
 
1741
     $                   ZLATBS
1719
*     ..
1742
*     ..
1720
*     .. Intrinsic Functions ..
1743
*     .. Intrinsic Functions ..
1721
      INTRINSIC          ABS, DBLE, DIMAG, MIN
1744
      INTRINSIC          ABS, DBLE, DIMAG, MIN
1722
*     ..
1745
*     ..
1723
*     .. Statement Functions ..
1746
*     .. Statement Functions ..
Line 1788... Line 1811...
1788
                  T = WORK( JP )
1811
                  T = WORK( JP )
1789
                  IF( JP.NE.J ) THEN
1812
                  IF( JP.NE.J ) THEN
1790
                     WORK( JP ) = WORK( J )
1813
                     WORK( JP ) = WORK( J )
1791
                     WORK( J ) = T
1814
                     WORK( J ) = T
1792
                  END IF
1815
                  END IF
1793
                  CALL ZAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
1816
                  CALL ZAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ),
-
 
1817
     $                        1 )
1794
   20          CONTINUE
1818
   20          CONTINUE
1795
            END IF
1819
            END IF
1796
*
1820
*
1797
*           Multiply by inv(U).
1821
*           Multiply by inv(U).
1798
*
1822
*
1799
            CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
1823
            CALL ZLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN,
-
 
1824
     $                   N,
1800
     $                   KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
1825
     $                   KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
1801
         ELSE
1826
         ELSE
1802
*
1827
*
1803
*           Multiply by inv(U**H).
1828
*           Multiply by inv(U**H).
1804
*
1829
*
Line 1809... Line 1834...
1809
*           Multiply by inv(L**H).
1834
*           Multiply by inv(L**H).
1810
*
1835
*
1811
            IF( LNOTI ) THEN
1836
            IF( LNOTI ) THEN
1812
               DO 30 J = N - 1, 1, -1
1837
               DO 30 J = N - 1, 1, -1
1813
                  LM = MIN( KL, N-J )
1838
                  LM = MIN( KL, N-J )
1814
                  WORK( J ) = WORK( J ) - ZDOTC( LM, AB( KD+1, J ), 1,
1839
                  WORK( J ) = WORK( J ) - ZDOTC( LM, AB( KD+1, J ),
-
 
1840
     $                  1,
1815
     $                        WORK( J+1 ), 1 )
1841
     $                        WORK( J+1 ), 1 )
1816
                  JP = IPIV( J )
1842
                  JP = IPIV( J )
1817
                  IF( JP.NE.J ) THEN
1843
                  IF( JP.NE.J ) THEN
1818
                     T = WORK( JP )
1844
                     T = WORK( JP )
1819
                     WORK( JP ) = WORK( J )
1845
                     WORK( JP ) = WORK( J )
Line 1995... Line 2021...
1995
*> \author NAG Ltd.
2021
*> \author NAG Ltd.
1996
*
2022
*
1997
*> \ingroup gbequ
2023
*> \ingroup gbequ
1998
*
2024
*
1999
*  =====================================================================
2025
*  =====================================================================
2000
      SUBROUTINE ZGBEQU( M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
2026
      SUBROUTINE ZGBEQU( M, N, KL, KU, AB, LDAB, R, C, ROWCND,
-
 
2027
     $                   COLCND,
2001
     $                   AMAX, INFO )
2028
     $                   AMAX, INFO )
2002
*
2029
*
2003
*  -- LAPACK computational routine --
2030
*  -- LAPACK computational routine --
2004
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
2031
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
2005
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
2032
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 2376... Line 2403...
2376
*> \author NAG Ltd.
2403
*> \author NAG Ltd.
2377
*
2404
*
2378
*> \ingroup gbrfs
2405
*> \ingroup gbrfs
2379
*
2406
*
2380
*  =====================================================================
2407
*  =====================================================================
2381
      SUBROUTINE ZGBRFS( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB,
2408
      SUBROUTINE ZGBRFS( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB,
-
 
2409
     $                   LDAFB,
2382
     $                   IPIV, B, LDB, X, LDX, FERR, BERR, WORK, RWORK,
2410
     $                   IPIV, B, LDB, X, LDX, FERR, BERR, WORK, RWORK,
2383
     $                   INFO )
2411
     $                   INFO )
2384
*
2412
*
2385
*  -- LAPACK computational routine --
2413
*  -- LAPACK computational routine --
2386
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
2414
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 2420... Line 2448...
2420
*     ..
2448
*     ..
2421
*     .. Local Arrays ..
2449
*     .. Local Arrays ..
2422
      INTEGER            ISAVE( 3 )
2450
      INTEGER            ISAVE( 3 )
2423
*     ..
2451
*     ..
2424
*     .. External Subroutines ..
2452
*     .. External Subroutines ..
2425
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZGBMV, ZGBTRS, ZLACN2
2453
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZGBMV, ZGBTRS,
-
 
2454
     $                   ZLACN2
2426
*     ..
2455
*     ..
2427
*     .. Intrinsic Functions ..
2456
*     .. Intrinsic Functions ..
2428
      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
2457
      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
2429
*     ..
2458
*     ..
2430
*     .. External Functions ..
2459
*     .. External Functions ..
Line 2507... Line 2536...
2507
*
2536
*
2508
*        Compute residual R = B - op(A) * X,
2537
*        Compute residual R = B - op(A) * X,
2509
*        where op(A) = A, A**T, or A**H, depending on TRANS.
2538
*        where op(A) = A, A**T, or A**H, depending on TRANS.
2510
*
2539
*
2511
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
2540
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
2512
         CALL ZGBMV( TRANS, N, N, KL, KU, -CONE, AB, LDAB, X( 1, J ), 1,
2541
         CALL ZGBMV( TRANS, N, N, KL, KU, -CONE, AB, LDAB, X( 1, J ),
-
 
2542
     $               1,
2513
     $               CONE, WORK, 1 )
2543
     $               CONE, WORK, 1 )
2514
*
2544
*
2515
*        Compute componentwise relative backward error from formula
2545
*        Compute componentwise relative backward error from formula
2516
*
2546
*
2517
*        max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) )
2547
*        max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) )
Line 2565... Line 2595...
2565
         IF( BERR( J ).GT.EPS .AND. TWO*BERR( J ).LE.LSTRES .AND.
2595
         IF( BERR( J ).GT.EPS .AND. TWO*BERR( J ).LE.LSTRES .AND.
2566
     $       COUNT.LE.ITMAX ) THEN
2596
     $       COUNT.LE.ITMAX ) THEN
2567
*
2597
*
2568
*           Update solution and try again.
2598
*           Update solution and try again.
2569
*
2599
*
2570
            CALL ZGBTRS( TRANS, N, KL, KU, 1, AFB, LDAFB, IPIV, WORK, N,
2600
            CALL ZGBTRS( TRANS, N, KL, KU, 1, AFB, LDAFB, IPIV, WORK,
-
 
2601
     $                   N,
2571
     $                   INFO )
2602
     $                   INFO )
2572
            CALL ZAXPY( N, CONE, WORK, 1, X( 1, J ), 1 )
2603
            CALL ZAXPY( N, CONE, WORK, 1, X( 1, J ), 1 )
2573
            LSTRES = BERR( J )
2604
            LSTRES = BERR( J )
2574
            COUNT = COUNT + 1
2605
            COUNT = COUNT + 1
2575
            GO TO 20
2606
            GO TO 20
Line 2806... Line 2837...
2806
*>  + need not be set on entry, but are required by the routine to store
2837
*>  + need not be set on entry, but are required by the routine to store
2807
*>  elements of U because of fill-in resulting from the row interchanges.
2838
*>  elements of U because of fill-in resulting from the row interchanges.
2808
*> \endverbatim
2839
*> \endverbatim
2809
*>
2840
*>
2810
*  =====================================================================
2841
*  =====================================================================
2811
      SUBROUTINE ZGBSV( N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO )
2842
      SUBROUTINE ZGBSV( N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
-
 
2843
     $                  INFO )
2812
*
2844
*
2813
*  -- LAPACK driver routine --
2845
*  -- LAPACK driver routine --
2814
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
2846
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
2815
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
2847
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
2816
*
2848
*
Line 2858... Line 2890...
2858
      CALL ZGBTRF( N, N, KL, KU, AB, LDAB, IPIV, INFO )
2890
      CALL ZGBTRF( N, N, KL, KU, AB, LDAB, IPIV, INFO )
2859
      IF( INFO.EQ.0 ) THEN
2891
      IF( INFO.EQ.0 ) THEN
2860
*
2892
*
2861
*        Solve the system A*X = B, overwriting B with X.
2893
*        Solve the system A*X = B, overwriting B with X.
2862
*
2894
*
2863
         CALL ZGBTRS( 'No transpose', N, KL, KU, NRHS, AB, LDAB, IPIV,
2895
         CALL ZGBTRS( 'No transpose', N, KL, KU, NRHS, AB, LDAB,
-
 
2896
     $                IPIV,
2864
     $                B, LDB, INFO )
2897
     $                B, LDB, INFO )
2865
      END IF
2898
      END IF
2866
      RETURN
2899
      RETURN
2867
*
2900
*
2868
*     End of ZGBSV
2901
*     End of ZGBSV
Line 3275... Line 3308...
3275
      LOGICAL            LSAME
3308
      LOGICAL            LSAME
3276
      DOUBLE PRECISION   DLAMCH, ZLANGB, ZLANTB
3309
      DOUBLE PRECISION   DLAMCH, ZLANGB, ZLANTB
3277
      EXTERNAL           LSAME, DLAMCH, ZLANGB, ZLANTB
3310
      EXTERNAL           LSAME, DLAMCH, ZLANGB, ZLANTB
3278
*     ..
3311
*     ..
3279
*     .. External Subroutines ..
3312
*     .. External Subroutines ..
3280
      EXTERNAL           XERBLA, ZCOPY, ZGBCON, ZGBEQU, ZGBRFS, ZGBTRF,
3313
      EXTERNAL           XERBLA, ZCOPY, ZGBCON, ZGBEQU, ZGBRFS,
-
 
3314
     $                   ZGBTRF,
3281
     $                   ZGBTRS, ZLACPY, ZLAQGB
3315
     $                   ZGBTRS, ZLACPY, ZLAQGB
3282
*     ..
3316
*     ..
3283
*     .. Intrinsic Functions ..
3317
*     .. Intrinsic Functions ..
3284
      INTRINSIC          ABS, MAX, MIN
3318
      INTRINSIC          ABS, MAX, MIN
3285
*     ..
3319
*     ..
Line 3300... Line 3334...
3300
         BIGNUM = ONE / SMLNUM
3334
         BIGNUM = ONE / SMLNUM
3301
      END IF
3335
      END IF
3302
*
3336
*
3303
*     Test the input parameters.
3337
*     Test the input parameters.
3304
*
3338
*
-
 
3339
      IF( .NOT.NOFACT .AND.
-
 
3340
     $    .NOT.EQUIL .AND.
3305
      IF( .NOT.NOFACT .AND. .NOT.EQUIL .AND. .NOT.LSAME( FACT, 'F' ) )
3341
     $    .NOT.LSAME( FACT, 'F' ) )
3306
     $     THEN
3342
     $     THEN
3307
         INFO = -1
3343
         INFO = -1
3308
      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
3344
      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
3309
     $         LSAME( TRANS, 'C' ) ) THEN
3345
     $         LSAME( TRANS, 'C' ) ) THEN
3310
         INFO = -2
3346
         INFO = -2
Line 3376... Line 3412...
3376
     $                AMAX, INFEQU )
3412
     $                AMAX, INFEQU )
3377
         IF( INFEQU.EQ.0 ) THEN
3413
         IF( INFEQU.EQ.0 ) THEN
3378
*
3414
*
3379
*           Equilibrate the matrix.
3415
*           Equilibrate the matrix.
3380
*
3416
*
3381
            CALL ZLAQGB( N, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
3417
            CALL ZLAQGB( N, N, KL, KU, AB, LDAB, R, C, ROWCND,
-
 
3418
     $                   COLCND,
3382
     $                   AMAX, EQUED )
3419
     $                   AMAX, EQUED )
3383
            ROWEQU = LSAME( EQUED, 'R' ) .OR. LSAME( EQUED, 'B' )
3420
            ROWEQU = LSAME( EQUED, 'R' ) .OR. LSAME( EQUED, 'B' )
3384
            COLEQU = LSAME( EQUED, 'C' ) .OR. LSAME( EQUED, 'B' )
3421
            COLEQU = LSAME( EQUED, 'C' ) .OR. LSAME( EQUED, 'B' )
3385
         END IF
3422
         END IF
3386
      END IF
3423
      END IF
Line 3427... Line 3464...
3427
            DO 90 J = 1, INFO
3464
            DO 90 J = 1, INFO
3428
               DO 80 I = MAX( KU+2-J, 1 ), MIN( N+KU+1-J, KL+KU+1 )
3465
               DO 80 I = MAX( KU+2-J, 1 ), MIN( N+KU+1-J, KL+KU+1 )
3429
                  ANORM = MAX( ANORM, ABS( AB( I, J ) ) )
3466
                  ANORM = MAX( ANORM, ABS( AB( I, J ) ) )
3430
   80          CONTINUE
3467
   80          CONTINUE
3431
   90       CONTINUE
3468
   90       CONTINUE
3432
            RPVGRW = ZLANTB( 'M', 'U', 'N', INFO, MIN( INFO-1, KL+KU ),
3469
            RPVGRW = ZLANTB( 'M', 'U', 'N', INFO, MIN( INFO-1,
-
 
3470
     $                       KL+KU ),
3433
     $                       AFB( MAX( 1, KL+KU+2-INFO ), 1 ), LDAFB,
3471
     $                       AFB( MAX( 1, KL+KU+2-INFO ), 1 ), LDAFB,
3434
     $                       RWORK )
3472
     $                       RWORK )
3435
            IF( RPVGRW.EQ.ZERO ) THEN
3473
            IF( RPVGRW.EQ.ZERO ) THEN
3436
               RPVGRW = ONE
3474
               RPVGRW = ONE
3437
            ELSE
3475
            ELSE
Line 3471... Line 3509...
3471
     $             INFO )
3509
     $             INFO )
3472
*
3510
*
3473
*     Use iterative refinement to improve the computed solution and
3511
*     Use iterative refinement to improve the computed solution and
3474
*     compute error bounds and backward error estimates for it.
3512
*     compute error bounds and backward error estimates for it.
3475
*
3513
*
3476
      CALL ZGBRFS( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB, IPIV,
3514
      CALL ZGBRFS( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB,
-
 
3515
     $             IPIV,
3477
     $             B, LDB, X, LDX, FERR, BERR, WORK, RWORK, INFO )
3516
     $             B, LDB, X, LDX, FERR, BERR, WORK, RWORK, INFO )
3478
*
3517
*
3479
*     Transform the solution matrix X to a solution of the original
3518
*     Transform the solution matrix X to a solution of the original
3480
*     system.
3519
*     system.
3481
*
3520
*
Line 3761... Line 3800...
3761
     $                     AB( KV+1, J ), LDAB-1 )
3800
     $                     AB( KV+1, J ), LDAB-1 )
3762
            IF( KM.GT.0 ) THEN
3801
            IF( KM.GT.0 ) THEN
3763
*
3802
*
3764
*              Compute multipliers.
3803
*              Compute multipliers.
3765
*
3804
*
3766
               CALL ZSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ), 1 )
3805
               CALL ZSCAL( KM, ONE / AB( KV+1, J ), AB( KV+2, J ),
-
 
3806
     $                     1 )
3767
*
3807
*
3768
*              Update trailing submatrix within the band.
3808
*              Update trailing submatrix within the band.
3769
*
3809
*
3770
               IF( JU.GT.J )
3810
               IF( JU.GT.J )
3771
     $            CALL ZGERU( KM, JU-J, -ONE, AB( KV+2, J ), 1,
3811
     $            CALL ZGERU( KM, JU-J, -ONE, AB( KV+2, J ), 1,
Line 3963... Line 4003...
3963
*     .. External Functions ..
4003
*     .. External Functions ..
3964
      INTEGER            ILAENV, IZAMAX
4004
      INTEGER            ILAENV, IZAMAX
3965
      EXTERNAL           ILAENV, IZAMAX
4005
      EXTERNAL           ILAENV, IZAMAX
3966
*     ..
4006
*     ..
3967
*     .. External Subroutines ..
4007
*     .. External Subroutines ..
3968
      EXTERNAL           XERBLA, ZCOPY, ZGBTF2, ZGEMM, ZGERU, ZLASWP,
4008
      EXTERNAL           XERBLA, ZCOPY, ZGBTF2, ZGEMM, ZGERU,
-
 
4009
     $                   ZLASWP,
3969
     $                   ZSCAL, ZSWAP, ZTRSM
4010
     $                   ZSCAL, ZSWAP, ZTRSM
3970
*     ..
4011
*     ..
3971
*     .. Intrinsic Functions ..
4012
*     .. Intrinsic Functions ..
3972
      INTRINSIC          MAX, MIN
4013
      INTRINSIC          MAX, MIN
3973
*     ..
4014
*     ..
Line 4111... Line 4152...
4111
                     END IF
4152
                     END IF
4112
                  END IF
4153
                  END IF
4113
*
4154
*
4114
*                 Compute multipliers
4155
*                 Compute multipliers
4115
*
4156
*
4116
                  CALL ZSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2, JJ ),
4157
                  CALL ZSCAL( KM, ONE / AB( KV+1, JJ ), AB( KV+2,
-
 
4158
     $                        JJ ),
4117
     $                        1 )
4159
     $                        1 )
4118
*
4160
*
4119
*                 Update trailing submatrix within the band and within
4161
*                 Update trailing submatrix within the band and within
4120
*                 the current block. JM is the index of the last column
4162
*                 the current block. JM is the index of the last column
4121
*                 which needs to be updated.
4163
*                 which needs to be updated.
Line 4180... Line 4222...
4180
*
4222
*
4181
               IF( J2.GT.0 ) THEN
4223
               IF( J2.GT.0 ) THEN
4182
*
4224
*
4183
*                 Update A12
4225
*                 Update A12
4184
*
4226
*
4185
                  CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
4227
                  CALL ZTRSM( 'Left', 'Lower', 'No transpose',
-
 
4228
     $                        'Unit',
4186
     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
4229
     $                        JB, J2, ONE, AB( KV+1, J ), LDAB-1,
4187
     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
4230
     $                        AB( KV+1-JB, J+JB ), LDAB-1 )
4188
*
4231
*
4189
                  IF( I2.GT.0 ) THEN
4232
                  IF( I2.GT.0 ) THEN
4190
*
4233
*
4191
*                    Update A22
4234
*                    Update A22
4192
*
4235
*
4193
                     CALL ZGEMM( 'No transpose', 'No transpose', I2, J2,
4236
                     CALL ZGEMM( 'No transpose', 'No transpose', I2,
-
 
4237
     $                           J2,
4194
     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
4238
     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
4195
     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
4239
     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
4196
     $                           AB( KV+1, J+JB ), LDAB-1 )
4240
     $                           AB( KV+1, J+JB ), LDAB-1 )
4197
                  END IF
4241
                  END IF
4198
*
4242
*
4199
                  IF( I3.GT.0 ) THEN
4243
                  IF( I3.GT.0 ) THEN
4200
*
4244
*
4201
*                    Update A32
4245
*                    Update A32
4202
*
4246
*
4203
                     CALL ZGEMM( 'No transpose', 'No transpose', I3, J2,
4247
                     CALL ZGEMM( 'No transpose', 'No transpose', I3,
-
 
4248
     $                           J2,
4204
     $                           JB, -ONE, WORK31, LDWORK,
4249
     $                           JB, -ONE, WORK31, LDWORK,
4205
     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
4250
     $                           AB( KV+1-JB, J+JB ), LDAB-1, ONE,
4206
     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
4251
     $                           AB( KV+KL+1-JB, J+JB ), LDAB-1 )
4207
                  END IF
4252
                  END IF
4208
               END IF
4253
               END IF
Line 4218... Line 4263...
4218
  120                CONTINUE
4263
  120                CONTINUE
4219
  130             CONTINUE
4264
  130             CONTINUE
4220
*
4265
*
4221
*                 Update A13 in the work array
4266
*                 Update A13 in the work array
4222
*
4267
*
4223
                  CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
4268
                  CALL ZTRSM( 'Left', 'Lower', 'No transpose',
-
 
4269
     $                        'Unit',
4224
     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
4270
     $                        JB, J3, ONE, AB( KV+1, J ), LDAB-1,
4225
     $                        WORK13, LDWORK )
4271
     $                        WORK13, LDWORK )
4226
*
4272
*
4227
                  IF( I2.GT.0 ) THEN
4273
                  IF( I2.GT.0 ) THEN
4228
*
4274
*
4229
*                    Update A23
4275
*                    Update A23
4230
*
4276
*
4231
                     CALL ZGEMM( 'No transpose', 'No transpose', I2, J3,
4277
                     CALL ZGEMM( 'No transpose', 'No transpose', I2,
-
 
4278
     $                           J3,
4232
     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
4279
     $                           JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
4233
     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
4280
     $                           WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
4234
     $                           LDAB-1 )
4281
     $                           LDAB-1 )
4235
                  END IF
4282
                  END IF
4236
*
4283
*
4237
                  IF( I3.GT.0 ) THEN
4284
                  IF( I3.GT.0 ) THEN
4238
*
4285
*
4239
*                    Update A33
4286
*                    Update A33
4240
*
4287
*
4241
                     CALL ZGEMM( 'No transpose', 'No transpose', I3, J3,
4288
                     CALL ZGEMM( 'No transpose', 'No transpose', I3,
-
 
4289
     $                           J3,
4242
     $                           JB, -ONE, WORK31, LDWORK, WORK13,
4290
     $                           JB, -ONE, WORK31, LDWORK, WORK13,
4243
     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
4291
     $                           LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
4244
                  END IF
4292
                  END IF
4245
*
4293
*
4246
*                 Copy the lower triangle of A13 back into place
4294
*                 Copy the lower triangle of A13 back into place
Line 4433... Line 4481...
4433
*> \author NAG Ltd.
4481
*> \author NAG Ltd.
4434
*
4482
*
4435
*> \ingroup gbtrs
4483
*> \ingroup gbtrs
4436
*
4484
*
4437
*  =====================================================================
4485
*  =====================================================================
4438
      SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB,
4486
      SUBROUTINE ZGBTRS( TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B,
-
 
4487
     $                   LDB,
4439
     $                   INFO )
4488
     $                   INFO )
4440
*
4489
*
4441
*  -- LAPACK computational routine --
4490
*  -- LAPACK computational routine --
4442
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
4491
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
4443
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
4492
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 4464... Line 4513...
4464
*     .. External Functions ..
4513
*     .. External Functions ..
4465
      LOGICAL            LSAME
4514
      LOGICAL            LSAME
4466
      EXTERNAL           LSAME
4515
      EXTERNAL           LSAME
4467
*     ..
4516
*     ..
4468
*     .. External Subroutines ..
4517
*     .. External Subroutines ..
4469
      EXTERNAL           XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP, ZTBSV
4518
      EXTERNAL           XERBLA, ZGEMV, ZGERU, ZLACGV, ZSWAP,
-
 
4519
     $                   ZTBSV
4470
*     ..
4520
*     ..
4471
*     .. Intrinsic Functions ..
4521
*     .. Intrinsic Functions ..
4472
      INTRINSIC          MAX, MIN
4522
      INTRINSIC          MAX, MIN
4473
*     ..
4523
*     ..
4474
*     .. Executable Statements ..
4524
*     .. Executable Statements ..
Line 4521... Line 4571...
4521
            DO 10 J = 1, N - 1
4571
            DO 10 J = 1, N - 1
4522
               LM = MIN( KL, N-J )
4572
               LM = MIN( KL, N-J )
4523
               L = IPIV( J )
4573
               L = IPIV( J )
4524
               IF( L.NE.J )
4574
               IF( L.NE.J )
4525
     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
4575
     $            CALL ZSWAP( NRHS, B( L, 1 ), LDB, B( J, 1 ), LDB )
4526
               CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J, 1 ),
4576
               CALL ZGERU( LM, NRHS, -ONE, AB( KD+1, J ), 1, B( J,
-
 
4577
     $                     1 ),
4527
     $                     LDB, B( J+1, 1 ), LDB )
4578
     $                     LDB, B( J+1, 1 ), LDB )
4528
   10       CONTINUE
4579
   10       CONTINUE
4529
         END IF
4580
         END IF
4530
*
4581
*
4531
         DO 20 I = 1, NRHS
4582
         DO 20 I = 1, NRHS
4532
*
4583
*
4533
*           Solve U*X = B, overwriting B with X.
4584
*           Solve U*X = B, overwriting B with X.
4534
*
4585
*
4535
            CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N, KL+KU,
4586
            CALL ZTBSV( 'Upper', 'No transpose', 'Non-unit', N,
-
 
4587
     $                  KL+KU,
4536
     $                  AB, LDAB, B( 1, I ), 1 )
4588
     $                  AB, LDAB, B( 1, I ), 1 )
4537
   20    CONTINUE
4589
   20    CONTINUE
4538
*
4590
*
4539
      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
4591
      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
4540
*
4592
*
Line 4542... Line 4594...
4542
*
4594
*
4543
         DO 30 I = 1, NRHS
4595
         DO 30 I = 1, NRHS
4544
*
4596
*
4545
*           Solve U**T * X = B, overwriting B with X.
4597
*           Solve U**T * X = B, overwriting B with X.
4546
*
4598
*
4547
            CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU, AB,
4599
            CALL ZTBSV( 'Upper', 'Transpose', 'Non-unit', N, KL+KU,
-
 
4600
     $                  AB,
4548
     $                  LDAB, B( 1, I ), 1 )
4601
     $                  LDAB, B( 1, I ), 1 )
4549
   30    CONTINUE
4602
   30    CONTINUE
4550
*
4603
*
4551
*        Solve L**T * X = B, overwriting B with X.
4604
*        Solve L**T * X = B, overwriting B with X.
4552
*
4605
*
Line 4567... Line 4620...
4567
*
4620
*
4568
         DO 50 I = 1, NRHS
4621
         DO 50 I = 1, NRHS
4569
*
4622
*
4570
*           Solve U**H * X = B, overwriting B with X.
4623
*           Solve U**H * X = B, overwriting B with X.
4571
*
4624
*
4572
            CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
4625
            CALL ZTBSV( 'Upper', 'Conjugate transpose', 'Non-unit',
-
 
4626
     $                  N,
4573
     $                  KL+KU, AB, LDAB, B( 1, I ), 1 )
4627
     $                  KL+KU, AB, LDAB, B( 1, I ), 1 )
4574
   50    CONTINUE
4628
   50    CONTINUE
4575
*
4629
*
4576
*        Solve L**H * X = B, overwriting B with X.
4630
*        Solve L**H * X = B, overwriting B with X.
4577
*
4631
*
Line 4765... Line 4819...
4765
*
4819
*
4766
      RIGHTV = LSAME( SIDE, 'R' )
4820
      RIGHTV = LSAME( SIDE, 'R' )
4767
      LEFTV = LSAME( SIDE, 'L' )
4821
      LEFTV = LSAME( SIDE, 'L' )
4768
*
4822
*
4769
      INFO = 0
4823
      INFO = 0
4770
      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
4824
      IF( .NOT.LSAME( JOB, 'N' ) .AND.
-
 
4825
     $    .NOT.LSAME( JOB, 'P' ) .AND.
-
 
4826
     $    .NOT.LSAME( JOB, 'S' ) .AND.
4771
     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
4827
     $                .NOT.LSAME( JOB, 'B' ) ) THEN
4772
         INFO = -1
4828
         INFO = -1
4773
      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
4829
      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
4774
         INFO = -2
4830
         INFO = -2
4775
      ELSE IF( N.LT.0 ) THEN
4831
      ELSE IF( N.LT.0 ) THEN
4776
         INFO = -3
4832
         INFO = -3
Line 5057... Line 5113...
5057
*     ..
5113
*     ..
5058
*     .. External Functions ..
5114
*     .. External Functions ..
5059
      LOGICAL            DISNAN, LSAME
5115
      LOGICAL            DISNAN, LSAME
5060
      INTEGER            IZAMAX
5116
      INTEGER            IZAMAX
5061
      DOUBLE PRECISION   DLAMCH, DZNRM2
5117
      DOUBLE PRECISION   DLAMCH, DZNRM2
5062
      EXTERNAL           DISNAN, LSAME, IZAMAX, DLAMCH, DZNRM2
5118
      EXTERNAL           DISNAN, LSAME, IZAMAX, DLAMCH,
-
 
5119
     $                   DZNRM2
5063
*     ..
5120
*     ..
5064
*     .. External Subroutines ..
5121
*     .. External Subroutines ..
5065
      EXTERNAL           XERBLA, ZDSCAL, ZSWAP
5122
      EXTERNAL           XERBLA, ZDSCAL, ZSWAP
5066
*     ..
5123
*     ..
5067
*     .. Intrinsic Functions ..
5124
*     .. Intrinsic Functions ..
5068
      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
5125
      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN
5069
*
5126
*
5070
*     Test the input parameters
5127
*     Test the input parameters
5071
*
5128
*
5072
      INFO = 0
5129
      INFO = 0
5073
      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
5130
      IF( .NOT.LSAME( JOB, 'N' ) .AND.
-
 
5131
     $    .NOT.LSAME( JOB, 'P' ) .AND.
-
 
5132
     $    .NOT.LSAME( JOB, 'S' ) .AND.
5074
     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
5133
     $                .NOT.LSAME( JOB, 'B' ) ) THEN
5075
         INFO = -1
5134
         INFO = -1
5076
      ELSE IF( N.LT.0 ) THEN
5135
      ELSE IF( N.LT.0 ) THEN
5077
         INFO = -2
5136
         INFO = -2
5078
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
5137
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
5079
         INFO = -4
5138
         INFO = -4
Line 5127... Line 5186...
5127
*
5186
*
5128
               IF( CANSWAP ) THEN
5187
               IF( CANSWAP ) THEN
5129
                  SCALE( L ) = I
5188
                  SCALE( L ) = I
5130
                  IF( I.NE.L ) THEN
5189
                  IF( I.NE.L ) THEN
5131
                     CALL ZSWAP( L, A( 1, I ), 1, A( 1, L ), 1 )
5190
                     CALL ZSWAP( L, A( 1, I ), 1, A( 1, L ), 1 )
5132
                     CALL ZSWAP( N-K+1, A( I, K ), LDA, A( L, K ), LDA )
5191
                     CALL ZSWAP( N-K+1, A( I, K ), LDA, A( L, K ),
-
 
5192
     $                           LDA )
5133
                  END IF
5193
                  END IF
5134
                  NOCONV = .TRUE.
5194
                  NOCONV = .TRUE.
5135
*
5195
*
5136
                  IF( L.EQ.1 ) THEN
5196
                  IF( L.EQ.1 ) THEN
5137
                     ILO = 1
5197
                     ILO = 1
Line 5163... Line 5223...
5163
*
5223
*
5164
               IF( CANSWAP ) THEN
5224
               IF( CANSWAP ) THEN
5165
                  SCALE( K ) = J
5225
                  SCALE( K ) = J
5166
                  IF( J.NE.K ) THEN
5226
                  IF( J.NE.K ) THEN
5167
                     CALL ZSWAP( L, A( 1, J ), 1, A( 1, K ), 1 )
5227
                     CALL ZSWAP( L, A( 1, J ), 1, A( 1, K ), 1 )
5168
                     CALL ZSWAP( N-K+1, A( J, K ), LDA, A( K, K ), LDA )
5228
                     CALL ZSWAP( N-K+1, A( J, K ), LDA, A( K, K ),
-
 
5229
     $                           LDA )
5169
                  END IF
5230
                  END IF
5170
                  NOCONV = .TRUE.
5231
                  NOCONV = .TRUE.
5171
*
5232
*
5172
                  K = K + 1
5233
                  K = K + 1
5173
               END IF
5234
               END IF
Line 5481... Line 5542...
5481
*     ..
5542
*     ..
5482
*
5543
*
5483
*  =====================================================================
5544
*  =====================================================================
5484
*
5545
*
5485
*     .. Parameters ..
5546
*     .. Parameters ..
5486
      COMPLEX*16         ZERO, ONE
5547
      COMPLEX*16         ZERO
5487
      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
5548
      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
5488
     $                   ONE = ( 1.0D+0, 0.0D+0 ) )
-
 
5489
*     ..
-
 
5490
*     .. Local Scalars ..
5549
*     .. Local Scalars ..
5491
      INTEGER            I
5550
      INTEGER            I
5492
      COMPLEX*16         ALPHA
5551
      COMPLEX*16         ALPHA
5493
*     ..
5552
*     ..
5494
*     .. External Subroutines ..
5553
*     .. External Subroutines ..
5495
      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZLARFG
5554
      EXTERNAL           XERBLA, ZLACGV, ZLARF1F, ZLARFG
5496
*     ..
5555
*     ..
5497
*     .. Intrinsic Functions ..
5556
*     .. Intrinsic Functions ..
5498
      INTRINSIC          DCONJG, MAX, MIN
5557
      INTRINSIC          DCONJG, MAX, MIN
5499
*     ..
5558
*     ..
5500
*     .. Executable Statements ..
5559
*     .. Executable Statements ..
Line 5524... Line 5583...
5524
*
5583
*
5525
            ALPHA = A( I, I )
5584
            ALPHA = A( I, I )
5526
            CALL ZLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
5585
            CALL ZLARFG( M-I+1, ALPHA, A( MIN( I+1, M ), I ), 1,
5527
     $                   TAUQ( I ) )
5586
     $                   TAUQ( I ) )
5528
            D( I ) = DBLE( ALPHA )
5587
            D( I ) = DBLE( ALPHA )
5529
            A( I, I ) = ONE
-
 
5530
*
5588
*
5531
*           Apply H(i)**H to A(i:m,i+1:n) from the left
5589
*           Apply H(i)**H to A(i:m,i+1:n) from the left
5532
*
5590
*
5533
            IF( I.LT.N )
5591
            IF( I.LT.N )
5534
     $         CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
5592
     $         CALL ZLARF1F( 'Left', M-I+1, N-I, A( I, I ), 1,
5535
     $                     DCONJG( TAUQ( I ) ), A( I, I+1 ), LDA, WORK )
5593
     $                     DCONJG( TAUQ( I ) ), A( I, I+1 ), LDA, WORK )
5536
            A( I, I ) = D( I )
5594
            A( I, I ) = D( I )
5537
*
5595
*
5538
            IF( I.LT.N ) THEN
5596
            IF( I.LT.N ) THEN
5539
*
5597
*
Line 5543... Line 5601...
5543
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
5601
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
5544
               ALPHA = A( I, I+1 )
5602
               ALPHA = A( I, I+1 )
5545
               CALL ZLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ), LDA,
5603
               CALL ZLARFG( N-I, ALPHA, A( I, MIN( I+2, N ) ), LDA,
5546
     $                      TAUP( I ) )
5604
     $                      TAUP( I ) )
5547
               E( I ) = DBLE( ALPHA )
5605
               E( I ) = DBLE( ALPHA )
5548
               A( I, I+1 ) = ONE
-
 
5549
*
5606
*
5550
*              Apply G(i) to A(i+1:m,i+1:n) from the right
5607
*              Apply G(i) to A(i+1:m,i+1:n) from the right
5551
*
5608
*
5552
               CALL ZLARF( 'Right', M-I, N-I, A( I, I+1 ), LDA,
5609
               CALL ZLARF1F( 'Right', M-I, N-I, A( I, I+1 ), LDA,
5553
     $                     TAUP( I ), A( I+1, I+1 ), LDA, WORK )
5610
     $                     TAUP( I ), A( I+1, I+1 ), LDA, WORK )
5554
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
5611
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
5555
               A( I, I+1 ) = E( I )
5612
               A( I, I+1 ) = E( I )
5556
            ELSE
5613
            ELSE
5557
               TAUP( I ) = ZERO
5614
               TAUP( I ) = ZERO
Line 5568... Line 5625...
5568
            CALL ZLACGV( N-I+1, A( I, I ), LDA )
5625
            CALL ZLACGV( N-I+1, A( I, I ), LDA )
5569
            ALPHA = A( I, I )
5626
            ALPHA = A( I, I )
5570
            CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
5627
            CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
5571
     $                   TAUP( I ) )
5628
     $                   TAUP( I ) )
5572
            D( I ) = DBLE( ALPHA )
5629
            D( I ) = DBLE( ALPHA )
5573
            A( I, I ) = ONE
-
 
5574
*
5630
*
5575
*           Apply G(i) to A(i+1:m,i:n) from the right
5631
*           Apply G(i) to A(i+1:m,i:n) from the right
5576
*
5632
*
5577
            IF( I.LT.M )
5633
            IF( I.LT.M )
5578
     $         CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
5634
     $         CALL ZLARF1F( 'Right', M-I, N-I+1, A( I, I ), LDA,
5579
     $                     TAUP( I ), A( I+1, I ), LDA, WORK )
5635
     $                     TAUP( I ), A( I+1, I ), LDA, WORK )
5580
            CALL ZLACGV( N-I+1, A( I, I ), LDA )
5636
            CALL ZLACGV( N-I+1, A( I, I ), LDA )
5581
            A( I, I ) = D( I )
5637
            A( I, I ) = D( I )
5582
*
5638
*
5583
            IF( I.LT.M ) THEN
5639
            IF( I.LT.M ) THEN
Line 5587... Line 5643...
5587
*
5643
*
5588
               ALPHA = A( I+1, I )
5644
               ALPHA = A( I+1, I )
5589
               CALL ZLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
5645
               CALL ZLARFG( M-I, ALPHA, A( MIN( I+2, M ), I ), 1,
5590
     $                      TAUQ( I ) )
5646
     $                      TAUQ( I ) )
5591
               E( I ) = DBLE( ALPHA )
5647
               E( I ) = DBLE( ALPHA )
5592
               A( I+1, I ) = ONE
-
 
5593
*
5648
*
5594
*              Apply H(i)**H to A(i+1:m,i+1:n) from the left
5649
*              Apply H(i)**H to A(i+1:m,i+1:n) from the left
5595
*
5650
*
5596
               CALL ZLARF( 'Left', M-I, N-I, A( I+1, I ), 1,
5651
               CALL ZLARF1F( 'Left', M-I, N-I, A( I+1, I ), 1,
5597
     $                     DCONJG( TAUQ( I ) ), A( I+1, I+1 ), LDA,
5652
     $                     DCONJG( TAUQ( I ) ), A( I+1, I+1 ), LDA,
5598
     $                     WORK )
5653
     $                     WORK )
5599
               A( I+1, I ) = E( I )
5654
               A( I+1, I ) = E( I )
5600
            ELSE
5655
            ELSE
5601
               TAUQ( I ) = ZERO
5656
               TAUQ( I ) = ZERO
Line 5729... Line 5784...
5729
*> \endverbatim
5784
*> \endverbatim
5730
*>
5785
*>
5731
*> \param[in] LWORK
5786
*> \param[in] LWORK
5732
*> \verbatim
5787
*> \verbatim
5733
*>          LWORK is INTEGER
5788
*>          LWORK is INTEGER
5734
*>          The length of the array WORK.  LWORK >= max(1,M,N).
5789
*>          The length of the array WORK.
-
 
5790
*>          LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(M,N), otherwise.
5735
*>          For optimum performance LWORK >= (M+N)*NB, where NB
5791
*>          For optimum performance LWORK >= (M+N)*NB, where NB
5736
*>          is the optimal blocksize.
5792
*>          is the optimal blocksize.
5737
*>
5793
*>
5738
*>          If LWORK = -1, then a workspace query is assumed; the routine
5794
*>          If LWORK = -1, then a workspace query is assumed; the routine
5739
*>          only calculates the optimal size of the WORK array, returns
5795
*>          only calculates the optimal size of the WORK array, returns
Line 5830... Line 5886...
5830
      COMPLEX*16         ONE
5886
      COMPLEX*16         ONE
5831
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
5887
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
5832
*     ..
5888
*     ..
5833
*     .. Local Scalars ..
5889
*     .. Local Scalars ..
5834
      LOGICAL            LQUERY
5890
      LOGICAL            LQUERY
5835
      INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB,
5891
      INTEGER            I, IINFO, J, LDWRKX, LDWRKY, LWKMIN, LWKOPT,
5836
     $                   NBMIN, NX, WS
5892
     $                   MINMN, NB, NBMIN, NX, WS
5837
*     ..
5893
*     ..
5838
*     .. External Subroutines ..
5894
*     .. External Subroutines ..
5839
      EXTERNAL           XERBLA, ZGEBD2, ZGEMM, ZLABRD
5895
      EXTERNAL           XERBLA, ZGEBD2, ZGEMM, ZLABRD
5840
*     ..
5896
*     ..
5841
*     .. Intrinsic Functions ..
5897
*     .. Intrinsic Functions ..
Line 5848... Line 5904...
5848
*     .. Executable Statements ..
5904
*     .. Executable Statements ..
5849
*
5905
*
5850
*     Test the input parameters
5906
*     Test the input parameters
5851
*
5907
*
5852
      INFO = 0
5908
      INFO = 0
-
 
5909
      MINMN = MIN( M, N )
-
 
5910
      IF( MINMN.EQ.0 ) THEN
-
 
5911
         LWKMIN = 1
-
 
5912
         LWKOPT = 1
-
 
5913
      ELSE
-
 
5914
         LWKMIN = MAX( M, N )
5853
      NB = MAX( 1, ILAENV( 1, 'ZGEBRD', ' ', M, N, -1, -1 ) )
5915
         NB = MAX( 1, ILAENV( 1, 'ZGEBRD', ' ', M, N, -1, -1 ) )
5854
      LWKOPT = ( M+N )*NB
5916
         LWKOPT = ( M+N )*NB
-
 
5917
      END IF
5855
      WORK( 1 ) = DBLE( LWKOPT )
5918
      WORK( 1 ) = DBLE( LWKOPT )
-
 
5919
*
5856
      LQUERY = ( LWORK.EQ.-1 )
5920
      LQUERY = ( LWORK.EQ.-1 )
5857
      IF( M.LT.0 ) THEN
5921
      IF( M.LT.0 ) THEN
5858
         INFO = -1
5922
         INFO = -1
5859
      ELSE IF( N.LT.0 ) THEN
5923
      ELSE IF( N.LT.0 ) THEN
5860
         INFO = -2
5924
         INFO = -2
5861
      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
5925
      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
5862
         INFO = -4
5926
         INFO = -4
5863
      ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN
5927
      ELSE IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN
5864
         INFO = -10
5928
         INFO = -10
5865
      END IF
5929
      END IF
5866
      IF( INFO.LT.0 ) THEN
5930
      IF( INFO.LT.0 ) THEN
5867
         CALL XERBLA( 'ZGEBRD', -INFO )
5931
         CALL XERBLA( 'ZGEBRD', -INFO )
5868
         RETURN
5932
         RETURN
Line 5870... Line 5934...
5870
         RETURN
5934
         RETURN
5871
      END IF
5935
      END IF
5872
*
5936
*
5873
*     Quick return if possible
5937
*     Quick return if possible
5874
*
5938
*
5875
      MINMN = MIN( M, N )
-
 
5876
      IF( MINMN.EQ.0 ) THEN
5939
      IF( MINMN.EQ.0 ) THEN
5877
         WORK( 1 ) = 1
5940
         WORK( 1 ) = 1
5878
         RETURN
5941
         RETURN
5879
      END IF
5942
      END IF
5880
*
5943
*
Line 5889... Line 5952...
5889
         NX = MAX( NB, ILAENV( 3, 'ZGEBRD', ' ', M, N, -1, -1 ) )
5952
         NX = MAX( NB, ILAENV( 3, 'ZGEBRD', ' ', M, N, -1, -1 ) )
5890
*
5953
*
5891
*        Determine when to switch from blocked to unblocked code.
5954
*        Determine when to switch from blocked to unblocked code.
5892
*
5955
*
5893
         IF( NX.LT.MINMN ) THEN
5956
         IF( NX.LT.MINMN ) THEN
5894
            WS = ( M+N )*NB
5957
            WS = LWKOPT
5895
            IF( LWORK.LT.WS ) THEN
5958
            IF( LWORK.LT.WS ) THEN
5896
*
5959
*
5897
*              Not enough work space for the optimal NB, consider using
5960
*              Not enough work space for the optimal NB, consider using
5898
*              a smaller block size.
5961
*              a smaller block size.
5899
*
5962
*
Line 5914... Line 5977...
5914
*
5977
*
5915
*        Reduce rows and columns i:i+ib-1 to bidiagonal form and return
5978
*        Reduce rows and columns i:i+ib-1 to bidiagonal form and return
5916
*        the matrices X and Y which are needed to update the unreduced
5979
*        the matrices X and Y which are needed to update the unreduced
5917
*        part of the matrix
5980
*        part of the matrix
5918
*
5981
*
5919
         CALL ZLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ), E( I ),
5982
         CALL ZLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ),
-
 
5983
     $                E( I ),
5920
     $                TAUQ( I ), TAUP( I ), WORK, LDWRKX,
5984
     $                TAUQ( I ), TAUP( I ), WORK, LDWRKX,
5921
     $                WORK( LDWRKX*NB+1 ), LDWRKY )
5985
     $                WORK( LDWRKX*NB+1 ), LDWRKY )
5922
*
5986
*
5923
*        Update the trailing submatrix A(i+ib:m,i+ib:n), using
5987
*        Update the trailing submatrix A(i+ib:m,i+ib:n), using
5924
*        an update of the form  A := A - V*Y**H - X*U**H
5988
*        an update of the form  A := A - V*Y**H - X*U**H
5925
*
5989
*
5926
         CALL ZGEMM( 'No transpose', 'Conjugate transpose', M-I-NB+1,
5990
         CALL ZGEMM( 'No transpose', 'Conjugate transpose', M-I-NB+1,
5927
     $               N-I-NB+1, NB, -ONE, A( I+NB, I ), LDA,
5991
     $               N-I-NB+1, NB, -ONE, A( I+NB, I ), LDA,
5928
     $               WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE,
5992
     $               WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE,
5929
     $               A( I+NB, I+NB ), LDA )
5993
     $               A( I+NB, I+NB ), LDA )
5930
         CALL ZGEMM( 'No transpose', 'No transpose', M-I-NB+1, N-I-NB+1,
5994
         CALL ZGEMM( 'No transpose', 'No transpose', M-I-NB+1,
-
 
5995
     $               N-I-NB+1,
5931
     $               NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA,
5996
     $               NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA,
5932
     $               ONE, A( I+NB, I+NB ), LDA )
5997
     $               ONE, A( I+NB, I+NB ), LDA )
5933
*
5998
*
5934
*        Copy diagonal and off-diagonal elements of B back into A
5999
*        Copy diagonal and off-diagonal elements of B back into A
5935
*
6000
*
Line 6192... Line 6257...
6192
      IF( KASE.NE.0 ) THEN
6257
      IF( KASE.NE.0 ) THEN
6193
         IF( KASE.EQ.KASE1 ) THEN
6258
         IF( KASE.EQ.KASE1 ) THEN
6194
*
6259
*
6195
*           Multiply by inv(L).
6260
*           Multiply by inv(L).
6196
*
6261
*
6197
            CALL ZLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N, A,
6262
            CALL ZLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N,
-
 
6263
     $                   A,
6198
     $                   LDA, WORK, SL, RWORK, INFO )
6264
     $                   LDA, WORK, SL, RWORK, INFO )
6199
*
6265
*
6200
*           Multiply by inv(U).
6266
*           Multiply by inv(U).
6201
*
6267
*
6202
            CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
6268
            CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN,
-
 
6269
     $                   N,
6203
     $                   A, LDA, WORK, SU, RWORK( N+1 ), INFO )
6270
     $                   A, LDA, WORK, SU, RWORK( N+1 ), INFO )
6204
         ELSE
6271
         ELSE
6205
*
6272
*
6206
*           Multiply by inv(U**H).
6273
*           Multiply by inv(U**H).
6207
*
6274
*
Line 6209... Line 6276...
6209
     $                   NORMIN, N, A, LDA, WORK, SU, RWORK( N+1 ),
6276
     $                   NORMIN, N, A, LDA, WORK, SU, RWORK( N+1 ),
6210
     $                   INFO )
6277
     $                   INFO )
6211
*
6278
*
6212
*           Multiply by inv(L**H).
6279
*           Multiply by inv(L**H).
6213
*
6280
*
6214
            CALL ZLATRS( 'Lower', 'Conjugate transpose', 'Unit', NORMIN,
6281
            CALL ZLATRS( 'Lower', 'Conjugate transpose', 'Unit',
-
 
6282
     $                   NORMIN,
6215
     $                   N, A, LDA, WORK, SL, RWORK, INFO )
6283
     $                   N, A, LDA, WORK, SL, RWORK, INFO )
6216
         END IF
6284
         END IF
6217
*
6285
*
6218
*        Divide X by 1/(SL*SU) if doing so will not cause overflow.
6286
*        Divide X by 1/(SL*SU) if doing so will not cause overflow.
6219
*
6287
*
Line 6787... Line 6855...
6787
*     ..
6855
*     ..
6788
*     .. Local Arrays ..
6856
*     .. Local Arrays ..
6789
      DOUBLE PRECISION   DUM( 1 )
6857
      DOUBLE PRECISION   DUM( 1 )
6790
*     ..
6858
*     ..
6791
*     .. External Subroutines ..
6859
*     .. External Subroutines ..
6792
      EXTERNAL           XERBLA, ZCOPY, ZGEBAK, ZGEBAL, ZGEHRD,
6860
      EXTERNAL           XERBLA, ZCOPY, ZGEBAK, ZGEBAL,
-
 
6861
     $                   ZGEHRD,
6793
     $                   ZHSEQR, ZLACPY, ZLASCL, ZTRSEN, ZUNGHR
6862
     $                   ZHSEQR, ZLACPY, ZLASCL, ZTRSEN, ZUNGHR
6794
*     ..
6863
*     ..
6795
*     .. External Functions ..
6864
*     .. External Functions ..
6796
      LOGICAL            LSAME
6865
      LOGICAL            LSAME
6797
      INTEGER            ILAENV
6866
      INTEGER            ILAENV
Line 6809... Line 6878...
6809
      LQUERY = ( LWORK.EQ.-1 )
6878
      LQUERY = ( LWORK.EQ.-1 )
6810
      WANTVS = LSAME( JOBVS, 'V' )
6879
      WANTVS = LSAME( JOBVS, 'V' )
6811
      WANTST = LSAME( SORT, 'S' )
6880
      WANTST = LSAME( SORT, 'S' )
6812
      IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
6881
      IF( ( .NOT.WANTVS ) .AND. ( .NOT.LSAME( JOBVS, 'N' ) ) ) THEN
6813
         INFO = -1
6882
         INFO = -1
-
 
6883
      ELSE IF( ( .NOT.WANTST ) .AND.
6814
      ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
6884
     $         ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
6815
         INFO = -2
6885
         INFO = -2
6816
      ELSE IF( N.LT.0 ) THEN
6886
      ELSE IF( N.LT.0 ) THEN
6817
         INFO = -4
6887
         INFO = -4
6818
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
6888
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
6819
         INFO = -6
6889
         INFO = -6
Line 6845... Line 6915...
6845
            HSWORK = INT( WORK( 1 ) )
6915
            HSWORK = INT( WORK( 1 ) )
6846
*
6916
*
6847
            IF( .NOT.WANTVS ) THEN
6917
            IF( .NOT.WANTVS ) THEN
6848
               MAXWRK = MAX( MAXWRK, HSWORK )
6918
               MAXWRK = MAX( MAXWRK, HSWORK )
6849
            ELSE
6919
            ELSE
6850
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
6920
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1,
-
 
6921
     $                       'ZUNGHR',
6851
     $                       ' ', N, 1, N, -1 ) )
6922
     $                       ' ', N, 1, N, -1 ) )
6852
               MAXWRK = MAX( MAXWRK, HSWORK )
6923
               MAXWRK = MAX( MAXWRK, HSWORK )
6853
            END IF
6924
            END IF
6854
         END IF
6925
         END IF
6855
         WORK( 1 ) = MAXWRK
6926
         WORK( 1 ) = MAXWRK
Line 6919... Line 6990...
6919
*
6990
*
6920
*        Generate unitary matrix in VS
6991
*        Generate unitary matrix in VS
6921
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
6992
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
6922
*        (RWorkspace: none)
6993
*        (RWorkspace: none)
6923
*
6994
*
6924
         CALL ZUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
6995
         CALL ZUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ),
-
 
6996
     $                WORK( IWRK ),
6925
     $                LWORK-IWRK+1, IERR )
6997
     $                LWORK-IWRK+1, IERR )
6926
      END IF
6998
      END IF
6927
*
6999
*
6928
      SDIM = 0
7000
      SDIM = 0
6929
*
7001
*
Line 6948... Line 7020...
6948
*
7020
*
6949
*        Reorder eigenvalues and transform Schur vectors
7021
*        Reorder eigenvalues and transform Schur vectors
6950
*        (CWorkspace: none)
7022
*        (CWorkspace: none)
6951
*        (RWorkspace: none)
7023
*        (RWorkspace: none)
6952
*
7024
*
6953
         CALL ZTRSEN( 'N', JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
7025
         CALL ZTRSEN( 'N', JOBVS, BWORK, N, A, LDA, VS, LDVS, W,
-
 
7026
     $                SDIM,
6954
     $                S, SEP, WORK( IWRK ), LWORK-IWRK+1, ICOND )
7027
     $                S, SEP, WORK( IWRK ), LWORK-IWRK+1, ICOND )
6955
      END IF
7028
      END IF
6956
*
7029
*
6957
      IF( WANTVS ) THEN
7030
      IF( WANTVS ) THEN
6958
*
7031
*
6959
*        Undo balancing
7032
*        Undo balancing
6960
*        (CWorkspace: none)
7033
*        (CWorkspace: none)
6961
*        (RWorkspace: need N)
7034
*        (RWorkspace: need N)
6962
*
7035
*
6963
         CALL ZGEBAK( 'P', 'R', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
7036
         CALL ZGEBAK( 'P', 'R', N, ILO, IHI, RWORK( IBAL ), N, VS,
-
 
7037
     $                LDVS,
6964
     $                IERR )
7038
     $                IERR )
6965
      END IF
7039
      END IF
6966
*
7040
*
6967
      IF( SCALEA ) THEN
7041
      IF( SCALEA ) THEN
6968
*
7042
*
Line 7153... Line 7227...
7153
*  @precisions fortran z -> c
7227
*  @precisions fortran z -> c
7154
*
7228
*
7155
*> \ingroup geev
7229
*> \ingroup geev
7156
*
7230
*
7157
*  =====================================================================
7231
*  =====================================================================
7158
      SUBROUTINE ZGEEV( JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR,
7232
      SUBROUTINE ZGEEV( JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR,
-
 
7233
     $                  LDVR,
7159
     $                  WORK, LWORK, RWORK, INFO )
7234
     $                  WORK, LWORK, RWORK, INFO )
7160
      implicit none
7235
      implicit none
7161
*
7236
*
7162
*  -- LAPACK driver routine --
7237
*  -- LAPACK driver routine --
7163
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
7238
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 7190... Line 7265...
7190
*     .. Local Arrays ..
7265
*     .. Local Arrays ..
7191
      LOGICAL            SELECT( 1 )
7266
      LOGICAL            SELECT( 1 )
7192
      DOUBLE PRECISION   DUM( 1 )
7267
      DOUBLE PRECISION   DUM( 1 )
7193
*     ..
7268
*     ..
7194
*     .. External Subroutines ..
7269
*     .. External Subroutines ..
7195
      EXTERNAL           XERBLA, ZDSCAL, ZGEBAK, ZGEBAL, ZGEHRD, ZHSEQR,
7270
      EXTERNAL           XERBLA, ZDSCAL, ZGEBAK, ZGEBAL, ZGEHRD,
-
 
7271
     $                   ZHSEQR,
7196
     $                   ZLACPY, ZLASCL, ZSCAL, ZTREVC3, ZUNGHR
7272
     $                   ZLACPY, ZLASCL, ZSCAL, ZTREVC3, ZUNGHR
7197
*     ..
7273
*     ..
7198
*     .. External Functions ..
7274
*     .. External Functions ..
7199
      LOGICAL            LSAME
7275
      LOGICAL            LSAME
7200
      INTEGER            IDAMAX, ILAENV
7276
      INTEGER            IDAMAX, ILAENV
7201
      DOUBLE PRECISION   DLAMCH, DZNRM2, ZLANGE
7277
      DOUBLE PRECISION   DLAMCH, DZNRM2, ZLANGE
7202
      EXTERNAL           LSAME, IDAMAX, ILAENV, DLAMCH, DZNRM2, ZLANGE
7278
      EXTERNAL           LSAME, IDAMAX, ILAENV, DLAMCH, DZNRM2,
-
 
7279
     $                   ZLANGE
7203
*     ..
7280
*     ..
7204
*     .. Intrinsic Functions ..
7281
*     .. Intrinsic Functions ..
7205
      INTRINSIC          DBLE, DCMPLX, CONJG, AIMAG, MAX, SQRT
7282
      INTRINSIC          DBLE, DCMPLX, CONJG, AIMAG, MAX, SQRT
7206
*     ..
7283
*     ..
7207
*     .. Executable Statements ..
7284
*     .. Executable Statements ..
Line 7212... Line 7289...
7212
      LQUERY = ( LWORK.EQ.-1 )
7289
      LQUERY = ( LWORK.EQ.-1 )
7213
      WANTVL = LSAME( JOBVL, 'V' )
7290
      WANTVL = LSAME( JOBVL, 'V' )
7214
      WANTVR = LSAME( JOBVR, 'V' )
7291
      WANTVR = LSAME( JOBVR, 'V' )
7215
      IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
7292
      IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
7216
         INFO = -1
7293
         INFO = -1
-
 
7294
      ELSE IF( ( .NOT.WANTVR ) .AND.
7217
      ELSE IF( ( .NOT.WANTVR ) .AND. ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
7295
     $         ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
7218
         INFO = -2
7296
         INFO = -2
7219
      ELSE IF( N.LT.0 ) THEN
7297
      ELSE IF( N.LT.0 ) THEN
7220
         INFO = -3
7298
         INFO = -3
7221
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
7299
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
7222
         INFO = -5
7300
         INFO = -5
Line 7243... Line 7321...
7243
            MAXWRK = 1
7321
            MAXWRK = 1
7244
         ELSE
7322
         ELSE
7245
            MAXWRK = N + N*ILAENV( 1, 'ZGEHRD', ' ', N, 1, N, 0 )
7323
            MAXWRK = N + N*ILAENV( 1, 'ZGEHRD', ' ', N, 1, N, 0 )
7246
            MINWRK = 2*N
7324
            MINWRK = 2*N
7247
            IF( WANTVL ) THEN
7325
            IF( WANTVL ) THEN
7248
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
7326
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1,
-
 
7327
     $                       'ZUNGHR',
7249
     $                       ' ', N, 1, N, -1 ) )
7328
     $                       ' ', N, 1, N, -1 ) )
7250
               CALL ZTREVC3( 'L', 'B', SELECT, N, A, LDA,
7329
               CALL ZTREVC3( 'L', 'B', SELECT, N, A, LDA,
7251
     $                       VL, LDVL, VR, LDVR,
7330
     $                       VL, LDVL, VR, LDVR,
7252
     $                       N, NOUT, WORK, -1, RWORK, -1, IERR )
7331
     $                       N, NOUT, WORK, -1, RWORK, -1, IERR )
7253
               LWORK_TREVC = INT( WORK(1) )
7332
               LWORK_TREVC = INT( WORK(1) )
7254
               MAXWRK = MAX( MAXWRK, N + LWORK_TREVC )
7333
               MAXWRK = MAX( MAXWRK, N + LWORK_TREVC )
7255
               CALL ZHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VL, LDVL,
7334
               CALL ZHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VL, LDVL,
7256
     $                      WORK, -1, INFO )
7335
     $                      WORK, -1, INFO )
7257
            ELSE IF( WANTVR ) THEN
7336
            ELSE IF( WANTVR ) THEN
7258
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
7337
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1,
-
 
7338
     $                       'ZUNGHR',
7259
     $                       ' ', N, 1, N, -1 ) )
7339
     $                       ' ', N, 1, N, -1 ) )
7260
               CALL ZTREVC3( 'R', 'B', SELECT, N, A, LDA,
7340
               CALL ZTREVC3( 'R', 'B', SELECT, N, A, LDA,
7261
     $                       VL, LDVL, VR, LDVR,
7341
     $                       VL, LDVL, VR, LDVR,
7262
     $                       N, NOUT, WORK, -1, RWORK, -1, IERR )
7342
     $                       N, NOUT, WORK, -1, RWORK, -1, IERR )
7263
               LWORK_TREVC = INT( WORK(1) )
7343
               LWORK_TREVC = INT( WORK(1) )
Line 7338... Line 7418...
7338
*
7418
*
7339
*        Generate unitary matrix in VL
7419
*        Generate unitary matrix in VL
7340
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
7420
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
7341
*        (RWorkspace: none)
7421
*        (RWorkspace: none)
7342
*
7422
*
7343
         CALL ZUNGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
7423
         CALL ZUNGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ),
-
 
7424
     $                WORK( IWRK ),
7344
     $                LWORK-IWRK+1, IERR )
7425
     $                LWORK-IWRK+1, IERR )
7345
*
7426
*
7346
*        Perform QR iteration, accumulating Schur vectors in VL
7427
*        Perform QR iteration, accumulating Schur vectors in VL
7347
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
7428
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
7348
*        (RWorkspace: none)
7429
*        (RWorkspace: none)
Line 7370... Line 7451...
7370
*
7451
*
7371
*        Generate unitary matrix in VR
7452
*        Generate unitary matrix in VR
7372
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
7453
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
7373
*        (RWorkspace: none)
7454
*        (RWorkspace: none)
7374
*
7455
*
7375
         CALL ZUNGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
7456
         CALL ZUNGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ),
-
 
7457
     $                WORK( IWRK ),
7376
     $                LWORK-IWRK+1, IERR )
7458
     $                LWORK-IWRK+1, IERR )
7377
*
7459
*
7378
*        Perform QR iteration, accumulating Schur vectors in VR
7460
*        Perform QR iteration, accumulating Schur vectors in VR
7379
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
7461
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
7380
*        (RWorkspace: none)
7462
*        (RWorkspace: none)
Line 7404... Line 7486...
7404
*        Compute left and/or right eigenvectors
7486
*        Compute left and/or right eigenvectors
7405
*        (CWorkspace: need 2*N, prefer N + 2*N*NB)
7487
*        (CWorkspace: need 2*N, prefer N + 2*N*NB)
7406
*        (RWorkspace: need 2*N)
7488
*        (RWorkspace: need 2*N)
7407
*
7489
*
7408
         IRWORK = IBAL + N
7490
         IRWORK = IBAL + N
7409
         CALL ZTREVC3( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
7491
         CALL ZTREVC3( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR,
-
 
7492
     $                 LDVR,
7410
     $                 N, NOUT, WORK( IWRK ), LWORK-IWRK+1,
7493
     $                 N, NOUT, WORK( IWRK ), LWORK-IWRK+1,
7411
     $                 RWORK( IRWORK ), N, IERR )
7494
     $                 RWORK( IRWORK ), N, IERR )
7412
      END IF
7495
      END IF
7413
*
7496
*
7414
      IF( WANTVL ) THEN
7497
      IF( WANTVL ) THEN
7415
*
7498
*
7416
*        Undo balancing of left eigenvectors
7499
*        Undo balancing of left eigenvectors
7417
*        (CWorkspace: none)
7500
*        (CWorkspace: none)
7418
*        (RWorkspace: need N)
7501
*        (RWorkspace: need N)
7419
*
7502
*
7420
         CALL ZGEBAK( 'B', 'L', N, ILO, IHI, RWORK( IBAL ), N, VL, LDVL,
7503
         CALL ZGEBAK( 'B', 'L', N, ILO, IHI, RWORK( IBAL ), N, VL,
-
 
7504
     $                LDVL,
7421
     $                IERR )
7505
     $                IERR )
7422
*
7506
*
7423
*        Normalize left eigenvectors and make largest component real
7507
*        Normalize left eigenvectors and make largest component real
7424
*
7508
*
7425
         DO 20 I = 1, N
7509
         DO 20 I = 1, N
Line 7440... Line 7524...
7440
*
7524
*
7441
*        Undo balancing of right eigenvectors
7525
*        Undo balancing of right eigenvectors
7442
*        (CWorkspace: none)
7526
*        (CWorkspace: none)
7443
*        (RWorkspace: need N)
7527
*        (RWorkspace: need N)
7444
*
7528
*
7445
         CALL ZGEBAK( 'B', 'R', N, ILO, IHI, RWORK( IBAL ), N, VR, LDVR,
7529
         CALL ZGEBAK( 'B', 'R', N, ILO, IHI, RWORK( IBAL ), N, VR,
-
 
7530
     $                LDVR,
7446
     $                IERR )
7531
     $                IERR )
7447
*
7532
*
7448
*        Normalize right eigenvectors and make largest component real
7533
*        Normalize right eigenvectors and make largest component real
7449
*
7534
*
7450
         DO 40 I = 1, N
7535
         DO 40 I = 1, N
Line 7463... Line 7548...
7463
*
7548
*
7464
*     Undo scaling if necessary
7549
*     Undo scaling if necessary
7465
*
7550
*
7466
   50 CONTINUE
7551
   50 CONTINUE
7467
      IF( SCALEA ) THEN
7552
      IF( SCALEA ) THEN
7468
         CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, W( INFO+1 ),
7553
         CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1,
-
 
7554
     $                W( INFO+1 ),
7469
     $                MAX( N-INFO, 1 ), IERR )
7555
     $                MAX( N-INFO, 1 ), IERR )
7470
         IF( INFO.GT.0 ) THEN
7556
         IF( INFO.GT.0 ) THEN
7471
            CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, W, N, IERR )
7557
            CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, W, N,
-
 
7558
     $                   IERR )
7472
         END IF
7559
         END IF
7473
      END IF
7560
      END IF
7474
*
7561
*
7475
      WORK( 1 ) = MAXWRK
7562
      WORK( 1 ) = MAXWRK
7476
      RETURN
7563
      RETURN
Line 7760... Line 7847...
7760
*  @precisions fortran z -> c
7847
*  @precisions fortran z -> c
7761
*
7848
*
7762
*> \ingroup geevx
7849
*> \ingroup geevx
7763
*
7850
*
7764
*  =====================================================================
7851
*  =====================================================================
7765
      SUBROUTINE ZGEEVX( BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, W, VL,
7852
      SUBROUTINE ZGEEVX( BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, W,
-
 
7853
     $                   VL,
7766
     $                   LDVL, VR, LDVR, ILO, IHI, SCALE, ABNRM, RCONDE,
7854
     $                   LDVL, VR, LDVR, ILO, IHI, SCALE, ABNRM, RCONDE,
7767
     $                   RCONDV, WORK, LWORK, RWORK, INFO )
7855
     $                   RCONDV, WORK, LWORK, RWORK, INFO )
7768
      implicit none
7856
      implicit none
7769
*
7857
*
7770
*  -- LAPACK driver routine --
7858
*  -- LAPACK driver routine --
Line 7801... Line 7889...
7801
*     .. Local Arrays ..
7889
*     .. Local Arrays ..
7802
      LOGICAL            SELECT( 1 )
7890
      LOGICAL            SELECT( 1 )
7803
      DOUBLE PRECISION   DUM( 1 )
7891
      DOUBLE PRECISION   DUM( 1 )
7804
*     ..
7892
*     ..
7805
*     .. External Subroutines ..
7893
*     .. External Subroutines ..
7806
      EXTERNAL           DLASCL, XERBLA, ZDSCAL, ZGEBAK, ZGEBAL, ZGEHRD,
7894
      EXTERNAL           DLASCL, XERBLA, ZDSCAL, ZGEBAK, ZGEBAL,
-
 
7895
     $                   ZGEHRD,
7807
     $                   ZHSEQR, ZLACPY, ZLASCL, ZSCAL, ZTREVC3, ZTRSNA,
7896
     $                   ZHSEQR, ZLACPY, ZLASCL, ZSCAL, ZTREVC3, ZTRSNA,
7808
     $                   ZUNGHR
7897
     $                   ZUNGHR
7809
*     ..
7898
*     ..
7810
*     .. External Functions ..
7899
*     .. External Functions ..
7811
      LOGICAL            LSAME
7900
      LOGICAL            LSAME
7812
      INTEGER            IDAMAX, ILAENV
7901
      INTEGER            IDAMAX, ILAENV
7813
      DOUBLE PRECISION   DLAMCH, DZNRM2, ZLANGE
7902
      DOUBLE PRECISION   DLAMCH, DZNRM2, ZLANGE
7814
      EXTERNAL           LSAME, IDAMAX, ILAENV, DLAMCH, DZNRM2, ZLANGE
7903
      EXTERNAL           LSAME, IDAMAX, ILAENV, DLAMCH, DZNRM2,
-
 
7904
     $                   ZLANGE
7815
*     ..
7905
*     ..
7816
*     .. Intrinsic Functions ..
7906
*     .. Intrinsic Functions ..
7817
      INTRINSIC          DBLE, DCMPLX, CONJG, AIMAG, MAX, SQRT
7907
      INTRINSIC          DBLE, DCMPLX, CONJG, AIMAG, MAX, SQRT
7818
*     ..
7908
*     ..
7819
*     .. Executable Statements ..
7909
*     .. Executable Statements ..
Line 7826... Line 7916...
7826
      WANTVR = LSAME( JOBVR, 'V' )
7916
      WANTVR = LSAME( JOBVR, 'V' )
7827
      WNTSNN = LSAME( SENSE, 'N' )
7917
      WNTSNN = LSAME( SENSE, 'N' )
7828
      WNTSNE = LSAME( SENSE, 'E' )
7918
      WNTSNE = LSAME( SENSE, 'E' )
7829
      WNTSNV = LSAME( SENSE, 'V' )
7919
      WNTSNV = LSAME( SENSE, 'V' )
7830
      WNTSNB = LSAME( SENSE, 'B' )
7920
      WNTSNB = LSAME( SENSE, 'B' )
7831
      IF( .NOT.( LSAME( BALANC, 'N' ) .OR. LSAME( BALANC, 'S' ) .OR.
7921
      IF( .NOT.( LSAME( BALANC, 'N' ) .OR.
-
 
7922
     $    LSAME( BALANC, 'S' ) .OR.
7832
     $    LSAME( BALANC, 'P' ) .OR. LSAME( BALANC, 'B' ) ) ) THEN
7923
     $    LSAME( BALANC, 'P' ) .OR. LSAME( BALANC, 'B' ) ) ) THEN
7833
         INFO = -1
7924
         INFO = -1
-
 
7925
      ELSE IF( ( .NOT.WANTVL ) .AND.
7834
      ELSE IF( ( .NOT.WANTVL ) .AND. ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
7926
     $         ( .NOT.LSAME( JOBVL, 'N' ) ) ) THEN
7835
         INFO = -2
7927
         INFO = -2
-
 
7928
      ELSE IF( ( .NOT.WANTVR ) .AND.
7836
      ELSE IF( ( .NOT.WANTVR ) .AND. ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
7929
     $         ( .NOT.LSAME( JOBVR, 'N' ) ) ) THEN
7837
         INFO = -3
7930
         INFO = -3
7838
      ELSE IF( .NOT.( WNTSNN .OR. WNTSNE .OR. WNTSNB .OR. WNTSNV ) .OR.
7931
      ELSE IF( .NOT.( WNTSNN .OR. WNTSNE .OR. WNTSNB .OR. WNTSNV ) .OR.
7839
     $         ( ( WNTSNE .OR. WNTSNB ) .AND. .NOT.( WANTVL .AND.
7932
     $         ( ( WNTSNE .OR. WNTSNB ) .AND. .NOT.( WANTVL .AND.
7840
     $         WANTVR ) ) ) THEN
7933
     $         WANTVR ) ) ) THEN
7841
         INFO = -4
7934
         INFO = -4
Line 7883... Line 7976...
7883
               MAXWRK = MAX( MAXWRK, LWORK_TREVC )
7976
               MAXWRK = MAX( MAXWRK, LWORK_TREVC )
7884
               CALL ZHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VR, LDVR,
7977
               CALL ZHSEQR( 'S', 'V', N, 1, N, A, LDA, W, VR, LDVR,
7885
     $                WORK, -1, INFO )
7978
     $                WORK, -1, INFO )
7886
            ELSE
7979
            ELSE
7887
               IF( WNTSNN ) THEN
7980
               IF( WNTSNN ) THEN
7888
                  CALL ZHSEQR( 'E', 'N', N, 1, N, A, LDA, W, VR, LDVR,
7981
                  CALL ZHSEQR( 'E', 'N', N, 1, N, A, LDA, W, VR,
-
 
7982
     $                         LDVR,
7889
     $                WORK, -1, INFO )
7983
     $                WORK, -1, INFO )
7890
               ELSE
7984
               ELSE
7891
                  CALL ZHSEQR( 'S', 'N', N, 1, N, A, LDA, W, VR, LDVR,
7985
                  CALL ZHSEQR( 'S', 'N', N, 1, N, A, LDA, W, VR,
-
 
7986
     $                         LDVR,
7892
     $                WORK, -1, INFO )
7987
     $                WORK, -1, INFO )
7893
               END IF
7988
               END IF
7894
            END IF
7989
            END IF
7895
            HSWORK = INT( WORK(1) )
7990
            HSWORK = INT( WORK(1) )
7896
*
7991
*
Line 7904... Line 7999...
7904
            ELSE
7999
            ELSE
7905
               MINWRK = 2*N
8000
               MINWRK = 2*N
7906
               IF( .NOT.( WNTSNN .OR. WNTSNE ) )
8001
               IF( .NOT.( WNTSNN .OR. WNTSNE ) )
7907
     $            MINWRK = MAX( MINWRK, N*N + 2*N )
8002
     $            MINWRK = MAX( MINWRK, N*N + 2*N )
7908
               MAXWRK = MAX( MAXWRK, HSWORK )
8003
               MAXWRK = MAX( MAXWRK, HSWORK )
7909
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1, 'ZUNGHR',
8004
               MAXWRK = MAX( MAXWRK, N + ( N - 1 )*ILAENV( 1,
-
 
8005
     $                       'ZUNGHR',
7910
     $                       ' ', N, 1, N, -1 ) )
8006
     $                       ' ', N, 1, N, -1 ) )
7911
               IF( .NOT.( WNTSNN .OR. WNTSNE ) )
8007
               IF( .NOT.( WNTSNN .OR. WNTSNE ) )
7912
     $            MAXWRK = MAX( MAXWRK, N*N + 2*N )
8008
     $            MAXWRK = MAX( MAXWRK, N*N + 2*N )
7913
               MAXWRK = MAX( MAXWRK, 2*N )
8009
               MAXWRK = MAX( MAXWRK, 2*N )
7914
            END IF
8010
            END IF
Line 7985... Line 8081...
7985
*
8081
*
7986
*        Generate unitary matrix in VL
8082
*        Generate unitary matrix in VL
7987
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
8083
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
7988
*        (RWorkspace: none)
8084
*        (RWorkspace: none)
7989
*
8085
*
7990
         CALL ZUNGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
8086
         CALL ZUNGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ),
-
 
8087
     $                WORK( IWRK ),
7991
     $                LWORK-IWRK+1, IERR )
8088
     $                LWORK-IWRK+1, IERR )
7992
*
8089
*
7993
*        Perform QR iteration, accumulating Schur vectors in VL
8090
*        Perform QR iteration, accumulating Schur vectors in VL
7994
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
8091
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
7995
*        (RWorkspace: none)
8092
*        (RWorkspace: none)
Line 8017... Line 8114...
8017
*
8114
*
8018
*        Generate unitary matrix in VR
8115
*        Generate unitary matrix in VR
8019
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
8116
*        (CWorkspace: need 2*N-1, prefer N+(N-1)*NB)
8020
*        (RWorkspace: none)
8117
*        (RWorkspace: none)
8021
*
8118
*
8022
         CALL ZUNGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
8119
         CALL ZUNGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ),
-
 
8120
     $                WORK( IWRK ),
8023
     $                LWORK-IWRK+1, IERR )
8121
     $                LWORK-IWRK+1, IERR )
8024
*
8122
*
8025
*        Perform QR iteration, accumulating Schur vectors in VR
8123
*        Perform QR iteration, accumulating Schur vectors in VR
8026
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
8124
*        (CWorkspace: need 1, prefer HSWORK (see comments) )
8027
*        (RWorkspace: none)
8125
*        (RWorkspace: none)
Line 8058... Line 8156...
8058
*
8156
*
8059
*        Compute left and/or right eigenvectors
8157
*        Compute left and/or right eigenvectors
8060
*        (CWorkspace: need 2*N, prefer N + 2*N*NB)
8158
*        (CWorkspace: need 2*N, prefer N + 2*N*NB)
8061
*        (RWorkspace: need N)
8159
*        (RWorkspace: need N)
8062
*
8160
*
8063
         CALL ZTREVC3( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
8161
         CALL ZTREVC3( SIDE, 'B', SELECT, N, A, LDA, VL, LDVL, VR,
-
 
8162
     $                 LDVR,
8064
     $                 N, NOUT, WORK( IWRK ), LWORK-IWRK+1,
8163
     $                 N, NOUT, WORK( IWRK ), LWORK-IWRK+1,
8065
     $                 RWORK, N, IERR )
8164
     $                 RWORK, N, IERR )
8066
      END IF
8165
      END IF
8067
*
8166
*
8068
*     Compute condition numbers if desired
8167
*     Compute condition numbers if desired
8069
*     (CWorkspace: need N*N+2*N unless SENSE = 'E')
8168
*     (CWorkspace: need N*N+2*N unless SENSE = 'E')
8070
*     (RWorkspace: need 2*N unless SENSE = 'E')
8169
*     (RWorkspace: need 2*N unless SENSE = 'E')
8071
*
8170
*
8072
      IF( .NOT.WNTSNN ) THEN
8171
      IF( .NOT.WNTSNN ) THEN
8073
         CALL ZTRSNA( SENSE, 'A', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
8172
         CALL ZTRSNA( SENSE, 'A', SELECT, N, A, LDA, VL, LDVL, VR,
-
 
8173
     $                LDVR,
8074
     $                RCONDE, RCONDV, N, NOUT, WORK( IWRK ), N, RWORK,
8174
     $                RCONDE, RCONDV, N, NOUT, WORK( IWRK ), N, RWORK,
8075
     $                ICOND )
8175
     $                ICOND )
8076
      END IF
8176
      END IF
8077
*
8177
*
8078
      IF( WANTVL ) THEN
8178
      IF( WANTVL ) THEN
Line 8123... Line 8223...
8123
*
8223
*
8124
*     Undo scaling if necessary
8224
*     Undo scaling if necessary
8125
*
8225
*
8126
   50 CONTINUE
8226
   50 CONTINUE
8127
      IF( SCALEA ) THEN
8227
      IF( SCALEA ) THEN
8128
         CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1, W( INFO+1 ),
8228
         CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, N-INFO, 1,
-
 
8229
     $                W( INFO+1 ),
8129
     $                MAX( N-INFO, 1 ), IERR )
8230
     $                MAX( N-INFO, 1 ), IERR )
8130
         IF( INFO.EQ.0 ) THEN
8231
         IF( INFO.EQ.0 ) THEN
8131
            IF( ( WNTSNV .OR. WNTSNB ) .AND. ICOND.EQ.0 )
8232
            IF( ( WNTSNV .OR. WNTSNB ) .AND. ICOND.EQ.0 )
8132
     $         CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, RCONDV, N,
8233
     $         CALL DLASCL( 'G', 0, 0, CSCALE, ANRM, N, 1, RCONDV, N,
8133
     $                      IERR )
8234
     $                      IERR )
8134
         ELSE
8235
         ELSE
8135
            CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, W, N, IERR )
8236
            CALL ZLASCL( 'G', 0, 0, CSCALE, ANRM, ILO-1, 1, W, N,
-
 
8237
     $                   IERR )
8136
         END IF
8238
         END IF
8137
      END IF
8239
      END IF
8138
*
8240
*
8139
      WORK( 1 ) = MAXWRK
8241
      WORK( 1 ) = MAXWRK
8140
      RETURN
8242
      RETURN
Line 8308... Line 8410...
8308
      COMPLEX*16         ONE
8410
      COMPLEX*16         ONE
8309
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
8411
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
8310
*     ..
8412
*     ..
8311
*     .. Local Scalars ..
8413
*     .. Local Scalars ..
8312
      INTEGER            I
8414
      INTEGER            I
8313
      COMPLEX*16         ALPHA
-
 
8314
*     ..
8415
*     ..
8315
*     .. External Subroutines ..
8416
*     .. External Subroutines ..
8316
      EXTERNAL           XERBLA, ZLARF, ZLARFG
8417
      EXTERNAL           XERBLA, ZLARF1F, ZLARFG
8317
*     ..
8418
*     ..
8318
*     .. Intrinsic Functions ..
8419
*     .. Intrinsic Functions ..
8319
      INTRINSIC          DCONJG, MAX, MIN
8420
      INTRINSIC          DCONJG, MAX, MIN
8320
*     ..
8421
*     ..
8321
*     .. Executable Statements ..
8422
*     .. Executable Statements ..
Line 8339... Line 8440...
8339
*
8440
*
8340
      DO 10 I = ILO, IHI - 1
8441
      DO 10 I = ILO, IHI - 1
8341
*
8442
*
8342
*        Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
8443
*        Compute elementary reflector H(i) to annihilate A(i+2:ihi,i)
8343
*
8444
*
8344
         ALPHA = A( I+1, I )
-
 
8345
         CALL ZLARFG( IHI-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAU( I ) )
8445
         CALL ZLARFG( IHI-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1,
8346
         A( I+1, I ) = ONE
8446
     $                TAU( I ) )
8347
*
8447
*
8348
*        Apply H(i) to A(1:ihi,i+1:ihi) from the right
8448
*        Apply H(i) to A(1:ihi,i+1:ihi) from the right
8349
*
8449
*
8350
         CALL ZLARF( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
8450
         CALL ZLARF1F( 'Right', IHI, IHI-I, A( I+1, I ), 1, TAU( I ),
8351
     $               A( 1, I+1 ), LDA, WORK )
8451
     $                 A( 1, I+1 ), LDA, WORK )
8352
*
8452
*
8353
*        Apply H(i)**H to A(i+1:ihi,i+1:n) from the left
8453
*        Apply H(i)**H to A(i+1:ihi,i+1:n) from the left
8354
*
8454
*
8355
         CALL ZLARF( 'Left', IHI-I, N-I, A( I+1, I ), 1,
8455
         CALL ZLARF1F( 'Left', IHI-I, N-I, A( I+1, I ), 1,
8356
     $               DCONJG( TAU( I ) ), A( I+1, I+1 ), LDA, WORK )
8456
     $                 CONJG( TAU( I ) ), A( I+1, I+1 ), LDA, WORK )
8357
*
8457
*
8358
         A( I+1, I ) = ALPHA
-
 
8359
   10 CONTINUE
8458
   10 CONTINUE
8360
*
8459
*
8361
      RETURN
8460
      RETURN
8362
*
8461
*
8363
*     End of ZGEHD2
8462
*     End of ZGEHD2
Line 8452... Line 8551...
8452
*>          zero.
8551
*>          zero.
8453
*> \endverbatim
8552
*> \endverbatim
8454
*>
8553
*>
8455
*> \param[out] WORK
8554
*> \param[out] WORK
8456
*> \verbatim
8555
*> \verbatim
8457
*>          WORK is COMPLEX*16 array, dimension (LWORK)
8556
*>          WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
8458
*>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
8557
*>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
8459
*> \endverbatim
8558
*> \endverbatim
8460
*>
8559
*>
8461
*> \param[in] LWORK
8560
*> \param[in] LWORK
8462
*> \verbatim
8561
*> \verbatim
Line 8526... Line 8625...
8526
*>  subroutine incorporating improvements proposed by Quintana-Orti and
8625
*>  subroutine incorporating improvements proposed by Quintana-Orti and
8527
*>  Van de Geijn (2006). (See ZLAHR2.)
8626
*>  Van de Geijn (2006). (See ZLAHR2.)
8528
*> \endverbatim
8627
*> \endverbatim
8529
*>
8628
*>
8530
*  =====================================================================
8629
*  =====================================================================
8531
      SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
8630
      SUBROUTINE ZGEHRD( N, ILO, IHI, A, LDA, TAU, WORK, LWORK,
-
 
8631
     $                   INFO )
8532
*
8632
*
8533
*  -- LAPACK computational routine --
8633
*  -- LAPACK computational routine --
8534
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
8634
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
8535
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
8635
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
8536
*
8636
*
8537
*     .. Scalar Arguments ..
8637
*     .. Scalar Arguments ..
8538
      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
8638
      INTEGER            IHI, ILO, INFO, LDA, LWORK, N
8539
*     ..
8639
*     ..
8540
*     .. Array Arguments ..
8640
*     .. Array Arguments ..
8541
      COMPLEX*16        A( LDA, * ), TAU( * ), WORK( * )
8641
      COMPLEX*16         A( LDA, * ), TAU( * ), WORK( * )
8542
*     ..
8642
*     ..
8543
*
8643
*
8544
*  =====================================================================
8644
*  =====================================================================
8545
*
8645
*
8546
*     .. Parameters ..
8646
*     .. Parameters ..
8547
      INTEGER            NBMAX, LDT, TSIZE
8647
      INTEGER            NBMAX, LDT, TSIZE
8548
      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1,
8648
      PARAMETER          ( NBMAX = 64, LDT = NBMAX+1,
8549
     $                     TSIZE = LDT*NBMAX )
8649
     $                     TSIZE = LDT*NBMAX )
8550
      COMPLEX*16        ZERO, ONE
8650
      COMPLEX*16         ZERO, ONE
8551
      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
8651
      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ),
8552
     $                     ONE = ( 1.0D+0, 0.0D+0 ) )
8652
     $                     ONE = ( 1.0D+0, 0.0D+0 ) )
8553
*     ..
8653
*     ..
8554
*     .. Local Scalars ..
8654
*     .. Local Scalars ..
8555
      LOGICAL            LQUERY
8655
      LOGICAL            LQUERY
8556
      INTEGER            I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB,
8656
      INTEGER            I, IB, IINFO, IWT, J, LDWORK, LWKOPT, NB,
8557
     $                   NBMIN, NH, NX
8657
     $                   NBMIN, NH, NX
8558
      COMPLEX*16        EI
8658
      COMPLEX*16         EI
8559
*     ..
8659
*     ..
8560
*     .. External Subroutines ..
8660
*     .. External Subroutines ..
8561
      EXTERNAL           ZAXPY, ZGEHD2, ZGEMM, ZLAHR2, ZLARFB, ZTRMM,
8661
      EXTERNAL           ZAXPY, ZGEHD2, ZGEMM, ZLAHR2, ZLARFB,
-
 
8662
     $                   ZTRMM,
8562
     $                   XERBLA
8663
     $                   XERBLA
8563
*     ..
8664
*     ..
8564
*     .. Intrinsic Functions ..
8665
*     .. Intrinsic Functions ..
8565
      INTRINSIC          MAX, MIN
8666
      INTRINSIC          MAX, MIN
8566
*     ..
8667
*     ..
Line 8584... Line 8685...
8584
         INFO = -5
8685
         INFO = -5
8585
      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
8686
      ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
8586
         INFO = -8
8687
         INFO = -8
8587
      END IF
8688
      END IF
8588
*
8689
*
-
 
8690
      NH = IHI - ILO + 1
8589
      IF( INFO.EQ.0 ) THEN
8691
      IF( INFO.EQ.0 ) THEN
8590
*
8692
*
8591
*        Compute the workspace requirements
8693
*        Compute the workspace requirements
8592
*
8694
*
-
 
8695
         IF( NH.LE.1 ) THEN
-
 
8696
            LWKOPT = 1
-
 
8697
         ELSE
8593
         NB = MIN( NBMAX, ILAENV( 1, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
8698
            NB = MIN( NBMAX, ILAENV( 1, 'ZGEHRD', ' ', N, ILO, IHI,
-
 
8699
     $                              -1 ) )
8594
         LWKOPT = N*NB + TSIZE
8700
            LWKOPT = N*NB + TSIZE
-
 
8701
         END IF
8595
         WORK( 1 ) = LWKOPT
8702
         WORK( 1 ) = LWKOPT
8596
      ENDIF
8703
      ENDIF
8597
*
8704
*
8598
      IF( INFO.NE.0 ) THEN
8705
      IF( INFO.NE.0 ) THEN
8599
         CALL XERBLA( 'ZGEHRD', -INFO )
8706
         CALL XERBLA( 'ZGEHRD', -INFO )
Line 8611... Line 8718...
8611
         TAU( I ) = ZERO
8718
         TAU( I ) = ZERO
8612
   20 CONTINUE
8719
   20 CONTINUE
8613
*
8720
*
8614
*     Quick return if possible
8721
*     Quick return if possible
8615
*
8722
*
8616
      NH = IHI - ILO + 1
-
 
8617
      IF( NH.LE.1 ) THEN
8723
      IF( NH.LE.1 ) THEN
8618
         WORK( 1 ) = 1
8724
         WORK( 1 ) = 1
8619
         RETURN
8725
         RETURN
8620
      END IF
8726
      END IF
8621
*
8727
*
Line 8631... Line 8737...
8631
         NX = MAX( NB, ILAENV( 3, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
8737
         NX = MAX( NB, ILAENV( 3, 'ZGEHRD', ' ', N, ILO, IHI, -1 ) )
8632
         IF( NX.LT.NH ) THEN
8738
         IF( NX.LT.NH ) THEN
8633
*
8739
*
8634
*           Determine if workspace is large enough for blocked code
8740
*           Determine if workspace is large enough for blocked code
8635
*
8741
*
8636
            IF( LWORK.LT.N*NB+TSIZE ) THEN
8742
            IF( LWORK.LT.LWKOPT ) THEN
8637
*
8743
*
8638
*              Not enough workspace to use optimal NB:  determine the
8744
*              Not enough workspace to use optimal NB:  determine the
8639
*              minimum value of NB, and reduce NB or force use of
8745
*              minimum value of NB, and reduce NB or force use of
8640
*              unblocked code
8746
*              unblocked code
8641
*
8747
*
Line 8862... Line 8968...
8862
      COMPLEX*16         ONE
8968
      COMPLEX*16         ONE
8863
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
8969
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
8864
*     ..
8970
*     ..
8865
*     .. Local Scalars ..
8971
*     .. Local Scalars ..
8866
      INTEGER            I, K
8972
      INTEGER            I, K
8867
      COMPLEX*16         ALPHA
-
 
8868
*     ..
8973
*     ..
8869
*     .. External Subroutines ..
8974
*     .. External Subroutines ..
8870
      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZLARFG
8975
      EXTERNAL           XERBLA, ZLACGV, ZLARF1F, ZLARFG
8871
*     ..
8976
*     ..
8872
*     .. Intrinsic Functions ..
8977
*     .. Intrinsic Functions ..
8873
      INTRINSIC          MAX, MIN
8978
      INTRINSIC          MAX, MIN
8874
*     ..
8979
*     ..
8875
*     .. Executable Statements ..
8980
*     .. Executable Statements ..
Line 8894... Line 8999...
8894
      DO 10 I = 1, K
8999
      DO 10 I = 1, K
8895
*
9000
*
8896
*        Generate elementary reflector H(i) to annihilate A(i,i+1:n)
9001
*        Generate elementary reflector H(i) to annihilate A(i,i+1:n)
8897
*
9002
*
8898
         CALL ZLACGV( N-I+1, A( I, I ), LDA )
9003
         CALL ZLACGV( N-I+1, A( I, I ), LDA )
8899
         ALPHA = A( I, I )
-
 
8900
         CALL ZLARFG( N-I+1, ALPHA, A( I, MIN( I+1, N ) ), LDA,
9004
         CALL ZLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA,
8901
     $                TAU( I ) )
9005
     $                TAU( I ) )
8902
         IF( I.LT.M ) THEN
9006
         IF( I.LT.M ) THEN
8903
*
9007
*
8904
*           Apply H(i) to A(i+1:m,i:n) from the right
9008
*           Apply H(i) to A(i+1:m,i:n) from the right
8905
*
9009
*
8906
            A( I, I ) = ONE
9010
            CALL ZLARF1F( 'Right', M-I, N-I+1, A( I, I ), LDA,
8907
            CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, TAU( I ),
9011
     $                    TAU( I ),
8908
     $                  A( I+1, I ), LDA, WORK )
9012
     $                    A( I+1, I ), LDA, WORK )
8909
         END IF
9013
         END IF
8910
         A( I, I ) = ALPHA
-
 
8911
         CALL ZLACGV( N-I+1, A( I, I ), LDA )
9014
         CALL ZLACGV( N-I+1, A( I, I ), LDA )
8912
   10 CONTINUE
9015
   10 CONTINUE
8913
      RETURN
9016
      RETURN
8914
*
9017
*
8915
*     End of ZGELQ2
9018
*     End of ZGELQ2
Line 9008... Line 9111...
9008
*> \endverbatim
9111
*> \endverbatim
9009
*>
9112
*>
9010
*> \param[in] LWORK
9113
*> \param[in] LWORK
9011
*> \verbatim
9114
*> \verbatim
9012
*>          LWORK is INTEGER
9115
*>          LWORK is INTEGER
9013
*>          The dimension of the array WORK.  LWORK >= max(1,M).
9116
*>          The dimension of the array WORK.
-
 
9117
*>          LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
9014
*>          For optimum performance LWORK >= M*NB, where NB is the
9118
*>          For optimum performance LWORK >= M*NB, where NB is the
9015
*>          optimal blocksize.
9119
*>          optimal blocksize.
9016
*>
9120
*>
9017
*>          If LWORK = -1, then a workspace query is assumed; the routine
9121
*>          If LWORK = -1, then a workspace query is assumed; the routine
9018
*>          only calculates the optimal size of the WORK array, returns
9122
*>          only calculates the optimal size of the WORK array, returns
Line 9089... Line 9193...
9089
*     .. Executable Statements ..
9193
*     .. Executable Statements ..
9090
*
9194
*
9091
*     Test the input arguments
9195
*     Test the input arguments
9092
*
9196
*
9093
      INFO = 0
9197
      INFO = 0
-
 
9198
      K = MIN( M, N )
9094
      NB = ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
9199
      NB = ILAENV( 1, 'ZGELQF', ' ', M, N, -1, -1 )
9095
      LWKOPT = M*NB
-
 
9096
      WORK( 1 ) = LWKOPT
-
 
9097
      LQUERY = ( LWORK.EQ.-1 )
9200
      LQUERY = ( LWORK.EQ.-1 )
9098
      IF( M.LT.0 ) THEN
9201
      IF( M.LT.0 ) THEN
9099
         INFO = -1
9202
         INFO = -1
9100
      ELSE IF( N.LT.0 ) THEN
9203
      ELSE IF( N.LT.0 ) THEN
9101
         INFO = -2
9204
         INFO = -2
9102
      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
9205
      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
9103
         INFO = -4
9206
         INFO = -4
9104
      ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
9207
      ELSE IF( .NOT.LQUERY ) THEN
-
 
9208
         IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
9105
         INFO = -7
9209
     $      INFO = -7
9106
      END IF
9210
      END IF
9107
      IF( INFO.NE.0 ) THEN
9211
      IF( INFO.NE.0 ) THEN
9108
         CALL XERBLA( 'ZGELQF', -INFO )
9212
         CALL XERBLA( 'ZGELQF', -INFO )
9109
         RETURN
9213
         RETURN
9110
      ELSE IF( LQUERY ) THEN
9214
      ELSE IF( LQUERY ) THEN
-
 
9215
         IF( K.EQ.0 ) THEN
-
 
9216
            LWKOPT = 1
-
 
9217
         ELSE
-
 
9218
            LWKOPT = M*NB
-
 
9219
         END IF
-
 
9220
         WORK( 1 ) = LWKOPT
9111
         RETURN
9221
         RETURN
9112
      END IF
9222
      END IF
9113
*
9223
*
9114
*     Quick return if possible
9224
*     Quick return if possible
9115
*
9225
*
9116
      K = MIN( M, N )
-
 
9117
      IF( K.EQ.0 ) THEN
9226
      IF( K.EQ.0 ) THEN
9118
         WORK( 1 ) = 1
9227
         WORK( 1 ) = 1
9119
         RETURN
9228
         RETURN
9120
      END IF
9229
      END IF
9121
*
9230
*
Line 9160... Line 9269...
9160
            IF( I+IB.LE.M ) THEN
9269
            IF( I+IB.LE.M ) THEN
9161
*
9270
*
9162
*              Form the triangular factor of the block reflector
9271
*              Form the triangular factor of the block reflector
9163
*              H = H(i) H(i+1) . . . H(i+ib-1)
9272
*              H = H(i) H(i+1) . . . H(i+ib-1)
9164
*
9273
*
9165
               CALL ZLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
9274
               CALL ZLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I,
-
 
9275
     $                      I ),
9166
     $                      LDA, TAU( I ), WORK, LDWORK )
9276
     $                      LDA, TAU( I ), WORK, LDWORK )
9167
*
9277
*
9168
*              Apply H to A(i+ib:m,i:n) from the right
9278
*              Apply H to A(i+ib:m,i:n) from the right
9169
*
9279
*
9170
               CALL ZLARFB( 'Right', 'No transpose', 'Forward',
9280
               CALL ZLARFB( 'Right', 'No transpose', 'Forward',
Line 9226... Line 9336...
9226
*>
9336
*>
9227
*> \verbatim
9337
*> \verbatim
9228
*>
9338
*>
9229
*> ZGELS solves overdetermined or underdetermined complex linear systems
9339
*> ZGELS solves overdetermined or underdetermined complex linear systems
9230
*> involving an M-by-N matrix A, or its conjugate-transpose, using a QR
9340
*> involving an M-by-N matrix A, or its conjugate-transpose, using a QR
-
 
9341
*> or LQ factorization of A.
-
 
9342
*>
-
 
9343
*> It is assumed that A has full rank, and only a rudimentary protection
-
 
9344
*> against rank-deficient matrices is provided. This subroutine only detects
-
 
9345
*> exact rank-deficiency, where a diagonal element of the triangular factor
-
 
9346
*> of A is exactly zero.
-
 
9347
*>
-
 
9348
*> It is conceivable for one (or more) of the diagonal elements of the triangular
-
 
9349
*> factor of A to be subnormally tiny numbers without this subroutine signalling
-
 
9350
*> an error. The solutions computed for such almost-rank-deficient matrices may
9231
*> or LQ factorization of A.  It is assumed that A has full rank.
9351
*> be less accurate due to a loss of numerical precision.
9232
*>
9352
*>
9233
*> The following options are provided:
9353
*> The following options are provided:
9234
*>
9354
*>
9235
*> 1. If TRANS = 'N' and m >= n:  find the least squares solution of
9355
*> 1. If TRANS = 'N' and m >= n:  find the least squares solution of
9236
*>    an overdetermined system, i.e., solve the least squares problem
9356
*>    an overdetermined system, i.e., solve the least squares problem
Line 9350... Line 9470...
9350
*> \verbatim
9470
*> \verbatim
9351
*>          INFO is INTEGER
9471
*>          INFO is INTEGER
9352
*>          = 0:  successful exit
9472
*>          = 0:  successful exit
9353
*>          < 0:  if INFO = -i, the i-th argument had an illegal value
9473
*>          < 0:  if INFO = -i, the i-th argument had an illegal value
9354
*>          > 0:  if INFO =  i, the i-th diagonal element of the
9474
*>          > 0:  if INFO =  i, the i-th diagonal element of the
9355
*>                triangular factor of A is zero, so that A does not have
9475
*>                triangular factor of A is exactly zero, so that A does not have
9356
*>                full rank; the least squares solution could not be
9476
*>                full rank; the least squares solution could not be
9357
*>                computed.
9477
*>                computed.
9358
*> \endverbatim
9478
*> \endverbatim
9359
*
9479
*
9360
*  Authors:
9480
*  Authors:
Line 9366... Line 9486...
9366
*> \author NAG Ltd.
9486
*> \author NAG Ltd.
9367
*
9487
*
9368
*> \ingroup gels
9488
*> \ingroup gels
9369
*
9489
*
9370
*  =====================================================================
9490
*  =====================================================================
9371
      SUBROUTINE ZGELS( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
9491
      SUBROUTINE ZGELS( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
-
 
9492
     $                  LWORK,
9372
     $                  INFO )
9493
     $                  INFO )
9373
*
9494
*
9374
*  -- LAPACK driver routine --
9495
*  -- LAPACK driver routine --
9375
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
9496
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
9376
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
9497
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 9404... Line 9525...
9404
      INTEGER            ILAENV
9525
      INTEGER            ILAENV
9405
      DOUBLE PRECISION   DLAMCH, ZLANGE
9526
      DOUBLE PRECISION   DLAMCH, ZLANGE
9406
      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
9527
      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANGE
9407
*     ..
9528
*     ..
9408
*     .. External Subroutines ..
9529
*     .. External Subroutines ..
9409
      EXTERNAL           XERBLA, ZGELQF, ZGEQRF, ZLASCL, ZLASET,
9530
      EXTERNAL           XERBLA, ZGELQF, ZGEQRF, ZLASCL,
-
 
9531
     $                   ZLASET,
9410
     $                   ZTRTRS, ZUNMLQ, ZUNMQR
9532
     $                   ZTRTRS, ZUNMLQ, ZUNMQR
9411
*     ..
9533
*     ..
9412
*     .. Intrinsic Functions ..
9534
*     .. Intrinsic Functions ..
9413
      INTRINSIC          DBLE, MAX, MIN
9535
      INTRINSIC          DBLE, MAX, MIN
9414
*     ..
9536
*     ..
Line 9417... Line 9539...
9417
*     Test the input arguments.
9539
*     Test the input arguments.
9418
*
9540
*
9419
      INFO = 0
9541
      INFO = 0
9420
      MN = MIN( M, N )
9542
      MN = MIN( M, N )
9421
      LQUERY = ( LWORK.EQ.-1 )
9543
      LQUERY = ( LWORK.EQ.-1 )
9422
      IF( .NOT.( LSAME( TRANS, 'N' ) .OR. LSAME( TRANS, 'C' ) ) ) THEN
9544
      IF( .NOT.( LSAME( TRANS, 'N' ) .OR.
-
 
9545
     $    LSAME( TRANS, 'C' ) ) ) THEN
9423
         INFO = -1
9546
         INFO = -1
9424
      ELSE IF( M.LT.0 ) THEN
9547
      ELSE IF( M.LT.0 ) THEN
9425
         INFO = -2
9548
         INFO = -2
9426
      ELSE IF( N.LT.0 ) THEN
9549
      ELSE IF( N.LT.0 ) THEN
9427
         INFO = -3
9550
         INFO = -3
Line 9477... Line 9600...
9477
      END IF
9600
      END IF
9478
*
9601
*
9479
*     Quick return if possible
9602
*     Quick return if possible
9480
*
9603
*
9481
      IF( MIN( M, N, NRHS ).EQ.0 ) THEN
9604
      IF( MIN( M, N, NRHS ).EQ.0 ) THEN
9482
         CALL ZLASET( 'Full', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
9605
         CALL ZLASET( 'Full', MAX( M, N ), NRHS, CZERO, CZERO, B,
-
 
9606
     $                LDB )
9483
         RETURN
9607
         RETURN
9484
      END IF
9608
      END IF
9485
*
9609
*
9486
*     Get machine parameters
9610
*     Get machine parameters
9487
*
9611
*
Line 9535... Line 9659...
9535
*
9659
*
9536
      IF( M.GE.N ) THEN
9660
      IF( M.GE.N ) THEN
9537
*
9661
*
9538
*        compute QR factorization of A
9662
*        compute QR factorization of A
9539
*
9663
*
9540
         CALL ZGEQRF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ), LWORK-MN,
9664
         CALL ZGEQRF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ),
-
 
9665
     $                LWORK-MN,
9541
     $                INFO )
9666
     $                INFO )
9542
*
9667
*
9543
*        workspace at least N, optimally N*NB
9668
*        workspace at least N, optimally N*NB
9544
*
9669
*
9545
         IF( .NOT.TPSD ) THEN
9670
         IF( .NOT.TPSD ) THEN
9546
*
9671
*
9547
*           Least-Squares Problem min || A * X - B ||
9672
*           Least-Squares Problem min || A * X - B ||
9548
*
9673
*
9549
*           B(1:M,1:NRHS) := Q**H * B(1:M,1:NRHS)
9674
*           B(1:M,1:NRHS) := Q**H * B(1:M,1:NRHS)
9550
*
9675
*
9551
            CALL ZUNMQR( 'Left', 'Conjugate transpose', M, NRHS, N, A,
9676
            CALL ZUNMQR( 'Left', 'Conjugate transpose', M, NRHS, N,
-
 
9677
     $                   A,
9552
     $                   LDA, WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
9678
     $                   LDA, WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
9553
     $                   INFO )
9679
     $                   INFO )
9554
*
9680
*
9555
*           workspace at least NRHS, optimally NRHS*NB
9681
*           workspace at least NRHS, optimally NRHS*NB
9556
*
9682
*
9557
*           B(1:N,1:NRHS) := inv(R) * B(1:N,1:NRHS)
9683
*           B(1:N,1:NRHS) := inv(R) * B(1:N,1:NRHS)
9558
*
9684
*
9559
            CALL ZTRTRS( 'Upper', 'No transpose', 'Non-unit', N, NRHS,
9685
            CALL ZTRTRS( 'Upper', 'No transpose', 'Non-unit', N,
-
 
9686
     $                   NRHS,
9560
     $                   A, LDA, B, LDB, INFO )
9687
     $                   A, LDA, B, LDB, INFO )
9561
*
9688
*
9562
            IF( INFO.GT.0 ) THEN
9689
            IF( INFO.GT.0 ) THEN
9563
               RETURN
9690
               RETURN
9564
            END IF
9691
            END IF
Line 9600... Line 9727...
9600
*
9727
*
9601
      ELSE
9728
      ELSE
9602
*
9729
*
9603
*        Compute LQ factorization of A
9730
*        Compute LQ factorization of A
9604
*
9731
*
9605
         CALL ZGELQF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ), LWORK-MN,
9732
         CALL ZGELQF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ),
-
 
9733
     $                LWORK-MN,
9606
     $                INFO )
9734
     $                INFO )
9607
*
9735
*
9608
*        workspace at least M, optimally M*NB.
9736
*        workspace at least M, optimally M*NB.
9609
*
9737
*
9610
         IF( .NOT.TPSD ) THEN
9738
         IF( .NOT.TPSD ) THEN
9611
*
9739
*
9612
*           underdetermined system of equations A * X = B
9740
*           underdetermined system of equations A * X = B
9613
*
9741
*
9614
*           B(1:M,1:NRHS) := inv(L) * B(1:M,1:NRHS)
9742
*           B(1:M,1:NRHS) := inv(L) * B(1:M,1:NRHS)
9615
*
9743
*
9616
            CALL ZTRTRS( 'Lower', 'No transpose', 'Non-unit', M, NRHS,
9744
            CALL ZTRTRS( 'Lower', 'No transpose', 'Non-unit', M,
-
 
9745
     $                   NRHS,
9617
     $                   A, LDA, B, LDB, INFO )
9746
     $                   A, LDA, B, LDB, INFO )
9618
*
9747
*
9619
            IF( INFO.GT.0 ) THEN
9748
            IF( INFO.GT.0 ) THEN
9620
               RETURN
9749
               RETURN
9621
            END IF
9750
            END IF
Line 9628... Line 9757...
9628
   30          CONTINUE
9757
   30          CONTINUE
9629
   40       CONTINUE
9758
   40       CONTINUE
9630
*
9759
*
9631
*           B(1:N,1:NRHS) := Q(1:N,:)**H * B(1:M,1:NRHS)
9760
*           B(1:N,1:NRHS) := Q(1:N,:)**H * B(1:M,1:NRHS)
9632
*
9761
*
9633
            CALL ZUNMLQ( 'Left', 'Conjugate transpose', N, NRHS, M, A,
9762
            CALL ZUNMLQ( 'Left', 'Conjugate transpose', N, NRHS, M,
-
 
9763
     $                   A,
9634
     $                   LDA, WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
9764
     $                   LDA, WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
9635
     $                   INFO )
9765
     $                   INFO )
9636
*
9766
*
9637
*           workspace at least NRHS, optimally NRHS*NB
9767
*           workspace at least NRHS, optimally NRHS*NB
9638
*
9768
*
Line 9937... Line 10067...
9937
     $                   LDWORK, LIWORK, LRWORK, MAXMN, MAXWRK, MINMN,
10067
     $                   LDWORK, LIWORK, LRWORK, MAXMN, MAXWRK, MINMN,
9938
     $                   MINWRK, MM, MNTHR, NLVL, NRWORK, NWORK, SMLSIZ
10068
     $                   MINWRK, MM, MNTHR, NLVL, NRWORK, NWORK, SMLSIZ
9939
      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
10069
      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM
9940
*     ..
10070
*     ..
9941
*     .. External Subroutines ..
10071
*     .. External Subroutines ..
9942
      EXTERNAL           DLASCL, DLASET, XERBLA, ZGEBRD, ZGELQF, ZGEQRF,
10072
      EXTERNAL           DLASCL, DLASET, XERBLA, ZGEBRD, ZGELQF,
-
 
10073
     $                   ZGEQRF,
9943
     $                   ZLACPY, ZLALSD, ZLASCL, ZLASET, ZUNMBR, ZUNMLQ,
10074
     $                   ZLACPY, ZLALSD, ZLASCL, ZLASET, ZUNMBR, ZUNMLQ,
9944
     $                   ZUNMQR
10075
     $                   ZUNMQR
9945
*     ..
10076
*     ..
9946
*     .. External Functions ..
10077
*     .. External Functions ..
9947
      INTEGER            ILAENV
10078
      INTEGER            ILAENV
Line 9994... Line 10125...
9994
*
10125
*
9995
*              Path 1a - overdetermined, with many more rows than
10126
*              Path 1a - overdetermined, with many more rows than
9996
*                        columns.
10127
*                        columns.
9997
*
10128
*
9998
               MM = N
10129
               MM = N
9999
               MAXWRK = MAX( MAXWRK, N*ILAENV( 1, 'ZGEQRF', ' ', M, N,
10130
               MAXWRK = MAX( MAXWRK, N*ILAENV( 1, 'ZGEQRF', ' ', M,
-
 
10131
     $                       N,
10000
     $                       -1, -1 ) )
10132
     $                       -1, -1 ) )
10001
               MAXWRK = MAX( MAXWRK, NRHS*ILAENV( 1, 'ZUNMQR', 'LC', M,
10133
               MAXWRK = MAX( MAXWRK, NRHS*ILAENV( 1, 'ZUNMQR', 'LC',
-
 
10134
     $                       M,
10002
     $                       NRHS, N, -1 ) )
10135
     $                       NRHS, N, -1 ) )
10003
            END IF
10136
            END IF
10004
            IF( M.GE.N ) THEN
10137
            IF( M.GE.N ) THEN
10005
*
10138
*
10006
*              Path 1 - overdetermined or exactly determined.
10139
*              Path 1 - overdetermined or exactly determined.
Line 10028... Line 10161...
10028
     $                     -1 )
10161
     $                     -1 )
10029
                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
10162
                  MAXWRK = MAX( MAXWRK, M*M + 4*M + 2*M*ILAENV( 1,
10030
     $                          'ZGEBRD', ' ', M, M, -1, -1 ) )
10163
     $                          'ZGEBRD', ' ', M, M, -1, -1 ) )
10031
                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
10164
                  MAXWRK = MAX( MAXWRK, M*M + 4*M + NRHS*ILAENV( 1,
10032
     $                          'ZUNMBR', 'QLC', M, NRHS, M, -1 ) )
10165
     $                          'ZUNMBR', 'QLC', M, NRHS, M, -1 ) )
-
 
10166
                  MAXWRK = MAX( MAXWRK,
10033
                  MAXWRK = MAX( MAXWRK, M*M + 4*M + ( M - 1 )*ILAENV( 1,
10167
     $                          M*M + 4*M + ( M - 1 )*ILAENV( 1,
10034
     $                          'ZUNMLQ', 'LC', N, NRHS, M, -1 ) )
10168
     $                          'ZUNMLQ', 'LC', N, NRHS, M, -1 ) )
10035
                  IF( NRHS.GT.1 ) THEN
10169
                  IF( NRHS.GT.1 ) THEN
10036
                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
10170
                     MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS )
10037
                  ELSE
10171
                  ELSE
10038
                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
10172
                     MAXWRK = MAX( MAXWRK, M*M + 2*M )
Line 10044... Line 10178...
10044
     $                 4*M+M*M+MAX( M, 2*M-4, NRHS, N-3*M ) )
10178
     $                 4*M+M*M+MAX( M, 2*M-4, NRHS, N-3*M ) )
10045
               ELSE
10179
               ELSE
10046
*
10180
*
10047
*                 Path 2 - underdetermined.
10181
*                 Path 2 - underdetermined.
10048
*
10182
*
10049
                  MAXWRK = 2*M + ( N + M )*ILAENV( 1, 'ZGEBRD', ' ', M,
10183
                  MAXWRK = 2*M + ( N + M )*ILAENV( 1, 'ZGEBRD', ' ',
-
 
10184
     $                             M,
10050
     $                     N, -1, -1 )
10185
     $                     N, -1, -1 )
10051
                  MAXWRK = MAX( MAXWRK, 2*M + NRHS*ILAENV( 1, 'ZUNMBR',
10186
                  MAXWRK = MAX( MAXWRK, 2*M + NRHS*ILAENV( 1,
-
 
10187
     $                          'ZUNMBR',
10052
     $                          'QLC', M, NRHS, M, -1 ) )
10188
     $                          'QLC', M, NRHS, M, -1 ) )
10053
                  MAXWRK = MAX( MAXWRK, 2*M + M*ILAENV( 1, 'ZUNMBR',
10189
                  MAXWRK = MAX( MAXWRK, 2*M + M*ILAENV( 1, 'ZUNMBR',
10054
     $                          'PLN', N, NRHS, M, -1 ) )
10190
     $                          'PLN', N, NRHS, M, -1 ) )
10055
                  MAXWRK = MAX( MAXWRK, 2*M + M*NRHS )
10191
                  MAXWRK = MAX( MAXWRK, 2*M + M*NRHS )
10056
               END IF
10192
               END IF
Line 10120... Line 10256...
10120
      IBSCL = 0
10256
      IBSCL = 0
10121
      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
10257
      IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
10122
*
10258
*
10123
*        Scale matrix norm up to SMLNUM.
10259
*        Scale matrix norm up to SMLNUM.
10124
*
10260
*
10125
         CALL ZLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
10261
         CALL ZLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB,
-
 
10262
     $                INFO )
10126
         IBSCL = 1
10263
         IBSCL = 1
10127
      ELSE IF( BNRM.GT.BIGNUM ) THEN
10264
      ELSE IF( BNRM.GT.BIGNUM ) THEN
10128
*
10265
*
10129
*        Scale matrix norm down to BIGNUM.
10266
*        Scale matrix norm down to BIGNUM.
10130
*
10267
*
10131
         CALL ZLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO )
10268
         CALL ZLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB,
-
 
10269
     $                INFO )
10132
         IBSCL = 2
10270
         IBSCL = 2
10133
      END IF
10271
      END IF
10134
*
10272
*
10135
*     If M < N make sure B(M+1:N,:) = 0
10273
*     If M < N make sure B(M+1:N,:) = 0
10136
*
10274
*
10137
      IF( M.LT.N )
10275
      IF( M.LT.N )
10138
     $   CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
10276
     $   CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ),
-
 
10277
     $                LDB )
10139
*
10278
*
10140
*     Overdetermined case.
10279
*     Overdetermined case.
10141
*
10280
*
10142
      IF( M.GE.N ) THEN
10281
      IF( M.GE.N ) THEN
10143
*
10282
*
Line 10161... Line 10300...
10161
*
10300
*
10162
*           Multiply B by transpose(Q).
10301
*           Multiply B by transpose(Q).
10163
*           (RWorkspace: need N)
10302
*           (RWorkspace: need N)
10164
*           (CWorkspace: need NRHS, prefer NRHS*NB)
10303
*           (CWorkspace: need NRHS, prefer NRHS*NB)
10165
*
10304
*
10166
            CALL ZUNMQR( 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAU ), B,
10305
            CALL ZUNMQR( 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAU ),
-
 
10306
     $                   B,
10167
     $                   LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10307
     $                   LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10168
*
10308
*
10169
*           Zero out below R.
10309
*           Zero out below R.
10170
*
10310
*
10171
            IF( N.GT.1 ) THEN
10311
            IF( N.GT.1 ) THEN
Line 10189... Line 10329...
10189
     $                INFO )
10329
     $                INFO )
10190
*
10330
*
10191
*        Multiply B by transpose of left bidiagonalizing vectors of R.
10331
*        Multiply B by transpose of left bidiagonalizing vectors of R.
10192
*        (CWorkspace: need 2*N+NRHS, prefer 2*N+NRHS*NB)
10332
*        (CWorkspace: need 2*N+NRHS, prefer 2*N+NRHS*NB)
10193
*
10333
*
10194
         CALL ZUNMBR( 'Q', 'L', 'C', MM, NRHS, N, A, LDA, WORK( ITAUQ ),
10334
         CALL ZUNMBR( 'Q', 'L', 'C', MM, NRHS, N, A, LDA,
-
 
10335
     $                WORK( ITAUQ ),
10195
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10336
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10196
*
10337
*
10197
*        Solve the bidiagonal least squares problem.
10338
*        Solve the bidiagonal least squares problem.
10198
*
10339
*
10199
         CALL ZLALSD( 'U', SMLSIZ, N, NRHS, S, RWORK( IE ), B, LDB,
10340
         CALL ZLALSD( 'U', SMLSIZ, N, NRHS, S, RWORK( IE ), B, LDB,
Line 10203... Line 10344...
10203
            GO TO 10
10344
            GO TO 10
10204
         END IF
10345
         END IF
10205
*
10346
*
10206
*        Multiply B by right bidiagonalizing vectors of R.
10347
*        Multiply B by right bidiagonalizing vectors of R.
10207
*
10348
*
10208
         CALL ZUNMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA, WORK( ITAUP ),
10349
         CALL ZUNMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA,
-
 
10350
     $                WORK( ITAUP ),
10209
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10351
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10210
*
10352
*
10211
      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
10353
      ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+
10212
     $         MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
10354
     $         MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN
10213
*
10355
*
Line 10268... Line 10410...
10268
     $                WORK( ITAUP ), B, LDB, WORK( NWORK ),
10410
     $                WORK( ITAUP ), B, LDB, WORK( NWORK ),
10269
     $                LWORK-NWORK+1, INFO )
10411
     $                LWORK-NWORK+1, INFO )
10270
*
10412
*
10271
*        Zero out below first M rows of B.
10413
*        Zero out below first M rows of B.
10272
*
10414
*
10273
         CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ), LDB )
10415
         CALL ZLASET( 'F', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ),
-
 
10416
     $                LDB )
10274
         NWORK = ITAU + M
10417
         NWORK = ITAU + M
10275
*
10418
*
10276
*        Multiply transpose(Q) by B.
10419
*        Multiply transpose(Q) by B.
10277
*        (CWorkspace: need NRHS, prefer NRHS*NB)
10420
*        (CWorkspace: need NRHS, prefer NRHS*NB)
10278
*
10421
*
Line 10298... Line 10441...
10298
     $                INFO )
10441
     $                INFO )
10299
*
10442
*
10300
*        Multiply B by transpose of left bidiagonalizing vectors.
10443
*        Multiply B by transpose of left bidiagonalizing vectors.
10301
*        (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
10444
*        (CWorkspace: need 2*M+NRHS, prefer 2*M+NRHS*NB)
10302
*
10445
*
10303
         CALL ZUNMBR( 'Q', 'L', 'C', M, NRHS, N, A, LDA, WORK( ITAUQ ),
10446
         CALL ZUNMBR( 'Q', 'L', 'C', M, NRHS, N, A, LDA,
-
 
10447
     $                WORK( ITAUQ ),
10304
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10448
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10305
*
10449
*
10306
*        Solve the bidiagonal least squares problem.
10450
*        Solve the bidiagonal least squares problem.
10307
*
10451
*
10308
         CALL ZLALSD( 'L', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
10452
         CALL ZLALSD( 'L', SMLSIZ, M, NRHS, S, RWORK( IE ), B, LDB,
Line 10312... Line 10456...
10312
            GO TO 10
10456
            GO TO 10
10313
         END IF
10457
         END IF
10314
*
10458
*
10315
*        Multiply B by right bidiagonalizing vectors of A.
10459
*        Multiply B by right bidiagonalizing vectors of A.
10316
*
10460
*
10317
         CALL ZUNMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA, WORK( ITAUP ),
10461
         CALL ZUNMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA,
-
 
10462
     $                WORK( ITAUP ),
10318
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10463
     $                B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO )
10319
*
10464
*
10320
      END IF
10465
      END IF
10321
*
10466
*
10322
*     Undo scaling.
10467
*     Undo scaling.
10323
*
10468
*
10324
      IF( IASCL.EQ.1 ) THEN
10469
      IF( IASCL.EQ.1 ) THEN
10325
         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
10470
         CALL ZLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB,
-
 
10471
     $                INFO )
10326
         CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
10472
         CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
10327
     $                INFO )
10473
     $                INFO )
10328
      ELSE IF( IASCL.EQ.2 ) THEN
10474
      ELSE IF( IASCL.EQ.2 ) THEN
10329
         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO )
10475
         CALL ZLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB,
-
 
10476
     $                INFO )
10330
         CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
10477
         CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
10331
     $                INFO )
10478
     $                INFO )
10332
      END IF
10479
      END IF
10333
      IF( IBSCL.EQ.1 ) THEN
10480
      IF( IBSCL.EQ.1 ) THEN
10334
         CALL ZLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
10481
         CALL ZLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB,
-
 
10482
     $                INFO )
10335
      ELSE IF( IBSCL.EQ.2 ) THEN
10483
      ELSE IF( IBSCL.EQ.2 ) THEN
10336
         CALL ZLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
10484
         CALL ZLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB,
-
 
10485
     $                INFO )
10337
      END IF
10486
      END IF
10338
*
10487
*
10339
   10 CONTINUE
10488
   10 CONTINUE
10340
      WORK( 1 ) = MAXWRK
10489
      WORK( 1 ) = MAXWRK
10341
      IWORK( 1 ) = LIWORK
10490
      IWORK( 1 ) = LIWORK
Line 10527... Line 10676...
10527
      LOGICAL            LQUERY
10676
      LOGICAL            LQUERY
10528
      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
10677
      INTEGER            FJB, IWS, J, JB, LWKOPT, MINMN, MINWS, NA, NB,
10529
     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
10678
     $                   NBMIN, NFXD, NX, SM, SMINMN, SN, TOPBMN
10530
*     ..
10679
*     ..
10531
*     .. External Subroutines ..
10680
*     .. External Subroutines ..
10532
      EXTERNAL           XERBLA, ZGEQRF, ZLAQP2, ZLAQPS, ZSWAP, ZUNMQR
10681
      EXTERNAL           XERBLA, ZGEQRF, ZLAQP2, ZLAQPS, ZSWAP,
-
 
10682
     $                   ZUNMQR
10533
*     ..
10683
*     ..
10534
*     .. External Functions ..
10684
*     .. External Functions ..
10535
      INTEGER            ILAENV
10685
      INTEGER            ILAENV
10536
      DOUBLE PRECISION   DZNRM2
10686
      DOUBLE PRECISION   DZNRM2
10537
      EXTERNAL           ILAENV, DZNRM2
10687
      EXTERNAL           ILAENV, DZNRM2
Line 10610... Line 10760...
10610
         IWS = MAX( IWS, INT( WORK( 1 ) ) )
10760
         IWS = MAX( IWS, INT( WORK( 1 ) ) )
10611
         IF( NA.LT.N ) THEN
10761
         IF( NA.LT.N ) THEN
10612
*CC         CALL ZUNM2R( 'Left', 'Conjugate Transpose', M, N-NA,
10762
*CC         CALL ZUNM2R( 'Left', 'Conjugate Transpose', M, N-NA,
10613
*CC  $                   NA, A, LDA, TAU, A( 1, NA+1 ), LDA, WORK,
10763
*CC  $                   NA, A, LDA, TAU, A( 1, NA+1 ), LDA, WORK,
10614
*CC  $                   INFO )
10764
*CC  $                   INFO )
10615
            CALL ZUNMQR( 'Left', 'Conjugate Transpose', M, N-NA, NA, A,
10765
            CALL ZUNMQR( 'Left', 'Conjugate Transpose', M, N-NA, NA,
-
 
10766
     $                   A,
10616
     $                   LDA, TAU, A( 1, NA+1 ), LDA, WORK, LWORK,
10767
     $                   LDA, TAU, A( 1, NA+1 ), LDA, WORK, LWORK,
10617
     $                   INFO )
10768
     $                   INFO )
10618
            IWS = MAX( IWS, INT( WORK( 1 ) ) )
10769
            IWS = MAX( IWS, INT( WORK( 1 ) ) )
10619
         END IF
10770
         END IF
10620
      END IF
10771
      END IF
Line 10652... Line 10803...
10652
*
10803
*
10653
*                 Not enough workspace to use optimal NB: Reduce NB and
10804
*                 Not enough workspace to use optimal NB: Reduce NB and
10654
*                 determine the minimum value of NB.
10805
*                 determine the minimum value of NB.
10655
*
10806
*
10656
                  NB = LWORK / ( SN+1 )
10807
                  NB = LWORK / ( SN+1 )
10657
                  NBMIN = MAX( 2, ILAENV( INBMIN, 'ZGEQRF', ' ', SM, SN,
10808
                  NBMIN = MAX( 2, ILAENV( INBMIN, 'ZGEQRF', ' ', SM,
-
 
10809
     $                         SN,
10658
     $                    -1, -1 ) )
10810
     $                    -1, -1 ) )
10659
*
10811
*
10660
*
10812
*
10661
               END IF
10813
               END IF
10662
            END IF
10814
            END IF
Line 10861... Line 11013...
10861
      COMPLEX*16         ONE
11013
      COMPLEX*16         ONE
10862
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
11014
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
10863
*     ..
11015
*     ..
10864
*     .. Local Scalars ..
11016
*     .. Local Scalars ..
10865
      INTEGER            I, K
11017
      INTEGER            I, K
10866
      COMPLEX*16         ALPHA
-
 
10867
*     ..
11018
*     ..
10868
*     .. External Subroutines ..
11019
*     .. External Subroutines ..
10869
      EXTERNAL           XERBLA, ZLARF, ZLARFG
11020
      EXTERNAL           XERBLA, ZLARF1F, ZLARFG
10870
*     ..
11021
*     ..
10871
*     .. Intrinsic Functions ..
11022
*     .. Intrinsic Functions ..
10872
      INTRINSIC          DCONJG, MAX, MIN
11023
      INTRINSIC          DCONJG, MAX, MIN
10873
*     ..
11024
*     ..
10874
*     .. Executable Statements ..
11025
*     .. Executable Statements ..
Line 10898... Line 11049...
10898
     $                TAU( I ) )
11049
     $                TAU( I ) )
10899
         IF( I.LT.N ) THEN
11050
         IF( I.LT.N ) THEN
10900
*
11051
*
10901
*           Apply H(i)**H to A(i:m,i+1:n) from the left
11052
*           Apply H(i)**H to A(i:m,i+1:n) from the left
10902
*
11053
*
10903
            ALPHA = A( I, I )
-
 
10904
            A( I, I ) = ONE
-
 
10905
            CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1,
11054
            CALL ZLARF1F( 'Left', M-I+1, N-I, A( I, I ), 1,
10906
     $                  DCONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
11055
     $                    CONJG( TAU( I ) ), A( I, I+1 ), LDA, WORK )
10907
            A( I, I ) = ALPHA
-
 
10908
         END IF
11056
         END IF
10909
   10 CONTINUE
11057
   10 CONTINUE
10910
      RETURN
11058
      RETURN
10911
*
11059
*
10912
*     End of ZGEQR2
11060
*     End of ZGEQR2
Line 11375... Line 11523...
11375
*> \author NAG Ltd.
11523
*> \author NAG Ltd.
11376
*
11524
*
11377
*> \ingroup gerfs
11525
*> \ingroup gerfs
11378
*
11526
*
11379
*  =====================================================================
11527
*  =====================================================================
11380
      SUBROUTINE ZGERFS( TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV, B, LDB,
11528
      SUBROUTINE ZGERFS( TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
-
 
11529
     $                   LDB,
11381
     $                   X, LDX, FERR, BERR, WORK, RWORK, INFO )
11530
     $                   X, LDX, FERR, BERR, WORK, RWORK, INFO )
11382
*
11531
*
11383
*  -- LAPACK computational routine --
11532
*  -- LAPACK computational routine --
11384
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
11533
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
11385
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
11534
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 11423... Line 11572...
11423
      LOGICAL            LSAME
11572
      LOGICAL            LSAME
11424
      DOUBLE PRECISION   DLAMCH
11573
      DOUBLE PRECISION   DLAMCH
11425
      EXTERNAL           LSAME, DLAMCH
11574
      EXTERNAL           LSAME, DLAMCH
11426
*     ..
11575
*     ..
11427
*     .. External Subroutines ..
11576
*     .. External Subroutines ..
11428
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZGEMV, ZGETRS, ZLACN2
11577
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZGEMV, ZGETRS,
-
 
11578
     $                   ZLACN2
11429
*     ..
11579
*     ..
11430
*     .. Intrinsic Functions ..
11580
*     .. Intrinsic Functions ..
11431
      INTRINSIC          ABS, DBLE, DIMAG, MAX
11581
      INTRINSIC          ABS, DBLE, DIMAG, MAX
11432
*     ..
11582
*     ..
11433
*     .. Statement Functions ..
11583
*     .. Statement Functions ..
Line 11501... Line 11651...
11501
*
11651
*
11502
*        Compute residual R = B - op(A) * X,
11652
*        Compute residual R = B - op(A) * X,
11503
*        where op(A) = A, A**T, or A**H, depending on TRANS.
11653
*        where op(A) = A, A**T, or A**H, depending on TRANS.
11504
*
11654
*
11505
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
11655
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
11506
         CALL ZGEMV( TRANS, N, N, -ONE, A, LDA, X( 1, J ), 1, ONE, WORK,
11656
         CALL ZGEMV( TRANS, N, N, -ONE, A, LDA, X( 1, J ), 1, ONE,
-
 
11657
     $               WORK,
11507
     $               1 )
11658
     $               1 )
11508
*
11659
*
11509
*        Compute componentwise relative backward error from formula
11660
*        Compute componentwise relative backward error from formula
11510
*
11661
*
11511
*        max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) )
11662
*        max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) )
Line 12105... Line 12256...
12105
      INTEGER            IDUM( 1 )
12256
      INTEGER            IDUM( 1 )
12106
      DOUBLE PRECISION   DUM( 1 )
12257
      DOUBLE PRECISION   DUM( 1 )
12107
      COMPLEX*16         CDUM( 1 )
12258
      COMPLEX*16         CDUM( 1 )
12108
*     ..
12259
*     ..
12109
*     .. External Subroutines ..
12260
*     .. External Subroutines ..
12110
      EXTERNAL           DBDSDC, DLASCL, XERBLA, ZGEBRD, ZGELQF, ZGEMM,
12261
      EXTERNAL           DBDSDC, DLASCL, XERBLA, ZGEBRD, ZGELQF,
-
 
12262
     $                   ZGEMM,
12111
     $                   ZGEQRF, ZLACP2, ZLACPY, ZLACRM, ZLARCM, ZLASCL,
12263
     $                   ZGEQRF, ZLACP2, ZLACPY, ZLACRM, ZLARCM, ZLASCL,
12112
     $                   ZLASET, ZUNGBR, ZUNGLQ, ZUNGQR, ZUNMBR
12264
     $                   ZLASET, ZUNGBR, ZUNGLQ, ZUNGQR, ZUNMBR
12113
*     ..
12265
*     ..
12114
*     .. External Functions ..
12266
*     .. External Functions ..
12115
      LOGICAL            LSAME, DISNAN
12267
      LOGICAL            LSAME, DISNAN
Line 12180... Line 12332...
12180
*
12332
*
12181
            CALL ZGEBRD( N, N, CDUM(1), N, DUM(1), DUM(1), CDUM(1),
12333
            CALL ZGEBRD( N, N, CDUM(1), N, DUM(1), DUM(1), CDUM(1),
12182
     $                   CDUM(1), CDUM(1), -1, IERR )
12334
     $                   CDUM(1), CDUM(1), -1, IERR )
12183
            LWORK_ZGEBRD_NN = INT( CDUM(1) )
12335
            LWORK_ZGEBRD_NN = INT( CDUM(1) )
12184
*
12336
*
12185
            CALL ZGEQRF( M, N, CDUM(1), M, CDUM(1), CDUM(1), -1, IERR )
12337
            CALL ZGEQRF( M, N, CDUM(1), M, CDUM(1), CDUM(1), -1,
-
 
12338
     $                   IERR )
12186
            LWORK_ZGEQRF_MN = INT( CDUM(1) )
12339
            LWORK_ZGEQRF_MN = INT( CDUM(1) )
12187
*
12340
*
12188
            CALL ZUNGBR( 'P', N, N, N, CDUM(1), N, CDUM(1), CDUM(1),
12341
            CALL ZUNGBR( 'P', N, N, N, CDUM(1), N, CDUM(1), CDUM(1),
12189
     $                   -1, IERR )
12342
     $                   -1, IERR )
12190
            LWORK_ZUNGBR_P_NN = INT( CDUM(1) )
12343
            LWORK_ZUNGBR_P_NN = INT( CDUM(1) )
Line 12321... Line 12474...
12321
*
12474
*
12322
            CALL ZGEBRD( M, M, CDUM(1), M, DUM(1), DUM(1), CDUM(1),
12475
            CALL ZGEBRD( M, M, CDUM(1), M, DUM(1), DUM(1), CDUM(1),
12323
     $                   CDUM(1), CDUM(1), -1, IERR )
12476
     $                   CDUM(1), CDUM(1), -1, IERR )
12324
            LWORK_ZGEBRD_MM = INT( CDUM(1) )
12477
            LWORK_ZGEBRD_MM = INT( CDUM(1) )
12325
*
12478
*
12326
            CALL ZGELQF( M, N, CDUM(1), M, CDUM(1), CDUM(1), -1, IERR )
12479
            CALL ZGELQF( M, N, CDUM(1), M, CDUM(1), CDUM(1), -1,
-
 
12480
     $                   IERR )
12327
            LWORK_ZGELQF_MN = INT( CDUM(1) )
12481
            LWORK_ZGELQF_MN = INT( CDUM(1) )
12328
*
12482
*
12329
            CALL ZUNGBR( 'P', M, N, M, CDUM(1), M, CDUM(1), CDUM(1),
12483
            CALL ZUNGBR( 'P', M, N, M, CDUM(1), M, CDUM(1), CDUM(1),
12330
     $                   -1, IERR )
12484
     $                   -1, IERR )
12331
            LWORK_ZUNGBR_P_MN = INT( CDUM(1) )
12485
            LWORK_ZUNGBR_P_MN = INT( CDUM(1) )
Line 12511... Line 12665...
12511
*              Compute A=Q*R
12665
*              Compute A=Q*R
12512
*              CWorkspace: need   N [tau] + N    [work]
12666
*              CWorkspace: need   N [tau] + N    [work]
12513
*              CWorkspace: prefer N [tau] + N*NB [work]
12667
*              CWorkspace: prefer N [tau] + N*NB [work]
12514
*              RWorkspace: need   0
12668
*              RWorkspace: need   0
12515
*
12669
*
12516
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
12670
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-
 
12671
     $                      WORK( NWORK ),
12517
     $                      LWORK-NWORK+1, IERR )
12672
     $                      LWORK-NWORK+1, IERR )
12518
*
12673
*
12519
*              Zero out below R
12674
*              Zero out below R
12520
*
12675
*
12521
               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
12676
               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
Line 12528... Line 12683...
12528
*              Bidiagonalize R in A
12683
*              Bidiagonalize R in A
12529
*              CWorkspace: need   2*N [tauq, taup] + N      [work]
12684
*              CWorkspace: need   2*N [tauq, taup] + N      [work]
12530
*              CWorkspace: prefer 2*N [tauq, taup] + 2*N*NB [work]
12685
*              CWorkspace: prefer 2*N [tauq, taup] + 2*N*NB [work]
12531
*              RWorkspace: need   N [e]
12686
*              RWorkspace: need   N [e]
12532
*
12687
*
12533
               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
12688
               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-
 
12689
     $                      WORK( ITAUQ ),
12534
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
12690
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
12535
     $                      IERR )
12691
     $                      IERR )
12536
               NRWORK = IE + N
12692
               NRWORK = IE + N
12537
*
12693
*
12538
*              Perform bidiagonal SVD, compute singular values only
12694
*              Perform bidiagonal SVD, compute singular values only
Line 12568... Line 12724...
12568
*              Compute A=Q*R
12724
*              Compute A=Q*R
12569
*              CWorkspace: need   N*N [U] + N*N [R] + N [tau] + N    [work]
12725
*              CWorkspace: need   N*N [U] + N*N [R] + N [tau] + N    [work]
12570
*              CWorkspace: prefer N*N [U] + N*N [R] + N [tau] + N*NB [work]
12726
*              CWorkspace: prefer N*N [U] + N*N [R] + N [tau] + N*NB [work]
12571
*              RWorkspace: need   0
12727
*              RWorkspace: need   0
12572
*
12728
*
12573
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
12729
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-
 
12730
     $                      WORK( NWORK ),
12574
     $                      LWORK-NWORK+1, IERR )
12731
     $                      LWORK-NWORK+1, IERR )
12575
*
12732
*
12576
*              Copy R to WORK( IR ), zeroing out below it
12733
*              Copy R to WORK( IR ), zeroing out below it
12577
*
12734
*
12578
               CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
12735
               CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
12579
               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, WORK( IR+1 ),
12736
               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-
 
12737
     $                      WORK( IR+1 ),
12580
     $                      LDWRKR )
12738
     $                      LDWRKR )
12581
*
12739
*
12582
*              Generate Q in A
12740
*              Generate Q in A
12583
*              CWorkspace: need   N*N [U] + N*N [R] + N [tau] + N    [work]
12741
*              CWorkspace: need   N*N [U] + N*N [R] + N [tau] + N    [work]
12584
*              CWorkspace: prefer N*N [U] + N*N [R] + N [tau] + N*NB [work]
12742
*              CWorkspace: prefer N*N [U] + N*N [R] + N [tau] + N*NB [work]
Line 12607... Line 12765...
12607
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12765
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12608
*
12766
*
12609
               IRU = IE + N
12767
               IRU = IE + N
12610
               IRVT = IRU + N*N
12768
               IRVT = IRU + N*N
12611
               NRWORK = IRVT + N*N
12769
               NRWORK = IRVT + N*N
12612
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
12770
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
12771
     $                      RWORK( IRU ),
12613
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12772
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12614
     $                      RWORK( NRWORK ), IWORK, INFO )
12773
     $                      RWORK( NRWORK ), IWORK, INFO )
12615
*
12774
*
12616
*              Copy real matrix RWORK(IRU) to complex matrix WORK(IU)
12775
*              Copy real matrix RWORK(IRU) to complex matrix WORK(IU)
12617
*              Overwrite WORK(IU) by the left singular vectors of R
12776
*              Overwrite WORK(IU) by the left singular vectors of R
Line 12619... Line 12778...
12619
*              CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + N*NB [work]
12778
*              CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + N*NB [work]
12620
*              RWorkspace: need   0
12779
*              RWorkspace: need   0
12621
*
12780
*
12622
               CALL ZLACP2( 'F', N, N, RWORK( IRU ), N, WORK( IU ),
12781
               CALL ZLACP2( 'F', N, N, RWORK( IRU ), N, WORK( IU ),
12623
     $                      LDWRKU )
12782
     $                      LDWRKU )
12624
               CALL ZUNMBR( 'Q', 'L', 'N', N, N, N, WORK( IR ), LDWRKR,
12783
               CALL ZUNMBR( 'Q', 'L', 'N', N, N, N, WORK( IR ),
-
 
12784
     $                      LDWRKR,
12625
     $                      WORK( ITAUQ ), WORK( IU ), LDWRKU,
12785
     $                      WORK( ITAUQ ), WORK( IU ), LDWRKU,
12626
     $                      WORK( NWORK ), LWORK-NWORK+1, IERR )
12786
     $                      WORK( NWORK ), LWORK-NWORK+1, IERR )
12627
*
12787
*
12628
*              Copy real matrix RWORK(IRVT) to complex matrix VT
12788
*              Copy real matrix RWORK(IRVT) to complex matrix VT
12629
*              Overwrite VT by the right singular vectors of R
12789
*              Overwrite VT by the right singular vectors of R
12630
*              CWorkspace: need   N*N [U] + N*N [R] + 2*N [tauq, taup] + N    [work]
12790
*              CWorkspace: need   N*N [U] + N*N [R] + 2*N [tauq, taup] + N    [work]
12631
*              CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + N*NB [work]
12791
*              CWorkspace: prefer N*N [U] + N*N [R] + 2*N [tauq, taup] + N*NB [work]
12632
*              RWorkspace: need   0
12792
*              RWorkspace: need   0
12633
*
12793
*
12634
               CALL ZLACP2( 'F', N, N, RWORK( IRVT ), N, VT, LDVT )
12794
               CALL ZLACP2( 'F', N, N, RWORK( IRVT ), N, VT, LDVT )
12635
               CALL ZUNMBR( 'P', 'R', 'C', N, N, N, WORK( IR ), LDWRKR,
12795
               CALL ZUNMBR( 'P', 'R', 'C', N, N, N, WORK( IR ),
-
 
12796
     $                      LDWRKR,
12636
     $                      WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
12797
     $                      WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
12637
     $                      LWORK-NWORK+1, IERR )
12798
     $                      LWORK-NWORK+1, IERR )
12638
*
12799
*
12639
*              Multiply Q in A by left singular vectors of R in
12800
*              Multiply Q in A by left singular vectors of R in
12640
*              WORK(IU), storing result in WORK(IR) and copying to A
12801
*              WORK(IU), storing result in WORK(IR) and copying to A
Line 12668... Line 12829...
12668
*              Compute A=Q*R
12829
*              Compute A=Q*R
12669
*              CWorkspace: need   N*N [R] + N [tau] + N    [work]
12830
*              CWorkspace: need   N*N [R] + N [tau] + N    [work]
12670
*              CWorkspace: prefer N*N [R] + N [tau] + N*NB [work]
12831
*              CWorkspace: prefer N*N [R] + N [tau] + N*NB [work]
12671
*              RWorkspace: need   0
12832
*              RWorkspace: need   0
12672
*
12833
*
12673
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
12834
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-
 
12835
     $                      WORK( NWORK ),
12674
     $                      LWORK-NWORK+1, IERR )
12836
     $                      LWORK-NWORK+1, IERR )
12675
*
12837
*
12676
*              Copy R to WORK(IR), zeroing out below it
12838
*              Copy R to WORK(IR), zeroing out below it
12677
*
12839
*
12678
               CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
12840
               CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
12679
               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, WORK( IR+1 ),
12841
               CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
-
 
12842
     $                      WORK( IR+1 ),
12680
     $                      LDWRKR )
12843
     $                      LDWRKR )
12681
*
12844
*
12682
*              Generate Q in A
12845
*              Generate Q in A
12683
*              CWorkspace: need   N*N [R] + N [tau] + N    [work]
12846
*              CWorkspace: need   N*N [R] + N [tau] + N    [work]
12684
*              CWorkspace: prefer N*N [R] + N [tau] + N*NB [work]
12847
*              CWorkspace: prefer N*N [R] + N [tau] + N*NB [work]
Line 12707... Line 12870...
12707
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12870
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12708
*
12871
*
12709
               IRU = IE + N
12872
               IRU = IE + N
12710
               IRVT = IRU + N*N
12873
               IRVT = IRU + N*N
12711
               NRWORK = IRVT + N*N
12874
               NRWORK = IRVT + N*N
12712
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
12875
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
12876
     $                      RWORK( IRU ),
12713
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12877
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12714
     $                      RWORK( NRWORK ), IWORK, INFO )
12878
     $                      RWORK( NRWORK ), IWORK, INFO )
12715
*
12879
*
12716
*              Copy real matrix RWORK(IRU) to complex matrix U
12880
*              Copy real matrix RWORK(IRU) to complex matrix U
12717
*              Overwrite U by left singular vectors of R
12881
*              Overwrite U by left singular vectors of R
12718
*              CWorkspace: need   N*N [R] + 2*N [tauq, taup] + N    [work]
12882
*              CWorkspace: need   N*N [R] + 2*N [tauq, taup] + N    [work]
12719
*              CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + N*NB [work]
12883
*              CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + N*NB [work]
12720
*              RWorkspace: need   0
12884
*              RWorkspace: need   0
12721
*
12885
*
12722
               CALL ZLACP2( 'F', N, N, RWORK( IRU ), N, U, LDU )
12886
               CALL ZLACP2( 'F', N, N, RWORK( IRU ), N, U, LDU )
12723
               CALL ZUNMBR( 'Q', 'L', 'N', N, N, N, WORK( IR ), LDWRKR,
12887
               CALL ZUNMBR( 'Q', 'L', 'N', N, N, N, WORK( IR ),
-
 
12888
     $                      LDWRKR,
12724
     $                      WORK( ITAUQ ), U, LDU, WORK( NWORK ),
12889
     $                      WORK( ITAUQ ), U, LDU, WORK( NWORK ),
12725
     $                      LWORK-NWORK+1, IERR )
12890
     $                      LWORK-NWORK+1, IERR )
12726
*
12891
*
12727
*              Copy real matrix RWORK(IRVT) to complex matrix VT
12892
*              Copy real matrix RWORK(IRVT) to complex matrix VT
12728
*              Overwrite VT by right singular vectors of R
12893
*              Overwrite VT by right singular vectors of R
12729
*              CWorkspace: need   N*N [R] + 2*N [tauq, taup] + N    [work]
12894
*              CWorkspace: need   N*N [R] + 2*N [tauq, taup] + N    [work]
12730
*              CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + N*NB [work]
12895
*              CWorkspace: prefer N*N [R] + 2*N [tauq, taup] + N*NB [work]
12731
*              RWorkspace: need   0
12896
*              RWorkspace: need   0
12732
*
12897
*
12733
               CALL ZLACP2( 'F', N, N, RWORK( IRVT ), N, VT, LDVT )
12898
               CALL ZLACP2( 'F', N, N, RWORK( IRVT ), N, VT, LDVT )
12734
               CALL ZUNMBR( 'P', 'R', 'C', N, N, N, WORK( IR ), LDWRKR,
12899
               CALL ZUNMBR( 'P', 'R', 'C', N, N, N, WORK( IR ),
-
 
12900
     $                      LDWRKR,
12735
     $                      WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
12901
     $                      WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
12736
     $                      LWORK-NWORK+1, IERR )
12902
     $                      LWORK-NWORK+1, IERR )
12737
*
12903
*
12738
*              Multiply Q in A by left singular vectors of R in
12904
*              Multiply Q in A by left singular vectors of R in
12739
*              WORK(IR), storing result in U
12905
*              WORK(IR), storing result in U
12740
*              CWorkspace: need   N*N [R]
12906
*              CWorkspace: need   N*N [R]
12741
*              RWorkspace: need   0
12907
*              RWorkspace: need   0
12742
*
12908
*
12743
               CALL ZLACPY( 'F', N, N, U, LDU, WORK( IR ), LDWRKR )
12909
               CALL ZLACPY( 'F', N, N, U, LDU, WORK( IR ), LDWRKR )
12744
               CALL ZGEMM( 'N', 'N', M, N, N, CONE, A, LDA, WORK( IR ),
12910
               CALL ZGEMM( 'N', 'N', M, N, N, CONE, A, LDA,
-
 
12911
     $                     WORK( IR ),
12745
     $                     LDWRKR, CZERO, U, LDU )
12912
     $                     LDWRKR, CZERO, U, LDU )
12746
*
12913
*
12747
            ELSE IF( WNTQA ) THEN
12914
            ELSE IF( WNTQA ) THEN
12748
*
12915
*
12749
*              Path 4 (M >> N, JOBZ='A')
12916
*              Path 4 (M >> N, JOBZ='A')
Line 12761... Line 12928...
12761
*              Compute A=Q*R, copying result to U
12928
*              Compute A=Q*R, copying result to U
12762
*              CWorkspace: need   N*N [U] + N [tau] + N    [work]
12929
*              CWorkspace: need   N*N [U] + N [tau] + N    [work]
12763
*              CWorkspace: prefer N*N [U] + N [tau] + N*NB [work]
12930
*              CWorkspace: prefer N*N [U] + N [tau] + N*NB [work]
12764
*              RWorkspace: need   0
12931
*              RWorkspace: need   0
12765
*
12932
*
12766
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
12933
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-
 
12934
     $                      WORK( NWORK ),
12767
     $                      LWORK-NWORK+1, IERR )
12935
     $                      LWORK-NWORK+1, IERR )
12768
               CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
12936
               CALL ZLACPY( 'L', M, N, A, LDA, U, LDU )
12769
*
12937
*
12770
*              Generate Q in U
12938
*              Generate Q in U
12771
*              CWorkspace: need   N*N [U] + N [tau] + M    [work]
12939
*              CWorkspace: need   N*N [U] + N [tau] + M    [work]
Line 12787... Line 12955...
12787
*              Bidiagonalize R in A
12955
*              Bidiagonalize R in A
12788
*              CWorkspace: need   N*N [U] + 2*N [tauq, taup] + N      [work]
12956
*              CWorkspace: need   N*N [U] + 2*N [tauq, taup] + N      [work]
12789
*              CWorkspace: prefer N*N [U] + 2*N [tauq, taup] + 2*N*NB [work]
12957
*              CWorkspace: prefer N*N [U] + 2*N [tauq, taup] + 2*N*NB [work]
12790
*              RWorkspace: need   N [e]
12958
*              RWorkspace: need   N [e]
12791
*
12959
*
12792
               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
12960
               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-
 
12961
     $                      WORK( ITAUQ ),
12793
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
12962
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
12794
     $                      IERR )
12963
     $                      IERR )
12795
               IRU = IE + N
12964
               IRU = IE + N
12796
               IRVT = IRU + N*N
12965
               IRVT = IRU + N*N
12797
               NRWORK = IRVT + N*N
12966
               NRWORK = IRVT + N*N
Line 12800... Line 12969...
12800
*              of bidiagonal matrix in RWORK(IRU) and computing right
12969
*              of bidiagonal matrix in RWORK(IRU) and computing right
12801
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
12970
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
12802
*              CWorkspace: need   0
12971
*              CWorkspace: need   0
12803
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12972
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12804
*
12973
*
12805
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
12974
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
12975
     $                      RWORK( IRU ),
12806
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12976
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12807
     $                      RWORK( NRWORK ), IWORK, INFO )
12977
     $                      RWORK( NRWORK ), IWORK, INFO )
12808
*
12978
*
12809
*              Copy real matrix RWORK(IRU) to complex matrix WORK(IU)
12979
*              Copy real matrix RWORK(IRU) to complex matrix WORK(IU)
12810
*              Overwrite WORK(IU) by left singular vectors of R
12980
*              Overwrite WORK(IU) by left singular vectors of R
Line 12832... Line 13002...
12832
*              Multiply Q in U by left singular vectors of R in
13002
*              Multiply Q in U by left singular vectors of R in
12833
*              WORK(IU), storing result in A
13003
*              WORK(IU), storing result in A
12834
*              CWorkspace: need   N*N [U]
13004
*              CWorkspace: need   N*N [U]
12835
*              RWorkspace: need   0
13005
*              RWorkspace: need   0
12836
*
13006
*
12837
               CALL ZGEMM( 'N', 'N', M, N, N, CONE, U, LDU, WORK( IU ),
13007
               CALL ZGEMM( 'N', 'N', M, N, N, CONE, U, LDU,
-
 
13008
     $                     WORK( IU ),
12838
     $                     LDWRKU, CZERO, A, LDA )
13009
     $                     LDWRKU, CZERO, A, LDA )
12839
*
13010
*
12840
*              Copy left singular vectors of A from A to U
13011
*              Copy left singular vectors of A from A to U
12841
*
13012
*
12842
               CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
13013
               CALL ZLACPY( 'F', M, N, A, LDA, U, LDU )
Line 12870... Line 13041...
12870
*              Path 5n (M >> N, JOBZ='N')
13041
*              Path 5n (M >> N, JOBZ='N')
12871
*              Compute singular values only
13042
*              Compute singular values only
12872
*              CWorkspace: need   0
13043
*              CWorkspace: need   0
12873
*              RWorkspace: need   N [e] + BDSPAC
13044
*              RWorkspace: need   N [e] + BDSPAC
12874
*
13045
*
12875
               CALL DBDSDC( 'U', 'N', N, S, RWORK( IE ), DUM, 1,DUM,1,
13046
               CALL DBDSDC( 'U', 'N', N, S, RWORK( IE ), DUM, 1,DUM,
-
 
13047
     $                      1,
12876
     $                      DUM, IDUM, RWORK( NRWORK ), IWORK, INFO )
13048
     $                      DUM, IDUM, RWORK( NRWORK ), IWORK, INFO )
12877
            ELSE IF( WNTQO ) THEN
13049
            ELSE IF( WNTQO ) THEN
12878
               IU = NWORK
13050
               IU = NWORK
12879
               IRU = NRWORK
13051
               IRU = NRWORK
12880
               IRVT = IRU + N*N
13052
               IRVT = IRU + N*N
Line 12915... Line 13087...
12915
*              of bidiagonal matrix in RWORK(IRU) and computing right
13087
*              of bidiagonal matrix in RWORK(IRU) and computing right
12916
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
13088
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
12917
*              CWorkspace: need   0
13089
*              CWorkspace: need   0
12918
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13090
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12919
*
13091
*
12920
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
13092
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
13093
     $                      RWORK( IRU ),
12921
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13094
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12922
     $                      RWORK( NRWORK ), IWORK, INFO )
13095
     $                      RWORK( NRWORK ), IWORK, INFO )
12923
*
13096
*
12924
*              Multiply real matrix RWORK(IRVT) by P**H in VT,
13097
*              Multiply real matrix RWORK(IRVT) by P**H in VT,
12925
*              storing the result in WORK(IU), copying to VT
13098
*              storing the result in WORK(IU), copying to VT
Line 12938... Line 13111...
12938
*              RWorkspace: prefer N [e] + N*N [RU] + 2*M*N [rwork] < N + 5*N*N since M < 2*N here
13111
*              RWorkspace: prefer N [e] + N*N [RU] + 2*M*N [rwork] < N + 5*N*N since M < 2*N here
12939
*
13112
*
12940
               NRWORK = IRVT
13113
               NRWORK = IRVT
12941
               DO 20 I = 1, M, LDWRKU
13114
               DO 20 I = 1, M, LDWRKU
12942
                  CHUNK = MIN( M-I+1, LDWRKU )
13115
                  CHUNK = MIN( M-I+1, LDWRKU )
12943
                  CALL ZLACRM( CHUNK, N, A( I, 1 ), LDA, RWORK( IRU ),
13116
                  CALL ZLACRM( CHUNK, N, A( I, 1 ), LDA,
-
 
13117
     $                         RWORK( IRU ),
12944
     $                         N, WORK( IU ), LDWRKU, RWORK( NRWORK ) )
13118
     $                         N, WORK( IU ), LDWRKU, RWORK( NRWORK ) )
12945
                  CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
13119
                  CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
12946
     $                         A( I, 1 ), LDA )
13120
     $                         A( I, 1 ), LDA )
12947
   20          CONTINUE
13121
   20          CONTINUE
12948
*
13122
*
Line 12974... Line 13148...
12974
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13148
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
12975
*
13149
*
12976
               IRU = NRWORK
13150
               IRU = NRWORK
12977
               IRVT = IRU + N*N
13151
               IRVT = IRU + N*N
12978
               NRWORK = IRVT + N*N
13152
               NRWORK = IRVT + N*N
12979
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
13153
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
13154
     $                      RWORK( IRU ),
12980
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13155
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
12981
     $                      RWORK( NRWORK ), IWORK, INFO )
13156
     $                      RWORK( NRWORK ), IWORK, INFO )
12982
*
13157
*
12983
*              Multiply real matrix RWORK(IRVT) by P**H in VT,
13158
*              Multiply real matrix RWORK(IRVT) by P**H in VT,
12984
*              storing the result in A, copying to VT
13159
*              storing the result in A, copying to VT
Line 13026... Line 13201...
13026
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13201
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13027
*
13202
*
13028
               IRU = NRWORK
13203
               IRU = NRWORK
13029
               IRVT = IRU + N*N
13204
               IRVT = IRU + N*N
13030
               NRWORK = IRVT + N*N
13205
               NRWORK = IRVT + N*N
13031
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
13206
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
13207
     $                      RWORK( IRU ),
13032
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13208
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13033
     $                      RWORK( NRWORK ), IWORK, INFO )
13209
     $                      RWORK( NRWORK ), IWORK, INFO )
13034
*
13210
*
13035
*              Multiply real matrix RWORK(IRVT) by P**H in VT,
13211
*              Multiply real matrix RWORK(IRVT) by P**H in VT,
13036
*              storing the result in A, copying to VT
13212
*              storing the result in A, copying to VT
Line 13106... Line 13282...
13106
*              of bidiagonal matrix in RWORK(IRU) and computing right
13282
*              of bidiagonal matrix in RWORK(IRU) and computing right
13107
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
13283
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
13108
*              CWorkspace: need   0
13284
*              CWorkspace: need   0
13109
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13285
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13110
*
13286
*
13111
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
13287
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
13288
     $                      RWORK( IRU ),
13112
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13289
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13113
     $                      RWORK( NRWORK ), IWORK, INFO )
13290
     $                      RWORK( NRWORK ), IWORK, INFO )
13114
*
13291
*
13115
*              Copy real matrix RWORK(IRVT) to complex matrix VT
13292
*              Copy real matrix RWORK(IRVT) to complex matrix VT
13116
*              Overwrite VT by right singular vectors of A
13293
*              Overwrite VT by right singular vectors of A
Line 13133... Line 13310...
13133
*                 CWorkspace: prefer 2*N [tauq, taup] + M*N [U] + N*NB [work]
13310
*                 CWorkspace: prefer 2*N [tauq, taup] + M*N [U] + N*NB [work]
13134
*                 RWorkspace: need   N [e] + N*N [RU]
13311
*                 RWorkspace: need   N [e] + N*N [RU]
13135
*
13312
*
13136
                  CALL ZLASET( 'F', M, N, CZERO, CZERO, WORK( IU ),
13313
                  CALL ZLASET( 'F', M, N, CZERO, CZERO, WORK( IU ),
13137
     $                         LDWRKU )
13314
     $                         LDWRKU )
13138
                  CALL ZLACP2( 'F', N, N, RWORK( IRU ), N, WORK( IU ),
13315
                  CALL ZLACP2( 'F', N, N, RWORK( IRU ), N,
-
 
13316
     $                         WORK( IU ),
13139
     $                         LDWRKU )
13317
     $                         LDWRKU )
13140
                  CALL ZUNMBR( 'Q', 'L', 'N', M, N, N, A, LDA,
13318
                  CALL ZUNMBR( 'Q', 'L', 'N', M, N, N, A, LDA,
13141
     $                         WORK( ITAUQ ), WORK( IU ), LDWRKU,
13319
     $                         WORK( ITAUQ ), WORK( IU ), LDWRKU,
13142
     $                         WORK( NWORK ), LWORK-NWORK+1, IERR )
13320
     $                         WORK( NWORK ), LWORK-NWORK+1, IERR )
13143
                  CALL ZLACPY( 'F', M, N, WORK( IU ), LDWRKU, A, LDA )
13321
                  CALL ZLACPY( 'F', M, N, WORK( IU ), LDWRKU, A,
-
 
13322
     $                         LDA )
13144
               ELSE
13323
               ELSE
13145
*
13324
*
13146
*                 Path 6o-slow
13325
*                 Path 6o-slow
13147
*                 Generate Q in A
13326
*                 Generate Q in A
13148
*                 CWorkspace: need   2*N [tauq, taup] + N*N [U] + N    [work]
13327
*                 CWorkspace: need   2*N [tauq, taup] + N*N [U] + N    [work]
Line 13180... Line 13359...
13180
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13359
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13181
*
13360
*
13182
               IRU = NRWORK
13361
               IRU = NRWORK
13183
               IRVT = IRU + N*N
13362
               IRVT = IRU + N*N
13184
               NRWORK = IRVT + N*N
13363
               NRWORK = IRVT + N*N
13185
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
13364
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
13365
     $                      RWORK( IRU ),
13186
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13366
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13187
     $                      RWORK( NRWORK ), IWORK, INFO )
13367
     $                      RWORK( NRWORK ), IWORK, INFO )
13188
*
13368
*
13189
*              Copy real matrix RWORK(IRU) to complex matrix U
13369
*              Copy real matrix RWORK(IRU) to complex matrix U
13190
*              Overwrite U by left singular vectors of A
13370
*              Overwrite U by left singular vectors of A
Line 13218... Line 13398...
13218
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13398
*              RWorkspace: need   N [e] + N*N [RU] + N*N [RVT] + BDSPAC
13219
*
13399
*
13220
               IRU = NRWORK
13400
               IRU = NRWORK
13221
               IRVT = IRU + N*N
13401
               IRVT = IRU + N*N
13222
               NRWORK = IRVT + N*N
13402
               NRWORK = IRVT + N*N
13223
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ), RWORK( IRU ),
13403
               CALL DBDSDC( 'U', 'I', N, S, RWORK( IE ),
-
 
13404
     $                      RWORK( IRU ),
13224
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13405
     $                      N, RWORK( IRVT ), N, DUM, IDUM,
13225
     $                      RWORK( NRWORK ), IWORK, INFO )
13406
     $                      RWORK( NRWORK ), IWORK, INFO )
13226
*
13407
*
13227
*              Set the right corner of U to identity matrix
13408
*              Set the right corner of U to identity matrix
13228
*
13409
*
Line 13276... Line 13457...
13276
*              Compute A=L*Q
13457
*              Compute A=L*Q
13277
*              CWorkspace: need   M [tau] + M    [work]
13458
*              CWorkspace: need   M [tau] + M    [work]
13278
*              CWorkspace: prefer M [tau] + M*NB [work]
13459
*              CWorkspace: prefer M [tau] + M*NB [work]
13279
*              RWorkspace: need   0
13460
*              RWorkspace: need   0
13280
*
13461
*
13281
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
13462
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-
 
13463
     $                      WORK( NWORK ),
13282
     $                      LWORK-NWORK+1, IERR )
13464
     $                      LWORK-NWORK+1, IERR )
13283
*
13465
*
13284
*              Zero out above L
13466
*              Zero out above L
13285
*
13467
*
13286
               CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
13468
               CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
Line 13293... Line 13475...
13293
*              Bidiagonalize L in A
13475
*              Bidiagonalize L in A
13294
*              CWorkspace: need   2*M [tauq, taup] + M      [work]
13476
*              CWorkspace: need   2*M [tauq, taup] + M      [work]
13295
*              CWorkspace: prefer 2*M [tauq, taup] + 2*M*NB [work]
13477
*              CWorkspace: prefer 2*M [tauq, taup] + 2*M*NB [work]
13296
*              RWorkspace: need   M [e]
13478
*              RWorkspace: need   M [e]
13297
*
13479
*
13298
               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
13480
               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-
 
13481
     $                      WORK( ITAUQ ),
13299
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
13482
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
13300
     $                      IERR )
13483
     $                      IERR )
13301
               NRWORK = IE + M
13484
               NRWORK = IE + M
13302
*
13485
*
13303
*              Perform bidiagonal SVD, compute singular values only
13486
*              Perform bidiagonal SVD, compute singular values only
Line 13338... Line 13521...
13338
*              Compute A=L*Q
13521
*              Compute A=L*Q
13339
*              CWorkspace: need   M*M [VT] + M*M [L] + M [tau] + M    [work]
13522
*              CWorkspace: need   M*M [VT] + M*M [L] + M [tau] + M    [work]
13340
*              CWorkspace: prefer M*M [VT] + M*M [L] + M [tau] + M*NB [work]
13523
*              CWorkspace: prefer M*M [VT] + M*M [L] + M [tau] + M*NB [work]
13341
*              RWorkspace: need   0
13524
*              RWorkspace: need   0
13342
*
13525
*
13343
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
13526
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-
 
13527
     $                      WORK( NWORK ),
13344
     $                      LWORK-NWORK+1, IERR )
13528
     $                      LWORK-NWORK+1, IERR )
13345
*
13529
*
13346
*              Copy L to WORK(IL), zeroing about above it
13530
*              Copy L to WORK(IL), zeroing about above it
13347
*
13531
*
13348
               CALL ZLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWRKL )
13532
               CALL ZLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWRKL )
Line 13377... Line 13561...
13377
*              RWorkspace: need   M [e] + M*M [RU] + M*M [RVT] + BDSPAC
13561
*              RWorkspace: need   M [e] + M*M [RU] + M*M [RVT] + BDSPAC
13378
*
13562
*
13379
               IRU = IE + M
13563
               IRU = IE + M
13380
               IRVT = IRU + M*M
13564
               IRVT = IRU + M*M
13381
               NRWORK = IRVT + M*M
13565
               NRWORK = IRVT + M*M
13382
               CALL DBDSDC( 'U', 'I', M, S, RWORK( IE ), RWORK( IRU ),
13566
               CALL DBDSDC( 'U', 'I', M, S, RWORK( IE ),
-
 
13567
     $                      RWORK( IRU ),
13383
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13568
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13384
     $                      RWORK( NRWORK ), IWORK, INFO )
13569
     $                      RWORK( NRWORK ), IWORK, INFO )
13385
*
13570
*
13386
*              Copy real matrix RWORK(IRU) to complex matrix WORK(IU)
13571
*              Copy real matrix RWORK(IRU) to complex matrix WORK(IU)
13387
*              Overwrite WORK(IU) by the left singular vectors of L
13572
*              Overwrite WORK(IU) by the left singular vectors of L
13388
*              CWorkspace: need   M*M [VT] + M*M [L] + 2*M [tauq, taup] + M    [work]
13573
*              CWorkspace: need   M*M [VT] + M*M [L] + 2*M [tauq, taup] + M    [work]
13389
*              CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + M*NB [work]
13574
*              CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + M*NB [work]
13390
*              RWorkspace: need   0
13575
*              RWorkspace: need   0
13391
*
13576
*
13392
               CALL ZLACP2( 'F', M, M, RWORK( IRU ), M, U, LDU )
13577
               CALL ZLACP2( 'F', M, M, RWORK( IRU ), M, U, LDU )
13393
               CALL ZUNMBR( 'Q', 'L', 'N', M, M, M, WORK( IL ), LDWRKL,
13578
               CALL ZUNMBR( 'Q', 'L', 'N', M, M, M, WORK( IL ),
-
 
13579
     $                      LDWRKL,
13394
     $                      WORK( ITAUQ ), U, LDU, WORK( NWORK ),
13580
     $                      WORK( ITAUQ ), U, LDU, WORK( NWORK ),
13395
     $                      LWORK-NWORK+1, IERR )
13581
     $                      LWORK-NWORK+1, IERR )
13396
*
13582
*
13397
*              Copy real matrix RWORK(IRVT) to complex matrix WORK(IVT)
13583
*              Copy real matrix RWORK(IRVT) to complex matrix WORK(IVT)
13398
*              Overwrite WORK(IVT) by the right singular vectors of L
13584
*              Overwrite WORK(IVT) by the right singular vectors of L
Line 13400... Line 13586...
13400
*              CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + M*NB [work]
13586
*              CWorkspace: prefer M*M [VT] + M*M [L] + 2*M [tauq, taup] + M*NB [work]
13401
*              RWorkspace: need   0
13587
*              RWorkspace: need   0
13402
*
13588
*
13403
               CALL ZLACP2( 'F', M, M, RWORK( IRVT ), M, WORK( IVT ),
13589
               CALL ZLACP2( 'F', M, M, RWORK( IRVT ), M, WORK( IVT ),
13404
     $                      LDWKVT )
13590
     $                      LDWKVT )
13405
               CALL ZUNMBR( 'P', 'R', 'C', M, M, M, WORK( IL ), LDWRKL,
13591
               CALL ZUNMBR( 'P', 'R', 'C', M, M, M, WORK( IL ),
-
 
13592
     $                      LDWRKL,
13406
     $                      WORK( ITAUP ), WORK( IVT ), LDWKVT,
13593
     $                      WORK( ITAUP ), WORK( IVT ), LDWKVT,
13407
     $                      WORK( NWORK ), LWORK-NWORK+1, IERR )
13594
     $                      WORK( NWORK ), LWORK-NWORK+1, IERR )
13408
*
13595
*
13409
*              Multiply right singular vectors of L in WORK(IL) by Q
13596
*              Multiply right singular vectors of L in WORK(IL) by Q
13410
*              in A, storing result in WORK(IL) and copying to A
13597
*              in A, storing result in WORK(IL) and copying to A
Line 13412... Line 13599...
13412
*              CWorkspace: prefer M*M [VT] + M*N [L]
13599
*              CWorkspace: prefer M*M [VT] + M*N [L]
13413
*              RWorkspace: need   0
13600
*              RWorkspace: need   0
13414
*
13601
*
13415
               DO 40 I = 1, N, CHUNK
13602
               DO 40 I = 1, N, CHUNK
13416
                  BLK = MIN( N-I+1, CHUNK )
13603
                  BLK = MIN( N-I+1, CHUNK )
13417
                  CALL ZGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IVT ), M,
13604
                  CALL ZGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IVT ),
-
 
13605
     $                        M,
13418
     $                        A( 1, I ), LDA, CZERO, WORK( IL ),
13606
     $                        A( 1, I ), LDA, CZERO, WORK( IL ),
13419
     $                        LDWRKL )
13607
     $                        LDWRKL )
13420
                  CALL ZLACPY( 'F', M, BLK, WORK( IL ), LDWRKL,
13608
                  CALL ZLACPY( 'F', M, BLK, WORK( IL ), LDWRKL,
13421
     $                         A( 1, I ), LDA )
13609
     $                         A( 1, I ), LDA )
13422
   40          CONTINUE
13610
   40          CONTINUE
Line 13438... Line 13626...
13438
*              Compute A=L*Q
13626
*              Compute A=L*Q
13439
*              CWorkspace: need   M*M [L] + M [tau] + M    [work]
13627
*              CWorkspace: need   M*M [L] + M [tau] + M    [work]
13440
*              CWorkspace: prefer M*M [L] + M [tau] + M*NB [work]
13628
*              CWorkspace: prefer M*M [L] + M [tau] + M*NB [work]
13441
*              RWorkspace: need   0
13629
*              RWorkspace: need   0
13442
*
13630
*
13443
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
13631
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-
 
13632
     $                      WORK( NWORK ),
13444
     $                      LWORK-NWORK+1, IERR )
13633
     $                      LWORK-NWORK+1, IERR )
13445
*
13634
*
13446
*              Copy L to WORK(IL), zeroing out above it
13635
*              Copy L to WORK(IL), zeroing out above it
13447
*
13636
*
13448
               CALL ZLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWRKL )
13637
               CALL ZLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWRKL )
Line 13477... Line 13666...
13477
*              RWorkspace: need   M [e] + M*M [RU] + M*M [RVT] + BDSPAC
13666
*              RWorkspace: need   M [e] + M*M [RU] + M*M [RVT] + BDSPAC
13478
*
13667
*
13479
               IRU = IE + M
13668
               IRU = IE + M
13480
               IRVT = IRU + M*M
13669
               IRVT = IRU + M*M
13481
               NRWORK = IRVT + M*M
13670
               NRWORK = IRVT + M*M
13482
               CALL DBDSDC( 'U', 'I', M, S, RWORK( IE ), RWORK( IRU ),
13671
               CALL DBDSDC( 'U', 'I', M, S, RWORK( IE ),
-
 
13672
     $                      RWORK( IRU ),
13483
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13673
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13484
     $                      RWORK( NRWORK ), IWORK, INFO )
13674
     $                      RWORK( NRWORK ), IWORK, INFO )
13485
*
13675
*
13486
*              Copy real matrix RWORK(IRU) to complex matrix U
13676
*              Copy real matrix RWORK(IRU) to complex matrix U
13487
*              Overwrite U by left singular vectors of L
13677
*              Overwrite U by left singular vectors of L
13488
*              CWorkspace: need   M*M [L] + 2*M [tauq, taup] + M    [work]
13678
*              CWorkspace: need   M*M [L] + 2*M [tauq, taup] + M    [work]
13489
*              CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + M*NB [work]
13679
*              CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + M*NB [work]
13490
*              RWorkspace: need   0
13680
*              RWorkspace: need   0
13491
*
13681
*
13492
               CALL ZLACP2( 'F', M, M, RWORK( IRU ), M, U, LDU )
13682
               CALL ZLACP2( 'F', M, M, RWORK( IRU ), M, U, LDU )
13493
               CALL ZUNMBR( 'Q', 'L', 'N', M, M, M, WORK( IL ), LDWRKL,
13683
               CALL ZUNMBR( 'Q', 'L', 'N', M, M, M, WORK( IL ),
-
 
13684
     $                      LDWRKL,
13494
     $                      WORK( ITAUQ ), U, LDU, WORK( NWORK ),
13685
     $                      WORK( ITAUQ ), U, LDU, WORK( NWORK ),
13495
     $                      LWORK-NWORK+1, IERR )
13686
     $                      LWORK-NWORK+1, IERR )
13496
*
13687
*
13497
*              Copy real matrix RWORK(IRVT) to complex matrix VT
13688
*              Copy real matrix RWORK(IRVT) to complex matrix VT
13498
*              Overwrite VT by left singular vectors of L
13689
*              Overwrite VT by left singular vectors of L
13499
*              CWorkspace: need   M*M [L] + 2*M [tauq, taup] + M    [work]
13690
*              CWorkspace: need   M*M [L] + 2*M [tauq, taup] + M    [work]
13500
*              CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + M*NB [work]
13691
*              CWorkspace: prefer M*M [L] + 2*M [tauq, taup] + M*NB [work]
13501
*              RWorkspace: need   0
13692
*              RWorkspace: need   0
13502
*
13693
*
13503
               CALL ZLACP2( 'F', M, M, RWORK( IRVT ), M, VT, LDVT )
13694
               CALL ZLACP2( 'F', M, M, RWORK( IRVT ), M, VT, LDVT )
13504
               CALL ZUNMBR( 'P', 'R', 'C', M, M, M, WORK( IL ), LDWRKL,
13695
               CALL ZUNMBR( 'P', 'R', 'C', M, M, M, WORK( IL ),
-
 
13696
     $                      LDWRKL,
13505
     $                      WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
13697
     $                      WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
13506
     $                      LWORK-NWORK+1, IERR )
13698
     $                      LWORK-NWORK+1, IERR )
13507
*
13699
*
13508
*              Copy VT to WORK(IL), multiply right singular vectors of L
13700
*              Copy VT to WORK(IL), multiply right singular vectors of L
13509
*              in WORK(IL) by Q in A, storing result in VT
13701
*              in WORK(IL) by Q in A, storing result in VT
13510
*              CWorkspace: need   M*M [L]
13702
*              CWorkspace: need   M*M [L]
13511
*              RWorkspace: need   0
13703
*              RWorkspace: need   0
13512
*
13704
*
13513
               CALL ZLACPY( 'F', M, M, VT, LDVT, WORK( IL ), LDWRKL )
13705
               CALL ZLACPY( 'F', M, M, VT, LDVT, WORK( IL ), LDWRKL )
13514
               CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IL ), LDWRKL,
13706
               CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IL ),
-
 
13707
     $                     LDWRKL,
13515
     $                     A, LDA, CZERO, VT, LDVT )
13708
     $                     A, LDA, CZERO, VT, LDVT )
13516
*
13709
*
13517
            ELSE IF( WNTQA ) THEN
13710
            ELSE IF( WNTQA ) THEN
13518
*
13711
*
13519
*              Path 4t (N >> M, JOBZ='A')
13712
*              Path 4t (N >> M, JOBZ='A')
Line 13531... Line 13724...
13531
*              Compute A=L*Q, copying result to VT
13724
*              Compute A=L*Q, copying result to VT
13532
*              CWorkspace: need   M*M [VT] + M [tau] + M    [work]
13725
*              CWorkspace: need   M*M [VT] + M [tau] + M    [work]
13533
*              CWorkspace: prefer M*M [VT] + M [tau] + M*NB [work]
13726
*              CWorkspace: prefer M*M [VT] + M [tau] + M*NB [work]
13534
*              RWorkspace: need   0
13727
*              RWorkspace: need   0
13535
*
13728
*
13536
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
13729
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-
 
13730
     $                      WORK( NWORK ),
13537
     $                      LWORK-NWORK+1, IERR )
13731
     $                      LWORK-NWORK+1, IERR )
13538
               CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
13732
               CALL ZLACPY( 'U', M, N, A, LDA, VT, LDVT )
13539
*
13733
*
13540
*              Generate Q in VT
13734
*              Generate Q in VT
13541
*              CWorkspace: need   M*M [VT] + M [tau] + N    [work]
13735
*              CWorkspace: need   M*M [VT] + M [tau] + N    [work]
Line 13557... Line 13751...
13557
*              Bidiagonalize L in A
13751
*              Bidiagonalize L in A
13558
*              CWorkspace: need   M*M [VT] + 2*M [tauq, taup] + M      [work]
13752
*              CWorkspace: need   M*M [VT] + 2*M [tauq, taup] + M      [work]
13559
*              CWorkspace: prefer M*M [VT] + 2*M [tauq, taup] + 2*M*NB [work]
13753
*              CWorkspace: prefer M*M [VT] + 2*M [tauq, taup] + 2*M*NB [work]
13560
*              RWorkspace: need   M [e]
13754
*              RWorkspace: need   M [e]
13561
*
13755
*
13562
               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
13756
               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-
 
13757
     $                      WORK( ITAUQ ),
13563
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
13758
     $                      WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
13564
     $                      IERR )
13759
     $                      IERR )
13565
*
13760
*
13566
*              Perform bidiagonal SVD, computing left singular vectors
13761
*              Perform bidiagonal SVD, computing left singular vectors
13567
*              of bidiagonal matrix in RWORK(IRU) and computing right
13762
*              of bidiagonal matrix in RWORK(IRU) and computing right
Line 13570... Line 13765...
13570
*              RWorkspace: need   M [e] + M*M [RU] + M*M [RVT] + BDSPAC
13765
*              RWorkspace: need   M [e] + M*M [RU] + M*M [RVT] + BDSPAC
13571
*
13766
*
13572
               IRU = IE + M
13767
               IRU = IE + M
13573
               IRVT = IRU + M*M
13768
               IRVT = IRU + M*M
13574
               NRWORK = IRVT + M*M
13769
               NRWORK = IRVT + M*M
13575
               CALL DBDSDC( 'U', 'I', M, S, RWORK( IE ), RWORK( IRU ),
13770
               CALL DBDSDC( 'U', 'I', M, S, RWORK( IE ),
-
 
13771
     $                      RWORK( IRU ),
13576
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13772
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13577
     $                      RWORK( NRWORK ), IWORK, INFO )
13773
     $                      RWORK( NRWORK ), IWORK, INFO )
13578
*
13774
*
13579
*              Copy real matrix RWORK(IRU) to complex matrix U
13775
*              Copy real matrix RWORK(IRU) to complex matrix U
13580
*              Overwrite U by left singular vectors of L
13776
*              Overwrite U by left singular vectors of L
Line 13602... Line 13798...
13602
*              Multiply right singular vectors of L in WORK(IVT) by
13798
*              Multiply right singular vectors of L in WORK(IVT) by
13603
*              Q in VT, storing result in A
13799
*              Q in VT, storing result in A
13604
*              CWorkspace: need   M*M [VT]
13800
*              CWorkspace: need   M*M [VT]
13605
*              RWorkspace: need   0
13801
*              RWorkspace: need   0
13606
*
13802
*
13607
               CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IVT ), LDWKVT,
13803
               CALL ZGEMM( 'N', 'N', M, N, M, CONE, WORK( IVT ),
-
 
13804
     $                     LDWKVT,
13608
     $                     VT, LDVT, CZERO, A, LDA )
13805
     $                     VT, LDVT, CZERO, A, LDA )
13609
*
13806
*
13610
*              Copy right singular vectors of A from A to VT
13807
*              Copy right singular vectors of A from A to VT
13611
*
13808
*
13612
               CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
13809
               CALL ZLACPY( 'F', M, N, A, LDA, VT, LDVT )
Line 13688... Line 13885...
13688
*              of bidiagonal matrix in RWORK(IRU) and computing right
13885
*              of bidiagonal matrix in RWORK(IRU) and computing right
13689
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
13886
*              singular vectors of bidiagonal matrix in RWORK(IRVT)
13690
*              CWorkspace: need   0
13887
*              CWorkspace: need   0
13691
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13888
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13692
*
13889
*
13693
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ), RWORK( IRU ),
13890
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ),
-
 
13891
     $                      RWORK( IRU ),
13694
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13892
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13695
     $                      RWORK( NRWORK ), IWORK, INFO )
13893
     $                      RWORK( NRWORK ), IWORK, INFO )
13696
*
13894
*
13697
*              Multiply Q in U by real matrix RWORK(IRVT)
13895
*              Multiply Q in U by real matrix RWORK(IRVT)
13698
*              storing the result in WORK(IVT), copying to U
13896
*              storing the result in WORK(IVT), copying to U
13699
*              CWorkspace: need   2*M [tauq, taup] + M*M [VT]
13897
*              CWorkspace: need   2*M [tauq, taup] + M*M [VT]
13700
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + 2*M*M [rwork]
13898
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + 2*M*M [rwork]
13701
*
13899
*
13702
               CALL ZLACRM( M, M, U, LDU, RWORK( IRU ), M, WORK( IVT ),
13900
               CALL ZLACRM( M, M, U, LDU, RWORK( IRU ), M,
-
 
13901
     $                      WORK( IVT ),
13703
     $                      LDWKVT, RWORK( NRWORK ) )
13902
     $                      LDWKVT, RWORK( NRWORK ) )
13704
               CALL ZLACPY( 'F', M, M, WORK( IVT ), LDWKVT, U, LDU )
13903
               CALL ZLACPY( 'F', M, M, WORK( IVT ), LDWKVT, U, LDU )
13705
*
13904
*
13706
*              Multiply RWORK(IRVT) by P**H in A, storing the
13905
*              Multiply RWORK(IRVT) by P**H in A, storing the
13707
*              result in WORK(IVT), copying to A
13906
*              result in WORK(IVT), copying to A
Line 13711... Line 13910...
13711
*              RWorkspace: prefer M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here
13910
*              RWorkspace: prefer M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here
13712
*
13911
*
13713
               NRWORK = IRU
13912
               NRWORK = IRU
13714
               DO 50 I = 1, N, CHUNK
13913
               DO 50 I = 1, N, CHUNK
13715
                  BLK = MIN( N-I+1, CHUNK )
13914
                  BLK = MIN( N-I+1, CHUNK )
13716
                  CALL ZLARCM( M, BLK, RWORK( IRVT ), M, A( 1, I ), LDA,
13915
                  CALL ZLARCM( M, BLK, RWORK( IRVT ), M, A( 1, I ),
-
 
13916
     $                         LDA,
13717
     $                         WORK( IVT ), LDWKVT, RWORK( NRWORK ) )
13917
     $                         WORK( IVT ), LDWKVT, RWORK( NRWORK ) )
13718
                  CALL ZLACPY( 'F', M, BLK, WORK( IVT ), LDWKVT,
13918
                  CALL ZLACPY( 'F', M, BLK, WORK( IVT ), LDWKVT,
13719
     $                         A( 1, I ), LDA )
13919
     $                         A( 1, I ), LDA )
13720
   50          CONTINUE
13920
   50          CONTINUE
13721
            ELSE IF( WNTQS ) THEN
13921
            ELSE IF( WNTQS ) THEN
Line 13746... Line 13946...
13746
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13946
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13747
*
13947
*
13748
               IRVT = NRWORK
13948
               IRVT = NRWORK
13749
               IRU = IRVT + M*M
13949
               IRU = IRVT + M*M
13750
               NRWORK = IRU + M*M
13950
               NRWORK = IRU + M*M
13751
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ), RWORK( IRU ),
13951
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ),
-
 
13952
     $                      RWORK( IRU ),
13752
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13953
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13753
     $                      RWORK( NRWORK ), IWORK, INFO )
13954
     $                      RWORK( NRWORK ), IWORK, INFO )
13754
*
13955
*
13755
*              Multiply Q in U by real matrix RWORK(IRU), storing the
13956
*              Multiply Q in U by real matrix RWORK(IRU), storing the
13756
*              result in A, copying to U
13957
*              result in A, copying to U
Line 13798... Line 13999...
13798
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13999
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13799
*
14000
*
13800
               IRVT = NRWORK
14001
               IRVT = NRWORK
13801
               IRU = IRVT + M*M
14002
               IRU = IRVT + M*M
13802
               NRWORK = IRU + M*M
14003
               NRWORK = IRU + M*M
13803
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ), RWORK( IRU ),
14004
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ),
-
 
14005
     $                      RWORK( IRU ),
13804
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
14006
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13805
     $                      RWORK( NRWORK ), IWORK, INFO )
14007
     $                      RWORK( NRWORK ), IWORK, INFO )
13806
*
14008
*
13807
*              Multiply Q in U by real matrix RWORK(IRU), storing the
14009
*              Multiply Q in U by real matrix RWORK(IRU), storing the
13808
*              result in A, copying to U
14010
*              result in A, copying to U
Line 13881... Line 14083...
13881
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
14083
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13882
*
14084
*
13883
               IRVT = NRWORK
14085
               IRVT = NRWORK
13884
               IRU = IRVT + M*M
14086
               IRU = IRVT + M*M
13885
               NRWORK = IRU + M*M
14087
               NRWORK = IRU + M*M
13886
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ), RWORK( IRU ),
14088
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ),
-
 
14089
     $                      RWORK( IRU ),
13887
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
14090
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13888
     $                      RWORK( NRWORK ), IWORK, INFO )
14091
     $                      RWORK( NRWORK ), IWORK, INFO )
13889
*
14092
*
13890
*              Copy real matrix RWORK(IRU) to complex matrix U
14093
*              Copy real matrix RWORK(IRU) to complex matrix U
13891
*              Overwrite U by left singular vectors of A
14094
*              Overwrite U by left singular vectors of A
Line 13906... Line 14109...
13906
*                 copying to A
14109
*                 copying to A
13907
*                 CWorkspace: need   2*M [tauq, taup] + M*N [VT] + M    [work]
14110
*                 CWorkspace: need   2*M [tauq, taup] + M*N [VT] + M    [work]
13908
*                 CWorkspace: prefer 2*M [tauq, taup] + M*N [VT] + M*NB [work]
14111
*                 CWorkspace: prefer 2*M [tauq, taup] + M*N [VT] + M*NB [work]
13909
*                 RWorkspace: need   M [e] + M*M [RVT]
14112
*                 RWorkspace: need   M [e] + M*M [RVT]
13910
*
14113
*
13911
                  CALL ZLACP2( 'F', M, M, RWORK( IRVT ), M, WORK( IVT ),
14114
                  CALL ZLACP2( 'F', M, M, RWORK( IRVT ), M,
-
 
14115
     $                         WORK( IVT ),
13912
     $                         LDWKVT )
14116
     $                         LDWKVT )
13913
                  CALL ZUNMBR( 'P', 'R', 'C', M, N, M, A, LDA,
14117
                  CALL ZUNMBR( 'P', 'R', 'C', M, N, M, A, LDA,
13914
     $                         WORK( ITAUP ), WORK( IVT ), LDWKVT,
14118
     $                         WORK( ITAUP ), WORK( IVT ), LDWKVT,
13915
     $                         WORK( NWORK ), LWORK-NWORK+1, IERR )
14119
     $                         WORK( NWORK ), LWORK-NWORK+1, IERR )
13916
                  CALL ZLACPY( 'F', M, N, WORK( IVT ), LDWKVT, A, LDA )
14120
                  CALL ZLACPY( 'F', M, N, WORK( IVT ), LDWKVT, A,
-
 
14121
     $                         LDA )
13917
               ELSE
14122
               ELSE
13918
*
14123
*
13919
*                 Path 6to-slow
14124
*                 Path 6to-slow
13920
*                 Generate P**H in A
14125
*                 Generate P**H in A
13921
*                 CWorkspace: need   2*M [tauq, taup] + M*M [VT] + M    [work]
14126
*                 CWorkspace: need   2*M [tauq, taup] + M*M [VT] + M    [work]
Line 13933... Line 14138...
13933
*                 RWorkspace: prefer M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here
14138
*                 RWorkspace: prefer M [e] + M*M [RVT] + 2*M*N [rwork] < M + 5*M*M since N < 2*M here
13934
*
14139
*
13935
                  NRWORK = IRU
14140
                  NRWORK = IRU
13936
                  DO 60 I = 1, N, CHUNK
14141
                  DO 60 I = 1, N, CHUNK
13937
                     BLK = MIN( N-I+1, CHUNK )
14142
                     BLK = MIN( N-I+1, CHUNK )
13938
                     CALL ZLARCM( M, BLK, RWORK( IRVT ), M, A( 1, I ),
14143
                     CALL ZLARCM( M, BLK, RWORK( IRVT ), M, A( 1,
-
 
14144
     $                            I ),
13939
     $                            LDA, WORK( IVT ), LDWKVT,
14145
     $                            LDA, WORK( IVT ), LDWKVT,
13940
     $                            RWORK( NRWORK ) )
14146
     $                            RWORK( NRWORK ) )
13941
                     CALL ZLACPY( 'F', M, BLK, WORK( IVT ), LDWKVT,
14147
                     CALL ZLACPY( 'F', M, BLK, WORK( IVT ), LDWKVT,
13942
     $                            A( 1, I ), LDA )
14148
     $                            A( 1, I ), LDA )
13943
   60             CONTINUE
14149
   60             CONTINUE
Line 13952... Line 14158...
13952
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
14158
*              RWorkspace: need   M [e] + M*M [RVT] + M*M [RU] + BDSPAC
13953
*
14159
*
13954
               IRVT = NRWORK
14160
               IRVT = NRWORK
13955
               IRU = IRVT + M*M
14161
               IRU = IRVT + M*M
13956
               NRWORK = IRU + M*M
14162
               NRWORK = IRU + M*M
13957
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ), RWORK( IRU ),
14163
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ),
-
 
14164
     $                      RWORK( IRU ),
13958
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
14165
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13959
     $                      RWORK( NRWORK ), IWORK, INFO )
14166
     $                      RWORK( NRWORK ), IWORK, INFO )
13960
*
14167
*
13961
*              Copy real matrix RWORK(IRU) to complex matrix U
14168
*              Copy real matrix RWORK(IRU) to complex matrix U
13962
*              Overwrite U by left singular vectors of A
14169
*              Overwrite U by left singular vectors of A
Line 13991... Line 14198...
13991
*
14198
*
13992
               IRVT = NRWORK
14199
               IRVT = NRWORK
13993
               IRU = IRVT + M*M
14200
               IRU = IRVT + M*M
13994
               NRWORK = IRU + M*M
14201
               NRWORK = IRU + M*M
13995
*
14202
*
13996
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ), RWORK( IRU ),
14203
               CALL DBDSDC( 'L', 'I', M, S, RWORK( IE ),
-
 
14204
     $                      RWORK( IRU ),
13997
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
14205
     $                      M, RWORK( IRVT ), M, DUM, IDUM,
13998
     $                      RWORK( NRWORK ), IWORK, INFO )
14206
     $                      RWORK( NRWORK ), IWORK, INFO )
13999
*
14207
*
14000
*              Copy real matrix RWORK(IRU) to complex matrix U
14208
*              Copy real matrix RWORK(IRU) to complex matrix U
14001
*              Overwrite U by left singular vectors of A
14209
*              Overwrite U by left singular vectors of A
Line 14484... Line 14692...
14484
*     .. Local Arrays ..
14692
*     .. Local Arrays ..
14485
      DOUBLE PRECISION   DUM( 1 )
14693
      DOUBLE PRECISION   DUM( 1 )
14486
      COMPLEX*16         CDUM( 1 )
14694
      COMPLEX*16         CDUM( 1 )
14487
*     ..
14695
*     ..
14488
*     .. External Subroutines ..
14696
*     .. External Subroutines ..
14489
      EXTERNAL           DLASCL, XERBLA, ZBDSQR, ZGEBRD, ZGELQF, ZGEMM,
14697
      EXTERNAL           DLASCL, XERBLA, ZBDSQR, ZGEBRD, ZGELQF,
-
 
14698
     $                   ZGEMM,
14490
     $                   ZGEQRF, ZLACPY, ZLASCL, ZLASET, ZUNGBR, ZUNGLQ,
14699
     $                   ZGEQRF, ZLACPY, ZLASCL, ZLASET, ZUNGBR, ZUNGLQ,
14491
     $                   ZUNGQR, ZUNMBR
14700
     $                   ZUNGQR, ZUNMBR
14492
*     ..
14701
*     ..
14493
*     .. External Functions ..
14702
*     .. External Functions ..
14494
      LOGICAL            LSAME
14703
      LOGICAL            LSAME
Line 14553... Line 14762...
14553
            MNTHR = ILAENV( 6, 'ZGESVD', JOBU // JOBVT, M, N, 0, 0 )
14762
            MNTHR = ILAENV( 6, 'ZGESVD', JOBU // JOBVT, M, N, 0, 0 )
14554
*           Compute space needed for ZGEQRF
14763
*           Compute space needed for ZGEQRF
14555
            CALL ZGEQRF( M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
14764
            CALL ZGEQRF( M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
14556
            LWORK_ZGEQRF = INT( CDUM(1) )
14765
            LWORK_ZGEQRF = INT( CDUM(1) )
14557
*           Compute space needed for ZUNGQR
14766
*           Compute space needed for ZUNGQR
14558
            CALL ZUNGQR( M, N, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
14767
            CALL ZUNGQR( M, N, N, A, LDA, CDUM(1), CDUM(1), -1,
-
 
14768
     $                   IERR )
14559
            LWORK_ZUNGQR_N = INT( CDUM(1) )
14769
            LWORK_ZUNGQR_N = INT( CDUM(1) )
14560
            CALL ZUNGQR( M, M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
14770
            CALL ZUNGQR( M, M, N, A, LDA, CDUM(1), CDUM(1), -1,
-
 
14771
     $                   IERR )
14561
            LWORK_ZUNGQR_M = INT( CDUM(1) )
14772
            LWORK_ZUNGQR_M = INT( CDUM(1) )
14562
*           Compute space needed for ZGEBRD
14773
*           Compute space needed for ZGEBRD
14563
            CALL ZGEBRD( N, N, A, LDA, S, DUM(1), CDUM(1),
14774
            CALL ZGEBRD( N, N, A, LDA, S, DUM(1), CDUM(1),
14564
     $                   CDUM(1), CDUM(1), -1, IERR )
14775
     $                   CDUM(1), CDUM(1), -1, IERR )
14565
            LWORK_ZGEBRD = INT( CDUM(1) )
14776
            LWORK_ZGEBRD = INT( CDUM(1) )
Line 14705... Line 14916...
14705
            LWORK_ZGELQF = INT( CDUM(1) )
14916
            LWORK_ZGELQF = INT( CDUM(1) )
14706
*           Compute space needed for ZUNGLQ
14917
*           Compute space needed for ZUNGLQ
14707
            CALL ZUNGLQ( N, N, M, CDUM(1), N, CDUM(1), CDUM(1), -1,
14918
            CALL ZUNGLQ( N, N, M, CDUM(1), N, CDUM(1), CDUM(1), -1,
14708
     $                   IERR )
14919
     $                   IERR )
14709
            LWORK_ZUNGLQ_N = INT( CDUM(1) )
14920
            LWORK_ZUNGLQ_N = INT( CDUM(1) )
14710
            CALL ZUNGLQ( M, N, M, A, LDA, CDUM(1), CDUM(1), -1, IERR )
14921
            CALL ZUNGLQ( M, N, M, A, LDA, CDUM(1), CDUM(1), -1,
-
 
14922
     $                   IERR )
14711
            LWORK_ZUNGLQ_M = INT( CDUM(1) )
14923
            LWORK_ZUNGLQ_M = INT( CDUM(1) )
14712
*           Compute space needed for ZGEBRD
14924
*           Compute space needed for ZGEBRD
14713
            CALL ZGEBRD( M, M, A, LDA, S, DUM(1), CDUM(1),
14925
            CALL ZGEBRD( M, M, A, LDA, S, DUM(1), CDUM(1),
14714
     $                   CDUM(1), CDUM(1), -1, IERR )
14926
     $                   CDUM(1), CDUM(1), -1, IERR )
14715
            LWORK_ZGEBRD = INT( CDUM(1) )
14927
            LWORK_ZGEBRD = INT( CDUM(1) )
Line 14904... Line 15116...
14904
*
15116
*
14905
*              Compute A=Q*R
15117
*              Compute A=Q*R
14906
*              (CWorkspace: need 2*N, prefer N+N*NB)
15118
*              (CWorkspace: need 2*N, prefer N+N*NB)
14907
*              (RWorkspace: need 0)
15119
*              (RWorkspace: need 0)
14908
*
15120
*
14909
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
15121
               CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
-
 
15122
     $                      WORK( IWORK ),
14910
     $                      LWORK-IWORK+1, IERR )
15123
     $                      LWORK-IWORK+1, IERR )
14911
*
15124
*
14912
*              Zero out below R
15125
*              Zero out below R
14913
*
15126
*
14914
               IF( N .GT. 1 ) THEN
15127
               IF( N .GT. 1 ) THEN
14915
                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2, 1 ),
15128
                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO, A( 2,
-
 
15129
     $                         1 ),
14916
     $                         LDA )
15130
     $                         LDA )
14917
               END IF
15131
               END IF
14918
               IE = 1
15132
               IE = 1
14919
               ITAUQ = 1
15133
               ITAUQ = 1
14920
               ITAUP = ITAUQ + N
15134
               ITAUP = ITAUQ + N
Line 14922... Line 15136...
14922
*
15136
*
14923
*              Bidiagonalize R in A
15137
*              Bidiagonalize R in A
14924
*              (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
15138
*              (CWorkspace: need 3*N, prefer 2*N+2*N*NB)
14925
*              (RWorkspace: need N)
15139
*              (RWorkspace: need N)
14926
*
15140
*
14927
               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
15141
               CALL ZGEBRD( N, N, A, LDA, S, RWORK( IE ),
-
 
15142
     $                      WORK( ITAUQ ),
14928
     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
15143
     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
14929
     $                      IERR )
15144
     $                      IERR )
14930
               NCVT = 0
15145
               NCVT = 0
14931
               IF( WNTVO .OR. WNTVAS ) THEN
15146
               IF( WNTVO .OR. WNTVAS ) THEN
14932
*
15147
*
Line 14943... Line 15158...
14943
*              Perform bidiagonal QR iteration, computing right
15158
*              Perform bidiagonal QR iteration, computing right
14944
*              singular vectors of A in A if desired
15159
*              singular vectors of A in A if desired
14945
*              (CWorkspace: 0)
15160
*              (CWorkspace: 0)
14946
*              (RWorkspace: need BDSPAC)
15161
*              (RWorkspace: need BDSPAC)
14947
*
15162
*
14948
               CALL ZBDSQR( 'U', N, NCVT, 0, 0, S, RWORK( IE ), A, LDA,
15163
               CALL ZBDSQR( 'U', N, NCVT, 0, 0, S, RWORK( IE ), A,
-
 
15164
     $                      LDA,
14949
     $                      CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
15165
     $                      CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
14950
*
15166
*
14951
*              If right singular vectors desired in VT, copy them there
15167
*              If right singular vectors desired in VT, copy them there
14952
*
15168
*
14953
               IF( WNTVAS )
15169
               IF( WNTVAS )
Line 14993... Line 15209...
14993
                  CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
15209
                  CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ),
14994
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
15210
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
14995
*
15211
*
14996
*                 Copy R to WORK(IR) and zero out below it
15212
*                 Copy R to WORK(IR) and zero out below it
14997
*
15213
*
14998
                  CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR )
15214
                  CALL ZLACPY( 'U', N, N, A, LDA, WORK( IR ),
-
 
15215
     $                         LDWRKR )
14999
                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
15216
                  CALL ZLASET( 'L', N-1, N-1, CZERO, CZERO,
15000
     $                         WORK( IR+1 ), LDWRKR )
15217
     $                         WORK( IR+1 ), LDWRKR )
15001
*
15218
*
15002
*                 Generate Q in A
15219
*                 Generate Q in A
15003
*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
15220
*                 (CWorkspace: need N*N+2*N, prefer N*N+N+N*NB)
Line 15012... Line 15229...
15012
*
15229
*
15013
*                 Bidiagonalize R in WORK(IR)
15230
*                 Bidiagonalize R in WORK(IR)
15014
*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
15231
*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+2*N*NB)
15015
*                 (RWorkspace: need N)
15232
*                 (RWorkspace: need N)
15016
*
15233
*
15017
                  CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S, RWORK( IE ),
15234
                  CALL ZGEBRD( N, N, WORK( IR ), LDWRKR, S,
-
 
15235
     $                         RWORK( IE ),
15018
     $                         WORK( ITAUQ ), WORK( ITAUP ),
15236
     $                         WORK( ITAUQ ), WORK( ITAUP ),
15019
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
15237
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
15020
*
15238
*
15021
*                 Generate left vectors bidiagonalizing R
15239
*                 Generate left vectors bidiagonalizing R
15022
*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
15240
*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
Line 15030... Line 15248...
15030
*                 Perform bidiagonal QR iteration, computing left
15248
*                 Perform bidiagonal QR iteration, computing left
15031
*                 singular vectors of R in WORK(IR)
15249
*                 singular vectors of R in WORK(IR)
15032
*                 (CWorkspace: need N*N)
15250
*                 (CWorkspace: need N*N)
15033
*                 (RWorkspace: need BDSPAC)
15251
*                 (RWorkspace: need BDSPAC)
15034
*
15252
*
15035
                  CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM, 1,
15253
                  CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
-
 
15254
     $                         1,
15036
     $                         WORK( IR ), LDWRKR, CDUM, 1,
15255
     $                         WORK( IR ), LDWRKR, CDUM, 1,
15037
     $                         RWORK( IRWORK ), INFO )
15256
     $                         RWORK( IRWORK ), INFO )
15038
                  IU = ITAUQ
15257
                  IU = ITAUQ
15039
*
15258
*
15040
*                 Multiply Q in A by left singular vectors of R in
15259
*                 Multiply Q in A by left singular vectors of R in
Line 15042... Line 15261...
15042
*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
15261
*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
15043
*                 (RWorkspace: 0)
15262
*                 (RWorkspace: 0)
15044
*
15263
*
15045
                  DO 10 I = 1, M, LDWRKU
15264
                  DO 10 I = 1, M, LDWRKU
15046
                     CHUNK = MIN( M-I+1, LDWRKU )
15265
                     CHUNK = MIN( M-I+1, LDWRKU )
15047
                     CALL ZGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I, 1 ),
15266
                     CALL ZGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I,
-
 
15267
     $                           1 ),
15048
     $                           LDA, WORK( IR ), LDWRKR, CZERO,
15268
     $                           LDA, WORK( IR ), LDWRKR, CZERO,
15049
     $                           WORK( IU ), LDWRKU )
15269
     $                           WORK( IU ), LDWRKU )
15050
                     CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
15270
                     CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
15051
     $                            A( I, 1 ), LDA )
15271
     $                            A( I, 1 ), LDA )
15052
   10             CONTINUE
15272
   10             CONTINUE
Line 15079... Line 15299...
15079
*                 Perform bidiagonal QR iteration, computing left
15299
*                 Perform bidiagonal QR iteration, computing left
15080
*                 singular vectors of A in A
15300
*                 singular vectors of A in A
15081
*                 (CWorkspace: need 0)
15301
*                 (CWorkspace: need 0)
15082
*                 (RWorkspace: need BDSPAC)
15302
*                 (RWorkspace: need BDSPAC)
15083
*
15303
*
15084
                  CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM, 1,
15304
                  CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
-
 
15305
     $                         1,
15085
     $                         A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
15306
     $                         A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
15086
*
15307
*
15087
               END IF
15308
               END IF
15088
*
15309
*
15089
            ELSE IF( WNTUO .AND. WNTVAS ) THEN
15310
            ELSE IF( WNTUO .AND. WNTVAS ) THEN
Line 15149... Line 15370...
15149
*                 (RWorkspace: need N)
15370
*                 (RWorkspace: need N)
15150
*
15371
*
15151
                  CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
15372
                  CALL ZGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
15152
     $                         WORK( ITAUQ ), WORK( ITAUP ),
15373
     $                         WORK( ITAUQ ), WORK( ITAUP ),
15153
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
15374
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
15154
                  CALL ZLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR )
15375
                  CALL ZLACPY( 'L', N, N, VT, LDVT, WORK( IR ),
-
 
15376
     $                         LDWRKR )
15155
*
15377
*
15156
*                 Generate left vectors bidiagonalizing R in WORK(IR)
15378
*                 Generate left vectors bidiagonalizing R in WORK(IR)
15157
*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
15379
*                 (CWorkspace: need N*N+3*N, prefer N*N+2*N+N*NB)
15158
*                 (RWorkspace: 0)
15380
*                 (RWorkspace: 0)
15159
*
15381
*
Line 15185... Line 15407...
15185
*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
15407
*                 (CWorkspace: need N*N+N, prefer N*N+M*N)
15186
*                 (RWorkspace: 0)
15408
*                 (RWorkspace: 0)
15187
*
15409
*
15188
                  DO 20 I = 1, M, LDWRKU
15410
                  DO 20 I = 1, M, LDWRKU
15189
                     CHUNK = MIN( M-I+1, LDWRKU )
15411
                     CHUNK = MIN( M-I+1, LDWRKU )
15190
                     CALL ZGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I, 1 ),
15412
                     CALL ZGEMM( 'N', 'N', CHUNK, N, N, CONE, A( I,
-
 
15413
     $                           1 ),
15191
     $                           LDA, WORK( IR ), LDWRKR, CZERO,
15414
     $                           LDA, WORK( IR ), LDWRKR, CZERO,
15192
     $                           WORK( IU ), LDWRKU )
15415
     $                           WORK( IU ), LDWRKU )
15193
                     CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
15416
                     CALL ZLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU,
15194
     $                            A( I, 1 ), LDA )
15417
     $                            A( I, 1 ), LDA )
15195
   20             CONTINUE
15418
   20             CONTINUE
Line 15335... Line 15558...
15335
*                    Perform bidiagonal QR iteration, computing left
15558
*                    Perform bidiagonal QR iteration, computing left
15336
*                    singular vectors of R in WORK(IR)
15559
*                    singular vectors of R in WORK(IR)
15337
*                    (CWorkspace: need N*N)
15560
*                    (CWorkspace: need N*N)
15338
*                    (RWorkspace: need BDSPAC)
15561
*                    (RWorkspace: need BDSPAC)
15339
*
15562
*
15340
                     CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
15563
                     CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ),
-
 
15564
     $                            CDUM,
15341
     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
15565
     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
15342
     $                            RWORK( IRWORK ), INFO )
15566
     $                            RWORK( IRWORK ), INFO )
15343
*
15567
*
15344
*                    Multiply Q in A by left singular vectors of R in
15568
*                    Multiply Q in A by left singular vectors of R in
15345
*                    WORK(IR), storing result in U
15569
*                    WORK(IR), storing result in U
Line 15402... Line 15626...
15402
*                    Perform bidiagonal QR iteration, computing left
15626
*                    Perform bidiagonal QR iteration, computing left
15403
*                    singular vectors of A in U
15627
*                    singular vectors of A in U
15404
*                    (CWorkspace: 0)
15628
*                    (CWorkspace: 0)
15405
*                    (RWorkspace: need BDSPAC)
15629
*                    (RWorkspace: need BDSPAC)
15406
*
15630
*
15407
                     CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
15631
                     CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ),
-
 
15632
     $                            CDUM,
15408
     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
15633
     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
15409
     $                            INFO )
15634
     $                            INFO )
15410
*
15635
*
15411
                  END IF
15636
                  END IF
15412
*
15637
*
Line 15579... Line 15804...
15579
*
15804
*
15580
*                    Generate right vectors bidiagonalizing R in A
15805
*                    Generate right vectors bidiagonalizing R in A
15581
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
15806
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
15582
*                    (RWorkspace: 0)
15807
*                    (RWorkspace: 0)
15583
*
15808
*
15584
                     CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
15809
                     CALL ZUNGBR( 'P', N, N, N, A, LDA,
-
 
15810
     $                            WORK( ITAUP ),
15585
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
15811
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
15586
                     IRWORK = IE + N
15812
                     IRWORK = IE + N
15587
*
15813
*
15588
*                    Perform bidiagonal QR iteration, computing left
15814
*                    Perform bidiagonal QR iteration, computing left
15589
*                    singular vectors of A in U and computing right
15815
*                    singular vectors of A in U and computing right
Line 15670... Line 15896...
15670
*                    Generate right bidiagonalizing vectors in VT
15896
*                    Generate right bidiagonalizing vectors in VT
15671
*                    (CWorkspace: need   N*N+3*N-1,
15897
*                    (CWorkspace: need   N*N+3*N-1,
15672
*                                 prefer N*N+2*N+(N-1)*NB)
15898
*                                 prefer N*N+2*N+(N-1)*NB)
15673
*                    (RWorkspace: 0)
15899
*                    (RWorkspace: 0)
15674
*
15900
*
15675
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
15901
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT,
-
 
15902
     $                            WORK( ITAUP ),
15676
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
15903
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
15677
                     IRWORK = IE + N
15904
                     IRWORK = IE + N
15678
*
15905
*
15679
*                    Perform bidiagonal QR iteration, computing left
15906
*                    Perform bidiagonal QR iteration, computing left
15680
*                    singular vectors of R in WORK(IU) and computing
15907
*                    singular vectors of R in WORK(IU) and computing
15681
*                    right singular vectors of R in VT
15908
*                    right singular vectors of R in VT
15682
*                    (CWorkspace: need N*N)
15909
*                    (CWorkspace: need N*N)
15683
*                    (RWorkspace: need BDSPAC)
15910
*                    (RWorkspace: need BDSPAC)
15684
*
15911
*
15685
                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
15912
                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
-
 
15913
     $                            VT,
15686
     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
15914
     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
15687
     $                            RWORK( IRWORK ), INFO )
15915
     $                            RWORK( IRWORK ), INFO )
15688
*
15916
*
15689
*                    Multiply Q in A by left singular vectors of R in
15917
*                    Multiply Q in A by left singular vectors of R in
15690
*                    WORK(IU), storing result in U
15918
*                    WORK(IU), storing result in U
Line 15746... Line 15974...
15746
*
15974
*
15747
*                    Generate right bidiagonalizing vectors in VT
15975
*                    Generate right bidiagonalizing vectors in VT
15748
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
15976
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
15749
*                    (RWorkspace: 0)
15977
*                    (RWorkspace: 0)
15750
*
15978
*
15751
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
15979
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT,
-
 
15980
     $                            WORK( ITAUP ),
15752
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
15981
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
15753
                     IRWORK = IE + N
15982
                     IRWORK = IE + N
15754
*
15983
*
15755
*                    Perform bidiagonal QR iteration, computing left
15984
*                    Perform bidiagonal QR iteration, computing left
15756
*                    singular vectors of A in U and computing right
15985
*                    singular vectors of A in U and computing right
15757
*                    singular vectors of A in VT
15986
*                    singular vectors of A in VT
15758
*                    (CWorkspace: 0)
15987
*                    (CWorkspace: 0)
15759
*                    (RWorkspace: need BDSPAC)
15988
*                    (RWorkspace: need BDSPAC)
15760
*
15989
*
15761
                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
15990
                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ),
-
 
15991
     $                            VT,
15762
     $                            LDVT, U, LDU, CDUM, 1,
15992
     $                            LDVT, U, LDU, CDUM, 1,
15763
     $                            RWORK( IRWORK ), INFO )
15993
     $                            RWORK( IRWORK ), INFO )
15764
*
15994
*
15765
                  END IF
15995
                  END IF
15766
*
15996
*
Line 15840... Line 16070...
15840
*                    Perform bidiagonal QR iteration, computing left
16070
*                    Perform bidiagonal QR iteration, computing left
15841
*                    singular vectors of R in WORK(IR)
16071
*                    singular vectors of R in WORK(IR)
15842
*                    (CWorkspace: need N*N)
16072
*                    (CWorkspace: need N*N)
15843
*                    (RWorkspace: need BDSPAC)
16073
*                    (RWorkspace: need BDSPAC)
15844
*
16074
*
15845
                     CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ), CDUM,
16075
                     CALL ZBDSQR( 'U', N, 0, N, 0, S, RWORK( IE ),
-
 
16076
     $                            CDUM,
15846
     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
16077
     $                            1, WORK( IR ), LDWRKR, CDUM, 1,
15847
     $                            RWORK( IRWORK ), INFO )
16078
     $                            RWORK( IRWORK ), INFO )
15848
*
16079
*
15849
*                    Multiply Q in U by left singular vectors of R in
16080
*                    Multiply Q in U by left singular vectors of R in
15850
*                    WORK(IR), storing result in A
16081
*                    WORK(IR), storing result in A
Line 15912... Line 16143...
15912
*                    Perform bidiagonal QR iteration, computing left
16143
*                    Perform bidiagonal QR iteration, computing left
15913
*                    singular vectors of A in U
16144
*                    singular vectors of A in U
15914
*                    (CWorkspace: 0)
16145
*                    (CWorkspace: 0)
15915
*                    (RWorkspace: need BDSPAC)
16146
*                    (RWorkspace: need BDSPAC)
15916
*
16147
*
15917
                     CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ), CDUM,
16148
                     CALL ZBDSQR( 'U', N, 0, M, 0, S, RWORK( IE ),
-
 
16149
     $                            CDUM,
15918
     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
16150
     $                            1, U, LDU, CDUM, 1, RWORK( IRWORK ),
15919
     $                            INFO )
16151
     $                            INFO )
15920
*
16152
*
15921
                  END IF
16153
                  END IF
15922
*
16154
*
Line 16093... Line 16325...
16093
*
16325
*
16094
*                    Generate right bidiagonalizing vectors in A
16326
*                    Generate right bidiagonalizing vectors in A
16095
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
16327
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
16096
*                    (RWorkspace: 0)
16328
*                    (RWorkspace: 0)
16097
*
16329
*
16098
                     CALL ZUNGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ),
16330
                     CALL ZUNGBR( 'P', N, N, N, A, LDA,
-
 
16331
     $                            WORK( ITAUP ),
16099
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
16332
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
16100
                     IRWORK = IE + N
16333
                     IRWORK = IE + N
16101
*
16334
*
16102
*                    Perform bidiagonal QR iteration, computing left
16335
*                    Perform bidiagonal QR iteration, computing left
16103
*                    singular vectors of A in U and computing right
16336
*                    singular vectors of A in U and computing right
Line 16185... Line 16418...
16185
*                    Generate right bidiagonalizing vectors in VT
16418
*                    Generate right bidiagonalizing vectors in VT
16186
*                    (CWorkspace: need   N*N+3*N-1,
16419
*                    (CWorkspace: need   N*N+3*N-1,
16187
*                                 prefer N*N+2*N+(N-1)*NB)
16420
*                                 prefer N*N+2*N+(N-1)*NB)
16188
*                    (RWorkspace: need   0)
16421
*                    (RWorkspace: need   0)
16189
*
16422
*
16190
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
16423
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT,
-
 
16424
     $                            WORK( ITAUP ),
16191
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
16425
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
16192
                     IRWORK = IE + N
16426
                     IRWORK = IE + N
16193
*
16427
*
16194
*                    Perform bidiagonal QR iteration, computing left
16428
*                    Perform bidiagonal QR iteration, computing left
16195
*                    singular vectors of R in WORK(IU) and computing
16429
*                    singular vectors of R in WORK(IU) and computing
16196
*                    right singular vectors of R in VT
16430
*                    right singular vectors of R in VT
16197
*                    (CWorkspace: need N*N)
16431
*                    (CWorkspace: need N*N)
16198
*                    (RWorkspace: need BDSPAC)
16432
*                    (RWorkspace: need BDSPAC)
16199
*
16433
*
16200
                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ), VT,
16434
                     CALL ZBDSQR( 'U', N, N, N, 0, S, RWORK( IE ),
-
 
16435
     $                            VT,
16201
     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
16436
     $                            LDVT, WORK( IU ), LDWRKU, CDUM, 1,
16202
     $                            RWORK( IRWORK ), INFO )
16437
     $                            RWORK( IRWORK ), INFO )
16203
*
16438
*
16204
*                    Multiply Q in U by left singular vectors of R in
16439
*                    Multiply Q in U by left singular vectors of R in
16205
*                    WORK(IU), storing result in A
16440
*                    WORK(IU), storing result in A
Line 16265... Line 16500...
16265
*
16500
*
16266
*                    Generate right bidiagonalizing vectors in VT
16501
*                    Generate right bidiagonalizing vectors in VT
16267
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
16502
*                    (CWorkspace: need 3*N-1, prefer 2*N+(N-1)*NB)
16268
*                    (RWorkspace: 0)
16503
*                    (RWorkspace: 0)
16269
*
16504
*
16270
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ),
16505
                     CALL ZUNGBR( 'P', N, N, N, VT, LDVT,
-
 
16506
     $                            WORK( ITAUP ),
16271
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
16507
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
16272
                     IRWORK = IE + N
16508
                     IRWORK = IE + N
16273
*
16509
*
16274
*                    Perform bidiagonal QR iteration, computing left
16510
*                    Perform bidiagonal QR iteration, computing left
16275
*                    singular vectors of A in U and computing right
16511
*                    singular vectors of A in U and computing right
16276
*                    singular vectors of A in VT
16512
*                    singular vectors of A in VT
16277
*                    (CWorkspace: 0)
16513
*                    (CWorkspace: 0)
16278
*                    (RWorkspace: need BDSPAC)
16514
*                    (RWorkspace: need BDSPAC)
16279
*
16515
*
16280
                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ), VT,
16516
                     CALL ZBDSQR( 'U', N, N, M, 0, S, RWORK( IE ),
-
 
16517
     $                            VT,
16281
     $                            LDVT, U, LDU, CDUM, 1,
16518
     $                            LDVT, U, LDU, CDUM, 1,
16282
     $                            RWORK( IRWORK ), INFO )
16519
     $                            RWORK( IRWORK ), INFO )
16283
*
16520
*
16284
                  END IF
16521
                  END IF
16285
*
16522
*
Line 16416... Line 16653...
16416
*
16653
*
16417
*              Compute A=L*Q
16654
*              Compute A=L*Q
16418
*              (CWorkspace: need 2*M, prefer M+M*NB)
16655
*              (CWorkspace: need 2*M, prefer M+M*NB)
16419
*              (RWorkspace: 0)
16656
*              (RWorkspace: 0)
16420
*
16657
*
16421
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
16658
               CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
-
 
16659
     $                      WORK( IWORK ),
16422
     $                      LWORK-IWORK+1, IERR )
16660
     $                      LWORK-IWORK+1, IERR )
16423
*
16661
*
16424
*              Zero out above L
16662
*              Zero out above L
16425
*
16663
*
16426
               CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
16664
               CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
Line 16432... Line 16670...
16432
*
16670
*
16433
*              Bidiagonalize L in A
16671
*              Bidiagonalize L in A
16434
*              (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
16672
*              (CWorkspace: need 3*M, prefer 2*M+2*M*NB)
16435
*              (RWorkspace: need M)
16673
*              (RWorkspace: need M)
16436
*
16674
*
16437
               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
16675
               CALL ZGEBRD( M, M, A, LDA, S, RWORK( IE ),
-
 
16676
     $                      WORK( ITAUQ ),
16438
     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
16677
     $                      WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
16439
     $                      IERR )
16678
     $                      IERR )
16440
               IF( WNTUO .OR. WNTUAS ) THEN
16679
               IF( WNTUO .OR. WNTUAS ) THEN
16441
*
16680
*
16442
*                 If left singular vectors desired, generate Q
16681
*                 If left singular vectors desired, generate Q
Line 16454... Line 16693...
16454
*              Perform bidiagonal QR iteration, computing left singular
16693
*              Perform bidiagonal QR iteration, computing left singular
16455
*              vectors of A in A if desired
16694
*              vectors of A in A if desired
16456
*              (CWorkspace: 0)
16695
*              (CWorkspace: 0)
16457
*              (RWorkspace: need BDSPAC)
16696
*              (RWorkspace: need BDSPAC)
16458
*
16697
*
16459
               CALL ZBDSQR( 'U', M, 0, NRU, 0, S, RWORK( IE ), CDUM, 1,
16698
               CALL ZBDSQR( 'U', M, 0, NRU, 0, S, RWORK( IE ), CDUM,
-
 
16699
     $                      1,
16460
     $                      A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
16700
     $                      A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
16461
*
16701
*
16462
*              If left singular vectors desired in U, copy them there
16702
*              If left singular vectors desired in U, copy them there
16463
*
16703
*
16464
               IF( WNTUAS )
16704
               IF( WNTUAS )
Line 16507... Line 16747...
16507
                  CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
16747
                  CALL ZGELQF( M, N, A, LDA, WORK( ITAU ),
16508
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16748
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16509
*
16749
*
16510
*                 Copy L to WORK(IR) and zero out above it
16750
*                 Copy L to WORK(IR) and zero out above it
16511
*
16751
*
16512
                  CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR )
16752
                  CALL ZLACPY( 'L', M, M, A, LDA, WORK( IR ),
-
 
16753
     $                         LDWRKR )
16513
                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
16754
                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO,
16514
     $                         WORK( IR+LDWRKR ), LDWRKR )
16755
     $                         WORK( IR+LDWRKR ), LDWRKR )
16515
*
16756
*
16516
*                 Generate Q in A
16757
*                 Generate Q in A
16517
*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
16758
*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
Line 16526... Line 16767...
16526
*
16767
*
16527
*                 Bidiagonalize L in WORK(IR)
16768
*                 Bidiagonalize L in WORK(IR)
16528
*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
16769
*                 (CWorkspace: need M*M+3*M, prefer M*M+2*M+2*M*NB)
16529
*                 (RWorkspace: need M)
16770
*                 (RWorkspace: need M)
16530
*
16771
*
16531
                  CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S, RWORK( IE ),
16772
                  CALL ZGEBRD( M, M, WORK( IR ), LDWRKR, S,
-
 
16773
     $                         RWORK( IE ),
16532
     $                         WORK( ITAUQ ), WORK( ITAUP ),
16774
     $                         WORK( ITAUQ ), WORK( ITAUP ),
16533
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16775
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16534
*
16776
*
16535
*                 Generate right vectors bidiagonalizing L
16777
*                 Generate right vectors bidiagonalizing L
16536
*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
16778
*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
Line 16556... Line 16798...
16556
*                 (CWorkspace: need M*M+M, prefer M*M+M*N)
16798
*                 (CWorkspace: need M*M+M, prefer M*M+M*N)
16557
*                 (RWorkspace: 0)
16799
*                 (RWorkspace: 0)
16558
*
16800
*
16559
                  DO 30 I = 1, N, CHUNK
16801
                  DO 30 I = 1, N, CHUNK
16560
                     BLK = MIN( N-I+1, CHUNK )
16802
                     BLK = MIN( N-I+1, CHUNK )
16561
                     CALL ZGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IR ),
16803
                     CALL ZGEMM( 'N', 'N', M, BLK, M, CONE,
-
 
16804
     $                           WORK( IR ),
16562
     $                           LDWRKR, A( 1, I ), LDA, CZERO,
16805
     $                           LDWRKR, A( 1, I ), LDA, CZERO,
16563
     $                           WORK( IU ), LDWRKU )
16806
     $                           WORK( IU ), LDWRKU )
16564
                     CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
16807
                     CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
16565
     $                            A( 1, I ), LDA )
16808
     $                            A( 1, I ), LDA )
16566
   30             CONTINUE
16809
   30             CONTINUE
Line 16593... Line 16836...
16593
*                 Perform bidiagonal QR iteration, computing right
16836
*                 Perform bidiagonal QR iteration, computing right
16594
*                 singular vectors of A in A
16837
*                 singular vectors of A in A
16595
*                 (CWorkspace: 0)
16838
*                 (CWorkspace: 0)
16596
*                 (RWorkspace: need BDSPAC)
16839
*                 (RWorkspace: need BDSPAC)
16597
*
16840
*
16598
                  CALL ZBDSQR( 'L', M, N, 0, 0, S, RWORK( IE ), A, LDA,
16841
                  CALL ZBDSQR( 'L', M, N, 0, 0, S, RWORK( IE ), A,
-
 
16842
     $                         LDA,
16599
     $                         CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
16843
     $                         CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
16600
*
16844
*
16601
               END IF
16845
               END IF
16602
*
16846
*
16603
            ELSE IF( WNTVO .AND. WNTUAS ) THEN
16847
            ELSE IF( WNTVO .AND. WNTUAS ) THEN
Line 16644... Line 16888...
16644
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16888
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16645
*
16889
*
16646
*                 Copy L to U, zeroing about above it
16890
*                 Copy L to U, zeroing about above it
16647
*
16891
*
16648
                  CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
16892
                  CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
16649
                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
16893
                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1,
-
 
16894
     $                         2 ),
16650
     $                         LDU )
16895
     $                         LDU )
16651
*
16896
*
16652
*                 Generate Q in A
16897
*                 Generate Q in A
16653
*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
16898
*                 (CWorkspace: need M*M+2*M, prefer M*M+M+M*NB)
16654
*                 (RWorkspace: 0)
16899
*                 (RWorkspace: 0)
Line 16665... Line 16910...
16665
*                 (RWorkspace: need M)
16910
*                 (RWorkspace: need M)
16666
*
16911
*
16667
                  CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
16912
                  CALL ZGEBRD( M, M, U, LDU, S, RWORK( IE ),
16668
     $                         WORK( ITAUQ ), WORK( ITAUP ),
16913
     $                         WORK( ITAUQ ), WORK( ITAUP ),
16669
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16914
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16670
                  CALL ZLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR )
16915
                  CALL ZLACPY( 'U', M, M, U, LDU, WORK( IR ),
-
 
16916
     $                         LDWRKR )
16671
*
16917
*
16672
*                 Generate right vectors bidiagonalizing L in WORK(IR)
16918
*                 Generate right vectors bidiagonalizing L in WORK(IR)
16673
*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
16919
*                 (CWorkspace: need M*M+3*M-1, prefer M*M+2*M+(M-1)*NB)
16674
*                 (RWorkspace: 0)
16920
*                 (RWorkspace: 0)
16675
*
16921
*
Line 16701... Line 16947...
16701
*                 (CWorkspace: need M*M+M, prefer M*M+M*N))
16947
*                 (CWorkspace: need M*M+M, prefer M*M+M*N))
16702
*                 (RWorkspace: 0)
16948
*                 (RWorkspace: 0)
16703
*
16949
*
16704
                  DO 40 I = 1, N, CHUNK
16950
                  DO 40 I = 1, N, CHUNK
16705
                     BLK = MIN( N-I+1, CHUNK )
16951
                     BLK = MIN( N-I+1, CHUNK )
16706
                     CALL ZGEMM( 'N', 'N', M, BLK, M, CONE, WORK( IR ),
16952
                     CALL ZGEMM( 'N', 'N', M, BLK, M, CONE,
-
 
16953
     $                           WORK( IR ),
16707
     $                           LDWRKR, A( 1, I ), LDA, CZERO,
16954
     $                           LDWRKR, A( 1, I ), LDA, CZERO,
16708
     $                           WORK( IU ), LDWRKU )
16955
     $                           WORK( IU ), LDWRKU )
16709
                     CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
16956
                     CALL ZLACPY( 'F', M, BLK, WORK( IU ), LDWRKU,
16710
     $                            A( 1, I ), LDA )
16957
     $                            A( 1, I ), LDA )
16711
   40             CONTINUE
16958
   40             CONTINUE
Line 16725... Line 16972...
16725
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16972
     $                         WORK( IWORK ), LWORK-IWORK+1, IERR )
16726
*
16973
*
16727
*                 Copy L to U, zeroing out above it
16974
*                 Copy L to U, zeroing out above it
16728
*
16975
*
16729
                  CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
16976
                  CALL ZLACPY( 'L', M, M, A, LDA, U, LDU )
16730
                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
16977
                  CALL ZLASET( 'U', M-1, M-1, CZERO, CZERO, U( 1,
-
 
16978
     $                         2 ),
16731
     $                         LDU )
16979
     $                         LDU )
16732
*
16980
*
16733
*                 Generate Q in A
16981
*                 Generate Q in A
16734
*                 (CWorkspace: need 2*M, prefer M+M*NB)
16982
*                 (CWorkspace: need 2*M, prefer M+M*NB)
16735
*                 (RWorkspace: 0)
16983
*                 (RWorkspace: 0)
Line 16769... Line 17017...
16769
*                 singular vectors of A in U and computing right
17017
*                 singular vectors of A in U and computing right
16770
*                 singular vectors of A in A
17018
*                 singular vectors of A in A
16771
*                 (CWorkspace: 0)
17019
*                 (CWorkspace: 0)
16772
*                 (RWorkspace: need BDSPAC)
17020
*                 (RWorkspace: need BDSPAC)
16773
*
17021
*
16774
                  CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), A, LDA,
17022
                  CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), A,
-
 
17023
     $                         LDA,
16775
     $                         U, LDU, CDUM, 1, RWORK( IRWORK ), INFO )
17024
     $                         U, LDU, CDUM, 1, RWORK( IRWORK ), INFO )
16776
*
17025
*
16777
               END IF
17026
               END IF
16778
*
17027
*
16779
            ELSE IF( WNTVS ) THEN
17028
            ELSE IF( WNTVS ) THEN
Line 16918... Line 17167...
16918
*                    Perform bidiagonal QR iteration, computing right
17167
*                    Perform bidiagonal QR iteration, computing right
16919
*                    singular vectors of A in VT
17168
*                    singular vectors of A in VT
16920
*                    (CWorkspace: 0)
17169
*                    (CWorkspace: 0)
16921
*                    (RWorkspace: need BDSPAC)
17170
*                    (RWorkspace: need BDSPAC)
16922
*
17171
*
16923
                     CALL ZBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ), VT,
17172
                     CALL ZBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ),
-
 
17173
     $                            VT,
16924
     $                            LDVT, CDUM, 1, CDUM, 1,
17174
     $                            LDVT, CDUM, 1, CDUM, 1,
16925
     $                            RWORK( IRWORK ), INFO )
17175
     $                            RWORK( IRWORK ), INFO )
16926
*
17176
*
16927
                  END IF
17177
                  END IF
16928
*
17178
*
Line 17093... Line 17343...
17093
*
17343
*
17094
*                    Generate left bidiagonalizing vectors of L in A
17344
*                    Generate left bidiagonalizing vectors of L in A
17095
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17345
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17096
*                    (RWorkspace: 0)
17346
*                    (RWorkspace: 0)
17097
*
17347
*
17098
                     CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
17348
                     CALL ZUNGBR( 'Q', M, M, M, A, LDA,
-
 
17349
     $                            WORK( ITAUQ ),
17099
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17350
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17100
                     IRWORK = IE + M
17351
                     IRWORK = IE + M
17101
*
17352
*
17102
*                    Perform bidiagonal QR iteration, computing left
17353
*                    Perform bidiagonal QR iteration, computing left
17103
*                    singular vectors of A in A and computing right
17354
*                    singular vectors of A in A and computing right
17104
*                    singular vectors of A in VT
17355
*                    singular vectors of A in VT
17105
*                    (CWorkspace: 0)
17356
*                    (CWorkspace: 0)
17106
*                    (RWorkspace: need BDSPAC)
17357
*                    (RWorkspace: need BDSPAC)
17107
*
17358
*
17108
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
17359
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ),
-
 
17360
     $                            VT,
17109
     $                            LDVT, A, LDA, CDUM, 1,
17361
     $                            LDVT, A, LDA, CDUM, 1,
17110
     $                            RWORK( IRWORK ), INFO )
17362
     $                            RWORK( IRWORK ), INFO )
17111
*
17363
*
17112
                  END IF
17364
                  END IF
17113
*
17365
*
Line 17184... Line 17436...
17184
*
17436
*
17185
*                    Generate left bidiagonalizing vectors in U
17437
*                    Generate left bidiagonalizing vectors in U
17186
*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
17438
*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
17187
*                    (RWorkspace: 0)
17439
*                    (RWorkspace: 0)
17188
*
17440
*
17189
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
17441
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU,
-
 
17442
     $                            WORK( ITAUQ ),
17190
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17443
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17191
                     IRWORK = IE + M
17444
                     IRWORK = IE + M
17192
*
17445
*
17193
*                    Perform bidiagonal QR iteration, computing left
17446
*                    Perform bidiagonal QR iteration, computing left
17194
*                    singular vectors of L in U and computing right
17447
*                    singular vectors of L in U and computing right
Line 17259... Line 17512...
17259
*
17512
*
17260
*                    Generate left bidiagonalizing vectors in U
17513
*                    Generate left bidiagonalizing vectors in U
17261
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17514
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17262
*                    (RWorkspace: 0)
17515
*                    (RWorkspace: 0)
17263
*
17516
*
17264
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
17517
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU,
-
 
17518
     $                            WORK( ITAUQ ),
17265
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17519
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17266
                     IRWORK = IE + M
17520
                     IRWORK = IE + M
17267
*
17521
*
17268
*                    Perform bidiagonal QR iteration, computing left
17522
*                    Perform bidiagonal QR iteration, computing left
17269
*                    singular vectors of A in U and computing right
17523
*                    singular vectors of A in U and computing right
17270
*                    singular vectors of A in VT
17524
*                    singular vectors of A in VT
17271
*                    (CWorkspace: 0)
17525
*                    (CWorkspace: 0)
17272
*                    (RWorkspace: need BDSPAC)
17526
*                    (RWorkspace: need BDSPAC)
17273
*
17527
*
17274
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
17528
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ),
-
 
17529
     $                            VT,
17275
     $                            LDVT, U, LDU, CDUM, 1,
17530
     $                            LDVT, U, LDU, CDUM, 1,
17276
     $                            RWORK( IRWORK ), INFO )
17531
     $                            RWORK( IRWORK ), INFO )
17277
*
17532
*
17278
                  END IF
17533
                  END IF
17279
*
17534
*
Line 17424... Line 17679...
17424
*                    Perform bidiagonal QR iteration, computing right
17679
*                    Perform bidiagonal QR iteration, computing right
17425
*                    singular vectors of A in VT
17680
*                    singular vectors of A in VT
17426
*                    (CWorkspace: 0)
17681
*                    (CWorkspace: 0)
17427
*                    (RWorkspace: need BDSPAC)
17682
*                    (RWorkspace: need BDSPAC)
17428
*
17683
*
17429
                     CALL ZBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ), VT,
17684
                     CALL ZBDSQR( 'U', M, N, 0, 0, S, RWORK( IE ),
-
 
17685
     $                            VT,
17430
     $                            LDVT, CDUM, 1, CDUM, 1,
17686
     $                            LDVT, CDUM, 1, CDUM, 1,
17431
     $                            RWORK( IRWORK ), INFO )
17687
     $                            RWORK( IRWORK ), INFO )
17432
*
17688
*
17433
                  END IF
17689
                  END IF
17434
*
17690
*
Line 17603... Line 17859...
17603
*
17859
*
17604
*                    Generate left bidiagonalizing vectors in A
17860
*                    Generate left bidiagonalizing vectors in A
17605
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17861
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17606
*                    (RWorkspace: 0)
17862
*                    (RWorkspace: 0)
17607
*
17863
*
17608
                     CALL ZUNGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ),
17864
                     CALL ZUNGBR( 'Q', M, M, M, A, LDA,
-
 
17865
     $                            WORK( ITAUQ ),
17609
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17866
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17610
                     IRWORK = IE + M
17867
                     IRWORK = IE + M
17611
*
17868
*
17612
*                    Perform bidiagonal QR iteration, computing left
17869
*                    Perform bidiagonal QR iteration, computing left
17613
*                    singular vectors of A in A and computing right
17870
*                    singular vectors of A in A and computing right
17614
*                    singular vectors of A in VT
17871
*                    singular vectors of A in VT
17615
*                    (CWorkspace: 0)
17872
*                    (CWorkspace: 0)
17616
*                    (RWorkspace: need BDSPAC)
17873
*                    (RWorkspace: need BDSPAC)
17617
*
17874
*
17618
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
17875
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ),
-
 
17876
     $                            VT,
17619
     $                            LDVT, A, LDA, CDUM, 1,
17877
     $                            LDVT, A, LDA, CDUM, 1,
17620
     $                            RWORK( IRWORK ), INFO )
17878
     $                            RWORK( IRWORK ), INFO )
17621
*
17879
*
17622
                  END IF
17880
                  END IF
17623
*
17881
*
Line 17694... Line 17952...
17694
*
17952
*
17695
*                    Generate left bidiagonalizing vectors in U
17953
*                    Generate left bidiagonalizing vectors in U
17696
*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
17954
*                    (CWorkspace: need M*M+3*M, prefer M*M+2*M+M*NB)
17697
*                    (RWorkspace: 0)
17955
*                    (RWorkspace: 0)
17698
*
17956
*
17699
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
17957
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU,
-
 
17958
     $                            WORK( ITAUQ ),
17700
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17959
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17701
                     IRWORK = IE + M
17960
                     IRWORK = IE + M
17702
*
17961
*
17703
*                    Perform bidiagonal QR iteration, computing left
17962
*                    Perform bidiagonal QR iteration, computing left
17704
*                    singular vectors of L in U and computing right
17963
*                    singular vectors of L in U and computing right
Line 17773... Line 18032...
17773
*
18032
*
17774
*                    Generate left bidiagonalizing vectors in U
18033
*                    Generate left bidiagonalizing vectors in U
17775
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
18034
*                    (CWorkspace: need 3*M, prefer 2*M+M*NB)
17776
*                    (RWorkspace: 0)
18035
*                    (RWorkspace: 0)
17777
*
18036
*
17778
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ),
18037
                     CALL ZUNGBR( 'Q', M, M, M, U, LDU,
-
 
18038
     $                            WORK( ITAUQ ),
17779
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
18039
     $                            WORK( IWORK ), LWORK-IWORK+1, IERR )
17780
                     IRWORK = IE + M
18040
                     IRWORK = IE + M
17781
*
18041
*
17782
*                    Perform bidiagonal QR iteration, computing left
18042
*                    Perform bidiagonal QR iteration, computing left
17783
*                    singular vectors of A in U and computing right
18043
*                    singular vectors of A in U and computing right
17784
*                    singular vectors of A in VT
18044
*                    singular vectors of A in VT
17785
*                    (CWorkspace: 0)
18045
*                    (CWorkspace: 0)
17786
*                    (RWorkspace: need BDSPAC)
18046
*                    (RWorkspace: need BDSPAC)
17787
*
18047
*
17788
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ), VT,
18048
                     CALL ZBDSQR( 'U', M, N, M, 0, S, RWORK( IE ),
-
 
18049
     $                            VT,
17789
     $                            LDVT, U, LDU, CDUM, 1,
18050
     $                            LDVT, U, LDU, CDUM, 1,
17790
     $                            RWORK( IRWORK ), INFO )
18051
     $                            RWORK( IRWORK ), INFO )
17791
*
18052
*
17792
                  END IF
18053
                  END IF
17793
*
18054
*
Line 18278... Line 18539...
18278
*> \author NAG Ltd.
18539
*> \author NAG Ltd.
18279
*
18540
*
18280
*> \ingroup gesvx
18541
*> \ingroup gesvx
18281
*
18542
*
18282
*  =====================================================================
18543
*  =====================================================================
18283
      SUBROUTINE ZGESVX( FACT, TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV,
18544
      SUBROUTINE ZGESVX( FACT, TRANS, N, NRHS, A, LDA, AF, LDAF,
-
 
18545
     $                   IPIV,
18284
     $                   EQUED, R, C, B, LDB, X, LDX, RCOND, FERR, BERR,
18546
     $                   EQUED, R, C, B, LDB, X, LDX, RCOND, FERR, BERR,
18285
     $                   WORK, RWORK, INFO )
18547
     $                   WORK, RWORK, INFO )
18286
*
18548
*
18287
*  -- LAPACK driver routine --
18549
*  -- LAPACK driver routine --
18288
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
18550
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 18318... Line 18580...
18318
      LOGICAL            LSAME
18580
      LOGICAL            LSAME
18319
      DOUBLE PRECISION   DLAMCH, ZLANGE, ZLANTR
18581
      DOUBLE PRECISION   DLAMCH, ZLANGE, ZLANTR
18320
      EXTERNAL           LSAME, DLAMCH, ZLANGE, ZLANTR
18582
      EXTERNAL           LSAME, DLAMCH, ZLANGE, ZLANTR
18321
*     ..
18583
*     ..
18322
*     .. External Subroutines ..
18584
*     .. External Subroutines ..
18323
      EXTERNAL           XERBLA, ZGECON, ZGEEQU, ZGERFS, ZGETRF, ZGETRS,
18585
      EXTERNAL           XERBLA, ZGECON, ZGEEQU, ZGERFS, ZGETRF,
-
 
18586
     $                   ZGETRS,
18324
     $                   ZLACPY, ZLAQGE
18587
     $                   ZLACPY, ZLAQGE
18325
*     ..
18588
*     ..
18326
*     .. Intrinsic Functions ..
18589
*     .. Intrinsic Functions ..
18327
      INTRINSIC          MAX, MIN
18590
      INTRINSIC          MAX, MIN
18328
*     ..
18591
*     ..
Line 18343... Line 18606...
18343
         BIGNUM = ONE / SMLNUM
18606
         BIGNUM = ONE / SMLNUM
18344
      END IF
18607
      END IF
18345
*
18608
*
18346
*     Test the input parameters.
18609
*     Test the input parameters.
18347
*
18610
*
-
 
18611
      IF( .NOT.NOFACT .AND.
-
 
18612
     $    .NOT.EQUIL .AND.
18348
      IF( .NOT.NOFACT .AND. .NOT.EQUIL .AND. .NOT.LSAME( FACT, 'F' ) )
18613
     $    .NOT.LSAME( FACT, 'F' ) )
18349
     $     THEN
18614
     $     THEN
18350
         INFO = -1
18615
         INFO = -1
18351
      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
18616
      ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
18352
     $         LSAME( TRANS, 'C' ) ) THEN
18617
     $         LSAME( TRANS, 'C' ) ) THEN
18353
         INFO = -2
18618
         INFO = -2
Line 18409... Line 18674...
18409
*
18674
*
18410
      IF( EQUIL ) THEN
18675
      IF( EQUIL ) THEN
18411
*
18676
*
18412
*        Compute row and column scalings to equilibrate the matrix A.
18677
*        Compute row and column scalings to equilibrate the matrix A.
18413
*
18678
*
18414
         CALL ZGEEQU( N, N, A, LDA, R, C, ROWCND, COLCND, AMAX, INFEQU )
18679
         CALL ZGEEQU( N, N, A, LDA, R, C, ROWCND, COLCND, AMAX,
-
 
18680
     $                INFEQU )
18415
         IF( INFEQU.EQ.0 ) THEN
18681
         IF( INFEQU.EQ.0 ) THEN
18416
*
18682
*
18417
*           Equilibrate the matrix.
18683
*           Equilibrate the matrix.
18418
*
18684
*
18419
            CALL ZLAQGE( N, N, A, LDA, R, C, ROWCND, COLCND, AMAX,
18685
            CALL ZLAQGE( N, N, A, LDA, R, C, ROWCND, COLCND, AMAX,
Line 18485... Line 18751...
18485
         RPVGRW = ZLANGE( 'M', N, N, A, LDA, RWORK ) / RPVGRW
18751
         RPVGRW = ZLANGE( 'M', N, N, A, LDA, RWORK ) / RPVGRW
18486
      END IF
18752
      END IF
18487
*
18753
*
18488
*     Compute the reciprocal of the condition number of A.
18754
*     Compute the reciprocal of the condition number of A.
18489
*
18755
*
18490
      CALL ZGECON( NORM, N, AF, LDAF, ANORM, RCOND, WORK, RWORK, INFO )
18756
      CALL ZGECON( NORM, N, AF, LDAF, ANORM, RCOND, WORK, RWORK,
-
 
18757
     $             INFO )
18491
*
18758
*
18492
*     Compute the solution matrix X.
18759
*     Compute the solution matrix X.
18493
*
18760
*
18494
      CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
18761
      CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
18495
      CALL ZGETRS( TRANS, N, NRHS, AF, LDAF, IPIV, X, LDX, INFO )
18762
      CALL ZGETRS( TRANS, N, NRHS, AF, LDAF, IPIV, X, LDX, INFO )
Line 18712... Line 18979...
18712
      DO 40 I = 1, N - 1
18979
      DO 40 I = 1, N - 1
18713
*
18980
*
18714
*        Find max element in matrix A
18981
*        Find max element in matrix A
18715
*
18982
*
18716
         XMAX = ZERO
18983
         XMAX = ZERO
18717
         DO 20 IP = I, N
18984
         DO 20 JP = I, N
18718
            DO 10 JP = I, N
18985
            DO 10 IP = I, N
18719
               IF( ABS( A( IP, JP ) ).GE.XMAX ) THEN
18986
               IF( ABS( A( IP, JP ) ).GE.XMAX ) THEN
18720
                  XMAX = ABS( A( IP, JP ) )
18987
                  XMAX = ABS( A( IP, JP ) )
18721
                  IPV = IP
18988
                  IPV = IP
18722
                  JPV = JP
18989
                  JPV = JP
18723
               END IF
18990
               END IF
Line 19098... Line 19365...
19098
*     ..
19365
*     ..
19099
*     .. Local Scalars ..
19366
*     .. Local Scalars ..
19100
      INTEGER            I, IINFO, J, JB, NB
19367
      INTEGER            I, IINFO, J, JB, NB
19101
*     ..
19368
*     ..
19102
*     .. External Subroutines ..
19369
*     .. External Subroutines ..
19103
      EXTERNAL           XERBLA, ZGEMM, ZGETRF2, ZLASWP, ZTRSM
19370
      EXTERNAL           XERBLA, ZGEMM, ZGETRF2, ZLASWP,
-
 
19371
     $                   ZTRSM
19104
*     ..
19372
*     ..
19105
*     .. External Functions ..
19373
*     .. External Functions ..
19106
      INTEGER            ILAENV
19374
      INTEGER            ILAENV
19107
      EXTERNAL           ILAENV
19375
      EXTERNAL           ILAENV
19108
*     ..
19376
*     ..
Line 19147... Line 19415...
19147
            JB = MIN( MIN( M, N )-J+1, NB )
19415
            JB = MIN( MIN( M, N )-J+1, NB )
19148
*
19416
*
19149
*           Factor diagonal and subdiagonal blocks and test for exact
19417
*           Factor diagonal and subdiagonal blocks and test for exact
19150
*           singularity.
19418
*           singularity.
19151
*
19419
*
19152
            CALL ZGETRF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO )
19420
            CALL ZGETRF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ),
-
 
19421
     $                    IINFO )
19153
*
19422
*
19154
*           Adjust INFO and the pivot indices.
19423
*           Adjust INFO and the pivot indices.
19155
*
19424
*
19156
            IF( INFO.EQ.0 .AND. IINFO.GT.0 )
19425
            IF( INFO.EQ.0 .AND. IINFO.GT.0 )
19157
     $         INFO = IINFO + J - 1
19426
     $         INFO = IINFO + J - 1
Line 19170... Line 19439...
19170
               CALL ZLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
19439
               CALL ZLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1,
19171
     $                      IPIV, 1 )
19440
     $                      IPIV, 1 )
19172
*
19441
*
19173
*              Compute block row of U.
19442
*              Compute block row of U.
19174
*
19443
*
19175
               CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB,
19444
               CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit',
-
 
19445
     $                     JB,
19176
     $                     N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
19446
     $                     N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ),
19177
     $                     LDA )
19447
     $                     LDA )
19178
               IF( J+JB.LE.M ) THEN
19448
               IF( J+JB.LE.M ) THEN
19179
*
19449
*
19180
*                 Update trailing submatrix.
19450
*                 Update trailing submatrix.
19181
*
19451
*
19182
                  CALL ZGEMM( 'No transpose', 'No transpose', M-J-JB+1,
19452
                  CALL ZGEMM( 'No transpose', 'No transpose',
-
 
19453
     $                        M-J-JB+1,
19183
     $                        N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
19454
     $                        N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA,
19184
     $                        A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
19455
     $                        A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ),
19185
     $                        LDA )
19456
     $                        LDA )
19186
               END IF
19457
               END IF
19187
            END IF
19458
            END IF
Line 19604... Line 19875...
19604
*     .. External Functions ..
19875
*     .. External Functions ..
19605
      INTEGER            ILAENV
19876
      INTEGER            ILAENV
19606
      EXTERNAL           ILAENV
19877
      EXTERNAL           ILAENV
19607
*     ..
19878
*     ..
19608
*     .. External Subroutines ..
19879
*     .. External Subroutines ..
19609
      EXTERNAL           XERBLA, ZGEMM, ZGEMV, ZSWAP, ZTRSM, ZTRTRI
19880
      EXTERNAL           XERBLA, ZGEMM, ZGEMV, ZSWAP, ZTRSM,
-
 
19881
     $                   ZTRTRI
19610
*     ..
19882
*     ..
19611
*     .. Intrinsic Functions ..
19883
*     .. Intrinsic Functions ..
19612
      INTRINSIC          MAX, MIN
19884
      INTRINSIC          MAX, MIN
19613
*     ..
19885
*     ..
19614
*     .. Executable Statements ..
19886
*     .. Executable Statements ..
19615
*
19887
*
19616
*     Test the input parameters.
19888
*     Test the input parameters.
19617
*
19889
*
19618
      INFO = 0
19890
      INFO = 0
19619
      NB = ILAENV( 1, 'ZGETRI', ' ', N, -1, -1, -1 )
19891
      NB = ILAENV( 1, 'ZGETRI', ' ', N, -1, -1, -1 )
19620
      LWKOPT = N*NB
19892
      LWKOPT = MAX( 1, N*NB )
19621
      WORK( 1 ) = LWKOPT
19893
      WORK( 1 ) = LWKOPT
19622
      LQUERY = ( LWORK.EQ.-1 )
19894
      LQUERY = ( LWORK.EQ.-1 )
19623
      IF( N.LT.0 ) THEN
19895
      IF( N.LT.0 ) THEN
19624
         INFO = -1
19896
         INFO = -1
19625
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
19897
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
Line 19650... Line 19922...
19650
      LDWORK = N
19922
      LDWORK = N
19651
      IF( NB.GT.1 .AND. NB.LT.N ) THEN
19923
      IF( NB.GT.1 .AND. NB.LT.N ) THEN
19652
         IWS = MAX( LDWORK*NB, 1 )
19924
         IWS = MAX( LDWORK*NB, 1 )
19653
         IF( LWORK.LT.IWS ) THEN
19925
         IF( LWORK.LT.IWS ) THEN
19654
            NB = LWORK / LDWORK
19926
            NB = LWORK / LDWORK
19655
            NBMIN = MAX( 2, ILAENV( 2, 'ZGETRI', ' ', N, -1, -1, -1 ) )
19927
            NBMIN = MAX( 2, ILAENV( 2, 'ZGETRI', ' ', N, -1, -1,
-
 
19928
     $                   -1 ) )
19656
         END IF
19929
         END IF
19657
      ELSE
19930
      ELSE
19658
         IWS = N
19931
         IWS = N
19659
      END IF
19932
      END IF
19660
*
19933
*
Line 19701... Line 19974...
19701
*
19974
*
19702
            IF( J+JB.LE.N )
19975
            IF( J+JB.LE.N )
19703
     $         CALL ZGEMM( 'No transpose', 'No transpose', N, JB,
19976
     $         CALL ZGEMM( 'No transpose', 'No transpose', N, JB,
19704
     $                     N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
19977
     $                     N-J-JB+1, -ONE, A( 1, J+JB ), LDA,
19705
     $                     WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
19978
     $                     WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA )
19706
            CALL ZTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB,
19979
            CALL ZTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N,
-
 
19980
     $                  JB,
19707
     $                  ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
19981
     $                  ONE, WORK( J ), LDWORK, A( 1, J ), LDA )
19708
   50    CONTINUE
19982
   50    CONTINUE
19709
      END IF
19983
      END IF
19710
*
19984
*
19711
*     Apply column interchanges.
19985
*     Apply column interchanges.
Line 19911... Line 20185...
19911
*
20185
*
19912
         CALL ZLASWP( NRHS, B, LDB, 1, N, IPIV, 1 )
20186
         CALL ZLASWP( NRHS, B, LDB, 1, N, IPIV, 1 )
19913
*
20187
*
19914
*        Solve L*X = B, overwriting B with X.
20188
*        Solve L*X = B, overwriting B with X.
19915
*
20189
*
19916
         CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS,
20190
         CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N,
-
 
20191
     $               NRHS,
19917
     $               ONE, A, LDA, B, LDB )
20192
     $               ONE, A, LDA, B, LDB )
19918
*
20193
*
19919
*        Solve U*X = B, overwriting B with X.
20194
*        Solve U*X = B, overwriting B with X.
19920
*
20195
*
19921
         CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
20196
         CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
Line 19924... Line 20199...
19924
*
20199
*
19925
*        Solve A**T * X = B  or A**H * X = B.
20200
*        Solve A**T * X = B  or A**H * X = B.
19926
*
20201
*
19927
*        Solve U**T *X = B or U**H *X = B, overwriting B with X.
20202
*        Solve U**T *X = B or U**H *X = B, overwriting B with X.
19928
*
20203
*
19929
         CALL ZTRSM( 'Left', 'Upper', TRANS, 'Non-unit', N, NRHS, ONE,
20204
         CALL ZTRSM( 'Left', 'Upper', TRANS, 'Non-unit', N, NRHS,
-
 
20205
     $               ONE,
19930
     $               A, LDA, B, LDB )
20206
     $               A, LDA, B, LDB )
19931
*
20207
*
19932
*        Solve L**T *X = B, or L**H *X = B overwriting B with X.
20208
*        Solve L**T *X = B, or L**H *X = B overwriting B with X.
19933
*
20209
*
19934
         CALL ZTRSM( 'Left', 'Lower', TRANS, 'Unit', N, NRHS, ONE, A,
20210
         CALL ZTRSM( 'Left', 'Lower', TRANS, 'Unit', N, NRHS, ONE, A,
Line 20087... Line 20363...
20087
*>  See R.C. Ward, Balancing the generalized eigenvalue problem,
20363
*>  See R.C. Ward, Balancing the generalized eigenvalue problem,
20088
*>                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
20364
*>                 SIAM J. Sci. Stat. Comp. 2 (1981), 141-152.
20089
*> \endverbatim
20365
*> \endverbatim
20090
*>
20366
*>
20091
*  =====================================================================
20367
*  =====================================================================
20092
      SUBROUTINE ZGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V,
20368
      SUBROUTINE ZGGBAK( JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M,
-
 
20369
     $                   V,
20093
     $                   LDV, INFO )
20370
     $                   LDV, INFO )
20094
*
20371
*
20095
*  -- LAPACK computational routine --
20372
*  -- LAPACK computational routine --
20096
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
20373
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
20097
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
20374
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 20127... Line 20404...
20127
*
20404
*
20128
      RIGHTV = LSAME( SIDE, 'R' )
20405
      RIGHTV = LSAME( SIDE, 'R' )
20129
      LEFTV = LSAME( SIDE, 'L' )
20406
      LEFTV = LSAME( SIDE, 'L' )
20130
*
20407
*
20131
      INFO = 0
20408
      INFO = 0
20132
      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
20409
      IF( .NOT.LSAME( JOB, 'N' ) .AND.
-
 
20410
     $    .NOT.LSAME( JOB, 'P' ) .AND.
-
 
20411
     $    .NOT.LSAME( JOB, 'S' ) .AND.
20133
     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
20412
     $                .NOT.LSAME( JOB, 'B' ) ) THEN
20134
         INFO = -1
20413
         INFO = -1
20135
      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
20414
      ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
20136
         INFO = -2
20415
         INFO = -2
20137
      ELSE IF( N.LT.0 ) THEN
20416
      ELSE IF( N.LT.0 ) THEN
20138
         INFO = -3
20417
         INFO = -3
Line 20478... Line 20757...
20478
*     .. Executable Statements ..
20757
*     .. Executable Statements ..
20479
*
20758
*
20480
*     Test the input parameters
20759
*     Test the input parameters
20481
*
20760
*
20482
      INFO = 0
20761
      INFO = 0
20483
      IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
20762
      IF( .NOT.LSAME( JOB, 'N' ) .AND.
-
 
20763
     $    .NOT.LSAME( JOB, 'P' ) .AND.
-
 
20764
     $    .NOT.LSAME( JOB, 'S' ) .AND.
20484
     $    .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
20765
     $                .NOT.LSAME( JOB, 'B' ) ) THEN
20485
         INFO = -1
20766
         INFO = -1
20486
      ELSE IF( N.LT.0 ) THEN
20767
      ELSE IF( N.LT.0 ) THEN
20487
         INFO = -2
20768
         INFO = -2
20488
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
20769
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
20489
         INFO = -4
20770
         INFO = -4
Line 20762... Line 21043...
20762
         RSCALE( I ) = RSCALE( I ) + COR
21043
         RSCALE( I ) = RSCALE( I ) + COR
20763
  340 CONTINUE
21044
  340 CONTINUE
20764
      IF( CMAX.LT.HALF )
21045
      IF( CMAX.LT.HALF )
20765
     $   GO TO 350
21046
     $   GO TO 350
20766
*
21047
*
20767
      CALL DAXPY( NR, -ALPHA, WORK( ILO+2*N ), 1, WORK( ILO+4*N ), 1 )
21048
      CALL DAXPY( NR, -ALPHA, WORK( ILO+2*N ), 1, WORK( ILO+4*N ),
-
 
21049
     $            1 )
20768
      CALL DAXPY( NR, -ALPHA, WORK( ILO+3*N ), 1, WORK( ILO+5*N ), 1 )
21050
      CALL DAXPY( NR, -ALPHA, WORK( ILO+3*N ), 1, WORK( ILO+5*N ),
-
 
21051
     $            1 )
20769
*
21052
*
20770
      PGAMMA = GAMMA
21053
      PGAMMA = GAMMA
20771
      IT = IT + 1
21054
      IT = IT + 1
20772
      IF( IT.LE.NRP2 )
21055
      IF( IT.LE.NRP2 )
20773
     $   GO TO 250
21056
     $   GO TO 250
Line 21081... Line 21364...
21081
*> \author NAG Ltd.
21364
*> \author NAG Ltd.
21082
*
21365
*
21083
*> \ingroup gges
21366
*> \ingroup gges
21084
*
21367
*
21085
*  =====================================================================
21368
*  =====================================================================
21086
      SUBROUTINE ZGGES( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
21369
      SUBROUTINE ZGGES( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
-
 
21370
     $                  LDB,
21087
     $                  SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK,
21371
     $                  SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK,
21088
     $                  LWORK, RWORK, BWORK, INFO )
21372
     $                  LWORK, RWORK, BWORK, INFO )
21089
*
21373
*
21090
*  -- LAPACK driver routine --
21374
*  -- LAPACK driver routine --
21091
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
21375
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 21128... Line 21412...
21128
*     .. Local Arrays ..
21412
*     .. Local Arrays ..
21129
      INTEGER            IDUM( 1 )
21413
      INTEGER            IDUM( 1 )
21130
      DOUBLE PRECISION   DIF( 2 )
21414
      DOUBLE PRECISION   DIF( 2 )
21131
*     ..
21415
*     ..
21132
*     .. External Subroutines ..
21416
*     .. External Subroutines ..
21133
      EXTERNAL           XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHRD, ZHGEQZ,
21417
      EXTERNAL           XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHRD,
-
 
21418
     $                   ZHGEQZ,
21134
     $                   ZLACPY, ZLASCL, ZLASET, ZTGSEN, ZUNGQR, ZUNMQR
21419
     $                   ZLACPY, ZLASCL, ZLASET, ZTGSEN, ZUNGQR, ZUNMQR
21135
*     ..
21420
*     ..
21136
*     .. External Functions ..
21421
*     .. External Functions ..
21137
      LOGICAL            LSAME
21422
      LOGICAL            LSAME
21138
      INTEGER            ILAENV
21423
      INTEGER            ILAENV
Line 21176... Line 21461...
21176
      LQUERY = ( LWORK.EQ.-1 )
21461
      LQUERY = ( LWORK.EQ.-1 )
21177
      IF( IJOBVL.LE.0 ) THEN
21462
      IF( IJOBVL.LE.0 ) THEN
21178
         INFO = -1
21463
         INFO = -1
21179
      ELSE IF( IJOBVR.LE.0 ) THEN
21464
      ELSE IF( IJOBVR.LE.0 ) THEN
21180
         INFO = -2
21465
         INFO = -2
-
 
21466
      ELSE IF( ( .NOT.WANTST ) .AND.
21181
      ELSE IF( ( .NOT.WANTST ) .AND. ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
21467
     $         ( .NOT.LSAME( SORT, 'N' ) ) ) THEN
21182
         INFO = -3
21468
         INFO = -3
21183
      ELSE IF( N.LT.0 ) THEN
21469
      ELSE IF( N.LT.0 ) THEN
21184
         INFO = -5
21470
         INFO = -5
21185
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
21471
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
21186
         INFO = -7
21472
         INFO = -7
Line 21199... Line 21485...
21199
*       NB refers to the optimal block size for the immediately
21485
*       NB refers to the optimal block size for the immediately
21200
*       following subroutine, as returned by ILAENV.)
21486
*       following subroutine, as returned by ILAENV.)
21201
*
21487
*
21202
      IF( INFO.EQ.0 ) THEN
21488
      IF( INFO.EQ.0 ) THEN
21203
         LWKMIN = MAX( 1, 2*N )
21489
         LWKMIN = MAX( 1, 2*N )
21204
         LWKOPT = MAX( 1, N + N*ILAENV( 1, 'ZGEQRF', ' ', N, 1, N, 0 ) )
21490
         LWKOPT = MAX( 1, N + N*ILAENV( 1, 'ZGEQRF', ' ', N, 1, N,
-
 
21491
     $                 0 ) )
21205
         LWKOPT = MAX( LWKOPT, N +
21492
         LWKOPT = MAX( LWKOPT, N +
21206
     $                 N*ILAENV( 1, 'ZUNMQR', ' ', N, 1, N, -1 ) )
21493
     $                 N*ILAENV( 1, 'ZUNMQR', ' ', N, 1, N, -1 ) )
21207
         IF( ILVSL ) THEN
21494
         IF( ILVSL ) THEN
21208
            LWKOPT = MAX( LWKOPT, N +
21495
            LWKOPT = MAX( LWKOPT, N +
21209
     $                    N*ILAENV( 1, 'ZUNGQR', ' ', N, 1, N, -1 ) )
21496
     $                    N*ILAENV( 1, 'ZUNGQR', ' ', N, 1, N, -1 ) )
Line 21343... Line 21630...
21343
      IF( WANTST ) THEN
21630
      IF( WANTST ) THEN
21344
*
21631
*
21345
*        Undo scaling on eigenvalues before selecting
21632
*        Undo scaling on eigenvalues before selecting
21346
*
21633
*
21347
         IF( ILASCL )
21634
         IF( ILASCL )
21348
     $      CALL ZLASCL( 'G', 0, 0, ANRM, ANRMTO, N, 1, ALPHA, N, IERR )
21635
     $      CALL ZLASCL( 'G', 0, 0, ANRM, ANRMTO, N, 1, ALPHA, N,
-
 
21636
     $                   IERR )
21349
         IF( ILBSCL )
21637
         IF( ILBSCL )
21350
     $      CALL ZLASCL( 'G', 0, 0, BNRM, BNRMTO, N, 1, BETA, N, IERR )
21638
     $      CALL ZLASCL( 'G', 0, 0, BNRM, BNRMTO, N, 1, BETA, N,
-
 
21639
     $                   IERR )
21351
*
21640
*
21352
*        Select eigenvalues
21641
*        Select eigenvalues
21353
*
21642
*
21354
         DO 10 I = 1, N
21643
         DO 10 I = 1, N
21355
            BWORK( I ) = SELCTG( ALPHA( I ), BETA( I ) )
21644
            BWORK( I ) = SELCTG( ALPHA( I ), BETA( I ) )
21356
   10    CONTINUE
21645
   10    CONTINUE
21357
*
21646
*
21358
         CALL ZTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB, ALPHA,
21647
         CALL ZTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB,
-
 
21648
     $                ALPHA,
21359
     $                BETA, VSL, LDVSL, VSR, LDVSR, SDIM, PVSL, PVSR,
21649
     $                BETA, VSL, LDVSL, VSR, LDVSR, SDIM, PVSL, PVSR,
21360
     $                DIF, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1, IERR )
21650
     $                DIF, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1, IERR )
21361
         IF( IERR.EQ.1 )
21651
         IF( IERR.EQ.1 )
21362
     $      INFO = N + 3
21652
     $      INFO = N + 3
21363
*
21653
*
Line 21664... Line 21954...
21664
*     ..
21954
*     ..
21665
*     .. Local Arrays ..
21955
*     .. Local Arrays ..
21666
      LOGICAL            LDUMMA( 1 )
21956
      LOGICAL            LDUMMA( 1 )
21667
*     ..
21957
*     ..
21668
*     .. External Subroutines ..
21958
*     .. External Subroutines ..
21669
      EXTERNAL           XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHRD, ZHGEQZ,
21959
      EXTERNAL           XERBLA, ZGEQRF, ZGGBAK, ZGGBAL, ZGGHRD,
-
 
21960
     $                   ZHGEQZ,
21670
     $                   ZLACPY, ZLASCL, ZLASET, ZTGEVC, ZUNGQR, ZUNMQR
21961
     $                   ZLACPY, ZLASCL, ZLASET, ZTGEVC, ZUNGQR, ZUNMQR
21671
*     ..
21962
*     ..
21672
*     .. External Functions ..
21963
*     .. External Functions ..
21673
      LOGICAL            LSAME
21964
      LOGICAL            LSAME
21674
      INTEGER            ILAENV
21965
      INTEGER            ILAENV
Line 21739... Line 22030...
21739
*       following subroutine, as returned by ILAENV. The workspace is
22030
*       following subroutine, as returned by ILAENV. The workspace is
21740
*       computed assuming ILO = 1 and IHI = N, the worst case.)
22031
*       computed assuming ILO = 1 and IHI = N, the worst case.)
21741
*
22032
*
21742
      IF( INFO.EQ.0 ) THEN
22033
      IF( INFO.EQ.0 ) THEN
21743
         LWKMIN = MAX( 1, 2*N )
22034
         LWKMIN = MAX( 1, 2*N )
21744
         LWKOPT = MAX( 1, N + N*ILAENV( 1, 'ZGEQRF', ' ', N, 1, N, 0 ) )
22035
         LWKOPT = MAX( 1, N + N*ILAENV( 1, 'ZGEQRF', ' ', N, 1, N,
-
 
22036
     $                 0 ) )
21745
         LWKOPT = MAX( LWKOPT, N +
22037
         LWKOPT = MAX( LWKOPT, N +
21746
     $                 N*ILAENV( 1, 'ZUNMQR', ' ', N, 1, N, 0 ) )
22038
     $                 N*ILAENV( 1, 'ZUNMQR', ' ', N, 1, N, 0 ) )
21747
         IF( ILVL ) THEN
22039
         IF( ILVL ) THEN
21748
            LWKOPT = MAX( LWKOPT, N +
22040
            LWKOPT = MAX( LWKOPT, N +
21749
     $                    N*ILAENV( 1, 'ZUNGQR', ' ', N, 1, N, -1 ) )
22041
     $                    N*ILAENV( 1, 'ZUNGQR', ' ', N, 1, N, -1 ) )
Line 21901... Line 22193...
21901
            END IF
22193
            END IF
21902
         ELSE
22194
         ELSE
21903
            CHTEMP = 'R'
22195
            CHTEMP = 'R'
21904
         END IF
22196
         END IF
21905
*
22197
*
21906
         CALL ZTGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
22198
         CALL ZTGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL,
-
 
22199
     $                LDVL,
21907
     $                VR, LDVR, N, IN, WORK( IWRK ), RWORK( IRWRK ),
22200
     $                VR, LDVR, N, IN, WORK( IWRK ), RWORK( IRWRK ),
21908
     $                IERR )
22201
     $                IERR )
21909
         IF( IERR.NE.0 ) THEN
22202
         IF( IERR.NE.0 ) THEN
21910
            INFO = N + 2
22203
            INFO = N + 2
21911
            GO TO 70
22204
            GO TO 70
Line 22163... Line 22456...
22163
*>  an unblocked reduction, as described in _Matrix_Computations_,
22456
*>  an unblocked reduction, as described in _Matrix_Computations_,
22164
*>  by Golub and van Loan (Johns Hopkins Press).
22457
*>  by Golub and van Loan (Johns Hopkins Press).
22165
*> \endverbatim
22458
*> \endverbatim
22166
*>
22459
*>
22167
*  =====================================================================
22460
*  =====================================================================
22168
      SUBROUTINE ZGGHRD( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q,
22461
      SUBROUTINE ZGGHRD( COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB,
-
 
22462
     $                   Q,
22169
     $                   LDQ, Z, LDZ, INFO )
22463
     $                   LDQ, Z, LDZ, INFO )
22170
*
22464
*
22171
*  -- LAPACK computational routine --
22465
*  -- LAPACK computational routine --
22172
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
22466
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
22173
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
22467
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 22307... Line 22601...
22307
*
22601
*
22308
            CTEMP = B( JROW, JROW )
22602
            CTEMP = B( JROW, JROW )
22309
            CALL ZLARTG( CTEMP, B( JROW, JROW-1 ), C, S,
22603
            CALL ZLARTG( CTEMP, B( JROW, JROW-1 ), C, S,
22310
     $                   B( JROW, JROW ) )
22604
     $                   B( JROW, JROW ) )
22311
            B( JROW, JROW-1 ) = CZERO
22605
            B( JROW, JROW-1 ) = CZERO
22312
            CALL ZROT( IHI, A( 1, JROW ), 1, A( 1, JROW-1 ), 1, C, S )
22606
            CALL ZROT( IHI, A( 1, JROW ), 1, A( 1, JROW-1 ), 1, C,
-
 
22607
     $                 S )
22313
            CALL ZROT( JROW-1, B( 1, JROW ), 1, B( 1, JROW-1 ), 1, C,
22608
            CALL ZROT( JROW-1, B( 1, JROW ), 1, B( 1, JROW-1 ), 1, C,
22314
     $                 S )
22609
     $                 S )
22315
            IF( ILZ )
22610
            IF( ILZ )
22316
     $         CALL ZROT( N, Z( 1, JROW ), 1, Z( 1, JROW-1 ), 1, C, S )
22611
     $         CALL ZROT( N, Z( 1, JROW ), 1, Z( 1, JROW-1 ), 1, C,
-
 
22612
     $                    S )
22317
   30    CONTINUE
22613
   30    CONTINUE
22318
   40 CONTINUE
22614
   40 CONTINUE
22319
*
22615
*
22320
      RETURN
22616
      RETURN
22321
*
22617
*
Line 22776... Line 23072...
22776
*> \author NAG Ltd.
23072
*> \author NAG Ltd.
22777
*
23073
*
22778
*> \ingroup gtrfs
23074
*> \ingroup gtrfs
22779
*
23075
*
22780
*  =====================================================================
23076
*  =====================================================================
22781
      SUBROUTINE ZGTRFS( TRANS, N, NRHS, DL, D, DU, DLF, DF, DUF, DU2,
23077
      SUBROUTINE ZGTRFS( TRANS, N, NRHS, DL, D, DU, DLF, DF, DUF,
-
 
23078
     $                   DU2,
22782
     $                   IPIV, B, LDB, X, LDX, FERR, BERR, WORK, RWORK,
23079
     $                   IPIV, B, LDB, X, LDX, FERR, BERR, WORK, RWORK,
22783
     $                   INFO )
23080
     $                   INFO )
22784
*
23081
*
22785
*  -- LAPACK computational routine --
23082
*  -- LAPACK computational routine --
22786
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
23083
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 22819... Line 23116...
22819
*     ..
23116
*     ..
22820
*     .. Local Arrays ..
23117
*     .. Local Arrays ..
22821
      INTEGER            ISAVE( 3 )
23118
      INTEGER            ISAVE( 3 )
22822
*     ..
23119
*     ..
22823
*     .. External Subroutines ..
23120
*     .. External Subroutines ..
22824
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZGTTRS, ZLACN2, ZLAGTM
23121
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZGTTRS, ZLACN2,
-
 
23122
     $                   ZLAGTM
22825
*     ..
23123
*     ..
22826
*     .. Intrinsic Functions ..
23124
*     .. Intrinsic Functions ..
22827
      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, MAX
23125
      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, MAX
22828
*     ..
23126
*     ..
22829
*     .. External Functions ..
23127
*     .. External Functions ..
Line 22898... Line 23196...
22898
*
23196
*
22899
*        Compute residual R = B - op(A) * X,
23197
*        Compute residual R = B - op(A) * X,
22900
*        where op(A) = A, A**T, or A**H, depending on TRANS.
23198
*        where op(A) = A, A**T, or A**H, depending on TRANS.
22901
*
23199
*
22902
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
23200
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
22903
         CALL ZLAGTM( TRANS, N, 1, -ONE, DL, D, DU, X( 1, J ), LDX, ONE,
23201
         CALL ZLAGTM( TRANS, N, 1, -ONE, DL, D, DU, X( 1, J ), LDX,
-
 
23202
     $                ONE,
22904
     $                WORK, N )
23203
     $                WORK, N )
22905
*
23204
*
22906
*        Compute abs(op(A))*abs(x) + abs(b) for use in the backward
23205
*        Compute abs(op(A))*abs(x) + abs(b) for use in the backward
22907
*        error bound.
23206
*        error bound.
22908
*
23207
*
Line 22973... Line 23272...
22973
         IF( BERR( J ).GT.EPS .AND. TWO*BERR( J ).LE.LSTRES .AND.
23272
         IF( BERR( J ).GT.EPS .AND. TWO*BERR( J ).LE.LSTRES .AND.
22974
     $       COUNT.LE.ITMAX ) THEN
23273
     $       COUNT.LE.ITMAX ) THEN
22975
*
23274
*
22976
*           Update solution and try again.
23275
*           Update solution and try again.
22977
*
23276
*
22978
            CALL ZGTTRS( TRANS, N, 1, DLF, DF, DUF, DU2, IPIV, WORK, N,
23277
            CALL ZGTTRS( TRANS, N, 1, DLF, DF, DUF, DU2, IPIV, WORK,
-
 
23278
     $                   N,
22979
     $                   INFO )
23279
     $                   INFO )
22980
            CALL ZAXPY( N, DCMPLX( ONE ), WORK, 1, X( 1, J ), 1 )
23280
            CALL ZAXPY( N, DCMPLX( ONE ), WORK, 1, X( 1, J ), 1 )
22981
            LSTRES = BERR( J )
23281
            LSTRES = BERR( J )
22982
            COUNT = COUNT + 1
23282
            COUNT = COUNT + 1
22983
            GO TO 20
23283
            GO TO 20
Line 23020... Line 23320...
23020
         IF( KASE.NE.0 ) THEN
23320
         IF( KASE.NE.0 ) THEN
23021
            IF( KASE.EQ.1 ) THEN
23321
            IF( KASE.EQ.1 ) THEN
23022
*
23322
*
23023
*              Multiply by diag(W)*inv(op(A)**H).
23323
*              Multiply by diag(W)*inv(op(A)**H).
23024
*
23324
*
23025
               CALL ZGTTRS( TRANST, N, 1, DLF, DF, DUF, DU2, IPIV, WORK,
23325
               CALL ZGTTRS( TRANST, N, 1, DLF, DF, DUF, DU2, IPIV,
-
 
23326
     $                      WORK,
23026
     $                      N, INFO )
23327
     $                      N, INFO )
23027
               DO 80 I = 1, N
23328
               DO 80 I = 1, N
23028
                  WORK( I ) = RWORK( I )*WORK( I )
23329
                  WORK( I ) = RWORK( I )*WORK( I )
23029
   80          CONTINUE
23330
   80          CONTINUE
23030
            ELSE
23331
            ELSE
Line 23032... Line 23333...
23032
*              Multiply by inv(op(A))*diag(W).
23333
*              Multiply by inv(op(A))*diag(W).
23033
*
23334
*
23034
               DO 90 I = 1, N
23335
               DO 90 I = 1, N
23035
                  WORK( I ) = RWORK( I )*WORK( I )
23336
                  WORK( I ) = RWORK( I )*WORK( I )
23036
   90          CONTINUE
23337
   90          CONTINUE
23037
               CALL ZGTTRS( TRANSN, N, 1, DLF, DF, DUF, DU2, IPIV, WORK,
23338
               CALL ZGTTRS( TRANSN, N, 1, DLF, DF, DUF, DU2, IPIV,
-
 
23339
     $                      WORK,
23038
     $                      N, INFO )
23340
     $                      N, INFO )
23039
            END IF
23341
            END IF
23040
            GO TO 70
23342
            GO TO 70
23041
         END IF
23343
         END IF
23042
*
23344
*
Line 23585... Line 23887...
23585
*> \author NAG Ltd.
23887
*> \author NAG Ltd.
23586
*
23888
*
23587
*> \ingroup gtsvx
23889
*> \ingroup gtsvx
23588
*
23890
*
23589
*  =====================================================================
23891
*  =====================================================================
23590
      SUBROUTINE ZGTSVX( FACT, TRANS, N, NRHS, DL, D, DU, DLF, DF, DUF,
23892
      SUBROUTINE ZGTSVX( FACT, TRANS, N, NRHS, DL, D, DU, DLF, DF,
-
 
23893
     $                   DUF,
23591
     $                   DU2, IPIV, B, LDB, X, LDX, RCOND, FERR, BERR,
23894
     $                   DU2, IPIV, B, LDB, X, LDX, RCOND, FERR, BERR,
23592
     $                   WORK, RWORK, INFO )
23895
     $                   WORK, RWORK, INFO )
23593
*
23896
*
23594
*  -- LAPACK driver routine --
23897
*  -- LAPACK driver routine --
23595
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
23898
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 23623... Line 23926...
23623
      LOGICAL            LSAME
23926
      LOGICAL            LSAME
23624
      DOUBLE PRECISION   DLAMCH, ZLANGT
23927
      DOUBLE PRECISION   DLAMCH, ZLANGT
23625
      EXTERNAL           LSAME, DLAMCH, ZLANGT
23928
      EXTERNAL           LSAME, DLAMCH, ZLANGT
23626
*     ..
23929
*     ..
23627
*     .. External Subroutines ..
23930
*     .. External Subroutines ..
23628
      EXTERNAL           XERBLA, ZCOPY, ZGTCON, ZGTRFS, ZGTTRF, ZGTTRS,
23931
      EXTERNAL           XERBLA, ZCOPY, ZGTCON, ZGTRFS, ZGTTRF,
-
 
23932
     $                   ZGTTRS,
23629
     $                   ZLACPY
23933
     $                   ZLACPY
23630
*     ..
23934
*     ..
23631
*     .. Intrinsic Functions ..
23935
*     .. Intrinsic Functions ..
23632
      INTRINSIC          MAX
23936
      INTRINSIC          MAX
23633
*     ..
23937
*     ..
Line 23683... Line 23987...
23683
      END IF
23987
      END IF
23684
      ANORM = ZLANGT( NORM, N, DL, D, DU )
23988
      ANORM = ZLANGT( NORM, N, DL, D, DU )
23685
*
23989
*
23686
*     Compute the reciprocal of the condition number of A.
23990
*     Compute the reciprocal of the condition number of A.
23687
*
23991
*
23688
      CALL ZGTCON( NORM, N, DLF, DF, DUF, DU2, IPIV, ANORM, RCOND, WORK,
23992
      CALL ZGTCON( NORM, N, DLF, DF, DUF, DU2, IPIV, ANORM, RCOND,
-
 
23993
     $             WORK,
23689
     $             INFO )
23994
     $             INFO )
23690
*
23995
*
23691
*     Compute the solution vectors X.
23996
*     Compute the solution vectors X.
23692
*
23997
*
23693
      CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
23998
      CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
Line 23695... Line 24000...
23695
     $             INFO )
24000
     $             INFO )
23696
*
24001
*
23697
*     Use iterative refinement to improve the computed solutions and
24002
*     Use iterative refinement to improve the computed solutions and
23698
*     compute error bounds and backward error estimates for them.
24003
*     compute error bounds and backward error estimates for them.
23699
*
24004
*
23700
      CALL ZGTRFS( TRANS, N, NRHS, DL, D, DU, DLF, DF, DUF, DU2, IPIV,
24005
      CALL ZGTRFS( TRANS, N, NRHS, DL, D, DU, DLF, DF, DUF, DU2,
-
 
24006
     $             IPIV,
23701
     $             B, LDB, X, LDX, FERR, BERR, WORK, RWORK, INFO )
24007
     $             B, LDB, X, LDX, FERR, BERR, WORK, RWORK, INFO )
23702
*
24008
*
23703
*     Set INFO = N+1 if the matrix is singular to working precision.
24009
*     Set INFO = N+1 if the matrix is singular to working precision.
23704
*
24010
*
23705
      IF( RCOND.LT.DLAMCH( 'Epsilon' ) )
24011
      IF( RCOND.LT.DLAMCH( 'Epsilon' ) )
Line 24083... Line 24389...
24083
*> \author NAG Ltd.
24389
*> \author NAG Ltd.
24084
*
24390
*
24085
*> \ingroup gttrs
24391
*> \ingroup gttrs
24086
*
24392
*
24087
*  =====================================================================
24393
*  =====================================================================
24088
      SUBROUTINE ZGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB,
24394
      SUBROUTINE ZGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B,
-
 
24395
     $                   LDB,
24089
     $                   INFO )
24396
     $                   INFO )
24090
*
24397
*
24091
*  -- LAPACK computational routine --
24398
*  -- LAPACK computational routine --
24092
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
24399
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
24093
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
24400
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 24162... Line 24469...
24162
      IF( NB.GE.NRHS ) THEN
24469
      IF( NB.GE.NRHS ) THEN
24163
         CALL ZGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
24470
         CALL ZGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
24164
      ELSE
24471
      ELSE
24165
         DO 10 J = 1, NRHS, NB
24472
         DO 10 J = 1, NRHS, NB
24166
            JB = MIN( NRHS-J+1, NB )
24473
            JB = MIN( NRHS-J+1, NB )
24167
            CALL ZGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1, J ),
24474
            CALL ZGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1,
-
 
24475
     $                   J ),
24168
     $                   LDB )
24476
     $                   LDB )
24169
   10    CONTINUE
24477
   10    CONTINUE
24170
      END IF
24478
      END IF
24171
*
24479
*
24172
*     End of ZGTTRS
24480
*     End of ZGTTRS
Line 24296... Line 24604...
24296
*> \author NAG Ltd.
24604
*> \author NAG Ltd.
24297
*
24605
*
24298
*> \ingroup gtts2
24606
*> \ingroup gtts2
24299
*
24607
*
24300
*  =====================================================================
24608
*  =====================================================================
24301
      SUBROUTINE ZGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB )
24609
      SUBROUTINE ZGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B,
-
 
24610
     $                   LDB )
24302
*
24611
*
24303
*  -- LAPACK computational routine --
24612
*  -- LAPACK computational routine --
24304
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
24613
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
24305
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
24614
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
24306
*
24615
*
Line 24927... Line 25236...
24927
      INTEGER            ILAENV
25236
      INTEGER            ILAENV
24928
      DOUBLE PRECISION   DLAMCH, ZLANHE
25237
      DOUBLE PRECISION   DLAMCH, ZLANHE
24929
      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANHE
25238
      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANHE
24930
*     ..
25239
*     ..
24931
*     .. External Subroutines ..
25240
*     .. External Subroutines ..
24932
      EXTERNAL           DSCAL, DSTERF, XERBLA, ZHETRD, ZLASCL, ZSTEQR,
25241
      EXTERNAL           DSCAL, DSTERF, XERBLA, ZHETRD, ZLASCL,
-
 
25242
     $                   ZSTEQR,
24933
     $                   ZUNGTR
25243
     $                   ZUNGTR
24934
*     ..
25244
*     ..
24935
*     .. Intrinsic Functions ..
25245
*     .. Intrinsic Functions ..
24936
      INTRINSIC          MAX, SQRT
25246
      INTRINSIC          MAX, SQRT
24937
*     ..
25247
*     ..
Line 25020... Line 25330...
25020
*     ZUNGTR to generate the unitary matrix, then call ZSTEQR.
25330
*     ZUNGTR to generate the unitary matrix, then call ZSTEQR.
25021
*
25331
*
25022
      IF( .NOT.WANTZ ) THEN
25332
      IF( .NOT.WANTZ ) THEN
25023
         CALL DSTERF( N, W, RWORK( INDE ), INFO )
25333
         CALL DSTERF( N, W, RWORK( INDE ), INFO )
25024
      ELSE
25334
      ELSE
25025
         CALL ZUNGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ),
25335
         CALL ZUNGTR( UPLO, N, A, LDA, WORK( INDTAU ),
-
 
25336
     $                WORK( INDWRK ),
25026
     $                LLWORK, IINFO )
25337
     $                LLWORK, IINFO )
25027
         INDWRK = INDE + N
25338
         INDWRK = INDE + N
25028
         CALL ZSTEQR( JOBZ, N, W, RWORK( INDE ), A, LDA,
25339
         CALL ZSTEQR( JOBZ, N, W, RWORK( INDE ), A, LDA,
25029
     $                RWORK( INDWRK ), INFO )
25340
     $                RWORK( INDWRK ), INFO )
25030
      END IF
25341
      END IF
Line 25165... Line 25476...
25165
*>          related to LWORK or LRWORK or LIWORK is issued by XERBLA.
25476
*>          related to LWORK or LRWORK or LIWORK is issued by XERBLA.
25166
*> \endverbatim
25477
*> \endverbatim
25167
*>
25478
*>
25168
*> \param[out] RWORK
25479
*> \param[out] RWORK
25169
*> \verbatim
25480
*> \verbatim
25170
*>          RWORK is DOUBLE PRECISION array,
25481
*>          RWORK is DOUBLE PRECISION array, dimension (MAX(1,LRWORK))
25171
*>                                         dimension (LRWORK)
-
 
25172
*>          On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK.
25482
*>          On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK.
25173
*> \endverbatim
25483
*> \endverbatim
25174
*>
25484
*>
25175
*> \param[in] LRWORK
25485
*> \param[in] LRWORK
25176
*> \verbatim
25486
*> \verbatim
Line 25243... Line 25553...
25243
*>
25553
*>
25244
*> Jeff Rutter, Computer Science Division, University of California
25554
*> Jeff Rutter, Computer Science Division, University of California
25245
*> at Berkeley, USA
25555
*> at Berkeley, USA
25246
*>
25556
*>
25247
*  =====================================================================
25557
*  =====================================================================
25248
      SUBROUTINE ZHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK,
25558
      SUBROUTINE ZHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK,
-
 
25559
     $                   RWORK,
25249
     $                   LRWORK, IWORK, LIWORK, INFO )
25560
     $                   LRWORK, IWORK, LIWORK, INFO )
25250
*
25561
*
25251
*  -- LAPACK driver routine --
25562
*  -- LAPACK driver routine --
25252
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
25563
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
25253
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
25564
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 25283... Line 25594...
25283
      INTEGER            ILAENV
25594
      INTEGER            ILAENV
25284
      DOUBLE PRECISION   DLAMCH, ZLANHE
25595
      DOUBLE PRECISION   DLAMCH, ZLANHE
25285
      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANHE
25596
      EXTERNAL           LSAME, ILAENV, DLAMCH, ZLANHE
25286
*     ..
25597
*     ..
25287
*     .. External Subroutines ..
25598
*     .. External Subroutines ..
25288
      EXTERNAL           DSCAL, DSTERF, XERBLA, ZHETRD, ZLACPY, ZLASCL,
25599
      EXTERNAL           DSCAL, DSTERF, XERBLA, ZHETRD, ZLACPY,
-
 
25600
     $                   ZLASCL,
25289
     $                   ZSTEDC, ZUNMTR
25601
     $                   ZSTEDC, ZUNMTR
25290
*     ..
25602
*     ..
25291
*     .. Intrinsic Functions ..
25603
*     .. Intrinsic Functions ..
25292
      INTRINSIC          MAX, SQRT
25604
      INTRINSIC          MAX, SQRT
25293
*     ..
25605
*     ..
Line 25327... Line 25639...
25327
               LWMIN = N + 1
25639
               LWMIN = N + 1
25328
               LRWMIN = N
25640
               LRWMIN = N
25329
               LIWMIN = 1
25641
               LIWMIN = 1
25330
            END IF
25642
            END IF
25331
            LOPT = MAX( LWMIN, N +
25643
            LOPT = MAX( LWMIN, N +
25332
     $                  N*ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 ) )
25644
     $                  N*ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1,
-
 
25645
     $                            -1 ) )
25333
            LROPT = LRWMIN
25646
            LROPT = LRWMIN
25334
            LIOPT = LIWMIN
25647
            LIOPT = LIWMIN
25335
         END IF
25648
         END IF
25336
         WORK( 1 ) = LOPT
25649
         WORK( 1 ) = LOPT
25337
         RWORK( 1 ) = LROPT
25650
         RWORK( 1 ) = REAL( LROPT )
25338
         IWORK( 1 ) = LIOPT
25651
         IWORK( 1 ) = LIOPT
25339
*
25652
*
25340
         IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
25653
         IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
25341
            INFO = -8
25654
            INFO = -8
25342
         ELSE IF( LRWORK.LT.LRWMIN .AND. .NOT.LQUERY ) THEN
25655
         ELSE IF( LRWORK.LT.LRWMIN .AND. .NOT.LQUERY ) THEN
Line 25428... Line 25741...
25428
         END IF
25741
         END IF
25429
         CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
25742
         CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
25430
      END IF
25743
      END IF
25431
*
25744
*
25432
      WORK( 1 ) = LOPT
25745
      WORK( 1 ) = LOPT
25433
      RWORK( 1 ) = LROPT
25746
      RWORK( 1 ) = REAL( LROPT )
25434
      IWORK( 1 ) = LIOPT
25747
      IWORK( 1 ) = LIOPT
25435
*
25748
*
25436
      RETURN
25749
      RETURN
25437
*
25750
*
25438
*     End of ZHEEVD
25751
*     End of ZHEEVD
Line 25693... Line 26006...
25693
*
26006
*
25694
               A( I, I+1 ) = ONE
26007
               A( I, I+1 ) = ONE
25695
*
26008
*
25696
*              Compute  x := tau * A * v  storing x in TAU(1:i)
26009
*              Compute  x := tau * A * v  storing x in TAU(1:i)
25697
*
26010
*
25698
               CALL ZHEMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO,
26011
               CALL ZHEMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1,
-
 
26012
     $                     ZERO,
25699
     $                     TAU, 1 )
26013
     $                     TAU, 1 )
25700
*
26014
*
25701
*              Compute  w := x - 1/2 * tau * (x**H * v) * v
26015
*              Compute  w := x - 1/2 * tau * (x**H * v) * v
25702
*
26016
*
25703
               ALPHA = -HALF*TAUI*ZDOTC( I, TAU, 1, A( 1, I+1 ), 1 )
26017
               ALPHA = -HALF*TAUI*ZDOTC( I, TAU, 1, A( 1, I+1 ), 1 )
Line 25742... Line 26056...
25742
               CALL ZHEMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA,
26056
               CALL ZHEMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA,
25743
     $                     A( I+1, I ), 1, ZERO, TAU( I ), 1 )
26057
     $                     A( I+1, I ), 1, ZERO, TAU( I ), 1 )
25744
*
26058
*
25745
*              Compute  w := x - 1/2 * tau * (x**H * v) * v
26059
*              Compute  w := x - 1/2 * tau * (x**H * v) * v
25746
*
26060
*
25747
               ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1, A( I+1, I ),
26061
               ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1, A( I+1,
-
 
26062
     $                                   I ),
25748
     $                 1 )
26063
     $                 1 )
25749
               CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 )
26064
               CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 )
25750
*
26065
*
25751
*              Apply the transformation as a rank-2 update:
26066
*              Apply the transformation as a rank-2 update:
25752
*                 A := A - v * w**H - w * v**H
26067
*                 A := A - v * w**H - w * v**H
25753
*
26068
*
25754
               CALL ZHER2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1,
26069
               CALL ZHER2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ),
-
 
26070
     $                     1,
25755
     $                     A( I+1, I+1 ), LDA )
26071
     $                     A( I+1, I+1 ), LDA )
25756
*
26072
*
25757
            ELSE
26073
            ELSE
25758
               A( I+1, I+1 ) = DBLE( A( I+1, I+1 ) )
26074
               A( I+1, I+1 ) = DBLE( A( I+1, I+1 ) )
25759
            END IF
26075
            END IF
Line 26058... Line 26374...
26058
            COLMAX = CABS1( A( IMAX, K ) )
26374
            COLMAX = CABS1( A( IMAX, K ) )
26059
         ELSE
26375
         ELSE
26060
            COLMAX = ZERO
26376
            COLMAX = ZERO
26061
         END IF
26377
         END IF
26062
*
26378
*
26063
         IF( (MAX( ABSAKK, COLMAX ).EQ.ZERO) .OR. DISNAN(ABSAKK) ) THEN
26379
         IF( (MAX( ABSAKK, COLMAX ).EQ.ZERO) .OR.
-
 
26380
     $       DISNAN(ABSAKK) ) THEN
26064
*
26381
*
26065
*           Column K is zero or underflow, or contains a NaN:
26382
*           Column K is zero or underflow, or contains a NaN:
26066
*           set INFO and continue
26383
*           set INFO and continue
26067
*
26384
*
26068
            IF( INFO.EQ.0 )
26385
            IF( INFO.EQ.0 )
Line 26253... Line 26570...
26253
            COLMAX = CABS1( A( IMAX, K ) )
26570
            COLMAX = CABS1( A( IMAX, K ) )
26254
         ELSE
26571
         ELSE
26255
            COLMAX = ZERO
26572
            COLMAX = ZERO
26256
         END IF
26573
         END IF
26257
*
26574
*
26258
         IF( (MAX( ABSAKK, COLMAX ).EQ.ZERO) .OR. DISNAN(ABSAKK) ) THEN
26575
         IF( (MAX( ABSAKK, COLMAX ).EQ.ZERO) .OR.
-
 
26576
     $       DISNAN(ABSAKK) ) THEN
26259
*
26577
*
26260
*           Column K is zero or underflow, or contains a NaN:
26578
*           Column K is zero or underflow, or contains a NaN:
26261
*           set INFO and continue
26579
*           set INFO and continue
26262
*
26580
*
26263
            IF( INFO.EQ.0 )
26581
            IF( INFO.EQ.0 )
Line 26282... Line 26600...
26282
*              Determine only ROWMAX.
26600
*              Determine only ROWMAX.
26283
*
26601
*
26284
               JMAX = K - 1 + IZAMAX( IMAX-K, A( IMAX, K ), LDA )
26602
               JMAX = K - 1 + IZAMAX( IMAX-K, A( IMAX, K ), LDA )
26285
               ROWMAX = CABS1( A( IMAX, JMAX ) )
26603
               ROWMAX = CABS1( A( IMAX, JMAX ) )
26286
               IF( IMAX.LT.N ) THEN
26604
               IF( IMAX.LT.N ) THEN
26287
                  JMAX = IMAX + IZAMAX( N-IMAX, A( IMAX+1, IMAX ), 1 )
26605
                  JMAX = IMAX + IZAMAX( N-IMAX, A( IMAX+1, IMAX ),
-
 
26606
     $                                  1 )
26288
                  ROWMAX = MAX( ROWMAX, CABS1( A( JMAX, IMAX ) ) )
26607
                  ROWMAX = MAX( ROWMAX, CABS1( A( JMAX, IMAX ) ) )
26289
               END IF
26608
               END IF
26290
*
26609
*
26291
               IF( ABSAKK.GE.ALPHA*COLMAX*( COLMAX / ROWMAX ) ) THEN
26610
               IF( ABSAKK.GE.ALPHA*COLMAX*( COLMAX / ROWMAX ) ) THEN
26292
*
26611
*
Line 26319... Line 26638...
26319
*
26638
*
26320
*              Interchange rows and columns KK and KP in the trailing
26639
*              Interchange rows and columns KK and KP in the trailing
26321
*              submatrix A(k:n,k:n)
26640
*              submatrix A(k:n,k:n)
26322
*
26641
*
26323
               IF( KP.LT.N )
26642
               IF( KP.LT.N )
26324
     $            CALL ZSWAP( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ), 1 )
26643
     $            CALL ZSWAP( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ),
-
 
26644
     $                        1 )
26325
               DO 60 J = KK + 1, KP - 1
26645
               DO 60 J = KK + 1, KP - 1
26326
                  T = DCONJG( A( J, KK ) )
26646
                  T = DCONJG( A( J, KK ) )
26327
                  A( J, KK ) = DCONJG( A( KP, J ) )
26647
                  A( J, KK ) = DCONJG( A( KP, J ) )
26328
                  A( KP, J ) = T
26648
                  A( KP, J ) = T
26329
   60          CONTINUE
26649
   60          CONTINUE
Line 26615... Line 26935...
26615
*>  where d and e denote diagonal and off-diagonal elements of T, and vi
26935
*>  where d and e denote diagonal and off-diagonal elements of T, and vi
26616
*>  denotes an element of the vector defining H(i).
26936
*>  denotes an element of the vector defining H(i).
26617
*> \endverbatim
26937
*> \endverbatim
26618
*>
26938
*>
26619
*  =====================================================================
26939
*  =====================================================================
26620
      SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO )
26940
      SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK,
-
 
26941
     $                   INFO )
26621
*
26942
*
26622
*  -- LAPACK computational routine --
26943
*  -- LAPACK computational routine --
26623
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
26944
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
26624
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
26945
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
26625
*
26946
*
Line 26676... Line 26997...
26676
      IF( INFO.EQ.0 ) THEN
26997
      IF( INFO.EQ.0 ) THEN
26677
*
26998
*
26678
*        Determine the block size.
26999
*        Determine the block size.
26679
*
27000
*
26680
         NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 )
27001
         NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 )
26681
         LWKOPT = N*NB
27002
         LWKOPT = MAX( 1, N*NB )
26682
         WORK( 1 ) = LWKOPT
27003
         WORK( 1 ) = LWKOPT
26683
      END IF
27004
      END IF
26684
*
27005
*
26685
      IF( INFO.NE.0 ) THEN
27006
      IF( INFO.NE.0 ) THEN
26686
         CALL XERBLA( 'ZHETRD', -INFO )
27007
         CALL XERBLA( 'ZHETRD', -INFO )
Line 26909... Line 27230...
26909
*> \endverbatim
27230
*> \endverbatim
26910
*>
27231
*>
26911
*> \param[in] LWORK
27232
*> \param[in] LWORK
26912
*> \verbatim
27233
*> \verbatim
26913
*>          LWORK is INTEGER
27234
*>          LWORK is INTEGER
26914
*>          The length of WORK.  LWORK >=1.  For best performance
27235
*>          The length of WORK. LWORK >= 1. For best performance
26915
*>          LWORK >= N*NB, where NB is the block size returned by ILAENV.
27236
*>          LWORK >= N*NB, where NB is the block size returned by ILAENV.
26916
*> \endverbatim
27237
*> \endverbatim
26917
*>
27238
*>
26918
*> \param[out] INFO
27239
*> \param[out] INFO
26919
*> \verbatim
27240
*> \verbatim
Line 27029... Line 27350...
27029
      IF( INFO.EQ.0 ) THEN
27350
      IF( INFO.EQ.0 ) THEN
27030
*
27351
*
27031
*        Determine the block size
27352
*        Determine the block size
27032
*
27353
*
27033
         NB = ILAENV( 1, 'ZHETRF', UPLO, N, -1, -1, -1 )
27354
         NB = ILAENV( 1, 'ZHETRF', UPLO, N, -1, -1, -1 )
27034
         LWKOPT = N*NB
27355
         LWKOPT = MAX( 1, N*NB )
27035
         WORK( 1 ) = LWKOPT
27356
         WORK( 1 ) = LWKOPT
27036
      END IF
27357
      END IF
27037
*
27358
*
27038
      IF( INFO.NE.0 ) THEN
27359
      IF( INFO.NE.0 ) THEN
27039
         CALL XERBLA( 'ZHETRF', -INFO )
27360
         CALL XERBLA( 'ZHETRF', -INFO )
Line 27046... Line 27367...
27046
      LDWORK = N
27367
      LDWORK = N
27047
      IF( NB.GT.1 .AND. NB.LT.N ) THEN
27368
      IF( NB.GT.1 .AND. NB.LT.N ) THEN
27048
         IWS = LDWORK*NB
27369
         IWS = LDWORK*NB
27049
         IF( LWORK.LT.IWS ) THEN
27370
         IF( LWORK.LT.IWS ) THEN
27050
            NB = MAX( LWORK / LDWORK, 1 )
27371
            NB = MAX( LWORK / LDWORK, 1 )
27051
            NBMIN = MAX( 2, ILAENV( 2, 'ZHETRF', UPLO, N, -1, -1, -1 ) )
27372
            NBMIN = MAX( 2, ILAENV( 2, 'ZHETRF', UPLO, N, -1, -1,
-
 
27373
     $                   -1 ) )
27052
         END IF
27374
         END IF
27053
      ELSE
27375
      ELSE
27054
         IWS = 1
27376
         IWS = 1
27055
      END IF
27377
      END IF
27056
      IF( NB.LT.NBMIN )
27378
      IF( NB.LT.NBMIN )
Line 27075... Line 27397...
27075
         IF( K.GT.NB ) THEN
27397
         IF( K.GT.NB ) THEN
27076
*
27398
*
27077
*           Factorize columns k-kb+1:k of A and use blocked code to
27399
*           Factorize columns k-kb+1:k of A and use blocked code to
27078
*           update columns 1:k-kb
27400
*           update columns 1:k-kb
27079
*
27401
*
27080
            CALL ZLAHEF( UPLO, K, NB, KB, A, LDA, IPIV, WORK, N, IINFO )
27402
            CALL ZLAHEF( UPLO, K, NB, KB, A, LDA, IPIV, WORK, N,
-
 
27403
     $                   IINFO )
27081
         ELSE
27404
         ELSE
27082
*
27405
*
27083
*           Use unblocked code to factorize columns 1:k of A
27406
*           Use unblocked code to factorize columns 1:k of A
27084
*
27407
*
27085
            CALL ZHETF2( UPLO, K, A, LDA, IPIV, IINFO )
27408
            CALL ZHETF2( UPLO, K, A, LDA, IPIV, IINFO )
Line 27115... Line 27438...
27115
         IF( K.LE.N-NB ) THEN
27438
         IF( K.LE.N-NB ) THEN
27116
*
27439
*
27117
*           Factorize columns k:k+kb-1 of A and use blocked code to
27440
*           Factorize columns k:k+kb-1 of A and use blocked code to
27118
*           update columns k+kb:n
27441
*           update columns k+kb:n
27119
*
27442
*
27120
            CALL ZLAHEF( UPLO, N-K+1, NB, KB, A( K, K ), LDA, IPIV( K ),
27443
            CALL ZLAHEF( UPLO, N-K+1, NB, KB, A( K, K ), LDA,
-
 
27444
     $                   IPIV( K ),
27121
     $                   WORK, N, IINFO )
27445
     $                   WORK, N, IINFO )
27122
         ELSE
27446
         ELSE
27123
*
27447
*
27124
*           Use unblocked code to factorize columns k:n of A
27448
*           Use unblocked code to factorize columns k:n of A
27125
*
27449
*
27126
            CALL ZHETF2( UPLO, N-K+1, A( K, K ), LDA, IPIV( K ), IINFO )
27450
            CALL ZHETF2( UPLO, N-K+1, A( K, K ), LDA, IPIV( K ),
-
 
27451
     $                   IINFO )
27127
            KB = N - K + 1
27452
            KB = N - K + 1
27128
         END IF
27453
         END IF
27129
*
27454
*
27130
*        Set INFO on the first occurrence of a zero pivot
27455
*        Set INFO on the first occurrence of a zero pivot
27131
*
27456
*
Line 27148... Line 27473...
27148
         GO TO 20
27473
         GO TO 20
27149
*
27474
*
27150
      END IF
27475
      END IF
27151
*
27476
*
27152
   40 CONTINUE
27477
   40 CONTINUE
-
 
27478
*
27153
      WORK( 1 ) = LWKOPT
27479
      WORK( 1 ) = LWKOPT
27154
      RETURN
27480
      RETURN
27155
*
27481
*
27156
*     End of ZHETRF
27482
*     End of ZHETRF
27157
*
27483
*
Line 27379... Line 27705...
27379
*
27705
*
27380
            IF( K.GT.1 ) THEN
27706
            IF( K.GT.1 ) THEN
27381
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
27707
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
27382
               CALL ZHEMV( UPLO, K-1, -CONE, A, LDA, WORK, 1, ZERO,
27708
               CALL ZHEMV( UPLO, K-1, -CONE, A, LDA, WORK, 1, ZERO,
27383
     $                     A( 1, K ), 1 )
27709
     $                     A( 1, K ), 1 )
27384
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( K-1, WORK, 1, A( 1,
27710
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( K-1, WORK, 1,
-
 
27711
     $            A( 1,
27385
     $                     K ), 1 ) )
27712
     $                     K ), 1 ) )
27386
            END IF
27713
            END IF
27387
            KSTEP = 1
27714
            KSTEP = 1
27388
         ELSE
27715
         ELSE
27389
*
27716
*
Line 27404... Line 27731...
27404
*
27731
*
27405
            IF( K.GT.1 ) THEN
27732
            IF( K.GT.1 ) THEN
27406
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
27733
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
27407
               CALL ZHEMV( UPLO, K-1, -CONE, A, LDA, WORK, 1, ZERO,
27734
               CALL ZHEMV( UPLO, K-1, -CONE, A, LDA, WORK, 1, ZERO,
27408
     $                     A( 1, K ), 1 )
27735
     $                     A( 1, K ), 1 )
27409
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( K-1, WORK, 1, A( 1,
27736
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( K-1, WORK, 1,
-
 
27737
     $            A( 1,
27410
     $                     K ), 1 ) )
27738
     $                     K ), 1 ) )
27411
               A( K, K+1 ) = A( K, K+1 ) -
27739
               A( K, K+1 ) = A( K, K+1 ) -
27412
     $                       ZDOTC( K-1, A( 1, K ), 1, A( 1, K+1 ), 1 )
27740
     $                       ZDOTC( K-1, A( 1, K ), 1, A( 1, K+1 ),
-
 
27741
     $                              1 )
27413
               CALL ZCOPY( K-1, A( 1, K+1 ), 1, WORK, 1 )
27742
               CALL ZCOPY( K-1, A( 1, K+1 ), 1, WORK, 1 )
27414
               CALL ZHEMV( UPLO, K-1, -CONE, A, LDA, WORK, 1, ZERO,
27743
               CALL ZHEMV( UPLO, K-1, -CONE, A, LDA, WORK, 1, ZERO,
27415
     $                     A( 1, K+1 ), 1 )
27744
     $                     A( 1, K+1 ), 1 )
27416
               A( K+1, K+1 ) = A( K+1, K+1 ) -
27745
               A( K+1, K+1 ) = A( K+1, K+1 ) -
27417
     $                         DBLE( ZDOTC( K-1, WORK, 1, A( 1, K+1 ),
27746
     $                         DBLE( ZDOTC( K-1, WORK, 1, A( 1,
-
 
27747
     $                               K+1 ),
27418
     $                         1 ) )
27748
     $                         1 ) )
27419
            END IF
27749
            END IF
27420
            KSTEP = 2
27750
            KSTEP = 2
27421
         END IF
27751
         END IF
27422
*
27752
*
Line 27472... Line 27802...
27472
*
27802
*
27473
*           Compute column K of the inverse.
27803
*           Compute column K of the inverse.
27474
*
27804
*
27475
            IF( K.LT.N ) THEN
27805
            IF( K.LT.N ) THEN
27476
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
27806
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
27477
               CALL ZHEMV( UPLO, N-K, -CONE, A( K+1, K+1 ), LDA, WORK,
27807
               CALL ZHEMV( UPLO, N-K, -CONE, A( K+1, K+1 ), LDA,
-
 
27808
     $                     WORK,
27478
     $                     1, ZERO, A( K+1, K ), 1 )
27809
     $                     1, ZERO, A( K+1, K ), 1 )
27479
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( N-K, WORK, 1,
27810
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( N-K, WORK, 1,
27480
     $                     A( K+1, K ), 1 ) )
27811
     $                     A( K+1, K ), 1 ) )
27481
            END IF
27812
            END IF
27482
            KSTEP = 1
27813
            KSTEP = 1
Line 27497... Line 27828...
27497
*
27828
*
27498
*           Compute columns K-1 and K of the inverse.
27829
*           Compute columns K-1 and K of the inverse.
27499
*
27830
*
27500
            IF( K.LT.N ) THEN
27831
            IF( K.LT.N ) THEN
27501
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
27832
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
27502
               CALL ZHEMV( UPLO, N-K, -CONE, A( K+1, K+1 ), LDA, WORK,
27833
               CALL ZHEMV( UPLO, N-K, -CONE, A( K+1, K+1 ), LDA,
-
 
27834
     $                     WORK,
27503
     $                     1, ZERO, A( K+1, K ), 1 )
27835
     $                     1, ZERO, A( K+1, K ), 1 )
27504
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( N-K, WORK, 1,
27836
               A( K, K ) = A( K, K ) - DBLE( ZDOTC( N-K, WORK, 1,
27505
     $                     A( K+1, K ), 1 ) )
27837
     $                     A( K+1, K ), 1 ) )
27506
               A( K, K-1 ) = A( K, K-1 ) -
27838
               A( K, K-1 ) = A( K, K-1 ) -
27507
     $                       ZDOTC( N-K, A( K+1, K ), 1, A( K+1, K-1 ),
27839
     $                       ZDOTC( N-K, A( K+1, K ), 1, A( K+1,
-
 
27840
     $                              K-1 ),
27508
     $                       1 )
27841
     $                       1 )
27509
               CALL ZCOPY( N-K, A( K+1, K-1 ), 1, WORK, 1 )
27842
               CALL ZCOPY( N-K, A( K+1, K-1 ), 1, WORK, 1 )
27510
               CALL ZHEMV( UPLO, N-K, -CONE, A( K+1, K+1 ), LDA, WORK,
27843
               CALL ZHEMV( UPLO, N-K, -CONE, A( K+1, K+1 ), LDA,
-
 
27844
     $                     WORK,
27511
     $                     1, ZERO, A( K+1, K-1 ), 1 )
27845
     $                     1, ZERO, A( K+1, K-1 ), 1 )
27512
               A( K-1, K-1 ) = A( K-1, K-1 ) -
27846
               A( K-1, K-1 ) = A( K-1, K-1 ) -
27513
     $                         DBLE( ZDOTC( N-K, WORK, 1, A( K+1, K-1 ),
27847
     $                         DBLE( ZDOTC( N-K, WORK, 1, A( K+1,
-
 
27848
     $                               K-1 ),
27514
     $                         1 ) )
27849
     $                         1 ) )
27515
            END IF
27850
            END IF
27516
            KSTEP = 2
27851
            KSTEP = 2
27517
         END IF
27852
         END IF
27518
*
27853
*
Line 27698... Line 28033...
27698
*     .. External Functions ..
28033
*     .. External Functions ..
27699
      LOGICAL            LSAME
28034
      LOGICAL            LSAME
27700
      EXTERNAL           LSAME
28035
      EXTERNAL           LSAME
27701
*     ..
28036
*     ..
27702
*     .. External Subroutines ..
28037
*     .. External Subroutines ..
27703
      EXTERNAL           XERBLA, ZDSCAL, ZGEMV, ZGERU, ZLACGV, ZSWAP
28038
      EXTERNAL           XERBLA, ZDSCAL, ZGEMV, ZGERU, ZLACGV,
-
 
28039
     $                   ZSWAP
27704
*     ..
28040
*     ..
27705
*     .. Intrinsic Functions ..
28041
*     .. Intrinsic Functions ..
27706
      INTRINSIC          DBLE, DCONJG, MAX
28042
      INTRINSIC          DBLE, DCONJG, MAX
27707
*     ..
28043
*     ..
27708
*     .. Executable Statements ..
28044
*     .. Executable Statements ..
Line 27758... Line 28094...
27758
     $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
28094
     $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
27759
*
28095
*
27760
*           Multiply by inv(U(K)), where U(K) is the transformation
28096
*           Multiply by inv(U(K)), where U(K) is the transformation
27761
*           stored in column K of A.
28097
*           stored in column K of A.
27762
*
28098
*
27763
            CALL ZGERU( K-1, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ), LDB,
28099
            CALL ZGERU( K-1, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ),
-
 
28100
     $                  LDB,
27764
     $                  B( 1, 1 ), LDB )
28101
     $                  B( 1, 1 ), LDB )
27765
*
28102
*
27766
*           Multiply by the inverse of the diagonal block.
28103
*           Multiply by the inverse of the diagonal block.
27767
*
28104
*
27768
            S = DBLE( ONE ) / DBLE( A( K, K ) )
28105
            S = DBLE( ONE ) / DBLE( A( K, K ) )
Line 27779... Line 28116...
27779
     $         CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ), LDB )
28116
     $         CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ), LDB )
27780
*
28117
*
27781
*           Multiply by inv(U(K)), where U(K) is the transformation
28118
*           Multiply by inv(U(K)), where U(K) is the transformation
27782
*           stored in columns K-1 and K of A.
28119
*           stored in columns K-1 and K of A.
27783
*
28120
*
27784
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ), LDB,
28121
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ),
-
 
28122
     $                  LDB,
27785
     $                  B( 1, 1 ), LDB )
28123
     $                  B( 1, 1 ), LDB )
27786
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K-1 ), 1, B( K-1, 1 ),
28124
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K-1 ), 1, B( K-1, 1 ),
27787
     $                  LDB, B( 1, 1 ), LDB )
28125
     $                  LDB, B( 1, 1 ), LDB )
27788
*
28126
*
27789
*           Multiply by the inverse of the diagonal block.
28127
*           Multiply by the inverse of the diagonal block.
Line 27896... Line 28234...
27896
*
28234
*
27897
*           Multiply by inv(L(K)), where L(K) is the transformation
28235
*           Multiply by inv(L(K)), where L(K) is the transformation
27898
*           stored in column K of A.
28236
*           stored in column K of A.
27899
*
28237
*
27900
            IF( K.LT.N )
28238
            IF( K.LT.N )
27901
     $         CALL ZGERU( N-K, NRHS, -ONE, A( K+1, K ), 1, B( K, 1 ),
28239
     $         CALL ZGERU( N-K, NRHS, -ONE, A( K+1, K ), 1, B( K,
-
 
28240
     $                     1 ),
27902
     $                     LDB, B( K+1, 1 ), LDB )
28241
     $                     LDB, B( K+1, 1 ), LDB )
27903
*
28242
*
27904
*           Multiply by the inverse of the diagonal block.
28243
*           Multiply by the inverse of the diagonal block.
27905
*
28244
*
27906
            S = DBLE( ONE ) / DBLE( A( K, K ) )
28245
            S = DBLE( ONE ) / DBLE( A( K, K ) )
Line 27918... Line 28257...
27918
*
28257
*
27919
*           Multiply by inv(L(K)), where L(K) is the transformation
28258
*           Multiply by inv(L(K)), where L(K) is the transformation
27920
*           stored in columns K and K+1 of A.
28259
*           stored in columns K and K+1 of A.
27921
*
28260
*
27922
            IF( K.LT.N-1 ) THEN
28261
            IF( K.LT.N-1 ) THEN
27923
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K ), 1, B( K, 1 ),
28262
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K ), 1, B( K,
-
 
28263
     $                     1 ),
27924
     $                     LDB, B( K+2, 1 ), LDB )
28264
     $                     LDB, B( K+2, 1 ), LDB )
27925
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K+1 ), 1,
28265
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K+1 ), 1,
27926
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
28266
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
27927
            END IF
28267
            END IF
27928
*
28268
*
Line 28294... Line 28634...
28294
*>  We assume that complex ABS works as long as its value is less than
28634
*>  We assume that complex ABS works as long as its value is less than
28295
*>  overflow.
28635
*>  overflow.
28296
*> \endverbatim
28636
*> \endverbatim
28297
*>
28637
*>
28298
*  =====================================================================
28638
*  =====================================================================
28299
      SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT,
28639
      SUBROUTINE ZHGEQZ( JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T,
-
 
28640
     $                   LDT,
28300
     $                   ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK,
28641
     $                   ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK,
28301
     $                   RWORK, INFO )
28642
     $                   RWORK, INFO )
28302
*
28643
*
28303
*  -- LAPACK computational routine --
28644
*  -- LAPACK computational routine --
28304
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
28645
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 28595... Line 28936...
28595
                     CALL ZROT( ILASTM-JCH, H( JCH, JCH+1 ), LDH,
28936
                     CALL ZROT( ILASTM-JCH, H( JCH, JCH+1 ), LDH,
28596
     $                          H( JCH+1, JCH+1 ), LDH, C, S )
28937
     $                          H( JCH+1, JCH+1 ), LDH, C, S )
28597
                     CALL ZROT( ILASTM-JCH, T( JCH, JCH+1 ), LDT,
28938
                     CALL ZROT( ILASTM-JCH, T( JCH, JCH+1 ), LDT,
28598
     $                          T( JCH+1, JCH+1 ), LDT, C, S )
28939
     $                          T( JCH+1, JCH+1 ), LDT, C, S )
28599
                     IF( ILQ )
28940
                     IF( ILQ )
28600
     $                  CALL ZROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
28941
     $                  CALL ZROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ),
-
 
28942
     $                             1,
28601
     $                             C, DCONJG( S ) )
28943
     $                             C, DCONJG( S ) )
28602
                     IF( ILAZR2 )
28944
                     IF( ILAZR2 )
28603
     $                  H( JCH, JCH-1 ) = H( JCH, JCH-1 )*C
28945
     $                  H( JCH, JCH-1 ) = H( JCH, JCH-1 )*C
28604
                     ILAZR2 = .FALSE.
28946
                     ILAZR2 = .FALSE.
28605
                     IF( ABS1( T( JCH+1, JCH+1 ) ).GE.BTOL ) THEN
28947
                     IF( ABS1( T( JCH+1, JCH+1 ) ).GE.BTOL ) THEN
Line 28622... Line 28964...
28622
                     CTEMP = T( JCH, JCH+1 )
28964
                     CTEMP = T( JCH, JCH+1 )
28623
                     CALL ZLARTG( CTEMP, T( JCH+1, JCH+1 ), C, S,
28965
                     CALL ZLARTG( CTEMP, T( JCH+1, JCH+1 ), C, S,
28624
     $                            T( JCH, JCH+1 ) )
28966
     $                            T( JCH, JCH+1 ) )
28625
                     T( JCH+1, JCH+1 ) = CZERO
28967
                     T( JCH+1, JCH+1 ) = CZERO
28626
                     IF( JCH.LT.ILASTM-1 )
28968
                     IF( JCH.LT.ILASTM-1 )
28627
     $                  CALL ZROT( ILASTM-JCH-1, T( JCH, JCH+2 ), LDT,
28969
     $                  CALL ZROT( ILASTM-JCH-1, T( JCH, JCH+2 ),
-
 
28970
     $                             LDT,
28628
     $                             T( JCH+1, JCH+2 ), LDT, C, S )
28971
     $                             T( JCH+1, JCH+2 ), LDT, C, S )
28629
                     CALL ZROT( ILASTM-JCH+2, H( JCH, JCH-1 ), LDH,
28972
                     CALL ZROT( ILASTM-JCH+2, H( JCH, JCH-1 ), LDH,
28630
     $                          H( JCH+1, JCH-1 ), LDH, C, S )
28973
     $                          H( JCH+1, JCH-1 ), LDH, C, S )
28631
                     IF( ILQ )
28974
                     IF( ILQ )
28632
     $                  CALL ZROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ), 1,
28975
     $                  CALL ZROT( N, Q( 1, JCH ), 1, Q( 1, JCH+1 ),
-
 
28976
     $                             1,
28633
     $                             C, DCONJG( S ) )
28977
     $                             C, DCONJG( S ) )
28634
                     CTEMP = H( JCH+1, JCH )
28978
                     CTEMP = H( JCH+1, JCH )
28635
                     CALL ZLARTG( CTEMP, H( JCH+1, JCH-1 ), C, S,
28979
                     CALL ZLARTG( CTEMP, H( JCH+1, JCH-1 ), C, S,
28636
     $                            H( JCH+1, JCH ) )
28980
     $                            H( JCH+1, JCH ) )
28637
                     H( JCH+1, JCH-1 ) = CZERO
28981
                     H( JCH+1, JCH-1 ) = CZERO
28638
                     CALL ZROT( JCH+1-IFRSTM, H( IFRSTM, JCH ), 1,
28982
                     CALL ZROT( JCH+1-IFRSTM, H( IFRSTM, JCH ), 1,
28639
     $                          H( IFRSTM, JCH-1 ), 1, C, S )
28983
     $                          H( IFRSTM, JCH-1 ), 1, C, S )
28640
                     CALL ZROT( JCH-IFRSTM, T( IFRSTM, JCH ), 1,
28984
                     CALL ZROT( JCH-IFRSTM, T( IFRSTM, JCH ), 1,
28641
     $                          T( IFRSTM, JCH-1 ), 1, C, S )
28985
     $                          T( IFRSTM, JCH-1 ), 1, C, S )
28642
                     IF( ILZ )
28986
                     IF( ILZ )
28643
     $                  CALL ZROT( N, Z( 1, JCH ), 1, Z( 1, JCH-1 ), 1,
28987
     $                  CALL ZROT( N, Z( 1, JCH ), 1, Z( 1, JCH-1 ),
-
 
28988
     $                             1,
28644
     $                             C, S )
28989
     $                             C, S )
28645
   30             CONTINUE
28990
   30             CONTINUE
28646
                  GO TO 50
28991
                  GO TO 50
28647
               END IF
28992
               END IF
28648
            ELSE IF( ILAZRO ) THEN
28993
            ELSE IF( ILAZRO ) THEN
Line 28673... Line 29018...
28673
         CALL ZROT( ILAST-IFRSTM, H( IFRSTM, ILAST ), 1,
29018
         CALL ZROT( ILAST-IFRSTM, H( IFRSTM, ILAST ), 1,
28674
     $              H( IFRSTM, ILAST-1 ), 1, C, S )
29019
     $              H( IFRSTM, ILAST-1 ), 1, C, S )
28675
         CALL ZROT( ILAST-IFRSTM, T( IFRSTM, ILAST ), 1,
29020
         CALL ZROT( ILAST-IFRSTM, T( IFRSTM, ILAST ), 1,
28676
     $              T( IFRSTM, ILAST-1 ), 1, C, S )
29021
     $              T( IFRSTM, ILAST-1 ), 1, C, S )
28677
         IF( ILZ )
29022
         IF( ILZ )
28678
     $      CALL ZROT( N, Z( 1, ILAST ), 1, Z( 1, ILAST-1 ), 1, C, S )
29023
     $      CALL ZROT( N, Z( 1, ILAST ), 1, Z( 1, ILAST-1 ), 1, C,
-
 
29024
     $                 S )
28679
*
29025
*
28680
*        H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHA and BETA
29026
*        H(ILAST,ILAST-1)=0 -- Standardize B, set ALPHA and BETA
28681
*
29027
*
28682
   60    CONTINUE
29028
   60    CONTINUE
28683
         ABSB = ABS( T( ILAST, ILAST ) )
29029
         ABSB = ABS( T( ILAST, ILAST ) )
28684
         IF( ABSB.GT.SAFMIN ) THEN
29030
         IF( ABSB.GT.SAFMIN ) THEN
28685
            SIGNBC = DCONJG( T( ILAST, ILAST ) / ABSB )
29031
            SIGNBC = DCONJG( T( ILAST, ILAST ) / ABSB )
28686
            T( ILAST, ILAST ) = ABSB
29032
            T( ILAST, ILAST ) = ABSB
28687
            IF( ILSCHR ) THEN
29033
            IF( ILSCHR ) THEN
28688
               CALL ZSCAL( ILAST-IFRSTM, SIGNBC, T( IFRSTM, ILAST ), 1 )
29034
               CALL ZSCAL( ILAST-IFRSTM, SIGNBC, T( IFRSTM, ILAST ),
-
 
29035
     $                     1 )
28689
               CALL ZSCAL( ILAST+1-IFRSTM, SIGNBC, H( IFRSTM, ILAST ),
29036
               CALL ZSCAL( ILAST+1-IFRSTM, SIGNBC, H( IFRSTM,
-
 
29037
     $                     ILAST ),
28690
     $                     1 )
29038
     $                     1 )
28691
            ELSE
29039
            ELSE
28692
               CALL ZSCAL( 1, SIGNBC, H( ILAST, ILAST ), 1 )
29040
               CALL ZSCAL( 1, SIGNBC, H( ILAST, ILAST ), 1 )
28693
            END IF
29041
            END IF
28694
            IF( ILZ )
29042
            IF( ILZ )
Line 29023... Line 29371...
29023
*> \author NAG Ltd.
29371
*> \author NAG Ltd.
29024
*
29372
*
29025
*> \ingroup hpcon
29373
*> \ingroup hpcon
29026
*
29374
*
29027
*  =====================================================================
29375
*  =====================================================================
29028
      SUBROUTINE ZHPCON( UPLO, N, AP, IPIV, ANORM, RCOND, WORK, INFO )
29376
      SUBROUTINE ZHPCON( UPLO, N, AP, IPIV, ANORM, RCOND, WORK,
-
 
29377
     $                   INFO )
29029
*
29378
*
29030
*  -- LAPACK computational routine --
29379
*  -- LAPACK computational routine --
29031
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
29380
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
29032
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
29381
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
29033
*
29382
*
Line 29305... Line 29654...
29305
      LOGICAL            LSAME
29654
      LOGICAL            LSAME
29306
      DOUBLE PRECISION   DLAMCH, ZLANHP
29655
      DOUBLE PRECISION   DLAMCH, ZLANHP
29307
      EXTERNAL           LSAME, DLAMCH, ZLANHP
29656
      EXTERNAL           LSAME, DLAMCH, ZLANHP
29308
*     ..
29657
*     ..
29309
*     .. External Subroutines ..
29658
*     .. External Subroutines ..
29310
      EXTERNAL           DSCAL, DSTERF, XERBLA, ZDSCAL, ZHPTRD, ZSTEQR,
29659
      EXTERNAL           DSCAL, DSTERF, XERBLA, ZDSCAL, ZHPTRD,
-
 
29660
     $                   ZSTEQR,
29311
     $                   ZUPGTR
29661
     $                   ZUPGTR
29312
*     ..
29662
*     ..
29313
*     .. Intrinsic Functions ..
29663
*     .. Intrinsic Functions ..
29314
      INTRINSIC          SQRT
29664
      INTRINSIC          SQRT
29315
*     ..
29665
*     ..
Line 29320... Line 29670...
29320
      WANTZ = LSAME( JOBZ, 'V' )
29670
      WANTZ = LSAME( JOBZ, 'V' )
29321
*
29671
*
29322
      INFO = 0
29672
      INFO = 0
29323
      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
29673
      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
29324
         INFO = -1
29674
         INFO = -1
29325
      ELSE IF( .NOT.( LSAME( UPLO, 'L' ) .OR. LSAME( UPLO, 'U' ) ) )
29675
      ELSE IF( .NOT.( LSAME( UPLO, 'L' ) .OR.
-
 
29676
     $         LSAME( UPLO, 'U' ) ) )
29326
     $          THEN
29677
     $          THEN
29327
         INFO = -2
29678
         INFO = -2
29328
      ELSE IF( N.LT.0 ) THEN
29679
      ELSE IF( N.LT.0 ) THEN
29329
         INFO = -3
29680
         INFO = -3
29330
      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.N ) ) THEN
29681
      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.N ) ) THEN
Line 29686... Line 30037...
29686
*
30037
*
29687
               AP( II+1 ) = ONE
30038
               AP( II+1 ) = ONE
29688
*
30039
*
29689
*              Compute  y := tau * A * v  storing y in TAU(i:n-1)
30040
*              Compute  y := tau * A * v  storing y in TAU(i:n-1)
29690
*
30041
*
29691
               CALL ZHPMV( UPLO, N-I, TAUI, AP( I1I1 ), AP( II+1 ), 1,
30042
               CALL ZHPMV( UPLO, N-I, TAUI, AP( I1I1 ), AP( II+1 ),
-
 
30043
     $                     1,
29692
     $                     ZERO, TAU( I ), 1 )
30044
     $                     ZERO, TAU( I ), 1 )
29693
*
30045
*
29694
*              Compute  w := y - 1/2 * tau * (y**H *v) * v
30046
*              Compute  w := y - 1/2 * tau * (y**H *v) * v
29695
*
30047
*
29696
               ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1, AP( II+1 ),
30048
               ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1,
-
 
30049
     $                                   AP( II+1 ),
29697
     $                 1 )
30050
     $                 1 )
29698
               CALL ZAXPY( N-I, ALPHA, AP( II+1 ), 1, TAU( I ), 1 )
30051
               CALL ZAXPY( N-I, ALPHA, AP( II+1 ), 1, TAU( I ), 1 )
29699
*
30052
*
29700
*              Apply the transformation as a rank-2 update:
30053
*              Apply the transformation as a rank-2 update:
29701
*                 A := A - v * w**H - w * v**H
30054
*                 A := A - v * w**H - w * v**H
29702
*
30055
*
29703
               CALL ZHPR2( UPLO, N-I, -ONE, AP( II+1 ), 1, TAU( I ), 1,
30056
               CALL ZHPR2( UPLO, N-I, -ONE, AP( II+1 ), 1, TAU( I ),
-
 
30057
     $                     1,
29704
     $                     AP( I1I1 ) )
30058
     $                     AP( I1I1 ) )
29705
*
30059
*
29706
            END IF
30060
            END IF
29707
            AP( II+1 ) = E( I )
30061
            AP( II+1 ) = E( I )
29708
            D( I ) = DBLE( AP( II ) )
30062
            D( I ) = DBLE( AP( II ) )
Line 30241... Line 30595...
30241
*
30595
*
30242
*              Interchange rows and columns KK and KP in the trailing
30596
*              Interchange rows and columns KK and KP in the trailing
30243
*              submatrix A(k:n,k:n)
30597
*              submatrix A(k:n,k:n)
30244
*
30598
*
30245
               IF( KP.LT.N )
30599
               IF( KP.LT.N )
30246
     $            CALL ZSWAP( N-KP, AP( KNC+KP-KK+1 ), 1, AP( KPC+1 ),
30600
     $            CALL ZSWAP( N-KP, AP( KNC+KP-KK+1 ), 1,
-
 
30601
     $                        AP( KPC+1 ),
30247
     $                        1 )
30602
     $                        1 )
30248
               KX = KNC + KP - KK
30603
               KX = KNC + KP - KK
30249
               DO 80 J = KK + 1, KP - 1
30604
               DO 80 J = KK + 1, KP - 1
30250
                  KX = KX + N - J + 1
30605
                  KX = KX + N - J + 1
30251
                  T = DCONJG( AP( KNC+J-KK ) )
30606
                  T = DCONJG( AP( KNC+J-KK ) )
Line 30309... Line 30664...
30309
*                    = A - ( W(k) W(k+1) )*inv(D(k))*( W(k) W(k+1) )**H
30664
*                    = A - ( W(k) W(k+1) )*inv(D(k))*( W(k) W(k+1) )**H
30310
*
30665
*
30311
*                 where L(k) and L(k+1) are the k-th and (k+1)-th
30666
*                 where L(k) and L(k+1) are the k-th and (k+1)-th
30312
*                 columns of L
30667
*                 columns of L
30313
*
30668
*
-
 
30669
                  D = DLAPY2(
30314
                  D = DLAPY2( DBLE( AP( K+1+( K-1 )*( 2*N-K ) / 2 ) ),
30670
     $                DBLE( AP( K+1+( K-1 )*( 2*N-K ) / 2 ) ),
30315
     $                DIMAG( AP( K+1+( K-1 )*( 2*N-K ) / 2 ) ) )
30671
     $                DIMAG( AP( K+1+( K-1 )*( 2*N-K ) / 2 ) ) )
30316
                  D11 = DBLE( AP( K+1+K*( 2*N-K-1 ) / 2 ) ) / D
30672
                  D11 = DBLE( AP( K+1+K*( 2*N-K-1 ) / 2 ) ) / D
30317
                  D22 = DBLE( AP( K+( K-1 )*( 2*N-K ) / 2 ) ) / D
30673
                  D22 = DBLE( AP( K+( K-1 )*( 2*N-K ) / 2 ) ) / D
30318
                  TT = ONE / ( D11*D22-ONE )
30674
                  TT = ONE / ( D11*D22-ONE )
30319
                  D21 = AP( K+1+( K-1 )*( 2*N-K ) / 2 ) / D
30675
                  D21 = AP( K+1+( K-1 )*( 2*N-K ) / 2 ) / D
Line 30587... Line 30943...
30587
            IF( K.GT.1 ) THEN
30943
            IF( K.GT.1 ) THEN
30588
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
30944
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
30589
               CALL ZHPMV( UPLO, K-1, -CONE, AP, WORK, 1, ZERO,
30945
               CALL ZHPMV( UPLO, K-1, -CONE, AP, WORK, 1, ZERO,
30590
     $                     AP( KC ), 1 )
30946
     $                     AP( KC ), 1 )
30591
               AP( KC+K-1 ) = AP( KC+K-1 ) -
30947
               AP( KC+K-1 ) = AP( KC+K-1 ) -
30592
     $                        DBLE( ZDOTC( K-1, WORK, 1, AP( KC ), 1 ) )
30948
     $                        DBLE( ZDOTC( K-1, WORK, 1, AP( KC ),
-
 
30949
     $                              1 ) )
30593
            END IF
30950
            END IF
30594
            KSTEP = 1
30951
            KSTEP = 1
30595
         ELSE
30952
         ELSE
30596
*
30953
*
30597
*           2 x 2 diagonal block
30954
*           2 x 2 diagonal block
Line 30612... Line 30969...
30612
            IF( K.GT.1 ) THEN
30969
            IF( K.GT.1 ) THEN
30613
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
30970
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
30614
               CALL ZHPMV( UPLO, K-1, -CONE, AP, WORK, 1, ZERO,
30971
               CALL ZHPMV( UPLO, K-1, -CONE, AP, WORK, 1, ZERO,
30615
     $                     AP( KC ), 1 )
30972
     $                     AP( KC ), 1 )
30616
               AP( KC+K-1 ) = AP( KC+K-1 ) -
30973
               AP( KC+K-1 ) = AP( KC+K-1 ) -
30617
     $                        DBLE( ZDOTC( K-1, WORK, 1, AP( KC ), 1 ) )
30974
     $                        DBLE( ZDOTC( K-1, WORK, 1, AP( KC ),
-
 
30975
     $                              1 ) )
30618
               AP( KCNEXT+K-1 ) = AP( KCNEXT+K-1 ) -
30976
               AP( KCNEXT+K-1 ) = AP( KCNEXT+K-1 ) -
30619
     $                            ZDOTC( K-1, AP( KC ), 1, AP( KCNEXT ),
30977
     $                            ZDOTC( K-1, AP( KC ), 1,
-
 
30978
     $                                   AP( KCNEXT ),
30620
     $                            1 )
30979
     $                            1 )
30621
               CALL ZCOPY( K-1, AP( KCNEXT ), 1, WORK, 1 )
30980
               CALL ZCOPY( K-1, AP( KCNEXT ), 1, WORK, 1 )
30622
               CALL ZHPMV( UPLO, K-1, -CONE, AP, WORK, 1, ZERO,
30981
               CALL ZHPMV( UPLO, K-1, -CONE, AP, WORK, 1, ZERO,
30623
     $                     AP( KCNEXT ), 1 )
30982
     $                     AP( KCNEXT ), 1 )
30624
               AP( KCNEXT+K ) = AP( KCNEXT+K ) -
30983
               AP( KCNEXT+K ) = AP( KCNEXT+K ) -
30625
     $                          DBLE( ZDOTC( K-1, WORK, 1, AP( KCNEXT ),
30984
     $                          DBLE( ZDOTC( K-1, WORK, 1,
-
 
30985
     $                                AP( KCNEXT ),
30626
     $                          1 ) )
30986
     $                          1 ) )
30627
            END IF
30987
            END IF
30628
            KSTEP = 2
30988
            KSTEP = 2
30629
            KCNEXT = KCNEXT + K + 1
30989
            KCNEXT = KCNEXT + K + 1
30630
         END IF
30990
         END IF
Line 30713... Line 31073...
30713
*
31073
*
30714
*           Compute columns K-1 and K of the inverse.
31074
*           Compute columns K-1 and K of the inverse.
30715
*
31075
*
30716
            IF( K.LT.N ) THEN
31076
            IF( K.LT.N ) THEN
30717
               CALL ZCOPY( N-K, AP( KC+1 ), 1, WORK, 1 )
31077
               CALL ZCOPY( N-K, AP( KC+1 ), 1, WORK, 1 )
30718
               CALL ZHPMV( UPLO, N-K, -CONE, AP( KC+( N-K+1 ) ), WORK,
31078
               CALL ZHPMV( UPLO, N-K, -CONE, AP( KC+( N-K+1 ) ),
-
 
31079
     $                     WORK,
30719
     $                     1, ZERO, AP( KC+1 ), 1 )
31080
     $                     1, ZERO, AP( KC+1 ), 1 )
30720
               AP( KC ) = AP( KC ) - DBLE( ZDOTC( N-K, WORK, 1,
31081
               AP( KC ) = AP( KC ) - DBLE( ZDOTC( N-K, WORK, 1,
30721
     $                    AP( KC+1 ), 1 ) )
31082
     $                    AP( KC+1 ), 1 ) )
30722
               AP( KCNEXT+1 ) = AP( KCNEXT+1 ) -
31083
               AP( KCNEXT+1 ) = AP( KCNEXT+1 ) -
30723
     $                          ZDOTC( N-K, AP( KC+1 ), 1,
31084
     $                          ZDOTC( N-K, AP( KC+1 ), 1,
30724
     $                          AP( KCNEXT+2 ), 1 )
31085
     $                          AP( KCNEXT+2 ), 1 )
30725
               CALL ZCOPY( N-K, AP( KCNEXT+2 ), 1, WORK, 1 )
31086
               CALL ZCOPY( N-K, AP( KCNEXT+2 ), 1, WORK, 1 )
30726
               CALL ZHPMV( UPLO, N-K, -CONE, AP( KC+( N-K+1 ) ), WORK,
31087
               CALL ZHPMV( UPLO, N-K, -CONE, AP( KC+( N-K+1 ) ),
-
 
31088
     $                     WORK,
30727
     $                     1, ZERO, AP( KCNEXT+2 ), 1 )
31089
     $                     1, ZERO, AP( KCNEXT+2 ), 1 )
30728
               AP( KCNEXT ) = AP( KCNEXT ) -
31090
               AP( KCNEXT ) = AP( KCNEXT ) -
30729
     $                        DBLE( ZDOTC( N-K, WORK, 1, AP( KCNEXT+2 ),
31091
     $                        DBLE( ZDOTC( N-K, WORK, 1,
-
 
31092
     $                              AP( KCNEXT+2 ),
30730
     $                        1 ) )
31093
     $                        1 ) )
30731
            END IF
31094
            END IF
30732
            KSTEP = 2
31095
            KSTEP = 2
30733
            KCNEXT = KCNEXT - ( N-K+3 )
31096
            KCNEXT = KCNEXT - ( N-K+3 )
30734
         END IF
31097
         END IF
Line 30914... Line 31277...
30914
*     .. External Functions ..
31277
*     .. External Functions ..
30915
      LOGICAL            LSAME
31278
      LOGICAL            LSAME
30916
      EXTERNAL           LSAME
31279
      EXTERNAL           LSAME
30917
*     ..
31280
*     ..
30918
*     .. External Subroutines ..
31281
*     .. External Subroutines ..
30919
      EXTERNAL           XERBLA, ZDSCAL, ZGEMV, ZGERU, ZLACGV, ZSWAP
31282
      EXTERNAL           XERBLA, ZDSCAL, ZGEMV, ZGERU, ZLACGV,
-
 
31283
     $                   ZSWAP
30920
*     ..
31284
*     ..
30921
*     .. Intrinsic Functions ..
31285
*     .. Intrinsic Functions ..
30922
      INTRINSIC          DBLE, DCONJG, MAX
31286
      INTRINSIC          DBLE, DCONJG, MAX
30923
*     ..
31287
*     ..
30924
*     .. Executable Statements ..
31288
*     .. Executable Statements ..
Line 31140... Line 31504...
31140
*
31504
*
31141
*           Multiply by inv(L(K)), where L(K) is the transformation
31505
*           Multiply by inv(L(K)), where L(K) is the transformation
31142
*           stored in columns K and K+1 of A.
31506
*           stored in columns K and K+1 of A.
31143
*
31507
*
31144
            IF( K.LT.N-1 ) THEN
31508
            IF( K.LT.N-1 ) THEN
31145
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+2 ), 1, B( K, 1 ),
31509
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+2 ), 1, B( K,
-
 
31510
     $                     1 ),
31146
     $                     LDB, B( K+2, 1 ), LDB )
31511
     $                     LDB, B( K+2, 1 ), LDB )
31147
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+N-K+2 ), 1,
31512
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+N-K+2 ), 1,
31148
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
31513
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
31149
            END IF
31514
            END IF
31150
*
31515
*
Line 31588... Line 31953...
31588
      INTEGER            ILAENV
31953
      INTEGER            ILAENV
31589
      LOGICAL            LSAME
31954
      LOGICAL            LSAME
31590
      EXTERNAL           ILAENV, LSAME
31955
      EXTERNAL           ILAENV, LSAME
31591
*     ..
31956
*     ..
31592
*     .. External Subroutines ..
31957
*     .. External Subroutines ..
31593
      EXTERNAL           XERBLA, ZCOPY, ZLACPY, ZLAHQR, ZLAQR0, ZLASET
31958
      EXTERNAL           XERBLA, ZCOPY, ZLACPY, ZLAHQR, ZLAQR0,
-
 
31959
     $                   ZLASET
31594
*     ..
31960
*     ..
31595
*     .. Intrinsic Functions ..
31961
*     .. Intrinsic Functions ..
31596
      INTRINSIC          DBLE, DCMPLX, MAX, MIN
31962
      INTRINSIC          DBLE, DCMPLX, MAX, MIN
31597
*     ..
31963
*     ..
31598
*     .. Executable Statements ..
31964
*     .. Executable Statements ..
Line 31639... Line 32005...
31639
*
32005
*
31640
      ELSE IF( LQUERY ) THEN
32006
      ELSE IF( LQUERY ) THEN
31641
*
32007
*
31642
*        ==== Quick return in case of a workspace query ====
32008
*        ==== Quick return in case of a workspace query ====
31643
*
32009
*
31644
         CALL ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI, Z,
32010
         CALL ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
-
 
32011
     $                Z,
31645
     $                LDZ, WORK, LWORK, INFO )
32012
     $                LDZ, WORK, LWORK, INFO )
31646
*        ==== Ensure reported workspace size is backward-compatible with
32013
*        ==== Ensure reported workspace size is backward-compatible with
31647
*        .    previous LAPACK versions. ====
32014
*        .    previous LAPACK versions. ====
31648
         WORK( 1 ) = DCMPLX( MAX( DBLE( WORK( 1 ) ), DBLE( MAX( 1,
32015
         WORK( 1 ) = DCMPLX( MAX( DBLE( WORK( 1 ) ), DBLE( MAX( 1,
31649
     $               N ) ) ), RZERO )
32016
     $               N ) ) ), RZERO )
Line 31654... Line 32021...
31654
*        ==== copy eigenvalues isolated by ZGEBAL ====
32021
*        ==== copy eigenvalues isolated by ZGEBAL ====
31655
*
32022
*
31656
         IF( ILO.GT.1 )
32023
         IF( ILO.GT.1 )
31657
     $      CALL ZCOPY( ILO-1, H, LDH+1, W, 1 )
32024
     $      CALL ZCOPY( ILO-1, H, LDH+1, W, 1 )
31658
         IF( IHI.LT.N )
32025
         IF( IHI.LT.N )
31659
     $      CALL ZCOPY( N-IHI, H( IHI+1, IHI+1 ), LDH+1, W( IHI+1 ), 1 )
32026
     $      CALL ZCOPY( N-IHI, H( IHI+1, IHI+1 ), LDH+1, W( IHI+1 ),
-
 
32027
     $                  1 )
31660
*
32028
*
31661
*        ==== Initialize Z, if requested ====
32029
*        ==== Initialize Z, if requested ====
31662
*
32030
*
31663
         IF( INITZ )
32031
         IF( INITZ )
31664
     $      CALL ZLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
32032
     $      CALL ZLASET( 'A', N, N, ZERO, ONE, Z, LDZ )
Line 31677... Line 32045...
31677
         NMIN = MAX( NTINY, NMIN )
32045
         NMIN = MAX( NTINY, NMIN )
31678
*
32046
*
31679
*        ==== ZLAQR0 for big matrices; ZLAHQR for small ones ====
32047
*        ==== ZLAQR0 for big matrices; ZLAHQR for small ones ====
31680
*
32048
*
31681
         IF( N.GT.NMIN ) THEN
32049
         IF( N.GT.NMIN ) THEN
31682
            CALL ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
32050
            CALL ZLAQR0( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO,
-
 
32051
     $                   IHI,
31683
     $                   Z, LDZ, WORK, LWORK, INFO )
32052
     $                   Z, LDZ, WORK, LWORK, INFO )
31684
         ELSE
32053
         ELSE
31685
*
32054
*
31686
*           ==== Small matrix ====
32055
*           ==== Small matrix ====
31687
*
32056
*
31688
            CALL ZLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO, IHI,
32057
            CALL ZLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILO,
-
 
32058
     $                   IHI,
31689
     $                   Z, LDZ, INFO )
32059
     $                   Z, LDZ, INFO )
31690
*
32060
*
31691
            IF( INFO.GT.0 ) THEN
32061
            IF( INFO.GT.0 ) THEN
31692
*
32062
*
31693
*              ==== A rare ZLAHQR failure!  ZLAQR0 sometimes succeeds
32063
*              ==== A rare ZLAHQR failure!  ZLAQR0 sometimes succeeds
Line 31710... Line 32080...
31710
*                 .    tiny matrices must be copied into a larger
32080
*                 .    tiny matrices must be copied into a larger
31711
*                 .    array before calling ZLAQR0. ====
32081
*                 .    array before calling ZLAQR0. ====
31712
*
32082
*
31713
                  CALL ZLACPY( 'A', N, N, H, LDH, HL, NL )
32083
                  CALL ZLACPY( 'A', N, N, H, LDH, HL, NL )
31714
                  HL( N+1, N ) = ZERO
32084
                  HL( N+1, N ) = ZERO
31715
                  CALL ZLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1, N+1 ),
32085
                  CALL ZLASET( 'A', NL, NL-N, ZERO, ZERO, HL( 1,
-
 
32086
     $                         N+1 ),
31716
     $                         NL )
32087
     $                         NL )
31717
                  CALL ZLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL, W,
32088
                  CALL ZLAQR0( WANTT, WANTZ, NL, ILO, KBOT, HL, NL,
-
 
32089
     $                         W,
31718
     $                         ILO, IHI, Z, LDZ, WORKL, NL, INFO )
32090
     $                         ILO, IHI, Z, LDZ, WORKL, NL, INFO )
31719
                  IF( WANTT .OR. INFO.NE.0 )
32091
                  IF( WANTT .OR. INFO.NE.0 )
31720
     $               CALL ZLACPY( 'A', N, N, HL, NL, H, LDH )
32092
     $               CALL ZLACPY( 'A', N, N, HL, NL, H, LDH )
31721
               END IF
32093
               END IF
31722
            END IF
32094
            END IF
Line 31944... Line 32316...
31944
*>  vi denotes an element of the vector defining H(i), and ui an element
32316
*>  vi denotes an element of the vector defining H(i), and ui an element
31945
*>  of the vector defining G(i).
32317
*>  of the vector defining G(i).
31946
*> \endverbatim
32318
*> \endverbatim
31947
*>
32319
*>
31948
*  =====================================================================
32320
*  =====================================================================
31949
      SUBROUTINE ZLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y,
32321
      SUBROUTINE ZLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX,
-
 
32322
     $                   Y,
31950
     $                   LDY )
32323
     $                   LDY )
31951
*
32324
*
31952
*  -- LAPACK auxiliary routine --
32325
*  -- LAPACK auxiliary routine --
31953
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
32326
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
31954
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
32327
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 32016... Line 32389...
32016
     $                     A( I, I+1 ), LDA, A( I, I ), 1, ZERO,
32389
     $                     A( I, I+1 ), LDA, A( I, I ), 1, ZERO,
32017
     $                     Y( I+1, I ), 1 )
32390
     $                     Y( I+1, I ), 1 )
32018
               CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
32391
               CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
32019
     $                     A( I, 1 ), LDA, A( I, I ), 1, ZERO,
32392
     $                     A( I, 1 ), LDA, A( I, I ), 1, ZERO,
32020
     $                     Y( 1, I ), 1 )
32393
     $                     Y( 1, I ), 1 )
32021
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
32394
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1,
-
 
32395
     $                     1 ),
32022
     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
32396
     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
32023
               CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
32397
               CALL ZGEMV( 'Conjugate transpose', M-I+1, I-1, ONE,
32024
     $                     X( I, 1 ), LDX, A( I, I ), 1, ZERO,
32398
     $                     X( I, 1 ), LDX, A( I, I ), 1, ZERO,
32025
     $                     Y( 1, I ), 1 )
32399
     $                     Y( 1, I ), 1 )
32026
               CALL ZGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
32400
               CALL ZGEMV( 'Conjugate transpose', I-1, N-I, -ONE,
Line 32049... Line 32423...
32049
               E( I ) = DBLE( ALPHA )
32423
               E( I ) = DBLE( ALPHA )
32050
               A( I, I+1 ) = ONE
32424
               A( I, I+1 ) = ONE
32051
*
32425
*
32052
*              Compute X(i+1:m,i)
32426
*              Compute X(i+1:m,i)
32053
*
32427
*
32054
               CALL ZGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ),
32428
               CALL ZGEMV( 'No transpose', M-I, N-I, ONE, A( I+1,
-
 
32429
     $                     I+1 ),
32055
     $                     LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
32430
     $                     LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 )
32056
               CALL ZGEMV( 'Conjugate transpose', N-I, I, ONE,
32431
               CALL ZGEMV( 'Conjugate transpose', N-I, I, ONE,
32057
     $                     Y( I+1, 1 ), LDY, A( I, I+1 ), LDA, ZERO,
32432
     $                     Y( I+1, 1 ), LDY, A( I, I+1 ), LDA, ZERO,
32058
     $                     X( 1, I ), 1 )
32433
     $                     X( 1, I ), 1 )
32059
               CALL ZGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
32434
               CALL ZGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ),
32060
     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32435
     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32061
               CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
32436
               CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1,
-
 
32437
     $                     I+1 ),
32062
     $                     LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
32438
     $                     LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 )
32063
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
32439
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1,
-
 
32440
     $                     1 ),
32064
     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32441
     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32065
               CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
32442
               CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
32066
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
32443
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
32067
            END IF
32444
            END IF
32068
   10    CONTINUE
32445
   10    CONTINUE
Line 32094... Line 32471...
32094
            IF( I.LT.M ) THEN
32471
            IF( I.LT.M ) THEN
32095
               A( I, I ) = ONE
32472
               A( I, I ) = ONE
32096
*
32473
*
32097
*              Compute X(i+1:m,i)
32474
*              Compute X(i+1:m,i)
32098
*
32475
*
32099
               CALL ZGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ),
32476
               CALL ZGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1,
-
 
32477
     $                     I ),
32100
     $                     LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
32478
     $                     LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 )
32101
               CALL ZGEMV( 'Conjugate transpose', N-I+1, I-1, ONE,
32479
               CALL ZGEMV( 'Conjugate transpose', N-I+1, I-1, ONE,
32102
     $                     Y( I, 1 ), LDY, A( I, I ), LDA, ZERO,
32480
     $                     Y( I, 1 ), LDY, A( I, I ), LDA, ZERO,
32103
     $                     X( 1, I ), 1 )
32481
     $                     X( 1, I ), 1 )
32104
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
32482
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1,
-
 
32483
     $                     1 ),
32105
     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32484
     $                     LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32106
               CALL ZGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ),
32485
               CALL ZGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1,
-
 
32486
     $                     I ),
32107
     $                     LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
32487
     $                     LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 )
32108
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ),
32488
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1,
-
 
32489
     $                     1 ),
32109
     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32490
     $                     LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 )
32110
               CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
32491
               CALL ZSCAL( M-I, TAUP( I ), X( I+1, I ), 1 )
32111
               CALL ZLACGV( N-I+1, A( I, I ), LDA )
32492
               CALL ZLACGV( N-I+1, A( I, I ), LDA )
32112
*
32493
*
32113
*              Update A(i+1:m,i)
32494
*              Update A(i+1:m,i)
32114
*
32495
*
32115
               CALL ZLACGV( I-1, Y( I, 1 ), LDY )
32496
               CALL ZLACGV( I-1, Y( I, 1 ), LDY )
32116
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ),
32497
               CALL ZGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1,
-
 
32498
     $                     1 ),
32117
     $                     LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
32499
     $                     LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 )
32118
               CALL ZLACGV( I-1, Y( I, 1 ), LDY )
32500
               CALL ZLACGV( I-1, Y( I, 1 ), LDY )
32119
               CALL ZGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
32501
               CALL ZGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ),
32120
     $                     LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
32502
     $                     LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 )
32121
*
32503
*
Line 32133... Line 32515...
32133
     $                     A( I+1, I+1 ), LDA, A( I+1, I ), 1, ZERO,
32515
     $                     A( I+1, I+1 ), LDA, A( I+1, I ), 1, ZERO,
32134
     $                     Y( I+1, I ), 1 )
32516
     $                     Y( I+1, I ), 1 )
32135
               CALL ZGEMV( 'Conjugate transpose', M-I, I-1, ONE,
32517
               CALL ZGEMV( 'Conjugate transpose', M-I, I-1, ONE,
32136
     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
32518
     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
32137
     $                     Y( 1, I ), 1 )
32519
     $                     Y( 1, I ), 1 )
32138
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ),
32520
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1,
-
 
32521
     $                     1 ),
32139
     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
32522
     $                     LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 )
32140
               CALL ZGEMV( 'Conjugate transpose', M-I, I, ONE,
32523
               CALL ZGEMV( 'Conjugate transpose', M-I, I, ONE,
32141
     $                     X( I+1, 1 ), LDX, A( I+1, I ), 1, ZERO,
32524
     $                     X( I+1, 1 ), LDX, A( I+1, I ), 1, ZERO,
32142
     $                     Y( 1, I ), 1 )
32525
     $                     Y( 1, I ), 1 )
32143
               CALL ZGEMV( 'Conjugate transpose', I, N-I, -ONE,
32526
               CALL ZGEMV( 'Conjugate transpose', I, N-I, -ONE,
Line 33324... Line 33707...
33324
     $                   J, K, LGN, LL, MATSIZ, MSD2, SMLSIZ, SMM1,
33707
     $                   J, K, LGN, LL, MATSIZ, MSD2, SMLSIZ, SMM1,
33325
     $                   SPM1, SPM2, SUBMAT, SUBPBS, TLVLS
33708
     $                   SPM1, SPM2, SUBMAT, SUBPBS, TLVLS
33326
      DOUBLE PRECISION   TEMP
33709
      DOUBLE PRECISION   TEMP
33327
*     ..
33710
*     ..
33328
*     .. External Subroutines ..
33711
*     .. External Subroutines ..
33329
      EXTERNAL           DCOPY, DSTEQR, XERBLA, ZCOPY, ZLACRM, ZLAED7
33712
      EXTERNAL           DCOPY, DSTEQR, XERBLA, ZCOPY, ZLACRM,
-
 
33713
     $                   ZLAED7
33330
*     ..
33714
*     ..
33331
*     .. External Functions ..
33715
*     .. External Functions ..
33332
      INTEGER            ILAENV
33716
      INTEGER            ILAENV
33333
      EXTERNAL           ILAENV
33717
      EXTERNAL           ILAENV
33334
*     ..
33718
*     ..
Line 33762... Line 34146...
33762
*> \author NAG Ltd.
34146
*> \author NAG Ltd.
33763
*
34147
*
33764
*> \ingroup laed7
34148
*> \ingroup laed7
33765
*
34149
*
33766
*  =====================================================================
34150
*  =====================================================================
33767
      SUBROUTINE ZLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q,
34151
      SUBROUTINE ZLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D,
-
 
34152
     $                   Q,
33768
     $                   LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM,
34153
     $                   LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM,
33769
     $                   GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK,
34154
     $                   GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK,
33770
     $                   INFO )
34155
     $                   INFO )
33771
*
34156
*
33772
*  -- LAPACK computational routine --
34157
*  -- LAPACK computational routine --
Line 33790... Line 34175...
33790
*     .. Local Scalars ..
34175
*     .. Local Scalars ..
33791
      INTEGER            COLTYP, CURR, I, IDLMDA, INDX,
34176
      INTEGER            COLTYP, CURR, I, IDLMDA, INDX,
33792
     $                   INDXC, INDXP, IQ, IW, IZ, K, N1, N2, PTR
34177
     $                   INDXC, INDXP, IQ, IW, IZ, K, N1, N2, PTR
33793
*     ..
34178
*     ..
33794
*     .. External Subroutines ..
34179
*     .. External Subroutines ..
33795
      EXTERNAL           DLAED9, DLAEDA, DLAMRG, XERBLA, ZLACRM, ZLAED8
34180
      EXTERNAL           DLAED9, DLAEDA, DLAMRG, XERBLA, ZLACRM,
-
 
34181
     $                   ZLAED8
33796
*     ..
34182
*     ..
33797
*     .. Intrinsic Functions ..
34183
*     .. Intrinsic Functions ..
33798
      INTRINSIC          MAX, MIN
34184
      INTRINSIC          MAX, MIN
33799
*     ..
34185
*     ..
33800
*     .. Executable Statements ..
34186
*     .. Executable Statements ..
Line 33876... Line 34262...
33876
*
34262
*
33877
      IF( K.NE.0 ) THEN
34263
      IF( K.NE.0 ) THEN
33878
         CALL DLAED9( K, 1, K, N, D, RWORK( IQ ), K, RHO,
34264
         CALL DLAED9( K, 1, K, N, D, RWORK( IQ ), K, RHO,
33879
     $                RWORK( IDLMDA ), RWORK( IW ),
34265
     $                RWORK( IDLMDA ), RWORK( IW ),
33880
     $                QSTORE( QPTR( CURR ) ), K, INFO )
34266
     $                QSTORE( QPTR( CURR ) ), K, INFO )
33881
         CALL ZLACRM( QSIZ, K, WORK, QSIZ, QSTORE( QPTR( CURR ) ), K, Q,
34267
         CALL ZLACRM( QSIZ, K, WORK, QSIZ, QSTORE( QPTR( CURR ) ), K,
-
 
34268
     $                Q,
33882
     $                LDQ, RWORK( IQ ) )
34269
     $                LDQ, RWORK( IQ ) )
33883
         QPTR( CURR+1 ) = QPTR( CURR ) + K**2
34270
         QPTR( CURR+1 ) = QPTR( CURR ) + K**2
33884
         IF( INFO.NE.0 ) THEN
34271
         IF( INFO.NE.0 ) THEN
33885
            RETURN
34272
            RETURN
33886
         END IF
34273
         END IF
Line 34124... Line 34511...
34124
*> \author NAG Ltd.
34511
*> \author NAG Ltd.
34125
*
34512
*
34126
*> \ingroup laed8
34513
*> \ingroup laed8
34127
*
34514
*
34128
*  =====================================================================
34515
*  =====================================================================
34129
      SUBROUTINE ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z, DLAMBDA,
34516
      SUBROUTINE ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z,
-
 
34517
     $                   DLAMBDA,
34130
     $                   Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR,
34518
     $                   Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR,
34131
     $                   GIVCOL, GIVNUM, INFO )
34519
     $                   GIVCOL, GIVNUM, INFO )
34132
*
34520
*
34133
*  -- LAPACK computational routine --
34521
*  -- LAPACK computational routine --
34134
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
34522
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 34161... Line 34549...
34161
      INTEGER            IDAMAX
34549
      INTEGER            IDAMAX
34162
      DOUBLE PRECISION   DLAMCH, DLAPY2
34550
      DOUBLE PRECISION   DLAMCH, DLAPY2
34163
      EXTERNAL           IDAMAX, DLAMCH, DLAPY2
34551
      EXTERNAL           IDAMAX, DLAMCH, DLAPY2
34164
*     ..
34552
*     ..
34165
*     .. External Subroutines ..
34553
*     .. External Subroutines ..
34166
      EXTERNAL           DCOPY, DLAMRG, DSCAL, XERBLA, ZCOPY, ZDROT,
34554
      EXTERNAL           DCOPY, DLAMRG, DSCAL, XERBLA, ZCOPY,
-
 
34555
     $                   ZDROT,
34167
     $                   ZLACPY
34556
     $                   ZLACPY
34168
*     ..
34557
*     ..
34169
*     .. Intrinsic Functions ..
34558
*     .. Intrinsic Functions ..
34170
      INTRINSIC          ABS, MAX, MIN, SQRT
34559
      INTRINSIC          ABS, MAX, MIN, SQRT
34171
*     ..
34560
*     ..
Line 34252... Line 34641...
34252
         K = 0
34641
         K = 0
34253
         DO 50 J = 1, N
34642
         DO 50 J = 1, N
34254
            PERM( J ) = INDXQ( INDX( J ) )
34643
            PERM( J ) = INDXQ( INDX( J ) )
34255
            CALL ZCOPY( QSIZ, Q( 1, PERM( J ) ), 1, Q2( 1, J ), 1 )
34644
            CALL ZCOPY( QSIZ, Q( 1, PERM( J ) ), 1, Q2( 1, J ), 1 )
34256
   50    CONTINUE
34645
   50    CONTINUE
34257
         CALL ZLACPY( 'A', QSIZ, N, Q2( 1, 1 ), LDQ2, Q( 1, 1 ), LDQ )
34646
         CALL ZLACPY( 'A', QSIZ, N, Q2( 1, 1 ), LDQ2, Q( 1, 1 ),
-
 
34647
     $                LDQ )
34258
         RETURN
34648
         RETURN
34259
      END IF
34649
      END IF
34260
*
34650
*
34261
*     If there are multiple eigenvalues then the problem deflates.  Here
34651
*     If there are multiple eigenvalues then the problem deflates.  Here
34262
*     the number of equal eigenvalues are found.  As each equal
34652
*     the number of equal eigenvalues are found.  As each equal
Line 34374... Line 34764...
34374
*     The deflated eigenvalues and their corresponding vectors go back
34764
*     The deflated eigenvalues and their corresponding vectors go back
34375
*     into the last N - K slots of D and Q respectively.
34765
*     into the last N - K slots of D and Q respectively.
34376
*
34766
*
34377
      IF( K.LT.N ) THEN
34767
      IF( K.LT.N ) THEN
34378
         CALL DCOPY( N-K, DLAMBDA( K+1 ), 1, D( K+1 ), 1 )
34768
         CALL DCOPY( N-K, DLAMBDA( K+1 ), 1, D( K+1 ), 1 )
34379
         CALL ZLACPY( 'A', QSIZ, N-K, Q2( 1, K+1 ), LDQ2, Q( 1, K+1 ),
34769
         CALL ZLACPY( 'A', QSIZ, N-K, Q2( 1, K+1 ), LDQ2, Q( 1,
-
 
34770
     $                K+1 ),
34380
     $                LDQ )
34771
     $                LDQ )
34381
      END IF
34772
      END IF
34382
*
34773
*
34383
      RETURN
34774
      RETURN
34384
*
34775
*
Line 34525... Line 34916...
34525
*> \author NAG Ltd.
34916
*> \author NAG Ltd.
34526
*
34917
*
34527
*> \ingroup lagtm
34918
*> \ingroup lagtm
34528
*
34919
*
34529
*  =====================================================================
34920
*  =====================================================================
34530
      SUBROUTINE ZLAGTM( TRANS, N, NRHS, ALPHA, DL, D, DU, X, LDX, BETA,
34921
      SUBROUTINE ZLAGTM( TRANS, N, NRHS, ALPHA, DL, D, DU, X, LDX,
-
 
34922
     $                   BETA,
34531
     $                   B, LDB )
34923
     $                   B, LDB )
34532
*
34924
*
34533
*  -- LAPACK auxiliary routine --
34925
*  -- LAPACK auxiliary routine --
34534
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
34926
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
34535
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
34927
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 34876... Line 35268...
34876
*>                  Computer Science Division,
35268
*>                  Computer Science Division,
34877
*>                  University of California, Berkeley
35269
*>                  University of California, Berkeley
34878
*> \endverbatim
35270
*> \endverbatim
34879
*
35271
*
34880
*  =====================================================================
35272
*  =====================================================================
34881
      SUBROUTINE ZLAHEF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW, INFO )
35273
      SUBROUTINE ZLAHEF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW,
-
 
35274
     $                   INFO )
34882
*
35275
*
34883
*  -- LAPACK computational routine --
35276
*  -- LAPACK computational routine --
34884
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
35277
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
34885
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
35278
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
34886
*
35279
*
Line 34902... Line 35295...
34902
      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
35295
      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
34903
      DOUBLE PRECISION   EIGHT, SEVTEN
35296
      DOUBLE PRECISION   EIGHT, SEVTEN
34904
      PARAMETER          ( EIGHT = 8.0D+0, SEVTEN = 17.0D+0 )
35297
      PARAMETER          ( EIGHT = 8.0D+0, SEVTEN = 17.0D+0 )
34905
*     ..
35298
*     ..
34906
*     .. Local Scalars ..
35299
*     .. Local Scalars ..
34907
      INTEGER            IMAX, J, JB, JJ, JMAX, JP, K, KK, KKW, KP,
35300
      INTEGER            IMAX, J, JJ, JMAX, JP, K, KK, KKW, KP,
34908
     $                   KSTEP, KW
35301
     $                   KSTEP, KW
34909
      DOUBLE PRECISION   ABSAKK, ALPHA, COLMAX, R1, ROWMAX, T
35302
      DOUBLE PRECISION   ABSAKK, ALPHA, COLMAX, R1, ROWMAX, T
34910
      COMPLEX*16         D11, D21, D22, Z
35303
      COMPLEX*16         D11, D21, D22, Z
34911
*     ..
35304
*     ..
34912
*     .. External Functions ..
35305
*     .. External Functions ..
34913
      LOGICAL            LSAME
35306
      LOGICAL            LSAME
34914
      INTEGER            IZAMAX
35307
      INTEGER            IZAMAX
34915
      EXTERNAL           LSAME, IZAMAX
35308
      EXTERNAL           LSAME, IZAMAX
34916
*     ..
35309
*     ..
34917
*     .. External Subroutines ..
35310
*     .. External Subroutines ..
34918
      EXTERNAL           ZCOPY, ZDSCAL, ZGEMM, ZGEMV, ZLACGV, ZSWAP
35311
      EXTERNAL           ZCOPY, ZDSCAL, ZGEMMTR, ZGEMV, ZLACGV,
-
 
35312
     $                   ZSWAP
34919
*     ..
35313
*     ..
34920
*     .. Intrinsic Functions ..
35314
*     .. Intrinsic Functions ..
34921
      INTRINSIC          ABS, DBLE, DCONJG, DIMAG, MAX, MIN, SQRT
35315
      INTRINSIC          ABS, DBLE, DCONJG, DIMAG, MAX, MIN, SQRT
34922
*     ..
35316
*     ..
34923
*     .. Statement Functions ..
35317
*     .. Statement Functions ..
Line 34958... Line 35352...
34958
*        Copy column K of A to column KW of W and update it
35352
*        Copy column K of A to column KW of W and update it
34959
*
35353
*
34960
         CALL ZCOPY( K-1, A( 1, K ), 1, W( 1, KW ), 1 )
35354
         CALL ZCOPY( K-1, A( 1, K ), 1, W( 1, KW ), 1 )
34961
         W( K, KW ) = DBLE( A( K, K ) )
35355
         W( K, KW ) = DBLE( A( K, K ) )
34962
         IF( K.LT.N ) THEN
35356
         IF( K.LT.N ) THEN
34963
            CALL ZGEMV( 'No transpose', K, N-K, -CONE, A( 1, K+1 ), LDA,
35357
            CALL ZGEMV( 'No transpose', K, N-K, -CONE, A( 1, K+1 ),
-
 
35358
     $                  LDA,
34964
     $                  W( K, KW+1 ), LDW, CONE, W( 1, KW ), 1 )
35359
     $                  W( K, KW+1 ), LDW, CONE, W( 1, KW ), 1 )
34965
            W( K, KW ) = DBLE( W( K, KW ) )
35360
            W( K, KW ) = DBLE( W( K, KW ) )
34966
         END IF
35361
         END IF
34967
*
35362
*
34968
*        Determine rows and columns to be interchanged and whether
35363
*        Determine rows and columns to be interchanged and whether
Line 35251... Line 35646...
35251
*
35646
*
35252
*        Update the upper triangle of A11 (= A(1:k,1:k)) as
35647
*        Update the upper triangle of A11 (= A(1:k,1:k)) as
35253
*
35648
*
35254
*        A11 := A11 - U12*D*U12**H = A11 - U12*W**H
35649
*        A11 := A11 - U12*D*U12**H = A11 - U12*W**H
35255
*
35650
*
35256
*        computing blocks of NB columns at a time (note that conjg(W) is
-
 
35257
*        actually stored)
35651
*        (note that conjg(W) is actually stored)
35258
*
-
 
35259
         DO 50 J = ( ( K-1 ) / NB )*NB + 1, 1, -NB
-
 
35260
            JB = MIN( NB, K-J+1 )
-
 
35261
*
-
 
35262
*           Update the upper triangle of the diagonal block
-
 
35263
*
-
 
35264
            DO 40 JJ = J, J + JB - 1
-
 
35265
               A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
-
 
35266
               CALL ZGEMV( 'No transpose', JJ-J+1, N-K, -CONE,
-
 
35267
     $                     A( J, K+1 ), LDA, W( JJ, KW+1 ), LDW, CONE,
-
 
35268
     $                     A( J, JJ ), 1 )
-
 
35269
               A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
-
 
35270
   40       CONTINUE
-
 
35271
*
35652
*
35272
*           Update the rectangular superdiagonal block
-
 
35273
*
-
 
35274
            CALL ZGEMM( 'No transpose', 'Transpose', J-1, JB, N-K,
35653
         CALL ZGEMMTR( 'Upper', 'No transpose', 'Transpose', K, N-K,
35275
     $                  -CONE, A( 1, K+1 ), LDA, W( J, KW+1 ), LDW,
35654
     $                 -CONE, A( 1, K+1 ), LDA, W( 1, KW+1 ), LDW,
35276
     $                  CONE, A( 1, J ), LDA )
35655
     $                 CONE, A( 1, 1 ), LDA )
35277
   50    CONTINUE
-
 
35278
*
35656
*
35279
*        Put U12 in standard form by partially undoing the interchanges
35657
*        Put U12 in standard form by partially undoing the interchanges
35280
*        in columns k+1:n looping backwards from k+1 to n
35658
*        in columns k+1:n looping backwards from k+1 to n
35281
*
35659
*
35282
         J = K + 1
35660
         J = K + 1
Line 35326... Line 35704...
35326
*        Copy column K of A to column K of W and update it
35704
*        Copy column K of A to column K of W and update it
35327
*
35705
*
35328
         W( K, K ) = DBLE( A( K, K ) )
35706
         W( K, K ) = DBLE( A( K, K ) )
35329
         IF( K.LT.N )
35707
         IF( K.LT.N )
35330
     $      CALL ZCOPY( N-K, A( K+1, K ), 1, W( K+1, K ), 1 )
35708
     $      CALL ZCOPY( N-K, A( K+1, K ), 1, W( K+1, K ), 1 )
35331
         CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K, 1 ), LDA,
35709
         CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K, 1 ),
-
 
35710
     $               LDA,
35332
     $               W( K, 1 ), LDW, CONE, W( K, K ), 1 )
35711
     $               W( K, 1 ), LDW, CONE, W( K, K ), 1 )
35333
         W( K, K ) = DBLE( W( K, K ) )
35712
         W( K, K ) = DBLE( W( K, K ) )
35334
*
35713
*
35335
*        Determine rows and columns to be interchanged and whether
35714
*        Determine rows and columns to be interchanged and whether
35336
*        a 1-by-1 or 2-by-2 pivot block will be used
35715
*        a 1-by-1 or 2-by-2 pivot block will be used
Line 35373... Line 35752...
35373
*              BEGIN pivot search along IMAX row
35752
*              BEGIN pivot search along IMAX row
35374
*
35753
*
35375
*
35754
*
35376
*              Copy column IMAX to column K+1 of W and update it
35755
*              Copy column IMAX to column K+1 of W and update it
35377
*
35756
*
35378
               CALL ZCOPY( IMAX-K, A( IMAX, K ), LDA, W( K, K+1 ), 1 )
35757
               CALL ZCOPY( IMAX-K, A( IMAX, K ), LDA, W( K, K+1 ),
-
 
35758
     $                     1 )
35379
               CALL ZLACGV( IMAX-K, W( K, K+1 ), 1 )
35759
               CALL ZLACGV( IMAX-K, W( K, K+1 ), 1 )
35380
               W( IMAX, K+1 ) = DBLE( A( IMAX, IMAX ) )
35760
               W( IMAX, K+1 ) = DBLE( A( IMAX, IMAX ) )
35381
               IF( IMAX.LT.N )
35761
               IF( IMAX.LT.N )
35382
     $            CALL ZCOPY( N-IMAX, A( IMAX+1, IMAX ), 1,
35762
     $            CALL ZCOPY( N-IMAX, A( IMAX+1, IMAX ), 1,
35383
     $                        W( IMAX+1, K+1 ), 1 )
35763
     $                        W( IMAX+1, K+1 ), 1 )
35384
               CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K, 1 ),
35764
               CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K,
-
 
35765
     $                     1 ),
35385
     $                     LDA, W( IMAX, 1 ), LDW, CONE, W( K, K+1 ),
35766
     $                     LDA, W( IMAX, 1 ), LDW, CONE, W( K, K+1 ),
35386
     $                     1 )
35767
     $                     1 )
35387
               W( IMAX, K+1 ) = DBLE( W( IMAX, K+1 ) )
35768
               W( IMAX, K+1 ) = DBLE( W( IMAX, K+1 ) )
35388
*
35769
*
35389
*              JMAX is the column-index of the largest off-diagonal
35770
*              JMAX is the column-index of the largest off-diagonal
Line 35453... Line 35834...
35453
               A( KP, KP ) = DBLE( A( KK, KK ) )
35834
               A( KP, KP ) = DBLE( A( KK, KK ) )
35454
               CALL ZCOPY( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
35835
               CALL ZCOPY( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
35455
     $                     LDA )
35836
     $                     LDA )
35456
               CALL ZLACGV( KP-KK-1, A( KP, KK+1 ), LDA )
35837
               CALL ZLACGV( KP-KK-1, A( KP, KK+1 ), LDA )
35457
               IF( KP.LT.N )
35838
               IF( KP.LT.N )
35458
     $            CALL ZCOPY( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ), 1 )
35839
     $            CALL ZCOPY( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ),
-
 
35840
     $                        1 )
35459
*
35841
*
35460
*              Interchange rows KK and KP in first K-1 columns of A
35842
*              Interchange rows KK and KP in first K-1 columns of A
35461
*              (columns K (or K and K+1 for 2-by-2 pivot) of A will be
35843
*              (columns K (or K and K+1 for 2-by-2 pivot) of A will be
35462
*              later overwritten). Interchange rows KK and KP
35844
*              later overwritten). Interchange rows KK and KP
35463
*              in first KK columns of W.
35845
*              in first KK columns of W.
Line 35611... Line 35993...
35611
*
35993
*
35612
*        Update the lower triangle of A22 (= A(k:n,k:n)) as
35994
*        Update the lower triangle of A22 (= A(k:n,k:n)) as
35613
*
35995
*
35614
*        A22 := A22 - L21*D*L21**H = A22 - L21*W**H
35996
*        A22 := A22 - L21*D*L21**H = A22 - L21*W**H
35615
*
35997
*
35616
*        computing blocks of NB columns at a time (note that conjg(W) is
-
 
35617
*        actually stored)
35998
*        (note that conjg(W) is actually stored)
35618
*
-
 
35619
         DO 110 J = K, N, NB
-
 
35620
            JB = MIN( NB, N-J+1 )
-
 
35621
*
-
 
35622
*           Update the lower triangle of the diagonal block
-
 
35623
*
-
 
35624
            DO 100 JJ = J, J + JB - 1
-
 
35625
               A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
-
 
35626
               CALL ZGEMV( 'No transpose', J+JB-JJ, K-1, -CONE,
-
 
35627
     $                     A( JJ, 1 ), LDA, W( JJ, 1 ), LDW, CONE,
-
 
35628
     $                     A( JJ, JJ ), 1 )
-
 
35629
               A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
-
 
35630
  100       CONTINUE
-
 
35631
*
-
 
35632
*           Update the rectangular subdiagonal block
-
 
35633
*
35999
*
35634
            IF( J+JB.LE.N )
-
 
35635
     $         CALL ZGEMM( 'No transpose', 'Transpose', N-J-JB+1, JB,
36000
         CALL ZGEMMTR( 'Lower', 'No transpose', 'Transpose', N-K+1,
35636
     $                     K-1, -CONE, A( J+JB, 1 ), LDA, W( J, 1 ),
36001
     $                 K-1, -CONE, A( K, 1 ), LDA, W( K, 1 ), LDW,
35637
     $                     LDW, CONE, A( J+JB, J ), LDA )
36002
     $                 CONE, A( K, K ), LDA )
35638
  110    CONTINUE
-
 
35639
*
36003
*
35640
*        Put L21 in standard form by partially undoing the interchanges
36004
*        Put L21 in standard form by partially undoing the interchanges
35641
*        of rows in columns 1:k-1 looping backwards from k-1 to 1
36005
*        of rows in columns 1:k-1 looping backwards from k-1 to 1
35642
*
36006
*
35643
         J = K - 1
36007
         J = K - 1
Line 35959... Line 36323...
35959
            H( I, I-1 ) = ABS( H( I, I-1 ) )
36323
            H( I, I-1 ) = ABS( H( I, I-1 ) )
35960
            CALL ZSCAL( JHI-I+1, SC, H( I, I ), LDH )
36324
            CALL ZSCAL( JHI-I+1, SC, H( I, I ), LDH )
35961
            CALL ZSCAL( MIN( JHI, I+1 )-JLO+1, DCONJG( SC ),
36325
            CALL ZSCAL( MIN( JHI, I+1 )-JLO+1, DCONJG( SC ),
35962
     $                  H( JLO, I ), 1 )
36326
     $                  H( JLO, I ), 1 )
35963
            IF( WANTZ )
36327
            IF( WANTZ )
35964
     $         CALL ZSCAL( IHIZ-ILOZ+1, DCONJG( SC ), Z( ILOZ, I ), 1 )
36328
     $         CALL ZSCAL( IHIZ-ILOZ+1, DCONJG( SC ), Z( ILOZ, I ),
-
 
36329
     $                     1 )
35965
         END IF
36330
         END IF
35966
   20 CONTINUE
36331
   20 CONTINUE
35967
*
36332
*
35968
      NH = IHI - ILO + 1
36333
      NH = IHI - ILO + 1
35969
      NZ = IHIZ - ILOZ + 1
36334
      NZ = IHIZ - ILOZ + 1
Line 36196... Line 36561...
36196
     $            H( M+2, M+1 ) = H( M+2, M+1 )*TEMP
36561
     $            H( M+2, M+1 ) = H( M+2, M+1 )*TEMP
36197
               DO 110 J = M, I
36562
               DO 110 J = M, I
36198
                  IF( J.NE.M+1 ) THEN
36563
                  IF( J.NE.M+1 ) THEN
36199
                     IF( I2.GT.J )
36564
                     IF( I2.GT.J )
36200
     $                  CALL ZSCAL( I2-J, TEMP, H( J, J+1 ), LDH )
36565
     $                  CALL ZSCAL( I2-J, TEMP, H( J, J+1 ), LDH )
36201
                     CALL ZSCAL( J-I1, DCONJG( TEMP ), H( I1, J ), 1 )
36566
                     CALL ZSCAL( J-I1, DCONJG( TEMP ), H( I1, J ),
-
 
36567
     $                           1 )
36202
                     IF( WANTZ ) THEN
36568
                     IF( WANTZ ) THEN
36203
                        CALL ZSCAL( NZ, DCONJG( TEMP ), Z( ILOZ, J ),
36569
                        CALL ZSCAL( NZ, DCONJG( TEMP ), Z( ILOZ, J ),
36204
     $                              1 )
36570
     $                              1 )
36205
                     END IF
36571
                     END IF
36206
                  END IF
36572
                  END IF
Line 36473... Line 36839...
36473
*           Update A(K+1:N,I)
36839
*           Update A(K+1:N,I)
36474
*
36840
*
36475
*           Update I-th column of A - Y * V**H
36841
*           Update I-th column of A - Y * V**H
36476
*
36842
*
36477
            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA )
36843
            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA )
36478
            CALL ZGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, Y(K+1,1), LDY,
36844
            CALL ZGEMV( 'NO TRANSPOSE', N-K, I-1, -ONE, Y(K+1,1),
-
 
36845
     $                  LDY,
36479
     $                  A( K+I-1, 1 ), LDA, ONE, A( K+1, I ), 1 )
36846
     $                  A( K+I-1, 1 ), LDA, ONE, A( K+1, I ), 1 )
36480
            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA )
36847
            CALL ZLACGV( I-1, A( K+I-1, 1 ), LDA )
36481
*
36848
*
36482
*           Apply I - V * T**H * V**H to this column (call it b) from the
36849
*           Apply I - V * T**H * V**H to this column (call it b) from the
36483
*           left, using the last column of T as workspace
36850
*           left, using the last column of T as workspace
Line 36523... Line 36890...
36523
         END IF
36890
         END IF
36524
*
36891
*
36525
*        Generate the elementary reflector H(I) to annihilate
36892
*        Generate the elementary reflector H(I) to annihilate
36526
*        A(K+I+1:N,I)
36893
*        A(K+I+1:N,I)
36527
*
36894
*
36528
         CALL ZLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ), 1,
36895
         CALL ZLARFG( N-K-I+1, A( K+I, I ), A( MIN( K+I+1, N ), I ),
-
 
36896
     $                1,
36529
     $                TAU( I ) )
36897
     $                TAU( I ) )
36530
         EI = A( K+I, I )
36898
         EI = A( K+I, I )
36531
         A( K+I, I ) = ONE
36899
         A( K+I, I ) = ONE
36532
*
36900
*
36533
*        Compute  Y(K+1:N,I)
36901
*        Compute  Y(K+1:N,I)
Line 36810... Line 37178...
36810
     $                  A( K+I, 1 ), LDA, A( K+I, I ), 1, ONE,
37178
     $                  A( K+I, 1 ), LDA, A( K+I, I ), 1, ONE,
36811
     $                  T( 1, NB ), 1 )
37179
     $                  T( 1, NB ), 1 )
36812
*
37180
*
36813
*           w := T**H *w
37181
*           w := T**H *w
36814
*
37182
*
36815
            CALL ZTRMV( 'Upper', 'Conjugate transpose', 'Non-unit', I-1,
37183
            CALL ZTRMV( 'Upper', 'Conjugate transpose', 'Non-unit',
36816
     $                  T, LDT, T( 1, NB ), 1 )
37184
     $                  I-1, T, LDT, T( 1, NB ), 1 )
36817
*
37185
*
36818
*           b2 := b2 - V2*w
37186
*           b2 := b2 - V2*w
36819
*
37187
*
36820
            CALL ZGEMV( 'No transpose', N-K-I+1, I-1, -ONE, A( K+I, 1 ),
37188
            CALL ZGEMV( 'No transpose', N-K-I+1, I-1, -ONE,
36821
     $                  LDA, T( 1, NB ), 1, ONE, A( K+I, I ), 1 )
37189
     $                  A( K+I, 1 ), LDA, T( 1, NB ), 1, ONE,
-
 
37190
     $                  A( K+I, I ), 1 )
36822
*
37191
*
36823
*           b1 := b1 - V1*w
37192
*           b1 := b1 - V1*w
36824
*
37193
*
36825
            CALL ZTRMV( 'Lower', 'No transpose', 'Unit', I-1,
37194
            CALL ZTRMV( 'Lower', 'No transpose', 'Unit', I-1,
36826
     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
37195
     $                  A( K+1, 1 ), LDA, T( 1, NB ), 1 )
Line 36837... Line 37206...
36837
     $                TAU( I ) )
37206
     $                TAU( I ) )
36838
         A( K+I, I ) = ONE
37207
         A( K+I, I ) = ONE
36839
*
37208
*
36840
*        Compute  Y(1:n,i)
37209
*        Compute  Y(1:n,i)
36841
*
37210
*
36842
         CALL ZGEMV( 'No transpose', N, N-K-I+1, ONE, A( 1, I+1 ), LDA,
37211
         CALL ZGEMV( 'No transpose', N, N-K-I+1, ONE, A( 1, I+1 ),
36843
     $               A( K+I, I ), 1, ZERO, Y( 1, I ), 1 )
37212
     $               LDA, A( K+I, I ), 1, ZERO, Y( 1, I ), 1 )
36844
         CALL ZGEMV( 'Conjugate transpose', N-K-I+1, I-1, ONE,
37213
         CALL ZGEMV( 'Conjugate transpose', N-K-I+1, I-1, ONE,
36845
     $               A( K+I, 1 ), LDA, A( K+I, I ), 1, ZERO, T( 1, I ),
37214
     $               A( K+I, 1 ), LDA, A( K+I, I ), 1, ZERO, T( 1, I ),
36846
     $               1 )
37215
     $               1 )
36847
         CALL ZGEMV( 'No transpose', N, I-1, -ONE, Y, LDY, T( 1, I ), 1,
37216
         CALL ZGEMV( 'No transpose', N, I-1, -ONE, Y, LDY, T( 1, I ),
36848
     $               ONE, Y( 1, I ), 1 )
37217
     $               1, ONE, Y( 1, I ), 1 )
36849
         CALL ZSCAL( N, TAU( I ), Y( 1, I ), 1 )
37218
         CALL ZSCAL( N, TAU( I ), Y( 1, I ), 1 )
36850
*
37219
*
36851
*        Compute T(1:i,i)
37220
*        Compute T(1:i,i)
36852
*
37221
*
36853
         CALL ZSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
37222
         CALL ZSCAL( I-1, -TAU( I ), T( 1, I ), 1 )
36854
         CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, LDT,
37223
         CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, 
36855
     $               T( 1, I ), 1 )
37224
     $               LDT, T( 1, I ), 1 )
36856
         T( I, I ) = TAU( I )
37225
         T( I, I ) = TAU( I )
36857
*
37226
*
36858
   10 CONTINUE
37227
   10 CONTINUE
36859
      A( K+NB, NB ) = EI
37228
      A( K+NB, NB ) = EI
36860
*
37229
*
Line 37127... Line 37496...
37127
*>     Ming Gu and Ren-Cang Li, Computer Science Division, University of
37496
*>     Ming Gu and Ren-Cang Li, Computer Science Division, University of
37128
*>       California at Berkeley, USA \n
37497
*>       California at Berkeley, USA \n
37129
*>     Osni Marques, LBNL/NERSC, USA \n
37498
*>     Osni Marques, LBNL/NERSC, USA \n
37130
*
37499
*
37131
*  =====================================================================
37500
*  =====================================================================
37132
      SUBROUTINE ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX,
37501
      SUBROUTINE ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX,
-
 
37502
     $                   LDBX,
37133
     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
37503
     $                   PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM,
37134
     $                   POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO )
37504
     $                   POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO )
37135
*
37505
*
37136
*  -- LAPACK computational routine --
37506
*  -- LAPACK computational routine --
37137
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
37507
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 37159... Line 37529...
37159
*     .. Local Scalars ..
37529
*     .. Local Scalars ..
37160
      INTEGER            I, J, JCOL, JROW, M, N, NLP1
37530
      INTEGER            I, J, JCOL, JROW, M, N, NLP1
37161
      DOUBLE PRECISION   DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
37531
      DOUBLE PRECISION   DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP
37162
*     ..
37532
*     ..
37163
*     .. External Subroutines ..
37533
*     .. External Subroutines ..
37164
      EXTERNAL           DGEMV, XERBLA, ZCOPY, ZDROT, ZDSCAL, ZLACPY,
37534
      EXTERNAL           DGEMV, XERBLA, ZCOPY, ZDROT, ZDSCAL,
-
 
37535
     $                   ZLACPY,
37165
     $                   ZLASCL
37536
     $                   ZLASCL
37166
*     ..
37537
*     ..
37167
*     .. External Functions ..
37538
*     .. External Functions ..
37168
      DOUBLE PRECISION   DLAMC3, DNRM2
37539
      DOUBLE PRECISION   DLAMC3, DNRM2
37169
      EXTERNAL           DLAMC3, DNRM2
37540
      EXTERNAL           DLAMC3, DNRM2
Line 37223... Line 37594...
37223
*
37594
*
37224
*        Step (2L): permute rows of B.
37595
*        Step (2L): permute rows of B.
37225
*
37596
*
37226
         CALL ZCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX )
37597
         CALL ZCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX )
37227
         DO 20 I = 2, N
37598
         DO 20 I = 2, N
37228
            CALL ZCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ), LDBX )
37599
            CALL ZCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ),
-
 
37600
     $                  LDBX )
37229
   20    CONTINUE
37601
   20    CONTINUE
37230
*
37602
*
37231
*        Step (3L): apply the inverse of the left singular vector
37603
*        Step (3L): apply the inverse of the left singular vector
37232
*        matrix to BX.
37604
*        matrix to BX.
37233
*
37605
*
Line 37343... Line 37715...
37343
*
37715
*
37344
*                    Use calls to the subroutine DLAMC3 to enforce the
37716
*                    Use calls to the subroutine DLAMC3 to enforce the
37345
*                    parentheses (x+y)+z. The goal is to prevent
37717
*                    parentheses (x+y)+z. The goal is to prevent
37346
*                    optimizing compilers from doing x+(y+z).
37718
*                    optimizing compilers from doing x+(y+z).
37347
*
37719
*
37348
                     RWORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I+1,
37720
                     RWORK( I ) = Z( J ) / ( DLAMC3( DSIGJ,
-
 
37721
     $                      -POLES( I+1,
37349
     $                            2 ) )-DIFR( I, 1 ) ) /
37722
     $                            2 ) )-DIFR( I, 1 ) ) /
37350
     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
37723
     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
37351
                  END IF
37724
                  END IF
37352
  110          CONTINUE
37725
  110          CONTINUE
37353
               DO 120 I = J + 1, K
37726
               DO 120 I = J + 1, K
37354
                  IF( Z( J ).EQ.ZERO ) THEN
37727
                  IF( Z( J ).EQ.ZERO ) THEN
37355
                     RWORK( I ) = ZERO
37728
                     RWORK( I ) = ZERO
37356
                  ELSE
37729
                  ELSE
37357
                     RWORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I,
37730
                     RWORK( I ) = Z( J ) / ( DLAMC3( DSIGJ,
-
 
37731
     $                      -POLES( I,
37358
     $                            2 ) )-DIFL( I ) ) /
37732
     $                            2 ) )-DIFL( I ) ) /
37359
     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
37733
     $                            ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 )
37360
                  END IF
37734
                  END IF
37361
  120          CONTINUE
37735
  120          CONTINUE
37362
*
37736
*
Line 37394... Line 37768...
37394
*        Step (2R): if SQRE = 1, apply back the rotation that is
37768
*        Step (2R): if SQRE = 1, apply back the rotation that is
37395
*        related to the right null space of the subproblem.
37769
*        related to the right null space of the subproblem.
37396
*
37770
*
37397
         IF( SQRE.EQ.1 ) THEN
37771
         IF( SQRE.EQ.1 ) THEN
37398
            CALL ZCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX )
37772
            CALL ZCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX )
37399
            CALL ZDROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C, S )
37773
            CALL ZDROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C,
-
 
37774
     $                  S )
37400
         END IF
37775
         END IF
37401
         IF( K.LT.MAX( M, N ) )
37776
         IF( K.LT.MAX( M, N ) )
37402
     $      CALL ZLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB, BX( K+1, 1 ),
37777
     $      CALL ZLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB, BX( K+1,
-
 
37778
     $                   1 ),
37403
     $                   LDBX )
37779
     $                   LDBX )
37404
*
37780
*
37405
*        Step (3R): permute rows of B.
37781
*        Step (3R): permute rows of B.
37406
*
37782
*
37407
         CALL ZCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB )
37783
         CALL ZCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB )
37408
         IF( SQRE.EQ.1 ) THEN
37784
         IF( SQRE.EQ.1 ) THEN
37409
            CALL ZCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB )
37785
            CALL ZCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB )
37410
         END IF
37786
         END IF
37411
         DO 190 I = 2, N
37787
         DO 190 I = 2, N
37412
            CALL ZCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ), LDB )
37788
            CALL ZCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ),
-
 
37789
     $                  LDB )
37413
  190    CONTINUE
37790
  190    CONTINUE
37414
*
37791
*
37415
*        Step (4R): apply back the Givens rotations performed.
37792
*        Step (4R): apply back the Givens rotations performed.
37416
*
37793
*
37417
         DO 200 I = GIVPTR, 1, -1
37794
         DO 200 I = GIVPTR, 1, -1
Line 37686... Line 38063...
37686
*>     Ming Gu and Ren-Cang Li, Computer Science Division, University of
38063
*>     Ming Gu and Ren-Cang Li, Computer Science Division, University of
37687
*>       California at Berkeley, USA \n
38064
*>       California at Berkeley, USA \n
37688
*>     Osni Marques, LBNL/NERSC, USA \n
38065
*>     Osni Marques, LBNL/NERSC, USA \n
37689
*
38066
*
37690
*  =====================================================================
38067
*  =====================================================================
37691
      SUBROUTINE ZLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U,
38068
      SUBROUTINE ZLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX,
-
 
38069
     $                   U,
37692
     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,
38070
     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,
37693
     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, RWORK,
38071
     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, RWORK,
37694
     $                   IWORK, INFO )
38072
     $                   IWORK, INFO )
37695
*
38073
*
37696
*  -- LAPACK computational routine --
38074
*  -- LAPACK computational routine --
Line 37720... Line 38098...
37720
      INTEGER            I, I1, IC, IM1, INODE, J, JCOL, JIMAG, JREAL,
38098
      INTEGER            I, I1, IC, IM1, INODE, J, JCOL, JIMAG, JREAL,
37721
     $                   JROW, LF, LL, LVL, LVL2, ND, NDB1, NDIML,
38099
     $                   JROW, LF, LL, LVL, LVL2, ND, NDB1, NDIML,
37722
     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQRE
38100
     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQRE
37723
*     ..
38101
*     ..
37724
*     .. External Subroutines ..
38102
*     .. External Subroutines ..
37725
      EXTERNAL           DGEMM, DLASDT, XERBLA, ZCOPY, ZLALS0
38103
      EXTERNAL           DGEMM, DLASDT, XERBLA, ZCOPY,
-
 
38104
     $                   ZLALS0
37726
*     ..
38105
*     ..
37727
*     .. Intrinsic Functions ..
38106
*     .. Intrinsic Functions ..
37728
      INTRINSIC          DBLE, DCMPLX, DIMAG
38107
      INTRINSIC          DBLE, DCMPLX, DIMAG
37729
*     ..
38108
*     ..
37730
*     .. Executable Statements ..
38109
*     .. Executable Statements ..
Line 37899... Line 38278...
37899
            NL = IWORK( NDIML+IM1 )
38278
            NL = IWORK( NDIML+IM1 )
37900
            NR = IWORK( NDIMR+IM1 )
38279
            NR = IWORK( NDIMR+IM1 )
37901
            NLF = IC - NL
38280
            NLF = IC - NL
37902
            NRF = IC + 1
38281
            NRF = IC + 1
37903
            J = J - 1
38282
            J = J - 1
37904
            CALL ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ), LDBX,
38283
            CALL ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ),
-
 
38284
     $                   LDBX,
37905
     $                   B( NLF, 1 ), LDB, PERM( NLF, LVL ),
38285
     $                   B( NLF, 1 ), LDB, PERM( NLF, LVL ),
37906
     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
38286
     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
37907
     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
38287
     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
37908
     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
38288
     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
37909
     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
38289
     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
Line 37944... Line 38324...
37944
               SQRE = 0
38324
               SQRE = 0
37945
            ELSE
38325
            ELSE
37946
               SQRE = 1
38326
               SQRE = 1
37947
            END IF
38327
            END IF
37948
            J = J + 1
38328
            J = J + 1
37949
            CALL ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ), LDB,
38329
            CALL ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ),
-
 
38330
     $                   LDB,
37950
     $                   BX( NLF, 1 ), LDBX, PERM( NLF, LVL ),
38331
     $                   BX( NLF, 1 ), LDBX, PERM( NLF, LVL ),
37951
     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
38332
     $                   GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL,
37952
     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
38333
     $                   GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ),
37953
     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
38334
     $                   DIFL( NLF, LVL ), DIFR( NLF, LVL2 ),
37954
     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
38335
     $                   Z( NLF, LVL ), K( J ), C( J ), S( J ), RWORK,
Line 37986... Line 38367...
37986
            DO 200 JROW = NLF, NLF + NLP1 - 1
38367
            DO 200 JROW = NLF, NLF + NLP1 - 1
37987
               J = J + 1
38368
               J = J + 1
37988
               RWORK( J ) = DBLE( B( JROW, JCOL ) )
38369
               RWORK( J ) = DBLE( B( JROW, JCOL ) )
37989
  200       CONTINUE
38370
  200       CONTINUE
37990
  210    CONTINUE
38371
  210    CONTINUE
37991
         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
38372
         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ),
-
 
38373
     $               LDU,
37992
     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO, RWORK( 1 ),
38374
     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO, RWORK( 1 ),
37993
     $               NLP1 )
38375
     $               NLP1 )
37994
         J = NLP1*NRHS*2
38376
         J = NLP1*NRHS*2
37995
         DO 230 JCOL = 1, NRHS
38377
         DO 230 JCOL = 1, NRHS
37996
            DO 220 JROW = NLF, NLF + NLP1 - 1
38378
            DO 220 JROW = NLF, NLF + NLP1 - 1
37997
               J = J + 1
38379
               J = J + 1
37998
               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
38380
               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
37999
  220       CONTINUE
38381
  220       CONTINUE
38000
  230    CONTINUE
38382
  230    CONTINUE
38001
         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU,
38383
         CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ),
-
 
38384
     $               LDU,
38002
     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO,
38385
     $               RWORK( 1+NLP1*NRHS*2 ), NLP1, ZERO,
38003
     $               RWORK( 1+NLP1*NRHS ), NLP1 )
38386
     $               RWORK( 1+NLP1*NRHS ), NLP1 )
38004
         JREAL = 0
38387
         JREAL = 0
38005
         JIMAG = NLP1*NRHS
38388
         JIMAG = NLP1*NRHS
38006
         DO 250 JCOL = 1, NRHS
38389
         DO 250 JCOL = 1, NRHS
Line 38023... Line 38406...
38023
            DO 260 JROW = NRF, NRF + NRP1 - 1
38406
            DO 260 JROW = NRF, NRF + NRP1 - 1
38024
               J = J + 1
38407
               J = J + 1
38025
               RWORK( J ) = DBLE( B( JROW, JCOL ) )
38408
               RWORK( J ) = DBLE( B( JROW, JCOL ) )
38026
  260       CONTINUE
38409
  260       CONTINUE
38027
  270    CONTINUE
38410
  270    CONTINUE
38028
         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
38411
         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ),
-
 
38412
     $               LDU,
38029
     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO, RWORK( 1 ),
38413
     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO, RWORK( 1 ),
38030
     $               NRP1 )
38414
     $               NRP1 )
38031
         J = NRP1*NRHS*2
38415
         J = NRP1*NRHS*2
38032
         DO 290 JCOL = 1, NRHS
38416
         DO 290 JCOL = 1, NRHS
38033
            DO 280 JROW = NRF, NRF + NRP1 - 1
38417
            DO 280 JROW = NRF, NRF + NRP1 - 1
38034
               J = J + 1
38418
               J = J + 1
38035
               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
38419
               RWORK( J ) = DIMAG( B( JROW, JCOL ) )
38036
  280       CONTINUE
38420
  280       CONTINUE
38037
  290    CONTINUE
38421
  290    CONTINUE
38038
         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU,
38422
         CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ),
-
 
38423
     $               LDU,
38039
     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO,
38424
     $               RWORK( 1+NRP1*NRHS*2 ), NRP1, ZERO,
38040
     $               RWORK( 1+NRP1*NRHS ), NRP1 )
38425
     $               RWORK( 1+NRP1*NRHS ), NRP1 )
38041
         JREAL = 0
38426
         JREAL = 0
38042
         JIMAG = NRP1*NRHS
38427
         JIMAG = NRP1*NRHS
38043
         DO 310 JCOL = 1, NRHS
38428
         DO 310 JCOL = 1, NRHS
Line 38275... Line 38660...
38275
      INTEGER            IDAMAX
38660
      INTEGER            IDAMAX
38276
      DOUBLE PRECISION   DLAMCH, DLANST
38661
      DOUBLE PRECISION   DLAMCH, DLANST
38277
      EXTERNAL           IDAMAX, DLAMCH, DLANST
38662
      EXTERNAL           IDAMAX, DLAMCH, DLANST
38278
*     ..
38663
*     ..
38279
*     .. External Subroutines ..
38664
*     .. External Subroutines ..
38280
      EXTERNAL           DGEMM, DLARTG, DLASCL, DLASDA, DLASDQ, DLASET,
38665
      EXTERNAL           DGEMM, DLARTG, DLASCL, DLASDA, DLASDQ,
-
 
38666
     $                   DLASET,
38281
     $                   DLASRT, XERBLA, ZCOPY, ZDROT, ZLACPY, ZLALSA,
38667
     $                   DLASRT, XERBLA, ZCOPY, ZDROT, ZLACPY, ZLALSA,
38282
     $                   ZLASCL, ZLASET
38668
     $                   ZLASCL, ZLASET
38283
*     ..
38669
*     ..
38284
*     .. Intrinsic Functions ..
38670
*     .. Intrinsic Functions ..
38285
      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, LOG, SIGN
38671
      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, LOG, SIGN
Line 38321... Line 38707...
38321
      ELSE IF( N.EQ.1 ) THEN
38707
      ELSE IF( N.EQ.1 ) THEN
38322
         IF( D( 1 ).EQ.ZERO ) THEN
38708
         IF( D( 1 ).EQ.ZERO ) THEN
38323
            CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B, LDB )
38709
            CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B, LDB )
38324
         ELSE
38710
         ELSE
38325
            RANK = 1
38711
            RANK = 1
38326
            CALL ZLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, INFO )
38712
            CALL ZLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB,
-
 
38713
     $                   INFO )
38327
            D( 1 ) = ABS( D( 1 ) )
38714
            D( 1 ) = ABS( D( 1 ) )
38328
         END IF
38715
         END IF
38329
         RETURN
38716
         RETURN
38330
      END IF
38717
      END IF
38331
*
38718
*
Line 38347... Line 38734...
38347
         IF( NRHS.GT.1 ) THEN
38734
         IF( NRHS.GT.1 ) THEN
38348
            DO 30 I = 1, NRHS
38735
            DO 30 I = 1, NRHS
38349
               DO 20 J = 1, N - 1
38736
               DO 20 J = 1, N - 1
38350
                  CS = RWORK( J*2-1 )
38737
                  CS = RWORK( J*2-1 )
38351
                  SN = RWORK( J*2 )
38738
                  SN = RWORK( J*2 )
38352
                  CALL ZDROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS, SN )
38739
                  CALL ZDROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS,
-
 
38740
     $                        SN )
38353
   20          CONTINUE
38741
   20          CONTINUE
38354
   30       CONTINUE
38742
   30       CONTINUE
38355
         END IF
38743
         END IF
38356
      END IF
38744
      END IF
38357
*
38745
*
Line 38420... Line 38808...
38420
   90    CONTINUE
38808
   90    CONTINUE
38421
*
38809
*
38422
         TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) )
38810
         TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) )
38423
         DO 100 I = 1, N
38811
         DO 100 I = 1, N
38424
            IF( D( I ).LE.TOL ) THEN
38812
            IF( D( I ).LE.TOL ) THEN
38425
               CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B( I, 1 ), LDB )
38813
               CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, B( I, 1 ),
-
 
38814
     $                      LDB )
38426
            ELSE
38815
            ELSE
38427
               CALL ZLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ),
38816
               CALL ZLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I,
-
 
38817
     $                      1 ),
38428
     $                      LDB, INFO )
38818
     $                      LDB, INFO )
38429
               RANK = RANK + 1
38819
               RANK = RANK + 1
38430
            END IF
38820
            END IF
38431
  100    CONTINUE
38821
  100    CONTINUE
38432
*
38822
*
Line 38651... Line 39041...
38651
*
39041
*
38652
*        Some of the elements in D can be negative because 1-by-1
39042
*        Some of the elements in D can be negative because 1-by-1
38653
*        subproblems were not solved explicitly.
39043
*        subproblems were not solved explicitly.
38654
*
39044
*
38655
         IF( ABS( D( I ) ).LE.TOL ) THEN
39045
         IF( ABS( D( I ) ).LE.TOL ) THEN
38656
            CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, WORK( BX+I-1 ), N )
39046
            CALL ZLASET( 'A', 1, NRHS, CZERO, CZERO, WORK( BX+I-1 ),
-
 
39047
     $                   N )
38657
         ELSE
39048
         ELSE
38658
            RANK = RANK + 1
39049
            RANK = RANK + 1
38659
            CALL ZLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS,
39050
            CALL ZLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS,
38660
     $                   WORK( BX+I-1 ), N, INFO )
39051
     $                   WORK( BX+I-1 ), N, INFO )
38661
         END IF
39052
         END IF
Line 38714... Line 39105...
38714
                  B( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
39105
                  B( JROW, JCOL ) = DCMPLX( RWORK( JREAL ),
38715
     $                              RWORK( JIMAG ) )
39106
     $                              RWORK( JIMAG ) )
38716
  300          CONTINUE
39107
  300          CONTINUE
38717
  310       CONTINUE
39108
  310       CONTINUE
38718
         ELSE
39109
         ELSE
38719
            CALL ZLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N,
39110
            CALL ZLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ),
-
 
39111
     $                   N,
38720
     $                   B( ST, 1 ), LDB, RWORK( U+ST1 ), N,
39112
     $                   B( ST, 1 ), LDB, RWORK( U+ST1 ), N,
38721
     $                   RWORK( VT+ST1 ), IWORK( K+ST1 ),
39113
     $                   RWORK( VT+ST1 ), IWORK( K+ST1 ),
38722
     $                   RWORK( DIFL+ST1 ), RWORK( DIFR+ST1 ),
39114
     $                   RWORK( DIFL+ST1 ), RWORK( DIFR+ST1 ),
38723
     $                   RWORK( Z+ST1 ), RWORK( POLES+ST1 ),
39115
     $                   RWORK( Z+ST1 ), RWORK( POLES+ST1 ),
38724
     $                   IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
39116
     $                   IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N,
Line 38943... Line 39335...
38943
         VALUE = ZERO
39335
         VALUE = ZERO
38944
         DO 80 I = 1, N
39336
         DO 80 I = 1, N
38945
            TEMP = WORK( I )
39337
            TEMP = WORK( I )
38946
            IF( VALUE.LT.TEMP .OR. DISNAN( TEMP ) ) VALUE = TEMP
39338
            IF( VALUE.LT.TEMP .OR. DISNAN( TEMP ) ) VALUE = TEMP
38947
   80    CONTINUE
39339
   80    CONTINUE
-
 
39340
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
38948
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
39341
     $         ( LSAME( NORM, 'E' ) ) ) THEN
38949
*
39342
*
38950
*        Find normF(A).
39343
*        Find normF(A).
38951
*
39344
*
38952
         SCALE = ZERO
39345
         SCALE = ZERO
38953
         SUM = ONE
39346
         SUM = ONE
38954
         DO 90 J = 1, N
39347
         DO 90 J = 1, N
38955
            L = MAX( 1, J-KU )
39348
            L = MAX( 1, J-KU )
38956
            K = KU + 1 - J + L
39349
            K = KU + 1 - J + L
38957
            CALL ZLASSQ( MIN( N, J+KL )-L+1, AB( K, J ), 1, SCALE, SUM )
39350
            CALL ZLASSQ( MIN( N, J+KL )-L+1, AB( K, J ), 1, SCALE,
-
 
39351
     $                   SUM )
38958
   90    CONTINUE
39352
   90    CONTINUE
38959
         VALUE = SCALE*SQRT( SUM )
39353
         VALUE = SCALE*SQRT( SUM )
38960
      END IF
39354
      END IF
38961
*
39355
*
38962
      ZLANGB = VALUE
39356
      ZLANGB = VALUE
Line 39155... Line 39549...
39155
         VALUE = ZERO
39549
         VALUE = ZERO
39156
         DO 80 I = 1, M
39550
         DO 80 I = 1, M
39157
            TEMP = WORK( I )
39551
            TEMP = WORK( I )
39158
            IF( VALUE.LT.TEMP .OR. DISNAN( TEMP ) ) VALUE = TEMP
39552
            IF( VALUE.LT.TEMP .OR. DISNAN( TEMP ) ) VALUE = TEMP
39159
   80    CONTINUE
39553
   80    CONTINUE
-
 
39554
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
39160
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
39555
     $         ( LSAME( NORM, 'E' ) ) ) THEN
39161
*
39556
*
39162
*        Find normF(A).
39557
*        Find normF(A).
39163
*
39558
*
39164
         SCALE = ZERO
39559
         SCALE = ZERO
39165
         SUM = ONE
39560
         SUM = ONE
Line 39321... Line 39716...
39321
*
39716
*
39322
*        Find max(abs(A(i,j))).
39717
*        Find max(abs(A(i,j))).
39323
*
39718
*
39324
         ANORM = ABS( D( N ) )
39719
         ANORM = ABS( D( N ) )
39325
         DO 10 I = 1, N - 1
39720
         DO 10 I = 1, N - 1
39326
            IF( ANORM.LT.ABS( DL( I ) ) .OR. DISNAN( ABS( DL( I ) ) ) )
39721
            IF( ANORM.LT.ABS( DL( I ) ) .OR.
-
 
39722
     $          DISNAN( ABS( DL( I ) ) ) )
39327
     $           ANORM = ABS(DL(I))
39723
     $           ANORM = ABS(DL(I))
39328
            IF( ANORM.LT.ABS( D( I ) ) .OR. DISNAN( ABS( D( I ) ) ) )
39724
            IF( ANORM.LT.ABS( D( I ) ) .OR. DISNAN( ABS( D( I ) ) ) )
39329
     $           ANORM = ABS(D(I))
39725
     $           ANORM = ABS(D(I))
39330
            IF( ANORM.LT.ABS( DU( I ) ) .OR. DISNAN (ABS( DU( I ) ) ) )
39726
            IF( ANORM.LT.ABS( DU( I ) ) .OR.
-
 
39727
     $          DISNAN (ABS( DU( I ) ) ) )
39331
     $           ANORM = ABS(DU(I))
39728
     $           ANORM = ABS(DU(I))
39332
   10    CONTINUE
39729
   10    CONTINUE
39333
      ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' ) THEN
39730
      ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' ) THEN
39334
*
39731
*
39335
*        Find norm1(A).
39732
*        Find norm1(A).
Line 39358... Line 39755...
39358
            DO 30 I = 2, N - 1
39755
            DO 30 I = 2, N - 1
39359
               TEMP = ABS( D( I ) )+ABS( DU( I ) )+ABS( DL( I-1 ) )
39756
               TEMP = ABS( D( I ) )+ABS( DU( I ) )+ABS( DL( I-1 ) )
39360
               IF( ANORM .LT. TEMP .OR. DISNAN( TEMP ) ) ANORM = TEMP
39757
               IF( ANORM .LT. TEMP .OR. DISNAN( TEMP ) ) ANORM = TEMP
39361
   30       CONTINUE
39758
   30       CONTINUE
39362
         END IF
39759
         END IF
-
 
39760
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
39363
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
39761
     $         ( LSAME( NORM, 'E' ) ) ) THEN
39364
*
39762
*
39365
*        Find normF(A).
39763
*        Find normF(A).
39366
*
39764
*
39367
         SCALE = ZERO
39765
         SCALE = ZERO
39368
         SUM = ONE
39766
         SUM = ONE
Line 39563... Line 39961...
39563
                  SUM = ABS( A( I, J ) )
39961
                  SUM = ABS( A( I, J ) )
39564
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
39962
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
39565
   30          CONTINUE
39963
   30          CONTINUE
39566
   40       CONTINUE
39964
   40       CONTINUE
39567
         END IF
39965
         END IF
39568
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
39966
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR.
-
 
39967
     $         ( LSAME( NORM, 'O' ) ) .OR.
39569
     $         ( NORM.EQ.'1' ) ) THEN
39968
     $         ( NORM.EQ.'1' ) ) THEN
39570
*
39969
*
39571
*        Find normI(A) ( = norm1(A), since A is hermitian).
39970
*        Find normI(A) ( = norm1(A), since A is hermitian).
39572
*
39971
*
39573
         VALUE = ZERO
39972
         VALUE = ZERO
Line 39597... Line 39996...
39597
                  WORK( I ) = WORK( I ) + ABSA
39996
                  WORK( I ) = WORK( I ) + ABSA
39598
   90          CONTINUE
39997
   90          CONTINUE
39599
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
39998
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
39600
  100       CONTINUE
39999
  100       CONTINUE
39601
         END IF
40000
         END IF
-
 
40001
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
39602
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
40002
     $         ( LSAME( NORM, 'E' ) ) ) THEN
39603
*
40003
*
39604
*        Find normF(A).
40004
*        Find normF(A).
39605
*
40005
*
39606
         SCALE = ZERO
40006
         SCALE = ZERO
39607
         SUM = ONE
40007
         SUM = ONE
Line 39815... Line 40215...
39815
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40215
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
39816
   30          CONTINUE
40216
   30          CONTINUE
39817
               K = K + N - J + 1
40217
               K = K + N - J + 1
39818
   40       CONTINUE
40218
   40       CONTINUE
39819
         END IF
40219
         END IF
39820
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
40220
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR.
-
 
40221
     $         ( LSAME( NORM, 'O' ) ) .OR.
39821
     $         ( NORM.EQ.'1' ) ) THEN
40222
     $         ( NORM.EQ.'1' ) ) THEN
39822
*
40223
*
39823
*        Find normI(A) ( = norm1(A), since A is hermitian).
40224
*        Find normI(A) ( = norm1(A), since A is hermitian).
39824
*
40225
*
39825
         VALUE = ZERO
40226
         VALUE = ZERO
Line 39854... Line 40255...
39854
                  K = K + 1
40255
                  K = K + 1
39855
   90          CONTINUE
40256
   90          CONTINUE
39856
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40257
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
39857
  100       CONTINUE
40258
  100       CONTINUE
39858
         END IF
40259
         END IF
-
 
40260
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
39859
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
40261
     $         ( LSAME( NORM, 'E' ) ) ) THEN
39860
*
40262
*
39861
*        Find normF(A).
40263
*        Find normF(A).
39862
*
40264
*
39863
         SCALE = ZERO
40265
         SCALE = ZERO
39864
         SUM = ONE
40266
         SUM = ONE
Line 40085... Line 40487...
40085
         VALUE = ZERO
40487
         VALUE = ZERO
40086
         DO 80 I = 1, N
40488
         DO 80 I = 1, N
40087
            SUM = WORK( I )
40489
            SUM = WORK( I )
40088
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40490
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40089
   80    CONTINUE
40491
   80    CONTINUE
-
 
40492
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
40090
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
40493
     $         ( LSAME( NORM, 'E' ) ) ) THEN
40091
*
40494
*
40092
*        Find normF(A).
40495
*        Find normF(A).
40093
*
40496
*
40094
         SCALE = ZERO
40497
         SCALE = ZERO
40095
         SUM = ONE
40498
         SUM = ONE
Line 40279... Line 40682...
40279
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40682
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40280
   30          CONTINUE
40683
   30          CONTINUE
40281
               K = K + N - J + 1
40684
               K = K + N - J + 1
40282
   40       CONTINUE
40685
   40       CONTINUE
40283
         END IF
40686
         END IF
40284
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
40687
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR.
-
 
40688
     $         ( LSAME( NORM, 'O' ) ) .OR.
40285
     $         ( NORM.EQ.'1' ) ) THEN
40689
     $         ( NORM.EQ.'1' ) ) THEN
40286
*
40690
*
40287
*        Find normI(A) ( = norm1(A), since A is symmetric).
40691
*        Find normI(A) ( = norm1(A), since A is symmetric).
40288
*
40692
*
40289
         VALUE = ZERO
40693
         VALUE = ZERO
Line 40318... Line 40722...
40318
                  K = K + 1
40722
                  K = K + 1
40319
   90          CONTINUE
40723
   90          CONTINUE
40320
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40724
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40321
  100       CONTINUE
40725
  100       CONTINUE
40322
         END IF
40726
         END IF
-
 
40727
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
40323
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
40728
     $         ( LSAME( NORM, 'E' ) ) ) THEN
40324
*
40729
*
40325
*        Find normF(A).
40730
*        Find normF(A).
40326
*
40731
*
40327
         SCALE = ZERO
40732
         SCALE = ZERO
40328
         SUM = ONE
40733
         SUM = ONE
Line 40552... Line 40957...
40552
                  SUM = ABS( A( I, J ) )
40957
                  SUM = ABS( A( I, J ) )
40553
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40958
                  IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40554
   30          CONTINUE
40959
   30          CONTINUE
40555
   40       CONTINUE
40960
   40       CONTINUE
40556
         END IF
40961
         END IF
40557
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR.
40962
      ELSE IF( ( LSAME( NORM, 'I' ) ) .OR.
-
 
40963
     $         ( LSAME( NORM, 'O' ) ) .OR.
40558
     $         ( NORM.EQ.'1' ) ) THEN
40964
     $         ( NORM.EQ.'1' ) ) THEN
40559
*
40965
*
40560
*        Find normI(A) ( = norm1(A), since A is symmetric).
40966
*        Find normI(A) ( = norm1(A), since A is symmetric).
40561
*
40967
*
40562
         VALUE = ZERO
40968
         VALUE = ZERO
Line 40586... Line 40992...
40586
                  WORK( I ) = WORK( I ) + ABSA
40992
                  WORK( I ) = WORK( I ) + ABSA
40587
   90          CONTINUE
40993
   90          CONTINUE
40588
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40994
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40589
  100       CONTINUE
40995
  100       CONTINUE
40590
         END IF
40996
         END IF
-
 
40997
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
40591
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
40998
     $         ( LSAME( NORM, 'E' ) ) ) THEN
40592
*
40999
*
40593
*        Find normF(A).
41000
*        Find normF(A).
40594
*
41001
*
40595
         SCALE = ZERO
41002
         SCALE = ZERO
40596
         SUM = ONE
41003
         SUM = ONE
Line 40801... Line 41208...
40801
            VALUE = ONE
41208
            VALUE = ONE
40802
            IF( LSAME( UPLO, 'U' ) ) THEN
41209
            IF( LSAME( UPLO, 'U' ) ) THEN
40803
               DO 20 J = 1, N
41210
               DO 20 J = 1, N
40804
                  DO 10 I = MAX( K+2-J, 1 ), K
41211
                  DO 10 I = MAX( K+2-J, 1 ), K
40805
                     SUM = ABS( AB( I, J ) )
41212
                     SUM = ABS( AB( I, J ) )
-
 
41213
                     IF( VALUE .LT. SUM .OR.
40806
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41214
     $                   DISNAN( SUM ) ) VALUE = SUM
40807
   10             CONTINUE
41215
   10             CONTINUE
40808
   20          CONTINUE
41216
   20          CONTINUE
40809
            ELSE
41217
            ELSE
40810
               DO 40 J = 1, N
41218
               DO 40 J = 1, N
40811
                  DO 30 I = 2, MIN( N+1-J, K+1 )
41219
                  DO 30 I = 2, MIN( N+1-J, K+1 )
40812
                     SUM = ABS( AB( I, J ) )
41220
                     SUM = ABS( AB( I, J ) )
-
 
41221
                     IF( VALUE .LT. SUM .OR.
40813
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41222
     $                   DISNAN( SUM ) ) VALUE = SUM
40814
   30             CONTINUE
41223
   30             CONTINUE
40815
   40          CONTINUE
41224
   40          CONTINUE
40816
            END IF
41225
            END IF
40817
         ELSE
41226
         ELSE
40818
            VALUE = ZERO
41227
            VALUE = ZERO
40819
            IF( LSAME( UPLO, 'U' ) ) THEN
41228
            IF( LSAME( UPLO, 'U' ) ) THEN
40820
               DO 60 J = 1, N
41229
               DO 60 J = 1, N
40821
                  DO 50 I = MAX( K+2-J, 1 ), K + 1
41230
                  DO 50 I = MAX( K+2-J, 1 ), K + 1
40822
                     SUM = ABS( AB( I, J ) )
41231
                     SUM = ABS( AB( I, J ) )
-
 
41232
                     IF( VALUE .LT. SUM .OR.
40823
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41233
     $                   DISNAN( SUM ) ) VALUE = SUM
40824
   50             CONTINUE
41234
   50             CONTINUE
40825
   60          CONTINUE
41235
   60          CONTINUE
40826
            ELSE
41236
            ELSE
40827
               DO 80 J = 1, N
41237
               DO 80 J = 1, N
40828
                  DO 70 I = 1, MIN( N+1-J, K+1 )
41238
                  DO 70 I = 1, MIN( N+1-J, K+1 )
40829
                     SUM = ABS( AB( I, J ) )
41239
                     SUM = ABS( AB( I, J ) )
-
 
41240
                     IF( VALUE .LT. SUM .OR.
40830
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41241
     $                   DISNAN( SUM ) ) VALUE = SUM
40831
   70             CONTINUE
41242
   70             CONTINUE
40832
   80          CONTINUE
41243
   80          CONTINUE
40833
            END IF
41244
            END IF
40834
         END IF
41245
         END IF
40835
      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
41246
      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
Line 40921... Line 41332...
40921
         END IF
41332
         END IF
40922
         DO 270 I = 1, N
41333
         DO 270 I = 1, N
40923
            SUM = WORK( I )
41334
            SUM = WORK( I )
40924
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41335
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
40925
  270    CONTINUE
41336
  270    CONTINUE
-
 
41337
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
40926
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
41338
     $         ( LSAME( NORM, 'E' ) ) ) THEN
40927
*
41339
*
40928
*        Find normF(A).
41340
*        Find normF(A).
40929
*
41341
*
40930
         IF( LSAME( UPLO, 'U' ) ) THEN
41342
         IF( LSAME( UPLO, 'U' ) ) THEN
40931
            IF( LSAME( DIAG, 'U' ) ) THEN
41343
            IF( LSAME( DIAG, 'U' ) ) THEN
Line 40940... Line 41352...
40940
               END IF
41352
               END IF
40941
            ELSE
41353
            ELSE
40942
               SCALE = ZERO
41354
               SCALE = ZERO
40943
               SUM = ONE
41355
               SUM = ONE
40944
               DO 290 J = 1, N
41356
               DO 290 J = 1, N
40945
                  CALL ZLASSQ( MIN( J, K+1 ), AB( MAX( K+2-J, 1 ), J ),
41357
                  CALL ZLASSQ( MIN( J, K+1 ), AB( MAX( K+2-J, 1 ),
-
 
41358
     $                         J ),
40946
     $                         1, SCALE, SUM )
41359
     $                         1, SCALE, SUM )
40947
  290          CONTINUE
41360
  290          CONTINUE
40948
            END IF
41361
            END IF
40949
         ELSE
41362
         ELSE
40950
            IF( LSAME( DIAG, 'U' ) ) THEN
41363
            IF( LSAME( DIAG, 'U' ) ) THEN
40951
               SCALE = ONE
41364
               SCALE = ONE
40952
               SUM = N
41365
               SUM = N
40953
               IF( K.GT.0 ) THEN
41366
               IF( K.GT.0 ) THEN
40954
                  DO 300 J = 1, N - 1
41367
                  DO 300 J = 1, N - 1
40955
                     CALL ZLASSQ( MIN( N-J, K ), AB( 2, J ), 1, SCALE,
41368
                     CALL ZLASSQ( MIN( N-J, K ), AB( 2, J ), 1,
-
 
41369
     $                            SCALE,
40956
     $                            SUM )
41370
     $                            SUM )
40957
  300             CONTINUE
41371
  300             CONTINUE
40958
               END IF
41372
               END IF
40959
            ELSE
41373
            ELSE
40960
               SCALE = ZERO
41374
               SCALE = ZERO
40961
               SUM = ONE
41375
               SUM = ONE
40962
               DO 310 J = 1, N
41376
               DO 310 J = 1, N
40963
                  CALL ZLASSQ( MIN( N-J+1, K+1 ), AB( 1, J ), 1, SCALE,
41377
                  CALL ZLASSQ( MIN( N-J+1, K+1 ), AB( 1, J ), 1,
-
 
41378
     $                         SCALE,
40964
     $                         SUM )
41379
     $                         SUM )
40965
  310          CONTINUE
41380
  310          CONTINUE
40966
            END IF
41381
            END IF
40967
         END IF
41382
         END IF
40968
         VALUE = SCALE*SQRT( SUM )
41383
         VALUE = SCALE*SQRT( SUM )
Line 41095... Line 41510...
41095
*> \author NAG Ltd.
41510
*> \author NAG Ltd.
41096
*
41511
*
41097
*> \ingroup lantp
41512
*> \ingroup lantp
41098
*
41513
*
41099
*  =====================================================================
41514
*  =====================================================================
41100
      DOUBLE PRECISION FUNCTION ZLANTP( NORM, UPLO, DIAG, N, AP, WORK )
41515
      DOUBLE PRECISION FUNCTION ZLANTP( NORM, UPLO, DIAG, N, AP,
-
 
41516
     $                                  WORK )
41101
*
41517
*
41102
*  -- LAPACK auxiliary routine --
41518
*  -- LAPACK auxiliary routine --
41103
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
41519
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
41104
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
41520
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
41105
*
41521
*
Line 41146... Line 41562...
41146
            VALUE = ONE
41562
            VALUE = ONE
41147
            IF( LSAME( UPLO, 'U' ) ) THEN
41563
            IF( LSAME( UPLO, 'U' ) ) THEN
41148
               DO 20 J = 1, N
41564
               DO 20 J = 1, N
41149
                  DO 10 I = K, K + J - 2
41565
                  DO 10 I = K, K + J - 2
41150
                     SUM = ABS( AP( I ) )
41566
                     SUM = ABS( AP( I ) )
-
 
41567
                     IF( VALUE .LT. SUM .OR.
41151
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41568
     $                   DISNAN( SUM ) ) VALUE = SUM
41152
   10             CONTINUE
41569
   10             CONTINUE
41153
                  K = K + J
41570
                  K = K + J
41154
   20          CONTINUE
41571
   20          CONTINUE
41155
            ELSE
41572
            ELSE
41156
               DO 40 J = 1, N
41573
               DO 40 J = 1, N
41157
                  DO 30 I = K + 1, K + N - J
41574
                  DO 30 I = K + 1, K + N - J
41158
                     SUM = ABS( AP( I ) )
41575
                     SUM = ABS( AP( I ) )
-
 
41576
                     IF( VALUE .LT. SUM .OR.
41159
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41577
     $                   DISNAN( SUM ) ) VALUE = SUM
41160
   30             CONTINUE
41578
   30             CONTINUE
41161
                  K = K + N - J + 1
41579
                  K = K + N - J + 1
41162
   40          CONTINUE
41580
   40          CONTINUE
41163
            END IF
41581
            END IF
41164
         ELSE
41582
         ELSE
41165
            VALUE = ZERO
41583
            VALUE = ZERO
41166
            IF( LSAME( UPLO, 'U' ) ) THEN
41584
            IF( LSAME( UPLO, 'U' ) ) THEN
41167
               DO 60 J = 1, N
41585
               DO 60 J = 1, N
41168
                  DO 50 I = K, K + J - 1
41586
                  DO 50 I = K, K + J - 1
41169
                     SUM = ABS( AP( I ) )
41587
                     SUM = ABS( AP( I ) )
-
 
41588
                     IF( VALUE .LT. SUM .OR.
41170
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41589
     $                   DISNAN( SUM ) ) VALUE = SUM
41171
   50             CONTINUE
41590
   50             CONTINUE
41172
                  K = K + J
41591
                  K = K + J
41173
   60          CONTINUE
41592
   60          CONTINUE
41174
            ELSE
41593
            ELSE
41175
               DO 80 J = 1, N
41594
               DO 80 J = 1, N
41176
                  DO 70 I = K, K + N - J
41595
                  DO 70 I = K, K + N - J
41177
                     SUM = ABS( AP( I ) )
41596
                     SUM = ABS( AP( I ) )
-
 
41597
                     IF( VALUE .LT. SUM .OR.
41178
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41598
     $                   DISNAN( SUM ) ) VALUE = SUM
41179
   70             CONTINUE
41599
   70             CONTINUE
41180
                  K = K + N - J + 1
41600
                  K = K + N - J + 1
41181
   80          CONTINUE
41601
   80          CONTINUE
41182
            END IF
41602
            END IF
41183
         END IF
41603
         END IF
Line 41276... Line 41696...
41276
         VALUE = ZERO
41696
         VALUE = ZERO
41277
         DO 270 I = 1, N
41697
         DO 270 I = 1, N
41278
            SUM = WORK( I )
41698
            SUM = WORK( I )
41279
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41699
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41280
  270    CONTINUE
41700
  270    CONTINUE
-
 
41701
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
41281
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
41702
     $         ( LSAME( NORM, 'E' ) ) ) THEN
41282
*
41703
*
41283
*        Find normF(A).
41704
*        Find normF(A).
41284
*
41705
*
41285
         IF( LSAME( UPLO, 'U' ) ) THEN
41706
         IF( LSAME( UPLO, 'U' ) ) THEN
41286
            IF( LSAME( DIAG, 'U' ) ) THEN
41707
            IF( LSAME( DIAG, 'U' ) ) THEN
Line 41465... Line 41886...
41465
*> \author NAG Ltd.
41886
*> \author NAG Ltd.
41466
*
41887
*
41467
*> \ingroup lantr
41888
*> \ingroup lantr
41468
*
41889
*
41469
*  =====================================================================
41890
*  =====================================================================
41470
      DOUBLE PRECISION FUNCTION ZLANTR( NORM, UPLO, DIAG, M, N, A, LDA,
41891
      DOUBLE PRECISION FUNCTION ZLANTR( NORM, UPLO, DIAG, M, N, A,
-
 
41892
     $                                  LDA,
41471
     $                 WORK )
41893
     $                 WORK )
41472
*
41894
*
41473
*  -- LAPACK auxiliary routine --
41895
*  -- LAPACK auxiliary routine --
41474
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
41896
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
41475
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
41897
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 41516... Line 41938...
41516
            VALUE = ONE
41938
            VALUE = ONE
41517
            IF( LSAME( UPLO, 'U' ) ) THEN
41939
            IF( LSAME( UPLO, 'U' ) ) THEN
41518
               DO 20 J = 1, N
41940
               DO 20 J = 1, N
41519
                  DO 10 I = 1, MIN( M, J-1 )
41941
                  DO 10 I = 1, MIN( M, J-1 )
41520
                     SUM = ABS( A( I, J ) )
41942
                     SUM = ABS( A( I, J ) )
-
 
41943
                     IF( VALUE .LT. SUM .OR.
41521
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41944
     $                   DISNAN( SUM ) ) VALUE = SUM
41522
   10             CONTINUE
41945
   10             CONTINUE
41523
   20          CONTINUE
41946
   20          CONTINUE
41524
            ELSE
41947
            ELSE
41525
               DO 40 J = 1, N
41948
               DO 40 J = 1, N
41526
                  DO 30 I = J + 1, M
41949
                  DO 30 I = J + 1, M
41527
                     SUM = ABS( A( I, J ) )
41950
                     SUM = ABS( A( I, J ) )
-
 
41951
                     IF( VALUE .LT. SUM .OR.
41528
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41952
     $                   DISNAN( SUM ) ) VALUE = SUM
41529
   30             CONTINUE
41953
   30             CONTINUE
41530
   40          CONTINUE
41954
   40          CONTINUE
41531
            END IF
41955
            END IF
41532
         ELSE
41956
         ELSE
41533
            VALUE = ZERO
41957
            VALUE = ZERO
41534
            IF( LSAME( UPLO, 'U' ) ) THEN
41958
            IF( LSAME( UPLO, 'U' ) ) THEN
41535
               DO 60 J = 1, N
41959
               DO 60 J = 1, N
41536
                  DO 50 I = 1, MIN( M, J )
41960
                  DO 50 I = 1, MIN( M, J )
41537
                     SUM = ABS( A( I, J ) )
41961
                     SUM = ABS( A( I, J ) )
-
 
41962
                     IF( VALUE .LT. SUM .OR.
41538
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41963
     $                   DISNAN( SUM ) ) VALUE = SUM
41539
   50             CONTINUE
41964
   50             CONTINUE
41540
   60          CONTINUE
41965
   60          CONTINUE
41541
            ELSE
41966
            ELSE
41542
               DO 80 J = 1, N
41967
               DO 80 J = 1, N
41543
                  DO 70 I = J, M
41968
                  DO 70 I = J, M
41544
                     SUM = ABS( A( I, J ) )
41969
                     SUM = ABS( A( I, J ) )
-
 
41970
                     IF( VALUE .LT. SUM .OR.
41545
                     IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41971
     $                   DISNAN( SUM ) ) VALUE = SUM
41546
   70             CONTINUE
41972
   70             CONTINUE
41547
   80          CONTINUE
41973
   80          CONTINUE
41548
            END IF
41974
            END IF
41549
         END IF
41975
         END IF
41550
      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
41976
      ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN
Line 41635... Line 42061...
41635
         VALUE = ZERO
42061
         VALUE = ZERO
41636
         DO 280 I = 1, M
42062
         DO 280 I = 1, M
41637
            SUM = WORK( I )
42063
            SUM = WORK( I )
41638
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
42064
            IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
41639
  280    CONTINUE
42065
  280    CONTINUE
-
 
42066
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR.
41640
      ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
42067
     $         ( LSAME( NORM, 'E' ) ) ) THEN
41641
*
42068
*
41642
*        Find normF(A).
42069
*        Find normF(A).
41643
*
42070
*
41644
         IF( LSAME( UPLO, 'U' ) ) THEN
42071
         IF( LSAME( UPLO, 'U' ) ) THEN
41645
            IF( LSAME( DIAG, 'U' ) ) THEN
42072
            IF( LSAME( DIAG, 'U' ) ) THEN
41646
               SCALE = ONE
42073
               SCALE = ONE
41647
               SUM = MIN( M, N )
42074
               SUM = MIN( M, N )
41648
               DO 290 J = 2, N
42075
               DO 290 J = 2, N
41649
                  CALL ZLASSQ( MIN( M, J-1 ), A( 1, J ), 1, SCALE, SUM )
42076
                  CALL ZLASSQ( MIN( M, J-1 ), A( 1, J ), 1, SCALE,
-
 
42077
     $                         SUM )
41650
  290          CONTINUE
42078
  290          CONTINUE
41651
            ELSE
42079
            ELSE
41652
               SCALE = ZERO
42080
               SCALE = ZERO
41653
               SUM = ONE
42081
               SUM = ONE
41654
               DO 300 J = 1, N
42082
               DO 300 J = 1, N
41655
                  CALL ZLASSQ( MIN( M, J ), A( 1, J ), 1, SCALE, SUM )
42083
                  CALL ZLASSQ( MIN( M, J ), A( 1, J ), 1, SCALE,
-
 
42084
     $                         SUM )
41656
  300          CONTINUE
42085
  300          CONTINUE
41657
            END IF
42086
            END IF
41658
         ELSE
42087
         ELSE
41659
            IF( LSAME( DIAG, 'U' ) ) THEN
42088
            IF( LSAME( DIAG, 'U' ) ) THEN
41660
               SCALE = ONE
42089
               SCALE = ONE
Line 41835... Line 42264...
41835
*> \author NAG Ltd.
42264
*> \author NAG Ltd.
41836
*
42265
*
41837
*> \ingroup laqgb
42266
*> \ingroup laqgb
41838
*
42267
*
41839
*  =====================================================================
42268
*  =====================================================================
41840
      SUBROUTINE ZLAQGB( M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
42269
      SUBROUTINE ZLAQGB( M, N, KL, KU, AB, LDAB, R, C, ROWCND,
-
 
42270
     $                   COLCND,
41841
     $                   AMAX, EQUED )
42271
     $                   AMAX, EQUED )
41842
*
42272
*
41843
*  -- LAPACK auxiliary routine --
42273
*  -- LAPACK auxiliary routine --
41844
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
42274
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
41845
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
42275
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 42561... Line 42991...
42561
     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
42991
     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
42562
*     ..
42992
*     ..
42563
*     .. Local Scalars ..
42993
*     .. Local Scalars ..
42564
      INTEGER            I, ITEMP, J, MN, OFFPI, PVT
42994
      INTEGER            I, ITEMP, J, MN, OFFPI, PVT
42565
      DOUBLE PRECISION   TEMP, TEMP2, TOL3Z
42995
      DOUBLE PRECISION   TEMP, TEMP2, TOL3Z
42566
      COMPLEX*16         AII
-
 
42567
*     ..
42996
*     ..
42568
*     .. External Subroutines ..
42997
*     .. External Subroutines ..
42569
      EXTERNAL           ZLARF, ZLARFG, ZSWAP
42998
      EXTERNAL           ZLARF1F, ZLARFG, ZSWAP
42570
*     ..
42999
*     ..
42571
*     .. Intrinsic Functions ..
43000
*     .. Intrinsic Functions ..
42572
      INTRINSIC          ABS, DCONJG, MAX, MIN, SQRT
43001
      INTRINSIC          ABS, DCONJG, MAX, MIN, SQRT
42573
*     ..
43002
*     ..
42574
*     .. External Functions ..
43003
*     .. External Functions ..
Line 42601... Line 43030...
42601
         END IF
43030
         END IF
42602
*
43031
*
42603
*        Generate elementary reflector H(i).
43032
*        Generate elementary reflector H(i).
42604
*
43033
*
42605
         IF( OFFPI.LT.M ) THEN
43034
         IF( OFFPI.LT.M ) THEN
42606
            CALL ZLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ), 1,
43035
            CALL ZLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ),
-
 
43036
     $                   1,
42607
     $                   TAU( I ) )
43037
     $                   TAU( I ) )
42608
         ELSE
43038
         ELSE
42609
            CALL ZLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) )
43039
            CALL ZLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) )
42610
         END IF
43040
         END IF
42611
*
43041
*
42612
         IF( I.LT.N ) THEN
43042
         IF( I.LT.N ) THEN
42613
*
43043
*
42614
*           Apply H(i)**H to A(offset+i:m,i+1:n) from the left.
43044
*           Apply H(i)**H to A(offset+i:m,i+1:n) from the left.
42615
*
43045
*
42616
            AII = A( OFFPI, I )
-
 
42617
            A( OFFPI, I ) = CONE
-
 
42618
            CALL ZLARF( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1,
43046
            CALL ZLARF1F( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1,
42619
     $                  DCONJG( TAU( I ) ), A( OFFPI, I+1 ), LDA,
43047
     $                    CONJG( TAU( I ) ), A( OFFPI, I+1 ), LDA,
42620
     $                  WORK( 1 ) )
43048
     $                    WORK( 1 ) )
42621
            A( OFFPI, I ) = AII
-
 
42622
         END IF
43049
         END IF
42623
*
43050
*
42624
*        Update partial column norms.
43051
*        Update partial column norms.
42625
*
43052
*
42626
         DO 10 J = I + 1, N
43053
         DO 10 J = I + 1, N
Line 42825... Line 43252...
42825
*> \htmlonly
43252
*> \htmlonly
42826
*> <a href="http://www.netlib.org/lapack/lawnspdf/lawn176.pdf">[PDF]</a>
43253
*> <a href="http://www.netlib.org/lapack/lawnspdf/lawn176.pdf">[PDF]</a>
42827
*> \endhtmlonly
43254
*> \endhtmlonly
42828
*
43255
*
42829
*  =====================================================================
43256
*  =====================================================================
42830
      SUBROUTINE ZLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU, VN1,
43257
      SUBROUTINE ZLAQPS( M, N, OFFSET, NB, KB, A, LDA, JPVT, TAU,
-
 
43258
     $                   VN1,
42831
     $                   VN2, AUXV, F, LDF )
43259
     $                   VN2, AUXV, F, LDF )
42832
*
43260
*
42833
*  -- LAPACK auxiliary routine --
43261
*  -- LAPACK auxiliary routine --
42834
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
43262
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
42835
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
43263
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 42900... Line 43328...
42900
*
43328
*
42901
         IF( K.GT.1 ) THEN
43329
         IF( K.GT.1 ) THEN
42902
            DO 20 J = 1, K - 1
43330
            DO 20 J = 1, K - 1
42903
               F( K, J ) = DCONJG( F( K, J ) )
43331
               F( K, J ) = DCONJG( F( K, J ) )
42904
   20       CONTINUE
43332
   20       CONTINUE
42905
            CALL ZGEMV( 'No transpose', M-RK+1, K-1, -CONE, A( RK, 1 ),
43333
            CALL ZGEMV( 'No transpose', M-RK+1, K-1, -CONE, A( RK,
-
 
43334
     $                  1 ),
42906
     $                  LDA, F( K, 1 ), LDF, CONE, A( RK, K ), 1 )
43335
     $                  LDA, F( K, 1 ), LDF, CONE, A( RK, K ), 1 )
42907
            DO 30 J = 1, K - 1
43336
            DO 30 J = 1, K - 1
42908
               F( K, J ) = DCONJG( F( K, J ) )
43337
               F( K, J ) = DCONJG( F( K, J ) )
42909
   30       CONTINUE
43338
   30       CONTINUE
42910
         END IF
43339
         END IF
42911
*
43340
*
42912
*        Generate elementary reflector H(k).
43341
*        Generate elementary reflector H(k).
42913
*
43342
*
42914
         IF( RK.LT.M ) THEN
43343
         IF( RK.LT.M ) THEN
42915
            CALL ZLARFG( M-RK+1, A( RK, K ), A( RK+1, K ), 1, TAU( K ) )
43344
            CALL ZLARFG( M-RK+1, A( RK, K ), A( RK+1, K ), 1,
-
 
43345
     $                   TAU( K ) )
42916
         ELSE
43346
         ELSE
42917
            CALL ZLARFG( 1, A( RK, K ), A( RK, K ), 1, TAU( K ) )
43347
            CALL ZLARFG( 1, A( RK, K ), A( RK, K ), 1, TAU( K ) )
42918
         END IF
43348
         END IF
42919
*
43349
*
42920
         AKK = A( RK, K )
43350
         AKK = A( RK, K )
Line 42939... Line 43369...
42939
*        Incremental updating of F:
43369
*        Incremental updating of F:
42940
*        F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)**H
43370
*        F(1:N,K) := F(1:N,K) - tau(K)*F(1:N,1:K-1)*A(RK:M,1:K-1)**H
42941
*                    *A(RK:M,K).
43371
*                    *A(RK:M,K).
42942
*
43372
*
42943
         IF( K.GT.1 ) THEN
43373
         IF( K.GT.1 ) THEN
42944
            CALL ZGEMV( 'Conjugate transpose', M-RK+1, K-1, -TAU( K ),
43374
            CALL ZGEMV( 'Conjugate transpose', M-RK+1, K-1,
-
 
43375
     $                  -TAU( K ),
42945
     $                  A( RK, 1 ), LDA, A( RK, K ), 1, CZERO,
43376
     $                  A( RK, 1 ), LDA, A( RK, K ), 1, CZERO,
42946
     $                  AUXV( 1 ), 1 )
43377
     $                  AUXV( 1 ), 1 )
42947
*
43378
*
42948
            CALL ZGEMV( 'No transpose', N, K-1, CONE, F( 1, 1 ), LDF,
43379
            CALL ZGEMV( 'No transpose', N, K-1, CONE, F( 1, 1 ), LDF,
42949
     $                  AUXV( 1 ), 1, CONE, F( 1, K ), 1 )
43380
     $                  AUXV( 1 ), 1, CONE, F( 1, K ), 1 )
Line 42951... Line 43382...
42951
*
43382
*
42952
*        Update the current row of A:
43383
*        Update the current row of A:
42953
*        A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)**H.
43384
*        A(RK,K+1:N) := A(RK,K+1:N) - A(RK,1:K)*F(K+1:N,1:K)**H.
42954
*
43385
*
42955
         IF( K.LT.N ) THEN
43386
         IF( K.LT.N ) THEN
42956
            CALL ZGEMM( 'No transpose', 'Conjugate transpose', 1, N-K,
43387
            CALL ZGEMM( 'No transpose', 'Conjugate transpose', 1,
-
 
43388
     $                  N-K,
42957
     $                  K, -CONE, A( RK, 1 ), LDA, F( K+1, 1 ), LDF,
43389
     $                  K, -CONE, A( RK, 1 ), LDA, F( K+1, 1 ), LDF,
42958
     $                  CONE, A( RK, K+1 ), LDA )
43390
     $                  CONE, A( RK, K+1 ), LDA )
42959
         END IF
43391
         END IF
42960
*
43392
*
42961
*        Update partial column norms.
43393
*        Update partial column norms.
Line 42992... Line 43424...
42992
*     Apply the block reflector to the rest of the matrix:
43424
*     Apply the block reflector to the rest of the matrix:
42993
*     A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) -
43425
*     A(OFFSET+KB+1:M,KB+1:N) := A(OFFSET+KB+1:M,KB+1:N) -
42994
*                         A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)**H.
43426
*                         A(OFFSET+KB+1:M,1:KB)*F(KB+1:N,1:KB)**H.
42995
*
43427
*
42996
      IF( KB.LT.MIN( N, M-OFFSET ) ) THEN
43428
      IF( KB.LT.MIN( N, M-OFFSET ) ) THEN
42997
         CALL ZGEMM( 'No transpose', 'Conjugate transpose', M-RK, N-KB,
43429
         CALL ZGEMM( 'No transpose', 'Conjugate transpose', M-RK,
-
 
43430
     $               N-KB,
42998
     $               KB, -CONE, A( RK+1, 1 ), LDA, F( KB+1, 1 ), LDF,
43431
     $               KB, -CONE, A( RK+1, 1 ), LDA, F( KB+1, 1 ), LDF,
42999
     $               CONE, A( RK+1, KB+1 ), LDA )
43432
     $               CONE, A( RK+1, KB+1 ), LDA )
43000
      END IF
43433
      END IF
43001
*
43434
*
43002
*     Recomputation of difficult columns.
43435
*     Recomputation of difficult columns.
Line 43321... Line 43754...
43321
*     ..
43754
*     ..
43322
*     .. Local Arrays ..
43755
*     .. Local Arrays ..
43323
      COMPLEX*16         ZDUM( 1, 1 )
43756
      COMPLEX*16         ZDUM( 1, 1 )
43324
*     ..
43757
*     ..
43325
*     .. External Subroutines ..
43758
*     .. External Subroutines ..
43326
      EXTERNAL           ZLACPY, ZLAHQR, ZLAQR3, ZLAQR4, ZLAQR5
43759
      EXTERNAL           ZLACPY, ZLAHQR, ZLAQR3, ZLAQR4,
-
 
43760
     $                   ZLAQR5
43327
*     ..
43761
*     ..
43328
*     .. Intrinsic Functions ..
43762
*     .. Intrinsic Functions ..
43329
      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, MAX, MIN, MOD,
43763
      INTRINSIC          ABS, DBLE, DCMPLX, DIMAG, INT, MAX, MIN, MOD,
43330
     $                   SQRT
43764
     $                   SQRT
43331
*     ..
43765
*     ..
Line 43531... Line 43965...
43531
            KWV = NW + 2
43965
            KWV = NW + 2
43532
            NVE = ( N-NW ) - KWV + 1
43966
            NVE = ( N-NW ) - KWV + 1
43533
*
43967
*
43534
*           ==== Aggressive early deflation ====
43968
*           ==== Aggressive early deflation ====
43535
*
43969
*
43536
            CALL ZLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
43970
            CALL ZLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH,
-
 
43971
     $                   ILOZ,
43537
     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
43972
     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
43538
     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
43973
     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
43539
     $                   LWORK )
43974
     $                   LWORK )
43540
*
43975
*
43541
*           ==== Adjust KBOT accounting for new deflations. ====
43976
*           ==== Adjust KBOT accounting for new deflations. ====
Line 44160... Line 44595...
44160
*>
44595
*>
44161
*>       Karen Braman and Ralph Byers, Department of Mathematics,
44596
*>       Karen Braman and Ralph Byers, Department of Mathematics,
44162
*>       University of Kansas, USA
44597
*>       University of Kansas, USA
44163
*>
44598
*>
44164
*  =====================================================================
44599
*  =====================================================================
44165
      SUBROUTINE ZLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
44600
      SUBROUTINE ZLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH,
-
 
44601
     $                   ILOZ,
44166
     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
44602
     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
44167
     $                   NV, WV, LDWV, WORK, LWORK )
44603
     $                   NV, WV, LDWV, WORK, LWORK )
44168
*
44604
*
44169
*  -- LAPACK auxiliary routine --
44605
*  -- LAPACK auxiliary routine --
44170
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
44606
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 44188... Line 44624...
44188
     $                   ONE = ( 1.0d0, 0.0d0 ) )
44624
     $                   ONE = ( 1.0d0, 0.0d0 ) )
44189
      DOUBLE PRECISION   RZERO, RONE
44625
      DOUBLE PRECISION   RZERO, RONE
44190
      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
44626
      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
44191
*     ..
44627
*     ..
44192
*     .. Local Scalars ..
44628
*     .. Local Scalars ..
44193
      COMPLEX*16         BETA, CDUM, S, TAU
44629
      COMPLEX*16         CDUM, S, TAU
44194
      DOUBLE PRECISION   FOO, SAFMAX, SAFMIN, SMLNUM, ULP
44630
      DOUBLE PRECISION   FOO, SAFMAX, SAFMIN, SMLNUM, ULP
44195
      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
44631
      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
44196
     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWKOPT
44632
     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWKOPT
44197
*     ..
44633
*     ..
44198
*     .. External Functions ..
44634
*     .. External Functions ..
44199
      DOUBLE PRECISION   DLAMCH
44635
      DOUBLE PRECISION   DLAMCH
44200
      EXTERNAL           DLAMCH
44636
      EXTERNAL           DLAMCH
44201
*     ..
44637
*     ..
44202
*     .. External Subroutines ..
44638
*     .. External Subroutines ..
44203
      EXTERNAL           ZCOPY, ZGEHRD, ZGEMM, ZLACPY, ZLAHQR,
44639
      EXTERNAL           ZCOPY, ZGEHRD, ZGEMM, ZLACPY,
-
 
44640
     $                   ZLAHQR,
44204
     $                   ZLARF, ZLARFG, ZLASET, ZTREXC, ZUNMHR
44641
     $                   ZLARF1F, ZLARFG, ZLASET, ZTREXC, ZUNMHR
44205
*     ..
44642
*     ..
44206
*     .. Intrinsic Functions ..
44643
*     .. Intrinsic Functions ..
44207
      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, MAX, MIN
44644
      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, MAX, MIN
44208
*     ..
44645
*     ..
44209
*     .. Statement Functions ..
44646
*     .. Statement Functions ..
Line 44226... Line 44663...
44226
         CALL ZGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
44663
         CALL ZGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
44227
         LWK1 = INT( WORK( 1 ) )
44664
         LWK1 = INT( WORK( 1 ) )
44228
*
44665
*
44229
*        ==== Workspace query call to ZUNMHR ====
44666
*        ==== Workspace query call to ZUNMHR ====
44230
*
44667
*
44231
         CALL ZUNMHR( 'R', 'N', JW, JW, 1, JW-1, T, LDT, WORK, V, LDV,
44668
         CALL ZUNMHR( 'R', 'N', JW, JW, 1, JW-1, T, LDT, WORK, V,
-
 
44669
     $                LDV,
44232
     $                WORK, -1, INFO )
44670
     $                WORK, -1, INFO )
44233
         LWK2 = INT( WORK( 1 ) )
44671
         LWK2 = INT( WORK( 1 ) )
44234
*
44672
*
44235
*        ==== Optimal workspace ====
44673
*        ==== Optimal workspace ====
44236
*
44674
*
Line 44295... Line 44733...
44295
*     .    aggressive early deflation using that part of
44733
*     .    aggressive early deflation using that part of
44296
*     .    the deflation window that converged using INFQR
44734
*     .    the deflation window that converged using INFQR
44297
*     .    here and there to keep track.) ====
44735
*     .    here and there to keep track.) ====
44298
*
44736
*
44299
      CALL ZLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
44737
      CALL ZLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
44300
      CALL ZCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
44738
      CALL ZCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ),
-
 
44739
     $            LDT+1 )
44301
*
44740
*
44302
      CALL ZLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
44741
      CALL ZLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
44303
      CALL ZLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
44742
      CALL ZLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
44304
     $             JW, V, LDV, INFQR )
44743
     $             JW, V, LDV, INFQR )
44305
*
44744
*
Line 44347... Line 44786...
44347
               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
44786
               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
44348
     $            IFST = J
44787
     $            IFST = J
44349
   20       CONTINUE
44788
   20       CONTINUE
44350
            ILST = I
44789
            ILST = I
44351
            IF( IFST.NE.ILST )
44790
            IF( IFST.NE.ILST )
44352
     $         CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
44791
     $         CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST,
-
 
44792
     $                      INFO )
44353
   30    CONTINUE
44793
   30    CONTINUE
44354
      END IF
44794
      END IF
44355
*
44795
*
44356
*     ==== Restore shift/eigenvalue array from T ====
44796
*     ==== Restore shift/eigenvalue array from T ====
44357
*
44797
*
Line 44367... Line 44807...
44367
*
44807
*
44368
            CALL ZCOPY( NS, V, LDV, WORK, 1 )
44808
            CALL ZCOPY( NS, V, LDV, WORK, 1 )
44369
            DO 50 I = 1, NS
44809
            DO 50 I = 1, NS
44370
               WORK( I ) = DCONJG( WORK( I ) )
44810
               WORK( I ) = DCONJG( WORK( I ) )
44371
   50       CONTINUE
44811
   50       CONTINUE
44372
            BETA = WORK( 1 )
-
 
44373
            CALL ZLARFG( NS, BETA, WORK( 2 ), 1, TAU )
44812
            CALL ZLARFG( NS, WORK( 1 ), WORK( 2 ), 1, TAU )
44374
            WORK( 1 ) = ONE
-
 
44375
*
44813
*
44376
            CALL ZLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
44814
            CALL ZLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ),
-
 
44815
     $                   LDT )
44377
*
44816
*
44378
            CALL ZLARF( 'L', NS, JW, WORK, 1, DCONJG( TAU ), T, LDT,
44817
            CALL ZLARF1F( 'L', NS, JW, WORK, 1, CONJG( TAU ), T, LDT,
44379
     $                  WORK( JW+1 ) )
44818
     $                    WORK( JW+1 ) )
44380
            CALL ZLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
44819
            CALL ZLARF1F( 'R', NS, NS, WORK, 1, TAU, T, LDT,
44381
     $                  WORK( JW+1 ) )
44820
     $                    WORK( JW+1 ) )
44382
            CALL ZLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
44821
            CALL ZLARF1F( 'R', JW, NS, WORK, 1, TAU, V, LDV,
44383
     $                  WORK( JW+1 ) )
44822
     $                    WORK( JW+1 ) )
44384
*
44823
*
44385
            CALL ZGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
44824
            CALL ZGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
44386
     $                   LWORK-JW, INFO )
44825
     $                   LWORK-JW, INFO )
44387
         END IF
44826
         END IF
44388
*
44827
*
Line 44396... Line 44835...
44396
*
44835
*
44397
*        ==== Accumulate orthogonal matrix in order update
44836
*        ==== Accumulate orthogonal matrix in order update
44398
*        .    H and Z, if requested.  ====
44837
*        .    H and Z, if requested.  ====
44399
*
44838
*
44400
         IF( NS.GT.1 .AND. S.NE.ZERO )
44839
         IF( NS.GT.1 .AND. S.NE.ZERO )
44401
     $      CALL ZUNMHR( 'R', 'N', JW, NS, 1, NS, T, LDT, WORK, V, LDV,
44840
     $      CALL ZUNMHR( 'R', 'N', JW, NS, 1, NS, T, LDT, WORK, V,
-
 
44841
     $                   LDV,
44402
     $                   WORK( JW+1 ), LWORK-JW, INFO )
44842
     $                   WORK( JW+1 ), LWORK-JW, INFO )
44403
*
44843
*
44404
*        ==== Update vertical slab in H ====
44844
*        ==== Update vertical slab in H ====
44405
*
44845
*
44406
         IF( WANTT ) THEN
44846
         IF( WANTT ) THEN
Line 44410... Line 44850...
44410
         END IF
44850
         END IF
44411
         DO 60 KROW = LTOP, KWTOP - 1, NV
44851
         DO 60 KROW = LTOP, KWTOP - 1, NV
44412
            KLN = MIN( NV, KWTOP-KROW )
44852
            KLN = MIN( NV, KWTOP-KROW )
44413
            CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
44853
            CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
44414
     $                  LDH, V, LDV, ZERO, WV, LDWV )
44854
     $                  LDH, V, LDV, ZERO, WV, LDWV )
44415
            CALL ZLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
44855
            CALL ZLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ),
-
 
44856
     $                   LDH )
44416
   60    CONTINUE
44857
   60    CONTINUE
44417
*
44858
*
44418
*        ==== Update horizontal slab in H ====
44859
*        ==== Update horizontal slab in H ====
44419
*
44860
*
44420
         IF( WANTT ) THEN
44861
         IF( WANTT ) THEN
Line 44430... Line 44871...
44430
*        ==== Update vertical slab in Z ====
44871
*        ==== Update vertical slab in Z ====
44431
*
44872
*
44432
         IF( WANTZ ) THEN
44873
         IF( WANTZ ) THEN
44433
            DO 80 KROW = ILOZ, IHIZ, NV
44874
            DO 80 KROW = ILOZ, IHIZ, NV
44434
               KLN = MIN( NV, IHIZ-KROW+1 )
44875
               KLN = MIN( NV, IHIZ-KROW+1 )
44435
               CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
44876
               CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW,
-
 
44877
     $                     KWTOP ),
44436
     $                     LDZ, V, LDV, ZERO, WV, LDWV )
44878
     $                     LDZ, V, LDV, ZERO, WV, LDWV )
44437
               CALL ZLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
44879
               CALL ZLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
44438
     $                      LDZ )
44880
     $                      LDZ )
44439
   80       CONTINUE
44881
   80       CONTINUE
44440
         END IF
44882
         END IF
Line 44720... Line 45162...
44720
*>
45162
*>
44721
*>       Karen Braman and Ralph Byers, Department of Mathematics,
45163
*>       Karen Braman and Ralph Byers, Department of Mathematics,
44722
*>       University of Kansas, USA
45164
*>       University of Kansas, USA
44723
*>
45165
*>
44724
*  =====================================================================
45166
*  =====================================================================
44725
      SUBROUTINE ZLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
45167
      SUBROUTINE ZLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH,
-
 
45168
     $                   ILOZ,
44726
     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
45169
     $                   IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
44727
     $                   NV, WV, LDWV, WORK, LWORK )
45170
     $                   NV, WV, LDWV, WORK, LWORK )
44728
*
45171
*
44729
*  -- LAPACK auxiliary routine --
45172
*  -- LAPACK auxiliary routine --
44730
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
45173
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 44748... Line 45191...
44748
     $                   ONE = ( 1.0d0, 0.0d0 ) )
45191
     $                   ONE = ( 1.0d0, 0.0d0 ) )
44749
      DOUBLE PRECISION   RZERO, RONE
45192
      DOUBLE PRECISION   RZERO, RONE
44750
      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
45193
      PARAMETER          ( RZERO = 0.0d0, RONE = 1.0d0 )
44751
*     ..
45194
*     ..
44752
*     .. Local Scalars ..
45195
*     .. Local Scalars ..
44753
      COMPLEX*16         BETA, CDUM, S, TAU
45196
      COMPLEX*16         CDUM, S, TAU
44754
      DOUBLE PRECISION   FOO, SAFMAX, SAFMIN, SMLNUM, ULP
45197
      DOUBLE PRECISION   FOO, SAFMAX, SAFMIN, SMLNUM, ULP
44755
      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
45198
      INTEGER            I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
44756
     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
45199
     $                   KNT, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
44757
     $                   LWKOPT, NMIN
45200
     $                   LWKOPT, NMIN
44758
*     ..
45201
*     ..
Line 44760... Line 45203...
44760
      DOUBLE PRECISION   DLAMCH
45203
      DOUBLE PRECISION   DLAMCH
44761
      INTEGER            ILAENV
45204
      INTEGER            ILAENV
44762
      EXTERNAL           DLAMCH, ILAENV
45205
      EXTERNAL           DLAMCH, ILAENV
44763
*     ..
45206
*     ..
44764
*     .. External Subroutines ..
45207
*     .. External Subroutines ..
44765
      EXTERNAL           ZCOPY, ZGEHRD, ZGEMM, ZLACPY, ZLAHQR, ZLAQR4,
45208
      EXTERNAL           ZCOPY, ZGEHRD, ZGEMM, ZLACPY, ZLAHQR,
-
 
45209
     $                   ZLAQR4,
44766
     $                   ZLARF, ZLARFG, ZLASET, ZTREXC, ZUNMHR
45210
     $                   ZLARF1F, ZLARFG, ZLASET, ZTREXC, ZUNMHR
44767
*     ..
45211
*     ..
44768
*     .. Intrinsic Functions ..
45212
*     .. Intrinsic Functions ..
44769
      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, MAX, MIN
45213
      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, INT, MAX, MIN
44770
*     ..
45214
*     ..
44771
*     .. Statement Functions ..
45215
*     .. Statement Functions ..
Line 44788... Line 45232...
44788
         CALL ZGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
45232
         CALL ZGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
44789
         LWK1 = INT( WORK( 1 ) )
45233
         LWK1 = INT( WORK( 1 ) )
44790
*
45234
*
44791
*        ==== Workspace query call to ZUNMHR ====
45235
*        ==== Workspace query call to ZUNMHR ====
44792
*
45236
*
44793
         CALL ZUNMHR( 'R', 'N', JW, JW, 1, JW-1, T, LDT, WORK, V, LDV,
45237
         CALL ZUNMHR( 'R', 'N', JW, JW, 1, JW-1, T, LDT, WORK, V,
-
 
45238
     $                LDV,
44794
     $                WORK, -1, INFO )
45239
     $                WORK, -1, INFO )
44795
         LWK2 = INT( WORK( 1 ) )
45240
         LWK2 = INT( WORK( 1 ) )
44796
*
45241
*
44797
*        ==== Workspace query call to ZLAQR4 ====
45242
*        ==== Workspace query call to ZLAQR4 ====
44798
*
45243
*
44799
         CALL ZLAQR4( .true., .true., JW, 1, JW, T, LDT, SH, 1, JW, V,
45244
         CALL ZLAQR4( .true., .true., JW, 1, JW, T, LDT, SH, 1, JW,
-
 
45245
     $                V,
44800
     $                LDV, WORK, -1, INFQR )
45246
     $                LDV, WORK, -1, INFQR )
44801
         LWK3 = INT( WORK( 1 ) )
45247
         LWK3 = INT( WORK( 1 ) )
44802
*
45248
*
44803
*        ==== Optimal workspace ====
45249
*        ==== Optimal workspace ====
44804
*
45250
*
Line 44863... Line 45309...
44863
*     .    aggressive early deflation using that part of
45309
*     .    aggressive early deflation using that part of
44864
*     .    the deflation window that converged using INFQR
45310
*     .    the deflation window that converged using INFQR
44865
*     .    here and there to keep track.) ====
45311
*     .    here and there to keep track.) ====
44866
*
45312
*
44867
      CALL ZLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
45313
      CALL ZLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
44868
      CALL ZCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
45314
      CALL ZCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ),
-
 
45315
     $            LDT+1 )
44869
*
45316
*
44870
      CALL ZLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
45317
      CALL ZLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
44871
      NMIN = ILAENV( 12, 'ZLAQR3', 'SV', JW, 1, JW, LWORK )
45318
      NMIN = ILAENV( 12, 'ZLAQR3', 'SV', JW, 1, JW, LWORK )
44872
      IF( JW.GT.NMIN ) THEN
45319
      IF( JW.GT.NMIN ) THEN
44873
         CALL ZLAQR4( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
45320
         CALL ZLAQR4( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ),
-
 
45321
     $                1,
44874
     $                JW, V, LDV, WORK, LWORK, INFQR )
45322
     $                JW, V, LDV, WORK, LWORK, INFQR )
44875
      ELSE
45323
      ELSE
44876
         CALL ZLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
45324
         CALL ZLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ),
-
 
45325
     $                1,
44877
     $                JW, V, LDV, INFQR )
45326
     $                JW, V, LDV, INFQR )
44878
      END IF
45327
      END IF
44879
*
45328
*
44880
*     ==== Deflation detection loop ====
45329
*     ==== Deflation detection loop ====
44881
*
45330
*
Line 44921... Line 45370...
44921
               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
45370
               IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
44922
     $            IFST = J
45371
     $            IFST = J
44923
   20       CONTINUE
45372
   20       CONTINUE
44924
            ILST = I
45373
            ILST = I
44925
            IF( IFST.NE.ILST )
45374
            IF( IFST.NE.ILST )
44926
     $         CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
45375
     $         CALL ZTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST,
-
 
45376
     $                      INFO )
44927
   30    CONTINUE
45377
   30    CONTINUE
44928
      END IF
45378
      END IF
44929
*
45379
*
44930
*     ==== Restore shift/eigenvalue array from T ====
45380
*     ==== Restore shift/eigenvalue array from T ====
44931
*
45381
*
Line 44941... Line 45391...
44941
*
45391
*
44942
            CALL ZCOPY( NS, V, LDV, WORK, 1 )
45392
            CALL ZCOPY( NS, V, LDV, WORK, 1 )
44943
            DO 50 I = 1, NS
45393
            DO 50 I = 1, NS
44944
               WORK( I ) = DCONJG( WORK( I ) )
45394
               WORK( I ) = DCONJG( WORK( I ) )
44945
   50       CONTINUE
45395
   50       CONTINUE
44946
            BETA = WORK( 1 )
-
 
44947
            CALL ZLARFG( NS, BETA, WORK( 2 ), 1, TAU )
45396
            CALL ZLARFG( NS, WORK( 1 ), WORK( 2 ), 1, TAU )
44948
            WORK( 1 ) = ONE
-
 
44949
*
45397
*
44950
            CALL ZLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
45398
            CALL ZLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ),
-
 
45399
     $                   LDT )
44951
*
45400
*
44952
            CALL ZLARF( 'L', NS, JW, WORK, 1, DCONJG( TAU ), T, LDT,
45401
            CALL ZLARF1F( 'L', NS, JW, WORK, 1, CONJG( TAU ), T, LDT,
44953
     $                  WORK( JW+1 ) )
45402
     $                    WORK( JW+1 ) )
44954
            CALL ZLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT,
45403
            CALL ZLARF1F( 'R', NS, NS, WORK, 1, TAU, T, LDT,
44955
     $                  WORK( JW+1 ) )
45404
     $                    WORK( JW+1 ) )
44956
            CALL ZLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV,
45405
            CALL ZLARF1F( 'R', JW, NS, WORK, 1, TAU, V, LDV,
44957
     $                  WORK( JW+1 ) )
45406
     $                    WORK( JW+1 ) )
44958
*
45407
*
44959
            CALL ZGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
45408
            CALL ZGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
44960
     $                   LWORK-JW, INFO )
45409
     $                   LWORK-JW, INFO )
44961
         END IF
45410
         END IF
44962
*
45411
*
Line 44970... Line 45419...
44970
*
45419
*
44971
*        ==== Accumulate orthogonal matrix in order update
45420
*        ==== Accumulate orthogonal matrix in order update
44972
*        .    H and Z, if requested.  ====
45421
*        .    H and Z, if requested.  ====
44973
*
45422
*
44974
         IF( NS.GT.1 .AND. S.NE.ZERO )
45423
         IF( NS.GT.1 .AND. S.NE.ZERO )
44975
     $      CALL ZUNMHR( 'R', 'N', JW, NS, 1, NS, T, LDT, WORK, V, LDV,
45424
     $      CALL ZUNMHR( 'R', 'N', JW, NS, 1, NS, T, LDT, WORK, V,
-
 
45425
     $                   LDV,
44976
     $                   WORK( JW+1 ), LWORK-JW, INFO )
45426
     $                   WORK( JW+1 ), LWORK-JW, INFO )
44977
*
45427
*
44978
*        ==== Update vertical slab in H ====
45428
*        ==== Update vertical slab in H ====
44979
*
45429
*
44980
         IF( WANTT ) THEN
45430
         IF( WANTT ) THEN
Line 44984... Line 45434...
44984
         END IF
45434
         END IF
44985
         DO 60 KROW = LTOP, KWTOP - 1, NV
45435
         DO 60 KROW = LTOP, KWTOP - 1, NV
44986
            KLN = MIN( NV, KWTOP-KROW )
45436
            KLN = MIN( NV, KWTOP-KROW )
44987
            CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
45437
            CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
44988
     $                  LDH, V, LDV, ZERO, WV, LDWV )
45438
     $                  LDH, V, LDV, ZERO, WV, LDWV )
44989
            CALL ZLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
45439
            CALL ZLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ),
-
 
45440
     $                   LDH )
44990
   60    CONTINUE
45441
   60    CONTINUE
44991
*
45442
*
44992
*        ==== Update horizontal slab in H ====
45443
*        ==== Update horizontal slab in H ====
44993
*
45444
*
44994
         IF( WANTT ) THEN
45445
         IF( WANTT ) THEN
Line 45004... Line 45455...
45004
*        ==== Update vertical slab in Z ====
45455
*        ==== Update vertical slab in Z ====
45005
*
45456
*
45006
         IF( WANTZ ) THEN
45457
         IF( WANTZ ) THEN
45007
            DO 80 KROW = ILOZ, IHIZ, NV
45458
            DO 80 KROW = ILOZ, IHIZ, NV
45008
               KLN = MIN( NV, IHIZ-KROW+1 )
45459
               KLN = MIN( NV, IHIZ-KROW+1 )
45009
               CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
45460
               CALL ZGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW,
-
 
45461
     $                     KWTOP ),
45010
     $                     LDZ, V, LDV, ZERO, WV, LDWV )
45462
     $                     LDZ, V, LDV, ZERO, WV, LDWV )
45011
               CALL ZLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
45463
               CALL ZLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
45012
     $                      LDZ )
45464
     $                      LDZ )
45013
   80       CONTINUE
45465
   80       CONTINUE
45014
         END IF
45466
         END IF
Line 45550... Line 46002...
45550
            KWV = NW + 2
46002
            KWV = NW + 2
45551
            NVE = ( N-NW ) - KWV + 1
46003
            NVE = ( N-NW ) - KWV + 1
45552
*
46004
*
45553
*           ==== Aggressive early deflation ====
46005
*           ==== Aggressive early deflation ====
45554
*
46006
*
45555
            CALL ZLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
46007
            CALL ZLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH,
-
 
46008
     $                   ILOZ,
45556
     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
46009
     $                   IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
45557
     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
46010
     $                   H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
45558
     $                   LWORK )
46011
     $                   LWORK )
45559
*
46012
*
45560
*           ==== Adjust KBOT accounting for new deflations. ====
46013
*           ==== Adjust KBOT accounting for new deflations. ====
Line 45984... Line 46437...
45984
*>       Lars Karlsson, Daniel Kressner, and Bruno Lang, Optimally packed
46437
*>       Lars Karlsson, Daniel Kressner, and Bruno Lang, Optimally packed
45985
*>       chains of bulges in multishift QR algorithms.
46438
*>       chains of bulges in multishift QR algorithms.
45986
*>       ACM Trans. Math. Softw. 40, 2, Article 12 (February 2014).
46439
*>       ACM Trans. Math. Softw. 40, 2, Article 12 (February 2014).
45987
*>
46440
*>
45988
*  =====================================================================
46441
*  =====================================================================
45989
      SUBROUTINE ZLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
46442
      SUBROUTINE ZLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS,
-
 
46443
     $                   S,
45990
     $                   H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
46444
     $                   H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
45991
     $                   WV, LDWV, NH, WH, LDWH )
46445
     $                   WV, LDWV, NH, WH, LDWH )
45992
      IMPLICIT NONE
46446
      IMPLICIT NONE
45993
*
46447
*
45994
*  -- LAPACK auxiliary routine --
46448
*  -- LAPACK auxiliary routine --
Line 46033... Line 46487...
46033
*     ..
46487
*     ..
46034
*     .. Local Arrays ..
46488
*     .. Local Arrays ..
46035
      COMPLEX*16         VT( 3 )
46489
      COMPLEX*16         VT( 3 )
46036
*     ..
46490
*     ..
46037
*     .. External Subroutines ..
46491
*     .. External Subroutines ..
46038
      EXTERNAL           ZGEMM, ZLACPY, ZLAQR1, ZLARFG, ZLASET, ZTRMM
46492
      EXTERNAL           ZGEMM, ZLACPY, ZLAQR1, ZLARFG, ZLASET,
-
 
46493
     $                   ZTRMM
46039
*     ..
46494
*     ..
46040
*     .. Statement Functions ..
46495
*     .. Statement Functions ..
46041
      DOUBLE PRECISION   CABS1
46496
      DOUBLE PRECISION   CABS1
46042
*     ..
46497
*     ..
46043
*     .. Statement Function definitions ..
46498
*     .. Statement Function definitions ..
Line 46932... Line 47387...
46932
            CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE,
47387
            CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE,
46933
     $           C, LDC, V, INCV, ZERO, WORK, 1 )
47388
     $           C, LDC, V, INCV, ZERO, WORK, 1 )
46934
*
47389
*
46935
*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H
47390
*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H
46936
*
47391
*
46937
            CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC )
47392
            CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C,
-
 
47393
     $                  LDC )
46938
         END IF
47394
         END IF
46939
      ELSE
47395
      ELSE
46940
*
47396
*
46941
*        Form  C * H
47397
*        Form  C * H
46942
*
47398
*
Line 46947... Line 47403...
46947
            CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,
47403
            CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC,
46948
     $           V, INCV, ZERO, WORK, 1 )
47404
     $           V, INCV, ZERO, WORK, 1 )
46949
*
47405
*
46950
*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H
47406
*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H
46951
*
47407
*
46952
            CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC )
47408
            CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C,
-
 
47409
     $                  LDC )
46953
         END IF
47410
         END IF
46954
      END IF
47411
      END IF
46955
      RETURN
47412
      RETURN
46956
*
47413
*
46957
*     End of ZLARF
47414
*     End of ZLARF
46958
*
47415
*
46959
      END
47416
      END
-
 
47417
*> \brief \b ZLARF1F applies an elementary reflector to a general rectangular
-
 
47418
*              matrix assuming v(1) = 1.
-
 
47419
*
-
 
47420
*  =========== DOCUMENTATION ===========
-
 
47421
*
-
 
47422
* Online html documentation available at
-
 
47423
*            http://www.netlib.org/lapack/explore-html/
-
 
47424
*
-
 
47425
*> \htmlonly
-
 
47426
*> Download ZLARF1F + dependencies
-
 
47427
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarf1f.f">
-
 
47428
*> [TGZ]</a>
-
 
47429
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarf1f.f">
-
 
47430
*> [ZIP]</a>
-
 
47431
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarf1f.f">
-
 
47432
*> [TXT]</a>
-
 
47433
*> \endhtmlonly
-
 
47434
*
-
 
47435
*  Definition:
-
 
47436
*  ===========
-
 
47437
*
-
 
47438
*       SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-
 
47439
*
-
 
47440
*       .. Scalar Arguments ..
-
 
47441
*       CHARACTER          SIDE
-
 
47442
*       INTEGER            INCV, LDC, M, N
-
 
47443
*       COMPLEX*16         TAU
-
 
47444
*       ..
-
 
47445
*       .. Array Arguments ..
-
 
47446
*       COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-
 
47447
*       ..
-
 
47448
*
-
 
47449
*
-
 
47450
*> \par Purpose:
-
 
47451
*  =============
-
 
47452
*>
-
 
47453
*> \verbatim
-
 
47454
*>
-
 
47455
*> ZLARF1F applies a complex elementary reflector H to a real m by n matrix
-
 
47456
*> C, from either the left or the right. H is represented in the form
-
 
47457
*>
-
 
47458
*>       H = I - tau * v * v**H
-
 
47459
*>
-
 
47460
*> where tau is a complex scalar and v is a complex vector.
-
 
47461
*>
-
 
47462
*> If tau = 0, then H is taken to be the unit matrix.
-
 
47463
*>
-
 
47464
*> To apply H**H, supply conjg(tau) instead
-
 
47465
*> tau.
-
 
47466
*> \endverbatim
-
 
47467
*
-
 
47468
*  Arguments:
-
 
47469
*  ==========
-
 
47470
*
-
 
47471
*> \param[in] SIDE
-
 
47472
*> \verbatim
-
 
47473
*>          SIDE is CHARACTER*1
-
 
47474
*>          = 'L': form  H * C
-
 
47475
*>
-
 
47476
*> \param[in] M
-
 
47477
*> \verbatim
-
 
47478
*>          M is INTEGER
-
 
47479
*>          The number of rows of the matrix C.
-
 
47480
*> \endverbatim
-
 
47481
*>
-
 
47482
*> \param[in] N
-
 
47483
*> \verbatim
-
 
47484
*>          N is INTEGER
-
 
47485
*>          The number of columns of the matrix C.
-
 
47486
*> \endverbatim
-
 
47487
*>
-
 
47488
*> \param[in] V
-
 
47489
*> \verbatim
-
 
47490
*>          V is COMPLEX*16 array, dimension
-
 
47491
*>                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
-
 
47492
*>                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
-
 
47493
*>          The vector v in the representation of H. V is not used if
-
 
47494
*>          TAU = 0. V(1) is not referenced or modified.
-
 
47495
*> \endverbatim
-
 
47496
*>
-
 
47497
*> \param[in] INCV
-
 
47498
*> \verbatim
-
 
47499
*>          INCV is INTEGER
-
 
47500
*>          The increment between elements of v. INCV <> 0.
-
 
47501
*> \endverbatim
-
 
47502
*>
-
 
47503
*> \param[in] TAU
-
 
47504
*> \verbatim
-
 
47505
*>          TAU is COMPLEX*16
-
 
47506
*>          The value tau in the representation of H.
-
 
47507
*> \endverbatim
-
 
47508
*>
-
 
47509
*> \param[in,out] C
-
 
47510
*> \verbatim
-
 
47511
*>          C is COMPLEX*16 array, dimension (LDC,N)
-
 
47512
*>          On entry, the m by n matrix C.
-
 
47513
*>          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-
 
47514
*>          or C * H if SIDE = 'R'.
-
 
47515
*> \endverbatim
-
 
47516
*>
-
 
47517
*> \param[in] LDC
-
 
47518
*> \verbatim
-
 
47519
*>          LDC is INTEGER
-
 
47520
*>          The leading dimension of the array C. LDC >= max(1,M).
-
 
47521
*> \endverbatim
-
 
47522
*>
-
 
47523
*> \param[out] WORK
-
 
47524
*> \verbatim
-
 
47525
*>          WORK is COMPLEX*16 array, dimension
-
 
47526
*>                         (N) if SIDE = 'L'
-
 
47527
*>                      or (M) if SIDE = 'R'
-
 
47528
*> \endverbatim
-
 
47529
*  To take advantage of the fact that v(1) = 1, we do the following
-
 
47530
*     v = [ 1 v_2 ]**T
-
 
47531
*     If SIDE='L'
-
 
47532
*           |-----|
-
 
47533
*           | C_1 |
-
 
47534
*        C =| C_2 |
-
 
47535
*           |-----|
-
 
47536
*        C_1\in\mathbb{C}^{1\times n}, C_2\in\mathbb{C}^{m-1\times n}
-
 
47537
*        So we compute:
-
 
47538
*        C = HC   = (I - \tau vv**T)C
-
 
47539
*                 = C - \tau vv**T C
-
 
47540
*        w = C**T v  = [ C_1**T C_2**T ] [ 1 v_2 ]**T
-
 
47541
*                    = C_1**T + C_2**T v ( ZGEMM then ZAXPYC-like )
-
 
47542
*        C  = C - \tau vv**T C
-
 
47543
*           = C - \tau vw**T
-
 
47544
*        Giving us   C_1 = C_1 - \tau w**T ( ZAXPYC-like )
-
 
47545
*                 and
-
 
47546
*                    C_2 = C_2 - \tau v_2w**T ( ZGERC )
-
 
47547
*     If SIDE='R'
-
 
47548
*
-
 
47549
*        C = [ C_1 C_2 ]
-
 
47550
*        C_1\in\mathbb{C}^{m\times 1}, C_2\in\mathbb{C}^{m\times n-1}
-
 
47551
*        So we compute: 
-
 
47552
*        C = CH   = C(I - \tau vv**T)
-
 
47553
*                 = C - \tau Cvv**T
-
 
47554
*
-
 
47555
*        w = Cv   = [ C_1 C_2 ] [ 1 v_2 ]**T
-
 
47556
*                 = C_1 + C_2v_2 ( ZGEMM then ZAXPYC-like )
-
 
47557
*        C  = C - \tau Cvv**T
-
 
47558
*           = C - \tau wv**T
-
 
47559
*        Giving us   C_1 = C_1 - \tau w ( ZAXPYC-like )
-
 
47560
*                 and
-
 
47561
*                    C_2 = C_2 - \tau wv_2**T ( ZGERC )
-
 
47562
*
-
 
47563
*  Authors:
-
 
47564
*  ========
-
 
47565
*
-
 
47566
*> \author Univ. of Tennessee
-
 
47567
*> \author Univ. of California Berkeley
-
 
47568
*> \author Univ. of Colorado Denver
-
 
47569
*> \author NAG Ltd.
-
 
47570
*
-
 
47571
*> \ingroup larf
-
 
47572
*
-
 
47573
*  =====================================================================
-
 
47574
      SUBROUTINE ZLARF1F( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-
 
47575
*
-
 
47576
*  -- LAPACK auxiliary routine --
-
 
47577
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
-
 
47578
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
-
 
47579
*
-
 
47580
*     .. Scalar Arguments ..
-
 
47581
      CHARACTER          SIDE
-
 
47582
      INTEGER            INCV, LDC, M, N
-
 
47583
      COMPLEX*16         TAU
-
 
47584
*     ..
-
 
47585
*     .. Array Arguments ..
-
 
47586
      COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-
 
47587
*     ..
-
 
47588
*
-
 
47589
*  =====================================================================
-
 
47590
*
-
 
47591
*     .. Parameters ..
-
 
47592
      COMPLEX*16         ONE, ZERO
-
 
47593
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-
 
47594
     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-
 
47595
*     ..
-
 
47596
*     .. Local Scalars ..
-
 
47597
      LOGICAL            APPLYLEFT
-
 
47598
      INTEGER            I, LASTV, LASTC, J
-
 
47599
*     ..
-
 
47600
*     .. External Subroutines ..
-
 
47601
      EXTERNAL           ZGEMV, ZGERC, ZSCAL
-
 
47602
*     .. Intrinsic Functions ..
-
 
47603
      INTRINSIC          DCONJG
-
 
47604
*     ..
-
 
47605
*     .. External Functions ..
-
 
47606
      LOGICAL            LSAME
-
 
47607
      INTEGER            ILAZLR, ILAZLC
-
 
47608
      EXTERNAL           LSAME, ILAZLR, ILAZLC
-
 
47609
*     ..
-
 
47610
*     .. Executable Statements ..
-
 
47611
*
-
 
47612
      APPLYLEFT = LSAME( SIDE, 'L' )
-
 
47613
      LASTV = 1
-
 
47614
      LASTC = 0
-
 
47615
      IF( TAU.NE.ZERO ) THEN
-
 
47616
!     Set up variables for scanning V.  LASTV begins pointing to the end
-
 
47617
!     of V.
-
 
47618
         IF( APPLYLEFT ) THEN
-
 
47619
            LASTV = M
-
 
47620
         ELSE
-
 
47621
            LASTV = N
-
 
47622
         END IF
-
 
47623
         IF( INCV.GT.0 ) THEN
-
 
47624
            I = 1 + (LASTV-1) * INCV
-
 
47625
         ELSE
-
 
47626
            I = 1
-
 
47627
         END IF
-
 
47628
!     Look for the last non-zero row in V.
-
 
47629
!        Since we are assuming that V(1) = 1, and it is not stored, so we
-
 
47630
!        shouldn't access it.
-
 
47631
         DO WHILE( LASTV.GT.1 .AND. V( I ).EQ.ZERO )
-
 
47632
            LASTV = LASTV - 1
-
 
47633
            I = I - INCV
-
 
47634
         END DO
-
 
47635
         IF( APPLYLEFT ) THEN
-
 
47636
!     Scan for the last non-zero column in C(1:lastv,:).
-
 
47637
            LASTC = ILAZLC(LASTV, N, C, LDC)
-
 
47638
         ELSE
-
 
47639
!     Scan for the last non-zero row in C(:,1:lastv).
-
 
47640
            LASTC = ILAZLR(M, LASTV, C, LDC)
-
 
47641
         END IF
-
 
47642
      END IF
-
 
47643
      IF( LASTC.EQ.0 ) THEN
-
 
47644
         RETURN
-
 
47645
      END IF
-
 
47646
      IF( APPLYLEFT ) THEN
-
 
47647
*
-
 
47648
*        Form  H * C
-
 
47649
*
-
 
47650
            ! Check if m = 1. This means v = 1, So we just need to compute
-
 
47651
            ! C := HC = (1-\tau)C.
-
 
47652
            IF( LASTV.EQ.1 ) THEN
-
 
47653
               CALL ZSCAL(LASTC, ONE - TAU, C, LDC)
-
 
47654
            ELSE
-
 
47655
*
-
 
47656
*              w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1)
-
 
47657
*
-
 
47658
               ! (I - tvv**H)C = C - tvv**H C
-
 
47659
               ! First compute w**H = v**H c -> w = C**H v
-
 
47660
               ! C = [ C_1 C_2 ]**T, v = [1 v_2]**T
-
 
47661
               ! w = C_1**H + C_2**Hv_2
-
 
47662
               ! w = C_2**Hv_2
-
 
47663
               CALL ZGEMV( 'Conjugate transpose', LASTV - 1,
-
 
47664
     $               LASTC, ONE, C( 1+1, 1 ), LDC, V( 1 + INCV ),
-
 
47665
     $               INCV, ZERO, WORK, 1 )
-
 
47666
*
-
 
47667
*              w(1:lastc,1) += v(1,1) * C(1,1:lastc)**H
-
 
47668
*
-
 
47669
               DO I = 1, LASTC
-
 
47670
                  WORK( I ) = WORK( I ) + DCONJG( C( 1, I ) )
-
 
47671
               END DO
-
 
47672
*
-
 
47673
*           C(1:lastv,1:lastc) := C(...) - tau * v(1:lastv,1) * w(1:lastc,1)**H
-
 
47674
*
-
 
47675
            ! C(1, 1:lastc)   := C(...) - tau * v(1,1) * w(1:lastc,1)**H
-
 
47676
            !                  = C(...) - tau * Conj(w(1:lastc,1))
-
 
47677
            ! This is essentially a zaxpyc
-
 
47678
               DO I = 1, LASTC
-
 
47679
                  C( 1, I ) = C( 1, I ) - TAU * DCONJG( WORK( I ) )
-
 
47680
               END DO
-
 
47681
*
-
 
47682
*        C(2:lastv,1:lastc) += - tau * v(2:lastv,1) * w(1:lastc,1)**H
-
 
47683
*
-
 
47684
               CALL ZGERC( LASTV - 1, LASTC, -TAU, V( 1 + INCV ),
-
 
47685
     $               INCV, WORK, 1, C( 1+1, 1 ), LDC )
-
 
47686
            END IF
-
 
47687
      ELSE
-
 
47688
*
-
 
47689
*        Form  C * H
-
 
47690
*
-
 
47691
            ! Check if n = 1. This means v = 1, so we just need to compute
-
 
47692
            ! C := CH = C(1-\tau).
-
 
47693
            IF( LASTV.EQ.1 ) THEN
-
 
47694
               CALL ZSCAL(LASTC, ONE - TAU, C, 1)
-
 
47695
            ELSE
-
 
47696
*
-
 
47697
*              w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1)
-
 
47698
*
-
 
47699
               ! w(1:lastc,1) := C(1:lastc,2:lastv) * v(2:lastv,1)
-
 
47700
               CALL ZGEMV( 'No transpose', LASTC, LASTV-1, ONE, 
-
 
47701
     $            C(1,1+1), LDC, V(1+INCV), INCV, ZERO, WORK, 1 )
-
 
47702
               ! w(1:lastc,1) += C(1:lastc,1) v(1,1) = C(1:lastc,1)
-
 
47703
               CALL ZAXPY(LASTC, ONE, C, 1, WORK, 1)
-
 
47704
*
-
 
47705
*              C(1:lastc,1:lastv) := C(...) - tau * w(1:lastc,1) * v(1:lastv,1)**T
-
 
47706
*
-
 
47707
               ! C(1:lastc,1)     := C(...) - tau * w(1:lastc,1) * v(1,1)**T
-
 
47708
               !                   = C(...) - tau * w(1:lastc,1)
-
 
47709
               CALL ZAXPY(LASTC, -TAU, WORK, 1, C, 1)
-
 
47710
               ! C(1:lastc,2:lastv) := C(...) - tau * w(1:lastc,1) * v(2:lastv)**T
-
 
47711
               CALL ZGERC( LASTC, LASTV-1, -TAU, WORK, 1, V(1+INCV),
-
 
47712
     $                     INCV, C(1,1+1), LDC )
-
 
47713
            END IF
-
 
47714
      END IF
-
 
47715
      RETURN
-
 
47716
*
-
 
47717
*     End of ZLARF1F
-
 
47718
*
-
 
47719
      END
-
 
47720
*> \brief \b ZLARF1L applies an elementary reflector to a general rectangular
-
 
47721
*              matrix assuming v(lastv) = 1, where lastv is the last non-zero
-
 
47722
*
-
 
47723
*  =========== DOCUMENTATION ===========
-
 
47724
*
-
 
47725
* Online html documentation available at
-
 
47726
*            http://www.netlib.org/lapack/explore-html/
-
 
47727
*
-
 
47728
*> \htmlonly
-
 
47729
*> Download ZLARF1L + dependencies
-
 
47730
*> <a
-
 
47731
*href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarf1l.f">
-
 
47732
*> [TGZ]</a>
-
 
47733
*> <a
-
 
47734
*href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarf1l.f">
-
 
47735
*> [ZIP]</a>
-
 
47736
*> <a
-
 
47737
*href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarf1l.f">
-
 
47738
*> [TXT]</a>
-
 
47739
*> \endhtmlonly
-
 
47740
*
-
 
47741
*  Definition:
-
 
47742
*  ===========
-
 
47743
*
-
 
47744
*       SUBROUTINE ZLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-
 
47745
*
-
 
47746
*       .. Scalar Arguments ..
-
 
47747
*       CHARACTER          SIDE
-
 
47748
*       INTEGER            INCV, LDC, M, N
-
 
47749
*       COMPLEX*16         TAU
-
 
47750
*       ..
-
 
47751
*       .. Array Arguments ..
-
 
47752
*       COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-
 
47753
*       ..
-
 
47754
*
-
 
47755
*
-
 
47756
*> \par Purpose:
-
 
47757
*  =============
-
 
47758
*>
-
 
47759
*> \verbatim
-
 
47760
*>
-
 
47761
*> ZLARF1L applies a complex elementary reflector H to a complex m by n matrix
-
 
47762
*> C, from either the left or the right. H is represented in the form
-
 
47763
*>
-
 
47764
*>       H = I - tau * v * v**H
-
 
47765
*>
-
 
47766
*> where tau is a real scalar and v is a real vector assuming v(lastv) = 1,
-
 
47767
*> where lastv is the last non-zero element.
-
 
47768
*>
-
 
47769
*> If tau = 0, then H is taken to be the unit matrix.
-
 
47770
*>
-
 
47771
*> To apply H**H (the conjugate transpose of H), supply conjg(tau) instead
-
 
47772
*> tau.
-
 
47773
*> \endverbatim
-
 
47774
*
-
 
47775
*  Arguments:
-
 
47776
*  ==========
-
 
47777
*
-
 
47778
*> \param[in] SIDE
-
 
47779
*> \verbatim
-
 
47780
*>          SIDE is CHARACTER*1
-
 
47781
*>          = 'L': form  H * C
-
 
47782
*>          = 'R': form  C * H
-
 
47783
*> \endverbatim
-
 
47784
*>
-
 
47785
*> \param[in] M
-
 
47786
*> \verbatim
-
 
47787
*>          M is INTEGER
-
 
47788
*>          The number of rows of the matrix C.
-
 
47789
*> \endverbatim
-
 
47790
*>
-
 
47791
*> \param[in] N
-
 
47792
*> \verbatim
-
 
47793
*>          N is INTEGER
-
 
47794
*>          The number of columns of the matrix C.
-
 
47795
*> \endverbatim
-
 
47796
*>
-
 
47797
*> \param[in] V
-
 
47798
*> \verbatim
-
 
47799
*>          V is COMPLEX*16 array, dimension
-
 
47800
*>                     (1 + (M-1)*abs(INCV)) if SIDE = 'L'
-
 
47801
*>                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R'
-
 
47802
*>          The vector v in the representation of H. V is not used if
-
 
47803
*>          TAU = 0.
-
 
47804
*> \endverbatim
-
 
47805
*>
-
 
47806
*> \param[in] INCV
-
 
47807
*> \verbatim
-
 
47808
*>          INCV is INTEGER
-
 
47809
*>          The increment between elements of v. INCV > 0.
-
 
47810
*> \endverbatim
-
 
47811
*>
-
 
47812
*> \param[in] TAU
-
 
47813
*> \verbatim
-
 
47814
*>          TAU is COMPLEX*16
-
 
47815
*>          The value tau in the representation of H.
-
 
47816
*> \endverbatim
-
 
47817
*>
-
 
47818
*> \param[in,out] C
-
 
47819
*> \verbatim
-
 
47820
*>          C is COMPLEX*16 array, dimension (LDC,N)
-
 
47821
*>          On entry, the m by n matrix C.
-
 
47822
*>          On exit, C is overwritten by the matrix H * C if SIDE = 'L',
-
 
47823
*>          or C * H if SIDE = 'R'.
-
 
47824
*> \endverbatim
-
 
47825
*>
-
 
47826
*> \param[in] LDC
-
 
47827
*> \verbatim
-
 
47828
*>          LDC is INTEGER
-
 
47829
*>          The leading dimension of the array C. LDC >= max(1,M).
-
 
47830
*> \endverbatim
-
 
47831
*>
-
 
47832
*> \param[out] WORK
-
 
47833
*> \verbatim
-
 
47834
*>          WORK is COMPLEX*16 array, dimension
-
 
47835
*>                         (N) if SIDE = 'L'
-
 
47836
*>                      or (M) if SIDE = 'R'
-
 
47837
*> \endverbatim
-
 
47838
*
-
 
47839
*  Authors:
-
 
47840
*  ========
-
 
47841
*
-
 
47842
*> \author Univ. of Tennessee
-
 
47843
*> \author Univ. of California Berkeley
-
 
47844
*> \author Univ. of Colorado Denver
-
 
47845
*> \author NAG Ltd.
-
 
47846
*
-
 
47847
*> \ingroup larf1f
-
 
47848
*
-
 
47849
*  =====================================================================
-
 
47850
      SUBROUTINE ZLARF1L( SIDE, M, N, V, INCV, TAU, C, LDC, WORK )
-
 
47851
*
-
 
47852
*  -- LAPACK auxiliary routine --
-
 
47853
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
-
 
47854
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
-
 
47855
*
-
 
47856
*     .. Scalar Arguments ..
-
 
47857
      CHARACTER          SIDE
-
 
47858
      INTEGER            INCV, LDC, M, N
-
 
47859
      COMPLEX*16         TAU
-
 
47860
*     ..
-
 
47861
*     .. Array Arguments ..
-
 
47862
      COMPLEX*16         C( LDC, * ), V( * ), WORK( * )
-
 
47863
*     ..
-
 
47864
*
-
 
47865
*  =====================================================================
-
 
47866
*
-
 
47867
*     .. Parameters ..
-
 
47868
      COMPLEX*16         ONE, ZERO
-
 
47869
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
-
 
47870
     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-
 
47871
*     ..
-
 
47872
*     .. Local Scalars ..
-
 
47873
      LOGICAL            APPLYLEFT
-
 
47874
      INTEGER            I, J, LASTV, LASTC, FIRSTV
-
 
47875
*     ..
-
 
47876
*     .. External Subroutines ..
-
 
47877
      EXTERNAL           ZGEMV, ZGERC, ZSCAL
-
 
47878
*     ..
-
 
47879
*     .. Intrinsic Functions ..
-
 
47880
      INTRINSIC          DCONJG
-
 
47881
*     ..
-
 
47882
*     .. External Functions ..
-
 
47883
      LOGICAL            LSAME
-
 
47884
      INTEGER            ILAZLR, ILAZLC
-
 
47885
      EXTERNAL           LSAME, ILAZLR, ILAZLC
-
 
47886
*     ..
-
 
47887
*     .. Executable Statements ..
-
 
47888
*
-
 
47889
      APPLYLEFT = LSAME( SIDE, 'L' )
-
 
47890
      FIRSTV = 1
-
 
47891
      LASTC = 0
-
 
47892
      IF( TAU.NE.ZERO ) THEN
-
 
47893
!     Set up variables for scanning V.  LASTV begins pointing to the end
-
 
47894
!     of V up to V(1).
-
 
47895
         IF( APPLYLEFT ) THEN
-
 
47896
            LASTV = M
-
 
47897
         ELSE
-
 
47898
            LASTV = N
-
 
47899
         END IF
-
 
47900
         I = 1
-
 
47901
!     Look for the last non-zero row in V.
-
 
47902
         DO WHILE( LASTV.GT.FIRSTV .AND. V( I ).EQ.ZERO )
-
 
47903
            FIRSTV = FIRSTV + 1
-
 
47904
            I = I + INCV
-
 
47905
         END DO
-
 
47906
         IF( APPLYLEFT ) THEN
-
 
47907
!     Scan for the last non-zero column in C(1:lastv,:).
-
 
47908
            LASTC = ILAZLC(LASTV, N, C, LDC)
-
 
47909
         ELSE
-
 
47910
!     Scan for the last non-zero row in C(:,1:lastv).
-
 
47911
            LASTC = ILAZLR(M, LASTV, C, LDC)
-
 
47912
         END IF
-
 
47913
      END IF
-
 
47914
      IF( LASTC.EQ.0 ) THEN
-
 
47915
         RETURN
-
 
47916
      END IF
-
 
47917
      IF( APPLYLEFT ) THEN
-
 
47918
*
-
 
47919
*        Form  H * C
-
 
47920
*
-
 
47921
         IF( LASTV.EQ.FIRSTV ) THEN        
-
 
47922
*
-
 
47923
*           C(lastv,1:lastc) := ( 1 - tau ) * C(lastv,1:lastc)
-
 
47924
*
-
 
47925
            CALL ZSCAL( LASTC, ONE - TAU, C( LASTV, 1 ), LDC )
-
 
47926
         ELSE
-
 
47927
*
-
 
47928
*           w(1:lastc,1) := C(firstv:lastv-1,1:lastc)**T * v(firstv:lastv-1,1)
-
 
47929
*
-
 
47930
            CALL ZGEMV( 'Conjugate transpose', LASTV - FIRSTV, LASTC,
-
 
47931
     $                  ONE, C( FIRSTV, 1 ), LDC, V( I ), INCV, ZERO,
-
 
47932
     $                  WORK, 1 )
-
 
47933
*
-
 
47934
*           w(1:lastc,1) += C(lastv,1:lastc)**H * v(lastv,1)
-
 
47935
*
-
 
47936
            DO J = 1, LASTC
-
 
47937
               WORK( J ) = WORK( J ) + CONJG( C( LASTV, J ) )
-
 
47938
            END DO
-
 
47939
*
-
 
47940
*           C(lastv,1:lastc) += - tau * v(lastv,1) * w(1:lastc,1)**H
-
 
47941
*
-
 
47942
            DO J = 1, LASTC
-
 
47943
               C( LASTV, J ) = C( LASTV, J )
-
 
47944
     $                         - TAU * CONJG( WORK( J ) )
-
 
47945
            END DO
-
 
47946
*
-
 
47947
*           C(firstv:lastv-1,1:lastc) += - tau * v(firstv:lastv-1,1) * w(1:lastc,1)**H
-
 
47948
*
-
 
47949
            CALL ZGERC( LASTV - FIRSTV, LASTC, -TAU, V( I ), INCV,
-
 
47950
     $                  WORK, 1, C( FIRSTV, 1 ), LDC)
-
 
47951
         END IF
-
 
47952
      ELSE
-
 
47953
*
-
 
47954
*        Form  C * H
-
 
47955
*
-
 
47956
         IF( LASTV.EQ.FIRSTV ) THEN
-
 
47957
*
-
 
47958
*           C(1:lastc,lastv) := ( 1 - tau ) * C(1:lastc,lastv)
-
 
47959
*
-
 
47960
            CALL ZSCAL( LASTC, ONE - TAU, C( 1, LASTV ), 1 )
-
 
47961
         ELSE
-
 
47962
*
-
 
47963
*           w(1:lastc,1) := C(1:lastc,firstv:lastv-1) * v(firstv:lastv-1,1)
-
 
47964
*
-
 
47965
            CALL ZGEMV( 'No transpose', LASTC, LASTV - FIRSTV, ONE,
-
 
47966
     $                  C( 1, FIRSTV ), LDC, V( I ), INCV, ZERO,
-
 
47967
     $                  WORK, 1 )
-
 
47968
*
-
 
47969
*           w(1:lastc,1) += C(1:lastc,lastv) * v(lastv,1)
-
 
47970
*
-
 
47971
            CALL ZAXPY( LASTC, ONE, C( 1, LASTV ), 1, WORK, 1 )
-
 
47972
*
-
 
47973
*           C(1:lastc,lastv) += - tau * v(lastv,1) * w(1:lastc,1)
-
 
47974
*
-
 
47975
            CALL ZAXPY( LASTC, -TAU, WORK, 1, C( 1, LASTV ), 1 )
-
 
47976
*
-
 
47977
*           C(1:lastc,firstv:lastv-1) += - tau * w(1:lastc,1) * v(firstv:lastv-1)**H
-
 
47978
*
-
 
47979
            CALL ZGERC( LASTC, LASTV - FIRSTV, -TAU, WORK, 1, V( I ),
-
 
47980
     $                  INCV, C( 1, FIRSTV ), LDC )
-
 
47981
         END IF
-
 
47982
      END IF
-
 
47983
      RETURN
-
 
47984
*
-
 
47985
*     End of ZLARF1L
-
 
47986
*
-
 
47987
      END
46960
*> \brief \b ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix.
47988
*> \brief \b ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix.
46961
*
47989
*
46962
*  =========== DOCUMENTATION ===========
47990
*  =========== DOCUMENTATION ===========
46963
*
47991
*
46964
* Online html documentation available at
47992
* Online html documentation available at
Line 47127... Line 48155...
47127
*>
48155
*>
47128
*> \verbatim
48156
*> \verbatim
47129
*>
48157
*>
47130
*>  The shape of the matrix V and the storage of the vectors which define
48158
*>  The shape of the matrix V and the storage of the vectors which define
47131
*>  the H(i) is best illustrated by the following example with n = 5 and
48159
*>  the H(i) is best illustrated by the following example with n = 5 and
47132
*>  k = 3. The elements equal to 1 are not stored; the corresponding
48160
*>  k = 3. The triangular part of V (including its diagonal) is not
47133
*>  array elements are modified but restored on exit. The rest of the
-
 
47134
*>  array is not used.
48161
*>  referenced.
47135
*>
48162
*>
47136
*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
48163
*>  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R':
47137
*>
48164
*>
47138
*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )
48165
*>               V = (  1       )                 V = (  1 v1 v1 v1 v1 )
47139
*>                   ( v1  1    )                     (     1 v2 v2 v2 )
48166
*>                   ( v1  1    )                     (     1 v2 v2 v2 )
Line 47149... Line 48176...
47149
*>                   (     1 v3 )
48176
*>                   (     1 v3 )
47150
*>                   (        1 )
48177
*>                   (        1 )
47151
*> \endverbatim
48178
*> \endverbatim
47152
*>
48179
*>
47153
*  =====================================================================
48180
*  =====================================================================
47154
      SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV,
48181
      SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V,
-
 
48182
     $                   LDV,
47155
     $                   T, LDT, C, LDC, WORK, LDWORK )
48183
     $                   T, LDT, C, LDC, WORK, LDWORK )
47156
*
48184
*
47157
*  -- LAPACK auxiliary routine --
48185
*  -- LAPACK auxiliary routine --
47158
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
48186
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
47159
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
48187
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 47222... Line 48250...
47222
                  CALL ZLACGV( N, WORK( 1, J ), 1 )
48250
                  CALL ZLACGV( N, WORK( 1, J ), 1 )
47223
   10          CONTINUE
48251
   10          CONTINUE
47224
*
48252
*
47225
*              W := W * V1
48253
*              W := W * V1
47226
*
48254
*
47227
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
48255
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
-
 
48256
     $                     N,
47228
     $                     K, ONE, V, LDV, WORK, LDWORK )
48257
     $                     K, ONE, V, LDV, WORK, LDWORK )
47229
               IF( M.GT.K ) THEN
48258
               IF( M.GT.K ) THEN
47230
*
48259
*
47231
*                 W := W + C2**H * V2
48260
*                 W := W + C2**H * V2
47232
*
48261
*
47233
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', N,
48262
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose',
-
 
48263
     $                        N,
47234
     $                        K, M-K, ONE, C( K+1, 1 ), LDC,
48264
     $                        K, M-K, ONE, C( K+1, 1 ), LDC,
47235
     $                        V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
48265
     $                        V( K+1, 1 ), LDV, ONE, WORK, LDWORK )
47236
               END IF
48266
               END IF
47237
*
48267
*
47238
*              W := W * T**H  or  W * T
48268
*              W := W * T**H  or  W * T
47239
*
48269
*
47240
               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
48270
               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N,
-
 
48271
     $                     K,
47241
     $                     ONE, T, LDT, WORK, LDWORK )
48272
     $                     ONE, T, LDT, WORK, LDWORK )
47242
*
48273
*
47243
*              C := C - V * W**H
48274
*              C := C - V * W**H
47244
*
48275
*
47245
               IF( M.GT.K ) THEN
48276
               IF( M.GT.K ) THEN
Line 47276... Line 48307...
47276
                  CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
48307
                  CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 )
47277
   40          CONTINUE
48308
   40          CONTINUE
47278
*
48309
*
47279
*              W := W * V1
48310
*              W := W * V1
47280
*
48311
*
47281
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
48312
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
-
 
48313
     $                     M,
47282
     $                     K, ONE, V, LDV, WORK, LDWORK )
48314
     $                     K, ONE, V, LDV, WORK, LDWORK )
47283
               IF( N.GT.K ) THEN
48315
               IF( N.GT.K ) THEN
47284
*
48316
*
47285
*                 W := W + C2 * V2
48317
*                 W := W + C2 * V2
47286
*
48318
*
47287
                  CALL ZGEMM( 'No transpose', 'No transpose', M, K, N-K,
48319
                  CALL ZGEMM( 'No transpose', 'No transpose', M, K,
-
 
48320
     $                        N-K,
47288
     $                        ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
48321
     $                        ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV,
47289
     $                        ONE, WORK, LDWORK )
48322
     $                        ONE, WORK, LDWORK )
47290
               END IF
48323
               END IF
47291
*
48324
*
47292
*              W := W * T  or  W * T**H
48325
*              W := W * T  or  W * T**H
Line 47298... Line 48331...
47298
*
48331
*
47299
               IF( N.GT.K ) THEN
48332
               IF( N.GT.K ) THEN
47300
*
48333
*
47301
*                 C2 := C2 - W * V2**H
48334
*                 C2 := C2 - W * V2**H
47302
*
48335
*
47303
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
48336
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-
 
48337
     $                        M,
47304
     $                        N-K, K, -ONE, WORK, LDWORK, V( K+1, 1 ),
48338
     $                        N-K, K, -ONE, WORK, LDWORK, V( K+1, 1 ),
47305
     $                        LDV, ONE, C( 1, K+1 ), LDC )
48339
     $                        LDV, ONE, C( 1, K+1 ), LDC )
47306
               END IF
48340
               END IF
47307
*
48341
*
47308
*              W := W * V1**H
48342
*              W := W * V1**H
Line 47333... Line 48367...
47333
*              W := C**H * V  =  (C1**H * V1 + C2**H * V2)  (stored in WORK)
48367
*              W := C**H * V  =  (C1**H * V1 + C2**H * V2)  (stored in WORK)
47334
*
48368
*
47335
*              W := C2**H
48369
*              W := C2**H
47336
*
48370
*
47337
               DO 70 J = 1, K
48371
               DO 70 J = 1, K
47338
                  CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
48372
                  CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ),
-
 
48373
     $                        1 )
47339
                  CALL ZLACGV( N, WORK( 1, J ), 1 )
48374
                  CALL ZLACGV( N, WORK( 1, J ), 1 )
47340
   70          CONTINUE
48375
   70          CONTINUE
47341
*
48376
*
47342
*              W := W * V2
48377
*              W := W * V2
47343
*
48378
*
47344
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
48379
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
-
 
48380
     $                     N,
47345
     $                     K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
48381
     $                     K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK )
47346
               IF( M.GT.K ) THEN
48382
               IF( M.GT.K ) THEN
47347
*
48383
*
47348
*                 W := W + C1**H * V1
48384
*                 W := W + C1**H * V1
47349
*
48385
*
47350
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', N,
48386
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose',
-
 
48387
     $                        N,
47351
     $                        K, M-K, ONE, C, LDC, V, LDV, ONE, WORK,
48388
     $                        K, M-K, ONE, C, LDC, V, LDV, ONE, WORK,
47352
     $                        LDWORK )
48389
     $                        LDWORK )
47353
               END IF
48390
               END IF
47354
*
48391
*
47355
*              W := W * T**H  or  W * T
48392
*              W := W * T**H  or  W * T
47356
*
48393
*
47357
               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
48394
               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N,
-
 
48395
     $                     K,
47358
     $                     ONE, T, LDT, WORK, LDWORK )
48396
     $                     ONE, T, LDT, WORK, LDWORK )
47359
*
48397
*
47360
*              C := C - V * W**H
48398
*              C := C - V * W**H
47361
*
48399
*
47362
               IF( M.GT.K ) THEN
48400
               IF( M.GT.K ) THEN
Line 47395... Line 48433...
47395
                  CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
48433
                  CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 )
47396
  100          CONTINUE
48434
  100          CONTINUE
47397
*
48435
*
47398
*              W := W * V2
48436
*              W := W * V2
47399
*
48437
*
47400
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
48438
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
-
 
48439
     $                     M,
47401
     $                     K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
48440
     $                     K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK )
47402
               IF( N.GT.K ) THEN
48441
               IF( N.GT.K ) THEN
47403
*
48442
*
47404
*                 W := W + C1 * V1
48443
*                 W := W + C1 * V1
47405
*
48444
*
47406
                  CALL ZGEMM( 'No transpose', 'No transpose', M, K, N-K,
48445
                  CALL ZGEMM( 'No transpose', 'No transpose', M, K,
-
 
48446
     $                        N-K,
47407
     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
48447
     $                        ONE, C, LDC, V, LDV, ONE, WORK, LDWORK )
47408
               END IF
48448
               END IF
47409
*
48449
*
47410
*              W := W * T  or  W * T**H
48450
*              W := W * T  or  W * T**H
47411
*
48451
*
Line 47416... Line 48456...
47416
*
48456
*
47417
               IF( N.GT.K ) THEN
48457
               IF( N.GT.K ) THEN
47418
*
48458
*
47419
*                 C1 := C1 - W * V1**H
48459
*                 C1 := C1 - W * V1**H
47420
*
48460
*
47421
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
48461
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-
 
48462
     $                        M,
47422
     $                        N-K, K, -ONE, WORK, LDWORK, V, LDV, ONE,
48463
     $                        N-K, K, -ONE, WORK, LDWORK, V, LDV, ONE,
47423
     $                        C, LDC )
48464
     $                        C, LDC )
47424
               END IF
48465
               END IF
47425
*
48466
*
47426
*              W := W * V2**H
48467
*              W := W * V2**H
Line 47474... Line 48515...
47474
     $                        WORK, LDWORK )
48515
     $                        WORK, LDWORK )
47475
               END IF
48516
               END IF
47476
*
48517
*
47477
*              W := W * T**H  or  W * T
48518
*              W := W * T**H  or  W * T
47478
*
48519
*
47479
               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K,
48520
               CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N,
-
 
48521
     $                     K,
47480
     $                     ONE, T, LDT, WORK, LDWORK )
48522
     $                     ONE, T, LDT, WORK, LDWORK )
47481
*
48523
*
47482
*              C := C - V**H * W**H
48524
*              C := C - V**H * W**H
47483
*
48525
*
47484
               IF( M.GT.K ) THEN
48526
               IF( M.GT.K ) THEN
Line 47491... Line 48533...
47491
     $                        C( K+1, 1 ), LDC )
48533
     $                        C( K+1, 1 ), LDC )
47492
               END IF
48534
               END IF
47493
*
48535
*
47494
*              W := W * V1
48536
*              W := W * V1
47495
*
48537
*
47496
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N,
48538
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
-
 
48539
     $                     N,
47497
     $                     K, ONE, V, LDV, WORK, LDWORK )
48540
     $                     K, ONE, V, LDV, WORK, LDWORK )
47498
*
48541
*
47499
*              C1 := C1 - W**H
48542
*              C1 := C1 - W**H
47500
*
48543
*
47501
               DO 150 J = 1, K
48544
               DO 150 J = 1, K
Line 47522... Line 48565...
47522
     $                     'Unit', M, K, ONE, V, LDV, WORK, LDWORK )
48565
     $                     'Unit', M, K, ONE, V, LDV, WORK, LDWORK )
47523
               IF( N.GT.K ) THEN
48566
               IF( N.GT.K ) THEN
47524
*
48567
*
47525
*                 W := W + C2 * V2**H
48568
*                 W := W + C2 * V2**H
47526
*
48569
*
47527
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
48570
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-
 
48571
     $                        M,
47528
     $                        K, N-K, ONE, C( 1, K+1 ), LDC,
48572
     $                        K, N-K, ONE, C( 1, K+1 ), LDC,
47529
     $                        V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
48573
     $                        V( 1, K+1 ), LDV, ONE, WORK, LDWORK )
47530
               END IF
48574
               END IF
47531
*
48575
*
47532
*              W := W * T  or  W * T**H
48576
*              W := W * T  or  W * T**H
Line 47538... Line 48582...
47538
*
48582
*
47539
               IF( N.GT.K ) THEN
48583
               IF( N.GT.K ) THEN
47540
*
48584
*
47541
*                 C2 := C2 - W * V2
48585
*                 C2 := C2 - W * V2
47542
*
48586
*
47543
                  CALL ZGEMM( 'No transpose', 'No transpose', M, N-K, K,
48587
                  CALL ZGEMM( 'No transpose', 'No transpose', M, N-K,
-
 
48588
     $                        K,
47544
     $                        -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
48589
     $                        -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE,
47545
     $                        C( 1, K+1 ), LDC )
48590
     $                        C( 1, K+1 ), LDC )
47546
               END IF
48591
               END IF
47547
*
48592
*
47548
*              W := W * V1
48593
*              W := W * V1
47549
*
48594
*
47550
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M,
48595
               CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit',
-
 
48596
     $                     M,
47551
     $                     K, ONE, V, LDV, WORK, LDWORK )
48597
     $                     K, ONE, V, LDV, WORK, LDWORK )
47552
*
48598
*
47553
*              C1 := C1 - W
48599
*              C1 := C1 - W
47554
*
48600
*
47555
               DO 180 J = 1, K
48601
               DO 180 J = 1, K
Line 47573... Line 48619...
47573
*              W := C**H * V**H  =  (C1**H * V1**H + C2**H * V2**H) (stored in WORK)
48619
*              W := C**H * V**H  =  (C1**H * V1**H + C2**H * V2**H) (stored in WORK)
47574
*
48620
*
47575
*              W := C2**H
48621
*              W := C2**H
47576
*
48622
*
47577
               DO 190 J = 1, K
48623
               DO 190 J = 1, K
47578
                  CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 )
48624
                  CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ),
-
 
48625
     $                        1 )
47579
                  CALL ZLACGV( N, WORK( 1, J ), 1 )
48626
                  CALL ZLACGV( N, WORK( 1, J ), 1 )
47580
  190          CONTINUE
48627
  190          CONTINUE
47581
*
48628
*
47582
*              W := W * V2**H
48629
*              W := W * V2**H
47583
*
48630
*
Line 47593... Line 48640...
47593
     $                        LDC, V, LDV, ONE, WORK, LDWORK )
48640
     $                        LDC, V, LDV, ONE, WORK, LDWORK )
47594
               END IF
48641
               END IF
47595
*
48642
*
47596
*              W := W * T**H  or  W * T
48643
*              W := W * T**H  or  W * T
47597
*
48644
*
47598
               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K,
48645
               CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N,
-
 
48646
     $                     K,
47599
     $                     ONE, T, LDT, WORK, LDWORK )
48647
     $                     ONE, T, LDT, WORK, LDWORK )
47600
*
48648
*
47601
*              C := C - V**H * W**H
48649
*              C := C - V**H * W**H
47602
*
48650
*
47603
               IF( M.GT.K ) THEN
48651
               IF( M.GT.K ) THEN
Line 47609... Line 48657...
47609
     $                        LDV, WORK, LDWORK, ONE, C, LDC )
48657
     $                        LDV, WORK, LDWORK, ONE, C, LDC )
47610
               END IF
48658
               END IF
47611
*
48659
*
47612
*              W := W * V2
48660
*              W := W * V2
47613
*
48661
*
47614
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N,
48662
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
-
 
48663
     $                     N,
47615
     $                     K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
48664
     $                     K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK )
47616
*
48665
*
47617
*              C2 := C2 - W**H
48666
*              C2 := C2 - W**H
47618
*
48667
*
47619
               DO 210 J = 1, K
48668
               DO 210 J = 1, K
Line 47642... Line 48691...
47642
     $                     LDWORK )
48691
     $                     LDWORK )
47643
               IF( N.GT.K ) THEN
48692
               IF( N.GT.K ) THEN
47644
*
48693
*
47645
*                 W := W + C1 * V1**H
48694
*                 W := W + C1 * V1**H
47646
*
48695
*
47647
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose', M,
48696
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
-
 
48697
     $                        M,
47648
     $                        K, N-K, ONE, C, LDC, V, LDV, ONE, WORK,
48698
     $                        K, N-K, ONE, C, LDC, V, LDV, ONE, WORK,
47649
     $                        LDWORK )
48699
     $                        LDWORK )
47650
               END IF
48700
               END IF
47651
*
48701
*
47652
*              W := W * T  or  W * T**H
48702
*              W := W * T  or  W * T**H
Line 47658... Line 48708...
47658
*
48708
*
47659
               IF( N.GT.K ) THEN
48709
               IF( N.GT.K ) THEN
47660
*
48710
*
47661
*                 C1 := C1 - W * V1
48711
*                 C1 := C1 - W * V1
47662
*
48712
*
47663
                  CALL ZGEMM( 'No transpose', 'No transpose', M, N-K, K,
48713
                  CALL ZGEMM( 'No transpose', 'No transpose', M, N-K,
-
 
48714
     $                        K,
47664
     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
48715
     $                        -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC )
47665
               END IF
48716
               END IF
47666
*
48717
*
47667
*              W := W * V2
48718
*              W := W * V2
47668
*
48719
*
47669
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M,
48720
               CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit',
-
 
48721
     $                     M,
47670
     $                     K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
48722
     $                     K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK )
47671
*
48723
*
47672
*              C1 := C1 - W
48724
*              C1 := C1 - W
47673
*
48725
*
47674
               DO 240 J = 1, K
48726
               DO 240 J = 1, K
Line 47905... Line 48957...
47905
*> \endhtmlonly
48957
*> \endhtmlonly
47906
*
48958
*
47907
*  Definition:
48959
*  Definition:
47908
*  ===========
48960
*  ===========
47909
*
48961
*
47910
*       SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
48962
*       RECURSIVE SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
47911
*
48963
*
47912
*       .. Scalar Arguments ..
48964
*       .. Scalar Arguments ..
47913
*       CHARACTER          DIRECT, STOREV
48965
*       CHARACTER          DIRECT, STOREV
47914
*       INTEGER            K, LDT, LDV, N
48966
*       INTEGER            K, LDT, LDV, N
47915
*       ..
48967
*       ..
Line 48046... Line 49098...
48046
*>                   (     1 v3 )
49098
*>                   (     1 v3 )
48047
*>                   (        1 )
49099
*>                   (        1 )
48048
*> \endverbatim
49100
*> \endverbatim
48049
*>
49101
*>
48050
*  =====================================================================
49102
*  =====================================================================
48051
      SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT )
49103
      RECURSIVE SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV,
-
 
49104
     $                             TAU, T, LDT )
48052
*
49105
*
48053
*  -- LAPACK auxiliary routine --
49106
*  -- LAPACK auxiliary routine --
48054
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
49107
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
48055
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
49108
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
48056
*
49109
*
48057
*     .. Scalar Arguments ..
49110
*        .. Scalar Arguments
-
 
49111
*
48058
      CHARACTER          DIRECT, STOREV
49112
      CHARACTER         DIRECT, STOREV
48059
      INTEGER            K, LDT, LDV, N
49113
      INTEGER           K, LDT, LDV, N
48060
*     ..
49114
*     ..
48061
*     .. Array Arguments ..
49115
*     .. Array Arguments ..
48062
      COMPLEX*16         T( LDT, * ), TAU( * ), V( LDV, * )
-
 
48063
*     ..
-
 
48064
*
49116
*
48065
*  =====================================================================
49117
      COMPLEX*16        T( LDT, * ), TAU( * ), V( LDV, * )
-
 
49118
*     ..
48066
*
49119
*
48067
*     .. Parameters ..
49120
*     .. Parameters ..
-
 
49121
*
48068
      COMPLEX*16         ONE, ZERO
49122
      COMPLEX*16        ONE, NEG_ONE, ZERO
48069
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ),
49123
      PARAMETER(ONE=1.0D+0, ZERO = 0.0D+0, NEG_ONE=-1.0D+0)
48070
     $                   ZERO = ( 0.0D+0, 0.0D+0 ) )
-
 
48071
*     ..
49124
*
48072
*     .. Local Scalars ..
49125
*     .. Local Scalars ..
-
 
49126
*
48073
      INTEGER            I, J, PREVLASTV, LASTV
49127
      INTEGER           I,J,L
-
 
49128
      LOGICAL           QR,LQ,QL,DIRF,COLV
48074
*     ..
49129
*
48075
*     .. External Subroutines ..
49130
*     .. External Subroutines ..
-
 
49131
*
48076
      EXTERNAL           ZGEMV, ZTRMV, ZGEMM
49132
      EXTERNAL          ZTRMM,ZGEMM,ZLACPY
48077
*     ..
49133
*
48078
*     .. External Functions ..
49134
*     .. External Functions..
-
 
49135
*
48079
      LOGICAL            LSAME
49136
      LOGICAL           LSAME
48080
      EXTERNAL           LSAME
49137
      EXTERNAL          LSAME
-
 
49138
*
-
 
49139
*     .. Intrinsic Functions..
-
 
49140
*
-
 
49141
      INTRINSIC         CONJG
-
 
49142
*     
-
 
49143
*     The general scheme used is inspired by the approach inside DGEQRT3
-
 
49144
*     which was (at the time of writing this code):
-
 
49145
*     Based on the algorithm of Elmroth and Gustavson,
-
 
49146
*     IBM J. Res. Develop. Vol 44 No. 4 July 2000.
48081
*     ..
49147
*     ..
48082
*     .. Executable Statements ..
49148
*     .. Executable Statements ..
48083
*
49149
*
48084
*     Quick return if possible
49150
*     Quick return if possible
48085
*
49151
*
48086
      IF( N.EQ.0 )
49152
      IF(N.EQ.0.OR.K.EQ.0) THEN
48087
     $   RETURN
49153
         RETURN
-
 
49154
      END IF
48088
*
49155
*
48089
      IF( LSAME( DIRECT, 'F' ) ) THEN
-
 
48090
         PREVLASTV = N
-
 
48091
         DO I = 1, K
49156
*     Base case
48092
            PREVLASTV = MAX( PREVLASTV, I )
-
 
48093
            IF( TAU( I ).EQ.ZERO ) THEN
-
 
48094
*
49157
*
-
 
49158
      IF(N.EQ.1.OR.K.EQ.1) THEN
48095
*              H(i)  =  I
49159
         T(1,1) = TAU(1)
-
 
49160
         RETURN
-
 
49161
      END IF
48096
*
49162
*
48097
               DO J = 1, I
-
 
48098
                  T( J, I ) = ZERO
49163
*     Beginning of executable statements
48099
               END DO
-
 
48100
            ELSE
-
 
48101
*
49164
*
48102
*              general case
49165
      L = K / 2
48103
*
49166
*
48104
               IF( LSAME( STOREV, 'C' ) ) THEN
-
 
48105
*                 Skip any trailing zeros.
49167
*     Determine what kind of Q we need to compute
48106
                  DO LASTV = N, I+1, -1
-
 
48107
                     IF( V( LASTV, I ).NE.ZERO ) EXIT
49168
*     We assume that if the user doesn't provide 'F' for DIRECT,
48108
                  END DO
-
 
48109
                  DO J = 1, I-1
-
 
48110
                     T( J, I ) = -TAU( I ) * CONJG( V( I , J ) )
49169
*     then they meant to provide 'B' and if they don't provide
48111
                  END DO
-
 
48112
                  J = MIN( LASTV, PREVLASTV )
49170
*     'C' for STOREV, then they meant to provide 'R'
48113
*
49171
*
-
 
49172
      DIRF = LSAME(DIRECT,'F')
48114
*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i)
49173
      COLV = LSAME(STOREV,'C')
48115
*
49174
*
48116
                  CALL ZGEMV( 'Conjugate transpose', J-I, I-1,
-
 
48117
     $                        -TAU( I ), V( I+1, 1 ), LDV,
49175
*     QR happens when we have forward direction in column storage
48118
     $                        V( I+1, I ), 1, ONE, T( 1, I ), 1 )
-
 
48119
               ELSE
-
 
48120
*                 Skip any trailing zeros.
-
 
48121
                  DO LASTV = N, I+1, -1
-
 
48122
                     IF( V( I, LASTV ).NE.ZERO ) EXIT
-
 
48123
                  END DO
-
 
48124
                  DO J = 1, I-1
-
 
48125
                     T( J, I ) = -TAU( I ) * V( J , I )
-
 
48126
                  END DO
-
 
48127
                  J = MIN( LASTV, PREVLASTV )
-
 
48128
*
49176
*
48129
*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H
49177
      QR = DIRF.AND.COLV
48130
*
49178
*
48131
                  CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ),
-
 
48132
     $                        V( 1, I+1 ), LDV, V( I, I+1 ), LDV,
49179
*     LQ happens when we have forward direction in row storage
48133
     $                        ONE, T( 1, I ), LDT )
-
 
48134
               END IF
-
 
48135
*
49180
*
48136
*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i)
49181
      LQ = DIRF.AND.(.NOT.COLV)
48137
*
49182
*
-
 
49183
*     QL happens when we have backward direction in column storage
-
 
49184
*
-
 
49185
      QL = (.NOT.DIRF).AND.COLV
-
 
49186
*
-
 
49187
*     The last case is RQ. Due to how we structured this, if the
48138
               CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T,
49188
*     above 3 are false, then RQ must be true, so we never store 
-
 
49189
*     this
-
 
49190
*     RQ happens when we have backward direction in row storage
-
 
49191
*     RQ = (.NOT.DIRF).AND.(.NOT.COLV)
-
 
49192
*
-
 
49193
      IF(QR) THEN
-
 
49194
*
-
 
49195
*        Break V apart into 6 components
-
 
49196
*
-
 
49197
*        V = |---------------|
48139
     $                     LDT, T( 1, I ), 1 )
49198
*            |V_{1,1} 0      |
-
 
49199
*            |V_{2,1} V_{2,2}|
-
 
49200
*            |V_{3,1} V_{3,2}|
-
 
49201
*            |---------------|
-
 
49202
*
-
 
49203
*        V_{1,1}\in\C^{l,l}      unit lower triangular
-
 
49204
*        V_{2,1}\in\C^{k-l,l}    rectangular
-
 
49205
*        V_{3,1}\in\C^{n-k,l}    rectangular
-
 
49206
*        
-
 
49207
*        V_{2,2}\in\C^{k-l,k-l}  unit lower triangular
-
 
49208
*        V_{3,2}\in\C^{n-k,k-l}  rectangular
-
 
49209
*
-
 
49210
*        We will construct the T matrix 
-
 
49211
*        T = |---------------|
48140
               T( I, I ) = TAU( I )
49212
*            |T_{1,1} T_{1,2}|
48141
               IF( I.GT.1 ) THEN
49213
*            |0       T_{2,2}|
-
 
49214
*            |---------------|
-
 
49215
*
-
 
49216
*        T is the triangular factor obtained from block reflectors. 
-
 
49217
*        To motivate the structure, assume we have already computed T_{1,1}
-
 
49218
*        and T_{2,2}. Then collect the associated reflectors in V_1 and V_2
-
 
49219
*
-
 
49220
*        T_{1,1}\in\C^{l, l}     upper triangular
-
 
49221
*        T_{2,2}\in\C^{k-l, k-l} upper triangular
-
 
49222
*        T_{1,2}\in\C^{l, k-l}   rectangular
-
 
49223
*
-
 
49224
*        Where l = floor(k/2)
-
 
49225
*
-
 
49226
*        Then, consider the product:
-
 
49227
*        
48142
                  PREVLASTV = MAX( PREVLASTV, LASTV )
49228
*        (I - V_1*T_{1,1}*V_1')*(I - V_2*T_{2,2}*V_2')
-
 
49229
*        = I - V_1*T_{1,1}*V_1' - V_2*T_{2,2}*V_2' + V_1*T_{1,1}*V_1'*V_2*T_{2,2}*V_2'
-
 
49230
*        
-
 
49231
*        Define T_{1,2} = -T_{1,1}*V_1'*V_2*T_{2,2}
-
 
49232
*        
-
 
49233
*        Then, we can define the matrix V as 
-
 
49234
*        V = |-------|
48143
               ELSE
49235
*            |V_1 V_2|
-
 
49236
*            |-------|
-
 
49237
*        
-
 
49238
*        So, our product is equivalent to the matrix product
-
 
49239
*        I - V*T*V'
-
 
49240
*        This means, we can compute T_{1,1} and T_{2,2}, then use this information
-
 
49241
*        to compute T_{1,2}
-
 
49242
*
-
 
49243
*        Compute T_{1,1} recursively
-
 
49244
*
-
 
49245
         CALL ZLARFT(DIRECT, STOREV, N, L, V, LDV, TAU, T, LDT)
-
 
49246
*
-
 
49247
*        Compute T_{2,2} recursively
-
 
49248
*
-
 
49249
         CALL ZLARFT(DIRECT, STOREV, N-L, K-L, V(L+1, L+1), LDV, 
48144
                  PREVLASTV = LASTV
49250
     $               TAU(L+1), T(L+1, L+1), LDT)
-
 
49251
*
-
 
49252
*        Compute T_{1,2} 
-
 
49253
*        T_{1,2} = V_{2,1}'
-
 
49254
*
-
 
49255
         DO J = 1, L
48145
               END IF
49256
            DO I = 1, K-L
-
 
49257
               T(J, L+I) = CONJG(V(L+I, J))
48146
             END IF
49258
            END DO
48147
         END DO
49259
         END DO
48148
      ELSE
-
 
48149
         PREVLASTV = 1
-
 
48150
         DO I = K, 1, -1
-
 
48151
            IF( TAU( I ).EQ.ZERO ) THEN
-
 
48152
*
49260
*
48153
*              H(i)  =  I
49261
*        T_{1,2} = T_{1,2}*V_{2,2}
48154
*
49262
*
48155
               DO J = I, K
49263
         CALL ZTRMM('Right', 'Lower', 'No transpose', 'Unit', L,
48156
                  T( J, I ) = ZERO
49264
     $               K-L, ONE, V(L+1, L+1), LDV, T(1, L+1), LDT)
48157
               END DO
-
 
48158
            ELSE
-
 
-
 
49265
 
48159
*
49266
*
48160
*              general case
49267
*        T_{1,2} = V_{3,1}'*V_{3,2} + T_{1,2}
-
 
49268
*        Note: We assume K <= N, and GEMM will do nothing if N=K
48161
*
49269
*
48162
               IF( I.LT.K ) THEN
-
 
48163
                  IF( LSAME( STOREV, 'C' ) ) THEN
-
 
48164
*                    Skip any leading zeros.
-
 
48165
                     DO LASTV = 1, I-1
-
 
48166
                        IF( V( LASTV, I ).NE.ZERO ) EXIT
-
 
48167
                     END DO
-
 
48168
                     DO J = I+1, K
-
 
48169
                        T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) )
-
 
48170
                     END DO
-
 
48171
                     J = MAX( LASTV, PREVLASTV )
-
 
48172
*
-
 
48173
*                    T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i)
-
 
48174
*
-
 
48175
                     CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I,
49270
         CALL ZGEMM('Conjugate', 'No transpose', L, K-L, N-K, ONE, 
48176
     $                           -TAU( I ), V( J, I+1 ), LDV, V( J, I ),
49271
     $               V(K+1, 1), LDV, V(K+1, L+1), LDV, ONE, 
48177
     $                           1, ONE, T( I+1, I ), 1 )
-
 
48178
                  ELSE
-
 
48179
*                    Skip any leading zeros.
-
 
48180
                     DO LASTV = 1, I-1
-
 
48181
                        IF( V( I, LASTV ).NE.ZERO ) EXIT
-
 
48182
                     END DO
-
 
48183
                     DO J = I+1, K
49272
     $               T(1, L+1), LDT)
48184
                        T( J, I ) = -TAU( I ) * V( J, N-K+I )
-
 
48185
                     END DO
-
 
48186
                     J = MAX( LASTV, PREVLASTV )
-
 
48187
*
-
 
48188
*                    T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H
-
 
48189
*
-
 
48190
                     CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ),
-
 
48191
     $                           V( I+1, J ), LDV, V( I, J ), LDV,
-
 
48192
     $                           ONE, T( I+1, I ), LDT )
-
 
48193
                  END IF
-
 
48194
*
49273
*
48195
*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i)
49274
*        At this point, we have that T_{1,2} = V_1'*V_2
-
 
49275
*        All that is left is to pre and post multiply by -T_{1,1} and T_{2,2}
-
 
49276
*        respectively.
48196
*
49277
*
-
 
49278
*        T_{1,2} = -T_{1,1}*T_{1,2}
-
 
49279
*
48197
                  CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I,
49280
         CALL ZTRMM('Left', 'Upper', 'No transpose', 'Non-unit', L,
-
 
49281
     $               K-L, NEG_ONE, T, LDT, T(1, L+1), LDT)
-
 
49282
*
-
 
49283
*        T_{1,2} = T_{1,2}*T_{2,2}
-
 
49284
*
-
 
49285
         CALL ZTRMM('Right', 'Upper', 'No transpose', 'Non-unit', L, 
48198
     $                        T( I+1, I+1 ), LDT, T( I+1, I ), 1 )
49286
     $               K-L, ONE, T(L+1, L+1), LDT, T(1, L+1), LDT)
-
 
49287
 
-
 
49288
      ELSE IF(LQ) THEN
-
 
49289
*
-
 
49290
*        Break V apart into 6 components
-
 
49291
*
-
 
49292
*        V = |----------------------|
-
 
49293
*            |V_{1,1} V_{1,2} V{1,3}|
-
 
49294
*            |0       V_{2,2} V{2,3}|
-
 
49295
*            |----------------------|
-
 
49296
*
-
 
49297
*        V_{1,1}\in\C^{l,l}      unit upper triangular
-
 
49298
*        V_{1,2}\in\C^{l,k-l}    rectangular
-
 
49299
*        V_{1,3}\in\C^{l,n-k}    rectangular
-
 
49300
*        
-
 
49301
*        V_{2,2}\in\C^{k-l,k-l}  unit upper triangular
-
 
49302
*        V_{2,3}\in\C^{k-l,n-k}  rectangular
-
 
49303
*
-
 
49304
*        Where l = floor(k/2)
-
 
49305
*
-
 
49306
*        We will construct the T matrix 
-
 
49307
*        T = |---------------|
-
 
49308
*            |T_{1,1} T_{1,2}|
48199
                  IF( I.GT.1 ) THEN
49309
*            |0       T_{2,2}|
-
 
49310
*            |---------------|
-
 
49311
*
-
 
49312
*        T is the triangular factor obtained from block reflectors. 
-
 
49313
*        To motivate the structure, assume we have already computed T_{1,1}
-
 
49314
*        and T_{2,2}. Then collect the associated reflectors in V_1 and V_2
-
 
49315
*
-
 
49316
*        T_{1,1}\in\C^{l, l}         upper triangular
-
 
49317
*        T_{2,2}\in\C^{k-l, k-l}     upper triangular
-
 
49318
*        T_{1,2}\in\C^{l, k-l}       rectangular
-
 
49319
*
-
 
49320
*        Then, consider the product:
-
 
49321
*        
-
 
49322
*        (I - V_1'*T_{1,1}*V_1)*(I - V_2'*T_{2,2}*V_2)
-
 
49323
*        = I - V_1'*T_{1,1}*V_1 - V_2'*T_{2,2}*V_2 + V_1'*T_{1,1}*V_1*V_2'*T_{2,2}*V_2
-
 
49324
*        
-
 
49325
*        Define T_{1,2} = -T_{1,1}*V_1*V_2'*T_{2,2}
-
 
49326
*        
-
 
49327
*        Then, we can define the matrix V as 
-
 
49328
*        V = |---|
-
 
49329
*            |V_1|
-
 
49330
*            |V_2|
-
 
49331
*            |---|
-
 
49332
*        
-
 
49333
*        So, our product is equivalent to the matrix product
-
 
49334
*        I - V'*T*V
-
 
49335
*        This means, we can compute T_{1,1} and T_{2,2}, then use this information
-
 
49336
*        to compute T_{1,2}
-
 
49337
*
-
 
49338
*        Compute T_{1,1} recursively
-
 
49339
*
-
 
49340
         CALL ZLARFT(DIRECT, STOREV, N, L, V, LDV, TAU, T, LDT)
-
 
49341
*
-
 
49342
*        Compute T_{2,2} recursively
-
 
49343
*
-
 
49344
         CALL ZLARFT(DIRECT, STOREV, N-L, K-L, V(L+1, L+1), LDV, 
48200
                     PREVLASTV = MIN( PREVLASTV, LASTV )
49345
     $               TAU(L+1), T(L+1, L+1), LDT)
-
 
49346
 
-
 
49347
*
48201
                  ELSE
49348
*        Compute T_{1,2}
-
 
49349
*        T_{1,2} = V_{1,2}
-
 
49350
*
-
 
49351
         CALL ZLACPY('All', L, K-L, V(1, L+1), LDV, T(1, L+1), LDT)
-
 
49352
*
-
 
49353
*        T_{1,2} = T_{1,2}*V_{2,2}'
-
 
49354
*
-
 
49355
         CALL ZTRMM('Right', 'Upper', 'Conjugate', 'Unit', L, K-L,
-
 
49356
     $               ONE, V(L+1, L+1), LDV, T(1, L+1), LDT)
-
 
49357
 
-
 
49358
*
-
 
49359
*        T_{1,2} = V_{1,3}*V_{2,3}' + T_{1,2}
-
 
49360
*        Note: We assume K <= N, and GEMM will do nothing if N=K
-
 
49361
*
-
 
49362
         CALL ZGEMM('No transpose', 'Conjugate', L, K-L, N-K, ONE,
-
 
49363
     $               V(1, K+1), LDV, V(L+1, K+1), LDV, ONE,
48202
                     PREVLASTV = LASTV
49364
     $               T(1, L+1), LDT)
-
 
49365
*
-
 
49366
*        At this point, we have that T_{1,2} = V_1*V_2'
-
 
49367
*        All that is left is to pre and post multiply by -T_{1,1} and T_{2,2}
-
 
49368
*        respectively.
-
 
49369
*
-
 
49370
*        T_{1,2} = -T_{1,1}*T_{1,2}
-
 
49371
*
-
 
49372
         CALL ZTRMM('Left', 'Upper', 'No transpose', 'Non-unit', L,
-
 
49373
     $               K-L, NEG_ONE, T, LDT, T(1, L+1), LDT)
-
 
49374
 
-
 
49375
*
-
 
49376
*        T_{1,2} = T_{1,2}*T_{2,2}
-
 
49377
*
-
 
49378
         CALL ZTRMM('Right', 'Upper', 'No transpose', 'Non-unit', L,
-
 
49379
     $               K-L, ONE, T(L+1, L+1), LDT, T(1, L+1), LDT)
-
 
49380
      ELSE IF(QL) THEN
-
 
49381
*
-
 
49382
*        Break V apart into 6 components
-
 
49383
*
-
 
49384
*        V = |---------------|
-
 
49385
*            |V_{1,1} V_{1,2}|
-
 
49386
*            |V_{2,1} V_{2,2}|
48203
                  END IF
49387
*            |0       V_{3,2}|
-
 
49388
*            |---------------|
-
 
49389
*
-
 
49390
*        V_{1,1}\in\C^{n-k,k-l}  rectangular
-
 
49391
*        V_{2,1}\in\C^{k-l,k-l}  unit upper triangular
-
 
49392
*        
-
 
49393
*        V_{1,2}\in\C^{n-k,l}    rectangular
-
 
49394
*        V_{2,2}\in\C^{k-l,l}    rectangular
-
 
49395
*        V_{3,2}\in\C^{l,l}      unit upper triangular
-
 
49396
*
-
 
49397
*        We will construct the T matrix 
-
 
49398
*        T = |---------------|
-
 
49399
*            |T_{1,1} 0      |
-
 
49400
*            |T_{2,1} T_{2,2}|
-
 
49401
*            |---------------|
-
 
49402
*
-
 
49403
*        T is the triangular factor obtained from block reflectors. 
-
 
49404
*        To motivate the structure, assume we have already computed T_{1,1}
-
 
49405
*        and T_{2,2}. Then collect the associated reflectors in V_1 and V_2
-
 
49406
*
-
 
49407
*        T_{1,1}\in\C^{k-l, k-l} non-unit lower triangular
-
 
49408
*        T_{2,2}\in\C^{l, l}     non-unit lower triangular
-
 
49409
*        T_{2,1}\in\C^{k-l, l}   rectangular
-
 
49410
*
-
 
49411
*        Where l = floor(k/2)
-
 
49412
*
-
 
49413
*        Then, consider the product:
-
 
49414
*        
-
 
49415
*        (I - V_2*T_{2,2}*V_2')*(I - V_1*T_{1,1}*V_1')
-
 
49416
*        = I - V_2*T_{2,2}*V_2' - V_1*T_{1,1}*V_1' + V_2*T_{2,2}*V_2'*V_1*T_{1,1}*V_1'
-
 
49417
*        
-
 
49418
*        Define T_{2,1} = -T_{2,2}*V_2'*V_1*T_{1,1}
-
 
49419
*        
-
 
49420
*        Then, we can define the matrix V as 
-
 
49421
*        V = |-------|
-
 
49422
*            |V_1 V_2|
-
 
49423
*            |-------|
-
 
49424
*        
-
 
49425
*        So, our product is equivalent to the matrix product
-
 
49426
*        I - V*T*V'
-
 
49427
*        This means, we can compute T_{1,1} and T_{2,2}, then use this information
-
 
49428
*        to compute T_{2,1}
-
 
49429
*
-
 
49430
*        Compute T_{1,1} recursively
-
 
49431
*
-
 
49432
         CALL ZLARFT(DIRECT, STOREV, N-L, K-L, V, LDV, TAU, T, LDT)
-
 
49433
*
-
 
49434
*        Compute T_{2,2} recursively
-
 
49435
*
-
 
49436
         CALL ZLARFT(DIRECT, STOREV, N, L, V(1, K-L+1), LDV,
-
 
49437
     $               TAU(K-L+1), T(K-L+1, K-L+1), LDT)
-
 
49438
*
-
 
49439
*        Compute T_{2,1}
-
 
49440
*        T_{2,1} = V_{2,2}'
-
 
49441
*
-
 
49442
         DO J = 1, K-L
48204
               END IF
49443
            DO I = 1, L
48205
               T( I, I ) = TAU( I )
49444
               T(K-L+I, J) = CONJG(V(N-K+J, K-L+I))
48206
            END IF
49445
            END DO
48207
         END DO
49446
         END DO
48208
      END IF
-
 
48209
      RETURN
-
 
48210
*
49447
*
48211
*     End of ZLARFT
49448
*        T_{2,1} = T_{2,1}*V_{2,1}
48212
*
49449
*
-
 
49450
         CALL ZTRMM('Right', 'Upper', 'No transpose', 'Unit', L,
-
 
49451
     $               K-L, ONE, V(N-K+1, 1), LDV, T(K-L+1, 1), LDT)
-
 
49452
 
-
 
49453
*
-
 
49454
*        T_{2,1} = V_{2,2}'*V_{2,1} + T_{2,1}
-
 
49455
*        Note: We assume K <= N, and GEMM will do nothing if N=K
-
 
49456
*
-
 
49457
         CALL ZGEMM('Conjugate', 'No transpose', L, K-L, N-K, ONE,
-
 
49458
     $               V(1, K-L+1), LDV, V, LDV, ONE, T(K-L+1, 1),
-
 
49459
     $               LDT)
-
 
49460
*
-
 
49461
*        At this point, we have that T_{2,1} = V_2'*V_1
-
 
49462
*        All that is left is to pre and post multiply by -T_{2,2} and T_{1,1}
-
 
49463
*        respectively.
-
 
49464
*
-
 
49465
*        T_{2,1} = -T_{2,2}*T_{2,1}
-
 
49466
*
-
 
49467
         CALL ZTRMM('Left', 'Lower', 'No transpose', 'Non-unit', L,
-
 
49468
     $               K-L, NEG_ONE, T(K-L+1, K-L+1), LDT,
-
 
49469
     $               T(K-L+1, 1), LDT)
-
 
49470
*
-
 
49471
*        T_{2,1} = T_{2,1}*T_{1,1}
-
 
49472
*
-
 
49473
         CALL ZTRMM('Right', 'Lower', 'No transpose', 'Non-unit', L,
-
 
49474
     $               K-L, ONE, T, LDT, T(K-L+1, 1), LDT)
-
 
49475
      ELSE
-
 
49476
*
-
 
49477
*        Else means RQ case
-
 
49478
*
-
 
49479
*        Break V apart into 6 components
-
 
49480
*
-
 
49481
*        V = |-----------------------|
-
 
49482
*            |V_{1,1} V_{1,2} 0      |
-
 
49483
*            |V_{2,1} V_{2,2} V_{2,3}|
-
 
49484
*            |-----------------------|
-
 
49485
*
-
 
49486
*        V_{1,1}\in\C^{k-l,n-k}  rectangular
-
 
49487
*        V_{1,2}\in\C^{k-l,k-l}  unit lower triangular
-
 
49488
*
-
 
49489
*        V_{2,1}\in\C^{l,n-k}    rectangular
-
 
49490
*        V_{2,2}\in\C^{l,k-l}    rectangular
-
 
49491
*        V_{2,3}\in\C^{l,l}      unit lower triangular
-
 
49492
*
-
 
49493
*        We will construct the T matrix 
-
 
49494
*        T = |---------------|
-
 
49495
*            |T_{1,1} 0      |
-
 
49496
*            |T_{2,1} T_{2,2}|
-
 
49497
*            |---------------|
-
 
49498
*
-
 
49499
*        T is the triangular factor obtained from block reflectors. 
-
 
49500
*        To motivate the structure, assume we have already computed T_{1,1}
-
 
49501
*        and T_{2,2}. Then collect the associated reflectors in V_1 and V_2
-
 
49502
*
-
 
49503
*        T_{1,1}\in\C^{k-l, k-l} non-unit lower triangular
-
 
49504
*        T_{2,2}\in\C^{l, l}     non-unit lower triangular
-
 
49505
*        T_{2,1}\in\C^{k-l, l}   rectangular
-
 
49506
*
-
 
49507
*        Where l = floor(k/2)
-
 
49508
*
-
 
49509
*        Then, consider the product:
-
 
49510
*        
-
 
49511
*        (I - V_2'*T_{2,2}*V_2)*(I - V_1'*T_{1,1}*V_1)
-
 
49512
*        = I - V_2'*T_{2,2}*V_2 - V_1'*T_{1,1}*V_1 + V_2'*T_{2,2}*V_2*V_1'*T_{1,1}*V_1
-
 
49513
*        
-
 
49514
*        Define T_{2,1} = -T_{2,2}*V_2*V_1'*T_{1,1}
-
 
49515
*        
-
 
49516
*        Then, we can define the matrix V as 
-
 
49517
*        V = |---|
-
 
49518
*            |V_1|
-
 
49519
*            |V_2|
-
 
49520
*            |---|
-
 
49521
*        
-
 
49522
*        So, our product is equivalent to the matrix product
-
 
49523
*        I - V'*T*V
-
 
49524
*        This means, we can compute T_{1,1} and T_{2,2}, then use this information
-
 
49525
*        to compute T_{2,1}
-
 
49526
*
-
 
49527
*        Compute T_{1,1} recursively
-
 
49528
*
-
 
49529
         CALL ZLARFT(DIRECT, STOREV, N-L, K-L, V, LDV, TAU, T, LDT)
-
 
49530
*
-
 
49531
*        Compute T_{2,2} recursively
-
 
49532
*
-
 
49533
         CALL ZLARFT(DIRECT, STOREV, N, L, V(K-L+1, 1), LDV,
-
 
49534
     $               TAU(K-L+1), T(K-L+1, K-L+1), LDT)
-
 
49535
*
-
 
49536
*        Compute T_{2,1}
-
 
49537
*        T_{2,1} = V_{2,2}
-
 
49538
*
-
 
49539
         CALL ZLACPY('All', L, K-L, V(K-L+1, N-K+1), LDV,
-
 
49540
     $               T(K-L+1, 1), LDT)
-
 
49541
 
-
 
49542
*
-
 
49543
*        T_{2,1} = T_{2,1}*V_{1,2}'
-
 
49544
*
-
 
49545
         CALL ZTRMM('Right', 'Lower', 'Conjugate', 'Unit', L, K-L,
-
 
49546
     $               ONE, V(1, N-K+1), LDV, T(K-L+1, 1), LDT)
-
 
49547
 
-
 
49548
*
-
 
49549
*        T_{2,1} = V_{2,1}*V_{1,1}' + T_{2,1} 
-
 
49550
*        Note: We assume K <= N, and GEMM will do nothing if N=K
-
 
49551
*
-
 
49552
         CALL ZGEMM('No transpose', 'Conjugate', L, K-L, N-K, ONE, 
-
 
49553
     $               V(K-L+1, 1), LDV, V, LDV, ONE, T(K-L+1, 1),
-
 
49554
     $               LDT)
-
 
49555
 
-
 
49556
*
-
 
49557
*        At this point, we have that T_{2,1} = V_2*V_1'
-
 
49558
*        All that is left is to pre and post multiply by -T_{2,2} and T_{1,1}
-
 
49559
*        respectively.
-
 
49560
*
-
 
49561
*        T_{2,1} = -T_{2,2}*T_{2,1}
-
 
49562
*
-
 
49563
         CALL ZTRMM('Left', 'Lower', 'No tranpose', 'Non-unit', L,
-
 
49564
     $               K-L, NEG_ONE, T(K-L+1, K-L+1), LDT, 
-
 
49565
     $               T(K-L+1, 1), LDT)
-
 
49566
 
-
 
49567
*
-
 
49568
*        T_{2,1} = T_{2,1}*T_{1,1}
-
 
49569
*
-
 
49570
         CALL ZTRMM('Right', 'Lower', 'No tranpose', 'Non-unit', L,
-
 
49571
     $               K-L, ONE, T, LDT, T(K-L+1, 1), LDT)
48213
      END
49572
      END IF
-
 
49573
      END SUBROUTINE
48214
*> \brief \b ZLARFX applies an elementary reflector to a general rectangular matrix, with loop unrolling when the reflector has order ≤ 10.
49574
*> \brief \b ZLARFX applies an elementary reflector to a general rectangular matrix, with loop unrolling when the reflector has order ≤ 10.
48215
*
49575
*
48216
*  =========== DOCUMENTATION ===========
49576
*  =========== DOCUMENTATION ===========
48217
*
49577
*
48218
* Online html documentation available at
49578
* Online html documentation available at
Line 49047... Line 50407...
49047
*> \author NAG Ltd.
50407
*> \author NAG Ltd.
49048
*
50408
*
49049
*> \ingroup lascl
50409
*> \ingroup lascl
49050
*
50410
*
49051
*  =====================================================================
50411
*  =====================================================================
49052
      SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
50412
      SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA,
-
 
50413
     $                   INFO )
49053
*
50414
*
49054
*  -- LAPACK auxiliary routine --
50415
*  -- LAPACK auxiliary routine --
49055
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
50416
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
49056
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
50417
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
49057
*
50418
*
Line 49693... Line 51054...
49693
*     .. Executable Statements ..
51054
*     .. Executable Statements ..
49694
*
51055
*
49695
*     Test the input parameters
51056
*     Test the input parameters
49696
*
51057
*
49697
      INFO = 0
51058
      INFO = 0
49698
      IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN
51059
      IF( .NOT.( LSAME( SIDE, 'L' ) .OR.
-
 
51060
     $    LSAME( SIDE, 'R' ) ) ) THEN
49699
         INFO = 1
51061
         INFO = 1
49700
      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,
51062
      ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT,
49701
     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN
51063
     $         'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN
49702
         INFO = 2
51064
         INFO = 2
49703
      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) )
51065
      ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR.
-
 
51066
     $         LSAME( DIRECT, 'B' ) ) )
49704
     $          THEN
51067
     $          THEN
49705
         INFO = 3
51068
         INFO = 3
49706
      ELSE IF( M.LT.0 ) THEN
51069
      ELSE IF( M.LT.0 ) THEN
49707
         INFO = 4
51070
         INFO = 4
49708
      ELSE IF( N.LT.0 ) THEN
51071
      ELSE IF( N.LT.0 ) THEN
Line 50255... Line 51618...
50255
*>                  Computer Science Division,
51618
*>                  Computer Science Division,
50256
*>                  University of California, Berkeley
51619
*>                  University of California, Berkeley
50257
*> \endverbatim
51620
*> \endverbatim
50258
*
51621
*
50259
*  =====================================================================
51622
*  =====================================================================
50260
      SUBROUTINE ZLASYF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW, INFO )
51623
      SUBROUTINE ZLASYF( UPLO, N, NB, KB, A, LDA, IPIV, W, LDW,
-
 
51624
     $                   INFO )
50261
*
51625
*
50262
*  -- LAPACK computational routine --
51626
*  -- LAPACK computational routine --
50263
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
51627
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
50264
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
51628
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
50265
*
51629
*
Line 50281... Line 51645...
50281
      PARAMETER          ( EIGHT = 8.0D+0, SEVTEN = 17.0D+0 )
51645
      PARAMETER          ( EIGHT = 8.0D+0, SEVTEN = 17.0D+0 )
50282
      COMPLEX*16         CONE
51646
      COMPLEX*16         CONE
50283
      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
51647
      PARAMETER          ( CONE = ( 1.0D+0, 0.0D+0 ) )
50284
*     ..
51648
*     ..
50285
*     .. Local Scalars ..
51649
*     .. Local Scalars ..
50286
      INTEGER            IMAX, J, JB, JJ, JMAX, JP, K, KK, KKW, KP,
51650
      INTEGER            IMAX, J, JJ, JMAX, JP, K, KK, KKW, KP,
50287
     $                   KSTEP, KW
51651
     $                   KSTEP, KW
50288
      DOUBLE PRECISION   ABSAKK, ALPHA, COLMAX, ROWMAX
51652
      DOUBLE PRECISION   ABSAKK, ALPHA, COLMAX, ROWMAX
50289
      COMPLEX*16         D11, D21, D22, R1, T, Z
51653
      COMPLEX*16         D11, D21, D22, R1, T, Z
50290
*     ..
51654
*     ..
50291
*     .. External Functions ..
51655
*     .. External Functions ..
50292
      LOGICAL            LSAME
51656
      LOGICAL            LSAME
50293
      INTEGER            IZAMAX
51657
      INTEGER            IZAMAX
50294
      EXTERNAL           LSAME, IZAMAX
51658
      EXTERNAL           LSAME, IZAMAX
50295
*     ..
51659
*     ..
50296
*     .. External Subroutines ..
51660
*     .. External Subroutines ..
50297
      EXTERNAL           ZCOPY, ZGEMM, ZGEMV, ZSCAL, ZSWAP
51661
      EXTERNAL           ZCOPY, ZGEMMTR, ZGEMV, ZSCAL, ZSWAP
50298
*     ..
51662
*     ..
50299
*     .. Intrinsic Functions ..
51663
*     .. Intrinsic Functions ..
50300
      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN, SQRT
51664
      INTRINSIC          ABS, DBLE, DIMAG, MAX, MIN, SQRT
50301
*     ..
51665
*     ..
50302
*     .. Statement Functions ..
51666
*     .. Statement Functions ..
Line 50334... Line 51698...
50334
*
51698
*
50335
*        Copy column K of A to column KW of W and update it
51699
*        Copy column K of A to column KW of W and update it
50336
*
51700
*
50337
         CALL ZCOPY( K, A( 1, K ), 1, W( 1, KW ), 1 )
51701
         CALL ZCOPY( K, A( 1, K ), 1, W( 1, KW ), 1 )
50338
         IF( K.LT.N )
51702
         IF( K.LT.N )
50339
     $      CALL ZGEMV( 'No transpose', K, N-K, -CONE, A( 1, K+1 ), LDA,
51703
     $      CALL ZGEMV( 'No transpose', K, N-K, -CONE, A( 1, K+1 ),
-
 
51704
     $                  LDA,
50340
     $                  W( K, KW+1 ), LDW, CONE, W( 1, KW ), 1 )
51705
     $                  W( K, KW+1 ), LDW, CONE, W( 1, KW ), 1 )
50341
*
51706
*
50342
         KSTEP = 1
51707
         KSTEP = 1
50343
*
51708
*
50344
*        Determine rows and columns to be interchanged and whether
51709
*        Determine rows and columns to be interchanged and whether
Line 50561... Line 51926...
50561
*
51926
*
50562
*        Update the upper triangle of A11 (= A(1:k,1:k)) as
51927
*        Update the upper triangle of A11 (= A(1:k,1:k)) as
50563
*
51928
*
50564
*        A11 := A11 - U12*D*U12**T = A11 - U12*W**T
51929
*        A11 := A11 - U12*D*U12**T = A11 - U12*W**T
50565
*
51930
*
50566
*        computing blocks of NB columns at a time
-
 
50567
*
-
 
50568
         DO 50 J = ( ( K-1 ) / NB )*NB + 1, 1, -NB
-
 
50569
            JB = MIN( NB, K-J+1 )
-
 
50570
*
-
 
50571
*           Update the upper triangle of the diagonal block
-
 
50572
*
-
 
50573
            DO 40 JJ = J, J + JB - 1
-
 
50574
               CALL ZGEMV( 'No transpose', JJ-J+1, N-K, -CONE,
-
 
50575
     $                     A( J, K+1 ), LDA, W( JJ, KW+1 ), LDW, CONE,
-
 
50576
     $                     A( J, JJ ), 1 )
-
 
50577
   40       CONTINUE
-
 
50578
*
-
 
50579
*           Update the rectangular superdiagonal block
-
 
50580
*
-
 
50581
            CALL ZGEMM( 'No transpose', 'Transpose', J-1, JB, N-K,
51931
         CALL ZGEMMTR( 'Upper', 'No transpose', 'Transpose', K, N-K,
50582
     $                  -CONE, A( 1, K+1 ), LDA, W( J, KW+1 ), LDW,
51932
     $                 -CONE, A( 1, K+1 ), LDA, W( 1, KW+1 ), LDW,
50583
     $                  CONE, A( 1, J ), LDA )
51933
     $                 CONE, A( 1, 1 ), LDA )
50584
   50    CONTINUE
-
 
50585
*
51934
*
50586
*        Put U12 in standard form by partially undoing the interchanges
51935
*        Put U12 in standard form by partially undoing the interchanges
50587
*        in columns k+1:n looping backwards from k+1 to n
51936
*        in columns k+1:n looping backwards from k+1 to n
50588
*
51937
*
50589
         J = K + 1
51938
         J = K + 1
Line 50629... Line 51978...
50629
     $      GO TO 90
51978
     $      GO TO 90
50630
*
51979
*
50631
*        Copy column K of A to column K of W and update it
51980
*        Copy column K of A to column K of W and update it
50632
*
51981
*
50633
         CALL ZCOPY( N-K+1, A( K, K ), 1, W( K, K ), 1 )
51982
         CALL ZCOPY( N-K+1, A( K, K ), 1, W( K, K ), 1 )
50634
         CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K, 1 ), LDA,
51983
         CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K, 1 ),
-
 
51984
     $               LDA,
50635
     $               W( K, 1 ), LDW, CONE, W( K, K ), 1 )
51985
     $               W( K, 1 ), LDW, CONE, W( K, K ), 1 )
50636
*
51986
*
50637
         KSTEP = 1
51987
         KSTEP = 1
50638
*
51988
*
50639
*        Determine rows and columns to be interchanged and whether
51989
*        Determine rows and columns to be interchanged and whether
Line 50666... Line 52016...
50666
               KP = K
52016
               KP = K
50667
            ELSE
52017
            ELSE
50668
*
52018
*
50669
*              Copy column IMAX to column K+1 of W and update it
52019
*              Copy column IMAX to column K+1 of W and update it
50670
*
52020
*
50671
               CALL ZCOPY( IMAX-K, A( IMAX, K ), LDA, W( K, K+1 ), 1 )
52021
               CALL ZCOPY( IMAX-K, A( IMAX, K ), LDA, W( K, K+1 ),
50672
               CALL ZCOPY( N-IMAX+1, A( IMAX, IMAX ), 1, W( IMAX, K+1 ),
-
 
50673
     $                     1 )
52022
     $                     1 )
-
 
52023
               CALL ZCOPY( N-IMAX+1, A( IMAX, IMAX ), 1, W( IMAX,
-
 
52024
     $                     K+1 ),
-
 
52025
     $                     1 )
50674
               CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K, 1 ),
52026
               CALL ZGEMV( 'No transpose', N-K+1, K-1, -CONE, A( K,
-
 
52027
     $                     1 ),
50675
     $                     LDA, W( IMAX, 1 ), LDW, CONE, W( K, K+1 ),
52028
     $                     LDA, W( IMAX, 1 ), LDW, CONE, W( K, K+1 ),
50676
     $                     1 )
52029
     $                     1 )
50677
*
52030
*
50678
*              JMAX is the column-index of the largest off-diagonal
52031
*              JMAX is the column-index of the largest off-diagonal
50679
*              element in row IMAX, and ROWMAX is its absolute value
52032
*              element in row IMAX, and ROWMAX is its absolute value
Line 50728... Line 52081...
50728
*
52081
*
50729
               A( KP, KP ) = A( KK, KK )
52082
               A( KP, KP ) = A( KK, KK )
50730
               CALL ZCOPY( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
52083
               CALL ZCOPY( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
50731
     $                     LDA )
52084
     $                     LDA )
50732
               IF( KP.LT.N )
52085
               IF( KP.LT.N )
50733
     $            CALL ZCOPY( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ), 1 )
52086
     $            CALL ZCOPY( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ),
-
 
52087
     $                        1 )
50734
*
52088
*
50735
*              Interchange rows KK and KP in first K-1 columns of A
52089
*              Interchange rows KK and KP in first K-1 columns of A
50736
*              (columns K (or K and K+1 for 2-by-2 pivot) of A will be
52090
*              (columns K (or K and K+1 for 2-by-2 pivot) of A will be
50737
*              later overwritten). Interchange rows KK and KP
52091
*              later overwritten). Interchange rows KK and KP
50738
*              in first KK columns of W.
52092
*              in first KK columns of W.
Line 50851... Line 52205...
50851
*
52205
*
50852
*        Update the lower triangle of A22 (= A(k:n,k:n)) as
52206
*        Update the lower triangle of A22 (= A(k:n,k:n)) as
50853
*
52207
*
50854
*        A22 := A22 - L21*D*L21**T = A22 - L21*W**T
52208
*        A22 := A22 - L21*D*L21**T = A22 - L21*W**T
50855
*
52209
*
50856
*        computing blocks of NB columns at a time
-
 
50857
*
-
 
50858
         DO 110 J = K, N, NB
-
 
50859
            JB = MIN( NB, N-J+1 )
-
 
50860
*
-
 
50861
*           Update the lower triangle of the diagonal block
-
 
50862
*
-
 
50863
            DO 100 JJ = J, J + JB - 1
-
 
50864
               CALL ZGEMV( 'No transpose', J+JB-JJ, K-1, -CONE,
-
 
50865
     $                     A( JJ, 1 ), LDA, W( JJ, 1 ), LDW, CONE,
-
 
50866
     $                     A( JJ, JJ ), 1 )
-
 
50867
  100       CONTINUE
-
 
50868
*
-
 
50869
*           Update the rectangular subdiagonal block
-
 
50870
*
-
 
50871
            IF( J+JB.LE.N )
-
 
50872
     $         CALL ZGEMM( 'No transpose', 'Transpose', N-J-JB+1, JB,
52210
         CALL ZGEMMTR( 'Lower', 'No transpose', 'Transpose', N-K+1,
50873
     $                     K-1, -CONE, A( J+JB, 1 ), LDA, W( J, 1 ),
52211
     $                 K-1, -CONE, A( K, 1 ), LDA, W( K, 1 ), LDW,
50874
     $                     LDW, CONE, A( J+JB, J ), LDA )
52212
     $                 CONE, A( K, K ), LDA )
50875
  110    CONTINUE
-
 
50876
*
52213
*
50877
*        Put L21 in standard form by partially undoing the interchanges
52214
*        Put L21 in standard form by partially undoing the interchanges
50878
*        of rows in columns 1:k-1 looping backwards from k-1 to 1
52215
*        of rows in columns 1:k-1 looping backwards from k-1 to 1
50879
*
52216
*
50880
         J = K - 1
52217
         J = K - 1
Line 51147... Line 52484...
51147
*>  and we can safely call ZTBSV if 1/M(n) and 1/G(n) are both greater
52484
*>  and we can safely call ZTBSV if 1/M(n) and 1/G(n) are both greater
51148
*>  than max(underflow, 1/overflow).
52485
*>  than max(underflow, 1/overflow).
51149
*> \endverbatim
52486
*> \endverbatim
51150
*>
52487
*>
51151
*  =====================================================================
52488
*  =====================================================================
51152
      SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
52489
      SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB,
-
 
52490
     $                   X,
51153
     $                   SCALE, CNORM, INFO )
52491
     $                   SCALE, CNORM, INFO )
51154
*
52492
*
51155
*  -- LAPACK auxiliary routine --
52493
*  -- LAPACK auxiliary routine --
51156
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
52494
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
51157
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
52495
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 51183... Line 52521...
51183
*     .. External Functions ..
52521
*     .. External Functions ..
51184
      LOGICAL            LSAME
52522
      LOGICAL            LSAME
51185
      INTEGER            IDAMAX, IZAMAX
52523
      INTEGER            IDAMAX, IZAMAX
51186
      DOUBLE PRECISION   DLAMCH, DZASUM
52524
      DOUBLE PRECISION   DLAMCH, DZASUM
51187
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
52525
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
51188
      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC,
52526
      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM,
-
 
52527
     $                   ZDOTC,
51189
     $                   ZDOTU, ZLADIV
52528
     $                   ZDOTU, ZLADIV
51190
*     ..
52529
*     ..
51191
*     .. External Subroutines ..
52530
*     .. External Subroutines ..
51192
      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV
52531
      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV
51193
*     ..
52532
*     ..
Line 52101... Line 53440...
52101
*     .. Local Arrays ..
53440
*     .. Local Arrays ..
52102
      DOUBLE PRECISION   RWORK( MAXDIM )
53441
      DOUBLE PRECISION   RWORK( MAXDIM )
52103
      COMPLEX*16         WORK( 4*MAXDIM ), XM( MAXDIM ), XP( MAXDIM )
53442
      COMPLEX*16         WORK( 4*MAXDIM ), XM( MAXDIM ), XP( MAXDIM )
52104
*     ..
53443
*     ..
52105
*     .. External Subroutines ..
53444
*     .. External Subroutines ..
52106
      EXTERNAL           ZAXPY, ZCOPY, ZGECON, ZGESC2, ZLASSQ, ZLASWP,
53445
      EXTERNAL           ZAXPY, ZCOPY, ZGECON, ZGESC2, ZLASSQ,
-
 
53446
     $                   ZLASWP,
52107
     $                   ZSCAL
53447
     $                   ZSCAL
52108
*     ..
53448
*     ..
52109
*     .. External Functions ..
53449
*     .. External Functions ..
52110
      DOUBLE PRECISION   DZASUM
53450
      DOUBLE PRECISION   DZASUM
52111
      COMPLEX*16         ZDOTC
53451
      COMPLEX*16         ZDOTC
Line 52133... Line 53473...
52133
*           Look-ahead for L- part RHS(1:N-1) = +-1
53473
*           Look-ahead for L- part RHS(1:N-1) = +-1
52134
*           SPLUS and SMIN computed more efficiently than in BSOLVE[1].
53474
*           SPLUS and SMIN computed more efficiently than in BSOLVE[1].
52135
*
53475
*
52136
            SPLUS = SPLUS + DBLE( ZDOTC( N-J, Z( J+1, J ), 1, Z( J+1,
53476
            SPLUS = SPLUS + DBLE( ZDOTC( N-J, Z( J+1, J ), 1, Z( J+1,
52137
     $              J ), 1 ) )
53477
     $              J ), 1 ) )
52138
            SMINU = DBLE( ZDOTC( N-J, Z( J+1, J ), 1, RHS( J+1 ), 1 ) )
53478
            SMINU = DBLE( ZDOTC( N-J, Z( J+1, J ), 1, RHS( J+1 ),
-
 
53479
     $                    1 ) )
52139
            SPLUS = SPLUS*DBLE( RHS( J ) )
53480
            SPLUS = SPLUS*DBLE( RHS( J ) )
52140
            IF( SPLUS.GT.SMINU ) THEN
53481
            IF( SPLUS.GT.SMINU ) THEN
52141
               RHS( J ) = BP
53482
               RHS( J ) = BP
52142
            ELSE IF( SMINU.GT.SPLUS ) THEN
53483
            ELSE IF( SMINU.GT.SPLUS ) THEN
52143
               RHS( J ) = BM
53484
               RHS( J ) = BM
Line 52483... Line 53824...
52483
*     .. External Functions ..
53824
*     .. External Functions ..
52484
      LOGICAL            LSAME
53825
      LOGICAL            LSAME
52485
      INTEGER            IDAMAX, IZAMAX
53826
      INTEGER            IDAMAX, IZAMAX
52486
      DOUBLE PRECISION   DLAMCH, DZASUM
53827
      DOUBLE PRECISION   DLAMCH, DZASUM
52487
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
53828
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
52488
      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC,
53829
      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM,
-
 
53830
     $                   ZDOTC,
52489
     $                   ZDOTU, ZLADIV
53831
     $                   ZDOTU, ZLADIV
52490
*     ..
53832
*     ..
52491
*     .. External Subroutines ..
53833
*     .. External Subroutines ..
52492
      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTPSV
53834
      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTPSV
52493
*     ..
53835
*     ..
Line 52880... Line 54222...
52880
                  IF( J.GT.1 ) THEN
54222
                  IF( J.GT.1 ) THEN
52881
*
54223
*
52882
*                    Compute the update
54224
*                    Compute the update
52883
*                       x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
54225
*                       x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j)
52884
*
54226
*
52885
                     CALL ZAXPY( J-1, -X( J )*TSCAL, AP( IP-J+1 ), 1, X,
54227
                     CALL ZAXPY( J-1, -X( J )*TSCAL, AP( IP-J+1 ), 1,
-
 
54228
     $                           X,
52886
     $                           1 )
54229
     $                           1 )
52887
                     I = IZAMAX( J-1, X, 1 )
54230
                     I = IZAMAX( J-1, X, 1 )
52888
                     XMAX = CABS1( X( I ) )
54231
                     XMAX = CABS1( X( I ) )
52889
                  END IF
54232
                  END IF
52890
                  IP = IP - J
54233
                  IP = IP - J
Line 53418... Line 54761...
53418
*     .. Local Scalars ..
54761
*     .. Local Scalars ..
53419
      INTEGER            I, IW
54762
      INTEGER            I, IW
53420
      COMPLEX*16         ALPHA
54763
      COMPLEX*16         ALPHA
53421
*     ..
54764
*     ..
53422
*     .. External Subroutines ..
54765
*     .. External Subroutines ..
53423
      EXTERNAL           ZAXPY, ZGEMV, ZHEMV, ZLACGV, ZLARFG, ZSCAL
54766
      EXTERNAL           ZAXPY, ZGEMV, ZHEMV, ZLACGV, ZLARFG,
-
 
54767
     $                   ZSCAL
53424
*     ..
54768
*     ..
53425
*     .. External Functions ..
54769
*     .. External Functions ..
53426
      LOGICAL            LSAME
54770
      LOGICAL            LSAME
53427
      COMPLEX*16         ZDOTC
54771
      COMPLEX*16         ZDOTC
53428
      EXTERNAL           LSAME, ZDOTC
54772
      EXTERNAL           LSAME, ZDOTC
Line 53451... Line 54795...
53451
               CALL ZLACGV( N-I, W( I, IW+1 ), LDW )
54795
               CALL ZLACGV( N-I, W( I, IW+1 ), LDW )
53452
               CALL ZGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),
54796
               CALL ZGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ),
53453
     $                     LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 )
54797
     $                     LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 )
53454
               CALL ZLACGV( N-I, W( I, IW+1 ), LDW )
54798
               CALL ZLACGV( N-I, W( I, IW+1 ), LDW )
53455
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
54799
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
53456
               CALL ZGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ),
54800
               CALL ZGEMV( 'No transpose', I, N-I, -ONE, W( 1,
-
 
54801
     $                     IW+1 ),
53457
     $                     LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 )
54802
     $                     LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 )
53458
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
54803
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
53459
               A( I, I ) = DBLE( A( I, I ) )
54804
               A( I, I ) = DBLE( A( I, I ) )
53460
            END IF
54805
            END IF
53461
            IF( I.GT.1 ) THEN
54806
            IF( I.GT.1 ) THEN
Line 53527... Line 54872...
53527
               CALL ZHEMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,
54872
               CALL ZHEMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA,
53528
     $                     A( I+1, I ), 1, ZERO, W( I+1, I ), 1 )
54873
     $                     A( I+1, I ), 1, ZERO, W( I+1, I ), 1 )
53529
               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
54874
               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
53530
     $                     W( I+1, 1 ), LDW, A( I+1, I ), 1, ZERO,
54875
     $                     W( I+1, 1 ), LDW, A( I+1, I ), 1, ZERO,
53531
     $                     W( 1, I ), 1 )
54876
     $                     W( 1, I ), 1 )
53532
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ),
54877
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1,
-
 
54878
     $                     1 ),
53533
     $                     LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
54879
     $                     LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
53534
               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
54880
               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
53535
     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
54881
     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO,
53536
     $                     W( 1, I ), 1 )
54882
     $                     W( 1, I ), 1 )
53537
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ),
54883
               CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1,
-
 
54884
     $                     1 ),
53538
     $                     LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
54885
     $                     LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 )
53539
               CALL ZSCAL( N-I, TAU( I ), W( I+1, I ), 1 )
54886
               CALL ZSCAL( N-I, TAU( I ), W( I+1, I ), 1 )
53540
               ALPHA = -HALF*TAU( I )*ZDOTC( N-I, W( I+1, I ), 1,
54887
               ALPHA = -HALF*TAU( I )*ZDOTC( N-I, W( I+1, I ), 1,
53541
     $                 A( I+1, I ), 1 )
54888
     $                 A( I+1, I ), 1 )
53542
               CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 )
54889
               CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ),
-
 
54890
     $                     1 )
53543
            END IF
54891
            END IF
53544
*
54892
*
53545
   20    CONTINUE
54893
   20    CONTINUE
53546
      END IF
54894
      END IF
53547
*
54895
*
Line 53784... Line 55132...
53784
*>  and we can safely call ZTRSV if 1/M(n) and 1/G(n) are both greater
55132
*>  and we can safely call ZTRSV if 1/M(n) and 1/G(n) are both greater
53785
*>  than max(underflow, 1/overflow).
55133
*>  than max(underflow, 1/overflow).
53786
*> \endverbatim
55134
*> \endverbatim
53787
*>
55135
*>
53788
*  =====================================================================
55136
*  =====================================================================
53789
      SUBROUTINE ZLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
55137
      SUBROUTINE ZLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X,
-
 
55138
     $                   SCALE,
53790
     $                   CNORM, INFO )
55139
     $                   CNORM, INFO )
53791
*
55140
*
53792
*  -- LAPACK auxiliary routine --
55141
*  -- LAPACK auxiliary routine --
53793
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
55142
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
53794
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
55143
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 53820... Line 55169...
53820
*     .. External Functions ..
55169
*     .. External Functions ..
53821
      LOGICAL            LSAME
55170
      LOGICAL            LSAME
53822
      INTEGER            IDAMAX, IZAMAX
55171
      INTEGER            IDAMAX, IZAMAX
53823
      DOUBLE PRECISION   DLAMCH, DZASUM
55172
      DOUBLE PRECISION   DLAMCH, DZASUM
53824
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
55173
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
53825
      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM, ZDOTC,
55174
      EXTERNAL           LSAME, IDAMAX, IZAMAX, DLAMCH, DZASUM,
-
 
55175
     $                   ZDOTC,
53826
     $                   ZDOTU, ZLADIV
55176
     $                   ZDOTU, ZLADIV
53827
*     ..
55177
*     ..
53828
*     .. External Subroutines ..
55178
*     .. External Subroutines ..
53829
      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTRSV
55179
      EXTERNAL           DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTRSV
53830
*     ..
55180
*     ..
Line 54336... Line 55686...
54336
*                 call ZDOTU to perform the dot product.
55686
*                 call ZDOTU to perform the dot product.
54337
*
55687
*
54338
                  IF( UPPER ) THEN
55688
                  IF( UPPER ) THEN
54339
                     CSUMJ = ZDOTU( J-1, A( 1, J ), 1, X, 1 )
55689
                     CSUMJ = ZDOTU( J-1, A( 1, J ), 1, X, 1 )
54340
                  ELSE IF( J.LT.N ) THEN
55690
                  ELSE IF( J.LT.N ) THEN
54341
                     CSUMJ = ZDOTU( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
55691
                     CSUMJ = ZDOTU( N-J, A( J+1, J ), 1, X( J+1 ),
-
 
55692
     $                              1 )
54342
                  END IF
55693
                  END IF
54343
               ELSE
55694
               ELSE
54344
*
55695
*
54345
*                 Otherwise, use in-line code for the dot product.
55696
*                 Otherwise, use in-line code for the dot product.
54346
*
55697
*
Line 54470... Line 55821...
54470
*                 call ZDOTC to perform the dot product.
55821
*                 call ZDOTC to perform the dot product.
54471
*
55822
*
54472
                  IF( UPPER ) THEN
55823
                  IF( UPPER ) THEN
54473
                     CSUMJ = ZDOTC( J-1, A( 1, J ), 1, X, 1 )
55824
                     CSUMJ = ZDOTC( J-1, A( 1, J ), 1, X, 1 )
54474
                  ELSE IF( J.LT.N ) THEN
55825
                  ELSE IF( J.LT.N ) THEN
54475
                     CSUMJ = ZDOTC( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
55826
                     CSUMJ = ZDOTC( N-J, A( J+1, J ), 1, X( J+1 ),
-
 
55827
     $                              1 )
54476
                  END IF
55828
                  END IF
54477
               ELSE
55829
               ELSE
54478
*
55830
*
54479
*                 Otherwise, use in-line code for the dot product.
55831
*                 Otherwise, use in-line code for the dot product.
54480
*
55832
*
Line 54740... Line 56092...
54740
*        Compute the product U * U**H.
56092
*        Compute the product U * U**H.
54741
*
56093
*
54742
         DO 10 I = 1, N
56094
         DO 10 I = 1, N
54743
            AII = DBLE( A( I, I ) )
56095
            AII = DBLE( A( I, I ) )
54744
            IF( I.LT.N ) THEN
56096
            IF( I.LT.N ) THEN
54745
               A( I, I ) = AII*AII + DBLE( ZDOTC( N-I, A( I, I+1 ), LDA,
56097
               A( I, I ) = AII*AII + DBLE( ZDOTC( N-I, A( I, I+1 ),
-
 
56098
     $            LDA,
54746
     $                     A( I, I+1 ), LDA ) )
56099
     $                     A( I, I+1 ), LDA ) )
54747
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
56100
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
54748
               CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ),
56101
               CALL ZGEMV( 'No transpose', I-1, N-I, ONE, A( 1,
-
 
56102
     $                     I+1 ),
54749
     $                     LDA, A( I, I+1 ), LDA, DCMPLX( AII ),
56103
     $                     LDA, A( I, I+1 ), LDA, DCMPLX( AII ),
54750
     $                     A( 1, I ), 1 )
56104
     $                     A( 1, I ), 1 )
54751
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
56105
               CALL ZLACGV( N-I, A( I, I+1 ), LDA )
54752
            ELSE
56106
            ELSE
54753
               CALL ZDSCAL( I, AII, A( 1, I ), 1 )
56107
               CALL ZDSCAL( I, AII, A( 1, I ), 1 )
Line 54759... Line 56113...
54759
*        Compute the product L**H * L.
56113
*        Compute the product L**H * L.
54760
*
56114
*
54761
         DO 20 I = 1, N
56115
         DO 20 I = 1, N
54762
            AII = DBLE( A( I, I ) )
56116
            AII = DBLE( A( I, I ) )
54763
            IF( I.LT.N ) THEN
56117
            IF( I.LT.N ) THEN
54764
               A( I, I ) = AII*AII + DBLE( ZDOTC( N-I, A( I+1, I ), 1,
56118
               A( I, I ) = AII*AII + DBLE( ZDOTC( N-I, A( I+1, I ),
-
 
56119
     $            1,
54765
     $                     A( I+1, I ), 1 ) )
56120
     $                     A( I+1, I ), 1 ) )
54766
               CALL ZLACGV( I-1, A( I, 1 ), LDA )
56121
               CALL ZLACGV( I-1, A( I, 1 ), LDA )
54767
               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
56122
               CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE,
54768
     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1,
56123
     $                     A( I+1, 1 ), LDA, A( I+1, I ), 1,
54769
     $                     DCMPLX( AII ), A( I, 1 ), LDA )
56124
     $                     DCMPLX( AII ), A( I, 1 ), LDA )
Line 54981... Line 56336...
54981
               CALL ZTRMM( 'Left', 'Lower', 'Conjugate transpose',
56336
               CALL ZTRMM( 'Left', 'Lower', 'Conjugate transpose',
54982
     $                     'Non-unit', IB, I-1, CONE, A( I, I ), LDA,
56337
     $                     'Non-unit', IB, I-1, CONE, A( I, I ), LDA,
54983
     $                     A( I, 1 ), LDA )
56338
     $                     A( I, 1 ), LDA )
54984
               CALL ZLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
56339
               CALL ZLAUU2( 'Lower', IB, A( I, I ), LDA, INFO )
54985
               IF( I+IB.LE.N ) THEN
56340
               IF( I+IB.LE.N ) THEN
54986
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', IB,
56341
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose',
-
 
56342
     $                        IB,
54987
     $                        I-1, N-I-IB+1, CONE, A( I+IB, I ), LDA,
56343
     $                        I-1, N-I-IB+1, CONE, A( I+IB, I ), LDA,
54988
     $                        A( I+IB, 1 ), LDA, CONE, A( I, 1 ), LDA )
56344
     $                        A( I+IB, 1 ), LDA, CONE, A( I, 1 ), LDA )
54989
                  CALL ZHERK( 'Lower', 'Conjugate transpose', IB,
56345
                  CALL ZHERK( 'Lower', 'Conjugate transpose', IB,
54990
     $                        N-I-IB+1, ONE, A( I+IB, I ), LDA, ONE,
56346
     $                        N-I-IB+1, ONE, A( I+IB, I ), LDA, ONE,
54991
     $                        A( I, I ), LDA )
56347
     $                        A( I, I ), LDA )
Line 55439... Line 56795...
55439
      LOGICAL            LSAME
56795
      LOGICAL            LSAME
55440
      INTEGER            ILAENV
56796
      INTEGER            ILAENV
55441
      EXTERNAL           LSAME, ILAENV
56797
      EXTERNAL           LSAME, ILAENV
55442
*     ..
56798
*     ..
55443
*     .. External Subroutines ..
56799
*     .. External Subroutines ..
55444
      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPBTF2, ZPOTF2, ZTRSM
56800
      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPBTF2, ZPOTF2,
-
 
56801
     $                   ZTRSM
55445
*     ..
56802
*     ..
55446
*     .. Intrinsic Functions ..
56803
*     .. Intrinsic Functions ..
55447
      INTRINSIC          MIN
56804
      INTRINSIC          MIN
55448
*     ..
56805
*     ..
55449
*     .. Executable Statements ..
56806
*     .. Executable Statements ..
Line 55536... Line 56893...
55536
*
56893
*
55537
                  IF( I2.GT.0 ) THEN
56894
                  IF( I2.GT.0 ) THEN
55538
*
56895
*
55539
*                    Update A12
56896
*                    Update A12
55540
*
56897
*
55541
                     CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
56898
                     CALL ZTRSM( 'Left', 'Upper',
-
 
56899
     $                           'Conjugate transpose',
55542
     $                           'Non-unit', IB, I2, CONE,
56900
     $                           'Non-unit', IB, I2, CONE,
55543
     $                           AB( KD+1, I ), LDAB-1,
56901
     $                           AB( KD+1, I ), LDAB-1,
55544
     $                           AB( KD+1-IB, I+IB ), LDAB-1 )
56902
     $                           AB( KD+1-IB, I+IB ), LDAB-1 )
55545
*
56903
*
55546
*                    Update A22
56904
*                    Update A22
55547
*
56905
*
55548
                     CALL ZHERK( 'Upper', 'Conjugate transpose', I2, IB,
56906
                     CALL ZHERK( 'Upper', 'Conjugate transpose', I2,
-
 
56907
     $                           IB,
55549
     $                           -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE,
56908
     $                           -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE,
55550
     $                           AB( KD+1, I+IB ), LDAB-1 )
56909
     $                           AB( KD+1, I+IB ), LDAB-1 )
55551
                  END IF
56910
                  END IF
55552
*
56911
*
55553
                  IF( I3.GT.0 ) THEN
56912
                  IF( I3.GT.0 ) THEN
Line 55560... Line 56919...
55560
   30                   CONTINUE
56919
   30                   CONTINUE
55561
   40                CONTINUE
56920
   40                CONTINUE
55562
*
56921
*
55563
*                    Update A13 (in the work array).
56922
*                    Update A13 (in the work array).
55564
*
56923
*
55565
                     CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
56924
                     CALL ZTRSM( 'Left', 'Upper',
-
 
56925
     $                           'Conjugate transpose',
55566
     $                           'Non-unit', IB, I3, CONE,
56926
     $                           'Non-unit', IB, I3, CONE,
55567
     $                           AB( KD+1, I ), LDAB-1, WORK, LDWORK )
56927
     $                           AB( KD+1, I ), LDAB-1, WORK, LDWORK )
55568
*
56928
*
55569
*                    Update A23
56929
*                    Update A23
55570
*
56930
*
Line 55575... Line 56935...
55575
     $                              LDWORK, CONE, AB( 1+IB, I+KD ),
56935
     $                              LDWORK, CONE, AB( 1+IB, I+KD ),
55576
     $                              LDAB-1 )
56936
     $                              LDAB-1 )
55577
*
56937
*
55578
*                    Update A33
56938
*                    Update A33
55579
*
56939
*
55580
                     CALL ZHERK( 'Upper', 'Conjugate transpose', I3, IB,
56940
                     CALL ZHERK( 'Upper', 'Conjugate transpose', I3,
-
 
56941
     $                           IB,
55581
     $                           -ONE, WORK, LDWORK, ONE,
56942
     $                           -ONE, WORK, LDWORK, ONE,
55582
     $                           AB( KD+1, I+KD ), LDAB-1 )
56943
     $                           AB( KD+1, I+KD ), LDAB-1 )
55583
*
56944
*
55584
*                    Copy the lower triangle of A13 back into place.
56945
*                    Copy the lower triangle of A13 back into place.
55585
*
56946
*
Line 55645... Line 57006...
55645
     $                           IB, CONE, AB( 1, I ), LDAB-1,
57006
     $                           IB, CONE, AB( 1, I ), LDAB-1,
55646
     $                           AB( 1+IB, I ), LDAB-1 )
57007
     $                           AB( 1+IB, I ), LDAB-1 )
55647
*
57008
*
55648
*                    Update A22
57009
*                    Update A22
55649
*
57010
*
55650
                     CALL ZHERK( 'Lower', 'No transpose', I2, IB, -ONE,
57011
                     CALL ZHERK( 'Lower', 'No transpose', I2, IB,
-
 
57012
     $                           -ONE,
55651
     $                           AB( 1+IB, I ), LDAB-1, ONE,
57013
     $                           AB( 1+IB, I ), LDAB-1, ONE,
55652
     $                           AB( 1, I+IB ), LDAB-1 )
57014
     $                           AB( 1, I+IB ), LDAB-1 )
55653
                  END IF
57015
                  END IF
55654
*
57016
*
55655
                  IF( I3.GT.0 ) THEN
57017
                  IF( I3.GT.0 ) THEN
Line 55678... Line 57040...
55678
     $                              LDAB-1, CONE, AB( 1+KD-IB, I+IB ),
57040
     $                              LDAB-1, CONE, AB( 1+KD-IB, I+IB ),
55679
     $                              LDAB-1 )
57041
     $                              LDAB-1 )
55680
*
57042
*
55681
*                    Update A33
57043
*                    Update A33
55682
*
57044
*
55683
                     CALL ZHERK( 'Lower', 'No transpose', I3, IB, -ONE,
57045
                     CALL ZHERK( 'Lower', 'No transpose', I3, IB,
-
 
57046
     $                           -ONE,
55684
     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
57047
     $                           WORK, LDWORK, ONE, AB( 1, I+KD ),
55685
     $                           LDAB-1 )
57048
     $                           LDAB-1 )
55686
*
57049
*
55687
*                    Copy the upper triangle of A31 back into place.
57050
*                    Copy the upper triangle of A31 back into place.
55688
*
57051
*
Line 55920... Line 57283...
55920
     $                   NORMIN, N, A, LDA, WORK, SCALEL, RWORK, INFO )
57283
     $                   NORMIN, N, A, LDA, WORK, SCALEL, RWORK, INFO )
55921
            NORMIN = 'Y'
57284
            NORMIN = 'Y'
55922
*
57285
*
55923
*           Multiply by inv(U).
57286
*           Multiply by inv(U).
55924
*
57287
*
55925
            CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
57288
            CALL ZLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN,
-
 
57289
     $                   N,
55926
     $                   A, LDA, WORK, SCALEU, RWORK, INFO )
57290
     $                   A, LDA, WORK, SCALEU, RWORK, INFO )
55927
         ELSE
57291
         ELSE
55928
*
57292
*
55929
*           Multiply by inv(L).
57293
*           Multiply by inv(L).
55930
*
57294
*
55931
            CALL ZLATRS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
57295
            CALL ZLATRS( 'Lower', 'No transpose', 'Non-unit', NORMIN,
-
 
57296
     $                   N,
55932
     $                   A, LDA, WORK, SCALEL, RWORK, INFO )
57297
     $                   A, LDA, WORK, SCALEL, RWORK, INFO )
55933
            NORMIN = 'Y'
57298
            NORMIN = 'Y'
55934
*
57299
*
55935
*           Multiply by inv(L**H).
57300
*           Multiply by inv(L**H).
55936
*
57301
*
Line 56384... Line 57749...
56384
*     ..
57749
*     ..
56385
*     .. Local Arrays ..
57750
*     .. Local Arrays ..
56386
      INTEGER            ISAVE( 3 )
57751
      INTEGER            ISAVE( 3 )
56387
*     ..
57752
*     ..
56388
*     .. External Subroutines ..
57753
*     .. External Subroutines ..
56389
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZHEMV, ZLACN2, ZPOTRS
57754
      EXTERNAL           XERBLA, ZAXPY, ZCOPY, ZHEMV, ZLACN2,
-
 
57755
     $                   ZPOTRS
56390
*     ..
57756
*     ..
56391
*     .. Intrinsic Functions ..
57757
*     .. Intrinsic Functions ..
56392
      INTRINSIC          ABS, DBLE, DIMAG, MAX
57758
      INTRINSIC          ABS, DBLE, DIMAG, MAX
56393
*     ..
57759
*     ..
56394
*     .. External Functions ..
57760
*     .. External Functions ..
Line 56457... Line 57823...
56457
*        Loop until stopping criterion is satisfied.
57823
*        Loop until stopping criterion is satisfied.
56458
*
57824
*
56459
*        Compute residual R = B - A * X
57825
*        Compute residual R = B - A * X
56460
*
57826
*
56461
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
57827
         CALL ZCOPY( N, B( 1, J ), 1, WORK, 1 )
56462
         CALL ZHEMV( UPLO, N, -ONE, A, LDA, X( 1, J ), 1, ONE, WORK, 1 )
57828
         CALL ZHEMV( UPLO, N, -ONE, A, LDA, X( 1, J ), 1, ONE, WORK,
-
 
57829
     $               1 )
56463
*
57830
*
56464
*        Compute componentwise relative backward error from formula
57831
*        Compute componentwise relative backward error from formula
56465
*
57832
*
56466
*        max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) )
57833
*        max(i) ( abs(R(i)) / ( abs(A)*abs(X) + abs(B) )(i) )
56467
*
57834
*
Line 56755... Line 58122...
56755
*     .. Executable Statements ..
58122
*     .. Executable Statements ..
56756
*
58123
*
56757
*     Test the input parameters.
58124
*     Test the input parameters.
56758
*
58125
*
56759
      INFO = 0
58126
      INFO = 0
-
 
58127
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
56760
      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
58128
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
56761
         INFO = -1
58129
         INFO = -1
56762
      ELSE IF( N.LT.0 ) THEN
58130
      ELSE IF( N.LT.0 ) THEN
56763
         INFO = -2
58131
         INFO = -2
56764
      ELSE IF( NRHS.LT.0 ) THEN
58132
      ELSE IF( NRHS.LT.0 ) THEN
56765
         INFO = -3
58133
         INFO = -3
Line 57088... Line 58456...
57088
*> \author NAG Ltd.
58456
*> \author NAG Ltd.
57089
*
58457
*
57090
*> \ingroup posvx
58458
*> \ingroup posvx
57091
*
58459
*
57092
*  =====================================================================
58460
*  =====================================================================
57093
      SUBROUTINE ZPOSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, EQUED,
58461
      SUBROUTINE ZPOSVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF,
-
 
58462
     $                   EQUED,
57094
     $                   S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK,
58463
     $                   S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK,
57095
     $                   RWORK, INFO )
58464
     $                   RWORK, INFO )
57096
*
58465
*
57097
*  -- LAPACK driver routine --
58466
*  -- LAPACK driver routine --
57098
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
58467
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 57124... Line 58493...
57124
      LOGICAL            LSAME
58493
      LOGICAL            LSAME
57125
      DOUBLE PRECISION   DLAMCH, ZLANHE
58494
      DOUBLE PRECISION   DLAMCH, ZLANHE
57126
      EXTERNAL           LSAME, DLAMCH, ZLANHE
58495
      EXTERNAL           LSAME, DLAMCH, ZLANHE
57127
*     ..
58496
*     ..
57128
*     .. External Subroutines ..
58497
*     .. External Subroutines ..
57129
      EXTERNAL           XERBLA, ZLACPY, ZLAQHE, ZPOCON, ZPOEQU, ZPORFS,
58498
      EXTERNAL           XERBLA, ZLACPY, ZLAQHE, ZPOCON, ZPOEQU,
-
 
58499
     $                   ZPORFS,
57130
     $                   ZPOTRF, ZPOTRS
58500
     $                   ZPOTRF, ZPOTRS
57131
*     ..
58501
*     ..
57132
*     .. Intrinsic Functions ..
58502
*     .. Intrinsic Functions ..
57133
      INTRINSIC          MAX, MIN
58503
      INTRINSIC          MAX, MIN
57134
*     ..
58504
*     ..
Line 57146... Line 58516...
57146
         BIGNUM = ONE / SMLNUM
58516
         BIGNUM = ONE / SMLNUM
57147
      END IF
58517
      END IF
57148
*
58518
*
57149
*     Test the input parameters.
58519
*     Test the input parameters.
57150
*
58520
*
-
 
58521
      IF( .NOT.NOFACT .AND.
-
 
58522
     $    .NOT.EQUIL .AND.
57151
      IF( .NOT.NOFACT .AND. .NOT.EQUIL .AND. .NOT.LSAME( FACT, 'F' ) )
58523
     $    .NOT.LSAME( FACT, 'F' ) )
57152
     $     THEN
58524
     $     THEN
57153
         INFO = -1
58525
         INFO = -1
57154
      ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) )
58526
      ELSE IF( .NOT.LSAME( UPLO, 'U' ) .AND.
-
 
58527
     $         .NOT.LSAME( UPLO, 'L' ) )
57155
     $          THEN
58528
     $          THEN
57156
         INFO = -2
58529
         INFO = -2
57157
      ELSE IF( N.LT.0 ) THEN
58530
      ELSE IF( N.LT.0 ) THEN
57158
         INFO = -3
58531
         INFO = -3
57159
      ELSE IF( NRHS.LT.0 ) THEN
58532
      ELSE IF( NRHS.LT.0 ) THEN
Line 57238... Line 58611...
57238
*
58611
*
57239
      ANORM = ZLANHE( '1', UPLO, N, A, LDA, RWORK )
58612
      ANORM = ZLANHE( '1', UPLO, N, A, LDA, RWORK )
57240
*
58613
*
57241
*     Compute the reciprocal of the condition number of A.
58614
*     Compute the reciprocal of the condition number of A.
57242
*
58615
*
57243
      CALL ZPOCON( UPLO, N, AF, LDAF, ANORM, RCOND, WORK, RWORK, INFO )
58616
      CALL ZPOCON( UPLO, N, AF, LDAF, ANORM, RCOND, WORK, RWORK,
-
 
58617
     $             INFO )
57244
*
58618
*
57245
*     Compute the solution matrix X.
58619
*     Compute the solution matrix X.
57246
*
58620
*
57247
      CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
58621
      CALL ZLACPY( 'Full', N, NRHS, B, LDB, X, LDX )
57248
      CALL ZPOTRS( UPLO, N, NRHS, AF, LDAF, X, LDX, INFO )
58622
      CALL ZPOTRS( UPLO, N, NRHS, AF, LDAF, X, LDX, INFO )
Line 57478... Line 58852...
57478
*
58852
*
57479
         DO 20 J = 1, N
58853
         DO 20 J = 1, N
57480
*
58854
*
57481
*           Compute L(J,J) and test for non-positive-definiteness.
58855
*           Compute L(J,J) and test for non-positive-definiteness.
57482
*
58856
*
57483
            AJJ = DBLE( A( J, J ) ) - DBLE( ZDOTC( J-1, A( J, 1 ), LDA,
58857
            AJJ = DBLE( A( J, J ) ) - DBLE( ZDOTC( J-1, A( J, 1 ),
-
 
58858
     $                  LDA,
57484
     $            A( J, 1 ), LDA ) )
58859
     $            A( J, 1 ), LDA ) )
57485
            IF( AJJ.LE.ZERO.OR.DISNAN( AJJ ) ) THEN
58860
            IF( AJJ.LE.ZERO.OR.DISNAN( AJJ ) ) THEN
57486
               A( J, J ) = AJJ
58861
               A( J, J ) = AJJ
57487
               GO TO 30
58862
               GO TO 30
57488
            END IF
58863
            END IF
Line 57491... Line 58866...
57491
*
58866
*
57492
*           Compute elements J+1:N of column J.
58867
*           Compute elements J+1:N of column J.
57493
*
58868
*
57494
            IF( J.LT.N ) THEN
58869
            IF( J.LT.N ) THEN
57495
               CALL ZLACGV( J-1, A( J, 1 ), LDA )
58870
               CALL ZLACGV( J-1, A( J, 1 ), LDA )
57496
               CALL ZGEMV( 'No transpose', N-J, J-1, -CONE, A( J+1, 1 ),
58871
               CALL ZGEMV( 'No transpose', N-J, J-1, -CONE, A( J+1,
-
 
58872
     $                     1 ),
57497
     $                     LDA, A( J, 1 ), LDA, CONE, A( J+1, J ), 1 )
58873
     $                     LDA, A( J, 1 ), LDA, CONE, A( J+1, J ), 1 )
57498
               CALL ZLACGV( J-1, A( J, 1 ), LDA )
58874
               CALL ZLACGV( J-1, A( J, 1 ), LDA )
57499
               CALL ZDSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 )
58875
               CALL ZDSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 )
57500
            END IF
58876
            END IF
57501
   20    CONTINUE
58877
   20    CONTINUE
Line 57645... Line 59021...
57645
      LOGICAL            LSAME
59021
      LOGICAL            LSAME
57646
      INTEGER            ILAENV
59022
      INTEGER            ILAENV
57647
      EXTERNAL           LSAME, ILAENV
59023
      EXTERNAL           LSAME, ILAENV
57648
*     ..
59024
*     ..
57649
*     .. External Subroutines ..
59025
*     .. External Subroutines ..
57650
      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPOTRF2, ZTRSM
59026
      EXTERNAL           XERBLA, ZGEMM, ZHERK, ZPOTRF2,
-
 
59027
     $                   ZTRSM
57651
*     ..
59028
*     ..
57652
*     .. Intrinsic Functions ..
59029
*     .. Intrinsic Functions ..
57653
      INTRINSIC          MAX, MIN
59030
      INTRINSIC          MAX, MIN
57654
*     ..
59031
*     ..
57655
*     .. Executable Statements ..
59032
*     .. Executable Statements ..
Line 57704... Line 59081...
57704
     $            GO TO 30
59081
     $            GO TO 30
57705
               IF( J+JB.LE.N ) THEN
59082
               IF( J+JB.LE.N ) THEN
57706
*
59083
*
57707
*                 Compute the current block row.
59084
*                 Compute the current block row.
57708
*
59085
*
57709
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose', JB,
59086
                  CALL ZGEMM( 'Conjugate transpose', 'No transpose',
-
 
59087
     $                        JB,
57710
     $                        N-J-JB+1, J-1, -CONE, A( 1, J ), LDA,
59088
     $                        N-J-JB+1, J-1, -CONE, A( 1, J ), LDA,
57711
     $                        A( 1, J+JB ), LDA, CONE, A( J, J+JB ),
59089
     $                        A( 1, J+JB ), LDA, CONE, A( J, J+JB ),
57712
     $                        LDA )
59090
     $                        LDA )
57713
                  CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
59091
                  CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
57714
     $                        'Non-unit', JB, N-J-JB+1, CONE, A( J, J ),
59092
     $                        'Non-unit', JB, N-J-JB+1, CONE, A( J, J ),
Line 57737... Line 59115...
57737
*
59115
*
57738
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
59116
                  CALL ZGEMM( 'No transpose', 'Conjugate transpose',
57739
     $                        N-J-JB+1, JB, J-1, -CONE, A( J+JB, 1 ),
59117
     $                        N-J-JB+1, JB, J-1, -CONE, A( J+JB, 1 ),
57740
     $                        LDA, A( J, 1 ), LDA, CONE, A( J+JB, J ),
59118
     $                        LDA, A( J, 1 ), LDA, CONE, A( J+JB, J ),
57741
     $                        LDA )
59119
     $                        LDA )
57742
                  CALL ZTRSM( 'Right', 'Lower', 'Conjugate transpose',
59120
                  CALL ZTRSM( 'Right', 'Lower',
-
 
59121
     $                        'Conjugate transpose',
57743
     $                        'Non-unit', N-J-JB+1, JB, CONE, A( J, J ),
59122
     $                        'Non-unit', N-J-JB+1, JB, CONE, A( J, J ),
57744
     $                        LDA, A( J+JB, J ), LDA )
59123
     $                        LDA, A( J+JB, J ), LDA )
57745
               END IF
59124
               END IF
57746
   20       CONTINUE
59125
   20       CONTINUE
57747
         END IF
59126
         END IF
Line 58117... Line 59496...
58117
*     .. Executable Statements ..
59496
*     .. Executable Statements ..
58118
*
59497
*
58119
*     Test the input parameters.
59498
*     Test the input parameters.
58120
*
59499
*
58121
      INFO = 0
59500
      INFO = 0
-
 
59501
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
58122
      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
59502
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
58123
         INFO = -1
59503
         INFO = -1
58124
      ELSE IF( N.LT.0 ) THEN
59504
      ELSE IF( N.LT.0 ) THEN
58125
         INFO = -2
59505
         INFO = -2
58126
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
59506
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
58127
         INFO = -4
59507
         INFO = -4
Line 58323... Line 59703...
58323
*
59703
*
58324
*        Solve A*X = B where A = U**H *U.
59704
*        Solve A*X = B where A = U**H *U.
58325
*
59705
*
58326
*        Solve U**H *X = B, overwriting B with X.
59706
*        Solve U**H *X = B, overwriting B with X.
58327
*
59707
*
58328
         CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose', 'Non-unit',
59708
         CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
-
 
59709
     $               'Non-unit',
58329
     $               N, NRHS, ONE, A, LDA, B, LDB )
59710
     $               N, NRHS, ONE, A, LDA, B, LDB )
58330
*
59711
*
58331
*        Solve U*X = B, overwriting B with X.
59712
*        Solve U*X = B, overwriting B with X.
58332
*
59713
*
58333
         CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
59714
         CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N,
Line 58341... Line 59722...
58341
         CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N,
59722
         CALL ZTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N,
58342
     $               NRHS, ONE, A, LDA, B, LDB )
59723
     $               NRHS, ONE, A, LDA, B, LDB )
58343
*
59724
*
58344
*        Solve L**H *X = B, overwriting B with X.
59725
*        Solve L**H *X = B, overwriting B with X.
58345
*
59726
*
58346
         CALL ZTRSM( 'Left', 'Lower', 'Conjugate transpose', 'Non-unit',
59727
         CALL ZTRSM( 'Left', 'Lower', 'Conjugate transpose',
-
 
59728
     $               'Non-unit',
58347
     $               N, NRHS, ONE, A, LDA, B, LDB )
59729
     $               N, NRHS, ONE, A, LDA, B, LDB )
58348
      END IF
59730
      END IF
58349
*
59731
*
58350
      RETURN
59732
      RETURN
58351
*
59733
*
Line 58466... Line 59848...
58466
*> \author NAG Ltd.
59848
*> \author NAG Ltd.
58467
*
59849
*
58468
*> \ingroup ppcon
59850
*> \ingroup ppcon
58469
*
59851
*
58470
*  =====================================================================
59852
*  =====================================================================
58471
      SUBROUTINE ZPPCON( UPLO, N, AP, ANORM, RCOND, WORK, RWORK, INFO )
59853
      SUBROUTINE ZPPCON( UPLO, N, AP, ANORM, RCOND, WORK, RWORK,
-
 
59854
     $                   INFO )
58472
*
59855
*
58473
*  -- LAPACK computational routine --
59856
*  -- LAPACK computational routine --
58474
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
59857
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
58475
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
59858
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
58476
*
59859
*
Line 58563... Line 59946...
58563
     $                   NORMIN, N, AP, WORK, SCALEL, RWORK, INFO )
59946
     $                   NORMIN, N, AP, WORK, SCALEL, RWORK, INFO )
58564
            NORMIN = 'Y'
59947
            NORMIN = 'Y'
58565
*
59948
*
58566
*           Multiply by inv(U).
59949
*           Multiply by inv(U).
58567
*
59950
*
58568
            CALL ZLATPS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
59951
            CALL ZLATPS( 'Upper', 'No transpose', 'Non-unit', NORMIN,
-
 
59952
     $                   N,
58569
     $                   AP, WORK, SCALEU, RWORK, INFO )
59953
     $                   AP, WORK, SCALEU, RWORK, INFO )
58570
         ELSE
59954
         ELSE
58571
*
59955
*
58572
*           Multiply by inv(L).
59956
*           Multiply by inv(L).
58573
*
59957
*
58574
            CALL ZLATPS( 'Lower', 'No transpose', 'Non-unit', NORMIN, N,
59958
            CALL ZLATPS( 'Lower', 'No transpose', 'Non-unit', NORMIN,
-
 
59959
     $                   N,
58575
     $                   AP, WORK, SCALEL, RWORK, INFO )
59960
     $                   AP, WORK, SCALEL, RWORK, INFO )
58576
            NORMIN = 'Y'
59961
            NORMIN = 'Y'
58577
*
59962
*
58578
*           Multiply by inv(L**H).
59963
*           Multiply by inv(L**H).
58579
*
59964
*
Line 58788... Line 60173...
58788
            JJ = JJ + J
60173
            JJ = JJ + J
58789
*
60174
*
58790
*           Compute elements 1:J-1 of column J.
60175
*           Compute elements 1:J-1 of column J.
58791
*
60176
*
58792
            IF( J.GT.1 )
60177
            IF( J.GT.1 )
58793
     $         CALL ZTPSV( 'Upper', 'Conjugate transpose', 'Non-unit',
60178
     $         CALL ZTPSV( 'Upper', 'Conjugate transpose',
-
 
60179
     $                     'Non-unit',
58794
     $                     J-1, AP, AP( JC ), 1 )
60180
     $                     J-1, AP, AP( JC ), 1 )
58795
*
60181
*
58796
*           Compute U(J,J) and test for non-positive-definiteness.
60182
*           Compute U(J,J) and test for non-positive-definiteness.
58797
*
60183
*
58798
            AJJ = DBLE( AP( JJ ) ) - DBLE( ZDOTC( J-1,
60184
            AJJ = DBLE( AP( JJ ) ) - DBLE( ZDOTC( J-1,
Line 59014... Line 60400...
59014
*        Compute the product inv(L)**H * inv(L).
60400
*        Compute the product inv(L)**H * inv(L).
59015
*
60401
*
59016
         JJ = 1
60402
         JJ = 1
59017
         DO 20 J = 1, N
60403
         DO 20 J = 1, N
59018
            JJN = JJ + N - J + 1
60404
            JJN = JJ + N - J + 1
59019
            AP( JJ ) = DBLE( ZDOTC( N-J+1, AP( JJ ), 1, AP( JJ ), 1 ) )
60405
            AP( JJ ) = DBLE( ZDOTC( N-J+1, AP( JJ ), 1, AP( JJ ),
-
 
60406
     $          1 ) )
59020
            IF( J.LT.N )
60407
            IF( J.LT.N )
59021
     $         CALL ZTPMV( 'Lower', 'Conjugate transpose', 'Non-unit',
60408
     $         CALL ZTPMV( 'Lower', 'Conjugate transpose',
-
 
60409
     $                     'Non-unit',
59022
     $                     N-J, AP( JJN ), AP( JJ+1 ), 1 )
60410
     $                     N-J, AP( JJN ), AP( JJ+1 ), 1 )
59023
            JJ = JJN
60411
            JJ = JJN
59024
   20    CONTINUE
60412
   20    CONTINUE
59025
      END IF
60413
      END IF
59026
*
60414
*
Line 59196... Line 60584...
59196
*
60584
*
59197
         DO 10 I = 1, NRHS
60585
         DO 10 I = 1, NRHS
59198
*
60586
*
59199
*           Solve U**H *X = B, overwriting B with X.
60587
*           Solve U**H *X = B, overwriting B with X.
59200
*
60588
*
59201
            CALL ZTPSV( 'Upper', 'Conjugate transpose', 'Non-unit', N,
60589
            CALL ZTPSV( 'Upper', 'Conjugate transpose', 'Non-unit',
-
 
60590
     $                  N,
59202
     $                  AP, B( 1, I ), 1 )
60591
     $                  AP, B( 1, I ), 1 )
59203
*
60592
*
59204
*           Solve U*X = B, overwriting B with X.
60593
*           Solve U*X = B, overwriting B with X.
59205
*
60594
*
59206
            CALL ZTPSV( 'Upper', 'No transpose', 'Non-unit', N, AP,
60595
            CALL ZTPSV( 'Upper', 'No transpose', 'Non-unit', N, AP,
Line 59217... Line 60606...
59217
            CALL ZTPSV( 'Lower', 'No transpose', 'Non-unit', N, AP,
60606
            CALL ZTPSV( 'Lower', 'No transpose', 'Non-unit', N, AP,
59218
     $                  B( 1, I ), 1 )
60607
     $                  B( 1, I ), 1 )
59219
*
60608
*
59220
*           Solve L**H *X = Y, overwriting B with X.
60609
*           Solve L**H *X = Y, overwriting B with X.
59221
*
60610
*
59222
            CALL ZTPSV( 'Lower', 'Conjugate transpose', 'Non-unit', N,
60611
            CALL ZTPSV( 'Lower', 'Conjugate transpose', 'Non-unit',
-
 
60612
     $                  N,
59223
     $                  AP, B( 1, I ), 1 )
60613
     $                  AP, B( 1, I ), 1 )
59224
   20    CONTINUE
60614
   20    CONTINUE
59225
      END IF
60615
      END IF
59226
*
60616
*
59227
      RETURN
60617
      RETURN
Line 59367... Line 60757...
59367
*> \author NAG Ltd.
60757
*> \author NAG Ltd.
59368
*
60758
*
59369
*> \ingroup pstf2
60759
*> \ingroup pstf2
59370
*
60760
*
59371
*  =====================================================================
60761
*  =====================================================================
59372
      SUBROUTINE ZPSTF2( UPLO, N, A, LDA, PIV, RANK, TOL, WORK, INFO )
60762
      SUBROUTINE ZPSTF2( UPLO, N, A, LDA, PIV, RANK, TOL, WORK,
-
 
60763
     $                   INFO )
59373
*
60764
*
59374
*  -- LAPACK computational routine --
60765
*  -- LAPACK computational routine --
59375
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
60766
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
59376
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
60767
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
59377
*
60768
*
Line 59404... Line 60795...
59404
      DOUBLE PRECISION   DLAMCH
60795
      DOUBLE PRECISION   DLAMCH
59405
      LOGICAL            LSAME, DISNAN
60796
      LOGICAL            LSAME, DISNAN
59406
      EXTERNAL           DLAMCH, LSAME, DISNAN
60797
      EXTERNAL           DLAMCH, LSAME, DISNAN
59407
*     ..
60798
*     ..
59408
*     .. External Subroutines ..
60799
*     .. External Subroutines ..
59409
      EXTERNAL           ZDSCAL, ZGEMV, ZLACGV, ZSWAP, XERBLA
60800
      EXTERNAL           ZDSCAL, ZGEMV, ZLACGV, ZSWAP,
-
 
60801
     $                   XERBLA
59410
*     ..
60802
*     ..
59411
*     .. Intrinsic Functions ..
60803
*     .. Intrinsic Functions ..
59412
      INTRINSIC          DBLE, DCONJG, MAX, SQRT
60804
      INTRINSIC          DBLE, DCONJG, MAX, SQRT
59413
*     ..
60805
*     ..
59414
*     .. Executable Statements ..
60806
*     .. Executable Statements ..
Line 59529... Line 60921...
59529
*
60921
*
59530
*           Compute elements J+1:N of row J
60922
*           Compute elements J+1:N of row J
59531
*
60923
*
59532
            IF( J.LT.N ) THEN
60924
            IF( J.LT.N ) THEN
59533
               CALL ZLACGV( J-1, A( 1, J ), 1 )
60925
               CALL ZLACGV( J-1, A( 1, J ), 1 )
59534
               CALL ZGEMV( 'Trans', J-1, N-J, -CONE, A( 1, J+1 ), LDA,
60926
               CALL ZGEMV( 'Trans', J-1, N-J, -CONE, A( 1, J+1 ),
-
 
60927
     $                     LDA,
59535
     $                     A( 1, J ), 1, CONE, A( J, J+1 ), LDA )
60928
     $                     A( 1, J ), 1, CONE, A( J, J+1 ), LDA )
59536
               CALL ZLACGV( J-1, A( 1, J ), 1 )
60929
               CALL ZLACGV( J-1, A( 1, J ), 1 )
59537
               CALL ZDSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
60930
               CALL ZDSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
59538
            END IF
60931
            END IF
59539
*
60932
*
Line 59575... Line 60968...
59575
*              Pivot OK, so can now swap pivot rows and columns
60968
*              Pivot OK, so can now swap pivot rows and columns
59576
*
60969
*
59577
               A( PVT, PVT ) = A( J, J )
60970
               A( PVT, PVT ) = A( J, J )
59578
               CALL ZSWAP( J-1, A( J, 1 ), LDA, A( PVT, 1 ), LDA )
60971
               CALL ZSWAP( J-1, A( J, 1 ), LDA, A( PVT, 1 ), LDA )
59579
               IF( PVT.LT.N )
60972
               IF( PVT.LT.N )
59580
     $            CALL ZSWAP( N-PVT, A( PVT+1, J ), 1, A( PVT+1, PVT ),
60973
     $            CALL ZSWAP( N-PVT, A( PVT+1, J ), 1, A( PVT+1,
-
 
60974
     $                        PVT ),
59581
     $                        1 )
60975
     $                        1 )
59582
               DO 170 I = J + 1, PVT - 1
60976
               DO 170 I = J + 1, PVT - 1
59583
                  ZTEMP = DCONJG( A( I, J ) )
60977
                  ZTEMP = DCONJG( A( I, J ) )
59584
                  A( I, J ) = DCONJG( A( PVT, I ) )
60978
                  A( I, J ) = DCONJG( A( PVT, I ) )
59585
                  A( PVT, I ) = ZTEMP
60979
                  A( PVT, I ) = ZTEMP
Line 59770... Line 61164...
59770
*> \author NAG Ltd.
61164
*> \author NAG Ltd.
59771
*
61165
*
59772
*> \ingroup pstrf
61166
*> \ingroup pstrf
59773
*
61167
*
59774
*  =====================================================================
61168
*  =====================================================================
59775
      SUBROUTINE ZPSTRF( UPLO, N, A, LDA, PIV, RANK, TOL, WORK, INFO )
61169
      SUBROUTINE ZPSTRF( UPLO, N, A, LDA, PIV, RANK, TOL, WORK,
-
 
61170
     $                   INFO )
59776
*
61171
*
59777
*  -- LAPACK computational routine --
61172
*  -- LAPACK computational routine --
59778
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
61173
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
59779
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
61174
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
59780
*
61175
*
Line 59808... Line 61203...
59808
      INTEGER            ILAENV
61203
      INTEGER            ILAENV
59809
      LOGICAL            LSAME, DISNAN
61204
      LOGICAL            LSAME, DISNAN
59810
      EXTERNAL           DLAMCH, ILAENV, LSAME, DISNAN
61205
      EXTERNAL           DLAMCH, ILAENV, LSAME, DISNAN
59811
*     ..
61206
*     ..
59812
*     .. External Subroutines ..
61207
*     .. External Subroutines ..
59813
      EXTERNAL           ZDSCAL, ZGEMV, ZHERK, ZLACGV, ZPSTF2, ZSWAP,
61208
      EXTERNAL           ZDSCAL, ZGEMV, ZHERK, ZLACGV, ZPSTF2,
-
 
61209
     $                   ZSWAP,
59814
     $                   XERBLA
61210
     $                   XERBLA
59815
*     ..
61211
*     ..
59816
*     .. Intrinsic Functions ..
61212
*     .. Intrinsic Functions ..
59817
      INTRINSIC          DBLE, DCONJG, MAX, MIN, SQRT, MAXLOC
61213
      INTRINSIC          DBLE, DCONJG, MAX, MIN, SQRT, MAXLOC
59818
*     ..
61214
*     ..
Line 59955... Line 61351...
59955
*
61351
*
59956
*                 Compute elements J+1:N of row J.
61352
*                 Compute elements J+1:N of row J.
59957
*
61353
*
59958
                  IF( J.LT.N ) THEN
61354
                  IF( J.LT.N ) THEN
59959
                     CALL ZLACGV( J-1, A( 1, J ), 1 )
61355
                     CALL ZLACGV( J-1, A( 1, J ), 1 )
59960
                     CALL ZGEMV( 'Trans', J-K, N-J, -CONE, A( K, J+1 ),
61356
                     CALL ZGEMV( 'Trans', J-K, N-J, -CONE, A( K,
-
 
61357
     $                           J+1 ),
59961
     $                           LDA, A( K, J ), 1, CONE, A( J, J+1 ),
61358
     $                           LDA, A( K, J ), 1, CONE, A( J, J+1 ),
59962
     $                           LDA )
61359
     $                           LDA )
59963
                     CALL ZLACGV( J-1, A( 1, J ), 1 )
61360
                     CALL ZLACGV( J-1, A( 1, J ), 1 )
59964
                     CALL ZDSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
61361
                     CALL ZDSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA )
59965
                  END IF
61362
                  END IF
Line 60022... Line 61419...
60022
                  IF( J.NE.PVT ) THEN
61419
                  IF( J.NE.PVT ) THEN
60023
*
61420
*
60024
*                    Pivot OK, so can now swap pivot rows and columns
61421
*                    Pivot OK, so can now swap pivot rows and columns
60025
*
61422
*
60026
                     A( PVT, PVT ) = A( J, J )
61423
                     A( PVT, PVT ) = A( J, J )
60027
                     CALL ZSWAP( J-1, A( J, 1 ), LDA, A( PVT, 1 ), LDA )
61424
                     CALL ZSWAP( J-1, A( J, 1 ), LDA, A( PVT, 1 ),
-
 
61425
     $                           LDA )
60028
                     IF( PVT.LT.N )
61426
                     IF( PVT.LT.N )
60029
     $                  CALL ZSWAP( N-PVT, A( PVT+1, J ), 1,
61427
     $                  CALL ZSWAP( N-PVT, A( PVT+1, J ), 1,
60030
     $                              A( PVT+1, PVT ), 1 )
61428
     $                              A( PVT+1, PVT ), 1 )
60031
                     DO 190 I = J + 1, PVT - 1
61429
                     DO 190 I = J + 1, PVT - 1
60032
                        ZTEMP = DCONJG( A( I, J ) )
61430
                        ZTEMP = DCONJG( A( I, J ) )
Line 60422... Line 61820...
60422
     $                  INCX )
61820
     $                  INCX )
60423
            CALL ZDSCAL( N, SAFMAX, X, INCX )
61821
            CALL ZDSCAL( N, SAFMAX, X, INCX )
60424
         ELSE IF( (ABS( UR ).GT.SAFMAX).OR.(ABS( UI ).GT.SAFMAX) ) THEN
61822
         ELSE IF( (ABS( UR ).GT.SAFMAX).OR.(ABS( UI ).GT.SAFMAX) ) THEN
60425
            IF( (ABSR.GT.OV).OR.(ABSI.GT.OV) ) THEN
61823
            IF( (ABSR.GT.OV).OR.(ABSI.GT.OV) ) THEN
60426
*              This means that a and b are both Inf. No need for scaling.
61824
*              This means that a and b are both Inf. No need for scaling.
60427
               CALL ZSCAL( N, DCMPLX( ONE / UR, -ONE / UI ), X, INCX )
61825
               CALL ZSCAL( N, DCMPLX( ONE / UR, -ONE / UI ), X,
-
 
61826
     $                     INCX )
60428
            ELSE
61827
            ELSE
60429
               CALL ZDSCAL( N, SAFMIN, X, INCX )
61828
               CALL ZDSCAL( N, SAFMIN, X, INCX )
60430
               IF( (ABS( UR ).GT.OV).OR.(ABS( UI ).GT.OV) ) THEN
61829
               IF( (ABS( UR ).GT.OV).OR.(ABS( UI ).GT.OV) ) THEN
60431
*                 Infs were generated. We do proper scaling to avoid them.
61830
*                 Infs were generated. We do proper scaling to avoid them.
60432
                  IF( ABSR.GE.ABSI ) THEN
61831
                  IF( ABSR.GE.ABSI ) THEN
Line 60569... Line 61968...
60569
*> \author NAG Ltd.
61968
*> \author NAG Ltd.
60570
*
61969
*
60571
*> \ingroup hpcon
61970
*> \ingroup hpcon
60572
*
61971
*
60573
*  =====================================================================
61972
*  =====================================================================
60574
      SUBROUTINE ZSPCON( UPLO, N, AP, IPIV, ANORM, RCOND, WORK, INFO )
61973
      SUBROUTINE ZSPCON( UPLO, N, AP, IPIV, ANORM, RCOND, WORK,
-
 
61974
     $                   INFO )
60575
*
61975
*
60576
*  -- LAPACK computational routine --
61976
*  -- LAPACK computational routine --
60577
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
61977
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
60578
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
61978
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
60579
*
61979
*
Line 60681... Line 62081...
60681
      RETURN
62081
      RETURN
60682
*
62082
*
60683
*     End of ZSPCON
62083
*     End of ZSPCON
60684
*
62084
*
60685
      END
62085
      END
-
 
62086
*> \brief \b ZSPMV computes a matrix-vector product for complex vectors using a complex symmetric packed matrix
-
 
62087
*
-
 
62088
*  =========== DOCUMENTATION ===========
-
 
62089
*
-
 
62090
* Online html documentation available at
-
 
62091
*            http://www.netlib.org/lapack/explore-html/
-
 
62092
*
-
 
62093
*> \htmlonly
-
 
62094
*> Download ZSPMV + dependencies
-
 
62095
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zspmv.f">
-
 
62096
*> [TGZ]</a>
-
 
62097
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zspmv.f">
-
 
62098
*> [ZIP]</a>
-
 
62099
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zspmv.f">
-
 
62100
*> [TXT]</a>
-
 
62101
*> \endhtmlonly
-
 
62102
*
-
 
62103
*  Definition:
-
 
62104
*  ===========
-
 
62105
*
-
 
62106
*       SUBROUTINE ZSPMV( UPLO, N, ALPHA, AP, X, INCX, BETA, Y, INCY )
-
 
62107
*
-
 
62108
*       .. Scalar Arguments ..
-
 
62109
*       CHARACTER          UPLO
-
 
62110
*       INTEGER            INCX, INCY, N
-
 
62111
*       COMPLEX*16         ALPHA, BETA
-
 
62112
*       ..
-
 
62113
*       .. Array Arguments ..
-
 
62114
*       COMPLEX*16         AP( * ), X( * ), Y( * )
-
 
62115
*       ..
-
 
62116
*
-
 
62117
*
-
 
62118
*> \par Purpose:
-
 
62119
*  =============
-
 
62120
*>
-
 
62121
*> \verbatim
-
 
62122
*>
-
 
62123
*> ZSPMV  performs the matrix-vector operation
-
 
62124
*>
-
 
62125
*>    y := alpha*A*x + beta*y,
-
 
62126
*>
-
 
62127
*> where alpha and beta are scalars, x and y are n element vectors and
-
 
62128
*> A is an n by n symmetric matrix, supplied in packed form.
-
 
62129
*> \endverbatim
-
 
62130
*
-
 
62131
*  Arguments:
-
 
62132
*  ==========
-
 
62133
*
-
 
62134
*> \param[in] UPLO
-
 
62135
*> \verbatim
-
 
62136
*>          UPLO is CHARACTER*1
-
 
62137
*>           On entry, UPLO specifies whether the upper or lower
-
 
62138
*>           triangular part of the matrix A is supplied in the packed
-
 
62139
*>           array AP as follows:
-
 
62140
*>
-
 
62141
*>              UPLO = 'U' or 'u'   The upper triangular part of A is
-
 
62142
*>                                  supplied in AP.
-
 
62143
*>
-
 
62144
*>              UPLO = 'L' or 'l'   The lower triangular part of A is
-
 
62145
*>                                  supplied in AP.
-
 
62146
*>
-
 
62147
*>           Unchanged on exit.
-
 
62148
*> \endverbatim
-
 
62149
*>
-
 
62150
*> \param[in] N
-
 
62151
*> \verbatim
-
 
62152
*>          N is INTEGER
-
 
62153
*>           On entry, N specifies the order of the matrix A.
-
 
62154
*>           N must be at least zero.
-
 
62155
*>           Unchanged on exit.
-
 
62156
*> \endverbatim
-
 
62157
*>
-
 
62158
*> \param[in] ALPHA
-
 
62159
*> \verbatim
-
 
62160
*>          ALPHA is COMPLEX*16
-
 
62161
*>           On entry, ALPHA specifies the scalar alpha.
-
 
62162
*>           Unchanged on exit.
-
 
62163
*> \endverbatim
-
 
62164
*>
-
 
62165
*> \param[in] AP
-
 
62166
*> \verbatim
-
 
62167
*>          AP is COMPLEX*16 array, dimension at least
-
 
62168
*>           ( ( N*( N + 1 ) )/2 ).
-
 
62169
*>           Before entry, with UPLO = 'U' or 'u', the array AP must
-
 
62170
*>           contain the upper triangular part of the symmetric matrix
-
 
62171
*>           packed sequentially, column by column, so that AP( 1 )
-
 
62172
*>           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 )
-
 
62173
*>           and a( 2, 2 ) respectively, and so on.
-
 
62174
*>           Before entry, with UPLO = 'L' or 'l', the array AP must
-
 
62175
*>           contain the lower triangular part of the symmetric matrix
-
 
62176
*>           packed sequentially, column by column, so that AP( 1 )
-
 
62177
*>           contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 )
-
 
62178
*>           and a( 3, 1 ) respectively, and so on.
-
 
62179
*>           Unchanged on exit.
-
 
62180
*> \endverbatim
-
 
62181
*>
-
 
62182
*> \param[in] X
-
 
62183
*> \verbatim
-
 
62184
*>          X is COMPLEX*16 array, dimension at least
-
 
62185
*>           ( 1 + ( N - 1 )*abs( INCX ) ).
-
 
62186
*>           Before entry, the incremented array X must contain the N-
-
 
62187
*>           element vector x.
-
 
62188
*>           Unchanged on exit.
-
 
62189
*> \endverbatim
-
 
62190
*>
-
 
62191
*> \param[in] INCX
-
 
62192
*> \verbatim
-
 
62193
*>          INCX is INTEGER
-
 
62194
*>           On entry, INCX specifies the increment for the elements of
-
 
62195
*>           X. INCX must not be zero.
-
 
62196
*>           Unchanged on exit.
-
 
62197
*> \endverbatim
-
 
62198
*>
-
 
62199
*> \param[in] BETA
-
 
62200
*> \verbatim
-
 
62201
*>          BETA is COMPLEX*16
-
 
62202
*>           On entry, BETA specifies the scalar beta. When BETA is
-
 
62203
*>           supplied as zero then Y need not be set on input.
-
 
62204
*>           Unchanged on exit.
-
 
62205
*> \endverbatim
-
 
62206
*>
-
 
62207
*> \param[in,out] Y
-
 
62208
*> \verbatim
-
 
62209
*>          Y is COMPLEX*16 array, dimension at least
-
 
62210
*>           ( 1 + ( N - 1 )*abs( INCY ) ).
-
 
62211
*>           Before entry, the incremented array Y must contain the n
-
 
62212
*>           element vector y. On exit, Y is overwritten by the updated
-
 
62213
*>           vector y.
-
 
62214
*> \endverbatim
-
 
62215
*>
-
 
62216
*> \param[in] INCY
-
 
62217
*> \verbatim
-
 
62218
*>          INCY is INTEGER
-
 
62219
*>           On entry, INCY specifies the increment for the elements of
-
 
62220
*>           Y. INCY must not be zero.
-
 
62221
*>           Unchanged on exit.
-
 
62222
*> \endverbatim
-
 
62223
*
-
 
62224
*  Authors:
-
 
62225
*  ========
-
 
62226
*
-
 
62227
*> \author Univ. of Tennessee
-
 
62228
*> \author Univ. of California Berkeley
-
 
62229
*> \author Univ. of Colorado Denver
-
 
62230
*> \author NAG Ltd.
-
 
62231
*
-
 
62232
*> \ingroup hpmv
-
 
62233
*
-
 
62234
*  =====================================================================
-
 
62235
      SUBROUTINE ZSPMV( UPLO, N, ALPHA, AP, X, INCX, BETA, Y, INCY )
-
 
62236
*
-
 
62237
*  -- LAPACK auxiliary routine --
-
 
62238
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
-
 
62239
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
-
 
62240
*
-
 
62241
*     .. Scalar Arguments ..
-
 
62242
      CHARACTER          UPLO
-
 
62243
      INTEGER            INCX, INCY, N
-
 
62244
      COMPLEX*16         ALPHA, BETA
-
 
62245
*     ..
-
 
62246
*     .. Array Arguments ..
-
 
62247
      COMPLEX*16         AP( * ), X( * ), Y( * )
-
 
62248
*     ..
-
 
62249
*
-
 
62250
* =====================================================================
-
 
62251
*
-
 
62252
*     .. Parameters ..
-
 
62253
      COMPLEX*16         ONE
-
 
62254
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
-
 
62255
      COMPLEX*16         ZERO
-
 
62256
      PARAMETER          ( ZERO = ( 0.0D+0, 0.0D+0 ) )
-
 
62257
*     ..
-
 
62258
*     .. Local Scalars ..
-
 
62259
      INTEGER            I, INFO, IX, IY, J, JX, JY, K, KK, KX, KY
-
 
62260
      COMPLEX*16         TEMP1, TEMP2
-
 
62261
*     ..
-
 
62262
*     .. External Functions ..
-
 
62263
      LOGICAL            LSAME
-
 
62264
      EXTERNAL           LSAME
-
 
62265
*     ..
-
 
62266
*     .. External Subroutines ..
-
 
62267
      EXTERNAL           XERBLA
-
 
62268
*     ..
-
 
62269
*     .. Executable Statements ..
-
 
62270
*
-
 
62271
*     Test the input parameters.
-
 
62272
*
-
 
62273
      INFO = 0
-
 
62274
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
-
 
62275
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
-
 
62276
         INFO = 1
-
 
62277
      ELSE IF( N.LT.0 ) THEN
-
 
62278
         INFO = 2
-
 
62279
      ELSE IF( INCX.EQ.0 ) THEN
-
 
62280
         INFO = 6
-
 
62281
      ELSE IF( INCY.EQ.0 ) THEN
-
 
62282
         INFO = 9
-
 
62283
      END IF
-
 
62284
      IF( INFO.NE.0 ) THEN
-
 
62285
         CALL XERBLA( 'ZSPMV ', INFO )
-
 
62286
         RETURN
-
 
62287
      END IF
-
 
62288
*
-
 
62289
*     Quick return if possible.
-
 
62290
*
-
 
62291
      IF( ( N.EQ.0 ) .OR. ( ( ALPHA.EQ.ZERO ) .AND. ( BETA.EQ.ONE ) ) )
-
 
62292
     $   RETURN
-
 
62293
*
-
 
62294
*     Set up the start points in  X  and  Y.
-
 
62295
*
-
 
62296
      IF( INCX.GT.0 ) THEN
-
 
62297
         KX = 1
-
 
62298
      ELSE
-
 
62299
         KX = 1 - ( N-1 )*INCX
-
 
62300
      END IF
-
 
62301
      IF( INCY.GT.0 ) THEN
-
 
62302
         KY = 1
-
 
62303
      ELSE
-
 
62304
         KY = 1 - ( N-1 )*INCY
-
 
62305
      END IF
-
 
62306
*
-
 
62307
*     Start the operations. In this version the elements of the array AP
-
 
62308
*     are accessed sequentially with one pass through AP.
-
 
62309
*
-
 
62310
*     First form  y := beta*y.
-
 
62311
*
-
 
62312
      IF( BETA.NE.ONE ) THEN
-
 
62313
         IF( INCY.EQ.1 ) THEN
-
 
62314
            IF( BETA.EQ.ZERO ) THEN
-
 
62315
               DO 10 I = 1, N
-
 
62316
                  Y( I ) = ZERO
-
 
62317
   10          CONTINUE
-
 
62318
            ELSE
-
 
62319
               DO 20 I = 1, N
-
 
62320
                  Y( I ) = BETA*Y( I )
-
 
62321
   20          CONTINUE
-
 
62322
            END IF
-
 
62323
         ELSE
-
 
62324
            IY = KY
-
 
62325
            IF( BETA.EQ.ZERO ) THEN
-
 
62326
               DO 30 I = 1, N
-
 
62327
                  Y( IY ) = ZERO
-
 
62328
                  IY = IY + INCY
-
 
62329
   30          CONTINUE
-
 
62330
            ELSE
-
 
62331
               DO 40 I = 1, N
-
 
62332
                  Y( IY ) = BETA*Y( IY )
-
 
62333
                  IY = IY + INCY
-
 
62334
   40          CONTINUE
-
 
62335
            END IF
-
 
62336
         END IF
-
 
62337
      END IF
-
 
62338
      IF( ALPHA.EQ.ZERO )
-
 
62339
     $   RETURN
-
 
62340
      KK = 1
-
 
62341
      IF( LSAME( UPLO, 'U' ) ) THEN
-
 
62342
*
-
 
62343
*        Form  y  when AP contains the upper triangle.
-
 
62344
*
-
 
62345
         IF( ( INCX.EQ.1 ) .AND. ( INCY.EQ.1 ) ) THEN
-
 
62346
            DO 60 J = 1, N
-
 
62347
               TEMP1 = ALPHA*X( J )
-
 
62348
               TEMP2 = ZERO
-
 
62349
               K = KK
-
 
62350
               DO 50 I = 1, J - 1
-
 
62351
                  Y( I ) = Y( I ) + TEMP1*AP( K )
-
 
62352
                  TEMP2 = TEMP2 + AP( K )*X( I )
-
 
62353
                  K = K + 1
-
 
62354
   50          CONTINUE
-
 
62355
               Y( J ) = Y( J ) + TEMP1*AP( KK+J-1 ) + ALPHA*TEMP2
-
 
62356
               KK = KK + J
-
 
62357
   60       CONTINUE
-
 
62358
         ELSE
-
 
62359
            JX = KX
-
 
62360
            JY = KY
-
 
62361
            DO 80 J = 1, N
-
 
62362
               TEMP1 = ALPHA*X( JX )
-
 
62363
               TEMP2 = ZERO
-
 
62364
               IX = KX
-
 
62365
               IY = KY
-
 
62366
               DO 70 K = KK, KK + J - 2
-
 
62367
                  Y( IY ) = Y( IY ) + TEMP1*AP( K )
-
 
62368
                  TEMP2 = TEMP2 + AP( K )*X( IX )
-
 
62369
                  IX = IX + INCX
-
 
62370
                  IY = IY + INCY
-
 
62371
   70          CONTINUE
-
 
62372
               Y( JY ) = Y( JY ) + TEMP1*AP( KK+J-1 ) + ALPHA*TEMP2
-
 
62373
               JX = JX + INCX
-
 
62374
               JY = JY + INCY
-
 
62375
               KK = KK + J
-
 
62376
   80       CONTINUE
-
 
62377
         END IF
-
 
62378
      ELSE
-
 
62379
*
-
 
62380
*        Form  y  when AP contains the lower triangle.
-
 
62381
*
-
 
62382
         IF( ( INCX.EQ.1 ) .AND. ( INCY.EQ.1 ) ) THEN
-
 
62383
            DO 100 J = 1, N
-
 
62384
               TEMP1 = ALPHA*X( J )
-
 
62385
               TEMP2 = ZERO
-
 
62386
               Y( J ) = Y( J ) + TEMP1*AP( KK )
-
 
62387
               K = KK + 1
-
 
62388
               DO 90 I = J + 1, N
-
 
62389
                  Y( I ) = Y( I ) + TEMP1*AP( K )
-
 
62390
                  TEMP2 = TEMP2 + AP( K )*X( I )
-
 
62391
                  K = K + 1
-
 
62392
   90          CONTINUE
-
 
62393
               Y( J ) = Y( J ) + ALPHA*TEMP2
-
 
62394
               KK = KK + ( N-J+1 )
-
 
62395
  100       CONTINUE
-
 
62396
         ELSE
-
 
62397
            JX = KX
-
 
62398
            JY = KY
-
 
62399
            DO 120 J = 1, N
-
 
62400
               TEMP1 = ALPHA*X( JX )
-
 
62401
               TEMP2 = ZERO
-
 
62402
               Y( JY ) = Y( JY ) + TEMP1*AP( KK )
-
 
62403
               IX = JX
-
 
62404
               IY = JY
-
 
62405
               DO 110 K = KK + 1, KK + N - J
-
 
62406
                  IX = IX + INCX
-
 
62407
                  IY = IY + INCY
-
 
62408
                  Y( IY ) = Y( IY ) + TEMP1*AP( K )
-
 
62409
                  TEMP2 = TEMP2 + AP( K )*X( IX )
-
 
62410
  110          CONTINUE
-
 
62411
               Y( JY ) = Y( JY ) + ALPHA*TEMP2
-
 
62412
               JX = JX + INCX
-
 
62413
               JY = JY + INCY
-
 
62414
               KK = KK + ( N-J+1 )
-
 
62415
  120       CONTINUE
-
 
62416
         END IF
-
 
62417
      END IF
-
 
62418
*
-
 
62419
      RETURN
-
 
62420
*
-
 
62421
*     End of ZSPMV
-
 
62422
*
-
 
62423
      END
60686
*> \brief \b ZSPR performs the symmetrical rank-1 update of a complex symmetric packed matrix.
62424
*> \brief \b ZSPR performs the symmetrical rank-1 update of a complex symmetric packed matrix.
60687
*
62425
*
60688
*  =========== DOCUMENTATION ===========
62426
*  =========== DOCUMENTATION ===========
60689
*
62427
*
60690
* Online html documentation available at
62428
* Online html documentation available at
Line 60848... Line 62586...
60848
*     .. Executable Statements ..
62586
*     .. Executable Statements ..
60849
*
62587
*
60850
*     Test the input parameters.
62588
*     Test the input parameters.
60851
*
62589
*
60852
      INFO = 0
62590
      INFO = 0
-
 
62591
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
60853
      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
62592
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
60854
         INFO = 1
62593
         INFO = 1
60855
      ELSE IF( N.LT.0 ) THEN
62594
      ELSE IF( N.LT.0 ) THEN
60856
         INFO = 2
62595
         INFO = 2
60857
      ELSE IF( INCX.EQ.0 ) THEN
62596
      ELSE IF( INCX.EQ.0 ) THEN
60858
         INFO = 5
62597
         INFO = 5
Line 61466... Line 63205...
61466
*
63205
*
61467
*              Interchange rows and columns KK and KP in the trailing
63206
*              Interchange rows and columns KK and KP in the trailing
61468
*              submatrix A(k:n,k:n)
63207
*              submatrix A(k:n,k:n)
61469
*
63208
*
61470
               IF( KP.LT.N )
63209
               IF( KP.LT.N )
61471
     $            CALL ZSWAP( N-KP, AP( KNC+KP-KK+1 ), 1, AP( KPC+1 ),
63210
     $            CALL ZSWAP( N-KP, AP( KNC+KP-KK+1 ), 1,
-
 
63211
     $                        AP( KPC+1 ),
61472
     $                        1 )
63212
     $                        1 )
61473
               KX = KNC + KP - KK
63213
               KX = KNC + KP - KK
61474
               DO 80 J = KK + 1, KP - 1
63214
               DO 80 J = KK + 1, KP - 1
61475
                  KX = KX + N - J + 1
63215
                  KX = KX + N - J + 1
61476
                  T = AP( KNC+J-KK )
63216
                  T = AP( KNC+J-KK )
Line 61794... Line 63534...
61794
*
63534
*
61795
*           Compute column K of the inverse.
63535
*           Compute column K of the inverse.
61796
*
63536
*
61797
            IF( K.GT.1 ) THEN
63537
            IF( K.GT.1 ) THEN
61798
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
63538
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
61799
               CALL ZSPMV( UPLO, K-1, -ONE, AP, WORK, 1, ZERO, AP( KC ),
63539
               CALL ZSPMV( UPLO, K-1, -ONE, AP, WORK, 1, ZERO,
-
 
63540
     $                     AP( KC ),
61800
     $                     1 )
63541
     $                     1 )
61801
               AP( KC+K-1 ) = AP( KC+K-1 ) -
63542
               AP( KC+K-1 ) = AP( KC+K-1 ) -
61802
     $                        ZDOTU( K-1, WORK, 1, AP( KC ), 1 )
63543
     $                        ZDOTU( K-1, WORK, 1, AP( KC ), 1 )
61803
            END IF
63544
            END IF
61804
            KSTEP = 1
63545
            KSTEP = 1
Line 61819... Line 63560...
61819
*
63560
*
61820
*           Compute columns K and K+1 of the inverse.
63561
*           Compute columns K and K+1 of the inverse.
61821
*
63562
*
61822
            IF( K.GT.1 ) THEN
63563
            IF( K.GT.1 ) THEN
61823
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
63564
               CALL ZCOPY( K-1, AP( KC ), 1, WORK, 1 )
61824
               CALL ZSPMV( UPLO, K-1, -ONE, AP, WORK, 1, ZERO, AP( KC ),
63565
               CALL ZSPMV( UPLO, K-1, -ONE, AP, WORK, 1, ZERO,
-
 
63566
     $                     AP( KC ),
61825
     $                     1 )
63567
     $                     1 )
61826
               AP( KC+K-1 ) = AP( KC+K-1 ) -
63568
               AP( KC+K-1 ) = AP( KC+K-1 ) -
61827
     $                        ZDOTU( K-1, WORK, 1, AP( KC ), 1 )
63569
     $                        ZDOTU( K-1, WORK, 1, AP( KC ), 1 )
61828
               AP( KCNEXT+K-1 ) = AP( KCNEXT+K-1 ) -
63570
               AP( KCNEXT+K-1 ) = AP( KCNEXT+K-1 ) -
61829
     $                            ZDOTU( K-1, AP( KC ), 1, AP( KCNEXT ),
63571
     $                            ZDOTU( K-1, AP( KC ), 1,
-
 
63572
     $                                   AP( KCNEXT ),
61830
     $                            1 )
63573
     $                            1 )
61831
               CALL ZCOPY( K-1, AP( KCNEXT ), 1, WORK, 1 )
63574
               CALL ZCOPY( K-1, AP( KCNEXT ), 1, WORK, 1 )
61832
               CALL ZSPMV( UPLO, K-1, -ONE, AP, WORK, 1, ZERO,
63575
               CALL ZSPMV( UPLO, K-1, -ONE, AP, WORK, 1, ZERO,
61833
     $                     AP( KCNEXT ), 1 )
63576
     $                     AP( KCNEXT ), 1 )
61834
               AP( KCNEXT+K ) = AP( KCNEXT+K ) -
63577
               AP( KCNEXT+K ) = AP( KCNEXT+K ) -
61835
     $                          ZDOTU( K-1, WORK, 1, AP( KCNEXT ), 1 )
63578
     $                          ZDOTU( K-1, WORK, 1, AP( KCNEXT ),
-
 
63579
     $                                 1 )
61836
            END IF
63580
            END IF
61837
            KSTEP = 2
63581
            KSTEP = 2
61838
            KCNEXT = KCNEXT + K + 1
63582
            KCNEXT = KCNEXT + K + 1
61839
         END IF
63583
         END IF
61840
*
63584
*
Line 61921... Line 63665...
61921
*
63665
*
61922
*           Compute columns K-1 and K of the inverse.
63666
*           Compute columns K-1 and K of the inverse.
61923
*
63667
*
61924
            IF( K.LT.N ) THEN
63668
            IF( K.LT.N ) THEN
61925
               CALL ZCOPY( N-K, AP( KC+1 ), 1, WORK, 1 )
63669
               CALL ZCOPY( N-K, AP( KC+1 ), 1, WORK, 1 )
61926
               CALL ZSPMV( UPLO, N-K, -ONE, AP( KC+( N-K+1 ) ), WORK, 1,
63670
               CALL ZSPMV( UPLO, N-K, -ONE, AP( KC+( N-K+1 ) ), WORK,
-
 
63671
     $                     1,
61927
     $                     ZERO, AP( KC+1 ), 1 )
63672
     $                     ZERO, AP( KC+1 ), 1 )
61928
               AP( KC ) = AP( KC ) - ZDOTU( N-K, WORK, 1, AP( KC+1 ),
63673
               AP( KC ) = AP( KC ) - ZDOTU( N-K, WORK, 1, AP( KC+1 ),
61929
     $                    1 )
63674
     $                    1 )
61930
               AP( KCNEXT+1 ) = AP( KCNEXT+1 ) -
63675
               AP( KCNEXT+1 ) = AP( KCNEXT+1 ) -
61931
     $                          ZDOTU( N-K, AP( KC+1 ), 1,
63676
     $                          ZDOTU( N-K, AP( KC+1 ), 1,
61932
     $                          AP( KCNEXT+2 ), 1 )
63677
     $                          AP( KCNEXT+2 ), 1 )
61933
               CALL ZCOPY( N-K, AP( KCNEXT+2 ), 1, WORK, 1 )
63678
               CALL ZCOPY( N-K, AP( KCNEXT+2 ), 1, WORK, 1 )
61934
               CALL ZSPMV( UPLO, N-K, -ONE, AP( KC+( N-K+1 ) ), WORK, 1,
63679
               CALL ZSPMV( UPLO, N-K, -ONE, AP( KC+( N-K+1 ) ), WORK,
-
 
63680
     $                     1,
61935
     $                     ZERO, AP( KCNEXT+2 ), 1 )
63681
     $                     ZERO, AP( KCNEXT+2 ), 1 )
61936
               AP( KCNEXT ) = AP( KCNEXT ) -
63682
               AP( KCNEXT ) = AP( KCNEXT ) -
61937
     $                        ZDOTU( N-K, WORK, 1, AP( KCNEXT+2 ), 1 )
63683
     $                        ZDOTU( N-K, WORK, 1, AP( KCNEXT+2 ),
-
 
63684
     $                               1 )
61938
            END IF
63685
            END IF
61939
            KSTEP = 2
63686
            KSTEP = 2
61940
            KCNEXT = KCNEXT - ( N-K+3 )
63687
            KCNEXT = KCNEXT - ( N-K+3 )
61941
         END IF
63688
         END IF
61942
*
63689
*
Line 62244... Line 63991...
62244
*           1 x 1 diagonal block
63991
*           1 x 1 diagonal block
62245
*
63992
*
62246
*           Multiply by inv(U**T(K)), where U(K) is the transformation
63993
*           Multiply by inv(U**T(K)), where U(K) is the transformation
62247
*           stored in column K of A.
63994
*           stored in column K of A.
62248
*
63995
*
62249
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB, AP( KC ),
63996
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB,
-
 
63997
     $                  AP( KC ),
62250
     $                  1, ONE, B( K, 1 ), LDB )
63998
     $                  1, ONE, B( K, 1 ), LDB )
62251
*
63999
*
62252
*           Interchange rows K and IPIV(K).
64000
*           Interchange rows K and IPIV(K).
62253
*
64001
*
62254
            KP = IPIV( K )
64002
            KP = IPIV( K )
Line 62261... Line 64009...
62261
*           2 x 2 diagonal block
64009
*           2 x 2 diagonal block
62262
*
64010
*
62263
*           Multiply by inv(U**T(K+1)), where U(K+1) is the transformation
64011
*           Multiply by inv(U**T(K+1)), where U(K+1) is the transformation
62264
*           stored in columns K and K+1 of A.
64012
*           stored in columns K and K+1 of A.
62265
*
64013
*
62266
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB, AP( KC ),
64014
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB,
-
 
64015
     $                  AP( KC ),
62267
     $                  1, ONE, B( K, 1 ), LDB )
64016
     $                  1, ONE, B( K, 1 ), LDB )
62268
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB,
64017
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB,
62269
     $                  AP( KC+K ), 1, ONE, B( K+1, 1 ), LDB )
64018
     $                  AP( KC+K ), 1, ONE, B( K+1, 1 ), LDB )
62270
*
64019
*
62271
*           Interchange rows K and -IPIV(K).
64020
*           Interchange rows K and -IPIV(K).
Line 62332... Line 64081...
62332
*
64081
*
62333
*           Multiply by inv(L(K)), where L(K) is the transformation
64082
*           Multiply by inv(L(K)), where L(K) is the transformation
62334
*           stored in columns K and K+1 of A.
64083
*           stored in columns K and K+1 of A.
62335
*
64084
*
62336
            IF( K.LT.N-1 ) THEN
64085
            IF( K.LT.N-1 ) THEN
62337
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+2 ), 1, B( K, 1 ),
64086
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+2 ), 1, B( K,
-
 
64087
     $                     1 ),
62338
     $                     LDB, B( K+2, 1 ), LDB )
64088
     $                     LDB, B( K+2, 1 ), LDB )
62339
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+N-K+2 ), 1,
64089
               CALL ZGERU( N-K-1, NRHS, -ONE, AP( KC+N-K+2 ), 1,
62340
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
64090
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
62341
            END IF
64091
            END IF
62342
*
64092
*
Line 62661... Line 64411...
62661
      INTEGER            ILAENV
64411
      INTEGER            ILAENV
62662
      DOUBLE PRECISION   DLAMCH, DLANST
64412
      DOUBLE PRECISION   DLAMCH, DLANST
62663
      EXTERNAL           LSAME, ILAENV, DLAMCH, DLANST
64413
      EXTERNAL           LSAME, ILAENV, DLAMCH, DLANST
62664
*     ..
64414
*     ..
62665
*     .. External Subroutines ..
64415
*     .. External Subroutines ..
62666
      EXTERNAL           DLASCL, DLASET, DSTEDC, DSTEQR, DSTERF, XERBLA,
64416
      EXTERNAL           DLASCL, DLASET, DSTEDC, DSTEQR, DSTERF,
-
 
64417
     $                   XERBLA,
62667
     $                   ZLACPY, ZLACRM, ZLAED0, ZSTEQR, ZSWAP
64418
     $                   ZLACPY, ZLACRM, ZLAED0, ZSTEQR, ZSWAP
62668
*     ..
64419
*     ..
62669
*     .. Intrinsic Functions ..
64420
*     .. Intrinsic Functions ..
62670
      INTRINSIC          ABS, DBLE, INT, LOG, MAX, MOD, SQRT
64421
      INTRINSIC          ABS, DBLE, INT, LOG, MAX, MOD, SQRT
62671
*     ..
64422
*     ..
Line 62720... Line 64471...
62720
            LWMIN = 1
64471
            LWMIN = 1
62721
            LRWMIN = 1 + 4*N + 2*N**2
64472
            LRWMIN = 1 + 4*N + 2*N**2
62722
            LIWMIN = 3 + 5*N
64473
            LIWMIN = 3 + 5*N
62723
         END IF
64474
         END IF
62724
         WORK( 1 ) = LWMIN
64475
         WORK( 1 ) = LWMIN
62725
         RWORK( 1 ) = LRWMIN
64476
         RWORK( 1 ) = REAL( LRWMIN )
62726
         IWORK( 1 ) = LIWMIN
64477
         IWORK( 1 ) = LIWMIN
62727
*
64478
*
62728
         IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
64479
         IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN
62729
            INFO = -8
64480
            INFO = -8
62730
         ELSE IF( LRWORK.LT.LRWMIN .AND. .NOT.LQUERY ) THEN
64481
         ELSE IF( LRWORK.LT.LRWMIN .AND. .NOT.LQUERY ) THEN
Line 62832... Line 64583...
62832
            IF( M.GT.SMLSIZ ) THEN
64583
            IF( M.GT.SMLSIZ ) THEN
62833
*
64584
*
62834
*              Scale.
64585
*              Scale.
62835
*
64586
*
62836
               ORGNRM = DLANST( 'M', M, D( START ), E( START ) )
64587
               ORGNRM = DLANST( 'M', M, D( START ), E( START ) )
62837
               CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), M,
64588
               CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ),
-
 
64589
     $                      M,
62838
     $                      INFO )
64590
     $                      INFO )
62839
               CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M-1, 1, E( START ),
64591
               CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M-1, 1,
-
 
64592
     $                      E( START ),
62840
     $                      M-1, INFO )
64593
     $                      M-1, INFO )
62841
*
64594
*
62842
               CALL ZLAED0( N, M, D( START ), E( START ), Z( 1, START ),
64595
               CALL ZLAED0( N, M, D( START ), E( START ), Z( 1,
-
 
64596
     $                      START ),
62843
     $                      LDZ, WORK, N, RWORK, IWORK, INFO )
64597
     $                      LDZ, WORK, N, RWORK, IWORK, INFO )
62844
               IF( INFO.GT.0 ) THEN
64598
               IF( INFO.GT.0 ) THEN
62845
                  INFO = ( INFO / ( M+1 )+START-1 )*( N+1 ) +
64599
                  INFO = ( INFO / ( M+1 )+START-1 )*( N+1 ) +
62846
     $                   MOD( INFO, ( M+1 ) ) + START - 1
64600
     $                   MOD( INFO, ( M+1 ) ) + START - 1
62847
                  GO TO 70
64601
                  GO TO 70
62848
               END IF
64602
               END IF
62849
*
64603
*
62850
*              Scale back.
64604
*              Scale back.
62851
*
64605
*
62852
               CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, M, 1, D( START ), M,
64606
               CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, M, 1, D( START ),
-
 
64607
     $                      M,
62853
     $                      INFO )
64608
     $                      INFO )
62854
*
64609
*
62855
            ELSE
64610
            ELSE
62856
               CALL DSTEQR( 'I', M, D( START ), E( START ), RWORK, M,
64611
               CALL DSTEQR( 'I', M, D( START ), E( START ), RWORK, M,
62857
     $                      RWORK( M*M+1 ), INFO )
64612
     $                      RWORK( M*M+1 ), INFO )
62858
               CALL ZLACRM( N, M, Z( 1, START ), LDZ, RWORK, M, WORK, N,
64613
               CALL ZLACRM( N, M, Z( 1, START ), LDZ, RWORK, M, WORK,
-
 
64614
     $                      N,
62859
     $                      RWORK( M*M+1 ) )
64615
     $                      RWORK( M*M+1 ) )
62860
               CALL ZLACPY( 'A', N, M, WORK, N, Z( 1, START ), LDZ )
64616
               CALL ZLACPY( 'A', N, M, WORK, N, Z( 1, START ), LDZ )
62861
               IF( INFO.GT.0 ) THEN
64617
               IF( INFO.GT.0 ) THEN
62862
                  INFO = START*( N+1 ) + FINISH
64618
                  INFO = START*( N+1 ) + FINISH
62863
                  GO TO 70
64619
                  GO TO 70
Line 62891... Line 64647...
62891
   60    CONTINUE
64647
   60    CONTINUE
62892
      END IF
64648
      END IF
62893
*
64649
*
62894
   70 CONTINUE
64650
   70 CONTINUE
62895
      WORK( 1 ) = LWMIN
64651
      WORK( 1 ) = LWMIN
62896
      RWORK( 1 ) = LRWMIN
64652
      RWORK( 1 ) = REAL( LRWMIN )
62897
      IWORK( 1 ) = LIWMIN
64653
      IWORK( 1 ) = LIWMIN
62898
*
64654
*
62899
      RETURN
64655
      RETURN
62900
*
64656
*
62901
*     End of ZSTEDC
64657
*     End of ZSTEDC
Line 63069... Line 64825...
63069
      LOGICAL            LSAME
64825
      LOGICAL            LSAME
63070
      DOUBLE PRECISION   DLAMCH, DLANST, DLAPY2
64826
      DOUBLE PRECISION   DLAMCH, DLANST, DLAPY2
63071
      EXTERNAL           LSAME, DLAMCH, DLANST, DLAPY2
64827
      EXTERNAL           LSAME, DLAMCH, DLANST, DLAPY2
63072
*     ..
64828
*     ..
63073
*     .. External Subroutines ..
64829
*     .. External Subroutines ..
63074
      EXTERNAL           DLAE2, DLAEV2, DLARTG, DLASCL, DLASRT, XERBLA,
64830
      EXTERNAL           DLAE2, DLAEV2, DLARTG, DLASCL, DLASRT,
-
 
64831
     $                   XERBLA,
63075
     $                   ZLASET, ZLASR, ZSWAP
64832
     $                   ZLASET, ZLASR, ZSWAP
63076
*     ..
64833
*     ..
63077
*     .. Intrinsic Functions ..
64834
*     .. Intrinsic Functions ..
63078
      INTRINSIC          ABS, MAX, SIGN, SQRT
64835
      INTRINSIC          ABS, MAX, SIGN, SQRT
63079
*     ..
64836
*     ..
Line 63175... Line 64932...
63175
      ISCALE = 0
64932
      ISCALE = 0
63176
      IF( ANORM.EQ.ZERO )
64933
      IF( ANORM.EQ.ZERO )
63177
     $   GO TO 10
64934
     $   GO TO 10
63178
      IF( ANORM.GT.SSFMAX ) THEN
64935
      IF( ANORM.GT.SSFMAX ) THEN
63179
         ISCALE = 1
64936
         ISCALE = 1
63180
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
64937
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ),
-
 
64938
     $                N,
63181
     $                INFO )
64939
     $                INFO )
63182
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
64940
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
63183
     $                INFO )
64941
     $                INFO )
63184
      ELSE IF( ANORM.LT.SSFMIN ) THEN
64942
      ELSE IF( ANORM.LT.SSFMIN ) THEN
63185
         ISCALE = 2
64943
         ISCALE = 2
63186
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
64944
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ),
-
 
64945
     $                N,
63187
     $                INFO )
64946
     $                INFO )
63188
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
64947
         CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
63189
     $                INFO )
64948
     $                INFO )
63190
      END IF
64949
      END IF
63191
*
64950
*
Line 63224... Line 64983...
63224
*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
64983
*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
63225
*        to compute its eigensystem.
64984
*        to compute its eigensystem.
63226
*
64985
*
63227
         IF( M.EQ.L+1 ) THEN
64986
         IF( M.EQ.L+1 ) THEN
63228
            IF( ICOMPZ.GT.0 ) THEN
64987
            IF( ICOMPZ.GT.0 ) THEN
63229
               CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
64988
               CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C,
-
 
64989
     $                      S )
63230
               WORK( L ) = C
64990
               WORK( L ) = C
63231
               WORK( N-1+L ) = S
64991
               WORK( N-1+L ) = S
63232
               CALL ZLASR( 'R', 'V', 'B', N, 2, WORK( L ),
64992
               CALL ZLASR( 'R', 'V', 'B', N, 2, WORK( L ),
63233
     $                     WORK( N-1+L ), Z( 1, L ), LDZ )
64993
     $                     WORK( N-1+L ), Z( 1, L ), LDZ )
63234
            ELSE
64994
            ELSE
Line 63283... Line 65043...
63283
*
65043
*
63284
*        If eigenvectors are desired, then apply saved rotations.
65044
*        If eigenvectors are desired, then apply saved rotations.
63285
*
65045
*
63286
         IF( ICOMPZ.GT.0 ) THEN
65046
         IF( ICOMPZ.GT.0 ) THEN
63287
            MM = M - L + 1
65047
            MM = M - L + 1
63288
            CALL ZLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ),
65048
            CALL ZLASR( 'R', 'V', 'B', N, MM, WORK( L ),
-
 
65049
     $                  WORK( N-1+L ),
63289
     $                  Z( 1, L ), LDZ )
65050
     $                  Z( 1, L ), LDZ )
63290
         END IF
65051
         END IF
63291
*
65052
*
63292
         D( L ) = D( L ) - P
65053
         D( L ) = D( L ) - P
63293
         E( L ) = G
65054
         E( L ) = G
Line 63331... Line 65092...
63331
*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
65092
*        If remaining matrix is 2-by-2, use DLAE2 or SLAEV2
63332
*        to compute its eigensystem.
65093
*        to compute its eigensystem.
63333
*
65094
*
63334
         IF( M.EQ.L-1 ) THEN
65095
         IF( M.EQ.L-1 ) THEN
63335
            IF( ICOMPZ.GT.0 ) THEN
65096
            IF( ICOMPZ.GT.0 ) THEN
63336
               CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S )
65097
               CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C,
-
 
65098
     $                      S )
63337
               WORK( M ) = C
65099
               WORK( M ) = C
63338
               WORK( N-1+M ) = S
65100
               WORK( N-1+M ) = S
63339
               CALL ZLASR( 'R', 'V', 'F', N, 2, WORK( M ),
65101
               CALL ZLASR( 'R', 'V', 'F', N, 2, WORK( M ),
63340
     $                     WORK( N-1+M ), Z( 1, L-1 ), LDZ )
65102
     $                     WORK( N-1+M ), Z( 1, L-1 ), LDZ )
63341
            ELSE
65103
            ELSE
Line 63390... Line 65152...
63390
*
65152
*
63391
*        If eigenvectors are desired, then apply saved rotations.
65153
*        If eigenvectors are desired, then apply saved rotations.
63392
*
65154
*
63393
         IF( ICOMPZ.GT.0 ) THEN
65155
         IF( ICOMPZ.GT.0 ) THEN
63394
            MM = L - M + 1
65156
            MM = L - M + 1
63395
            CALL ZLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ),
65157
            CALL ZLASR( 'R', 'V', 'F', N, MM, WORK( M ),
-
 
65158
     $                  WORK( N-1+M ),
63396
     $                  Z( 1, M ), LDZ )
65159
     $                  Z( 1, M ), LDZ )
63397
         END IF
65160
         END IF
63398
*
65161
*
63399
         D( L ) = D( L ) - P
65162
         D( L ) = D( L ) - P
63400
         E( LM1 ) = G
65163
         E( LM1 ) = G
Line 63416... Line 65179...
63416
*
65179
*
63417
  140 CONTINUE
65180
  140 CONTINUE
63418
      IF( ISCALE.EQ.1 ) THEN
65181
      IF( ISCALE.EQ.1 ) THEN
63419
         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
65182
         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
63420
     $                D( LSV ), N, INFO )
65183
     $                D( LSV ), N, INFO )
63421
         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
65184
         CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1,
-
 
65185
     $                E( LSV ),
63422
     $                N, INFO )
65186
     $                N, INFO )
63423
      ELSE IF( ISCALE.EQ.2 ) THEN
65187
      ELSE IF( ISCALE.EQ.2 ) THEN
63424
         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
65188
         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
63425
     $                D( LSV ), N, INFO )
65189
     $                D( LSV ), N, INFO )
63426
         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
65190
         CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1,
-
 
65191
     $                E( LSV ),
63427
     $                N, INFO )
65192
     $                N, INFO )
63428
      END IF
65193
      END IF
63429
*
65194
*
63430
*     Check for no convergence to an eigenvalue after a total
65195
*     Check for no convergence to an eigenvalue after a total
63431
*     of N*MAXIT iterations.
65196
*     of N*MAXIT iterations.
Line 63863... Line 65628...
63863
*> \author NAG Ltd.
65628
*> \author NAG Ltd.
63864
*
65629
*
63865
*> \ingroup hemv
65630
*> \ingroup hemv
63866
*
65631
*
63867
*  =====================================================================
65632
*  =====================================================================
63868
      SUBROUTINE ZSYMV( UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY )
65633
      SUBROUTINE ZSYMV( UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y,
-
 
65634
     $                  INCY )
63869
*
65635
*
63870
*  -- LAPACK auxiliary routine --
65636
*  -- LAPACK auxiliary routine --
63871
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
65637
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
63872
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
65638
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
63873
*
65639
*
Line 63905... Line 65671...
63905
*     .. Executable Statements ..
65671
*     .. Executable Statements ..
63906
*
65672
*
63907
*     Test the input parameters.
65673
*     Test the input parameters.
63908
*
65674
*
63909
      INFO = 0
65675
      INFO = 0
-
 
65676
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
63910
      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
65677
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
63911
         INFO = 1
65678
         INFO = 1
63912
      ELSE IF( N.LT.0 ) THEN
65679
      ELSE IF( N.LT.0 ) THEN
63913
         INFO = 2
65680
         INFO = 2
63914
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
65681
      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
63915
         INFO = 5
65682
         INFO = 5
Line 64221... Line 65988...
64221
*     .. Executable Statements ..
65988
*     .. Executable Statements ..
64222
*
65989
*
64223
*     Test the input parameters.
65990
*     Test the input parameters.
64224
*
65991
*
64225
      INFO = 0
65992
      INFO = 0
-
 
65993
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
64226
      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
65994
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
64227
         INFO = 1
65995
         INFO = 1
64228
      ELSE IF( N.LT.0 ) THEN
65996
      ELSE IF( N.LT.0 ) THEN
64229
         INFO = 2
65997
         INFO = 2
64230
      ELSE IF( INCX.EQ.0 ) THEN
65998
      ELSE IF( INCX.EQ.0 ) THEN
64231
         INFO = 5
65999
         INFO = 5
Line 64796... Line 66564...
64796
*              element in row IMAX, and ROWMAX is its absolute value
66564
*              element in row IMAX, and ROWMAX is its absolute value
64797
*
66565
*
64798
               JMAX = K - 1 + IZAMAX( IMAX-K, A( IMAX, K ), LDA )
66566
               JMAX = K - 1 + IZAMAX( IMAX-K, A( IMAX, K ), LDA )
64799
               ROWMAX = CABS1( A( IMAX, JMAX ) )
66567
               ROWMAX = CABS1( A( IMAX, JMAX ) )
64800
               IF( IMAX.LT.N ) THEN
66568
               IF( IMAX.LT.N ) THEN
64801
                  JMAX = IMAX + IZAMAX( N-IMAX, A( IMAX+1, IMAX ), 1 )
66569
                  JMAX = IMAX + IZAMAX( N-IMAX, A( IMAX+1, IMAX ),
-
 
66570
     $                                  1 )
64802
                  ROWMAX = MAX( ROWMAX, CABS1( A( JMAX, IMAX ) ) )
66571
                  ROWMAX = MAX( ROWMAX, CABS1( A( JMAX, IMAX ) ) )
64803
               END IF
66572
               END IF
64804
*
66573
*
64805
               IF( ABSAKK.GE.ALPHA*COLMAX*( COLMAX / ROWMAX ) ) THEN
66574
               IF( ABSAKK.GE.ALPHA*COLMAX*( COLMAX / ROWMAX ) ) THEN
64806
*
66575
*
Line 64828... Line 66597...
64828
*
66597
*
64829
*              Interchange rows and columns KK and KP in the trailing
66598
*              Interchange rows and columns KK and KP in the trailing
64830
*              submatrix A(k:n,k:n)
66599
*              submatrix A(k:n,k:n)
64831
*
66600
*
64832
               IF( KP.LT.N )
66601
               IF( KP.LT.N )
64833
     $            CALL ZSWAP( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ), 1 )
66602
     $            CALL ZSWAP( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ),
-
 
66603
     $                        1 )
64834
               CALL ZSWAP( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
66604
               CALL ZSWAP( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
64835
     $                     LDA )
66605
     $                     LDA )
64836
               T = A( KK, KK )
66606
               T = A( KK, KK )
64837
               A( KK, KK ) = A( KP, KP )
66607
               A( KK, KK ) = A( KP, KP )
64838
               A( KP, KP ) = T
66608
               A( KP, KP ) = T
Line 65172... Line 66942...
65172
      LDWORK = N
66942
      LDWORK = N
65173
      IF( NB.GT.1 .AND. NB.LT.N ) THEN
66943
      IF( NB.GT.1 .AND. NB.LT.N ) THEN
65174
         IWS = LDWORK*NB
66944
         IWS = LDWORK*NB
65175
         IF( LWORK.LT.IWS ) THEN
66945
         IF( LWORK.LT.IWS ) THEN
65176
            NB = MAX( LWORK / LDWORK, 1 )
66946
            NB = MAX( LWORK / LDWORK, 1 )
65177
            NBMIN = MAX( 2, ILAENV( 2, 'ZSYTRF', UPLO, N, -1, -1, -1 ) )
66947
            NBMIN = MAX( 2, ILAENV( 2, 'ZSYTRF', UPLO, N, -1, -1,
-
 
66948
     $                   -1 ) )
65178
         END IF
66949
         END IF
65179
      ELSE
66950
      ELSE
65180
         IWS = 1
66951
         IWS = 1
65181
      END IF
66952
      END IF
65182
      IF( NB.LT.NBMIN )
66953
      IF( NB.LT.NBMIN )
Line 65201... Line 66972...
65201
         IF( K.GT.NB ) THEN
66972
         IF( K.GT.NB ) THEN
65202
*
66973
*
65203
*           Factorize columns k-kb+1:k of A and use blocked code to
66974
*           Factorize columns k-kb+1:k of A and use blocked code to
65204
*           update columns 1:k-kb
66975
*           update columns 1:k-kb
65205
*
66976
*
65206
            CALL ZLASYF( UPLO, K, NB, KB, A, LDA, IPIV, WORK, N, IINFO )
66977
            CALL ZLASYF( UPLO, K, NB, KB, A, LDA, IPIV, WORK, N,
-
 
66978
     $                   IINFO )
65207
         ELSE
66979
         ELSE
65208
*
66980
*
65209
*           Use unblocked code to factorize columns 1:k of A
66981
*           Use unblocked code to factorize columns 1:k of A
65210
*
66982
*
65211
            CALL ZSYTF2( UPLO, K, A, LDA, IPIV, IINFO )
66983
            CALL ZSYTF2( UPLO, K, A, LDA, IPIV, IINFO )
Line 65241... Line 67013...
65241
         IF( K.LE.N-NB ) THEN
67013
         IF( K.LE.N-NB ) THEN
65242
*
67014
*
65243
*           Factorize columns k:k+kb-1 of A and use blocked code to
67015
*           Factorize columns k:k+kb-1 of A and use blocked code to
65244
*           update columns k+kb:n
67016
*           update columns k+kb:n
65245
*
67017
*
65246
            CALL ZLASYF( UPLO, N-K+1, NB, KB, A( K, K ), LDA, IPIV( K ),
67018
            CALL ZLASYF( UPLO, N-K+1, NB, KB, A( K, K ), LDA,
-
 
67019
     $                   IPIV( K ),
65247
     $                   WORK, N, IINFO )
67020
     $                   WORK, N, IINFO )
65248
         ELSE
67021
         ELSE
65249
*
67022
*
65250
*           Use unblocked code to factorize columns k:n of A
67023
*           Use unblocked code to factorize columns k:n of A
65251
*
67024
*
65252
            CALL ZSYTF2( UPLO, N-K+1, A( K, K ), LDA, IPIV( K ), IINFO )
67025
            CALL ZSYTF2( UPLO, N-K+1, A( K, K ), LDA, IPIV( K ),
-
 
67026
     $                   IINFO )
65253
            KB = N - K + 1
67027
            KB = N - K + 1
65254
         END IF
67028
         END IF
65255
*
67029
*
65256
*        Set INFO on the first occurrence of a zero pivot
67030
*        Set INFO on the first occurrence of a zero pivot
65257
*
67031
*
Line 65503... Line 67277...
65503
*
67277
*
65504
            IF( K.GT.1 ) THEN
67278
            IF( K.GT.1 ) THEN
65505
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
67279
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
65506
               CALL ZSYMV( UPLO, K-1, -ONE, A, LDA, WORK, 1, ZERO,
67280
               CALL ZSYMV( UPLO, K-1, -ONE, A, LDA, WORK, 1, ZERO,
65507
     $                     A( 1, K ), 1 )
67281
     $                     A( 1, K ), 1 )
65508
               A( K, K ) = A( K, K ) - ZDOTU( K-1, WORK, 1, A( 1, K ),
67282
               A( K, K ) = A( K, K ) - ZDOTU( K-1, WORK, 1, A( 1,
-
 
67283
     $            K ),
65509
     $                     1 )
67284
     $                     1 )
65510
            END IF
67285
            END IF
65511
            KSTEP = 1
67286
            KSTEP = 1
65512
         ELSE
67287
         ELSE
65513
*
67288
*
Line 65528... Line 67303...
65528
*
67303
*
65529
            IF( K.GT.1 ) THEN
67304
            IF( K.GT.1 ) THEN
65530
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
67305
               CALL ZCOPY( K-1, A( 1, K ), 1, WORK, 1 )
65531
               CALL ZSYMV( UPLO, K-1, -ONE, A, LDA, WORK, 1, ZERO,
67306
               CALL ZSYMV( UPLO, K-1, -ONE, A, LDA, WORK, 1, ZERO,
65532
     $                     A( 1, K ), 1 )
67307
     $                     A( 1, K ), 1 )
65533
               A( K, K ) = A( K, K ) - ZDOTU( K-1, WORK, 1, A( 1, K ),
67308
               A( K, K ) = A( K, K ) - ZDOTU( K-1, WORK, 1, A( 1,
-
 
67309
     $            K ),
65534
     $                     1 )
67310
     $                     1 )
65535
               A( K, K+1 ) = A( K, K+1 ) -
67311
               A( K, K+1 ) = A( K, K+1 ) -
65536
     $                       ZDOTU( K-1, A( 1, K ), 1, A( 1, K+1 ), 1 )
67312
     $                       ZDOTU( K-1, A( 1, K ), 1, A( 1, K+1 ),
-
 
67313
     $                              1 )
65537
               CALL ZCOPY( K-1, A( 1, K+1 ), 1, WORK, 1 )
67314
               CALL ZCOPY( K-1, A( 1, K+1 ), 1, WORK, 1 )
65538
               CALL ZSYMV( UPLO, K-1, -ONE, A, LDA, WORK, 1, ZERO,
67315
               CALL ZSYMV( UPLO, K-1, -ONE, A, LDA, WORK, 1, ZERO,
65539
     $                     A( 1, K+1 ), 1 )
67316
     $                     A( 1, K+1 ), 1 )
65540
               A( K+1, K+1 ) = A( K+1, K+1 ) -
67317
               A( K+1, K+1 ) = A( K+1, K+1 ) -
65541
     $                         ZDOTU( K-1, WORK, 1, A( 1, K+1 ), 1 )
67318
     $                         ZDOTU( K-1, WORK, 1, A( 1, K+1 ), 1 )
Line 65590... Line 67367...
65590
*
67367
*
65591
*           Compute column K of the inverse.
67368
*           Compute column K of the inverse.
65592
*
67369
*
65593
            IF( K.LT.N ) THEN
67370
            IF( K.LT.N ) THEN
65594
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
67371
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
65595
               CALL ZSYMV( UPLO, N-K, -ONE, A( K+1, K+1 ), LDA, WORK, 1,
67372
               CALL ZSYMV( UPLO, N-K, -ONE, A( K+1, K+1 ), LDA, WORK,
-
 
67373
     $                     1,
65596
     $                     ZERO, A( K+1, K ), 1 )
67374
     $                     ZERO, A( K+1, K ), 1 )
65597
               A( K, K ) = A( K, K ) - ZDOTU( N-K, WORK, 1, A( K+1, K ),
67375
               A( K, K ) = A( K, K ) - ZDOTU( N-K, WORK, 1, A( K+1,
-
 
67376
     $            K ),
65598
     $                     1 )
67377
     $                     1 )
65599
            END IF
67378
            END IF
65600
            KSTEP = 1
67379
            KSTEP = 1
65601
         ELSE
67380
         ELSE
65602
*
67381
*
Line 65615... Line 67394...
65615
*
67394
*
65616
*           Compute columns K-1 and K of the inverse.
67395
*           Compute columns K-1 and K of the inverse.
65617
*
67396
*
65618
            IF( K.LT.N ) THEN
67397
            IF( K.LT.N ) THEN
65619
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
67398
               CALL ZCOPY( N-K, A( K+1, K ), 1, WORK, 1 )
65620
               CALL ZSYMV( UPLO, N-K, -ONE, A( K+1, K+1 ), LDA, WORK, 1,
67399
               CALL ZSYMV( UPLO, N-K, -ONE, A( K+1, K+1 ), LDA, WORK,
-
 
67400
     $                     1,
65621
     $                     ZERO, A( K+1, K ), 1 )
67401
     $                     ZERO, A( K+1, K ), 1 )
65622
               A( K, K ) = A( K, K ) - ZDOTU( N-K, WORK, 1, A( K+1, K ),
67402
               A( K, K ) = A( K, K ) - ZDOTU( N-K, WORK, 1, A( K+1,
-
 
67403
     $            K ),
65623
     $                     1 )
67404
     $                     1 )
65624
               A( K, K-1 ) = A( K, K-1 ) -
67405
               A( K, K-1 ) = A( K, K-1 ) -
65625
     $                       ZDOTU( N-K, A( K+1, K ), 1, A( K+1, K-1 ),
67406
     $                       ZDOTU( N-K, A( K+1, K ), 1, A( K+1,
-
 
67407
     $                              K-1 ),
65626
     $                       1 )
67408
     $                       1 )
65627
               CALL ZCOPY( N-K, A( K+1, K-1 ), 1, WORK, 1 )
67409
               CALL ZCOPY( N-K, A( K+1, K-1 ), 1, WORK, 1 )
65628
               CALL ZSYMV( UPLO, N-K, -ONE, A( K+1, K+1 ), LDA, WORK, 1,
67410
               CALL ZSYMV( UPLO, N-K, -ONE, A( K+1, K+1 ), LDA, WORK,
-
 
67411
     $                     1,
65629
     $                     ZERO, A( K+1, K-1 ), 1 )
67412
     $                     ZERO, A( K+1, K-1 ), 1 )
65630
               A( K-1, K-1 ) = A( K-1, K-1 ) -
67413
               A( K-1, K-1 ) = A( K-1, K-1 ) -
65631
     $                         ZDOTU( N-K, WORK, 1, A( K+1, K-1 ), 1 )
67414
     $                         ZDOTU( N-K, WORK, 1, A( K+1, K-1 ),
-
 
67415
     $                                1 )
65632
            END IF
67416
            END IF
65633
            KSTEP = 2
67417
            KSTEP = 2
65634
         END IF
67418
         END IF
65635
*
67419
*
65636
         KP = ABS( IPIV( K ) )
67420
         KP = ABS( IPIV( K ) )
Line 65869... Line 67653...
65869
     $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
67653
     $         CALL ZSWAP( NRHS, B( K, 1 ), LDB, B( KP, 1 ), LDB )
65870
*
67654
*
65871
*           Multiply by inv(U(K)), where U(K) is the transformation
67655
*           Multiply by inv(U(K)), where U(K) is the transformation
65872
*           stored in column K of A.
67656
*           stored in column K of A.
65873
*
67657
*
65874
            CALL ZGERU( K-1, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ), LDB,
67658
            CALL ZGERU( K-1, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ),
-
 
67659
     $                  LDB,
65875
     $                  B( 1, 1 ), LDB )
67660
     $                  B( 1, 1 ), LDB )
65876
*
67661
*
65877
*           Multiply by the inverse of the diagonal block.
67662
*           Multiply by the inverse of the diagonal block.
65878
*
67663
*
65879
            CALL ZSCAL( NRHS, ONE / A( K, K ), B( K, 1 ), LDB )
67664
            CALL ZSCAL( NRHS, ONE / A( K, K ), B( K, 1 ), LDB )
Line 65889... Line 67674...
65889
     $         CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ), LDB )
67674
     $         CALL ZSWAP( NRHS, B( K-1, 1 ), LDB, B( KP, 1 ), LDB )
65890
*
67675
*
65891
*           Multiply by inv(U(K)), where U(K) is the transformation
67676
*           Multiply by inv(U(K)), where U(K) is the transformation
65892
*           stored in columns K-1 and K of A.
67677
*           stored in columns K-1 and K of A.
65893
*
67678
*
65894
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ), LDB,
67679
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K ), 1, B( K, 1 ),
-
 
67680
     $                  LDB,
65895
     $                  B( 1, 1 ), LDB )
67681
     $                  B( 1, 1 ), LDB )
65896
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K-1 ), 1, B( K-1, 1 ),
67682
            CALL ZGERU( K-2, NRHS, -ONE, A( 1, K-1 ), 1, B( K-1, 1 ),
65897
     $                  LDB, B( 1, 1 ), LDB )
67683
     $                  LDB, B( 1, 1 ), LDB )
65898
*
67684
*
65899
*           Multiply by the inverse of the diagonal block.
67685
*           Multiply by the inverse of the diagonal block.
Line 65932... Line 67718...
65932
*           1 x 1 diagonal block
67718
*           1 x 1 diagonal block
65933
*
67719
*
65934
*           Multiply by inv(U**T(K)), where U(K) is the transformation
67720
*           Multiply by inv(U**T(K)), where U(K) is the transformation
65935
*           stored in column K of A.
67721
*           stored in column K of A.
65936
*
67722
*
65937
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB, A( 1, K ),
67723
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB, A( 1,
-
 
67724
     $                  K ),
65938
     $                  1, ONE, B( K, 1 ), LDB )
67725
     $                  1, ONE, B( K, 1 ), LDB )
65939
*
67726
*
65940
*           Interchange rows K and IPIV(K).
67727
*           Interchange rows K and IPIV(K).
65941
*
67728
*
65942
            KP = IPIV( K )
67729
            KP = IPIV( K )
Line 65948... Line 67735...
65948
*           2 x 2 diagonal block
67735
*           2 x 2 diagonal block
65949
*
67736
*
65950
*           Multiply by inv(U**T(K+1)), where U(K+1) is the transformation
67737
*           Multiply by inv(U**T(K+1)), where U(K+1) is the transformation
65951
*           stored in columns K and K+1 of A.
67738
*           stored in columns K and K+1 of A.
65952
*
67739
*
65953
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB, A( 1, K ),
67740
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB, A( 1,
-
 
67741
     $                  K ),
65954
     $                  1, ONE, B( K, 1 ), LDB )
67742
     $                  1, ONE, B( K, 1 ), LDB )
65955
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB,
67743
            CALL ZGEMV( 'Transpose', K-1, NRHS, -ONE, B, LDB,
65956
     $                  A( 1, K+1 ), 1, ONE, B( K+1, 1 ), LDB )
67744
     $                  A( 1, K+1 ), 1, ONE, B( K+1, 1 ), LDB )
65957
*
67745
*
65958
*           Interchange rows K and -IPIV(K).
67746
*           Interchange rows K and -IPIV(K).
Line 65995... Line 67783...
65995
*
67783
*
65996
*           Multiply by inv(L(K)), where L(K) is the transformation
67784
*           Multiply by inv(L(K)), where L(K) is the transformation
65997
*           stored in column K of A.
67785
*           stored in column K of A.
65998
*
67786
*
65999
            IF( K.LT.N )
67787
            IF( K.LT.N )
66000
     $         CALL ZGERU( N-K, NRHS, -ONE, A( K+1, K ), 1, B( K, 1 ),
67788
     $         CALL ZGERU( N-K, NRHS, -ONE, A( K+1, K ), 1, B( K,
-
 
67789
     $                     1 ),
66001
     $                     LDB, B( K+1, 1 ), LDB )
67790
     $                     LDB, B( K+1, 1 ), LDB )
66002
*
67791
*
66003
*           Multiply by the inverse of the diagonal block.
67792
*           Multiply by the inverse of the diagonal block.
66004
*
67793
*
66005
            CALL ZSCAL( NRHS, ONE / A( K, K ), B( K, 1 ), LDB )
67794
            CALL ZSCAL( NRHS, ONE / A( K, K ), B( K, 1 ), LDB )
Line 66016... Line 67805...
66016
*
67805
*
66017
*           Multiply by inv(L(K)), where L(K) is the transformation
67806
*           Multiply by inv(L(K)), where L(K) is the transformation
66018
*           stored in columns K and K+1 of A.
67807
*           stored in columns K and K+1 of A.
66019
*
67808
*
66020
            IF( K.LT.N-1 ) THEN
67809
            IF( K.LT.N-1 ) THEN
66021
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K ), 1, B( K, 1 ),
67810
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K ), 1, B( K,
-
 
67811
     $                     1 ),
66022
     $                     LDB, B( K+2, 1 ), LDB )
67812
     $                     LDB, B( K+2, 1 ), LDB )
66023
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K+1 ), 1,
67813
               CALL ZGERU( N-K-1, NRHS, -ONE, A( K+2, K+1 ), 1,
66024
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
67814
     $                     B( K+1, 1 ), LDB, B( K+2, 1 ), LDB )
66025
            END IF
67815
            END IF
66026
*
67816
*
Line 66631... Line 68421...
66631
  100          CONTINUE
68421
  100          CONTINUE
66632
*
68422
*
66633
*              Back transform eigenvector if HOWMNY='B'.
68423
*              Back transform eigenvector if HOWMNY='B'.
66634
*
68424
*
66635
               IF( ILBACK ) THEN
68425
               IF( ILBACK ) THEN
66636
                  CALL ZGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ), LDVL,
68426
                  CALL ZGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ),
-
 
68427
     $                        LDVL,
66637
     $                        WORK( JE ), 1, CZERO, WORK( N+1 ), 1 )
68428
     $                        WORK( JE ), 1, CZERO, WORK( N+1 ), 1 )
66638
                  ISRC = 2
68429
                  ISRC = 2
66639
                  IBEG = 1
68430
                  IBEG = 1
66640
               ELSE
68431
               ELSE
66641
                  ISRC = 1
68432
                  ISRC = 1
Line 67152... Line 68943...
67152
*           F-norm((B-QL**H*T*QR)) <= O(EPS*F-norm((B)))
68943
*           F-norm((B-QL**H*T*QR)) <= O(EPS*F-norm((B)))
67153
*
68944
*
67154
         CALL ZLACPY( 'Full', M, M, S, LDST, WORK, M )
68945
         CALL ZLACPY( 'Full', M, M, S, LDST, WORK, M )
67155
         CALL ZLACPY( 'Full', M, M, T, LDST, WORK( M*M+1 ), M )
68946
         CALL ZLACPY( 'Full', M, M, T, LDST, WORK( M*M+1 ), M )
67156
         CALL ZROT( 2, WORK, 1, WORK( 3 ), 1, CZ, -DCONJG( SZ ) )
68947
         CALL ZROT( 2, WORK, 1, WORK( 3 ), 1, CZ, -DCONJG( SZ ) )
67157
         CALL ZROT( 2, WORK( 5 ), 1, WORK( 7 ), 1, CZ, -DCONJG( SZ ) )
68948
         CALL ZROT( 2, WORK( 5 ), 1, WORK( 7 ), 1, CZ,
-
 
68949
     $              -DCONJG( SZ ) )
67158
         CALL ZROT( 2, WORK, 2, WORK( 2 ), 2, CQ, -SQ )
68950
         CALL ZROT( 2, WORK, 2, WORK( 2 ), 2, CQ, -SQ )
67159
         CALL ZROT( 2, WORK( 5 ), 2, WORK( 6 ), 2, CQ, -SQ )
68951
         CALL ZROT( 2, WORK( 5 ), 2, WORK( 6 ), 2, CQ, -SQ )
67160
         DO 10 I = 1, 2
68952
         DO 10 I = 1, 2
67161
            WORK( I ) = WORK( I ) - A( J1+I-1, J1 )
68953
            WORK( I ) = WORK( I ) - A( J1+I-1, J1 )
67162
            WORK( I+2 ) = WORK( I+2 ) - A( J1+I-1, J1+1 )
68954
            WORK( I+2 ) = WORK( I+2 ) - A( J1+I-1, J1+1 )
Line 67181... Line 68973...
67181
*
68973
*
67182
      CALL ZROT( J1+1, A( 1, J1 ), 1, A( 1, J1+1 ), 1, CZ,
68974
      CALL ZROT( J1+1, A( 1, J1 ), 1, A( 1, J1+1 ), 1, CZ,
67183
     $           DCONJG( SZ ) )
68975
     $           DCONJG( SZ ) )
67184
      CALL ZROT( J1+1, B( 1, J1 ), 1, B( 1, J1+1 ), 1, CZ,
68976
      CALL ZROT( J1+1, B( 1, J1 ), 1, B( 1, J1+1 ), 1, CZ,
67185
     $           DCONJG( SZ ) )
68977
     $           DCONJG( SZ ) )
67186
      CALL ZROT( N-J1+1, A( J1, J1 ), LDA, A( J1+1, J1 ), LDA, CQ, SQ )
68978
      CALL ZROT( N-J1+1, A( J1, J1 ), LDA, A( J1+1, J1 ), LDA, CQ,
-
 
68979
     $           SQ )
67187
      CALL ZROT( N-J1+1, B( J1, J1 ), LDB, B( J1+1, J1 ), LDB, CQ, SQ )
68980
      CALL ZROT( N-J1+1, B( J1, J1 ), LDB, B( J1+1, J1 ), LDB, CQ,
-
 
68981
     $           SQ )
67188
*
68982
*
67189
*     Set  N1 by N2 (2,1) blocks to 0
68983
*     Set  N1 by N2 (2,1) blocks to 0
67190
*
68984
*
67191
      A( J1+1, J1 ) = CZERO
68985
      A( J1+1, J1 ) = CZERO
67192
      B( J1+1, J1 ) = CZERO
68986
      B( J1+1, J1 ) = CZERO
Line 67474... Line 69268...
67474
*
69268
*
67475
   10    CONTINUE
69269
   10    CONTINUE
67476
*
69270
*
67477
*        Swap with next one below
69271
*        Swap with next one below
67478
*
69272
*
67479
         CALL ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ,
69273
         CALL ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
-
 
69274
     $                LDZ,
67480
     $                HERE, INFO )
69275
     $                HERE, INFO )
67481
         IF( INFO.NE.0 ) THEN
69276
         IF( INFO.NE.0 ) THEN
67482
            ILST = HERE
69277
            ILST = HERE
67483
            RETURN
69278
            RETURN
67484
         END IF
69279
         END IF
Line 67491... Line 69286...
67491
*
69286
*
67492
   20    CONTINUE
69287
   20    CONTINUE
67493
*
69288
*
67494
*        Swap with next one above
69289
*        Swap with next one above
67495
*
69290
*
67496
         CALL ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ,
69291
         CALL ZTGEX2( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
-
 
69292
     $                LDZ,
67497
     $                HERE, INFO )
69293
     $                HERE, INFO )
67498
         IF( INFO.NE.0 ) THEN
69294
         IF( INFO.NE.0 ) THEN
67499
            ILST = HERE
69295
            ILST = HERE
67500
            RETURN
69296
            RETURN
67501
         END IF
69297
         END IF
Line 67937... Line 69733...
67937
*>      Sweden, December 1993, Revised April 1994, Also as LAPACK working
69733
*>      Sweden, December 1993, Revised April 1994, Also as LAPACK working
67938
*>      Note 75. To appear in ACM Trans. on Math. Software, Vol 22, No 1,
69734
*>      Note 75. To appear in ACM Trans. on Math. Software, Vol 22, No 1,
67939
*>      1996.
69735
*>      1996.
67940
*>
69736
*>
67941
*  =====================================================================
69737
*  =====================================================================
67942
      SUBROUTINE ZTGSEN( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
69738
      SUBROUTINE ZTGSEN( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B,
-
 
69739
     $                   LDB,
67943
     $                   ALPHA, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF,
69740
     $                   ALPHA, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF,
67944
     $                   WORK, LWORK, IWORK, LIWORK, INFO )
69741
     $                   WORK, LWORK, IWORK, LIWORK, INFO )
67945
*
69742
*
67946
*  -- LAPACK computational routine --
69743
*  -- LAPACK computational routine --
67947
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
69744
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 67978... Line 69775...
67978
*     ..
69775
*     ..
67979
*     .. Local Arrays ..
69776
*     .. Local Arrays ..
67980
      INTEGER            ISAVE( 3 )
69777
      INTEGER            ISAVE( 3 )
67981
*     ..
69778
*     ..
67982
*     .. External Subroutines ..
69779
*     .. External Subroutines ..
67983
      EXTERNAL           XERBLA, ZLACN2, ZLACPY, ZLASSQ, ZSCAL, ZTGEXC,
69780
      EXTERNAL           XERBLA, ZLACN2, ZLACPY, ZLASSQ, ZSCAL,
-
 
69781
     $                   ZTGEXC,
67984
     $                   ZTGSYL
69782
     $                   ZTGSYL
67985
*     ..
69783
*     ..
67986
*     .. Intrinsic Functions ..
69784
*     .. Intrinsic Functions ..
67987
      INTRINSIC          ABS, DCMPLX, DCONJG, MAX, SQRT
69785
      INTRINSIC          ABS, DCMPLX, DCONJG, MAX, SQRT
67988
*     ..
69786
*     ..
Line 68102... Line 69900...
68102
*
69900
*
68103
*           Swap the K-th block to position KS. Compute unitary Q
69901
*           Swap the K-th block to position KS. Compute unitary Q
68104
*           and Z that will swap adjacent diagonal blocks in (A, B).
69902
*           and Z that will swap adjacent diagonal blocks in (A, B).
68105
*
69903
*
68106
            IF( K.NE.KS )
69904
            IF( K.NE.KS )
68107
     $         CALL ZTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z,
69905
     $         CALL ZTGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ,
-
 
69906
     $                      Z,
68108
     $                      LDZ, K, KS, IERR )
69907
     $                      LDZ, K, KS, IERR )
68109
*
69908
*
68110
            IF( IERR.GT.0 ) THEN
69909
            IF( IERR.GT.0 ) THEN
68111
*
69910
*
68112
*              Swap is rejected: exit.
69911
*              Swap is rejected: exit.
Line 68132... Line 69931...
68132
*
69931
*
68133
         N1 = M
69932
         N1 = M
68134
         N2 = N - M
69933
         N2 = N - M
68135
         I = N1 + 1
69934
         I = N1 + 1
68136
         CALL ZLACPY( 'Full', N1, N2, A( 1, I ), LDA, WORK, N1 )
69935
         CALL ZLACPY( 'Full', N1, N2, A( 1, I ), LDA, WORK, N1 )
68137
         CALL ZLACPY( 'Full', N1, N2, B( 1, I ), LDB, WORK( N1*N2+1 ),
69936
         CALL ZLACPY( 'Full', N1, N2, B( 1, I ), LDB,
-
 
69937
     $                WORK( N1*N2+1 ),
68138
     $                N1 )
69938
     $                N1 )
68139
         IJB = 0
69939
         IJB = 0
68140
         CALL ZTGSYL( 'N', IJB, N1, N2, A, LDA, A( I, I ), LDA, WORK,
69940
         CALL ZTGSYL( 'N', IJB, N1, N2, A, LDA, A( I, I ), LDA, WORK,
68141
     $                N1, B, LDB, B( I, I ), LDB, WORK( N1*N2+1 ), N1,
69941
     $                N1, B, LDB, B( I, I ), LDB, WORK( N1*N2+1 ), N1,
68142
     $                DSCALE, DIF( 1 ), WORK( N1*N2*2+1 ),
69942
     $                DSCALE, DIF( 1 ), WORK( N1*N2*2+1 ),
Line 68174... Line 69974...
68174
            I = N1 + 1
69974
            I = N1 + 1
68175
            IJB = IDIFJB
69975
            IJB = IDIFJB
68176
*
69976
*
68177
*           Frobenius norm-based Difu estimate.
69977
*           Frobenius norm-based Difu estimate.
68178
*
69978
*
68179
            CALL ZTGSYL( 'N', IJB, N1, N2, A, LDA, A( I, I ), LDA, WORK,
69979
            CALL ZTGSYL( 'N', IJB, N1, N2, A, LDA, A( I, I ), LDA,
-
 
69980
     $                   WORK,
68180
     $                   N1, B, LDB, B( I, I ), LDB, WORK( N1*N2+1 ),
69981
     $                   N1, B, LDB, B( I, I ), LDB, WORK( N1*N2+1 ),
68181
     $                   N1, DSCALE, DIF( 1 ), WORK( N1*N2*2+1 ),
69982
     $                   N1, DSCALE, DIF( 1 ), WORK( N1*N2*2+1 ),
68182
     $                   LWORK-2*N1*N2, IWORK, IERR )
69983
     $                   LWORK-2*N1*N2, IWORK, IERR )
68183
*
69984
*
68184
*           Frobenius norm-based Difl estimate.
69985
*           Frobenius norm-based Difl estimate.
68185
*
69986
*
68186
            CALL ZTGSYL( 'N', IJB, N2, N1, A( I, I ), LDA, A, LDA, WORK,
69987
            CALL ZTGSYL( 'N', IJB, N2, N1, A( I, I ), LDA, A, LDA,
-
 
69988
     $                   WORK,
68187
     $                   N2, B( I, I ), LDB, B, LDB, WORK( N1*N2+1 ),
69989
     $                   N2, B( I, I ), LDB, B, LDB, WORK( N1*N2+1 ),
68188
     $                   N2, DSCALE, DIF( 2 ), WORK( N1*N2*2+1 ),
69990
     $                   N2, DSCALE, DIF( 2 ), WORK( N1*N2*2+1 ),
68189
     $                   LWORK-2*N1*N2, IWORK, IERR )
69991
     $                   LWORK-2*N1*N2, IWORK, IERR )
68190
         ELSE
69992
         ELSE
68191
*
69993
*
Line 68209... Line 70011...
68209
            IF( KASE.NE.0 ) THEN
70011
            IF( KASE.NE.0 ) THEN
68210
               IF( KASE.EQ.1 ) THEN
70012
               IF( KASE.EQ.1 ) THEN
68211
*
70013
*
68212
*                 Solve generalized Sylvester equation
70014
*                 Solve generalized Sylvester equation
68213
*
70015
*
68214
                  CALL ZTGSYL( 'N', IJB, N1, N2, A, LDA, A( I, I ), LDA,
70016
                  CALL ZTGSYL( 'N', IJB, N1, N2, A, LDA, A( I, I ),
-
 
70017
     $                         LDA,
68215
     $                         WORK, N1, B, LDB, B( I, I ), LDB,
70018
     $                         WORK, N1, B, LDB, B( I, I ), LDB,
68216
     $                         WORK( N1*N2+1 ), N1, DSCALE, DIF( 1 ),
70019
     $                         WORK( N1*N2+1 ), N1, DSCALE, DIF( 1 ),
68217
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
70020
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
68218
     $                         IERR )
70021
     $                         IERR )
68219
               ELSE
70022
               ELSE
68220
*
70023
*
68221
*                 Solve the transposed variant.
70024
*                 Solve the transposed variant.
68222
*
70025
*
68223
                  CALL ZTGSYL( 'C', IJB, N1, N2, A, LDA, A( I, I ), LDA,
70026
                  CALL ZTGSYL( 'C', IJB, N1, N2, A, LDA, A( I, I ),
-
 
70027
     $                         LDA,
68224
     $                         WORK, N1, B, LDB, B( I, I ), LDB,
70028
     $                         WORK, N1, B, LDB, B( I, I ), LDB,
68225
     $                         WORK( N1*N2+1 ), N1, DSCALE, DIF( 1 ),
70029
     $                         WORK( N1*N2+1 ), N1, DSCALE, DIF( 1 ),
68226
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
70030
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
68227
     $                         IERR )
70031
     $                         IERR )
68228
               END IF
70032
               END IF
Line 68238... Line 70042...
68238
            IF( KASE.NE.0 ) THEN
70042
            IF( KASE.NE.0 ) THEN
68239
               IF( KASE.EQ.1 ) THEN
70043
               IF( KASE.EQ.1 ) THEN
68240
*
70044
*
68241
*                 Solve generalized Sylvester equation
70045
*                 Solve generalized Sylvester equation
68242
*
70046
*
68243
                  CALL ZTGSYL( 'N', IJB, N2, N1, A( I, I ), LDA, A, LDA,
70047
                  CALL ZTGSYL( 'N', IJB, N2, N1, A( I, I ), LDA, A,
-
 
70048
     $                         LDA,
68244
     $                         WORK, N2, B( I, I ), LDB, B, LDB,
70049
     $                         WORK, N2, B( I, I ), LDB, B, LDB,
68245
     $                         WORK( N1*N2+1 ), N2, DSCALE, DIF( 2 ),
70050
     $                         WORK( N1*N2+1 ), N2, DSCALE, DIF( 2 ),
68246
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
70051
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
68247
     $                         IERR )
70052
     $                         IERR )
68248
               ELSE
70053
               ELSE
68249
*
70054
*
68250
*                 Solve the transposed variant.
70055
*                 Solve the transposed variant.
68251
*
70056
*
68252
                  CALL ZTGSYL( 'C', IJB, N2, N1, A( I, I ), LDA, A, LDA,
70057
                  CALL ZTGSYL( 'C', IJB, N2, N1, A( I, I ), LDA, A,
-
 
70058
     $                         LDA,
68253
     $                         WORK, N2, B, LDB, B( I, I ), LDB,
70059
     $                         WORK, N2, B, LDB, B( I, I ), LDB,
68254
     $                         WORK( N1*N2+1 ), N2, DSCALE, DIF( 2 ),
70060
     $                         WORK( N1*N2+1 ), N2, DSCALE, DIF( 2 ),
68255
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
70061
     $                         WORK( N1*N2*2+1 ), LWORK-2*N1*N2, IWORK,
68256
     $                         IERR )
70062
     $                         IERR )
68257
               END IF
70063
               END IF
Line 68547... Line 70353...
68547
*>
70353
*>
68548
*>     Bo Kagstrom and Peter Poromaa, Department of Computing Science,
70354
*>     Bo Kagstrom and Peter Poromaa, Department of Computing Science,
68549
*>     Umea University, S-901 87 Umea, Sweden.
70355
*>     Umea University, S-901 87 Umea, Sweden.
68550
*
70356
*
68551
*  =====================================================================
70357
*  =====================================================================
68552
      SUBROUTINE ZTGSY2( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D,
70358
      SUBROUTINE ZTGSY2( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC,
-
 
70359
     $                   D,
68553
     $                   LDD, E, LDE, F, LDF, SCALE, RDSUM, RDSCAL,
70360
     $                   LDD, E, LDE, F, LDF, SCALE, RDSUM, RDSCAL,
68554
     $                   INFO )
70361
     $                   INFO )
68555
*
70362
*
68556
*  -- LAPACK auxiliary routine --
70363
*  -- LAPACK auxiliary routine --
68557
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
70364
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 68587... Line 70394...
68587
*     .. External Functions ..
70394
*     .. External Functions ..
68588
      LOGICAL            LSAME
70395
      LOGICAL            LSAME
68589
      EXTERNAL           LSAME
70396
      EXTERNAL           LSAME
68590
*     ..
70397
*     ..
68591
*     .. External Subroutines ..
70398
*     .. External Subroutines ..
68592
      EXTERNAL           XERBLA, ZAXPY, ZGESC2, ZGETC2, ZLATDF, ZSCAL
70399
      EXTERNAL           XERBLA, ZAXPY, ZGESC2, ZGETC2, ZLATDF,
-
 
70400
     $                   ZSCAL
68593
*     ..
70401
*     ..
68594
*     .. Intrinsic Functions ..
70402
*     .. Intrinsic Functions ..
68595
      INTRINSIC          DCMPLX, DCONJG, MAX
70403
      INTRINSIC          DCMPLX, DCONJG, MAX
68596
*     ..
70404
*     ..
68597
*     .. Executable Statements ..
70405
*     .. Executable Statements ..
Line 68684... Line 70492...
68684
*
70492
*
68685
*              Substitute R(I, J) and L(I, J) into remaining equation.
70493
*              Substitute R(I, J) and L(I, J) into remaining equation.
68686
*
70494
*
68687
               IF( I.GT.1 ) THEN
70495
               IF( I.GT.1 ) THEN
68688
                  ALPHA = -RHS( 1 )
70496
                  ALPHA = -RHS( 1 )
68689
                  CALL ZAXPY( I-1, ALPHA, A( 1, I ), 1, C( 1, J ), 1 )
70497
                  CALL ZAXPY( I-1, ALPHA, A( 1, I ), 1, C( 1, J ),
-
 
70498
     $                        1 )
68690
                  CALL ZAXPY( I-1, ALPHA, D( 1, I ), 1, F( 1, J ), 1 )
70499
                  CALL ZAXPY( I-1, ALPHA, D( 1, I ), 1, F( 1, J ),
-
 
70500
     $                        1 )
68691
               END IF
70501
               END IF
68692
               IF( J.LT.N ) THEN
70502
               IF( J.LT.N ) THEN
68693
                  CALL ZAXPY( N-J, RHS( 2 ), B( J, J+1 ), LDB,
70503
                  CALL ZAXPY( N-J, RHS( 2 ), B( J, J+1 ), LDB,
68694
     $                        C( I, J+1 ), LDC )
70504
     $                        C( I, J+1 ), LDC )
68695
                  CALL ZAXPY( N-J, RHS( 2 ), E( J, J+1 ), LDE,
70505
                  CALL ZAXPY( N-J, RHS( 2 ), E( J, J+1 ), LDE,
Line 68729... Line 70539...
68729
               IF( IERR.GT.0 )
70539
               IF( IERR.GT.0 )
68730
     $            INFO = IERR
70540
     $            INFO = IERR
68731
               CALL ZGESC2( LDZ, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
70541
               CALL ZGESC2( LDZ, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
68732
               IF( SCALOC.NE.ONE ) THEN
70542
               IF( SCALOC.NE.ONE ) THEN
68733
                  DO 40 K = 1, N
70543
                  DO 40 K = 1, N
68734
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1, K ),
70544
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1,
-
 
70545
     $                           K ),
68735
     $                           1 )
70546
     $                           1 )
68736
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1, K ),
70547
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1,
-
 
70548
     $                           K ),
68737
     $                           1 )
70549
     $                           1 )
68738
   40             CONTINUE
70550
   40             CONTINUE
68739
                  SCALE = SCALE*SCALOC
70551
                  SCALE = SCALE*SCALOC
68740
               END IF
70552
               END IF
68741
*
70553
*
Line 69052... Line 70864...
69052
*>      Condition Estimators for Solving the Generalized Sylvester
70864
*>      Condition Estimators for Solving the Generalized Sylvester
69053
*>      Equation, IEEE Transactions on Automatic Control, Vol. 34, No. 7,
70865
*>      Equation, IEEE Transactions on Automatic Control, Vol. 34, No. 7,
69054
*>      July 1989, pp 745-751.
70866
*>      July 1989, pp 745-751.
69055
*>
70867
*>
69056
*  =====================================================================
70868
*  =====================================================================
69057
      SUBROUTINE ZTGSYL( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D,
70869
      SUBROUTINE ZTGSYL( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC,
-
 
70870
     $                   D,
69058
     $                   LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK,
70871
     $                   LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK,
69059
     $                   IWORK, INFO )
70872
     $                   IWORK, INFO )
69060
*
70873
*
69061
*  -- LAPACK computational routine --
70874
*  -- LAPACK computational routine --
69062
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
70875
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 69095... Line 70908...
69095
      LOGICAL            LSAME
70908
      LOGICAL            LSAME
69096
      INTEGER            ILAENV
70909
      INTEGER            ILAENV
69097
      EXTERNAL           LSAME, ILAENV
70910
      EXTERNAL           LSAME, ILAENV
69098
*     ..
70911
*     ..
69099
*     .. External Subroutines ..
70912
*     .. External Subroutines ..
69100
      EXTERNAL           XERBLA, ZGEMM, ZLACPY, ZLASET, ZSCAL, ZTGSY2
70913
      EXTERNAL           XERBLA, ZGEMM, ZLACPY, ZLASET, ZSCAL,
-
 
70914
     $                   ZTGSY2
69101
*     ..
70915
*     ..
69102
*     .. Intrinsic Functions ..
70916
*     .. Intrinsic Functions ..
69103
      INTRINSIC          DBLE, DCMPLX, MAX, SQRT
70917
      INTRINSIC          DBLE, DCMPLX, MAX, SQRT
69104
*     ..
70918
*     ..
69105
*     .. Executable Statements ..
70919
*     .. Executable Statements ..
Line 69199... Line 71013...
69199
*
71013
*
69200
            SCALE = ONE
71014
            SCALE = ONE
69201
            DSCALE = ZERO
71015
            DSCALE = ZERO
69202
            DSUM = ONE
71016
            DSUM = ONE
69203
            PQ = M*N
71017
            PQ = M*N
69204
            CALL ZTGSY2( TRANS, IFUNC, M, N, A, LDA, B, LDB, C, LDC, D,
71018
            CALL ZTGSY2( TRANS, IFUNC, M, N, A, LDA, B, LDB, C, LDC,
-
 
71019
     $                   D,
69205
     $                   LDD, E, LDE, F, LDF, SCALE, DSUM, DSCALE,
71020
     $                   LDD, E, LDE, F, LDF, SCALE, DSUM, DSCALE,
69206
     $                   INFO )
71021
     $                   INFO )
69207
            IF( DSCALE.NE.ZERO ) THEN
71022
            IF( DSCALE.NE.ZERO ) THEN
69208
               IF( IJOB.EQ.1 .OR. IJOB.EQ.3 ) THEN
71023
               IF( IJOB.EQ.1 .OR. IJOB.EQ.3 ) THEN
69209
                  DIF = SQRT( DBLE( 2*M*N ) ) / ( DSCALE*SQRT( DSUM ) )
71024
                  DIF = SQRT( DBLE( 2*M*N ) ) / ( DSCALE*SQRT( DSUM ) )
Line 69287... Line 71102...
69287
               NB = JE - JS + 1
71102
               NB = JE - JS + 1
69288
               DO 120 I = P, 1, -1
71103
               DO 120 I = P, 1, -1
69289
                  IS = IWORK( I )
71104
                  IS = IWORK( I )
69290
                  IE = IWORK( I+1 ) - 1
71105
                  IE = IWORK( I+1 ) - 1
69291
                  MB = IE - IS + 1
71106
                  MB = IE - IS + 1
69292
                  CALL ZTGSY2( TRANS, IFUNC, MB, NB, A( IS, IS ), LDA,
71107
                  CALL ZTGSY2( TRANS, IFUNC, MB, NB, A( IS, IS ),
-
 
71108
     $                         LDA,
69293
     $                         B( JS, JS ), LDB, C( IS, JS ), LDC,
71109
     $                         B( JS, JS ), LDB, C( IS, JS ), LDC,
69294
     $                         D( IS, IS ), LDD, E( JS, JS ), LDE,
71110
     $                         D( IS, IS ), LDD, E( JS, JS ), LDE,
69295
     $                         F( IS, JS ), LDF, SCALOC, DSUM, DSCALE,
71111
     $                         F( IS, JS ), LDF, SCALOC, DSUM, DSCALE,
69296
     $                         LINFO )
71112
     $                         LINFO )
69297
                  IF( LINFO.GT.0 )
71113
                  IF( LINFO.GT.0 )
Line 69396... Line 71212...
69396
     $                      LINFO )
71212
     $                      LINFO )
69397
               IF( LINFO.GT.0 )
71213
               IF( LINFO.GT.0 )
69398
     $            INFO = LINFO
71214
     $            INFO = LINFO
69399
               IF( SCALOC.NE.ONE ) THEN
71215
               IF( SCALOC.NE.ONE ) THEN
69400
                  DO 160 K = 1, JS - 1
71216
                  DO 160 K = 1, JS - 1
69401
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1, K ),
71217
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1,
-
 
71218
     $                           K ),
69402
     $                           1 )
71219
     $                           1 )
69403
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1, K ),
71220
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1,
-
 
71221
     $                           K ),
69404
     $                           1 )
71222
     $                           1 )
69405
  160             CONTINUE
71223
  160             CONTINUE
69406
                  DO 170 K = JS, JE
71224
                  DO 170 K = JS, JE
69407
                     CALL ZSCAL( IS-1, DCMPLX( SCALOC, ZERO ),
71225
                     CALL ZSCAL( IS-1, DCMPLX( SCALOC, ZERO ),
69408
     $                           C( 1, K ), 1 )
71226
     $                           C( 1, K ), 1 )
Line 69414... Line 71232...
69414
     $                           C( IE+1, K ), 1 )
71232
     $                           C( IE+1, K ), 1 )
69415
                     CALL ZSCAL( M-IE, DCMPLX( SCALOC, ZERO ),
71233
                     CALL ZSCAL( M-IE, DCMPLX( SCALOC, ZERO ),
69416
     $                           F( IE+1, K ), 1 )
71234
     $                           F( IE+1, K ), 1 )
69417
  180             CONTINUE
71235
  180             CONTINUE
69418
                  DO 190 K = JE + 1, N
71236
                  DO 190 K = JE + 1, N
69419
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1, K ),
71237
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1,
-
 
71238
     $                           K ),
69420
     $                           1 )
71239
     $                           1 )
69421
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1, K ),
71240
                     CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1,
-
 
71241
     $                           K ),
69422
     $                           1 )
71242
     $                           1 )
69423
  190             CONTINUE
71243
  190             CONTINUE
69424
                  SCALE = SCALE*SCALOC
71244
                  SCALE = SCALE*SCALOC
69425
               END IF
71245
               END IF
69426
*
71246
*
Line 69691... Line 71511...
69691
         IF( KASE.NE.0 ) THEN
71511
         IF( KASE.NE.0 ) THEN
69692
            IF( KASE.EQ.KASE1 ) THEN
71512
            IF( KASE.EQ.KASE1 ) THEN
69693
*
71513
*
69694
*              Multiply by inv(A).
71514
*              Multiply by inv(A).
69695
*
71515
*
69696
               CALL ZLATPS( UPLO, 'No transpose', DIAG, NORMIN, N, AP,
71516
               CALL ZLATPS( UPLO, 'No transpose', DIAG, NORMIN, N,
-
 
71517
     $                      AP,
69697
     $                      WORK, SCALE, RWORK, INFO )
71518
     $                      WORK, SCALE, RWORK, INFO )
69698
            ELSE
71519
            ELSE
69699
*
71520
*
69700
*              Multiply by inv(A**H).
71521
*              Multiply by inv(A**H).
69701
*
71522
*
69702
               CALL ZLATPS( UPLO, 'Conjugate transpose', DIAG, NORMIN,
71523
               CALL ZLATPS( UPLO, 'Conjugate transpose', DIAG,
-
 
71524
     $                      NORMIN,
69703
     $                      N, AP, WORK, SCALE, RWORK, INFO )
71525
     $                      N, AP, WORK, SCALE, RWORK, INFO )
69704
            END IF
71526
            END IF
69705
            NORMIN = 'Y'
71527
            NORMIN = 'Y'
69706
*
71528
*
69707
*           Multiply by 1/SCALE if doing so will not cause overflow.
71529
*           Multiply by 1/SCALE if doing so will not cause overflow.
Line 70005... Line 71827...
70005
*>
71827
*>
70006
*> ZTPTRS solves a triangular system of the form
71828
*> ZTPTRS solves a triangular system of the form
70007
*>
71829
*>
70008
*>    A * X = B,  A**T * X = B,  or  A**H * X = B,
71830
*>    A * X = B,  A**T * X = B,  or  A**H * X = B,
70009
*>
71831
*>
70010
*> where A is a triangular matrix of order N stored in packed format,
71832
*> where A is a triangular matrix of order N stored in packed format, and B is an N-by-NRHS matrix.
-
 
71833
*>
-
 
71834
*> This subroutine verifies that A is nonsingular, but callers should note that only exact
-
 
71835
*> singularity is detected. It is conceivable for one or more diagonal elements of A to be
70011
*> and B is an N-by-NRHS matrix.  A check is made to verify that A is
71836
*> subnormally tiny numbers without this subroutine signalling an error.
70012
*> nonsingular.
71837
*>
-
 
71838
*> If a possible loss of numerical precision due to near-singular matrices is a concern, the
-
 
71839
*> caller should verify that A is nonsingular within some tolerance before calling this subroutine.
70013
*> \endverbatim
71840
*> \endverbatim
70014
*
71841
*
70015
*  Arguments:
71842
*  Arguments:
70016
*  ==========
71843
*  ==========
70017
*
71844
*
Line 70077... Line 71904...
70077
*> \param[out] INFO
71904
*> \param[out] INFO
70078
*> \verbatim
71905
*> \verbatim
70079
*>          INFO is INTEGER
71906
*>          INFO is INTEGER
70080
*>          = 0:  successful exit
71907
*>          = 0:  successful exit
70081
*>          < 0:  if INFO = -i, the i-th argument had an illegal value
71908
*>          < 0:  if INFO = -i, the i-th argument had an illegal value
70082
*>          > 0:  if INFO = i, the i-th diagonal element of A is zero,
71909
*>          > 0:  if INFO = i, the i-th diagonal element of A is exactly zero,
70083
*>                indicating that the matrix is singular and the
71910
*>                indicating that the matrix is singular and the
70084
*>                solutions X have not been computed.
71911
*>                solutions X have not been computed.
70085
*> \endverbatim
71912
*> \endverbatim
70086
*
71913
*
70087
*  Authors:
71914
*  Authors:
Line 70093... Line 71920...
70093
*> \author NAG Ltd.
71920
*> \author NAG Ltd.
70094
*
71921
*
70095
*> \ingroup tptrs
71922
*> \ingroup tptrs
70096
*
71923
*
70097
*  =====================================================================
71924
*  =====================================================================
70098
      SUBROUTINE ZTPTRS( UPLO, TRANS, DIAG, N, NRHS, AP, B, LDB, INFO )
71925
      SUBROUTINE ZTPTRS( UPLO, TRANS, DIAG, N, NRHS, AP, B, LDB,
-
 
71926
     $                   INFO )
70099
*
71927
*
70100
*  -- LAPACK computational routine --
71928
*  -- LAPACK computational routine --
70101
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
71929
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
70102
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
71930
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
70103
*
71931
*
Line 70137... Line 71965...
70137
      UPPER = LSAME( UPLO, 'U' )
71965
      UPPER = LSAME( UPLO, 'U' )
70138
      NOUNIT = LSAME( DIAG, 'N' )
71966
      NOUNIT = LSAME( DIAG, 'N' )
70139
      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
71967
      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
70140
         INFO = -1
71968
         INFO = -1
70141
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
71969
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
-
 
71970
     $         LSAME( TRANS, 'T' ) .AND.
70142
     $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
71971
     $                .NOT.LSAME( TRANS, 'C' ) ) THEN
70143
         INFO = -2
71972
         INFO = -2
70144
      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
71973
      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
70145
         INFO = -3
71974
         INFO = -3
70146
      ELSE IF( N.LT.0 ) THEN
71975
      ELSE IF( N.LT.0 ) THEN
70147
         INFO = -4
71976
         INFO = -4
Line 70441... Line 72270...
70441
     $                      LDA, WORK, SCALE, RWORK, INFO )
72270
     $                      LDA, WORK, SCALE, RWORK, INFO )
70442
            ELSE
72271
            ELSE
70443
*
72272
*
70444
*              Multiply by inv(A**H).
72273
*              Multiply by inv(A**H).
70445
*
72274
*
70446
               CALL ZLATRS( UPLO, 'Conjugate transpose', DIAG, NORMIN,
72275
               CALL ZLATRS( UPLO, 'Conjugate transpose', DIAG,
-
 
72276
     $                      NORMIN,
70447
     $                      N, A, LDA, WORK, SCALE, RWORK, INFO )
72277
     $                      N, A, LDA, WORK, SCALE, RWORK, INFO )
70448
            END IF
72278
            END IF
70449
            NORMIN = 'Y'
72279
            NORMIN = 'Y'
70450
*
72280
*
70451
*           Multiply by 1/SCALE if doing so will not cause overflow.
72281
*           Multiply by 1/SCALE if doing so will not cause overflow.
Line 70685... Line 72515...
70685
*>  magnitude has magnitude 1; here the magnitude of a complex number
72515
*>  magnitude has magnitude 1; here the magnitude of a complex number
70686
*>  (x,y) is taken to be |x| + |y|.
72516
*>  (x,y) is taken to be |x| + |y|.
70687
*> \endverbatim
72517
*> \endverbatim
70688
*>
72518
*>
70689
*  =====================================================================
72519
*  =====================================================================
70690
      SUBROUTINE ZTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
72520
      SUBROUTINE ZTREVC( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL,
-
 
72521
     $                   VR,
70691
     $                   LDVR, MM, M, WORK, RWORK, INFO )
72522
     $                   LDVR, MM, M, WORK, RWORK, INFO )
70692
*
72523
*
70693
*  -- LAPACK computational routine --
72524
*  -- LAPACK computational routine --
70694
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
72525
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
70695
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
72526
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 70725... Line 72556...
70725
      INTEGER            IZAMAX
72556
      INTEGER            IZAMAX
70726
      DOUBLE PRECISION   DLAMCH, DZASUM
72557
      DOUBLE PRECISION   DLAMCH, DZASUM
70727
      EXTERNAL           LSAME, IZAMAX, DLAMCH, DZASUM
72558
      EXTERNAL           LSAME, IZAMAX, DLAMCH, DZASUM
70728
*     ..
72559
*     ..
70729
*     .. External Subroutines ..
72560
*     .. External Subroutines ..
70730
      EXTERNAL           XERBLA, ZCOPY, ZDSCAL, ZGEMV, ZLATRS
72561
      EXTERNAL           XERBLA, ZCOPY, ZDSCAL, ZGEMV,
-
 
72562
     $                   ZLATRS
70731
*     ..
72563
*     ..
70732
*     .. Intrinsic Functions ..
72564
*     .. Intrinsic Functions ..
70733
      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX
72565
      INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX
70734
*     ..
72566
*     ..
70735
*     .. Statement Functions ..
72567
*     .. Statement Functions ..
Line 70859... Line 72691...
70859
               DO 60 K = KI + 1, N
72691
               DO 60 K = KI + 1, N
70860
                  VR( K, IS ) = CMZERO
72692
                  VR( K, IS ) = CMZERO
70861
   60          CONTINUE
72693
   60          CONTINUE
70862
            ELSE
72694
            ELSE
70863
               IF( KI.GT.1 )
72695
               IF( KI.GT.1 )
70864
     $            CALL ZGEMV( 'N', N, KI-1, CMONE, VR, LDVR, WORK( 1 ),
72696
     $            CALL ZGEMV( 'N', N, KI-1, CMONE, VR, LDVR,
-
 
72697
     $                        WORK( 1 ),
70865
     $                        1, DCMPLX( SCALE ), VR( 1, KI ), 1 )
72698
     $                        1, DCMPLX( SCALE ), VR( 1, KI ), 1 )
70866
*
72699
*
70867
               II = IZAMAX( N, VR( 1, KI ), 1 )
72700
               II = IZAMAX( N, VR( 1, KI ), 1 )
70868
               REMAX = ONE / CABS1( VR( II, KI ) )
72701
               REMAX = ONE / CABS1( VR( II, KI ) )
70869
               CALL ZDSCAL( N, REMAX, VR( 1, KI ), 1 )
72702
               CALL ZDSCAL( N, REMAX, VR( 1, KI ), 1 )
Line 70908... Line 72741...
70908
               IF( CABS1( T( K, K ) ).LT.SMIN )
72741
               IF( CABS1( T( K, K ) ).LT.SMIN )
70909
     $            T( K, K ) = SMIN
72742
     $            T( K, K ) = SMIN
70910
  100       CONTINUE
72743
  100       CONTINUE
70911
*
72744
*
70912
            IF( KI.LT.N ) THEN
72745
            IF( KI.LT.N ) THEN
70913
               CALL ZLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
72746
               CALL ZLATRS( 'Upper', 'Conjugate transpose',
-
 
72747
     $                      'Non-unit',
70914
     $                      'Y', N-KI, T( KI+1, KI+1 ), LDT,
72748
     $                      'Y', N-KI, T( KI+1, KI+1 ), LDT,
70915
     $                      WORK( KI+1 ), SCALE, RWORK, INFO )
72749
     $                      WORK( KI+1 ), SCALE, RWORK, INFO )
70916
               WORK( KI ) = SCALE
72750
               WORK( KI ) = SCALE
70917
            END IF
72751
            END IF
70918
*
72752
*
Line 70928... Line 72762...
70928
               DO 110 K = 1, KI - 1
72762
               DO 110 K = 1, KI - 1
70929
                  VL( K, IS ) = CMZERO
72763
                  VL( K, IS ) = CMZERO
70930
  110          CONTINUE
72764
  110          CONTINUE
70931
            ELSE
72765
            ELSE
70932
               IF( KI.LT.N )
72766
               IF( KI.LT.N )
70933
     $            CALL ZGEMV( 'N', N, N-KI, CMONE, VL( 1, KI+1 ), LDVL,
72767
     $            CALL ZGEMV( 'N', N, N-KI, CMONE, VL( 1, KI+1 ),
-
 
72768
     $                        LDVL,
70934
     $                        WORK( KI+1 ), 1, DCMPLX( SCALE ),
72769
     $                        WORK( KI+1 ), 1, DCMPLX( SCALE ),
70935
     $                        VL( 1, KI ), 1 )
72770
     $                        VL( 1, KI ), 1 )
70936
*
72771
*
70937
               II = IZAMAX( N, VL( 1, KI ), 1 )
72772
               II = IZAMAX( N, VL( 1, KI ), 1 )
70938
               REMAX = ONE / CABS1( VL( II, KI ) )
72773
               REMAX = ONE / CABS1( VL( II, KI ) )
Line 71193... Line 73028...
71193
*>  magnitude has magnitude 1; here the magnitude of a complex number
73028
*>  magnitude has magnitude 1; here the magnitude of a complex number
71194
*>  (x,y) is taken to be |x| + |y|.
73029
*>  (x,y) is taken to be |x| + |y|.
71195
*> \endverbatim
73030
*> \endverbatim
71196
*>
73031
*>
71197
*  =====================================================================
73032
*  =====================================================================
71198
      SUBROUTINE ZTREVC3( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
73033
      SUBROUTINE ZTREVC3( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL,
-
 
73034
     $                    VR,
71199
     $                    LDVR, MM, M, WORK, LWORK, RWORK, LRWORK, INFO)
73035
     $                    LDVR, MM, M, WORK, LWORK, RWORK, LRWORK, INFO)
71200
      IMPLICIT NONE
73036
      IMPLICIT NONE
71201
*
73037
*
71202
*  -- LAPACK computational routine --
73038
*  -- LAPACK computational routine --
71203
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
73039
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 71233... Line 73069...
71233
*     ..
73069
*     ..
71234
*     .. External Functions ..
73070
*     .. External Functions ..
71235
      LOGICAL            LSAME
73071
      LOGICAL            LSAME
71236
      INTEGER            ILAENV, IZAMAX
73072
      INTEGER            ILAENV, IZAMAX
71237
      DOUBLE PRECISION   DLAMCH, DZASUM
73073
      DOUBLE PRECISION   DLAMCH, DZASUM
71238
      EXTERNAL           LSAME, ILAENV, IZAMAX, DLAMCH, DZASUM
73074
      EXTERNAL           LSAME, ILAENV, IZAMAX, DLAMCH,
-
 
73075
     $                   DZASUM
71239
*     ..
73076
*     ..
71240
*     .. External Subroutines ..
73077
*     .. External Subroutines ..
71241
      EXTERNAL           XERBLA, ZCOPY, ZDSCAL, ZGEMV, ZLATRS,
73078
      EXTERNAL           XERBLA, ZCOPY, ZDSCAL, ZGEMV,
-
 
73079
     $                   ZLATRS,
71242
     $                   ZGEMM, ZLASET, ZLACPY
73080
     $                   ZGEMM, ZLASET, ZLACPY
71243
*     ..
73081
*     ..
71244
*     .. Intrinsic Functions ..
73082
*     .. Intrinsic Functions ..
71245
      INTRINSIC          ABS, DBLE, DCMPLX, CONJG, DIMAG, MAX
73083
      INTRINSIC          ABS, DBLE, DCMPLX, CONJG, DIMAG, MAX
71246
*     ..
73084
*     ..
Line 71496... Line 73334...
71496
               IF( CABS1( T( K, K ) ).LT.SMIN )
73334
               IF( CABS1( T( K, K ) ).LT.SMIN )
71497
     $            T( K, K ) = SMIN
73335
     $            T( K, K ) = SMIN
71498
  100       CONTINUE
73336
  100       CONTINUE
71499
*
73337
*
71500
            IF( KI.LT.N ) THEN
73338
            IF( KI.LT.N ) THEN
71501
               CALL ZLATRS( 'Upper', 'Conjugate transpose', 'Non-unit',
73339
               CALL ZLATRS( 'Upper', 'Conjugate transpose',
-
 
73340
     $                      'Non-unit',
71502
     $                      'Y', N-KI, T( KI+1, KI+1 ), LDT,
73341
     $                      'Y', N-KI, T( KI+1, KI+1 ), LDT,
71503
     $                      WORK( KI+1 + IV*N ), SCALE, RWORK, INFO )
73342
     $                      WORK( KI+1 + IV*N ), SCALE, RWORK, INFO )
71504
               WORK( KI + IV*N ) = SCALE
73343
               WORK( KI + IV*N ) = SCALE
71505
            END IF
73344
            END IF
71506
*
73345
*
71507
*           Copy the vector x or Q*x to VL and normalize.
73346
*           Copy the vector x or Q*x to VL and normalize.
71508
*
73347
*
71509
            IF( .NOT.OVER ) THEN
73348
            IF( .NOT.OVER ) THEN
71510
*              ------------------------------
73349
*              ------------------------------
71511
*              no back-transform: copy x to VL and normalize.
73350
*              no back-transform: copy x to VL and normalize.
71512
               CALL ZCOPY( N-KI+1, WORK( KI + IV*N ), 1, VL(KI,IS), 1 )
73351
               CALL ZCOPY( N-KI+1, WORK( KI + IV*N ), 1, VL(KI,IS),
-
 
73352
     $                     1 )
71513
*
73353
*
71514
               II = IZAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
73354
               II = IZAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
71515
               REMAX = ONE / CABS1( VL( II, IS ) )
73355
               REMAX = ONE / CABS1( VL( II, IS ) )
71516
               CALL ZDSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
73356
               CALL ZDSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
71517
*
73357
*
Line 71521... Line 73361...
71521
*
73361
*
71522
            ELSE IF( NB.EQ.1 ) THEN
73362
            ELSE IF( NB.EQ.1 ) THEN
71523
*              ------------------------------
73363
*              ------------------------------
71524
*              version 1: back-transform each vector with GEMV, Q*x.
73364
*              version 1: back-transform each vector with GEMV, Q*x.
71525
               IF( KI.LT.N )
73365
               IF( KI.LT.N )
71526
     $            CALL ZGEMV( 'N', N, N-KI, CONE, VL( 1, KI+1 ), LDVL,
73366
     $            CALL ZGEMV( 'N', N, N-KI, CONE, VL( 1, KI+1 ),
-
 
73367
     $                        LDVL,
71527
     $                        WORK( KI+1 + IV*N ), 1, DCMPLX( SCALE ),
73368
     $                        WORK( KI+1 + IV*N ), 1, DCMPLX( SCALE ),
71528
     $                        VL( 1, KI ), 1 )
73369
     $                        VL( 1, KI ), 1 )
71529
*
73370
*
71530
               II = IZAMAX( N, VL( 1, KI ), 1 )
73371
               II = IZAMAX( N, VL( 1, KI ), 1 )
71531
               REMAX = ONE / CABS1( VL( II, KI ) )
73372
               REMAX = ONE / CABS1( VL( II, KI ) )
Line 71792... Line 73633...
71792
         CALL ZLARTG( T( K, K+1 ), T22-T11, CS, SN, TEMP )
73633
         CALL ZLARTG( T( K, K+1 ), T22-T11, CS, SN, TEMP )
71793
*
73634
*
71794
*        Apply transformation to the matrix T.
73635
*        Apply transformation to the matrix T.
71795
*
73636
*
71796
         IF( K+2.LE.N )
73637
         IF( K+2.LE.N )
71797
     $      CALL ZROT( N-K-1, T( K, K+2 ), LDT, T( K+1, K+2 ), LDT, CS,
73638
     $      CALL ZROT( N-K-1, T( K, K+2 ), LDT, T( K+1, K+2 ), LDT,
-
 
73639
     $                 CS,
71798
     $                 SN )
73640
     $                 SN )
71799
         CALL ZROT( K-1, T( 1, K ), 1, T( 1, K+1 ), 1, CS,
73641
         CALL ZROT( K-1, T( 1, K ), 1, T( 1, K+1 ), 1, CS,
71800
     $              DCONJG( SN ) )
73642
     $              DCONJG( SN ) )
71801
*
73643
*
71802
         T( K, K ) = T22
73644
         T( K, K ) = T22
Line 72076... Line 73918...
72076
*>
73918
*>
72077
*>                      EPS * norm(T) / SEP
73919
*>                      EPS * norm(T) / SEP
72078
*> \endverbatim
73920
*> \endverbatim
72079
*>
73921
*>
72080
*  =====================================================================
73922
*  =====================================================================
72081
      SUBROUTINE ZTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S,
73923
      SUBROUTINE ZTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M,
-
 
73924
     $                   S,
72082
     $                   SEP, WORK, LWORK, INFO )
73925
     $                   SEP, WORK, LWORK, INFO )
72083
*
73926
*
72084
*  -- LAPACK computational routine --
73927
*  -- LAPACK computational routine --
72085
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
73928
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
72086
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
73929
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 72114... Line 73957...
72114
      LOGICAL            LSAME
73957
      LOGICAL            LSAME
72115
      DOUBLE PRECISION   ZLANGE
73958
      DOUBLE PRECISION   ZLANGE
72116
      EXTERNAL           LSAME, ZLANGE
73959
      EXTERNAL           LSAME, ZLANGE
72117
*     ..
73960
*     ..
72118
*     .. External Subroutines ..
73961
*     .. External Subroutines ..
72119
      EXTERNAL           XERBLA, ZLACN2, ZLACPY, ZTREXC, ZTRSYL
73962
      EXTERNAL           XERBLA, ZLACN2, ZLACPY, ZTREXC,
-
 
73963
     $                   ZTRSYL
72120
*     ..
73964
*     ..
72121
*     .. Intrinsic Functions ..
73965
*     .. Intrinsic Functions ..
72122
      INTRINSIC          MAX, SQRT
73966
      INTRINSIC          MAX, SQRT
72123
*     ..
73967
*     ..
72124
*     .. Executable Statements ..
73968
*     .. Executable Statements ..
Line 72513... Line 74357...
72513
*>
74357
*>
72514
*>                      EPS * norm(T) / SEP(i)
74358
*>                      EPS * norm(T) / SEP(i)
72515
*> \endverbatim
74359
*> \endverbatim
72516
*>
74360
*>
72517
*  =====================================================================
74361
*  =====================================================================
72518
      SUBROUTINE ZTRSNA( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
74362
      SUBROUTINE ZTRSNA( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL,
-
 
74363
     $                   VR,
72519
     $                   LDVR, S, SEP, MM, M, WORK, LDWORK, RWORK,
74364
     $                   LDVR, S, SEP, MM, M, WORK, LDWORK, RWORK,
72520
     $                   INFO )
74365
     $                   INFO )
72521
*
74366
*
72522
*  -- LAPACK computational routine --
74367
*  -- LAPACK computational routine --
72523
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
74368
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
Line 72555... Line 74400...
72555
*     .. External Functions ..
74400
*     .. External Functions ..
72556
      LOGICAL            LSAME
74401
      LOGICAL            LSAME
72557
      INTEGER            IZAMAX
74402
      INTEGER            IZAMAX
72558
      DOUBLE PRECISION   DLAMCH, DZNRM2
74403
      DOUBLE PRECISION   DLAMCH, DZNRM2
72559
      COMPLEX*16         ZDOTC
74404
      COMPLEX*16         ZDOTC
72560
      EXTERNAL           LSAME, IZAMAX, DLAMCH, DZNRM2, ZDOTC
74405
      EXTERNAL           LSAME, IZAMAX, DLAMCH, DZNRM2,
-
 
74406
     $                   ZDOTC
72561
*     ..
74407
*     ..
72562
*     .. External Subroutines ..
74408
*     .. External Subroutines ..
72563
      EXTERNAL           XERBLA, ZDRSCL, ZLACN2, ZLACPY, ZLATRS, ZTREXC
74409
      EXTERNAL           XERBLA, ZDRSCL, ZLACN2, ZLACPY, ZLATRS,
-
 
74410
     $                   ZTREXC
72564
*     ..
74411
*     ..
72565
*     .. Intrinsic Functions ..
74412
*     .. Intrinsic Functions ..
72566
      INTRINSIC          ABS, DBLE, DIMAG, MAX
74413
      INTRINSIC          ABS, DBLE, DIMAG, MAX
72567
*     ..
74414
*     ..
72568
*     .. Statement Functions ..
74415
*     .. Statement Functions ..
Line 72667... Line 74514...
72667
*
74514
*
72668
*           Copy the matrix T to the array WORK and swap the k-th
74515
*           Copy the matrix T to the array WORK and swap the k-th
72669
*           diagonal element to the (1,1) position.
74516
*           diagonal element to the (1,1) position.
72670
*
74517
*
72671
            CALL ZLACPY( 'Full', N, N, T, LDT, WORK, LDWORK )
74518
            CALL ZLACPY( 'Full', N, N, T, LDT, WORK, LDWORK )
72672
            CALL ZTREXC( 'No Q', N, WORK, LDWORK, DUMMY, 1, K, 1, IERR )
74519
            CALL ZTREXC( 'No Q', N, WORK, LDWORK, DUMMY, 1, K, 1,
-
 
74520
     $                   IERR )
72673
*
74521
*
72674
*           Form  C = T22 - lambda*I in WORK(2:N,2:N).
74522
*           Form  C = T22 - lambda*I in WORK(2:N,2:N).
72675
*
74523
*
72676
            DO 20 I = 2, N
74524
            DO 20 I = 2, N
72677
               WORK( I, I ) = WORK( I, I ) - WORK( 1, 1 )
74525
               WORK( I, I ) = WORK( I, I ) - WORK( 1, 1 )
Line 72683... Line 74531...
72683
            SEP( KS ) = ZERO
74531
            SEP( KS ) = ZERO
72684
            EST = ZERO
74532
            EST = ZERO
72685
            KASE = 0
74533
            KASE = 0
72686
            NORMIN = 'N'
74534
            NORMIN = 'N'
72687
   30       CONTINUE
74535
   30       CONTINUE
72688
            CALL ZLACN2( N-1, WORK( 1, N+1 ), WORK, EST, KASE, ISAVE )
74536
            CALL ZLACN2( N-1, WORK( 1, N+1 ), WORK, EST, KASE,
-
 
74537
     $                   ISAVE )
72689
*
74538
*
72690
            IF( KASE.NE.0 ) THEN
74539
            IF( KASE.NE.0 ) THEN
72691
               IF( KASE.EQ.1 ) THEN
74540
               IF( KASE.EQ.1 ) THEN
72692
*
74541
*
72693
*                 Solve C**H*x = scale*b
74542
*                 Solve C**H*x = scale*b
Line 72917... Line 74766...
72917
*     ..
74766
*     ..
72918
*     .. External Functions ..
74767
*     .. External Functions ..
72919
      LOGICAL            LSAME
74768
      LOGICAL            LSAME
72920
      DOUBLE PRECISION   DLAMCH, ZLANGE
74769
      DOUBLE PRECISION   DLAMCH, ZLANGE
72921
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
74770
      COMPLEX*16         ZDOTC, ZDOTU, ZLADIV
72922
      EXTERNAL           LSAME, DLAMCH, ZLANGE, ZDOTC, ZDOTU, ZLADIV
74771
      EXTERNAL           LSAME, DLAMCH, ZLANGE, ZDOTC, ZDOTU,
-
 
74772
     $                   ZLADIV
72923
*     ..
74773
*     ..
72924
*     .. External Subroutines ..
74774
*     .. External Subroutines ..
72925
      EXTERNAL           XERBLA, ZDSCAL
74775
      EXTERNAL           XERBLA, ZDSCAL
72926
*     ..
74776
*     ..
72927
*     .. Intrinsic Functions ..
74777
*     .. Intrinsic Functions ..
Line 73586... Line 75436...
73586
            DO 20 J = 1, N, NB
75436
            DO 20 J = 1, N, NB
73587
               JB = MIN( NB, N-J+1 )
75437
               JB = MIN( NB, N-J+1 )
73588
*
75438
*
73589
*              Compute rows 1:j-1 of current block column
75439
*              Compute rows 1:j-1 of current block column
73590
*
75440
*
73591
               CALL ZTRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
75441
               CALL ZTRMM( 'Left', 'Upper', 'No transpose', DIAG,
-
 
75442
     $                     J-1,
73592
     $                     JB, ONE, A, LDA, A( 1, J ), LDA )
75443
     $                     JB, ONE, A, LDA, A( 1, J ), LDA )
73593
               CALL ZTRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
75444
               CALL ZTRSM( 'Right', 'Upper', 'No transpose', DIAG,
-
 
75445
     $                     J-1,
73594
     $                     JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
75446
     $                     JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
73595
*
75447
*
73596
*              Compute inverse of current diagonal block
75448
*              Compute inverse of current diagonal block
73597
*
75449
*
73598
               CALL ZTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
75450
               CALL ZTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
Line 73667... Line 75519...
73667
*>
75519
*>
73668
*> ZTRTRS solves a triangular system of the form
75520
*> ZTRTRS solves a triangular system of the form
73669
*>
75521
*>
73670
*>    A * X = B,  A**T * X = B,  or  A**H * X = B,
75522
*>    A * X = B,  A**T * X = B,  or  A**H * X = B,
73671
*>
75523
*>
73672
*> where A is a triangular matrix of order N, and B is an N-by-NRHS
75524
*> where A is a triangular matrix of order N, and B is an N-by-NRHS matrix.
-
 
75525
*>
-
 
75526
*> This subroutine verifies that A is nonsingular, but callers should note that only exact
-
 
75527
*> singularity is detected. It is conceivable for one or more diagonal elements of A to be
-
 
75528
*> subnormally tiny numbers without this subroutine signalling an error.
-
 
75529
*>
73673
*> matrix.  A check is made to verify that A is nonsingular.
75530
*> If a possible loss of numerical precision due to near-singular matrices is a concern, the
-
 
75531
*> caller should verify that A is nonsingular within some tolerance before calling this subroutine.
73674
*> \endverbatim
75532
*> \endverbatim
73675
*
75533
*
73676
*  Arguments:
75534
*  Arguments:
73677
*  ==========
75535
*  ==========
73678
*
75536
*
Line 73747... Line 75605...
73747
*> \param[out] INFO
75605
*> \param[out] INFO
73748
*> \verbatim
75606
*> \verbatim
73749
*>          INFO is INTEGER
75607
*>          INFO is INTEGER
73750
*>          = 0:  successful exit
75608
*>          = 0:  successful exit
73751
*>          < 0: if INFO = -i, the i-th argument had an illegal value
75609
*>          < 0: if INFO = -i, the i-th argument had an illegal value
73752
*>          > 0: if INFO = i, the i-th diagonal element of A is zero,
75610
*>          > 0:  if INFO = i, the i-th diagonal element of A is exactly zero,
73753
*>               indicating that the matrix is singular and the solutions
75611
*>               indicating that the matrix is singular and the solutions
73754
*>               X have not been computed.
75612
*>               X have not been computed.
73755
*> \endverbatim
75613
*> \endverbatim
73756
*
75614
*
73757
*  Authors:
75615
*  Authors:
Line 73804... Line 75662...
73804
*
75662
*
73805
*     Test the input parameters.
75663
*     Test the input parameters.
73806
*
75664
*
73807
      INFO = 0
75665
      INFO = 0
73808
      NOUNIT = LSAME( DIAG, 'N' )
75666
      NOUNIT = LSAME( DIAG, 'N' )
-
 
75667
      IF( .NOT.LSAME( UPLO, 'U' ) .AND.
73809
      IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
75668
     $    .NOT.LSAME( UPLO, 'L' ) ) THEN
73810
         INFO = -1
75669
         INFO = -1
73811
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
75670
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.
-
 
75671
     $         LSAME( TRANS, 'T' ) .AND.
73812
     $         LSAME( TRANS, 'T' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
75672
     $                .NOT.LSAME( TRANS, 'C' ) ) THEN
73813
         INFO = -2
75673
         INFO = -2
73814
      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
75674
      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
73815
         INFO = -3
75675
         INFO = -3
73816
      ELSE IF( N.LT.0 ) THEN
75676
      ELSE IF( N.LT.0 ) THEN
73817
         INFO = -4
75677
         INFO = -4
Line 73986... Line 75846...
73986
*     ..
75846
*     ..
73987
*     .. Local Scalars ..
75847
*     .. Local Scalars ..
73988
      INTEGER            I, II, J, L
75848
      INTEGER            I, II, J, L
73989
*     ..
75849
*     ..
73990
*     .. External Subroutines ..
75850
*     .. External Subroutines ..
73991
      EXTERNAL           XERBLA, ZLARF, ZSCAL
75851
      EXTERNAL           XERBLA, ZLARF1L, ZSCAL
73992
*     ..
75852
*     ..
73993
*     .. Intrinsic Functions ..
75853
*     .. Intrinsic Functions ..
73994
      INTRINSIC          MAX
75854
      INTRINSIC          MAX
73995
*     ..
75855
*     ..
73996
*     .. Executable Statements ..
75856
*     .. Executable Statements ..
Line 74030... Line 75890...
74030
         II = N - K + I
75890
         II = N - K + I
74031
*
75891
*
74032
*        Apply H(i) to A(1:m-k+i,1:n-k+i) from the left
75892
*        Apply H(i) to A(1:m-k+i,1:n-k+i) from the left
74033
*
75893
*
74034
         A( M-N+II, II ) = ONE
75894
         A( M-N+II, II ) = ONE
74035
         CALL ZLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A,
75895
         CALL ZLARF1L( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ),
-
 
75896
     $                 A,
74036
     $               LDA, WORK )
75897
     $                 LDA, WORK )
74037
         CALL ZSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 )
75898
         CALL ZSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 )
74038
         A( M-N+II, II ) = ONE - TAU( I )
75899
         A( M-N+II, II ) = ONE - TAU( I )
74039
*
75900
*
74040
*        Set A(m-k+i+1:m,n-k+i) to zero
75901
*        Set A(m-k+i+1:m,n-k+i) to zero
74041
*
75902
*
Line 74182... Line 76043...
74182
*     ..
76043
*     ..
74183
*     .. Local Scalars ..
76044
*     .. Local Scalars ..
74184
      INTEGER            I, J, L
76045
      INTEGER            I, J, L
74185
*     ..
76046
*     ..
74186
*     .. External Subroutines ..
76047
*     .. External Subroutines ..
74187
      EXTERNAL           XERBLA, ZLARF, ZSCAL
76048
      EXTERNAL           XERBLA, ZLARF1F, ZSCAL
74188
*     ..
76049
*     ..
74189
*     .. Intrinsic Functions ..
76050
*     .. Intrinsic Functions ..
74190
      INTRINSIC          MAX
76051
      INTRINSIC          MAX
74191
*     ..
76052
*     ..
74192
*     .. Executable Statements ..
76053
*     .. Executable Statements ..
Line 74225... Line 76086...
74225
      DO 40 I = K, 1, -1
76086
      DO 40 I = K, 1, -1
74226
*
76087
*
74227
*        Apply H(i) to A(i:m,i:n) from the left
76088
*        Apply H(i) to A(i:m,i:n) from the left
74228
*
76089
*
74229
         IF( I.LT.N ) THEN
76090
         IF( I.LT.N ) THEN
74230
            A( I, I ) = ONE
-
 
74231
            CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
76091
            CALL ZLARF1F( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ),
74232
     $                  A( I, I+1 ), LDA, WORK )
76092
     $                    A( I, I+1 ), LDA, WORK )
74233
         END IF
76093
         END IF
74234
         IF( I.LT.M )
76094
         IF( I.LT.M )
74235
     $      CALL ZSCAL( M-I, -TAU( I ), A( I+1, I ), 1 )
76095
     $      CALL ZSCAL( M-I, -TAU( I ), A( I+1, I ), 1 )
74236
         A( I, I ) = ONE - TAU( I )
76096
         A( I, I ) = ONE - TAU( I )
74237
*
76097
*
Line 74399... Line 76259...
74399
*> \author NAG Ltd.
76259
*> \author NAG Ltd.
74400
*
76260
*
74401
*> \ingroup ungbr
76261
*> \ingroup ungbr
74402
*
76262
*
74403
*  =====================================================================
76263
*  =====================================================================
74404
      SUBROUTINE ZUNGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO )
76264
      SUBROUTINE ZUNGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK,
-
 
76265
     $                   INFO )
74405
*
76266
*
74406
*  -- LAPACK computational routine --
76267
*  -- LAPACK computational routine --
74407
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
76268
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
74408
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
76269
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
74409
*
76270
*
Line 74703... Line 76564...
74703
*> \author NAG Ltd.
76564
*> \author NAG Ltd.
74704
*
76565
*
74705
*> \ingroup unghr
76566
*> \ingroup unghr
74706
*
76567
*
74707
*  =====================================================================
76568
*  =====================================================================
74708
      SUBROUTINE ZUNGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
76569
      SUBROUTINE ZUNGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK,
-
 
76570
     $                   INFO )
74709
*
76571
*
74710
*  -- LAPACK computational routine --
76572
*  -- LAPACK computational routine --
74711
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
76573
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
74712
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
76574
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
74713
*
76575
*
Line 74952... Line 76814...
74952
*     ..
76814
*     ..
74953
*     .. Local Scalars ..
76815
*     .. Local Scalars ..
74954
      INTEGER            I, J, L
76816
      INTEGER            I, J, L
74955
*     ..
76817
*     ..
74956
*     .. External Subroutines ..
76818
*     .. External Subroutines ..
74957
      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZSCAL
76819
      EXTERNAL           XERBLA, ZLACGV, ZLARF1F, ZSCAL
74958
*     ..
76820
*     ..
74959
*     .. Intrinsic Functions ..
76821
*     .. Intrinsic Functions ..
74960
      INTRINSIC          DCONJG, MAX
76822
      INTRINSIC          DCONJG, MAX
74961
*     ..
76823
*     ..
74962
*     .. Executable Statements ..
76824
*     .. Executable Statements ..
Line 75001... Line 76863...
75001
*        Apply H(i)**H to A(i:m,i:n) from the right
76863
*        Apply H(i)**H to A(i:m,i:n) from the right
75002
*
76864
*
75003
         IF( I.LT.N ) THEN
76865
         IF( I.LT.N ) THEN
75004
            CALL ZLACGV( N-I, A( I, I+1 ), LDA )
76866
            CALL ZLACGV( N-I, A( I, I+1 ), LDA )
75005
            IF( I.LT.M ) THEN
76867
            IF( I.LT.M ) THEN
75006
               A( I, I ) = ONE
-
 
75007
               CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA,
76868
               CALL ZLARF1F( 'Right', M-I, N-I+1, A( I, I ), LDA,
75008
     $                     DCONJG( TAU( I ) ), A( I+1, I ), LDA, WORK )
76869
     $                       CONJG( TAU( I ) ), A( I+1, I ), LDA,
-
 
76870
     $                       WORK )
75009
            END IF
76871
            END IF
75010
            CALL ZSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA )
76872
            CALL ZSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA )
75011
            CALL ZLACGV( N-I, A( I, I+1 ), LDA )
76873
            CALL ZLACGV( N-I, A( I, I+1 ), LDA )
75012
         END IF
76874
         END IF
75013
         A( I, I ) = ONE - DCONJG( TAU( I ) )
76875
         A( I, I ) = ONE - DCONJG( TAU( I ) )
Line 75234... Line 77096...
75234
*
77096
*
75235
*              Not enough workspace to use optimal NB:  reduce NB and
77097
*              Not enough workspace to use optimal NB:  reduce NB and
75236
*              determine the minimum value of NB.
77098
*              determine the minimum value of NB.
75237
*
77099
*
75238
               NB = LWORK / LDWORK
77100
               NB = LWORK / LDWORK
75239
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGLQ', ' ', M, N, K, -1 ) )
77101
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGLQ', ' ', M, N, K,
-
 
77102
     $                      -1 ) )
75240
            END IF
77103
            END IF
75241
         END IF
77104
         END IF
75242
      END IF
77105
      END IF
75243
*
77106
*
75244
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
77107
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
Line 75275... Line 77138...
75275
            IF( I+IB.LE.M ) THEN
77138
            IF( I+IB.LE.M ) THEN
75276
*
77139
*
75277
*              Form the triangular factor of the block reflector
77140
*              Form the triangular factor of the block reflector
75278
*              H = H(i) H(i+1) . . . H(i+ib-1)
77141
*              H = H(i) H(i+1) . . . H(i+ib-1)
75279
*
77142
*
75280
               CALL ZLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ),
77143
               CALL ZLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I,
-
 
77144
     $                      I ),
75281
     $                      LDA, TAU( I ), WORK, LDWORK )
77145
     $                      LDA, TAU( I ), WORK, LDWORK )
75282
*
77146
*
75283
*              Apply H**H to A(i+ib:m,i:n) from the right
77147
*              Apply H**H to A(i+ib:m,i:n) from the right
75284
*
77148
*
75285
               CALL ZLARFB( 'Right', 'Conjugate transpose', 'Forward',
77149
               CALL ZLARFB( 'Right', 'Conjugate transpose',
-
 
77150
     $                      'Forward',
75286
     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
77151
     $                      'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ),
75287
     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
77152
     $                      LDA, WORK, LDWORK, A( I+IB, I ), LDA,
75288
     $                      WORK( IB+1 ), LDWORK )
77153
     $                      WORK( IB+1 ), LDWORK )
75289
            END IF
77154
            END IF
75290
*
77155
*
75291
*           Apply H**H to columns i:n of current block
77156
*           Apply H**H to columns i:n of current block
75292
*
77157
*
75293
            CALL ZUNGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK,
77158
            CALL ZUNGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ),
-
 
77159
     $                   WORK,
75294
     $                   IINFO )
77160
     $                   IINFO )
75295
*
77161
*
75296
*           Set columns 1:i-1 of current block to zero
77162
*           Set columns 1:i-1 of current block to zero
75297
*
77163
*
75298
            DO 40 J = 1, I - 1
77164
            DO 40 J = 1, I - 1
Line 75530... Line 77396...
75530
*
77396
*
75531
*              Not enough workspace to use optimal NB:  reduce NB and
77397
*              Not enough workspace to use optimal NB:  reduce NB and
75532
*              determine the minimum value of NB.
77398
*              determine the minimum value of NB.
75533
*
77399
*
75534
               NB = LWORK / LDWORK
77400
               NB = LWORK / LDWORK
75535
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQL', ' ', M, N, K, -1 ) )
77401
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQL', ' ', M, N, K,
-
 
77402
     $                      -1 ) )
75536
            END IF
77403
            END IF
75537
         END IF
77404
         END IF
75538
      END IF
77405
      END IF
75539
*
77406
*
75540
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
77407
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
Line 75814... Line 77681...
75814
*
77681
*
75815
*              Not enough workspace to use optimal NB:  reduce NB and
77682
*              Not enough workspace to use optimal NB:  reduce NB and
75816
*              determine the minimum value of NB.
77683
*              determine the minimum value of NB.
75817
*
77684
*
75818
               NB = LWORK / LDWORK
77685
               NB = LWORK / LDWORK
75819
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQR', ' ', M, N, K, -1 ) )
77686
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQR', ' ', M, N, K,
-
 
77687
     $                      -1 ) )
75820
            END IF
77688
            END IF
75821
         END IF
77689
         END IF
75822
      END IF
77690
      END IF
75823
*
77691
*
75824
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
77692
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
Line 75868... Line 77736...
75868
     $                      LDA, WORK( IB+1 ), LDWORK )
77736
     $                      LDA, WORK( IB+1 ), LDWORK )
75869
            END IF
77737
            END IF
75870
*
77738
*
75871
*           Apply H to rows i:m of current block
77739
*           Apply H to rows i:m of current block
75872
*
77740
*
75873
            CALL ZUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK,
77741
            CALL ZUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ),
-
 
77742
     $                   WORK,
75874
     $                   IINFO )
77743
     $                   IINFO )
75875
*
77744
*
75876
*           Set rows 1:i-1 of current block to zero
77745
*           Set rows 1:i-1 of current block to zero
75877
*
77746
*
75878
            DO 40 J = I, I + IB - 1
77747
            DO 40 J = I, I + IB - 1
Line 76023... Line 77892...
76023
*     ..
77892
*     ..
76024
*     .. Local Scalars ..
77893
*     .. Local Scalars ..
76025
      INTEGER            I, II, J, L
77894
      INTEGER            I, II, J, L
76026
*     ..
77895
*     ..
76027
*     .. External Subroutines ..
77896
*     .. External Subroutines ..
76028
      EXTERNAL           XERBLA, ZLACGV, ZLARF, ZSCAL
77897
      EXTERNAL           XERBLA, ZLACGV, ZLARF1L, ZSCAL
76029
*     ..
77898
*     ..
76030
*     .. Intrinsic Functions ..
77899
*     .. Intrinsic Functions ..
76031
      INTRINSIC          DCONJG, MAX
77900
      INTRINSIC          DCONJG, MAX
76032
*     ..
77901
*     ..
76033
*     .. Executable Statements ..
77902
*     .. Executable Statements ..
Line 76071... Line 77940...
76071
         II = M - K + I
77940
         II = M - K + I
76072
*
77941
*
76073
*        Apply H(i)**H to A(1:m-k+i,1:n-k+i) from the right
77942
*        Apply H(i)**H to A(1:m-k+i,1:n-k+i) from the right
76074
*
77943
*
76075
         CALL ZLACGV( N-M+II-1, A( II, 1 ), LDA )
77944
         CALL ZLACGV( N-M+II-1, A( II, 1 ), LDA )
76076
         A( II, N-M+II ) = ONE
-
 
76077
         CALL ZLARF( 'Right', II-1, N-M+II, A( II, 1 ), LDA,
77945
         CALL ZLARF1L( 'Right', II-1, N-M+II, A( II, 1 ), LDA,
76078
     $               DCONJG( TAU( I ) ), A, LDA, WORK )
77946
     $                 CONJG( TAU( I ) ), A, LDA, WORK )
76079
         CALL ZSCAL( N-M+II-1, -TAU( I ), A( II, 1 ), LDA )
77947
         CALL ZSCAL( N-M+II-1, -TAU( I ), A( II, 1 ), LDA )
76080
         CALL ZLACGV( N-M+II-1, A( II, 1 ), LDA )
77948
         CALL ZLACGV( N-M+II-1, A( II, 1 ), LDA )
76081
         A( II, N-M+II ) = ONE - DCONJG( TAU( I ) )
77949
         A( II, N-M+II ) = ONE - DCONJG( TAU( I ) )
76082
*
77950
*
76083
*        Set A(m-k+i,n-k+i+1:n) to zero
77951
*        Set A(m-k+i,n-k+i+1:n) to zero
Line 76312... Line 78180...
76312
*
78180
*
76313
*              Not enough workspace to use optimal NB:  reduce NB and
78181
*              Not enough workspace to use optimal NB:  reduce NB and
76314
*              determine the minimum value of NB.
78182
*              determine the minimum value of NB.
76315
*
78183
*
76316
               NB = LWORK / LDWORK
78184
               NB = LWORK / LDWORK
76317
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGRQ', ' ', M, N, K, -1 ) )
78185
               NBMIN = MAX( 2, ILAENV( 2, 'ZUNGRQ', ' ', M, N, K,
-
 
78186
     $                      -1 ) )
76318
            END IF
78187
            END IF
76319
         END IF
78188
         END IF
76320
      END IF
78189
      END IF
76321
*
78190
*
76322
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
78191
      IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
Line 76356... Line 78225...
76356
               CALL ZLARFT( 'Backward', 'Rowwise', N-K+I+IB-1, IB,
78225
               CALL ZLARFT( 'Backward', 'Rowwise', N-K+I+IB-1, IB,
76357
     $                      A( II, 1 ), LDA, TAU( I ), WORK, LDWORK )
78226
     $                      A( II, 1 ), LDA, TAU( I ), WORK, LDWORK )
76358
*
78227
*
76359
*              Apply H**H to A(1:m-k+i-1,1:n-k+i+ib-1) from the right
78228
*              Apply H**H to A(1:m-k+i-1,1:n-k+i+ib-1) from the right
76360
*
78229
*
76361
               CALL ZLARFB( 'Right', 'Conjugate transpose', 'Backward',
78230
               CALL ZLARFB( 'Right', 'Conjugate transpose',
-
 
78231
     $                      'Backward',
76362
     $                      'Rowwise', II-1, N-K+I+IB-1, IB, A( II, 1 ),
78232
     $                      'Rowwise', II-1, N-K+I+IB-1, IB, A( II, 1 ),
76363
     $                      LDA, WORK, LDWORK, A, LDA, WORK( IB+1 ),
78233
     $                      LDA, WORK, LDWORK, A, LDA, WORK( IB+1 ),
76364
     $                      LDWORK )
78234
     $                      LDWORK )
76365
            END IF
78235
            END IF
76366
*
78236
*
76367
*           Apply H**H to columns 1:n-k+i+ib-1 of current block
78237
*           Apply H**H to columns 1:n-k+i+ib-1 of current block
76368
*
78238
*
76369
            CALL ZUNGR2( IB, N-K+I+IB-1, IB, A( II, 1 ), LDA, TAU( I ),
78239
            CALL ZUNGR2( IB, N-K+I+IB-1, IB, A( II, 1 ), LDA,
-
 
78240
     $                   TAU( I ),
76370
     $                   WORK, IINFO )
78241
     $                   WORK, IINFO )
76371
*
78242
*
76372
*           Set columns n-k+i+ib:n of current block to zero
78243
*           Set columns n-k+i+ib:n of current block to zero
76373
*
78244
*
76374
            DO 40 L = N - K + I + IB, N
78245
            DO 40 L = N - K + I + IB, N
Line 76602... Line 78473...
76602
   30    CONTINUE
78473
   30    CONTINUE
76603
         A( N, N ) = ONE
78474
         A( N, N ) = ONE
76604
*
78475
*
76605
*        Generate Q(1:n-1,1:n-1)
78476
*        Generate Q(1:n-1,1:n-1)
76606
*
78477
*
76607
         CALL ZUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO )
78478
         CALL ZUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK,
-
 
78479
     $                IINFO )
76608
*
78480
*
76609
      ELSE
78481
      ELSE
76610
*
78482
*
76611
*        Q was determined by a call to ZHETRD with UPLO = 'L'.
78483
*        Q was determined by a call to ZHETRD with UPLO = 'L'.
76612
*
78484
*
Line 76816... Line 78688...
76816
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
78688
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
76817
*     ..
78689
*     ..
76818
*     .. Local Scalars ..
78690
*     .. Local Scalars ..
76819
      LOGICAL            LEFT, NOTRAN
78691
      LOGICAL            LEFT, NOTRAN
76820
      INTEGER            I, I1, I2, I3, MI, NI, NQ
78692
      INTEGER            I, I1, I2, I3, MI, NI, NQ
76821
      COMPLEX*16         AII, TAUI
78693
      COMPLEX*16         TAUI
76822
*     ..
78694
*     ..
76823
*     .. External Functions ..
78695
*     .. External Functions ..
76824
      LOGICAL            LSAME
78696
      LOGICAL            LSAME
76825
      EXTERNAL           LSAME
78697
      EXTERNAL           LSAME
76826
*     ..
78698
*     ..
76827
*     .. External Subroutines ..
78699
*     .. External Subroutines ..
76828
      EXTERNAL           XERBLA, ZLARF
78700
      EXTERNAL           XERBLA, ZLARF1L
76829
*     ..
78701
*     ..
76830
*     .. Intrinsic Functions ..
78702
*     .. Intrinsic Functions ..
76831
      INTRINSIC          DCONJG, MAX
78703
      INTRINSIC          DCONJG, MAX
76832
*     ..
78704
*     ..
76833
*     .. Executable Statements ..
78705
*     .. Executable Statements ..
Line 76904... Line 78776...
76904
         IF( NOTRAN ) THEN
78776
         IF( NOTRAN ) THEN
76905
            TAUI = TAU( I )
78777
            TAUI = TAU( I )
76906
         ELSE
78778
         ELSE
76907
            TAUI = DCONJG( TAU( I ) )
78779
            TAUI = DCONJG( TAU( I ) )
76908
         END IF
78780
         END IF
76909
         AII = A( NQ-K+I, I )
-
 
76910
         A( NQ-K+I, I ) = ONE
-
 
76911
         CALL ZLARF( SIDE, MI, NI, A( 1, I ), 1, TAUI, C, LDC, WORK )
78781
         CALL ZLARF1L( SIDE, MI, NI, A( 1, I ), 1, TAUI, C, LDC,
76912
         A( NQ-K+I, I ) = AII
78782
     $                 WORK )
76913
   10 CONTINUE
78783
   10 CONTINUE
76914
      RETURN
78784
      RETURN
76915
*
78785
*
76916
*     End of ZUNM2L
78786
*     End of ZUNM2L
76917
*
78787
*
Line 77094... Line 78964...
77094
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
78964
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
77095
*     ..
78965
*     ..
77096
*     .. Local Scalars ..
78966
*     .. Local Scalars ..
77097
      LOGICAL            LEFT, NOTRAN
78967
      LOGICAL            LEFT, NOTRAN
77098
      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
78968
      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
77099
      COMPLEX*16         AII, TAUI
78969
      COMPLEX*16         TAUI
77100
*     ..
78970
*     ..
77101
*     .. External Functions ..
78971
*     .. External Functions ..
77102
      LOGICAL            LSAME
78972
      LOGICAL            LSAME
77103
      EXTERNAL           LSAME
78973
      EXTERNAL           LSAME
77104
*     ..
78974
*     ..
77105
*     .. External Subroutines ..
78975
*     .. External Subroutines ..
77106
      EXTERNAL           XERBLA, ZLARF
78976
      EXTERNAL           XERBLA, ZLARF1F
77107
*     ..
78977
*     ..
77108
*     .. Intrinsic Functions ..
78978
*     .. Intrinsic Functions ..
77109
      INTRINSIC          DCONJG, MAX
78979
      INTRINSIC          DCONJG, MAX
77110
*     ..
78980
*     ..
77111
*     .. Executable Statements ..
78981
*     .. Executable Statements ..
Line 77186... Line 79056...
77186
         IF( NOTRAN ) THEN
79056
         IF( NOTRAN ) THEN
77187
            TAUI = TAU( I )
79057
            TAUI = TAU( I )
77188
         ELSE
79058
         ELSE
77189
            TAUI = DCONJG( TAU( I ) )
79059
            TAUI = DCONJG( TAU( I ) )
77190
         END IF
79060
         END IF
77191
         AII = A( I, I )
79061
         CALL ZLARF1F( SIDE, MI, NI, A( I, I ), 1, TAUI, C( IC, JC ),
77192
         A( I, I ) = ONE
79062
     $               LDC,
77193
         CALL ZLARF( SIDE, MI, NI, A( I, I ), 1, TAUI, C( IC, JC ), LDC,
-
 
77194
     $               WORK )
79063
     $               WORK )
77195
         A( I, I ) = AII
-
 
77196
   10 CONTINUE
79064
   10 CONTINUE
77197
      RETURN
79065
      RETURN
77198
*
79066
*
77199
*     End of ZUNM2R
79067
*     End of ZUNM2R
77200
*
79068
*
Line 77468... Line 79336...
77468
*
79336
*
77469
      IF( INFO.EQ.0 ) THEN
79337
      IF( INFO.EQ.0 ) THEN
77470
         IF( M.GT.0 .AND. N.GT.0 ) THEN
79338
         IF( M.GT.0 .AND. N.GT.0 ) THEN
77471
            IF( APPLYQ ) THEN
79339
            IF( APPLYQ ) THEN
77472
               IF( LEFT ) THEN
79340
               IF( LEFT ) THEN
77473
                  NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M-1, N, M-1,
79341
                  NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M-1, N,
-
 
79342
     $                         M-1,
77474
     $                 -1 )
79343
     $                 -1 )
77475
               ELSE
79344
               ELSE
77476
                  NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N-1, N-1,
79345
                  NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N-1,
-
 
79346
     $                         N-1,
77477
     $                 -1 )
79347
     $                 -1 )
77478
               END IF
79348
               END IF
77479
            ELSE
79349
            ELSE
77480
               IF( LEFT ) THEN
79350
               IF( LEFT ) THEN
77481
                  NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M-1, N, M-1,
79351
                  NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M-1, N,
-
 
79352
     $                         M-1,
77482
     $                 -1 )
79353
     $                 -1 )
77483
               ELSE
79354
               ELSE
77484
                  NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N-1, N-1,
79355
                  NB = ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N-1,
-
 
79356
     $                         N-1,
77485
     $                 -1 )
79357
     $                 -1 )
77486
               END IF
79358
               END IF
77487
            END IF
79359
            END IF
77488
            LWKOPT = NW*NB
79360
            LWKOPT = NW*NB
77489
         ELSE
79361
         ELSE
Line 77527... Line 79399...
77527
               MI = M
79399
               MI = M
77528
               NI = N - 1
79400
               NI = N - 1
77529
               I1 = 1
79401
               I1 = 1
77530
               I2 = 2
79402
               I2 = 2
77531
            END IF
79403
            END IF
77532
            CALL ZUNMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU,
79404
            CALL ZUNMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA,
-
 
79405
     $                   TAU,
77533
     $                   C( I1, I2 ), LDC, WORK, LWORK, IINFO )
79406
     $                   C( I1, I2 ), LDC, WORK, LWORK, IINFO )
77534
         END IF
79407
         END IF
77535
      ELSE
79408
      ELSE
77536
*
79409
*
77537
*        Apply P
79410
*        Apply P
Line 77797... Line 79670...
77797
         NQ = N
79670
         NQ = N
77798
         NW = MAX( 1, M )
79671
         NW = MAX( 1, M )
77799
      END IF
79672
      END IF
77800
      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
79673
      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
77801
         INFO = -1
79674
         INFO = -1
77802
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'C' ) )
79675
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND.
-
 
79676
     $         .NOT.LSAME( TRANS, 'C' ) )
77803
     $          THEN
79677
     $          THEN
77804
         INFO = -2
79678
         INFO = -2
77805
      ELSE IF( M.LT.0 ) THEN
79679
      ELSE IF( M.LT.0 ) THEN
77806
         INFO = -3
79680
         INFO = -3
77807
      ELSE IF( N.LT.0 ) THEN
79681
      ELSE IF( N.LT.0 ) THEN
Line 78041... Line 79915...
78041
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
79915
      PARAMETER          ( ONE = ( 1.0D+0, 0.0D+0 ) )
78042
*     ..
79916
*     ..
78043
*     .. Local Scalars ..
79917
*     .. Local Scalars ..
78044
      LOGICAL            LEFT, NOTRAN
79918
      LOGICAL            LEFT, NOTRAN
78045
      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
79919
      INTEGER            I, I1, I2, I3, IC, JC, MI, NI, NQ
78046
      COMPLEX*16         AII, TAUI
79920
      COMPLEX*16         TAUI
78047
*     ..
79921
*     ..
78048
*     .. External Functions ..
79922
*     .. External Functions ..
78049
      LOGICAL            LSAME
79923
      LOGICAL            LSAME
78050
      EXTERNAL           LSAME
79924
      EXTERNAL           LSAME
78051
*     ..
79925
*     ..
78052
*     .. External Subroutines ..
79926
*     .. External Subroutines ..
78053
      EXTERNAL           XERBLA, ZLACGV, ZLARF
79927
      EXTERNAL           XERBLA, ZLACGV, ZLARF1F
78054
*     ..
79928
*     ..
78055
*     .. Intrinsic Functions ..
79929
*     .. Intrinsic Functions ..
78056
      INTRINSIC          DCONJG, MAX
79930
      INTRINSIC          DCONJG, MAX
78057
*     ..
79931
*     ..
78058
*     .. Executable Statements ..
79932
*     .. Executable Statements ..
Line 78135... Line 80009...
78135
         ELSE
80009
         ELSE
78136
            TAUI = TAU( I )
80010
            TAUI = TAU( I )
78137
         END IF
80011
         END IF
78138
         IF( I.LT.NQ )
80012
         IF( I.LT.NQ )
78139
     $      CALL ZLACGV( NQ-I, A( I, I+1 ), LDA )
80013
     $      CALL ZLACGV( NQ-I, A( I, I+1 ), LDA )
78140
         AII = A( I, I )
-
 
78141
         A( I, I ) = ONE
-
 
78142
         CALL ZLARF( SIDE, MI, NI, A( I, I ), LDA, TAUI, C( IC, JC ),
80014
         CALL ZLARF1F( SIDE, MI, NI, A( I, I ), LDA, TAUI, C( IC,
78143
     $               LDC, WORK )
80015
     $                 JC ), LDC, WORK )
78144
         A( I, I ) = AII
-
 
78145
         IF( I.LT.NQ )
80016
         IF( I.LT.NQ )
78146
     $      CALL ZLACGV( NQ-I, A( I, I+1 ), LDA )
80017
     $      CALL ZLACGV( NQ-I, A( I, I+1 ), LDA )
78147
   10 CONTINUE
80018
   10 CONTINUE
78148
      RETURN
80019
      RETURN
78149
*
80020
*
Line 78391... Line 80262...
78391
*
80262
*
78392
      IF( INFO.EQ.0 ) THEN
80263
      IF( INFO.EQ.0 ) THEN
78393
*
80264
*
78394
*        Compute the workspace requirements
80265
*        Compute the workspace requirements
78395
*
80266
*
78396
         NB = MIN( NBMAX, ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N, K,
80267
         NB = MIN( NBMAX, ILAENV( 1, 'ZUNMLQ', SIDE // TRANS, M, N,
-
 
80268
     $             K,
78397
     $        -1 ) )
80269
     $        -1 ) )
78398
         LWKOPT = NW*NB + TSIZE
80270
         LWKOPT = NW*NB + TSIZE
78399
         WORK( 1 ) = LWKOPT
80271
         WORK( 1 ) = LWKOPT
78400
      END IF
80272
      END IF
78401
*
80273
*
Line 78416... Line 80288...
78416
      NBMIN = 2
80288
      NBMIN = 2
78417
      LDWORK = NW
80289
      LDWORK = NW
78418
      IF( NB.GT.1 .AND. NB.LT.K ) THEN
80290
      IF( NB.GT.1 .AND. NB.LT.K ) THEN
78419
         IF( LWORK.LT.LWKOPT ) THEN
80291
         IF( LWORK.LT.LWKOPT ) THEN
78420
            NB = (LWORK-TSIZE) / LDWORK
80292
            NB = (LWORK-TSIZE) / LDWORK
78421
            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMLQ', SIDE // TRANS, M, N, K,
80293
            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMLQ', SIDE // TRANS, M, N,
-
 
80294
     $                   K,
78422
     $              -1 ) )
80295
     $              -1 ) )
78423
         END IF
80296
         END IF
78424
      END IF
80297
      END IF
78425
*
80298
*
78426
      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
80299
      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
78427
*
80300
*
78428
*        Use unblocked code
80301
*        Use unblocked code
78429
*
80302
*
78430
         CALL ZUNML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
80303
         CALL ZUNML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-
 
80304
     $                WORK,
78431
     $                IINFO )
80305
     $                IINFO )
78432
      ELSE
80306
      ELSE
78433
*
80307
*
78434
*        Use blocked code
80308
*        Use blocked code
78435
*
80309
*
Line 78481... Line 80355...
78481
               JC = I
80355
               JC = I
78482
            END IF
80356
            END IF
78483
*
80357
*
78484
*           Apply H or H**H
80358
*           Apply H or H**H
78485
*
80359
*
78486
            CALL ZLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI, IB,
80360
            CALL ZLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI,
-
 
80361
     $                   IB,
78487
     $                   A( I, I ), LDA, WORK( IWT ), LDT,
80362
     $                   A( I, I ), LDA, WORK( IWT ), LDT,
78488
     $                   C( IC, JC ), LDC, WORK, LDWORK )
80363
     $                   C( IC, JC ), LDC, WORK, LDWORK )
78489
   10    CONTINUE
80364
   10    CONTINUE
78490
      END IF
80365
      END IF
78491
      WORK( 1 ) = LWKOPT
80366
      WORK( 1 ) = LWKOPT
Line 78737... Line 80612...
78737
*        Compute the workspace requirements
80612
*        Compute the workspace requirements
78738
*
80613
*
78739
         IF( M.EQ.0 .OR. N.EQ.0 ) THEN
80614
         IF( M.EQ.0 .OR. N.EQ.0 ) THEN
78740
            LWKOPT = 1
80615
            LWKOPT = 1
78741
         ELSE
80616
         ELSE
78742
            NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQL', SIDE // TRANS, M, N,
80617
            NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQL', SIDE // TRANS, M,
-
 
80618
     $                N,
78743
     $                               K, -1 ) )
80619
     $                               K, -1 ) )
78744
            LWKOPT = NW*NB + TSIZE
80620
            LWKOPT = NW*NB + TSIZE
78745
         END IF
80621
         END IF
78746
         WORK( 1 ) = LWKOPT
80622
         WORK( 1 ) = LWKOPT
78747
      END IF
80623
      END IF
Line 78762... Line 80638...
78762
      NBMIN = 2
80638
      NBMIN = 2
78763
      LDWORK = NW
80639
      LDWORK = NW
78764
      IF( NB.GT.1 .AND. NB.LT.K ) THEN
80640
      IF( NB.GT.1 .AND. NB.LT.K ) THEN
78765
         IF( LWORK.LT.LWKOPT ) THEN
80641
         IF( LWORK.LT.LWKOPT ) THEN
78766
            NB = (LWORK-TSIZE) / LDWORK
80642
            NB = (LWORK-TSIZE) / LDWORK
78767
            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQL', SIDE // TRANS, M, N, K,
80643
            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQL', SIDE // TRANS, M, N,
-
 
80644
     $                   K,
78768
     $              -1 ) )
80645
     $              -1 ) )
78769
         END IF
80646
         END IF
78770
      END IF
80647
      END IF
78771
*
80648
*
78772
      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
80649
      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
78773
*
80650
*
78774
*        Use unblocked code
80651
*        Use unblocked code
78775
*
80652
*
78776
         CALL ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
80653
         CALL ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-
 
80654
     $                WORK,
78777
     $                IINFO )
80655
     $                IINFO )
78778
      ELSE
80656
      ELSE
78779
*
80657
*
78780
*        Use blocked code
80658
*        Use blocked code
78781
*
80659
*
Line 78817... Line 80695...
78817
               NI = N - K + I + IB - 1
80695
               NI = N - K + I + IB - 1
78818
            END IF
80696
            END IF
78819
*
80697
*
78820
*           Apply H or H**H
80698
*           Apply H or H**H
78821
*
80699
*
78822
            CALL ZLARFB( SIDE, TRANS, 'Backward', 'Columnwise', MI, NI,
80700
            CALL ZLARFB( SIDE, TRANS, 'Backward', 'Columnwise', MI,
-
 
80701
     $                   NI,
78823
     $                   IB, A( 1, I ), LDA, WORK( IWT ), LDT, C, LDC,
80702
     $                   IB, A( 1, I ), LDA, WORK( IWT ), LDT, C, LDC,
78824
     $                   WORK, LDWORK )
80703
     $                   WORK, LDWORK )
78825
   10    CONTINUE
80704
   10    CONTINUE
78826
      END IF
80705
      END IF
78827
      WORK( 1 ) = LWKOPT
80706
      WORK( 1 ) = LWKOPT
Line 79070... Line 80949...
79070
*
80949
*
79071
      IF( INFO.EQ.0 ) THEN
80950
      IF( INFO.EQ.0 ) THEN
79072
*
80951
*
79073
*        Compute the workspace requirements
80952
*        Compute the workspace requirements
79074
*
80953
*
79075
         NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N, K,
80954
         NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N,
-
 
80955
     $             K,
79076
     $        -1 ) )
80956
     $        -1 ) )
79077
         LWKOPT = NW*NB + TSIZE
80957
         LWKOPT = NW*NB + TSIZE
79078
         WORK( 1 ) = LWKOPT
80958
         WORK( 1 ) = LWKOPT
79079
      END IF
80959
      END IF
79080
*
80960
*
Line 79095... Line 80975...
79095
      NBMIN = 2
80975
      NBMIN = 2
79096
      LDWORK = NW
80976
      LDWORK = NW
79097
      IF( NB.GT.1 .AND. NB.LT.K ) THEN
80977
      IF( NB.GT.1 .AND. NB.LT.K ) THEN
79098
         IF( LWORK.LT.LWKOPT ) THEN
80978
         IF( LWORK.LT.LWKOPT ) THEN
79099
            NB = (LWORK-TSIZE) / LDWORK
80979
            NB = (LWORK-TSIZE) / LDWORK
79100
            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQR', SIDE // TRANS, M, N, K,
80980
            NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQR', SIDE // TRANS, M, N,
-
 
80981
     $                   K,
79101
     $              -1 ) )
80982
     $              -1 ) )
79102
         END IF
80983
         END IF
79103
      END IF
80984
      END IF
79104
*
80985
*
79105
      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
80986
      IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN
79106
*
80987
*
79107
*        Use unblocked code
80988
*        Use unblocked code
79108
*
80989
*
79109
         CALL ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK,
80990
         CALL ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC,
-
 
80991
     $                WORK,
79110
     $                IINFO )
80992
     $                IINFO )
79111
      ELSE
80993
      ELSE
79112
*
80994
*
79113
*        Use blocked code
80995
*        Use blocked code
79114
*
80996
*
Line 79136... Line 81018...
79136
            IB = MIN( NB, K-I+1 )
81018
            IB = MIN( NB, K-I+1 )
79137
*
81019
*
79138
*           Form the triangular factor of the block reflector
81020
*           Form the triangular factor of the block reflector
79139
*           H = H(i) H(i+1) . . . H(i+ib-1)
81021
*           H = H(i) H(i+1) . . . H(i+ib-1)
79140
*
81022
*
79141
            CALL ZLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ),
81023
            CALL ZLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I,
-
 
81024
     $                   I ),
79142
     $                   LDA, TAU( I ), WORK( IWT ), LDT )
81025
     $                   LDA, TAU( I ), WORK( IWT ), LDT )
79143
            IF( LEFT ) THEN
81026
            IF( LEFT ) THEN
79144
*
81027
*
79145
*              H or H**H is applied to C(i:m,1:n)
81028
*              H or H**H is applied to C(i:m,1:n)
79146
*
81029
*
Line 79154... Line 81037...
79154
               JC = I
81037
               JC = I
79155
            END IF
81038
            END IF
79156
*
81039
*
79157
*           Apply H or H**H
81040
*           Apply H or H**H
79158
*
81041
*
79159
            CALL ZLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI,
81042
            CALL ZLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI,
-
 
81043
     $                   NI,
79160
     $                   IB, A( I, I ), LDA, WORK( IWT ), LDT,
81044
     $                   IB, A( I, I ), LDA, WORK( IWT ), LDT,
79161
     $                   C( IC, JC ), LDC, WORK, LDWORK )
81045
     $                   C( IC, JC ), LDC, WORK, LDWORK )
79162
   10    CONTINUE
81046
   10    CONTINUE
79163
      END IF
81047
      END IF
79164
      WORK( 1 ) = LWKOPT
81048
      WORK( 1 ) = LWKOPT
Line 79333... Line 81217...
79333
*> \author NAG Ltd.
81217
*> \author NAG Ltd.
79334
*
81218
*
79335
*> \ingroup unmtr
81219
*> \ingroup unmtr
79336
*
81220
*
79337
*  =====================================================================
81221
*  =====================================================================
79338
      SUBROUTINE ZUNMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC,
81222
      SUBROUTINE ZUNMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C,
-
 
81223
     $                   LDC,
79339
     $                   WORK, LWORK, INFO )
81224
     $                   WORK, LWORK, INFO )
79340
*
81225
*
79341
*  -- LAPACK computational routine --
81226
*  -- LAPACK computational routine --
79342
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
81227
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
79343
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
81228
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
Line 79387... Line 81272...
79387
      END IF
81272
      END IF
79388
      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
81273
      IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
79389
         INFO = -1
81274
         INFO = -1
79390
      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
81275
      ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
79391
         INFO = -2
81276
         INFO = -2
79392
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'C' ) )
81277
      ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND.
-
 
81278
     $         .NOT.LSAME( TRANS, 'C' ) )
79393
     $          THEN
81279
     $          THEN
79394
         INFO = -3
81280
         INFO = -3
79395
      ELSE IF( M.LT.0 ) THEN
81281
      ELSE IF( M.LT.0 ) THEN
79396
         INFO = -4
81282
         INFO = -4
79397
      ELSE IF( N.LT.0 ) THEN
81283
      ELSE IF( N.LT.0 ) THEN
Line 79450... Line 81336...
79450
*
81336
*
79451
      IF( UPPER ) THEN
81337
      IF( UPPER ) THEN
79452
*
81338
*
79453
*        Q was determined by a call to ZHETRD with UPLO = 'U'
81339
*        Q was determined by a call to ZHETRD with UPLO = 'U'
79454
*
81340
*
79455
         CALL ZUNMQL( SIDE, TRANS, MI, NI, NQ-1, A( 1, 2 ), LDA, TAU, C,
81341
         CALL ZUNMQL( SIDE, TRANS, MI, NI, NQ-1, A( 1, 2 ), LDA, TAU,
-
 
81342
     $                C,
79456
     $                LDC, WORK, LWORK, IINFO )
81343
     $                LDC, WORK, LWORK, IINFO )
79457
      ELSE
81344
      ELSE
79458
*
81345
*
79459
*        Q was determined by a call to ZHETRD with UPLO = 'L'
81346
*        Q was determined by a call to ZHETRD with UPLO = 'L'
79460
*
81347
*