| 1 | *
 | 
|---|
| 2 | * $Id: mncntr.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:28  mclareni
 | 
|---|
| 6 | * Minuit
 | 
|---|
| 7 | *
 | 
|---|
| 8 | *
 | 
|---|
| 9 | #include "minuit/pilot.h"
 | 
|---|
| 10 |       SUBROUTINE MNCNTR(FCN,KE1,KE2,IERRF,FUTIL)
 | 
|---|
| 11 | #include "minuit/d506dp.inc"
 | 
|---|
| 12 | CC       to print function contours in two variables, on line printer
 | 
|---|
| 13 | CC
 | 
|---|
| 14 | #include "minuit/d506cm.inc"
 | 
|---|
| 15 |       EXTERNAL FCN,FUTIL
 | 
|---|
| 16 |       PARAMETER (NUMBCS=20,NXMAX=115)
 | 
|---|
| 17 |       DIMENSION CONTUR(NUMBCS), FCNA(NXMAX),FCNB(NXMAX)
 | 
|---|
| 18 |       CHARACTER CLABEL*(NUMBCS)
 | 
|---|
| 19 |       CHARACTER CHLN*(NXMAX),CHMID*(NXMAX),CHZERO*(NXMAX)
 | 
|---|
| 20 |       DATA CLABEL/'0123456789ABCDEFGHIJ'/
 | 
|---|
| 21 | C                 input arguments: parx, pary, devs, ngrid
 | 
|---|
| 22 |       IF (KE1.LE.0 .OR. KE2.LE.0)  GO TO 1350
 | 
|---|
| 23 |       IF (KE1.GT.NU .OR. KE2.GT.NU)  GO TO 1350
 | 
|---|
| 24 |       KI1 = NIOFEX(KE1)
 | 
|---|
| 25 |       KI2 = NIOFEX(KE2)
 | 
|---|
| 26 |       IF (KI1.LE.0 .OR. KI2.LE.0)  GO TO 1350
 | 
|---|
| 27 |       IF (KI1 .EQ. KI2)  GO TO 1350
 | 
|---|
| 28 | C
 | 
|---|
| 29 |       IF (ISW(2) .LT. 1)  THEN
 | 
|---|
| 30 |           CALL MNHESS(FCN,FUTIL)
 | 
|---|
| 31 |           CALL MNWERR
 | 
|---|
| 32 |           ENDIF
 | 
|---|
| 33 |       NPARX = NPAR
 | 
|---|
| 34 |       XSAV = U(KE1)
 | 
|---|
| 35 |       YSAV = U(KE2)
 | 
|---|
| 36 |       DEVS = WORD7(3)
 | 
|---|
| 37 |       IF (DEVS .LE. ZERO)  DEVS=2.
 | 
|---|
| 38 |       XLO = U(KE1) - DEVS*WERR(KI1)
 | 
|---|
| 39 |       XUP = U(KE1) + DEVS*WERR(KI1)
 | 
|---|
| 40 |       YLO = U(KE2) - DEVS*WERR(KI2)
 | 
|---|
| 41 |       YUP = U(KE2) + DEVS*WERR(KI2)
 | 
|---|
| 42 |       NGRID = WORD7(4)
 | 
|---|
| 43 |       IF (NGRID .LE. 0)  THEN
 | 
|---|
| 44 |           NGRID=25
 | 
|---|
| 45 |           NX = MIN(NPAGWD-15,NGRID)
 | 
|---|
| 46 |           NY = MIN(NPAGLN-7, NGRID)
 | 
|---|
| 47 |       ELSE
 | 
|---|
| 48 |           NX = NGRID
 | 
|---|
| 49 |           NY = NGRID
 | 
|---|
| 50 |       ENDIF
 | 
|---|
| 51 |       IF (NX .LT. 11) NX=11
 | 
|---|
| 52 |       IF (NY .LT. 11) NY=11
 | 
|---|
| 53 |       IF (NX .GE. NXMAX)  NX=NXMAX-1
 | 
|---|
| 54 | C         ask if parameter outside limits
 | 
|---|
| 55 |       IF (NVARL(KE1) .GT. 1)  THEN
 | 
|---|
| 56 |          IF (XLO .LT. ALIM(KE1))  XLO = ALIM(KE1)
 | 
|---|
| 57 |          IF (XUP .GT. BLIM(KE1))  XUP = BLIM(KE1)
 | 
