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.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. *> \date December 2016
  81. *
  82. *> \ingroup complex_eig
  83. *
  84. * =====================================================================
  85. SUBROUTINE CGET35( RMAX, LMAX, NINFO, KNT, NIN )
  86. *
  87. * -- LAPACK test routine (version 3.7.0) --
  88. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  89. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  90. * December 2016
  91. *
  92. * .. Scalar Arguments ..
  93. INTEGER KNT, LMAX, NIN, NINFO
  94. REAL RMAX
  95. * ..
  96. *
  97. * =====================================================================
  98. *
  99. * .. Parameters ..
  100. INTEGER LDT
  101. PARAMETER ( LDT = 10 )
  102. REAL ZERO, ONE, TWO
  103. PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0 )
  104. REAL LARGE
  105. PARAMETER ( LARGE = 1.0E6 )
  106. COMPLEX CONE
  107. PARAMETER ( CONE = 1.0E0 )
  108. * ..
  109. * .. Local Scalars ..
  110. CHARACTER TRANA, TRANB
  111. INTEGER I, IMLA, IMLAD, IMLB, IMLC, INFO, ISGN, ITRANA,
  112. $ ITRANB, J, M, N
  113. REAL BIGNUM, EPS, RES, RES1, SCALE, SMLNUM, TNRM,
  114. $ XNRM
  115. COMPLEX RMUL
  116. * ..
  117. * .. Local Arrays ..
  118. REAL DUM( 1 ), VM1( 3 ), VM2( 3 )
  119. COMPLEX A( LDT, LDT ), ATMP( LDT, LDT ), B( LDT, LDT ),
  120. $ BTMP( LDT, LDT ), C( LDT, LDT ),
  121. $ CSAV( LDT, LDT ), CTMP( LDT, LDT )
  122. * ..
  123. * .. External Functions ..
  124. REAL CLANGE, SLAMCH
  125. EXTERNAL CLANGE, SLAMCH
  126. * ..
  127. * .. External Subroutines ..
  128. EXTERNAL CGEMM, CTRSYL
  129. * ..
  130. * .. Intrinsic Functions ..
  131. INTRINSIC ABS, MAX, REAL, SQRT
  132. * ..
  133. * .. Executable Statements ..
  134. *
  135. * Get machine parameters
  136. *
  137. EPS = SLAMCH( 'P' )
  138. SMLNUM = SLAMCH( 'S' ) / EPS
  139. BIGNUM = ONE / SMLNUM
  140. CALL SLABAD( SMLNUM, BIGNUM )
  141. *
  142. * Set up test case parameters
  143. *
  144. VM1( 1 ) = SQRT( SMLNUM )
  145. VM1( 2 ) = ONE
  146. VM1( 3 ) = LARGE
  147. VM2( 1 ) = ONE
  148. VM2( 2 ) = ONE + TWO*EPS
  149. VM2( 3 ) = TWO
  150. *
  151. KNT = 0
  152. NINFO = 0
  153. LMAX = 0
  154. RMAX = ZERO
  155. *
  156. * Begin test loop
  157. *
  158. 10 CONTINUE
  159. READ( NIN, FMT = * )M, N
  160. IF( N.EQ.0 )
  161. $ RETURN
  162. DO 20 I = 1, M
  163. READ( NIN, FMT = * )( ATMP( I, J ), J = 1, M )
  164. 20 CONTINUE
  165. DO 30 I = 1, N
  166. READ( NIN, FMT = * )( BTMP( I, J ), J = 1, N )
  167. 30 CONTINUE
  168. DO 40 I = 1, M
  169. READ( NIN, FMT = * )( CTMP( I, J ), J = 1, N )
  170. 40 CONTINUE
  171. DO 170 IMLA = 1, 3
  172. DO 160 IMLAD = 1, 3
  173. DO 150 IMLB = 1, 3
  174. DO 140 IMLC = 1, 3
  175. DO 130 ITRANA = 1, 2
  176. DO 120 ITRANB = 1, 2
  177. DO 110 ISGN = -1, 1, 2
  178. IF( ITRANA.EQ.1 )
  179. $ TRANA = 'N'
  180. IF( ITRANA.EQ.2 )
  181. $ TRANA = 'C'
  182. IF( ITRANB.EQ.1 )
  183. $ TRANB = 'N'
  184. IF( ITRANB.EQ.2 )
  185. $ TRANB = 'C'
  186. TNRM = ZERO
  187. DO 60 I = 1, M
  188. DO 50 J = 1, M
  189. A( I, J ) = ATMP( I, J )*VM1( IMLA )
  190. TNRM = MAX( TNRM, ABS( A( I, J ) ) )
  191. 50 CONTINUE
  192. A( I, I ) = A( I, I )*VM2( IMLAD )
  193. TNRM = MAX( TNRM, ABS( A( I, I ) ) )
  194. 60 CONTINUE
  195. DO 80 I = 1, N
  196. DO 70 J = 1, N
  197. B( I, J ) = BTMP( I, J )*VM1( IMLB )
  198. TNRM = MAX( TNRM, ABS( B( I, J ) ) )
  199. 70 CONTINUE
  200. 80 CONTINUE
  201. IF( TNRM.EQ.ZERO )
  202. $ TNRM = ONE
  203. DO 100 I = 1, M
  204. DO 90 J = 1, N
  205. C( I, J ) = CTMP( I, J )*VM1( IMLC )
  206. CSAV( I, J ) = C( I, J )
  207. 90 CONTINUE
  208. 100 CONTINUE
  209. KNT = KNT + 1
  210. CALL CTRSYL( TRANA, TRANB, ISGN, M, N, A,
  211. $ LDT, B, LDT, C, LDT, SCALE,
  212. $ INFO )
  213. IF( INFO.NE.0 )
  214. $ NINFO = NINFO + 1
  215. XNRM = CLANGE( 'M', M, N, C, LDT, DUM )
  216. RMUL = CONE
  217. IF( XNRM.GT.ONE .AND. TNRM.GT.ONE ) THEN
  218. IF( XNRM.GT.BIGNUM / TNRM ) THEN
  219. RMUL = MAX( XNRM, TNRM )
  220. RMUL = CONE / RMUL
  221. END IF
  222. END IF
  223. CALL CGEMM( TRANA, 'N', M, N, M, RMUL, A,
  224. $ LDT, C, LDT, -SCALE*RMUL, CSAV,
  225. $ LDT )
  226. CALL CGEMM( 'N', TRANB, M, N, N,
  227. $ REAL( ISGN )*RMUL, C, LDT, B,
  228. $ LDT, CONE, CSAV, LDT )
  229. RES1 = CLANGE( 'M', M, N, CSAV, LDT, DUM )
  230. RES = RES1 / MAX( SMLNUM, SMLNUM*XNRM,
  231. $ ( ( ABS( RMUL )*TNRM )*EPS )*XNRM )
  232. IF( RES.GT.RMAX ) THEN
  233. LMAX = KNT
  234. RMAX = RES
  235. END IF
  236. 110 CONTINUE
  237. 120 CONTINUE
  238. 130 CONTINUE
  239. 140 CONTINUE
  240. 150 CONTINUE
  241. 160 CONTINUE
  242. 170 CONTINUE
  243. GO TO 10
  244. *
  245. * End of CGET35
  246. *
  247. END