133
134
135
136
137
138 IMPLICIT NONE
139
140
141 CHARACTER UPLO
142 INTEGER N, LDA, LWORK, INFO
143
144
145 INTEGER IPIV( * )
146 COMPLEX A( LDA, * ), WORK( * )
147
148
149
150
151 COMPLEX ZERO, ONE
152 parameter( zero = (0.0e+0, 0.0e+0), one = (1.0e+0, 0.0e+0) )
153
154
155 LOGICAL LQUERY, UPPER
156 INTEGER J, LWKMIN, LWKOPT
157 INTEGER NB, MJ, NJ, K1, K2, J1, J2, J3, JB
158 COMPLEX ALPHA
159
160
161 LOGICAL LSAME
162 INTEGER ILAENV
163 REAL SROUNDUP_LWORK
165
166
169
170
171 INTRINSIC real, conjg, max
172
173
174
175
176
177 nb =
ilaenv( 1,
'CHETRF_AA', uplo, n, -1, -1, -1 )
178
179
180
181 info = 0
182 upper =
lsame( uplo,
'U' )
183 lquery = ( lwork.EQ.-1 )
184 IF( n.LE.1 ) THEN
185 lwkmin = 1
186 lwkopt = 1
187 ELSE
188 lwkmin = 2*n
189 lwkopt = (nb+1)*n
190 END IF
191
192 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
193 info = -1
194 ELSE IF( n.LT.0 ) THEN
195 info = -2
196 ELSE IF( lda.LT.max( 1, n ) ) THEN
197 info = -4
198 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery ) THEN
199 info = -7
200 END IF
201
202 IF( info.EQ.0 ) THEN
204 END IF
205
206 IF( info.NE.0 ) THEN
207 CALL xerbla(
'CHETRF_AA', -info )
208 RETURN
209 ELSE IF( lquery ) THEN
210 RETURN
211 END IF
212
213
214
215 IF( n.EQ.0 ) THEN
216 RETURN
217 ENDIF
218 ipiv( 1 ) = 1
219 IF( n.EQ.1 ) THEN
220 a( 1, 1 ) = real( a( 1, 1 ) )
221 RETURN
222 END IF
223
224
225
226 IF( lwork.LT.((1+nb)*n) ) THEN
227 nb = ( lwork-n ) / n
228 END IF
229
230 IF( upper ) THEN
231
232
233
234
235
236
237
238 CALL ccopy( n, a( 1, 1 ), lda, work( 1 ), 1 )
239
240
241
242
243
244 j = 0
245 10 CONTINUE
246 IF( j.GE.n )
247 $ GO TO 20
248
249
250
251
252
253
254
255
256 j1 = j + 1
257 jb = min( n-j1+1, nb )
258 k1 = max(1, j)-j
259
260
261
263 $ a( max(1, j), j+1 ), lda,
264 $ ipiv( j+1 ), work, n, work( n*nb+1 ) )
265
266
267
268 DO j2 = j+2, min(n, j+jb+1)
269 ipiv( j2 ) = ipiv( j2 ) + j
270 IF( (j2.NE.ipiv(j2)) .AND. ((j1-k1).GT.2) ) THEN
271 CALL cswap( j1-k1-2, a( 1, j2 ), 1,
272 $ a( 1, ipiv(j2) ), 1 )
273 END IF
274 END DO
275 j = j + jb
276
277
278
279
280
281 IF( j.LT.n ) THEN
282
283
284
285 IF( j1.GT.1 .OR. jb.GT.1 ) THEN
286
287
288
289 alpha = conjg( a( j, j+1 ) )
290 a( j, j+1 ) = one
291 CALL ccopy( n-j, a( j-1, j+1 ), lda,
292 $ work( (j+1-j1+1)+jb*n ), 1 )
293 CALL cscal( n-j, alpha, work( (j+1-j1+1)+jb*n ), 1 )
294
295
296
297
298
299 IF( j1.GT.1 ) THEN
300
301
302
303 k2 = 1
304 ELSE
305
306
307
308 k2 = 0
309
310
311
312 jb = jb - 1
313 END IF
314
315 DO j2 = j+1, n, nb
316 nj = min( nb, n-j2+1 )
317
318
319
320 j3 = j2
321 DO mj = nj-1, 1, -1
322 CALL cgemm(
'Conjugate transpose',
'Transpose',
323 $ 1, mj, jb+1,
324 $ -one, a( j1-k2, j3 ), lda,
325 $ work( (j3-j1+1)+k1*n ), n,
326 $ one, a( j3, j3 ), lda )
327 j3 = j3 + 1
328 END DO
329
330
331
332 CALL cgemm(
'Conjugate transpose',
'Transpose',
333 $ nj, n-j3+1, jb+1,
334 $ -one, a( j1-k2, j2 ), lda,
335 $ work( (j3-j1+1)+k1*n ), n,
336 $ one, a( j2, j3 ), lda )
337 END DO
338
339
340
341 a( j, j+1 ) = conjg( alpha )
342 END IF
343
344
345
346 CALL ccopy( n-j, a( j+1, j+1 ), lda, work( 1 ), 1 )
347 END IF
348 GO TO 10
349 ELSE
350
351
352
353
354
355
356
357
358 CALL ccopy( n, a( 1, 1 ), 1, work( 1 ), 1 )
359
360
361
362
363
364 j = 0
365 11 CONTINUE
366 IF( j.GE.n )
367 $ GO TO 20
368
369
370
371
372
373
374
375
376 j1 = j+1
377 jb = min( n-j1+1, nb )
378 k1 = max(1, j)-j
379
380
381
383 $ a( j+1, max(1, j) ), lda,
384 $ ipiv( j+1 ), work, n, work( n*nb+1 ) )
385
386
387
388 DO j2 = j+2, min(n, j+jb+1)
389 ipiv( j2 ) = ipiv( j2 ) + j
390 IF( (j2.NE.ipiv(j2)) .AND. ((j1-k1).GT.2) ) THEN
391 CALL cswap( j1-k1-2, a( j2, 1 ), lda,
392 $ a( ipiv(j2), 1 ), lda )
393 END IF
394 END DO
395 j = j + jb
396
397
398
399
400
401 IF( j.LT.n ) THEN
402
403
404
405 IF( j1.GT.1 .OR. jb.GT.1 ) THEN
406
407
408
409 alpha = conjg( a( j+1, j ) )
410 a( j+1, j ) = one
411 CALL ccopy( n-j, a( j+1, j-1 ), 1,
412 $ work( (j+1-j1+1)+jb*n ), 1 )
413 CALL cscal( n-j, alpha, work( (j+1-j1+1)+jb*n ), 1 )
414
415
416
417
418
419 IF( j1.GT.1 ) THEN
420
421
422
423 k2 = 1
424 ELSE
425
426
427
428 k2 = 0
429
430
431
432 jb = jb - 1
433 END IF
434
435 DO j2 = j+1, n, nb
436 nj = min( nb, n-j2+1 )
437
438
439
440 j3 = j2
441 DO mj = nj-1, 1, -1
442 CALL cgemm(
'No transpose',
443 $ 'Conjugate transpose',
444 $ mj, 1, jb+1,
445 $ -one, work( (j3-j1+1)+k1*n ), n,
446 $ a( j3, j1-k2 ), lda,
447 $ one, a( j3, j3 ), lda )
448 j3 = j3 + 1
449 END DO
450
451
452
453 CALL cgemm(
'No transpose',
'Conjugate transpose',
454 $ n-j3+1, nj, jb+1,
455 $ -one, work( (j3-j1+1)+k1*n ), n,
456 $ a( j2, j1-k2 ), lda,
457 $ one, a( j3, j2 ), lda )
458 END DO
459
460
461
462 a( j+1, j ) = conjg( alpha )
463 END IF
464
465
466
467 CALL ccopy( n-j, a( j+1, j+1 ), 1, work( 1 ), 1 )
468 END IF
469 GO TO 11
470 END IF
471
472 20 CONTINUE
474 RETURN
475
476
477
subroutine xerbla(srname, info)
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine clahef_aa(uplo, j1, m, nb, a, lda, ipiv, h, ldh, work)
CLAHEF_AA
logical function lsame(ca, cb)
LSAME
real function sroundup_lwork(lwork)
SROUNDUP_LWORK
subroutine cscal(n, ca, cx, incx)
CSCAL
subroutine cswap(n, cx, incx, cy, incy)
CSWAP