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