|---|
| 58 |       ENDIF
 | 
|---|
| 59 |       IF (NVARL(KE2) .GT. 1)   THEN
 | 
|---|
| 60 |          IF (YLO .LT. ALIM(KE2))  YLO = ALIM(KE2)
 | 
|---|
| 61 |          IF (YUP .GT. BLIM(KE2))  YUP = BLIM(KE2)
 | 
|---|
| 62 |       ENDIF
 | 
|---|
| 63 |       BWIDX = (XUP-XLO)/REAL(NX)
 | 
|---|
| 64 |       BWIDY = (YUP-YLO)/REAL(NY)
 | 
|---|
| 65 |       IXMID = INT((XSAV-XLO)*REAL(NX)/(XUP-XLO)) + 1
 | 
|---|
| 66 |       IF (AMIN .EQ. UNDEFI)  CALL MNAMIN(FCN,FUTIL)
 | 
|---|
| 67 |       DO 185 I= 1, NUMBCS
 | 
|---|
| 68 |       CONTUR(I) = AMIN + UP*FLOAT(I-1)**2
 | 
|---|
| 69 |   185 CONTINUE
 | 
|---|
| 70 |       CONTUR(1) = CONTUR(1) + 0.01*UP
 | 
|---|
| 71 | C                fill FCNB to prepare first row, and find column zero
 | 
|---|
| 72 |       U(KE2) = YUP
 | 
|---|
| 73 |       IXZERO = 0
 | 
|---|
| 74 |       XB4 = ONE
 | 
|---|
| 75 |       DO 200 IX= 1, NX+1
 | 
|---|
| 76 |       U(KE1) = XLO + REAL(IX-1)*BWIDX
 | 
|---|
| 77 |       CALL FCN(NPARX,GIN,FF,U,4,FUTIL)
 | 
|---|
| 78 |       FCNB(IX) = FF
 | 
|---|
| 79 |       IF (XB4.LT.ZERO .AND. U(KE1).GT.ZERO)  IXZERO = IX-1
 | 
|---|
| 80 |       XB4 = U(KE1)
 | 
|---|
| 81 |       CHMID(IX:IX) = '*'
 | 
|---|
| 82 |       CHZERO(IX:IX)= '-'
 | 
|---|
| 83 |   200 CONTINUE
 | 
|---|
| 84 |       WRITE (ISYSWR,'(A,I3,A,A)') ' Y-AXIS: PARAMETER ',
 | 
|---|
| 85 |      +      KE2,': ',CPNAM(KE2)
 | 
|---|
| 86 |       IF (IXZERO .GT. 0)  THEN
 | 
|---|
| 87 |          CHZERO(IXZERO:IXZERO) = '+'
 | 
|---|
| 88 |          CHLN = ' '
 | 
|---|
| 89 |          WRITE (ISYSWR,'(12X,A,A)') CHLN(1:IXZERO),'X=0'
 | 
|---|
| 90 |       ENDIF
 | 
|---|
| 91 | C                 loop over rows
 | 
|---|
| 92 |       DO 280 IY= 1, NY
 | 
|---|
| 93 |       UNEXT = U(KE2) - BWIDY
 | 
|---|
| 94 | C                 prepare this line's background pattern for contour
 | 
|---|
| 95 |       CHLN = ' '
 | 
|---|
| 96 |       CHLN(IXMID:IXMID) = '*'
 | 
|---|
| 97 |       IF (IXZERO .NE. 0) CHLN(IXZERO:IXZERO) = ':'
 | 
|---|
| 98 |       IF (U(KE2).GT.YSAV .AND. UNEXT.LT.YSAV) CHLN=CHMID
 | 
|---|
| 99 |       IF (U(KE2).GT.ZERO .AND. UNEXT.LT.ZERO) CHLN=CHZERO
 | 
|---|
| 100 |       U(KE2) = UNEXT
 | 
|---|
| 101 |       YLABEL = U(KE2) + 0.5*BWIDY
 | 
|---|
| 102 | C                 move FCNB to FCNA and fill FCNB with next row
 | 
|---|
| 103 |       DO 220 IX= 1, NX+1
 | 
|---|
| 104 |       FCNA(IX) = FCNB(IX)
 | 
|---|
| 105 |       U(KE1) = XLO + REAL(IX-1)*BWIDX
 | 
