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.

cherkf.f 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. SUBROUTINE CHERKF ( UPLO, TRANS, N, K, ALPHA, A, LDA,
  2. $ BETA, C, LDC )
  3. * .. Scalar Arguments ..
  4. CHARACTER*1 UPLO, TRANS
  5. INTEGER N, K, LDA, LDC
  6. REAL ALPHA, BETA
  7. * .. Array Arguments ..
  8. COMPLEX A( LDA, * ), C( LDC, * )
  9. * ..
  10. *
  11. * Purpose
  12. * =======
  13. *
  14. * CHERK performs one of the hermitian rank k operations
  15. *
  16. * C := alpha*A*conjg( A' ) + beta*C,
  17. *
  18. * or
  19. *
  20. * C := alpha*conjg( A' )*A + beta*C,
  21. *
  22. * where alpha and beta are real scalars, C is an n by n hermitian
  23. * matrix and A is an n by k matrix in the first case and a k by n
  24. * matrix in the second case.
  25. *
  26. * Parameters
  27. * ==========
  28. *
  29. * UPLO - CHARACTER*1.
  30. * On entry, UPLO specifies whether the upper or lower
  31. * triangular part of the array C is to be referenced as
  32. * follows:
  33. *
  34. * UPLO = 'U' or 'u' Only the upper triangular part of C
  35. * is to be referenced.
  36. *
  37. * UPLO = 'L' or 'l' Only the lower triangular part of C
  38. * is to be referenced.
  39. *
  40. * Unchanged on exit.
  41. *
  42. * TRANS - CHARACTER*1.
  43. * On entry, TRANS specifies the operation to be performed as
  44. * follows:
  45. *
  46. * TRANS = 'N' or 'n' C := alpha*A*conjg( A' ) + beta*C.
  47. *
  48. * TRANS = 'C' or 'c' C := alpha*conjg( A' )*A + beta*C.
  49. *
  50. * Unchanged on exit.
  51. *
  52. * N - INTEGER.
  53. * On entry, N specifies the order of the matrix C. N must be
  54. * at least zero.
  55. * Unchanged on exit.
  56. *
  57. * K - INTEGER.
  58. * On entry with TRANS = 'N' or 'n', K specifies the number
  59. * of columns of the matrix A, and on entry with
  60. * TRANS = 'C' or 'c', K specifies the number of rows of the
  61. * matrix A. K must be at least zero.
  62. * Unchanged on exit.
  63. *
  64. * ALPHA - REAL .
  65. * On entry, ALPHA specifies the scalar alpha.
  66. * Unchanged on exit.
  67. *
  68. * A - COMPLEX array of DIMENSION ( LDA, ka ), where ka is
  69. * k when TRANS = 'N' or 'n', and is n otherwise.
  70. * Before entry with TRANS = 'N' or 'n', the leading n by k
  71. * part of the array A must contain the matrix A, otherwise
  72. * the leading k by n part of the array A must contain the
  73. * matrix A.
  74. * Unchanged on exit.
  75. *
  76. * LDA - INTEGER.
  77. * On entry, LDA specifies the first dimension of A as declared
  78. * in the calling (sub) program. When TRANS = 'N' or 'n'
  79. * then LDA must be at least max( 1, n ), otherwise LDA must
  80. * be at least max( 1, k ).
  81. * Unchanged on exit.
  82. *
  83. * BETA - REAL .
  84. * On entry, BETA specifies the scalar beta.
  85. * Unchanged on exit.
  86. *
  87. * C - COMPLEX array of DIMENSION ( LDC, n ).
  88. * Before entry with UPLO = 'U' or 'u', the leading n by n
  89. * upper triangular part of the array C must contain the upper
  90. * triangular part of the hermitian matrix and the strictly
  91. * lower triangular part of C is not referenced. On exit, the
  92. * upper triangular part of the array C is overwritten by the
  93. * upper triangular part of the updated matrix.
  94. * Before entry with UPLO = 'L' or 'l', the leading n by n
  95. * lower triangular part of the array C must contain the lower
  96. * triangular part of the hermitian matrix and the strictly
  97. * upper triangular part of C is not referenced. On exit, the
  98. * lower triangular part of the array C is overwritten by the
  99. * lower triangular part of the updated matrix.
  100. * Note that the imaginary parts of the diagonal elements need
  101. * not be set, they are assumed to be zero, and on exit they
  102. * are set to zero.
  103. *
  104. * LDC - INTEGER.
  105. * On entry, LDC specifies the first dimension of C as declared
  106. * in the calling (sub) program. LDC must be at least
  107. * max( 1, n ).
  108. * Unchanged on exit.
  109. *
  110. *
  111. * Level 3 Blas routine.
  112. *
  113. * -- Written on 8-February-1989.
  114. * Jack Dongarra, Argonne National Laboratory.
  115. * Iain Duff, AERE Harwell.
  116. * Jeremy Du Croz, Numerical Algorithms Group Ltd.
  117. * Sven Hammarling, Numerical Algorithms Group Ltd.
  118. *
  119. * -- Modified 8-Nov-93 to set C(J,J) to REAL( C(J,J) ) when BETA = 1.
  120. * Ed Anderson, Cray Research Inc.
  121. *
  122. *
  123. * .. External Functions ..
  124. LOGICAL LSAME
  125. EXTERNAL LSAME
  126. * .. External Subroutines ..
  127. EXTERNAL XERBLA
  128. * .. Intrinsic Functions ..
  129. INTRINSIC CMPLX, CONJG, MAX, REAL
  130. * .. Local Scalars ..
  131. LOGICAL UPPER
  132. INTEGER I, INFO, J, L, NROWA
  133. REAL RTEMP
  134. COMPLEX TEMP
  135. * .. Parameters ..
  136. REAL ONE , ZERO
  137. PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
  138. * ..
  139. * .. Executable Statements ..
  140. *
  141. * Test the input parameters.
  142. *
  143. IF( LSAME( TRANS, 'N' ) )THEN
  144. NROWA = N
  145. ELSE
  146. NROWA = K
  147. END IF
  148. UPPER = LSAME( UPLO, 'U' )
  149. *
  150. INFO = 0
  151. IF( ( .NOT.UPPER ).AND.
  152. $ ( .NOT.LSAME( UPLO , 'L' ) ) )THEN
  153. INFO = 1
  154. ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ).AND.
  155. $ ( .NOT.LSAME( TRANS, 'C' ) ) )THEN
  156. INFO = 2
  157. ELSE IF( N .LT.0 )THEN
  158. INFO = 3
  159. ELSE IF( K .LT.0 )THEN
  160. INFO = 4
  161. ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
  162. INFO = 7
  163. ELSE IF( LDC.LT.MAX( 1, N ) )THEN
  164. INFO = 10
  165. END IF
  166. IF( INFO.NE.0 )THEN
  167. CALL XERBLA( 'CHERK ', INFO )
  168. RETURN
  169. END IF
  170. *
  171. * Quick return if possible.
  172. *
  173. IF( ( N.EQ.0 ).OR.
  174. $ ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
  175. $ RETURN
  176. *
  177. * And when alpha.eq.zero.
  178. *
  179. IF( ALPHA.EQ.ZERO )THEN
  180. IF( UPPER )THEN
  181. IF( BETA.EQ.ZERO )THEN
  182. DO 20, J = 1, N
  183. DO 10, I = 1, J
  184. C( I, J ) = ZERO
  185. 10 CONTINUE
  186. 20 CONTINUE
  187. ELSE
  188. DO 40, J = 1, N
  189. DO 30, I = 1, J - 1
  190. C( I, J ) = BETA*C( I, J )
  191. 30 CONTINUE
  192. C( J, J ) = BETA*REAL( C( J, J ) )
  193. 40 CONTINUE
  194. END IF
  195. ELSE
  196. IF( BETA.EQ.ZERO )THEN
  197. DO 60, J = 1, N
  198. DO 50, I = J, N
  199. C( I, J ) = ZERO
  200. 50 CONTINUE
  201. 60 CONTINUE
  202. ELSE
  203. DO 80, J = 1, N
  204. C( J, J ) = BETA*REAL( C( J, J ) )
  205. DO 70, I = J + 1, N
  206. C( I, J ) = BETA*C( I, J )
  207. 70 CONTINUE
  208. 80 CONTINUE
  209. END IF
  210. END IF
  211. RETURN
  212. END IF
  213. *
  214. * Start the operations.
  215. *
  216. IF( LSAME( TRANS, 'N' ) )THEN
  217. *
  218. * Form C := alpha*A*conjg( A' ) + beta*C.
  219. *
  220. IF( UPPER )THEN
  221. DO 130, J = 1, N
  222. IF( BETA.EQ.ZERO )THEN
  223. DO 90, I = 1, J
  224. C( I, J ) = ZERO
  225. 90 CONTINUE
  226. ELSE IF( BETA.NE.ONE )THEN
  227. DO 100, I = 1, J - 1
  228. C( I, J ) = BETA*C( I, J )
  229. 100 CONTINUE
  230. C( J, J ) = BETA*REAL( C( J, J ) )
  231. ELSE
  232. C( J, J ) = REAL( C( J, J ) )
  233. END IF
  234. DO 120, L = 1, K
  235. IF( A( J, L ).NE.CMPLX( ZERO ) )THEN
  236. TEMP = ALPHA*CONJG( A( J, L ) )
  237. DO 110, I = 1, J - 1
  238. C( I, J ) = C( I, J ) + TEMP*A( I, L )
  239. 110 CONTINUE
  240. C( J, J ) = REAL( C( J, J ) ) +
  241. $ REAL( TEMP*A( I, L ) )
  242. END IF
  243. 120 CONTINUE
  244. 130 CONTINUE
  245. ELSE
  246. DO 180, J = 1, N
  247. IF( BETA.EQ.ZERO )THEN
  248. DO 140, I = J, N
  249. C( I, J ) = ZERO
  250. 140 CONTINUE
  251. ELSE IF( BETA.NE.ONE )THEN
  252. C( J, J ) = BETA*REAL( C( J, J ) )
  253. DO 150, I = J + 1, N
  254. C( I, J ) = BETA*C( I, J )
  255. 150 CONTINUE
  256. ELSE
  257. C( J, J ) = REAL( C( J, J ) )
  258. END IF
  259. DO 170, L = 1, K
  260. IF( A( J, L ).NE.CMPLX( ZERO ) )THEN
  261. TEMP = ALPHA*CONJG( A( J, L ) )
  262. C( J, J ) = REAL( C( J, J ) ) +
  263. $ REAL( TEMP*A( J, L ) )
  264. DO 160, I = J + 1, N
  265. C( I, J ) = C( I, J ) + TEMP*A( I, L )
  266. 160 CONTINUE
  267. END IF
  268. 170 CONTINUE
  269. 180 CONTINUE
  270. END IF
  271. ELSE
  272. *
  273. * Form C := alpha*conjg( A' )*A + beta*C.
  274. *
  275. IF( UPPER )THEN
  276. DO 220, J = 1, N
  277. DO 200, I = 1, J - 1
  278. TEMP = ZERO
  279. DO 190, L = 1, K
  280. TEMP = TEMP + CONJG( A( L, I ) )*A( L, J )
  281. 190 CONTINUE
  282. IF( BETA.EQ.ZERO )THEN
  283. C( I, J ) = ALPHA*TEMP
  284. ELSE
  285. C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
  286. END IF
  287. 200 CONTINUE
  288. RTEMP = ZERO
  289. DO 210, L = 1, K
  290. RTEMP = RTEMP + CONJG( A( L, J ) )*A( L, J )
  291. 210 CONTINUE
  292. IF( BETA.EQ.ZERO )THEN
  293. C( J, J ) = ALPHA*RTEMP
  294. ELSE
  295. C( J, J ) = ALPHA*RTEMP + BETA*REAL( C( J, J ) )
  296. END IF
  297. 220 CONTINUE
  298. ELSE
  299. DO 260, J = 1, N
  300. RTEMP = ZERO
  301. DO 230, L = 1, K
  302. RTEMP = RTEMP + CONJG( A( L, J ) )*A( L, J )
  303. 230 CONTINUE
  304. IF( BETA.EQ.ZERO )THEN
  305. C( J, J ) = ALPHA*RTEMP
  306. ELSE
  307. C( J, J ) = ALPHA*RTEMP + BETA*REAL( C( J, J ) )
  308. END IF
  309. DO 250, I = J + 1, N
  310. TEMP = ZERO
  311. DO 240, L = 1, K
  312. TEMP = TEMP + CONJG( A( L, I ) )*A( L, J )
  313. 240 CONTINUE
  314. IF( BETA.EQ.ZERO )THEN
  315. C( I, J ) = ALPHA*TEMP
  316. ELSE
  317. C( I, J ) = ALPHA*TEMP + BETA*C( I, J )
  318. END IF
  319. 250 CONTINUE
  320. 260 CONTINUE
  321. END IF
  322. END IF
  323. *
  324. RETURN
  325. *
  326. * End of CHERK .
  327. *
  328. END