Diff for /rpl/lapack/lapack/zuncsd.f between versions 1.5 and 1.15

version 1.5, 2011/11/21 22:19:59 version 1.15, 2018/05/29 07:18:41
Line 2 Line 2
 *  *
 *  =========== DOCUMENTATION ===========  *  =========== DOCUMENTATION ===========
 *  *
 * Online html documentation available at   * Online html documentation available at
 *            http://www.netlib.org/lapack/explore-html/   *            http://www.netlib.org/lapack/explore-html/
 *  *
 *> \htmlonly  *> \htmlonly
 *> Download ZUNCSD + dependencies   *> Download ZUNCSD + dependencies
 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zuncsd.f">   *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zuncsd.f">
 *> [TGZ]</a>   *> [TGZ]</a>
 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zuncsd.f">   *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zuncsd.f">
 *> [ZIP]</a>   *> [ZIP]</a>
 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zuncsd.f">   *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zuncsd.f">
 *> [TXT]</a>  *> [TXT]</a>
 *> \endhtmlonly   *> \endhtmlonly
 *  *
 *  Definition:  *  Definition:
 *  ===========  *  ===========
Line 24 Line 24
 *                                    U1, LDU1, U2, LDU2, V1T, LDV1T, V2T,  *                                    U1, LDU1, U2, LDU2, V1T, LDV1T, V2T,
 *                                    LDV2T, WORK, LWORK, RWORK, LRWORK,  *                                    LDV2T, WORK, LWORK, RWORK, LRWORK,
 *                                    IWORK, INFO )  *                                    IWORK, INFO )
 *   *
 *       .. Scalar Arguments ..  *       .. Scalar Arguments ..
 *       CHARACTER          JOBU1, JOBU2, JOBV1T, JOBV2T, SIGNS, TRANS  *       CHARACTER          JOBU1, JOBU2, JOBV1T, JOBV2T, SIGNS, TRANS
 *       INTEGER            INFO, LDU1, LDU2, LDV1T, LDV2T, LDX11, LDX12,  *       INTEGER            INFO, LDU1, LDU2, LDV1T, LDV2T, LDX11, LDX12,
Line 39 Line 39
 *      $                   X12( LDX12, * ), X21( LDX21, * ), X22( LDX22,  *      $                   X12( LDX12, * ), X21( LDX21, * ), X22( LDX22,
 *      $                   * )  *      $                   * )
 *       ..  *       ..
 *    *
 *  *
 *> \par Purpose:  *> \par Purpose:
 *  =============  *  =============
Line 188 Line 188
 *>  *>
 *> \param[out] U1  *> \param[out] U1
 *> \verbatim  *> \verbatim
 *>          U1 is COMPLEX*16 array, dimension (P)  *>          U1 is COMPLEX*16 array, dimension (LDU1,P)
 *>          If JOBU1 = 'Y', U1 contains the P-by-P unitary matrix U1.  *>          If JOBU1 = 'Y', U1 contains the P-by-P unitary matrix U1.
 *> \endverbatim  *> \endverbatim
 *>  *>
Line 201 Line 201
 *>  *>
 *> \param[out] U2  *> \param[out] U2
 *> \verbatim  *> \verbatim
 *>          U2 is COMPLEX*16 array, dimension (M-P)  *>          U2 is COMPLEX*16 array, dimension (LDU2,M-P)
 *>          If JOBU2 = 'Y', U2 contains the (M-P)-by-(M-P) unitary  *>          If JOBU2 = 'Y', U2 contains the (M-P)-by-(M-P) unitary
 *>          matrix U2.  *>          matrix U2.
 *> \endverbatim  *> \endverbatim
