summaryrefslogtreecommitdiff
path: root/Dragon/src/SYB4TR.f
blob: 0db27941a36108e876ec547b930bb7d93b453cc8 (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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
*DECK SYB4TR
      SUBROUTINE SYB4TR(MNA,NRD,NSECT4,COTEA,COTEB,RAYONS,IFAC,NUMREG,
     1 JMINRA,XCOTEA,JMINRB,XCOTEB,LFAIRE,DXMIN,DELR,IQW,PWA2,ZWA2,
     2 NXMIN,NXMAX,NZR,ZZR,NZI,ZZI)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute the tracking information related to a square or rectangular
* sectorized heterogeneous cell (called 4 times).
*
*Copyright:
* Copyright (C) 2002 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): A. Hebert
*
*Parameters: input
* MNA     number of angles in (0,$\\pi$/2).
* NRD     one plus the number of tubes in the cell.
* NSECT4  number of sectors.
* COTEA   X-axis Cartesian dimensions of the cell.
* COTEB   Y-axis Cartesian dimensions of the cell.
* RAYONS  radius of each cylinder.
* IFAC    starting side (=0, 1, 2 or 3).
* NUMREG  merged volume number in each sector.
* JMINRA  first interception with side a.
* XCOTEA  interceptions with side a.
* JMINRB  first interception with side b.
* XCOTEB  interceptions with side b.
* LFAIRE  tracking calculation flag (=.FALSE. only compute the number
*         of real and integer tracking elements).
* DXMIN   geometrical epsilon.
* DELR    half distance between the tracks.
* IQW     equal weight quadrature flag (=1 to use equal weight
*         quadratures in angle and space).
* PWA2    weights of the angular quadrature set.
* ZWA2    base points of the angular quadrature set.
*
*Parameters: output
* NXMIN   minimum number of tracks per region.
* NXMAX   maximum number of tracks per region.
* NZR     number of real tracking elements.
* ZZR     real tracking information.
* NZI     number of integer tracking elements.
* ZZI     integer tracking information.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER  MNA,NRD,NSECT4,IFAC,NUMREG(NSECT4,NRD),JMINRA,JMINRB,
     1         IQW,NXMIN,NXMAX,NZR,NZI,ZZI(*)
      REAL     COTEA,COTEB,RAYONS(NRD-1),XCOTEA(JMINRA:NRD-1),
     1         XCOTEB(JMINRB:NRD-1),DXMIN,DELR,PWA2(MNA),ZWA2(MNA),
     2         ZZR(*)
      LOGICAL  LFAIRE
*----
*  LOCAL VARIABLES
*----
*ISCW   No du Premier Secteur A L'Ouest (a gauche)
*ISXW   No de la Surface Externe A L'Ouest (a gauche)
*ISXE   No de la Surface Externe A L'Est (a droite)
      PARAMETER     (PI314  = 3.141592653589793)
      PARAMETER     (PIS2   = PI314 /  2)
      PARAMETER     (PIS4   = PI314 /  4)
      LOGICAL        NTRIOR
      REAL           ORIGIN(4)
      REAL           PENTES(4)
      REAL           WX(64)
      REAL           ZX(64)
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IXRAYO
      REAL, ALLOCATABLE, DIMENSION(:) :: HXRAYO,ANGLES,COSECT
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(IXRAYO(NRD*2+NSECT4+3))
      ALLOCATE(HXRAYO(NRD*2+NSECT4+3),ANGLES(NSECT4),COSECT(NSECT4))
*
* Interpolation des Trajectoires
      DCOTEA = COTEA * 0.5
      DCOTEB = COTEB * 0.5
      IZI = 0
      IZR = 0
*
      DELR2  = DELR * 2.
*
* /Debut/ Boucle sur les Angles (0 a Pi/2)
      DO 350 IA = 1, MNA
      MNT  = 0
      IZI  = IZI + 2
      IZIT = IZI
*
      WANGIA = PWA2(IA) * 0.5
      ZAIA   = ZWA2(IA) + 1.
      YAIA   = 1. - ZWA2(IA)
