Purpose
To perform one of the skew-symmetric rank 2k operations
C := alpha*A*B' - alpha*B*A' + beta*C,
or
C := alpha*A'*B - alpha*B'*A + beta*C,
where alpha and beta are scalars, C is a real N-by-N skew-
symmetric matrix and A, B are N-by-K matrices in the first case
and K-by-N matrices in the second case.
This is a modified version of the vanilla implemented BLAS
routine DSYR2K written by Jack Dongarra, Iain Duff,
Jeremy Du Croz and Sven Hammarling.
Specification
SUBROUTINE MB01KD( UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB, BETA,
$ C, LDC, INFO )
C .. Scalar Arguments ..
CHARACTER UPLO, TRANS
INTEGER INFO, K, LDA, LDB, LDC, N
DOUBLE PRECISION ALPHA, BETA
C .. Array Arguments ..
DOUBLE PRECISION A(LDA,*), B(LDB,*), C(LDC,*)
Arguments
Mode Parameters
UPLO CHARACTER*1
Specifies whether the upper or lower triangular part of
the array C is to be referenced, as follows:
= 'U': only the strictly upper triangular part of C is to
be referenced;
= 'L': only the striclty lower triangular part of C is to
be referenced.
TRANS CHARACTER*1
Specifies the operation to be performed, as follows:
= 'N': C := alpha*A*B' - alpha*B*A' + beta*C;
= 'T' or 'C': C := alpha*A'*B - alpha*B'*A + beta*C.
Input/Output Parameters
N (input) INTEGER
The order of the matrix C. N >= 0.
K (input) INTEGER
If TRANS = 'N' the number of columns of A and B; and if
TRANS = 'T' or TRANS = 'C' the number of rows of A and B.
K >= 0.
ALPHA (input) DOUBLE PRECISION
The scalar alpha. If alpha is zero, or N <= 1, or K = 0,
A and B are not referenced.
A (input) DOUBLE PRECISION array, dimension (LDA,KA),
where KA is K when TRANS = 'N', and is N otherwise.
On entry with TRANS = 'N', the leading N-by-K part of
of this array must contain the matrix A.
On entry with TRANS = 'T' or TRANS = 'C', the leading
K-by-N part of this array must contain the matrix A.
LDA INTEGER
The leading dimension of the array A.
LDA >= MAX(1,N), if TRANS = 'N';
LDA >= MAX(1,K), if TRANS = 'T' or TRANS = 'C'.
B (input) DOUBLE PRECISION array, dimension (LDB,KB),
where KB is K when TRANS = 'N', and is N otherwise.
On entry with TRANS = 'N', the leading N-by-K part of
of this array must contain the matrix B.
On entry with TRANS = 'T' or TRANS = 'C', the leading
K-by-N part of this array must contain the matrix B.
LDB INTEGER
The leading dimension of the array B.
LDB >= MAX(1,N), if TRANS = 'N';
LDB >= MAX(1,K), if TRANS = 'T' or TRANS = 'C'.
BETA (input) DOUBLE PRECISION
The scalar beta. If beta is zero C need not be set before
entry.
C (input/output) DOUBLE PRECISION array, dimension (LDC,N)
On entry with UPLO = 'U', the leading N-by-N part of this
array must contain the strictly upper triangular part of
the matrix C. The lower triangular part of this array is
not referenced.
On entry with UPLO = 'L', the leading N-by-N part of this
array must contain the strictly lower triangular part of
the matrix C. The upper triangular part of this array is
not referenced.
On exit with UPLO = 'U', the leading N-by-N part of this
array contains the strictly upper triangular part of the
updated matrix C.
On exit with UPLO = 'L', the leading N-by-N part of this
array contains the strictly lower triangular part of the
updated matrix C.
LDC INTEGER
The leading dimension of the array C. LDC >= MAX(1,N)
Error Indicator
INFO INTEGER
= 0: successful exit;
< 0: if INFO = -i, the i-th argument had an illegal
value.
Numerical Aspects
Though being almost identical with the vanilla implementation of the BLAS routine DSYR2K the performance of this routine could be significantly lower in the case of vendor supplied, highly optimized BLAS.Further Comments
NoneExample
Program Text
NoneProgram Data
NoneProgram Results
None