Line 215 Line 215
 *>  *>
 *> \param[out] V1T  *> \param[out] V1T
 *> \verbatim  *> \verbatim
 *>          V1T is COMPLEX*16 array, dimension (Q)  *>          V1T is COMPLEX*16 array, dimension (LDV1T,Q)
 *>          If JOBV1T = 'Y', V1T contains the Q-by-Q matrix unitary  *>          If JOBV1T = 'Y', V1T contains the Q-by-Q matrix unitary
 *>          matrix V1**H.  *>          matrix V1**H.
 *> \endverbatim  *> \endverbatim
Line 229 Line 229
 *>  *>
 *> \param[out] V2T  *> \param[out] V2T
 *> \verbatim  *> \verbatim
 *>          V2T is COMPLEX*16 array, dimension (M-Q)  *>          V2T is COMPLEX*16 array, dimension (LDV2T,M-Q)
 *>          If JOBV2T = 'Y', V2T contains the (M-Q)-by-(M-Q) unitary  *>          If JOBV2T = 'Y', V2T contains the (M-Q)-by-(M-Q) unitary
 *>          matrix V2**H.  *>          matrix V2**H.
 *> \endverbatim  *> \endverbatim
Line 303 Line 303
 *  Authors:  *  Authors:
 *  ========  *  ========
 *  *
 *> \author Univ. of Tennessee   *> \author Univ. of Tennessee
 *> \author Univ. of California Berkeley   *> \author Univ. of California Berkeley
 *> \author Univ. of Colorado Denver   *> \author Univ. of Colorado Denver
 *> \author NAG Ltd.   *> \author NAG Ltd.
 *  *
 *> \date November 2011  *> \date June 2017
 *  *
 *> \ingroup complex16OTHERcomputational  *> \ingroup complex16OTHERcomputational
 *  *
Line 320 Line 320
      $                             LDV2T, WORK, LWORK, RWORK, LRWORK,       $                             LDV2T, WORK, LWORK, RWORK, LRWORK,
      $                             IWORK, INFO )       $                             IWORK, INFO )
 *  *
 *  -- LAPACK computational routine (version 3.4.0) --  *  -- LAPACK computational routine (version 3.7.1) --
 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --  *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--  *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 *     November 2011  *     June 2017
 *  *
 *     .. Scalar Arguments ..  *     .. Scalar Arguments ..
       CHARACTER          JOBU1, JOBU2, JOBV1T, JOBV2T, SIGNS, TRANS        CHARACTER          JOBU1, JOBU2, JOBV1T, JOBV2T, SIGNS, TRANS
Line 343 Line 343
 *  ===================================================================  *  ===================================================================
 *  *
 *     .. Parameters ..  *     .. Parameters ..
       DOUBLE PRECISION   REALONE        COMPLEX*16         ONE, ZERO
       PARAMETER          ( REALONE = 1.0D0 )        PARAMETER          ( ONE = (1.0D0,0.0D0),
       COMPLEX*16         NEGONE, ONE, PIOVER2, ZERO  
       PARAMETER          ( NEGONE = (-1.0D0,0.0D0), ONE = (1.0D0,0.0D0),  
      $                     PIOVER2 = 1.57079632679489662D0,  
      $                     ZERO = (0.0D0,0.0D0) )       $                     ZERO = (0.0D0,0.0D0) )
 *     ..  *     ..
 *     .. Local Scalars ..  *     .. Local Scalars ..
