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