337
  338      IMPLICIT NONE
  339
  340      INTEGER DLANEG2
  341
  342
  343      INTEGER            N, R
  344      DOUBLE PRECISION   PIVMIN, SIGMA
  345
  346
  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
  356      INTEGER            BJ, J, NEG1, NEG2, NEGCNT, TO
  357      DOUBLE PRECISION   DMINUS, DPLUS, GAMMA, P, S, T, TMP, XSAV
  358      LOGICAL SAWNAN
  359
  360
  361      LOGICAL DISNAN
  362      EXTERNAL disnan
  363      
  364      negcnt = 0
  365
  366
  367
  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
  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
  481
  482      gamma = s + p
  483      IF( gamma.LT.zero ) negcnt = negcnt+1
  484 
integer function dlaneg2(n, d, lld, sigma, pivmin, r)