114      SUBROUTINE ddisna( JOB, M, N, D, SEP, INFO )
 
  125      DOUBLE PRECISION   D( * ), SEP( * )
 
  131      DOUBLE PRECISION   ZERO
 
  132      parameter( zero = 0.0d+0 )
 
  135      LOGICAL            DECR, EIGEN, INCR, LEFT, RIGHT, SING
 
  137      DOUBLE PRECISION   ANORM, EPS, NEWGAP, OLDGAP, SAFMIN, THRESH
 
  141      DOUBLE PRECISION   DLAMCH
 
  142      EXTERNAL           lsame, dlamch
 
  145      INTRINSIC          abs, max, min
 
  155      eigen = lsame( job, 
'E' )
 
  156      left = lsame( job, 
'L' )
 
  157      right = lsame( job, 
'R' )
 
  158      sing = left .OR. right
 
  164      IF( .NOT.eigen .AND. .NOT.sing ) 
THEN 
  166      ELSE IF( m.LT.0 ) 
THEN 
  168      ELSE IF( k.LT.0 ) 
THEN 
  175     $         incr = incr .AND. d( i ).LE.d( i+1 )
 
  177     $         decr = decr .AND. d( i ).GE.d( i+1 )
 
  179         IF( sing .AND. k.GT.0 ) 
THEN 
  181     $         incr = incr .AND. zero.LE.d( 1 )
 
  183     $         decr = decr .AND. d( k ).GE.zero
 
  185         IF( .NOT.( incr .OR. decr ) )
 
  189         CALL xerbla( 
'DDISNA', -info )
 
  201         sep( 1 ) = dlamch( 
'O' )
 
  203         oldgap = abs( d( 2 )-d( 1 ) )
 
  206            newgap = abs( d( i+1 )-d( i ) )
 
  207            sep( i ) = min( oldgap, newgap )
 
  213         IF( ( left .AND. m.GT.n ) .OR. ( right .AND. m.LT.n ) ) 
THEN 
  215     $         sep( 1 ) = min( sep( 1 ), d( 1 ) )
 
  217     $         sep( k ) = min( sep( k ), d( k ) )
 
  225      safmin = dlamch( 
'S' )
 
  226      anorm = max( abs( d( 1 ) ), abs( d( k ) ) )
 
  227      IF( anorm.EQ.zero ) 
THEN 
  230         thresh = max( eps*anorm, safmin )
 
  233         sep( i ) = max( sep( i ), thresh )