90 SUBROUTINE cget38( RMAX, LMAX, NINFO, KNT, NIN )
100 INTEGER LMAX( 3 ), NINFO( 3 )
108 parameter( ldt = 20, lwork = 2*ldt*( 10+ldt ) )
110 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
112 parameter( epsin = 5.9605e-8 )
114 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
117 INTEGER I, INFO, ISCL, ISRT, ITMP, J, KMIN, M, N, NDIM
118 REAL 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 REAL RESULT( 2 ), RWORK( LDT ), VAL( 3 ),
127 COMPLEX 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 )
135 EXTERNAL clange, slamch
142 INTRINSIC aimag, max, real, sqrt
147 smlnum = slamch(
'S' ) / eps
148 bignum = one / smlnum
149 CALL slabad( 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 = clange(
'M', n, n, tmp, ldt, rwork )
188 CALL clacpy(
'F', n, n, tmp, ldt, t, ldt )
191 CALL csscal( n, vmul, t( 1, i ), 1 )
195 CALL clacpy(
'F', n, n, t, ldt, tsav, ldt )
199 CALL cgehrd( n, 1, n, t, ldt, work( 1 ), work( n+1 ), lwork-n,
203 ninfo( 1 ) = ninfo( 1 ) + 1
209 CALL clacpy(
'L', n, n, t, ldt, q, ldt )
210 CALL cunghr( n, 1, n, q, ldt, work( 1 ), work( n+1 ), lwork-n,
220 CALL chseqr(
'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 ) = real( w( i ) )
240 wsrt( i ) = aimag( 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 clacpy(
'F', n, n, q, ldt, qsav, ldt )
265 CALL clacpy(
'F', n, n, t, ldt, tsav1, ldt )
266 CALL ctrsen(
'B',
'V',
SELECT, n, t, ldt, q, ldt, wtmp, m, s,
267 $ sep, work, lwork, info )
270 ninfo( 3 ) = ninfo( 3 ) + 1
278 CALL chst01( 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*real( 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.real( 2*n )*eps .AND. stmp.LE.real( 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 clacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
403 CALL clacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
406 CALL ctrsen(
'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 clacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
430 CALL clacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
433 CALL ctrsen(
'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 clacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
457 CALL clacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
460 CALL ctrsen(
'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 clacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
484 CALL clacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
487 CALL ctrsen(
'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 )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine csscal(N, SA, CX, INCX)
CSSCAL
subroutine chst01(N, ILO, IHI, A, LDA, H, LDH, Q, LDQ, WORK, LWORK, RWORK, RESULT)
CHST01
subroutine cget38(RMAX, LMAX, NINFO, KNT, NIN)
CGET38
subroutine cgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CGEHRD
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine ctrsen(JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S, SEP, WORK, LWORK, INFO)
CTRSEN
subroutine cunghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CUNGHR
subroutine chseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO)
CHSEQR