3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE ZSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)
13 * .. Scalar Arguments ..
14 * COMPLEX*16 ALPHA,BETA
16 * CHARACTER TRANS,UPLO
18 * .. Array Arguments ..
19 * COMPLEX*16 A(LDA,*),C(LDC,*)
28 *> ZSYRK performs one of the symmetric rank k operations
30 *> C := alpha*A*A**T + beta*C,
34 *> C := alpha*A**T*A + beta*C,
36 *> where alpha and beta are scalars, C is an n by n symmetric matrix
37 *> and A is an n by k matrix in the first case and a k by n matrix
38 *> in the second case.
46 *> UPLO is CHARACTER*1
47 *> On entry, UPLO specifies whether the upper or lower
48 *> triangular part of the array C is to be referenced as
51 *> UPLO = 'U' or 'u' Only the upper triangular part of C
52 *> is to be referenced.
54 *> UPLO = 'L' or 'l' Only the lower triangular part of C
55 *> is to be referenced.
60 *> TRANS is CHARACTER*1
61 *> On entry, TRANS specifies the operation to be performed as
64 *> TRANS = 'N' or 'n' C := alpha*A*A**T + beta*C.
66 *> TRANS = 'T' or 't' C := alpha*A**T*A + beta*C.
72 *> On entry, N specifies the order of the matrix C. N must be
79 *> On entry with TRANS = 'N' or 'n', K specifies the number
80 *> of columns of the matrix A, and on entry with
81 *> TRANS = 'T' or 't', K specifies the number of rows of the
82 *> matrix A. K must be at least zero.
87 *> ALPHA is COMPLEX*16
88 *> On entry, ALPHA specifies the scalar alpha.
93 *> A is COMPLEX*16 array of DIMENSION ( LDA, ka ), where ka is
94 *> k when TRANS = 'N' or 'n', and is n otherwise.
95 *> Before entry with TRANS = 'N' or 'n', the leading n by k
96 *> part of the array A must contain the matrix A, otherwise
97 *> the leading k by n part of the array A must contain the
104 *> On entry, LDA specifies the first dimension of A as declared
105 *> in the calling (sub) program. When TRANS = 'N' or 'n'
106 *> then LDA must be at least max( 1, n ), otherwise LDA must
107 *> be at least max( 1, k ).
112 *> BETA is COMPLEX*16
113 *> On entry, BETA specifies the scalar beta.
118 *> C is COMPLEX*16 array of DIMENSION ( LDC, n ).
119 *> Before entry with UPLO = 'U' or 'u', the leading n by n
120 *> upper triangular part of the array C must contain the upper
121 *> triangular part of the symmetric matrix and the strictly
122 *> lower triangular part of C is not referenced. On exit, the
123 *> upper triangular part of the array C is overwritten by the
124 *> upper triangular part of the updated matrix.
125 *> Before entry with UPLO = 'L' or 'l', the leading n by n
126 *> lower triangular part of the array C must contain the lower
127 *> triangular part of the symmetric matrix and the strictly
128 *> upper triangular part of C is not referenced. On exit, the
129 *> lower triangular part of the array C is overwritten by the
130 *> lower triangular part of the updated matrix.
136 *> On entry, LDC specifies the first dimension of C as declared
137 *> in the calling (sub) program. LDC must be at least
144 *> \author Univ. of Tennessee
145 *> \author Univ. of California Berkeley
146 *> \author Univ. of Colorado Denver
149 *> \date November 2011
151 *> \ingroup complex16_blas_level3
153 *> \par Further Details:
154 * =====================
158 *> Level 3 Blas routine.
160 *> -- Written on 8-February-1989.
161 *> Jack Dongarra, Argonne National Laboratory.
162 *> Iain Duff, AERE Harwell.
163 *> Jeremy Du Croz, Numerical Algorithms Group Ltd.
164 *> Sven Hammarling, Numerical Algorithms Group Ltd.
167 * =====================================================================
168 SUBROUTINE ZSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)
170 * -- Reference BLAS level3 routine (version 3.4.0) --
171 * -- Reference BLAS is a software package provided by Univ. of Tennessee, --
172 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
175 * .. Scalar Arguments ..
176 COMPLEX*16 ALPHA,BETA
180 * .. Array Arguments ..
181 COMPLEX*16 A(LDA,*),C(LDC,*)
184 * =====================================================================
186 * .. External Functions ..
190 * .. External Subroutines ..
193 * .. Intrinsic Functions ..
196 * .. Local Scalars ..
198 INTEGER I,INFO,J,L,NROWA
203 PARAMETER (ONE= (1.0D+0,0.0D+0))
205 PARAMETER (ZERO= (0.0D+0,0.0D+0))
208 * Test the input parameters.
210 IF (LSAME(TRANS,'N')) THEN
215 UPPER = LSAME(UPLO,'U')
218 IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
220 ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
221 + (.NOT.LSAME(TRANS,'T'))) THEN
223 ELSE IF (N.LT.0) THEN
225 ELSE IF (K.LT.0) THEN
227 ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
229 ELSE IF (LDC.LT.MAX(1,N)) THEN
233 CALL XERBLA('ZSYRK ',INFO)
237 * Quick return if possible.
239 IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
240 + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
242 * And when alpha.eq.zero.
244 IF (ALPHA.EQ.ZERO) THEN
246 IF (BETA.EQ.ZERO) THEN
260 IF (BETA.EQ.ZERO) THEN
277 * Start the operations.
279 IF (LSAME(TRANS,'N')) THEN
281 * Form C := alpha*A*A**T + beta*C.
285 IF (BETA.EQ.ZERO) THEN
289 ELSE IF (BETA.NE.ONE) THEN
295 IF (A(J,L).NE.ZERO) THEN
298 C(I,J) = C(I,J) + TEMP*A(I,L)
305 IF (BETA.EQ.ZERO) THEN
309 ELSE IF (BETA.NE.ONE) THEN
315 IF (A(J,L).NE.ZERO) THEN
318 C(I,J) = C(I,J) + TEMP*A(I,L)
326 * Form C := alpha*A**T*A + beta*C.
333 TEMP = TEMP + A(L,I)*A(L,J)
335 IF (BETA.EQ.ZERO) THEN
338 C(I,J) = ALPHA*TEMP + BETA*C(I,J)
347 TEMP = TEMP + A(L,I)*A(L,J)
349 IF (BETA.EQ.ZERO) THEN
352 C(I,J) = ALPHA*TEMP + BETA*C(I,J)