summaryrefslogtreecommitdiff
path: root/Dragon/src/AUTFLU.f
blob: 47fdeeddaafbf13b32bb7a27a9cc1ceee4671644 (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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
*DECK AUTFLU
      SUBROUTINE AUTFLU(IPTRK,IPLIB,IPLI0,IFTRAK,NREG,NUN,NBMIX,NBISO,
     1 NIRES,MAT,VOL,KEYFLX,CDOOR,LEAKSW,IMPX,DEN,MIX,IAPT,IPHASE,NGRP,
     2 IGRMIN,IGRRES,IGRMAX,DIL,TITR,IALTER,DELI,LBIN,NBIN,EBIN,MAXTRA,
     3 ISEED,ITRANC,UUU,FUNKNO,SIGT,SIGS,SIGS1,SIGF,SIGGAR,MASKG)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute the flux in the Autolib fine groups using the Autosecol
* method.
*
*Copyright:
* Copyright (C) 2023 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
* IPTRK   pointer to the tracking (L_TRACK signature).
* IPLIB   pointer to the internal microscopic cross section library
*         with subgroups (L_LIBRARY signature).
* IPLI0   pointer to the internal microscopic cross section library
*         builded by the self-shielding module.
* IFTRAK  file unit number used to store the tracks.
* NREG    number of regions.
* NUN     number of unknowns per energy group and band.
* NBMIX   number of mixtures in the internal library.
* NBISO   number of isotopes.
* NIRES   number of correlated resonant isotopes.
* MAT     index-number of the mixture type assigned to each volume.
* VOL     volumes.
* KEYFLX  pointers of fluxes in unknown vector.
* CDOOR   name of the geometry/solution operator.
* LEAKSW  leakage flag (LEAKSW=.true. if neutron leakage through
*         external boundary is present).
* IMPX    print flag (equal to zero for no print).
* DEN     density of each isotope.
* MIX     mix number of each isotope (can be zero).
* IAPT    resonant isotope index associated with isotope I. Mixed
*         moderator if IAPT(I)=NIRES+1. Out-of-fuel isotope if
*         IAPT(I)=0.
* IPHASE  type of flux solution (=1 use a native flux solution door;
*         =2 use collision probabilities).
* NGRP    number of energy groups.
* IGRMIN  first group where the self-shielding is applied.
* IGRRES  first resolved energy group.
* IGRMAX  most thermal group where the self-shielding is applied.
* DIL     microscopic dilution cross section of each isotope.
* TITR    title.
* IALTER  type of elastic slowing-down kernel (=0: use exact kernel;
*         =1: use an approximate kernel for the resonant isotopes).
* DELI    elementary lethargy width used by the elastic kernel.
* LBIN    total number of fine energy groups in the Autolib.
* NBIN    number of fine energy groups in each coarse energy group.
* EBIN    energy limits of the Autolib fine groups.
* MAXTRA  maximum number of down-scattering terms.
* ISEED   the seed for the generation of random numbers in the
*         unresolved energy domain.
* ITRANC  type of transport correction.
*
*Parameters: output
* UUU     lethargy limits of the Autolib fine groups.
* FUNKNO  flux in the Autolib fine groups.
* SIGT    total microscopic x-s.
* SIGS    P0 scattering microscopic x-s.
* SIGS1   P1 scattering microscopic x-s.
* SIGF    nu*fission microscopic x-s.
* SIGGAR  macroscopic x-s of the non-resonant isotopes in each mixture:
*         (*,*,*,1) total; (*,*,*,2) transport correction; 
*         (*,*,*,3) P0 scattering.
* MASKG   energy group mask pointing on self-shielded groups.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPTRK,IPLIB,IPLI0
      INTEGER IFTRAK,NREG,NUN,NBMIX,NBISO,NIRES,MAT(NREG),KEYFLX(NREG),
     1 IMPX,MIX(NBISO),IAPT(NBISO),IPHASE,NGRP,IGRMIN,IGRRES,IGRMAX,
     2 IALTER,LBIN,NBIN(NGRP),MAXTRA,ISEED,ITRANC
      REAL VOL(NREG),DEN(NBISO),DIL(NBISO),DELI,EBIN(LBIN+1),
     1 UUU(LBIN+1),FUNKNO(NUN,LBIN),SIGT(LBIN,NBISO),SIGS(LBIN,NBISO),
     2 SIGS1(LBIN,NBISO),SIGF(LBIN,NBISO),SIGGAR(NBMIX,0:NIRES,NGRP,3)
      LOGICAL LEAKSW,MASKG(NGRP)
      CHARACTER CDOOR*12,TITR*72
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) IPP,KPLIB,KPLI0,IPSYS
      LOGICAL LLIB
      DOUBLE PRECISION DUUU
      CHARACTER HNAMIS*12,HNABIS*12,HSMG*131
