summaryrefslogtreecommitdiff
path: root/Dragon/src/AUTFLU.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/AUTFLU.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/AUTFLU.f')
-rw-r--r--Dragon/src/AUTFLU.f379
1 files changed, 379 insertions, 0 deletions
diff --git a/Dragon/src/AUTFLU.f b/Dragon/src/AUTFLU.f
new file mode 100644
index 0000000..47fdeed
--- /dev/null
+++ b/Dragon/src/AUTFLU.f
@@ -0,0 +1,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