127 INTEGER M, N, MB1, NB1, NB2
135 REAL ,
ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
136 $ RWORK(:), WORK( : ), T1(:,:), T2(:,:), DIAG(:),
137 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
141 parameter( zero = 0.0e+0, one = 1.0e+0 )
145 INTEGER INFO, J, K, L, LWORK, NB2_UB, NRB
146 REAL ANORM, EPS, RESID, CNORM, DNORM
153 REAL SLAMCH, SLANGE, SLANSY
154 EXTERNAL slamch, slange, slansy
161 INTRINSIC ceiling, real, max, min
164 CHARACTER(LEN=32) SRNAMT
167 COMMON / srmnamc / srnamt
170 DATA iseed / 1988, 1989, 1990, 1991 /
176 eps = slamch(
'Epsilon' )
182 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
189 CALL slarnv( 2, iseed, m, a( 1, j ) )
194 CALL slarnv( 2, iseed, m/2, a( m/4, j ) )
198 CALL slacpy(
'Full', m, n, a, m, af, m )
202 nrb = max( 1, ceiling( real( m - n ) / real( mb1 - n ) ) )
204 ALLOCATE ( t1( nb1, n * nrb ) )
205 ALLOCATE ( t2( nb2, n ) )
206 ALLOCATE ( diag( n ) )
212 nb2_ub = min( nb2, n)
214 CALL sgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
215 $ workquery, -1, info )
217 lwork = int( workquery( 1 ) )
222 lwork = max( lwork, nb2_ub * n, nb2_ub * m )
224 ALLOCATE ( work( lwork ) )
233 srnamt =
'SGETSQRHRT'
234 CALL sgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
235 $ work, lwork, info )
242 CALL slaset(
'Full', m, m, zero, one, q, m )
245 CALL sgemqrt(
'L',
'N', m, m, k, nb2_ub, af, m, t2, nb2, q, m,
250 CALL slaset(
'Full', m, n, zero, zero, r, m )
252 CALL slacpy(
'Upper', m, n, af, m, r, m )
257 CALL sgemm(
'T',
'N', m, n, m, -one, q, m, a, m, one, r, m )
259 anorm = slange(
'1', m, n, a, m, rwork )
260 resid = slange(
'1', m, n, r, m, rwork )
261 IF( anorm.GT.zero )
THEN
262 result( 1 ) = resid / ( eps * max( 1, m ) * anorm )
270 CALL slaset(
'Full', m, m, zero, one, r, m )
271 CALL ssyrk(
'U',
'T', m, m, -one, q, m, one, r, m )
272 resid = slansy(
'1',
'Upper', m, r, m, rwork )
273 result( 2 ) = resid / ( eps * max( 1, m ) )
278 CALL slarnv( 2, iseed, m, c( 1, j ) )
280 cnorm = slange(
'1', m, n, c, m, rwork )
281 CALL slacpy(
'Full', m, n, c, m, cf, m )
286 CALL sgemqrt(
'L',
'N', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
292 CALL sgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
293 resid = slange(
'1', m, n, cf, m, rwork )
294 IF( cnorm.GT.zero )
THEN
295 result( 3 ) = resid / ( eps * max( 1, m ) * cnorm )
302 CALL slacpy(
'Full', m, n, c, m, cf, m )
307 CALL sgemqrt(
'L',
'T', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
313 CALL sgemm(
'T',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
314 resid = slange(
'1', m, n, cf, m, rwork )
315 IF( cnorm.GT.zero )
THEN
316 result( 4 ) = resid / ( eps * max( 1, m ) * cnorm )
324 CALL slarnv( 2, iseed, n, d( 1, j ) )
326 dnorm = slange(
'1', n, m, d, n, rwork )
327 CALL slacpy(
'Full', n, m, d, n, df, n )
332 CALL sgemqrt(
'R',
'N', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
338 CALL sgemm(
'N',
'N', n, m, m, -one, d, n, q, m, one, df, n )
339 resid = slange(
'1', n, m, df, n, rwork )
340 IF( dnorm.GT.zero )
THEN
341 result( 5 ) = resid / ( eps * max( 1, m ) * dnorm )
348 CALL slacpy(
'Full', n, m, d, n, df, n )
353 CALL sgemqrt(
'R',
'T', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
359 CALL sgemm(
'N',
'T', n, m, m, -one, d, n, q, m, one, df, n )
360 resid = slange(
'1', n, m, df, n, rwork )
361 IF( dnorm.GT.zero )
THEN
362 result( 6 ) = resid / ( eps * max( 1, m ) * dnorm )
369 DEALLOCATE ( a, af, q, r, rwork, work, t1, t2, diag,