|---|
| 106 |       CALL FCN(NPARX,GIN,FF,U,4,FUTIL)
 | 
|---|
| 107 |       FCNB(IX) = FF
 | 
|---|
| 108 |   220 CONTINUE
 | 
|---|
| 109 | C                 look for contours crossing the FCNxy squares
 | 
|---|
| 110 |       DO 250 IX= 1, NX
 | 
|---|
| 111 |       FMX = MAX(FCNA(IX),FCNB(IX),FCNA(IX+1),FCNB(IX+1))
 | 
|---|
| 112 |       FMN = MIN(FCNA(IX),FCNB(IX),FCNA(IX+1),FCNB(IX+1))
 | 
|---|
| 113 |       DO 230 ICS= 1, NUMBCS
 | 
|---|
| 114 |       IF (CONTUR(ICS) .GT. FMN)  GO TO 240
 | 
|---|
| 115 |   230 CONTINUE
 | 
|---|
| 116 |       GO TO 250
 | 
|---|
| 117 |   240 IF (CONTUR(ICS) .LT. FMX) CHLN(IX:IX)=CLABEL(ICS:ICS)
 | 
|---|
| 118 |   250 CONTINUE
 | 
|---|
| 119 | C                 print a row of the contour plot
 | 
|---|
| 120 |       WRITE (ISYSWR,'(1X,G12.4,1X,A)') YLABEL,CHLN(1:NX)
 | 
|---|
| 121 |   280 CONTINUE
 | 
|---|
| 122 | C                 contours printed, label x-axis
 | 
|---|
| 123 |       CHLN = ' '
 | 
|---|
| 124 |       CHLN( 1: 1) = 'I'
 | 
|---|
| 125 |       CHLN(IXMID:IXMID) = 'I'
 | 
|---|
| 126 |       CHLN(NX:NX) = 'I'
 | 
|---|
| 127 |       WRITE (ISYSWR,'(14X,A)') CHLN(1:NX)
 | 
|---|
| 128 | C                the hardest of all: print x-axis scale!
 | 
|---|
| 129 |       CHLN = ' '
 | 
|---|
| 130 |       IF (NX .LE. 26) THEN
 | 
|---|
| 131 |           NL = MAX(NX-12,2)
 | 
|---|
| 132 |           NL2 = NL/2
 | 
|---|
| 133 |           WRITE (ISYSWR,'(8X,G12.4,A,G12.4)') XLO,CHLN(1:NL),XUP
 | 
|---|
| 134 |           WRITE (ISYSWR,'(14X,A,G12.4)')   CHLN(1:NL2),XSAV
 | 
|---|
| 135 |       ELSE
 | 
|---|
| 136 |           NL = MAX(NX-24,2)/2
 | 
|---|
| 137 |           NL2 = NL
 | 
|---|
| 138 |           IF (NL .GT. 10) NL2=NL-6
 | 
|---|
| 139 |           WRITE (ISYSWR,'(8X,G12.4,A,G12.4,A,G12.4)')  XLO,
 | 
|---|
| 140 |      +      CHLN(1:NL),XSAV,CHLN(1:NL2),XUP
 | 
|---|
| 141 |       ENDIF
 | 
|---|
| 142 |       WRITE (ISYSWR,'(6X,A,I3,A,A,A,G12.4)') ' X-AXIS: PARAMETER',
 | 
|---|
| 143 |      +    KE1,': ',CPNAM(KE1),'  ONE COLUMN=',BWIDX
 | 
|---|
| 144 |       WRITE (ISYSWR,'(A,G12.4,A,G12.4,A)') ' FUNCTION VALUES: F(I)=',
 | 
|---|
| 145 |      +    AMIN,' +',UP,' *I**2'
 | 
|---|
| 146 | C                 finished.  reset input values
 | 
|---|
| 147 |       U(KE1) = XSAV
 | 
|---|
| 148 |       U(KE2) = YSAV
 | 
|---|
| 149 |       IERRF = 0
 | 
|---|
| 150 |       RETURN
 | 
|---|
| 151 |  1350 WRITE (ISYSWR,1351)
 | 
|---|
| 152 |  1351 FORMAT (' INVALID PARAMETER NUMBER(S) REQUESTED.  IGNORED.' /)
 | 
|---|
| 153 |       IERRF = 1
 | 
|---|
| 154 |       RETURN
 | 
|---|
| 155 |       END
 | 
|---|