summaryrefslogtreecommitdiff
path: root/Dragon/src/FLUKEF.f
blob: 329d73101f4fd19ae80820b9e8f4e6ca821769cb (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
*DECK FLUKEF
      SUBROUTINE FLUKEF(IPRT,IPMACR,NGRP,NREG,NUNKNO,NMAT,NIFIS,NANIS,
     1 MATCOD,VOL,KEYFLX,XSTRC,XSDIA,XSNUF,XSCHI,NMERG,IMERG,DIFHET,
     2 FLUX,B2,ILEAK,LEAKSW,OLDBIL,AKEFF,AFLNOR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute the effective multiplication factor.
*
*Copyright:
* Copyright (C) 2002 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    print flag.
* IPMACR  pointer to the macrolib LCM object.
* NGRP    number of energy groups.
* NREG    number of regions.
* NUNKNO  number of unknowns per energy group including spherical
*         harmonic terms, interface currents and fundamental
*         currents.
* NMAT    number of mixtures.
* NIFIS   number of fissile isotopes.
* NANIS   maximum cross section Legendre order.
* MATCOD  mixture indices.
* VOL     volumes.
* KEYFLX  index of region flux components in unknown vector.
* XSTRC   transport-corrected macroscopic total cross sections.
* XSDIA   transport-corrected macroscopic within-group scattering cross
*         sections.
* XSNUF   nu*macroscopic fission cross sections.
* XSCHI   fission spectrum.
* NMERG   number of leakage zones.
* IMERG   leakage zone index in each material mixture zone.
* DIFHET  heterogeneous leakage coefficients.
* FLUX    neutron flux.
* B2      directionnal bucklings.
* ILEAK   method used to include DB2 effect:
*         <5 uniform DB2 model;
*         =5 Todorova-type isotropic streaming model;
*         =6 Ecco-type isotropic streaming model;
*         >6 Tibere anisotropic streaming model.
* LEAKSW  leakage flag (=.true. if leakage is present on the outer
*         surface).
*
*Parameters: input/output
* OLDBIL  previous norm of the flux on input and 
*         new norm of the flux at output.
*
*Parameters: output
* AKEFF   effective multiplication factor.
* AFLNOR  flux normalization factor.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPMACR
      INTEGER IPRT,NGRP,NREG,NUNKNO,NMAT,NIFIS,NANIS,MATCOD(NREG),
     1 KEYFLX(NREG),NMERG,IMERG(NMAT),ILEAK
      REAL VOL(NREG),XSTRC(0:NMAT,NGRP),XSDIA(0:NMAT,0:NANIS,NGRP),
     1 XSNUF(0:NMAT,NIFIS,NGRP),XSCHI(0:NMAT,NIFIS,NGRP),
     2 DIFHET(NMERG,NGRP),FLUX(NUNKNO,NGRP),B2(4)
      DOUBLE PRECISION OLDBIL,AKEFF,AFLNOR
      LOGICAL LEAKSW
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) JPMACR,KPMACR
      DOUBLE PRECISION LOSS,SUMCHI,PROD,FISONE,PHIC,FISOUR,AKINV,
     1 DZERO,DONE
      PARAMETER (DZERO=0.0D0, DONE=1.0D0)
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS
      REAL, ALLOCATABLE, DIMENSION(:) :: XSCAT
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(NJJ(0:NMAT),IJJ(0:NMAT),IPOS(0:NMAT))
      ALLOCATE(XSCAT(0:NMAT*NGRP))
*
      FISOUR=DZERO
      SUMCHI=DZERO
      LOSS=DZERO
      AKINV=DZERO
      JPMACR=LCMGID(IPMACR,'GROUP')
      DO 40 IGRP=1,NGRP
      KPMACR=LCMGIL(JPMACR,IGRP)
      DO 15 IREG=1,NREG
      IND=KEYFLX(IREG)
      IF(IND.EQ.0) GO TO 15
      IBM=MATCOD(IREG)
      IF(IBM.EQ.0) GO TO 15
      PHIC=FLUX(IND,IGRP)*VOL(IREG)
      LOSS=LOSS+XSTRC(IBM,IGRP)*PHIC
      IF((ILEAK.GE.1).AND.(ILEAK.LE.5)) THEN
         INM=IMERG(IBM)
         IF(INM.GT.0) LOSS=LOSS+B2(4)*DIFHET(INM,IGRP)*PHIC
      ELSE IF(ILEAK.EQ.6) THEN
         LOSS=LOSS+B2(4)*FLUX(NUNKNO/2+IND,IGRP)*VOL(IREG)
      ELSE IF(ILEAK.GE.7) THEN
         LOSS=LOSS+B2(1)*FLUX(NUNKNO/4+IND,IGRP)*VOL(IREG)
     1            +B2(2)*FLUX(NUNKNO/2+IND,IGRP)*VOL(IREG)
     2            +B2(3)*FLUX(3*NUNKNO/4+IND,IGRP)*VOL(IREG)
      ENDIF
      DO 10 IFIS=1,NIFIS
      FISOUR=FISOUR+XSNUF(IBM,IFIS,IGRP)*PHIC
      AKINV=AKINV+XSNUF(IBM,IFIS,IGRP)*PHIC
   10 CONTINUE
   15 CONTINUE
*
      CALL LCMGET(KPMACR,'NJJS00',NJJ(1))
      CALL LCMGET(KPMACR,'IJJS00',IJJ(1))
      CALL LCMGET(KPMACR,'IPOS00',IPOS(1))
      CALL LCMGET(KPMACR,'SCAT00',XSCAT(1))
      DO 30 IREG=1,NREG
      IBM=MATCOD(IREG)
      IF(IBM.GT.0) THEN
         IND=KEYFLX(IREG)
         JGRP=IJJ(IBM)
         DO 20 JND=1,NJJ(IBM)
         IF(JGRP.EQ.IGRP) THEN
           LOSS=LOSS-XSDIA(IBM,0,IGRP)*FLUX(IND,IGRP)*VOL(IREG)
         ELSE
           LOSS=LOSS-XSCAT(IPOS(IBM)+JND-1)*FLUX(IND,JGRP)*VOL(IREG)
         ENDIF
         JGRP=JGRP-1
   20    CONTINUE
      ENDIF
   30 CONTINUE
   40 CONTINUE
*
      IF(AKINV.NE.0.0) THEN
         AKINV=DONE/AKINV
         DO 70 IREG=1,NREG
         IND=KEYFLX(IREG)
         IF(IND.EQ.0) GO TO 70
         IBM=MATCOD(IREG)
         DO 65 IFIS=1,NIFIS
         FISONE=DZERO
         DO 50 IGRP=1,NGRP
         FISONE=FISONE+XSNUF(IBM,IFIS,IGRP)*FLUX(IND,IGRP)
   50    CONTINUE
         DO 60 IGRP=1,NGRP
         SUMCHI=SUMCHI+AKINV*XSCHI(IBM,IFIS,IGRP)*FISONE*VOL(IREG)
   60    CONTINUE
   65    CONTINUE
   70    CONTINUE
      ENDIF
*
      PROD=SUMCHI*FISOUR
      IF(PROD.GT.DZERO) THEN
         AFLNOR=DONE/PROD
      ELSE
         AFLNOR=DONE
      ENDIF
      IF(LEAKSW) THEN
         IF(OLDBIL.GT.DZERO) THEN
            AKEFF=PROD/OLDBIL
         ELSE
            AKEFF=PROD
         ENDIF
      ELSE
         IF(LOSS.GT.DZERO) THEN
            AKEFF=PROD/LOSS
            AFLNOR=AFLNOR*LOSS
         ELSE
            AKEFF=PROD
         ENDIF
      ENDIF
      OLDBIL=PROD*AFLNOR
      IF(IPRT.GT.2) THEN
         WRITE(6,*)
         WRITE(6,*) ' ************ OLDBIL=',OLDBIL
         WRITE(6,*) ' ************ PROD  =',PROD
         WRITE(6,*) ' ************ LOSS  =',LOSS
         WRITE(6,*) ' ************ AFLNOR=',AFLNOR
         WRITE(6,*) ' ************ AKEFF =',AKEFF
         WRITE(6,*)
      ENDIF
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(XSCAT)
      DEALLOCATE(IPOS,IJJ,NJJ)
      RETURN
      END