230 SUBROUTINE dorcsd2by1( JOBU1, JOBU2, JOBV1T, M, P, Q, X11, LDX11,
231 $ X21, LDX21, THETA, U1, LDU1, U2, LDU2, V1T,
232 $ LDV1T, WORK, LWORK, IWORK, INFO )
239 CHARACTER JOBU1, JOBU2, JOBV1T
240 INTEGER INFO, LDU1, LDU2, LDV1T, LWORK, LDX11, LDX21,
244 DOUBLE PRECISION THETA(*)
245 DOUBLE PRECISION (LDU1,*), U2(LDU2,*), V1T(LDV1T,*), WORK(*),
246 $ x11(ldx11,*), x21(ldx21,*)
253 DOUBLE PRECISION ONE, ZERO
254 PARAMETER ( ONE = 1.0d0, zero = 0.0d0 )
257 INTEGER CHILDINFO, I, IB11D, IB11E, IB12D, IB12E,
258 $ IB21D, IB21E, IB22D, IB22E, IBBCSD, IORBDB,
261 $ lorglqopt, lorgqr, lorgqrmin, lorgqropt,
262 $ lworkmin, lworkopt, r
263 LOGICAL LQUERY, WANTU1, , WANTV1T
266 DOUBLE PRECISION DUM1(1), DUM2(1,1)
285 wantu1 = lsame( jobu1,
'Y' )
286 wantu2 = lsame( jobu2,
'Y' )
287 wantv1t = lsame( jobv1t, 'y
' )
288.EQ.
LQUERY = LWORK -1
292.LT..OR..GT.
ELSE IF( P 0 P M ) THEN
294.LT..OR..GT.
ELSE IF( Q 0 Q M ) THEN
296.LT.
ELSE IF( LDX11 MAX( 1, P ) ) THEN
298.LT.
ELSE IF( LDX21 MAX( 1, M-P ) ) THEN
300.AND..LT.
ELSE IF( WANTU1 LDU1 MAX( 1, P ) ) THEN
302.AND..LT.
ELSE IF( WANTU2 LDU2 MAX( 1, M - P ) ) THEN
304.AND..LT.
ELSE IF( WANTV1T LDV1T MAX( 1, Q ) ) THEN
308 R = MIN( P, M-P, Q, M-Q )
329.EQ.
IF( INFO 0 ) THEN
331 IB11D = IPHI + MAX( 1, R-1 )
332 IB11E = IB11D + MAX( 1, R )
333 IB12D = IB11E + MAX( 1, R - 1 )
334 IB12E = IB12D + MAX( 1, R )
335 IB21D = IB12E + MAX( 1, R - 1 )
336 IB21E = IB21D + MAX( 1, R )
337 IB22D = IB21E + MAX( 1, R - 1 )
338 IB22E = IB22D + MAX( 1, R )
339 IBBCSD = IB22E + MAX( 1, R - 1 )
340 ITAUP1 = IPHI + MAX( 1, R-1 )
341 ITAUP2 = ITAUP1 + MAX( 1, P )
342 ITAUQ1 = ITAUP2 + MAX( 1, M-P )
343 IORBDB = ITAUQ1 + MAX( 1, Q )
344 IORGQR = ITAUQ1 + MAX( 1, Q )
345 IORGLQ = ITAUQ1 + MAX( 1, Q )
351 CALL DORBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA,
352 $ DUM1, DUM1, DUM1, DUM1, WORK,
354 LORBDB = INT( WORK(1) )
355.AND..GT.
IF( WANTU1 P 0 ) THEN
356 CALL DORGQR( P, P, Q, U1, LDU1, DUM1, WORK(1), -1,
358 LORGQRMIN = MAX( LORGQRMIN, P )
359 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
361.AND..GT.
IF( WANTU2 M-P 0 ) THEN
362 CALL DORGQR( M-P, M-P, Q, U2, LDU2, DUM1, WORK(1),
364 LORGQRMIN = MAX( LORGQRMIN, M-P )
365 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
367.AND..GT.
IF( WANTV1T Q 0 ) THEN
368 CALL DORGLQ( Q-1, Q-1, Q-1, V1T, LDV1T,
369 $ DUM1, WORK(1), -1, CHILDINFO )
370 LORGLQMIN = MAX( LORGLQMIN, Q-1 )
371 LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
373 CALL DBBCSD( JOBU1, JOBU2, JOBV1T, 'n
', 'n
', M, P, Q, THETA,
374 $ DUM1, U1, LDU1, U2, LDU2, V1T, LDV1T,
375 $ DUM2, 1, DUM1, DUM1, DUM1,
376 $ DUM1, DUM1, DUM1, DUM1,
377 $ DUM1, WORK(1), -1, CHILDINFO )
378 LBBCSD = INT( WORK(1) )
379.EQ.
ELSE IF( R P ) THEN
380 CALL DORBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA,
381 $ DUM1, DUM1, DUM1, DUM1,
382 $ WORK(1), -1, CHILDINFO )
383 LORBDB = INT( WORK(1) )
384.AND..GT.
IF( WANTU1 P 0 ) THEN
385 CALL DORGQR( P-1, P-1, P-1, U1(2,2), LDU1, DUM1,
386 $ WORK(1), -1, CHILDINFO )
387 LORGQRMIN = MAX( LORGQRMIN, P-1 )
388 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
390.AND..GT.
IF( WANTU2 M-P 0 ) THEN
391 CALL DORGQR( M-P, M-P, Q, U2, LDU2, DUM1, WORK(1),
393 LORGQRMIN = MAX( LORGQRMIN, M-P )
394 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
396.AND..GT.
IF( WANTV1T Q 0 ) THEN
397 CALL DORGLQ( Q, Q, R, V1T, LDV1T, DUM1, WORK(1), -1,
399 LORGLQMIN = MAX( LORGLQMIN, Q )
400 LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
402 CALL DBBCSD( JOBV1T, 'n
', JOBU1, JOBU2, 't
', M, Q, P, THETA,
403 $ DUM1, V1T, LDV1T, DUM2, 1, U1, LDU1,
404 $ U2, LDU2, DUM1, DUM1, DUM1,
405 $ DUM1, DUM1, DUM1, DUM1,
406 $ DUM1, WORK(1), -1, CHILDINFO )
407 LBBCSD = INT( WORK(1) )
408.EQ.
ELSE IF( R M-P ) THEN
409 CALL DORBDB3( M, P, Q, X11, LDX11, X21, LDX21, THETA,
410 $ DUM1, DUM1, DUM1, DUM1,
411 $ WORK(1), -1, CHILDINFO )
412 LORBDB = INT( WORK(1) )
413.AND..GT.
IF( WANTU1 P 0 ) THEN
414 CALL DORGQR( P, P, Q, U1, LDU1, DUM1, WORK(1), -1,
416 LORGQRMIN = MAX( LORGQRMIN, P )
417 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
419.AND..GT.
IF( WANTU2 M-P 0 ) THEN
420 CALL DORGQR( M-P-1, M-P-1, M-P-1, U2(2,2), LDU2,
421 $ DUM1, WORK(1), -1, CHILDINFO )
422 LORGQRMIN = MAX( LORGQRMIN, M-P-1 )
423 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
425.AND..GT.
IF( WANTV1T Q 0 ) THEN
426 CALL DORGLQ( Q, Q, R, V1T, LDV1T, DUM1, WORK(1), -1,
428 LORGLQMIN = MAX( LORGLQMIN, Q )
429 LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
431 CALL DBBCSD( 'n
', JOBV1T, JOBU2, JOBU1, 't
', M, M-Q, M-P,
432 $ THETA, DUM1, DUM2, 1, V1T, LDV1T, U2,
433 $ LDU2, U1, LDU1, DUM1, DUM1, DUM1,
434 $ DUM1, DUM1, DUM1, DUM1,
435 $ DUM1, WORK(1), -1, CHILDINFO )
436 LBBCSD = INT( WORK(1) )
438 CALL DORBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA,
439 $ DUM1, DUM1, DUM1, DUM1,
440 $ DUM1, WORK(1), -1, CHILDINFO )
441 LORBDB = M + INT( WORK(1) )
442.AND..GT.
IF( WANTU1 P 0 ) THEN
443 CALL DORGQR( P, P, M-Q, U1, LDU1, DUM1, WORK(1), -1,
445 LORGQRMIN = MAX( LORGQRMIN, P )
446 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
448.AND..GT.
IF( WANTU2 M-P 0 ) THEN
449 CALL DORGQR( M-P, M-P, M-Q, U2, LDU2, DUM1, WORK(1),
451 LORGQRMIN = MAX( LORGQRMIN, M-P )
452 LORGQROPT = MAX( LORGQROPT, INT( WORK(1) ) )
454.AND..GT.
IF( WANTV1T Q 0 ) THEN
455 CALL DORGLQ( Q, Q, Q, V1T, LDV1T, DUM1, WORK(1), -1,
457 LORGLQMIN = MAX( LORGLQMIN, Q )
458 LORGLQOPT = MAX( LORGLQOPT, INT( WORK(1) ) )
460 CALL DBBCSD( JOBU2, JOBU1, 'n
', JOBV1T, 'n
', M, M-P, M-Q,
461 $ THETA, DUM1, U2, LDU2, U1, LDU1, DUM2,
462 $ 1, V1T, LDV1T, DUM1, DUM1, DUM1,
463 $ DUM1, DUM1, DUM1, DUM1,
464 $ DUM1, WORK(1), -1, CHILDINFO )
465 LBBCSD = INT( WORK(1) )
467 LWORKMIN = MAX( IORBDB+LORBDB-1,
468 $ IORGQR+LORGQRMIN-1,
469 $ IORGLQ+LORGLQMIN-1,
471 LWORKOPT = MAX( IORBDB+LORBDB-1,
472 $ IORGQR+LORGQROPT-1,
473 $ IORGLQ+LORGLQOPT-1,
476.LT..AND..NOT.
IF( LWORK LWORKMIN LQUERY ) THEN
480.NE.
IF( INFO 0 ) THEN
483 ELSE IF( LQUERY ) THEN
486 LORGQR = LWORK-IORGQR+1
487 LORGLQ = LWORK-IORGLQ+1
498 CALL DORBDB1( M, P, Q, X11, LDX11, X21, LDX21, THETA,
499 $ WORK(IPHI), WORK(ITAUP1), WORK(ITAUP2),
500 $ WORK(ITAUQ1), WORK(IORBDB), LORBDB, CHILDINFO )
504.AND..GT.
IF( WANTU1 P 0 ) THEN
505 CALL DLACPY( 'l
', P, Q, X11, LDX11, U1, LDU1 )
506 CALL DORGQR( P, P, Q, U1, LDU1, WORK(ITAUP1), WORK(IORGQR),
507 $ LORGQR, CHILDINFO )
509.AND..GT.
IF( WANTU2 M-P 0 ) THEN
510 CALL DLACPY( 'l
', M-P, Q, X21, LDX21, U2, LDU2 )
511 CALL DORGQR( M-P, M-P, Q, U2, LDU2, WORK(ITAUP2),
512 $ WORK(IORGQR), LORGQR, CHILDINFO )
514.AND..GT.
IF( WANTV1T Q 0 ) THEN
520 CALL DLACPY( 'u
', Q-1, Q-1, X21(1,2), LDX21, V1T(2,2),
522 CALL DORGLQ( Q-1, Q-1, Q-1, V1T(2,2), LDV1T, WORK(ITAUQ1),
523 $ WORK(IORGLQ), LORGLQ, CHILDINFO )
528 CALL DBBCSD( JOBU1, JOBU2, JOBV1T, 'n
', 'n
', M, P, Q, THETA,
529 $ WORK(IPHI), U1, LDU1, U2, LDU2, V1T, LDV1T,
530 $ DUM2, 1, WORK(IB11D), WORK(IB11E),
531 $ WORK(IB12D), WORK(IB12E), WORK(IB21D),
532 $ WORK(IB21E), WORK(IB22D), WORK(IB22E),
533 $ WORK(IBBCSD), LBBCSD, CHILDINFO )
538.GT..AND.
IF( Q 0 WANTU2 ) THEN
540 IWORK(I) = M - P - Q + I
545 CALL DLAPMT( .FALSE., M-P, M-P, U2, LDU2, IWORK )
547.EQ.
ELSE IF( R P ) THEN
553 CALL DORBDB2( M, P, Q, X11, LDX11, X21, LDX21, THETA,
554 $ WORK(IPHI), WORK(ITAUP1), WORK(ITAUP2),
555 $ WORK(ITAUQ1), WORK(IORBDB), LORBDB, CHILDINFO )
559.AND..GT.
IF( WANTU1 P 0 ) THEN
565 CALL DLACPY( 'l
', P-1, P-1, X11(2,1), LDX11, U1(2,2), LDU1 )
566 CALL DORGQR( P-1, P-1, P-1, U1(2,2), LDU1, WORK(ITAUP1),
567 $ WORK(IORGQR), LORGQR, CHILDINFO )
569.AND..GT.
IF( WANTU2 M-P 0 ) THEN
570 CALL DLACPY( 'l
', M-P, Q, X21, LDX21, U2, LDU2 )
571 CALL DORGQR( M-P, M-P, Q, U2, LDU2, WORK(ITAUP2),
572 $ WORK(IORGQR), LORGQR, CHILDINFO )
574.AND..GT.
IF( WANTV1T Q 0 ) THEN
575 CALL DLACPY( 'u', p, q, x11, ldx11, v1t, ldv1t )
576 CALL dorglq( q, q, r, v1t, ldv1t, work(itauq1),
582 CALL dbbcsd( jobv1t,
'N', jobu1, jobu2,
'T', m, q, p, theta,
583 $ work(iphi), v1t, ldv1t, dum2, 1, u1, ldu1, u2,
585 $ work(ib12e), work(ib21d), work(ib21e),
586 $ work(ib22d), work(ib22e
592 IF( q .GT. 0 .AND. wantu2 )
THEN
594 iwork(i) = m - p - q + i
599 CALL dlapmt( .false., m-p, m-p, u2, ldu2, iwork )
601 ELSE IF( r .EQ. m-p )
THEN
607 CALL dorbdb3( m, p, q, x11, ldx11, x21, ldx21, theta,
608 $ work(iphi), work(itaup1), work(itaup2),
609 $ work(itauq1), work(iorbdb), lorbdb, childinfo )
613 IF( wantu1 .AND. p .GT. 0 )
THEN
614 CALL dlacpy(
'L', p, q, x11, ldx11, u1, ldu1 )
615 CALL dorgqr( p, p, q, u1, ldu1, work(itaup1), work(iorgqr),
616 $ lorgqr, childinfo )
618 IF( wantu2 .AND. m-p .GT. 0 )
THEN
624 CALL dlacpy(
'L', m-p-1, m-p-1, x21(2,1), ldx21, u2(2,2),
626 CALL dorgqr( m-p-1, m-p-1, m-p-1, u2(2,2), ldu2,
627 $ work(itaup2), work(iorgqr), lorgqr, childinfo )
629 IF( wantv1t .AND. q .GT. 0 )
THEN
630 CALL dlacpy(
'U', m-p, q, x21, ldx21, v1t, ldv1t )
631 CALL dorglq( q, q, r, v1t, ldv1t, work(itauq1),
632 $ work(iorglq), lorglq, childinfo )
637 CALL dbbcsd( 'n
', JOBV1T, JOBU2, JOBU1, 't
', M, M-Q, M-P,
638 $ THETA, WORK(IPHI), DUM2, 1, V1T, LDV1T, U2,
639 $ LDU2, U1, LDU1, WORK(IB11D), WORK(IB11E),
640 $ WORK(IB12D), WORK(IB12E), WORK(IB21D),
641 $ WORK(IB21E), WORK(IB22D), WORK(IB22E),
642 $ WORK(IBBCSD), LBBCSD, CHILDINFO )
655 CALL DLAPMT( .FALSE., P, Q, U1, LDU1, IWORK )
658 CALL DLAPMR( .FALSE., Q, Q, V1T, LDV1T, IWORK )
667 CALL DORBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA,
668 $ WORK(IPHI), WORK(ITAUP1), WORK(ITAUP2),
669 $ WORK(ITAUQ1), WORK(IORBDB), WORK(IORBDB+M),
670 $ LORBDB-M, CHILDINFO )
674.AND..GT.
IF( WANTU2 M-P 0 ) THEN
675 CALL DCOPY( M-P, WORK(IORBDB+P), 1, U2, 1 )
677.AND..GT.
IF( WANTU1 P 0 ) THEN
678 CALL DCOPY( P, WORK(IORBDB), 1, U1, 1 )
682 CALL DLACPY( 'l
', P-1, M-Q-1, X11(2,1), LDX11, U1(2,2),
684 CALL DORGQR( P, P, M-Q, U1, LDU1, WORK(ITAUP1),
685 $ WORK(IORGQR), LORGQR, CHILDINFO )
687.AND..GT.
IF( WANTU2 M-P 0 ) THEN
691 CALL DLACPY( 'l
', M-P-1, M-Q-1, X21(2,1), LDX21, U2(2,2),
693 CALL DORGQR( M-P, M-P, M-Q, U2, LDU2, WORK(ITAUP2),
694 $ WORK(IORGQR), LORGQR, CHILDINFO )
696.AND..GT.
IF( WANTV1T Q 0 ) THEN
697 CALL DLACPY( 'u
', M-Q, Q, X21, LDX21, V1T, LDV1T )
698 CALL DLACPY( 'u
', P-(M-Q), Q-(M-Q), X11(M-Q+1,M-Q+1), LDX11,
699 $ V1T(M-Q+1,M-Q+1), LDV1T )
700 CALL DLACPY( 'u
', -P+Q, Q-P, X21(M-Q+1,P+1), LDX21,
701 $ V1T(P+1,P+1), LDV1T )
702 CALL DORGLQ( Q, Q, Q, V1T, LDV1T, WORK(ITAUQ1),
703 $ WORK(IORGLQ), LORGLQ, CHILDINFO )
708 CALL DBBCSD( JOBU2, JOBU1, 'n
', JOBV1T, 'n
', M, M-P, M-Q,
709 $ THETA, WORK(IPHI), U2, LDU2, U1, LDU1, DUM2,
710 $ 1, V1T, LDV1T, WORK(IB11D), WORK(IB11E),
711 $ WORK(IB12D), WORK(IB12E), WORK(IB21D),
712 $ WORK(IB21E), WORK(IB22D), WORK(IB22E),
713 $ WORK(IBBCSD), LBBCSD, CHILDINFO )
726 CALL DLAPMT( .FALSE., P, P, U1, LDU1, IWORK )
729 CALL DLAPMR( .FALSE., P, Q, V1T, LDV1T, IWORK )
subroutine dbbcsd(jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q, theta, phi, u1, ldu1, u2, ldu2, v1t, ldv1t, v2t, ldv2t, b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e, work, lwork, info)
DBBCSD
subroutine dorcsd2by1(jobu1, jobu2, jobv1t, m, p, q, x11, ldx11, x21, ldx21, theta, u1, ldu1, u2, ldu2, v1t, ldv1t, work, lwork, iwork, info)
DORCSD2BY1