You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

zebchvxx.f 19 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. *> \brief \b ZEBCHVXX
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. * Definition:
  9. * ===========
  10. *
  11. * SUBROUTINE ZEBCHVXX( THRESH, PATH )
  12. *
  13. * .. Scalar Arguments ..
  14. * DOUBLE PRECISION THRESH
  15. * CHARACTER*3 PATH
  16. * ..
  17. *
  18. * Purpose
  19. * ======
  20. *
  21. *> \details \b Purpose:
  22. *> \verbatim
  23. *>
  24. *> ZEBCHVXX will run Z**SVXX on a series of Hilbert matrices and then
  25. *> compare the error bounds returned by Z**SVXX to see if the returned
  26. *> answer indeed falls within those bounds.
  27. *>
  28. *> Eight test ratios will be computed. The tests will pass if they are .LT.
  29. *> THRESH. There are two cases that are determined by 1 / (SQRT( N ) * EPS).
  30. *> If that value is .LE. to the component wise reciprocal condition number,
  31. *> it uses the guaranteed case, other wise it uses the unguaranteed case.
  32. *>
  33. *> Test ratios:
  34. *> Let Xc be X_computed and Xt be X_truth.
  35. *> The norm used is the infinity norm.
  36. *>
  37. *> Let A be the guaranteed case and B be the unguaranteed case.
  38. *>
  39. *> 1. Normwise guaranteed forward error bound.
  40. *> A: norm ( abs( Xc - Xt ) / norm ( Xt ) .LE. ERRBND( *, nwise_i, bnd_i ) and
  41. *> ERRBND( *, nwise_i, bnd_i ) .LE. MAX(SQRT(N),10) * EPS.
  42. *> If these conditions are met, the test ratio is set to be
  43. *> ERRBND( *, nwise_i, bnd_i ) / MAX(SQRT(N), 10). Otherwise it is 1/EPS.
  44. *> B: For this case, CGESVXX should just return 1. If it is less than
  45. *> one, treat it the same as in 1A. Otherwise it fails. (Set test
  46. *> ratio to ERRBND( *, nwise_i, bnd_i ) * THRESH?)
  47. *>
  48. *> 2. Componentwise guaranteed forward error bound.
  49. *> A: norm ( abs( Xc(j) - Xt(j) ) ) / norm (Xt(j)) .LE. ERRBND( *, cwise_i, bnd_i )
  50. *> for all j .AND. ERRBND( *, cwise_i, bnd_i ) .LE. MAX(SQRT(N), 10) * EPS.
  51. *> If these conditions are met, the test ratio is set to be
  52. *> ERRBND( *, cwise_i, bnd_i ) / MAX(SQRT(N), 10). Otherwise it is 1/EPS.
  53. *> B: Same as normwise test ratio.
  54. *>
  55. *> 3. Backwards error.
  56. *> A: The test ratio is set to BERR/EPS.
  57. *> B: Same test ratio.
  58. *>
  59. *> 4. Reciprocal condition number.
  60. *> A: A condition number is computed with Xt and compared with the one
  61. *> returned from CGESVXX. Let RCONDc be the RCOND returned by CGESVXX
  62. *> and RCONDt be the RCOND from the truth value. Test ratio is set to
  63. *> MAX(RCONDc/RCONDt, RCONDt/RCONDc).
  64. *> B: Test ratio is set to 1 / (EPS * RCONDc).
  65. *>
  66. *> 5. Reciprocal normwise condition number.
  67. *> A: The test ratio is set to
  68. *> MAX(ERRBND( *, nwise_i, cond_i ) / NCOND, NCOND / ERRBND( *, nwise_i, cond_i )).
  69. *> B: Test ratio is set to 1 / (EPS * ERRBND( *, nwise_i, cond_i )).
  70. *>
  71. *> 6. Reciprocal componentwise condition number.
  72. *> A: Test ratio is set to
  73. *> MAX(ERRBND( *, cwise_i, cond_i ) / CCOND, CCOND / ERRBND( *, cwise_i, cond_i )).
  74. *> B: Test ratio is set to 1 / (EPS * ERRBND( *, cwise_i, cond_i )).
  75. *>
  76. *> .. Parameters ..
  77. *> NMAX is determined by the largest number in the inverse of the hilbert
  78. *> matrix. Precision is exhausted when the largest entry in it is greater
  79. *> than 2 to the power of the number of bits in the fraction of the data
  80. *> type used plus one, which is 24 for single precision.
  81. *> NMAX should be 6 for single and 11 for double.
  82. *> \endverbatim
  83. *
  84. * Authors:
  85. * ========
  86. *
  87. *> \author Univ. of Tennessee
  88. *> \author Univ. of California Berkeley
  89. *> \author Univ. of Colorado Denver
  90. *> \author NAG Ltd.
  91. *
  92. *> \ingroup complex16_lin
  93. *
  94. * =====================================================================
  95. SUBROUTINE ZEBCHVXX( THRESH, PATH )
  96. IMPLICIT NONE
  97. * .. Scalar Arguments ..
  98. DOUBLE PRECISION THRESH
  99. CHARACTER*3 PATH
  100. INTEGER NMAX, NPARAMS, NERRBND, NTESTS, KL, KU
  101. PARAMETER (NMAX = 10, NPARAMS = 2, NERRBND = 3,
  102. $ NTESTS = 6)
  103. * .. Local Scalars ..
  104. INTEGER N, NRHS, INFO, I ,J, k, NFAIL, LDA,
  105. $ N_AUX_TESTS, LDAB, LDAFB
  106. CHARACTER FACT, TRANS, UPLO, EQUED
  107. CHARACTER*2 C2
  108. CHARACTER(3) NGUAR, CGUAR
  109. LOGICAL printed_guide
  110. DOUBLE PRECISION NCOND, CCOND, M, NORMDIF, NORMT, RCOND,
  111. $ RNORM, RINORM, SUMR, SUMRI, EPS,
  112. $ BERR(NMAX), RPVGRW, ORCOND,
  113. $ CWISE_ERR, NWISE_ERR, CWISE_BND, NWISE_BND,
  114. $ CWISE_RCOND, NWISE_RCOND,
  115. $ CONDTHRESH, ERRTHRESH
  116. COMPLEX*16 ZDUM
  117. * .. Local Arrays ..
  118. DOUBLE PRECISION TSTRAT(NTESTS), RINV(NMAX), PARAMS(NPARAMS),
  119. $ S(NMAX),R(NMAX),C(NMAX),RWORK(3*NMAX),
  120. $ DIFF(NMAX, NMAX),
  121. $ ERRBND_N(NMAX*3), ERRBND_C(NMAX*3)
  122. INTEGER IPIV(NMAX)
  123. COMPLEX*16 A(NMAX,NMAX),INVHILB(NMAX,NMAX),X(NMAX,NMAX),
  124. $ WORK(NMAX*3*5), AF(NMAX, NMAX),B(NMAX, NMAX),
  125. $ ACOPY(NMAX, NMAX),
  126. $ AB( (NMAX-1)+(NMAX-1)+1, NMAX ),
  127. $ ABCOPY( (NMAX-1)+(NMAX-1)+1, NMAX ),
  128. $ AFB( 2*(NMAX-1)+(NMAX-1)+1, NMAX )
  129. * .. External Functions ..
  130. DOUBLE PRECISION DLAMCH
  131. * .. External Subroutines ..
  132. EXTERNAL ZLAHILB, ZGESVXX, ZPOSVXX, ZSYSVXX,
  133. $ ZGBSVXX, ZLACPY, LSAMEN
  134. LOGICAL LSAMEN
  135. * .. Intrinsic Functions ..
  136. INTRINSIC SQRT, MAX, ABS, DBLE, DIMAG
  137. * .. Statement Functions ..
  138. DOUBLE PRECISION CABS1
  139. * .. Statement Function Definitions ..
  140. CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
  141. * .. Parameters ..
  142. INTEGER NWISE_I, CWISE_I
  143. PARAMETER (NWISE_I = 1, CWISE_I = 1)
  144. INTEGER BND_I, COND_I
  145. PARAMETER (BND_I = 2, COND_I = 3)
  146. * Create the loop to test out the Hilbert matrices
  147. FACT = 'E'
  148. UPLO = 'U'
  149. TRANS = 'N'
  150. EQUED = 'N'
  151. EPS = DLAMCH('Epsilon')
  152. NFAIL = 0
  153. N_AUX_TESTS = 0
  154. LDA = NMAX
  155. LDAB = (NMAX-1)+(NMAX-1)+1
  156. LDAFB = 2*(NMAX-1)+(NMAX-1)+1
  157. C2 = PATH( 2: 3 )
  158. * Main loop to test the different Hilbert Matrices.
  159. printed_guide = .false.
  160. DO N = 1 , NMAX
  161. PARAMS(1) = -1
  162. PARAMS(2) = -1
  163. KL = N-1
  164. KU = N-1
  165. NRHS = n
  166. M = MAX(SQRT(DBLE(N)), 10.0D+0)
  167. * Generate the Hilbert matrix, its inverse, and the
  168. * right hand side, all scaled by the LCM(1,..,2N-1).
  169. CALL ZLAHILB(N, N, A, LDA, INVHILB, LDA, B,
  170. $ LDA, WORK, INFO, PATH)
  171. * Copy A into ACOPY.
  172. CALL ZLACPY('ALL', N, N, A, NMAX, ACOPY, NMAX)
  173. * Store A in band format for GB tests
  174. DO J = 1, N
  175. DO I = 1, KL+KU+1
  176. AB( I, J ) = (0.0D+0,0.0D+0)
  177. END DO
  178. END DO
  179. DO J = 1, N
  180. DO I = MAX( 1, J-KU ), MIN( N, J+KL )
  181. AB( KU+1+I-J, J ) = A( I, J )
  182. END DO
  183. END DO
  184. * Copy AB into ABCOPY.
  185. DO J = 1, N
  186. DO I = 1, KL+KU+1
  187. ABCOPY( I, J ) = (0.0D+0,0.0D+0)
  188. END DO
  189. END DO
  190. CALL ZLACPY('ALL', KL+KU+1, N, AB, LDAB, ABCOPY, LDAB)
  191. * Call Z**SVXX with default PARAMS and N_ERR_BND = 3.
  192. IF ( LSAMEN( 2, C2, 'SY' ) ) THEN
  193. CALL ZSYSVXX(FACT, UPLO, N, NRHS, ACOPY, LDA, AF, LDA,
  194. $ IPIV, EQUED, S, B, LDA, X, LDA, ORCOND,
  195. $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
  196. $ PARAMS, WORK, RWORK, INFO)
  197. ELSE IF ( LSAMEN( 2, C2, 'PO' ) ) THEN
  198. CALL ZPOSVXX(FACT, UPLO, N, NRHS, ACOPY, LDA, AF, LDA,
  199. $ EQUED, S, B, LDA, X, LDA, ORCOND,
  200. $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
  201. $ PARAMS, WORK, RWORK, INFO)
  202. ELSE IF ( LSAMEN( 2, C2, 'HE' ) ) THEN
  203. CALL ZHESVXX(FACT, UPLO, N, NRHS, ACOPY, LDA, AF, LDA,
  204. $ IPIV, EQUED, S, B, LDA, X, LDA, ORCOND,
  205. $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
  206. $ PARAMS, WORK, RWORK, INFO)
  207. ELSE IF ( LSAMEN( 2, C2, 'GB' ) ) THEN
  208. CALL ZGBSVXX(FACT, TRANS, N, KL, KU, NRHS, ABCOPY,
  209. $ LDAB, AFB, LDAFB, IPIV, EQUED, R, C, B,
  210. $ LDA, X, LDA, ORCOND, RPVGRW, BERR, NERRBND,
  211. $ ERRBND_N, ERRBND_C, NPARAMS, PARAMS, WORK, RWORK,
  212. $ INFO)
  213. ELSE
  214. CALL ZGESVXX(FACT, TRANS, N, NRHS, ACOPY, LDA, AF, LDA,
  215. $ IPIV, EQUED, R, C, B, LDA, X, LDA, ORCOND,
  216. $ RPVGRW, BERR, NERRBND, ERRBND_N, ERRBND_C, NPARAMS,
  217. $ PARAMS, WORK, RWORK, INFO)
  218. END IF
  219. N_AUX_TESTS = N_AUX_TESTS + 1
  220. IF (ORCOND .LT. EPS) THEN
  221. ! Either factorization failed or the matrix is flagged, and 1 <=
  222. ! INFO <= N+1. We don't decide based on rcond anymore.
  223. ! IF (INFO .EQ. 0 .OR. INFO .GT. N+1) THEN
  224. ! NFAIL = NFAIL + 1
  225. ! WRITE (*, FMT=8000) N, INFO, ORCOND, RCOND
  226. ! END IF
  227. ELSE
  228. ! Either everything succeeded (INFO == 0) or some solution failed
  229. ! to converge (INFO > N+1).
  230. IF (INFO .GT. 0 .AND. INFO .LE. N+1) THEN
  231. NFAIL = NFAIL + 1
  232. WRITE (*, FMT=8000) C2, N, INFO, ORCOND, RCOND
  233. END IF
  234. END IF
  235. * Calculating the difference between Z**SVXX's X and the true X.
  236. DO I = 1,N
  237. DO J =1,NRHS
  238. DIFF(I,J) = X(I,J) - INVHILB(I,J)
  239. END DO
  240. END DO
  241. * Calculating the RCOND
  242. RNORM = 0
  243. RINORM = 0
  244. IF ( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'SY' ) .OR.
  245. $ LSAMEN( 2, C2, 'HE' ) ) THEN
  246. DO I = 1, N
  247. SUMR = 0
  248. SUMRI = 0
  249. DO J = 1, N
  250. SUMR = SUMR + S(I) * CABS1(A(I,J)) * S(J)
  251. SUMRI = SUMRI + CABS1(INVHILB(I, J)) / (S(J) * S(I))
  252. END DO
  253. RNORM = MAX(RNORM,SUMR)
  254. RINORM = MAX(RINORM,SUMRI)
  255. END DO
  256. ELSE IF ( LSAMEN( 2, C2, 'GE' ) .OR. LSAMEN( 2, C2, 'GB' ) )
  257. $ THEN
  258. DO I = 1, N
  259. SUMR = 0
  260. SUMRI = 0
  261. DO J = 1, N
  262. SUMR = SUMR + R(I) * CABS1(A(I,J)) * C(J)
  263. SUMRI = SUMRI + CABS1(INVHILB(I, J)) / (R(J) * C(I))
  264. END DO
  265. RNORM = MAX(RNORM,SUMR)
  266. RINORM = MAX(RINORM,SUMRI)
  267. END DO
  268. END IF
  269. RNORM = RNORM / CABS1(A(1, 1))
  270. RCOND = 1.0D+0/(RNORM * RINORM)
  271. * Calculating the R for normwise rcond.
  272. DO I = 1, N
  273. RINV(I) = 0.0D+0
  274. END DO
  275. DO J = 1, N
  276. DO I = 1, N
  277. RINV(I) = RINV(I) + CABS1(A(I,J))
  278. END DO
  279. END DO
  280. * Calculating the Normwise rcond.
  281. RINORM = 0.0D+0
  282. DO I = 1, N
  283. SUMRI = 0.0D+0
  284. DO J = 1, N
  285. SUMRI = SUMRI + CABS1(INVHILB(I,J) * RINV(J))
  286. END DO
  287. RINORM = MAX(RINORM, SUMRI)
  288. END DO
  289. ! invhilb is the inverse *unscaled* Hilbert matrix, so scale its norm
  290. ! by 1/A(1,1) to make the scaling match A (the scaled Hilbert matrix)
  291. NCOND = CABS1(A(1,1)) / RINORM
  292. CONDTHRESH = M * EPS
  293. ERRTHRESH = M * EPS
  294. DO K = 1, NRHS
  295. NORMT = 0.0D+0
  296. NORMDIF = 0.0D+0
  297. CWISE_ERR = 0.0D+0
  298. DO I = 1, N
  299. NORMT = MAX(CABS1(INVHILB(I, K)), NORMT)
  300. NORMDIF = MAX(CABS1(X(I,K) - INVHILB(I,K)), NORMDIF)
  301. IF (INVHILB(I,K) .NE. 0.0D+0) THEN
  302. CWISE_ERR = MAX(CABS1(X(I,K) - INVHILB(I,K))
  303. $ /CABS1(INVHILB(I,K)), CWISE_ERR)
  304. ELSE IF (X(I, K) .NE. 0.0D+0) THEN
  305. CWISE_ERR = DLAMCH('OVERFLOW')
  306. END IF
  307. END DO
  308. IF (NORMT .NE. 0.0D+0) THEN
  309. NWISE_ERR = NORMDIF / NORMT
  310. ELSE IF (NORMDIF .NE. 0.0D+0) THEN
  311. NWISE_ERR = DLAMCH('OVERFLOW')
  312. ELSE
  313. NWISE_ERR = 0.0D+0
  314. ENDIF
  315. DO I = 1, N
  316. RINV(I) = 0.0D+0
  317. END DO
  318. DO J = 1, N
  319. DO I = 1, N
  320. RINV(I) = RINV(I) + CABS1(A(I, J) * INVHILB(J, K))
  321. END DO
  322. END DO
  323. RINORM = 0.0D+0
  324. DO I = 1, N
  325. SUMRI = 0.0D+0
  326. DO J = 1, N
  327. SUMRI = SUMRI
  328. $ + CABS1(INVHILB(I, J) * RINV(J) / INVHILB(I, K))
  329. END DO
  330. RINORM = MAX(RINORM, SUMRI)
  331. END DO
  332. ! invhilb is the inverse *unscaled* Hilbert matrix, so scale its norm
  333. ! by 1/A(1,1) to make the scaling match A (the scaled Hilbert matrix)
  334. CCOND = CABS1(A(1,1))/RINORM
  335. ! Forward error bound tests
  336. NWISE_BND = ERRBND_N(K + (BND_I-1)*NRHS)
  337. CWISE_BND = ERRBND_C(K + (BND_I-1)*NRHS)
  338. NWISE_RCOND = ERRBND_N(K + (COND_I-1)*NRHS)
  339. CWISE_RCOND = ERRBND_C(K + (COND_I-1)*NRHS)
  340. ! write (*,*) 'nwise : ', n, k, ncond, nwise_rcond,
  341. ! $ condthresh, ncond.ge.condthresh
  342. ! write (*,*) 'nwise2: ', k, nwise_bnd, nwise_err, errthresh
  343. IF (NCOND .GE. CONDTHRESH) THEN
  344. NGUAR = 'YES'
  345. IF (NWISE_BND .GT. ERRTHRESH) THEN
  346. TSTRAT(1) = 1/(2.0D+0*EPS)
  347. ELSE
  348. IF (NWISE_BND .NE. 0.0D+0) THEN
  349. TSTRAT(1) = NWISE_ERR / NWISE_BND
  350. ELSE IF (NWISE_ERR .NE. 0.0D+0) THEN
  351. TSTRAT(1) = 1/(16.0*EPS)
  352. ELSE
  353. TSTRAT(1) = 0.0D+0
  354. END IF
  355. IF (TSTRAT(1) .GT. 1.0D+0) THEN
  356. TSTRAT(1) = 1/(4.0D+0*EPS)
  357. END IF
  358. END IF
  359. ELSE
  360. NGUAR = 'NO'
  361. IF (NWISE_BND .LT. 1.0D+0) THEN
  362. TSTRAT(1) = 1/(8.0D+0*EPS)
  363. ELSE
  364. TSTRAT(1) = 1.0D+0
  365. END IF
  366. END IF
  367. ! write (*,*) 'cwise : ', n, k, ccond, cwise_rcond,
  368. ! $ condthresh, ccond.ge.condthresh
  369. ! write (*,*) 'cwise2: ', k, cwise_bnd, cwise_err, errthresh
  370. IF (CCOND .GE. CONDTHRESH) THEN
  371. CGUAR = 'YES'
  372. IF (CWISE_BND .GT. ERRTHRESH) THEN
  373. TSTRAT(2) = 1/(2.0D+0*EPS)
  374. ELSE
  375. IF (CWISE_BND .NE. 0.0D+0) THEN
  376. TSTRAT(2) = CWISE_ERR / CWISE_BND
  377. ELSE IF (CWISE_ERR .NE. 0.0D+0) THEN
  378. TSTRAT(2) = 1/(16.0D+0*EPS)
  379. ELSE
  380. TSTRAT(2) = 0.0D+0
  381. END IF
  382. IF (TSTRAT(2) .GT. 1.0D+0) TSTRAT(2) = 1/(4.0D+0*EPS)
  383. END IF
  384. ELSE
  385. CGUAR = 'NO'
  386. IF (CWISE_BND .LT. 1.0D+0) THEN
  387. TSTRAT(2) = 1/(8.0D+0*EPS)
  388. ELSE
  389. TSTRAT(2) = 1.0D+0
  390. END IF
  391. END IF
  392. ! Backwards error test
  393. TSTRAT(3) = BERR(K)/EPS
  394. ! Condition number tests
  395. TSTRAT(4) = RCOND / ORCOND
  396. IF (RCOND .GE. CONDTHRESH .AND. TSTRAT(4) .LT. 1.0D+0)
  397. $ TSTRAT(4) = 1.0D+0 / TSTRAT(4)
  398. TSTRAT(5) = NCOND / NWISE_RCOND
  399. IF (NCOND .GE. CONDTHRESH .AND. TSTRAT(5) .LT. 1.0D+0)
  400. $ TSTRAT(5) = 1.0D+0 / TSTRAT(5)
  401. TSTRAT(6) = CCOND / NWISE_RCOND
  402. IF (CCOND .GE. CONDTHRESH .AND. TSTRAT(6) .LT. 1.0D+0)
  403. $ TSTRAT(6) = 1.0D+0 / TSTRAT(6)
  404. DO I = 1, NTESTS
  405. IF (TSTRAT(I) .GT. THRESH) THEN
  406. IF (.NOT.PRINTED_GUIDE) THEN
  407. WRITE(*,*)
  408. WRITE( *, 9996) 1
  409. WRITE( *, 9995) 2
  410. WRITE( *, 9994) 3
  411. WRITE( *, 9993) 4
  412. WRITE( *, 9992) 5
  413. WRITE( *, 9991) 6
  414. WRITE( *, 9990) 7
  415. WRITE( *, 9989) 8
  416. WRITE(*,*)
  417. PRINTED_GUIDE = .TRUE.
  418. END IF
  419. WRITE( *, 9999) C2, N, K, NGUAR, CGUAR, I, TSTRAT(I)
  420. NFAIL = NFAIL + 1
  421. END IF
  422. END DO
  423. END DO
  424. c$$$ WRITE(*,*)
  425. c$$$ WRITE(*,*) 'Normwise Error Bounds'
  426. c$$$ WRITE(*,*) 'Guaranteed error bound: ',ERRBND(NRHS,nwise_i,bnd_i)
  427. c$$$ WRITE(*,*) 'Reciprocal condition number: ',ERRBND(NRHS,nwise_i,cond_i)
  428. c$$$ WRITE(*,*) 'Raw error estimate: ',ERRBND(NRHS,nwise_i,rawbnd_i)
  429. c$$$ WRITE(*,*)
  430. c$$$ WRITE(*,*) 'Componentwise Error Bounds'
  431. c$$$ WRITE(*,*) 'Guaranteed error bound: ',ERRBND(NRHS,cwise_i,bnd_i)
  432. c$$$ WRITE(*,*) 'Reciprocal condition number: ',ERRBND(NRHS,cwise_i,cond_i)
  433. c$$$ WRITE(*,*) 'Raw error estimate: ',ERRBND(NRHS,cwise_i,rawbnd_i)
  434. c$$$ print *, 'Info: ', info
  435. c$$$ WRITE(*,*)
  436. * WRITE(*,*) 'TSTRAT: ',TSTRAT
  437. END DO
  438. WRITE(*,*)
  439. IF( NFAIL .GT. 0 ) THEN
  440. WRITE(*,9998) C2, NFAIL, NTESTS*N+N_AUX_TESTS
  441. ELSE
  442. WRITE(*,9997) C2
  443. END IF
  444. 9999 FORMAT( ' Z', A2, 'SVXX: N =', I2, ', RHS = ', I2,
  445. $ ', NWISE GUAR. = ', A, ', CWISE GUAR. = ', A,
  446. $ ' test(',I1,') =', G12.5 )
  447. 9998 FORMAT( ' Z', A2, 'SVXX: ', I6, ' out of ', I6,
  448. $ ' tests failed to pass the threshold' )
  449. 9997 FORMAT( ' Z', A2, 'SVXX passed the tests of error bounds' )
  450. * Test ratios.
  451. 9996 FORMAT( 3X, I2, ': Normwise guaranteed forward error', / 5X,
  452. $ 'Guaranteed case: if norm ( abs( Xc - Xt )',
  453. $ ' / norm ( Xt ) .LE. ERRBND( *, nwise_i, bnd_i ), then',
  454. $ / 5X,
  455. $ 'ERRBND( *, nwise_i, bnd_i ) .LE. MAX(SQRT(N), 10) * EPS')
  456. 9995 FORMAT( 3X, I2, ': Componentwise guaranteed forward error' )
  457. 9994 FORMAT( 3X, I2, ': Backwards error' )
  458. 9993 FORMAT( 3X, I2, ': Reciprocal condition number' )
  459. 9992 FORMAT( 3X, I2, ': Reciprocal normwise condition number' )
  460. 9991 FORMAT( 3X, I2, ': Raw normwise error estimate' )
  461. 9990 FORMAT( 3X, I2, ': Reciprocal componentwise condition number' )
  462. 9989 FORMAT( 3X, I2, ': Raw componentwise error estimate' )
  463. 8000 FORMAT( ' Z', A2, 'SVXX: N =', I2, ', INFO = ', I3,
  464. $ ', ORCOND = ', G12.5, ', real RCOND = ', G12.5 )
  465. *
  466. * End of ZEBCHVXX
  467. *
  468. END