# csyr2k.f

          SUBROUTINE CSYR2K (UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB, BETA,
         $   C, LDC)
    C***BEGIN PROLOGUE  CSYR2K
    C***PURPOSE  Perform symmetric rank 2k update of a complex symmetric
    C            matrix.
    C***LIBRARY   SLATEC (BLAS)
    C***CATEGORY  D1B6
    C***TYPE      COMPLEX (SSYR2-S, DSYR2-D, CSYR2-C, CSYR2K-C)
    C***KEYWORDS  LEVEL 3 BLAS, LINEAR ALGEBRA
    C***AUTHOR  Dongarra, J., (ANL)
    C           Duff, I., (AERE)
    C           Du Croz, J., (NAG)
    C           Hammarling, S. (NAG)
    C***DESCRIPTION
    C
    C  CSYR2K  performs one of the symmetric rank 2k operations
    C
    C     C := alpha*A*B' + alpha*B*A' + beta*C,
    C
    C  or
    C
    C     C := alpha*A'*B + alpha*B'*A + beta*C,
    C
    C  where  alpha and beta  are scalars,  C is an  n by n symmetric matrix
    C  and  A and B  are  n by k  matrices  in the  first  case  and  k by n
    C  matrices in the second case.
    C
    C  Parameters
    C  ==========
    C
    C  UPLO   - CHARACTER*1.
    C           On  entry,   UPLO  specifies  whether  the  upper  or  lower
    C           triangular  part  of the  array  C  is to be  referenced  as
    C           follows:
    C
    C              UPLO = 'U' or 'u'   Only the  upper triangular part of  C
    C                                  is to be referenced.
    C
    C              UPLO = 'L' or 'l'   Only the  lower triangular part of  C
    C                                  is to be referenced.
    C
    C           Unchanged on exit.
    C
    C  TRANS  - CHARACTER*1.
    C           On entry,  TRANS  specifies the operation to be performed as
    C           follows:
    C
    C              TRANS = 'N' or 'n'    C := alpha*A*B' + alpha*B*A' +
    C                                         beta*C.
    C
    C              TRANS = 'T' or 't'    C := alpha*A'*B + alpha*B'*A +
    C                                         beta*C.
    C
    C           Unchanged on exit.
    C
    C  N      - INTEGER.
    C           On entry,  N specifies the order of the matrix C.  N must be
    C           at least zero.
    C           Unchanged on exit.
    C
    C  K      - INTEGER.
    C           On entry with  TRANS = 'N' or 'n',  K  specifies  the number
    C           of  columns  of the  matrices  A and B,  and on  entry  with
    C           TRANS = 'T' or 't',  K  specifies  the number of rows of the
    C           matrices  A and B.  K must be at least zero.
    C           Unchanged on exit.
    C
    C  ALPHA  - COMPLEX         .
    C           On entry, ALPHA specifies the scalar alpha.
    C           Unchanged on exit.
    C
    C  A      - COMPLEX          array of DIMENSION ( LDA, ka ), where ka is
    C           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
    C           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
    C           part of the array  A  must contain the matrix  A,  otherwise
    C           the leading  k by n  part of the array  A  must contain  the
    C           matrix A.
    C           Unchanged on exit.
    C
    C  LDA    - INTEGER.
    C           On entry, LDA specifies the first dimension of A as declared
    C           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
    C           then  LDA must be at least  max( 1, n ), otherwise  LDA must
    C           be at least  max( 1, k ).
    C           Unchanged on exit.
    C
    C  B      - COMPLEX          array of DIMENSION ( LDB, kb ), where kb is
    C           k  when  TRANS = 'N' or 'n',  and is  n  otherwise.
    C           Before entry with  TRANS = 'N' or 'n',  the  leading  n by k
    C           part of the array  B  must contain the matrix  B,  otherwise
    C           the leading  k by n  part of the array  B  must contain  the
    C           matrix B.
    C           Unchanged on exit.
    C
    C  LDB    - INTEGER.
    C           On entry, LDB specifies the first dimension of B as declared
    C           in  the  calling  (sub)  program.   When  TRANS = 'N' or 'n'
    C           then  LDB must be at least  max( 1, n ), otherwise  LDB must
    C           be at least  max( 1, k ).
    C           Unchanged on exit.
    C
    C  BETA   - COMPLEX         .
    C           On entry, BETA specifies the scalar beta.
    C           Unchanged on exit.
    C
    C  C      - COMPLEX          array of DIMENSION ( LDC, n ).
    C           Before entry  with  UPLO = 'U' or 'u',  the leading  n by n
    C           upper triangular part of the array C must contain the upper
    C           triangular part  of the  symmetric matrix  and the strictly
    C           lower triangular part of C is not referenced.  On exit, the
    C           upper triangular part of the array  C is overwritten by the
    C           upper triangular part of the updated matrix.
    C           Before entry  with  UPLO = 'L' or 'l',  the leading  n by n
    C           lower triangular part of the array C must contain the lower
    C           triangular part  of the  symmetric matrix  and the strictly
    C           upper triangular part of C is not referenced.  On exit, the
    C           lower triangular part of the array  C is overwritten by the
    C           lower triangular part of the updated matrix.
    C
    C  LDC    - INTEGER.
    C           On entry, LDC specifies the first dimension of C as declared
    C           in  the  calling  (sub)  program.   LDC  must  be  at  least
    C           max( 1, n ).
    C           Unchanged on exit.
    C
    C***REFERENCES  Dongarra, J., Du Croz, J., Duff, I., and Hammarling, S.
    C                 A set of level 3 basic linear algebra subprograms.
    C                 ACM TOMS, Vol. 16, No. 1, pp. 1-17, March 1990.
    C***ROUTINES CALLED  LSAME, XERBLA
    C***REVISION HISTORY  (YYMMDD)
    C   890208  DATE WRITTEN
    C   910605  Modified to meet SLATEC prologue standards.  Only comment
    C           lines were modified.  (BKS)
    C***END PROLOGUE  CSYR2K