Line 359 Line 356
      $                   LBBCSDWORKOPT, LORBDBWORK, LORBDBWORKMIN,       $                   LBBCSDWORKOPT, LORBDBWORK, LORBDBWORKMIN,
      $                   LORBDBWORKOPT, LORGLQWORK, LORGLQWORKMIN,       $                   LORBDBWORKOPT, LORGLQWORK, LORGLQWORKMIN,
      $                   LORGLQWORKOPT, LORGQRWORK, LORGQRWORKMIN,       $                   LORGLQWORKOPT, LORGQRWORK, LORGQRWORKMIN,
      $                   LORGQRWORKOPT, LWORKMIN, LWORKOPT       $                   LORGQRWORKOPT, LWORKMIN, LWORKOPT, P1, Q1
       LOGICAL            COLMAJOR, DEFAULTSIGNS, LQUERY, WANTU1, WANTU2,        LOGICAL            COLMAJOR, DEFAULTSIGNS, LQUERY, WANTU1, WANTU2,
      $                   WANTV1T, WANTV2T       $                   WANTV1T, WANTV2T
       INTEGER            LRWORKMIN, LRWORKOPT        INTEGER            LRWORKMIN, LRWORKOPT
       LOGICAL            LRQUERY        LOGICAL            LRQUERY
 *     ..  *     ..
 *     .. External Subroutines ..  *     .. External Subroutines ..
       EXTERNAL           XERBLA, ZBBCSD, ZLACPY, ZLAPMR, ZLAPMT, ZLASCL,        EXTERNAL           XERBLA, ZBBCSD, ZLACPY, ZLAPMR, ZLAPMT,
      $                   ZLASET, ZUNBDB, ZUNGLQ, ZUNGQR       $                   ZUNBDB, ZUNGLQ, ZUNGQR
 *     ..  *     ..
 *     .. External Functions ..  *     .. External Functions ..
       LOGICAL            LSAME        LOGICAL            LSAME
       EXTERNAL           LSAME        EXTERNAL           LSAME
 *     ..  *     ..
 *     .. Intrinsic Functions  *     .. Intrinsic Functions
       INTRINSIC          COS, INT, MAX, MIN, SIN        INTRINSIC          INT, MAX, MIN
 *     ..  *     ..
 *     .. Executable Statements ..  *     .. Executable Statements ..
 *  *
Line 395 Line 392
          INFO = -8           INFO = -8
       ELSE IF( Q .LT. 0 .OR. Q .GT. M ) THEN        ELSE IF( Q .LT. 0 .OR. Q .GT. M ) THEN
          INFO = -9           INFO = -9
       ELSE IF( ( COLMAJOR .AND. LDX11 .LT. MAX(1,P) ) .OR.        ELSE IF ( COLMAJOR .AND.  LDX11 .LT. MAX( 1, P ) ) THEN
      $         ( .NOT.COLMAJOR .AND. LDX11 .LT. MAX(1,Q) ) ) THEN          INFO = -11
          INFO = -11        ELSE IF (.NOT. COLMAJOR .AND. LDX11 .LT. MAX( 1, Q ) ) THEN
           INFO = -11
         ELSE IF (COLMAJOR .AND. LDX12 .LT. MAX( 1, P ) ) THEN
           INFO = -13
         ELSE IF (.NOT. COLMAJOR .AND. LDX12 .LT. MAX( 1, M-Q ) ) THEN
           INFO = -13
         ELSE IF (COLMAJOR .AND. LDX21 .LT. MAX( 1, M-P ) ) THEN
           INFO = -15
         ELSE IF (.NOT. COLMAJOR .AND. LDX21 .LT. MAX( 1, Q ) ) THEN
           INFO = -15
         ELSE IF (COLMAJOR .AND. LDX22 .LT. MAX( 1, M-P ) ) THEN
           INFO = -17
         ELSE IF (.NOT. COLMAJOR .AND. LDX22 .LT. MAX( 1, M-Q ) ) THEN
           INFO = -17
       ELSE IF( WANTU1 .AND. LDU1 .LT. P ) THEN        ELSE IF( WANTU1 .AND. LDU1 .LT. P ) THEN
          INFO = -20           INFO = -20
       ELSE IF( WANTU2 .AND. LDU2 .LT. M-P ) THEN        ELSE IF( WANTU2 .AND. LDU2 .LT. M-P ) THEN
