summaryrefslogtreecommitdiff
path: root/Dragon/src/XCWICL.f
blob: a894e2767a6a674b288c98a57e7236cbd73c62c9 (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
334
335
336
337
338
339
340
341
342
343
344
345
346
347
*DECK XCWICL
      SUBROUTINE XCWICL(  NDIM, NSURX,  NVOL,  NBAN,   NRT, MSROD,
     >                   MAROD, NANGL,  DENS, ISYMM,IFTEMP,  IPRT,
     >                  NRINFO,   RAN,  COTE, NRODS,  RODS, NRODR,
     >                    RODR, MXSEG,  NXRI,   IMS)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Perform isotropic tracking for 2-d cluster geometry.
*
*Copyright:
* Copyright (C) 1994 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): G.Marleau
*
*Parameters: input
* NDIM    dimension of problem.
* NSURX   number of initial outer surfaces.
* NVOL    total number of regions.
* NBAN    number of concentric regions.
* NRT     number of rod types.
* MSROD   maximum number of subrod per rods.
* MAROD   maximum number of rod in any cluster.
* NANGL   number of integration angles.
* DENS    minimum parallel line trak density.
* ISYMM   integration symmetry factor.
* IFTEMP  temporary tracking file unit.
* IPRT    print level.
* NRINFO  type of concentric region:
*         NRINFO(1,IAN) = new region number;
*         NRINFO(2,IAN) = associated cluster;
*                       = 0 no cluster.
* RAN     radius/lattice side of region.
* COTE    y dimension for rectangle.
* NRODS   integer description of rod type:
*         NRODS(1,IRT) = number of rod;
*         NRODS(2,IRT) = number of subrods in rod;
*         NRODS(3,IRT) = associated annulus.
* RODS    description of rod of a given type:
*         RODS(1,IRT) = rod center radius;
*         RODS(2,IRT) = angle position of one rod.
* NRODR   subrod region.
* RODR    subrod radius.
* MXSEG   current maximum track length.
* NXRI    annular region content multi-rod.
* IMS     surface merge.
*
*----------------------------------------------------------------------
*
      PARAMETER (IUNOUT=6,PI=3.1415926535897932,SQ3=1.7320508075688773)
      INTEGER    NDIM,NSURX,NVOL,NBAN,NRT,MSROD,MAROD,NANGL,
     >           ISYMM,IFTEMP,IPRT,NXRI(NRT,NBAN),NRINFO(2,NBAN),
     >           NRODS(3,NRT),NRODR(NRT),MXSEG,INDS(2),IMS(6)
      LOGICAL    LINTER
      REAL       DENS,RAN(NBAN),COTE,RODS(2,NRT),RODR(MSROD,NRT),
     >           XPOS(2)
      DOUBLE PRECISION DCSA(2),SIDE(2),TRKPOS(2,2),ROTPOS(2,2),
     >                 DRADC,WEIGHT
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: NRSEG,NNSEG
      REAL, ALLOCATABLE, DIMENSION(:) :: ATOP
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: DENSTY,SEGLEN
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: ANGLES
      REAL, ALLOCATABLE, DIMENSION(:,:,:) :: RODP
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(NRSEG(MXSEG),NNSEG(MXSEG))
      ALLOCATE(ANGLES(NDIM,NANGL),DENSTY(NANGL),SEGLEN(MXSEG),
     > RODP(2,MAROD,NRT),ATOP(NRT))
*
      IF(IPRT.GE.1) THEN
        WRITE(IUNOUT,'(//1X,A20)') 'ISOTROPIC TRACKING  '
      ENDIF
