55* Online html documentation available at
66* http://www.netlib.org/lapack/explore-html/
77*
8- * > \htmlonly
98* > Download CUNCSD2BY1 + dependencies
109* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cuncsd2by1.f">
1110* > [TGZ]</a>
1211* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cuncsd2by1.f">
1312* > [ZIP]</a>
1413* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cuncsd2by1.f">
1514* > [TXT]</a>
16- * > \endhtmlonly
1715*
1816* Definition:
1917* ===========
250248* > \ingroup uncsd2by1
251249*
252250* =====================================================================
253- SUBROUTINE CUNCSD2BY1 ( JOBU1 , JOBU2 , JOBV1T , M , P , Q , X11 , LDX11 ,
251+ SUBROUTINE CUNCSD2BY1 ( JOBU1 , JOBU2 , JOBV1T , M , P , Q , X11 ,
252+ $ LDX11 ,
254253 $ X21 , LDX21 , THETA , U1 , LDU1 , U2 , LDU2 , V1T ,
255254 $ LDV1T , WORK , LWORK , RWORK , LRWORK , IWORK ,
256255 $ INFO )
256+ IMPLICIT NONE
257257*
258258* -- LAPACK computational routine --
259259* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -293,7 +293,9 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
293293 COMPLEX CDUM( 1 , 1 )
294294* ..
295295* .. External Subroutines ..
296- EXTERNAL CBBCSD, CCOPY, CLACPY, CLAPMR, CLAPMT, CUNBDB1,
296+ EXTERNAL CBBCSD, CCOPY, CLACPY, CLAPMR, CLAPMT,
297+ $ CLASET,
298+ $ CUNBDB1,
297299 $ CUNBDB2, CUNBDB3, CUNBDB4, CUNGLQ, CUNGQR,
298300 $ XERBLA
299301* ..
@@ -412,17 +414,20 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
412414 LORGLQMIN = MAX ( LORGLQMIN, Q-1 )
413415 LORGLQOPT = MAX ( LORGLQOPT, INT ( WORK(1 ) ) )
414416 END IF
415- CALL CBBCSD( JOBU1, JOBU2, JOBV1T, ' N' , ' N' , M, P, Q, THETA,
417+ CALL CBBCSD( JOBU1, JOBU2, JOBV1T, ' N' , ' N' , M, P, Q,
418+ $ THETA,
416419 $ DUM(1 ), U1, LDU1, U2, LDU2, V1T, LDV1T, CDUM,
417420 $ 1 , DUM, DUM, DUM, DUM, DUM, DUM, DUM, DUM,
418421 $ RWORK(1 ), - 1 , CHILDINFO )
419422 LBBCSD = INT ( RWORK(1 ) )
420423 ELSE IF ( R .EQ. P ) THEN
421- CALL CUNBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA, DUM,
424+ CALL CUNBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA,
425+ $ DUM,
422426 $ CDUM, CDUM, CDUM, WORK(1 ), - 1 , CHILDINFO )
423427 LORBDB = INT ( WORK(1 ) )
424428 IF ( WANTU1 .AND. P .GT. 0 ) THEN
425- CALL CUNGQR( P-1 , P-1 , P-1 , U1(2 ,2 ), LDU1, CDUM, WORK(1 ),
429+ CALL CUNGQR( P-1 , P-1 , P-1 , U1(2 ,2 ), LDU1, CDUM,
430+ $ WORK(1 ),
426431 $ - 1 , CHILDINFO )
427432 LORGQRMIN = MAX ( LORGQRMIN, P-1 )
428433 LORGQROPT = MAX ( LORGQROPT, INT ( WORK(1 ) ) )
@@ -439,13 +444,15 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
439444 LORGLQMIN = MAX ( LORGLQMIN, Q )
440445 LORGLQOPT = MAX ( LORGLQOPT, INT ( WORK(1 ) ) )
441446 END IF
442- CALL CBBCSD( JOBV1T, ' N' , JOBU1, JOBU2, ' T' , M, Q, P, THETA,
447+ CALL CBBCSD( JOBV1T, ' N' , JOBU1, JOBU2, ' T' , M, Q, P,
448+ $ THETA,
443449 $ DUM, V1T, LDV1T, CDUM, 1 , U1, LDU1, U2, LDU2,
444450 $ DUM, DUM, DUM, DUM, DUM, DUM, DUM, DUM,
445451 $ RWORK(1 ), - 1 , CHILDINFO )
446452 LBBCSD = INT ( RWORK(1 ) )
447453 ELSE IF ( R .EQ. M- P ) THEN
448- CALL CUNBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA, DUM,
454+ CALL CUNBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA,
455+ $ DUM,
449456 $ CDUM, CDUM, CDUM, WORK(1 ), - 1 , CHILDINFO )
450457 LORBDB = INT ( WORK(1 ) )
451458 IF ( WANTU1 .AND. P .GT. 0 ) THEN
@@ -472,7 +479,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
472479 $ RWORK(1 ), - 1 , CHILDINFO )
473480 LBBCSD = INT ( RWORK(1 ) )
474481 ELSE
475- CALL CUNBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, DUM,
482+ CALL CUNBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA,
483+ $ DUM,
476484 $ CDUM, CDUM, CDUM, CDUM, WORK(1 ), - 1 , CHILDINFO
477485 $ )
478486 LORBDB = M + INT ( WORK(1 ) )
@@ -483,7 +491,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
483491 LORGQROPT = MAX ( LORGQROPT, INT ( WORK(1 ) ) )
484492 END IF
485493 IF ( WANTU2 .AND. M- P .GT. 0 ) THEN
486- CALL CUNGQR( M- P, M- P, M- Q, U2, LDU2, CDUM, WORK(1 ), - 1 ,
494+ CALL CUNGQR( M- P, M- P, M- Q, U2, LDU2, CDUM, WORK(1 ),
495+ $ - 1 ,
487496 $ CHILDINFO )
488497 LORGQRMIN = MAX ( LORGQRMIN, M- P )
489498 LORGQROPT = MAX ( LORGQROPT, INT ( WORK(1 ) ) )
@@ -502,7 +511,7 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
502511 END IF
503512 LRWORKMIN = IBBCSD+ LBBCSD-1
504513 LRWORKOPT = LRWORKMIN
505- RWORK(1 ) = LRWORKOPT
514+ RWORK(1 ) = REAL ( LRWORKOPT )
506515 LWORKMIN = MAX ( IORBDB+ LORBDB-1 ,
507516 $ IORGQR+ LORGQRMIN-1 ,
508517 $ IORGLQ+ LORGLQMIN-1 )
@@ -525,6 +534,36 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
525534 END IF
526535 LORGQR = LWORK- IORGQR+1
527536 LORGLQ = LWORK- IORGLQ+1
537+ *
538+ IF ( R .EQ. 0 ) THEN
539+ *
540+ * R = 0: C and S are empty. Handle the trivial CSD directly.
541+ *
542+ IF ( Q .EQ. 0 ) THEN
543+ IF ( WANTU1 .AND. P .GT. 0 )
544+ $ CALL CLASET( ' A' , P, P, ZERO, ONE, U1, LDU1 )
545+ IF ( WANTU2 .AND. M- P .GT. 0 )
546+ $ CALL CLASET( ' A' , M- P, M- P, ZERO, ONE, U2, LDU2 )
547+ RETURN
548+ END IF
549+ *
550+ IF ( P .EQ. 0 .AND. M .EQ. Q ) THEN
551+ IF ( WANTU2 )
552+ $ CALL CLACPY( ' A' , M- P, Q, X21, LDX21, U2, LDU2 )
553+ IF ( WANTV1T )
554+ $ CALL CLASET( ' A' , Q, Q, ZERO, ONE, V1T, LDV1T )
555+ RETURN
556+ END IF
557+ *
558+ IF ( P .EQ. M .AND. M .EQ. Q ) THEN
559+ IF ( WANTU1 )
560+ $ CALL CLACPY( ' A' , P, Q, X11, LDX11, U1, LDU1 )
561+ IF ( WANTV1T )
562+ $ CALL CLASET( ' A' , Q, Q, ZERO, ONE, V1T, LDV1T )
563+ RETURN
564+ END IF
565+ *
566+ END IF
528567*
529568* Handle four cases separately: R = Q, R = P, R = M-P, and R = M-Q,
530569* in which R = MIN(P,M-P,Q,M-Q)
@@ -543,7 +582,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
543582*
544583 IF ( WANTU1 .AND. P .GT. 0 ) THEN
545584 CALL CLACPY( ' L' , P, Q, X11, LDX11, U1, LDU1 )
546- CALL CUNGQR( P, P, Q, U1, LDU1, WORK(ITAUP1), WORK(IORGQR),
585+ CALL CUNGQR( P, P, Q, U1, LDU1, WORK(ITAUP1),
586+ $ WORK(IORGQR),
547587 $ LORGQR, CHILDINFO )
548588 END IF
549589 IF ( WANTU2 .AND. M- P .GT. 0 ) THEN
@@ -559,7 +599,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
559599 END DO
560600 CALL CLACPY( ' U' , Q-1 , Q-1 , X21(1 ,2 ), LDX21, V1T(2 ,2 ),
561601 $ LDV1T )
562- CALL CUNGLQ( Q-1 , Q-1 , Q-1 , V1T(2 ,2 ), LDV1T, WORK(ITAUQ1),
602+ CALL CUNGLQ( Q-1 , Q-1 , Q-1 , V1T(2 ,2 ), LDV1T,
603+ $ WORK(ITAUQ1),
563604 $ WORK(IORGLQ), LORGLQ, CHILDINFO )
564605 END IF
565606*
@@ -602,7 +643,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
602643 U1(1 ,J) = ZERO
603644 U1(J,1 ) = ZERO
604645 END DO
605- CALL CLACPY( ' L' , P-1 , P-1 , X11(2 ,1 ), LDX11, U1(2 ,2 ), LDU1 )
646+ CALL CLACPY( ' L' , P-1 , P-1 , X11(2 ,1 ), LDX11, U1(2 ,2 ),
647+ $ LDU1 )
606648 CALL CUNGQR( P-1 , P-1 , P-1 , U1(2 ,2 ), LDU1, WORK(ITAUP1),
607649 $ WORK(IORGQR), LORGQR, CHILDINFO )
608650 END IF
@@ -652,7 +694,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
652694*
653695 IF ( WANTU1 .AND. P .GT. 0 ) THEN
654696 CALL CLACPY( ' L' , P, Q, X11, LDX11, U1, LDU1 )
655- CALL CUNGQR( P, P, Q, U1, LDU1, WORK(ITAUP1), WORK(IORGQR),
697+ CALL CUNGQR( P, P, Q, U1, LDU1, WORK(ITAUP1),
698+ $ WORK(IORGQR),
656699 $ LORGQR, CHILDINFO )
657700 END IF
658701 IF ( WANTU2 .AND. M- P .GT. 0 ) THEN
@@ -736,7 +779,8 @@ SUBROUTINE CUNCSD2BY1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
736779 END IF
737780 IF ( WANTV1T .AND. Q .GT. 0 ) THEN
738781 CALL CLACPY( ' U' , M- Q, Q, X21, LDX21, V1T, LDV1T )
739- CALL CLACPY( ' U' , P- (M- Q), Q- (M- Q), X11(M- Q+1 ,M- Q+1 ), LDX11,
782+ CALL CLACPY( ' U' , P- (M- Q), Q- (M- Q), X11(M- Q+1 ,M- Q+1 ),
783+ $ LDX11,
740784 $ V1T(M- Q+1 ,M- Q+1 ), LDV1T )
741785 CALL CLACPY( ' U' , - P+ Q, Q- P, X21(M- Q+1 ,P+1 ), LDX21,
742786 $ V1T(P+1 ,P+1 ), LDV1T )
0 commit comments