summaryrefslogtreecommitdiff
path: root/Dragon/src/PIJS3D.f
blob: 9f3ded526844fc2ec24ea3cc75f855d0f851972c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
*DECK PIJS3D
      SUBROUTINE PIJS3D(NREG,NSOUT,NSLINE,WEIGHT,RCUTOF,SIGTAL,
     >                  SEGLEN,NRSEG,STAYIN,GOSOUT,DPR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Integration for general 3D specular tracking.
*
*Copyright:
* Copyright (C) 1991 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): R. Roy, G. Marleau
*
*Parameters: input
* NREG    total number of regions.
* NSOUT   number of outer surface.
* NSLINE  number of segemnts on line.
* WEIGHT  line weight.
* RCUTOF  MFP cut-off factor (truncate lines).
* SIGTAL  albedo-cross section vector.
* SEGLEN  length of track.
* NRSEG   region crossed by track.
*
*Parameters: output
* DPR     collision probabilities.
*
*Parameters: scratch
* STAYIN  stay-in zone probability.
* GOSOUT  goes-out zone probability.
*
*References:
* R. Roy et al.,
* A Cyclic Tracking Procedure for CP Calculations in 2-D Lattices
* Conf/Advances in Math, Comp & Reactor Physics,
* Pittsburgh, V 1, P 2.2 4-1 (1991).
*
*-----------------------------------------------------------------------
*
      IMPLICIT         NONE
*----
* VARIABLES
*----
      INTEGER          NREG,NSOUT,NSLINE,NRSEG(NSLINE)
      REAL             RCUTOF,SIGTAL(-NSOUT:NREG)
      DOUBLE PRECISION WEIGHT,SEGLEN(NSLINE),STAYIN(NSLINE),
     >                 GOSOUT(NSLINE)
      DOUBLE PRECISION DPR(-NSOUT:NREG,-NSOUT:NREG)
*----
*  Local variables
*----
      INTEGER          IL,JL,NOIL,NOJL,ISODD,JSODD,IJDEL
      DOUBLE PRECISION TTOT,XSIL,OPATH,FINV,CUTOF
      REAL             ZERO,ONE,HALF
      PARAMETER       (ZERO=0.0E0, ONE=1.0E0, HALF=0.5E0 )
      REAL             SIXT,CUTEXP
      PARAMETER       (SIXT=HALF/3.0,CUTEXP=0.02)
      DOUBLE PRECISION EXSIL,XSIL2
      TTOT= ONE
*
*1.1)    CHANGE PATHS => GOSOUT AND STAYIN PATHS, INCLUDING ALBEDOS
*        ADD *PII* LOCAL NON-CYCLIC CONTRIBUTIONS
      ISODD=0
      DO 30 IL= 1, NSLINE
        NOIL  = NRSEG(IL)
        IF( NOIL.LT.0 )THEN
          IF(ISODD .EQ. 1) THEN
            ISODD=0
*----
*  FOR SURFACES:
*    OLD VERSION BEFORE SURFACE DOUBLING
*      GOSOUT= ALBEDO * SURFACE WEIGHT
*      WHERE ALL SURFACE WEIGHTS WERE 1.0
*    NEW VERSION WITH SURFACE DOUBLING
*      GOSOUT= ALBEDO
*    STAYIN = 1- ALBEDO * SURFACE WEIGHT
*    TTOT   = PRODUCT OF GOSOUT
*----
            GOSOUT(IL)= SIGTAL(NOIL)
            STAYIN(IL)= ONE - GOSOUT(IL)
            TTOT= TTOT * GOSOUT(IL)
          ELSE
            ISODD=1
*----
*  FOR SURFACES:
*    OLD VERSION BEFORE SURFACE DOUBLING
*      GOSOUT= ALBEDO * SURFACE WEIGHT
*      WHERE ALL SURFACE WEIGHTS WERE 1.0
*    NEW VERSION WITH SURFACE DOUBLING
*      GOSOUT= ALBEDO
*    STAYIN = 1- ALBEDO * SURFACE WEIGHT
*    TTOT   = PRODUCT OF GOSOUT
*----
            GOSOUT(IL)= SIGTAL(NOIL)
            STAYIN(IL)= ONE
          ENDIF
        ELSE
