csymm.f 10 KB

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