*----
*  DETERMINE INTEGRATION LIMITS FOR CLUSTER REGIONS
*----
      IF(NSURX.EQ.6) THEN
        RADEQ=RAN(NBAN)
        NTAN=NBAN-1
      ELSE IF(NSURX.EQ.4) THEN
        SIDE(1)=DBLE(RAN(NBAN))
        SIDE(2)=DBLE(COTE)
        RADEQ=0.5*SQRT(RAN(NBAN)*RAN(NBAN)+COTE*COTE)
        NTAN=NBAN-1
      ELSE
        RADEQ=RAN(NBAN)
        NTAN=NBAN
      ENDIF
      IF(ISYMM.GT.1) THEN
        DANGI=4.0*PI/FLOAT(NANGL*ISYMM)
      ELSE
        DANGI=2.0*PI/FLOAT(NANGL)
      ENDIF
      NPLINE=INT(RADEQ*DENS+1.0)
      NPLINE=NPLINE+MOD(NPLINE+1,2)
      DRADI=RADEQ/FLOAT(NPLINE)
      IF(IPRT.GT.0) THEN
        WRITE(IUNOUT,6010) NVOL,NSURX,NBAN,NRT
        WRITE(IUNOUT,6011)
        WRITE(IUNOUT,6012) (II,NRODS(1,II),NRODS(2,II),
     >                      NRODS(3,II),II=1,NRT)
        WRITE(IUNOUT,6000) NANGL,DENS,NPLINE,1.0/DRADI,ISYMM
      ENDIF
      ANGD=-0.5*DANGI
      RADD=-0.5*DRADI
      WEIGHT=DRADI/DBLE(NANGL)
      DO 5 IANGL=1,NANGL
        ANGXX=ANGD+DANGI*FLOAT(IANGL)
        ANGLES(1,IANGL)=COS(ANGXX)
        ANGLES(2,IANGL)=SIN(ANGXX)
        DENSTY(IANGL)=REAL(2*NANGL)
 5    CONTINUE
      WRITE(IFTEMP) ((ANGLES(II,JJ),II=1,NDIM),JJ=1,NANGL)
      WRITE(IFTEMP) (DENSTY(JJ),JJ=1,NANGL)
*----
*  NUMBER OF RODS BETWEEN ORIGIN AND ROD 1
*----
      DO 90 IRT=1,NRT
        IF(NRODS(3,IRT).GT.0) THEN
          NBROD=NRODS(2,IRT)
          DANGR=2.*PI/FLOAT(NRODS(1,IRT))
          IF(RODR(NBROD,IRT).GT.RODS(1,IRT)) THEN
            ATOP(IRT)=0.0
          ELSE
            ATOP(IRT)=(RODS(2,IRT)
     >               +ASIN(RODR(NBROD,IRT)/RODS(1,IRT)))/DANGR
          ENDIF
        ENDIF
 90   CONTINUE
*----
*  SWEEP THROUGH TRACK ANGLES
*----
      DO 100 IANG=1,NANGL
        ANGD=ANGD+DANGI
        DCSA(1)=COS(DBLE(ANGD))
        DCSA(2)=SIN(DBLE(ANGD))
*----
*  LOCALIZE RODS WITH RESPECT TO TRAKING ANGLE
*  RODP(1,IRD,IRT)= X POSITION OF CENTER
*  RODP(2,IRD,IRT)= Y POSITION OF CENTER
*----
        DO 110 IRT=1,NRT
          IF(NRODS(3,IRT).GT.0) THEN
            DANGR=2.*PI/FLOAT(NRODS(1,IRT))
*----
*  NUMBER OF RODS BETWEEN FIRST ROD AND Y=0 TRACK
*----
            ANGC=(ANGD/DANGR)-ATOP(IRT)
            IF(ANGC.GT.0.0) THEN
              IRDEP=INT(ANGC+0.9999)
            ELSE
              IRDEP=INT(ANGC)
            ENDIF
            ANGC=RODS(2,IRT)-ANGD+IRDEP*DANGR
*----
*  STORE POSITION OF NRODS+1 RODS STARTING WITH FIRST
*  ROD ABOVE OR ON Y=0 TRACK
*----
            DO 120 IRD=1,NRODS(1,IRT)
              RODP(1,IRD,IRT)=RODS(1,IRT)*COS(ANGC)
              RODP(2,IRD,IRT)=RODS(1,IRT)*SIN(ANGC)
              ANGC=ANGC+DANGR
 120        CONTINUE
          ENDIF
 110    CONTINUE
        RADC=RADD
        DO 130 IRAD=1,NPLINE
