133 SUBROUTINE zstt21( N, KBAND, AD, AE, SD, SE, U, LDU, WORK, RWORK,
142 INTEGER KBAND, LDU, N
145 DOUBLE PRECISION AD( * ), AE( * ), RESULT( 2 ), RWORK( * ),
147 COMPLEX*16 U( LDU, * ), WORK( * )
153 DOUBLE PRECISION ZERO, ONE
154 parameter( zero = 0.0d+0, one = 1.0d+0 )
155 COMPLEX*16 CZERO, CONE
156 parameter( czero = ( 0.0d+0, 0.0d+0 ),
157 $ cone = ( 1.0d+0, 0.0d+0 ) )
161 DOUBLE PRECISION ANORM, TEMP1, TEMP2, ULP, UNFL, WNORM
164 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANHE
165 EXTERNAL dlamch, zlange, zlanhe
171 INTRINSIC abs, dble, dcmplx, max, min
182 unfl = dlamch(
'Safe minimum' )
183 ulp = dlamch(
'Precision' )
189 CALL zlaset(
'Full', n, n, czero, czero, work, n )
195 work( ( n+1 )*( j-1 )+1 ) = ad( j )
196 work( ( n+1 )*( j-1 )+2 ) = ae( j )
197 temp2 = abs( ae( j ) )
198 anorm = max( anorm, abs( ad( j ) )+temp1+temp2 )
202 work( n**2 ) = ad( n )
203 anorm = max( anorm, abs( ad( n ) )+temp1, unfl )
208 CALL zher(
'L', n, -sd( j ), u( 1, j ), 1, work, n )
211 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
213 CALL zher2(
'L', n, -dcmplx( se( j ) ), u( 1, j ), 1,
214 $ u( 1, j+1 ), 1, work, n )
218 wnorm = zlanhe(
'1',
'L', n, work, n, rwork )
220 IF( anorm.GT.wnorm )
THEN
221 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
223 IF( anorm.LT.one )
THEN
224 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
226 result( 1 ) = min( wnorm / anorm, dble( n ) ) / ( n*ulp )
234 CALL zgemm(
'N',
'C', n, n, n, cone, u, ldu, u, ldu, czero, work,
238 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - cone
241 result( 2 ) = min( dble( n ), zlange(
'1', n, n, work, n,
242 $ rwork ) ) / ( n*ulp )