summaryrefslogtreecommitdiff
path: root/Dragon/src/QIJI3D.f
blob: 59dde2c2904c068c3596de43051d62551d5f113f (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 QIJI3D
      SUBROUTINE QIJI3D(NREG,NSOUT,NPIJ,NGRP,MXSEG,NCOR,SWVOID,LINE,
     >                  WEIGHT,NUMERO,LENGHT,SIGTAL,NPSYS,DPR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Integration for general 3D isotropic 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
*
*Parameters: input
* NREG    total number of regions.
* NSOUT   number of outer surface.
* NPIJ    number of probabilities in one group.
* NGRP    number of groups.
* MXSEG   number of segemnts on line.
* NCOR    maximum number of corners.
* SWVOID  flag to indicate if there are voids.
* LINE    line number.
* WEIGHT  line weight.
* NUMERO  region crossed by track.
* LENGHT  length of track.
* SIGTAL  albedo-cross section vector.
* NPSYS   non-converged energy group indices.
*
*Parameters: output
* DPR     CP matrix. 
*
*
*-----------------------------------------------------------------------
*
      IMPLICIT          NONE
      INTEGER           NREG,NSOUT,NPIJ,NGRP,MXSEG,NCOR, NUMERO(*),
     >                  ISD(6),ISF(6),LIN2C,IL,JL,IG,LINE,NOIL,IND1,
     >                  IND2,I,J,IN0,IN1,IN2,NPSYS(NGRP),NUNK
      REAL              WEIGHT, SIGTAL(-NSOUT:NREG,NGRP)
      DOUBLE PRECISION  LENGHT(*), DPR(NPIJ,NGRP), XSIL, XSIL2
      LOGICAL           SWVOID
      REAL              ZERO, ONE, HALF
      PARAMETER       ( ZERO=0.0E0, ONE=1.0E0, HALF=0.5E0)
      REAL              SIXT,CUTEXP
      PARAMETER       ( CUTEXP=0.02)
*
* Allocated arrays
      INTEGER, ALLOCATABLE, DIMENSION(:) :: NRSEG
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: DSCBEG, DSCEND,
     > SEGLEN, PRODUC
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: STAYIN, GOSOUT
      
      IN0(I)   = ((I+NSOUT+1)*(I+NSOUT+2))/2
      IN1(I,J) = ((I+NSOUT+1)*(I+NSOUT))/2 + (J+NSOUT+1)
      IN2(I,J) = (MAX(I+NSOUT+1,J+NSOUT+1)*
     >           (MAX(I+NSOUT+1,J+NSOUT+1)-1))/2
     >          + MIN(I+NSOUT+1,J+NSOUT+1) 
*
* Scratch storage allocation
      ALLOCATE(NRSEG(MXSEG))
      ALLOCATE(DSCBEG(NGRP), DSCEND(NGRP), SEGLEN(MXSEG), PRODUC(NGRP))
      ALLOCATE(STAYIN(NGRP,MXSEG),GOSOUT(NGRP,MXSEG))
*
      SIXT=HALF/3.0
      NUNK=NSOUT+NREG+1
*
*  0) REFORMAT TRACKING LINE
      LIN2C= LINE-2*NCOR
      DO 10 JL= 1, NCOR
         ISD(JL)= NUMERO(JL)
         ISF(JL)= NUMERO(NCOR+LIN2C+JL)
   10 CONTINUE
      DO 20 IL= 1, LIN2C
         NRSEG(IL)=  NUMERO(NCOR+IL)
         SEGLEN(IL)= LENGHT(NCOR+IL)
   20 CONTINUE
      DO 90 IG= 1, NGRP
         PRODUC(IG)= WEIGHT
   90 CONTINUE
*
      IF( SWVOID )THEN
*
*  1) VOIDS ARE POSSIBLE
*        PII CALCULATION AND ESCAPE
         DO 240 IL = 1,LINE-2*NCOR
            NOIL  = NRSEG(IL)
            IND1  = IN0(NOIL)
            DO 100 IG= 1, NGRP
               IF(NPSYS(IG).EQ.0) GO TO 100
               XSIL=SIGTAL(NOIL,IG)*SEGLEN(IL)
               IF( XSIL.EQ.ZERO )THEN
                  GOSOUT(IG,IL)= ONE
                  STAYIN(IG,IL)= SEGLEN(IL)
                  DPR(IND1,IG)= DPR(IND1,IG)
     >                       + HALF*WEIGHT*SEGLEN(IL)*SEGLEN(IL)
               ELSE IF(XSIL .LT. CUTEXP) THEN
                  XSIL2=XSIL*XSIL
                  STAYIN(IG,IL)=XSIL-XSIL2*(HALF-SIXT*XSIL)
                  GOSOUT(IG,IL)=ONE-STAYIN(IG,IL)
                  PRODUC(IG)= PRODUC(IG) * GOSOUT(IG,IL)
                  DPR(IND1,IG)= DPR(IND1,IG)
     >             + WEIGHT*XSIL2*(HALF-SIXT*XSIL)
               ELSE
                  GOSOUT(IG,IL)= EXP( -XSIL )
                  STAYIN(IG,IL)= (ONE - GOSOUT(IG,IL))
                  PRODUC(IG)= PRODUC(IG) * GOSOUT(IG,IL)
                  DPR(IND1,IG)= DPR(IND1,IG)
     >             + WEIGHT*(XSIL-STAYIN(IG,IL))
               ENDIF
  100       CONTINUE
  240    CONTINUE
      ELSE
         DO 241 IL = 1,LINE-2*NCOR
            NOIL  = NRSEG(IL)
            IND1  = IN0(NOIL)
            DO 101 IG= 1, NGRP
               IF(NPSYS(IG).EQ.0) GO TO 101
               XSIL=SIGTAL(NOIL,IG)*SEGLEN(IL)
               IF(XSIL .LT. CUTEXP) THEN
                  XSIL2=XSIL*XSIL
                  STAYIN(IG,IL)=XSIL-XSIL2*(HALF-SIXT*XSIL)
                  GOSOUT(IG,IL)=ONE-STAYIN(IG,IL)
                  PRODUC(IG)= PRODUC(IG) * GOSOUT(IG,IL)
                  DPR(IND1,IG)= DPR(IND1,IG)
     >             + WEIGHT*XSIL2*(HALF-SIXT*XSIL)
               ELSE
                GOSOUT(IG,IL)= EXP( -XSIL )
                STAYIN(IG,IL)= (ONE - GOSOUT(IG,IL))
                PRODUC(IG)= PRODUC(IG) * GOSOUT(IG,IL)
                DPR(IND1,IG)= DPR(IND1,IG)
     >           + WEIGHT*(XSIL-STAYIN(IG,IL))
               ENDIF
  101       CONTINUE
  241    CONTINUE
      ENDIF
