886
  887
  888
  889
  890
  891
  892
  893
  894      INTEGER            IEFLAG, IJOB, INFO, MINP, MMAX, MOUT, N
  895      DOUBLE PRECISION   ABSTOL, LSAVE, PIVMIN, RELTOL
  896
  897
  898      INTEGER            INTVLCT( * ), NVAL( * )
  899      DOUBLE PRECISION   D( * ), INTVL( * )
  900
  901
  902
  903
  904
  905
  906
  907
  908
  909
  910
  911
  912
  913
  914
  915
  916
  917
  918
  919
  920
  921
  922
  923
  924
  925
  926
  927
  928
  929
  930
  931
  932
  933
  934
  935
  936
  937
  938
  939
  940
  941
  942
  943
  944
  945
  946
  947
  948
  949
  950
  951
  952
  953
  954
  955
  956
  957
  958
  959
  960
  961
  962
  963
  964
  965
  966
  967
  968
  969
  970
  971
  972
  973
  974
  975
  976
  977
  978
  979
  980
  981
  982
  983
  984
  985
  986
  987
  988
  989
  990
  991
  992
  993
  994
  995
  996
  997
  998
  999
 1000
 1001
 1002
 1003
 1004
 1005
 1006
 1007
 1008
 1009
 1010
 1011
 1012
 1013
 1014
 1015
 1016
 1017      INTRINSIC          abs, int, log, 
max, 
min 
 1018
 1019
 1021
 1022
 1023      DOUBLE PRECISION   ZERO, TWO, HALF
 1024      parameter( zero = 0.0d+0, two = 2.0d+0,
 1025     $                   half = 1.0d+0 / two )
 1026
 1027
 1028      INTEGER            I, ITMAX, J, K, KF, KL, KLNEW, L, LCNT, LREQ,
 1029     $                   NALPHA, NBETA, NMID, RCNT, RREQ
 1030      DOUBLE PRECISION   ALPHA, BETA, MID
 1031
 1032
 1033
 1034      kf = 1
 1035      kl = minp + 1
 1036      info = 0
 1037      IF( intvl( 2 )-intvl( 1 ).LE.zero ) THEN
 1038         info = minp
 1039         mout = kf
 1040         RETURN
 1041      END IF
 1042      IF( ijob.EQ.0 ) THEN
 1043
 1044
 1045
 1046         CALL pdlaecv( 0, kf, kl, intvl, intvlct, nval,
 
 1047     $                 
max( abstol, pivmin ), reltol )
 
 1048         IF( kf.GE.kl )
 1049     $      GO TO 60
 1050
 1051
 1052
 1053         itmax = int( ( log( intvl( 2 )-intvl( 1 )+pivmin )-
 1054     $           log( pivmin ) ) / log( two ) ) + 2
 1055
 1056
 1057
 1058         DO 20 i = 1, itmax
 1059            klnew = kl
 1060            DO 10 j = kf, kl - 1
 1061               k = 2*j
 1062
 1063
 1064
 1065               mid = half*( intvl( k-1 )+intvl( k ) )
 1066               IF( ieflag.EQ.0 ) THEN
 1067                  CALL pdlapdct( mid, n, d, pivmin, nmid )
 
 1068               ELSE IF( ieflag.EQ.1 ) THEN
 1069                  CALL pdlaiectb( mid, n, d, nmid )
 1070               ELSE
 1071                  CALL pdlaiectl( mid, n, d, nmid )
 1072               END IF
 1073               lreq = nval( k-1 )
 1074               rreq = nval( k )
 1075               IF( kl.EQ.1 )
 1076     $            nmid = 
