90 SUBROUTINE dget38( RMAX, LMAX, NINFO, KNT, NIN )
100 INTEGER LMAX( 3 ), NINFO( 3 )
101 DOUBLE PRECISION RMAX( 3 )
107 DOUBLE PRECISION ZERO, ONE, TWO
108 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0 )
109 DOUBLE PRECISION EPSIN
110 parameter( epsin = 5.9605d-8 )
112 parameter( ldt = 20, lwork = 2*ldt*( 10+ldt ) )
114 parameter( liwork = ldt*ldt )
117 INTEGER I, INFO, ISCL, ITMP, J, KMIN, M, N, NDIM
118 DOUBLE PRECISION BIGNUM, EPS, S, SEP, SEPIN, SEPTMP, SIN,
119 $ SMLNUM, STMP, TNRM, TOL, TOLIN, V, VIMIN, VMAX,
123 LOGICAL SELECT( LDT )
124 INTEGER IPNT( LDT ), ISELEC( LDT ), IWORK( LIWORK )
125 DOUBLE PRECISION Q( LDT, LDT ), QSAV( LDT, LDT ),
126 $ QTMP( LDT, LDT ), RESULT( 2 ), T( LDT, LDT ),
127 $ TMP( LDT, LDT ), TSAV( LDT, LDT ),
128 $ TSAV1( LDT, LDT ), TTMP( LDT, LDT ), VAL( 3 ),
129 $ WI( LDT ), WITMP( LDT ), WORK( LWORK ),
130 $ WR( LDT ), WRTMP( LDT )
133 DOUBLE PRECISION DLAMCH, DLANGE
134 EXTERNAL dlamch, dlange
141 INTRINSIC dble, max, sqrt
146 smlnum = dlamch(
'S' ) / eps
147 bignum = one / smlnum
151 eps = max( eps, epsin )
163 val( 1 ) = sqrt( smlnum )
165 val( 3 ) = sqrt( sqrt( bignum ) )
172 READ( nin, fmt = * )n, ndim
175 READ( nin, fmt = * )( iselec( i ), i = 1, ndim )
177 READ( nin, fmt = * )( tmp( i, j ), j = 1, n )
179 READ( nin, fmt = * )sin, sepin
181 tnrm = dlange(
'M', n, n, tmp, ldt, work )
187 CALL dlacpy(
'F', n, n, tmp, ldt, t, ldt )
190 CALL dscal( n, vmul, t( 1, i ), 1 )
194 CALL dlacpy(
'F', n, n, t, ldt, tsav, ldt )
198 CALL dgehrd( n, 1, n, t, ldt, work( 1 ), work( n+1 ), lwork-n,
202 ninfo( 1 ) = ninfo( 1 ) + 1
208 CALL dlacpy(
'L', n, n, t, ldt, q, ldt )
209 CALL dorghr( n, 1, n, q, ldt, work( 1 ), work( n+1 ), lwork-n,
214 CALL dhseqr(
'S',
'V', n, 1, n, t, ldt, wr, wi, q, ldt, work,
218 ninfo( 2 ) = ninfo( 2 ) + 1
226 SELECT( i ) = .false.
228 CALL dcopy( n, wr, 1, wrtmp, 1 )
229 CALL dcopy( n, wi, 1, witmp, 1 )
235 IF( wrtmp( j ).LT.vrmin )
THEN
241 wrtmp( kmin ) = wrtmp( i )
242 witmp( kmin ) = witmp( i )
246 ipnt( i ) = ipnt( kmin )
250 SELECT( ipnt( iselec( i ) ) ) = .true.
255 CALL dlacpy(
'F', n, n, q, ldt, qsav, ldt )
256 CALL dlacpy(
'F', n, n, t, ldt, tsav1, ldt )
257 CALL dtrsen(
'B',
'V',
SELECT, n, t, ldt, q, ldt, wrtmp, witmp,
258 $ m, s, sep, work, lwork, iwork, liwork, info )
261 ninfo( 3 ) = ninfo( 3 ) + 1
269 CALL dhst01( n, 1, n, tsav, ldt, t, ldt, q, ldt, work, lwork,
271 vmax = max( result( 1 ), result( 2 ) )
272 IF( vmax.GT.rmax( 1 ) )
THEN
274 IF( ninfo( 1 ).EQ.0 )
281 v = max( two*dble( n )*eps*tnrm, smlnum )
284 IF( v.GT.septmp )
THEN
289 IF( v.GT.sepin )
THEN
294 tol = max( tol, smlnum / eps )
295 tolin = max( tolin, smlnum / eps )
296 IF( eps*( sin-tolin ).GT.stmp+tol )
THEN
298 ELSE IF( sin-tolin.GT.stmp+tol )
THEN
299 vmax = ( sin-tolin ) / ( stmp+tol )
300 ELSE IF( sin+tolin.LT.eps*( stmp-tol ) )
THEN
302 ELSE IF( sin+tolin.LT.stmp-tol )
THEN
303 vmax = ( stmp-tol ) / ( sin+tolin )
307 IF( vmax.GT.rmax( 2 ) )
THEN
309 IF( ninfo( 2 ).EQ.0 )
316 IF( v.GT.septmp*stmp )
THEN
321 IF( v.GT.sepin*sin )
THEN
326 tol = max( tol, smlnum / eps )
327 tolin = max( tolin, smlnum / eps )
328 IF( eps*( sepin-tolin ).GT.septmp+tol )
THEN
330 ELSE IF( sepin-tolin.GT.septmp+tol )
THEN
331 vmax = ( sepin-tolin ) / ( septmp+tol )
332 ELSE IF( sepin+tolin.LT.eps*( septmp-tol ) )
THEN
334 ELSE IF( sepin+tolin.LT.septmp-tol )
THEN
335 vmax = ( septmp-tol ) / ( sepin+tolin )
339 IF( vmax.GT.rmax( 2 ) )
THEN
341 IF( ninfo( 2 ).EQ.0 )
348 IF( sin.LE.dble( 2*n )*eps .AND. stmp.LE.dble( 2*n )*eps )
THEN
350 ELSE IF( eps*sin.GT.stmp )
THEN
352 ELSE IF( sin.GT.stmp )
THEN
354 ELSE IF( sin.LT.eps*stmp )
THEN
356 ELSE IF( sin.LT.stmp )
THEN
361 IF( vmax.GT.rmax( 3 ) )
THEN
363 IF( ninfo( 3 ).EQ.0 )
370 IF( sepin.LE.v .AND. septmp.LE.v )
THEN
372 ELSE IF( eps*sepin.GT.septmp )
THEN
374 ELSE IF( sepin.GT.septmp )
THEN
375 vmax = sepin / septmp
376 ELSE IF( sepin.LT.eps*septmp )
THEN
378 ELSE IF( sepin.LT.septmp )
THEN
379 vmax = septmp / sepin
383 IF( vmax.GT.rmax( 3 ) )
THEN
385 IF( ninfo( 3 ).EQ.0 )
393 CALL dlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
394 CALL dlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
397 CALL dtrsen(
'E',
'V',
SELECT, n, ttmp, ldt, qtmp, ldt, wrtmp,
398 $ witmp, m, stmp, septmp, work, lwork, iwork,
402 ninfo( 3 ) = ninfo( 3 ) + 1
411 IF( ttmp( i, j ).NE.t( i, j ) )
413 IF( qtmp( i, j ).NE.q( i, j ) )
421 CALL dlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
422 CALL dlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
425 CALL dtrsen(
'V',
'V',
SELECT, n, ttmp, ldt, qtmp, ldt, wrtmp,
426 $ witmp, m, stmp, septmp, work, lwork, iwork,
430 ninfo( 3 ) = ninfo( 3 ) + 1
439 IF( ttmp( i, j ).NE.t( i, j ) )
441 IF( qtmp( i, j ).NE.q( i, j ) )
449 CALL dlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
450 CALL dlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
453 CALL dtrsen(
'E',
'N',
SELECT, n, ttmp, ldt, qtmp, ldt, wrtmp,
454 $ witmp, m, stmp, septmp, work, lwork, iwork,
458 ninfo( 3 ) = ninfo( 3 ) + 1
467 IF( ttmp( i, j ).NE.t( i, j ) )
469 IF( qtmp( i, j ).NE.qsav( i, j ) )
477 CALL dlacpy(
'F', n, n, tsav1, ldt, ttmp, ldt )
478 CALL dlacpy(
'F', n, n, qsav, ldt, qtmp, ldt )
481 CALL dtrsen(
'V',
'N',
SELECT, n, ttmp, ldt, qtmp, ldt, wrtmp,
482 $ witmp, m, stmp, septmp, work, lwork, iwork,
486 ninfo( 3 ) = ninfo( 3 ) + 1
495 IF( ttmp( i, j ).NE.t( i, j ) )
497 IF( qtmp( i, j ).NE.qsav( i, j ) )
501 IF( vmax.GT.rmax( 1 ) )
THEN
503 IF( ninfo( 1 ).EQ.0 )
subroutine dget38(rmax, lmax, ninfo, knt, nin)
DGET38
subroutine dhst01(n, ilo, ihi, a, lda, h, ldh, q, ldq, work, lwork, result)
DHST01
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
DGEHRD
subroutine dhseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
DHSEQR
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dtrsen(job, compq, select, n, t, ldt, q, ldq, wr, wi, m, s, sep, work, lwork, iwork, liwork, info)
DTRSEN
subroutine dorghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
DORGHR