summaryrefslogtreecommitdiff
path: root/Dragon/src/SNFT1C.f
blob: efaa775b0bb594dbf742d5a6800c68049d5eff15 (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
*DECK SNFT1C
      SUBROUTINE SNFT1C(NREG,NMAT,M2,NPQ,ISCAT,NSCT,JOP,U,UPQ,WPQ,ALPHA,
     1 PLZ,PL,MAT,VOL,SURF,TOTAL,IGAV,QEXT,LFIXUP,CURR,FLUX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Perform one inner iteration for solving SN equations in 1D cylindrical
* geometry.
*
*Copyright:
* Copyright (C) 2005 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
* NREG    number of regions.
* NMAT    number of material mixtures.
* M2      number of axial $\\xi$ levels.
* NPQ     number of SN directions in one octant.
* ISCAT   anisotropy of one-speed sources:
*         =1 isotropic sources;
*         =2 linearly anisotropic sources.
* NSCT    number of spherical harmonics components in the flux.
* JOP     number of base points per axial level in one octant.
* U       base points in $\\mu$ of the 1D quadrature. Used with
*         zero-weight points.
* UPQ     base points in $\\mu$ of the 2D SN quadrature.
* WPQ     weights of the 2D SN quadrature.
* ALPHA   angular redistribution terms.
* PLZ     discrete values of the spherical harmonics corresponding
*         to the 1D quadrature. Used with zero-weight points.
* MN      moment-to-discrete matrix.
* DN      discrete-to-moment matrix.
* MAT     material mixture index in each region.
* VOL     volumes of each region.
* SURF    surfaces surrounding each region.
* TOTAL   macroscopic total cross sections.
* IGAV    type of condition at axial axis (=1 specular reflection;
*         =2 zero-weight reflection; =3 averaged reflection).
* QEXT    spherical harmonics components of the fixed source.
* LFIXUP  flag to enable negative flux fixup.
*
*Parameters: input/output
* CURR    entering current at input and leaving current at output.
*
*Parameters: output
* FLUX    spherical harmonics components of the flux.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NREG,NMAT,M2,NPQ,ISCAT,NSCT,JOP(M2),MAT(NREG),IGAV
      REAL U(M2),UPQ(NPQ),WPQ(NPQ),ALPHA(NPQ),PLZ(NSCT,M2),PL(NSCT,NPQ),
     1 VOL(NREG),SURF(NREG+1),TOTAL(0:NMAT),QEXT(NSCT,NREG),CURR,
     2 FLUX(NSCT,NREG)
      LOGICAL LFIXUP
*----
*  LOCAL VARIABLES
*----
      PARAMETER(RLOG=1.0E-8,PI=3.141592654)
      DOUBLE PRECISION Q,E2,AFB,Q1,Q2,PSIA,WSIA,CURSUM
      REAL, ALLOCATABLE, DIMENSION(:) :: FLXB,AFGL
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(FLXB(M2),AFGL(NREG))
*----
*  COMPUTE A NORMALIZATION CONSTANT.
*----
      DENOM=0.0
      DO 10 I=1,NPQ
      IF(UPQ(I).GT.0.0) DENOM=DENOM+4.0*WPQ(I)*UPQ(I)
   10 CONTINUE
*----
*  OUTER LOOP OVER AXIAL LEVELS.
*----
      FLUX(:NSCT,:NREG)=0.0
      CURSUM=0.0D0
      IPQ=0
      DO 200 IP=1,M2
*----
*  INITIALIZATION SWEEP (USING ZERO-WEIGHT POINTS). AFB IS THE EDGE
*  FLUX VALUE AND AFGL(I) IS THE CENTERED FLUX VALUE.
*----
      AFB=CURR/DENOM
      DO 30 I=NREG,1,-1 ! Spatial sweep
         Q=0.0D0
         IBM=MAT(I)
         IOF=0
         DO 25 IL=0,ISCAT-1
         DO 20 IM=0,IL
         IF(MOD(IL+IM,2).EQ.1) GO TO 20
         IOF=IOF+1
         Q=Q+QEXT(IOF,I)*PLZ(IOF,IP)*(2.0*IL+1.0)/(4.0*PI)
   20    CONTINUE
   25    CONTINUE
         Q1=-4.0D0*PI*SQRT(1.0-U(IP)*U(IP))/(SURF(I+1)-SURF(I))
         E2=(Q-Q1*AFB)/(TOTAL(IBM)-Q1)
         IF(LFIXUP.AND.(E2.LE.RLOG)) E2=0.0
         AFB=2.0*E2-AFB
         IF(LFIXUP.AND.(AFB.LE.RLOG)) AFB=0.0
         AFGL(I)=REAL(E2)
         IF(LFIXUP.AND.(AFGL(I).LE.RLOG)) AFGL(I)=0.0
   30 CONTINUE
      WSIA=0.0D0
      IF(IGAV.EQ.2) THEN
         PSIA=0.0D0
      ELSE
         PSIA=AFB
      ENDIF
*----
*  BACKWARD SWEEP (FROM EXTERNAL SURFACE TOWARD CENTRAL AXIS).
*----
      ALPMAX=0.0
      DO 80 M=2*JOP(IP),JOP(IP)+1,-1 ! Angular sweep
         AFB=CURR/DENOM
         ALPMIN=ALPHA(IPQ+M)
         DO 70 I=NREG,1,-1 ! Spatial sweep
            Q=0.0
            IBM=MAT(I)
            IOF=0
            DO 45 IL=0,ISCAT-1
            DO 40 IM=0,IL
            IF(MOD(IL+IM,2).EQ.1) GO TO 40
            IOF=IOF+1
            Q=Q+QEXT(IOF,I)*PL(IOF,IPQ+M)*(2.0*IL+1.0)/(4.0*PI)
   40       CONTINUE
   45       CONTINUE
            Q1=Q*VOL(I)-UPQ(IPQ+M)*(SURF(I)+SURF(I+1))*AFB+(SURF(I+1)-
     1      SURF(I))*(ALPMIN+ALPMAX)*AFGL(I)/WPQ(IPQ+M)
            Q2=TOTAL(IBM)*VOL(I)-2.0D0*UPQ(IPQ+M)*SURF(I)+2.0D0*
     1      (SURF(I+1)-SURF(I))*ALPMIN/WPQ(IPQ+M)
            E2=Q1/Q2
            IF(LFIXUP.AND.(E2.LE.RLOG)) E2=0.0
            AFB=2.0*E2-AFB ! IN SPACE
            IF(LFIXUP.AND.(AFB.LE.RLOG)) AFB=0.0
            AFGL(I)=2.0*REAL(E2)-AFGL(I) ! IN ANGLE
            IF(LFIXUP.AND.(AFGL(I).LE.RLOG)) AFGL(I)=0.0
            DO 60 K=1,NSCT
            FLUX(K,I)=FLUX(K,I)+4.0*WPQ(IPQ+M)*REAL(E2)*PL(K,IPQ+M)
   60       CONTINUE
   70    CONTINUE
         IF(IGAV.EQ.1) THEN
            FLXB(2*JOP(IP)-M+1)=REAL(AFB)
         ELSE IF(IGAV.EQ.2) THEN
            PSIA=PSIA+WPQ(IPQ+M)*REAL(AFB)
            WSIA=WSIA+WPQ(IPQ+M)
         ENDIF
         ALPMAX=ALPMIN
   80 CONTINUE
      IF(IGAV.EQ.2) PSIA=PSIA/WSIA
*----
*  FORWARD SWEEP (FROM CENTRAL AXIS TOWARD EXTERNAL SURFACE).
*----
      DO 130 M=JOP(IP),1,-1 ! Angular sweep
         ALPMIN=ALPHA(IPQ+M)
         IF(IGAV.EQ.1) THEN
            AFB=FLXB(M)
         ELSE IF(IGAV.EQ.2) THEN
            AFB=PSIA
         ELSE IF(IGAV.EQ.3) THEN
            AFB=PSIA
         ENDIF
         DO 120 I=1,NREG ! Spatial sweep
            Q=0.0
            IBM=MAT(I)
            IOF=0
            DO 100 IL=0,ISCAT-1
            DO 90 IM=0,IL
            IF(MOD(IL+IM,2).EQ.1) GO TO 90
            IOF=IOF+1
            Q=Q+QEXT(IOF,I)*PL(IOF,IPQ+M)*(2.0*IL+1.0)/(4.0*PI)
   90       CONTINUE
  100       CONTINUE
            Q1=Q*VOL(I)+UPQ(IPQ+M)*(SURF(I)+SURF(I+1))*AFB+(SURF(I+1)-
     1      SURF(I))*(ALPMIN+ALPMAX)*AFGL(I)/WPQ(IPQ+M)
            Q2=TOTAL(IBM)*VOL(I)+2.0D0*UPQ(IPQ+M)*SURF(I+1)+2.0D0*
     1      (SURF(I+1)-SURF(I))*ALPMIN/WPQ(IPQ+M)
            E2=Q1/Q2
            IF(LFIXUP.AND.(E2.LE.RLOG)) E2=0.0
            AFB=2.0*E2-AFB ! IN SPACE
            IF(LFIXUP.AND.(AFB.LE.RLOG)) AFB=0.0
            AFGL(I)=2.0*REAL(E2)-AFGL(I) ! IN ANGLE
            IF(LFIXUP.AND.(AFGL(I).LE.RLOG)) AFGL(I)=0.0
            DO 110 K=1,NSCT
            FLUX(K,I)=FLUX(K,I)+4.0*WPQ(IPQ+M)*REAL(E2)*PL(K,IPQ+M)
  110       CONTINUE
  120    CONTINUE
         CURSUM=CURSUM+4.0*WPQ(IPQ+M)*UPQ(IPQ+M)*AFB
         ALPMAX=ALPMIN
  130 CONTINUE
*----
*  END OF OUTER LOOP OVER AXIAL LEVELS
*----
      IPQ=IPQ+2*JOP(IP)
  200 CONTINUE
      IF(IPQ.NE.NPQ) CALL XABORT('SN1T1C: BUG.')
      CURR=REAL(CURSUM)
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(AFGL,FLXB)
      RETURN
      END