81 SUBROUTINE ctsqr01(TSSW, M, N, MB, NB, RESULT)
98 COMPLEX,
ALLOCATABLE :: AF(:,:), Q(:,:),
99 $ R(:,:), RWORK(:), WORK( : ), T(:),
100 $ CF(:,:), DF(:,:), A(:,:), C(:,:), (:,:), 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
286 IF( dnorm.GT.zero )
THEN
287 result( 5 ) = resid / (eps
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.GT.
IF( DNORMZERO ) 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.GT.
IF( DNORMZERO ) 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.GT.
IF( CNORMZERO ) 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.GT.
IF( CNORMZERO ) THEN
447 RESULT( 6 ) = RESID / (EPS*MAX(1,N)*CNORM)
456 DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T, C, D, CF, DF)