142
143
144
145
146
147 IMPLICIT NONE
148
149
150 CHARACTER UPLO
151 INTEGER M, NB, J1, LDA, LDH
152
153
154 INTEGER IPIV( * )
155 DOUBLE PRECISION A( LDA, * ), H( LDH, * ), WORK( * )
156
157
158
159
160 DOUBLE PRECISION ZERO, ONE
161 parameter( zero = 0.0d+0, one = 1.0d+0 )
162
163
164 INTEGER J, K, K1, I1, I2, MJ
165 DOUBLE PRECISION PIV, ALPHA
166
167
168 LOGICAL LSAME
169 INTEGER IDAMAX, ILAENV
171
172
176
177
178 INTRINSIC max
179
180
181
182 j = 1
183
184
185
186
187 k1 = (2-j1)+1
188
189 IF(
lsame( uplo,
'U' ) )
THEN
190
191
192
193
194
195 10 CONTINUE
196 IF ( j.GT.min(m, nb) )
197 $ GO TO 20
198
199
200
201
202
203
204 k = j1+j-1
205 IF( j.EQ.m ) THEN
206
207
208
209 mj = 1
210 ELSE
211 mj = m-j+1
212 END IF
213
214
215
216
217 IF( k.GT.2 ) THEN
218
219
220
221
222
223
224
225 CALL dgemv(
'No transpose', mj, j-k1,
226 $ -one, h( j, k1 ), ldh,
227 $ a( 1, j ), 1,
228 $ one, h( j, j ), 1 )
229 END IF
230
231
232
233 CALL dcopy( mj, h( j, j ), 1, work( 1 ), 1 )
234
235 IF( j.GT.k1 ) THEN
236
237
238
239
240 alpha = -a( k-1, j )
241 CALL daxpy( mj, alpha, a( k-2, j ), lda, work( 1 ), 1 )
242 END IF
243
244
245
246 a( k, j ) = work( 1 )
247
248 IF( j.LT.m ) THEN
249
250
251
252
253 IF( k.GT.1 ) THEN
254 alpha = -a( k, j )
255 CALL daxpy( m-j, alpha, a( k-1, j+1 ), lda,
256 $ work( 2 ), 1 )
257 ENDIF
258
259
260
261 i2 =
idamax( m-j, work( 2 ), 1 ) + 1
262 piv = work( i2 )
263
264
265
266 IF( (i2.NE.2) .AND. (piv.NE.0) ) THEN
267
268
269
270 i1 = 2
271 work( i2 ) = work( i1 )
272 work( i1 ) = piv
273
274
275
276 i1 = i1+j-1
277 i2 = i2+j-1
278 CALL dswap( i2-i1-1, a( j1+i1-1, i1+1 ), lda,
279 $ a( j1+i1, i2 ), 1 )
280
281
282
283 IF( i2.LT.m )
284 $
CALL dswap( m-i2, a( j1+i1-1, i2+1 ), lda,
285 $ a( j1+i2-1, i2+1 ), lda )
286
287
288
289 piv = a( i1+j1-1, i1 )
290 a( j1+i1-1, i1 ) = a( j1+i2-1, i2 )
291 a( j1+i2-1, i2 ) = piv
292
293
294
295 CALL dswap( i1-1, h( i1, 1 ), ldh, h( i2, 1 ), ldh )
296 ipiv( i1 ) = i2
297
298 IF( i1.GT.(k1-1) ) THEN
299
300
301
302
303 CALL dswap( i1-k1+1, a( 1, i1 ), 1,
304 $ a( 1, i2 ), 1 )
305 END IF
306 ELSE
307 ipiv( j+1 ) = j+1
308 ENDIF
309
310
311
312 a( k, j+1 ) = work( 2 )
313
314 IF( j.LT.nb ) THEN
315
316
317
318 CALL dcopy( m-j, a( k+1, j+1 ), lda,
319 $ h( j+1, j+1 ), 1 )
320 END IF
321
322
323
324
325 IF( j.LT.(m-1) ) THEN
326 IF( a( k, j+1 ).NE.zero ) THEN
327 alpha = one / a( k, j+1 )
328 CALL dcopy( m-j-1, work( 3 ), 1, a( k, j+2 ), lda )
329 CALL dscal( m-j-1, alpha, a( k, j+2 ), lda )
330 ELSE
331 CALL dlaset(
'Full', 1, m-j-1, zero, zero,
332 $ a( k, j+2 ), lda)
333 END IF
334 END IF
335 END IF
336 j = j + 1
337 GO TO 10
338 20 CONTINUE
339
340 ELSE
341
342
343
344
345
346 30 CONTINUE
347 IF( j.GT.min( m, nb ) )
348 $ GO TO 40
349
350
351
352
353
354
355 k = j1+j-1
356 IF( j.EQ.m ) THEN
357
358
359
360 mj = 1
361 ELSE
362 mj = m-j+1
363 END IF
364
365
366
367
368 IF( k.GT.2 ) THEN
369
370
371
372
373
374
375
376 CALL dgemv(
'No transpose', mj, j-k1,
377 $ -one, h( j, k1 ), ldh,
378 $ a( j, 1 ), lda,
379 $ one, h( j, j ), 1 )
380 END IF
381
382
383
384 CALL dcopy( mj, h( j, j ), 1, work( 1 ), 1 )
385
386 IF( j.GT.k1 ) THEN
387
388
389
390
391 alpha = -a( j, k-1 )
392 CALL daxpy( mj, alpha, a( j, k-2 ), 1, work( 1 ), 1 )
393 END IF
394
395
396
397 a( j, k ) = work( 1 )
398
399 IF( j.LT.m ) THEN
400
401
402
403
404 IF( k.GT.1 ) THEN
405 alpha = -a( j, k )
406 CALL daxpy( m-j, alpha, a( j+1, k-1 ), 1,
407 $ work( 2 ), 1 )
408 ENDIF
409
410
411
412 i2 =
idamax( m-j, work( 2 ), 1 ) + 1
413 piv = work( i2 )
414
415
416
417 IF( (i2.NE.2) .AND. (piv.NE.0) ) THEN
418
419
420
421 i1 = 2
422 work( i2 ) = work( i1 )
423 work( i1 ) = piv
424
425
426
427 i1 = i1+j-1
428 i2 = i2+j-1
429 CALL dswap( i2-i1-1, a( i1+1, j1+i1-1 ), 1,
430 $ a( i2, j1+i1 ), lda )
431
432
433
434 IF( i2.LT.m )
435 $
CALL dswap( m-i2, a( i2+1, j1+i1-1 ), 1,
436 $ a( i2+1, j1+i2-1 ), 1 )
437
438
439
440 piv = a( i1, j1+i1-1 )
441 a( i1, j1+i1-1 ) = a( i2, j1+i2-1 )
442 a( i2, j1+i2-1 ) = piv
443
444
445
446 CALL dswap( i1-1, h( i1, 1 ), ldh, h( i2, 1 ), ldh )
447 ipiv( i1 ) = i2
448
449 IF( i1.GT.(k1-1) ) THEN
450
451
452
453
454 CALL dswap( i1-k1+1, a( i1, 1 ), lda,
455 $ a( i2, 1 ), lda )
456 END IF
457 ELSE
458 ipiv( j+1 ) = j+1
459 ENDIF
460
461
462
463 a( j+1, k ) = work( 2 )
464
465 IF( j.LT.nb ) THEN
466
467
468
469 CALL dcopy( m-j, a( j+1, k+1 ), 1,
470 $ h( j+1, j+1 ), 1 )
471 END IF
472
473
474
475
476 IF( j.LT.(m-1) ) THEN
477 IF( a( j+1, k ).NE.zero ) THEN
478 alpha = one / a( j+1, k )
479 CALL dcopy( m-j-1, work( 3 ), 1, a( j+2, k ), 1 )
480 CALL dscal( m-j-1, alpha, a( j+2, k ), 1 )
481 ELSE
482 CALL dlaset(
'Full', m-j-1, 1, zero, zero,
483 $ a( j+2, k ), lda )
484 END IF
485 END IF
486 END IF
487 j = j + 1
488 GO TO 30
489 40 CONTINUE
490 END IF
491 RETURN
492
493
494
subroutine xerbla(srname, info)
subroutine daxpy(n, da, dx, incx, dy, incy)
DAXPY
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
integer function idamax(n, dx, incx)
IDAMAX
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
logical function lsame(ca, cb)
LSAME
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dswap(n, dx, incx, dy, incy)
DSWAP