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)