summaryrefslogtreecommitdiff
path: root/Dragon/src/EDIALB.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/EDIALB.f')
-rw-r--r--Dragon/src/EDIALB.f315
1 files changed, 315 insertions, 0 deletions
diff --git a/Dragon/src/EDIALB.f b/Dragon/src/EDIALB.f
new file mode 100644
index 0000000..b481ef9
--- /dev/null
+++ b/Dragon/src/EDIALB.f
@@ -0,0 +1,315 @@
+*DECK EDIALB
+ SUBROUTINE EDIALB(IPMAC2,IPFLUX,IPMACR,IPSYS,IPRINT,NBMIX,
+ 1 NW,B2,NGROUP,NIFISS,NGCOND,ITRANC,ILEAKS,NREGIO,MATCOD,
+ 2 VOLUME,KEYFLX,IGCOND,FLUXES,NMLEAK)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute boundary current from ALBS information for use with SPH
+* equivalence techniques.
+*
+*Copyright:
+* Copyright (C) 2011 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
+* IPMAC2 pointer to condensed macrolib information (L_MACROLIB
+* signature) built by EDI:.
+* IPFLUX pointer to the reference solution (L_FLUX signature).
+* IPMACR pointer to the reference macrolib (L_MACROLIB signature).
+* IPSYS pointer to the reference pij LCM object (L_PIJ signature).
+* IPRINT print index.
+* NBMIX number of mixtures in the reference geometry.
+* NW type of weighting for P1 cross section information:
+* = 0 P0; = 1 P1.
+* B2 square buckling array.
+* For ILEAKS = 1 or 2, B2(4) is the homogeneous square buckling;
+* for ILEAKS = 3, B2(1),B2(2),B2(3) are the directional
+* heterogeneous and B2(4) is the homogeneous square buckling.
+* NGROUP number of energy groups in the reference calculation.
+* NIFISS number of fissile isotopes.
+* NGCOND number of condensed groups.
+* ITRANC type of transport correction.
+* ILEAKS type of leakage calculation: =0: no leakage; =1: homogeneous
+* leakage (Diffon); =2: isotropic streaming (Ecco);
+* =3: anisotropic streaming (Tibere).
+* NREGIO number of regions in the reference geometry.
+* MATCOD mixture index in region.
+* VOLUME volume of region.
+* KEYFLX position of average fluxes.
+* IGCOND limit of condensed groups.
+* FLUXES fluxes.
+* NMLEAK number of leakage zones.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAC2,IPFLUX,IPMACR,IPSYS
+ INTEGER IPRINT,NBMIX,NW,NGROUP,NIFISS,NGCOND,ITRANC,ILEAKS,
+ 1 NREGIO,MATCOD(NREGIO),KEYFLX(NREGIO),IGCOND(NGCOND),NMLEAK
+ REAL B2(4),VOLUME(NREGIO),FLUXES(NREGIO,NGROUP,NW+1)
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) JPSYS,KPSYS,IPSYS2,JPMACR,KPMACR,JPFLUX
+ CHARACTER TEXT5*5,SUFF(2)*2
+ DOUBLE PRECISION SUM,SUD
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NJJ,IJJ,IPOS,IMERGL
+ REAL, ALLOCATABLE, DIMENSION(:) :: SIGMA,XSCAT,GAMMA,SIG1,WORKD
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: DIFHET,COURIN,WORK
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PRODUC
+ DATA SUFF/'00','01'/
+*----
+* SCRATCH STORAGE ALLOCATION
+* COURIN ingoing currents (4*J-/S). PIS information must be available
+* on LCM.
+*----
+ ALLOCATE(NJJ(NBMIX),IJJ(NBMIX),IPOS(NBMIX))
+ ALLOCATE(COURIN(NGCOND,2),PRODUC(NREGIO,NGCOND,NIFISS))
+ ALLOCATE(WORK(NREGIO,2),SIGMA(0:NBMIX*NIFISS),XSCAT(NBMIX*NGROUP))
+ ALLOCATE(DIFHET(NMLEAK,NGROUP),IMERGL(NBMIX),GAMMA(NGROUP))
+*----
+* CONSISTENCY TESTS
+*----
+ IF(.NOT.C_ASSOCIATED(IPSYS)) THEN
+ CALL XABORT('EDIALB: THE L_PIJ INFO IS NOT AVAILABLE.')
+ ENDIF
+ JPSYS=LCMGID(IPSYS,'GROUP')
+ KPSYS=LCMGIL(JPSYS,1)
+ CALL LCMLEN(KPSYS,'DRAGON-WIS',IXSLEN,ITYLCM)
+ IF(IXSLEN.NE.NREGIO) THEN
+ CALL LCMLIB(KPSYS)
+ WRITE(TEXT5,'(I5)') NREGIO
+ CALL XABORT('EDIALB: THE ALBS OPTION OF THE ASM: MODULE HAS NO'
+ > //'T BEEN ACTIVATED. NREGIO='//TEXT5)
+ ENDIF
+*----
+* COMPUTE THE FISSION RATE INFORMATION
+*----
+ SIGMA(0)=0.0
+ PRODUC(:NREGIO,:NGCOND,:NIFISS)=0.0
+ IGRFIN=0
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ DO 45 IGRCD=1,NGCOND
+ IGRDEB=IGRFIN+1
+ IGRFIN=IGCOND(IGRCD)
+ DO 40 IGR=IGRDEB,IGRFIN
+ KPMACR=LCMGIL(JPMACR,IGR)
+ CALL LCMLEN(KPMACR,'NUSIGF',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'NUSIGF',SIGMA(1))
+ DO 35 IFIS=1,NIFISS
+ DO 30 IREG=1,NREGIO
+ IBM=MATCOD(IREG)
+ IF(IBM.GT.0) THEN
+ SS=FLUXES(IREG,IGR,1)*SIGMA((IFIS-1)*NBMIX+IBM)
+ PRODUC(IREG,IGRCD,IFIS)=PRODUC(IREG,IGRCD,IFIS)+SS
+ ENDIF
+ 30 CONTINUE
+ 35 CONTINUE
+ ENDIF
+ 40 CONTINUE
+ 45 CONTINUE
+ CALL LCMLEN(IPFLUX,'K-EFFECTIVE',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.1) THEN
+ CALL LCMGET(IPFLUX,'K-EFFECTIVE',EIGENK)
+ ELSE
+ EIGENK=1.0
+ ENDIF
+ IF(IPRINT.GT.5) WRITE(6,'(/16H EDIALB: EIGENK=,1P,E12.4)') EIGENK
+*----
+* COMPUTE MERGED/CONDENSED CROSS SECTIONS
+*----
+ IF(ILEAKS.EQ.1) THEN
+ CALL LCMLEN(IPFLUX,'DIFFHET',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.0) THEN
+ CALL XABORT('EDIALB: UNABLE TO RECOVER THE DIFFHET RECORD IN'
+ > //' THE FLUX OBJECT.')
+ ENDIF
+ CALL LCMGET(IPFLUX,'IMERGE-LEAK',IMERGL)
+ CALL LCMGET(IPFLUX,'DIFFHET',DIFHET)
+ ENDIF
+ IF(NW.EQ.1) CALL LCMGET(IPFLUX,'GAMMA',GAMMA)
+ CALL LCMSIX(IPMAC2,'ADF',1)
+ DO 180 INL=1,NW+1
+ IGRFIN=0
+ DO 175 IGRCD=1,NGCOND
+ COURIN(IGRCD,:2)=0.0
+ IGRDEB=IGRFIN+1
+ IGRFIN=IGCOND(IGRCD)
+ IF((ILEAKS.EQ.2).OR.(ILEAKS.EQ.3)) THEN
+ CALL LCMLEN(IPFLUX,'FLUX',ILON,ITYLCM)
+ IF(ILON.EQ.0) CALL XABORT('EDIALB: MISSING FLUX INFO.')
+ JPFLUX=LCMGID(IPFLUX,'FLUX')
+ ENDIF
+ DO 170 IGR=IGRDEB,IGRFIN
+ KPMACR=LCMGIL(JPMACR,IGR)
+ CALL LCMLEN(KPMACR,'NTOT0',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'NTOT0',SIGMA(1))
+ ELSE
+ CALL XABORT('EDIALB: READ ERROR ON LCM RECORD= TOTAL.')
+ ENDIF
+ IF((ITRANC.NE.0).AND.(INL.EQ.1)) THEN
+* TRANSPORT CORRECTION.
+ ALLOCATE(SIG1(NBMIX))
+ CALL LCMGET(KPMACR,'TRANC',SIG1)
+ DO 50 IMAT=1,NBMIX
+ SIGMA(IMAT)=SIGMA(IMAT)-SIG1(IMAT)
+ 50 CONTINUE
+ DEALLOCATE(SIG1)
+ ENDIF
+ IF((ILEAKS.EQ.2).OR.(ILEAKS.EQ.3)) THEN
+ CALL LCMLEL(JPFLUX,IGR,ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.0) CALL XABORT('EDIALB: MISSING FLUX INFO.')
+ ALLOCATE(WORKD(ILCMLN))
+ CALL LCMGDL(JPFLUX,IGR,WORKD)
+ ENDIF
+ ZNUM=0.0
+ IF((NW.EQ.1).AND.(INL.EQ.2)) THEN
+* USE WITH THE FUNDAMENTAL CURRENT EQUATION OF THE ECCO MODEL.
+ ZDEN=0.0
+ DO 55 IREG=1,NREGIO
+ IBM=MATCOD(IREG)
+ ZNUM=ZNUM+SIGMA(IBM)*FLUXES(IREG,IGR,1)*VOLUME(IREG)
+ ZDEN=ZDEN+FLUXES(IREG,IGR,1)*VOLUME(IREG)
+ 55 CONTINUE
+ ZNUM=ZNUM/ZDEN
+ ENDIF
+ DO 60 IREG=1,NREGIO
+ IBM=MATCOD(IREG)
+ ZLEAK=0.0
+ IF((NW.EQ.1).AND.(INL.EQ.1)) THEN
+ ZLEAK=B2(4)*FLUXES(IREG,IGR,2)
+ ELSE IF((NW.EQ.1).AND.(INL.EQ.2)) THEN
+ ZLEAK=(-(1.0-GAMMA(IGR))*(ZNUM-SIGMA(IBM))*FLUXES(IREG,IGR,2)
+ > -FLUXES(IREG,IGR,1)/3.0)/GAMMA(IGR)
+ ELSE IF(ILEAKS.EQ.1) THEN
+ IME=IMERGL(IBM)
+ IF(IME.GT.0) ZLEAK=DIFHET(IME,IGR)*B2(4)*FLUXES(IREG,IGR,1)
+ ELSE IF(ILEAKS.EQ.2) THEN
+ ZLEAK=B2(4)*WORKD(KEYFLX(IREG)+ILCMLN/2)
+ ELSE IF(ILEAKS.EQ.3) THEN
+ ZLEAK=B2(1)*WORKD(KEYFLX(IREG)+ILCMLN/4)+
+ > B2(2)*WORKD(KEYFLX(IREG)+ILCMLN/2)+
+ > B2(3)*WORKD(KEYFLX(IREG)+3*ILCMLN/4)
+ ENDIF
+ WORK(IREG,1)=-ZLEAK
+ 60 CONTINUE
+ IF((ILEAKS.EQ.2).OR.(ILEAKS.EQ.3)) DEALLOCATE(WORKD)
+*
+ CALL LCMLEN(KPMACR,'CHI',ILCMLN,ITYLCM)
+ IF((ILCMLN.GT.0).AND.(INL.EQ.1)) THEN
+ DO 85 IFIS=1,NIFISS
+ CALL LCMGET(KPMACR,'CHI',SIGMA(1))
+ DO 80 IREG=1,NREGIO
+ IBM=MATCOD(IREG)
+ IF(IBM.GT.0) THEN
+ DO 70 JGRCD=1,NGCOND
+ SS=SIGMA((IFIS-1)*NBMIX+IBM)*PRODUC(IREG,JGRCD,IFIS)/EIGENK
+ WORK(IREG,1)=WORK(IREG,1)+SS
+ 70 CONTINUE
+ ENDIF
+ 80 CONTINUE
+ 85 CONTINUE
+ ENDIF
+*
+ CALL LCMLEN(KPMACR,'SIGW'//SUFF(INL),ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'SIGW'//SUFF(INL),SIGMA(1))
+ ELSE
+ SIGMA(:NBMIX)=0.0
+ ENDIF
+ IF((ITRANC.NE.0).AND.(INL.EQ.1)) THEN
+* TRANSPORT CORRECTION.
+ ALLOCATE(SIG1(NBMIX))
+ CALL LCMGET(KPMACR,'TRANC',SIG1)
+ DO 120 IMAT=1,NBMIX
+ SIGMA(IMAT)=SIGMA(IMAT)-SIG1(IMAT)
+ 120 CONTINUE
+ DEALLOCATE(SIG1)
+ ENDIF
+ CALL LCMLEN(KPMACR,'NJJS'//SUFF(INL),ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'NJJS'//SUFF(INL),NJJ)
+ CALL LCMGET(KPMACR,'IJJS'//SUFF(INL),IJJ)
+ CALL LCMGET(KPMACR,'IPOS'//SUFF(INL),IPOS)
+ CALL LCMGET(KPMACR,'SCAT'//SUFF(INL),XSCAT)
+ DO 150 IREG=1,NREGIO
+ IBM=MATCOD(IREG)
+ IF(IBM.GT.0) THEN
+ JGRFIN=0
+ DO 140 JGRCD=1,NGCOND
+ SS=0.0D0
+ JGRDEB=JGRFIN+1
+ JGRFIN=IGCOND(JGRCD)
+ J2=MIN(JGRFIN,IJJ(IBM))
+ J1=MAX(JGRDEB,IJJ(IBM)-NJJ(IBM)+1)
+ IPO=IPOS(IBM)+IJJ(IBM)-J2
+ DO 130 JGR=J2,J1,-1
+ IF(IGR.EQ.JGR) THEN
+ SS=SS+SIGMA(IBM)*FLUXES(IREG,JGR,INL)
+ ELSE
+ SS=SS+XSCAT(IPO)*FLUXES(IREG,JGR,INL)
+ ENDIF
+ IPO=IPO+1
+ 130 CONTINUE
+ IF(INL.EQ.2) SS=SS/GAMMA(IGR)
+ WORK(IREG,1)=WORK(IREG,1)+SS
+ 140 CONTINUE
+ ENDIF
+ 150 CONTINUE
+ ENDIF
+*----
+* COMPUTE BOUNDARY CURRENTS
+*----
+ IF(INL.EQ.1) THEN
+ JPSYS=LCMGID(IPSYS,'GROUP')
+ ELSE IF(INL.EQ.2) THEN
+ IPSYS2=LCMGID(IPSYS,'STREAMING')
+ JPSYS=LCMGID(IPSYS2,'GROUP')
+ ENDIF
+ KPSYS=LCMGIL(JPSYS,IGR)
+ CALL LCMLEN(KPSYS,'DRAGON-WIS',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.NREGIO) THEN
+ CALL LCMGET(KPSYS,'DRAGON-WIS',WORK(1,2))
+ CALL LCMGET(KPSYS,'DRAGON-TXSC',SIGMA(0))
+ SUM=0.0D0
+ SUD=0.0D0
+ DO 160 IREG=1,NREGIO
+ FACTOR=VOLUME(IREG)
+ IBM=MATCOD(IREG)
+ SUM=SUM+SIGMA(IBM)*FACTOR*FLUXES(IREG,IGR,1)
+ > -WORK(IREG,1)*FACTOR*(1.0-WORK(IREG,2))
+ SUD=SUD+SIGMA(IBM)*FACTOR*WORK(IREG,2)
+ 160 CONTINUE
+ COURIN(IGRCD,:2)=COURIN(IGRCD,:2)+REAL(SUM/SUD)
+ ENDIF
+ 170 CONTINUE
+ 175 CONTINUE
+ CALL LCMPUT(IPMAC2,'ALBS'//SUFF(INL),NGCOND*2,2,COURIN)
+ IF(IPRINT.GT.3) THEN
+ WRITE(6,900) SUFF(INL),(COURIN(IGR,1),IGR=1,NGCOND)
+ WRITE(6,'(/)')
+ ENDIF
+ 180 CONTINUE
+ CALL LCMSIX(IPMAC2,' ',2)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(GAMMA,IMERGL,DIFHET,XSCAT,SIGMA,WORK,PRODUC,COURIN)
+ DEALLOCATE(IPOS,IJJ,NJJ)
+ RETURN
+*
+ 900 FORMAT(/10H EDIALB: P,A2,36H IN-CURRENTS (4J-/S) PER MACRO-GROUP,
+ > 5HS ARE/(1X,1P,10E13.5))
+ END