*----
*  ALLOCATABLE ARRAYS
*----
      TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPISO1,IPISO2
      INTEGER, ALLOCATABLE, DIMENSION(:) :: NJJ,IJJ,NEXT,III
      REAL, ALLOCATABLE, DIMENSION(:) :: GA1,DELTAU,SGAR,PRI
      REAL, ALLOCATABLE, DIMENSION(:,:) :: SIGINF,SCAT,GA2,CONC
      LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASKH
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(GA1(NGRP),GA2(NGRP,NGRP),CONC(NBMIX,NBISO),DELTAU(NGRP),
     1 MASKH(NGRP),SIGINF(NGRP,3))
      ALLOCATE(IPISO1(NBISO),IPISO2(NBISO))
      ALLOCATE(NJJ(NGRP),IJJ(NGRP),SGAR(NGRP**2),SCAT(NGRP,NGRP))
      ALLOCATE(PRI(MAXTRA),NEXT(NBISO),III(NBISO+1))
      NEXT(:NBISO)=0
*
      CALL KDRCPU(TK1)
      SIGGAR(:NBMIX,0:NIRES,:NGRP,:3)=0.0
      CALL LIBIPS(IPLIB,NBISO,IPISO1)
      CALL LIBIPS(IPLI0,NBISO,IPISO2)
      CALL LCMGET(IPLI0,'DELTAU',DELTAU)
      III(1)=1
      DO 120 ISO=1,NBISO
      SIGT(:LBIN,ISO)=0.0
      SIGS(:LBIN,ISO)=0.0
      SIGS1(:LBIN,ISO)=0.0
      SIGF(:LBIN,ISO)=0.0
      IF(IMPX.GT.1) WRITE(6,'(/32H AUTFLU: RECOVER XS FOR ISOTOPE=,I5)')
     1 ISO
      IBM=MIX(ISO)
      DO 10 NRE=1,NREG
      IF(MAT(NRE).EQ.IBM) GO TO 20
   10 CONTINUE
      III(ISO+1)=III(ISO)
      GO TO 120
   20 KPLIB=IPISO1(ISO) ! infinite dilution isotope
      KPLI0=IPISO2(ISO) ! self-shielded isotope
      CALL LCMGTC(KPLIB,'ALIAS',12,HNAMIS)
      IRES=IAPT(ISO)
      JRES=IRES
      IF(IRES.EQ.NIRES+1) JRES=0
      DENN=DEN(ISO)
      CALL LCMGET(KPLIB,'AWR',AWR)
      CALL LCMLEN(KPLIB,'BIN-NFS',LENGT,ITYLCM)
      IF((IRES.GT.0).AND.(IRES.LE.NIRES).AND.(LENGT.GT.0)) THEN
        ! resonant isotope
        IF(IMPX.GT.2) WRITE(6,'(26H AUTFLU: PROCESS AUTOLIB '',A12,
     1  1H'')') HNAMIS
        IF(LBIN.EQ.0) CALL XABORT('AUTFLU: MISSING AUTOLIB DATA.')
        DUUU=0.0D0
        UUU(1)=0.0
        DO 40 IGR=1,LBIN
        DUUU=DUUU+LOG(EBIN(IGR)/EBIN(IGR+1))
        UUU(IGR+1)=REAL(DUUU)
   40   CONTINUE
        ! recover unresolved xs values
        LLL=0
        IF(IGRRES.GT.IGRMIN) THEN
          CALL LCMLEN(KPLIB,'NUSIGF',N10,ITYLCM)
          CALL LCMLEN(KPLIB,'SIGS00',N12,ITYLCM)
          SIGINF(:NGRP,:3)=0.0
          CALL LCMGET(KPLIB,'NTOT0',SIGINF(1,1))
          IF(N10.GT.0) CALL LCMGET(KPLIB,'NUSIGF',SIGINF(1,2))
          IF(N12.GT.0) CALL LCMGET(KPLIB,'SIGS00',SIGINF(1,3))
          CALL AUTTAB(KPLIB,HNAMIS,IGRMIN,IGRRES,NGRP,LBIN,NBIN,UUU,
     1    ISEED,SIGINF,LLL,SIGT(1,ISO),SIGS(1,ISO),SIGF(1,ISO))
        ENDIF
        ! recover resolved xs values
        IF(LLL.LT.LBIN) THEN
          CALL LCMLEN(KPLIB,'BIN-NTOT0',LENG,ITYLCM)
          IF(LENG.GT.LBIN) CALL XABORT('AUTFLU: LBIN OVERFLOW.')
          CALL LCMGET(KPLIB,'BIN-NTOT0',SIGT(LLL+1,ISO))
          CALL LCMGET(KPLIB,'BIN-SIGS00',SIGS(LLL+1,ISO))
          CALL LCMLEN(KPLIB,'BIN-NUSIGF',ILEN,ITYLCM)
          IF(ILEN.GT.0) CALL LCMGET(KPLIB,'BIN-NUSIGF',SIGF(LLL+1,ISO))
        ENDIF
