1 SUBROUTINE zqrt03( M, N, K, AF, C, CC, Q, LDA, T, WORK, LWORK,
11 INTEGER k, lda, lwork, m, n
15 DOUBLE PRECISION result( * ), rwork( * )
16 COMPLEX*16 af( lda, * ), c( lda, * ), cc( lda, * ),
17 $ q( lda, * ), work( lwork )
80 DOUBLE PRECISION zero, one
81 parameter( zero = 0.0d+0, one = 1.0d+0 )
83 parameter( rogue = ( -1.0d+10, -1.0d+10 ) )
87 INTEGER info, iside, itrans, j, mc, nc
88 INTEGER plasma_side, plasma_trans
89 DOUBLE PRECISION cnorm, eps, resid
93 DOUBLE PRECISION dlamch, zlange
94 EXTERNAL lsame, dlamch, zlange
97 EXTERNAL zgemm, zlacpy, zlarnv,
zlaset, zungqr, zunmqr
103 INTRINSIC dble, dcmplx,
max
109 common / srnamc / srnamt
112 DATA iseed / 1988, 1989, 1990, 1991 /
116 eps = dlamch(
'Epsilon' )
122 CALL
zlaset(
'Full', m, m, rogue, rogue, q, lda )
124 CALL
zlaset(
'Full', m, m, dcmplx( zero ), dcmplx( one ),
134 IF( iside.EQ.1 )
THEN
136 plasma_side = plasmaleft
141 plasma_side = plasmaright
149 CALL zlarnv( 2, iseed, mc, c( 1, j ) )
151 cnorm = zlange(
'1', mc, nc, c, lda, rwork )
156 IF( itrans.EQ.1 )
THEN
158 plasma_trans = plasmanotrans
161 plasma_trans = plasmaconjtrans
166 CALL zlacpy(
'Full', mc, nc, c, lda, cc, lda )
172 $ af, lda, t, cc, lda, info )
177 CALL
zlaset(
'Full', m, m, dcmplx( zero ),
178 $ dcmplx( one ), q, lda )
180 IF( lsame(
side,
'L' ) )
THEN
181 CALL zgemm(
trans,
'No transpose', mc, nc, mc,
182 $ dcmplx( -one ), q, lda, c, lda,
183 $ dcmplx( one ), cc, lda )
185 CALL zgemm(
'No transpose',
trans, mc, nc, nc,
186 $ dcmplx( -one ), c, lda, q, lda,
187 $ dcmplx( one ), cc, lda )
192 resid = zlange(
'1', mc, nc, cc, lda, rwork )
193 result( ( iside-1 )*2+itrans ) = resid /
194 $ ( dble(
max( 1, m ) )*cnorm*eps )