5 * Revision 1.1.1.1 1995/10/24 10:19:58 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 25/07/94 15.04.20 by S.Giani
15 *=== nudisv ===========================================================*
17 INTEGER FUNCTION NUDISV ( ANU, KB, EXPLAM, ASEASQ, APOWER, PRZERO)
19 #include "geant321/dblprc.inc"
20 #include "geant321/dimpar.inc"
21 #include "geant321/iounit.inc"
23 *----------------------------------------------------------------------*
25 * Last change on 05-may-92 by Alfredo Ferrari, INFN-Milan *
28 * multiplicity distribution of chains produced in hadron-nucleus *
32 * anu = average number of collisions *
33 * kb = baryon number of the projectile *
34 * explam = exp ( - (anu-1) ) *
36 * nudisv = number of high energy collisions *
37 *----------------------------------------------------------------------*
39 PARAMETER ( INMAX = 30 )
40 PARAMETER ( IAMAX = 13 )
41 PARAMETER ( ANUMAX = 6.0D+00 )
42 PARAMETER ( ANUMED = 0.5D+00 * ( 3.75D+00 + ANUMAX ) )
44 C AB,(KB.NE.0) BARYON NUCLEUS
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)
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,
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. /
78 * +-------------------------------------------------------------------*
79 * | First call: perform the initialization
82 IPOWER = NINT (-APOWER)
83 * | +----------------------------------------------------------------*
87 * | | +-------------------------------------------------------------*
88 * | | | This loop computes the normalization factor
90 AAB (IA) = AAB (IA) + AB (IN,IA)
93 * | | +-------------------------------------------------------------*
94 * | | +-------------------------------------------------------------*
96 IF ( AAB (IA) .GT. 0.D+00 ) THEN
98 * | | | +----------------------------------------------------------*
101 AB (IN,IA) = AB (IN,IA) / AAB (IA)
102 ANUAVE = ANUAVE + IN * AB (IN,IA)
105 * | | | +----------------------------------------------------------*
109 * | | +-------------------------------------------------------------*
112 * | +----------------------------------------------------------------*
113 * | +----------------------------------------------------------------*
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)
131 ANUEN1 = ( AEXTR1 + IN ) * ANUB (IA)
133 ANUEN2 = ( AEXTR2 + IN ) * ANUB (IA)
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
142 ANUBE0 = 0.5D+00 + (INN-1)
143 IF (INN .GT. INMAX ) GO TO 110
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
156 IF ( AB (IN,IR2) .GT. 0.D+00 ) THEN
157 DO 120 INN = MAX (NABE2,1), NAEN2
159 ANUBE0 = 0.5D+00 + (INN-1)
160 IF (INN .GT. INMAX ) GO TO 120
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
175 * | | +-------------------------------------------------------------*
176 * | | +-------------------------------------------------------------*
179 AB (IN,IA) = AB (IN,IA) / AAB (IA)
182 * | | +-------------------------------------------------------------*
185 * | +----------------------------------------------------------------*
186 * | +----------------------------------------------------------------*
187 * | | This loop simply creates a cumulative distribution
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
198 * | | +-------------------------------------------------------------*
201 AB (1,IA) = AB (1,IA) / AAB (IA)
202 * | | +-------------------------------------------------------------*
203 * | | | Create the cumulative distribution
205 AB (IN,IA) = AB (IN,IA) / AAB (IA) + AB (IN-1,IA)
206 ANUAVE = ANUAVE + IN * ( AB (IN,IA)
208 ANSESQ (IA) = ANSESQ (IA) + (IN-1)*(IN-1)
209 & * ( AB (IN,IA) - AB (IN-1,IA) )
212 * | | +-------------------------------------------------------------*
214 * | | +-------------------------------------------------------------*
216 IF ( IPOWER .LT. 7 ) THEN
217 ANPOWR (IA) = AB (1,IA)
219 * | | +-------------------------------------------------------------*
221 ELSE IF ( IPOWER .LT. 11 ) THEN
222 ANPOWR (IA) = AB (1,IA) * FPOWER ( IPOWER, 1, ANUAVE )
224 * | | +-------------------------------------------------------------*
227 ANPOWR (IA) = AB (1,IA) * FPOWER ( IPOWER, 1, ANUAVE )
230 * | | +-------------------------------------------------------------*
231 * | | +-------------------------------------------------------------*
232 * | | | Compute < nu**y(nu) >:
234 IF ( IPOWER .LT. 7 ) THEN
235 IF ( APOWER .GT. 0.D+00 ) THEN
238 DPOWER = FPOWER ( IPOWER, IN, ANUAVE )
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) )
247 ANPOWR (IA) = ANPOWR (IA) + IN
248 & **FPOWER ( IPOWER, IN, ANUAVE )
249 & * ( AB (IN,IA) - AB (IN-1,IA) )
253 * | | +-------------------------------------------------------------*
256 * | +----------------------------------------------------------------*
257 * | +----------------------------------------------------------------*
263 * | | +-------------------------------------------------------------*
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) )
271 * | | +-------------------------------------------------------------*
272 * | | +-------------------------------------------------------------*
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
280 * | | +-------------------------------------------------------------*
287 * | | +-------------------------------------------------------------*
290 * | +----------------------------------------------------------------*
295 * +-------------------------------------------------------------------*
296 * +-------------------------------------------------------------------*
297 * | Select the proper distributions for interpolations
299 IF (ANU .LT. ANUB(I)) GO TO 41
302 * +-------------------------------------------------------------------*
306 IF (NANU.GE.IAMAX) GO TO 50
307 IF (NANU.LE.0) NANU = 1
309 WEIGH1 = ( ANU - ANUB (NANU) ) / ( ANUB (NANUN) - ANUB (NANU) )
310 WEIGH2 = ( ANUB (NANUN) - ANU ) / ( ANUB (NANUN) - ANUB (NANU) )
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
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) )
323 * +-------------------------------------------------------------------*
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
333 * +-------------------------------------------------------------------*
338 * Come here for <nu> larger than 8
345 WRITE (LUNERR,*)' *** Nudisv called with <nu> >= 8 !!',REAL(ANU),
348 *=== end of function Nudisv ===========================================*