*----
*  INITIALIZE REGION POSITION VECTOR
*----
          DO 135 ISEG=1,MXSEG
            NRSEG(ISEG)=0
            NNSEG(ISEG)=0
 135      CONTINUE
          RADC=RADC+DRADI
          RADC2=RADC*RADC
          DRADC=DBLE(RADC)
          NLSEG=MXSEG
          NFSEG=0
          NRIN=0
          IF(NSURX.EQ.6) THEN
            CALL XCWHEX(ANGD,RADC,RAN(NBAN),LINTER,XPOS,INDS,IMS)
          ELSE IF(NSURX.EQ.4) THEN
            TRKPOS(1,1)=-DRADC*DCSA(2)
            TRKPOS(2,1)=DRADC*DCSA(1)
            CALL XCWREC(DCSA,SIDE,TRKPOS,LINTER,ROTPOS,INDS,IMS)
            XPOS(1)=REAL(ROTPOS(1,1))
            XPOS(2)=REAL(ROTPOS(1,2))
          ELSE
            LINTER=.FALSE.
            INDS(1)=1
            INDS(2)=1
          ENDIF
          IF(LINTER) THEN
            NRSEG(NLSEG)=NRIN
            NNSEG(NFSEG+1)=NRIN
            SEGLEN(NLSEG)=XPOS(2)
            NLSEG=NLSEG-1
            NRIN=NRINFO(1,NBAN)
            NFSEG=NFSEG+1
            NRSEG(NFSEG)=NRIN
            NNSEG(NLSEG+1)=NRIN
            SEGLEN(NFSEG)=XPOS(1)
          ENDIF
*----
*  TRACK INSIDE ANNULAR REGIONS
*----
          DO 140 IAN=NTAN,1,-1
            IF(RADC.GT.RAN(IAN)) GO TO 141
*----
*  LINE INTERSECT ANNULUS IAN
*----
            XPOS(2)=SQRT(RAN(IAN)*RAN(IAN)-RADC2)
            XPOS(1)=-XPOS(2)
            NRSEG(NLSEG)=NRIN
            NNSEG(NFSEG+1)=NRIN
            SEGLEN(NLSEG)=XPOS(2)
            NLSEG=NLSEG-1
            NRIN=NRINFO(1,IAN)
            NFSEG=NFSEG+1
            NRSEG(NFSEG)=NRIN
            NNSEG(NLSEG+1)=NRIN
            SEGLEN(NFSEG)=XPOS(1)
            IF(NRINFO(2,IAN).NE.0) THEN
*----
*  TRACK INSIDE RODS
*----
              DO 146 KRT=1,NRT
                JRT=NXRI(KRT,IAN)
                IF((JRT.GT.3000000).OR.
     >            ((JRT.GT.0).AND.(JRT.LT.1000000)) ) THEN
                  LRT=MOD(JRT,1000000)
                  CALL XCWROD(NRIN,NRODS(1,LRT),NRODR(LRT),
     >                        RODR(1,LRT),RODP(1,1,LRT),DRADC,
     >                        NFSEG,NLSEG,SEGLEN,NRSEG,NNSEG)
                ELSE IF(JRT.EQ.0) THEN
                  GO TO 147
                ENDIF
 146          CONTINUE
 147          CONTINUE
              DO 143 KRT=1,NRT
                JRT=NXRI(KRT,IAN)
                IF(JRT.LT.0) THEN
                  IRT=-JRT
                  NXTR=NRODR(IRT)
                  DO 144 IRD=NRODS(2,IRT),1,-1
                    IF(RADC.GT.RODR(IRD,IRT)) GO TO 141
*----
*  LINE INTERSECT CENTERED ROD IRD
*----
                    XPOS(2)=SQRT(RODR(IRD,IRT)*RODR(IRD,IRT)-RADC2)
                    XPOS(1)=-XPOS(2)
                    NRSEG(NLSEG)=NRIN
                    NNSEG(NFSEG+1)=NRIN
                    SEGLEN(NLSEG)=XPOS(2)
                    NLSEG=NLSEG-1
                    NRIN=NXTR
                    NXTR=NXTR-1
                    NFSEG=NFSEG+1
                    NRSEG(NFSEG)=NRIN
                    NNSEG(NLSEG+1)=NRIN
                    SEGLEN(NFSEG)=XPOS(1)
 144              CONTINUE
                  GO TO 141
                ENDIF
 143          CONTINUE
            ENDIF
 140      CONTINUE
 141      CONTINUE
