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.

cget36.f 5.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. *> \brief \b CGET36
  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 CGET36( 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. *> CGET36 tests CTREXC, a routine for reordering diagonal entries of a
  25. *> matrix in complex Schur form. Thus, CLAEXC computes a unitary matrix
  26. *> Q such that
  27. *>
  28. *> Q' * T1 * Q = T2
  29. *>
  30. *> and where one of the diagonal blocks of T1 (the one at row IFST) has
  31. *> been moved to position ILST.
  32. *>
  33. *> The test code verifies that the residual Q'*T1*Q-T2 is small, that T2
  34. *> is in Schur form, and that the final position of the IFST block is
  35. *> ILST.
  36. *>
  37. *> The test matrices are read from a file with logical unit number NIN.
  38. *> \endverbatim
  39. *
  40. * Arguments:
  41. * ==========
  42. *
  43. *> \param[out] RMAX
  44. *> \verbatim
  45. *> RMAX is REAL
  46. *> Value of the largest test ratio.
  47. *> \endverbatim
  48. *>
  49. *> \param[out] LMAX
  50. *> \verbatim
  51. *> LMAX is INTEGER
  52. *> Example number where largest test ratio achieved.
  53. *> \endverbatim
  54. *>
  55. *> \param[out] NINFO
  56. *> \verbatim
  57. *> NINFO is INTEGER
  58. *> Number of examples where INFO is nonzero.
  59. *> \endverbatim
  60. *>
  61. *> \param[out] KNT
  62. *> \verbatim
  63. *> KNT is INTEGER
  64. *> Total number of examples tested.
  65. *> \endverbatim
  66. *>
  67. *> \param[in] NIN
  68. *> \verbatim
  69. *> NIN is INTEGER
  70. *> Input logical unit number.
  71. *> \endverbatim
  72. *
  73. * Authors:
  74. * ========
  75. *
  76. *> \author Univ. of Tennessee
  77. *> \author Univ. of California Berkeley
  78. *> \author Univ. of Colorado Denver
  79. *> \author NAG Ltd.
  80. *
  81. *> \date December 2016
  82. *
  83. *> \ingroup complex_eig
  84. *
  85. * =====================================================================
  86. SUBROUTINE CGET36( RMAX, LMAX, NINFO, KNT, NIN )
  87. *
  88. * -- LAPACK test routine (version 3.7.0) --
  89. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  90. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  91. * December 2016
  92. *
  93. * .. Scalar Arguments ..
  94. INTEGER KNT, LMAX, NIN, NINFO
  95. REAL RMAX
  96. * ..
  97. *
  98. * =====================================================================
  99. *
  100. * .. Parameters ..
  101. REAL ZERO, ONE
  102. PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
  103. COMPLEX CZERO, CONE
  104. PARAMETER ( CZERO = ( 0.0E+0, 0.0E+0 ),
  105. $ CONE = ( 1.0E+0, 0.0E+0 ) )
  106. INTEGER LDT, LWORK
  107. PARAMETER ( LDT = 10, LWORK = 2*LDT*LDT )
  108. * ..
  109. * .. Local Scalars ..
  110. INTEGER I, IFST, ILST, INFO1, INFO2, J, N
  111. REAL EPS, RES
  112. COMPLEX CTEMP
  113. * ..
  114. * .. Local Arrays ..
  115. REAL RESULT( 2 ), RWORK( LDT )
  116. COMPLEX DIAG( LDT ), Q( LDT, LDT ), T1( LDT, LDT ),
  117. $ T2( LDT, LDT ), TMP( LDT, LDT ), WORK( LWORK )
  118. * ..
  119. * .. External Functions ..
  120. REAL SLAMCH
  121. EXTERNAL SLAMCH
  122. * ..
  123. * .. External Subroutines ..
  124. EXTERNAL CCOPY, CHST01, CLACPY, CLASET, CTREXC
  125. * ..
  126. * .. Executable Statements ..
  127. *
  128. EPS = SLAMCH( 'P' )
  129. RMAX = ZERO
  130. LMAX = 0
  131. KNT = 0
  132. NINFO = 0
  133. *
  134. * Read input data until N=0
  135. *
  136. 10 CONTINUE
  137. READ( NIN, FMT = * )N, IFST, ILST
  138. IF( N.EQ.0 )
  139. $ RETURN
  140. KNT = KNT + 1
  141. DO 20 I = 1, N
  142. READ( NIN, FMT = * )( TMP( I, J ), J = 1, N )
  143. 20 CONTINUE
  144. CALL CLACPY( 'F', N, N, TMP, LDT, T1, LDT )
  145. CALL CLACPY( 'F', N, N, TMP, LDT, T2, LDT )
  146. RES = ZERO
  147. *
  148. * Test without accumulating Q
  149. *
  150. CALL CLASET( 'Full', N, N, CZERO, CONE, Q, LDT )
  151. CALL CTREXC( 'N', N, T1, LDT, Q, LDT, IFST, ILST, INFO1 )
  152. DO 40 I = 1, N
  153. DO 30 J = 1, N
  154. IF( I.EQ.J .AND. Q( I, J ).NE.CONE )
  155. $ RES = RES + ONE / EPS
  156. IF( I.NE.J .AND. Q( I, J ).NE.CZERO )
  157. $ RES = RES + ONE / EPS
  158. 30 CONTINUE
  159. 40 CONTINUE
  160. *
  161. * Test with accumulating Q
  162. *
  163. CALL CLASET( 'Full', N, N, CZERO, CONE, Q, LDT )
  164. CALL CTREXC( 'V', N, T2, LDT, Q, LDT, IFST, ILST, INFO2 )
  165. *
  166. * Compare T1 with T2
  167. *
  168. DO 60 I = 1, N
  169. DO 50 J = 1, N
  170. IF( T1( I, J ).NE.T2( I, J ) )
  171. $ RES = RES + ONE / EPS
  172. 50 CONTINUE
  173. 60 CONTINUE
  174. IF( INFO1.NE.0 .OR. INFO2.NE.0 )
  175. $ NINFO = NINFO + 1
  176. IF( INFO1.NE.INFO2 )
  177. $ RES = RES + ONE / EPS
  178. *
  179. * Test for successful reordering of T2
  180. *
  181. CALL CCOPY( N, TMP, LDT+1, DIAG, 1 )
  182. IF( IFST.LT.ILST ) THEN
  183. DO 70 I = IFST + 1, ILST
  184. CTEMP = DIAG( I )
  185. DIAG( I ) = DIAG( I-1 )
  186. DIAG( I-1 ) = CTEMP
  187. 70 CONTINUE
  188. ELSE IF( IFST.GT.ILST ) THEN
  189. DO 80 I = IFST - 1, ILST, -1
  190. CTEMP = DIAG( I+1 )
  191. DIAG( I+1 ) = DIAG( I )
  192. DIAG( I ) = CTEMP
  193. 80 CONTINUE
  194. END IF
  195. DO 90 I = 1, N
  196. IF( T2( I, I ).NE.DIAG( I ) )
  197. $ RES = RES + ONE / EPS
  198. 90 CONTINUE
  199. *
  200. * Test for small residual, and orthogonality of Q
  201. *
  202. CALL CHST01( N, 1, N, TMP, LDT, T2, LDT, Q, LDT, WORK, LWORK,
  203. $ RWORK, RESULT )
  204. RES = RES + RESULT( 1 ) + RESULT( 2 )
  205. *
  206. * Test for T2 being in Schur form
  207. *
  208. DO 110 J = 1, N - 1
  209. DO 100 I = J + 1, N
  210. IF( T2( I, J ).NE.CZERO )
  211. $ RES = RES + ONE / EPS
  212. 100 CONTINUE
  213. 110 CONTINUE
  214. IF( RES.GT.RMAX ) THEN
  215. RMAX = RES
  216. LMAX = KNT
  217. END IF
  218. GO TO 10
  219. *
  220. * End of CGET36
  221. *
  222. END