*----
*  ELASTIC SCATTERING INFORMATION.
*----
        MAXIII=MAXTRA-III(ISO)+1
        CALL LIBPRI(MAXIII,DELI,AWR,IALTER,0,NEXT(ISO),PRI(III(ISO)))
      ELSE
        ! infinite dilution isotope
        IF(C_ASSOCIATED(KPLI0)) THEN
          CALL LCMLEN(KPLI0,'NTOT0',ILEN0,ITYLCM)
          IF(ILEN0.NE.0) THEN
            LLIB=.FALSE.
            IPP=KPLI0
          ELSE
            LLIB=.TRUE.
            IPP=IPISO1(ISO) ! set ISO-th isotope
          ENDIF
        ELSE
          LLIB=.TRUE.
          IPP=IPISO1(ISO) ! set ISO-th isotope
        ENDIF
        IF(LLIB.AND.(.NOT.C_ASSOCIATED(IPP))) THEN
          WRITE(HSMG,'(18H AUTFLU: ISOTOPE '',A12,7H'' (ISO=,I8,5H) IS ,
     1    39HNOT AVAILABLE IN THE ORIGINAL MICROLIB.)') HNAMIS,ISO
          CALL XABORT(HSMG)
        ENDIF
        IF((.NOT.LLIB).AND.(IMPX.GT.2)) THEN
          CALL LCMGTC(KPLI0,'ALIAS',12,HNABIS)
          WRITE(6,'(26H AUTFLU: RECOVER ISOTOPE '',A12,11H'' FROM THE ,
     1    12HNEW LIBRARY.)') HNABIS
        ELSE IF(LLIB.AND.(IMPX.GT.2)) THEN
          WRITE(6,'(26H AUTFLU: RECOVER ISOTOPE '',A12,11H'' FROM THE ,
     1    12HOLD LIBRARY.)') HNAMIS
        ENDIF
        NSCAR=0
        SCAT(:NGRP,:NGRP)=0.0
        CALL LCMLEN(IPP,'NTOT0',N13,ITYLCM)
        IF(N13.EQ.0) THEN
           CALL LCMLIB(IPP)
           CALL XABORT('AUTFLU: NO INFINITE-DILUTION TOTAL XS.')
        ELSE IF(N13.GT.LBIN) THEN
           CALL XABORT('AUTFLU: LBIN OVERFLOW.')
        ELSE IF(N13.NE.NGRP) THEN
           CALL XABORT('AUTFLU: INVALID X-SECTIONS.')
        ENDIF
        CALL LCMGET(IPP,'NTOT0',SIGT(1,ISO))
        CALL LCMLEN(IPP,'NUSIGF',N10,ITYLCM)
        IF(N10.GT.0) CALL LCMGET(IPP,'NUSIGF',SIGF(1,ISO))
        CALL LCMLEN(IPP,'SIGS00',N12,ITYLCM)
        IF(N12.GT.0) THEN
          CALL LCMGET(IPP,'SIGS00',SIGS(1,ISO))
          CALL LCMLEN(IPP,'SIGS01',N14,ITYLCM)
          IF(N14.GT.0) THEN
            CALL LCMGET(IPP,'SIGS01',SIGS1(1,ISO))
          ELSE
            SIGS1(:NGRP,ISO)=0.0
          ENDIF
        ELSE
          CALL LCMGET(IPP,'SCAT00',SGAR)
          CALL LCMGET(IPP,'NJJS00',NJJ)
          CALL LCMGET(IPP,'IJJS00',IJJ)
          IGAR1=0
          DO IG2=1,NGRP
            DO IG1=IJJ(IG2),IJJ(IG2)-NJJ(IG2)+1,-1
              IGAR1=IGAR1+1
              SCAT(IG1,IG2)=SGAR(IGAR1)
            ENDDO
          ENDDO
          DO IG1=1,NGRP
            SUMSC=0.0D0
            DO IG2=1,NGRP
              SUMSC=SUMSC+SCAT(IG1,IG2)
            ENDDO
            SIGS(IG1,ISO)=REAL(SUMSC)
          ENDDO
          CALL LCMLEN(IPP,'SCAT01',N87,ITYLCM)
          IF(N87.GT.0) THEN
             CALL LCMGET(IPP,'SCAT01',SGAR)
             CALL LCMGET(IPP,'NJJS01',NJJ)
             CALL LCMGET(IPP,'IJJS01',IJJ)
             IGAR1=0
             DO IG2=1,NGRP
               DO IG1=IJJ(IG2),IJJ(IG2)-NJJ(IG2)+1,-1
                 IGAR1=IGAR1+1
                 SCAT(IG1,IG2)=SGAR(IGAR1)
               ENDDO
             ENDDO
             DO IG1=1,NGRP
               SUMSC=0.0D0
               DO IG2=1,NGRP
                 SUMSC=SUMSC+SCAT(IG1,IG2)
               ENDDO
               SIGS1(IG1,ISO)=REAL(SUMSC)
             ENDDO
          ENDIF
        ENDIF
        ! compute SIGGAR used by SPH equivalence
        IF((DENN.NE.0.0).AND.(IBM.NE.0).AND.(JRES.EQ.0)) THEN
          DO 70 IG1=1,NGRP
          SIGGAR(IBM,JRES,IG1,1)=SIGGAR(IBM,JRES,IG1,1)+DENN*
     1    SIGT(IG1,ISO)
          SIGGAR(IBM,JRES,IG1,3)=SIGGAR(IBM,JRES,IG1,3)+DENN*
     1    SIGS(IG1,ISO)
   70     CONTINUE
          CALL LCMLEN(IPP,'TRANC',LENGT,ITYLCM)
          IF(LENGT.GT.0) THEN
            CALL LCMGET(IPP,'TRANC',GA1)
            DO 80 IG1=1,NGRP
            SIGGAR(IBM,JRES,IG1,2)=SIGGAR(IBM,JRES,IG1,2)+DENN*GA1(IG1)
   80       CONTINUE
          ENDIF
        ENDIF
        ! expand xs of non-resonant isotopes
        CALL AUTPRD(NGRP,LBIN,NBIN,SIGS(1,ISO))
        CALL AUTPRD(NGRP,LBIN,NBIN,SIGT(1,ISO))
        CALL AUTPRD(NGRP,LBIN,NBIN,SIGF(1,ISO))
        CALL AUTPRD(NGRP,LBIN,NBIN,SIGS1(1,ISO))
      ENDIF
      III(ISO+1)=III(ISO)+NEXT(ISO)
