88 COMPLEX,
ALLOCATABLE :: AF(:,:), Q(:,:),
89 $ L(:,:), RWORK(:), WORK( : ), T(:,:),
90 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:)
95 parameter( zero = 0.0)
96 parameter( one = (1.0,0.0), czero=(0.0,0.0) )
99 INTEGER INFO, J, K, LL, LWORK, LDT
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,ll)*max(2,ll)*nb
124 ALLOCATE ( a(m,n), af(m,n), q(n,n), l(ll,n), rwork(ll),
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 cgelqt( m, n, nb, af, m, t, ldt, work, info )
142 CALL claset(
'Full', n, n, czero, one, q, n )
143 CALL cgemlqt(
'R',
'N', n, n, k, nb, af, m, t, ldt, q, n,
148 CALL claset(
'Full', ll, n, czero, czero, l, ll )
149 CALL clacpy(
'Lower', m, n, af, m, l, ll )
153 CALL cgemm(
'N',
'C', m, n, n, -one, a, m, q, n, one, l, ll )
154 anorm = clange(
'1', m, n, a, m, rwork )
155 resid = clange(
'1', m, n, l, ll, rwork )
156 IF( anorm.GT.zero )
THEN
157 result( 1 ) = resid / (eps*max(1,m)*anorm)
164 CALL claset(
'Full', n, n, czero, one, l, ll )
165 CALL cherk(
'U',
'C', n, n, real(-one), q, n, real(one), l, ll)
166 resid = clansy(
'1',
'Upper', n, l, ll, rwork )
167 result( 2 ) = resid / (eps*max(1,n))
172 CALL clarnv( 2, iseed, n, d( 1, j ) )
174 dnorm = clange(
'1', n, m, d, n, rwork)
175 CALL clacpy(
'Full', n, m, d, n, df, n )
179 CALL cgemlqt(
'L',
'N', n, m, k, nb, af, m, t, nb, df, n,
184 CALL cgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
185 resid = clange(
'1', n, m, df, n, rwork )
186 IF( dnorm.GT.zero )
THEN
187 result( 3 ) = resid / (eps*max(1,m)*dnorm)
194 CALL clacpy(
'Full', n, m, d, n, df, n )
198 CALL cgemlqt(
'L',
'C', n, m, k, nb, af, m, t, nb, df, n,
203 CALL cgemm(
'C',
'N', n, m, n, -one, q, n, d, n, one, df, n )
204 resid = clange(
'1', n, m, df, n, rwork )
205 IF( dnorm.GT.zero )
THEN
206 result( 4 ) = resid / (eps*max(1,m)*dnorm)
214 CALL clarnv( 2, iseed, m, c( 1, j ) )
216 cnorm = clange(
'1', m, n, c, m, rwork)
217 CALL clacpy(
'Full', m, n, c, m, cf, m )
221 CALL cgemlqt(
'R',
'N', m, n, k, nb, af, m, t, nb, cf, m,
226 CALL cgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
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', m, n, c, m, cf, m )
240 CALL cgemlqt(
'R',
'C', m, n, k, nb, af, m, t, nb, cf, m,
245 CALL cgemm(
'N',
'C', m, n, n, -one, c, m, q, n, one, cf, m )
246 resid = clange(
'1', m, n, cf, m, rwork )
247 IF( cnorm.GT.zero )
THEN
248 result( 6 ) = resid / (eps*max(1,m)*dnorm)
255 DEALLOCATE ( a, af, q, l, rwork, work, t, c, d, cf, df)
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine cherk(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
CHERK
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.
subroutine clarnv(IDIST, ISEED, N, X)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine clqt04(M, N, NB, RESULT)
DLQT04
subroutine cgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
CGELQT
subroutine cgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
CGEMLQT