118 SUBROUTINE ddisna( JOB, M, N, D, SEP, INFO )
130 DOUBLE PRECISION D( * ), SEP( * )
136 DOUBLE PRECISION ZERO
137 parameter ( zero = 0.0d+0 )
140 LOGICAL DECR, EIGEN, INCR, LEFT, RIGHT, SING
142 DOUBLE PRECISION ANORM, EPS, NEWGAP, OLDGAP, SAFMIN, THRESH
146 DOUBLE PRECISION DLAMCH
147 EXTERNAL lsame, dlamch
150 INTRINSIC abs, max, min
160 eigen = lsame( job,
'E' )
161 left = lsame( job,
'L' )
162 right = lsame( job,
'R' )
163 sing = left .OR. right
169 IF( .NOT.eigen .AND. .NOT.sing )
THEN
171 ELSE IF( m.LT.0 )
THEN
173 ELSE IF( k.LT.0 )
THEN
180 $ incr = incr .AND. d( i ).LE.d( i+1 )
182 $ decr = decr .AND. d( i ).GE.d( i+1 )
184 IF( sing .AND. k.GT.0 )
THEN
186 $ incr = incr .AND. zero.LE.d( 1 )
188 $ decr = decr .AND. d( k ).GE.zero
190 IF( .NOT.( incr .OR. decr ) )
194 CALL xerbla(
'DDISNA', -info )
206 sep( 1 ) = dlamch(
'O' )
208 oldgap = abs( d( 2 )-d( 1 ) )
211 newgap = abs( d( i+1 )-d( i ) )
212 sep( i ) = min( oldgap, newgap )
218 IF( ( left .AND. m.GT.n ) .OR. ( right .AND. m.LT.n ) )
THEN
220 $ sep( 1 ) = min( sep( 1 ), d( 1 ) )
222 $ sep( k ) = min( sep( k ), d( k ) )
230 safmin = dlamch(
'S' )
231 anorm = max( abs( d( 1 ) ), abs( d( k ) ) )
232 IF( anorm.EQ.zero )
THEN
235 thresh = max( eps*anorm, safmin )
238 sep( i ) = max( sep( i ), thresh )
subroutine ddisna(JOB, M, N, D, SEP, INFO)
DDISNA
subroutine xerbla(SRNAME, INFO)
XERBLA