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