ssymm.f 10 KB

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