199 SUBROUTINE dorbdb3( M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI,
200 $ TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO )
207 INTEGER INFO, LWORK, M, P, Q, LDX11, LDX21
210 DOUBLE PRECISION PHI(*), THETA(*)
211 DOUBLE PRECISION TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*),
212 $ x11(ldx11,*), x21(ldx21,*)
219 parameter( one = 1.0d0 )
222 DOUBLE PRECISION C, S
223 INTEGER CHILDINFO, I, ILARF, IORBDB5, LLARF, LORBDB5,
231 DOUBLE PRECISION DNRM2
235 INTRINSIC atan2, cos, max, sin, sqrt
242 lquery = lwork .EQ. -1
246 ELSE IF( 2*p .LT. m .OR. p .GT. m )
THEN 248 ELSE IF( q .LT. m-p .OR. m-q .LT. m-p )
THEN 250 ELSE IF( ldx11 .LT. max( 1, p ) )
THEN 252 ELSE IF( ldx21 .LT. max( 1, m-p ) )
THEN 258 IF( info .EQ. 0 )
THEN 260 llarf = max( p, m-p-1, q-1 )
263 lworkopt = max( ilarf+llarf-1, iorbdb5+lorbdb5-1 )
266 IF( lwork .LT. lworkmin .AND. .NOT.lquery )
THEN 270 IF( info .NE. 0 )
THEN 271 CALL xerbla(
'DORBDB3', -info )
273 ELSE IF( lquery )
THEN 282 CALL drot( q-i+1, x11(i-1,i), ldx11, x21(i,i), ldx11, c, s )
285 CALL dlarfgp( q-i+1, x21(i,i), x21(i,i+1), ldx21, tauq1(i) )
288 CALL dlarf(
'R', p-i+1, q-i+1, x21(i,i), ldx21, tauq1(i),
289 $ x11(i,i), ldx11, work(ilarf) )
290 CALL dlarf(
'R', m-p-i, q-i+1, x21(i,i), ldx21, tauq1(i),
291 $ x21(i+1,i), ldx21, work(ilarf) )
292 c = sqrt( dnrm2( p-i+1, x11(i,i), 1 )**2
293 $ + dnrm2( m-p-i, x21(i+1,i), 1 )**2 )
294 theta(i) = atan2( s, c )
296 CALL dorbdb5( p-i+1, m-p-i, q-i, x11(i,i), 1, x21(i+1,i), 1,
297 $ x11(i,i+1), ldx11, x21(i+1,i+1), ldx21,
298 $ work(iorbdb5), lorbdb5, childinfo )
299 CALL dlarfgp( p-i+1, x11(i,i), x11(i+1,i), 1, taup1(i) )
300 IF( i .LT. m-p )
THEN 301 CALL dlarfgp( m-p-i, x21(i+1,i), x21(i+2,i), 1, taup2(i) )
302 phi(i) = atan2( x21(i+1,i), x11(i,i) )
306 CALL dlarf(
'L', m-p-i, q-i, x21(i+1,i), 1, taup2(i),
307 $ x21(i+1,i+1), ldx21, work(ilarf) )
310 CALL dlarf(
'L', p-i+1, q-i, x11(i,i), 1, taup1(i), x11(i,i+1),
311 $ ldx11, work(ilarf) )
318 CALL dlarfgp( p-i+1, x11(i,i), x11(i+1,i), 1, taup1(i) )
320 CALL dlarf(
'L', p-i+1, q-i, x11(i,i), 1, taup1(i), x11(i,i+1),
321 $ ldx11, work(ilarf) )
subroutine dorbdb5(M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2, WORK, LWORK, INFO)
DORBDB5
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dorbdb3(M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI, TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO)
DORBDB3
subroutine dlarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
DLARF applies an elementary reflector to a general rectangular matrix.
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dlarfgp(N, ALPHA, X, INCX, TAU)
DLARFGP generates an elementary reflector (Householder matrix) with non-negative beta.