90 SUBROUTINE dget38( RMAX, LMAX, NINFO, KNT, NIN )
100 INTEGER ( 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, , M, N,
118 DOUBLE PRECISION BIGNUM, EPS, S, SEP, SEPIN, SEPTMP, SIN,
119 $ SMLNUM, STMP, TNRM, TOL, TOLIN, , VIMIN, VMAX,
123 LOGICAL SELECT( LDT )
124 INTEGER IPNT( LDT ), ( LDT ), IWORK( LIWORK )
125 DOUBLE PRECISION Q( LDT, LDT ), QSAV( LDT, LDT ),
126 $ QTMP( , LDT ), RESULT( 2 ), T( LDT, LDT ),
127 $ TMP( LDT, LDT ), TSAV( LDT, LDT ),
128 $ ( LDT, LDT ), ( LDT, LDT ), VAL( 3 ),
129 $ WI( LDT ), WITMP( ), 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
148 CALL dlabad( smlnum, bignum )
152 eps =
max( eps, epsin )
164 val( 1 ) = sqrt( smlnum )
166 val( 3 ) = sqrt( sqrt( bignum ) )
173 READ( nin, fmt = * )n, ndim
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 = dlange(
'M', n, n, tmp, ldt, work )
188 CALL dlacpy(
'F', n, n, tmp, ldt, t, ldt )
191 CALL dscal( n, vmul, t( 1, i ), 1 )
195 CALL dlacpy(
'F', n, n, t, ldt, tsav, ldt )
199 CALL dgehrd( n, 1, n, t, ldt, work( 1 ), work( n+1 ), lwork
203 ninfo( 1 ) = ninfo( 1 ) + 1
209 CALL dlacpy( 'l
', N, N, T, LDT, Q, LDT )
210 CALL DORGHR( N, 1, N, Q, LDT, WORK( 1 ), WORK( N+1 ), LWORK-N,
215 CALL DHSEQR( 's
', 'v
', N, 1, N, T, LDT, WR, WI, Q, LDT, WORK,
219 NINFO( 2 ) = NINFO( 2 ) + 1
227 SELECT( I ) = .FALSE.
229 CALL DCOPY( N, WR, 1, WRTMP, 1 )
230 CALL DCOPY( N, WI, 1, WITMP, 1 )
236.LT.
IF( WRTMP( J )VRMIN ) THEN
242 WRTMP( KMIN ) = WRTMP( I )
243 WITMP( KMIN ) = WITMP( I )
247 IPNT( I ) = IPNT( KMIN )
251 SELECT( IPNT( ISELEC( I ) ) ) = .TRUE.
256 CALL DLACPY( 'f
', N, N, Q, LDT, QSAV, LDT )
257 CALL DLACPY( 'f
', N, N, T, LDT, TSAV1, LDT )
258 CALL DTRSEN( 'b
', 'v
', SELECT, N, T, LDT, Q, LDT, WRTMP, WITMP,
259 $ M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO )
262 NINFO( 3 ) = NINFO( 3 ) + 1
270 CALL DHST01( N, 1, N, TSAV, LDT, T, LDT, Q, LDT, WORK, LWORK,
272 VMAX = MAX( RESULT( 1 ), RESULT( 2 ) )
273.GT.
IF( VMAXRMAX( 1 ) ) THEN
275.EQ.
IF( NINFO( 1 )0 )
282 V = MAX( TWO*DBLE( N )*EPS*TNRM, SMLNUM )
285.GT.
IF( VSEPTMP ) THEN
290.GT.
IF( VSEPIN ) THEN
295 TOL = MAX( TOL, SMLNUM / EPS )
296 TOLIN = MAX( TOLIN, SMLNUM / EPS )
297.GT.
IF( EPS*( SIN-TOLIN )STMP+TOL ) THEN
299.GT.
ELSE IF( SIN-TOLINSTMP+TOL ) THEN
300 VMAX = ( SIN-TOLIN ) / ( STMP+TOL )
301.LT.
ELSE IF( SIN+TOLINEPS*( STMP-TOL ) ) THEN
303.LT.
ELSE IF( SIN+TOLINSTMP-TOL ) THEN
304 VMAX = ( STMP-TOL ) / ( SIN+TOLIN )
308.GT.
IF( VMAXRMAX( 2 ) ) THEN
310.EQ.
IF( NINFO( 2 )0 )
317.GT.
IF( VSEPTMP*STMP ) THEN
322.GT.
IF( VSEPIN*SIN ) THEN
327 TOL = MAX( TOL, SMLNUM / EPS )
328 TOLIN = MAX( TOLIN, SMLNUM / EPS )
329.GT.
IF( EPS*( SEPIN-TOLIN )SEPTMP+TOL ) THEN
331.GT.
ELSE IF( SEPIN-TOLINSEPTMP+TOL ) THEN
332 VMAX = ( SEPIN-TOLIN ) / ( SEPTMP+TOL )
333.LT.
ELSE IF( SEPIN+TOLINEPS*( SEPTMP-TOL ) ) THEN
335.LT.
ELSE IF( SEPIN+TOLINSEPTMP-TOL ) THEN
336 VMAX = ( SEPTMP-TOL ) / ( SEPIN+TOLIN )
340.GT.
IF( VMAXRMAX( 2 ) ) THEN
342.EQ.
IF( NINFO( 2 )0 )
349.LE..AND..LE.
IF( SINDBLE( 2*N )*EPS STMPDBLE( 2*N )*EPS ) THEN
351.GT.
ELSE IF( EPS*SINSTMP ) THEN
353.GT.
ELSE IF( SINSTMP ) THEN
355.LT.
ELSE IF( SINEPS*STMP ) THEN
357.LT.
ELSE IF( SINSTMP ) THEN
362.GT.
IF( VMAXRMAX( 3 ) ) THEN
364.EQ.
IF( NINFO( 3 )0 )
371.LE..AND..LE.
IF( SEPINV SEPTMPV ) THEN
373.GT.
ELSE IF( EPS*SEPINSEPTMP ) THEN
375.GT.
ELSE IF( SEPINSEPTMP ) THEN
376 VMAX = SEPIN / SEPTMP
377.LT.
ELSE IF( SEPINEPS*SEPTMP ) THEN
379.LT.
ELSE IF( SEPINSEPTMP ) THEN
380 VMAX = SEPTMP / SEPIN
384.GT.
IF( VMAXRMAX( 3 ) ) THEN
386.EQ.
IF( NINFO( 3 )0 )
394 CALL DLACPY( 'f
', N, N, TSAV1, LDT, TTMP, LDT )
395 CALL DLACPY( 'f
', N, N, QSAV, LDT, QTMP, LDT )
398 CALL DTRSEN( 'e
', 'v
', SELECT, N, TTMP, LDT, QTMP, LDT, WRTMP,
399 $ WITMP, M, STMP, SEPTMP, WORK, LWORK, IWORK,
403 NINFO( 3 ) = NINFO( 3 ) + 1
412.NE.
IF( TTMP( I, J )T( I, J ) )
414.NE.
IF( QTMP( I, J )Q( I, J ) )
422 CALL DLACPY( 'f
', N, N, TSAV1, LDT, TTMP, LDT )
423 CALL DLACPY( 'f
', N, N, QSAV, LDT, QTMP, LDT )
426 CALL DTRSEN( 'v
', 'v
', SELECT, N, TTMP, LDT, QTMP, LDT, WRTMP,
427 $ WITMP, M, STMP, SEPTMP, WORK, LWORK, IWORK,
431 NINFO( 3 ) = NINFO( 3 ) + 1
440.NE.
IF( TTMP( I, J )T( I, J ) )
442.NE.
IF( QTMP( I, J )Q( I, J ) )
450 CALL DLACPY( 'f
', N, N, TSAV1, LDT, TTMP, LDT )
451 CALL DLACPY( 'f
', N, N, QSAV, LDT, QTMP, LDT )
454 CALL DTRSEN( 'e
', 'n
', SELECT, N, TTMP, LDT, QTMP, LDT, WRTMP,
455 $ WITMP, M, STMP, SEPTMP, WORK, LWORK, IWORK,
459 NINFO( 3 ) = NINFO( 3 ) + 1
468.NE.
IF( TTMP( I, J )T( I, J ) )
470.NE.
IF( QTMP( I, J )QSAV( I, J ) )
478 CALL DLACPY( 'f
', N, N, TSAV1, LDT, TTMP, LDT )
479 CALL DLACPY( 'f
', N, N, QSAV, LDT, QTMP, LDT )
482 CALL DTRSEN( 'v
', 'n
', SELECT, N, TTMP, LDT, QTMP, LDT, WRTMP,
483 $ WITMP, M, STMP, SEPTMP, WORK, LWORK, IWORK,
487 NINFO( 3 ) = NINFO( 3 ) + 1
496.NE.
IF( TTMP( I, J )T( I, J ) )
498.NE.
IF( QTMP( I, J )QSAV( I, J ) )
502.GT.
IF( VMAXRMAX( 1 ) ) THEN
504.EQ.
IF( NINFO( 1 )0 )
subroutine dhseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
DHSEQR
subroutine dtrsen(job, compq, select, n, t, ldt, q, ldq, wr, wi, m, s, sep, work, lwork, iwork, liwork, info)
DTRSEN
subroutine dhst01(n, ilo, ihi, a, lda, h, ldh, q, ldq, work, lwork, result)
DHST01