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 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 dorbdb3(m, p, q, x11, ldx11, x21, ldx21, theta, phi, taup1, taup2, tauq1, work, lwork, info)
DORBDB3
subroutine dorbdb5(m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2, ldq2, work, lwork, info)
DORBDB5