200 SUBROUTINE cunbdb3( 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 REAL PHI(*), THETA(*)
212 COMPLEX TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*),
213 $ x11(ldx11,*), x21(ldx21,*)
220 parameter( one = (1.0e0,0.0e0) )
224 INTEGER CHILDINFO, I, ILARF, IORBDB5, LLARF, LORBDB5,
232 REAL SCNRM2, SROUNDUP_LWORK
233 EXTERNAL scnrm2, sroundup_lwork
236 INTRINSIC atan2, cos, max, sin, sqrt
243 lquery = lwork .EQ. -1
247 ELSE IF( 2*p .LT. m .OR. p .GT. m )
THEN
249 ELSE IF( q .LT. m-p .OR. m-q .LT. m-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, m-p-1, q-1 )
264 lworkopt = max( ilarf+llarf-1, iorbdb5+lorbdb5-1 )
266 work(1) = sroundup_lwork(lworkopt)
267 IF( lwork .LT. lworkmin .AND. .NOT.lquery )
THEN
271 IF( info .NE. 0 )
THEN
272 CALL xerbla(
'CUNBDB3', -info )
274 ELSE IF( lquery )
THEN
283 CALL csrot( q-i+1, x11(i-1,i), ldx11, x21(i,i), ldx11, c,
287 CALL clacgv( q-i+1, x21(i,i), ldx21 )
288 CALL clarfgp( q-i+1, x21(i,i), x21(i,i+1), ldx21, tauq1(i) )
291 CALL clarf(
'R', p-i+1, q-i+1, x21(i,i), ldx21, tauq1(i),
292 $ x11(i,i), ldx11, work(ilarf) )
293 CALL clarf(
'R', m-p-i, q-i+1, x21(i,i), ldx21, tauq1(i),
294 $ x21(i+1,i), ldx21, work(ilarf) )
295 CALL clacgv( q-i+1, x21(i,i), ldx21 )
296 c = sqrt( scnrm2( p-i+1, x11(i,i), 1 )**2
297 $ + scnrm2( m-p-i, x21(i+1,i), 1 )**2 )
298 theta(i) = atan2( s, c )
300 CALL cunbdb5( p-i+1, m-p-i, q-i, x11(i,i), 1, x21(i+1,i), 1,
301 $ x11(i,i+1), ldx11, x21(i+1,i+1), ldx21,
302 $ work(iorbdb5), lorbdb5, childinfo )
303 CALL clarfgp( p-i+1, x11(i,i), x11(i+1,i), 1, taup1(i) )
304 IF( i .LT. m-p )
THEN
305 CALL clarfgp( m-p-i, x21(i+1,i), x21(i+2,i), 1, taup2(i) )
306 phi(i) = atan2( real( x21(i+1,i) ), real( x11(i,i) ) )
310 CALL clarf(
'L', m-p-i, q-i, x21(i+1,i), 1, conjg(taup2(i)),
311 $ x21(i+1,i+1), ldx21, work(ilarf) )
314 CALL clarf(
'L', p-i+1, q-i, x11(i,i), 1, conjg(taup1(i)),
315 $ x11(i,i+1), ldx11, work(ilarf) )
322 CALL clarfgp( p-i+1, x11(i,i), x11(i+1,i), 1, taup1(i) )
324 CALL clarf(
'L', p-i+1, q-i, x11(i,i), 1, conjg(taup1(i)),
325 $ x11(i,i+1), ldx11, work(ilarf) )
subroutine xerbla(srname, info)
subroutine clacgv(n, x, incx)
CLACGV conjugates a complex vector.
subroutine clarf(side, m, n, v, incv, tau, c, ldc, work)
CLARF applies an elementary reflector to a general rectangular matrix.
subroutine clarfgp(n, alpha, x, incx, tau)
CLARFGP generates an elementary reflector (Householder matrix) with non-negative beta.
subroutine csrot(n, cx, incx, cy, incy, c, s)
CSROT
subroutine cunbdb3(m, p, q, x11, ldx11, x21, ldx21, theta, phi, taup1, taup2, tauq1, work, lwork, info)
CUNBDB3
subroutine cunbdb5(m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2, ldq2, work, lwork, info)
CUNBDB5