81 SUBROUTINE ctsqr01(TSSW, M, N, MB, NB, RESULT)
98 COMPLEX,
ALLOCATABLE :: AF(:,:), Q(:,:),
99 $ R(:,:), RWORK(:), WORK( : ), T(:),
100 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:), LQ(:,:)
105 parameter( zero = 0.0, one = (1.0,0.0), czero=(0.0,0.0) )
108 LOGICAL TESTZEROS, TS
109 INTEGER INFO, J, K, L, LWORK, TSIZE, MNB
110 REAL ANORM, EPS, RESID, CNORM, DNORM
114 COMPLEX TQUERY( 5 ), WORKQUERY( 1 )
117 REAL SLAMCH, CLANGE, CLANSY
120 EXTERNAL slamch, clange, clansy, lsame, ilaenv
128 COMMON / srnamc / srnamt
131 DATA iseed / 1988, 1989, 1990, 1991 /
135 ts = lsame(tssw,
'TS')
141 eps = slamch(
'Epsilon' )
149 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
151 $ d(n,m), df(n,m), lq(l,n) )
156 CALL clarnv( 2, iseed, m, a( 1, j ) )
161 CALL clarnv( 2, iseed, m/2, a( m/4, j ) )
165 CALL clacpy(
'Full', m, n, a, m, af, m )
171 CALL cgeqr( m, n, af, m, tquery, -1, workquery, -1, info )
172 tsize = int( tquery( 1 ) )
173 lwork = int( workquery( 1 ) )
174 CALL cgemqr(
'L',
'N', m, m, k, af, m, tquery, tsize, cf, m,
175 $ workquery, -1, info)
176 lwork = max( lwork, int( workquery( 1 ) ) )
177 CALL cgemqr(
'L',
'N', m, n, k, af, m, tquery, tsize, cf, m,
178 $ workquery, -1, info)
179 lwork = max( lwork, int( workquery( 1 ) ) )
180 CALL cgemqr(
'L',
'C', m, n, k, af, m, tquery, tsize, cf, m,
181 $ workquery, -1, info)
182 lwork = max( lwork, int( workquery( 1 ) ) )
183 CALL cgemqr(
'R',
'N', n, m, k, af, m, tquery, tsize, df, n,
184 $ workquery, -1, info)
185 lwork = max( lwork, int( workquery( 1 ) ) )
186 CALL cgemqr(
'R',
'C', n, m, k, af, m, tquery, tsize, df, n,
187 $ workquery, -1, info)
188 lwork = max( lwork, int( workquery( 1 ) ) )
189 ALLOCATE ( t( tsize ) )
190 ALLOCATE ( work( lwork ) )
192 CALL cgeqr( m, n, af, m, t, tsize, work, lwork, info )
196 CALL claset(
'Full', m, m, czero, one, q, m )
198 CALL cgemqr(
'L',
'N', m, m, k, af, m, t, tsize, q, m,
199 $ work, lwork, info )
203 CALL claset(
'Full', m, n, czero, czero, r, m )
204 CALL clacpy(
'Upper', m, n, af, m, r, m )
208 CALL cgemm(
'C',
'N', m, n, m, -one, q, m, a, m, one, r, m )
209 anorm = clange(
'1', m, n, a, m, rwork )
210 resid = clange(
'1', m, n, r, m, rwork )
211 IF( anorm.GT.zero )
THEN
212 result( 1 ) = resid / (eps*max(1,m)*anorm)
219 CALL claset(
'Full', m, m, czero, one, r, m )
220 CALL cherk(
'U',
'C', m, m, real(-one), q, m, real(one), r, m )
221 resid = clansy(
'1',
'Upper', m, r, m, rwork )
222 result( 2 ) = resid / (eps*max(1,m))
227 CALL clarnv( 2, iseed, m, c( 1, j ) )
229 cnorm = clange(
'1', m, n, c, m, rwork)
230 CALL clacpy(
'Full', m, n, c, m, cf, m )
235 CALL cgemqr(
'L',
'N', m, n, k, af, m, t, tsize, cf, m,
240 CALL cgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
241 resid = clange(
'1', m, n, cf, m, rwork )
242 IF( cnorm.GT.zero )
THEN
243 result( 3 ) = resid / (eps*max(1,m)*cnorm)
250 CALL clacpy(
'Full', m, n, c, m, cf, m )
255 CALL cgemqr(
'L',
'C', m, n, k, af, m, t, tsize, cf, m,
260 CALL cgemm(
'C',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
261 resid = clange(
'1', m, n, cf, m, rwork )
262 IF( cnorm.GT.zero )
THEN
263 result( 4 ) = resid / (eps*max(1,m)*cnorm)
271 CALL clarnv( 2, iseed, n, d( 1, j ) )
273 dnorm = clange(
'1', n, m, d, n, rwork)
274 CALL clacpy(
'Full', n, m, d, n, df, n )
279 CALL cgemqr(
'R',
'N', n, m, k, af, m, t, tsize, df, n,
284 CALL cgemm(
'N',
'N', n, m, m, -one, d, n, q, m, one, df, n )
285 resid = clange(
'1', n, m, df, n, rwork )
286 IF( dnorm.GT.zero )
THEN
287 result( 5 ) = resid / (eps*max(1,m)*dnorm)
294 CALL clacpy(
'Full', n, m, d, n, df, n )
298 CALL cgemqr(
'R',
'C', n, m, k, af, m, t, tsize, df, n,
303 CALL cgemm(
'N',
'C', n, m, m, -one, d, n, q, m, one, df, n )
304 resid = clange(
'1', n, m, df, n, rwork )
305 IF( cnorm.GT.zero )
THEN
306 result( 6 ) = resid / (eps*max(1,m)*dnorm)
314 CALL cgelq( m, n, af, m, tquery, -1, workquery, -1, info )
315 tsize = int( tquery( 1 ) )
316 lwork = int( workquery( 1 ) )
317 CALL cgemlq(
'R',
'N', n, n, k, af, m, tquery, tsize, q, n,
318 $ workquery, -1, info )
319 lwork = max( lwork, int( workquery( 1 ) ) )
320 CALL cgemlq(
'L',
'N', n, m, k, af, m, tquery, tsize, df, n,
321 $ workquery, -1, info)
322 lwork = max( lwork, int( workquery( 1 ) ) )
323 CALL cgemlq(
'L',
'C', n, m, k, af, m, tquery, tsize, df, n,
324 $ workquery, -1, info)
325 lwork = max( lwork, int( workquery( 1 ) ) )
326 CALL cgemlq(
'R',
'N', m, n, k, af, m, tquery, tsize, cf, m,
327 $ workquery, -1, info)
328 lwork = max( lwork, int( workquery( 1 ) ) )
329 CALL cgemlq(
'R',
'C', m, n, k, af, m, tquery, tsize, cf, m,
330 $ workquery, -1, info)
331 lwork = max( lwork, int( workquery( 1 ) ) )
332 ALLOCATE ( t( tsize ) )
333 ALLOCATE ( work( lwork ) )
335 CALL cgelq( m, n, af, m, t, tsize, work, lwork, info )
340 CALL claset(
'Full', n, n, czero, one, q, n )
342 CALL cgemlq(
'R',
'N', n, n, k, af, m, t, tsize, q, n,
343 $ work, lwork, info )
347 CALL claset(
'Full', m, n, czero, czero, lq, l )
348 CALL clacpy(
'Lower', m, n, af, m, lq, l )
352 CALL cgemm(
'N',
'C', m, n, n, -one, a, m, q, n, one, lq, l )
353 anorm = clange(
'1', m, n, a, m, rwork )
354 resid = clange(
'1', m, n, lq, l, rwork )
355 IF( anorm.GT.zero )
THEN
356 result( 1 ) = resid / (eps*max(1,n)*anorm)
363 CALL claset(
'Full', n, n, czero, one, lq, l )
364 CALL cherk(
'U',
'C', n, n, real(-one), q, n, real(one), lq, l)
365 resid = clansy(
'1',
'Upper', n, lq, l, rwork )
366 result( 2 ) = resid / (eps*max(1,n))
371 CALL clarnv( 2, iseed, n, d( 1, j ) )
373 dnorm = clange(
'1', n, m, d, n, rwork)
374 CALL clacpy(
'Full', n, m, d, n, df, n )
378 CALL cgemlq(
'L',
'N', n, m, k, af, m, t, tsize, df, n,
383 CALL cgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
384 resid = clange(
'1', n, m, df, n, rwork )
385 IF( dnorm.GT.zero )
THEN
386 result( 3 ) = resid / (eps*max(1,n)*dnorm)
393 CALL clacpy(
'Full', n, m, d, n, df, n )
397 CALL cgemlq(
'L',
'C', n, m, k, af, m, t, tsize, df, n,
402 CALL cgemm(
'C',
'N', n, m, n, -one, q, n, d, n, one, df, n )
403 resid = clange(
'1', n, m, df, n, rwork )
404 IF( dnorm.GT.zero )
THEN
405 result( 4 ) = resid / (eps*max(1,n)*dnorm)
413 CALL clarnv( 2, iseed, m, c( 1, j ) )
415 cnorm = clange(
'1', m, n, c, m, rwork)
416 CALL clacpy(
'Full', m, n, c, m, cf, m )
420 CALL cgemlq(
'R',
'N', m, n, k, af, m, t, tsize, cf, m,
425 CALL cgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
426 resid = clange(
'1', n, m, df, n, rwork )
427 IF( cnorm.GT.zero )
THEN
428 result( 5 ) = resid / (eps*max(1,n)*cnorm)
435 CALL clacpy(
'Full', m, n, c, m, cf, m )
439 CALL cgemlq(
'R',
'C', m, n, k, af, m, t, tsize, cf, m,
444 CALL cgemm(
'N',
'C', m, n, n, -one, c, m, q, n, one, cf, m )
445 resid = clange(
'1', m, n, cf, m, rwork )
446 IF( cnorm.GT.zero )
THEN
447 result( 6 ) = resid / (eps*max(1,n)*cnorm)
456 DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)
subroutine cgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
CGELQ
subroutine cgemlq(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
CGEMLQ
subroutine cgemqr(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
CGEMQR
subroutine cgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
CGEQR
subroutine ctsqr01(TSSW, M, N, MB, NB, RESULT)
CTSQR01
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.