*----
*  CROSS SECTION EDITION.
*----
      IF(IMPX.GT.7) THEN
         CALL LCMGTC(KPLIB,'ALIAS',12,HNAMIS)
         WRITE(6,540) HNAMIS,(K,SIGS(K,ISO),SIGT(K,ISO),SIGF(K,ISO),
     1   SIGS1(K,ISO),K=1,LBIN)
         I2=III(ISO+1)-1
         WRITE(6,550) III(ISO),I2,(PRI(K),K=III(ISO),I2)
      ENDIF
  120 CONTINUE
      CALL KDRCPU(TK2)
      IF(IMPX.GT.1) WRITE(6,'(/36H AUTFLU: CPU TIME SPENT TO RECOVER A,
     1 33HUTOLIB AND INFINITE-DILUTION XS =,F8.1,8H SECOND./)') TK2-TK1
*
      CALL KDRCPU(TK1)
      TK4=0.0
      TK5=0.0
      ICPIJ=0
*----
*  SET THE NUMBER DENSITIES.
*----
      CONC(:NBMIX,:NBISO)=0.0
      DO 130 ISO=1,NBISO
      IBM=MIX(ISO)
      IF(IBM.LE.0) CYCLE
      CONC(IBM,ISO)=DEN(ISO)
  130 CONTINUE
