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