88 SUBROUTINE cunhr_col01( M, N, MB1, NB1, NB2, RESULT )
97 INTEGER M, N, MB1, NB1, NB2
105 COMPLEX,
ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
106 $ WORK( : ), T1(:,:), T2(:,:), DIAG(:),
107 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
108 REAL,
ALLOCATABLE :: RWORK(:)
112 parameter( zero = 0.0e+0 )
114 parameter( cone = ( 1.0e+0, 0.0e+0 ),
115 $ czero = ( 0.0e+0, 0.0e+0 ) )
119 INTEGER INFO, I, J, K, L, LWORK, NB1_UB, NB2_UB, NRB
120 REAL ANORM, EPS, RESID, CNORM, DNORM
124 COMPLEX WORKQUERY( 1 )
127 REAL SLAMCH, CLANGE, CLANSY
128 EXTERNAL slamch, clange, clansy
135 INTRINSIC ceiling, real, max, min
138 CHARACTER(LEN=32) SRNAMT
141 COMMON / srmnamc / srnamt
144 DATA iseed / 1988, 1989, 1990, 1991 /
150 eps = slamch(
'Epsilon' )
156 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
163 CALL clarnv( 2, iseed, m, a( 1, j ) )
168 CALL clarnv( 2, iseed, m/2, a( m/4, j ) )
172 CALL clacpy(
'Full', m, n, a, m, af, m )
176 nrb = max( 1, ceiling( real( m - n ) / real( mb1 - n ) ) )
178 ALLOCATE ( t1( nb1, n * nrb ) )
179 ALLOCATE ( t2( nb2, n ) )
180 ALLOCATE ( diag( n ) )
186 nb1_ub = min( nb1, n)
190 nb2_ub = min( nb2, n)
192 CALL clatsqr( m, n, mb1, nb1_ub, af, m, t1, nb1,
193 $ workquery, -1, info )
194 lwork = int( workquery( 1 ) )
195 CALL cungtsqr( m, n, mb1, nb1, af, m, t1, nb1, workquery, -1,
198 lwork = max( lwork, int( workquery( 1 ) ) )
203 lwork = max( lwork, nb2_ub * n, nb2_ub * m )
205 ALLOCATE ( work( lwork ) )
215 CALL clatsqr( m, n, mb1, nb1_ub, af, m, t1, nb1, work, lwork,
221 CALL clacpy(
'U', m, n, af, m, r, m )
226 CALL cungtsqr( m, n, mb1, nb1, af, m, t1, nb1, work, lwork,
233 CALL cunhr_col( m, n, nb2, af, m, t2, nb2, diag, info )
243 CALL clacpy(
'U', m, n, r, m, af, m )
246 IF( diag( i ).EQ.-cone )
THEN
247 CALL cscal( n+1-i, -cone, af( i, i ), m )
256 CALL claset(
'Full', m, m, czero, cone, q, m )
259 CALL cgemqrt(
'L',
'N', m, m, k, nb2_ub, af, m, t2, nb2, q, m,
264 CALL claset(
'Full', m, n, czero, czero, r, m )
266 CALL clacpy(
'Upper', m, n, af, m, r, m )
271 CALL cgemm(
'C',
'N', m, n, m, -cone, q, m, a, m, cone, r, m )
273 anorm = clange(
'1', m, n, a, m, rwork )
274 resid = clange(
'1', m, n, r, m, rwork )
275 IF( anorm.GT.zero )
THEN
276 result( 1 ) = resid / ( eps * max( 1, m ) * anorm )
284 CALL claset(
'Full', m, m, czero, cone, r, m )
285 CALL cherk(
'U',
'C', m, m, -cone, q, m, cone, r, m )
286 resid = clansy(
'1',
'Upper', m, r, m, rwork )
287 result( 2 ) = resid / ( eps * max( 1, m ) )
292 CALL clarnv( 2, iseed, m, c( 1, j ) )
294 cnorm = clange(
'1', m, n, c, m, rwork )
295 CALL clacpy(
'Full', m, n, c, m, cf, m )
300 CALL cgemqrt(
'L',
'N', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
306 CALL cgemm(
'N',
'N', m, n, m, -cone, q, m, c, m, cone, cf, m )
307 resid = clange(
'1', m, n, cf, m, rwork )
308 IF( cnorm.GT.zero )
THEN
309 result( 3 ) = resid / ( eps * max( 1, m ) * cnorm )
316 CALL clacpy(
'Full', m, n, c, m, cf, m )
321 CALL cgemqrt(
'L',
'C', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
327 CALL cgemm(
'C',
'N', m, n, m, -cone, q, m, c, m, cone, cf, m )
328 resid = clange(
'1', m, n, cf, m, rwork )
329 IF( cnorm.GT.zero )
THEN
330 result( 4 ) = resid / ( eps * max( 1, m ) * cnorm )
338 CALL clarnv( 2, iseed, n, d( 1, j ) )
340 dnorm = clange(
'1', n, m, d, n, rwork )
341 CALL clacpy(
'Full', n, m, d, n, df, n )
346 CALL cgemqrt(
'R',
'N', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
352 CALL cgemm(
'N',
'N', n, m, m, -cone, d, n, q, m, cone, df, n )
353 resid = clange(
'1', n, m, df, n, rwork )
354 IF( dnorm.GT.zero )
THEN
355 result( 5 ) = resid / ( eps * max( 1, m ) * dnorm )
362 CALL clacpy(
'Full', n, m, d, n, df, n )
367 CALL cgemqrt(
'R',
'C', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
373 CALL cgemm(
'N',
'C', n, m, m, -cone, d, n, q, m, cone, df, n )
374 resid = clange(
'1', n, m, df, n, rwork )
375 IF( dnorm.GT.zero )
THEN
376 result( 6 ) = resid / ( eps * max( 1, m ) * dnorm )
383 DEALLOCATE ( a, af, q, r, rwork, work, t1, t2, diag,