*----
*  DETERMINE WHICH GROUPS ARE SELF-SHIELDED.
*----
       MASKG(:NGRP)=.FALSE.
       MASKG(IGRMIN:IGRMAX)=.TRUE.
*----
*  COMPUTE THE NEUTRON FLUX.
*----
      CALL KDRCPU(TKA)
      CALL KDRCPU(TKA)
      DO 330 IG1=1,NGRP
      ICPIJ=ICPIJ+NBIN(IG1)
  330 CONTINUE
      CALL LCMOP(IPSYS,'**SYSTEM**',0,1,0)
      KNORM=1
      IMPY=MAX(0,IMPX-3)
      IF(IPHASE.EQ.1) THEN
*       USE A NATIVE DOOR.
        CALL AUTIT2(IPTRK,IFTRAK,IPSYS,MAXTRA,KNORM,NUN,LBIN,NREG,
     1  NBMIX,NBISO,MAT,VOL,KEYFLX,NIRES,IAPT,CDOOR,LEAKSW,TITR,IMPY,
     2  CONC,SIGS,SIGT,SIGS1,DIL,PRI,UUU,DELI,ITRANC,NEXT,III,FUNKNO)
      ELSE IF(IPHASE.EQ.2) THEN
*       USE A COLLISION PROBABILITY DOOR.
        CALL AUTIT1(IPTRK,IFTRAK,IPSYS,MAXTRA,KNORM,LBIN,NREG,
     1  NBMIX,NBISO,MAT,VOL,NIRES,IAPT,CDOOR,LEAKSW,TITR,IMPY,CONC,
     2  SIGS,SIGT,SIGS1,DIL,PRI,UUU,DELI,ITRANC,NEXT,III,FUNKNO)
      ENDIF
      CALL LCMCL(IPSYS,2)
      CALL KDRCPU(TKB)
      TK4=TK4+(TKB-TKA)
*     ***************************************************************
      CALL LCMVAL(IPLI0,' ')
*----
*  RESET MASKG FOR SPH CALCULATION IN SMALL LETHARGY WIDTH GROUPS.
*----
      DO 380 IG1=1,NGRP
      IF(MASKG(IG1)) THEN
        IF(DELTAU(IG1).GT.0.1) MASKG(IG1)=.TRUE.
      ENDIF
  380 CONTINUE
      CALL KDRCPU(TK2)
      IF(IMPX.GT.1) WRITE(6,'(/34H AUTFLU: CPU TIME SPENT TO COMPUTE,
     1 31H SELF-SHIELDED REACTION RATES =,F8.1,19H SECOND, INCLUDING:
     2 /9X,F8.1,36H SECOND TO SOLVE FOR AUTOSECOL FLUX;/9X,7HNUMBER ,
     3 25HOF ASSEMBLY DOORS CALLS =,I5,1H.)') TK2-TK1,TK4,ICPIJ
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(III,NEXT,PRI)
      DEALLOCATE(SCAT,SGAR,IJJ,NJJ)
      DEALLOCATE(IPISO2,IPISO1)
      DEALLOCATE(SIGINF,MASKH,DELTAU,CONC,GA2,GA1)
      RETURN
  540 FORMAT(/18H AUTFLU: ISOTOPE ',A12,1H'/12X,4HSIGS,16X,4HSIGT,
     1 16X,4HSIGF,16X,5HSIGS1/(I5,1P,4E20.7))
  550 FORMAT(/29H AUTFLU: SCATTERING ELEMENTS:,2I10/(1P,10E13.5))
      END