127 INTEGER M, N, MB1, NB1, NB2
129 DOUBLE PRECISION RESULT(6)
135 COMPLEX*16 ,
ALLOCATABLE :: A(:,:), AF(:,:), Q(:,:), R(:,:),
136 $ WORK( : ), T1(:,:), T2(:,:), DIAG(:),
137 $ C(:,:), CF(:,:), D(:,:), DF(:,:)
138 DOUBLE PRECISION,
ALLOCATABLE :: RWORK(:)
141 DOUBLE PRECISION ZERO
142 parameter( zero = 0.0d+0 )
143 COMPLEX*16 CONE, CZERO
144 parameter( cone = ( 1.0d+0, 0.0d+0 ),
145 $ czero = ( 0.0d+0, 0.0d+0 ) )
149 INTEGER INFO, J, K, L, LWORK, NB2_UB, NRB
150 DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM
154 COMPLEX*16 WORKQUERY( 1 )
157 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY
158 EXTERNAL dlamch, zlange, zlansy
165 INTRINSIC ceiling, dble,
max,
min
168 CHARACTER(LEN=32) SRNAMT
171 COMMON / srmnamc / srnamt
174 DATA iseed / 1988, 1989, 1990, 1991 /
180 eps = dlamch(
'Epsilon' )
186 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
193 CALL zlarnv( 2, iseed, m, a( 1, j ) )
198 CALL zlarnv( 2, iseed, m/2, a( m/4, j ) )
202 CALL zlacpy(
'Full', m, n, a, m, af, m )
206 nrb =
max( 1, ceiling( dble( m - n ) / dble( 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 zgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
222 lwork = int( workquery( 1 ) )
227 lwork =
max( lwork, nb2_ub * n, nb2_ub * m )
229 ALLOCATE ( work( lwork ) )
238 srnamt =
'ZGETSQRHRT'
239 CALL zgetsqrhrt( m, n, mb1, nb1, nb2, af, m, t2, nb2,
240 $ work, lwork, info )
247 CALL zlaset(
'Full', m, m, czero, cone, q, m )
250 CALL zgemqrt(
'L',
'N', m, m, k, nb2_ub, af, m, t2, nb2, q, m,
255 CALL zlaset(
'Full', m, n, czero, czero, r, m )
257 CALL zlacpy(
'Upper', m, n, af, m, r, m )
262 CALL zgemm(
'C',
'N', m, n, m, -cone, q, m, a, m, cone, r, m )
264 anorm = zlange(
'1', m, n, a, m, rwork )
265 resid = zlange(
'1', m, n, r, m, rwork )
266 IF( anorm.GT.zero )
THEN
267 result( 1 ) = resid / ( eps *
max( 1, m ) * anorm )
275 CALL zlaset(
'Full', m, m, czero, cone, r, m )
276 CALL zherk( 'u
', 'c
', M, M, -CONE, Q, M, CONE, R, M )
277 RESID = ZLANSY( '1
', 'upper
', M, R, M, RWORK )
278 RESULT( 2 ) = RESID / ( EPS * MAX( 1, M ) )
283 CALL ZLARNV( 2, ISEED, M, C( 1, J ) )
285 CNORM = ZLANGE( '1
', M, N, C, M, RWORK )
286 CALL ZLACPY( 'full
', M, N, C, M, CF, M )
291 CALL ZGEMQRT( 'l',
'N', m, n, k, nb2_ub, af, m, t2, nb2, cf, m,
297 CALL zgemm(
'N',
'N', m, n, m, -cone, q, m, c, m, cone, cf, m )
298 resid = zlange(
'1', m, n, cf, m, rwork )
299 IF( cnorm.GT.zero )
THEN
300 result( 3 ) = resid / ( eps *
max( 1, m ) * cnorm )
307 CALL zlacpy(
'Full', m, n, c, m, cf, m )
312 CALL ZGEMQRT( 'l
', 'c
', M, N, K, NB2_UB, AF, M, T2, NB2, CF, M,
318 CALL ZGEMM( 'c
', 'n
', M, N, M, -CONE, Q, M, C, M, CONE, CF, M )
319 RESID = ZLANGE( '1
', M, N, CF, M, RWORK )
320.GT.
IF( CNORMZERO ) THEN
321 RESULT( 4 ) = RESID / ( EPS * MAX( 1, M ) * CNORM )
329 CALL ZLARNV( 2, ISEED, N, D( 1, J ) )
331 DNORM = ZLANGE( '1
', N, M, D, N, RWORK )
332 CALL ZLACPY( 'full
', N, M, D, N, DF, N )
337 CALL ZGEMQRT( 'r
', 'n
', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N,
343 CALL ZGEMM( 'n
', 'n
', N, M, M, -CONE, D, N, Q, M, CONE, DF, N )
344 RESID = ZLANGE( '1
', N, M, DF, N, RWORK )
345.GT.
IF( DNORMZERO ) THEN
346 RESULT( 5 ) = RESID / ( EPS * MAX( 1, M ) * DNORM )
353 CALL ZLACPY( 'full
', N, M, D, N, DF, N )
358 CALL ZGEMQRT( 'r
', 'c
', N, M, K, NB2_UB, AF, M, T2, NB2, DF, N,
364 CALL ZGEMM( 'n
', 'c
', N, M, M, -CONE, D, N, Q, M, CONE, DF, N )
365 RESID = ZLANGE( '1
', N, M, DF, N, RWORK )
366.GT.
IF( DNORMZERO ) THEN
367 RESULT( 6 ) = RESID / ( EPS * MAX( 1, M ) * DNORM )
374 DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T1, T2, DIAG,