*
      PHI  = PIS4 * ZAIA
      COSPHI = COS(PHI)
      SINPHI = SIN(PHI)
      PENTES(1) = - SINPHI / COSPHI
      ORIGIN(1) = - DCOTEA / COSPHI
      PENTES(2) =   COSPHI / SINPHI
      ORIGIN(2) = - DCOTEB / SINPHI
      PENTES(3) = - SINPHI / COSPHI
      ORIGIN(3) =   DCOTEA / COSPHI
      PENTES(4) =   COSPHI / SINPHI
      ORIGIN(4) =   DCOTEB / SINPHI
      IF (LFAIRE) THEN
        ZZR(IZR+1) = SINPHI
        ZZR(IZR+3) = COSPHI
        IF ((IFAC .EQ. 0) .OR. (IFAC .EQ. 2)) THEN
          ZZR(IZR+2) = COSPHI
          ZZR(IZR+4) = - SINPHI
        ELSE
          ZZR(IZR+2) = - COSPHI
          ZZR(IZR+4) = SINPHI
        ENDIF
        DO 10 I=1,4
        ZZR(IZR+4+I) = ZZR(IZR+I)
   10   CONTINUE
        ZZR(IZR+9) = WANGIA
      ENDIF
        IZR = IZR + 9
      PHIJ = PHI + PI314 / 2
      PHIJ = - PHIJ
      PHIK = PI314 * 2 / NSECT4
      ISCMIN = 1
      ISCMAX = NSECT4
      DO I = 1, NSECT4
        PHIJ = PHIJ + PHIK
        IF     (PHIJ .LE. (DXMIN - PIS2)) THEN
          ISCMIN = I + 1
        ELSEIF (PHIJ .GE. (PIS2 - DXMIN)) THEN
          ISCMAX = I - 1
          GOTO 20
        ELSE
        ANGLES(I) = TAN(PHIJ)
        COSECT(I) = COS(PHIJ)
        ENDIF
      ENDDO
*
   20 DELTAH = (DCOTEB * COSPHI) - (DCOTEA * SINPHI)
*
* Rayon Max Pour cet angle (Rext)
      DELTAS = DCOTEA * SINPHI + DCOTEB * COSPHI
*
* Suivant West (Gauche,Bas=Sud)
      DELTAC = 0.
*----
*  /Debut/ Boucle sur les Trajectoires
*----
      NTRIOR = .TRUE.
      DO WHILE (NTRIOR)
        MNT = MNT + 1
        DELTAP = DELTAC
        CALL SYB4TH (NRD-1,  RAYONS,
     &               PENTES, ORIGIN,
     &               ISCMIN, ISCMAX, ANGLES,
     &               DXMIN,  DELTAC,
     &               ISCW,   ISCE,   ISXW,   ISXE,   NHMAX,
     &               IXRAYO, HXRAYO)
*
        DELTAC = DELTAS
*
        CALL SYB4TN (NHMAX,  IXRAYO, ISCW,
     &               COSECT, NRD-1, RAYONS,
     &               DELTAC)
*
        IF (ISXW .EQ.1) THEN
          CALL SYB4T1 (NRD-1, JMINRB, XCOTEB,
     &                 COSPHI, - DCOTEA * SINPHI,
     &                 ORIGIN(1), PENTES(1), ANGLES(ISCW),
     &                 IXRAYO, DELTAH,
     &                 DXMIN,  DELTAC)
        ELSE
          CALL SYB4T2 (NRD-1, JMINRA, XCOTEA,
     &                 SINPHI, DCOTEB, COSPHI,
     &                 ORIGIN(2), PENTES(2), ANGLES(ISCW),
     &                 IXRAYO, HXRAYO,
     &                 DXMIN,  DELTAC)
        ENDIF
*
        IF (ISXE .EQ. 4) THEN
          CALL SYB4T4 (NRD-1, JMINRA, XCOTEA,
     &                 SINPHI, DCOTEB, COSPHI,
     &                 ORIGIN(4), PENTES(4), ANGLES(ISCE-1),
     &                 IXRAYO(NHMAX), - DELTAH,
     &                 DXMIN,  DELTAC)
        ELSE
          CALL SYB4T3 (NRD-1, JMINRB, XCOTEB,
     &                 SINPHI, DCOTEA, COSPHI,
     &                 ORIGIN(3), PENTES(3), ANGLES(ISCE-1),
     &                 IXRAYO(NHMAX), HXRAYO(NHMAX),
     &                 DXMIN,  DELTAC)
        ENDIF
*
* Intervalle entre 2 Intersections, Decoupage
      DELTAX = DELTAC - DELTAP
      IF (DELTAX .LE. DELR2) THEN
        NX = 1
        ZX(1) = 0.0
        WX(1) = 2.0
      ELSE
        NX  = INT(DELTAX / DELR2 + 1)
        IF(IQW.EQ.0) THEN
