]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/neutron/partxs.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / neutron / partxs.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1995/10/24 10:21:58  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.48  by  S.Giani
11 *-- Author :
12       SUBROUTINE PARTXS(D,LD,E,SIGTOT,EP)
13 C       THIS ROUTINE SAMPLES FROM THE FILE 12 OR 13 PHOTON
14 C       PRODUCTION PARTIAL DISTRIBUTIONS TO OBTAIN THE EXIT
15 C       PHOTON ENERGY FROM A NEUTRON REACTION
16 #include "geant321/minput.inc"
17       DIMENSION D(*),LD(*)
18       SAVE
19 C       INITIALIZE THE VALUES USED IN THE SELECTION PROCESS
20 C       THE VALUE (II) IS A POINTER
21       ITRY1=0
22    10 R=FLTRNF(0)
23       SUM=0.0
24       NH=0
25       NL=0
26       II=0
27 C       SET THE NUMBER OF PARTIAL DISTRIBUTIONS (NK) AND THE NUMBER
28 C       OF POINTS PER PARTIAL DISTRIBUTION (NP)
29       NK=LD(II+1)
30       NP=LD(II+2)
31       II=II+2
32 C       DETERMINE WHICH POINTS (NL) AND (NH) BOUND THE INCIDENT
33 C       NEUTRON ENERGY
34       DO 20 N=1,NP
35          IF(E.LE.D(II+N))GO TO 40
36    20 CONTINUE
37 C       THE INCIDENT NEUTRON ENERGY IS GREATER THAN THE LAST ENERGY
38 C       POINT OF THE PARTIAL DISTRIBUTIONS, THEREFORE USE THE LAST
39 C       ENERGY POINT OF THE PARTIAL DISTRIBUTION TO SAMPLE FROM
40       NH=NP
41       II=II+NP
42       DO 30 K=1,NK
43          EP=D(II+1)
44          LP=LD(II+2)
45          A=D(II+3)
46          LF=LD(II+4)
47          IF(LP.EQ.2)EP=EP+(A/(A+1))*E
48          II=II+4
49          SIG=D(II+NH)
50          SUM=SUM+SIG/SIGTOT
51          IF(EP.EQ.0.0)GO TO 100
52          IF(R.LE.SUM)GO TO 100
53          II=II+NP
54    30 CONTINUE
55       GO TO 80
56    40 IF(N.EQ.1)GO TO 60
57 C       THE INCIDENT NEUTRON ENERGY IS BOUNDED BY THE ENEGY POINTS
58 C       (NL) AND (NH) OF THE PARTIAL DISTRIBUTIONS, THEREFORE USE
59 C       LINEAR INTERPOLATION
60       NH=N
61       NL=N-1
62       EH=D(II+NH)
63       EL=D(II+NL)
64       II=II+NP
65       DO 50 K=1,NK
66          EP=D(II+1)
67          LP=LD(II+2)
68          A=D(II+3)
69          LF=LD(II+4)
70          IF(LP.EQ.2)EP=EP+(A/(A+1))*E
71          II=II+4
72          SIG=D(II+NL)+(E-EL)*(D(II+NH)-D(II+NL))/(EH-EL)
73          SUM=SUM+SIG/SIGTOT
74          IF(EP.EQ.0.0)GO TO 100
75          IF(R.LE.SUM)GO TO 100
76          II=II+NP
77    50 CONTINUE
78       GO TO 80
79 C       THE INCIDENT NEUTRON ENERGY IS LESS THAN THE FIRST ENERGY
80 C       POINT OF THE PARTIAL DISTRIBUTIONS, THEREFORE USE THE FIRST
81 C       ENERGY POINT OF THE PARTIAL DISTRIBUTION TO SAMPLE FROM
82    60 NL=N
83       II=II+NP
84       DO 70 K=1,NK
85          EP=D(II+1)
86          LP=LD(II+2)
87          A=D(II+3)
88          LF=LD(II+4)
89          IF(LP.EQ.2)EP=EP+(A/(A+1))*E
90          II=II+4
91          SIG=D(II+NL)
92          SUM=SUM+SIG/SIGTOT
93          IF(EP.EQ.0.0)GO TO 100
94          IF(R.LE.SUM)GO TO 100
95          II=II+NP
96    70 CONTINUE
97 C retry with new R if SUM != 0
98    80 IF(SUM.EQ.0.0) GOTO 90
99       ITRY1 = ITRY1 + 1
100       IF(ITRY1.LE.2) GOTO 10
101 C no success set EP = 0
102    90 EP = 0.0
103   100 RETURN
104       END