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.

dget34.f 16 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. *> \brief \b DGET34
  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 DGET34( RMAX, LMAX, NINFO, KNT )
  12. *
  13. * .. Scalar Arguments ..
  14. * INTEGER KNT, LMAX
  15. * DOUBLE PRECISION RMAX
  16. * ..
  17. * .. Array Arguments ..
  18. * INTEGER NINFO( 2 )
  19. * ..
  20. *
  21. *
  22. *> \par Purpose:
  23. * =============
  24. *>
  25. *> \verbatim
  26. *>
  27. *> DGET34 tests DLAEXC, a routine for swapping adjacent blocks (either
  28. *> 1 by 1 or 2 by 2) on the diagonal of a matrix in real Schur form.
  29. *> Thus, DLAEXC computes an orthogonal matrix Q such that
  30. *>
  31. *> Q' * [ A B ] * Q = [ C1 B1 ]
  32. *> [ 0 C ] [ 0 A1 ]
  33. *>
  34. *> where C1 is similar to C and A1 is similar to A. Both A and C are
  35. *> assumed to be in standard form (equal diagonal entries and
  36. *> offdiagonal with differing signs) and A1 and C1 are returned with the
  37. *> same properties.
  38. *>
  39. *> The test code verifies these last last assertions, as well as that
  40. *> the residual in the above equation is small.
  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 (2)
  61. *> NINFO(J) is the number of examples where INFO=J occurred.
  62. *> \endverbatim
  63. *>
  64. *> \param[out] KNT
  65. *> \verbatim
  66. *> KNT is INTEGER
  67. *> Total number of examples tested.
  68. *> \endverbatim
  69. *
  70. * Authors:
  71. * ========
  72. *
  73. *> \author Univ. of Tennessee
  74. *> \author Univ. of California Berkeley
  75. *> \author Univ. of Colorado Denver
  76. *> \author NAG Ltd.
  77. *
  78. *> \date November 2011
  79. *
  80. *> \ingroup double_eig
  81. *
  82. * =====================================================================
  83. SUBROUTINE DGET34( RMAX, LMAX, NINFO, KNT )
  84. *
  85. * -- LAPACK test routine (version 3.4.0) --
  86. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  87. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  88. * November 2011
  89. *
  90. * .. Scalar Arguments ..
  91. INTEGER KNT, LMAX
  92. DOUBLE PRECISION RMAX
  93. * ..
  94. * .. Array Arguments ..
  95. INTEGER NINFO( 2 )
  96. * ..
  97. *
  98. * =====================================================================
  99. *
  100. * .. Parameters ..
  101. DOUBLE PRECISION ZERO, HALF, ONE
  102. PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )
  103. DOUBLE PRECISION TWO, THREE
  104. PARAMETER ( TWO = 2.0D0, THREE = 3.0D0 )
  105. INTEGER LWORK
  106. PARAMETER ( LWORK = 32 )
  107. * ..
  108. * .. Local Scalars ..
  109. INTEGER I, IA, IA11, IA12, IA21, IA22, IAM, IB, IC,
  110. $ IC11, IC12, IC21, IC22, ICM, INFO, J
  111. DOUBLE PRECISION BIGNUM, EPS, RES, SMLNUM, TNRM
  112. * ..
  113. * .. Local Arrays ..
  114. DOUBLE PRECISION Q( 4, 4 ), RESULT( 2 ), T( 4, 4 ), T1( 4, 4 ),
  115. $ VAL( 9 ), VM( 2 ), WORK( LWORK )
  116. * ..
  117. * .. External Functions ..
  118. DOUBLE PRECISION DLAMCH
  119. EXTERNAL DLAMCH
  120. * ..
  121. * .. External Subroutines ..
  122. EXTERNAL DCOPY, DHST01, DLABAD, DLAEXC
  123. * ..
  124. * .. Intrinsic Functions ..
  125. INTRINSIC ABS, DBLE, MAX, SIGN, SQRT
  126. * ..
  127. * .. Executable Statements ..
  128. *
  129. * Get machine parameters
  130. *
  131. EPS = DLAMCH( 'P' )
  132. SMLNUM = DLAMCH( 'S' ) / EPS
  133. BIGNUM = ONE / SMLNUM
  134. CALL DLABAD( SMLNUM, BIGNUM )
  135. *
  136. * Set up test case parameters
  137. *
  138. VAL( 1 ) = ZERO
  139. VAL( 2 ) = SQRT( SMLNUM )
  140. VAL( 3 ) = ONE
  141. VAL( 4 ) = TWO
  142. VAL( 5 ) = SQRT( BIGNUM )
  143. VAL( 6 ) = -SQRT( SMLNUM )
  144. VAL( 7 ) = -ONE
  145. VAL( 8 ) = -TWO
  146. VAL( 9 ) = -SQRT( BIGNUM )
  147. VM( 1 ) = ONE
  148. VM( 2 ) = ONE + TWO*EPS
  149. CALL DCOPY( 16, VAL( 4 ), 0, T( 1, 1 ), 1 )
  150. *
  151. NINFO( 1 ) = 0
  152. NINFO( 2 ) = 0
  153. KNT = 0
  154. LMAX = 0
  155. RMAX = ZERO
  156. *
  157. * Begin test loop
  158. *
  159. DO 40 IA = 1, 9
  160. DO 30 IAM = 1, 2
  161. DO 20 IB = 1, 9
  162. DO 10 IC = 1, 9
  163. T( 1, 1 ) = VAL( IA )*VM( IAM )
  164. T( 2, 2 ) = VAL( IC )
  165. T( 1, 2 ) = VAL( IB )
  166. T( 2, 1 ) = ZERO
  167. TNRM = MAX( ABS( T( 1, 1 ) ), ABS( T( 2, 2 ) ),
  168. $ ABS( T( 1, 2 ) ) )
  169. CALL DCOPY( 16, T, 1, T1, 1 )
  170. CALL DCOPY( 16, VAL( 1 ), 0, Q, 1 )
  171. CALL DCOPY( 4, VAL( 3 ), 0, Q, 5 )
  172. CALL DLAEXC( .TRUE., 2, T, 4, Q, 4, 1, 1, 1, WORK,
  173. $ INFO )
  174. IF( INFO.NE.0 )
  175. $ NINFO( INFO ) = NINFO( INFO ) + 1
  176. CALL DHST01( 2, 1, 2, T1, 4, T, 4, Q, 4, WORK, LWORK,
  177. $ RESULT )
  178. RES = RESULT( 1 ) + RESULT( 2 )
  179. IF( INFO.NE.0 )
  180. $ RES = RES + ONE / EPS
  181. IF( T( 1, 1 ).NE.T1( 2, 2 ) )
  182. $ RES = RES + ONE / EPS
  183. IF( T( 2, 2 ).NE.T1( 1, 1 ) )
  184. $ RES = RES + ONE / EPS
  185. IF( T( 2, 1 ).NE.ZERO )
  186. $ RES = RES + ONE / EPS
  187. KNT = KNT + 1
  188. IF( RES.GT.RMAX ) THEN
  189. LMAX = KNT
  190. RMAX = RES
  191. END IF
  192. 10 CONTINUE
  193. 20 CONTINUE
  194. 30 CONTINUE
  195. 40 CONTINUE
  196. *
  197. DO 110 IA = 1, 5
  198. DO 100 IAM = 1, 2
  199. DO 90 IB = 1, 5
  200. DO 80 IC11 = 1, 5
  201. DO 70 IC12 = 2, 5
  202. DO 60 IC21 = 2, 4
  203. DO 50 IC22 = -1, 1, 2
  204. T( 1, 1 ) = VAL( IA )*VM( IAM )
  205. T( 1, 2 ) = VAL( IB )
  206. T( 1, 3 ) = -TWO*VAL( IB )
  207. T( 2, 1 ) = ZERO
  208. T( 2, 2 ) = VAL( IC11 )
  209. T( 2, 3 ) = VAL( IC12 )
  210. T( 3, 1 ) = ZERO
  211. T( 3, 2 ) = -VAL( IC21 )
  212. T( 3, 3 ) = VAL( IC11 )*DBLE( IC22 )
  213. TNRM = MAX( ABS( T( 1, 1 ) ),
  214. $ ABS( T( 1, 2 ) ), ABS( T( 1, 3 ) ),
  215. $ ABS( T( 2, 2 ) ), ABS( T( 2, 3 ) ),
  216. $ ABS( T( 3, 2 ) ), ABS( T( 3, 3 ) ) )
  217. CALL DCOPY( 16, T, 1, T1, 1 )
  218. CALL DCOPY( 16, VAL( 1 ), 0, Q, 1 )
  219. CALL DCOPY( 4, VAL( 3 ), 0, Q, 5 )
  220. CALL DLAEXC( .TRUE., 3, T, 4, Q, 4, 1, 1, 2,
  221. $ WORK, INFO )
  222. IF( INFO.NE.0 )
  223. $ NINFO( INFO ) = NINFO( INFO ) + 1
  224. CALL DHST01( 3, 1, 3, T1, 4, T, 4, Q, 4,
  225. $ WORK, LWORK, RESULT )
  226. RES = RESULT( 1 ) + RESULT( 2 )
  227. IF( INFO.EQ.0 ) THEN
  228. IF( T1( 1, 1 ).NE.T( 3, 3 ) )
  229. $ RES = RES + ONE / EPS
  230. IF( T( 3, 1 ).NE.ZERO )
  231. $ RES = RES + ONE / EPS
  232. IF( T( 3, 2 ).NE.ZERO )
  233. $ RES = RES + ONE / EPS
  234. IF( T( 2, 1 ).NE.0 .AND.
  235. $ ( T( 1, 1 ).NE.T( 2,
  236. $ 2 ) .OR. SIGN( ONE, T( 1,
  237. $ 2 ) ).EQ.SIGN( ONE, T( 2, 1 ) ) ) )
  238. $ RES = RES + ONE / EPS
  239. END IF
  240. KNT = KNT + 1
  241. IF( RES.GT.RMAX ) THEN
  242. LMAX = KNT
  243. RMAX = RES
  244. END IF
  245. 50 CONTINUE
  246. 60 CONTINUE
  247. 70 CONTINUE
  248. 80 CONTINUE
  249. 90 CONTINUE
  250. 100 CONTINUE
  251. 110 CONTINUE
  252. *
  253. DO 180 IA11 = 1, 5
  254. DO 170 IA12 = 2, 5
  255. DO 160 IA21 = 2, 4
  256. DO 150 IA22 = -1, 1, 2
  257. DO 140 ICM = 1, 2
  258. DO 130 IB = 1, 5
  259. DO 120 IC = 1, 5
  260. T( 1, 1 ) = VAL( IA11 )
  261. T( 1, 2 ) = VAL( IA12 )
  262. T( 1, 3 ) = -TWO*VAL( IB )
  263. T( 2, 1 ) = -VAL( IA21 )
  264. T( 2, 2 ) = VAL( IA11 )*DBLE( IA22 )
  265. T( 2, 3 ) = VAL( IB )
  266. T( 3, 1 ) = ZERO
  267. T( 3, 2 ) = ZERO
  268. T( 3, 3 ) = VAL( IC )*VM( ICM )
  269. TNRM = MAX( ABS( T( 1, 1 ) ),
  270. $ ABS( T( 1, 2 ) ), ABS( T( 1, 3 ) ),
  271. $ ABS( T( 2, 2 ) ), ABS( T( 2, 3 ) ),
  272. $ ABS( T( 3, 2 ) ), ABS( T( 3, 3 ) ) )
  273. CALL DCOPY( 16, T, 1, T1, 1 )
  274. CALL DCOPY( 16, VAL( 1 ), 0, Q, 1 )
  275. CALL DCOPY( 4, VAL( 3 ), 0, Q, 5 )
  276. CALL DLAEXC( .TRUE., 3, T, 4, Q, 4, 1, 2, 1,
  277. $ WORK, INFO )
  278. IF( INFO.NE.0 )
  279. $ NINFO( INFO ) = NINFO( INFO ) + 1
  280. CALL DHST01( 3, 1, 3, T1, 4, T, 4, Q, 4,
  281. $ WORK, LWORK, RESULT )
  282. RES = RESULT( 1 ) + RESULT( 2 )
  283. IF( INFO.EQ.0 ) THEN
  284. IF( T1( 3, 3 ).NE.T( 1, 1 ) )
  285. $ RES = RES + ONE / EPS
  286. IF( T( 2, 1 ).NE.ZERO )
  287. $ RES = RES + ONE / EPS
  288. IF( T( 3, 1 ).NE.ZERO )
  289. $ RES = RES + ONE / EPS
  290. IF( T( 3, 2 ).NE.0 .AND.
  291. $ ( T( 2, 2 ).NE.T( 3,
  292. $ 3 ) .OR. SIGN( ONE, T( 2,
  293. $ 3 ) ).EQ.SIGN( ONE, T( 3, 2 ) ) ) )
  294. $ RES = RES + ONE / EPS
  295. END IF
  296. KNT = KNT + 1
  297. IF( RES.GT.RMAX ) THEN
  298. LMAX = KNT
  299. RMAX = RES
  300. END IF
  301. 120 CONTINUE
  302. 130 CONTINUE
  303. 140 CONTINUE
  304. 150 CONTINUE
  305. 160 CONTINUE
  306. 170 CONTINUE
  307. 180 CONTINUE
  308. *
  309. DO 300 IA11 = 1, 5
  310. DO 290 IA12 = 2, 5
  311. DO 280 IA21 = 2, 4
  312. DO 270 IA22 = -1, 1, 2
  313. DO 260 IB = 1, 5
  314. DO 250 IC11 = 3, 4
  315. DO 240 IC12 = 3, 4
  316. DO 230 IC21 = 3, 4
  317. DO 220 IC22 = -1, 1, 2
  318. DO 210 ICM = 5, 7
  319. IAM = 1
  320. T( 1, 1 ) = VAL( IA11 )*VM( IAM )
  321. T( 1, 2 ) = VAL( IA12 )*VM( IAM )
  322. T( 1, 3 ) = -TWO*VAL( IB )
  323. T( 1, 4 ) = HALF*VAL( IB )
  324. T( 2, 1 ) = -T( 1, 2 )*VAL( IA21 )
  325. T( 2, 2 ) = VAL( IA11 )*
  326. $ DBLE( IA22 )*VM( IAM )
  327. T( 2, 3 ) = VAL( IB )
  328. T( 2, 4 ) = THREE*VAL( IB )
  329. T( 3, 1 ) = ZERO
  330. T( 3, 2 ) = ZERO
  331. T( 3, 3 ) = VAL( IC11 )*
  332. $ ABS( VAL( ICM ) )
  333. T( 3, 4 ) = VAL( IC12 )*
  334. $ ABS( VAL( ICM ) )
  335. T( 4, 1 ) = ZERO
  336. T( 4, 2 ) = ZERO
  337. T( 4, 3 ) = -T( 3, 4 )*VAL( IC21 )*
  338. $ ABS( VAL( ICM ) )
  339. T( 4, 4 ) = VAL( IC11 )*
  340. $ DBLE( IC22 )*
  341. $ ABS( VAL( ICM ) )
  342. TNRM = ZERO
  343. DO 200 I = 1, 4
  344. DO 190 J = 1, 4
  345. TNRM = MAX( TNRM,
  346. $ ABS( T( I, J ) ) )
  347. 190 CONTINUE
  348. 200 CONTINUE
  349. CALL DCOPY( 16, T, 1, T1, 1 )
  350. CALL DCOPY( 16, VAL( 1 ), 0, Q, 1 )
  351. CALL DCOPY( 4, VAL( 3 ), 0, Q, 5 )
  352. CALL DLAEXC( .TRUE., 4, T, 4, Q, 4,
  353. $ 1, 2, 2, WORK, INFO )
  354. IF( INFO.NE.0 )
  355. $ NINFO( INFO ) = NINFO( INFO ) + 1
  356. CALL DHST01( 4, 1, 4, T1, 4, T, 4,
  357. $ Q, 4, WORK, LWORK,
  358. $ RESULT )
  359. RES = RESULT( 1 ) + RESULT( 2 )
  360. IF( INFO.EQ.0 ) THEN
  361. IF( T( 3, 1 ).NE.ZERO )
  362. $ RES = RES + ONE / EPS
  363. IF( T( 4, 1 ).NE.ZERO )
  364. $ RES = RES + ONE / EPS
  365. IF( T( 3, 2 ).NE.ZERO )
  366. $ RES = RES + ONE / EPS
  367. IF( T( 4, 2 ).NE.ZERO )
  368. $ RES = RES + ONE / EPS
  369. IF( T( 2, 1 ).NE.0 .AND.
  370. $ ( T( 1, 1 ).NE.T( 2,
  371. $ 2 ) .OR. SIGN( ONE, T( 1,
  372. $ 2 ) ).EQ.SIGN( ONE, T( 2,
  373. $ 1 ) ) ) )RES = RES +
  374. $ ONE / EPS
  375. IF( T( 4, 3 ).NE.0 .AND.
  376. $ ( T( 3, 3 ).NE.T( 4,
  377. $ 4 ) .OR. SIGN( ONE, T( 3,
  378. $ 4 ) ).EQ.SIGN( ONE, T( 4,
  379. $ 3 ) ) ) )RES = RES +
  380. $ ONE / EPS
  381. END IF
  382. KNT = KNT + 1
  383. IF( RES.GT.RMAX ) THEN
  384. LMAX = KNT
  385. RMAX = RES
  386. END IF
  387. 210 CONTINUE
  388. 220 CONTINUE
  389. 230 CONTINUE
  390. 240 CONTINUE
  391. 250 CONTINUE
  392. 260 CONTINUE
  393. 270 CONTINUE
  394. 280 CONTINUE
  395. 290 CONTINUE
  396. 300 CONTINUE
  397. *
  398. RETURN
  399. *
  400. * End of DGET34
  401. *
  402. END