282 SUBROUTINE zunbdb( TRANS, SIGNS, M, P, Q, X11, LDX11, X12,
284 $ X21, LDX21, X22, LDX22, THETA, PHI, TAUP1,
285 $ TAUP2, TAUQ1, TAUQ2, WORK, LWORK, INFO )
292 CHARACTER SIGNS, TRANS
293 INTEGER INFO, LDX11, LDX12, LDX21, LDX22, LWORK, M, P,
297 DOUBLE PRECISION PHI( * ), THETA( * )
298 COMPLEX*16 TAUP1( * ), TAUP2( * ), TAUQ1( * ), TAUQ2( * ),
299 $ WORK( * ), X11( LDX11, * ), X12( LDX12, * ),
300 $ x21( ldx21, * ), x22( ldx22, * )
306 DOUBLE PRECISION REALONE
307 PARAMETER ( REALONE = 1.0d0 )
309 parameter( one = (1.0d0,0.0d0) )
312 LOGICAL COLMAJOR, LQUERY
313 INTEGER I, LWORKMIN, LWORKOPT
314 DOUBLE PRECISION Z1, Z2, Z3, Z4
323 DOUBLE PRECISION DZNRM2
325 EXTERNAL DZNRM2, LSAME
328 INTRINSIC atan2, cos, max, min, sin
329 INTRINSIC dcmplx, dconjg
336 colmajor = .NOT. lsame( trans,
'T' )
337 IF( .NOT. lsame( signs,
'O' ) )
THEN
348 lquery = lwork .EQ. -1
352 ELSE IF( p .LT. 0 .OR. p .GT. m )
THEN
354 ELSE IF( q .LT. 0 .OR. q .GT. p .OR. q .GT. m-p .OR.
357 ELSE IF( colmajor .AND. ldx11 .LT. max( 1, p ) )
THEN
359 ELSE IF( .NOT.colmajor .AND. ldx11 .LT. max( 1, q ) )
THEN
361 ELSE IF( colmajor .AND. ldx12 .LT. max( 1, p ) )
THEN
363 ELSE IF( .NOT.colmajor .AND. ldx12 .LT. max( 1, m-q ) )
THEN
365 ELSE IF( colmajor .AND. ldx21 .LT. max( 1, m-p ) )
THEN
367 ELSE IF( .NOT.colmajor .AND. ldx21 .LT. max( 1, q ) )
THEN
369 ELSE IF( colmajor .AND. ldx22 .LT. max( 1, m-p ) )
THEN
371 ELSE IF( .NOT.colmajor .AND. ldx22 .LT. max( 1, m-q ) )
THEN
377 IF( info .EQ. 0 )
THEN
381 IF( lwork .LT. lworkmin .AND. .NOT. lquery )
THEN
385 IF( info .NE. 0 )
THEN
386 CALL xerbla(
'xORBDB', -info )
388 ELSE IF( lquery )
THEN
401 CALL zscal( p-i+1, dcmplx( z1, 0.0d0 ), x11(i,i), 1 )
403 CALL zscal( p-i+1, dcmplx( z1*cos(phi(i-1)), 0.0d0 ),
405 CALL zaxpy( p-i+1, dcmplx( -z1*z3*z4*sin(phi(i-1)),
406 $ 0.0d0 ), x12(i,i-1), 1, x11(i,i), 1 )
409 CALL zscal( m-p-i+1, dcmplx( z2, 0.0d0 ), x21(i,i),
412 CALL zscal( m-p-i+1, dcmplx( z2*cos(phi(i-1)),
415 CALL zaxpy( m-p-i+1, dcmplx( -z2*z3*z4*sin(phi(i-1)),
416 $ 0.0d0 ), x22(i,i-1), 1, x21(i,i), 1 )
419 theta(i) = atan2( dznrm2( m-p-i+1, x21(i,i), 1 ),
420 $ dznrm2( p-i+1, x11(i,i), 1 ) )
423 CALL zlarfgp( p-i+1, x11(i,i), x11(i+1,i), 1,
425 ELSE IF ( p .EQ. i )
THEN
426 CALL zlarfgp( p-i+1, x11(i,i), x11(i,i), 1, taup1(i) )
428 IF ( m-p .GT. i )
THEN
429 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1,
431 ELSE IF ( m-p .EQ. i )
THEN
432 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i,i), 1,
437 CALL zlarf1f(
'L', p-i+1, q-i, x11(i,i), 1,
438 $ conjg(taup1(i)), x11(i,i+1), ldx11,
440 CALL zlarf1f(
'L', m-p-i+1, q-i, x21(i,i), 1,
441 $ conjg(taup2(i)), x21(i,i+1), ldx21,
444 IF ( m-q+1 .GT. i )
THEN
445 CALL zlarf1f(
'L', p-i+1, m-q-i+1, x11(i,i), 1,
446 $ conjg(taup1(i)), x12(i,i), ldx12, work )
447 CALL zlarf1f(
'L', m-p-i+1, m-q-i+1, x21(i,i), 1,
448 $ conjg(taup2(i)), x22(i,i), ldx22, work )
452 CALL zscal( q-i, dcmplx( -z1*z3*sin(theta(i)),
454 $ x11(i,i+1), ldx11 )
455 CALL zaxpy( q-i, dcmplx( z2*z3*cos(theta(i)), 0.0d0 ),
456 $ x21(i,i+1), ldx21, x11(i,i+1), ldx11 )
458 CALL zscal( m-q-i+1, dcmplx( -z1*z4*sin(theta(i)),
461 CALL zaxpy( m-q-i+1, dcmplx( z2*z4*cos(theta(i)),
463 $ x22(i,i), ldx22, x12(i,i), ldx12 )
466 $ phi(i) = atan2( dznrm2( q-i, x11(i,i+1), ldx11 ),
467 $ dznrm2( m-q-i+1, x12(i,i), ldx12 ) )
470 CALL zlacgv( q-i, x11(i,i+1), ldx11 )
471 IF ( i .EQ. q-1 )
THEN
472 CALL zlarfgp( q-i, x11(i,i+1), x11(i,i+1), ldx11,
475 CALL zlarfgp( q-i, x11(i,i+1), x11(i,i+2), ldx11,
479 IF ( m-q+1 .GT. i )
THEN
480 CALL zlacgv( m-q-i+1, x12(i,i), ldx12 )
481 IF ( m-q .EQ. i )
THEN
482 CALL zlarfgp( m-q-i+1, x12(i,i), x12(i,i), ldx12,
485 CALL zlarfgp( m-q-i+1, x12(i,i), x12(i,i+1), ldx12,
491 CALL zlarf1f(
'R', p-i, q-i, x11(i,i+1), ldx11,
493 $ x11(i+1,i+1), ldx11, work )
494 CALL zlarf1f(
'R', m-p-i, q-i, x11(i,i+1), ldx11,
496 $ x21(i+1,i+1), ldx21, work )
499 CALL zlarf1f(
'R', p-i, m-q-i+1, x12(i,i), ldx12,
501 $ x12(i+1,i), ldx12, work )
503 IF ( m-p .GT. i )
THEN
504 CALL zlarf1f(
'R', m-p-i, m-q-i+1, x12(i,i), ldx12,
505 $ tauq2(i), x22(i+1,i), ldx22, work )
509 $
CALL zlacgv( q-i, x11(i,i+1), ldx11 )
510 CALL zlacgv( m-q-i+1, x12(i,i), ldx12 )
518 CALL zscal( m-q-i+1, dcmplx( -z1*z4, 0.0d0 ), x12(i,i),
520 CALL zlacgv( m-q-i+1, x12(i,i), ldx12 )
521 IF ( i .GE. m-q )
THEN
522 CALL zlarfgp( m-q-i+1, x12(i,i), x12(i,i), ldx12,
525 CALL zlarfgp( m-q-i+1, x12(i,i), x12(i,i+1), ldx12,
530 CALL zlarf1f(
'R', p-i, m-q-i+1, x12(i,i), ldx12,
532 $ x12(i+1,i), ldx12, work )
535 $
CALL zlarf1f(
'R', m-p-q, m-q-i+1, x12(i,i), ldx12,
536 $ tauq2(i), x22(q+1,i), ldx22, work )
538 CALL zlacgv( m-q-i+1, x12(i,i), ldx12 )
546 CALL zscal( m-p-q-i+1, dcmplx( z2*z4, 0.0d0 ),
547 $ x22(q+i,p+i), ldx22 )
548 CALL zlacgv( m-p-q-i+1, x22(q+i,p+i), ldx22 )
549 CALL zlarfgp( m-p-q-i+1, x22(q+i,p+i), x22(q+i,p+i+1),
550 $ ldx22, tauq2(p+i) )
551 CALL zlarf1f(
'R', m-p-q-i, m-p-q-i+1, x22(q+i,p+i),
552 $ ldx22, tauq2(p+i), x22(q+i+1,p+i), ldx22,
555 CALL zlacgv( m-p-q-i+1, x22(q+i,p+i), ldx22 )
566 CALL zscal( p-i+1, dcmplx( z1, 0.0d0 ), x11(i,i),
569 CALL zscal( p-i+1, dcmplx( z1*cos(phi(i-1)), 0.0d0 ),
571 CALL zaxpy( p-i+1, dcmplx( -z1*z3*z4*sin(phi(i-1)),
572 $ 0.0d0 ), x12(i-1,i), ldx12, x11(i,i), ldx11 )
575 CALL zscal( m-p-i+1, dcmplx( z2, 0.0d0 ), x21(i,i),
578 CALL zscal( m-p-i+1, dcmplx( z2*cos(phi(i-1)),
581 CALL zaxpy( m-p-i+1, dcmplx( -z2*z3*z4*sin(phi(i-1)),
582 $ 0.0d0 ), x22(i-1,i), ldx22, x21(i,i), ldx21 )
585 theta(i) = atan2( dznrm2( m-p-i+1, x21(i,i), ldx21 ),
586 $ dznrm2( p-i+1, x11(i,i), ldx11 ) )
588 CALL zlacgv( p-i+1, x11(i,i), ldx11 )
589 CALL zlacgv( m-p-i+1, x21(i,i), ldx21 )
591 CALL zlarfgp( p-i+1, x11(i,i), x11(i,i+1), ldx11,
593 IF ( i .EQ. m-p )
THEN
594 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i,i), ldx21,
597 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i,i+1), ldx21,
601 CALL zlarf1f(
'R', q-i, p-i+1, x11(i,i), ldx11, taup1(i),
602 $ x11(i+1,i), ldx11, work )
603 CALL zlarf1f(
'R', m-q-i+1, p-i+1, x11(i,i), ldx11,
605 $ x12(i,i), ldx12, work )
606 CALL zlarf1f(
'R', q-i, m-p-i+1, x21(i,i), ldx21,
607 $ taup2(i), x21(i+1,i), ldx21, work )
608 CALL zlarf1f(
'R', m-q-i+1, m-p-i+1, x21(i,i), ldx21,
609 $ taup2(i), x22(i,i), ldx22, work )
611 CALL zlacgv( p-i+1, x11(i,i), ldx11 )
612 CALL zlacgv( m-p-i+1, x21(i,i), ldx21 )
615 CALL zscal( q-i, dcmplx( -z1*z3*sin(theta(i)),
618 CALL zaxpy( q-i, dcmplx( z2*z3*cos(theta(i)), 0.0d0 ),
619 $ x21(i+1,i), 1, x11(i+1,i), 1 )
621 CALL zscal( m-q-i+1, dcmplx( -z1*z4*sin(theta(i)),
624 CALL zaxpy( m-q-i+1, dcmplx( z2*z4*cos(theta(i)),
626 $ x22(i,i), 1, x12(i,i), 1 )
629 $ phi(i) = atan2( dznrm2( q-i, x11(i+1,i), 1 ),
630 $ dznrm2( m-q-i+1, x12(i,i), 1 ) )
633 CALL zlarfgp( q-i, x11(i+1,i), x11(i+2,i), 1,
636 CALL zlarfgp( m-q-i+1, x12(i,i), x12(i+1,i), 1,
640 CALL zlarf1f(
'L', q-i, p-i, x11(i+1,i), 1,
641 $ conjg(tauq1(i)), x11(i+1,i+1), ldx11,
643 CALL zlarf1f(
'L', q-i, m-p-i, x11(i+1,i), 1,
644 $ conjg(tauq1(i)), x21(i+1,i+1), ldx21,
647 CALL zlarf1f(
'L', m-q-i+1, p-i, x12(i,i), 1,
649 $ x12(i,i+1), ldx12, work )
651 IF ( m-p .GT. i )
THEN
652 CALL zlarf1f(
'L', m-q-i+1, m-p-i, x12(i,i), 1,
653 $ conjg(tauq2(i)), x22(i,i+1), ldx22,
663 CALL zscal( m-q-i+1, dcmplx( -z1*z4, 0.0d0 ), x12(i,i),
665 CALL zlarfgp( m-q-i+1, x12(i,i), x12(i+1,i), 1,
669 CALL zlarf1f(
'L', m-q-i+1, p-i, x12(i,i), 1,
670 $ conjg(tauq2(i)), x12(i,i+1), ldx12,
674 $
CALL zlarf1f(
'L', m-q-i+1, m-p-q, x12(i,i), 1,
675 $ conjg(tauq2(i)), x22(i,q+1), ldx22,
684 CALL zscal( m-p-q-i+1, dcmplx( z2*z4, 0.0d0 ),
686 CALL zlarfgp( m-p-q-i+1, x22(p+i,q+i), x22(p+i+1,q+i), 1,
688 IF ( m-p-q .NE. i )
THEN
689 CALL zlarf1f(
'L', m-p-q-i+1, m-p-q-i, x22(p+i,q+i),
690 $ 1, conjg(tauq2(p+i)), x22(p+i,q+i+1),