88 REAL,
ALLOCATABLE :: AF(:,:), Q(:,:),
89 $ L(:,:), RWORK(:), WORK( : ), T(:,:),
90 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:)
94 parameter( zero = 0.0, one = 1.0 )
97 INTEGER INFO, J, K, LL, LWORK
98 REAL ANORM, EPS, RESID, CNORM, DNORM
104 REAL SLAMCH, SLANGE, SLANSY
112 DATA iseed / 1988, 1989, 1990, 1991 /
117 lwork = max(2,ll)*max(2,ll)*nb
121 ALLOCATE ( a(m,n), af(m,n), q(n,n), l(ll,n), rwork(ll),
122 $ work(lwork), t(nb,n), c(m,n), cf(m,n),
129 CALL slarnv( 2, iseed, m, a( 1, j ) )
131 CALL slacpy(
'Full', m, n, a, m, af, m )
135 CALL sgelqt( m, n, nb, af, m, t, ldt, work, info )
139 CALL slaset(
'Full', n, n, zero, one, q, n )
140 CALL sgemlqt(
'R',
'N', n, n, k, nb, af, m, t, ldt, q, n,
145 CALL slaset(
'Full', m, n, zero, zero, l, ll )
146 CALL slacpy(
'Lower', m, n, af, m, l, ll )
150 CALL sgemm(
'N',
'T', m, n, n, -one, a, m, q, n, one, l, ll )
151 anorm =
slange(
'1', m, n, a, m, rwork )
152 resid =
slange(
'1', m, n, l, ll, rwork )
153 IF( anorm.GT.zero )
THEN
154 result( 1 ) = resid / (eps*max(1,m)*anorm)
161 CALL slaset(
'Full', n, n, zero, one, l, ll )
162 CALL ssyrk(
'U',
'C', n, n, -one, q, n, one, l, ll )
163 resid =
slansy(
'1',
'Upper', n, l, ll, rwork )
164 result( 2 ) = resid / (eps*max(1,n))
169 CALL slarnv( 2, iseed, n, d( 1, j ) )
171 dnorm =
slange(
'1', n, m, d, n, rwork)
172 CALL slacpy(
'Full', n, m, d, n, df, n )
176 CALL sgemlqt(
'L',
'N', n, m, k, nb, af, m, t, nb, df, n,
181 CALL sgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
182 resid =
slange(
'1', n, m, df, n, rwork )
183 IF( dnorm.GT.zero )
THEN
184 result( 3 ) = resid / (eps*max(1,m)*dnorm)
191 CALL slacpy(
'Full', n, m, d, n, df, n )
195 CALL sgemlqt(
'L',
'T', n, m, k, nb, af, m, t, nb, df, n,
200 CALL sgemm(
'T',
'N', n, m, n, -one, q, n, d, n, one, df, n )
201 resid =
slange(
'1', n, m, df, n, rwork )
202 IF( dnorm.GT.zero )
THEN
203 result( 4 ) = resid / (eps*max(1,m)*dnorm)
211 CALL slarnv( 2, iseed, m, c( 1, j ) )
213 cnorm =
slange(
'1', m, n, c, m, rwork)
214 CALL slacpy(
'Full', m, n, c, m, cf, m )
218 CALL sgemlqt(
'R',
'N', m, n, k, nb, af, m, t, nb, cf, m,
223 CALL sgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
224 resid =
slange(
'1', n, m, df, n, rwork )
225 IF( cnorm.GT.zero )
THEN
226 result( 5 ) = resid / (eps*max(1,m)*dnorm)
233 CALL slacpy(
'Full', m, n, c, m, cf, m )
237 CALL sgemlqt(
'R',
'T', m, n, k, nb, af, m, t, nb, cf, m,
242 CALL sgemm(
'N',
'T', m, n, n, -one, c, m, q, n, one, cf, m )
243 resid =
slange(
'1', m, n, cf, m, rwork )
244 IF( cnorm.GT.zero )
THEN
245 result( 6 ) = resid / (eps*max(1,m)*dnorm)
252 DEALLOCATE ( a, af, q, l, rwork, work, t, c, d, cf, df)
subroutine slarnv(IDIST, ISEED, N, X)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
logical function lsame(CA, CB)
LSAME
subroutine sgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
SGELQT
subroutine sgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
SGEMLQT
real function slange(NORM, M, N, A, LDA, WORK)
SLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
real function slansy(NORM, UPLO, N, A, LDA, WORK)
SLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine ssyrk(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
SSYRK
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
real function slamch(CMACH)
SLAMCH