aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SRC/cuncsd2by1.f102
-rw-r--r--SRC/dorcsd2by1.f102
-rw-r--r--SRC/sorcsd2by1.f102
-rw-r--r--SRC/zuncsd2by1.f102
4 files changed, 236 insertions, 172 deletions
diff --git a/SRC/cuncsd2by1.f b/SRC/cuncsd2by1.f
index 1b2b0fb2..f431b337 100644
--- a/SRC/cuncsd2by1.f
+++ b/SRC/cuncsd2by1.f
@@ -320,11 +320,11 @@
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
*
@@ -380,25 +380,32 @@
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 )
@@ -407,21 +414,24 @@
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 )
@@ -430,21 +440,24 @@
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,
@@ -454,21 +467,24 @@
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,
diff --git a/SRC/dorcsd2by1.f b/SRC/dorcsd2by1.f
index 19dedbe8..33a9b16d 100644
--- a/SRC/dorcsd2by1.f
+++ b/SRC/dorcsd2by1.f
@@ -298,11 +298,11 @@
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
*
@@ -344,25 +344,32 @@
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 )
@@ -371,21 +378,24 @@
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 )
@@ -394,21 +404,24 @@
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,
@@ -418,21 +431,24 @@
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,
diff --git a/SRC/sorcsd2by1.f b/SRC/sorcsd2by1.f
index b2401af1..1bc71cda 100644
--- a/SRC/sorcsd2by1.f
+++ b/SRC/sorcsd2by1.f
@@ -296,11 +296,11 @@
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
*
@@ -342,25 +342,32 @@
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 )
@@ -369,21 +376,24 @@
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 )
@@ -392,21 +402,24 @@
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,
@@ -416,21 +429,24 @@
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,
diff --git a/SRC/zuncsd2by1.f b/SRC/zuncsd2by1.f
index 432471fe..dc0be07a 100644
--- a/SRC/zuncsd2by1.f
+++ b/SRC/zuncsd2by1.f
@@ -319,11 +319,11 @@
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
*
@@ -379,25 +379,32 @@
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 )
@@ -406,21 +413,24 @@
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 )
@@ -429,21 +439,24 @@
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,
@@ -453,21 +466,24 @@
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,