*        PIJ CALCULATION
      DO 120 IG= 1, NGRP
         DSCBEG(IG)= WEIGHT
  120 CONTINUE
      DO 260 IL = 1, LINE-2*NCOR
         NOIL  = NRSEG(IL)
         DO 130 IG= 1, NGRP
            IF(NPSYS(IG).NE.0) DSCEND(IG)= WEIGHT*STAYIN(IG,IL)
  130    CONTINUE
         DO 250 JL  = IL+1, LINE-2*NCOR
            IND2= IN2(NRSEG(JL),NOIL)
            DO 140 IG= 1, NGRP
               IF(NPSYS(IG).EQ.0) GO TO 140
               DPR(IND2,IG)= DPR(IND2,IG) + STAYIN(IG,JL)*DSCEND(IG)
               DSCEND(IG)= DSCEND(IG)*GOSOUT(IG,JL)
  140       CONTINUE
  250    CONTINUE
*           PIS CALCULATION
         DO 261 JL = 1, NCOR
            IND1= IN1(NOIL,ISD(JL))
            IND2= IN1(NOIL,ISF(JL))
            DO 150 IG= 1, NGRP
               IF(NPSYS(IG).EQ.0) GO TO 150
               DPR(IND1,IG)= DPR(IND1,IG) + DSCBEG(IG)*STAYIN(IG,IL)
               DPR(IND2,IG)= DPR(IND2,IG) + DSCEND(IG)
  150       CONTINUE
  261    CONTINUE
         DO 160 IG= 1, NGRP
            IF(NPSYS(IG).NE.0) DSCBEG(IG)= DSCBEG(IG)*GOSOUT(IG,IL)
  160    CONTINUE
  260 CONTINUE
*        PSS CALCULATION
      DO 265 IL = 1, NCOR
        DO 264 JL = 1, NCOR
          IND2= IN2(ISD(IL),ISF(JL))
          DO 170 IG = 1, NGRP
            IF(NPSYS(IG).NE.0) DPR(IND2,IG)= DPR(IND2,IG) + PRODUC(IG)
  170     CONTINUE
  264   CONTINUE
  265 CONTINUE
*
* Scratch storage deallocation
      DEALLOCATE(GOSOUT,STAYIN)
      DEALLOCATE(PRODUC,SEGLEN,DSCEND,DSCBEG)
      DEALLOCATE(NRSEG)
*
      RETURN
      END