chemm Subroutine

public subroutine chemm(side, uplo, m, n, alpha, a, lda, b, ldb, beta, c, ldc)

NAME

chemm(3f) - [BLAS:COMPLEX_BLAS_LEVEL3] C:=alpha*A*TRANSPOSE(A)+beta*C; ==> A hermitian, B, C rectangular.

SYNOPSIS

 subroutine chemm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc)

   .. Scalar Arguments ..
   complex,intent(in)    :: alpha,beta
   integer,intent(in)    :: lda,ldb,ldc,m,n
   character,intent(in)  :: side,uplo
   ..
   .. Array Arguments ..
   complex,intent(in)    :: a(lda,*),b(ldb,*)
   complex,intent(inout) :: c(ldc,*)
   ..

DEFINITION

CHEMM performs one of the matrix-matrix operations

 C := alpha*A*B + beta*C,

or

 C := alpha*B*A + beta*C,

where alpha and beta are scalars, A is an hermitian matrix and B and C are m by n matrices.

OPTIONS

SIDE

       SIDE is CHARACTER*1
        On entry, SIDE specifies whether the hermitian matrix A
        appears on the left or right in the operation as follows:

           SIDE = 'L' or 'l'   C := alpha*A*B + beta*C,

           SIDE = 'R' or 'r'   C := alpha*B*A + beta*C,

UPLO

       UPLO is CHARACTER*1
        On entry, UPLO specifies whether the upper or lower
        triangular part of the hermitian matrix A is to be
        referenced as follows:

           UPLO = 'U' or 'u'   Only the upper triangular part of the
                               hermitian matrix is to be referenced.

           UPLO = 'L' or 'l'   Only the lower triangular part of the
                               hermitian matrix is to be referenced.

M

       M is INTEGER
        On entry, M specifies the number of rows of the matrix C.
        M must be at least zero.

N

       N is INTEGER
        On entry, N specifies the number of columns of the matrix C.
        N must be at least zero.

ALPHA

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

A

       A is COMPLEX array, dimension ( LDA, ka ), where ka is
        m when SIDE = 'L' or 'l' and is n otherwise.
        Before entry with SIDE = 'L' or 'l', the m by m part of
        the array A must contain the hermitian matrix, such that
        when UPLO = 'U' or 'u', the leading m by m upper triangular
        part of the array A must contain the upper triangular part
        of the hermitian matrix and the strictly lower triangular
        part of A is not referenced, and when UPLO = 'L' or 'l',
        the leading m by m lower triangular part of the array A
        must contain the lower triangular part of the hermitian
        matrix and the strictly upper triangular part of A is not
        referenced.
        Before entry with SIDE = 'R' or 'r', the n by n part of
        the array A must contain the hermitian matrix, such that
        when UPLO = 'U' or 'u', the leading n by n upper triangular
        part of the array A must contain the upper triangular part
        of the hermitian matrix and the strictly lower triangular
        part of A is not referenced, and when UPLO = 'L' or 'l',
        the leading n by n lower triangular part of the array A
        must contain the lower triangular part of the hermitian
        matrix and the strictly upper triangular part of A is not
        referenced.
        Note that the imaginary parts of the diagonal elements need
        not be set, they are assumed to be zero.

LDA

       LDA is INTEGER
        On entry, LDA specifies the first dimension of A as declared
        in the calling (sub) program. When SIDE = 'L' or 'l' then
        LDA must be at least max( 1, m ), otherwise LDA must be at
        least max( 1, n ).

B

       B is COMPLEX array, dimension ( LDB, N )
        Before entry, the leading m by n part of the array B must
        contain the matrix B.

LDB

       LDB is INTEGER
        On entry, LDB specifies the first dimension of B as declared
        in the calling (sub) program. LDB must be at least
        max( 1, m ).

BETA

       BETA is COMPLEX
        On entry, BETA specifies the scalar beta. When BETA is
        supplied as zero then C need not be set on input.

C

       C is COMPLEX array, dimension ( LDC, N )
        Before entry, the leading m by n part of the array C must
        contain the matrix C, except when beta is zero, in which
        case C need not be set on entry.
        On exit, the array C is overwritten by the m by n updated
        matrix.

LDC

       LDC is INTEGER
        On entry, LDC specifies the first dimension of C as declared
        in the calling (sub) program. LDC must be at least
        max( 1, m ).

AUTHORS

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

date:December 2016

FURTHER DETAILS

Level 3 Blas routine.

– Written on 8-February-1989. Jack Dongarra, Argonne National Laboratory. Iain Duff, AERE Harwell. Jeremy Du Croz, Numerical Algorithms Group Ltd. Sven Hammarling, Numerical Algorithms Group Ltd.

SEE ALSO

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

Arguments

Type IntentOptional Attributes Name
character(len=1), intent(in) :: side
character(len=1), intent(in) :: uplo
integer, intent(in) :: m
integer, intent(in) :: n
complex, intent(in) :: alpha
complex, intent(in) :: a(lda,*)
integer, intent(in) :: lda
complex, intent(in) :: b(ldb,*)
integer, intent(in) :: ldb
complex, intent(in) :: beta
complex, intent(inout) :: c(ldc,*)
integer, intent(in) :: ldc

