82 DOUBLE PRECISION RESULT(6)
88 COMPLEX*16,
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 DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM
106 DOUBLE PRECISION DLAMCH
107 DOUBLE PRECISION ZLANGE, ZLANSY
115 DATA iseed / 1988, 1989, 1990, 1991 /
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 zlarnv( 2, iseed, m, a( 1, j ) )
134 CALL zlacpy(
'Full', m, n, a, m, af, m )
138 CALL zgelqt( m, n, nb, af, m, t, ldt, work, info )
142 CALL zlaset(
'Full', n, n, czero, one, q, n )
143 CALL zgemlqt(
'R',
'N', n, n, k, nb, af, m, t, ldt, q, n,
148 CALL zlaset(
'Full', ll, n, czero, czero, l, ll )
149 CALL zlacpy(
'Lower', m, n, af, m, l, ll )
153 CALL zgemm(
'N',
'C', m, n, n, -one, a, m, q, n, one, l, ll )
154 anorm =
zlange(
'1', m, n, a, m, rwork )
155 resid =
zlange(
'1', m, n, l, ll, rwork )
156 IF( anorm.GT.zero )
THEN
157 result( 1 ) = resid / (eps*max(1,m)*anorm)
164 CALL zlaset(
'Full', n, n, czero, one, l, ll )
165 CALL zherk(
'U',
'C', n, n, dreal(-one), q, n, dreal(one), l, ll)
166 resid =
zlansy(
'1',
'Upper', n, l, ll, rwork )
167 result( 2 ) = resid / (eps*max(1,n))
172 CALL zlarnv( 2, iseed, n, d( 1, j ) )
174 dnorm =
zlange(
'1', n, m, d, n, rwork)
175 CALL zlacpy(
'Full', n, m, d, n, df, n )
179 CALL zgemlqt(
'L',
'N', n, m, k, nb, af, m, t, nb, df, n,
184 CALL zgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
185 resid =
zlange(
'1', n, m, df, n, rwork )
186 IF( dnorm.GT.zero )
THEN
187 result( 3 ) = resid / (eps*max(1,m)*dnorm)
194 CALL zlacpy(
'Full', n, m, d, n, df, n )
198 CALL zgemlqt(
'L',
'C', n, m, k, nb, af, m, t, nb, df, n,
203 CALL zgemm(
'C',
'N', n, m, n, -one, q, n, d, n, one, df, n )
204 resid =
zlange(
'1', n, m, df, n, rwork )
205 IF( dnorm.GT.zero )
THEN
206 result( 4 ) = resid / (eps*max(1,m)*dnorm)
214 CALL zlarnv( 2, iseed, m, c( 1, j ) )
216 cnorm =
zlange(
'1', m, n, c, m, rwork)
217 CALL zlacpy(
'Full', m, n, c, m, cf, m )
221 CALL zgemlqt(
'R',
'N', m, n, k, nb, af, m, t, nb, cf, m,
226 CALL zgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
227 resid =
zlange(
'1', n, m, df, n, rwork )
228 IF( cnorm.GT.zero )
THEN
229 result( 5 ) = resid / (eps*max(1,m)*dnorm)
236 CALL zlacpy(
'Full', m, n, c, m, cf, m )
240 CALL zgemlqt(
'R',
'C', m, n, k, nb, af, m, t, nb, cf, m,
245 CALL zgemm(
'N',
'C', m, n, n, -one, c, m, q, n, one, cf, m )
246 resid =
zlange(
'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)
double precision function dlamch(CMACH)
DLAMCH
logical function lsame(CA, CB)
LSAME
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zherk(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
ZHERK
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
double precision function zlansy(NORM, UPLO, N, A, LDA, WORK)
ZLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine zgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
ZGEMLQT
subroutine zgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
ZGELQT