min( intvlct( k ),
 
 1077     $                   
max( intvlct( k-1 ), nmid ) )
 
 1078               IF( nmid.LE.nval( k-1 ) ) THEN
 1079                  intvl( k-1 ) = mid
 1080                  intvlct( k-1 ) = nmid
 1081               END IF
 1082               IF( nmid.GE.nval( k ) ) THEN
 1083                  intvl( k ) = mid
 1084                  intvlct( k ) = nmid
 1085               END IF
 1086               IF( nmid.GT.lreq .AND. nmid.LT.rreq ) THEN
 1087                  l = 2*klnew
 1088                  intvl( l-1 ) = mid
 1089                  intvl( l ) = intvl( k )
 1090                  intvlct( l-1 ) = nval( k )
 1091                  intvlct( l ) = intvlct( k )
 1092                  intvl( k ) = mid
 1093                  intvlct( k ) = nval( k-1 )
 1094                  nval( l-1 ) = nval( k )
 1095                  nval( l ) = nval( l-1 )
 1096                  nval( k ) = nval( k-1 )
 1097                  klnew = klnew + 1
 1098               END IF
 1099   10       CONTINUE
 1100            kl = klnew
 1101            CALL pdlaecv( 0, kf, kl, intvl, intvlct, nval,
 
 1102     $                    
max( abstol, pivmin ), reltol )
 
 1103            IF( kf.GE.kl )
 1104     $         GO TO 60
 1105   20    CONTINUE
 1106      ELSE IF( ijob.EQ.1 ) THEN
 1107         alpha = intvl( 1 )
 1108         beta = intvl( 2 )
 1109         nalpha = intvlct( 1 )
 1110         nbeta = intvlct( 2 )
 1111         lsave = alpha
 1112         lreq = nval( 1 )
 1113         rreq = nval( 2 )
 1114   30    CONTINUE
 1115         IF( nbeta.NE.rreq .AND. beta-alpha.GT.
 1116     $       
max( abstol, reltol*
max( abs( alpha ), abs( beta ) ) ) )
 
 1117     $        THEN
 1118
 1119
 1120
 1121            mid = half*( alpha+beta )
 1122            IF( ieflag.EQ.0 ) THEN
 1123               CALL pdlapdct( mid, n, d, pivmin, nmid )
 
 1124            ELSE IF( ieflag.EQ.1 ) THEN
 1125               CALL pdlaiectb( mid, n, d, nmid )
 1126            ELSE
 1127               CALL pdlaiectl( mid, n, d, nmid )
 1128            END IF
 1129            nmid = 
min( nbeta, 
max( nalpha, nmid ) )
 
 1130            IF( nmid.GE.rreq ) THEN
 1131               beta = mid
 1132               nbeta = nmid
 1133            ELSE
 1134               alpha = mid
 1135               nalpha = nmid
 1136               IF( nmid.EQ.lreq )
 1137     $            lsave = alpha
 1138            END IF
 1139            GO TO 30
 1140         END IF
 1141         kl = kf
 1142         intvl( 1 ) = alpha
 1143         intvl( 2 ) = beta
 1144         intvlct( 1 ) = nalpha
 1145         intvlct( 2 ) = nbeta
 1146      ELSE IF( ijob.EQ.2 ) THEN
 1147
 1148
 1149
 1150         CALL pdlaecv( 1, kf, kl, intvl, intvlct, nval,
 
 1151     $                 
max( abstol, pivmin ), reltol )
 
 1152         IF( kf.GE.kl )
 1153     $      GO TO 60
 1154
 1155
 1156
 1157         itmax = int( ( log( intvl( 2 )-intvl( 1 )+pivmin )-
 1158     $           log( pivmin ) ) / log( two ) ) + 2
 1159
 1160
 1161
 1162         DO 50 i = 1, itmax
 1163            klnew = kl
 1164            DO 40 j = kf, kl - 1
 1165               k = 2*j
 1166               mid = half*( intvl( k-1 )+intvl( k ) )
 1167               IF( ieflag.EQ.0 ) THEN
 1168                  CALL pdlapdct( mid, n, d, pivmin, nmid )
 
 1169               ELSE IF( ieflag.EQ.1 ) THEN
 1170                  CALL pdlaiectb( mid, n, d, nmid )
 1171               ELSE
 1172                  CALL pdlaiectl( mid, n, d, nmid )
 1173               END IF
 1174               lcnt = intvlct( k-1 )
 1175               rcnt = intvlct( k )
 1176               nmid = 
min( rcnt, 
max( lcnt, nmid ) )
 
 1177
 1178
 1179
 1180               IF( nmid.EQ.lcnt ) THEN
 1181                  intvl( k-1 ) = mid
 1182               ELSE IF( nmid.EQ.rcnt ) THEN
 1183                  intvl( k ) = mid
 1184               ELSE IF( klnew.LT.mmax+1 ) THEN
 1185                  l = 2*klnew
 1186                  intvl( l-1 ) = mid
 1187                  intvl( l ) = intvl( k )
 1188                  intvlct( l-1 ) = nmid
 1189                  intvlct( l ) = intvlct( k )
 1190                  intvl( k ) = mid
 1191                  intvlct( k ) = nmid
 1192                  klnew = klnew + 1
 1193               ELSE
 1194                  info = mmax + 1
 1195                  RETURN
 1196               END IF
 1197   40       CONTINUE
 1198            kl = klnew
 1199            CALL pdlaecv( 1, kf, kl, intvl, intvlct, nval,
 
 1200     $                    
max( abstol, pivmin ), reltol )
 
 1201            IF( kf.GE.kl )
 1202     $         GO TO 60
 1203   50    CONTINUE
 1204      END IF
 1205   60 CONTINUE
 1206      info = 
max( kl-kf, 0 )
 
 1207      mout = kl - 1
 1208      RETURN
 1209
 1210
 1211
subroutine pdlaecv(ijob, kf, kl, intvl, intvlct, nval, abstol, reltol)
 
subroutine pdlapdct(sigma, n, d, pivmin, count)