summaryrefslogtreecommitdiff
path: root/Dragon/src/SNFT1S.f
blob: 06245453d976218259310d242fabf5609e6efaa4 (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
*DECK SNFT1S
      SUBROUTINE SNFT1S(NREG,NMAT,NLF,NSCT,U,W,ALPHA,PLZ,PL,MAT,VOL,
     1 SURF,XXX,TOTAL,IGAV,QEXT,LFIXUP,CURR,FLUX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Perform one inner iteration for solving SN equations in 1D spherical
* 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.
* NLF     number of SN directions.
* NSCT    number of Legendre components in the flux.
*         =1 isotropic sources;
*         =2 linearly anisotropic sources.
* U       base points in $\\mu$ of the 1D quadrature.
* W       weights of the 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.
* XXX     radii.
* 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,NLF,NSCT,MAT(NREG),IGAV
      REAL U(NLF),W(NLF),ALPHA(NLF),PLZ(NSCT),PL(NSCT,NLF),VOL(NREG),
     1 SURF(NREG+1),XXX(NREG+1),TOTAL(0:NMAT),QEXT(NSCT,NREG),CURR,
     2 FLUX(NSCT,NREG)
      LOGICAL LFIXUP
*----
*  LOCAL VARIABLES
*----
      DOUBLE PRECISION Q,E2,AFB,Q1,Q2,PSIA,WSIA,CURSUM
      PARAMETER(RLOG=1.0E-8)
      REAL, ALLOCATABLE, DIMENSION(:) :: AFGL,FLXB
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(AFGL(NREG),FLXB(NLF/2))
*----
*  COMPUTE A NORMALIZATION CONSTANT.
*----
      DENOM=0.0
      DO 10 I=1,NLF
      IF(U(I).GT.0.0) DENOM=DENOM+W(I)*U(I)
   10 CONTINUE
*----
*  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 20 IL=0,NSCT-1
         Q=Q+QEXT(IL+1,I)*PLZ(IL+1)*(2.0*IL+1.0)/2.0
   20    CONTINUE
         Q1=(XXX(I+1)-XXX(I))*Q+2.0*AFB
         Q2=(XXX(I+1)-XXX(I))*TOTAL(IBM)+2.0
         E2=Q1/Q2
         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
      IF(IGAV.EQ.2) THEN
         PSIA=0.0D0
         WSIA=0.0D0
      ELSE
         PSIA=AFB
      ENDIF
*----
*  BACKWARD SWEEP (FROM EXTERNAL SURFACE TOWARD CENTRAL AXIS).
*----
      FLUX(:NSCT,:NREG)=0.0
      CURSUM=0.0D0
      ALPMIN=0.0
      DO 80 IP=1,NLF/2
      AFB=CURR/DENOM
      ALPMAX=ALPHA(IP)
      DO 70 I=NREG,1,-1 ! Spatial sweep
         Q=0.0
         IBM=MAT(I)
         IOF=0
         DO 40 IL=0,NSCT-1
         Q=Q+QEXT(IL+1,I)*PL(IL+1,IP)*(2.0*IL+1.0)/2.0
   40    CONTINUE
         Q1=Q*VOL(I)-U(IP)*(SURF(I)+SURF(I+1))*AFB+0.5D0*(SURF(I+1)-
     1   SURF(I))*(ALPMIN+ALPMAX)*AFGL(I)/W(IP)
         Q2=TOTAL(IBM)*VOL(I)-2.0D0*U(IP)*SURF(I)+(SURF(I+1)-SURF(I))*
     1   ALPMAX/W(IP)
         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)+W(IP)*REAL(E2)*PL(K,IP)
   60    CONTINUE
   70 CONTINUE
      IF(IGAV.EQ.1) THEN
         FLXB(IP)=REAL(AFB)
      ELSE IF(IGAV.EQ.2) THEN
         PSIA=PSIA+W(IP)*REAL(AFB)
         WSIA=WSIA+W(IP)
      ENDIF
      ALPMIN=ALPMAX
   80 CONTINUE
      IF(IGAV.EQ.2) PSIA=PSIA/WSIA
*----
*  FORWARD SWEEP (FROM CENTRAL AXIS TOWARD EXTERNAL SURFACE).
*----
      DO 130 IP=1+NLF/2,NLF
      ALPMAX=ALPHA(IP)
      IF(IGAV.EQ.1) THEN
         AFB=FLXB(NLF-IP+1)
      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 90 IL=0,NSCT-1
         Q=Q+QEXT(IL+1,I)*PL(IL+1,IP)*(2.0*IL+1.0)/2.0
   90    CONTINUE
         Q1=Q*VOL(I)+U(IP)*(SURF(I)+SURF(I+1))*AFB+0.5D0*(SURF(I+1)-
     1   SURF(I))*(ALPMIN+ALPMAX)*AFGL(I)/W(IP)
         Q2=TOTAL(IBM)*VOL(I)+2.0D0*U(IP)*SURF(I+1)+(SURF(I+1)-SURF(I))*
     1   ALPMAX/W(IP)
         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)+W(IP)*REAL(E2)*PL(K,IP)
  110    CONTINUE
  120 CONTINUE
      CURSUM=CURSUM+W(IP)*U(IP)*AFB
      ALPMIN=ALPMAX
  130 CONTINUE
      CURR=REAL(CURSUM)
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(FLXB,AFGL)
      RETURN
      END