summaryrefslogtreecommitdiff
path: root/Dragon/src/PIJS2D.f
blob: 7fd56df23be96a917b622cc6188889a25911a446 (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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
*DECK PIJS2D
      SUBROUTINE PIJS2D(NREG,NSOUT,NSLINE,WEIGHT,RCUTOF,NGSS,SIGANG,
     >                  XGSS,WGSS,SEGLEN,NRSEG,STAYIN,GOSOUT,DPR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Integration for general 2D 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).
* NGSS    number of Gauss points.
* SIGANG  3D albedo-cross section vector.
* XGSS    2D->3D conversion for integration.
* WGSS    2D->3D conversion for integration.
* 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,NGSS,NRSEG(NSLINE)
      DOUBLE PRECISION WEIGHT,SEGLEN(NSLINE),STAYIN(NGSS,NSLINE),
     >                 GOSOUT(NGSS,NSLINE)
      REAL             RCUTOF,SIGANG(NGSS,-NSOUT:NREG)
      DOUBLE PRECISION DPR(-NSOUT:NREG,-NSOUT:NREG)
*----
*  Local variables
*----
      INTEGER          IL,JL,NOIL,NOJL,ISODD,JSODD,IJDEL,MXGAUS,IGSS
      PARAMETER       (MXGAUS= 64 )
      REAL             WGSS(MXGAUS),FINV(MXGAUS),XGSS(MXGAUS),
     >                 ZERO,ONE,HALF,XSIL,CUTOF
      DOUBLE PRECISION TTOT(MXGAUS),OPATH
      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
      DO 20 IGSS= 1,NGSS
        TTOT(IGSS)= ONE
 20   CONTINUE
*
*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
            DO 31 IGSS= 1,NGSS
*----
*  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(IGSS,IL)= SIGANG(1,NOIL)
              STAYIN(IGSS,IL)= ONE - GOSOUT(IGSS,IL)
              TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,IL)
 31         CONTINUE
          ELSE
            ISODD=1
            DO 32 IGSS= 1,NGSS
*----
*  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(IGSS,IL)= SIGANG(1,NOIL)
              STAYIN(IGSS,IL)= ONE
*              TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,IL)
 32         CONTINUE
          ENDIF
        ELSE IF(NOIL .GT. 0) THEN
*----
*  FOR REGIONS
*  STAYIN = 1 -  EXP[ -CROSS SECTION * LENGTH OF NSLINE]
*  GOSOUT = 1 -  STAYIN
*  TTOT   = PRODUCT OF GOSOUT
*----
          XSIL  = SIGANG(1,NOIL)
          IF( XSIL .EQ. ZERO) THEN
            DO 33 IGSS= 1,NGSS
              GOSOUT(IGSS,IL)= ONE
              STAYIN(IGSS,IL)= SEGLEN(IL)*XGSS(IGSS)
              DPR(NOIL,NOIL)= DPR(NOIL,NOIL)+HALF*WEIGHT*
     >               WGSS(IGSS)*STAYIN(IGSS,IL)*STAYIN(IGSS,IL)
 33         CONTINUE
          ELSE IF( XSIL .LT. CUTEXP) THEN
            DO 333 IGSS= 1,NGSS
              OPATH= SIGANG(IGSS,NOIL)*SEGLEN(IL)
              XSIL2=OPATH*OPATH
              EXSIL=XSIL2*(HALF-SIXT*OPATH+XSIL2/24.0)
              STAYIN(IGSS,IL)=OPATH-EXSIL
              GOSOUT(IGSS,IL)= ONE - STAYIN(IGSS,IL)
              TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,IL)
              DPR(NOIL,NOIL)= DPR(NOIL,NOIL) + WEIGHT*WGSS(IGSS)*EXSIL
 333        CONTINUE
          ELSE
            DO 34 IGSS=1,NGSS
              OPATH= SIGANG(IGSS,NOIL)*SEGLEN(IL)
              EXSIL= EXP(-OPATH)
              STAYIN(IGSS,IL)= ONE - EXSIL
              GOSOUT(IGSS,IL)= EXSIL
              TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,IL)
              DPR(NOIL,NOIL)= DPR(NOIL,NOIL)
     >              + WEIGHT*WGSS(IGSS)*(OPATH-STAYIN(IGSS,IL))
 34         CONTINUE
          ENDIF
        ENDIF
 30   CONTINUE
*
*1.2)    COMPUTE CYCLIC FACTORS BY ANGLE
*        USING GLOBAL TRACK ATTENUATION: BETA(TOT)*EXP(-MFP(TOT))
      DO 40 IGSS= 1,NGSS
        IF( TTOT(IGSS).GE.ONE )THEN
          CALL XABORT( 'PIJS2D: ALBEDOS ARE NOT COMPATIBLE')
        ENDIF
        FINV(IGSS)= REAL(WEIGHT * WGSS(IGSS) / (ONE-TTOT(IGSS)))
 40   CONTINUE
*
*1.3)    ADD *PIJ* CONTRIBUTIONS FOR FORWARD SOURCES
      ISODD=0
      DO 50 IL= 1, NSLINE
        NOIL  = NRSEG(IL)
        DO 60 IGSS= 1, NGSS
          TTOT(IGSS)= FINV(IGSS) * STAYIN(IGSS,IL)
 60     CONTINUE
        CUTOF= REAL(RCUTOF*TTOT(1))
        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
                DO 71 IGSS= 1, NGSS
                  DPR(NOJL,NOIL)= DPR(NOJL,NOIL)
     >                          + TTOT(IGSS) * STAYIN(IGSS,JL)
                  TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,JL)
 71             CONTINUE
                IF( TTOT(1).LE.CUTOF ) GO TO 55
              ENDIF
            ELSE IF((ISODD.EQ.1).AND.( NOJL .GT. 0 )) THEN
              DO 72 IGSS= 1, NGSS
                DPR(NOJL,NOIL)= DPR(NOJL,NOIL)
     >                        + TTOT(IGSS) * STAYIN(IGSS,JL)
                TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,JL)
 72           CONTINUE
              IF( TTOT(1).LE.CUTOF ) GO TO 55
            ENDIF
 70       CONTINUE
        ELSE IF( NOIL .GT. 0) THEN
          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
                DO 81 IGSS= 1, NGSS
                  DPR(NOJL,NOIL)= DPR(NOJL,NOIL)
     >                          + TTOT(IGSS) * STAYIN(IGSS,JL)
                  TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,JL)
 81             CONTINUE
                IF( TTOT(1).LE.CUTOF ) GO TO 55
              ENDIF
            ELSE IF( NOJL .GT. 0 ) THEN
              DO 82 IGSS= 1, NGSS
                DPR(NOJL,NOIL)= DPR(NOJL,NOIL)
     >                        + TTOT(IGSS) * STAYIN(IGSS,JL)
                TTOT(IGSS)= TTOT(IGSS) * GOSOUT(IGSS,JL)
 82           CONTINUE
              IF( TTOT(1).LE.CUTOF ) GO TO 55
            ENDIF
 80       CONTINUE
        ENDIF
 55     CONTINUE
 50   CONTINUE
      RETURN
      END