sger.f 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. *DECK SGER
  2. SUBROUTINE SGER (M, N, ALPHA, X, INCX, Y, INCY, A, LDA)
  3. C***BEGIN PROLOGUE SGER
  4. C***PURPOSE Perform rank 1 update of a real general matrix.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1B4
  7. C***TYPE SINGLE PRECISION (SGER-S)
  8. C***KEYWORDS LEVEL 2 BLAS, LINEAR ALGEBRA
  9. C***AUTHOR Dongarra, J. J., (ANL)
  10. C Du Croz, J., (NAG)
  11. C Hammarling, S., (NAG)
  12. C Hanson, R. J., (SNLA)
  13. C***DESCRIPTION
  14. C
  15. C SGER performs the rank 1 operation
  16. C
  17. C A := alpha*x*y' + A,
  18. C
  19. C where alpha is a scalar, x is an m element vector, y is an n element
  20. C vector and A is an m by n matrix.
  21. C
  22. C Parameters
  23. C ==========
  24. C
  25. C M - INTEGER.
  26. C On entry, M specifies the number of rows of the matrix A.
  27. C M must be at least zero.
  28. C Unchanged on exit.
  29. C
  30. C N - INTEGER.
  31. C On entry, N specifies the number of columns of the matrix A.
  32. C N must be at least zero.
  33. C Unchanged on exit.
  34. C
  35. C ALPHA - REAL .
  36. C On entry, ALPHA specifies the scalar alpha.
  37. C Unchanged on exit.
  38. C
  39. C X - REAL array of dimension at least
  40. C ( 1 + ( m - 1)*abs( INCX)).
  41. C Before entry, the incremented array X must contain the m
  42. C element vector x.
  43. C Unchanged on exit.
  44. C
  45. C INCX - INTEGER.
  46. C On entry, INCX specifies the increment for the elements of
  47. C X. INCX must not be zero.
  48. C Unchanged on exit.
  49. C
  50. C Y - REAL array of dimension at least
  51. C ( 1 + ( n - 1 )*abs( INCY ) ).
  52. C Before entry, the incremented array Y must contain the n
  53. C element vector y.
  54. C Unchanged on exit.
  55. C
  56. C INCY - INTEGER.
  57. C On entry, INCY specifies the increment for the elements of
  58. C Y. INCY must not be zero.
  59. C Unchanged on exit.
  60. C
  61. C A - REAL array of DIMENSION ( LDA, n ).
  62. C Before entry, the leading m by n part of the array A must
  63. C contain the matrix of coefficients. On exit, A is
  64. C overwritten by the updated matrix.
  65. C
  66. C LDA - INTEGER.
  67. C On entry, LDA specifies the first dimension of A as declared
  68. C in the calling (sub) program. LDA must be at least
  69. C max( 1, m ).
  70. C Unchanged on exit.
  71. C
  72. C***REFERENCES Dongarra, J. J., Du Croz, J., Hammarling, S., and
  73. C Hanson, R. J. An extended set of Fortran basic linear
  74. C algebra subprograms. ACM TOMS, Vol. 14, No. 1,
  75. C pp. 1-17, March 1988.
  76. C***ROUTINES CALLED XERBLA
  77. C***REVISION HISTORY (YYMMDD)
  78. C 861022 DATE WRITTEN
  79. C 910605 Modified to meet SLATEC prologue standards. Only comment
  80. C lines were modified. (BKS)
  81. C***END PROLOGUE SGER
  82. C .. Scalar Arguments ..
  83. REAL ALPHA
  84. INTEGER INCX, INCY, LDA, M, N
  85. C .. Array Arguments ..
  86. REAL A( LDA, * ), X( * ), Y( * )
  87. C .. Parameters ..
  88. REAL ZERO
  89. PARAMETER ( ZERO = 0.0E+0 )
  90. C .. Local Scalars ..
  91. REAL TEMP
  92. INTEGER I, INFO, IX, J, JY, KX
  93. C .. External Subroutines ..
  94. EXTERNAL XERBLA
  95. C .. Intrinsic Functions ..
  96. INTRINSIC MAX
  97. C***FIRST EXECUTABLE STATEMENT SGER
  98. C
  99. C Test the input parameters.
  100. C
  101. INFO = 0
  102. IF ( M.LT.0 )THEN
  103. INFO = 1
  104. ELSE IF( N.LT.0 )THEN
  105. INFO = 2
  106. ELSE IF( INCX.EQ.0 )THEN
  107. INFO = 5
  108. ELSE IF( INCY.EQ.0 )THEN
  109. INFO = 7
  110. ELSE IF( LDA.LT.MAX( 1, M ) )THEN
  111. INFO = 9
  112. END IF
  113. IF( INFO.NE.0 )THEN
  114. CALL XERBLA( 'SGER ', INFO )
  115. RETURN
  116. END IF
  117. C
  118. C Quick return if possible.
  119. C
  120. IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.( ALPHA.EQ.ZERO ) )
  121. $ RETURN
  122. C
  123. C Start the operations. In this version the elements of A are
  124. C accessed sequentially with one pass through A.
  125. C
  126. IF( INCY.GT.0 )THEN
  127. JY = 1
  128. ELSE
  129. JY = 1 - ( N - 1 )*INCY
  130. END IF
  131. IF( INCX.EQ.1 )THEN
  132. DO 20, J = 1, N
  133. IF( Y( JY ).NE.ZERO )THEN
  134. TEMP = ALPHA*Y( JY )
  135. DO 10, I = 1, M
  136. A( I, J ) = A( I, J ) + X( I )*TEMP
  137. 10 CONTINUE
  138. END IF
  139. JY = JY + INCY
  140. 20 CONTINUE
  141. ELSE
  142. IF( INCX.GT.0 )THEN
  143. KX = 1
  144. ELSE
  145. KX = 1 - ( M - 1 )*INCX
  146. END IF
  147. DO 40, J = 1, N
  148. IF( Y( JY ).NE.ZERO )THEN
  149. TEMP = ALPHA*Y( JY )
  150. IX = KX
  151. DO 30, I = 1, M
  152. A( I, J ) = A( I, J ) + X( IX )*TEMP
  153. IX = IX + INCX
  154. 30 CONTINUE
  155. END IF
  156. JY = JY + INCY
  157. 40 CONTINUE
  158. END IF
  159. C
  160. RETURN
  161. C
  162. C End of SGER .
  163. C
  164. END