90 SUBROUTINE zget38( RMAX, LMAX, NINFO, KNT, NIN )
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 )
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
135 EXTERNAL 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 )