APPLYING INTEL PATCHES sent to Julie on Feb 19th 2016 by Dima from INTEL (dmitry...
authorjulie <julielangou@users.noreply.github.com>
Tue, 23 Feb 2016 05:12:12 +0000 (05:12 +0000)
committerjulie <julielangou@users.noreply.github.com>
Tue, 23 Feb 2016 05:12:12 +0000 (05:12 +0000)
Subject: [PATCH 06/42] Fix ???CSD2BY1 - workspace query should not pass bad LD to ???GQR/GLQ

SRC/cuncsd2by1.f
SRC/dorcsd2by1.f
SRC/sorcsd2by1.f
SRC/zuncsd2by1.f

index 1b2b0fb2accbefc6c46e2047ef77eb075ccb9f00..f431b337d3f39135f5764bc5bb3f6c696bde8ac7 100644 (file)
          INFO = -8
       ELSE IF( LDX21 .LT. MAX( 1, M-P ) ) THEN
          INFO = -10
-      ELSE IF( WANTU1 .AND. LDU1 .LT. P ) THEN
+      ELSE IF( WANTU1 .AND. LDU1 .LT. MAX( 1, P ) ) THEN
          INFO = -13
-      ELSE IF( WANTU2 .AND. LDU2 .LT. M - P ) THEN
+      ELSE IF( WANTU2 .AND. LDU2 .LT. MAX( 1, M - P ) ) THEN
          INFO = -15
-      ELSE IF( WANTV1T .AND. LDV1T .LT. Q ) THEN
+      ELSE IF( WANTV1T .AND. LDV1T .LT. MAX( 1, Q ) ) THEN
          INFO = -17
       END IF
 *
          IORBDB = ITAUQ1 + MAX( 1, Q )
          IORGQR = ITAUQ1 + MAX( 1, Q )
          IORGLQ = ITAUQ1 + MAX( 1, Q )
+         LORGQRMIN = 1
+         LORGQROPT = 1
+         LORGLQMIN = 1
+         LORGLQOPT = 1
          IF( R .EQ. Q ) THEN
             CALL CUNBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK, -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL CUNGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            ENDIF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL CUNGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL CUNGLQ( Q-1, Q-1, Q-1, V1T, LDV1T,
+     $                      0, WORK(1), -1, CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q-1 )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL CUNGLQ( MAX(0,Q-1), MAX(0,Q-1), MAX(0,Q-1), V1T, LDV1T,
-     $                   0, WORK(1), -1, CHILDINFO )
-            LORGLQMIN = MAX( 1, Q-1 )
-            LORGLQOPT = INT( WORK(1) )
             CALL CBBCSD( JOBU1, JOBU2, JOBV1T, 'N', 'N', M, P, Q, THETA,
      $                   0, U1, LDU1, U2, LDU2, V1T, LDV1T, 0, 1, 0, 0,
      $                   0, 0, 0, 0, 0, 0, RWORK(1), -1, CHILDINFO )
             CALL CUNBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P-1 .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL CUNGQR( P-1, P-1, P-1, U1(2,2), LDU1, 0, WORK(1),
      $                      -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, P-1 )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL CUNGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL CUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL CUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL CBBCSD( JOBV1T, 'N', JOBU1, JOBU2, 'T', M, Q, P, THETA,
      $                   0, V1T, LDV1T, 0, 1, U1, LDU1, U2, LDU2, 0, 0,
      $                   0, 0, 0, 0, 0, 0, RWORK(1), -1, CHILDINFO )
             CALL CUNBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P-1 ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL CUNGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL CUNGQR( M-P-1, M-P-1, M-P-1, U2(2,2), LDU2, 0,
      $                      WORK(1), -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P-1 )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL CUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL CUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL CBBCSD( 'N', JOBV1T, JOBU2, JOBU1, 'T', M, M-Q, M-P,
      $                   THETA, 0, 0, 1, V1T, LDV1T, U2, LDU2, U1, LDU1,
      $                   0, 0, 0, 0, 0, 0, 0, 0, RWORK(1), -1,
             CALL CUNBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = M + INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL CUNGQR( P, P, M-Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL CUNGQR( M-P, M-P, M-Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL CUNGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL CUNGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL CBBCSD( JOBU2, JOBU1, 'N', JOBV1T, 'N', M, M-P, M-Q,
      $                   THETA, 0, U2, LDU2, U1, LDU1, 0, 1, V1T, LDV1T,
      $                   0, 0, 0, 0, 0, 0, 0, 0, RWORK(1), -1,
index 19dedbe8d958db1c28f1e5b4880b710447c3cbd5..33a9b16dc8ccbbcb8c742b259903c97661c47195 100644 (file)
          INFO = -8
       ELSE IF( LDX21 .LT. MAX( 1, M-P ) ) THEN
          INFO = -10
-      ELSE IF( WANTU1 .AND. LDU1 .LT. P ) THEN
+      ELSE IF( WANTU1 .AND. LDU1 .LT. MAX( 1, P ) ) THEN
          INFO = -13
-      ELSE IF( WANTU2 .AND. LDU2 .LT. M - P ) THEN
+      ELSE IF( WANTU2 .AND. LDU2 .LT. MAX( 1, M - P ) ) THEN
          INFO = -15
-      ELSE IF( WANTV1T .AND. LDV1T .LT. Q ) THEN
+      ELSE IF( WANTV1T .AND. LDV1T .LT. MAX( 1, Q ) ) THEN
          INFO = -17
       END IF
 *
          IORBDB = ITAUQ1 + MAX( 1, Q )
          IORGQR = ITAUQ1 + MAX( 1, Q )
          IORGLQ = ITAUQ1 + MAX( 1, Q )
+         LORGQRMIN = 1
+         LORGQROPT = 1
+         LORGLQMIN = 1
+         LORGLQOPT = 1
          IF( R .EQ. Q ) THEN
             CALL DORBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK, -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL DORGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            ENDIF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL DORGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL DORGLQ( Q-1, Q-1, Q-1, V1T, LDV1T,
+     $                      0, WORK(1), -1, CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q-1 )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL DORGLQ( MAX(0,Q-1), MAX(0,Q-1), MAX(0,Q-1), V1T, LDV1T,
-     $                   0, WORK(1), -1, CHILDINFO )
-            LORGLQMIN = MAX( 1, Q-1 )
-            LORGLQOPT = INT( WORK(1) )
             CALL DBBCSD( JOBU1, JOBU2, JOBV1T, 'N', 'N', M, P, Q, THETA,
      $                   0, U1, LDU1, U2, LDU2, V1T, LDV1T, 0, 1, 0, 0,
      $                   0, 0, 0, 0, 0, 0, WORK(1), -1, CHILDINFO )
             CALL DORBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P-1 .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL DORGQR( P-1, P-1, P-1, U1(2,2), LDU1, 0, WORK(1),
      $                      -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, P-1 )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL DORGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL DORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL DORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL DBBCSD( JOBV1T, 'N', JOBU1, JOBU2, 'T', M, Q, P, THETA,
      $                   0, V1T, LDV1T, 0, 1, U1, LDU1, U2, LDU2, 0, 0,
      $                   0, 0, 0, 0, 0, 0, WORK(1), -1, CHILDINFO )
             CALL DORBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P-1 ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL DORGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL DORGQR( M-P-1, M-P-1, M-P-1, U2(2,2), LDU2, 0,
      $                      WORK(1), -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P-1 )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL DORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL DORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL DBBCSD( 'N', JOBV1T, JOBU2, JOBU1, 'T', M, M-Q, M-P,
      $                   THETA, 0, 0, 1, V1T, LDV1T, U2, LDU2, U1, LDU1,
      $                   0, 0, 0, 0, 0, 0, 0, 0, WORK(1), -1,
             CALL DORBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = M + INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL DORGQR( P, P, M-Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL DORGQR( M-P, M-P, M-Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL DORGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL DORGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL DBBCSD( JOBU2, JOBU1, 'N', JOBV1T, 'N', M, M-P, M-Q,
      $                   THETA, 0, U2, LDU2, U1, LDU1, 0, 1, V1T, LDV1T,
      $                   0, 0, 0, 0, 0, 0, 0, 0, WORK(1), -1,
index b2401af190b4b0769e7e080b138606e2006b20e8..1bc71cdaee9bdc5464cf36dc259374911cd31b39 100644 (file)
          INFO = -8
       ELSE IF( LDX21 .LT. MAX( 1, M-P ) ) THEN
          INFO = -10
-      ELSE IF( WANTU1 .AND. LDU1 .LT. P ) THEN
+      ELSE IF( WANTU1 .AND. LDU1 .LT. MAX( 1, P ) ) THEN
          INFO = -13
-      ELSE IF( WANTU2 .AND. LDU2 .LT. M - P ) THEN
+      ELSE IF( WANTU2 .AND. LDU2 .LT. MAX( 1, M - P ) ) THEN
          INFO = -15
-      ELSE IF( WANTV1T .AND. LDV1T .LT. Q ) THEN
+      ELSE IF( WANTV1T .AND. LDV1T .LT. MAX( 1, Q ) ) THEN
          INFO = -17
       END IF
 *
          IORBDB = ITAUQ1 + MAX( 1, Q )
          IORGQR = ITAUQ1 + MAX( 1, Q )
          IORGLQ = ITAUQ1 + MAX( 1, Q )
+         LORGQRMIN = 1
+         LORGQROPT = 1
+         LORGLQMIN = 1
+         LORGLQOPT = 1
          IF( R .EQ. Q ) THEN
             CALL SORBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK, -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL SORGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            ENDIF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL SORGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL SORGLQ( Q-1, Q-1, Q-1, V1T, LDV1T,
+     $                      0, WORK(1), -1, CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q-1 )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL SORGLQ( MAX(0,Q-1), MAX(0,Q-1), MAX(0,Q-1), V1T, LDV1T,
-     $                   0, WORK(1), -1, CHILDINFO )
-            LORGLQMIN = MAX( 1, Q-1 )
-            LORGLQOPT = INT( WORK(1) )
             CALL SBBCSD( JOBU1, JOBU2, JOBV1T, 'N', 'N', M, P, Q, THETA,
      $                   0, U1, LDU1, U2, LDU2, V1T, LDV1T, 0, 1, 0, 0,
      $                   0, 0, 0, 0, 0, 0, WORK(1), -1, CHILDINFO )
             CALL SORBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P-1 .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL SORGQR( P-1, P-1, P-1, U1(2,2), LDU1, 0, WORK(1),
      $                      -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, P-1 )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL SORGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL SORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL SORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL SBBCSD( JOBV1T, 'N', JOBU1, JOBU2, 'T', M, Q, P, THETA,
      $                   0, V1T, LDV1T, 0, 1, U1, LDU1, U2, LDU2, 0, 0,
      $                   0, 0, 0, 0, 0, 0, WORK(1), -1, CHILDINFO )
             CALL SORBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P-1 ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL SORGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL SORGQR( M-P-1, M-P-1, M-P-1, U2(2,2), LDU2, 0,
      $                      WORK(1), -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P-1 )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL SORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL SORGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL SBBCSD( 'N', JOBV1T, JOBU2, JOBU1, 'T', M, M-Q, M-P,
      $                   THETA, 0, 0, 1, V1T, LDV1T, U2, LDU2, U1, LDU1,
      $                   0, 0, 0, 0, 0, 0, 0, 0, WORK(1), -1,
             CALL SORBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = M + INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL SORGQR( P, P, M-Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL SORGQR( M-P, M-P, M-Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL SORGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL SORGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL SBBCSD( JOBU2, JOBU1, 'N', JOBV1T, 'N', M, M-P, M-Q,
      $                   THETA, 0, U2, LDU2, U1, LDU1, 0, 1, V1T, LDV1T,
      $                   0, 0, 0, 0, 0, 0, 0, 0, WORK(1), -1,
index 432471fe2242e847f28f53b0b3e07e6776e0af88..dc0be07aae22e9b32a43d338acbe39f2c7ea4172 100644 (file)
          INFO = -8
       ELSE IF( LDX21 .LT. MAX( 1, M-P ) ) THEN
          INFO = -10
-      ELSE IF( WANTU1 .AND. LDU1 .LT. P ) THEN
+      ELSE IF( WANTU1 .AND. LDU1 .LT. MAX( 1, P ) ) THEN
          INFO = -13
-      ELSE IF( WANTU2 .AND. LDU2 .LT. M - P ) THEN
+      ELSE IF( WANTU2 .AND. LDU2 .LT. MAX( 1, M - P ) ) THEN
          INFO = -15
-      ELSE IF( WANTV1T .AND. LDV1T .LT. Q ) THEN
+      ELSE IF( WANTV1T .AND. LDV1T .LT. MAX( 1, Q ) ) THEN
          INFO = -17
       END IF
 *
          IORBDB = ITAUQ1 + MAX( 1, Q )
          IORGQR = ITAUQ1 + MAX( 1, Q )
          IORGLQ = ITAUQ1 + MAX( 1, Q )
+         LORGQRMIN = 1
+         LORGQROPT = 1
+         LORGLQMIN = 1
+         LORGLQOPT = 1
          IF( R .EQ. Q ) THEN
             CALL ZUNBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK, -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL ZUNGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            ENDIF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL ZUNGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL ZUNGLQ( Q-1, Q-1, Q-1, V1T, LDV1T,
+     $                      0, WORK(1), -1, CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q-1 )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL ZUNGLQ( MAX(0,Q-1), MAX(0,Q-1), MAX(0,Q-1), V1T, LDV1T,
-     $                   0, WORK(1), -1, CHILDINFO )
-            LORGLQMIN = MAX( 1, Q-1 )
-            LORGLQOPT = INT( WORK(1) )
             CALL ZBBCSD( JOBU1, JOBU2, JOBV1T, 'N', 'N', M, P, Q, THETA,
      $                   0, U1, LDU1, U2, LDU2, V1T, LDV1T, 0, 1, 0, 0,
      $                   0, 0, 0, 0, 0, 0, RWORK(1), -1, CHILDINFO )
             CALL ZUNBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P-1 .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL ZUNGQR( P-1, P-1, P-1, U1(2,2), LDU1, 0, WORK(1),
      $                      -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, P-1 )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL ZUNGQR( M-P, M-P, Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL ZUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL ZUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL ZBBCSD( JOBV1T, 'N', JOBU1, JOBU2, 'T', M, Q, P, THETA,
      $                   0, V1T, LDV1T, 0, 1, U1, LDU1, U2, LDU2, 0, 0,
      $                   0, 0, 0, 0, 0, 0, RWORK(1), -1, CHILDINFO )
             CALL ZUNBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = INT( WORK(1) )
-            IF( P .GE. M-P-1 ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL ZUNGQR( P, P, Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL ZUNGQR( M-P-1, M-P-1, M-P-1, U2(2,2), LDU2, 0,
      $                      WORK(1), -1, CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P-1 )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P-1 )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL ZUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL ZUNGLQ( Q, Q, R, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL ZBBCSD( 'N', JOBV1T, JOBU2, JOBU1, 'T', M, M-Q, M-P,
      $                   THETA, 0, 0, 1, V1T, LDV1T, U2, LDU2, U1, LDU1,
      $                   0, 0, 0, 0, 0, 0, 0, 0, RWORK(1), -1,
             CALL ZUNBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, 0, 0,
      $                    0, 0, 0, WORK(1), -1, CHILDINFO )
             LORBDB = M + INT( WORK(1) )
-            IF( P .GE. M-P ) THEN
+            IF( WANTU1 .AND. P .GT. 0 ) THEN
                CALL ZUNGQR( P, P, M-Q, U1, LDU1, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, P )
-               LORGQROPT = INT( WORK(1) )
-            ELSE
+               LORGQRMIN = MAX( LORGQRMIN, P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTU2 .AND. M-P .GT. 0 ) THEN
                CALL ZUNGQR( M-P, M-P, M-Q, U2, LDU2, 0, WORK(1), -1,
      $                      CHILDINFO )
-               LORGQRMIN = MAX( 1, M-P )
-               LORGQROPT = INT( WORK(1) )
+               LORGQRMIN = MAX( LORGQRMIN, M-P )
+               LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
+            END IF
+            IF( WANTV1T .AND. Q .GT. 0 ) THEN
+               CALL ZUNGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
+     $                      CHILDINFO )
+               LORGLQMIN = MAX( LORGLQMIN, Q )
+               LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
             END IF
-            CALL ZUNGLQ( Q, Q, Q, V1T, LDV1T, 0, WORK(1), -1,
-     $                   CHILDINFO )
-            LORGLQMIN = MAX( 1, Q )
-            LORGLQOPT = INT( WORK(1) )
             CALL ZBBCSD( JOBU2, JOBU1, 'N', JOBV1T, 'N', M, M-P, M-Q,
      $                   THETA, 0, U2, LDU2, U1, LDU1, 0, 1, V1T, LDV1T,
      $                   0, 0, 0, 0, 0, 0, 0, 0, RWORK(1), -1,