summaryrefslogtreecommitdiff
path: root/Dragon/src/XL3NTR.f
blob: 2e6b5c365fb12ffb15e18184958b5c506f4b940a (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
*DECK XL3NTR
      SUBROUTINE XL3NTR(  IPRT,   NDIM,   ISPEC, NS, NV, NORE,
     >                   VOLIN,  MRGIN,   MATIN,
     >                   NANGL, VOLTRK,  DENSTY )
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute renormalized tracks to obtain true volume values. The file 
* IFOLD contains the old tracks while the file IFTRAK will
* contain the normalized tracks.
*
*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
*
*Parameters: input
* IPRT    intermediate printing level for prinout.     
* NDIM    number of dimensions (2d or 3d).                  
* ISPEC   kind of tracking (0 isotropic; 1 specular) .   
* NS      number of surfaces before merging.                
* NV      number of zones before merging.                   
* NORE    track normalization (-1 yes; 1 no)            
* VOLIN   volumes and surfaces before merging.           
* MRGIN   merging index.                               
* MATIN   material numbers before merging.                  
* NANGL   number of angles to renormalize tracks by angle.  
* DENSTY  weights by angle.                            
* VOLTRK  volumes and surfaces as computed by tracking.  
*
*-----------------------------------------------------------------------
*
      IMPLICIT           NONE
*
      INTEGER            NDIM,NS,NV,NANGL,IPRT,IANG,IP,IR,ISPEC,ITGEO,
     >                   IVS,IVSC,MNSUR,MXVOL,NANG2,IOUT,NORE,
     >                   NSURC,NSURM,NVOLC,NVOLM,MRGIN(-NS:NV),
     >                   MATIN(-NS:NV),NTMP,JR
      REAL               VOLIN(-NS:NV),
     >                   DENSTY(NANGL),
     >                   ERRSUR,ERRVOL,ERRVM,ERRSM,TMPERR(10)
      DOUBLE PRECISION   VOLTRK(-NS:NV,0:NANGL),APRSUR,APRVOL,
     >                   TOTVOL,TOTSUR,ZERO,ONE,TWO,FOUR,HALF,QUART,
     >                   HUND,PI,FACVOL,FACSUR
      CHARACTER          CORIEN(0:3,-6:-1)*4
      PARAMETER        ( PI=3.14159265358979323846D0, IOUT=6,
     >                   ZERO=0.D0, ONE=1.D0, TWO=2.D0, FOUR=4.D0,
     >                   HUND=1.D2, HALF=0.5D0, QUART=0.25D0, ITGEO=3 )
      DATA         ((CORIEN(JR,IR),IR=-6,-1),JR=0,3)
     >             / ' 6  ',' 5  ',' 4  ',' 3  ',' 2  ',' 1  ',
     >               ' Z+ ',' Z- ','****','****',' R+ ','****',
     >               ' Z+ ',' Z- ','****','****','****','HBC ',
     >               ' Z+ ',' Z- ',' Y+ ',' Y- ',' X+ ',' X- ' /
*
      FACVOL= TWO
      FACSUR= ONE
      IF( ISPEC.EQ.0 )THEN
         IF( NDIM.EQ.2 )THEN
            FACSUR= QUART*PI
         ELSEIF( NDIM.EQ.3 )THEN
            FACSUR= ONE
         ENDIF
      ELSEIF( ISPEC.EQ.1 )THEN
         IF( NDIM.EQ.2 )THEN
            FACSUR= HALF*PI
         ELSEIF( NDIM.EQ.3 )THEN
            FACSUR= ONE
         ENDIF
      ENDIF
      DO 47 IVS=  -NS, NV
        DO 46 IANG= 1, NANGL
           VOLTRK(IVS,0)= VOLTRK(IVS,0) + VOLTRK(IVS,IANG)
           VOLTRK(IVS,IANG)= VOLTRK(IVS,IANG)*DENSTY(IANG)
           IF( VOLTRK(IVS,IANG).NE.ZERO )THEN
*
*             CONVERT INTO NORMALIZATION FACTORS
              VOLTRK(IVS,IANG)= VOLIN(IVS)/VOLTRK(IVS,IANG)
           ELSE
              VOLTRK(IVS,IANG)= ONE
           ENDIF
   46   CONTINUE
   47 CONTINUE
*
*     COMPUTE ERRORS FOR CONSERVATION LAWS
      TOTSUR=ZERO
      APRSUR=ZERO
      TOTVOL=ZERO
      APRVOL=ZERO
      ERRSM=0.0
      ERRVM=0.0
      IVSC=0
      DO 50 IVS= -NS, NV
        IF( VOLTRK(IVS,0).EQ.ZERO.AND.VOLIN(IVS).GT.0.0)THEN
           IVSC= IVS
        ENDIF
        IF( IVS.LT.0 )THEN
           VOLTRK(IVS,0)= REAL(FACSUR)*VOLTRK(IVS,0)
           IF(VOLIN(IVS).NE.0.0) THEN
             ERRSM=MAX(ERRSM,
     >         REAL(100.0*ABS(1.0-VOLTRK(IVS,0)/VOLIN(IVS))))
           ENDIF
           TOTSUR=TOTSUR+VOLIN(IVS)
           APRSUR=APRSUR+VOLTRK(IVS,0)
        ELSEIF( IVS.GT.0 )THEN
           VOLTRK(IVS,0)= FACVOL*VOLTRK(IVS,0)
           TOTVOL=TOTVOL+VOLIN(IVS)
           APRVOL=APRVOL+VOLTRK(IVS,0)
           IF(VOLIN(IVS).NE.0.0) THEN
             ERRVM=MAX(ERRVM,
     >         REAL(100.0*ABS(1.0-VOLTRK(IVS,0)/VOLIN(IVS))))
           ENDIF
        ENDIF
   50 CONTINUE
      ERRSUR=100.*REAL(1.0-APRSUR/TOTSUR)
      ERRVOL=100.*REAL(1.0-APRVOL/TOTVOL)
      IF( IPRT.GT.1 )THEN
         MNSUR = -NS
         MXVOL =  NV
         NSURC = -1
         WRITE(IOUT,'(1H )')
         WRITE(IOUT,7000) ERRSUR,ERRSM
         DO 80 IP  = 1, (9 - MNSUR) / 10
            NSURM= MAX( MNSUR, NSURC-9 )
            WRITE(IOUT,'(10X,10(A5,I6))')(' FACE',-IR,IR=NSURC,NSURM,-1)
            WRITE(IOUT,'(8H SURFACE,2X,1P,10E11.4)')
     >                              (4.*VOLIN(IR),IR=NSURC,NSURM,-1)
            WRITE(IOUT,'(8H SIDE   ,2X,10(A4,7X))')
     >               (CORIEN(ITGEO,MATIN(IR)),IR=NSURC,NSURM,-1)
            WRITE(IOUT,'(8H APPROX ,2X,1P,10E11.4)')
     >                         (FOUR*VOLTRK(IR,0),IR=NSURC,NSURM,-1)
            NTMP=0
            DO 81  IR=NSURC,NSURM,-1
              NTMP=NTMP+1
              IF(VOLIN(IR).NE.0.0) THEN
                TMPERR(NTMP)=REAL(HUND-HUND*VOLTRK(IR,0)/VOLIN(IR))
              ELSE
                TMPERR(NTMP)=0.0
              ENDIF
  81        CONTINUE
            WRITE(IOUT,'(8H ERR(%) ,2X,10F11.5)')
     >              (TMPERR(IR),IR=1,NTMP)
            WRITE(IOUT,'(9H MERGE TO,1X,10(A5,I6))')
     >               (' FACE',-MRGIN(IR),IR=NSURC,NSURM,-1)
            WRITE(IOUT,'(1H )')
            NSURC = NSURC - 10
   80    CONTINUE
         NVOLC= 1
         WRITE(IOUT,'(1H )')
         WRITE(IOUT,7001) ERRVOL,ERRVM
         DO 90 IP  = 1, (9 + MXVOL) / 10
            NVOLM= MIN( MXVOL, NVOLC+9 )
            WRITE(IOUT,'(10X,10(A5,I6))') (' ZONE',IR,IR=NVOLC,NVOLM)
            WRITE(IOUT,'(8H VOLUME ,2X,1P,10E11.4)')
     >                                  (VOLIN(IR),IR=NVOLC,NVOLM)
            WRITE(IOUT,'(9H MIXTURE ,1X,10(A5,I6))')
     >                         (' MIX ', MATIN(IR),IR=NVOLC,NVOLM)
            WRITE(IOUT,'(8H APPROX ,2X,1P,10E11.4)')
     >                               (VOLTRK(IR,0),IR=NVOLC,NVOLM)
            NTMP=0
            DO 91  IR= NVOLC,NVOLM
              NTMP=NTMP+1
              IF(VOLIN(IR).NE.0.0) THEN
                TMPERR(NTMP)=REAL(HUND-HUND*VOLTRK(IR,0)/VOLIN(IR))
              ELSE
                TMPERR(NTMP)=0.0
              ENDIF
  91        CONTINUE
            WRITE(IOUT,'(8H ERR(%) ,2X,10F11.5)')
     >              (TMPERR(IR),IR=1,NTMP)
            WRITE(IOUT,'(9H MERGE TO,1X,10(A5,I6))')
     >                        (' ZONE',MRGIN(IR),IR=NVOLC,NVOLM)
            WRITE(IOUT,'(1H )')
            NVOLC = NVOLC + 10
   90    CONTINUE
         IF( IPRT.GT.5 )THEN
            NVOLC= 1
            NANG2= NANGL+2
            WRITE(IOUT,'(1H )')
            IF( NORE.EQ.-1 )THEN
               WRITE(IOUT,7002)
            ELSE IF( NORE.EQ.1 )THEN
               WRITE(IOUT,7003)
            ELSE
               CALL XABORT('XL3NTR: INVALID NORMALIZATION OPTION.')
            ENDIF
            DO 110 IP  = 1, (9 + MXVOL) / 10
               NVOLM= MIN( MXVOL, NVOLC+9 )
               WRITE(IOUT,'(10X,10(A5,I6))') (' VOL ',IR,IR=NVOLC,NVOLM)
               DO 100 IANG= 1, NANGL
                  WRITE(IOUT,'(4H ANG,I4 ,2X,1P,10E11.4)')
     >            IANG, (VOLTRK(IR,IANG),IR=NVOLC,NVOLM)
  100          CONTINUE
               WRITE(IOUT,'(1H )')
               NVOLC = NVOLC + 10
  110       CONTINUE
         ENDIF
      ENDIF
      IF( IVSC.NE.0 )THEN
         WRITE(IOUT,*) ' VOLUME # ',IVSC,' NOT TRACKED'
         WRITE(IOUT,*) ' USE FINER TRACKING'
         CALL XABORT( 'XL3NTR: CHECK NUMBERING OR USE FINER TRACKING')
      ENDIF
*
      RETURN
 7000 FORMAT(/' TRACKING ERRORS ON SURFACE   AVERAGE ERROR: ',F10.4,
     >        ' % ',5X,'MAXIMUM ERROR: ',F10.4,' % (BEFORE MERGE)')
 7001 FORMAT( ' TRACKING ERRORS ON VOLUME    AVERAGE ERROR: ',F10.4,
     >        ' % ',5X,'MAXIMUM ERROR: ',F10.4,' % (BEFORE MERGE)')
 7002 FORMAT(/' ANGLE-BY-ANGLE RENORMALIZATION FACTORS: '/)
 7003 FORMAT(/' ANGLE-BY-ANGLE RENORMALIZATION FACTORS(**NOT USED): '/)
      END