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.

cget35.f 7.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. *> \brief \b CGET35
  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 CGET35( RMAX, LMAX, NINFO, KNT, NIN )
  12. *
  13. * .. Scalar Arguments ..
  14. * INTEGER KNT, LMAX, NIN, NINFO
  15. * REAL RMAX
  16. * ..
  17. *
  18. *
  19. *> \par Purpose:
  20. * =============
  21. *>
  22. *> \verbatim
  23. *>
  24. *> CGET35 tests CTRSYL, a routine for solving the Sylvester matrix
  25. *> equation
  26. *>
  27. *> op(A)*X + ISGN*X*op(B) = scale*C,
  28. *>
  29. *> A and B are assumed to be in Schur canonical form, op() represents an
  30. *> optional transpose, and ISGN can be -1 or +1. Scale is an output
  31. *> less than or equal to 1, chosen to avoid overflow in X.
  32. *>
  33. *> The test code verifies that the following residual is order 1:
  34. *>
  35. *> norm(op(A)*X + ISGN*X*op(B) - scale*C) /
  36. *> (EPS*max(norm(A),norm(B))*norm(X))
  37. *> \endverbatim
  38. *
  39. * Arguments:
  40. * ==========
  41. *
  42. *> \param[out] RMAX
  43. *> \verbatim
  44. *> RMAX is REAL
  45. *> Value of the largest test ratio.
  46. *> \endverbatim
  47. *>
  48. *> \param[out] LMAX
  49. *> \verbatim
  50. *> LMAX is INTEGER
  51. *> Example number where largest test ratio achieved.
  52. *> \endverbatim
  53. *>
  54. *> \param[out] NINFO
  55. *> \verbatim
  56. *> NINFO is INTEGER
  57. *> Number of examples where INFO is nonzero.
  58. *> \endverbatim
  59. *>
  60. *> \param[out] KNT
  61. *> \verbatim
  62. *> KNT is INTEGER
  63. *> Total number of examples tested.
  64. *> \endverbatim
  65. *>
  66. *> \param[in] NIN
  67. *> \verbatim
  68. *> NIN is INTEGER
  69. *> Input logical unit number.
  70. *> \endverbatim
  71. *
  72. * Authors:
  73. * ========
  74. *
  75. *> \author Univ. of Tennessee
  76. *> \author Univ. of California Berkeley
  77. *> \author Univ. of Colorado Denver
  78. *> \author NAG Ltd.
  79. *
  80. *> \ingroup complex_eig
  81. *
  82. * =====================================================================
  83. SUBROUTINE CGET35( RMAX, LMAX, NINFO, KNT, NIN )
  84. *
  85. * -- LAPACK test routine --
  86. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  87. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  88. *
  89. * .. Scalar Arguments ..
  90. INTEGER KNT, LMAX, NIN, NINFO
  91. REAL RMAX
  92. * ..
  93. *
  94. * =====================================================================
  95. *
  96. * .. Parameters ..
  97. INTEGER LDT
  98. PARAMETER ( LDT = 10 )
  99. REAL ZERO, ONE, TWO
  100. PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
  101. REAL LARGE
  102. PARAMETER ( LARGE = 1.0E6 )
  103. COMPLEX CONE
  104. PARAMETER ( CONE = 1.0E0 )
  105. * ..
  106. * .. Local Scalars ..
  107. CHARACTER TRANA, TRANB
  108. INTEGER I, IMLA, IMLAD, IMLB, IMLC, INFO, ISGN, ITRANA,
  109. $ ITRANB, J, M, N
  110. REAL BIGNUM, EPS, RES, RES1, SCALE, SMLNUM, TNRM,
  111. $ XNRM
  112. COMPLEX RMUL
  113. * ..
  114. * .. Local Arrays ..
  115. REAL DUM( 1 ), VM1( 3 ), VM2( 3 )
  116. COMPLEX A( LDT, LDT ), ATMP( LDT, LDT ), B( LDT, LDT ),
  117. $ BTMP( LDT, LDT ), C( LDT, LDT ),
  118. $ CSAV( LDT, LDT ), CTMP( LDT, LDT )
  119. * ..
  120. * .. External Functions ..
  121. REAL CLANGE, SLAMCH
  122. EXTERNAL CLANGE, SLAMCH
  123. * ..
  124. * .. External Subroutines ..
  125. EXTERNAL CGEMM, CTRSYL
  126. * ..
  127. * .. Intrinsic Functions ..
  128. INTRINSIC ABS, MAX, REAL, SQRT
  129. * ..
  130. * .. Executable Statements ..
  131. *
  132. * Get machine parameters
  133. *
  134. EPS = SLAMCH( 'P' )
  135. SMLNUM = SLAMCH( 'S' ) / EPS
  136. BIGNUM = ONE / SMLNUM
  137. CALL SLABAD( SMLNUM, BIGNUM )
  138. *
  139. * Set up test case parameters
  140. *
  141. VM1( 1 ) = SQRT( SMLNUM )
  142. VM1( 2 ) = ONE
  143. VM1( 3 ) = LARGE
  144. VM2( 1 ) = ONE
  145. VM2( 2 ) = ONE + TWO*EPS
  146. VM2( 3 ) = TWO
  147. *
  148. KNT = 0
  149. NINFO = 0
  150. LMAX = 0
  151. RMAX = ZERO
  152. *
  153. * Begin test loop
  154. *
  155. 10 CONTINUE
  156. READ( NIN, FMT = * )M, N
  157. IF( N.EQ.0 )
  158. $ RETURN
  159. DO 20 I = 1, M
  160. READ( NIN, FMT = * )( ATMP( I, J ), J = 1, M )
  161. 20 CONTINUE
  162. DO 30 I = 1, N
  163. READ( NIN, FMT = * )( BTMP( I, J ), J = 1, N )
  164. 30 CONTINUE
  165. DO 40 I = 1, M
  166. READ( NIN, FMT = * )( CTMP( I, J ), J = 1, N )
  167. 40 CONTINUE
  168. DO 170 IMLA = 1, 3
  169. DO 160 IMLAD = 1, 3
  170. DO 150 IMLB = 1, 3
  171. DO 140 IMLC = 1, 3
  172. DO 130 ITRANA = 1, 2
  173. DO 120 ITRANB = 1, 2
  174. DO 110 ISGN = -1, 1, 2
  175. IF( ITRANA.EQ.1 )
  176. $ TRANA = 'N'
  177. IF( ITRANA.EQ.2 )
  178. $ TRANA = 'C'
  179. IF( ITRANB.EQ.1 )
  180. $ TRANB = 'N'
  181. IF( ITRANB.EQ.2 )
  182. $ TRANB = 'C'
  183. TNRM = ZERO
  184. DO 60 I = 1, M
  185. DO 50 J = 1, M
  186. A( I, J ) = ATMP( I, J )*VM1( IMLA )
  187. TNRM = MAX( TNRM, ABS( A( I, J ) ) )
  188. 50 CONTINUE
  189. A( I, I ) = A( I, I )*VM2( IMLAD )
  190. TNRM = MAX( TNRM, ABS( A( I, I ) ) )
  191. 60 CONTINUE
  192. DO 80 I = 1, N
  193. DO 70 J = 1, N
  194. B( I, J ) = BTMP( I, J )*VM1( IMLB )
  195. TNRM = MAX( TNRM, ABS( B( I, J ) ) )
  196. 70 CONTINUE
  197. 80 CONTINUE
  198. IF( TNRM.EQ.ZERO )
  199. $ TNRM = ONE
  200. DO 100 I = 1, M
  201. DO 90 J = 1, N
  202. C( I, J ) = CTMP( I, J )*VM1( IMLC )
  203. CSAV( I, J ) = C( I, J )
  204. 90 CONTINUE
  205. 100 CONTINUE
  206. KNT = KNT + 1
  207. CALL CTRSYL( TRANA, TRANB, ISGN, M, N, A,
  208. $ LDT, B, LDT, C, LDT, SCALE,
  209. $ INFO )
  210. IF( INFO.NE.0 )
  211. $ NINFO = NINFO + 1
  212. XNRM = CLANGE( 'M', M, N, C, LDT, DUM )
  213. RMUL = CONE
  214. IF( XNRM.GT.ONE .AND. TNRM.GT.ONE ) THEN
  215. IF( XNRM.GT.BIGNUM / TNRM ) THEN
  216. RMUL = MAX( XNRM, TNRM )
  217. RMUL = CONE / RMUL
  218. END IF
  219. END IF
  220. CALL CGEMM( TRANA, 'N', M, N, M, RMUL, A,
  221. $ LDT, C, LDT, -SCALE*RMUL, CSAV,
  222. $ LDT )
  223. CALL CGEMM( 'N', TRANB, M, N, N,
  224. $ REAL( ISGN )*RMUL, C, LDT, B,
  225. $ LDT, CONE, CSAV, LDT )
  226. RES1 = CLANGE( 'M', M, N, CSAV, LDT, DUM )
  227. RES = RES1 / MAX( SMLNUM, SMLNUM*XNRM,
  228. $ ( ( ABS( RMUL )*TNRM )*EPS )*XNRM )
  229. IF( RES.GT.RMAX ) THEN
  230. LMAX = KNT
  231. RMAX = RES
  232. END IF
  233. 110 CONTINUE
  234. 120 CONTINUE
  235. 130 CONTINUE
  236. 140 CONTINUE
  237. 150 CONTINUE
  238. 160 CONTINUE
  239. 170 CONTINUE
  240. GO TO 10
  241. *
  242. * End of CGET35
  243. *
  244. END