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.

zget36.f 5.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. *> \brief \b ZGET36
  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 ZGET36( RMAX, LMAX, NINFO, KNT, NIN )
  12. *
  13. * .. Scalar Arguments ..
  14. * INTEGER KNT, LMAX, NIN, NINFO
  15. * DOUBLE PRECISION RMAX
  16. * ..
  17. *
  18. *
  19. *> \par Purpose:
  20. * =============
  21. *>
  22. *> \verbatim
  23. *>
  24. *> ZGET36 tests ZTREXC, a routine for reordering diagonal entries of a
  25. *> matrix in complex Schur form. Thus, ZLAEXC 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 DOUBLE PRECISION
  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. *> \ingroup complex16_eig
  82. *
  83. * =====================================================================
  84. SUBROUTINE ZGET36( RMAX, LMAX, NINFO, KNT, NIN )
  85. *
  86. * -- LAPACK test routine --
  87. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  88. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  89. *
  90. * .. Scalar Arguments ..
  91. INTEGER KNT, LMAX, NIN, NINFO
  92. DOUBLE PRECISION RMAX
  93. * ..
  94. *
  95. * =====================================================================
  96. *
  97. * .. Parameters ..
  98. DOUBLE PRECISION ZERO, ONE
  99. PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
  100. COMPLEX*16 CZERO, CONE
  101. PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ),
  102. $ CONE = ( 1.0D+0, 0.0D+0 ) )
  103. INTEGER LDT, LWORK
  104. PARAMETER ( LDT = 10, LWORK = 2*LDT*LDT )
  105. * ..
  106. * .. Local Scalars ..
  107. INTEGER I, IFST, ILST, INFO1, INFO2, J, N
  108. DOUBLE PRECISION EPS, RES
  109. COMPLEX*16 CTEMP
  110. * ..
  111. * .. Local Arrays ..
  112. DOUBLE PRECISION RESULT( 2 ), RWORK( LDT )
  113. COMPLEX*16 DIAG( LDT ), Q( LDT, LDT ), T1( LDT, LDT ),
  114. $ T2( LDT, LDT ), TMP( LDT, LDT ), WORK( LWORK )
  115. * ..
  116. * .. External Functions ..
  117. DOUBLE PRECISION DLAMCH
  118. EXTERNAL DLAMCH
  119. * ..
  120. * .. External Subroutines ..
  121. EXTERNAL ZCOPY, ZHST01, ZLACPY, ZLASET, ZTREXC
  122. * ..
  123. * .. Executable Statements ..
  124. *
  125. EPS = DLAMCH( 'P' )
  126. RMAX = ZERO
  127. LMAX = 0
  128. KNT = 0
  129. NINFO = 0
  130. *
  131. * Read input data until N=0
  132. *
  133. 10 CONTINUE
  134. READ( NIN, FMT = * )N, IFST, ILST
  135. IF( N.EQ.0 )
  136. $ RETURN
  137. KNT = KNT + 1
  138. DO 20 I = 1, N
  139. READ( NIN, FMT = * )( TMP( I, J ), J = 1, N )
  140. 20 CONTINUE
  141. CALL ZLACPY( 'F', N, N, TMP, LDT, T1, LDT )
  142. CALL ZLACPY( 'F', N, N, TMP, LDT, T2, LDT )
  143. RES = ZERO
  144. *
  145. * Test without accumulating Q
  146. *
  147. CALL ZLASET( 'Full', N, N, CZERO, CONE, Q, LDT )
  148. CALL ZTREXC( 'N', N, T1, LDT, Q, LDT, IFST, ILST, INFO1 )
  149. DO 40 I = 1, N
  150. DO 30 J = 1, N
  151. IF( I.EQ.J .AND. Q( I, J ).NE.CONE )
  152. $ RES = RES + ONE / EPS
  153. IF( I.NE.J .AND. Q( I, J ).NE.CZERO )
  154. $ RES = RES + ONE / EPS
  155. 30 CONTINUE
  156. 40 CONTINUE
  157. *
  158. * Test with accumulating Q
  159. *
  160. CALL ZLASET( 'Full', N, N, CZERO, CONE, Q, LDT )
  161. CALL ZTREXC( 'V', N, T2, LDT, Q, LDT, IFST, ILST, INFO2 )
  162. *
  163. * Compare T1 with T2
  164. *
  165. DO 60 I = 1, N
  166. DO 50 J = 1, N
  167. IF( T1( I, J ).NE.T2( I, J ) )
  168. $ RES = RES + ONE / EPS
  169. 50 CONTINUE
  170. 60 CONTINUE
  171. IF( INFO1.NE.0 .OR. INFO2.NE.0 )
  172. $ NINFO = NINFO + 1
  173. IF( INFO1.NE.INFO2 )
  174. $ RES = RES + ONE / EPS
  175. *
  176. * Test for successful reordering of T2
  177. *
  178. CALL ZCOPY( N, TMP, LDT+1, DIAG, 1 )
  179. IF( IFST.LT.ILST ) THEN
  180. DO 70 I = IFST + 1, ILST
  181. CTEMP = DIAG( I )
  182. DIAG( I ) = DIAG( I-1 )
  183. DIAG( I-1 ) = CTEMP
  184. 70 CONTINUE
  185. ELSE IF( IFST.GT.ILST ) THEN
  186. DO 80 I = IFST - 1, ILST, -1
  187. CTEMP = DIAG( I+1 )
  188. DIAG( I+1 ) = DIAG( I )
  189. DIAG( I ) = CTEMP
  190. 80 CONTINUE
  191. END IF
  192. DO 90 I = 1, N
  193. IF( T2( I, I ).NE.DIAG( I ) )
  194. $ RES = RES + ONE / EPS
  195. 90 CONTINUE
  196. *
  197. * Test for small residual, and orthogonality of Q
  198. *
  199. CALL ZHST01( N, 1, N, TMP, LDT, T2, LDT, Q, LDT, WORK, LWORK,
  200. $ RWORK, RESULT )
  201. RES = RES + RESULT( 1 ) + RESULT( 2 )
  202. *
  203. * Test for T2 being in Schur form
  204. *
  205. DO 110 J = 1, N - 1
  206. DO 100 I = J + 1, N
  207. IF( T2( I, J ).NE.CZERO )
  208. $ RES = RES + ONE / EPS
  209. 100 CONTINUE
  210. 110 CONTINUE
  211. IF( RES.GT.RMAX ) THEN
  212. RMAX = RES
  213. LMAX = KNT
  214. END IF
  215. GO TO 10
  216. *
  217. * End of ZGET36
  218. *
  219. END