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 xerbla(srname, info)
subroutine dlarf(side, m, n, v, incv, tau, c, ldc, work)
DLARF applies an elementary reflector to a general rectangular matrix.
subroutine dlarfgp(n, alpha, x, incx, tau)
DLARFGP generates an elementary reflector (Householder matrix) with non-negative beta.
subroutine drot(n, dx, incx, dy, incy, c, s)
DROT
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dorbdb2(m, p, q, x11, ldx11, x21, ldx21, theta, phi, taup1, taup2, tauq1, work, lwork, info)
DORBDB2
subroutine dorbdb5(m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2, ldq2, work, lwork, info)
DORBDB5