126 INTEGER M, N, MB1, NB1, NB2
134 COMPLEX ,
ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
135 $ WORK( : ), T1(:,:), T2(:,:), DIAG(:),
136 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
137 REAL ,
ALLOCATABLE :: RWORK(:)
141 parameter( zero = 0.0e+0 )
143 parameter( cone = ( 1.0e+0, 0.0e+0 ),
144 $ czero = ( 0.0e+0, 0.0e+0 ) )
148 INTEGER INFO, I, J, K, L, LWORK, NB1_UB, NB2_UB, NRB
149 REAL ANORM, EPS, RESID, CNORM, DNORM
153 COMPLEX WORKQUERY( 1 )
156 REAL SLAMCH, CLANGE, CLANSY
157 EXTERNAL slamch, clange, clansy
164 INTRINSIC ceiling, real,
max,
min
167 CHARACTER(LEN=32) SRNAMT
170 COMMON / srmnamc / srnamt
173 DATA iseed / 1988, 1989, 1990, 1991 /
179 eps = slamch(
'Epsilon' )
185 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
192 CALL clarnv( 2, iseed, m, a( 1, j ) )
197 CALL clarnv( 2, iseed, m/2, a( m/4, j ) )
201 CALL clacpy(
'Full', m, n, a, m, af, m )
205 nrb =
max( 1, ceiling( real( m - n ) / real( mb1 - n ) ) )
207 ALLOCATE ( t1( nb1, n * nrb ) )
208 ALLOCATE ( t2( nb2, n ) )
209 ALLOCATE ( diag( n ) )
215 nb1_ub =
min( nb1, n)
219 nb2_ub =
min( nb2, n)
221 CALL clatsqr( m, n, mb1, nb1_ub, af, m, t1, nb1,
222 $ workquery, -1, info )
223 lwork = int( workquery( 1 ) )
224 CALL cungtsqr( m, n, mb1, nb1, af, m, t1, nb1, workquery, -1,
227 lwork =
max( lwork, int( workquery( 1 ) ) )
232 lwork =
max( lwork, nb2_ub * n, nb2_ub * m )
234 ALLOCATE ( work( lwork ) )
244 CALL clatsqr( m, n, mb1, nb1_ub, af, m, t1, nb1, work, lwork,
250 CALL clacpy(
'U', n, n, af, m, r, m )
255 CALL cungtsqr( m, n, mb1, nb1, af, m, t1, nb1, work, lwork,
262 CALL CUNHR_COL( M, N, NB2, AF, M, T2, NB2, DIAG, INFO )
272 CALL CLACPY( 'u
', N, N, R, M, AF, M )
275.EQ.
IF( DIAG( I )-CONE ) THEN
276 CALL CSCAL( N+1-I, -CONE, AF( I, I ), M )
285 CALL CLASET( 'full
', M, M, CZERO, CONE, Q, M )
288 CALL CGEMQRT( 'l
', 'n
', M, M, K, NB2_UB, AF, M, T2, NB2, Q, M,
293 CALL CLASET( 'full
', M, N, CZERO, CZERO, R, M )
295 CALL CLACPY( 'upper
', M, N, AF, M, R, M )
300 CALL CGEMM( 'c
', 'n
', M, N, M, -CONE, Q, M, A, M, CONE, R, M )
302 ANORM = CLANGE( '1
', M, N, A, M, RWORK )
303 RESID = CLANGE( '1
', M, N, R, M, RWORK )
304.GT.
IF( ANORMZERO ) THEN
305 RESULT( 1 ) = RESID / ( EPS * MAX( 1, M ) * ANORM )
313 CALL CLASET( 'full
', M, M, CZERO, CONE, R, M )
314 CALL CHERK( 'u
', 'c
', M, M, -CONE, Q, M, CONE, R, M )
315 RESID = CLANSY( '1
', 'upper
', M, R, M, RWORK )
316 RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) )
321 CALL CLARNV( 2, ISEED, M, C( 1, J ) )
323 CNORM = CLANGE( '1
', M, N, C, M, RWORK )
324 CALL CLACPY( 'full
', M, N, C, M, CF, M )
329 CALL CGEMQRT( 'l
', 'n
', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M,
335 CALL CGEMM( 'n
', 'n
', M, N, M, -CONE, Q, M, C, M, CONE, CF, M )
336 RESID = CLANGE( '1
', M, N, CF, M, RWORK )
337.GT.
IF( CNORMZERO ) THEN
338 RESULT( 3 ) = RESID / ( EPS * MAX( 1, M ) * CNORM )
345 CALL CLACPY( 'full
', M, N, C, M, CF, M )
350 CALL CGEMQRT( 'l
', 'c
', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M,
356 CALL CGEMM( 'c
', 'n
', M, N, M, -CONE, Q, M, C, M, CONE, CF, M )
357 RESID = CLANGE( '1
', M, N, CF, M, RWORK )
358.GT.
IF( CNORMZERO ) THEN
359 RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM )
367 CALL CLARNV( 2, ISEED, N, D( 1, J ) )
369 DNORM = CLANGE( '1
', N, M, D, N, RWORK )
370 CALL CLACPY( 'full
', N, M, D, N, DF, N )
375 CALL CGEMQRT( 'r
', 'n
', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N,
381 CALL CGEMM( 'n
', 'n
', N, M, M, -CONE, D, N, Q, M, CONE, DF, N )
382 RESID = CLANGE( '1
', N, M, DF, N, RWORK )
383.GT.
IF( DNORMZERO ) THEN
384 RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM )
391 CALL CLACPY( 'full
', N, M, D, N, DF, N )
396 CALL CGEMQRT( 'r',
'C'
402 CALL cgemm(
'N',
'C', n, m, m, -cone, d, n, q, m, cone, df, n )
403 resid = clange(
'1', n, m, df, n, rwork )
404 IF( dnorm.GT.zero )
THEN
412 DEALLOCATE ( a, af, q, r, rwork, work, t1, t2, diag,