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.

dlatm5.f 15 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. *> \brief \b DLATM5
  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 DLATM5( PRTYPE, M, N, A, LDA, B, LDB, C, LDC, D, LDD,
  12. * E, LDE, F, LDF, R, LDR, L, LDL, ALPHA, QBLCKA,
  13. * QBLCKB )
  14. *
  15. * .. Scalar Arguments ..
  16. * INTEGER LDA, LDB, LDC, LDD, LDE, LDF, LDL, LDR, M, N,
  17. * $ PRTYPE, QBLCKA, QBLCKB
  18. * DOUBLE PRECISION ALPHA
  19. * ..
  20. * .. Array Arguments ..
  21. * DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ),
  22. * $ D( LDD, * ), E( LDE, * ), F( LDF, * ),
  23. * $ L( LDL, * ), R( LDR, * )
  24. * ..
  25. *
  26. *
  27. *> \par Purpose:
  28. * =============
  29. *>
  30. *> \verbatim
  31. *>
  32. *> DLATM5 generates matrices involved in the Generalized Sylvester
  33. *> equation:
  34. *>
  35. *> A * R - L * B = C
  36. *> D * R - L * E = F
  37. *>
  38. *> They also satisfy (the diagonalization condition)
  39. *>
  40. *> [ I -L ] ( [ A -C ], [ D -F ] ) [ I R ] = ( [ A ], [ D ] )
  41. *> [ I ] ( [ B ] [ E ] ) [ I ] ( [ B ] [ E ] )
  42. *>
  43. *> \endverbatim
  44. *
  45. * Arguments:
  46. * ==========
  47. *
  48. *> \param[in] PRTYPE
  49. *> \verbatim
  50. *> PRTYPE is INTEGER
  51. *> "Points" to a certain type of the matrices to generate
  52. *> (see further details).
  53. *> \endverbatim
  54. *>
  55. *> \param[in] M
  56. *> \verbatim
  57. *> M is INTEGER
  58. *> Specifies the order of A and D and the number of rows in
  59. *> C, F, R and L.
  60. *> \endverbatim
  61. *>
  62. *> \param[in] N
  63. *> \verbatim
  64. *> N is INTEGER
  65. *> Specifies the order of B and E and the number of columns in
  66. *> C, F, R and L.
  67. *> \endverbatim
  68. *>
  69. *> \param[out] A
  70. *> \verbatim
  71. *> A is DOUBLE PRECISION array, dimension (LDA, M).
  72. *> On exit A M-by-M is initialized according to PRTYPE.
  73. *> \endverbatim
  74. *>
  75. *> \param[in] LDA
  76. *> \verbatim
  77. *> LDA is INTEGER
  78. *> The leading dimension of A.
  79. *> \endverbatim
  80. *>
  81. *> \param[out] B
  82. *> \verbatim
  83. *> B is DOUBLE PRECISION array, dimension (LDB, N).
  84. *> On exit B N-by-N is initialized according to PRTYPE.
  85. *> \endverbatim
  86. *>
  87. *> \param[in] LDB
  88. *> \verbatim
  89. *> LDB is INTEGER
  90. *> The leading dimension of B.
  91. *> \endverbatim
  92. *>
  93. *> \param[out] C
  94. *> \verbatim
  95. *> C is DOUBLE PRECISION array, dimension (LDC, N).
  96. *> On exit C M-by-N is initialized according to PRTYPE.
  97. *> \endverbatim
  98. *>
  99. *> \param[in] LDC
  100. *> \verbatim
  101. *> LDC is INTEGER
  102. *> The leading dimension of C.
  103. *> \endverbatim
  104. *>
  105. *> \param[out] D
  106. *> \verbatim
  107. *> D is DOUBLE PRECISION array, dimension (LDD, M).
  108. *> On exit D M-by-M is initialized according to PRTYPE.
  109. *> \endverbatim
  110. *>
  111. *> \param[in] LDD
  112. *> \verbatim
  113. *> LDD is INTEGER
  114. *> The leading dimension of D.
  115. *> \endverbatim
  116. *>
  117. *> \param[out] E
  118. *> \verbatim
  119. *> E is DOUBLE PRECISION array, dimension (LDE, N).
  120. *> On exit E N-by-N is initialized according to PRTYPE.
  121. *> \endverbatim
  122. *>
  123. *> \param[in] LDE
  124. *> \verbatim
  125. *> LDE is INTEGER
  126. *> The leading dimension of E.
  127. *> \endverbatim
  128. *>
  129. *> \param[out] F
  130. *> \verbatim
  131. *> F is DOUBLE PRECISION array, dimension (LDF, N).
  132. *> On exit F M-by-N is initialized according to PRTYPE.
  133. *> \endverbatim
  134. *>
  135. *> \param[in] LDF
  136. *> \verbatim
  137. *> LDF is INTEGER
  138. *> The leading dimension of F.
  139. *> \endverbatim
  140. *>
  141. *> \param[out] R
  142. *> \verbatim
  143. *> R is DOUBLE PRECISION array, dimension (LDR, N).
  144. *> On exit R M-by-N is initialized according to PRTYPE.
  145. *> \endverbatim
  146. *>
  147. *> \param[in] LDR
  148. *> \verbatim
  149. *> LDR is INTEGER
  150. *> The leading dimension of R.
  151. *> \endverbatim
  152. *>
  153. *> \param[out] L
  154. *> \verbatim
  155. *> L is DOUBLE PRECISION array, dimension (LDL, N).
  156. *> On exit L M-by-N is initialized according to PRTYPE.
  157. *> \endverbatim
  158. *>
  159. *> \param[in] LDL
  160. *> \verbatim
  161. *> LDL is INTEGER
  162. *> The leading dimension of L.
  163. *> \endverbatim
  164. *>
  165. *> \param[in] ALPHA
  166. *> \verbatim
  167. *> ALPHA is DOUBLE PRECISION
  168. *> Parameter used in generating PRTYPE = 1 and 5 matrices.
  169. *> \endverbatim
  170. *>
  171. *> \param[in] QBLCKA
  172. *> \verbatim
  173. *> QBLCKA is INTEGER
  174. *> When PRTYPE = 3, specifies the distance between 2-by-2
  175. *> blocks on the diagonal in A. Otherwise, QBLCKA is not
  176. *> referenced. QBLCKA > 1.
  177. *> \endverbatim
  178. *>
  179. *> \param[in] QBLCKB
  180. *> \verbatim
  181. *> QBLCKB is INTEGER
  182. *> When PRTYPE = 3, specifies the distance between 2-by-2
  183. *> blocks on the diagonal in B. Otherwise, QBLCKB is not
  184. *> referenced. QBLCKB > 1.
  185. *> \endverbatim
  186. *
  187. * Authors:
  188. * ========
  189. *
  190. *> \author Univ. of Tennessee
  191. *> \author Univ. of California Berkeley
  192. *> \author Univ. of Colorado Denver
  193. *> \author NAG Ltd.
  194. *
  195. *> \ingroup double_matgen
  196. *
  197. *> \par Further Details:
  198. * =====================
  199. *>
  200. *> \verbatim
  201. *>
  202. *> PRTYPE = 1: A and B are Jordan blocks, D and E are identity matrices
  203. *>
  204. *> A : if (i == j) then A(i, j) = 1.0
  205. *> if (j == i + 1) then A(i, j) = -1.0
  206. *> else A(i, j) = 0.0, i, j = 1...M
  207. *>
  208. *> B : if (i == j) then B(i, j) = 1.0 - ALPHA
  209. *> if (j == i + 1) then B(i, j) = 1.0
  210. *> else B(i, j) = 0.0, i, j = 1...N
  211. *>
  212. *> D : if (i == j) then D(i, j) = 1.0
  213. *> else D(i, j) = 0.0, i, j = 1...M
  214. *>
  215. *> E : if (i == j) then E(i, j) = 1.0
  216. *> else E(i, j) = 0.0, i, j = 1...N
  217. *>
  218. *> L = R are chosen from [-10...10],
  219. *> which specifies the right hand sides (C, F).
  220. *>
  221. *> PRTYPE = 2 or 3: Triangular and/or quasi- triangular.
  222. *>
  223. *> A : if (i <= j) then A(i, j) = [-1...1]
  224. *> else A(i, j) = 0.0, i, j = 1...M
  225. *>
  226. *> if (PRTYPE = 3) then
  227. *> A(k + 1, k + 1) = A(k, k)
  228. *> A(k + 1, k) = [-1...1]
  229. *> sign(A(k, k + 1) = -(sin(A(k + 1, k))
  230. *> k = 1, M - 1, QBLCKA
  231. *>
  232. *> B : if (i <= j) then B(i, j) = [-1...1]
  233. *> else B(i, j) = 0.0, i, j = 1...N
  234. *>
  235. *> if (PRTYPE = 3) then
  236. *> B(k + 1, k + 1) = B(k, k)
  237. *> B(k + 1, k) = [-1...1]
  238. *> sign(B(k, k + 1) = -(sign(B(k + 1, k))
  239. *> k = 1, N - 1, QBLCKB
  240. *>
  241. *> D : if (i <= j) then D(i, j) = [-1...1].
  242. *> else D(i, j) = 0.0, i, j = 1...M
  243. *>
  244. *>
  245. *> E : if (i <= j) then D(i, j) = [-1...1]
  246. *> else E(i, j) = 0.0, i, j = 1...N
  247. *>
  248. *> L, R are chosen from [-10...10],
  249. *> which specifies the right hand sides (C, F).
  250. *>
  251. *> PRTYPE = 4 Full
  252. *> A(i, j) = [-10...10]
  253. *> D(i, j) = [-1...1] i,j = 1...M
  254. *> B(i, j) = [-10...10]
  255. *> E(i, j) = [-1...1] i,j = 1...N
  256. *> R(i, j) = [-10...10]
  257. *> L(i, j) = [-1...1] i = 1..M ,j = 1...N
  258. *>
  259. *> L, R specifies the right hand sides (C, F).
  260. *>
  261. *> PRTYPE = 5 special case common and/or close eigs.
  262. *> \endverbatim
  263. *>
  264. * =====================================================================
  265. SUBROUTINE DLATM5( PRTYPE, M, N, A, LDA, B, LDB, C, LDC, D, LDD,
  266. $ E, LDE, F, LDF, R, LDR, L, LDL, ALPHA, QBLCKA,
  267. $ QBLCKB )
  268. *
  269. * -- LAPACK computational routine --
  270. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  271. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  272. *
  273. * .. Scalar Arguments ..
  274. INTEGER LDA, LDB, LDC, LDD, LDE, LDF, LDL, LDR, M, N,
  275. $ PRTYPE, QBLCKA, QBLCKB
  276. DOUBLE PRECISION ALPHA
  277. * ..
  278. * .. Array Arguments ..
  279. DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ),
  280. $ D( LDD, * ), E( LDE, * ), F( LDF, * ),
  281. $ L( LDL, * ), R( LDR, * )
  282. * ..
  283. *
  284. * =====================================================================
  285. *
  286. * .. Parameters ..
  287. DOUBLE PRECISION ONE, ZERO, TWENTY, HALF, TWO
  288. PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0, TWENTY = 2.0D+1,
  289. $ HALF = 0.5D+0, TWO = 2.0D+0 )
  290. * ..
  291. * .. Local Scalars ..
  292. INTEGER I, J, K
  293. DOUBLE PRECISION IMEPS, REEPS
  294. * ..
  295. * .. Intrinsic Functions ..
  296. INTRINSIC DBLE, MOD, SIN
  297. * ..
  298. * .. External Subroutines ..
  299. EXTERNAL DGEMM
  300. * ..
  301. * .. Executable Statements ..
  302. *
  303. IF( PRTYPE.EQ.1 ) THEN
  304. DO 20 I = 1, M
  305. DO 10 J = 1, M
  306. IF( I.EQ.J ) THEN
  307. A( I, J ) = ONE
  308. D( I, J ) = ONE
  309. ELSE IF( I.EQ.J-1 ) THEN
  310. A( I, J ) = -ONE
  311. D( I, J ) = ZERO
  312. ELSE
  313. A( I, J ) = ZERO
  314. D( I, J ) = ZERO
  315. END IF
  316. 10 CONTINUE
  317. 20 CONTINUE
  318. *
  319. DO 40 I = 1, N
  320. DO 30 J = 1, N
  321. IF( I.EQ.J ) THEN
  322. B( I, J ) = ONE - ALPHA
  323. E( I, J ) = ONE
  324. ELSE IF( I.EQ.J-1 ) THEN
  325. B( I, J ) = ONE
  326. E( I, J ) = ZERO
  327. ELSE
  328. B( I, J ) = ZERO
  329. E( I, J ) = ZERO
  330. END IF
  331. 30 CONTINUE
  332. 40 CONTINUE
  333. *
  334. DO 60 I = 1, M
  335. DO 50 J = 1, N
  336. R( I, J ) = ( HALF-SIN( DBLE( I / J ) ) )*TWENTY
  337. L( I, J ) = R( I, J )
  338. 50 CONTINUE
  339. 60 CONTINUE
  340. *
  341. ELSE IF( PRTYPE.EQ.2 .OR. PRTYPE.EQ.3 ) THEN
  342. DO 80 I = 1, M
  343. DO 70 J = 1, M
  344. IF( I.LE.J ) THEN
  345. A( I, J ) = ( HALF-SIN( DBLE( I ) ) )*TWO
  346. D( I, J ) = ( HALF-SIN( DBLE( I*J ) ) )*TWO
  347. ELSE
  348. A( I, J ) = ZERO
  349. D( I, J ) = ZERO
  350. END IF
  351. 70 CONTINUE
  352. 80 CONTINUE
  353. *
  354. DO 100 I = 1, N
  355. DO 90 J = 1, N
  356. IF( I.LE.J ) THEN
  357. B( I, J ) = ( HALF-SIN( DBLE( I+J ) ) )*TWO
  358. E( I, J ) = ( HALF-SIN( DBLE( J ) ) )*TWO
  359. ELSE
  360. B( I, J ) = ZERO
  361. E( I, J ) = ZERO
  362. END IF
  363. 90 CONTINUE
  364. 100 CONTINUE
  365. *
  366. DO 120 I = 1, M
  367. DO 110 J = 1, N
  368. R( I, J ) = ( HALF-SIN( DBLE( I*J ) ) )*TWENTY
  369. L( I, J ) = ( HALF-SIN( DBLE( I+J ) ) )*TWENTY
  370. 110 CONTINUE
  371. 120 CONTINUE
  372. *
  373. IF( PRTYPE.EQ.3 ) THEN
  374. IF( QBLCKA.LE.1 )
  375. $ QBLCKA = 2
  376. DO 130 K = 1, M - 1, QBLCKA
  377. A( K+1, K+1 ) = A( K, K )
  378. A( K+1, K ) = -SIN( A( K, K+1 ) )
  379. 130 CONTINUE
  380. *
  381. IF( QBLCKB.LE.1 )
  382. $ QBLCKB = 2
  383. DO 140 K = 1, N - 1, QBLCKB
  384. B( K+1, K+1 ) = B( K, K )
  385. B( K+1, K ) = -SIN( B( K, K+1 ) )
  386. 140 CONTINUE
  387. END IF
  388. *
  389. ELSE IF( PRTYPE.EQ.4 ) THEN
  390. DO 160 I = 1, M
  391. DO 150 J = 1, M
  392. A( I, J ) = ( HALF-SIN( DBLE( I*J ) ) )*TWENTY
  393. D( I, J ) = ( HALF-SIN( DBLE( I+J ) ) )*TWO
  394. 150 CONTINUE
  395. 160 CONTINUE
  396. *
  397. DO 180 I = 1, N
  398. DO 170 J = 1, N
  399. B( I, J ) = ( HALF-SIN( DBLE( I+J ) ) )*TWENTY
  400. E( I, J ) = ( HALF-SIN( DBLE( I*J ) ) )*TWO
  401. 170 CONTINUE
  402. 180 CONTINUE
  403. *
  404. DO 200 I = 1, M
  405. DO 190 J = 1, N
  406. R( I, J ) = ( HALF-SIN( DBLE( J / I ) ) )*TWENTY
  407. L( I, J ) = ( HALF-SIN( DBLE( I*J ) ) )*TWO
  408. 190 CONTINUE
  409. 200 CONTINUE
  410. *
  411. ELSE IF( PRTYPE.GE.5 ) THEN
  412. REEPS = HALF*TWO*TWENTY / ALPHA
  413. IMEPS = ( HALF-TWO ) / ALPHA
  414. DO 220 I = 1, M
  415. DO 210 J = 1, N
  416. R( I, J ) = ( HALF-SIN( DBLE( I*J ) ) )*ALPHA / TWENTY
  417. L( I, J ) = ( HALF-SIN( DBLE( I+J ) ) )*ALPHA / TWENTY
  418. 210 CONTINUE
  419. 220 CONTINUE
  420. *
  421. DO 230 I = 1, M
  422. D( I, I ) = ONE
  423. 230 CONTINUE
  424. *
  425. DO 240 I = 1, M
  426. IF( I.LE.4 ) THEN
  427. A( I, I ) = ONE
  428. IF( I.GT.2 )
  429. $ A( I, I ) = ONE + REEPS
  430. IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
  431. A( I, I+1 ) = IMEPS
  432. ELSE IF( I.GT.1 ) THEN
  433. A( I, I-1 ) = -IMEPS
  434. END IF
  435. ELSE IF( I.LE.8 ) THEN
  436. IF( I.LE.6 ) THEN
  437. A( I, I ) = REEPS
  438. ELSE
  439. A( I, I ) = -REEPS
  440. END IF
  441. IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
  442. A( I, I+1 ) = ONE
  443. ELSE IF( I.GT.1 ) THEN
  444. A( I, I-1 ) = -ONE
  445. END IF
  446. ELSE
  447. A( I, I ) = ONE
  448. IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
  449. A( I, I+1 ) = IMEPS*2
  450. ELSE IF( I.GT.1 ) THEN
  451. A( I, I-1 ) = -IMEPS*2
  452. END IF
  453. END IF
  454. 240 CONTINUE
  455. *
  456. DO 250 I = 1, N
  457. E( I, I ) = ONE
  458. IF( I.LE.4 ) THEN
  459. B( I, I ) = -ONE
  460. IF( I.GT.2 )
  461. $ B( I, I ) = ONE - REEPS
  462. IF( MOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
  463. B( I, I+1 ) = IMEPS
  464. ELSE IF( I.GT.1 ) THEN
  465. B( I, I-1 ) = -IMEPS
  466. END IF
  467. ELSE IF( I.LE.8 ) THEN
  468. IF( I.LE.6 ) THEN
  469. B( I, I ) = REEPS
  470. ELSE
  471. B( I, I ) = -REEPS
  472. END IF
  473. IF( MOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
  474. B( I, I+1 ) = ONE + IMEPS
  475. ELSE IF( I.GT.1 ) THEN
  476. B( I, I-1 ) = -ONE - IMEPS
  477. END IF
  478. ELSE
  479. B( I, I ) = ONE - REEPS
  480. IF( MOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
  481. B( I, I+1 ) = IMEPS*2
  482. ELSE IF( I.GT.1 ) THEN
  483. B( I, I-1 ) = -IMEPS*2
  484. END IF
  485. END IF
  486. 250 CONTINUE
  487. END IF
  488. *
  489. * Compute rhs (C, F)
  490. *
  491. CALL DGEMM( 'N', 'N', M, N, M, ONE, A, LDA, R, LDR, ZERO, C, LDC )
  492. CALL DGEMM( 'N', 'N', M, N, N, -ONE, L, LDL, B, LDB, ONE, C, LDC )
  493. CALL DGEMM( 'N', 'N', M, N, M, ONE, D, LDD, R, LDR, ZERO, F, LDF )
  494. CALL DGEMM( 'N', 'N', M, N, N, -ONE, L, LDL, E, LDE, ONE, F, LDF )
  495. *
  496. * End of DLATM5
  497. *
  498. END