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