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.

cchkpt.f 17 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. *> \brief \b CCHKPT
  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 CCHKPT( DOTYPE, NN, NVAL, NNS, NSVAL, THRESH, TSTERR,
  12. * A, D, E, B, X, XACT, WORK, RWORK, NOUT )
  13. *
  14. * .. Scalar Arguments ..
  15. * LOGICAL TSTERR
  16. * INTEGER NN, NNS, NOUT
  17. * REAL THRESH
  18. * ..
  19. * .. Array Arguments ..
  20. * LOGICAL DOTYPE( * )
  21. * INTEGER NSVAL( * ), NVAL( * )
  22. * REAL D( * ), RWORK( * )
  23. * COMPLEX A( * ), B( * ), E( * ), WORK( * ), X( * ),
  24. * $ XACT( * )
  25. * ..
  26. *
  27. *
  28. *> \par Purpose:
  29. * =============
  30. *>
  31. *> \verbatim
  32. *>
  33. *> CCHKPT tests CPTTRF, -TRS, -RFS, and -CON
  34. *> \endverbatim
  35. *
  36. * Arguments:
  37. * ==========
  38. *
  39. *> \param[in] DOTYPE
  40. *> \verbatim
  41. *> DOTYPE is LOGICAL array, dimension (NTYPES)
  42. *> The matrix types to be used for testing. Matrices of type j
  43. *> (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
  44. *> .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
  45. *> \endverbatim
  46. *>
  47. *> \param[in] NN
  48. *> \verbatim
  49. *> NN is INTEGER
  50. *> The number of values of N contained in the vector NVAL.
  51. *> \endverbatim
  52. *>
  53. *> \param[in] NVAL
  54. *> \verbatim
  55. *> NVAL is INTEGER array, dimension (NN)
  56. *> The values of the matrix dimension N.
  57. *> \endverbatim
  58. *>
  59. *> \param[in] NNS
  60. *> \verbatim
  61. *> NNS is INTEGER
  62. *> The number of values of NRHS contained in the vector NSVAL.
  63. *> \endverbatim
  64. *>
  65. *> \param[in] NSVAL
  66. *> \verbatim
  67. *> NSVAL is INTEGER array, dimension (NNS)
  68. *> The values of the number of right hand sides NRHS.
  69. *> \endverbatim
  70. *>
  71. *> \param[in] THRESH
  72. *> \verbatim
  73. *> THRESH is REAL
  74. *> The threshold value for the test ratios. A result is
  75. *> included in the output file if RESULT >= THRESH. To have
  76. *> every test ratio printed, use THRESH = 0.
  77. *> \endverbatim
  78. *>
  79. *> \param[in] TSTERR
  80. *> \verbatim
  81. *> TSTERR is LOGICAL
  82. *> Flag that indicates whether error exits are to be tested.
  83. *> \endverbatim
  84. *>
  85. *> \param[out] A
  86. *> \verbatim
  87. *> A is COMPLEX array, dimension (NMAX*2)
  88. *> \endverbatim
  89. *>
  90. *> \param[out] D
  91. *> \verbatim
  92. *> D is REAL array, dimension (NMAX*2)
  93. *> \endverbatim
  94. *>
  95. *> \param[out] E
  96. *> \verbatim
  97. *> E is COMPLEX array, dimension (NMAX*2)
  98. *> \endverbatim
  99. *>
  100. *> \param[out] B
  101. *> \verbatim
  102. *> B is COMPLEX array, dimension (NMAX*NSMAX)
  103. *> where NSMAX is the largest entry in NSVAL.
  104. *> \endverbatim
  105. *>
  106. *> \param[out] X
  107. *> \verbatim
  108. *> X is COMPLEX array, dimension (NMAX*NSMAX)
  109. *> \endverbatim
  110. *>
  111. *> \param[out] XACT
  112. *> \verbatim
  113. *> XACT is COMPLEX array, dimension (NMAX*NSMAX)
  114. *> \endverbatim
  115. *>
  116. *> \param[out] WORK
  117. *> \verbatim
  118. *> WORK is COMPLEX array, dimension
  119. *> (NMAX*max(3,NSMAX))
  120. *> \endverbatim
  121. *>
  122. *> \param[out] RWORK
  123. *> \verbatim
  124. *> RWORK is REAL array, dimension
  125. *> (max(NMAX,2*NSMAX))
  126. *> \endverbatim
  127. *>
  128. *> \param[in] NOUT
  129. *> \verbatim
  130. *> NOUT is INTEGER
  131. *> The unit number for output.
  132. *> \endverbatim
  133. *
  134. * Authors:
  135. * ========
  136. *
  137. *> \author Univ. of Tennessee
  138. *> \author Univ. of California Berkeley
  139. *> \author Univ. of Colorado Denver
  140. *> \author NAG Ltd.
  141. *
  142. *> \date December 2016
  143. *
  144. *> \ingroup complex_lin
  145. *
  146. * =====================================================================
  147. SUBROUTINE CCHKPT( DOTYPE, NN, NVAL, NNS, NSVAL, THRESH, TSTERR,
  148. $ A, D, E, B, X, XACT, WORK, RWORK, NOUT )
  149. *
  150. * -- LAPACK test routine (version 3.7.0) --
  151. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  152. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  153. * December 2016
  154. *
  155. * .. Scalar Arguments ..
  156. LOGICAL TSTERR
  157. INTEGER NN, NNS, NOUT
  158. REAL THRESH
  159. * ..
  160. * .. Array Arguments ..
  161. LOGICAL DOTYPE( * )
  162. INTEGER NSVAL( * ), NVAL( * )
  163. REAL D( * ), RWORK( * )
  164. COMPLEX A( * ), B( * ), E( * ), WORK( * ), X( * ),
  165. $ XACT( * )
  166. * ..
  167. *
  168. * =====================================================================
  169. *
  170. * .. Parameters ..
  171. REAL ONE, ZERO
  172. PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
  173. INTEGER NTYPES
  174. PARAMETER ( NTYPES = 12 )
  175. INTEGER NTESTS
  176. PARAMETER ( NTESTS = 7 )
  177. * ..
  178. * .. Local Scalars ..
  179. LOGICAL ZEROT
  180. CHARACTER DIST, TYPE, UPLO
  181. CHARACTER*3 PATH
  182. INTEGER I, IA, IMAT, IN, INFO, IRHS, IUPLO, IX, IZERO,
  183. $ J, K, KL, KU, LDA, MODE, N, NERRS, NFAIL,
  184. $ NIMAT, NRHS, NRUN
  185. REAL AINVNM, ANORM, COND, DMAX, RCOND, RCONDC
  186. * ..
  187. * .. Local Arrays ..
  188. CHARACTER UPLOS( 2 )
  189. INTEGER ISEED( 4 ), ISEEDY( 4 )
  190. REAL RESULT( NTESTS )
  191. COMPLEX Z( 3 )
  192. * ..
  193. * .. External Functions ..
  194. INTEGER ISAMAX
  195. REAL CLANHT, SCASUM, SGET06
  196. EXTERNAL ISAMAX, CLANHT, SCASUM, SGET06
  197. * ..
  198. * .. External Subroutines ..
  199. EXTERNAL ALAERH, ALAHD, ALASUM, CCOPY, CERRGT, CGET04,
  200. $ CLACPY, CLAPTM, CLARNV, CLATB4, CLATMS, CPTCON,
  201. $ CPTRFS, CPTT01, CPTT02, CPTT05, CPTTRF, CPTTRS,
  202. $ CSSCAL, SCOPY, SLARNV, SSCAL
  203. * ..
  204. * .. Intrinsic Functions ..
  205. INTRINSIC ABS, MAX, REAL
  206. * ..
  207. * .. Scalars in Common ..
  208. LOGICAL LERR, OK
  209. CHARACTER*32 SRNAMT
  210. INTEGER INFOT, NUNIT
  211. * ..
  212. * .. Common blocks ..
  213. COMMON / INFOC / INFOT, NUNIT, OK, LERR
  214. COMMON / SRNAMC / SRNAMT
  215. * ..
  216. * .. Data statements ..
  217. DATA ISEEDY / 0, 0, 0, 1 / , UPLOS / 'U', 'L' /
  218. * ..
  219. * .. Executable Statements ..
  220. *
  221. PATH( 1: 1 ) = 'Complex precision'
  222. PATH( 2: 3 ) = 'PT'
  223. NRUN = 0
  224. NFAIL = 0
  225. NERRS = 0
  226. DO 10 I = 1, 4
  227. ISEED( I ) = ISEEDY( I )
  228. 10 CONTINUE
  229. *
  230. * Test the error exits
  231. *
  232. IF( TSTERR )
  233. $ CALL CERRGT( PATH, NOUT )
  234. INFOT = 0
  235. *
  236. DO 120 IN = 1, NN
  237. *
  238. * Do for each value of N in NVAL.
  239. *
  240. N = NVAL( IN )
  241. LDA = MAX( 1, N )
  242. NIMAT = NTYPES
  243. IF( N.LE.0 )
  244. $ NIMAT = 1
  245. *
  246. DO 110 IMAT = 1, NIMAT
  247. *
  248. * Do the tests only if DOTYPE( IMAT ) is true.
  249. *
  250. IF( N.GT.0 .AND. .NOT.DOTYPE( IMAT ) )
  251. $ GO TO 110
  252. *
  253. * Set up parameters with CLATB4.
  254. *
  255. CALL CLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
  256. $ COND, DIST )
  257. *
  258. ZEROT = IMAT.GE.8 .AND. IMAT.LE.10
  259. IF( IMAT.LE.6 ) THEN
  260. *
  261. * Type 1-6: generate a Hermitian tridiagonal matrix of
  262. * known condition number in lower triangular band storage.
  263. *
  264. SRNAMT = 'CLATMS'
  265. CALL CLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, COND,
  266. $ ANORM, KL, KU, 'B', A, 2, WORK, INFO )
  267. *
  268. * Check the error code from CLATMS.
  269. *
  270. IF( INFO.NE.0 ) THEN
  271. CALL ALAERH( PATH, 'CLATMS', INFO, 0, ' ', N, N, KL,
  272. $ KU, -1, IMAT, NFAIL, NERRS, NOUT )
  273. GO TO 110
  274. END IF
  275. IZERO = 0
  276. *
  277. * Copy the matrix to D and E.
  278. *
  279. IA = 1
  280. DO 20 I = 1, N - 1
  281. D( I ) = REAL( A( IA ) )
  282. E( I ) = A( IA+1 )
  283. IA = IA + 2
  284. 20 CONTINUE
  285. IF( N.GT.0 )
  286. $ D( N ) = REAL( A( IA ) )
  287. ELSE
  288. *
  289. * Type 7-12: generate a diagonally dominant matrix with
  290. * unknown condition number in the vectors D and E.
  291. *
  292. IF( .NOT.ZEROT .OR. .NOT.DOTYPE( 7 ) ) THEN
  293. *
  294. * Let E be complex, D real, with values from [-1,1].
  295. *
  296. CALL SLARNV( 2, ISEED, N, D )
  297. CALL CLARNV( 2, ISEED, N-1, E )
  298. *
  299. * Make the tridiagonal matrix diagonally dominant.
  300. *
  301. IF( N.EQ.1 ) THEN
  302. D( 1 ) = ABS( D( 1 ) )
  303. ELSE
  304. D( 1 ) = ABS( D( 1 ) ) + ABS( E( 1 ) )
  305. D( N ) = ABS( D( N ) ) + ABS( E( N-1 ) )
  306. DO 30 I = 2, N - 1
  307. D( I ) = ABS( D( I ) ) + ABS( E( I ) ) +
  308. $ ABS( E( I-1 ) )
  309. 30 CONTINUE
  310. END IF
  311. *
  312. * Scale D and E so the maximum element is ANORM.
  313. *
  314. IX = ISAMAX( N, D, 1 )
  315. DMAX = D( IX )
  316. CALL SSCAL( N, ANORM / DMAX, D, 1 )
  317. CALL CSSCAL( N-1, ANORM / DMAX, E, 1 )
  318. *
  319. ELSE IF( IZERO.GT.0 ) THEN
  320. *
  321. * Reuse the last matrix by copying back the zeroed out
  322. * elements.
  323. *
  324. IF( IZERO.EQ.1 ) THEN
  325. D( 1 ) = Z( 2 )
  326. IF( N.GT.1 )
  327. $ E( 1 ) = Z( 3 )
  328. ELSE IF( IZERO.EQ.N ) THEN
  329. E( N-1 ) = Z( 1 )
  330. D( N ) = Z( 2 )
  331. ELSE
  332. E( IZERO-1 ) = Z( 1 )
  333. D( IZERO ) = Z( 2 )
  334. E( IZERO ) = Z( 3 )
  335. END IF
  336. END IF
  337. *
  338. * For types 8-10, set one row and column of the matrix to
  339. * zero.
  340. *
  341. IZERO = 0
  342. IF( IMAT.EQ.8 ) THEN
  343. IZERO = 1
  344. Z( 2 ) = D( 1 )
  345. D( 1 ) = ZERO
  346. IF( N.GT.1 ) THEN
  347. Z( 3 ) = E( 1 )
  348. E( 1 ) = ZERO
  349. END IF
  350. ELSE IF( IMAT.EQ.9 ) THEN
  351. IZERO = N
  352. IF( N.GT.1 ) THEN
  353. Z( 1 ) = E( N-1 )
  354. E( N-1 ) = ZERO
  355. END IF
  356. Z( 2 ) = D( N )
  357. D( N ) = ZERO
  358. ELSE IF( IMAT.EQ.10 ) THEN
  359. IZERO = ( N+1 ) / 2
  360. IF( IZERO.GT.1 ) THEN
  361. Z( 1 ) = E( IZERO-1 )
  362. Z( 3 ) = E( IZERO )
  363. E( IZERO-1 ) = ZERO
  364. E( IZERO ) = ZERO
  365. END IF
  366. Z( 2 ) = D( IZERO )
  367. D( IZERO ) = ZERO
  368. END IF
  369. END IF
  370. *
  371. CALL SCOPY( N, D, 1, D( N+1 ), 1 )
  372. IF( N.GT.1 )
  373. $ CALL CCOPY( N-1, E, 1, E( N+1 ), 1 )
  374. *
  375. *+ TEST 1
  376. * Factor A as L*D*L' and compute the ratio
  377. * norm(L*D*L' - A) / (n * norm(A) * EPS )
  378. *
  379. CALL CPTTRF( N, D( N+1 ), E( N+1 ), INFO )
  380. *
  381. * Check error code from CPTTRF.
  382. *
  383. IF( INFO.NE.IZERO ) THEN
  384. CALL ALAERH( PATH, 'CPTTRF', INFO, IZERO, ' ', N, N, -1,
  385. $ -1, -1, IMAT, NFAIL, NERRS, NOUT )
  386. GO TO 110
  387. END IF
  388. *
  389. IF( INFO.GT.0 ) THEN
  390. RCONDC = ZERO
  391. GO TO 100
  392. END IF
  393. *
  394. CALL CPTT01( N, D, E, D( N+1 ), E( N+1 ), WORK,
  395. $ RESULT( 1 ) )
  396. *
  397. * Print the test ratio if greater than or equal to THRESH.
  398. *
  399. IF( RESULT( 1 ).GE.THRESH ) THEN
  400. IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
  401. $ CALL ALAHD( NOUT, PATH )
  402. WRITE( NOUT, FMT = 9999 )N, IMAT, 1, RESULT( 1 )
  403. NFAIL = NFAIL + 1
  404. END IF
  405. NRUN = NRUN + 1
  406. *
  407. * Compute RCONDC = 1 / (norm(A) * norm(inv(A))
  408. *
  409. * Compute norm(A).
  410. *
  411. ANORM = CLANHT( '1', N, D, E )
  412. *
  413. * Use CPTTRS to solve for one column at a time of inv(A),
  414. * computing the maximum column sum as we go.
  415. *
  416. AINVNM = ZERO
  417. DO 50 I = 1, N
  418. DO 40 J = 1, N
  419. X( J ) = ZERO
  420. 40 CONTINUE
  421. X( I ) = ONE
  422. CALL CPTTRS( 'Lower', N, 1, D( N+1 ), E( N+1 ), X, LDA,
  423. $ INFO )
  424. AINVNM = MAX( AINVNM, SCASUM( N, X, 1 ) )
  425. 50 CONTINUE
  426. RCONDC = ONE / MAX( ONE, ANORM*AINVNM )
  427. *
  428. DO 90 IRHS = 1, NNS
  429. NRHS = NSVAL( IRHS )
  430. *
  431. * Generate NRHS random solution vectors.
  432. *
  433. IX = 1
  434. DO 60 J = 1, NRHS
  435. CALL CLARNV( 2, ISEED, N, XACT( IX ) )
  436. IX = IX + LDA
  437. 60 CONTINUE
  438. *
  439. DO 80 IUPLO = 1, 2
  440. *
  441. * Do first for UPLO = 'U', then for UPLO = 'L'.
  442. *
  443. UPLO = UPLOS( IUPLO )
  444. *
  445. * Set the right hand side.
  446. *
  447. CALL CLAPTM( UPLO, N, NRHS, ONE, D, E, XACT, LDA,
  448. $ ZERO, B, LDA )
  449. *
  450. *+ TEST 2
  451. * Solve A*x = b and compute the residual.
  452. *
  453. CALL CLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
  454. CALL CPTTRS( UPLO, N, NRHS, D( N+1 ), E( N+1 ), X,
  455. $ LDA, INFO )
  456. *
  457. * Check error code from CPTTRS.
  458. *
  459. IF( INFO.NE.0 )
  460. $ CALL ALAERH( PATH, 'CPTTRS', INFO, 0, UPLO, N, N,
  461. $ -1, -1, NRHS, IMAT, NFAIL, NERRS,
  462. $ NOUT )
  463. *
  464. CALL CLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
  465. CALL CPTT02( UPLO, N, NRHS, D, E, X, LDA, WORK, LDA,
  466. $ RESULT( 2 ) )
  467. *
  468. *+ TEST 3
  469. * Check solution from generated exact solution.
  470. *
  471. CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
  472. $ RESULT( 3 ) )
  473. *
  474. *+ TESTS 4, 5, and 6
  475. * Use iterative refinement to improve the solution.
  476. *
  477. SRNAMT = 'CPTRFS'
  478. CALL CPTRFS( UPLO, N, NRHS, D, E, D( N+1 ), E( N+1 ),
  479. $ B, LDA, X, LDA, RWORK, RWORK( NRHS+1 ),
  480. $ WORK, RWORK( 2*NRHS+1 ), INFO )
  481. *
  482. * Check error code from CPTRFS.
  483. *
  484. IF( INFO.NE.0 )
  485. $ CALL ALAERH( PATH, 'CPTRFS', INFO, 0, UPLO, N, N,
  486. $ -1, -1, NRHS, IMAT, NFAIL, NERRS,
  487. $ NOUT )
  488. *
  489. CALL CGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
  490. $ RESULT( 4 ) )
  491. CALL CPTT05( N, NRHS, D, E, B, LDA, X, LDA, XACT, LDA,
  492. $ RWORK, RWORK( NRHS+1 ), RESULT( 5 ) )
  493. *
  494. * Print information about the tests that did not pass the
  495. * threshold.
  496. *
  497. DO 70 K = 2, 6
  498. IF( RESULT( K ).GE.THRESH ) THEN
  499. IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
  500. $ CALL ALAHD( NOUT, PATH )
  501. WRITE( NOUT, FMT = 9998 )UPLO, N, NRHS, IMAT,
  502. $ K, RESULT( K )
  503. NFAIL = NFAIL + 1
  504. END IF
  505. 70 CONTINUE
  506. NRUN = NRUN + 5
  507. *
  508. 80 CONTINUE
  509. 90 CONTINUE
  510. *
  511. *+ TEST 7
  512. * Estimate the reciprocal of the condition number of the
  513. * matrix.
  514. *
  515. 100 CONTINUE
  516. SRNAMT = 'CPTCON'
  517. CALL CPTCON( N, D( N+1 ), E( N+1 ), ANORM, RCOND, RWORK,
  518. $ INFO )
  519. *
  520. * Check error code from CPTCON.
  521. *
  522. IF( INFO.NE.0 )
  523. $ CALL ALAERH( PATH, 'CPTCON', INFO, 0, ' ', N, N, -1, -1,
  524. $ -1, IMAT, NFAIL, NERRS, NOUT )
  525. *
  526. RESULT( 7 ) = SGET06( RCOND, RCONDC )
  527. *
  528. * Print the test ratio if greater than or equal to THRESH.
  529. *
  530. IF( RESULT( 7 ).GE.THRESH ) THEN
  531. IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
  532. $ CALL ALAHD( NOUT, PATH )
  533. WRITE( NOUT, FMT = 9999 )N, IMAT, 7, RESULT( 7 )
  534. NFAIL = NFAIL + 1
  535. END IF
  536. NRUN = NRUN + 1
  537. 110 CONTINUE
  538. 120 CONTINUE
  539. *
  540. * Print a summary of the results.
  541. *
  542. CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
  543. *
  544. 9999 FORMAT( ' N =', I5, ', type ', I2, ', test ', I2, ', ratio = ',
  545. $ G12.5 )
  546. 9998 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NRHS =', I3,
  547. $ ', type ', I2, ', test ', I2, ', ratio = ', G12.5 )
  548. RETURN
  549. *
  550. * End of CCHKPT
  551. *
  552. END