]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HERWIG/jimmy/divon4/bndopt.F
make scan of dEdx blocks consistent, there is only one block
[u/mrichter/AliRoot.git] / HERWIG / jimmy / divon4 / bndopt.F
CommitLineData
ef94df36 1*CMZ : 23/08/93 13.30.10 by Jonathan Butterworth
2*-- Author :
3 SUBROUTINE BNDOPT (N,XMIN,XMAX,XLOW,XHI,FMIN,FMAX,FLOBD,FUPBD,X,XT
4 1EMP,GFREE,PFREE,GACTV,GNEW,AHESS,DELTA,FTOL,GTOL,ETA,ALFMAX,MAXFUN
5 2,NFCNT,IFREE,IACTV,IPRINT,IRESLT)
6 INTEGER N, MAXFUN, NFCNT, IPRINT, IRESLT
7 INTEGER IFREE(N), IACTV(N)
8 DOUBLE PRECISION FMIN, FMAX, FLOBD, FUPBD, DELTA, FTOL, GTOL,
9 1 ETA, ALFMAX
10 DOUBLE PRECISION XMIN(N), XMAX(N), XLOW(N), XHI(N), X(N),
11 1 XTEMP(N), GFREE(N), PFREE(N), GACTV(N), GNEW(N),
12 2 AHESS(N,N)
13 INTEGER I, IBDEL, IBTRUE, IDNEW, II, IIMIN, ILOC, INEW, IPCNT,
14 1 ITER, ITEST, J, NACTV, NADIM, NFREE
15 LOGICAL LOCAL, NEGMUL, XALTER
16 DOUBLE PRECISION A, ALPHA, ALRAT, B, BTOL, B1, D, DEL, DFUN,
17 1 DVDOT, DXNORM, E, EPSMCH, FA, FBD, FBEST, FDIFF,
18 2 FOLD, FRAT, FTEST, FTRUE, FU, FV, FW, FY, FZ,
19 3 GNORM, GTEST1, GTEST2, GTP, GU, OLDF, PE,
20 4 PNORM, QEPS, R, RR, RTEPS, SCXBD, SFTBND, SS,
21 5 STEPMX, T, TOL, U, XBEST, XLAMDA, XNORM, XRAT,
22 6 XV, XW, ZTOL1, ZTOL2
23 DATA EPSMCH/2.22D-16/
24 SAVE
25 RTEPS=SQRT(EPSMCH)
26 QEPS=SQRT(RTEPS)
27 ZTOL1=ABS(FTOL)
28 NADIM=N
29 NFCNT=0
30 DO 10 I=1,N
31 IFREE(I)=0
32 IACTV(I)=0
33 10 CONTINUE
34 IF(IPRINT.LT.0) GOTO 20
35 WRITE(6,310)
36 WRITE(6,320) (XLOW(I),I=1,N)
37 WRITE(6,330) (XHI(I),I=1,N)
38 20 DO 300 IIMIN=1,2
39 IF(IIMIN.EQ.2) GOTO 30
40 CALL DVCOPY(N,XMIN,X)
41 FTRUE=FMIN
42 FBEST=FTRUE
43 FBD=FLOBD
44 GOTO 40
45 30 CALL DVCOPY(N,XMAX,X)
46 FTRUE=FMAX
47 FBEST=-FTRUE
48 FBD=FUPBD
49 40 ITER=0
50 GNORM=0.0D+0
51 IPCNT=0
52 FOLD=FBEST
53 LOCAL=.FALSE.
54 DO 60 J=1,N
55 DO 50 I=1,N
56 AHESS(I,J)=0.0D+0
57 50 CONTINUE
58 AHESS(J,J)=1.0D+0
59 60 CONTINUE
60 BTOL=QEPS
61 70 CALL BNDTST(N,X,XLOW,XHI,BTOL,NFREE,IFREE,NACTV,IACTV,XALTER)
62 IF(.NOT.XALTER) GOTO 80
63 FTRUE=DFUN(N,X)
64 FBEST=FTRUE
65 IF(IIMIN.EQ.2) FBEST=-FTRUE
66 FOLD=FBEST
67 80 IF(IPRINT.LT.0) GOTO 90
68 IF(IIMIN.EQ.1) WRITE(6,340) FTRUE
69 IF(IIMIN.EQ.2) WRITE(6,350) FTRUE
70 IF(LOCAL) WRITE(6,450) NFCNT
71 WRITE(6,360) (X(I),I=1,N)
72 WRITE(6,370) NFREE,NACTV
73 IF(NFREE.GT.0.AND.NFREE.LT.N) WRITE(6,380) (IFREE(I),I=1,NFREE)
74 IF(NACTV.GT.0.AND.NACTV.LT.N) WRITE(6,390) (IACTV(I),I=1,NACTV)
75 90 FTEST=RTEPS*(1.0D+0+ABS(FBD))
76 IF(ABS(FBD-FBEST).LT.FTEST) GOTO 250
77 IF(NFREE.EQ.0) GOTO 250
78 CALL GRDCMP(N,NFREE,IFREE,X,FTRUE,DELTA,XHI,XTEMP,GFREE)
79 NFCNT=NFCNT+NFREE
80 IF(IIMIN.EQ.1) GOTO 110
81 DO 100 I=1,NFREE
82 GFREE(I)=-GFREE(I)
83 100 CONTINUE
84 110 CALL RLEN(NFREE,GFREE,GNORM)
85 IF(GNORM.GT.GTOL.OR.LOCAL) GOTO 120
86 IF(IPRINT.GT.0) WRITE(6,440)
87 DEL=DELTA
88 IF(DELTA.LT.1.0D+0) DEL=SQRT(DELTA)
89 ZTOL2=10.0D+0*SQRT(RTEPS*DEL)
90 IF(ZTOL2.LT.RTEPS) ZTOL2=RTEPS
91 LOCAL=.TRUE.
92 CALL LOCSCH(IIMIN,N,NFREE,IFREE,X,FBEST,XLOW,XHI,DEL,ZTOL2,NFCNT,
93 1GNEW,FY,XTEMP,FZ,PFREE)
94 FTEST=RTEPS*(1.0D+0+ABS(FBEST))
95 IF(FZ.GE.FBEST.OR.ABS(FZ-FBEST).LT.FTEST) GOTO 250
96 CALL DVCOPY(N,XTEMP,X)
97 FBEST=FZ
98 FTRUE=FZ
99 IF(IIMIN.EQ.2) FTRUE=-FZ
100 GOTO 70
101 120 ITER=ITER+1
102 IF(NFCNT.GT.MAXFUN) GOTO 270
103 IF(IPCNT.GE.IPRINT) IPCNT=0
104 IPCNT=IPCNT+1
105 IF(NFREE.EQ.0) GOTO 250
106 CALL LDLSOL(NFREE,NADIM,AHESS,GFREE,PFREE)
107 DO 130 I=1,NFREE
108 PFREE(I)=-PFREE(I)
109 130 CONTINUE
110 CALL RLEN(NFREE,PFREE,PNORM)
111 PE=PNORM+RTEPS
112 CALL FEASMV(N,NFREE,IFREE,X,PFREE,XLOW,XHI,EPSMCH,STEPMX,INEW,IDN
113 1EW)
114 IF((STEPMX*PE).GT.DELTA) GOTO 140
115 CALL ADDBND(N,NFREE,IFREE,NACTV,IACTV,INEW,IDNEW,NADIM,AHESS,XTEM
116 1P,GFREE,GNORM)
117 ITER=ITER-1
118 GOTO 120
119 140 GTP=DVDOT(NFREE,GFREE,PFREE)
120 XLAMDA=MIN(STEPMX,ALFMAX)
121 U=MIN(1.0D+0,XLAMDA)
122 FU=FBEST
123 GU=GTP
124 ILOC=1
125 SFTBND=DELTA/PE
126 T=RTEPS/PE
127 DO 150 I=1,N
128 XTEMP(I)=X(I)
129 150 CONTINUE
130 160 CALL NEWPTQ(RTEPS,T,ETA,SFTBND,XLAMDA,U,FU,GU,XBEST,FBEST,XW,FW,X
131 1V,FV,A,FA,B,OLDF,B1,SCXBD,E,D,RR,SS,GTEST1,GTEST2,TOL,ILOC,ITEST)
132 IF(ITEST.NE.1) GOTO 180
133 R=XBEST+U
134 DO 170 I=1,NFREE
135 II=IFREE(I)
136 XTEMP(II)=X(II)+R*PFREE(I)
137 170 CONTINUE
138 FU=DFUN(N,XTEMP)
139 NFCNT=NFCNT+1
140 IF(IIMIN.EQ.2) FU=-FU
141 GOTO 160
142 180 IF(ITEST.NE.0) GOTO 250
143 ALPHA=XBEST
144 DO 190 I=1,NFREE
145 II=IFREE(I)
146 X(II)=X(II)+XBEST*PFREE(I)
147 190 CONTINUE
148 FTRUE=FBEST
149 IF(IIMIN.EQ.2) FTRUE=-FBEST
150 IF(IPRINT.LE.0.OR.IPCNT.LT.IPRINT) GOTO 200
151 WRITE(6,400) ITER,NFCNT,FBEST
152 WRITE(6,360) (X(I),I=1,N)
153 WRITE(6,370) NFREE,NACTV
154 IF(NFREE.GT.0.AND.NFREE.LT.N) WRITE(6,380) (IFREE(I),I=1,NFREE)
155 IF(NACTV.GT.0.AND.NACTV.LT.N) WRITE(6,390) (IACTV(I),I=1,NACTV)
156 200 CALL GRDCMP(N,NFREE,IFREE,X,FTRUE,DELTA,XHI,XTEMP,GNEW)
157 CALL RLEN(NFREE,GNEW,GNORM)
158 IF(IPRINT.GT.0.AND.IPCNT.EQ.IPRINT) WRITE(6,460) GNORM
159 IF(IIMIN.EQ.1) GOTO 220
160 DO 210 I=1,NFREE
161 GNEW(I)=-GNEW(I)
162 210 CONTINUE
163 220 NFCNT=NFCNT+NFREE
164 CALL BFGS(NFREE,NADIM,AHESS,EPSMCH,GFREE,GNEW,PFREE,ALPHA,XTEMP)
165 DO 230 I=1,NFREE
166 GFREE(I)=GNEW(I)
167 230 CONTINUE
168 ALRAT=ABS(ALPHA-STEPMX)/STEPMX
169 IF(ALRAT.GE.QEPS) GOTO 240
170 CALL ADDBND(N,NFREE,IFREE,NACTV,IACTV,INEW,IDNEW,NADIM,AHESS,XTEM
171 1P,GFREE,GNORM)
172 GOTO 120
173 240 FDIFF=FOLD-FBEST
174 FRAT=FDIFF/(1.0D+0+ABS(FBEST))
175 IF(FTOL.LT.0.0D+0) FRAT=FDIFF/MAX(ABS(FBEST),EPSMCH)
176 CALL RLEN(N,X,XNORM)
177 DXNORM=ALPHA*PNORM
178 XRAT=DXNORM/(1.0D+0+XNORM)
179 IF(FTOL.LT.0.0D+0) XRAT=DXNORM/MAX(XNORM,EPSMCH)
180 FOLD=FBEST
181 IF(FRAT.GT.ZTOL1.OR.XRAT.GT.ZTOL1) GOTO 120
182 250 IF(NACTV.EQ.0) GOTO 270
183 CALL MULCHK(N,NACTV,IACTV,IIMIN,RTEPS,X,XHI,FTRUE,DELTA,XTEMP,GAC
184 1TV,NEGMUL,IBDEL,IBTRUE)
185 NFCNT=NFCNT+NACTV
186 IF(IPRINT.LE.0.OR.IPCNT.LT.IPRINT) GOTO 260
187 WRITE(6,420) ITER,NACTV
188 WRITE(6,390) (IACTV(I),I=1,NACTV)
189 WRITE(6,430) (GACTV(I),I=1,NACTV)
190 260 IF(.NOT.NEGMUL) GOTO 270
191 CALL DELBND(N,NACTV,IACTV,NFREE,IFREE,IBDEL,IBTRUE,GACTV,NADIM,AH
192 1ESS,GFREE,GNORM)
193 GOTO 120
194 270 IF(IPRINT.LT.0) GOTO 280
195 WRITE(6,410) ITER,NFCNT,FTRUE
196 WRITE(6,360) (X(I),I=1,N)
197 WRITE(6,370) NFREE,NACTV
198 IF(NFREE.GT.0.AND.NFREE.LT.N) WRITE(6,380) (IFREE(I),I=1,NFREE)
199 IF(NACTV.GT.0.AND.NACTV.LT.N) WRITE(6,390) (IACTV(I),I=1,NACTV)
200 280 IF(IIMIN.EQ.2) GOTO 290
201 FMIN=FBEST
202 CALL DVCOPY(N,X,XMIN)
203 GOTO 300
204 290 FMAX=-FBEST
205 CALL DVCOPY(N,X,XMAX)
206 300 CONTINUE
207 RETURN
208 310 FORMAT('-START OF OPTIMIZATION')
209 320 FORMAT(' LOWER BOUNDS', 6(1PD16.6))
210 330 FORMAT(' UPPER BOUNDS', 6(1PD16.6))
211 340 FORMAT(' MINIMIZATION STEP -- INITIAL FMIN =', 1PD16.6)
212 350 FORMAT('0MAXIMIZATION STEP -- INITIAL FMAX =', 1PD16.6)
213 360 FORMAT(' X ARRAY'/6(1PD16.6))
214 370 FORMAT(1X,I5,' FREE VARIABLES',I5,' FIXED VARIABLES')
215 380 FORMAT(' INDICES OF FREE VARIABLES'/10I8)
216 390 FORMAT(' INDICES OF FIXED VARIABLES'/10I8)
217 400 FORMAT('0 AFTER ITERATION',I5,' AND',I5,
218 1 ' FUNCTION EVALUATIONS, THE FUNCTION VALUE IS',1PD16.6)
219 410 FORMAT('0*** FINAL RESULT ***'/' AFTER',I5,
220 1 ' ITERATIONS AND', I6,' FUNCTION EVALUATIONS',
221 2 ' THE BEST FUNCTION VALUE IS', 1PD17.7)
222 420 FORMAT('0 AT ITERATION',I6,' CHECK MULTIPLIERS',
223 1 ' FOR THE',I5,' FIXED VARIABLES')
224 430 FORMAT(' GRADIENT WITH RESPECT TO FIXED VARIABLES'/
225 1 1X,6(1PD16.6))
226 440 FORMAT(' EXECUTE LOCAL SEARCH')
227 450 FORMAT(1X,I5,' FUNCTION EVALUATIONS AFTER LOCAL SEARCH')
228 460 FORMAT(' NORM OF PROJECTED GRADIENT =', 1PD16.6)
229 END