1 SUBROUTINE dqrt03( M, N, K, AF, C, CC, Q, LDA, T, WORK, LWORK,
11 INTEGER k, lda, lwork, m, n
15 DOUBLE PRECISION af( lda, * ), c( lda, * ), cc( lda, * ),
16 $ q( lda, * ), result( * ), rwork( * ),
80 DOUBLE PRECISION one, zero
81 parameter( one = 1.0d+0 )
82 parameter( zero = 0.0d+0 )
83 DOUBLE PRECISION rogue
84 parameter( rogue = -1.0d+10 )
88 INTEGER info, iside, itrans, j, mc, nc
89 INTEGER plasma_side, plasma_trans
90 DOUBLE PRECISION cnorm, eps, resid
94 DOUBLE PRECISION dlamch, dlange
95 EXTERNAL lsame, dlamch, dlange
98 EXTERNAL dgemm, dlacpy, dlarnv,
dlaset, dorgqr, dormqr
110 common / srnamc / srnamt
113 DATA iseed / 1988, 1989, 1990, 1991 /
117 eps = dlamch(
'Epsilon' )
123 CALL
dlaset(
'Full', m, m, rogue, rogue, q, lda )
125 CALL
dlaset(
'Full', m, m, zero, one, q, lda )
134 IF( iside.EQ.1 )
THEN
136 plasma_side = plasmaleft
141 plasma_side = plasmaright
149 CALL dlarnv( 2, iseed, mc, c( 1, j ) )
151 cnorm = dlange(
'1', mc, nc, c, lda, rwork )
156 IF( itrans.EQ.1 )
THEN
158 plasma_trans = plasmanotrans
161 plasma_trans = plasmatrans
166 CALL dlacpy(
'Full', mc, nc, c, lda, cc, lda )
172 $ af, lda, t, cc, lda, info )
177 CALL
dlaset(
'Full', m, m, zero, one, q, lda )
179 IF( lsame(
side,
'L' ) )
THEN
180 CALL dgemm(
trans,
'No transpose', mc, nc, mc, -one, q,
181 $ lda, c, lda, one, cc, lda )
183 CALL dgemm(
'No transpose',
trans, mc, nc, nc, -one, c,
184 $ lda, q, lda, one, cc, lda )
189 resid = dlange(
'1', mc, nc, cc, lda, rwork )
190 result( ( iside-1 )*2+itrans ) = resid /
191 $ ( dble(
max( 1, m ) )*cnorm*eps )