00001 SUBROUTINE ZSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
00002
00003 DOUBLE COMPLEX ALPHA,BETA
00004 INTEGER K,LDA,LDB,LDC,N
00005 CHARACTER TRANS,UPLO
00006
00007
00008 DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)
00009
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 LOGICAL LSAME
00139 EXTERNAL LSAME
00140
00141
00142 EXTERNAL XERBLA
00143
00144
00145 INTRINSIC MAX
00146
00147
00148 DOUBLE COMPLEX TEMP1,TEMP2
00149 INTEGER I,INFO,J,L,NROWA
00150 LOGICAL UPPER
00151
00152
00153 DOUBLE COMPLEX ONE
00154 PARAMETER (ONE= (1.0D+0,0.0D+0))
00155 DOUBLE COMPLEX ZERO
00156 PARAMETER (ZERO= (0.0D+0,0.0D+0))
00157
00158
00159
00160
00161 IF (LSAME(TRANS,'N')) THEN
00162 NROWA = N
00163 ELSE
00164 NROWA = K
00165 END IF
00166 UPPER = LSAME(UPLO,'U')
00167
00168 INFO = 0
00169 IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
00170 INFO = 1
00171 ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND.
00172 + (.NOT.LSAME(TRANS,'T'))) THEN
00173 INFO = 2
00174 ELSE IF (N.LT.0) THEN
00175 INFO = 3
00176 ELSE IF (K.LT.0) THEN
00177 INFO = 4
00178 ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
00179 INFO = 7
00180 ELSE IF (LDB.LT.MAX(1,NROWA)) THEN
00181 INFO = 9
00182 ELSE IF (LDC.LT.MAX(1,N)) THEN
00183 INFO = 12
00184 END IF
00185 IF (INFO.NE.0) THEN
00186 CALL XERBLA('ZSYR2K',INFO)
00187 RETURN
00188 END IF
00189
00190
00191
00192 IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.
00193 + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN
00194
00195
00196
00197 IF (ALPHA.EQ.ZERO) THEN
00198 IF (UPPER) THEN
00199 IF (BETA.EQ.ZERO) THEN
00200 DO 20 J = 1,N
00201 DO 10 I = 1,J
00202 C(I,J) = ZERO
00203 10 CONTINUE
00204 20 CONTINUE
00205 ELSE
00206 DO 40 J = 1,N
00207 DO 30 I = 1,J
00208 C(I,J) = BETA*C(I,J)
00209 30 CONTINUE
00210 40 CONTINUE
00211 END IF
00212 ELSE
00213 IF (BETA.EQ.ZERO) THEN
00214 DO 60 J = 1,N
00215 DO 50 I = J,N
00216 C(I,J) = ZERO
00217 50 CONTINUE
00218 60 CONTINUE
00219 ELSE
00220 DO 80 J = 1,N
00221 DO 70 I = J,N
00222 C(I,J) = BETA*C(I,J)
00223 70 CONTINUE
00224 80 CONTINUE
00225 END IF
00226 END IF
00227 RETURN
00228 END IF
00229
00230
00231
00232 IF (LSAME(TRANS,'N')) THEN
00233
00234
00235
00236 IF (UPPER) THEN
00237 DO 130 J = 1,N
00238 IF (BETA.EQ.ZERO) THEN
00239 DO 90 I = 1,J
00240 C(I,J) = ZERO
00241 90 CONTINUE
00242 ELSE IF (BETA.NE.ONE) THEN
00243 DO 100 I = 1,J
00244 C(I,J) = BETA*C(I,J)
00245 100 CONTINUE
00246 END IF
00247 DO 120 L = 1,K
00248 IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
00249 TEMP1 = ALPHA*B(J,L)
00250 TEMP2 = ALPHA*A(J,L)
00251 DO 110 I = 1,J
00252 C(I,J) = C(I,J) + A(I,L)*TEMP1 +
00253 + B(I,L)*TEMP2
00254 110 CONTINUE
00255 END IF
00256 120 CONTINUE
00257 130 CONTINUE
00258 ELSE
00259 DO 180 J = 1,N
00260 IF (BETA.EQ.ZERO) THEN
00261 DO 140 I = J,N
00262 C(I,J) = ZERO
00263 140 CONTINUE
00264 ELSE IF (BETA.NE.ONE) THEN
00265 DO 150 I = J,N
00266 C(I,J) = BETA*C(I,J)
00267 150 CONTINUE
00268 END IF
00269 DO 170 L = 1,K
00270 IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN
00271 TEMP1 = ALPHA*B(J,L)
00272 TEMP2 = ALPHA*A(J,L)
00273 DO 160 I = J,N
00274 C(I,J) = C(I,J) + A(I,L)*TEMP1 +
00275 + B(I,L)*TEMP2
00276 160 CONTINUE
00277 END IF
00278 170 CONTINUE
00279 180 CONTINUE
00280 END IF
00281 ELSE
00282
00283
00284
00285 IF (UPPER) THEN
00286 DO 210 J = 1,N
00287 DO 200 I = 1,J
00288 TEMP1 = ZERO
00289 TEMP2 = ZERO
00290 DO 190 L = 1,K
00291 TEMP1 = TEMP1 + A(L,I)*B(L,J)
00292 TEMP2 = TEMP2 + B(L,I)*A(L,J)
00293 190 CONTINUE
00294 IF (BETA.EQ.ZERO) THEN
00295 C(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2
00296 ELSE
00297 C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
00298 + ALPHA*TEMP2
00299 END IF
00300 200 CONTINUE
00301 210 CONTINUE
00302 ELSE
00303 DO 240 J = 1,N
00304 DO 230 I = J,N
00305 TEMP1 = ZERO
00306 TEMP2 = ZERO
00307 DO 220 L = 1,K
00308 TEMP1 = TEMP1 + A(L,I)*B(L,J)
00309 TEMP2 = TEMP2 + B(L,I)*A(L,J)
00310 220 CONTINUE
00311 IF (BETA.EQ.ZERO) THEN
00312 C(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2
00313 ELSE
00314 C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 +
00315 + ALPHA*TEMP2
00316 END IF
00317 230 CONTINUE
00318 240 CONTINUE
00319 END IF
00320 END IF
00321
00322 RETURN
00323
00324
00325
00326 END