Line 461 Line 471
          IB22D = IB21E + MAX( 1, Q - 1 )           IB22D = IB21E + MAX( 1, Q - 1 )
          IB22E = IB22D + MAX( 1, Q )           IB22E = IB22D + MAX( 1, Q )
          IBBCSD = IB22E + MAX( 1, Q - 1 )           IBBCSD = IB22E + MAX( 1, Q - 1 )
          CALL ZBBCSD( JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS, M, P, Q, 0,           CALL ZBBCSD( JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS, M, P, Q,
      $                0, U1, LDU1, U2, LDU2, V1T, LDV1T, V2T, LDV2T, 0,       $                THETA, THETA, U1, LDU1, U2, LDU2, V1T, LDV1T,
      $                0, 0, 0, 0, 0, 0, 0, RWORK, -1, CHILDINFO )       $                V2T, LDV2T, THETA, THETA, THETA, THETA, THETA,
        $                THETA, THETA, THETA, RWORK, -1, CHILDINFO )
          LBBCSDWORKOPT = INT( RWORK(1) )           LBBCSDWORKOPT = INT( RWORK(1) )
          LBBCSDWORKMIN = LBBCSDWORKOPT           LBBCSDWORKMIN = LBBCSDWORKOPT
          LRWORKOPT = IBBCSD + LBBCSDWORKOPT - 1           LRWORKOPT = IBBCSD + LBBCSDWORKOPT - 1
