88 COMPLEX,
ALLOCATABLE :: AF(:,:), Q(:,:),
89 $ R(:,:), WORK( : ), T(:,:),
90 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:)
91 REAL,
ALLOCATABLE :: RWORK(:)
96 parameter( zero = 0.0, one = (1.0,0.0), czero=(0.0,0.0) )
99 INTEGER INFO, J, K, L, LWORK
100 REAL ANORM, EPS, RESID, CNORM, DNORM
109 EXTERNAL slamch, clange, clansy, lsame
115 DATA iseed / 1988, 1989, 1990, 1991 /
117 eps = slamch(
'Epsilon' )
120 lwork = max(2,l)*max(2,l)*nb
124 ALLOCATE ( a(m,n), af(m,n), q(m,m), r(m,l), rwork(l),
125 $ work(lwork), t(nb,n), c(m,n), cf(m,n),
132 CALL clarnv( 2, iseed, m, a( 1, j ) )
134 CALL clacpy(
'Full', m, n, a, m, af, m )
138 CALL cgeqrt( m, n, nb, af, m, t, ldt, work, info )
142 CALL claset(
'Full', m, m, czero, one, q, m )
143 CALL cgemqrt(
'R',
'N', m, m, k, nb, af, m, t, ldt, q, m,
148 CALL claset(
'Full', m, n, czero, czero, r, m )
149 CALL clacpy(
'Upper', m, n, af, m, r, m )
153 CALL cgemm(
'C',
'N', m, n, m, -one, q, m, a, m, one, r, m )
154 anorm = clange(
'1', m, n, a, m, rwork )
155 resid = clange(
'1', m, n, r, m, rwork )
156 IF( anorm.GT.zero )
THEN
157 result( 1 ) = resid / (eps*max(1,m)*anorm)
164 CALL claset(
'Full', m, m, czero, one, r, m )
165 CALL cherk(
'U',
'C', m, m, real(-one), q, m, real(one), r, m )
166 resid = clansy(
'1',
'Upper', m, r, m, rwork )
167 result( 2 ) = resid / (eps*max(1,m))
172 CALL clarnv( 2, iseed, m, c( 1, j ) )
174 cnorm = clange(
'1', m, n, c, m, rwork)
175 CALL clacpy(
'Full', m, n, c, m, cf, m )
179 CALL cgemqrt(
'L',
'N', m, n, k, nb, af, m, t, nb, cf, m,
184 CALL cgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
185 resid = clange(
'1', m, n, cf, m, rwork )
186 IF( cnorm.GT.zero )
THEN
187 result( 3 ) = resid / (eps*max(1,m)*cnorm)
194 CALL clacpy(
'Full', m, n, c, m, cf, m )
198 CALL cgemqrt(
'L',
'C', m, n, k, nb, af, m, t, nb, cf, m,
203 CALL cgemm(
'C',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
204 resid = clange(
'1', m, n, cf, m, rwork )
205 IF( cnorm.GT.zero )
THEN
206 result( 4 ) = resid / (eps*max(1,m)*cnorm)
214 CALL clarnv( 2, iseed, n, d( 1, j ) )
216 dnorm = clange(
'1', n, m, d, n, rwork)
217 CALL clacpy(
'Full', n, m, d, n, df, n )
221 CALL cgemqrt(
'R',
'N', n, m, k, nb, af, m, t, nb, df, n,
226 CALL cgemm(
'N',
'N', n, m, m, -one, d, n, q, m, one, df, n )
227 resid = clange(
'1', n, m, df, n, rwork )
228 IF( cnorm.GT.zero )
THEN
229 result( 5 ) = resid / (eps*max(1,m)*dnorm)
236 CALL clacpy(
'Full', n, m, d, n, df, n )
240 CALL cgemqrt(
'R',
'C', n, m, k, nb, af, m, t, nb, df, n,
245 CALL cgemm(
'N',
'C', n, m, m, -one, d, n, q, m, one, df, n )
246 resid = clange(
'1', n, m, df, n, rwork )
247 IF( cnorm.GT.zero )
THEN
248 result( 6 ) = resid / (eps*max(1,m)*dnorm)
255 DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)
subroutine cqrt04(m, n, nb, result)
CQRT04
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine cgemqrt(side, trans, m, n, k, nb, v, ldv, t, ldt, c, ldc, work, info)
CGEMQRT
subroutine cgeqrt(m, n, nb, a, lda, t, ldt, work, info)
CGEQRT
subroutine cherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
CHERK
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.