88 REAL,
ALLOCATABLE :: AF(:,:), Q(:,:),
94 parameter( zero = 0.0, one = 1.0 )
97 INTEGER INFO, J, K, L, LWORK
98 REAL ANORM, EPS, RESID, CNORM, DNORM
110 EXTERNAL slamch, slange, slansy, lsame
116 DATA iseed / 1988, 1989, 1990, 1991 /
118 eps = slamch(
'Epsilon' )
121 lwork =
max(2,l)*
max(2,l)*nb
125 ALLOCATE ( a(m,n), af(m,n), q(m,m), r(m,l), rwork(l),
126 $ work(lwork), t(nb,n), c(m,n), cf(m,n),
133 CALL slarnv( 2, iseed, m, a( 1, j ) )
135 CALL slacpy(
'Full', m, n, a, m, af, m )
139 CALL sgeqrt( m, n, nb, af, m, t, ldt, work, info )
143 CALL slaset(
'Full', m, m, zero, one, q, m )
144 CALL sgemqrt(
'R',
'N', m, m, k, nb, af, m, t, ldt, q, m,
149 CALL slaset(
'Full', m, n, zero, zero, r, m )
150 CALL slacpy(
'Upper', m, n, af, m, r, m )
154 CALL sgemm(
'T',
'N', m, n, m, -one, q, m, a, m, one, r, m )
155 anorm = slange(
'1', m, n, a, m, rwork )
156 resid = slange(
'1', m, n, r, m, rwork )
157 IF( anorm.GT.zero )
THEN
158 result( 1 ) = resid / (eps*
max(1,m)*anorm)
165 CALL slaset(
'Full', m, m, zero, one, r, m )
166 CALL ssyrk(
'U',
'C', m, m, -one, q, m, one, r, m )
167 resid = slansy(
'1',
'Upper', m, r, m, rwork )
168 result( 2 ) = resid / (eps*
max(1,m))
173 CALL slarnv( 2, iseed, m, c( 1, j ) )
175 cnorm = slange(
'1', m, n, c, m, rwork)
176 CALL slacpy(
'Full', m, n, c, m, cf, m )
180 CALL sgemqrt(
'L',
'N', m, n, k, nb, af, m, t, nb, cf, m,
185 CALL sgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
186 resid = slange( '1
', M, N, CF, M, RWORK )
187.GT.
IF( CNORMZERO ) THEN
188 RESULT( 3 ) = RESID / (EPS*MAX(1,M)*CNORM)
195 CALL SLACPY( 'full
', M, N, C, M, CF, M )
199 CALL SGEMQRT( 'l
', 't
', M, N, K, NB, AF, M, T, NB, CF, M,
204 CALL SGEMM( 't
', 'n
', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
205 RESID = SLANGE( '1
', M, N, CF, M, RWORK )
206.GT.
IF( CNORMZERO ) THEN
207 RESULT( 4 ) = RESID / (EPS*MAX(1,M)*CNORM)
215 CALL SLARNV( 2, ISEED, N, D( 1, J ) )
217 DNORM = SLANGE( '1
', N, M, D, N, RWORK)
218 CALL SLACPY( 'full
', N, M, D, N, DF, N )
222 CALL SGEMQRT( 'r
', 'n
', N, M, K, NB, AF, M, T, NB, DF, N,
227 CALL SGEMM( 'n
', 'n
', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
228 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
229.GT.
IF( CNORMZERO ) THEN
230 RESULT( 5 ) = RESID / (EPS*MAX(1,M)*DNORM)
237 CALL SLACPY( 'full
', N, M, D, N, DF, N )
241 CALL SGEMQRT( 'r
', 't
', N, M, K, NB, AF, M, T, NB, DF, N,
246 CALL SGEMM( 'n
', 't
', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
247 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
248.GT.
IF( CNORMZERO ) THEN
249 RESULT( 6 ) = RESID / (EPS*MAX(1,M)*DNORM)
256 DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T, C, D, CF, DF)
subroutine sgemqrt(side, trans, m, n, k, nb, v, ldv, t, ldt, c, ldc, work, info)
SGEMQRT
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM