5 * Revision 1.4 2002/06/22 10:50:18 hristov
8 * Revision 1.3 2002/06/20 15:58:37 hristov
9 * Protection in case of invalid ACOS argument. The reason for such argument has to be investigated.
11 * Revision 1.2 2002/05/13 12:40:58 hristov
12 * Dummy subroutines to avoid files with no code in
14 * Revision 1.1.1.1 1999/05/18 15:55:22 fca
17 * Revision 1.2 1997/10/17 10:00:03 mclareni
18 * Remove SAVE statement for NT
20 * Revision 1.1.1.1 1995/10/24 10:22:00 cernlib
24 #include "geant321/pilot.h"
25 *CMZ : 3.21/02 29/03/94 15.41.45 by S.Giani
30 *=== bimsel ===========================================================*
32 SUBROUTINE BIMSEL ( JPROJ, TXX, TYY, TZZ, LBCHCK )
34 #include "geant321/dblprc.inc"
35 #include "geant321/dimpar.inc"
36 #include "geant321/iounit.inc"
38 *----------------------------------------------------------------------*
39 *----------------------------------------------------------------------*
41 #include "geant321/balanc.inc"
42 #include "geant321/eva0.inc"
43 #include "geant321/nucdat.inc"
44 #include "geant321/nucgeo.inc"
45 #include "geant321/part.inc"
46 #include "geant321/parevt.inc"
47 #include "geant321/resnuc.inc"
49 PARAMETER ( FEFFEC = 1.518066780142162 D+00 )
50 PARAMETER ( BETMAX = 0.4 D+00 )
54 LOGICAL LBCHCK, LFERMI, LLMDBR
56 SAVE ABTAR , ZZTAR , SIGMP0, SIGMN0,
57 & AMNHLP, RHOBIM, RPRONU, RADPRP, RADPRN, DSKRED, RHRUSF,
58 & AUSFL , ZUSFL , BNDSAV, RADHLP, BFCHLP, BIMCLM, PRCOLP,
59 & PRCOLN, IBTOLD, ICTOLD, KPROJ , NTRIAL, ITFRMI
60 SAVE SBHAL0, SBSKI0, SBCEN0, SBCEN1, SBSKI1, SBHAL1
64 DATA IBTOLD, ICTOLD / 2*0 /
70 BEPROJ = PNUCCO / ( EKECON + AM (KPROJ) )
76 IF ( KPROJ .EQ. 1 .OR. KPROJ .EQ. 8 ) THEN
77 IPWELL = 1 + KPROJ / 8
79 BNDNUC = BNENRG (IPWELL)
82 IF ( IBAR (KPROJ) .EQ. 0 ) THEN
83 IF ( KPROJ .LE. 11 ) THEN
96 IF ( IBAR (KPROJ) .NE. 0 ) THEN
98 ELSE IF ( KPROJ .NE. 7 ) THEN
99 RPRONU = 0.8164965809277260D+00
107 CALL SIGFER ( KPTOIP (KPROJ), EKESIG, PPRSIG, LFERMI )
108 PRCOLP = ZUSFL / AUSFL * SIGMAP
109 PRCOLN = ( AUSFL - ZUSFL ) / AUSFL * SIGMAN
110 SIGMAA = PRCOLP + PRCOLN
111 PRCOLP = PRCOLP / SIGMAA
112 PRCOLN = 1.D+00 - PRCOLP
114 IF ( RPRONU .GT. ANGLGB ) THEN
118 PDEBRO = MAX ( PNUCCO, TMP102 )
119 ALMBAR = PLABRC / PDEBRO
120 DEBRLM = 0.5D+00 * ALMBAR
121 RADCOR = SQRT ( (RPRONU * RMSPRO)**2 + ALMBAR**2 )
122 & / ( RMSPRO * RPRONU )
124 PDEBRO = ( EKECON + BNDNUC ) * ( EKECON + BNDNUC + 2.D+00
130 RADCOR = SQRT ( (RPRONU * RMSPRO)**2 + PLABRC**2 / PDEBRO
131 & ) / ( RMSPRO * RPRONU )
139 RADPRO = MIN ( TWOTWO * RMSPRO * RPRONU * RADCOR, SKGT16 )
142 IF ( IBTAR .NE. IBTOLD .OR. ICHTAR .NE. ICTOLD ) THEN
147 AR1O3 = RMASS (IBTAR)
148 AMNHLP = 0.5D+00 * ( AMNUCL (1) + AMNUCL (2) )
149 HKAP = ABTAR**2 / ( ZZTAR**2 + ( ABTAR - ZZTAR )**2 )
150 HHLP (1) = ( HKAP * ZZTAR )**0.3333333333333333D+00 / AR1O3
151 HHLP (2) = ( HKAP * ( ABTAR - ZZTAR ) )
152 & **0.3333333333333333D+00 / AR1O3
153 RHOCEN = RHOTAB (IBTAR)
154 ALPHAL = ALPTAB (IBTAR)
155 RADIU0 = RADTAB (IBTAR)
156 SKINDP = SKITAB (IBTAR)
157 HALODP = HALTAB (IBTAR)
158 RADIU1 = RADIU0 + SKINDP
159 RADTOT = RADIU1 + HALODP
160 RHOCOR = ONEMNS * RHOCEN
161 RHOSKN = ALPHAL * RHOCEN
162 PFRCEN (1) = HHLP (1) * PFRTAB (IBTAR)
163 PFRCEN (2) = HHLP (2) * PFRTAB (IBTAR)
164 RHOAVE = RHATAB (IBTAR)
165 PFRAVE = PFATAB (IBTAR)
166 EKFAVE = EKATAB (IBTAR)
167 OMALHL = 1.D+00 - ALPHAL
168 RAD1O2 = RADIU0 + 0.5D+00 * SKINDP / OMALHL
169 SKNEFF = SKINDP / OMALHL
170 RADSKN = RADIU0 + SKNEFF
171 EKFCEN (1) = SQRT ( AMNUSQ (1) + PFRCEN (1)**2 ) - AMNUCL (1)
172 EKFCEN (2) = SQRT ( AMNUSQ (2) + PFRCEN (2)**2 ) - AMNUCL (2)
173 IF ( PFRCEN (1) .GT. PFRCEN (2) ) THEN
178 CALL NCLVST ( IBTAR, ICHTAR )
180 IF ( IPWELL .LE. 0 ) IPWELL = ITNCMX
182 IF ( EKECON .LT. 2.D+00 * GAMMIN ) THEN
187 RADSIG = ( RADTOT + DEBRLM ) * BFCLMB
194 RADMAX = RADTOT + RADPRO
195 BIMCLM = RDCLMB * BFCLMB
198 IF ( RADHLP .LE. RDCLMB ) THEN
200 BFCHLP = 0.5D+00 * CLMBBR * RDCLMB / EKECON
202 BFCHLP = 0.5D+00 * CLMBBR * RDCLMB / EKECON
203 BFCMAX = SQRT ( 1.D+00 - CLMBBR * RDCLMB / EKECON / RADHLP )
205 BIMMAX = RADHLP * BFCMAX
206 LLLMAX = INT ( BIMMAX / ALMBAR )
207 RADSIG = ALMBAR * ( LLLMAX + 1.D+00 )
208 SIGGEO = PI * RADSIG * RADSIG
210 RADHLP = RADTOT + RADPRO + DEBRLM
211 IF ( RADHLP .LE. RDCLMB ) THEN
214 BFCHLP = 0.5D+00 * CLMBBR * RDCLMB / EKECON
215 BFCMAX = SQRT ( 1.D+00 - CLMBBR * RDCLMB / EKECON / RADHLP )
217 RADSIG = RADHLP * BFCMAX
223 RPHI1 = 2.D+00 * RNDM (1) - 1.D+00
224 RPHI2 = 2.D+00 * RNDM (2) - 1.D+00
225 RPHI12 = RPHI1 * RPHI1
226 RPHI22 = RPHI2 * RPHI2
227 RSQ = RPHI12 + RPHI22
228 IF ( RSQ .GT. 1.D+00 ) GO TO 4200
229 SINPHI = 2.D+00 * RPHI1 * RPHI2 / RSQ
230 COSPHI = ( RPHI12 - RPHI22 ) / RSQ
231 SINT02 = 1.D+00 - CZIMPC * CZIMPC
232 IF ( SINT02 .LT. ANGLSQ ) THEN
237 SINTH0 = SQRT ( SINT02 )
238 SINPH0 = CYIMPC / SINTH0
239 COSPH0 = CXIMPC / SINTH0
240 UBIMPC = COSPHI * COSPH0 * CZIMPC - SINPHI * SINPH0
241 VBIMPC = COSPHI * SINPH0 * CZIMPC + SINPHI * COSPH0
242 WBIMPC = - COSPHI * SINTH0
245 ENTRY BIMNXT ( LBCHCK )
246 IF ( EKECON .LT. 2.D+00 * GAMMIN ) THEN
257 ANMFP = - LOG ( 1.D+00 - RNDM (1) ) / DSKRED
258 IF ( SBRES * SIGMAA .GT. ANMFP ) THEN
266 ALLMAX = LLLMAX + 1.D+00
268 RNDLLL = ALLMAX * MAX ( RNDM (1), RNDM (2) )
269 LLLACT = INT (RNDLLL)
270 BIMPTR = RNDLLL * ALMBAR
271 BIMPTR = ABS (BIMPTR)
272 IF ( BIMPTR .LE. BIMCLM ) THEN
275 HLPHLP = BFCHLP / BIMPTR
276 BFCEFF = 1.D+00 / ( HLPHLP + SQRT ( HLPHLP * HLPHLP
279 BIMPTR = BIMPTR / BFCEFF
280 IF ( BIMPTR .GT. RADHLP ) GO TO 5000
283 BIMPTR = RADSIG * MAX ( RNDM (1), RNDM (2) )
284 IF ( BIMPTR .LE. BIMCLM ) THEN
287 HLPHLP = BFCHLP / BIMPTR
288 BFCEFF = 1.D+00 / ( HLPHLP + SQRT ( HLPHLP * HLPHLP
291 BIMPTR = BIMPTR / BFCEFF
294 IF ( BIMPTR .GT. RADTOT - RADPRO ) THEN
295 BIMPCT = 0.5D+00 * ( RADTOT + BIMPTR - RADPRO )
296 IF ( BIMPTR .GE. RADTOT ) THEN
298 DUMMY = 2.D+00 * X1 / ( RADPRO + X1 )
299 IF (ABS(DUMMY).GT.1.0) THEN
300 PRINT *,"Warning in GEANT321/peanut/bimsel.F "
301 PRINT *,"Illegal ACOS argument ",DUMMY
302 DUMMY = SIGN(1.0, DUMMY )
304 ANGRED = ACOS ( DUMMY ) / PI
305 X1 = X1 / ( R0PROT * RPRONU * RADCO2 )
306 DSKRED = ( 0.5D+00 * X1 * X1 + X1 + 1.D+00 ) * EXP (-X1)
308 IF (DSKRED.EQ.0.0) DSKRED=1.D+00
310 X1 = RADPRO + BIMPTR - RADTOT
311 DUMMY = 2.D+00 * X1 / ( RADPRO + X1 )
312 IF (ABS(DUMMY).GT.1.0) THEN
313 PRINT *,"Warning in GEANT321/peanut/bimsel.F "
314 PRINT *,"Illegal ACOS argument ",DUMMY
315 DUMMY = SIGN(1.0, DUMMY )
317 ANGRED = ACOS ( DUMMY ) / PI
318 X1 = X1 / ( R0PROT * RPRONU * RADCO2 )
319 DSKRED = 1.D+00 - ( 0.5D+00 * X1 * X1 + X1 + 1.D+00 )
320 & * EXP (-X1) * ANGRED
326 IF ( .NOT. LBCHCK ) THEN
328 RHOBIM = FRHONC ( BIMPCT )
329 IF ( RHOBIM .EQ. RHOSAV ) GO TO 5500
330 PFRBIM = FPFRNC ( RHOBIM, ITNCMX )
331 EKFBIM = FEKFNC ( PFRBIM, ITNCMX )
332 RHOHLP = FRHONC ( BIMPTR )
333 PFRHLP = FPFRNC ( RHOHLP, IPWELL )
334 PFRHLP = 0.5D+00 * PFRHLP * PFRHLP / AMNUSQ (IPWELL)
335 IF ( BIMPTR .GT. RADTOT ) BNDNUC = BNDNUC * ( 1.D+00
336 & - ( BIMPTR - RADTOT ) / ( RADHLP - RADTOT ) )
337 VPRBIM = WLLRED * ( AMNUCL (IPWELL) * PFRHLP
338 & * ( 1.D+00 - 0.5D+00 * PFRHLP ) + BNDNUC )
342 CALL SIGFER ( KPTOIP (KPROJ), EKESIG, PPRSIG, LFERMI )
343 PRCOLP = ZUSFL / AUSFL * SIGMAP
344 PRCOLN = ( AUSFL - ZUSFL ) / AUSFL * SIGMAN
345 SIGMAA = PRCOLP + PRCOLN
346 PRCOLP = PRCOLP / SIGMAA
347 PRCOLN = 1.D+00 - PRCOLP
350 RHOBIM = FRHONC ( BIMPCT )
352 XBIMPC = UBIMPC * BIMPCT
353 YBIMPC = VBIMPC * BIMPCT
354 ZBIMPC = WBIMPC * BIMPCT
356 ANMFP = - LOG ( 1.D+00 - RNDM (1) ) / DSKRED
357 IF ( BIMPCT .GT. RAD1O2 ) THEN
358 SBTTSQ = 4.D+00 * ( RADTOT**2 - BIMPCT**2 ) * RHOBIM**2
359 IF ( SBTTSQ .LE. ( ANMFP / SIGMAA )**2 ) GO TO 5000
361 CALL SBCOMP ( SBHAL0, SBSKI0, SBCEN0, SBCEN1, SBSKI1, SBHAL1 )
362 SBTOT = SBHAL0 + SBSKI0 + SBCEN0 + SBCEN1 + SBSKI1 + SBHAL1
363 SBTOT = RHRUSF * SBTOT
364 IF ( SBTOT * SIGMAA .LE. ANMFP ) GO TO 5000
366 SBUSED = SBUSED * RHRUSF + ANMFP / SIGMAA
367 SBRES = SBTOT - SBUSED
368 SBUSED = SBUSED / RHRUSF
372 IF ( RNDM (1) .LT. PRCOLP ) THEN
379 IPRTYP = KPROJ * 10 + KNUCIM
380 CALL RSCOMP ( SBHAL0, SBSKI0, SBCEN0, SBCEN1, SBSKI1, SBHAL1 )
382 RHOIMP = FRHONC ( ABS (RIMPCT) )
383 PFRIMP = FPFRNC ( RHOIMP, ITFRMI )
384 EKFIMP = FEKFNC ( PFRIMP, ITFRMI )
385 RIMHLP = ABS (RIMPTR)
386 RHOIMT = FRHONC ( RIMHLP )
387 PFRPRO = FPFRNC ( RHOIMT, IPWELL )
388 EKFPRO = FEKFNC ( PFRPRO, IPWELL )
389 IF ( RIMHLP .GT. RADTOT ) BNDNUC = BNDNUC * ( 1.D+00 - ( RIMHLP
390 & - RADTOT ) / ( RADHLP - RADTOT ))
391 VPRWLL = WLLRED * ( EKFPRO + BNDNUC )
392 EKEWLL = EKECON + VPRWLL
393 EPSWLL = EKEWLL + AM (KPROJ)
394 IF ( .NOT. LBCHCK ) THEN
395 PPRWLL = SQRT ( EKEWLL * ( EKEWLL + 2.D+00 * AM (KPROJ) ) )
396 CALL PHDWLL ( UBIMPC, VBIMPC, WBIMPC )
397 PNFRMI = PFNCLV ( ITFRMI, .TRUE. )
398 IF ( PNFRMI .LT. -100.D+00 ) GO TO 4400
399 CALL RACO ( PXFERM, PYFERM, PZFERM )
400 PXFERM = PXFERM * PNFRMI
401 PYFERM = PYFERM * PNFRMI
402 PZFERM = PZFERM * PNFRMI
403 ERES = EKEWLL + AM (KPROJ) + AM (KNUCIM) + EKFERM
404 PXRES = PXPROJ + PXFERM
405 PYRES = PYPROJ + PYFERM
406 PZRES = PZPROJ + PZFERM
407 PTRES2 = PXRES**2 + PYRES**2 + PZRES**2
408 UMO2 = ERES**2 - PTRES2
409 EKESIG = 0.5D+00 * ( UMO2 - AM (KPROJ)**2 - AM (KNUCIM)**2 )
410 & / AM (KNUCIM) - AM (KPROJ)
411 EKFIMP = MAX ( EKFERM, EKFIMP )
413 EKESIG = EPSWLL - AM (KPROJ)
415 PPRSIG = SQRT ( EKESIG * ( EKESIG + 2.D+00 * AM (KPROJ) ) )
419 CALL SIGFER ( KPTOIP (KPROJ), EKESIG, PPRSIG, LFERMI )
420 IF ( KNUCIM .EQ. 1 ) THEN
421 SIGMAR = SIGMAP / SIGMP0
423 SIGMAR = SIGMAN / SIGMN0
425 SIGMAR = MIN ( SIGMAR, ONEONE )
428 IF ( RNDREJ .GE. SIGMAR ) GO TO 4300
430 ZITA = 0.5D+00 * ( EKFIMP + EKFPRO ) / EKEWLL
431 IF ( ZITA .LE. 0.5D+00 ) THEN
432 PZITA = 1.D+00 - 1.4D+00 * ZITA
434 PZITA = 1.D+00 - 1.4D+00 * ZITA + 0.4D+00 * ZITA
435 & * ( 2.D+00 - 1.D+00 / ZITA )**2.5D+00
437 RNDREJ = RNDREJ / SIGMAR
438 IF ( RNDREJ .GE. PZITA ) GO TO 4300
442 OPACTY = 1.D+00 / NTRIAL
444 *=== End of subroutine Bimsel =========================================*