sspr2 Subroutine

public subroutine sspr2(uplo, n, alpha, x, incx, y, incy, ap)

NAME

sspr2(3f) - [BLAS:SINGLE_BLAS_LEVEL2] A:=A+alpha*SX*TRANSPOSE(SY)+alpha*SY*TRANSPOSE(SX), A packed symmetric.

SYNOPSIS

 subroutine sspr2(uplo,n,alpha,x,incx,y,incy,ap)

   .. Scalar Arguments ..
   real,intent(in)      :: alpha
   integer,intent(in)   :: incx,incy,n
   character,intent(in) :: uplo
   ..
   .. Array Arguments ..
   real,intent(in)      :: x(*),y(*)
   real,intent(inout)   :: ap(*)
   ..

DEFINITION

SSPR2 performs the symmetric rank 2 operation

 A := alpha*x*y**T + alpha*y*x**T + A,

where alpha is a scalar, x and y are n element vectors and A is an n by n symmetric matrix, supplied in packed form.

OPTIONS

UPLO

       UPLO is CHARACTER*1
        On entry, UPLO specifies whether the upper or lower
        triangular part of the matrix A is supplied in the packed
        array AP as follows:

           UPLO = 'U' or 'u'   The upper triangular part of A is
                               supplied in AP.

           UPLO = 'L' or 'l'   The lower triangular part of A is
                               supplied in AP.

N

       N is INTEGER
        On entry, N specifies the order of the matrix A.
        N must be at least zero.

ALPHA

       ALPHA is REAL
        On entry, ALPHA specifies the scalar alpha.

X

       X is REAL array, dimension at least
        ( 1 + ( n - 1 )*abs( INCX ) ).
        Before entry, the incremented array X must contain the n
        element vector x.

INCX

       INCX is INTEGER
        On entry, INCX specifies the increment for the elements of
        X. INCX must not be zero.

Y

       Y is REAL array, dimension at least
        ( 1 + ( n - 1 )*abs( INCY ) ).
        Before entry, the incremented array Y must contain the n
        element vector y.

INCY

       INCY is INTEGER
        On entry, INCY specifies the increment for the elements of
        Y. INCY must not be zero.

AP

       AP is REAL array, dimension at least
        ( ( n*( n + 1 ) )/2 ).
        Before entry with UPLO = 'U' or 'u', the array AP must
        contain the upper triangular part of the symmetric matrix
        packed sequentially, column by column, so that AP( 1 )
        contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 )
        and a( 2, 2 ) respectively, and so on. On exit, the array
        AP is overwritten by the upper triangular part of the
        updated matrix.
        Before entry with UPLO = 'L' or 'l', the array AP must
        contain the lower triangular part of the symmetric matrix
        packed sequentially, column by column, so that AP( 1 )
        contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 )
        and a( 3, 1 ) respectively, and so on. On exit, the array
        AP is overwritten by the lower triangular part of the
        updated matrix.

AUTHORS

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

date:December 2016

FURTHER DETAILS

Level 2 Blas routine.

– Written on 22-October-1986. Jack Dongarra, Argonne National Lab. Jeremy Du Croz, Nag Central Office. Sven Hammarling, Nag Central Office. Richard Hanson, Sandia National Labs.

SEE ALSO

Online html documentation available at
http://www.netlib.org/lapack/explore-html/

Arguments

Type IntentOptional Attributes Name
character(len=1), intent(in) :: uplo
integer, intent(in) :: n
real, intent(in) :: alpha
real, intent(in) :: x(*)
integer, intent(in) :: incx
real, intent(in) :: y(*)
integer, intent(in) :: incy
real, intent(inout) :: ap(*)

Contents

Source Code


Variables

Type Visibility Attributes Name Initial
integer, public :: i
integer, public :: info
integer, public :: ix
integer, public :: iy
integer, public :: j
integer, public :: jx
integer, public :: jy
integer, public :: k
integer, public :: kk
integer, public :: kx
integer, public :: ky
real, public :: temp1
real, public :: temp2
real, public, parameter :: zero = 0.0e+0

Source Code

       subroutine sspr2(uplo,n,alpha,x,incx,y,incy,ap)
      implicit none