Line 477 Line 488
          ITAUQ1 = ITAUP2 + MAX( 1, M - P )           ITAUQ1 = ITAUP2 + MAX( 1, M - P )
          ITAUQ2 = ITAUQ1 + MAX( 1, Q )           ITAUQ2 = ITAUQ1 + MAX( 1, Q )
          IORGQR = ITAUQ2 + MAX( 1, M - Q )           IORGQR = ITAUQ2 + MAX( 1, M - Q )
          CALL ZUNGQR( M-Q, M-Q, M-Q, 0, MAX(1,M-Q), 0, WORK, -1,           CALL ZUNGQR( M-Q, M-Q, M-Q, U1, MAX(1,M-Q), U1, WORK, -1,
      $                CHILDINFO )       $                CHILDINFO )
          LORGQRWORKOPT = INT( WORK(1) )           LORGQRWORKOPT = INT( WORK(1) )
          LORGQRWORKMIN = MAX( 1, M - Q )           LORGQRWORKMIN = MAX( 1, M - Q )
          IORGLQ = ITAUQ2 + MAX( 1, M - Q )           IORGLQ = ITAUQ2 + MAX( 1, M - Q )
          CALL ZUNGLQ( M-Q, M-Q, M-Q, 0, MAX(1,M-Q), 0, WORK, -1,           CALL ZUNGLQ( M-Q, M-Q, M-Q, U1, MAX(1,M-Q), U1, WORK, -1,
      $                CHILDINFO )       $                CHILDINFO )
          LORGLQWORKOPT = INT( WORK(1) )           LORGLQWORKOPT = INT( WORK(1) )
          LORGLQWORKMIN = MAX( 1, M - Q )           LORGLQWORKMIN = MAX( 1, M - Q )
          IORBDB = ITAUQ2 + MAX( 1, M - Q )           IORBDB = ITAUQ2 + MAX( 1, M - Q )
          CALL ZUNBDB( TRANS, SIGNS, M, P, Q, X11, LDX11, X12, LDX12,           CALL ZUNBDB( TRANS, SIGNS, M, P, Q, X11, LDX11, X12, LDX12,
      $                X21, LDX21, X22, LDX22, 0, 0, 0, 0, 0, 0, WORK,       $                X21, LDX21, X22, LDX22, THETA, THETA, U1, U2,
      $                -1, CHILDINFO )       $                V1T, V2T, WORK, -1, CHILDINFO )
          LORBDBWORKOPT = INT( WORK(1) )           LORBDBWORKOPT = INT( WORK(1) )
          LORBDBWORKMIN = LORBDBWORKOPT           LORBDBWORKMIN = LORBDBWORKOPT
          LWORKOPT = MAX( IORGQR + LORGQRWORKOPT, IORGLQ + LORGLQWORKOPT,           LWORKOPT = MAX( IORGQR + LORGQRWORKOPT, IORGLQ + LORGLQWORKOPT,
Line 554 Line 565
          END IF           END IF
          IF( WANTV2T .AND. M-Q .GT. 0 ) THEN           IF( WANTV2T .AND. M-Q .GT. 0 ) THEN
             CALL ZLACPY( 'U', P, M-Q, X12, LDX12, V2T, LDV2T )              CALL ZLACPY( 'U', P, M-Q, X12, LDX12, V2T, LDV2T )
             CALL ZLACPY( 'U', M-P-Q, M-P-Q, X22(Q+1,P+1), LDX22,              IF( M-P .GT. Q) THEN
      $                   V2T(P+1,P+1), LDV2T )                 CALL ZLACPY( 'U', M-P-Q, M-P-Q, X22(Q+1,P+1), LDX22,
             CALL ZUNGLQ( M-Q, M-Q, M-Q, V2T, LDV2T, WORK(ITAUQ2),       $                      V2T(P+1,P+1), LDV2T )
      $                   WORK(IORGLQ), LORGLQWORK, INFO )              END IF
               IF( M .GT. Q ) THEN
                  CALL ZUNGLQ( M-Q, M-Q, M-Q, V2T, LDV2T, WORK(ITAUQ2),
        $                      WORK(IORGLQ), LORGLQWORK, INFO )
               END IF
          END IF           END IF
       ELSE        ELSE
          IF( WANTU1 .AND. P .GT. 0 ) THEN           IF( WANTU1 .AND. P .GT. 0 ) THEN
Line 582 Line 597
      $                   WORK(IORGQR), LORGQRWORK, INFO )       $                   WORK(IORGQR), LORGQRWORK, INFO )
          END IF           END IF
          IF( WANTV2T .AND. M-Q .GT. 0 ) THEN           IF( WANTV2T .AND. M-Q .GT. 0 ) THEN
               P1 = MIN( P+1, M )
               Q1 = MIN( Q+1, M )
             CALL ZLACPY( 'L', M-Q, P, X12, LDX12, V2T, LDV2T )              CALL ZLACPY( 'L', M-Q, P, X12, LDX12, V2T, LDV2T )
             CALL ZLACPY( 'L', M-P-Q, M-P-Q, X22(P+1,Q+1), LDX22,              IF( M .GT. P+Q ) THEN
      $                   V2T(P+1,P+1), LDV2T )                 CALL ZLACPY( 'L', M-P-Q, M-P-Q, X22(P1,Q1), LDX22,
        $                      V2T(P+1,P+1), LDV2T )
               END IF
             CALL ZUNGQR( M-Q, M-Q, M-Q, V2T, LDV2T, WORK(ITAUQ2),              CALL ZUNGQR( M-Q, M-Q, M-Q, V2T, LDV2T, WORK(ITAUQ2),
      $                   WORK(IORGQR), LORGQRWORK, INFO )       $                   WORK(IORGQR), LORGQRWORK, INFO )
          END IF           END IF
Line 602 Line 621
 *     Permute rows and columns to place identity submatrices in top-  *     Permute rows and columns to place identity submatrices in top-
 *     left corner of (1,1)-block and/or bottom-right corner of (1,2)-  *     left corner of (1,1)-block and/or bottom-right corner of (1,2)-
 *     block and/or bottom-right corner of (2,1)-block and/or top-left  *     block and/or bottom-right corner of (2,1)-block and/or top-left
 *     corner of (2,2)-block   *     corner of (2,2)-block
 *  *
       IF( Q .GT. 0 .AND. WANTU2 ) THEN        IF( Q .GT. 0 .AND. WANTU2 ) THEN
          DO I = 1, Q           DO I = 1, Q

Removed from v.1.5  
changed lines
  Added in v.1.15


CVSweb interface <joel.bertrand@systella.fr>