Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/mathlibs/src/blas/csyr2k.f
5235 views
1
SUBROUTINE CSYR2K( UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB,
2
$ BETA, C, LDC )
3
* .. Scalar Arguments ..
4
CHARACTER*1 UPLO, TRANS
5
INTEGER N, K, LDA, LDB, LDC
6
COMPLEX ALPHA, BETA
7
* .. Array Arguments ..
8
COMPLEX A( LDA, * ), B( LDB, * ), C( LDC, * )
9
* ..
10
*
11
* Purpose
12
* =======
13
*
14
* CSYR2K performs one of the symmetric rank 2k operations
15
*
16
* C := alpha*A*B' + alpha*B*A' + beta*C,
17
*
18
* or
19
*
20
* C := alpha*A'*B + alpha*B'*A + beta*C,
21
*
22
* where alpha and beta are scalars, C is an n by n symmetric matrix
23
* and A and B are n by k matrices in the first case and k by n
24
* matrices in the second case.
25
*
26
* Parameters
27
* ==========
28
*
29
* UPLO - CHARACTER*1.
30
* On entry, UPLO specifies whether the upper or lower
31
* triangular part of the array C is to be referenced as
32
* follows:
33
*
34
* UPLO = 'U' or 'u' Only the upper triangular part of C
35
* is to be referenced.
36
*
37
* UPLO = 'L' or 'l' Only the lower triangular part of C
38
* is to be referenced.
39
*
40
* Unchanged on exit.
41
*
42
* TRANS - CHARACTER*1.
43
* On entry, TRANS specifies the operation to be performed as
44
* follows:
45
*
46
* TRANS = 'N' or 'n' C := alpha*A*B' + alpha*B*A' +
47
* beta*C.
48
*
49
* TRANS = 'T' or 't' C := alpha*A'*B + alpha*B'*A +
50
* beta*C.
51
*
52
* Unchanged on exit.
53
*
54
* N - INTEGER.
55
* On entry, N specifies the order of the matrix C. N must be
56
* at least zero.
57
* Unchanged on exit.
58
*
59
* K - INTEGER.
60
* On entry with TRANS = 'N' or 'n', K specifies the number
61
* of columns of the matrices A and B, and on entry with
62
* TRANS = 'T' or 't', K specifies the number of rows of the
63
* matrices A and B. K must be at least zero.
64
* Unchanged on exit.
65
*
66
* ALPHA - COMPLEX .
67
* On entry, ALPHA specifies the scalar alpha.
68
* Unchanged on exit.
69
*
70
* A - COMPLEX array of DIMENSION ( LDA, ka ), where ka is
71
* k when TRANS = 'N' or 'n', and is n otherwise.
72
* Before entry with TRANS = 'N' or 'n', the leading n by k
73
* part of the array A must contain the matrix A, otherwise
74
* the leading k by n part of the array A must contain the
75
* matrix A.
76
* Unchanged on exit.
77
*
78
* LDA - INTEGER.
79
* On entry, LDA specifies the first dimension of A as declared
80
* in the calling (sub) program. When TRANS = 'N' or 'n'
81
* then LDA must be at least max( 1, n ), otherwise LDA must
82
* be at least max( 1, k ).
83
* Unchanged on exit.
84
*
85
* B - COMPLEX array of DIMENSION ( LDB, kb ), where kb is
86
* k when TRANS = 'N' or 'n', and is n otherwise.
87
* Before entry with TRANS = 'N' or 'n', the leading n by k
88
* part of the array B must contain the matrix B, otherwise
89
* the leading k by n part of the array B must contain the
90
* matrix B.
91
* Unchanged on exit.
92
*
93
* LDB - INTEGER.
94
* On entry, LDB specifies the first dimension of B as declared
95
* in the calling (sub) program. When TRANS = 'N' or 'n'
96
* then LDB must be at least max( 1, n ), otherwise LDB must
97
* be at least max( 1, k ).
98
* Unchanged on exit.
99
*
100
* BETA - COMPLEX .
101
* On entry, BETA specifies the scalar beta.
102
* Unchanged on exit.
103
*
104
* C - COMPLEX array of DIMENSION ( LDC, n ).
105
* Before entry with UPLO = 'U' or 'u', the leading n by n
106
* upper triangular part of the array C must contain the upper
107
* triangular part of the symmetric matrix and the strictly
108
* lower triangular part of C is not referenced. On exit, the
109
* upper triangular part of the array C is overwritten by the
110
* upper triangular part of the updated matrix.
111
* Before entry with UPLO = 'L' or 'l', the leading n by n
112
* lower triangular part of the array C must contain the lower
113
* triangular part of the symmetric matrix and the strictly
114
* upper triangular part of C is not referenced. On exit, the
115
* lower triangular part of the array C is overwritten by the
116
* lower triangular part of the updated matrix.
117
*
118
* LDC - INTEGER.
119
* On entry, LDC specifies the first dimension of C as declared
120
* in the calling (sub) program. LDC must be at least
121
* max( 1, n ).
122
* Unchanged on exit.
123
*
124
*
125
* Level 3 Blas routine.
126
*
127
* -- Written on 8-February-1989.
128
* Jack Dongarra, Argonne National Laboratory.
129
* Iain Duff, AERE Harwell.
130
* Jeremy Du Croz, Numerical Algorithms Group Ltd.
131
* Sven Hammarling, Numerical Algorithms Group Ltd.
132
*
133
*
134
* .. External Functions ..
135
LOGICAL LSAME
136
EXTERNAL LSAME
137
* .. External Subroutines ..
138
EXTERNAL XERBLA
139
* .. Intrinsic Functions ..
140
INTRINSIC MAX
141
* .. Local Scalars ..
142
LOGICAL UPPER
143
INTEGER I, INFO, J, L, NROWA
144
COMPLEX TEMP1, TEMP2
145
* .. Parameters ..
146
COMPLEX ONE
147
PARAMETER ( ONE = ( 1.0E+0, 0.0E+0 ) )
148
COMPLEX ZERO
149
PARAMETER ( ZERO = ( 0.0E+0, 0.0E+0 ) )
150
* ..
151
* .. Executable Statements ..
152
*
153
* Test the input parameters.
154
*
155
IF( LSAME( TRANS, 'N' ) )THEN
156
NROWA = N
157
ELSE
158
NROWA = K
159
END IF
160
UPPER = LSAME( UPLO, 'U' )
161
*
162
INFO = 0
163
IF( ( .NOT.UPPER ).AND.
164
$ ( .NOT.LSAME( UPLO , 'L' ) ) )THEN
165
INFO = 1
166
ELSE IF( ( .NOT.LSAME( TRANS, 'N' ) ).AND.
167
$ ( .NOT.LSAME( TRANS, 'T' ) ) )THEN
168
INFO = 2
169
ELSE IF( N .LT.0 )THEN
170
INFO = 3
171
ELSE IF( K .LT.0 )THEN
172
INFO = 4
173
ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
174
INFO = 7
175
ELSE IF( LDB.LT.MAX( 1, NROWA ) )THEN
176
INFO = 9
177
ELSE IF( LDC.LT.MAX( 1, N ) )THEN
178
INFO = 12
179
END IF
180
IF( INFO.NE.0 )THEN
181
CALL XERBLA( 'CSYR2K', INFO )
182
RETURN
183
END IF
184
*
185
* Quick return if possible.
186
*
187
IF( ( N.EQ.0 ).OR.
188
$ ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) )
189
$ RETURN
190
*
191
* And when alpha.eq.zero.
192
*
193
IF( ALPHA.EQ.ZERO )THEN
194
IF( UPPER )THEN
195
IF( BETA.EQ.ZERO )THEN
196
DO 20, J = 1, N
197
DO 10, I = 1, J
198
C( I, J ) = ZERO
199
10 CONTINUE
200
20 CONTINUE
201
ELSE
202
DO 40, J = 1, N
203
DO 30, I = 1, J
204
C( I, J ) = BETA*C( I, J )
205
30 CONTINUE
206
40 CONTINUE
207
END IF
208
ELSE
209
IF( BETA.EQ.ZERO )THEN
210
DO 60, J = 1, N
211
DO 50, I = J, N
212
C( I, J ) = ZERO
213
50 CONTINUE
214
60 CONTINUE
215
ELSE
216
DO 80, J = 1, N
217
DO 70, I = J, N
218
C( I, J ) = BETA*C( I, J )
219
70 CONTINUE
220
80 CONTINUE
221
END IF
222
END IF
223
RETURN
224
END IF
225
*
226
* Start the operations.
227
*
228
IF( LSAME( TRANS, 'N' ) )THEN
229
*
230
* Form C := alpha*A*B' + alpha*B*A' + C.
231
*
232
IF( UPPER )THEN
233
DO 130, J = 1, N
234
IF( BETA.EQ.ZERO )THEN
235
DO 90, I = 1, J
236
C( I, J ) = ZERO
237
90 CONTINUE
238
ELSE IF( BETA.NE.ONE )THEN
239
DO 100, I = 1, J
240
C( I, J ) = BETA*C( I, J )
241
100 CONTINUE
242
END IF
243
DO 120, L = 1, K
244
IF( ( A( J, L ).NE.ZERO ).OR.
245
$ ( B( J, L ).NE.ZERO ) )THEN
246
TEMP1 = ALPHA*B( J, L )
247
TEMP2 = ALPHA*A( J, L )
248
DO 110, I = 1, J
249
C( I, J ) = C( I, J ) + A( I, L )*TEMP1 +
250
$ B( I, L )*TEMP2
251
110 CONTINUE
252
END IF
253
120 CONTINUE
254
130 CONTINUE
255
ELSE
256
DO 180, J = 1, N
257
IF( BETA.EQ.ZERO )THEN
258
DO 140, I = J, N
259
C( I, J ) = ZERO
260
140 CONTINUE
261
ELSE IF( BETA.NE.ONE )THEN
262
DO 150, I = J, N
263
C( I, J ) = BETA*C( I, J )
264
150 CONTINUE
265
END IF
266
DO 170, L = 1, K
267
IF( ( A( J, L ).NE.ZERO ).OR.
268
$ ( B( J, L ).NE.ZERO ) )THEN
269
TEMP1 = ALPHA*B( J, L )
270
TEMP2 = ALPHA*A( J, L )
271
DO 160, I = J, N
272
C( I, J ) = C( I, J ) + A( I, L )*TEMP1 +
273
$ B( I, L )*TEMP2
274
160 CONTINUE
275
END IF
276
170 CONTINUE
277
180 CONTINUE
278
END IF
279
ELSE
280
*
281
* Form C := alpha*A'*B + alpha*B'*A + C.
282
*
283
IF( UPPER )THEN
284
DO 210, J = 1, N
285
DO 200, I = 1, J
286
TEMP1 = ZERO
287
TEMP2 = ZERO
288
DO 190, L = 1, K
289
TEMP1 = TEMP1 + A( L, I )*B( L, J )
290
TEMP2 = TEMP2 + B( L, I )*A( L, J )
291
190 CONTINUE
292
IF( BETA.EQ.ZERO )THEN
293
C( I, J ) = ALPHA*TEMP1 + ALPHA*TEMP2
294
ELSE
295
C( I, J ) = BETA *C( I, J ) +
296
$ ALPHA*TEMP1 + ALPHA*TEMP2
297
END IF
298
200 CONTINUE
299
210 CONTINUE
300
ELSE
301
DO 240, J = 1, N
302
DO 230, I = J, N
303
TEMP1 = ZERO
304
TEMP2 = ZERO
305
DO 220, L = 1, K
306
TEMP1 = TEMP1 + A( L, I )*B( L, J )
307
TEMP2 = TEMP2 + B( L, I )*A( L, J )
308
220 CONTINUE
309
IF( BETA.EQ.ZERO )THEN
310
C( I, J ) = ALPHA*TEMP1 + ALPHA*TEMP2
311
ELSE
312
C( I, J ) = BETA *C( I, J ) +
313
$ ALPHA*TEMP1 + ALPHA*TEMP2
314
END IF
315
230 CONTINUE
316
240 CONTINUE
317
END IF
318
END IF
319
*
320
RETURN
321
*
322
* End of CSYR2K.
323
*
324
END
325
326