Contents

Source Code


Variables

Type Visibility Attributes Name Initial
integer, public :: i
integer, public :: info
integer, public :: j
integer, public :: k
integer, public :: nrowa
complex, public, parameter :: one = (1.0e+0,0.0e+0)
complex, public :: temp1
complex, public :: temp2
logical, public :: upper
complex, public, parameter :: zero = (0.0e+0,0.0e+0)

Source Code

       subroutine chemm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc)
      implicit none
!
!  -- Reference BLAS level3 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,intent(in)    :: alpha,beta
      integer,intent(in)    :: lda,ldb,ldc,m,n
      character,intent(in)  :: side,uplo
!     ..
!     .. Array Arguments ..
      complex,intent(in)    :: a(lda,*),b(ldb,*)
      complex,intent(inout) :: c(ldc,*)
!     ..
!
!  =====================================================================
!
!     .. External Functions ..
!     ..
!     .. External Subroutines ..
!     ..
!     .. Intrinsic Functions ..
      intrinsic conjg,max,real
!     ..
!     .. Local Scalars ..
      complex temp1,temp2
      integer i,info,j,k,nrowa
      logical upper
!     ..
!     .. Parameters ..
      complex one
      parameter (one= (1.0e+0,0.0e+0))
      complex zero
      parameter (zero= (0.0e+0,0.0e+0))
!     ..
!
!     Set NROWA as the number of rows of A.
!
      if (lsame(side,'L')) then
          nrowa = m
      else
          nrowa = n
      endif
      upper = lsame(uplo,'U')
!
!     Test the input parameters.
!
      info = 0
      if ((.not.lsame(side,'L')) .and. (.not.lsame(side,'R'))) then
          info = 1
      elseif ((.not.upper) .and. (.not.lsame(uplo,'L'))) then
          info = 2
      elseif (m.lt.0) then
          info = 3
      elseif (n.lt.0) then
          info = 4
      elseif (lda.lt.max(1,nrowa)) then
          info = 7
      elseif (ldb.lt.max(1,m)) then
          info = 9
      elseif (ldc.lt.max(1,m)) then
          info = 12
      endif
      if (info.ne.0) then
          call xerbla('CHEMM ',info)
          return
      endif
!
!     Quick return if possible.
!
      if ((m.eq.0) .or. (n.eq.0) .or.  ((alpha.eq.zero).and. (beta.eq.one))) return
!
!     And when  alpha.eq.zero.
!
      if (alpha.eq.zero) then
          if (beta.eq.zero) then
              c(1:m,1:n) = zero
          else
              c(1:m,1:n) = beta*c(1:m,1:n)
          endif
          return
      endif
!
!     Start the operations.
!
      if (lsame(side,'L')) then
!
!        Form  C := alpha*A*B + beta*C.
!
          if (upper) then
              do j = 1,n
                  do i = 1,m
                      temp1 = alpha*b(i,j)
                      temp2 = zero
                      do k = 1,i - 1
                          c(k,j) = c(k,j) + temp1*a(k,i)
                          temp2 = temp2 + b(k,j)*conjg(a(k,i))
                      enddo
                      if (beta.eq.zero) then
                          c(i,j) = temp1*real(a(i,i)) + alpha*temp2
                      else
                          c(i,j) = beta*c(i,j) + temp1*real(a(i,i)) + alpha*temp2
                      endif
                  enddo
              enddo
          else
              do j = 1,n
                  do i = m,1,-1
                      temp1 = alpha*b(i,j)
                      temp2 = zero
                      do k = i + 1,m
                          c(k,j) = c(k,j) + temp1*a(k,i)
                          temp2 = temp2 + b(k,j)*conjg(a(k,i))
                      enddo
                      if (beta.eq.zero) then
                          c(i,j) = temp1*real(a(i,i)) + alpha*temp2
                      else
                          c(i,j) = beta*c(i,j) + temp1*real(a(i,i)) + alpha*temp2
                      endif
                  enddo
              enddo
          endif
      else
!
!        Form  C := alpha*B*A + beta*C.
!
          do j = 1,n
              temp1 = alpha*real(a(j,j))
              if (beta.eq.zero) then
                  c(1:m,j) = temp1*b(1:m,j)
              else
                  c(1:m,j) = beta*c(1:m,j) + temp1*b(1:m,j)
              endif
              do k = 1,j - 1
                  if (upper) then
                      temp1 = alpha*a(k,j)
                  else
                      temp1 = alpha*conjg(a(j,k))
                  endif
                  c(1:m,j) = c(1:m,j) + temp1*b(1:m,k)
              enddo
              do k = j + 1,n
                  if (upper) then
                      temp1 = alpha*conjg(a(j,k))
                  else
                      temp1 = alpha*a(k,j)
                  endif
                  c(1:m,j) = c(1:m,j) + temp1*b(1:m,k)
              enddo
          enddo
      endif
!
!     End of CHEMM .
!
      end subroutine chemm