-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmnread.F
195 lines (195 loc) · 6.94 KB
/
mnread.F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
*
* $Id: mnread.F,v 1.1.1.1 2000/06/08 11:19:20 andras Exp $
*
* $Log: mnread.F,v $
* Revision 1.1.1.1 2000/06/08 11:19:20 andras
* import of MINUIT from CERNlib 2000
*
* Revision 1.1.1.1 1996/03/07 14:31:31 mclareni
* Minuit
*
*
#include "minuit/pilot.h"
SUBROUTINE MNREAD(FCN,IFLGIN,IFLGUT,FUTIL)
#include "minuit/d506dp.inc"
CC Called from MINUIT. Reads all user input to MINUIT.
CC This routine is highly unstructured and defies normal logic.
CC
CC IFLGIN indicates the function originally requested:
CC = 1: read one-line title
CC 2: read parameter definitions
CC 3: read MINUIT commands
CC
CC IFLGUT= 1: reading terminated normally
CC 2: end-of-data on input
CC 3: unrecoverable read error
CC 4: unable to process parameter requests
CC 5: more than 100 incomprehensible commands
CC internally,
CC IFLGDO indicates the subfunction to be performed on the next
CC input record: 1: read a one-line title
CC 2: read a parameter definition
CC 3: read a command
CC 4: read in covariance matrix
CC for example, when IFLGIN=3, but IFLGDO=1, then it should read
CC a title, but this was requested by a command, not by MINUIT.
CC
#include "minuit/d506cm.inc"
EXTERNAL FCN,FUTIL
CHARACTER CRDBUF*80, CUPBUF*10
CHARACTER CPROMT(3)*40, CLOWER*26, CUPPER*26
LOGICAL LEOF
DATA CPROMT/' ENTER MINUIT TITLE, or "SET INPUT n" : ',
+ ' ENTER MINUIT PARAMETER DEFINITION: ',
+ ' ENTER MINUIT COMMAND: '/
C
DATA CLOWER/'abcdefghijklmnopqrstuvwxyz'/
DATA CUPPER/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
C
IFLGUT = 1
IFLGDO = IFLGIN
LEOF = .FALSE.
INCOMP = 0
C . . . . read next record
10 CONTINUE
IF (ISW(6) .EQ. 1) THEN
WRITE (ISYSWR,'(A)') CPROMT(IFLGDO)
IF (IFLGDO .EQ. 2) LPHEAD = .FALSE.
ENDIF
CRDBUF = ' '
READ (ISYSRD,'(A)',ERR=500,END=45) CRDBUF
C
C CUPBUF is the first few characters in upper case
CUPBUF(1:10) = CRDBUF(1:10)
DO 12 I= 1, 10
IF (CRDBUF(I:I) .EQ. '''') GO TO 13
DO 11 IC= 1, 26
IF (CRDBUF(I:I) .EQ. CLOWER(IC:IC)) CUPBUF(I:I)=CUPPER(IC:IC)
11 CONTINUE
12 CONTINUE
13 CONTINUE
C . . preemptive commands
LEOF = .FALSE.
IF (INDEX(CUPBUF,'*EOF') .EQ. 1) THEN
WRITE (ISYSWR,'(A,I3)') ' *EOF ENCOUNTERED ON UNIT NO.',ISYSRD
LPHEAD = .TRUE.
GO TO 50
ENDIF
IF (INDEX(CUPBUF,'SET INP') .EQ. 1) THEN
ICOMND = ICOMND + 1
WRITE (ISYSWR, 21) ICOMND,CRDBUF(1:50)
21 FORMAT (' **********'/' **',I5,' **',A/' **********')
LPHEAD = .TRUE.
GO TO 50
ENDIF
GO TO 80
C . . hardware EOF on current ISYSRD
45 CRDBUF = '*EOF '
WRITE (ISYSWR,'(A,I3)') ' END OF DATA ON UNIT NO.',ISYSRD
C or SET INPUT command
50 CONTINUE
CALL MNSTIN(CRDBUF,IERR)
IF (IERR .EQ. 0) GO TO 10
IF (IERR .EQ. 2) THEN
IF (.NOT. LEOF) THEN
WRITE (ISYSWR,'(A,A/)') ' TWO CONSECUTIVE EOFs ON ',
+ 'PRIMARY INPUT FILE WILL TERMINATE EXECUTION.'
LEOF = .TRUE.
GO TO 10
ENDIF
ENDIF
IFLGUT = IERR
GO TO 900
80 IF (IFLGDO .GT. 1) GO TO 100
C read title . . . . . IFLGDO = 1
C if title is 'SET TITLE', skip and read again
IF (INDEX(CUPBUF,'SET TIT') .EQ. 1) GO TO 10
CALL MNSETI(CRDBUF(1:50))
WRITE (ISYSWR,'(1X,A50)') CTITL
WRITE (ISYSWR,'(1X,78(1H*))')
LPHEAD = .TRUE.
IF (IFLGIN .EQ. IFLGDO) GO TO 900
IFLGDO = IFLGIN
GO TO 10
C data record is not a title.
100 CONTINUE
IF (IFLGDO .GT. 2) GO TO 300
C expect parameter definitions. IFLGDO = 2
C if parameter def is 'PARAMETER', skip and read again
IF (INDEX(CUPBUF,'PAR') .EQ. 1) GO TO 10
C if line starts with SET TITLE, read a title first
IF (INDEX(CUPBUF,'SET TIT') .EQ. 1) THEN
IFLGDO = 1
GO TO 10
ENDIF
C we really have parameter definitions now
CALL MNPARS(CRDBUF,ICONDP)
IF (ICONDP .EQ. 0) GO TO 10
C format error
IF (ICONDP .EQ. 1) THEN
IF (ISW(6) .EQ. 1) THEN
WRITE (ISYSWR,'(A)') ' FORMAT ERROR. IGNORED. ENTER AGAIN.'
GO TO 10
ELSE
WRITE (ISYSWR,'(A)') ' ERROR IN PARAMETER DEFINITION'
IFLGUT = 4
GO TO 900
ENDIF
ENDIF
C ICONDP = 2 . . . end parameter requests
IF (ISW(5).GE.0 .AND. ISW(6).LT.1) WRITE (ISYSWR,'(4X,75(1H*))')
LPHEAD = .TRUE.
IF (IFLGIN .EQ. IFLGDO) GO TO 900
IFLGDO = IFLGIN
GO TO 10
C . . . . . IFLGDO = 3
C read commands
300 CONTINUE
CALL MNCOMD(FCN,CRDBUF,ICONDN,FUTIL)
CC ICONDN = 0: command executed normally
CC 1: command is blank, ignored
CC 2: command line unreadable, ignored
CC 3: unknown command, ignored
CC 4: abnormal termination (e.g., MIGRAD not converged)
CC 5: command is a request to read PARAMETER definitions
CC 6: 'SET INPUT' command
CC 7: 'SET TITLE' command
CC 8: 'SET COVAR' command
CC 9: reserved
CC 10: END command
CC 11: EXIT or STOP command
CC 12: RETURN command
IF (ICONDN .EQ. 2 .OR. ICONDN .EQ. 3) THEN
INCOMP = INCOMP + 1
IF (INCOMP .GT. 100) THEN
IFLGUT = 5
GO TO 900
ENDIF
ENDIF
C parameter
IF (ICONDN .EQ. 5) IFLGDO = 2
C SET INPUT
IF (ICONDN .EQ. 6) GO TO 50
C SET TITLE
IF (ICONDN .EQ. 7) IFLGDO = 1
C . . . . . . . . . . set covar
IF (ICONDN .EQ. 8) THEN
ICOMND = ICOMND + 1
WRITE (ISYSWR,405) ICOMND,CRDBUF(1:50)
405 FORMAT (1H ,10(1H*)/' **',I5,' **',A)
WRITE (ISYSWR, '(1H ,10(1H*))' )
NPAR2 = NPAR*(NPAR+1)/2
READ (ISYSRD,420,ERR=500,END=45) (VHMAT(I),I=1,NPAR2)
420 FORMAT (BN,7E11.4,3X)
ISW(2) = 3
DCOVAR = 0.0
IF (ISW(5) .GE. 0) CALL MNMATU(1)
IF (ISW(5) .GE. 1) CALL MNPRIN(2,AMIN)
GO TO 10
ENDIF
IF (ICONDN .LT. 10) GO TO 10
GO TO 900
C . . . . error conditions
500 IFLGUT = 3
900 RETURN
END