87 INTEGER LWORK, M, N, L, NB, LDT
89 DOUBLE PRECISION RESULT(6)
95 DOUBLE PRECISION,
ALLOCATABLE :: AF(:,:), Q(:,:),
96 $ R(:,:), RWORK(:), WORK( : ), T(:,:),
97 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:)
100 DOUBLE PRECISION ONE, ZERO
101 parameter( zero = 0.0, one = 1.0 )
104 INTEGER INFO, J, K, N2, NP1,i
105 DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM
111 DOUBLE PRECISION DLAMCH, DLANGE, DLANSY
113 EXTERNAL dlamch, dlange, dlansy, lsame
116 DATA iseed / 1988, 1989, 1990, 1991 /
118 eps = dlamch(
'Epsilon' )
130 ALLOCATE(a(m,n2),af(m,n2),q(n2,n2),r(n2,n2),rwork(n2),
131 $ work(lwork),t(nb,m),c(n2,m),cf(n2,m),
137 CALL dlaset(
'Full', m, n2, zero, zero, a, m )
138 CALL dlaset(
'Full', nb, m, zero, zero, t, nb )
140 CALL dlarnv( 2, iseed, m-j+1, a( j, j ) )
144 CALL dlarnv( 2, iseed, m, a( 1, min(n+m,m+1) + j - 1 ) )
149 CALL dlarnv( 2, iseed, m-j+1, a( j, min(n+m,n+m-l+1)
156 CALL dlacpy(
'Full', m, n2, a, m, af, m )
160 CALL dtplqt( m,n,l,nb,af,m,af(1,np1),m,t,ldt,work,info)
164 CALL dlaset(
'Full', n2, n2, zero, one, q, n2 )
165 CALL dgemlqt(
'L',
'N', n2, n2, k, nb, af, m, t, ldt, q, n2,
170 CALL dlaset(
'Full', n2, n2, zero, zero, r, n2 )
171 CALL dlacpy(
'Lower', m, n2, af, m, r, n2 )
175 CALL dgemm(
'N',
'T', m, n2, n2, -one, a, m, q, n2, one, r, n2)
176 anorm = dlange(
'1', m, n2, a, m, rwork )
177 resid = dlange(
'1', m, n2, r, n2, rwork )
178 IF( anorm.GT.zero )
THEN
179 result( 1 ) = resid / (eps*anorm*max(1,n2))
186 CALL dlaset(
'Full', n2, n2, zero, one, r, n2 )
187 CALL dsyrk(
'U',
'N', n2, n2, -one, q, n2, one, r, n2 )
188 resid = dlansy(
'1',
'Upper', n2, r, n2, rwork )
189 result( 2 ) = resid / (eps*max(1,n2))
193 CALL dlaset(
'Full', n2, m, zero, one, c, n2 )
195 CALL dlarnv( 2, iseed, n2, c( 1, j ) )
197 cnorm = dlange(
'1', n2, m, c, n2, rwork)
198 CALL dlacpy(
'Full', n2, m, c, n2, cf, n2 )
202 CALL dtpmlqt(
'L',
'N', n,m,k,l,nb,af(1, np1),m,t,ldt,cf,n2,
203 $ cf(np1,1),n2,work,info)
207 CALL dgemm(
'N',
'N', n2, m, n2, -one, q, n2, c, n2, one, cf, n2 )
208 resid = dlange(
'1', n2, m, cf, n2, rwork )
209 IF( cnorm.GT.zero )
THEN
210 result( 3 ) = resid / (eps*max(1,n2)*cnorm)
218 CALL dlacpy(
'Full', n2, m, c, n2, cf, n2 )
222 CALL dtpmlqt(
'L',
'T',n,m,k,l,nb,af(1,np1),m,t,ldt,cf,n2,
223 $ cf(np1,1),n2,work,info)
227 CALL dgemm(
'T',
'N',n2,m,n2,-one,q,n2,c,n2,one,cf,n2)
228 resid = dlange(
'1', n2, m, cf, n2, rwork )
230 IF( cnorm.GT.zero )
THEN
231 result( 4 ) = resid / (eps*max(1,n2)*cnorm)
239 CALL dlarnv( 2, iseed, m, d( 1, j ) )
241 dnorm = dlange(
'1', m, n2, d, m, rwork)
242 CALL dlacpy(
'Full', m, n2, d, m, df, m )
246 CALL dtpmlqt(
'R',
'N',m,n,k,l,nb,af(1,np1),m,t,ldt,df,m,
247 $ df(1,np1),m,work,info)
251 CALL dgemm(
'N',
'N',m,n2,n2,-one,d,m,q,n2,one,df,m)
252 resid = dlange(
'1',m, n2,df,m,rwork )
253 IF( cnorm.GT.zero )
THEN
254 result( 5 ) = resid / (eps*max(1,n2)*dnorm)
261 CALL dlacpy(
'Full',m,n2,d,m,df,m )
265 CALL dtpmlqt(
'R',
'T',m,n,k,l,nb,af(1,np1),m,t,ldt,df,m,
266 $ df(1,np1),m,work,info)
271 CALL dgemm(
'N',
'T', m, n2, n2, -one, d, m, q, n2, one, df, m )
272 resid = dlange(
'1', m, n2, df, m, rwork )
273 IF( cnorm.GT.zero )
THEN
274 result( 6 ) = resid / (eps*max(1,n2)*dnorm)
281 DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)
subroutine dlqt05(m, n, l, nb, result)
DLQT05
subroutine dgemlqt(side, trans, m, n, k, mb, v, ldv, t, ldt, c, ldc, work, info)
DGEMLQT
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
DSYRK
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlarnv(idist, iseed, n, x)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine dtplqt(m, n, l, mb, a, lda, b, ldb, t, ldt, work, info)
DTPLQT
subroutine dtpmlqt(side, trans, m, n, k, l, mb, v, ldv, t, ldt, a, lda, b, ldb, work, info)
DTPMLQT