00001 SUBROUTINE SLACON( N, V, X, ISGN, EST, KASE )
00002
00003
00004
00005
00006
00007
00008
00009 INTEGER KASE, N
00010 REAL EST
00011
00012
00013 INTEGER ISGN( * )
00014 REAL V( * ), X( * )
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 INTEGER ITMAX
00067 PARAMETER ( ITMAX = 5 )
00068 REAL ZERO, ONE, TWO
00069 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0 )
00070
00071
00072 INTEGER I, ITER, J, JLAST, JUMP
00073 REAL ALTSGN, ESTOLD, TEMP
00074
00075
00076 INTEGER ISAMAX
00077 REAL SASUM
00078 EXTERNAL ISAMAX, SASUM
00079
00080
00081 EXTERNAL SCOPY
00082
00083
00084 INTRINSIC ABS, NINT, REAL, SIGN
00085
00086
00087 SAVE
00088
00089
00090
00091 IF( KASE.EQ.0 ) THEN
00092 DO 10 I = 1, N
00093 X( I ) = ONE / REAL( N )
00094 10 CONTINUE
00095 KASE = 1
00096 JUMP = 1
00097 RETURN
00098 END IF
00099
00100 GO TO ( 20, 40, 70, 110, 140 )JUMP
00101
00102
00103
00104
00105 20 CONTINUE
00106 IF( N.EQ.1 ) THEN
00107 V( 1 ) = X( 1 )
00108 EST = ABS( V( 1 ) )
00109
00110 GO TO 150
00111 END IF
00112 EST = SASUM( N, X, 1 )
00113
00114 DO 30 I = 1, N
00115 X( I ) = SIGN( ONE, X( I ) )
00116 ISGN( I ) = NINT( X( I ) )
00117 30 CONTINUE
00118 KASE = 2
00119 JUMP = 2
00120 RETURN
00121
00122
00123
00124
00125 40 CONTINUE
00126 J = ISAMAX( N, X, 1 )
00127 ITER = 2
00128
00129
00130
00131 50 CONTINUE
00132 DO 60 I = 1, N
00133 X( I ) = ZERO
00134 60 CONTINUE
00135 X( J ) = ONE
00136 KASE = 1
00137 JUMP = 3
00138 RETURN
00139
00140
00141
00142
00143 70 CONTINUE
00144 CALL SCOPY( N, X, 1, V, 1 )
00145 ESTOLD = EST
00146 EST = SASUM( N, V, 1 )
00147 DO 80 I = 1, N
00148 IF( NINT( SIGN( ONE, X( I ) ) ).NE.ISGN( I ) )
00149 $ GO TO 90
00150 80 CONTINUE
00151
00152 GO TO 120
00153
00154 90 CONTINUE
00155
00156 IF( EST.LE.ESTOLD )
00157 $ GO TO 120
00158
00159 DO 100 I = 1, N
00160 X( I ) = SIGN( ONE, X( I ) )
00161 ISGN( I ) = NINT( X( I ) )
00162 100 CONTINUE
00163 KASE = 2
00164 JUMP = 4
00165 RETURN
00166
00167
00168
00169
00170 110 CONTINUE
00171 JLAST = J
00172 J = ISAMAX( N, X, 1 )
00173 IF( ( X( JLAST ).NE.ABS( X( J ) ) ) .AND. ( ITER.LT.ITMAX ) ) THEN
00174 ITER = ITER + 1
00175 GO TO 50
00176 END IF
00177
00178
00179
00180 120 CONTINUE
00181 ALTSGN = ONE
00182 DO 130 I = 1, N
00183 X( I ) = ALTSGN*( ONE+REAL( I-1 ) / REAL( N-1 ) )
00184 ALTSGN = -ALTSGN
00185 130 CONTINUE
00186 KASE = 1
00187 JUMP = 5
00188 RETURN
00189
00190
00191
00192
00193 140 CONTINUE
00194 TEMP = TWO*( SASUM( N, X, 1 ) / REAL( 3*N ) )
00195 IF( TEMP.GT.EST ) THEN
00196 CALL SCOPY( N, X, 1, V, 1 )
00197 EST = TEMP
00198 END IF
00199
00200 150 CONTINUE
00201 KASE = 0
00202 RETURN
00203
00204
00205
00206 END