]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
5 | * Revision 1.1.1.1 1995/10/24 10:19:58 cernlib | |
6 | * Geant | |
7 | * | |
8 | * | |
9 | #include "geant321/pilot.h" | |
10 | *CMZ : 3.21/02 25/07/94 15.04.20 by S.Giani | |
11 | *-- Author : | |
12 | *$ CREATE NUDISV.FOR | |
13 | *COPY NUDISV | |
14 | * | |
15 | *=== nudisv ===========================================================* | |
16 | * | |
17 | INTEGER FUNCTION NUDISV ( ANU, KB, EXPLAM, ASEASQ, APOWER, PRZERO) | |
18 | ||
19 | #include "geant321/dblprc.inc" | |
20 | #include "geant321/dimpar.inc" | |
21 | #include "geant321/iounit.inc" | |
22 | * | |
23 | *----------------------------------------------------------------------* | |
24 | * * | |
25 | * Last change on 05-may-92 by Alfredo Ferrari, INFN-Milan * | |
26 | * * | |
27 | * Nudist91: * | |
28 | * multiplicity distribution of chains produced in hadron-nucleus * | |
29 | * collisions * | |
30 | * * | |
31 | * Input variables: * | |
32 | * anu = average number of collisions * | |
33 | * kb = baryon number of the projectile * | |
34 | * explam = exp ( - (anu-1) ) * | |
35 | * Output variables: * | |
36 | * nudisv = number of high energy collisions * | |
37 | *----------------------------------------------------------------------* | |
38 | * | |
39 | PARAMETER ( INMAX = 30 ) | |
40 | PARAMETER ( IAMAX = 13 ) | |
41 | PARAMETER ( ANUMAX = 6.0D+00 ) | |
42 | PARAMETER ( ANUMED = 0.5D+00 * ( 3.75D+00 + ANUMAX ) ) | |
43 | * | |
44 | C AB,(KB.NE.0) BARYON NUCLEUS | |
45 | C | |
46 | DIMENSION AB (INMAX,IAMAX), ANUB (IAMAX), ANUM (9), | |
47 | & ANSESQ (IAMAX), ANPOWR (IAMAX), NULAST (IAMAX) | |
48 | DIMENSION AAB (IAMAX), DIST (0:INMAX), IEX (3,5) | |
49 | REAL RNDM(1) | |
50 | LOGICAL LFIRST | |
51 | SAVE LFIRST, ANUB, ANUM, AB, ANSESQ, NULAST, ANPOWR | |
52 | DATA ANUB/1.D0,1.1D0,1.25D0,1.45D0,1.65D0,1.74D0,2.09D0,2.66D0, | |
53 | & 3.0D0,3.1D0,3.75D0,ANUMED,ANUMAX/ | |
54 | DATA ANUM/1.D0,1.45D0,1.52D0,1.77D0,2.19D0,2.42D0,2.47D0, | |
55 | *2.90D0,5.D0/ | |
56 | DATA AB / 1.D+00, 29*0.D+00, 90*0.D+00, | |
57 | & 0.5771D+00, 0.2565D+00, 0.1159D+00, 0.0397D+00, | |
58 | & 0.0095D+00, 0.0013D+00, 0.0001D+00, 23*0.D+00, | |
59 | & 0.5457D+00, 0.2548D+00, 0.1303D+00, 0.0515D+00, | |
60 | & 0.0146D+00, 0.0028D+00, 0.0003D+00, 23*0.D+00, | |
61 | & 0.4462D+00, 0.2445D+00, 0.1599D+00, 0.0919D+00, 0.0406D+00, | |
62 | & 0.0132D+00, 0.0032D+00, 0.0005D+00, 0.0001D+00, 21*0.D+00, | |
63 | & 0.3387D+00, 0.2105D+00, 0.1670D+00, 0.1291D+00, 0.0849D+00, | |
64 | & 0.0441D+00, 0.0180D+00, 0.0059D+00, 0.0014D+00, 0.0003D+00, | |
65 | & 0.0001D+00, 19*0.D+00, | |
66 | & 0.2959D+00, 0.1885D+00, 0.1673D+00, 0.1344D+00, 0.1044D+00, | |
67 | & 0.0653D+00, 0.0336D+00, 0.0144D+00, 0.0046D+00, 0.0012D+00, | |
68 | & 0.0003D+00, 19*0.D+00, | |
69 | & 0.2835D+00, 0.1818D+00, 0.1572D+00, 0.1357D+00, 0.1082D+00, | |
70 | & 0.0715D+00, 0.0380D+00, 0.0161D+00, 0.0057D+00, 0.0018D+00, | |
71 | & 0.0004D+00, 0.0001D+00, 18*0.D+00, | |
72 | & 0.2247D+00, 0.1481D+00, 0.1342D+00, 0.1328D+00, 0.1211D+00, | |
73 | & 0.0984D+00, 0.0700D+00, 0.0394D+00, 0.0198D+00, 0.0077D+00, | |
74 | & 0.0028D+00, 0.0008D+00, 0.0002D+00, 17*0.D+00, 60*0.D+00/ | |
75 | DATA IEX / 1, 3, 6, 1, 2, 3, 2, 4, 5, 10, 12, 11, 11, 13, 12 / | |
76 | DATA LFIRST / .TRUE. / | |
77 | * | |
78 | * +-------------------------------------------------------------------* | |
79 | * | First call: perform the initialization | |
80 | IF ( LFIRST ) THEN | |
81 | LFIRST = .FALSE. | |
82 | IPOWER = NINT (-APOWER) | |
83 | * | +----------------------------------------------------------------* | |
84 | * | | | |
85 | DO 100 IA = 1, IAMAX | |
86 | AAB (IA) = 0.D+00 | |
87 | * | | +-------------------------------------------------------------* | |
88 | * | | | This loop computes the normalization factor | |
89 | DO 80 IN = 1, INMAX | |
90 | AAB (IA) = AAB (IA) + AB (IN,IA) | |
91 | 80 CONTINUE | |
92 | * | | | | |
93 | * | | +-------------------------------------------------------------* | |
94 | * | | +-------------------------------------------------------------* | |
95 | * | | | | |
96 | IF ( AAB (IA) .GT. 0.D+00 ) THEN | |
97 | ANUAVE = 0.D+00 | |
98 | * | | | +----------------------------------------------------------* | |
99 | * | | | | | |
100 | DO 90 IN = 1, INMAX | |
101 | AB (IN,IA) = AB (IN,IA) / AAB (IA) | |
102 | ANUAVE = ANUAVE + IN * AB (IN,IA) | |
103 | 90 CONTINUE | |
104 | * | | | | | |
105 | * | | | +----------------------------------------------------------* | |
106 | ANUB (IA) = ANUAVE | |
107 | END IF | |
108 | * | | | | |
109 | * | | +-------------------------------------------------------------* | |
110 | 100 CONTINUE | |
111 | * | | | |
112 | * | +----------------------------------------------------------------* | |
113 | * | +----------------------------------------------------------------* | |
114 | * | | | |
115 | DO 200 IE = 1,5 | |
116 | IA = IEX (2,IE) | |
117 | IR1 = IEX (1,IE) | |
118 | IR2 = IEX (3,IE) | |
119 | ANUEN1 = 0.D+00 | |
120 | ANUEN2 = 0.D+00 | |
121 | AAB (IA) = 0.D+00 | |
122 | AEXTR1 = 0.5D+00 * MIN ( 1, IR1 - 1 ) | |
123 | AEXTR2 = 0.5D+00 * MIN ( 1, IR2 - 1 ) | |
124 | * | | +-------------------------------------------------------------* | |
125 | * | | | This loop fills the ab(i,ia) array, | |
126 | * | | | extrapolating from the data for <nu>s, | |
127 | * | | | anub (ir1,r2) | |
128 | DO 130 IN = 1, INMAX | |
129 | ANUBE1 = ANUEN1 | |
130 | ANUBE2 = ANUEN2 | |
131 | ANUEN1 = ( AEXTR1 + IN ) * ANUB (IA) | |
132 | & / ANUB (IR1) | |
133 | ANUEN2 = ( AEXTR2 + IN ) * ANUB (IA) | |
134 | & / ANUB (IR2) | |
135 | NABE1 = INT (ANUBE1) | |
136 | NABE2 = INT (ANUBE2) | |
137 | NAEN1 = NINT (ANUEN1) | |
138 | NAEN2 = NINT (ANUEN2) | |
139 | IF ( AB (IN,IR1) .GT. 0.D+00 ) THEN | |
140 | DO 110 INN = MAX (NABE1,1), NAEN1 | |
141 | IF (INN .GT. 1) THEN | |
142 | ANUBE0 = 0.5D+00 + (INN-1) | |
143 | IF (INN .GT. INMAX ) GO TO 110 | |
144 | ELSE | |
145 | ANUBE0 = 0.D+00 | |
146 | END IF | |
147 | ANUEN0 = 0.5D+00 + INN | |
148 | ANUBEG = MAX ( ANUBE1, ANUBE0 ) | |
149 | ANUEND = MIN ( ANUEN1, ANUEN0 ) | |
150 | WEIGHT = AB (IN,IR1) * MAX ( ZERZER, ( ANUEND | |
151 | & - ANUBEG ) / ( ANUEN1 - ANUBE1 ) ) | |
152 | AB (INN,IA) = AB (INN,IA) + WEIGHT | |
153 | AAB (IA) = AAB (IA) + WEIGHT | |
154 | 110 CONTINUE | |
155 | END IF | |
156 | IF ( AB (IN,IR2) .GT. 0.D+00 ) THEN | |
157 | DO 120 INN = MAX (NABE2,1), NAEN2 | |
158 | IF (INN .GT. 1) THEN | |
159 | ANUBE0 = 0.5D+00 + (INN-1) | |
160 | IF (INN .GT. INMAX ) GO TO 120 | |
161 | ELSE | |
162 | ANUBE0 = 0.D+00 | |
163 | END IF | |
164 | ANUEN0 = 0.5D+00 + INN | |
165 | ANUBEG = MAX ( ANUBE2, ANUBE0 ) | |
166 | ANUEND = MIN ( ANUEN2, ANUEN0 ) | |
167 | WEIGHT = AB (IN,IR2) * MAX ( ZERZER, ( ANUEND | |
168 | & - ANUBEG ) / ( ANUEN2 - ANUBE2 ) ) | |
169 | AB (INN,IA) = AB (INN,IA) + WEIGHT | |
170 | AAB (IA) = AAB (IA) + WEIGHT | |
171 | 120 CONTINUE | |
172 | END IF | |
173 | 130 CONTINUE | |
174 | * | | | | |
175 | * | | +-------------------------------------------------------------* | |
176 | * | | +-------------------------------------------------------------* | |
177 | * | | | | |
178 | DO 140 IN =1, INMAX | |
179 | AB (IN,IA) = AB (IN,IA) / AAB (IA) | |
180 | 140 CONTINUE | |
181 | * | | | | |
182 | * | | +-------------------------------------------------------------* | |
183 | 200 CONTINUE | |
184 | * | | | |
185 | * | +----------------------------------------------------------------* | |
186 | * | +----------------------------------------------------------------* | |
187 | * | | This loop simply creates a cumulative distribution | |
188 | DO 12 IA = 1, IAMAX | |
189 | AAB (IA) = 0.D+00 | |
190 | NULAST (IA) = INMAX | |
191 | * | | +-------------------------------------------------------------* | |
192 | * | | | This loop computes the normalization factor | |
193 | DO 18 IN = INMAX, 1, -1 | |
194 | AAB (IA) = AAB (IA) + AB (IN,IA) | |
195 | IF ( AB (IN,IA) .LE. 0.D+00 ) NULAST (IA) = IN - 1 | |
196 | 18 CONTINUE | |
197 | * | | | | |
198 | * | | +-------------------------------------------------------------* | |
199 | ANUAVE = AB (1,IA) | |
200 | ANSESQ (IA) = 0.D+00 | |
201 | AB (1,IA) = AB (1,IA) / AAB (IA) | |
202 | * | | +-------------------------------------------------------------* | |
203 | * | | | Create the cumulative distribution | |
204 | DO 13 IN = 2, INMAX | |
205 | AB (IN,IA) = AB (IN,IA) / AAB (IA) + AB (IN-1,IA) | |
206 | ANUAVE = ANUAVE + IN * ( AB (IN,IA) | |
207 | & - AB (IN-1,IA) ) | |
208 | ANSESQ (IA) = ANSESQ (IA) + (IN-1)*(IN-1) | |
209 | & * ( AB (IN,IA) - AB (IN-1,IA) ) | |
210 | 13 CONTINUE | |
211 | * | | | | |
212 | * | | +-------------------------------------------------------------* | |
213 | ANUB (IA) = ANUAVE | |
214 | * | | +-------------------------------------------------------------* | |
215 | * | | | | |
216 | IF ( IPOWER .LT. 7 ) THEN | |
217 | ANPOWR (IA) = AB (1,IA) | |
218 | * | | | | |
219 | * | | +-------------------------------------------------------------* | |
220 | * | | | | |
221 | ELSE IF ( IPOWER .LT. 11 ) THEN | |
222 | ANPOWR (IA) = AB (1,IA) * FPOWER ( IPOWER, 1, ANUAVE ) | |
223 | * | | | | |
224 | * | | +-------------------------------------------------------------* | |
225 | * | | | | |
226 | ELSE | |
227 | ANPOWR (IA) = AB (1,IA) * FPOWER ( IPOWER, 1, ANUAVE ) | |
228 | END IF | |
229 | * | | | | |
230 | * | | +-------------------------------------------------------------* | |
231 | * | | +-------------------------------------------------------------* | |
232 | * | | | Compute < nu**y(nu) >: | |
233 | DO 11 IN = 2, INMAX | |
234 | IF ( IPOWER .LT. 7 ) THEN | |
235 | IF ( APOWER .GT. 0.D+00 ) THEN | |
236 | DPOWER = APOWER | |
237 | ELSE | |
238 | DPOWER = FPOWER ( IPOWER, IN, ANUAVE ) | |
239 | END IF | |
240 | ANPOWR (IA) = ANPOWR (IA) + IN**DPOWER | |
241 | & * ( AB (IN,IA) - AB (IN-1,IA) ) | |
242 | ELSE IF ( IPOWER .LT. 11 ) THEN | |
243 | ANPOWR (IA) = ANPOWR (IA) + IN | |
244 | & * FPOWER ( IPOWER, IN, ANUAVE ) | |
245 | & * ( AB (IN,IA) - AB (IN-1,IA) ) | |
246 | ELSE | |
247 | ANPOWR (IA) = ANPOWR (IA) + IN | |
248 | & **FPOWER ( IPOWER, IN, ANUAVE ) | |
249 | & * ( AB (IN,IA) - AB (IN-1,IA) ) | |
250 | END IF | |
251 | 11 CONTINUE | |
252 | * | | | | |
253 | * | | +-------------------------------------------------------------* | |
254 | 12 CONTINUE | |
255 | * | | | |
256 | * | +----------------------------------------------------------------* | |
257 | * | +----------------------------------------------------------------* | |
258 | * | | | |
259 | DO 17 IA = 1, IAMAX | |
260 | ANUAC = AB (1,IA) | |
261 | ANUSQ = AB (1,IA) | |
262 | ANUTH = AB (1,IA) | |
263 | * | | +-------------------------------------------------------------* | |
264 | * | | | | |
265 | DO 15 I = 2, NULAST (IA) | |
266 | ANUAC = ANUAC + I * ( AB (I,IA) - AB(I-1,IA) ) | |
267 | ANUSQ = ANUSQ + I*I * ( AB (I,IA) - AB(I-1,IA) ) | |
268 | ANUTH = ANUTH + I*I*I * ( AB (I,IA) - AB(I-1,IA) ) | |
269 | 15 CONTINUE | |
270 | * | | | | |
271 | * | | +-------------------------------------------------------------* | |
272 | * | | +-------------------------------------------------------------* | |
273 | * | | | | |
274 | IF ( IA .GT. 1 ) THEN | |
275 | ANUSE2 = ( ANUSQ - 2.D+00 * ANUB (IA) + 1.D+00 ) / | |
276 | & ( ANUB (IA) - 1.D+00 )**2 | |
277 | ANUSE3 = ( ANUTH - 3.D+00 * ANUSQ + 3.D+00 * ANUB (IA) | |
278 | & - 1.D+00 ) / ( ANUB (IA) - 1.D+00 )**3 | |
279 | * | | | | |
280 | * | | +-------------------------------------------------------------* | |
281 | * | | | | |
282 | ELSE | |
283 | ANUSE2 = 1.D+00 | |
284 | ANUSE3 = 1.D+00 | |
285 | END IF | |
286 | * | | | | |
287 | * | | +-------------------------------------------------------------* | |
288 | 17 CONTINUE | |
289 | * | | | |
290 | * | +----------------------------------------------------------------* | |
291 | NUDISV = -1 | |
292 | RETURN | |
293 | END IF | |
294 | * | | |
295 | * +-------------------------------------------------------------------* | |
296 | * +-------------------------------------------------------------------* | |
297 | * | Select the proper distributions for interpolations | |
298 | DO 40 I = 1, IAMAX | |
299 | IF (ANU .LT. ANUB(I)) GO TO 41 | |
300 | 40 CONTINUE | |
301 | * | | |
302 | * +-------------------------------------------------------------------* | |
303 | I=IAMAX + 1 | |
304 | 41 CONTINUE | |
305 | NANU = I - 1 | |
306 | IF (NANU.GE.IAMAX) GO TO 50 | |
307 | IF (NANU.LE.0) NANU = 1 | |
308 | NANUN = NANU + 1 | |
309 | WEIGH1 = ( ANU - ANUB (NANU) ) / ( ANUB (NANUN) - ANUB (NANU) ) | |
310 | WEIGH2 = ( ANUB (NANUN) - ANU ) / ( ANUB (NANUN) - ANUB (NANU) ) | |
311 | DIST (0) = 0.D+00 | |
312 | ASEASQ = WEIGH1 * ANSESQ (NANUN) + WEIGH2 * ANSESQ (NANU) | |
313 | APOWER = WEIGH1 * ANPOWR (NANUN) + WEIGH2 * ANPOWR (NANU) | |
314 | * +-------------------------------------------------------------------* | |
315 | * | Create the proper cumulative distribution by interpolation | |
316 | * | ( note that since weigh1 + weigh2 = 1 it will be automatically | |
317 | * | normalized ) | |
318 | DO 20 IN = 1, NULAST (NANUN) | |
319 | DIST (IN) = WEIGH1 * AB (IN,NANUN) + WEIGH2 * AB (IN,NANU) | |
320 | WEIGHT = (IN-1) * ( DIST (IN) - DIST (IN-1) ) | |
321 | 20 CONTINUE | |
322 | * | | |
323 | * +-------------------------------------------------------------------* | |
324 | PRZERO = DIST (1) | |
325 | CALL GRNDM(RNDM,1) | |
326 | X=RNDM(1) | |
327 | * +-------------------------------------------------------------------* | |
328 | * | Compute the proper nu from the cumulative distribution | |
329 | DO 30 IN = 1, NULAST (NANUN) | |
330 | IF ( X .LE. DIST (IN) ) GO TO 31 | |
331 | 30 CONTINUE | |
332 | * | | |
333 | * +-------------------------------------------------------------------* | |
334 | IN = NULAST (NANUN) | |
335 | 31 CONTINUE | |
336 | NUDISV = IN | |
337 | RETURN | |
338 | * Come here for <nu> larger than 8 | |
339 | 50 CONTINUE | |
340 | APOWER = -1.D+00 | |
341 | ASEASQ = -1.D+00 | |
342 | NUD = KPOIS (EXPLAM) | |
343 | NUDISV = NUD + 1 | |
344 | PRZERO = EXPLAM | |
345 | WRITE (LUNERR,*)' *** Nudisv called with <nu> >= 8 !!',REAL(ANU), | |
346 | & ' ***' | |
347 | RETURN | |
348 | *=== end of function Nudisv ===========================================* | |
349 | END |