[2403] | 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
|
---|