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.

clatm5.f 15 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. *> \brief \b CLATM5
  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 CLATM5( 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. * REAL ALPHA
  19. * ..
  20. * .. Array Arguments ..
  21. * COMPLEX 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. *> CLATM5 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 COMPLEX 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 COMPLEX 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 COMPLEX 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 COMPLEX 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 COMPLEX 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 COMPLEX 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 COMPLEX 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 COMPLEX 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 REAL
  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. *> \date June 2016
  196. *
  197. *> \ingroup complex_matgen
  198. *
  199. *> \par Further Details:
  200. * =====================
  201. *>
  202. *> \verbatim
  203. *>
  204. *> PRTYPE = 1: A and B are Jordan blocks, D and E are identity matrices
  205. *>
  206. *> A : if (i == j) then A(i, j) = 1.0
  207. *> if (j == i + 1) then A(i, j) = -1.0
  208. *> else A(i, j) = 0.0, i, j = 1...M
  209. *>
  210. *> B : if (i == j) then B(i, j) = 1.0 - ALPHA
  211. *> if (j == i + 1) then B(i, j) = 1.0
  212. *> else B(i, j) = 0.0, i, j = 1...N
  213. *>
  214. *> D : if (i == j) then D(i, j) = 1.0
  215. *> else D(i, j) = 0.0, i, j = 1...M
  216. *>
  217. *> E : if (i == j) then E(i, j) = 1.0
  218. *> else E(i, j) = 0.0, i, j = 1...N
  219. *>
  220. *> L = R are chosen from [-10...10],
  221. *> which specifies the right hand sides (C, F).
  222. *>
  223. *> PRTYPE = 2 or 3: Triangular and/or quasi- triangular.
  224. *>
  225. *> A : if (i <= j) then A(i, j) = [-1...1]
  226. *> else A(i, j) = 0.0, i, j = 1...M
  227. *>
  228. *> if (PRTYPE = 3) then
  229. *> A(k + 1, k + 1) = A(k, k)
  230. *> A(k + 1, k) = [-1...1]
  231. *> sign(A(k, k + 1) = -(sin(A(k + 1, k))
  232. *> k = 1, M - 1, QBLCKA
  233. *>
  234. *> B : if (i <= j) then B(i, j) = [-1...1]
  235. *> else B(i, j) = 0.0, i, j = 1...N
  236. *>
  237. *> if (PRTYPE = 3) then
  238. *> B(k + 1, k + 1) = B(k, k)
  239. *> B(k + 1, k) = [-1...1]
  240. *> sign(B(k, k + 1) = -(sign(B(k + 1, k))
  241. *> k = 1, N - 1, QBLCKB
  242. *>
  243. *> D : if (i <= j) then D(i, j) = [-1...1].
  244. *> else D(i, j) = 0.0, i, j = 1...M
  245. *>
  246. *>
  247. *> E : if (i <= j) then D(i, j) = [-1...1]
  248. *> else E(i, j) = 0.0, i, j = 1...N
  249. *>
  250. *> L, R are chosen from [-10...10],
  251. *> which specifies the right hand sides (C, F).
  252. *>
  253. *> PRTYPE = 4 Full
  254. *> A(i, j) = [-10...10]
  255. *> D(i, j) = [-1...1] i,j = 1...M
  256. *> B(i, j) = [-10...10]
  257. *> E(i, j) = [-1...1] i,j = 1...N
  258. *> R(i, j) = [-10...10]
  259. *> L(i, j) = [-1...1] i = 1..M ,j = 1...N
  260. *>
  261. *> L, R specifies the right hand sides (C, F).
  262. *>
  263. *> PRTYPE = 5 special case common and/or close eigs.
  264. *> \endverbatim
  265. *>
  266. * =====================================================================
  267. SUBROUTINE CLATM5( PRTYPE, M, N, A, LDA, B, LDB, C, LDC, D, LDD,
  268. $ E, LDE, F, LDF, R, LDR, L, LDL, ALPHA, QBLCKA,
  269. $ QBLCKB )
  270. *
  271. * -- LAPACK computational routine (version 3.7.0) --
  272. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  273. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  274. * June 2016
  275. *
  276. * .. Scalar Arguments ..
  277. INTEGER LDA, LDB, LDC, LDD, LDE, LDF, LDL, LDR, M, N,
  278. $ PRTYPE, QBLCKA, QBLCKB
  279. REAL ALPHA
  280. * ..
  281. * .. Array Arguments ..
  282. COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * ),
  283. $ D( LDD, * ), E( LDE, * ), F( LDF, * ),
  284. $ L( LDL, * ), R( LDR, * )
  285. * ..
  286. *
  287. * =====================================================================
  288. *
  289. * .. Parameters ..
  290. COMPLEX ONE, TWO, ZERO, HALF, TWENTY
  291. PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ),
  292. $ TWO = ( 2.0E+0, 0.0E+0 ),
  293. $ ZERO = ( 0.0E+0, 0.0E+0 ),
  294. $ HALF = ( 0.5E+0, 0.0E+0 ),
  295. $ TWENTY = ( 2.0E+1, 0.0E+0 ) )
  296. * ..
  297. * .. Local Scalars ..
  298. INTEGER I, J, K
  299. COMPLEX IMEPS, REEPS
  300. * ..
  301. * .. Intrinsic Functions ..
  302. INTRINSIC CMPLX, MOD, SIN
  303. * ..
  304. * .. External Subroutines ..
  305. EXTERNAL CGEMM
  306. * ..
  307. * .. Executable Statements ..
  308. *
  309. IF( PRTYPE.EQ.1 ) THEN
  310. DO 20 I = 1, M
  311. DO 10 J = 1, M
  312. IF( I.EQ.J ) THEN
  313. A( I, J ) = ONE
  314. D( I, J ) = ONE
  315. ELSE IF( I.EQ.J-1 ) THEN
  316. A( I, J ) = -ONE
  317. D( I, J ) = ZERO
  318. ELSE
  319. A( I, J ) = ZERO
  320. D( I, J ) = ZERO
  321. END IF
  322. 10 CONTINUE
  323. 20 CONTINUE
  324. *
  325. DO 40 I = 1, N
  326. DO 30 J = 1, N
  327. IF( I.EQ.J ) THEN
  328. B( I, J ) = ONE - ALPHA
  329. E( I, J ) = ONE
  330. ELSE IF( I.EQ.J-1 ) THEN
  331. B( I, J ) = ONE
  332. E( I, J ) = ZERO
  333. ELSE
  334. B( I, J ) = ZERO
  335. E( I, J ) = ZERO
  336. END IF
  337. 30 CONTINUE
  338. 40 CONTINUE
  339. *
  340. DO 60 I = 1, M
  341. DO 50 J = 1, N
  342. R( I, J ) = ( HALF-SIN( CMPLX( I / J ) ) )*TWENTY
  343. L( I, J ) = R( I, J )
  344. 50 CONTINUE
  345. 60 CONTINUE
  346. *
  347. ELSE IF( PRTYPE.EQ.2 .OR. PRTYPE.EQ.3 ) THEN
  348. DO 80 I = 1, M
  349. DO 70 J = 1, M
  350. IF( I.LE.J ) THEN
  351. A( I, J ) = ( HALF-SIN( CMPLX( I ) ) )*TWO
  352. D( I, J ) = ( HALF-SIN( CMPLX( I*J ) ) )*TWO
  353. ELSE
  354. A( I, J ) = ZERO
  355. D( I, J ) = ZERO
  356. END IF
  357. 70 CONTINUE
  358. 80 CONTINUE
  359. *
  360. DO 100 I = 1, N
  361. DO 90 J = 1, N
  362. IF( I.LE.J ) THEN
  363. B( I, J ) = ( HALF-SIN( CMPLX( I+J ) ) )*TWO
  364. E( I, J ) = ( HALF-SIN( CMPLX( J ) ) )*TWO
  365. ELSE
  366. B( I, J ) = ZERO
  367. E( I, J ) = ZERO
  368. END IF
  369. 90 CONTINUE
  370. 100 CONTINUE
  371. *
  372. DO 120 I = 1, M
  373. DO 110 J = 1, N
  374. R( I, J ) = ( HALF-SIN( CMPLX( I*J ) ) )*TWENTY
  375. L( I, J ) = ( HALF-SIN( CMPLX( I+J ) ) )*TWENTY
  376. 110 CONTINUE
  377. 120 CONTINUE
  378. *
  379. IF( PRTYPE.EQ.3 ) THEN
  380. IF( QBLCKA.LE.1 )
  381. $ QBLCKA = 2
  382. DO 130 K = 1, M - 1, QBLCKA
  383. A( K+1, K+1 ) = A( K, K )
  384. A( K+1, K ) = -SIN( A( K, K+1 ) )
  385. 130 CONTINUE
  386. *
  387. IF( QBLCKB.LE.1 )
  388. $ QBLCKB = 2
  389. DO 140 K = 1, N - 1, QBLCKB
  390. B( K+1, K+1 ) = B( K, K )
  391. B( K+1, K ) = -SIN( B( K, K+1 ) )
  392. 140 CONTINUE
  393. END IF
  394. *
  395. ELSE IF( PRTYPE.EQ.4 ) THEN
  396. DO 160 I = 1, M
  397. DO 150 J = 1, M
  398. A( I, J ) = ( HALF-SIN( CMPLX( I*J ) ) )*TWENTY
  399. D( I, J ) = ( HALF-SIN( CMPLX( I+J ) ) )*TWO
  400. 150 CONTINUE
  401. 160 CONTINUE
  402. *
  403. DO 180 I = 1, N
  404. DO 170 J = 1, N
  405. B( I, J ) = ( HALF-SIN( CMPLX( I+J ) ) )*TWENTY
  406. E( I, J ) = ( HALF-SIN( CMPLX( I*J ) ) )*TWO
  407. 170 CONTINUE
  408. 180 CONTINUE
  409. *
  410. DO 200 I = 1, M
  411. DO 190 J = 1, N
  412. R( I, J ) = ( HALF-SIN( CMPLX( J / I ) ) )*TWENTY
  413. L( I, J ) = ( HALF-SIN( CMPLX( I*J ) ) )*TWO
  414. 190 CONTINUE
  415. 200 CONTINUE
  416. *
  417. ELSE IF( PRTYPE.GE.5 ) THEN
  418. REEPS = HALF*TWO*TWENTY / ALPHA
  419. IMEPS = ( HALF-TWO ) / ALPHA
  420. DO 220 I = 1, M
  421. DO 210 J = 1, N
  422. R( I, J ) = ( HALF-SIN( CMPLX( I*J ) ) )*ALPHA / TWENTY
  423. L( I, J ) = ( HALF-SIN( CMPLX( I+J ) ) )*ALPHA / TWENTY
  424. 210 CONTINUE
  425. 220 CONTINUE
  426. *
  427. DO 230 I = 1, M
  428. D( I, I ) = ONE
  429. 230 CONTINUE
  430. *
  431. DO 240 I = 1, M
  432. IF( I.LE.4 ) THEN
  433. A( I, I ) = ONE
  434. IF( I.GT.2 )
  435. $ A( I, I ) = ONE + REEPS
  436. IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
  437. A( I, I+1 ) = IMEPS
  438. ELSE IF( I.GT.1 ) THEN
  439. A( I, I-1 ) = -IMEPS
  440. END IF
  441. ELSE IF( I.LE.8 ) THEN
  442. IF( I.LE.6 ) THEN
  443. A( I, I ) = REEPS
  444. ELSE
  445. A( I, I ) = -REEPS
  446. END IF
  447. IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
  448. A( I, I+1 ) = ONE
  449. ELSE IF( I.GT.1 ) THEN
  450. A( I, I-1 ) = -ONE
  451. END IF
  452. ELSE
  453. A( I, I ) = ONE
  454. IF( MOD( I, 2 ).NE.0 .AND. I.LT.M ) THEN
  455. A( I, I+1 ) = IMEPS*2
  456. ELSE IF( I.GT.1 ) THEN
  457. A( I, I-1 ) = -IMEPS*2
  458. END IF
  459. END IF
  460. 240 CONTINUE
  461. *
  462. DO 250 I = 1, N
  463. E( I, I ) = ONE
  464. IF( I.LE.4 ) THEN
  465. B( I, I ) = -ONE
  466. IF( I.GT.2 )
  467. $ B( I, I ) = ONE - REEPS
  468. IF( MOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
  469. B( I, I+1 ) = IMEPS
  470. ELSE IF( I.GT.1 ) THEN
  471. B( I, I-1 ) = -IMEPS
  472. END IF
  473. ELSE IF( I.LE.8 ) THEN
  474. IF( I.LE.6 ) THEN
  475. B( I, I ) = REEPS
  476. ELSE
  477. B( I, I ) = -REEPS
  478. END IF
  479. IF( MOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
  480. B( I, I+1 ) = ONE + IMEPS
  481. ELSE IF( I.GT.1 ) THEN
  482. B( I, I-1 ) = -ONE - IMEPS
  483. END IF
  484. ELSE
  485. B( I, I ) = ONE - REEPS
  486. IF( MOD( I, 2 ).NE.0 .AND. I.LT.N ) THEN
  487. B( I, I+1 ) = IMEPS*2
  488. ELSE IF( I.GT.1 ) THEN
  489. B( I, I-1 ) = -IMEPS*2
  490. END IF
  491. END IF
  492. 250 CONTINUE
  493. END IF
  494. *
  495. * Compute rhs (C, F)
  496. *
  497. CALL CGEMM( 'N', 'N', M, N, M, ONE, A, LDA, R, LDR, ZERO, C, LDC )
  498. CALL CGEMM( 'N', 'N', M, N, N, -ONE, L, LDL, B, LDB, ONE, C, LDC )
  499. CALL CGEMM( 'N', 'N', M, N, M, ONE, D, LDD, R, LDR, ZERO, F, LDF )
  500. CALL CGEMM( 'N', 'N', M, N, N, -ONE, L, LDL, E, LDE, ONE, F, LDF )
  501. *
  502. * End of CLATM5
  503. *
  504. END