cher2k.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. *DECK CHER2K
  2. SUBROUTINE CHER2K (UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB, BETA,
  3. $ C, LDC)
  4. C***BEGIN PROLOGUE CHER2K
  5. C***PURPOSE Perform Hermitian rank 2k update of a complex.
  6. C***LIBRARY SLATEC (BLAS)
  7. C***CATEGORY D1B6
  8. C***TYPE COMPLEX (SHER2-S, DHER2-D, CHER2-C, CHER2K-C)
  9. C***KEYWORDS LEVEL 3 BLAS, LINEAR ALGEBRA
  10. C***AUTHOR Dongarra, J., (ANL)
  11. C Duff, I., (AERE)
  12. C Du Croz, J., (NAG)
  13. C Hammarling, S. (NAG)
  14. C***DESCRIPTION
  15. C
  16. C CHER2K performs one of the hermitian rank 2k operations
  17. C
  18. C C := alpha*A*conjg( B' ) + conjg( alpha )*B*conjg( A' ) + beta*C,
  19. C
  20. C or
  21. C
  22. C C := alpha*conjg( A' )*B + conjg( alpha )*conjg( B' )*A + beta*C,
  23. C
  24. C where alpha and beta are scalars with beta real, C is an n by n
  25. C hermitian matrix and A and B are n by k matrices in the first case
  26. C and k by n matrices in the second case.
  27. C
  28. C Parameters
  29. C ==========
  30. C
  31. C UPLO - CHARACTER*1.
  32. C On entry, UPLO specifies whether the upper or lower
  33. C triangular part of the array C is to be referenced as
  34. C follows:
  35. C
  36. C UPLO = 'U' or 'u' Only the upper triangular part of C
  37. C is to be referenced.
  38. C
  39. C UPLO = 'L' or 'l' Only the lower triangular part of C
  40. C is to be referenced.
  41. C
  42. C Unchanged on exit.
  43. C
  44. C TRANS - CHARACTER*1.
  45. C On entry, TRANS specifies the operation to be performed as
  46. C follows:
  47. C
  48. C TRANS = 'N' or 'n' C := alpha*A*conjg( B' ) +
  49. C conjg( alpha )*B*conjg( A' ) +
  50. C beta*C.
  51. C
  52. C TRANS = 'C' or 'c' C := alpha*conjg( A' )*B +
  53. C conjg( alpha )*conjg( B' )*A +
  54. C beta*C.
  55. C
  56. C Unchanged on exit.
  57. C
  58. C N - INTEGER.
  59. C On entry, N specifies the order of the matrix C. N must be
  60. C at least zero.
  61. C Unchanged on exit.
  62. C
  63. C K - INTEGER.
  64. C On entry with TRANS = 'N' or 'n', K specifies the number
  65. C of columns of the matrices A and B, and on entry with
  66. C TRANS = 'C' or 'c', K specifies the number of rows of the
  67. C matrices A and B. K must be at least zero.
  68. C Unchanged on exit.
  69. C
  70. C ALPHA - COMPLEX .
  71. C On entry, ALPHA specifies the scalar alpha.
  72. C Unchanged on exit.
  73. C
  74. C A - COMPLEX array of DIMENSION ( LDA, ka ), where ka is
  75. C k when TRANS = 'N' or 'n', and is n otherwise.
  76. C Before entry with TRANS = 'N' or 'n', the leading n by k
  77. C part of the array A must contain the matrix A, otherwise
  78. C the leading k by n part of the array A must contain the
  79. C matrix A.
  80. C Unchanged on exit.
  81. C
  82. C LDA - INTEGER.
  83. C On entry, LDA specifies the first dimension of A as declared
  84. C in the calling (sub) program. When TRANS = 'N' or 'n'
  85. C then LDA must be at least max( 1, n ), otherwise LDA must
  86. C be at least max( 1, k ).
  87. C Unchanged on exit.
  88. C
  89. C B - COMPLEX array of DIMENSION ( LDB, kb ), where kb is
  90. C k when TRANS = 'N' or 'n', and is n otherwise.
  91. C Before entry with TRANS = 'N' or 'n', the leading n by k
  92. C part of the array B must contain the matrix B, otherwise
  93. C the leading k by n part of the array B must contain the
  94. C matrix B.
  95. C Unchanged on exit.
  96. C
  97. C LDB - INTEGER.
  98. C On entry, LDB specifies the first dimension of B as declared
  99. C in the calling (sub) program. When TRANS = 'N' or 'n'
  100. C then LDB must be at least max( 1, n ), otherwise LDB must
  101. C be at least max( 1, k ).
  102. C Unchanged on exit.
  103. C
  104. C BETA - REAL .
  105. C On entry, BETA specifies the scalar beta.
  106. C Unchanged on exit.
  107. C
  108. C C - COMPLEX array of DIMENSION ( LDC, n ).
  109. C Before entry with UPLO = 'U' or 'u', the leading n by n
  110. C upper triangular part of the array C must contain the upper
  111. C triangular part of the hermitian matrix and the strictly
  112. C lower triangular part of C is not referenced. On exit, the
  113. C upper triangular part of the array C is overwritten by the
  114. C upper triangular part of the updated matrix.
  115. C Before entry with UPLO = 'L' or 'l', the leading n by n
  116. C lower triangular part of the array C must contain the lower
  117. C triangular part of the hermitian matrix and the strictly
  118. C upper triangular part of C is not referenced. On exit, the
  119. C lower triangular part of the array C is overwritten by the
  120. C lower triangular part of the updated matrix.
  121. C Note that the imaginary parts of the diagonal elements need
  122. C not be set, they are assumed to be zero, and on exit they
  123. C are set to zero.
  124. C
  125. C LDC - INTEGER.
  126. C On entry, LDC specifies the first dimension of C as declared
  127. C in the calling (sub) program. LDC must be at least
  128. C max( 1, n ).
  129. C Unchanged on exit.
  130. C
  131. C***REFERENCES Dongarra, J., Du Croz, J., Duff, I., and Hammarling, S.
  132. C A set of level 3 basic linear algebra subprograms.
  133. C ACM TOMS, Vol. 16, No. 1, pp. 1-17, March 1990.
  134. C***ROUTINES CALLED LSAME, XERBLA
  135. C***REVISION HISTORY (YYMMDD)
  136. C 890208 DATE WRITTEN
  137. C 910605 Modified to meet SLATEC prologue standards. Only comment
  138. C lines were modified. (BKS)
  139. C***END PROLOGUE CHER2K
  140. C .. Scalar Arguments ..
  141. CHARACTER*1 UPLO, TRANS
  142. INTEGER N, K, LDA, LDB, LDC
  143. REAL BETA
  144. COMPLEX ALPHA
  145. C .. Array Arguments ..
  146. COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * )
  147. C .. External Functions ..
  148. LOGICAL LSAME
  149. EXTERNAL LSAME
  150. C .. External Subroutines ..
  151. EXTERNAL XERBLA
  152. C .. Intrinsic Functions ..
  153. INTRINSIC CONJG, MAX, REAL
  154. C .. Local Scalars ..
  155. LOGICAL UPPER
  156. INTEGER I, INFO, J, L, NROWA
  157. COMPLEX TEMP1, TEMP2
  158. C .. Parameters ..
  159. REAL ONE
  160. PARAMETER ( ONE = 1.0E+0 )
  161. COMPLEX ZERO
  162. PARAMETER ( ZERO = ( 0.0E+0, 0.0E+0 ) )
  163. C***FIRST EXECUTABLE STATEMENT CHER2K
  164. C
  165. C Test the input parameters.
  166. C
  167. IF( LSAME( TRANS, 'N' ) )THEN
  168. NROWA = N
  169. ELSE
  170. NROWA = K
  171. END IF
  172. UPPER = LSAME( UPLO, 'U' )
  173. C
  174. INFO = 0
  175. IF( ( .NOT.UPPER ).AND.
  176. $ ( .NOT.LSAME( UPLO , 'L' ) ) )THEN
  177. INFO = 1
  178. ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ).AND.
  179. $ ( .NOT.LSAME( TRANS, 'C' ) ) )THEN
  180. INFO = 2
  181. ELSE IF( N .LT.0 )THEN
  182. INFO = 3
  183. ELSE IF( K .LT.0 )THEN
  184. INFO = 4
  185. ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
  186. INFO = 7
  187. ELSE IF( LDB.LT.MAX( 1, NROWA ) )THEN
  188. INFO = 9
  189. ELSE IF( LDC.LT.MAX( 1, N ) )THEN
  190. INFO = 12
  191. END IF
  192. IF( INFO.NE.0 )THEN
  193. CALL XERBLA( 'CHER2K', INFO )
  194. RETURN
  195. END IF
  196. C
  197. C Quick return if possible.
  198. C
  199. IF( ( N.EQ.0 ).OR.
  200. $ ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
  201. $ RETURN
  202. C
  203. C And when alpha.eq.zero.
  204. C
  205. IF( ALPHA.EQ.ZERO )THEN
  206. IF( UPPER )THEN
  207. IF( BETA.EQ.REAL( ZERO ) )THEN
  208. DO 20, J = 1, N
  209. DO 10, I = 1, J
  210. C( I, J ) = ZERO
  211. 10 CONTINUE
  212. 20 CONTINUE
  213. ELSE
  214. DO 40, J = 1, N
  215. DO 30, I = 1, J - 1
  216. C( I, J ) = BETA*C( I, J )
  217. 30 CONTINUE
  218. C( J, J ) = BETA*REAL( C( J, J ) )
  219. 40 CONTINUE
  220. END IF
  221. ELSE
  222. IF( BETA.EQ.REAL( ZERO ) )THEN
  223. DO 60, J = 1, N
  224. DO 50, I = J, N
  225. C( I, J ) = ZERO
  226. 50 CONTINUE
  227. 60 CONTINUE
  228. ELSE
  229. DO 80, J = 1, N
  230. C( J, J ) = BETA*REAL( C( J, J ) )
  231. DO 70, I = J + 1, N
  232. C( I, J ) = BETA*C( I, J )
  233. 70 CONTINUE
  234. 80 CONTINUE
  235. END IF
  236. END IF
  237. RETURN
  238. END IF
  239. C
  240. C Start the operations.
  241. C
  242. IF( LSAME( TRANS, 'N' ) )THEN
  243. C
  244. C Form C := alpha*A*conjg( B' ) + conjg( alpha )*B*conjg( A' ) +
  245. C C.
  246. C
  247. IF( UPPER )THEN
  248. DO 130, J = 1, N
  249. IF( BETA.EQ.REAL( ZERO ) )THEN
  250. DO 90, I = 1, J
  251. C( I, J ) = ZERO
  252. 90 CONTINUE
  253. ELSE IF( BETA.NE.ONE )THEN
  254. DO 100, I = 1, J - 1
  255. C( I, J ) = BETA*C( I, J )
  256. 100 CONTINUE
  257. C( J, J ) = BETA*REAL( C( J, J ) )
  258. END IF
  259. DO 120, L = 1, K
  260. IF( ( A( J, L ).NE.ZERO ).OR.
  261. $ ( B( J, L ).NE.ZERO ) )THEN
  262. TEMP1 = ALPHA*CONJG( B( J, L ) )
  263. TEMP2 = CONJG( ALPHA*A( J, L ) )
  264. DO 110, I = 1, J - 1
  265. C( I, J ) = C( I, J ) + A( I, L )*TEMP1 +
  266. $ B( I, L )*TEMP2
  267. 110 CONTINUE
  268. C( J, J ) = REAL( C( J, J ) ) +
  269. $ REAL( A( J, L )*TEMP1 +
  270. $ B( J, L )*TEMP2 )
  271. END IF
  272. 120 CONTINUE
  273. 130 CONTINUE
  274. ELSE
  275. DO 180, J = 1, N
  276. IF( BETA.EQ.REAL( ZERO ) )THEN
  277. DO 140, I = J, N
  278. C( I, J ) = ZERO
  279. 140 CONTINUE
  280. ELSE IF( BETA.NE.ONE )THEN
  281. DO 150, I = J + 1, N
  282. C( I, J ) = BETA*C( I, J )
  283. 150 CONTINUE
  284. C( J, J ) = BETA*REAL( C( J, J ) )
  285. END IF
  286. DO 170, L = 1, K
  287. IF( ( A( J, L ).NE.ZERO ).OR.
  288. $ ( B( J, L ).NE.ZERO ) )THEN
  289. TEMP1 = ALPHA*CONJG( B( J, L ) )
  290. TEMP2 = CONJG( ALPHA*A( J, L ) )
  291. DO 160, I = J + 1, N
  292. C( I, J ) = C( I, J ) + A( I, L )*TEMP1 +
  293. $ B( I, L )*TEMP2
  294. 160 CONTINUE
  295. C( J, J ) = REAL( C( J, J ) ) +
  296. $ REAL( A( J, L )*TEMP1 +
  297. $ B( J, L )*TEMP2 )
  298. END IF
  299. 170 CONTINUE
  300. 180 CONTINUE
  301. END IF
  302. ELSE
  303. C
  304. C Form C := alpha*conjg( A' )*B + conjg( alpha )*conjg( B' )*A +
  305. C C.
  306. C
  307. IF( UPPER )THEN
  308. DO 210, J = 1, N
  309. DO 200, I = 1, J
  310. TEMP1 = ZERO
  311. TEMP2 = ZERO
  312. DO 190, L = 1, K
  313. TEMP1 = TEMP1 + CONJG( A( L, I ) )*B( L, J )
  314. TEMP2 = TEMP2 + CONJG( B( L, I ) )*A( L, J )
  315. 190 CONTINUE
  316. IF( I.EQ.J )THEN
  317. IF( BETA.EQ.REAL( ZERO ) )THEN
  318. C( J, J ) = REAL( ALPHA *TEMP1 +
  319. $ CONJG( ALPHA )*TEMP2 )
  320. ELSE
  321. C( J, J ) = BETA*REAL( C( J, J ) ) +
  322. $ REAL( ALPHA *TEMP1 +
  323. $ CONJG( ALPHA )*TEMP2 )
  324. END IF
  325. ELSE
  326. IF( BETA.EQ.REAL( ZERO ) )THEN
  327. C( I, J ) = ALPHA*TEMP1 + CONJG( ALPHA )*TEMP2
  328. ELSE
  329. C( I, J ) = BETA *C( I, J ) +
  330. $ ALPHA*TEMP1 + CONJG( ALPHA )*TEMP2
  331. END IF
  332. END IF
  333. 200 CONTINUE
  334. 210 CONTINUE
  335. ELSE
  336. DO 240, J = 1, N
  337. DO 230, I = J, N
  338. TEMP1 = ZERO
  339. TEMP2 = ZERO
  340. DO 220, L = 1, K
  341. TEMP1 = TEMP1 + CONJG( A( L, I ) )*B( L, J )
  342. TEMP2 = TEMP2 + CONJG( B( L, I ) )*A( L, J )
  343. 220 CONTINUE
  344. IF( I.EQ.J )THEN
  345. IF( BETA.EQ.REAL( ZERO ) )THEN
  346. C( J, J ) = REAL( ALPHA *TEMP1 +
  347. $ CONJG( ALPHA )*TEMP2 )
  348. ELSE
  349. C( J, J ) = BETA*REAL( C( J, J ) ) +
  350. $ REAL( ALPHA *TEMP1 +
  351. $ CONJG( ALPHA )*TEMP2 )
  352. END IF
  353. ELSE
  354. IF( BETA.EQ.REAL( ZERO ) )THEN
  355. C( I, J ) = ALPHA*TEMP1 + CONJG( ALPHA )*TEMP2
  356. ELSE
  357. C( I, J ) = BETA *C( I, J ) +
  358. $ ALPHA*TEMP1 + CONJG( ALPHA )*TEMP2
  359. END IF
  360. END IF
  361. 230 CONTINUE
  362. 240 CONTINUE
  363. END IF
  364. END IF
  365. C
  366. RETURN
  367. C
  368. C End of CHER2K.
  369. C
  370. END