chpr Subroutine

public subroutine chpr(uplo, n, alpha, x, incx, ap)

NAME

chpr(3f) - [BLAS:COMPLEX_BLAS_LEVEL2] performs the hermitian rank 1 operation

A := A + alphaCXCONJUGATE-TRANSPOSE(CX), a a (square) hermitian packed.

SYNOPSIS

 subroutine chpr(uplo,n,alpha,x,incx,ap)

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

DEFINITION

CHPR performs the hermitian rank 1 operation

 A := alpha*x*x**H + A,

where alpha is a real scalar, x is an n element vector and A is an n by n hermitian 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 COMPLEX 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.

AP

       AP is COMPLEX 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 hermitian 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 hermitian 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.
        Note that the imaginary parts of the diagonal elements need
        not be set, they are assumed to be zero, and on exit they
        are set to zero.

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
complex, intent(in) :: x(*)
integer, intent(in) :: incx
complex, intent(inout) :: ap(*)

Contents

Source Code


Variables

Type Visibility Attributes Name Initial
integer, public :: i
integer, public :: info
integer, public :: ix
integer, public :: j
integer, public :: jx
integer, public :: k
integer, public :: kk
integer, public :: kx
complex, public :: temp
complex, public, parameter :: zero = (0.0e+0,0.0e+0)

Source Code

       subroutine chpr(uplo,n,alpha,x,incx,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,n
      character,intent(in)  :: uplo
!     ..
!     .. Array Arguments ..
      complex,intent(inout) :: ap(*)
      complex,intent(in)    :: x(*)
!     ..
!
!  =====================================================================
!
!     .. Parameters ..
      complex zero
      parameter (zero= (0.0e+0,0.0e+0))
!     ..
!     .. Local Scalars ..
      complex temp
      integer i,info,ix,j,jx,k,kk,kx
!     ..
!     .. External Functions ..
!     ..
!     .. External Subroutines ..
!     ..
!     .. Intrinsic Functions ..
      intrinsic conjg,real
!     ..
!
!     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
      endif
      if (info.ne.0) then
          call xerbla('CHPR  ',info)
          return
      endif
!
!     Quick return if possible.
!
      if ((n.eq.0) .or. (alpha.eq.real(zero))) return
!
!     Set the start point in X if the increment is not unity.
!
      if (incx.le.0) then
          kx = 1 - (n-1)*incx
      elseif (incx.ne.1) then
          kx = 1
      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) then
              do j = 1,n
                  if (x(j).ne.zero) then
                      temp = alpha*conjg(x(j))
                      k = kk
                      do i = 1,j - 1
                          ap(k) = ap(k) + x(i)*temp
                          k = k + 1
                      enddo
                      ap(kk+j-1) = real(ap(kk+j-1)) + real(x(j)*temp)
                  else
                      ap(kk+j-1) = real(ap(kk+j-1))
                  endif
                  kk = kk + j
              enddo
          else
              jx = kx
              do j = 1,n
                  if (x(jx).ne.zero) then
                      temp = alpha*conjg(x(jx))
                      ix = kx
                      do k = kk,kk + j - 2
                          ap(k) = ap(k) + x(ix)*temp
                          ix = ix + incx
                      enddo
                      ap(kk+j-1) = real(ap(kk+j-1)) + real(x(jx)*temp)
                  else
                      ap(kk+j-1) = real(ap(kk+j-1))
                  endif
                  jx = jx + incx
                  kk = kk + j
              enddo
          endif
      else
!
!        Form  A  when lower triangle is stored in AP.
!
          if (incx.eq.1) then
              do j = 1,n
                  if (x(j).ne.zero) then
                      temp = alpha*conjg(x(j))
                      ap(kk) = real(ap(kk)) + real(temp*x(j))
                      k = kk + 1
                      do i = j + 1,n
                          ap(k) = ap(k) + x(i)*temp
                          k = k + 1
                      enddo
                  else
                      ap(kk) = real(ap(kk))
                  endif
                  kk = kk + n - j + 1
              enddo
          else
              jx = kx
              do j = 1,n
                  if (x(jx).ne.zero) then
                      temp = alpha*conjg(x(jx))
                      ap(kk) = real(ap(kk)) + real(temp*x(jx))
                      ix = jx
                      do k = kk + 1,kk + n - j
                          ix = ix + incx
                          ap(k) = ap(k) + x(ix)*temp
                      enddo
                  else
                      ap(kk) = real(ap(kk))
                  endif
                  jx = jx + incx
                  kk = kk + n - j + 1
              enddo
          endif
      endif
!
      end subroutine chpr