3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE CGET37( RMAX, LMAX, NINFO, KNT, NIN )
13 * .. Scalar Arguments ..
16 * .. Array Arguments ..
17 * INTEGER LMAX( 3 ), NINFO( 3 )
27 *> CGET37 tests CTRSNA, a routine for estimating condition numbers of
28 *> eigenvalues and/or right eigenvectors of a matrix.
30 *> The test matrices are read from a file with logical unit number NIN.
38 *> RMAX is REAL array, dimension (3)
39 *> Value of the largest test ratio.
40 *> RMAX(1) = largest ratio comparing different calls to CTRSNA
41 *> RMAX(2) = largest error in reciprocal condition
42 *> numbers taking their conditioning into account
43 *> RMAX(3) = largest error in reciprocal condition
44 *> numbers not taking their conditioning into
45 *> account (may be larger than RMAX(2))
50 *> LMAX is INTEGER array, dimension (3)
51 *> LMAX(i) is example number where largest test ratio
52 *> RMAX(i) is achieved. Also:
53 *> If CGEHRD returns INFO nonzero on example i, LMAX(1)=i
54 *> If CHSEQR returns INFO nonzero on example i, LMAX(2)=i
55 *> If CTRSNA returns INFO nonzero on example i, LMAX(3)=i
60 *> NINFO is INTEGER array, dimension (3)
61 *> NINFO(1) = No. of times CGEHRD returned INFO nonzero
62 *> NINFO(2) = No. of times CHSEQR returned INFO nonzero
63 *> NINFO(3) = No. of times CTRSNA returned INFO nonzero
69 *> Total number of examples tested.
75 *> Input logical unit number
81 *> \author Univ. of Tennessee
82 *> \author Univ. of California Berkeley
83 *> \author Univ. of Colorado Denver
86 *> \date November 2011
88 *> \ingroup complex_eig
90 * =====================================================================
91 SUBROUTINE CGET37( RMAX, LMAX, NINFO, KNT, NIN )
93 * -- LAPACK test routine (version 3.4.0) --
94 * -- LAPACK is a software package provided by Univ. of Tennessee, --
95 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
98 * .. Scalar Arguments ..
101 * .. Array Arguments ..
102 INTEGER LMAX( 3 ), NINFO( 3 )
106 * =====================================================================
110 PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
112 PARAMETER ( EPSIN = 5.9605E-8 )
114 PARAMETER ( LDT = 20, LWORK = 2*LDT*( 10+LDT ) )
116 * .. Local Scalars ..
117 INTEGER I, ICMP, INFO, ISCL, ISRT, J, KMIN, M, N
118 REAL BIGNUM, EPS, SMLNUM, TNRM, TOL, TOLIN, V,
119 $ VCMIN, VMAX, VMIN, VMUL
122 LOGICAL SELECT( LDT )
124 REAL DUM( 1 ), RWORK( 2*LDT ), S( LDT ), SEP( LDT ),
125 $ SEPIN( LDT ), SEPTMP( LDT ), SIN( LDT ),
126 $ STMP( LDT ), VAL( 3 ), WIIN( LDT ),
127 $ WRIN( LDT ), WSRT( LDT )
128 COMPLEX CDUM( 1 ), LE( LDT, LDT ), RE( LDT, LDT ),
129 $ T( LDT, LDT ), TMP( LDT, LDT ), W( LDT ),
130 $ WORK( LWORK ), WTMP( LDT )
132 * .. External Functions ..
134 EXTERNAL CLANGE, SLAMCH
136 * .. External Subroutines ..
137 EXTERNAL CCOPY, CGEHRD, CHSEQR, CLACPY, CSSCAL, CTREVC,
138 $ CTRSNA, SCOPY, SLABAD, SSCAL
140 * .. Intrinsic Functions ..
141 INTRINSIC AIMAG, MAX, REAL, SQRT
143 * .. Executable Statements ..
146 SMLNUM = SLAMCH( 'S' ) / EPS
147 BIGNUM = ONE / SMLNUM
148 CALL SLABAD( SMLNUM, BIGNUM )
150 * EPSIN = 2**(-24) = precision to which input data computed
152 EPS = MAX( EPS, EPSIN )
163 VAL( 1 ) = SQRT( SMLNUM )
165 VAL( 3 ) = SQRT( BIGNUM )
167 * Read input data until N=0. Assume input eigenvalues are sorted
168 * lexicographically (increasing by real part if ISRT = 0,
169 * increasing by imaginary part if ISRT = 1)
172 READ( NIN, FMT = * )N, ISRT
176 READ( NIN, FMT = * )( TMP( I, J ), J = 1, N )
179 READ( NIN, FMT = * )WRIN( I ), WIIN( I ), SIN( I ), SEPIN( I )
181 TNRM = CLANGE( 'M', N, N, TMP, LDT, RWORK )
187 CALL CLACPY( 'F', N, N, TMP, LDT, T, LDT )
190 CALL CSSCAL( N, VMUL, T( 1, I ), 1 )
195 * Compute eigenvalues and eigenvectors
197 CALL CGEHRD( N, 1, N, T, LDT, WORK( 1 ), WORK( N+1 ), LWORK-N,
201 NINFO( 1 ) = NINFO( 1 ) + 1
212 CALL CHSEQR( 'S', 'N', N, 1, N, T, LDT, W, CDUM, 1, WORK,
216 NINFO( 2 ) = NINFO( 2 ) + 1
220 * Compute eigenvectors
225 CALL CTREVC( 'B', 'A', SELECT, N, T, LDT, LE, LDT, RE, LDT, N,
226 $ M, WORK, RWORK, INFO )
228 * Compute condition numbers
230 CALL CTRSNA( 'B', 'A', SELECT, N, T, LDT, LE, LDT, RE, LDT, S,
231 $ SEP, N, M, WORK, N, RWORK, INFO )
234 NINFO( 3 ) = NINFO( 3 ) + 1
238 * Sort eigenvalues and condition numbers lexicographically
239 * to compare with inputs
241 CALL CCOPY( N, W, 1, WTMP, 1 )
244 * Sort by increasing real part
247 WSRT( I ) = REAL( W( I ) )
251 * Sort by increasing imaginary part
254 WSRT( I ) = AIMAG( W( I ) )
257 CALL SCOPY( N, S, 1, STMP, 1 )
258 CALL SCOPY( N, SEP, 1, SEPTMP, 1 )
259 CALL SSCAL( N, ONE / VMUL, SEPTMP, 1 )
264 IF( WSRT( J ).LT.VMIN ) THEN
269 WSRT( KMIN ) = WSRT( I )
272 WTMP( I ) = W( KMIN )
275 STMP( KMIN ) = STMP( I )
277 VMIN = SEPTMP( KMIN )
278 SEPTMP( KMIN ) = SEPTMP( I )
282 * Compare condition numbers for eigenvalues
283 * taking their condition numbers into account
285 V = MAX( TWO*REAL( N )*EPS*TNRM, SMLNUM )
289 IF( V.GT.SEPTMP( I ) ) THEN
292 TOL = V / SEPTMP( I )
294 IF( V.GT.SEPIN( I ) ) THEN
297 TOLIN = V / SEPIN( I )
299 TOL = MAX( TOL, SMLNUM / EPS )
300 TOLIN = MAX( TOLIN, SMLNUM / EPS )
301 IF( EPS*( SIN( I )-TOLIN ).GT.STMP( I )+TOL ) THEN
303 ELSE IF( SIN( I )-TOLIN.GT.STMP( I )+TOL ) THEN
304 VMAX = ( SIN( I )-TOLIN ) / ( STMP( I )+TOL )
305 ELSE IF( SIN( I )+TOLIN.LT.EPS*( STMP( I )-TOL ) ) THEN
307 ELSE IF( SIN( I )+TOLIN.LT.STMP( I )-TOL ) THEN
308 VMAX = ( STMP( I )-TOL ) / ( SIN( I )+TOLIN )
312 IF( VMAX.GT.RMAX( 2 ) ) THEN
314 IF( NINFO( 2 ).EQ.0 )
319 * Compare condition numbers for eigenvectors
320 * taking their condition numbers into account
323 IF( V.GT.SEPTMP( I )*STMP( I ) ) THEN
328 IF( V.GT.SEPIN( I )*SIN( I ) ) THEN
333 TOL = MAX( TOL, SMLNUM / EPS )
334 TOLIN = MAX( TOLIN, SMLNUM / EPS )
335 IF( EPS*( SEPIN( I )-TOLIN ).GT.SEPTMP( I )+TOL ) THEN
337 ELSE IF( SEPIN( I )-TOLIN.GT.SEPTMP( I )+TOL ) THEN
338 VMAX = ( SEPIN( I )-TOLIN ) / ( SEPTMP( I )+TOL )
339 ELSE IF( SEPIN( I )+TOLIN.LT.EPS*( SEPTMP( I )-TOL ) ) THEN
341 ELSE IF( SEPIN( I )+TOLIN.LT.SEPTMP( I )-TOL ) THEN
342 VMAX = ( SEPTMP( I )-TOL ) / ( SEPIN( I )+TOLIN )
346 IF( VMAX.GT.RMAX( 2 ) ) THEN
348 IF( NINFO( 2 ).EQ.0 )
353 * Compare condition numbers for eigenvalues
354 * without taking their condition numbers into account
357 IF( SIN( I ).LE.REAL( 2*N )*EPS .AND. STMP( I ).LE.
358 $ REAL( 2*N )*EPS ) THEN
360 ELSE IF( EPS*SIN( I ).GT.STMP( I ) ) THEN
362 ELSE IF( SIN( I ).GT.STMP( I ) ) THEN
363 VMAX = SIN( I ) / STMP( I )
364 ELSE IF( SIN( I ).LT.EPS*STMP( I ) ) THEN
366 ELSE IF( SIN( I ).LT.STMP( I ) ) THEN
367 VMAX = STMP( I ) / SIN( I )
371 IF( VMAX.GT.RMAX( 3 ) ) THEN
373 IF( NINFO( 3 ).EQ.0 )
378 * Compare condition numbers for eigenvectors
379 * without taking their condition numbers into account
382 IF( SEPIN( I ).LE.V .AND. SEPTMP( I ).LE.V ) THEN
384 ELSE IF( EPS*SEPIN( I ).GT.SEPTMP( I ) ) THEN
386 ELSE IF( SEPIN( I ).GT.SEPTMP( I ) ) THEN
387 VMAX = SEPIN( I ) / SEPTMP( I )
388 ELSE IF( SEPIN( I ).LT.EPS*SEPTMP( I ) ) THEN
390 ELSE IF( SEPIN( I ).LT.SEPTMP( I ) ) THEN
391 VMAX = SEPTMP( I ) / SEPIN( I )
395 IF( VMAX.GT.RMAX( 3 ) ) THEN
397 IF( NINFO( 3 ).EQ.0 )
402 * Compute eigenvalue condition numbers only and compare
406 CALL SCOPY( N, DUM, 0, STMP, 1 )
407 CALL SCOPY( N, DUM, 0, SEPTMP, 1 )
408 CALL CTRSNA( 'E', 'A', SELECT, N, T, LDT, LE, LDT, RE, LDT,
409 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
412 NINFO( 3 ) = NINFO( 3 ) + 1
416 IF( STMP( I ).NE.S( I ) )
418 IF( SEPTMP( I ).NE.DUM( 1 ) )
422 * Compute eigenvector condition numbers only and compare
424 CALL SCOPY( N, DUM, 0, STMP, 1 )
425 CALL SCOPY( N, DUM, 0, SEPTMP, 1 )
426 CALL CTRSNA( 'V', 'A', SELECT, N, T, LDT, LE, LDT, RE, LDT,
427 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
430 NINFO( 3 ) = NINFO( 3 ) + 1
434 IF( STMP( I ).NE.DUM( 1 ) )
436 IF( SEPTMP( I ).NE.SEP( I ) )
440 * Compute all condition numbers using SELECT and compare
445 CALL SCOPY( N, DUM, 0, STMP, 1 )
446 CALL SCOPY( N, DUM, 0, SEPTMP, 1 )
447 CALL CTRSNA( 'B', 'S', SELECT, N, T, LDT, LE, LDT, RE, LDT,
448 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
451 NINFO( 3 ) = NINFO( 3 ) + 1
455 IF( SEPTMP( I ).NE.SEP( I ) )
457 IF( STMP( I ).NE.S( I ) )
461 * Compute eigenvalue condition numbers using SELECT and compare
463 CALL SCOPY( N, DUM, 0, STMP, 1 )
464 CALL SCOPY( N, DUM, 0, SEPTMP, 1 )
465 CALL CTRSNA( 'E', 'S', SELECT, N, T, LDT, LE, LDT, RE, LDT,
466 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
469 NINFO( 3 ) = NINFO( 3 ) + 1
473 IF( STMP( I ).NE.S( I ) )
475 IF( SEPTMP( I ).NE.DUM( 1 ) )
479 * Compute eigenvector condition numbers using SELECT and compare
481 CALL SCOPY( N, DUM, 0, STMP, 1 )
482 CALL SCOPY( N, DUM, 0, SEPTMP, 1 )
483 CALL CTRSNA( 'V', 'S', SELECT, N, T, LDT, LE, LDT, RE, LDT,
484 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
487 NINFO( 3 ) = NINFO( 3 ) + 1
491 IF( STMP( I ).NE.DUM( 1 ) )
493 IF( SEPTMP( I ).NE.SEP( I ) )
496 IF( VMAX.GT.RMAX( 1 ) ) THEN
498 IF( NINFO( 1 ).EQ.0 )
502 * Select second and next to last eigenvalues
505 SELECT( I ) = .FALSE.
512 CALL CCOPY( N, RE( 1, 2 ), 1, RE( 1, 1 ), 1 )
513 CALL CCOPY( N, LE( 1, 2 ), 1, LE( 1, 1 ), 1 )
518 SELECT( N-1 ) = .TRUE.
519 CALL CCOPY( N, RE( 1, N-1 ), 1, RE( 1, 2 ), 1 )
520 CALL CCOPY( N, LE( 1, N-1 ), 1, LE( 1, 2 ), 1 )
523 * Compute all selected condition numbers
525 CALL SCOPY( ICMP, DUM, 0, STMP, 1 )
526 CALL SCOPY( ICMP, DUM, 0, SEPTMP, 1 )
527 CALL CTRSNA( 'B', 'S', SELECT, N, T, LDT, LE, LDT, RE, LDT,
528 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
531 NINFO( 3 ) = NINFO( 3 ) + 1
536 IF( SEPTMP( I ).NE.SEP( J ) )
538 IF( STMP( I ).NE.S( J ) )
542 * Compute selected eigenvalue condition numbers
544 CALL SCOPY( ICMP, DUM, 0, STMP, 1 )
545 CALL SCOPY( ICMP, DUM, 0, SEPTMP, 1 )
546 CALL CTRSNA( 'E', 'S', SELECT, N, T, LDT, LE, LDT, RE, LDT,
547 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
550 NINFO( 3 ) = NINFO( 3 ) + 1
555 IF( STMP( I ).NE.S( J ) )
557 IF( SEPTMP( I ).NE.DUM( 1 ) )
561 * Compute selected eigenvector condition numbers
563 CALL SCOPY( ICMP, DUM, 0, STMP, 1 )
564 CALL SCOPY( ICMP, DUM, 0, SEPTMP, 1 )
565 CALL CTRSNA( 'V', 'S', SELECT, N, T, LDT, LE, LDT, RE, LDT,
566 $ STMP, SEPTMP, N, M, WORK, N, RWORK, INFO )
569 NINFO( 3 ) = NINFO( 3 ) + 1
574 IF( STMP( I ).NE.DUM( 1 ) )
576 IF( SEPTMP( I ).NE.SEP( J ) )
579 IF( VMAX.GT.RMAX( 1 ) ) THEN
581 IF( NINFO( 1 ).EQ.0 )