*          GAUSS-LEGENDRE INTEGRATION POINTS. ZX(I) IS NOT USED.
           IF(NX.GT.20) THEN
              IF(NX.LT.24) THEN
                 NX=24
              ELSE IF(NX.LT.28) THEN
                 NX=28
              ELSE IF(NX.LT.32) THEN
                 NX=32
              ELSE IF(NX.LT.64) THEN
                 NX=64
              ELSE IF(NX.GT.64) THEN
                 CALL XABORT('SYB4TR: GAUSS OVERFLOW.')
              ENDIF
           ENDIF
           CALL ALGPT(NX,-1.0,1.0,ZX,WX)
        ELSE
*          EQUAL WEIGHT INTEGRATION POINTS.
           DO 30 I=1,NX
           ZX(I)=(2.0*REAL(I)-1.0)/REAL(NX)-1.0
           WX(I)=2.0/REAL(NX)
   30      CONTINUE
        ENDIF
      ENDIF
      NXMIN = MIN(NX, NXMIN)
      NXMAX = MAX(NX, NXMAX)
* Intervalle entre 2 Intersections, Fin du Decoupage
*
      IF (LFAIRE) THEN
*
* Debut : Nombre et Numeros des Regions
      CALL SYB4TI  (NHMAX, IXRAYO, ISCW,
     &              NSECT4, IFAC, NUMREG,
     &              NLMAX, ZZI(IZI+4))
      ZZI(IZI+1) = NLMAX
      ZZI(IZI+2) = NX
      ZZI(IZI+3) = ISXW
      IF (IFAC .EQ. 1) THEN
        ZZI(IZI+3) = 6 - ZZI(IZI+3)
      ELSEIF (IFAC .EQ. 2) THEN
        ZZI(IZI+3) = ZZI(IZI+3) + 2
      ELSEIF (IFAC .EQ. 3) THEN
        ZZI(IZI+3) = 4 - ZZI(IZI+3)
      ENDIF
      IF (ZZI(IZI+3) .GE. 4) ZZI(IZI+3) = ZZI(IZI+3) - 4
*
      IZI = IZI + 4 + NLMAX
      ZZI(IZI) = ISXE
      IF (IFAC .EQ. 1) THEN
        ZZI(IZI) = 6 - ZZI(IZI)
      ELSEIF (IFAC .EQ. 2) THEN
        ZZI(IZI) = ZZI(IZI) + 2
      ELSEIF (IFAC .EQ. 3) THEN
        ZZI(IZI) = 4 - ZZI(IZI)
      ENDIF
      IF (ZZI(IZI) .GE. 4) ZZI(IZI) = ZZI(IZI) - 4
* Fin : Nombre et Numeros des Regions
*
*----
* Boucle sur les trajectoires
*----
      DELTAR = DELTAP
      DO 250 IX = 1, NX
*
        WW = 0.5 *  WX(IX)
*
        IZR = IZR + 1
        ZZR(IZR) = WW * WANGIA * DELTAX
        DDELTA = DELTAX * WW
        DELTAR = DELTAR + DDELTA
*
* Position de L'intersection Gauche (West)
        ZZW = DELTAR * PENTES(ISXW) + ORIGIN(ISXW)
*
* Position de L'intersection Droite (Est)
        ZZE = DELTAR * PENTES(ISXE) + ORIGIN(ISXE)
*
* Longueur des intersections
        CALL SYB4TC (DELTAR, DDELTA, ANGLES,
     &               NHMAX, IXRAYO,
     &               ISCW,  NSECT4, IFAC, NUMREG,
     &               RAYONS, ZZW, ZZE,
     &               ZZR(IZR+1), HXRAYO)
        IZR = IZR + NLMAX
*
  250 CONTINUE
      ELSE
*
* Pour le comptage des Numeros de Regions
* deux indices de plus pour les surfaces Entrante et Sortante
        IZR = IZR + (NHMAX + 1) * NX
        IZI = IZI + 5 + NHMAX
      ENDIF
*
* Position des limites Gauche et Droite (West et Est)
      DR = DELTAC + DXMIN
      ZZW = DR * PENTES(ISXW) + ORIGIN(ISXW)
      ZZE = DR * PENTES(ISXE) + ORIGIN(ISXE)
      NTRIOR = ZZW .LT. ZZE
      IF (NTRIOR) THEN
        IF (DELTAC .LE. DELTAP) THEN
          CALL XABORT ('SYB4TR: INFINITE LOOP.')
        ENDIF
      ENDIF
*
* /Fin/ Boucle sur les Trajectoires
      ENDDO
*
* /Fin/ Boucle sur les Angles
      IF (LFAIRE) THEN
        ZZI(IZIT-1) = MNT
        ZZI(IZIT) = IFAC
      ENDIF
  350 CONTINUE
      NZI = IZI
      NZR = IZR
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(COSECT,ANGLES,HXRAYO)
      DEALLOCATE(IXRAYO)
*
      RETURN
      END