summaryrefslogtreecommitdiff
path: root/Dragon/src/SYBALP.f
blob: c3963bd076b23d8ffb5268acf44f07996f79f14c (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
*DECK SYBALP
      SUBROUTINE SYBALP(NPIJ,MAXPTS,Y,SIG,NCOD,ALB,PIJ)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Pij calculation using the method of Kavenoky in 1D slab 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
* NPIJ    number of regions.
* MAXPTS  first dimension of matrix PIJ.
* Y       abscissa array.
* SIG     total cross section array.
* NCOD    left and right type of boundary conditions (=1 void;
*         =2 refl; =4 tran).
* ALB     left and right albedos.
*
*Parameters: output
* PIJ     reduced collision probability matrix.
*
*Reference:
* A. Kavenoky, 'Calcul et utilisation des probabilites de premiere
* collision pour les milieux heterogenes a une dimension: Les programmes
* ALCOLL et CORTINA', note CEA-N-1077, Commissariat a l'energie
* atomique, mars 1969.
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NPIJ,MAXPTS,NCOD(2)
      REAL Y(NPIJ+1),SIG(NPIJ),ALB(2),PIJ(MAXPTS,NPIJ)
*----
*  LOCAL VARIABLES
*----
      CHARACTER BC*8
      REAL, ALLOCATABLE, DIMENSION(:,:) :: AUXI,F2
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(AUXI(2*NPIJ,3),F2(2*NPIJ,2*NPIJ))
*----
*  SET THE BOUNDARY CONDITIONS
*----
      IF((NCOD(1).EQ.1).AND.(NCOD(2).EQ.1)) THEN
         BC='VOID'
         IF((ALB(1).NE.0.0).OR.(ALB(2).NE.0.0)) BC='ALBE'
      ELSE IF((NCOD(1).EQ.4).AND.(NCOD(2).EQ.4)) THEN
         BC='TRAN'
      ELSE IF((ALB(1).EQ.0.0).AND.(ALB(2).EQ.0.0)) THEN
         BC='VOID'
      ELSE
         BC='ALBE'
      ENDIF
*----
*  COMPUTE THE PIJ MATRIX
*----
      PIJ(:MAXPTS,:NPIJ)=0.0
      IF(BC.EQ.'VOID') THEN
         DO 10 IP=1,NPIJ
         AUXI(IP,1)=Y(IP+1)-Y(IP)
         AUXI(IP,3)=MAX(1.0E-10,AUXI(IP,1)*SIG(IP))
         AUXI(IP,2)=AUXI(IP,3)/AUXI(IP,1)
   10    CONTINUE
         DO 25 IP=1,NPIJ
         CALL SYBRII(RIIP,1.0,0.0,AUXI(IP,3))
         PIJ(IP,IP)=RIIP/AUXI(IP,2)**2
         TAU0=0.0
         DO 20 JP=IP+1,NPIJ
         CALL SYBRIJ(RIJP,1.0,TAU0,AUXI(IP,3),AUXI(JP,3))
         PIJ(IP,JP)=RIJP/(AUXI(IP,2)*AUXI(JP,2))
         TAU0=TAU0+AUXI(JP,3)
   20    CONTINUE
   25    CONTINUE
         DO 35 IP=1,NPIJ
         DO 30 JP=IP,NPIJ
         PIJ(JP,IP)=PIJ(IP,JP)
   30    CONTINUE
   35    CONTINUE
      ELSE IF(BC.EQ.'TRAN') THEN
         DO 40 IP=1,NPIJ
         AUXI(IP,1)=Y(IP+1)-Y(IP)
         AUXI(IP,3)=MAX(1.0E-10,AUXI(IP,1)*SIG(IP))
         AUXI(IP,2)=AUXI(IP,3)/AUXI(IP,1)
   40    CONTINUE
         TAUCEL=0.0
         DO 50 IP=1,NPIJ
         TAUCEL=TAUCEL+AUXI(IP,3)
   50    CONTINUE
         M=-1
   60    M=M+1
         IF(M.GT.100) CALL XABORT('SYBALP: UNABLE TO CONVERGE(1).')
         F2(:2*NPIJ,:2*NPIJ)=0.0
         SMALL=0.0
         DO 75 IP=1,NPIJ
         CALL SYBRII(RIIP,1.0,M*TAUCEL,AUXI(IP,3))
         CALL SYBRII(RIIM,-1.0,(M+1)*TAUCEL,AUXI(IP,3))
         F2(IP,IP)=F2(IP,IP)+(RIIP+RIIM)/AUXI(IP,2)**2
         SMALL=MAX(SMALL,ABS(F2(IP,IP)*AUXI(IP,2)))
         TAU0=0.0
         DO 70 JP=IP+1,NPIJ
         CALL SYBRIJ(RIJP,1.0,M*TAUCEL+TAU0,AUXI(IP,3),AUXI(JP,3))
         CALL SYBRIJ(RIJM,-1.0,(M+1)*TAUCEL-TAU0,AUXI(IP,3),AUXI(JP,3))
         F2(IP,JP)=F2(IP,JP)+(RIJP+RIJM)/(AUXI(IP,2)*AUXI(JP,2))
         TAU0=TAU0+AUXI(JP,3)
         SMALL=MAX(SMALL,ABS(F2(IP,JP)*AUXI(JP,2)))
   70    CONTINUE
   75    CONTINUE
         DO 85 IP=1,NPIJ
         DO 80 JP=IP,NPIJ
         PIJ(IP,JP)=PIJ(IP,JP)+F2(IP,JP)
   80    CONTINUE
   85    CONTINUE
         IF(SMALL.LE.1.0E-6) GO TO 90
         GO TO 60
   90    DO 105 IP=1,NPIJ
         DO 100 JP=IP,NPIJ
         PIJ(JP,IP)=PIJ(IP,JP)
  100    CONTINUE
  105    CONTINUE
      ELSE IF(BC.EQ.'ALBE') THEN
         TAUCEL=0.0
         DO 110 IP=1,NPIJ
         AUXI(IP,1)=Y(IP+1)-Y(IP)
         AUXI(IP,3)=MAX(1.0E-10,AUXI(IP,1)*SIG(IP))
         AUXI(IP,2)=AUXI(IP,3)/AUXI(IP,1)
         AUXI(2*NPIJ-IP+1,1)=AUXI(IP,1)
         AUXI(2*NPIJ-IP+1,2)=AUXI(IP,2)
         AUXI(2*NPIJ-IP+1,3)=AUXI(IP,3)
         TAUCEL=TAUCEL+2.0*AUXI(IP,3)
  110    CONTINUE
         F2(:2*NPIJ,:2*NPIJ)=0.0
         DO 125 IP=1,2*NPIJ
         CALL SYBRII(RIIP,1.0,0.0,AUXI(IP,3))
         F2(IP,IP)=F2(IP,IP)+RIIP/AUXI(IP,2)**2
         TAU0=0.0
         DO 120 JP=IP+1,2*NPIJ
         CALL SYBRIJ(RIJP,1.0,TAU0,AUXI(IP,3),AUXI(JP,3))
         F2(IP,JP)=F2(IP,JP)+RIJP/(AUXI(IP,2)*AUXI(JP,2))
         F2(JP,IP)=F2(JP,IP)+RIJP/(AUXI(IP,2)*AUXI(JP,2))
         TAU0=TAU0+AUXI(JP,3)
  120    CONTINUE
  125    CONTINUE
         DO 135 IP=1,NPIJ
         DO 130 JP=1,NPIJ
         PIJ(IP,JP)=PIJ(IP,JP)+F2(IP,JP)+ALB(2)*F2(2*NPIJ+1-IP,JP)
  130    CONTINUE
  135    CONTINUE
         M=0
  140    M=M+1
         IF(M.GT.100) CALL XABORT('UNABLE TO CONVERGE(2).')
         F2(:2*NPIJ,:2*NPIJ)=0.0
         SMALL=0.0
         DO 155 IP=1,2*NPIJ
         CALL SYBRII(RIIP,1.0,M*TAUCEL,AUXI(IP,3))
         F2(IP,IP)=F2(IP,IP)+ALB(1)**M*RIIP/AUXI(IP,2)**2
         SMALL=MAX(SMALL,ABS(F2(IP,IP)*AUXI(IP,2)))
         TAU0=0.0
         DO 150 JP=IP+1,2*NPIJ
         CALL SYBRIJ(RIJP,1.0,M*TAUCEL+TAU0,AUXI(IP,3),AUXI(JP,3))
         F2(IP,JP)=F2(IP,JP)+ALB(1)**M*RIJP/(AUXI(IP,2)*AUXI(JP,2))
         CALL SYBRIJ(RIJM,-1.0,M*TAUCEL-TAU0,AUXI(JP,3),AUXI(IP,3))
         F2(JP,IP)=F2(JP,IP)+ALB(1)**M*RIJM/(AUXI(IP,2)*AUXI(JP,2))
         TAU0=TAU0+AUXI(JP,3)
         SMALL=MAX(SMALL,ABS(F2(IP,JP)*AUXI(JP,2)))
         SMALL=MAX(SMALL,ABS(F2(JP,IP)*AUXI(IP,2)))
  150    CONTINUE
  155    CONTINUE
         DO 165 IP=1,NPIJ
         DO 160 JP=1,NPIJ
         PIJ(IP,JP)=PIJ(IP,JP)+ALB(2)**M*F2(IP,JP)+ALB(2)**(M-1)
     1   *F2(2*NPIJ+1-IP,JP)
  160    CONTINUE
  165    CONTINUE
         F2(:2*NPIJ,:2*NPIJ)=0.0
         DO 175 IP=1,NPIJ
         CALL SYBRII(RIIM,-1.0,M*TAUCEL,AUXI(IP,3))
         F2(IP,IP)=F2(IP,IP)+ALB(1)**M*RIIM/AUXI(IP,2)**2
         TAU0=0.0
         DO 170 JP=IP+1,2*NPIJ
         CALL SYBRIJ(RIJM,-1.0,M*TAUCEL-TAU0,AUXI(IP,3),AUXI(JP,3))
         F2(IP,JP)=F2(IP,JP)+ALB(1)**M*RIJM/(AUXI(IP,2)*AUXI(JP,2))
         CALL SYBRIJ(RIJP,1.0,M*TAUCEL+TAU0,AUXI(JP,3),AUXI(IP,3))
         F2(JP,IP)=F2(JP,IP)+ALB(1)**M*RIJP/(AUXI(IP,2)*AUXI(JP,2))
         TAU0=TAU0+AUXI(JP,3)
         SMALL=MAX(SMALL,ABS(F2(IP,JP)*AUXI(JP,2)))
         SMALL=MAX(SMALL,ABS(F2(JP,IP)*AUXI(IP,2)))
  170    CONTINUE
  175    CONTINUE
         DO 185 IP=1,NPIJ
         DO 180 JP=1,NPIJ
         PIJ(IP,JP)=PIJ(IP,JP)+ALB(2)**M*F2(IP,JP)+ALB(2)**(M+1)*
     1   F2(2*NPIJ+1-IP,JP)
  180    CONTINUE
  185    CONTINUE
         IF(SMALL.LE.1.0E-6) GO TO 190
         GO TO 140
      ENDIF
  190 DO 210 IP=1,NPIJ
      DO 200 JP=1,NPIJ
      PIJ(IP,JP)=PIJ(IP,JP)/AUXI(IP,1)
  200 CONTINUE
  210 CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(F2,AUXI)
      RETURN
      END