*----
*  COMPRESS AND SORT TRACK VECTOR
*----
          IF(IPRT.GE.20) THEN
            WRITE(IUNOUT,6020) IANG,ANGD,IRAD,RADC
          ENDIF
          CALL XCWSRT(IPRT,MXSEG,SEGLEN,NRSEG,NNSEG,NTSEG)
          NSEG=NTSEG
          IF(IPRT.GE.20) THEN
            WRITE(IUNOUT,6002) NSEG,-INDS(1),-INDS(2)
            WRITE(IUNOUT,6021) (SEGLEN(IIJJ),NRSEG(IIJJ),IIJJ=1,NSEG+1)
          ENDIF
*----
*  CONVERT SEGMENT DIVISION TO SEGMENT LENGTH
*----
          DO 160 ISEG=1,NSEG
            SEGLEN(ISEG)=SEGLEN(ISEG+1)-SEGLEN(ISEG)
 160      CONTINUE
          IF(NSEG+2.GT.MXSEG) THEN
            WRITE(IUNOUT,6023) NSEG,MXSEG
            WRITE(IUNOUT,6021) (SEGLEN(IIJJ),NRSEG(IIJJ),IIJJ=1,NSEG)
            CALL XABORT('XCWICL: NUMBER OF SEGMENT GREATER THAN'//
     >                  ' MAXUMUM ALLOWED')
          ENDIF
          IF(NSEG.GT.0) THEN
            WRITE(IFTEMP) 1,NSEG+2,WEIGHT,IANG,
     >                    -INDS(1),(NRSEG(JSEG),JSEG=1,NSEG),-INDS(2),
     >                    1.0D0,(SEGLEN(JSEG),JSEG=1,NSEG),1.0D0
          ENDIF
          IF(IPRT.GE.30) THEN
            WRITE(IUNOUT,6022) NSEG,-INDS(1),-INDS(2)
            WRITE(IUNOUT,6021) (SEGLEN(IIJJ),NRSEG(IIJJ),IIJJ=1,NSEG)
          ENDIF
 130    CONTINUE
 100  CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(ATOP,RODP,SEGLEN,DENSTY,ANGLES)
      DEALLOCATE(NNSEG,NRSEG)
      RETURN
*----
*  FORMATS
*----
 6000 FORMAT(1X,'INTEGRATION PARAMETERS',/
     >       1X,'        NUMBER OF ANGLES =',I10,/
     >       1X,'  MINIMUM TRACK DENSITY  =',1P,E15.7,/
     >       1X,'NUMBER OF PARALLEL LINES =',I10,/
     >       1X,'EFFECTIVE TRACK DENSITY  =',1P,E15.7,/
     >       1X,'         SYMMETRY FACTOR =',I10)
 6002 FORMAT(' FINAL TRACK POSITION WITH NUMBER OF SEGMENTS = ',I10/
     >       ' FIRST SURFACE INTERSECTED = ',I10,5X,
     >       '  LAST SURFACE INTERSECTED = ',I10)
 6010 FORMAT(1X,'          TOTAL NUMBER OF REGIONS =',I10/
     >       1X,'       NUMBER OF INITIAL SURFACES =',I10/
     >       1X,'        NUMBER OF ANNULAR REGIONS =',I10/
     >       1X,'             NUMBER OF RODS TYPES =',I10)
 6011 FORMAT(1X,'  ROD TYPE',10X,'  NB. RODS',10X,
     >       'NB. SUBROD',10X,'IN ANNULUS')
 6012 FORMAT((1X,I10,10X,I10,10X,I10,10X,I10))
 6020 FORMAT(//1X,' TRACKING INFORMATION'/
     >       1X,' ANGD(',I5,')=',F15.7/
     >       1X,' RADC(',I5,')=',F15.7/
     >       1X,' INTERSECTION AND REGION FOLLOWING')
 6021 FORMAT(4(5X,F15.7,I10))
 6022 FORMAT(' FINAL TRACKING LENGTH WITH NUMBER OF SEGMENTS = ',I10/
     >       ' FIRST SURFACE INTERSECTED = ',I10,4X,
     >       '  LAST SURFACE INTERSECTED = ',I10)
 6023 FORMAT(1X,' NUMBER OF SEGMENTS  ',I10,5X,'ALLOWED =',I10)
      END