100 INTEGER LMAX( 3 ), NINFO( 3 )
101 DOUBLE PRECISION RMAX( 3 )
108 parameter( ldt = 20, lwork = 2*ldt*( 10+ldt ) )
109 DOUBLE PRECISION ZERO, ONE, TWO
110 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0 )
111 DOUBLE PRECISION EPSIN
112 parameter( epsin = 5.9605d-8 )
114 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
117 INTEGER I, INFO, ISCL, ISRT, ITMP, J, KMIN, M, N, NDIM
118 DOUBLE PRECISION BIGNUM, EPS, S, SEP, SEPIN, SEPTMP, SIN,
119 $ SMLNUM, STMP, TNRM, TOL, TOLIN, V, VMAX, VMIN,
123 LOGICAL SELECT( LDT )
124 INTEGER IPNT( LDT ), ISELEC( LDT )
125 DOUBLE PRECISION RESULT( 2 ), RWORK( LDT ), VAL( 3 ),
127 COMPLEX*16 Q( LDT, LDT ), QSAV( LDT, LDT ),
128 $ QTMP( LDT, LDT ), T( LDT, LDT ),
129 $ TMP( LDT, LDT ), TSAV( LDT, LDT ),
130 $ TSAV1( LDT, LDT ), TTMP( LDT, LDT ), W( LDT ),
131 $ WORK( LWORK ), WTMP( LDT )
134 DOUBLE PRECISION DLAMCH, ZLANGE
142 INTRINSIC dble, dimag, max, sqrt
147 smlnum =
dlamch(
'S' ) / eps
148 bignum = one / smlnum
149 CALL dlabad( smlnum, bignum )
153 eps = max( eps, epsin )
164 val( 1 ) = sqrt( smlnum )
166 val( 3 ) = sqrt( sqrt( bignum ) )
173 READ( nin, fmt = * )n, ndim, isrt
176 READ( nin, fmt = * )( iselec( i ), i = 1, ndim )
178 READ( nin, fmt = * )( tmp( i, j ), j = 1, n )
180 READ( nin, fmt = * )sin, sepin
182 tnrm =
zlange(
'M', n, n, tmp, ldt, rwork )
188 CALL zlacpy(
'F', n, n, tmp, ldt, t, ldt )
191 CALL zdscal( n, vmul, t( 1, i ), 1 )
195 CALL zlacpy(
'F', n, n, t, ldt, tsav, ldt )
199 CALL zgehrd( n, 1, n, t, ldt, work( 1 ), work( n+1 ), lwork-n,
203 ninfo( 1 ) = ninfo( 1 ) + 1
209 CALL zlacpy(
'L', n, n, t, ldt, q, ldt )
210 CALL zunghr( n, 1, n, q, ldt, work( 1 ), work( n+1 ), lwork-n,
220 CALL zhseqr(
'S',
'V', n, 1, n, t, ldt, w, q, ldt, work, lwork,
224 ninfo( 2 ) = ninfo( 2 ) + 1
232 SELECT( i ) = .false.
236 wsrt( i ) = dble( w( i ) )
240 wsrt( i ) = dimag( w( i ) )
247 IF( wsrt( j ).LT.vmin )
THEN
252 wsrt( kmin ) = wsrt( i )
255 ipnt( i ) = ipnt( kmin )
259 SELECT( ipnt( iselec( i ) ) ) = .true.
264 CALL zlacpy(
'F', n, n, q, ldt, qsav, ldt )
265 CALL zlacpy(
'F', n, n, t, ldt, tsav1, ldt )
266 CALL ztrsen(
'B',
'V',
SELECT, n, t, ldt, q, ldt, wtmp, m, s,
267 $ sep, work, lwork, info )
270 ninfo( 3 ) = ninfo( 3 ) + 1
278 CALL zhst01( n, 1, n, tsav, ldt, t, ldt, q, ldt, work, lwork,
280 vmax = max( result( 1 ), result( 2 ) )
281 IF( vmax.GT.rmax( 1 ) )
THEN
283 IF( ninfo( 1 ).EQ.0 )
290 v = max( two*dble( n )*eps*tnrm, smlnum )
293 IF( v.GT.septmp )
THEN
298 IF( v.GT.sepin )
THEN
303 tol = max( tol, smlnum / eps )
304 tolin = max( tolin, smlnum / eps )
305 IF( eps*( sin-tolin ).GT.stmp+tol )
THEN
307 ELSE IF( sin-tolin.GT.stmp+tol )
THEN
308 vmax = ( sin-tolin ) / ( stmp+tol )
309 ELSE IF( sin+tolin.LT.eps*( stmp-tol ) )
THEN
311 ELSE IF( sin+tolin.LT.stmp-tol )
THEN
312 vmax = ( stmp-tol ) / ( sin+tolin )
316 IF( vmax.GT.rmax( 2 ) )
THEN
318 IF( ninfo( 2 ).EQ.0 )
325 IF( v.GT.septmp*stmp )
THEN
330 IF( v.GT.sepin*sin )
THEN
335 tol = max( tol, smlnum / eps )
336 tolin = max( tolin, smlnum / eps )
337 IF( eps*( sepin-tolin ).GT.septmp+tol )
THEN
339 ELSE IF( sepin-tolin.GT.septmp+tol )
THEN
340 vmax = ( sepin-tolin ) / ( septmp+tol )
341 ELSE IF( sepin+tolin.LT.eps*( septmp-tol ) )
THEN
343 ELSE IF( sepin+tolin.LT.septmp-tol )
THEN
344 vmax = ( septmp-tol ) / ( sepin+tolin )
348 IF( vmax.GT.rmax( 2 ) )
THEN
350 IF( ninfo( 2 ).EQ.0 )
357 IF( sin.LE.dble( 2*n )*eps .AND. stmp.LE.dble( 2*n )*eps )
THEN
359 ELSE IF( eps*sin.GT.stmp )
THEN
361 ELSE IF( sin.GT.stmp )
THEN
363 ELSE IF( sin.LT.eps*stmp )
THEN
365 ELSE IF( sin.LT.stmp )
THEN
370 IF( vmax.GT.rmax( 3 ) )
THEN
372 IF( ninfo( 3 ).EQ.0 )
379 IF( sepin.LE.v .AND. septmp.LE.v )
THEN
381 ELSE IF( eps*sepin.GT.septmp )
THEN
383 ELSE IF( sepin.GT.septmp )
THEN
384 vmax = sepin / septmp
385 ELSE IF( sepin.LT.eps*septmp )
THEN
387 ELSE IF( sepin.LT.septmp )
THEN
388 vmax = septmp / sepin
392 IF( vmax.GT.rmax( 3 ) )
THEN
394 IF( ninfo( 3 ).EQ.0 )
402 CALL zlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
403 CALL zlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
406 CALL ztrsen(
'E',
'V',
SELECT, n, ttmp, ldt, qtmp, ldt, wtmp,
407 $ m, stmp, septmp, work, lwork, info )
410 ninfo( 3 ) = ninfo( 3 ) + 1
419 IF( ttmp( i, j ).NE.t( i, j ) )
421 IF( qtmp( i, j ).NE.q( i, j ) )
429 CALL zlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
430 CALL zlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
433 CALL ztrsen(
'V',
'V',
SELECT, n, ttmp, ldt, qtmp, ldt, wtmp,
434 $ m, stmp, septmp, work, lwork, info )
437 ninfo( 3 ) = ninfo( 3 ) + 1
446 IF( ttmp( i, j ).NE.t( i, j ) )
448 IF( qtmp( i, j ).NE.q( i, j ) )
456 CALL zlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
457 CALL zlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
460 CALL ztrsen(
'E',
'N',
SELECT, n, ttmp, ldt, qtmp, ldt, wtmp,
461 $ m, stmp, septmp, work, lwork, info )
464 ninfo( 3 ) = ninfo( 3 ) + 1
473 IF( ttmp( i, j ).NE.t( i, j ) )
475 IF( qtmp( i, j ).NE.qsav( i, j ) )
483 CALL zlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
484 CALL zlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
487 CALL ztrsen(
'V',
'N',
SELECT, n, ttmp, ldt, qtmp, ldt, wtmp,
488 $ m, stmp, septmp, work, lwork, info )
491 ninfo( 3 ) = ninfo( 3 ) + 1
500 IF( ttmp( i, j ).NE.t( i, j ) )
502 IF( qtmp( i, j ).NE.qsav( i, j ) )
506 IF( vmax.GT.rmax( 1 ) )
THEN
508 IF( ninfo( 1 ).EQ.0 )
double precision function dlamch(CMACH)
DLAMCH
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zhst01(N, ILO, IHI, A, LDA, H, LDH, Q, LDQ, WORK, LWORK, RWORK, RESULT)
ZHST01
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
ZGEHRD
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zhseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO)
ZHSEQR
subroutine ztrsen(JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S, SEP, WORK, LWORK, INFO)
ZTRSEN
subroutine zunghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGHR