1 | *
|
---|
2 | * $Id: mncont.F,v 1.1.1.1 2003-06-11 14:18:26 cmv Exp $
|
---|
3 | *
|
---|
4 | * $Log: not supported by cvs2svn $
|
---|
5 | * Revision 1.1.1.1 1996/03/07 14:31:29 mclareni
|
---|
6 | * Minuit
|
---|
7 | *
|
---|
8 | *
|
---|
9 | #include "minuit/pilot.h"
|
---|
10 | SUBROUTINE MNCONT(FCN,KE1,KE2,NPTU,XPTU,YPTU,IERRF,FUTIL)
|
---|
11 | #include "minuit/d506dp.inc"
|
---|
12 | CC Find NPTU points along a contour where the function
|
---|
13 | CC FMIN (X(KE1),X(KE2)) = AMIN+UP
|
---|
14 | CC where FMIN is the minimum of FCN with respect to all
|
---|
15 | CC the other NPAR-2 variable parameters (if any).
|
---|
16 | CC IERRF on return will be equal to the number of points found:
|
---|
17 | CC NPTU if normal termination with NPTU points found
|
---|
18 | CC -1 if errors in the calling sequence (KE1, KE2 not variable)
|
---|
19 | CC 0 if less than four points can be found (using MNMNOT)
|
---|
20 | CC n>3 if only n points can be found (n < NPTU)
|
---|
21 | CC
|
---|
22 | #include "minuit/d506cm.inc"
|
---|
23 | DIMENSION XPTU(NPTU), YPTU(NPTU), W(MNI),GCC(MNI)
|
---|
24 | CHARACTER CHERE*10
|
---|
25 | PARAMETER (CHERE='MNContour ')
|
---|
26 | LOGICAL LDEBUG
|
---|
27 | EXTERNAL FCN,FUTIL
|
---|
28 | C input arguments: parx, pary, devs, ngrid
|
---|
29 | LDEBUG = (IDBG(6) .GE. 1)
|
---|
30 | IF (KE1.LE.0 .OR. KE2.LE.0) GO TO 1350
|
---|
31 | IF (KE1.GT.NU .OR. KE2.GT.NU) GO TO 1350
|
---|
32 | KI1 = NIOFEX(KE1)
|
---|
33 | KI2 = NIOFEX(KE2)
|
---|
34 | IF (KI1.LE.0 .OR. KI2.LE.0) GO TO 1350
|
---|
35 | IF (KI1 .EQ. KI2) GO TO 1350
|
---|
36 | IF (NPTU .LT. 4) GO TO 1400
|
---|
37 | C
|
---|
38 | NFCNCO = NFCN
|
---|
39 | NFCNMX = 100*(NPTU+5)*(NPAR+1)
|
---|
40 | C The minimum
|
---|
41 | CALL MNCUVE(FCN,FUTIL)
|
---|
42 | U1MIN = U(KE1)
|
---|
43 | U2MIN = U(KE2)
|
---|
44 | IERRF = 0
|
---|
45 | CFROM = CHERE
|
---|
46 | NFCNFR = NFCNCO
|
---|
47 | IF (ISW(5) .GE. 0) THEN
|
---|
48 | WRITE (ISYSWR,'(1X,A,I4,A)')
|
---|
49 | + 'START MNCONTOUR CALCULATION OF',NPTU,' POINTS ON CONTOUR.'
|
---|
50 | IF (NPAR .GT. 2) THEN
|
---|
51 | IF (NPAR .EQ. 3) THEN
|
---|
52 | KI3 = 6 - KI1 - KI2
|
---|
53 | KE3 = NEXOFI(KI3)
|
---|
54 | WRITE (ISYSWR,'(1X,A,I3,2X,A)')
|
---|
55 | + 'EACH POINT IS A MINIMUM WITH RESPECT TO PARAMETER ',
|
---|
56 | + KE3, CPNAM(KE3)
|
---|
57 | ELSE
|
---|
58 | WRITE (ISYSWR,'(1X,A,I3,A)')
|
---|
59 | + 'EACH POINT IS A MINIMUM WITH RESPECT TO THE OTHER',
|
---|
60 | + NPAR-2, ' VARIABLE PARAMETERS.'
|
---|
61 | ENDIF
|
---|
62 | ENDIF
|
---|
63 | ENDIF
|
---|
64 | C
|
---|
65 | C Find the first four points using MNMNOT
|
---|
66 | C ........................ first two points
|
---|
67 | CALL MNMNOT(FCN,KE1,KE2,VAL2PL,VAL2MI,FUTIL)
|
---|
68 | IF (ERN(KI1) .EQ. UNDEFI) THEN
|
---|
69 | XPTU(1) = ALIM(KE1)
|
---|
70 | CALL MNWARN('W',CHERE,'Contour squeezed by parameter limits.')
|
---|
71 | ELSE
|
---|
72 | IF (ERN(KI1) .GE. ZERO) GO TO 1500
|
---|
73 | XPTU(1) = U1MIN+ERN(KI1)
|
---|
74 | ENDIF
|
---|
75 | YPTU(1) = VAL2MI
|
---|
76 | C
|
---|
77 | IF (ERP(KI1) .EQ. UNDEFI) THEN
|
---|
78 | XPTU(3) = BLIM(KE1)
|
---|
79 | CALL MNWARN('W',CHERE,'Contour squeezed by parameter limits.')
|
---|
80 | ELSE
|
---|
81 | IF (ERP(KI1) .LE. ZERO) GO TO 1500
|
---|
82 | XPTU(3) = U1MIN+ERP(KI1)
|
---|
83 | ENDIF
|
---|
84 | YPTU(3) = VAL2PL
|
---|
85 | SCALX = 1.0/(XPTU(3) - XPTU(1))
|
---|
86 | C ........................... next two points
|
---|
87 | CALL MNMNOT(FCN,KE2,KE1,VAL2PL,VAL2MI,FUTIL)
|
---|
88 | IF (ERN(KI2) .EQ. UNDEFI) THEN
|
---|
89 | YPTU(2) = ALIM(KE2)
|
---|
90 | CALL MNWARN('W',CHERE,'Contour squeezed by parameter limits.')
|
---|
91 | ELSE
|
---|
92 | IF (ERN(KI2) .GE. ZERO) GO TO 1500
|
---|
93 | YPTU(2) = U2MIN+ERN(KI2)
|
---|
94 | ENDIF
|
---|
95 | XPTU(2) = VAL2MI
|
---|
96 | IF (ERP(KI2) .EQ. UNDEFI) THEN
|
---|
97 | YPTU(4) = BLIM(KE2)
|
---|
98 | CALL MNWARN('W',CHERE,'Contour squeezed by parameter limits.')
|
---|
99 | ELSE
|
---|
100 | IF (ERP(KI2) .LE. ZERO) GO TO 1500
|
---|
101 | YPTU(4) = U2MIN+ERP(KI2)
|
---|
102 | ENDIF
|
---|
103 | XPTU(4) = VAL2PL
|
---|
104 | SCALY = 1.0/(YPTU(4) - YPTU(2))
|
---|
105 | NOWPTS = 4
|
---|
106 | NEXT = 5
|
---|
107 | IF (LDEBUG) THEN
|
---|
108 | WRITE (ISYSWR,'(A)') ' Plot of four points found by MINOS'
|
---|
109 | XPT(1) = U1MIN
|
---|
110 | YPT(1) = U2MIN
|
---|
111 | CHPT(1) = ' '
|
---|
112 | NALL = MIN(NOWPTS+1,MAXCPT)
|
---|
113 | DO 85 I= 2, NALL
|
---|
114 | XPT(I) = XPTU(I-1)
|
---|
115 | YPT(I) = YPTU(I-1)
|
---|
116 | 85 CONTINUE
|
---|
117 | CHPT(2)= 'A'
|
---|
118 | CHPT(3)= 'B'
|
---|
119 | CHPT(4)= 'C'
|
---|
120 | CHPT(5)= 'D'
|
---|
121 | CALL MNPLOT(XPT,YPT,CHPT,NALL,ISYSWR,NPAGWD,NPAGLN)
|
---|
122 | ENDIF
|
---|
123 | C
|
---|
124 | C ..................... save some values before fixing
|
---|
125 | ISW2 = ISW(2)
|
---|
126 | ISW4 = ISW(4)
|
---|
127 | SIGSAV = EDM
|
---|
128 | ISTRAV = ISTRAT
|
---|
129 | DC = DCOVAR
|
---|
130 | APSI = EPSI*0.5
|
---|
131 | ABEST=AMIN
|
---|
132 | MPAR=NPAR
|
---|
133 | NFMXIN = NFCNMX
|
---|
134 | DO 125 I= 1, MPAR
|
---|
135 | 125 XT(I) = X(I)
|
---|
136 | DO 130 J= 1, MPAR*(MPAR+1)/2
|
---|
137 | 130 VTHMAT(J) = VHMAT(J)
|
---|
138 | DO 135 I= 1, MPAR
|
---|
139 | GCC(I) = GLOBCC(I)
|
---|
140 | 135 W(I) = WERR(I)
|
---|
141 | C fix the two parameters in question
|
---|
142 | KINTS = NIOFEX(KE1)
|
---|
143 | CALL MNFIXP (KINTS,IERR)
|
---|
144 | KINTS = NIOFEX(KE2)
|
---|
145 | CALL MNFIXP (KINTS,IERR)
|
---|
146 | C ......................Fill in the rest of the points
|
---|
147 | DO 900 INEW= NEXT, NPTU
|
---|
148 | C find the two neighbouring points with largest separation
|
---|
149 | BIGDIS = 0.
|
---|
150 | DO 200 IOLD = 1, INEW-1
|
---|
151 | I2 = IOLD + 1
|
---|
152 | IF (I2 .EQ. INEW) I2 = 1
|
---|
153 | DIST = (SCALX*(XPTU(IOLD)-XPTU(I2)))**2 +
|
---|
154 | + (SCALY*(YPTU(IOLD)-YPTU(I2)))**2
|
---|
155 | IF (DIST .GT. BIGDIS) THEN
|
---|
156 | BIGDIS = DIST
|
---|
157 | IDIST = IOLD
|
---|
158 | ENDIF
|
---|
159 | 200 CONTINUE
|
---|
160 | I1 = IDIST
|
---|
161 | I2 = I1 + 1
|
---|
162 | IF (I2 .EQ. INEW) I2 = 1
|
---|
163 | C next point goes between I1 and I2
|
---|
164 | A1 = HALF
|
---|
165 | A2 = HALF
|
---|
166 | 300 XMIDCR = A1*XPTU(I1) + A2*XPTU(I2)
|
---|
167 | YMIDCR = A1*YPTU(I1) + A2*YPTU(I2)
|
---|
168 | XDIR = YPTU(I2) - YPTU(I1)
|
---|
169 | YDIR = XPTU(I1) - XPTU(I2)
|
---|
170 | SCLFAC = MAX(ABS(XDIR*SCALX), ABS(YDIR*SCALY))
|
---|
171 | XDIRCR = XDIR/SCLFAC
|
---|
172 | YDIRCR = YDIR/SCLFAC
|
---|
173 | KE1CR = KE1
|
---|
174 | KE2CR = KE2
|
---|
175 | C Find the contour crossing point along DIR
|
---|
176 | AMIN = ABEST
|
---|
177 | CALL MNCROS(FCN,AOPT,IERCR,FUTIL)
|
---|
178 | IF (IERCR .GT. 1) THEN
|
---|
179 | C If cannot find mid-point, try closer to point 1
|
---|
180 | IF (A1 .GT. HALF) THEN
|
---|
181 | IF (ISW(5) .GE. 0)
|
---|
182 | + WRITE (ISYSWR,'(A,A,I3,A)') ' MNCONT CANNOT FIND NEXT',
|
---|
183 | + ' POINT ON CONTOUR. ONLY ',NOWPTS,' POINTS FOUND.'
|
---|
184 | GO TO 950
|
---|
185 | ENDIF
|
---|
186 | CALL MNWARN('W',CHERE,'Cannot find midpoint, try closer.')
|
---|
187 | A1 = 0.75
|
---|
188 | A2 = 0.25
|
---|
189 | GO TO 300
|
---|
190 | ENDIF
|
---|
191 | C Contour has been located, insert new point in list
|
---|
192 | DO 830 MOVE= NOWPTS,I1+1,-1
|
---|
193 | XPTU(MOVE+1) = XPTU(MOVE)
|
---|
194 | YPTU(MOVE+1) = YPTU(MOVE)
|
---|
195 | 830 CONTINUE
|
---|
196 | NOWPTS = NOWPTS + 1
|
---|
197 | XPTU(I1+1) = XMIDCR + XDIRCR*AOPT
|
---|
198 | YPTU(I1+1) = YMIDCR + YDIRCR*AOPT
|
---|
199 | 900 CONTINUE
|
---|
200 | 950 CONTINUE
|
---|
201 | C
|
---|
202 | IERRF = NOWPTS
|
---|
203 | CSTATU = 'SUCCESSFUL'
|
---|
204 | IF (NOWPTS .LT. NPTU) CSTATU = 'INCOMPLETE'
|
---|
205 | C make a lineprinter plot of the contour
|
---|
206 | IF (ISW(5) .GE. 0) THEN
|
---|
207 | XPT(1) = U1MIN
|
---|
208 | YPT(1) = U2MIN
|
---|
209 | CHPT(1) = ' '
|
---|
210 | NALL = MIN(NOWPTS+1,MAXCPT)
|
---|
211 | DO 1000 I= 2, NALL
|
---|
212 | XPT(I) = XPTU(I-1)
|
---|
213 | YPT(I) = YPTU(I-1)
|
---|
214 | CHPT(I)= 'X'
|
---|
215 | 1000 CONTINUE
|
---|
216 | WRITE (ISYSWR,'(A,I3,2X,A)') ' Y-AXIS: PARAMETER ',KE2,
|
---|
217 | + CPNAM(KE2)
|
---|
218 | CALL MNPLOT(XPT,YPT,CHPT,NALL,ISYSWR,NPAGWD,NPAGLN)
|
---|
219 | WRITE (ISYSWR,'(25X,A,I3,2X,A)') 'X-AXIS: PARAMETER ',
|
---|
220 | + KE1,CPNAM(KE1)
|
---|
221 | ENDIF
|
---|
222 | C print out the coordinates around the contour
|
---|
223 | IF (ISW(5) .GE. 1) THEN
|
---|
224 | NPCOL = (NOWPTS+1)/2
|
---|
225 | NFCOL = NOWPTS/2
|
---|
226 | WRITE (ISYSWR,'(/I5,A,G13.5,A,G11.3)') NOWPTS,
|
---|
227 | + ' POINTS ON CONTOUR. FMIN=',ABEST,' ERRDEF=',UP
|
---|
228 | WRITE (ISYSWR,'(9X,A,3X,A,18X,A,3X,A)')
|
---|
229 | + CPNAM(KE1),CPNAM(KE2),CPNAM(KE1),CPNAM(KE2)
|
---|
230 | DO 1050 LINE = 1, NFCOL
|
---|
231 | LR = LINE + NPCOL
|
---|
232 | WRITE (ISYSWR,'(1X,I5,2G13.5,10X,I5,2G13.5)')
|
---|
233 | + LINE,XPTU(LINE),YPTU(LINE),LR,XPTU(LR),YPTU(LR)
|
---|
234 | 1050 CONTINUE
|
---|
235 | IF (NFCOL .LT. NPCOL) WRITE (ISYSWR,'(1X,I5,2G13.5)')
|
---|
236 | + NPCOL,XPTU(NPCOL),YPTU(NPCOL)
|
---|
237 | ENDIF
|
---|
238 | C . . contour finished. reset v
|
---|
239 | ITAUR = 1
|
---|
240 | CALL MNFREE(1)
|
---|
241 | CALL MNFREE(1)
|
---|
242 | DO 1100 J= 1, MPAR*(MPAR+1)/2
|
---|
243 | 1100 VHMAT(J) = VTHMAT(J)
|
---|
244 | DO 1120 I= 1, MPAR
|
---|
245 | GLOBCC(I) = GCC(I)
|
---|
246 | WERR(I) = W(I)
|
---|
247 | 1120 X(I) = XT(I)
|
---|
248 | CALL MNINEX (X)
|
---|
249 | EDM = SIGSAV
|
---|
250 | AMIN = ABEST
|
---|
251 | ISW(2) = ISW2
|
---|
252 | ISW(4) = ISW4
|
---|
253 | DCOVAR = DC
|
---|
254 | ITAUR = 0
|
---|
255 | NFCNMX = NFMXIN
|
---|
256 | ISTRAT = ISTRAV
|
---|
257 | U(KE1) = U1MIN
|
---|
258 | U(KE2) = U2MIN
|
---|
259 | GO TO 2000
|
---|
260 | C Error returns
|
---|
261 | 1350 WRITE (ISYSWR,'(A)') ' INVALID PARAMETER NUMBERS.'
|
---|
262 | GO TO 1450
|
---|
263 | 1400 WRITE (ISYSWR,'(A)') ' LESS THAN FOUR POINTS REQUESTED.'
|
---|
264 | 1450 IERRF = -1
|
---|
265 | CSTATU = 'USER ERROR'
|
---|
266 | GO TO 2000
|
---|
267 | 1500 WRITE (ISYSWR,'(A)') ' MNCONT UNABLE TO FIND FOUR POINTS.'
|
---|
268 | U(KE1) = U1MIN
|
---|
269 | U(KE2) = U2MIN
|
---|
270 | IERRF = 0
|
---|
271 | CSTATU = 'FAILED'
|
---|
272 | 2000 CONTINUE
|
---|
273 | CFROM = CHERE
|
---|
274 | NFCNFR = NFCNCO
|
---|
275 | RETURN
|
---|
276 | END
|
---|