5 * Revision 1.5 2002/06/25 08:17:33 hristov
6 * Additional protection
8 * Revision 1.4 2002/06/22 10:50:18 hristov
11 * Revision 1.3 2002/06/20 15:58:37 hristov
12 * Protection in case of invalid ACOS argument. The reason for such argument has to be investigated.
14 * Revision 1.2 2002/05/13 12:40:58 hristov
15 * Dummy subroutines to avoid files with no code in
17 * Revision 1.1.1.1 1999/05/18 15:55:22 fca
20 * Revision 1.2 1997/10/17 10:00:03 mclareni
21 * Remove SAVE statement for NT
23 * Revision 1.1.1.1 1995/10/24 10:22:00 cernlib
27 #include "geant321/pilot.h"
28 *CMZ : 3.21/02 29/03/94 15.41.45 by S.Giani
33 *=== bimsel ===========================================================*
35 SUBROUTINE BIMSEL ( JPROJ, TXX, TYY, TZZ, LBCHCK )
37 #include "geant321/dblprc.inc"
38 #include "geant321/dimpar.inc"
39 #include "geant321/iounit.inc"
41 *----------------------------------------------------------------------*
42 *----------------------------------------------------------------------*
44 #include "geant321/balanc.inc"
45 #include "geant321/eva0.inc"
46 #include "geant321/nucdat.inc"
47 #include "geant321/nucgeo.inc"
48 #include "geant321/part.inc"
49 #include "geant321/parevt.inc"
50 #include "geant321/resnuc.inc"
52 PARAMETER ( FEFFEC = 1.518066780142162 D+00 )
53 PARAMETER ( BETMAX = 0.4 D+00 )
57 LOGICAL LBCHCK, LFERMI, LLMDBR
59 SAVE ABTAR , ZZTAR , SIGMP0, SIGMN0,
60 & AMNHLP, RHOBIM, RPRONU, RADPRP, RADPRN, DSKRED, RHRUSF,
61 & AUSFL , ZUSFL , BNDSAV, RADHLP, BFCHLP, BIMCLM, PRCOLP,
62 & PRCOLN, IBTOLD, ICTOLD, KPROJ , NTRIAL, ITFRMI
63 SAVE SBHAL0, SBSKI0, SBCEN0, SBCEN1, SBSKI1, SBHAL1
67 DATA IBTOLD, ICTOLD / 2*0 /
73 BEPROJ = PNUCCO / ( EKECON + AM (KPROJ) )
79 IF ( KPROJ .EQ. 1 .OR. KPROJ .EQ. 8 ) THEN
80 IPWELL = 1 + KPROJ / 8
82 BNDNUC = BNENRG (IPWELL)
85 IF ( IBAR (KPROJ) .EQ. 0 ) THEN
86 IF ( KPROJ .LE. 11 ) THEN
99 IF ( IBAR (KPROJ) .NE. 0 ) THEN
101 ELSE IF ( KPROJ .NE. 7 ) THEN
102 RPRONU = 0.8164965809277260D+00
110 CALL SIGFER ( KPTOIP (KPROJ), EKESIG, PPRSIG, LFERMI )
111 PRCOLP = ZUSFL / AUSFL * SIGMAP
112 PRCOLN = ( AUSFL - ZUSFL ) / AUSFL * SIGMAN
113 SIGMAA = PRCOLP + PRCOLN
114 PRCOLP = PRCOLP / SIGMAA
115 PRCOLN = 1.D+00 - PRCOLP
117 IF ( RPRONU .GT. ANGLGB ) THEN
121 PDEBRO = MAX ( PNUCCO, TMP102 )
122 ALMBAR = PLABRC / PDEBRO
123 DEBRLM = 0.5D+00 * ALMBAR
124 RADCOR = SQRT ( (RPRONU * RMSPRO)**2 + ALMBAR**2 )
125 & / ( RMSPRO * RPRONU )
127 PDEBRO = ( EKECON + BNDNUC ) * ( EKECON + BNDNUC + 2.D+00
133 RADCOR = SQRT ( (RPRONU * RMSPRO)**2 + PLABRC**2 / PDEBRO
134 & ) / ( RMSPRO * RPRONU )
142 RADPRO = MIN ( TWOTWO * RMSPRO * RPRONU * RADCOR, SKGT16 )
145 IF ( IBTAR .NE. IBTOLD .OR. ICHTAR .NE. ICTOLD ) THEN
150 AR1O3 = RMASS (IBTAR)
151 AMNHLP = 0.5D+00 * ( AMNUCL (1) + AMNUCL (2) )
152 HKAP = ABTAR**2 / ( ZZTAR**2 + ( ABTAR - ZZTAR )**2 )
153 HHLP (1) = ( HKAP * ZZTAR )**0.3333333333333333D+00 / AR1O3
154 HHLP (2) = ( HKAP * ( ABTAR - ZZTAR ) )
155 & **0.3333333333333333D+00 / AR1O3
156 RHOCEN = RHOTAB (IBTAR)
157 ALPHAL = ALPTAB (IBTAR)
158 RADIU0 = RADTAB (IBTAR)
159 SKINDP = SKITAB (IBTAR)
160 HALODP = HALTAB (IBTAR)
161 RADIU1 = RADIU0 + SKINDP
162 RADTOT = RADIU1 + HALODP
163 RHOCOR = ONEMNS * RHOCEN
164 RHOSKN = ALPHAL * RHOCEN
165 PFRCEN (1) = HHLP (1) * PFRTAB (IBTAR)
166 PFRCEN (2) = HHLP (2) * PFRTAB (IBTAR)
167 RHOAVE = RHATAB (IBTAR)
168 PFRAVE = PFATAB (IBTAR)
169 EKFAVE = EKATAB (IBTAR)
170 OMALHL = 1.D+00 - ALPHAL
171 RAD1O2 = RADIU0 + 0.5D+00 * SKINDP / OMALHL
172 SKNEFF = SKINDP / OMALHL
173 RADSKN = RADIU0 + SKNEFF
174 EKFCEN (1) = SQRT ( AMNUSQ (1) + PFRCEN (1)**2 ) - AMNUCL (1)
175 EKFCEN (2) = SQRT ( AMNUSQ (2) + PFRCEN (2)**2 ) - AMNUCL (2)
176 IF ( PFRCEN (1) .GT. PFRCEN (2) ) THEN
181 CALL NCLVST ( IBTAR, ICHTAR )
183 IF ( IPWELL .LE. 0 ) IPWELL = ITNCMX
185 IF ( EKECON .LT. 2.D+00 * GAMMIN ) THEN
190 RADSIG = ( RADTOT + DEBRLM ) * BFCLMB
197 RADMAX = RADTOT + RADPRO
198 BIMCLM = RDCLMB * BFCLMB
201 IF ( RADHLP .LE. RDCLMB ) THEN
203 BFCHLP = 0.5D+00 * CLMBBR * RDCLMB / EKECON
205 BFCHLP = 0.5D+00 * CLMBBR * RDCLMB / EKECON
206 BFCMAX = SQRT ( 1.D+00 - CLMBBR * RDCLMB / EKECON / RADHLP )
208 BIMMAX = RADHLP * BFCMAX
209 LLLMAX = INT ( BIMMAX / ALMBAR )
210 RADSIG = ALMBAR * ( LLLMAX + 1.D+00 )
211 SIGGEO = PI * RADSIG * RADSIG
213 RADHLP = RADTOT + RADPRO + DEBRLM
214 IF ( RADHLP .LE. RDCLMB ) THEN
217 BFCHLP = 0.5D+00 * CLMBBR * RDCLMB / EKECON
218 BFCMAX = SQRT ( 1.D+00 - CLMBBR * RDCLMB / EKECON / RADHLP )
220 RADSIG = RADHLP * BFCMAX
226 RPHI1 = 2.D+00 * RNDM (1) - 1.D+00
227 RPHI2 = 2.D+00 * RNDM (2) - 1.D+00
228 RPHI12 = RPHI1 * RPHI1
229 RPHI22 = RPHI2 * RPHI2
230 RSQ = RPHI12 + RPHI22
231 IF ( RSQ .GT. 1.D+00 ) GO TO 4200
232 SINPHI = 2.D+00 * RPHI1 * RPHI2 / RSQ
233 COSPHI = ( RPHI12 - RPHI22 ) / RSQ
234 SINT02 = 1.D+00 - CZIMPC * CZIMPC
235 IF ( SINT02 .LT. ANGLSQ ) THEN
240 SINTH0 = SQRT ( SINT02 )
241 SINPH0 = CYIMPC / SINTH0
242 COSPH0 = CXIMPC / SINTH0
243 UBIMPC = COSPHI * COSPH0 * CZIMPC - SINPHI * SINPH0
244 VBIMPC = COSPHI * SINPH0 * CZIMPC + SINPHI * COSPH0
245 WBIMPC = - COSPHI * SINTH0
248 ENTRY BIMNXT ( LBCHCK )
249 IF ( EKECON .LT. 2.D+00 * GAMMIN ) THEN
260 ANMFP = - LOG ( 1.D+00 - RNDM (1) ) / DSKRED
261 IF ( SBRES * SIGMAA .GT. ANMFP ) THEN
269 ALLMAX = LLLMAX + 1.D+00
271 RNDLLL = ALLMAX * MAX ( RNDM (1), RNDM (2) )
272 LLLACT = INT (RNDLLL)
273 BIMPTR = RNDLLL * ALMBAR
274 BIMPTR = ABS (BIMPTR)
275 IF ( BIMPTR .LE. BIMCLM ) THEN
278 HLPHLP = BFCHLP / BIMPTR
279 BFCEFF = 1.D+00 / ( HLPHLP + SQRT ( HLPHLP * HLPHLP
282 BIMPTR = BIMPTR / BFCEFF
283 IF ( BIMPTR .GT. RADHLP ) GO TO 5000
286 BIMPTR = RADSIG * MAX ( RNDM (1), RNDM (2) )
287 IF ( BIMPTR .LE. BIMCLM ) THEN
290 HLPHLP = BFCHLP / BIMPTR
291 BFCEFF = 1.D+00 / ( HLPHLP + SQRT ( HLPHLP * HLPHLP
294 BIMPTR = BIMPTR / BFCEFF
297 IF ( BIMPTR .GT. RADTOT - RADPRO ) THEN
298 BIMPCT = 0.5D+00 * ( RADTOT + BIMPTR - RADPRO )
299 IF ( BIMPTR .GE. RADTOT ) THEN
301 DUMMY = 2.D+00 * X1 / ( RADPRO + X1 )
302 IF (ABS(DUMMY).GT.1.D0) THEN
303 PRINT *,"Warning in GEANT321/peanut/bimsel.F "
304 PRINT *,"Illegal ACOS argument ",DUMMY
305 DUMMY = SIGN(1.D0, DUMMY )
307 ANGRED = ACOS ( DUMMY ) / PI
308 X1 = X1 / ( R0PROT * RPRONU * RADCO2 )
309 DSKRED = ( 0.5D+00 * X1 * X1 + X1 + 1.D+00 ) * EXP (-X1)
311 IF (DSKRED.EQ.0.D0) DSKRED=1.D+00
313 X1 = RADPRO + BIMPTR - RADTOT
314 DUMMY = 2.D+00 * X1 / ( RADPRO + X1 )
315 IF (ABS(DUMMY).GT.1.D0) THEN
316 PRINT *,"Warning in GEANT321/peanut/bimsel.F "
317 PRINT *,"Illegal ACOS argument ",DUMMY
318 DUMMY = SIGN(1.D0, DUMMY )
320 ANGRED = ACOS ( DUMMY ) / PI
321 X1 = X1 / ( R0PROT * RPRONU * RADCO2 )
322 DSKRED = 1.D+00 - ( 0.5D+00 * X1 * X1 + X1 + 1.D+00 )
323 & * EXP (-X1) * ANGRED
329 IF ( .NOT. LBCHCK ) THEN
331 RHOBIM = FRHONC ( BIMPCT )
332 IF ( RHOBIM .EQ. RHOSAV ) GO TO 5500
333 PFRBIM = FPFRNC ( RHOBIM, ITNCMX )
334 EKFBIM = FEKFNC ( PFRBIM, ITNCMX )
335 RHOHLP = FRHONC ( BIMPTR )
336 PFRHLP = FPFRNC ( RHOHLP, IPWELL )
337 PFRHLP = 0.5D+00 * PFRHLP * PFRHLP / AMNUSQ (IPWELL)
338 IF ( BIMPTR .GT. RADTOT ) BNDNUC = BNDNUC * ( 1.D+00
339 & - ( BIMPTR - RADTOT ) / ( RADHLP - RADTOT ) )
340 VPRBIM = WLLRED * ( AMNUCL (IPWELL) * PFRHLP
341 & * ( 1.D+00 - 0.5D+00 * PFRHLP ) + BNDNUC )
345 CALL SIGFER ( KPTOIP (KPROJ), EKESIG, PPRSIG, LFERMI )
346 PRCOLP = ZUSFL / AUSFL * SIGMAP
347 PRCOLN = ( AUSFL - ZUSFL ) / AUSFL * SIGMAN
348 SIGMAA = PRCOLP + PRCOLN
349 PRCOLP = PRCOLP / SIGMAA
350 PRCOLN = 1.D+00 - PRCOLP
353 RHOBIM = FRHONC ( BIMPCT )
355 XBIMPC = UBIMPC * BIMPCT
356 YBIMPC = VBIMPC * BIMPCT
357 ZBIMPC = WBIMPC * BIMPCT
359 ANMFP = - LOG ( 1.D+00 - RNDM (1) ) / DSKRED
360 IF ( BIMPCT .GT. RAD1O2 ) THEN
361 SBTTSQ = 4.D+00 * ( RADTOT**2 - BIMPCT**2 ) * RHOBIM**2
362 IF ( SBTTSQ .LE. ( ANMFP / SIGMAA )**2 ) GO TO 5000
364 CALL SBCOMP ( SBHAL0, SBSKI0, SBCEN0, SBCEN1, SBSKI1, SBHAL1 )
365 SBTOT = SBHAL0 + SBSKI0 + SBCEN0 + SBCEN1 + SBSKI1 + SBHAL1
366 SBTOT = RHRUSF * SBTOT
367 IF ( SBTOT * SIGMAA .LE. ANMFP ) GO TO 5000
369 SBUSED = SBUSED * RHRUSF + ANMFP / SIGMAA
370 SBRES = SBTOT - SBUSED
371 SBUSED = SBUSED / RHRUSF
375 IF ( RNDM (1) .LT. PRCOLP ) THEN
382 IPRTYP = KPROJ * 10 + KNUCIM
383 CALL RSCOMP ( SBHAL0, SBSKI0, SBCEN0, SBCEN1, SBSKI1, SBHAL1 )
385 RHOIMP = FRHONC ( ABS (RIMPCT) )
386 PFRIMP = FPFRNC ( RHOIMP, ITFRMI )
387 EKFIMP = FEKFNC ( PFRIMP, ITFRMI )
388 RIMHLP = ABS (RIMPTR)
389 RHOIMT = FRHONC ( RIMHLP )
390 PFRPRO = FPFRNC ( RHOIMT, IPWELL )
391 EKFPRO = FEKFNC ( PFRPRO, IPWELL )
392 IF ( RIMHLP .GT. RADTOT ) BNDNUC = BNDNUC * ( 1.D+00 - ( RIMHLP
393 & - RADTOT ) / ( RADHLP - RADTOT ))
394 VPRWLL = WLLRED * ( EKFPRO + BNDNUC )
395 EKEWLL = EKECON + VPRWLL
396 EPSWLL = EKEWLL + AM (KPROJ)
397 IF ( .NOT. LBCHCK ) THEN
398 PPRWLL = SQRT ( EKEWLL * ( EKEWLL + 2.D+00 * AM (KPROJ) ) )
399 CALL PHDWLL ( UBIMPC, VBIMPC, WBIMPC )
400 PNFRMI = PFNCLV ( ITFRMI, .TRUE. )
401 IF ( PNFRMI .LT. -100.D+00 ) GO TO 4400
402 CALL RACO ( PXFERM, PYFERM, PZFERM )
403 PXFERM = PXFERM * PNFRMI
404 PYFERM = PYFERM * PNFRMI
405 PZFERM = PZFERM * PNFRMI
406 ERES = EKEWLL + AM (KPROJ) + AM (KNUCIM) + EKFERM
407 PXRES = PXPROJ + PXFERM
408 PYRES = PYPROJ + PYFERM
409 PZRES = PZPROJ + PZFERM
410 PTRES2 = PXRES**2 + PYRES**2 + PZRES**2
411 UMO2 = ERES**2 - PTRES2
412 EKESIG = 0.5D+00 * ( UMO2 - AM (KPROJ)**2 - AM (KNUCIM)**2 )
413 & / AM (KNUCIM) - AM (KPROJ)
414 EKFIMP = MAX ( EKFERM, EKFIMP )
416 EKESIG = EPSWLL - AM (KPROJ)
418 PPRSIG = SQRT ( EKESIG * ( EKESIG + 2.D+00 * AM (KPROJ) ) )
422 CALL SIGFER ( KPTOIP (KPROJ), EKESIG, PPRSIG, LFERMI )
423 IF ( KNUCIM .EQ. 1 ) THEN
424 SIGMAR = SIGMAP / SIGMP0
426 SIGMAR = SIGMAN / SIGMN0
428 SIGMAR = MIN ( SIGMAR, ONEONE )
431 IF ( RNDREJ .GE. SIGMAR ) GO TO 4300
433 ZITA = 0.5D+00 * ( EKFIMP + EKFPRO ) / EKEWLL
434 IF ( ZITA .LE. 0.5D+00 ) THEN
435 PZITA = 1.D+00 - 1.4D+00 * ZITA
437 PZITA = 1.D+00 - 1.4D+00 * ZITA + 0.4D+00 * ZITA
438 & * ( 2.D+00 - 1.D+00 / ZITA )**2.5D+00
440 RNDREJ = RNDREJ / SIGMAR
441 IF ( RNDREJ .GE. PZITA ) GO TO 4300
445 OPACTY = 1.D+00 / NTRIAL
447 *=== End of subroutine Bimsel =========================================*