]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/divon/locsch.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / divon / locsch.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1996/04/01 15:03:27 mclareni
6* Mathlib gen
7*
8*
9#include "gen/pilot.h"
10 SUBROUTINE LOCSCH (IIMIN,N,NFREE,IFREE,X,FX,XLOW,XHI,DELTA,SUFTOL,
11 1NFCNT,Y,FY,Z,FZ,P)
12 INTEGER IIMIN, N, NFREE, NFCNT
13 INTEGER IFREE(N)
14 DOUBLE PRECISION FX, DELTA, SUFTOL, FY, FZ
15 DOUBLE PRECISION X(N), XLOW(N), XHI(N), Y(N), Z(N), P(N)
16 INTEGER I, II, ILOC, ITEST
17 DOUBLE PRECISION A, B, B1, D, DELX, DFUN, E, EPSMCH, ETA, FA,
18 1 FBEST, FSAV, FTEST, FU, FV, FW, GTEST1, GTEST2,
19 2 GTP, GU, OLDF, PE, PNORM, R, RR, RTEPS,
20 3 SCXBD, SFTBND, SMAX, SNMAX, SOPP, SPMAX, SS,
21 4 SSAV, STP, STPDN, STPNEG, STPPOS, STPUP, T,
22 5 TOL, U, XBEST, XLAMDA, XV, XW, YSAV
23 DATA EPSMCH/2.22D-16/
24 RTEPS=SQRT(EPSMCH)
25 DELX=DELTA
26 DO 10 I=1,N
27 Y(I)=X(I)
28 Z(I)=X(I)
29 10 CONTINUE
30 FZ=FX
31 FY=FX
32 SMAX=1.0D+30
33 DO 40 I=1,NFREE
34 II=IFREE(I)
35 STPUP=XHI(II)-X(II)
36 STPDN=X(II)-XLOW(II)
37 IF(STPUP.LT.STPDN) GOTO 20
38 P(I)=1.0D+0
39 STP=STPUP
40 GOTO 30
41 20 P(I)=-1.0D+0
42 STP=STPDN
43 30 IF(STP.LT.SMAX) SMAX=STP
44 40 CONTINUE
45 SMAX=0.9D+0*SMAX
46 50 IF(DELX.GT.SMAX) DELX=SMAX
47 DO 60 I=1,NFREE
48 II=IFREE(I)
49 Y(II)=X(II)+DELX*P(I)
50 60 CONTINUE
51 FY=DFUN(N,Y)
52 IF(IIMIN.EQ.2) FY=-FY
53 NFCNT=NFCNT+1
54 FTEST=SUFTOL*(1.0D+0+ABS(FX))
55 IF(ABS(FX-FY).GT.FTEST.OR.DELX.EQ.SMAX) GOTO 70
56 DELX=5.0D+0*DELX
57 GOTO 50
58 70 DELX=DELTA
59 CALL ORTHVC(N,NFREE,IFREE,X,FX,XLOW,XHI,Y,FY,P,SPMAX,SNMAX)
60 SMAX=0.9D+0*SPMAX
61 SOPP=0.9D+0*SNMAX
62 IF(SMAX.GE.SNMAX.OR.NFREE.EQ.1) GOTO 90
63 DO 80 I=1,NFREE
64 P(I)=-P(I)
65 80 CONTINUE
66 SSAV=SMAX
67 SMAX=SOPP
68 SOPP=SSAV
69 90 IF(DELX.GT.SMAX) DELX=SMAX
70 100 DO 110 I=1,NFREE
71 II=IFREE(I)
72 Z(II)=Y(II)+DELX*P(I)
73 110 CONTINUE
74 FZ=DFUN(N,Z)
75 IF(IIMIN.EQ.2) FZ=-FZ
76 NFCNT=NFCNT+1
77 FTEST=SUFTOL*(1.0D+0+ABS(FY))
78 IF(ABS(FY-FZ).GT.FTEST.OR.(5.0D+0*DELX).GT.SMAX) GOTO 120
79 DELX=5.0D+0*DELX
80 GOTO 100
81 120 IF(FY.EQ.FZ) GOTO 210
82 IF(FY.LT.FZ) GOTO 130
83 GTP=(FZ-FY)/DELX
84 XLAMDA=SMAX/0.9D+0
85 U=MIN(2.0D+0*DELX,SMAX)
86 GOTO 160
87 130 DO 140 I=1,NFREE
88 P(I)=-P(I)
89 140 CONTINUE
90 U=MIN(2.0D+0*DELX,SOPP)
91 XLAMDA=SOPP/0.9D+0+DELX
92 GTP=(FY-FZ)/DELX
93 DO 150 I=1,N
94 YSAV=Y(I)
95 Y(I)=Z(I)
96 Z(I)=YSAV
97 150 CONTINUE
98 FSAV=FY
99 FY=FZ
100 FZ=FSAV
101 160 CALL RLEN(NFREE,P,PNORM)
102 PE=PNORM+RTEPS
103 ILOC=1
104 FU=FY
105 GU=GTP
106 SFTBND=0.0D+0
107 ETA=RTEPS
108 T=RTEPS/PE
109 170 CALL NEWPTQ(RTEPS,T,ETA,SFTBND,XLAMDA,U,FU,GU,XBEST,FBEST,XW,FW,X
110 1V,FV,A,FA,B,OLDF,B1,SCXBD,E,D,RR,SS,GTEST1,GTEST2,TOL,ILOC,ITEST)
111 IF(ITEST.NE.1) GOTO 190
112 R=XBEST+U
113 DO 180 I=1,NFREE
114 II=IFREE(I)
115 Z(II)=Y(II)+R*P(I)
116 180 CONTINUE
117 FU=DFUN(N,Z)
118 IF(IIMIN.EQ.2) FU=-FU
119 NFCNT=NFCNT+1
120 FZ=FU
121 GOTO 170
122 190 IF(ITEST.NE.0) GOTO 210
123 DO 200 I=1,NFREE
124 II=IFREE(I)
125 Z(II)=Y(II)+XBEST*P(I)
126 200 CONTINUE
127 FZ=FBEST
128 210 IF(FZ.EQ.FX) RETURN
129 DO 220 I=1,NFREE
130 II=IFREE(I)
131 P(I)=Z(II)-X(II)
132 220 CONTINUE
133 SPMAX=1.0D+30
134 SNMAX=1.0D+30
135 DO 230 I=1,NFREE
136 II=IFREE(I)
137 CALL MXSTEP(X(II),XLOW(II),XHI(II),P(I),STPPOS,STPNEG)
138 IF(STPPOS.LT.SPMAX) SPMAX=STPPOS
139 IF(STPNEG.LT.SNMAX) SNMAX=STPNEG
140 230 CONTINUE
141 CALL RLEN(NFREE,P,PNORM)
142 GTP=FZ-FX
143 U=MIN(2.0D+0,0.9D+0*SPMAX)
144 XLAMDA=SPMAX
145 IF(FZ.LT.FX) GOTO 270
146 DELX=DELTA/(PNORM+RTEPS)
147 IF(DELX.GT.0.9D+0*SNMAX) DELX=0.9D+0*SNMAX
148 DO 240 I=1,NFREE
149 II=IFREE(I)
150 Y(II)=X(II)-DELX*P(I)
151 240 CONTINUE
152 FY=DFUN(N,Y)
153 IF(IIMIN.EQ.2) FY=-FY
154 NFCNT=NFCNT+1
155 IF(FY.LT.FX) GOTO 250
156 IF(DELX.LT.1.0D+0) GTP=(FX-FY)/DELX
157 GOTO 270
158 250 GTP=(FY-FX)/DELX
159 DO 260 I=1,NFREE
160 P(I)=-P(I)
161 260 CONTINUE
162 U=MIN(2.0D+0*DELX,0.9D+0*SNMAX)
163 XLAMDA=SNMAX
164 270 ILOC=1
165 PE=PNORM+RTEPS
166 FU=FX
167 GU=GTP
168 SFTBND=0.0D+0
169 ETA=RTEPS
170 T=RTEPS/PE
171 280 CALL NEWPTQ(RTEPS,T,ETA,SFTBND,XLAMDA,U,FU,GU,XBEST,FBEST,XW,FW,X
172 1V,FV,A,FA,B,OLDF,B1,SCXBD,E,D,RR,SS,GTEST1,GTEST2,TOL,ILOC,ITEST)
173 IF(ITEST.NE.1) GOTO 300
174 R=XBEST+U
175 DO 290 I=1,NFREE
176 II=IFREE(I)
177 Y(II)=X(II)+R*P(I)
178 290 CONTINUE
179 FU=DFUN(N,Y)
180 IF(IIMIN.EQ.2) FU=-FU
181 NFCNT=NFCNT+1
182 GOTO 280
183 300 IF(ITEST.NE.0) RETURN
184 DO 310 I=1,NFREE
185 II=IFREE(I)
186 Z(II)=X(II)+XBEST*P(I)
187 310 CONTINUE
188 FZ=FBEST
189 RETURN
190 END