Go to the documentation of this file.00001 SUBROUTINE DDISNA( JOB, M, N, D, SEP, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER JOB
00010 INTEGER INFO, M, N
00011
00012
00013 DOUBLE PRECISION D( * ), SEP( * )
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 DOUBLE PRECISION ZERO
00072 PARAMETER ( ZERO = 0.0D+0 )
00073
00074
00075 LOGICAL DECR, EIGEN, INCR, LEFT, RIGHT, SING
00076 INTEGER I, K
00077 DOUBLE PRECISION ANORM, EPS, NEWGAP, OLDGAP, SAFMIN, THRESH
00078
00079
00080 LOGICAL LSAME
00081 DOUBLE PRECISION DLAMCH
00082 EXTERNAL LSAME, DLAMCH
00083
00084
00085 INTRINSIC ABS, MAX, MIN
00086
00087
00088 EXTERNAL XERBLA
00089
00090
00091
00092
00093
00094 INFO = 0
00095 EIGEN = LSAME( JOB, 'E' )
00096 LEFT = LSAME( JOB, 'L' )
00097 RIGHT = LSAME( JOB, 'R' )
00098 SING = LEFT .OR. RIGHT
00099 IF( EIGEN ) THEN
00100 K = M
00101 ELSE IF( SING ) THEN
00102 K = MIN( M, N )
00103 END IF
00104 IF( .NOT.EIGEN .AND. .NOT.SING ) THEN
00105 INFO = -1
00106 ELSE IF( M.LT.0 ) THEN
00107 INFO = -2
00108 ELSE IF( K.LT.0 ) THEN
00109 INFO = -3
00110 ELSE
00111 INCR = .TRUE.
00112 DECR = .TRUE.
00113 DO 10 I = 1, K - 1
00114 IF( INCR )
00115 $ INCR = INCR .AND. D( I ).LE.D( I+1 )
00116 IF( DECR )
00117 $ DECR = DECR .AND. D( I ).GE.D( I+1 )
00118 10 CONTINUE
00119 IF( SING .AND. K.GT.0 ) THEN
00120 IF( INCR )
00121 $ INCR = INCR .AND. ZERO.LE.D( 1 )
00122 IF( DECR )
00123 $ DECR = DECR .AND. D( K ).GE.ZERO
00124 END IF
00125 IF( .NOT.( INCR .OR. DECR ) )
00126 $ INFO = -4
00127 END IF
00128 IF( INFO.NE.0 ) THEN
00129 CALL XERBLA( 'DDISNA', -INFO )
00130 RETURN
00131 END IF
00132
00133
00134
00135 IF( K.EQ.0 )
00136 $ RETURN
00137
00138
00139
00140 IF( K.EQ.1 ) THEN
00141 SEP( 1 ) = DLAMCH( 'O' )
00142 ELSE
00143 OLDGAP = ABS( D( 2 )-D( 1 ) )
00144 SEP( 1 ) = OLDGAP
00145 DO 20 I = 2, K - 1
00146 NEWGAP = ABS( D( I+1 )-D( I ) )
00147 SEP( I ) = MIN( OLDGAP, NEWGAP )
00148 OLDGAP = NEWGAP
00149 20 CONTINUE
00150 SEP( K ) = OLDGAP
00151 END IF
00152 IF( SING ) THEN
00153 IF( ( LEFT .AND. M.GT.N ) .OR. ( RIGHT .AND. M.LT.N ) ) THEN
00154 IF( INCR )
00155 $ SEP( 1 ) = MIN( SEP( 1 ), D( 1 ) )
00156 IF( DECR )
00157 $ SEP( K ) = MIN( SEP( K ), D( K ) )
00158 END IF
00159 END IF
00160
00161
00162
00163
00164 EPS = DLAMCH( 'E' )
00165 SAFMIN = DLAMCH( 'S' )
00166 ANORM = MAX( ABS( D( 1 ) ), ABS( D( K ) ) )
00167 IF( ANORM.EQ.ZERO ) THEN
00168 THRESH = EPS
00169 ELSE
00170 THRESH = MAX( EPS*ANORM, SAFMIN )
00171 END IF
00172 DO 30 I = 1, K
00173 SEP( I ) = MAX( SEP( I ), THRESH )
00174 30 CONTINUE
00175
00176 RETURN
00177
00178
00179
00180 END