282 SUBROUTINE dorbdb( 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 DOUBLE PRECISION 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 )
312 LOGICAL COLMAJOR, LQUERY
313 INTEGER I, LWORKMIN, LWORKOPT
314 DOUBLE PRECISION Z1, Z2, Z3, Z4
321 DOUBLE PRECISION DNRM2
323 EXTERNAL DNRM2, LSAME
326 INTRINSIC atan2, cos, max, sin
333 colmajor = .NOT. lsame( trans,
'T' )
334 IF( .NOT. lsame( signs,
'O' ) )
THEN
345 lquery = lwork .EQ. -1
349 ELSE IF( p .LT. 0 .OR. p .GT. m )
THEN
351 ELSE IF( q .LT. 0 .OR. q .GT. p .OR. q .GT. m-p .OR.
354 ELSE IF( colmajor .AND. ldx11 .LT. max( 1, p ) )
THEN
356 ELSE IF( .NOT.colmajor .AND. ldx11 .LT. max( 1, q ) )
THEN
358 ELSE IF( colmajor .AND. ldx12 .LT. max( 1, p ) )
THEN
360 ELSE IF( .NOT.colmajor .AND. ldx12 .LT. max( 1, m-q ) )
THEN
362 ELSE IF( colmajor .AND. ldx21 .LT. max( 1, m-p ) )
THEN
364 ELSE IF( .NOT.colmajor .AND. ldx21 .LT. max( 1, q ) )
THEN
366 ELSE IF( colmajor .AND. ldx22 .LT. max( 1, m-p ) )
THEN
368 ELSE IF( .NOT.colmajor .AND. ldx22 .LT. max( 1, m-q ) )
THEN
374 IF( info .EQ. 0 )
THEN
378 IF( lwork .LT. lworkmin .AND. .NOT. lquery )
THEN
382 IF( info .NE. 0 )
THEN
383 CALL xerbla(
'xORBDB', -info )
385 ELSE IF( lquery )
THEN
398 CALL dscal( p-i+1, z1, x11(i,i), 1 )
400 CALL dscal( p-i+1, z1*cos(phi(i-1)), x11(i,i), 1 )
401 CALL daxpy( p-i+1, -z1*z3*z4*sin(phi(i-1)), x12(i,
406 CALL dscal( m-p-i+1, z2, x21(i,i), 1 )
408 CALL dscal( m-p-i+1, z2*cos(phi(i-1)), x21(i,i), 1 )
409 CALL daxpy( m-p-i+1, -z2*z3*z4*sin(phi(i-1)), x22(i,
414 theta(i) = atan2( dnrm2( m-p-i+1, x21(i,i), 1 ),
415 $ dnrm2( p-i+1, x11(i,i), 1 ) )
418 CALL dlarfgp( p-i+1, x11(i,i), x11(i+1,i), 1,
420 ELSE IF( p .EQ. i )
THEN
421 CALL dlarfgp( p-i+1, x11(i,i), x11(i,i), 1, taup1(i) )
423 IF ( m-p .GT. i )
THEN
424 CALL dlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1,
426 ELSE IF ( m-p .EQ. i )
THEN
427 CALL dlarfgp( m-p-i+1, x21(i,i), x21(i,i), 1,
432 CALL dlarf1f(
'L', p-i+1, q-i, x11(i,i), 1, taup1(i),
433 $ x11(i,i+1), ldx11, work )
435 IF ( m-q+1 .GT. i )
THEN
436 CALL dlarf1f(
'L', p-i+1, m-q-i+1, x11(i,i), 1,
438 $ x12(i,i), ldx12, work )
441 CALL dlarf1f(
'L', m-p-i+1, q-i, x21(i,i), 1,
442 $ taup2(i), x21(i,i+1), ldx21, work )
444 IF ( m-q+1 .GT. i )
THEN
445 CALL dlarf1f(
'L', m-p-i+1, m-q-i+1, x21(i,i), 1,
446 $ taup2(i), x22(i,i), ldx22, work )
450 CALL dscal( q-i, -z1*z3*sin(theta(i)), x11(i,i+1),
452 CALL daxpy( q-i, z2*z3*cos(theta(i)), x21(i,i+1),
454 $ x11(i,i+1), ldx11 )
456 CALL dscal( m-q-i+1, -z1*z4*sin(theta(i)), x12(i,i),
458 CALL daxpy( m-q-i+1, z2*z4*cos(theta(i)), x22(i,i),
463 $ phi(i) = atan2( dnrm2( q-i, x11(i,i+1), ldx11 ),
464 $ dnrm2( m-q-i+1, x12(i,i), ldx12 ) )
467 IF ( q-i .EQ. 1 )
THEN
468 CALL dlarfgp( q-i, x11(i,i+1), x11(i,i+1), ldx11,
471 CALL dlarfgp( q-i, x11(i,i+1), x11(i,i+2), ldx11,
475 IF ( q+i-1 .LT. m )
THEN
476 IF ( m-q .EQ. i )
THEN
477 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i,i), ldx12,
480 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i,i+1), ldx12,
486 CALL dlarf1f(
'R', p-i, q-i, x11(i,i+1), ldx11,
488 $ x11(i+1,i+1), ldx11, work )
489 CALL dlarf1f(
'R', m-p-i, q-i, x11(i,i+1), ldx11,
491 $ x21(i+1,i+1), ldx21, work )
494 CALL dlarf1f(
'R', p-i, m-q-i+1, x12(i,i), ldx12,
496 $ x12(i+1,i), ldx12, work )
498 IF ( m-p .GT. i )
THEN
499 CALL dlarf1f(
'R', m-p-i, m-q-i+1, x12(i,i), ldx12,
500 $ tauq2(i), x22(i+1,i), ldx22, work )
509 CALL dscal( m-q-i+1, -z1*z4, x12(i,i), ldx12 )
510 IF ( i .GE. m-q )
THEN
511 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i,i), ldx12,
514 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i,i+1), ldx12,
519 CALL dlarf1f(
'R', p-i, m-q-i+1, x12(i,i), ldx12,
521 $ x12(i+1,i), ldx12, work )
524 $
CALL dlarf1f(
'R', m-p-q, m-q-i+1, x12(i,i), ldx12,
525 $ tauq2(i), x22(q+1,i), ldx22, work )
533 CALL dscal( m-p-q-i+1, z2*z4, x22(q+i,p+i), ldx22 )
534 IF ( i .EQ. m-p-q )
THEN
535 CALL dlarfgp( m-p-q-i+1, x22(q+i,p+i), x22(q+i,p+i),
536 $ ldx22, tauq2(p+i) )
538 CALL dlarfgp( m-p-q-i+1, x22(q+i,p+i), x22(q+i,p+i+1),
539 $ ldx22, tauq2(p+i) )
541 IF ( i .LT. m-p-q )
THEN
542 CALL dlarf1f(
'R', m-p-q-i, m-p-q-i+1, x22(q+i,p+i),
544 $ tauq2(p+i), x22(q+i+1,p+i), ldx22, work )
556 CALL dscal( p-i+1, z1, x11(i,i), ldx11 )
558 CALL dscal( p-i+1, z1*cos(phi(i-1)), x11(i,i), ldx11 )
559 CALL daxpy( p-i+1, -z1*z3*z4*sin(phi(i-1)), x12(i-1,
561 $ ldx12, x11(i,i), ldx11 )
564 CALL dscal( m-p-i+1, z2, x21(i,i), ldx21 )
566 CALL dscal( m-p-i+1, z2*cos(phi(i-1)), x21(i,i),
568 CALL daxpy( m-p-i+1, -z2*z3*z4*sin(phi(i-1)), x22(i-1,
570 $ ldx22, x21(i,i), ldx21 )
573 theta(i) = atan2( dnrm2( m-p-i+1, x21(i,i), ldx21 ),
574 $ dnrm2( p-i+1, x11(i,i), ldx11 ) )
576 CALL dlarfgp( p-i+1, x11(i,i), x11(i,i+1), ldx11,
578 IF ( i .EQ. m-p )
THEN
579 CALL dlarfgp( m-p-i+1, x21(i,i), x21(i,i), ldx21,
582 CALL dlarfgp( m-p-i+1, x21(i,i), x21(i,i+1), ldx21,
587 CALL dlarf1f(
'R', q-i, p-i+1, x11(i,i), ldx11,
589 $ x11(i+1,i), ldx11, work )
591 IF ( m-q+1 .GT. i )
THEN
592 CALL dlarf1f(
'R', m-q-i+1, p-i+1, x11(i,i), ldx11,
593 $ taup1(i), x12(i,i), ldx12, work )
596 CALL dlarf1f(
'R', q-i, m-p-i+1, x21(i,i), ldx21,
598 $ x21(i+1,i), ldx21, work )
600 IF ( m-q+1 .GT. i )
THEN
601 CALL dlarf1f(
'R', m-q-i+1, m-p-i+1, x21(i,i), ldx21,
602 $ taup2(i), x22(i,i), ldx22, work )
606 CALL dscal( q-i, -z1*z3*sin(theta(i)), x11(i+1,i), 1 )
607 CALL daxpy( q-i, z2*z3*cos(theta(i)), x21(i+1,i), 1,
610 CALL dscal( m-q-i+1, -z1*z4*sin(theta(i)), x12(i,i), 1 )
611 CALL daxpy( m-q-i+1, z2*z4*cos(theta(i)), x22(i,i), 1,
615 $ phi(i) = atan2( dnrm2( q-i, x11(i+1,i), 1 ),
616 $ dnrm2( m-q-i+1, x12(i,i), 1 ) )
619 IF ( q-i .EQ. 1)
THEN
620 CALL dlarfgp( q-i, x11(i+1,i), x11(i+1,i), 1,
623 CALL dlarfgp( q-i, x11(i+1,i), x11(i+2,i), 1,
627 IF ( m-q .GT. i )
THEN
628 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i+1,i), 1,
631 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i,i), 1,
636 CALL dlarf1f(
'L', q-i, p-i, x11(i+1,i), 1, tauq1(i),
637 $ x11(i+1,i+1), ldx11, work )
638 CALL dlarf1f(
'L', q-i, m-p-i, x11(i+1,i), 1,
639 $ tauq1(i), x21(i+1,i+1), ldx21, work )
641 CALL dlarf1f(
'L', m-q-i+1, p-i, x12(i,i), 1, tauq2(i),
642 $ x12(i,i+1), ldx12, work )
643 IF ( m-p-i .GT. 0 )
THEN
644 CALL dlarf1f(
'L', m-q-i+1, m-p-i, x12(i,i), 1,
645 $ tauq2(i), x22(i,i+1), ldx22, work )
654 CALL dscal( m-q-i+1, -z1*z4, x12(i,i), 1 )
655 CALL dlarfgp( m-q-i+1, x12(i,i), x12(i+1,i), 1,
659 CALL dlarf1f(
'L', m-q-i+1, p-i, x12(i,i), 1,
660 $ tauq2(i), x12(i,i+1), ldx12, work )
663 $
CALL dlarf1f(
'L', m-q-i+1, m-p-q, x12(i,i), 1,
664 $ tauq2(i), x22(i,q+1), ldx22, work )
672 CALL dscal( m-p-q-i+1, z2*z4, x22(p+i,q+i), 1 )
673 IF ( m-p-q .EQ. i )
THEN
674 CALL dlarfgp( m-p-q-i+1, x22(p+i,q+i), x22(p+i,q+i),
678 CALL dlarfgp( m-p-q-i+1, x22(p+i,q+i), x22(p+i+1,q+i),
681 CALL dlarf1f(
'L', m-p-q-i+1, m-p-q-i, x22(p+i,q+i),
682 $ 1, tauq2(p+i), x22(p+i,q+i+1), ldx22,