zhpr2 Subroutine

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

NAME

zhpr2(3f) - [BLAS:COMPLEX_16_BLAS_LEVEL2]

SYNOPSIS

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

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

DEFINITION

ZHPR2 performs the hermitian rank 2 operation

 A := alpha*x*y**H + conjg( alpha )*y*x**H + A,

where alpha is a scalar, x and y are n element vectors 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 complex(kind=real64)
        On entry, ALPHA specifies the scalar alpha.

X

       X is complex(kind=real64) 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 complex(kind=real64) 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 complex(kind=real64) 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
complex(kind=real64), intent(in) :: alpha
complex(kind=real64), intent(in) :: x(*)
integer, intent(in) :: incx
complex(kind=real64), intent(in) :: y(*)
integer, intent(in) :: incy
complex(kind=real64), 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
complex(kind=real64), public :: temp1
complex(kind=real64), public :: temp2
complex(kind=real64), public, parameter :: zero = (0.0d+0,0.0d+0)

Source Code

       subroutine zhpr2(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 ..
      complex(kind=real64),intent(in)    :: alpha
      integer,intent(in)                 :: incx,incy,n
      character,intent(in)               :: uplo
!     ..
!     .. Array Arguments ..
      complex(kind=real64),intent(in)    :: x(*),y(*)
      complex(kind=real64),intent(inout) :: ap(*)
!     ..
!
!  =====================================================================
!
!     .. Parameters ..
      complex(kind=real64) :: zero
      parameter (zero= (0.0d+0,0.0d+0))
!     ..
!     .. Local Scalars ..
      complex(kind=real64) :: temp1,temp2
      integer i,info,ix,iy,j,jx,jy,k,kk,kx,ky
!     ..
!     .. External Functions ..
!      LOGICAL LSAME
!      EXTERNAL LSAME
!     ..
!     .. External Subroutines ..
!      EXTERNAL XERBLA
!     ..
!     .. Intrinsic Functions ..
      intrinsic dble,dconjg
!     ..
!
!     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('ZHPR2 ',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*dconjg(y(j))
                      temp2 = dconjg(alpha*x(j))
                      k = kk
                      do i = 1,j - 1
                          ap(k) = ap(k) + x(i)*temp1 + y(i)*temp2
                          k = k + 1
                      enddo
                      ap(kk+j-1) = dble(ap(kk+j-1)) + dble(x(j)*temp1+y(j)*temp2)
                  else
                      ap(kk+j-1) = dble(ap(kk+j-1))
                  endif
                  kk = kk + j
              enddo
          else
              do j = 1,n
                  if ((x(jx).ne.zero) .or. (y(jy).ne.zero)) then
                      temp1 = alpha*dconjg(y(jy))
                      temp2 = dconjg(alpha*x(jx))
                      ix = kx
                      iy = ky
                      do k = kk,kk + j - 2
                          ap(k) = ap(k) + x(ix)*temp1 + y(iy)*temp2
                          ix = ix + incx
                          iy = iy + incy
                      enddo
                      ap(kk+j-1) = dble(ap(kk+j-1)) + dble(x(jx)*temp1+y(jy)*temp2)
                  else
                      ap(kk+j-1) = dble(ap(kk+j-1))
                  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*dconjg(y(j))
                      temp2 = dconjg(alpha*x(j))
                      ap(kk) = dble(ap(kk)) + dble(x(j)*temp1+y(j)*temp2)
                      k = kk + 1
                      do i = j + 1,n
                          ap(k) = ap(k) + x(i)*temp1 + y(i)*temp2
                          k = k + 1
                      enddo
                  else
                      ap(kk) = dble(ap(kk))
                  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*dconjg(y(jy))
                      temp2 = dconjg(alpha*x(jx))
                      ap(kk) = dble(ap(kk)) + dble(x(jx)*temp1+y(jy)*temp2)
                      ix = jx
                      iy = jy
                      do k = kk + 1,kk + n - j
                          ix = ix + incx
                          iy = iy + incy
                          ap(k) = ap(k) + x(ix)*temp1 + y(iy)*temp2
                      enddo
                  else
                      ap(kk) = dble(ap(kk))
                  endif
                  jx = jx + incx
                  jy = jy + incy
                  kk = kk + n - j + 1
              enddo
          endif
      endif

      end subroutine zhpr2