126 INTEGER M, N, MB1, NB1, NB2
134 REAL ,
ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
135 $ RWORK(:), WORK( : ), T1(:,:), T2(:,:), DIAG(:),
136 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
140 parameter( zero = 0.0e+0, one = 1.0e+0 )
144 INTEGER INFO, I, J, K, L, LWORK, NB1_UB, , NRB
145 REAL ANORM, EPS, RESID, CNORM, DNORM
152 REAL SLAMCH, SLANGE, SLANSY
153 EXTERNAL slamch, slange, slansy
160 INTRINSIC ceiling, real,
max,
min
163 CHARACTER(LEN=32) SRNAMT
166 COMMON / srmnamc / srnamt
169 DATA iseed / 1988, 1989, 1990, 1991 /
175 eps = slamch(
'Epsilon' )
181 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
188 CALL slarnv( 2, iseed, m, a( 1, j ) )
193 CALL slarnv( 2, iseed, m/2, a( m/4, j ) )
197 CALL slacpy(
'Full', m, n, a, m, af, m )
201 nrb =
max( 1, ceiling( real( m - n ) / real( mb1 - n ) ) )
203 ALLOCATE ( t1( nb1, n * nrb ) )
204 ALLOCATE ( t2( nb2, n ) )
205 ALLOCATE ( diag( n ) )
211 nb1_ub =
min( nb1, n)
215 nb2_ub =
min( nb2, n)
217 CALL slatsqr( m, n, mb1, nb1_ub, af, m, t1, nb1,
218 $ workquery, -1, info )
219 lwork = int( workquery( 1 ) )
220 CALL sorgtsqr( m, n, mb1, nb1, af, m, t1, nb1, workquery, -1,
223 lwork =
max( lwork, int( workquery( 1 ) ) )
228 lwork =
max( lwork, nb2_ub * n, nb2_ub * m )
230 ALLOCATE ( work( lwork ) )
240 CALL slatsqr( m, n, mb1, nb1_ub, af, m, t1, nb1, work, lwork,
246 CALL slacpy(
'U', n, n, af, m, r, m )
251 CALL sorgtsqr( m, n, mb1, nb1, af, m, t1, nb1, work, lwork,
258 CALL sorhr_col( m, n, nb2, af, m, t2, nb2, diag, info )
268 CALL slacpy(
'U', n, n, r, m, af, m )
271 IF( diag( i ).EQ.-one )
THEN
272 CALL sscal( n+1-i, -one, af( i, i ), m )
281 CALL slaset(
'Full', m, m, zero, one, q, m )
284 CALL sgemqrt(
'L',
'N', m, m, k, nb2_ub, af, m, t2, nb2, q, m,
289 CALL slaset( 'full
', M, N, ZERO, ZERO, R, M )
291 CALL SLACPY( 'upper
', M, N, AF, M, R, M )
296 CALL SGEMM( 't
', 'n
', M, N, M, -ONE, Q, M, A, M, ONE, R, M )
298 ANORM = SLANGE( '1
', M, N, A, M, RWORK )
299 RESID = SLANGE( '1
', M, N, R, M, RWORK )
300.GT.
IF( ANORMZERO ) THEN
301 RESULT( 1 ) = RESID / ( EPS * MAX( 1, M ) * ANORM )
309 CALL SLASET( 'full
', M, M, ZERO, ONE, R, M )
310 CALL SSYRK( 'u
', 't
', M, M, -ONE, Q, M, ONE, R, M )
311 RESID = SLANSY( '1
', 'upper
', M, R, M, RWORK )
312 RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) )
317 CALL SLARNV( 2, ISEED, M, C( 1, J ) )
319 CNORM = SLANGE( '1
', M, N, C, M, RWORK )
320 CALL SLACPY( 'full
', M, N, C, M, CF, M )
325 CALL SGEMQRT( 'l
', 'n
', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M,
331 CALL SGEMM( 'n
', 'n
', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
332 RESID = SLANGE( '1
', M, N, CF, M, RWORK )
333.GT.
IF( CNORMZERO ) THEN
334 RESULT( 3 ) = RESID / ( EPS * MAX( 1, M ) * CNORM )
341 CALL SLACPY( 'full
', M, N, C, M, CF, M )
346 CALL SGEMQRT( 'l
', 't
', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M,
352 CALL SGEMM( 't
', 'n
', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
353 RESID = SLANGE( '1
', M, N, CF, M, RWORK )
354.GT.
IF( CNORMZERO ) THEN
355 RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM )
363 CALL SLARNV( 2, ISEED, N, D( 1, J ) )
365 DNORM = SLANGE( '1
', N, M, D, N, RWORK )
366 CALL SLACPY( 'full
', N, M, D, N, DF, N )
371 CALL SGEMQRT( 'r
', 'n
', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N,
377 CALL SGEMM( 'n
', 'n
', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
378 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
379.GT.
IF( DNORMZERO ) THEN
380 RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM )
387 CALL SLACPY( 'full
', N, M, D, N, DF, N )
392 CALL SGEMQRT( 'r
', 't
', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N,
398 CALL SGEMM( 'n
', 't
', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
399 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
400.GT.
IF( DNORMZERO ) THEN
401 RESULT( 6 ) = RESID / ( EPS * MAX( 1, M ) * DNORM )
408 DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T1, T2, DIAG,