1 SUBROUTINE cqrt03( M, N, K, AF, C, CC, Q, LDA, T, WORK, LWORK,
11 INTEGER k, lda, lwork, m, n
15 REAL result( * ), rwork( * )
16 COMPLEX af( lda, * ), c( lda, * ), cc( lda, * ),
17 $ q( lda, * ), work( lwork )
81 parameter( zero = 0.0e+0, one = 1.0e+0 )
83 parameter( rogue = ( -1.0e+10, -1.0e+10 ) )
87 INTEGER info, iside, itrans, j, mc, nc
88 INTEGER plasma_side, plasma_trans
89 REAL cnorm, eps, resid
94 EXTERNAL lsame, clange, slamch
97 EXTERNAL cgemm, clacpy, clarnv,
claset, cungqr, cunmqr
103 INTRINSIC cmplx,
max, real
109 common / srnamc / srnamt
112 DATA iseed / 1988, 1989, 1990, 1991 /
116 eps = slamch(
'Epsilon' )
122 CALL
claset(
'Full', m, m, rogue, rogue, q, lda )
124 CALL
claset(
'Full', m, m, cmplx(zero), cmplx(one), q, lda )
133 IF( iside.EQ.1 )
THEN
135 plasma_side = plasmaleft
140 plasma_side = plasmaright
148 CALL clarnv( 2, iseed, mc, c( 1, j ) )
150 cnorm = clange(
'1', mc, nc, c, lda, rwork )
155 IF( itrans.EQ.1 )
THEN
157 plasma_trans = plasmanotrans
160 plasma_trans = plasmaconjtrans
165 CALL clacpy(
'Full', mc, nc, c, lda, cc, lda )
171 $ af, lda, t, cc, lda, info )
176 CALL
claset(
'Full', m, m, cmplx(zero), cmplx(one),
179 IF( lsame(
side,
'L' ) )
THEN
180 CALL cgemm(
trans,
'No transpose', mc, nc, mc,
181 $ cmplx( -one ), q, lda, c, lda, cmplx( one ),
184 CALL cgemm(
'No transpose',
trans, mc, nc, nc,
185 $ cmplx( -one ), c, lda, q, lda, cmplx( one ),
191 resid = clange(
'1', mc, nc, cc, lda, rwork )
192 result( ( iside-1 )*2+itrans ) = resid /
193 $ (
REAL( MAX( 1, M ) )*cnorm*eps )