00001 SUBROUTINE CHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
00002
00003 COMPLEX ALPHA
00004 REAL BETA
00005 INTEGER K,LDA,LDB,LDC,N
00006 CHARACTER TRANS,UPLO
00007
00008
00009 COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 LOGICAL LSAME
00148 EXTERNAL LSAME
00149
00150
00151 EXTERNAL XERBLA
00152
00153
00154 INTRINSIC CONJG,MAX,REAL
00155
00156
00157 COMPLEX TEMP1,TEMP2
00158 INTEGER I,INFO,J,L,NROWA
00159 LOGICAL UPPER
00160
00161
00162 REAL ONE
00163 PARAMETER (ONE=1.0E+0)
00164 COMPLEX ZERO
00165 PARAMETER (ZERO= (0.0E+0,0.0E+0))
00166
00167
00168
00169
00170 IF (LSAME(TRANS,'N')) THEN
00171 NROWA = N
00172 ELSE
00173 NROWA = K
00174 END IF
00175 UPPER = LSAME(UPLO,'U')
00176
00177 INFO = 0
00178 IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
00179 INFO = 1
00180 ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
00181 + (.NOT.LSAME(TRANS,'C'))) THEN
00182 INFO = 2
00183 ELSE IF (N.LT.0) THEN
00184 INFO = 3
00185 ELSE IF (K.LT.0) THEN
00186 INFO = 4
00187 ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
00188 INFO = 7
00189 ELSE IF (LDB.LT.MAX(1,NROWA)) THEN
00190 INFO = 9
00191 ELSE IF (LDC.LT.MAX(1,N)) THEN
00192 INFO = 12
00193 END IF
00194 IF (INFO.NE.0) THEN
00195 CALL XERBLA('CHER2K',INFO)
00196 RETURN
00197 END IF
00198
00199
00200
00201 IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
00202 + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
00203
00204
00205
00206 IF (ALPHA.EQ.ZERO) THEN
00207 IF (UPPER) THEN
00208 IF (BETA.EQ.REAL(ZERO)) THEN
00209 DO 20 J = 1,N
00210 DO 10 I = 1,J
00211 C(I,J) = ZERO
00212 10 CONTINUE
00213 20 CONTINUE
00214 ELSE
00215 DO 40 J = 1,N
00216 DO 30 I = 1,J - 1
00217 C(I,J) = BETA*C(I,J)
00218 30 CONTINUE
00219 C(J,J) = BETA*REAL(C(J,J))
00220 40 CONTINUE
00221 END IF
00222 ELSE
00223 IF (BETA.EQ.REAL(ZERO)) THEN
00224 DO 60 J = 1,N
00225 DO 50 I = J,N
00226 C(I,J) = ZERO
00227 50 CONTINUE
00228 60 CONTINUE
00229 ELSE
00230 DO 80 J = 1,N
00231 C(J,J) = BETA*REAL(C(J,J))
00232 DO 70 I = J + 1,N
00233 C(I,J) = BETA*C(I,J)
00234 70 CONTINUE
00235 80 CONTINUE
00236 END IF
00237 END IF
00238 RETURN
00239 END IF
00240
00241
00242
00243 IF (LSAME(TRANS,'N')) THEN
00244
00245
00246
00247
00248 IF (UPPER) THEN
00249 DO 130 J = 1,N
00250 IF (BETA.EQ.REAL(ZERO)) THEN
00251 DO 90 I = 1,J
00252 C(I,J) = ZERO
00253 90 CONTINUE
00254 ELSE IF (BETA.NE.ONE) THEN
00255 DO 100 I = 1,J - 1
00256 C(I,J) = BETA*C(I,J)
00257 100 CONTINUE
00258 C(J,J) = BETA*REAL(C(J,J))
00259 ELSE
00260 C(J,J) = REAL(C(J,J))
00261 END IF
00262 DO 120 L = 1,K
00263 IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
00264 TEMP1 = ALPHA*CONJG(B(J,L))
00265 TEMP2 = CONJG(ALPHA*A(J,L))
00266 DO 110 I = 1,J - 1
00267 C(I,J) = C(I,J) + A(I,L)*TEMP1 +
00268 + B(I,L)*TEMP2
00269 110 CONTINUE
00270 C(J,J) = REAL(C(J,J)) +
00271 + REAL(A(J,L)*TEMP1+B(J,L)*TEMP2)
00272 END IF
00273 120 CONTINUE
00274 130 CONTINUE
00275 ELSE
00276 DO 180 J = 1,N
00277 IF (BETA.EQ.REAL(ZERO)) THEN
00278 DO 140 I = J,N
00279 C(I,J) = ZERO
00280 140 CONTINUE
00281 ELSE IF (BETA.NE.ONE) THEN
00282 DO 150 I = J + 1,N
00283 C(I,J) = BETA*C(I,J)
00284 150 CONTINUE
00285 C(J,J) = BETA*REAL(C(J,J))
00286 ELSE
00287 C(J,J) = REAL(C(J,J))
00288 END IF
00289 DO 170 L = 1,K
00290 IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
00291 TEMP1 = ALPHA*CONJG(B(J,L))
00292 TEMP2 = CONJG(ALPHA*A(J,L))
00293 DO 160 I = J + 1,N
00294 C(I,J) = C(I,J) + A(I,L)*TEMP1 +
00295 + B(I,L)*TEMP2
00296 160 CONTINUE
00297 C(J,J) = REAL(C(J,J)) +
00298 + REAL(A(J,L)*TEMP1+B(J,L)*TEMP2)
00299 END IF
00300 170 CONTINUE
00301 180 CONTINUE
00302 END IF
00303 ELSE
00304
00305
00306
00307
00308 IF (UPPER) THEN
00309 DO 210 J = 1,N
00310 DO 200 I = 1,J
00311 TEMP1 = ZERO
00312 TEMP2 = ZERO
00313 DO 190 L = 1,K
00314 TEMP1 = TEMP1 + CONJG(A(L,I))*B(L,J)
00315 TEMP2 = TEMP2 + CONJG(B(L,I))*A(L,J)
00316 190 CONTINUE
00317 IF (I.EQ.J) THEN
00318 IF (BETA.EQ.REAL(ZERO)) THEN
00319 C(J,J) = REAL(ALPHA*TEMP1+
00320 + CONJG(ALPHA)*TEMP2)
00321 ELSE
00322 C(J,J) = BETA*REAL(C(J,J)) +
00323 + REAL(ALPHA*TEMP1+
00324 + CONJG(ALPHA)*TEMP2)
00325 END IF
00326 ELSE
00327 IF (BETA.EQ.REAL(ZERO)) THEN
00328 C(I,J) = ALPHA*TEMP1 + CONJG(ALPHA)*TEMP2
00329 ELSE
00330 C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
00331 + CONJG(ALPHA)*TEMP2
00332 END IF
00333 END IF
00334 200 CONTINUE
00335 210 CONTINUE
00336 ELSE
00337 DO 240 J = 1,N
00338 DO 230 I = J,N
00339 TEMP1 = ZERO
00340 TEMP2 = ZERO
00341 DO 220 L = 1,K
00342 TEMP1 = TEMP1 + CONJG(A(L,I))*B(L,J)
00343 TEMP2 = TEMP2 + CONJG(B(L,I))*A(L,J)
00344 220 CONTINUE
00345 IF (I.EQ.J) THEN
00346 IF (BETA.EQ.REAL(ZERO)) THEN
00347 C(J,J) = REAL(ALPHA*TEMP1+
00348 + CONJG(ALPHA)*TEMP2)
00349 ELSE
00350 C(J,J) = BETA*REAL(C(J,J)) +
00351 + REAL(ALPHA*TEMP1+
00352 + CONJG(ALPHA)*TEMP2)
00353 END IF
00354 ELSE
00355 IF (BETA.EQ.REAL(ZERO)) THEN
00356 C(I,J) = ALPHA*TEMP1 + CONJG(ALPHA)*TEMP2
00357 ELSE
00358 C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
00359 + CONJG(ALPHA)*TEMP2
00360 END IF
00361 END IF
00362 230 CONTINUE
00363 240 CONTINUE
00364 END IF
00365 END IF
00366
00367 RETURN
00368
00369
00370
00371 END