*----
*  FOR REGIONS
*  STAYIN = 1 -  EXP[ -CROSS SECTION * LENGTH OF NSLINE]
*  GOSOUT = 1 -  STAYIN
*  TTOT   = PRODUCT OF GOSOUT
*----
          XSIL  = SIGTAL(NOIL)
          IF( XSIL .EQ. ZERO) THEN
            GOSOUT(IL)= ONE
            STAYIN(IL)= SEGLEN(IL)
            DPR(NOIL,NOIL)= DPR(NOIL,NOIL)
     >                         + HALF*WEIGHT*STAYIN(IL)*STAYIN(IL)
          ELSE IF( XSIL .LT. CUTEXP) THEN
            OPATH= SIGTAL(NOIL)*SEGLEN(IL)
            XSIL2=OPATH*OPATH
            EXSIL=XSIL2*(HALF-SIXT*OPATH+XSIL2/24.0)
            STAYIN(IL)=OPATH-EXSIL
            GOSOUT(IL)= ONE - STAYIN(IL)
            TTOT= TTOT * GOSOUT(IL)
            DPR(NOIL,NOIL)= DPR(NOIL,NOIL) + WEIGHT*EXSIL
          ELSE
            OPATH= SIGTAL(NOIL)*SEGLEN(IL)
            EXSIL= EXP(-OPATH)
            STAYIN(IL)= ONE - EXSIL
            GOSOUT(IL)= EXSIL
            TTOT= TTOT * GOSOUT(IL)
            DPR(NOIL,NOIL)= DPR(NOIL,NOIL)
     >                         + WEIGHT*(OPATH-STAYIN(IL))
          ENDIF
        ENDIF
 30   CONTINUE
*
*1.2)    COMPUTE CYCLIC FACTORS BY ANGLE
*        USING GLOBAL TRACK ATTENUATION: BETA(TOT)*EXP(-MFP(TOT))
      IF(TTOT .GE. ONE )THEN
        CALL XABORT( 'PIJS3D: ALBEDOS ARE NOT COMPATIBLE')
      ENDIF
      FINV= WEIGHT / (ONE-TTOT)
*
*1.3)    ADD *PIJ* CONTRIBUTIONS FOR FORWARD SOURCES
      ISODD=0
      DO 50 IL= 1, NSLINE
        NOIL  = NRSEG(IL)
        TTOT= FINV * STAYIN(IL)
        CUTOF= RCUTOF*TTOT
        IF( NOIL .LT. 0) THEN
          ISODD=MOD(ISODD+1,2)
          JSODD=ISODD
          DO 70 IJDEL= 1, NSLINE
            JL= MOD(IL+IJDEL-1,NSLINE) + 1
            NOJL=NRSEG(JL)
            IF( NOJL .LT. 0 ) THEN
              JSODD=MOD(JSODD+1,2)
              IF( ISODD.EQ.1 .AND. JSODD .EQ.0) THEN
                DPR(NOJL,NOIL)= DPR(NOJL,NOIL) + TTOT * STAYIN(JL)
                TTOT= TTOT * GOSOUT(JL)
                IF( TTOT.LE.CUTOF ) GO TO 55
              ENDIF
            ELSE IF(ISODD.EQ.1) THEN
              DPR(NOJL,NOIL)= DPR(NOJL,NOIL) + TTOT * STAYIN(JL)
              TTOT= TTOT * GOSOUT(JL)
              IF( TTOT.LE.CUTOF ) GO TO 55
            ENDIF
 70       CONTINUE
        ELSE
          JSODD=ISODD
          DO 80 IJDEL= 1, NSLINE
            JL= MOD(IL+IJDEL-1,NSLINE) + 1
            NOJL=NRSEG(JL)
            IF( NOJL .LT. 0 ) THEN
              JSODD=MOD(JSODD+1,2)
              IF( JSODD .EQ.0) THEN
                DPR(NOJL,NOIL)= DPR(NOJL,NOIL) + TTOT * STAYIN(JL)
                TTOT= TTOT * GOSOUT(JL)
                IF( TTOT.LE.CUTOF ) GO TO 55
              ENDIF
            ELSE
              DPR(NOJL,NOIL)= DPR(NOJL,NOIL) + TTOT * STAYIN(JL)
              TTOT= TTOT * GOSOUT(JL)
              IF( TTOT.LE.CUTOF ) GO TO 55
            ENDIF
 80       CONTINUE
        ENDIF
 55     CONTINUE
 50   CONTINUE
      RETURN
      END