201 SUBROUTINE zunbdb1( M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI,
202 $ TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO )
209 INTEGER INFO, LWORK, M, P, Q, LDX11, LDX21
212 DOUBLE PRECISION PHI(*), THETA(*)
213 COMPLEX*16 TAUP1(*), TAUP2(*), TAUQ1(*), WORK(*),
214 $ x11(ldx11,*), x21(ldx21,*)
221 parameter( one = (1.0d0,0.0d0) )
224 DOUBLE PRECISION C, S
225 INTEGER CHILDINFO, I, ILARF, IORBDB5, LLARF, LORBDB5,
234 DOUBLE PRECISION DZNRM2
238 INTRINSIC atan2, cos, max, sin, sqrt
245 lquery = lwork .EQ. -1
249 ELSE IF( p .LT. q .OR. m-p .LT. q )
THEN 251 ELSE IF( q .LT. 0 .OR. m-q .LT. q )
THEN 253 ELSE IF( ldx11 .LT. max( 1, p ) )
THEN 255 ELSE IF( ldx21 .LT. max( 1, m-p ) )
THEN 261 IF( info .EQ. 0 )
THEN 263 llarf = max( p-1, m-p-1, q-1 )
266 lworkopt = max( ilarf+llarf-1, iorbdb5+lorbdb5-1 )
269 IF( lwork .LT. lworkmin .AND. .NOT.lquery )
THEN 273 IF( info .NE. 0 )
THEN 274 CALL xerbla(
'ZUNBDB1', -info )
276 ELSE IF( lquery )
THEN 284 CALL zlarfgp( p-i+1, x11(i,i), x11(i+1,i), 1, taup1(i) )
285 CALL zlarfgp( m-p-i+1, x21(i,i), x21(i+1,i), 1, taup2(i) )
286 theta(i) = atan2( dble( x21(i,i) ), dble( x11(i,i) ) )
291 CALL zlarf(
'L', p-i+1, q-i, x11(i,i), 1, dconjg(taup1(i)),
292 $ x11(i,i+1), ldx11, work(ilarf) )
293 CALL zlarf(
'L', m-p-i+1, q-i, x21(i,i), 1, dconjg(taup2(i)),
294 $ x21(i,i+1), ldx21, work(ilarf) )
297 CALL zdrot( q-i, x11(i,i+1), ldx11, x21(i,i+1), ldx21, c,
299 CALL zlacgv( q-i, x21(i,i+1), ldx21 )
300 CALL zlarfgp( q-i, x21(i,i+1), x21(i,i+2), ldx21, tauq1(i) )
301 s = dble( x21(i,i+1) )
303 CALL zlarf(
'R', p-i, q-i, x21(i,i+1), ldx21, tauq1(i),
304 $ x11(i+1,i+1), ldx11, work(ilarf) )
305 CALL zlarf(
'R', m-p-i, q-i, x21(i,i+1), ldx21, tauq1(i),
306 $ x21(i+1,i+1), ldx21, work(ilarf) )
307 CALL zlacgv( q-i, x21(i,i+1), ldx21 )
308 c = sqrt( dznrm2( p-i, x11(i+1,i+1), 1 )**2
309 $ + dznrm2( m-p-i, x21(i+1,i+1), 1 )**2 )
310 phi(i) = atan2( s, c )
311 CALL zunbdb5( p-i, m-p-i, q-i-1, x11(i+1,i+1), 1,
312 $ x21(i+1,i+1), 1, x11(i+1,i+2), ldx11,
313 $ x21(i+1,i+2), ldx21, work(iorbdb5), lorbdb5,
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 xerbla(SRNAME, INFO)
XERBLA
subroutine zunbdb1(M, P, Q, X11, LDX11, X21, LDX21, THETA, PHI, TAUP1, TAUP2, TAUQ1, WORK, LWORK, INFO)
ZUNBDB1
subroutine zdrot(N, ZX, INCX, ZY, INCY, C, S)
ZDROT
subroutine zunbdb5(M1, M2, N, X1, INCX1, X2, INCX2, Q1, LDQ1, Q2, LDQ2, WORK, LWORK, INFO)
ZUNBDB5
subroutine zlacgv(N, X, INCX)
ZLACGV conjugates a complex vector.