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.

cgerfs.f 13 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. *> \brief \b CGERFS
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download CGERFS + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cgerfs.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cgerfs.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cgerfs.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE CGERFS( TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV, B, LDB,
  22. * X, LDX, FERR, BERR, WORK, RWORK, INFO )
  23. *
  24. * .. Scalar Arguments ..
  25. * CHARACTER TRANS
  26. * INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
  27. * ..
  28. * .. Array Arguments ..
  29. * INTEGER IPIV( * )
  30. * REAL BERR( * ), FERR( * ), RWORK( * )
  31. * COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
  32. * $ WORK( * ), X( LDX, * )
  33. * ..
  34. *
  35. *
  36. *> \par Purpose:
  37. * =============
  38. *>
  39. *> \verbatim
  40. *>
  41. *> CGERFS improves the computed solution to a system of linear
  42. *> equations and provides error bounds and backward error estimates for
  43. *> the solution.
  44. *> \endverbatim
  45. *
  46. * Arguments:
  47. * ==========
  48. *
  49. *> \param[in] TRANS
  50. *> \verbatim
  51. *> TRANS is CHARACTER*1
  52. *> Specifies the form of the system of equations:
  53. *> = 'N': A * X = B (No transpose)
  54. *> = 'T': A**T * X = B (Transpose)
  55. *> = 'C': A**H * X = B (Conjugate transpose)
  56. *> \endverbatim
  57. *>
  58. *> \param[in] N
  59. *> \verbatim
  60. *> N is INTEGER
  61. *> The order of the matrix A. N >= 0.
  62. *> \endverbatim
  63. *>
  64. *> \param[in] NRHS
  65. *> \verbatim
  66. *> NRHS is INTEGER
  67. *> The number of right hand sides, i.e., the number of columns
  68. *> of the matrices B and X. NRHS >= 0.
  69. *> \endverbatim
  70. *>
  71. *> \param[in] A
  72. *> \verbatim
  73. *> A is COMPLEX array, dimension (LDA,N)
  74. *> The original N-by-N matrix A.
  75. *> \endverbatim
  76. *>
  77. *> \param[in] LDA
  78. *> \verbatim
  79. *> LDA is INTEGER
  80. *> The leading dimension of the array A. LDA >= max(1,N).
  81. *> \endverbatim
  82. *>
  83. *> \param[in] AF
  84. *> \verbatim
  85. *> AF is COMPLEX array, dimension (LDAF,N)
  86. *> The factors L and U from the factorization A = P*L*U
  87. *> as computed by CGETRF.
  88. *> \endverbatim
  89. *>
  90. *> \param[in] LDAF
  91. *> \verbatim
  92. *> LDAF is INTEGER
  93. *> The leading dimension of the array AF. LDAF >= max(1,N).
  94. *> \endverbatim
  95. *>
  96. *> \param[in] IPIV
  97. *> \verbatim
  98. *> IPIV is INTEGER array, dimension (N)
  99. *> The pivot indices from CGETRF; for 1<=i<=N, row i of the
  100. *> matrix was interchanged with row IPIV(i).
  101. *> \endverbatim
  102. *>
  103. *> \param[in] B
  104. *> \verbatim
  105. *> B is COMPLEX array, dimension (LDB,NRHS)
  106. *> The right hand side matrix B.
  107. *> \endverbatim
  108. *>
  109. *> \param[in] LDB
  110. *> \verbatim
  111. *> LDB is INTEGER
  112. *> The leading dimension of the array B. LDB >= max(1,N).
  113. *> \endverbatim
  114. *>
  115. *> \param[in,out] X
  116. *> \verbatim
  117. *> X is COMPLEX array, dimension (LDX,NRHS)
  118. *> On entry, the solution matrix X, as computed by CGETRS.
  119. *> On exit, the improved solution matrix X.
  120. *> \endverbatim
  121. *>
  122. *> \param[in] LDX
  123. *> \verbatim
  124. *> LDX is INTEGER
  125. *> The leading dimension of the array X. LDX >= max(1,N).
  126. *> \endverbatim
  127. *>
  128. *> \param[out] FERR
  129. *> \verbatim
  130. *> FERR is REAL array, dimension (NRHS)
  131. *> The estimated forward error bound for each solution vector
  132. *> X(j) (the j-th column of the solution matrix X).
  133. *> If XTRUE is the true solution corresponding to X(j), FERR(j)
  134. *> is an estimated upper bound for the magnitude of the largest
  135. *> element in (X(j) - XTRUE) divided by the magnitude of the
  136. *> largest element in X(j). The estimate is as reliable as
  137. *> the estimate for RCOND, and is almost always a slight
  138. *> overestimate of the true error.
  139. *> \endverbatim
  140. *>
  141. *> \param[out] BERR
  142. *> \verbatim
  143. *> BERR is REAL array, dimension (NRHS)
  144. *> The componentwise relative backward error of each solution
  145. *> vector X(j) (i.e., the smallest relative change in
  146. *> any element of A or B that makes X(j) an exact solution).
  147. *> \endverbatim
  148. *>
  149. *> \param[out] WORK
  150. *> \verbatim
  151. *> WORK is COMPLEX array, dimension (2*N)
  152. *> \endverbatim
  153. *>
  154. *> \param[out] RWORK
  155. *> \verbatim
  156. *> RWORK is REAL array, dimension (N)
  157. *> \endverbatim
  158. *>
  159. *> \param[out] INFO
  160. *> \verbatim
  161. *> INFO is INTEGER
  162. *> = 0: successful exit
  163. *> < 0: if INFO = -i, the i-th argument had an illegal value
  164. *> \endverbatim
  165. *
  166. *> \par Internal Parameters:
  167. * =========================
  168. *>
  169. *> \verbatim
  170. *> ITMAX is the maximum number of steps of iterative refinement.
  171. *> \endverbatim
  172. *
  173. * Authors:
  174. * ========
  175. *
  176. *> \author Univ. of Tennessee
  177. *> \author Univ. of California Berkeley
  178. *> \author Univ. of Colorado Denver
  179. *> \author NAG Ltd.
  180. *
  181. *> \date December 2016
  182. *
  183. *> \ingroup complexGEcomputational
  184. *
  185. * =====================================================================
  186. SUBROUTINE CGERFS( TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV, B, LDB,
  187. $ X, LDX, FERR, BERR, WORK, RWORK, INFO )
  188. *
  189. * -- LAPACK computational routine (version 3.7.0) --
  190. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  191. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  192. * December 2016
  193. *
  194. * .. Scalar Arguments ..
  195. CHARACTER TRANS
  196. INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
  197. * ..
  198. * .. Array Arguments ..
  199. INTEGER IPIV( * )
  200. REAL BERR( * ), FERR( * ), RWORK( * )
  201. COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
  202. $ WORK( * ), X( LDX, * )
  203. * ..
  204. *
  205. * =====================================================================
  206. *
  207. * .. Parameters ..
  208. INTEGER ITMAX
  209. PARAMETER ( ITMAX = 5 )
  210. REAL ZERO
  211. PARAMETER ( ZERO = 0.0E+0 )
  212. COMPLEX ONE
  213. PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) )
  214. REAL TWO
  215. PARAMETER ( TWO = 2.0E+0 )
  216. REAL THREE
  217. PARAMETER ( THREE = 3.0E+0 )
  218. * ..
  219. * .. Local Scalars ..
  220. LOGICAL NOTRAN
  221. CHARACTER TRANSN, TRANST
  222. INTEGER COUNT, I, J, K, KASE, NZ
  223. REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
  224. COMPLEX ZDUM
  225. * ..
  226. * .. Local Arrays ..
  227. INTEGER ISAVE( 3 )
  228. * ..
  229. * .. External Functions ..
  230. LOGICAL LSAME
  231. REAL SLAMCH
  232. EXTERNAL LSAME, SLAMCH
  233. * ..
  234. * .. External Subroutines ..
  235. EXTERNAL CAXPY, CCOPY, CGEMV, CGETRS, CLACN2, XERBLA
  236. * ..
  237. * .. Intrinsic Functions ..
  238. INTRINSIC ABS, AIMAG, MAX, REAL
  239. * ..
  240. * .. Statement Functions ..
  241. REAL CABS1
  242. * ..
  243. * .. Statement Function definitions ..
  244. CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
  245. * ..
  246. * .. Executable Statements ..
  247. *
  248. * Test the input parameters.
  249. *
  250. INFO = 0
  251. NOTRAN = LSAME( TRANS, 'N' )
  252. IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT.
  253. $ LSAME( TRANS, 'C' ) ) THEN
  254. INFO = -1
  255. ELSE IF( N.LT.0 ) THEN
  256. INFO = -2
  257. ELSE IF( NRHS.LT.0 ) THEN
  258. INFO = -3
  259. ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
  260. INFO = -5
  261. ELSE IF( LDAF.LT.MAX( 1, N ) ) THEN
  262. INFO = -7
  263. ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
  264. INFO = -10
  265. ELSE IF( LDX.LT.MAX( 1, N ) ) THEN
  266. INFO = -12
  267. END IF
  268. IF( INFO.NE.0 ) THEN
  269. CALL XERBLA( 'CGERFS', -INFO )
  270. RETURN
  271. END IF
  272. *
  273. * Quick return if possible
  274. *
  275. IF( N.EQ.0 .OR. NRHS.EQ.0 ) THEN
  276. DO 10 J = 1, NRHS
  277. FERR( J ) = ZERO
  278. BERR( J ) = ZERO
  279. 10 CONTINUE
  280. RETURN
  281. END IF
  282. *
  283. IF( NOTRAN ) THEN
  284. TRANSN = 'N'
  285. TRANST = 'C'
  286. ELSE
  287. TRANSN = 'C'
  288. TRANST = 'N'
  289. END IF
  290. *
  291. * NZ = maximum number of nonzero elements in each row of A, plus 1
  292. *
  293. NZ = N + 1
  294. EPS = SLAMCH( 'Epsilon' )
  295. SAFMIN = SLAMCH( 'Safe minimum' )
  296. SAFE1 = NZ*SAFMIN
  297. SAFE2 = SAFE1 / EPS
  298. *
  299. * Do for each right hand side
  300. *
  301. DO 140 J = 1, NRHS
  302. *
  303. COUNT = 1
  304. LSTRES = THREE
  305. 20 CONTINUE
  306. *
  307. * Loop until stopping criterion is satisfied.
  308. *
  309. * Compute residual R = B - op(A) * X,
  310. * where op(A) = A, A**T, or A**H, depending on TRANS.
  311. *
  312. CALL CCOPY( N, B( 1, J ), 1, WORK, 1 )
  313. CALL CGEMV( TRANS, N, N, -ONE, A, LDA, X( 1, J ), 1, ONE, WORK,
  314. $ 1 )
  315. *
  316. * Compute componentwise relative backward error from formula
  317. *
  318. * max(i) ( abs(R(i)) / ( abs(op(A))*abs(X) + abs(B) )(i) )
  319. *
  320. * where abs(Z) is the componentwise absolute value of the matrix
  321. * or vector Z. If the i-th component of the denominator is less
  322. * than SAFE2, then SAFE1 is added to the i-th components of the
  323. * numerator and denominator before dividing.
  324. *
  325. DO 30 I = 1, N
  326. RWORK( I ) = CABS1( B( I, J ) )
  327. 30 CONTINUE
  328. *
  329. * Compute abs(op(A))*abs(X) + abs(B).
  330. *
  331. IF( NOTRAN ) THEN
  332. DO 50 K = 1, N
  333. XK = CABS1( X( K, J ) )
  334. DO 40 I = 1, N
  335. RWORK( I ) = RWORK( I ) + CABS1( A( I, K ) )*XK
  336. 40 CONTINUE
  337. 50 CONTINUE
  338. ELSE
  339. DO 70 K = 1, N
  340. S = ZERO
  341. DO 60 I = 1, N
  342. S = S + CABS1( A( I, K ) )*CABS1( X( I, J ) )
  343. 60 CONTINUE
  344. RWORK( K ) = RWORK( K ) + S
  345. 70 CONTINUE
  346. END IF
  347. S = ZERO
  348. DO 80 I = 1, N
  349. IF( RWORK( I ).GT.SAFE2 ) THEN
  350. S = MAX( S, CABS1( WORK( I ) ) / RWORK( I ) )
  351. ELSE
  352. S = MAX( S, ( CABS1( WORK( I ) )+SAFE1 ) /
  353. $ ( RWORK( I )+SAFE1 ) )
  354. END IF
  355. 80 CONTINUE
  356. BERR( J ) = S
  357. *
  358. * Test stopping criterion. Continue iterating if
  359. * 1) The residual BERR(J) is larger than machine epsilon, and
  360. * 2) BERR(J) decreased by at least a factor of 2 during the
  361. * last iteration, and
  362. * 3) At most ITMAX iterations tried.
  363. *
  364. IF( BERR( J ).GT.EPS .AND. TWO*BERR( J ).LE.LSTRES .AND.
  365. $ COUNT.LE.ITMAX ) THEN
  366. *
  367. * Update solution and try again.
  368. *
  369. CALL CGETRS( TRANS, N, 1, AF, LDAF, IPIV, WORK, N, INFO )
  370. CALL CAXPY( N, ONE, WORK, 1, X( 1, J ), 1 )
  371. LSTRES = BERR( J )
  372. COUNT = COUNT + 1
  373. GO TO 20
  374. END IF
  375. *
  376. * Bound error from formula
  377. *
  378. * norm(X - XTRUE) / norm(X) .le. FERR =
  379. * norm( abs(inv(op(A)))*
  380. * ( abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) ))) / norm(X)
  381. *
  382. * where
  383. * norm(Z) is the magnitude of the largest component of Z
  384. * inv(op(A)) is the inverse of op(A)
  385. * abs(Z) is the componentwise absolute value of the matrix or
  386. * vector Z
  387. * NZ is the maximum number of nonzeros in any row of A, plus 1
  388. * EPS is machine epsilon
  389. *
  390. * The i-th component of abs(R)+NZ*EPS*(abs(op(A))*abs(X)+abs(B))
  391. * is incremented by SAFE1 if the i-th component of
  392. * abs(op(A))*abs(X) + abs(B) is less than SAFE2.
  393. *
  394. * Use CLACN2 to estimate the infinity-norm of the matrix
  395. * inv(op(A)) * diag(W),
  396. * where W = abs(R) + NZ*EPS*( abs(op(A))*abs(X)+abs(B) )))
  397. *
  398. DO 90 I = 1, N
  399. IF( RWORK( I ).GT.SAFE2 ) THEN
  400. RWORK( I ) = CABS1( WORK( I ) ) + NZ*EPS*RWORK( I )
  401. ELSE
  402. RWORK( I ) = CABS1( WORK( I ) ) + NZ*EPS*RWORK( I ) +
  403. $ SAFE1
  404. END IF
  405. 90 CONTINUE
  406. *
  407. KASE = 0
  408. 100 CONTINUE
  409. CALL CLACN2( N, WORK( N+1 ), WORK, FERR( J ), KASE, ISAVE )
  410. IF( KASE.NE.0 ) THEN
  411. IF( KASE.EQ.1 ) THEN
  412. *
  413. * Multiply by diag(W)*inv(op(A)**H).
  414. *
  415. CALL CGETRS( TRANST, N, 1, AF, LDAF, IPIV, WORK, N,
  416. $ INFO )
  417. DO 110 I = 1, N
  418. WORK( I ) = RWORK( I )*WORK( I )
  419. 110 CONTINUE
  420. ELSE
  421. *
  422. * Multiply by inv(op(A))*diag(W).
  423. *
  424. DO 120 I = 1, N
  425. WORK( I ) = RWORK( I )*WORK( I )
  426. 120 CONTINUE
  427. CALL CGETRS( TRANSN, N, 1, AF, LDAF, IPIV, WORK, N,
  428. $ INFO )
  429. END IF
  430. GO TO 100
  431. END IF
  432. *
  433. * Normalize error.
  434. *
  435. LSTRES = ZERO
  436. DO 130 I = 1, N
  437. LSTRES = MAX( LSTRES, CABS1( X( I, J ) ) )
  438. 130 CONTINUE
  439. IF( LSTRES.NE.ZERO )
  440. $ FERR( J ) = FERR( J ) / LSTRES
  441. *
  442. 140 CONTINUE
  443. *
  444. RETURN
  445. *
  446. * End of CGERFS
  447. *
  448. END