127 INTEGER M, N, MB1, NB1, NB2
135 COMPLEX ,
ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
136 $ WORK( : ), T1(:,:), T2(:,:), DIAG(:),
137 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
138 REAL ,
ALLOCATABLE :: RWORK(:)
142 parameter( zero = 0.0e+0 )
144 parameter( cone = ( 1.0e+0, 0.0e+0 ),
145 $ czero = ( 0.0e+0, 0.0e+0 ) )
149 INTEGER INFO, J, K, L, LWORK, NB2_UB, NRB
150 REAL ANORM, EPS, RESID, CNORM, DNORM
154 COMPLEX WORKQUERY( 1 )
157 REAL SLAMCH, CLANGE, CLANSY
158 EXTERNAL slamch, clange, clansy
165 INTRINSIC ceiling, real, max, min
168 CHARACTER(LEN=32) SRNAMT
171 COMMON / srmnamc / srnamt
174 DATA iseed / 1988, 1989, 1990, 1991 /
180 eps = slamch(
'Epsilon' )
186 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
193 CALL clarnv( 2, iseed, m, a( 1, j ) )
198 CALL clarnv( 2, iseed, m/2, a( m/4, j ) )
202 CALL clacpy(
'Full', m, n, a, m, af, m )
206 nrb = max( 1, ceiling( real( m - n ) / real( mb1 - n ) ) )
208 ALLOCATE ( t1( nb1, n * nrb ) )
209 ALLOCATE ( t2( nb2, n ) )
210 ALLOCATE ( diag( n ) )
216 nb2_ub = min( nb2, n)
219 CALL cgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
220 $ workquery, -1, info )
222 lwork = int( workquery( 1 ) )
227 lwork = max( lwork, nb2_ub * n, nb2_ub * m )
229 ALLOCATE ( work( lwork ) )
238 srnamt =
'CGETSQRHRT'
239 CALL cgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
240 $ work, lwork, info )
247 CALL claset(
'Full', m, m, czero, cone, q, m )
250 CALL cgemqrt(
'L',
'N', m, m, k, nb2_ub, af, m, t2, nb2, q, m,
255 CALL claset(
'Full', m, n, czero, czero, r, m )
257 CALL clacpy(
'Upper', m, n, af, m, r, m )
262 CALL cgemm(
'C',
'N', m, n, m, -cone, q, m, a, m, cone, r, m )
264 anorm = clange(
'1', m, n, a, m, rwork )
265 resid = clange(
'1', m, n, r, m, rwork )
266 IF( anorm.GT.zero )
THEN
267 result( 1 ) = resid / ( eps * max( 1, m ) * anorm )
275 CALL claset(
'Full', m, m, czero, cone, r, m )
276 CALL cherk(
'U',
'C', m, m, real(-cone), q, m, real(cone), r, m )
277 resid = clansy(
'1',
'Upper', m, r, m, rwork )
278 result( 2 ) = resid / ( eps * max( 1, m ) )
283 CALL clarnv( 2, iseed, m, c( 1, j ) )
285 cnorm = clange(
'1', m, n, c, m, rwork )
286 CALL clacpy(
'Full', m, n, c, m, cf, m )
291 CALL cgemqrt(
'L',
'N', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
297 CALL cgemm(
'N',
'N', m, n, m, -cone, q, m, c, m, cone, cf, m )
298 resid = clange(
'1', m, n, cf, m, rwork )
299 IF( cnorm.GT.zero )
THEN
300 result( 3 ) = resid / ( eps * max( 1, m ) * cnorm )
307 CALL clacpy(
'Full', m, n, c, m, cf, m )
312 CALL cgemqrt(
'L',
'C', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
318 CALL cgemm(
'C',
'N', m, n, m, -cone, q, m, c, m, cone, cf, m )
319 resid = clange(
'1', m, n, cf, m, rwork )
320 IF( cnorm.GT.zero )
THEN
321 result( 4 ) = resid / ( eps * max( 1, m ) * cnorm )
329 CALL clarnv( 2, iseed, n, d( 1, j ) )
331 dnorm = clange(
'1', n, m, d, n, rwork )
332 CALL clacpy(
'Full', n, m, d, n, df, n )
337 CALL cgemqrt(
'R',
'N', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
343 CALL cgemm(
'N',
'N', n, m, m, -cone, d, n, q, m, cone, df, n )
344 resid = clange(
'1', n, m, df, n, rwork )
345 IF( dnorm.GT.zero )
THEN
346 result( 5 ) = resid / ( eps * max( 1, m ) * dnorm )
353 CALL clacpy(
'Full', n, m, d, n, df, n )
358 CALL cgemqrt(
'R',
'C', n, m, k, nb2_ub, af, m, t2, nb2, df, n,
364 CALL cgemm(
'N',
'C', n, m, m, -cone, d, n, q, m, cone, df, n )
365 resid = clange(
'1', n, m, df, n, rwork )
366 IF( dnorm.GT.zero )
THEN
367 result( 6 ) = resid / ( eps * max( 1, m ) * dnorm )
374 DEALLOCATE ( a, af, q, r, rwork, work, t1, t2, diag,
subroutine cunhr_col02(m, n, mb1, nb1, nb2, result)
CUNHR_COL02
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine cgemqrt(side, trans, m, n, k, nb, v, ldv, t, ldt, c, ldc, work, info)
CGEMQRT
subroutine cgetsqrhrt(m, n, mb1, nb1, nb2, a, lda, t, ldt, work, lwork, info)
CGETSQRHRT
subroutine cherk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
CHERK
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
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 cscal(n, ca, cx, incx)
CSCAL