SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ dlaneg2()

integer function dlaneg2 ( integer  n,
double precision, dimension( * )  d,
double precision, dimension( * )  lld,
double precision  sigma,
double precision  pivmin,
integer  r 
)

Definition at line 336 of file dlarrb2.f.

337*
338 IMPLICIT NONE
339*
340 INTEGER DLANEG2
341*
342* .. Scalar Arguments ..
343 INTEGER N, R
344 DOUBLE PRECISION PIVMIN, SIGMA
345* ..
346* .. Array Arguments ..
347 DOUBLE PRECISION D( * ), LLD( * )
348*
349 DOUBLE PRECISION ZERO
350 parameter( zero = 0.0d0 )
351
352 INTEGER BLKLEN
353 parameter( blklen = 2048 )
354* ..
355* .. Local Scalars ..
356 INTEGER BJ, J, NEG1, NEG2, NEGCNT, TO
357 DOUBLE PRECISION DMINUS, DPLUS, GAMMA, P, S, T, TMP, XSAV
358 LOGICAL SAWNAN
359* ..
360* .. External Functions ..
361 LOGICAL DISNAN
362 EXTERNAL disnan
363
364 negcnt = 0
365*
366* I) upper part: L D L^T - SIGMA I = L+ D+ L+^T
367* run dstqds block-wise to avoid excessive work when NaNs occur
368*
369 s = zero
370 DO 210 bj = 1, r-1, blklen
371 neg1 = 0
372 xsav = s
373 to = bj+blklen-1
374 IF ( to.LE.r-1 ) THEN
375 DO 21 j = bj, to
376 t = s - sigma
377 dplus = d( j ) + t
378 IF( dplus.LT.zero ) neg1=neg1 + 1
379 s = t*lld( j ) / dplus
380 21 CONTINUE
381 ELSE
382 DO 22 j = bj, r-1
383 t = s - sigma
384 dplus = d( j ) + t
385 IF( dplus.LT.zero ) neg1=neg1 + 1
386 s = t*lld( j ) / dplus
387 22 CONTINUE
388 ENDIF
389 sawnan = disnan( s )
390*
391 IF( sawnan ) THEN
392 neg1 = 0
393 s = xsav
394 to = bj+blklen-1
395 IF ( to.LE.r-1 ) THEN
396 DO 23 j = bj, to
397 t = s - sigma
398 dplus = d( j ) + t
399 IF(abs(dplus).LT.pivmin)
400 $ dplus = -pivmin
401 tmp = lld( j ) / dplus
402 IF( dplus.LT.zero )
403 $ neg1 = neg1 + 1
404 s = t*tmp
405 IF( tmp.EQ.zero ) s = lld( j )
406 23 CONTINUE
407 ELSE
408 DO 24 j = bj, r-1
409 t = s - sigma
410 dplus = d( j ) + t
411 IF(abs(dplus).LT.pivmin)
412 $ dplus = -pivmin
413 tmp = lld( j ) / dplus
414 IF( dplus.LT.zero ) neg1=neg1+1
415 s = t*tmp
416 IF( tmp.EQ.zero ) s = lld( j )
417 24 CONTINUE
418 ENDIF
419 END IF
420 negcnt = negcnt + neg1
421 210 CONTINUE
422*
423* II) lower part: L D L^T - SIGMA I = U- D- U-^T
424*
425 p = d( n ) - sigma
426 DO 230 bj = n-1, r, -blklen
427 neg2 = 0
428 xsav = p
429 to = bj-blklen+1
430 IF ( to.GE.r ) THEN
431 DO 25 j = bj, to, -1
432 dminus = lld( j ) + p
433 IF( dminus.LT.zero ) neg2=neg2+1
434 tmp = p / dminus
435 p = tmp * d( j ) - sigma
436 25 CONTINUE
437 ELSE
438 DO 26 j = bj, r, -1
439 dminus = lld( j ) + p
440 IF( dminus.LT.zero ) neg2=neg2+1
441 tmp = p / dminus
442 p = tmp * d( j ) - sigma
443 26 CONTINUE
444 ENDIF
445 sawnan = disnan( p )
446*
447 IF( sawnan ) THEN
448 neg2 = 0
449 p = xsav
450 to = bj-blklen+1
451 IF ( to.GE.r ) THEN
452 DO 27 j = bj, to, -1
453 dminus = lld( j ) + p
454 IF(abs(dminus).LT.pivmin)
455 $ dminus = -pivmin
456 tmp = d( j ) / dminus
457 IF( dminus.LT.zero )
458 $ neg2 = neg2 + 1
459 p = p*tmp - sigma
460 IF( tmp.EQ.zero )
461 $ p = d( j ) - sigma
462 27 CONTINUE
463 ELSE
464 DO 28 j = bj, r, -1
465 dminus = lld( j ) + p
466 IF(abs(dminus).LT.pivmin)
467 $ dminus = -pivmin
468 tmp = d( j ) / dminus
469 IF( dminus.LT.zero )
470 $ neg2 = neg2 + 1
471 p = p*tmp - sigma
472 IF( tmp.EQ.zero )
473 $ p = d( j ) - sigma
474 28 CONTINUE
475 ENDIF
476 END IF
477 negcnt = negcnt + neg2
478 230 CONTINUE
479*
480* III) Twist index
481*
482 gamma = s + p
483 IF( gamma.LT.zero ) negcnt = negcnt+1
484
485 dlaneg2 = negcnt
integer function dlaneg2(n, d, lld, sigma, pivmin, r)
Definition dlarrb2.f:337
Here is the call graph for this function:
Here is the caller graph for this function: