199 SUBROUTINE zunbdb2( 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 COMPLEX*16 TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*),
212 $ x11(ldx11,*), x21(ldx21,*)
218 COMPLEX*16 NEGONE, ONE
219 parameter( negone = (-1.0d0,0.0d0),
220 $ one = (1.0d0,0.0d0) )
223 DOUBLE PRECISION C, S
224 INTEGER CHILDINFO, I, ILARF, IORBDB5, LLARF, LORBDB5,
233 DOUBLE PRECISION DZNRM2
237 INTRINSIC atan2, cos, max, sin, sqrt
244 lquery = lwork .EQ. -1
248 ELSE IF( p .LT. 0 .OR. p .GT. m-p )
THEN
250 ELSE IF( q .LT. 0 .OR. q .LT. p .OR. m-q .LT. p )
THEN
252 ELSE IF( ldx11 .LT. max( 1, p ) )
THEN
254 ELSE IF( ldx21 .LT. max( 1, m-p ) )
THEN
260 IF( info .EQ. 0 )
THEN
262 llarf = max( p-1, m-p, q-1 )
265 lworkopt = max( ilarf+llarf-1, iorbdb5+lorbdb5-1 )
268 IF( lwork .LT. lworkmin .AND. .NOT.lquery )
THEN
272 IF( info .NE. 0 )
THEN
273 CALL xerbla(
'ZUNBDB2', -info )
275 ELSE IF( lquery )
THEN
284 CALL zdrot( q-i+1, x11(i,i), ldx11, x21(i-1,i), ldx21, c,
287 CALL zlacgv( q-i+1, x11(i,i), ldx11 )
288 CALL zlarfgp( q-i+1, x11(i,i), x11(i,i+1), ldx11, tauq1(i) )
291 CALL zlarf(
'R', p-i, q-i+1, x11(i,i), ldx11, tauq1(i),
292 $ x11(i+1,i), ldx11, work(ilarf) )
293 CALL zlarf(
'R', m-p-i+1, q-i+1, x11(i,i), ldx11, tauq1(i),
294 $ x21(i,i), ldx21, work(ilarf) )
295 CALL zlacgv( q-i+1, x11(i,i), ldx11 )
296 s = sqrt( dznrm2( p-i, x11(i+1,i), 1 )**2
297 $ + dznrm2( m-p-i+1, x21(i,i), 1 )**2 )
298 theta(i) = atan2( s, c )
300 CALL zunbdb5( p-i, m-p-i+1, q-i, x11(i+1,i), 1, x21(i,i), 1,
301 $ x11(i+1,i+1), ldx11, x21(i,i+1), ldx21,
302 $ work(iorbdb5), lorbdb5, childinfo )
303 CALL zscal( p-i, negone, x11(i+1,i), 1 )
304 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1, taup2(i) )
306 CALL zlarfgp( p-i, x11(i+1,i), x11(i+2,i), 1, taup1(i) )
307 phi(i) = atan2( dble( x11(i+1,i) ), dble( x21(i,i) ) )
311 CALL zlarf(
'L', p-i, q-i, x11(i+1,i), 1, dconjg(taup1(i)),
312 $ x11(i+1,i+1), ldx11, work(ilarf) )
315 CALL zlarf(
'L', m-p-i+1, q-i, x21(i,i), 1, dconjg(taup2(i)),
316 $ x21(i,i+1), ldx21, work(ilarf) )
323 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1, taup2(i) )
325 CALL zlarf(
'L', m-p-i+1, q-i, x21(i,i), 1, dconjg(taup2(i)),
326 $ x21(i,i+1), ldx21, work(ilarf) )
subroutine xerbla(srname, info)
subroutine zlacgv(n, x, incx)
ZLACGV conjugates a complex vector.
subroutine zlarf(side, m, n, v, incv, tau, c, ldc, work)
ZLARF applies an elementary reflector to a general rectangular matrix.
subroutine zlarfgp(n, alpha, x, incx, tau)
ZLARFGP generates an elementary reflector (Householder matrix) with non-negative beta.
subroutine zdrot(n, zx, incx, zy, incy, c, s)
ZDROT
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zunbdb2(m, p, q, x11, ldx11, x21, ldx21, theta, phi, taup1, taup2, tauq1, work, lwork, info)
ZUNBDB2
subroutine zunbdb5(m1, m2, n, x1, incx1, x2, incx2, q1, ldq1, q2, ldq2, work, lwork, info)
ZUNBDB5