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.

dget36.f 6.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. *> \brief \b DGET36
  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 DGET36( RMAX, LMAX, NINFO, KNT, NIN )
  12. *
  13. * .. Scalar Arguments ..
  14. * INTEGER KNT, LMAX, NIN
  15. * DOUBLE PRECISION RMAX
  16. * ..
  17. * .. Array Arguments ..
  18. * INTEGER NINFO( 3 )
  19. * ..
  20. *
  21. *
  22. *> \par Purpose:
  23. * =============
  24. *>
  25. *> \verbatim
  26. *>
  27. *> DGET36 tests DTREXC, a routine for moving blocks (either 1 by 1 or
  28. *> 2 by 2) on the diagonal of a matrix in real Schur form. Thus, DLAEXC
  29. *> computes an orthogonal matrix Q such that
  30. *>
  31. *> Q' * T1 * Q = T2
  32. *>
  33. *> and where one of the diagonal blocks of T1 (the one at row IFST) has
  34. *> been moved to position ILST.
  35. *>
  36. *> The test code verifies that the residual Q'*T1*Q-T2 is small, that T2
  37. *> is in Schur form, and that the final position of the IFST block is
  38. *> ILST (within +-1).
  39. *>
  40. *> The test matrices are read from a file with logical unit number NIN.
  41. *> \endverbatim
  42. *
  43. * Arguments:
  44. * ==========
  45. *
  46. *> \param[out] RMAX
  47. *> \verbatim
  48. *> RMAX is DOUBLE PRECISION
  49. *> Value of the largest test ratio.
  50. *> \endverbatim
  51. *>
  52. *> \param[out] LMAX
  53. *> \verbatim
  54. *> LMAX is INTEGER
  55. *> Example number where largest test ratio achieved.
  56. *> \endverbatim
  57. *>
  58. *> \param[out] NINFO
  59. *> \verbatim
  60. *> NINFO is INTEGER array, dimension (3)
  61. *> NINFO(J) is the number of examples where INFO=J.
  62. *> \endverbatim
  63. *>
  64. *> \param[out] KNT
  65. *> \verbatim
  66. *> KNT is INTEGER
  67. *> Total number of examples tested.
  68. *> \endverbatim
  69. *>
  70. *> \param[in] NIN
  71. *> \verbatim
  72. *> NIN is INTEGER
  73. *> Input logical unit number.
  74. *> \endverbatim
  75. *
  76. * Authors:
  77. * ========
  78. *
  79. *> \author Univ. of Tennessee
  80. *> \author Univ. of California Berkeley
  81. *> \author Univ. of Colorado Denver
  82. *> \author NAG Ltd.
  83. *
  84. *> \date November 2011
  85. *
  86. *> \ingroup double_eig
  87. *
  88. * =====================================================================
  89. SUBROUTINE DGET36( RMAX, LMAX, NINFO, KNT, NIN )
  90. *
  91. * -- LAPACK test routine (version 3.4.0) --
  92. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  93. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  94. * November 2011
  95. *
  96. * .. Scalar Arguments ..
  97. INTEGER KNT, LMAX, NIN
  98. DOUBLE PRECISION RMAX
  99. * ..
  100. * .. Array Arguments ..
  101. INTEGER NINFO( 3 )
  102. * ..
  103. *
  104. * =====================================================================
  105. *
  106. * .. Parameters ..
  107. DOUBLE PRECISION ZERO, ONE
  108. PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
  109. INTEGER LDT, LWORK
  110. PARAMETER ( LDT = 10, LWORK = 2*LDT*LDT )
  111. * ..
  112. * .. Local Scalars ..
  113. INTEGER I, IFST, IFST1, IFST2, IFSTSV, ILST, ILST1,
  114. $ ILST2, ILSTSV, INFO1, INFO2, J, LOC, N
  115. DOUBLE PRECISION EPS, RES
  116. * ..
  117. * .. Local Arrays ..
  118. DOUBLE PRECISION Q( LDT, LDT ), RESULT( 2 ), T1( LDT, LDT ),
  119. $ T2( LDT, LDT ), TMP( LDT, LDT ), WORK( LWORK )
  120. * ..
  121. * .. External Functions ..
  122. DOUBLE PRECISION DLAMCH
  123. EXTERNAL DLAMCH
  124. * ..
  125. * .. External Subroutines ..
  126. EXTERNAL DHST01, DLACPY, DLASET, DTREXC
  127. * ..
  128. * .. Intrinsic Functions ..
  129. INTRINSIC ABS, SIGN
  130. * ..
  131. * .. Executable Statements ..
  132. *
  133. EPS = DLAMCH( 'P' )
  134. RMAX = ZERO
  135. LMAX = 0
  136. KNT = 0
  137. NINFO( 1 ) = 0
  138. NINFO( 2 ) = 0
  139. NINFO( 3 ) = 0
  140. *
  141. * Read input data until N=0
  142. *
  143. 10 CONTINUE
  144. READ( NIN, FMT = * )N, IFST, ILST
  145. IF( N.EQ.0 )
  146. $ RETURN
  147. KNT = KNT + 1
  148. DO 20 I = 1, N
  149. READ( NIN, FMT = * )( TMP( I, J ), J = 1, N )
  150. 20 CONTINUE
  151. CALL DLACPY( 'F', N, N, TMP, LDT, T1, LDT )
  152. CALL DLACPY( 'F', N, N, TMP, LDT, T2, LDT )
  153. IFSTSV = IFST
  154. ILSTSV = ILST
  155. IFST1 = IFST
  156. ILST1 = ILST
  157. IFST2 = IFST
  158. ILST2 = ILST
  159. RES = ZERO
  160. *
  161. * Test without accumulating Q
  162. *
  163. CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDT )
  164. CALL DTREXC( 'N', N, T1, LDT, Q, LDT, IFST1, ILST1, WORK, INFO1 )
  165. DO 40 I = 1, N
  166. DO 30 J = 1, N
  167. IF( I.EQ.J .AND. Q( I, J ).NE.ONE )
  168. $ RES = RES + ONE / EPS
  169. IF( I.NE.J .AND. Q( I, J ).NE.ZERO )
  170. $ RES = RES + ONE / EPS
  171. 30 CONTINUE
  172. 40 CONTINUE
  173. *
  174. * Test with accumulating Q
  175. *
  176. CALL DLASET( 'Full', N, N, ZERO, ONE, Q, LDT )
  177. CALL DTREXC( 'V', N, T2, LDT, Q, LDT, IFST2, ILST2, WORK, INFO2 )
  178. *
  179. * Compare T1 with T2
  180. *
  181. DO 60 I = 1, N
  182. DO 50 J = 1, N
  183. IF( T1( I, J ).NE.T2( I, J ) )
  184. $ RES = RES + ONE / EPS
  185. 50 CONTINUE
  186. 60 CONTINUE
  187. IF( IFST1.NE.IFST2 )
  188. $ RES = RES + ONE / EPS
  189. IF( ILST1.NE.ILST2 )
  190. $ RES = RES + ONE / EPS
  191. IF( INFO1.NE.INFO2 )
  192. $ RES = RES + ONE / EPS
  193. *
  194. * Test for successful reordering of T2
  195. *
  196. IF( INFO2.NE.0 ) THEN
  197. NINFO( INFO2 ) = NINFO( INFO2 ) + 1
  198. ELSE
  199. IF( ABS( IFST2-IFSTSV ).GT.1 )
  200. $ RES = RES + ONE / EPS
  201. IF( ABS( ILST2-ILSTSV ).GT.1 )
  202. $ RES = RES + ONE / EPS
  203. END IF
  204. *
  205. * Test for small residual, and orthogonality of Q
  206. *
  207. CALL DHST01( N, 1, N, TMP, LDT, T2, LDT, Q, LDT, WORK, LWORK,
  208. $ RESULT )
  209. RES = RES + RESULT( 1 ) + RESULT( 2 )
  210. *
  211. * Test for T2 being in Schur form
  212. *
  213. LOC = 1
  214. 70 CONTINUE
  215. IF( T2( LOC+1, LOC ).NE.ZERO ) THEN
  216. *
  217. * 2 by 2 block
  218. *
  219. IF( T2( LOC, LOC+1 ).EQ.ZERO .OR. T2( LOC, LOC ).NE.
  220. $ T2( LOC+1, LOC+1 ) .OR. SIGN( ONE, T2( LOC, LOC+1 ) ).EQ.
  221. $ SIGN( ONE, T2( LOC+1, LOC ) ) )RES = RES + ONE / EPS
  222. DO 80 I = LOC + 2, N
  223. IF( T2( I, LOC ).NE.ZERO )
  224. $ RES = RES + ONE / RES
  225. IF( T2( I, LOC+1 ).NE.ZERO )
  226. $ RES = RES + ONE / RES
  227. 80 CONTINUE
  228. LOC = LOC + 2
  229. ELSE
  230. *
  231. * 1 by 1 block
  232. *
  233. DO 90 I = LOC + 1, N
  234. IF( T2( I, LOC ).NE.ZERO )
  235. $ RES = RES + ONE / RES
  236. 90 CONTINUE
  237. LOC = LOC + 1
  238. END IF
  239. IF( LOC.LT.N )
  240. $ GO TO 70
  241. IF( RES.GT.RMAX ) THEN
  242. RMAX = RES
  243. LMAX = KNT
  244. END IF
  245. GO TO 10
  246. *
  247. * End of DGET36
  248. *
  249. END