200 SUBROUTINE dorbdb2( M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI,
201 $ TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO )
208 INTEGER INFO, LWORK, M, P, Q, LDX11, LDX21
211 DOUBLE PRECISION PHI(*), THETA(*)
212 DOUBLE PRECISION TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*),
213 $ x11(ldx11,*), x21(ldx21,*)
219 DOUBLE PRECISION NEGONE, ONE
220 parameter( negone = -1.0d0, one = 1.0d0 )
223 DOUBLE PRECISION C, S
224 INTEGER CHILDINFO, I, ILARF, IORBDB5, LLARF, LORBDB5,
232 DOUBLE PRECISION DNRM2
236 INTRINSIC atan2, cos, max, sin, sqrt
243 lquery = lwork .EQ. -1
247 ELSE IF( p .LT. 0 .OR. p .GT. m-p )
THEN 249 ELSE IF( q .LT. 0 .OR. q .LT. p .OR. m-q .LT. p )
THEN 251 ELSE IF( ldx11 .LT. max( 1, p ) )
THEN 253 ELSE IF( ldx21 .LT. max( 1, m-p ) )
THEN 259 IF( info .EQ. 0 )
THEN 261 llarf = max( p-1, m-p, q-1 )
264 lworkopt = max( ilarf+llarf-1, iorbdb5+lorbdb5-1 )
267 IF( lwork .LT. lworkmin .AND. .NOT.lquery )
THEN 271 IF( info .NE. 0 )
THEN 272 CALL xerbla(
'DORBDB2', -info )
274 ELSE IF( lquery )
THEN 283 CALL drot( q-i+1, x11(i,i), ldx11, x21(i-1,i), ldx21, c, s )
285 CALL dlarfgp( q-i+1, x11(i,i), x11(i,i+1), ldx11, tauq1(i) )
288 CALL dlarf(
'R', p-i, q-i+1, x11(i,i), ldx11, tauq1(i),
289 $ x11(i+1,i), ldx11, work(ilarf) )
290 CALL dlarf(
'R', m-p-i+1, q-i+1, x11(i,i), ldx11, tauq1(i),
291 $ x21(i,i), ldx21, work(ilarf) )
292 s = sqrt( dnrm2( p-i, x11(i+1,i), 1 )**2
293 $ + dnrm2( m-p-i+1, x21(i,i), 1 )**2 )
294 theta(i) = atan2( s, c )
296 CALL dorbdb5( p-i, m-p-i+1, q-i, x11(i+1,i), 1, x21(i,i), 1,
297 $ x11(i+1,i+1), ldx11, x21(i,i+1), ldx21,
298 $ work(iorbdb5), lorbdb5, childinfo )
299 CALL dscal( p-i, negone, x11(i+1,i), 1 )
300 CALL dlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1, taup2(i) )
302 CALL dlarfgp( p-i, x11(i+1,i), x11(i+2,i), 1, taup1(i) )
303 phi(i) = atan2( x11(i+1,i), x21(i,i) )
307 CALL dlarf(
'L', p-i, q-i, x11(i+1,i), 1, taup1(i),
308 $ x11(i+1,i+1), ldx11, work(ilarf) )
311 CALL dlarf(
'L', m-p-i+1, q-i, x21(i,i), 1, taup2(i),
312 $ x21(i,i+1), ldx21, work(ilarf) )
319 CALL dlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1, taup2(i) )
321 CALL dlarf(
'L', m-p-i+1, q-i, x21(i,i), 1, taup2(i),
322 $ x21(i,i+1), ldx21, 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 dorbdb2(M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI, TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO)
DORBDB2
subroutine dlarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
DLARF applies an elementary reflector to a general rectangular matrix.
subroutine dscal(N, DA, DX, INCX)
DSCAL
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.