!
!  -- Reference BLAS level2 routine (version 3.7.0) --
!  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
!  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
!     December 2016
!
!     .. Scalar Arguments ..
      real,intent(in)      :: alpha
      integer,intent(in)   :: incx,incy,n
      character,intent(in) :: uplo
!     ..
!     .. Array Arguments ..
      real,intent(in)      :: x(*),y(*)
      real,intent(inout)   :: ap(*)
!     ..
!
!  =====================================================================
!
!     .. Parameters ..
      real zero
      parameter (zero=0.0e+0)
!     ..
!     .. Local Scalars ..
      real temp1,temp2
      integer i,info,ix,iy,j,jx,jy,k,kk,kx,ky
!     ..
!     .. External Functions ..  LOGICAL LSAME
!     ..
!     .. External Subroutines ..  EXTERNAL XERBLA
!     ..
!
!     Test the input parameters.
!
      info = 0
      if (.not.lsame(uplo,'U') .and. .not.lsame(uplo,'L')) then
          info = 1
      elseif (n.lt.0) then
          info = 2
      elseif (incx.eq.0) then
          info = 5
      elseif (incy.eq.0) then
          info = 7
      endif
      if (info.ne.0) then
          call xerbla('SSPR2 ',info)
          return
      endif
!
!     Quick return if possible.
!
      if ((n.eq.0) .or. (alpha.eq.zero)) return
!
!     Set up the start points in X and Y if the increments are not both
!     unity.
!
      if ((incx.ne.1) .or. (incy.ne.1)) then
          if (incx.gt.0) then
              kx = 1
          else
              kx = 1 - (n-1)*incx
          endif
          if (incy.gt.0) then
              ky = 1
          else
              ky = 1 - (n-1)*incy
          endif
          jx = kx
          jy = ky
      endif
!
!     Start the operations. In this version the elements of the array AP
!     are accessed sequentially with one pass through AP.
!
      kk = 1
      if (lsame(uplo,'U')) then
!
!        Form  A  when upper triangle is stored in AP.
!
          if ((incx.eq.1) .and. (incy.eq.1)) then
              do j = 1,n
                  if ((x(j).ne.zero) .or. (y(j).ne.zero)) then
                      temp1 = alpha*y(j)
                      temp2 = alpha*x(j)
                      k = kk
                      do i = 1,j
                          ap(k) = ap(k) + x(i)*temp1 + y(i)*temp2
                          k = k + 1
                      enddo
                  endif
                  kk = kk + j
              enddo
          else
              do j = 1,n
                  if ((x(jx).ne.zero) .or. (y(jy).ne.zero)) then
                      temp1 = alpha*y(jy)
                      temp2 = alpha*x(jx)
                      ix = kx
                      iy = ky
                      do k = kk,kk + j - 1
                          ap(k) = ap(k) + x(ix)*temp1 + y(iy)*temp2
                          ix = ix + incx
                          iy = iy + incy
                      enddo
                  endif
                  jx = jx + incx
                  jy = jy + incy
                  kk = kk + j
              enddo
          endif
      else
!
!        Form  A  when lower triangle is stored in AP.
!
          if ((incx.eq.1) .and. (incy.eq.1)) then
              do j = 1,n
                  if ((x(j).ne.zero) .or. (y(j).ne.zero)) then
                      temp1 = alpha*y(j)
                      temp2 = alpha*x(j)
                      k = kk
                      do i = j,n
                          ap(k) = ap(k) + x(i)*temp1 + y(i)*temp2
                          k = k + 1
                      enddo
                  endif
                  kk = kk + n - j + 1
              enddo
          else
              do j = 1,n
                  if ((x(jx).ne.zero) .or. (y(jy).ne.zero)) then
                      temp1 = alpha*y(jy)
                      temp2 = alpha*x(jx)
                      ix = jx
                      iy = jy
                      do k = kk,kk + n - j
                          ap(k) = ap(k) + x(ix)*temp1 + y(iy)*temp2
                          ix = ix + incx
                          iy = iy + incy
                      enddo
                  endif
                  jx = jx + incx
                  jy = jy + incy
                  kk = kk + n - j + 1
              enddo
          endif
      endif

      end subroutine sspr2