summaryrefslogtreecommitdiff
path: root/Dragon/src/SPHMAC.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/SPHMAC.f')
-rw-r--r--Dragon/src/SPHMAC.f336
1 files changed, 336 insertions, 0 deletions
diff --git a/Dragon/src/SPHMAC.f b/Dragon/src/SPHMAC.f
new file mode 100644
index 0000000..b53313e
--- /dev/null
+++ b/Dragon/src/SPHMAC.f
@@ -0,0 +1,336 @@
+*DECK SPHMAC
+ SUBROUTINE SPHMAC(IPMACR,IPRINT,NMERGE,NALBP,NGCOND,ISCAT,NW,
+ 1 NIFISS,ILEAKS,VOLMER,FLXMER,SUNMER,SIGT,SIGW,DIFF,ZLEAK,OUTG,
+ 2 ALB,LFISS)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Recovery of the reference merged/condensed set of cross sections
+* to be used by an SPH homogenization algorithm.
+*
+*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
+* IPMACR pointer to the condensed macrolib (L_MACROLIB signature).
+* IPRINT print flag (equal to 0 for no print).
+* NMERGE number of merged regions.
+* NALBP number of physical albedos.
+* NGCOND number of condensed groups.
+* ISCAT scattering anisotropy in the reference set of cross sections
+* (=1 isotropic in LAB; =2 linearly-anisotropic in LAB).
+* NW type of weighting for PN cross section info (=0 P0; =1 P1).
+* NIFISS number of fissile isotopes.
+* ILEAKS type of leakage calculation: =0 no leakage; =1 homogeneous
+* leakage (Diffon); =2 isotropic streaming (Ecco);
+* =3 anisotropic streaming (Tibere).
+*
+*Parameters: output
+* VOLMER merged volumes.
+* FLXMER merged/condensed averaged fluxes.
+* SUNMER merged/condensed production (fission + scattering) cross
+* sections. The third dimension is for secondary neutrons.
+* SIGT merged/condensed total P0 and P1 cross sections.
+* SIGW merged/condensed within-group scattering cross sections.
+* DIFF merged/condensed diffusion coefficients.
+* ZLEAK merged/condensed DB2 leakage rates.
+* OUTG merged/condensed leakage rates.
+* ALB physical albedos.
+* LFISS fission flag in mergeg zones.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMACR
+ INTEGER IPRINT,NMERGE,NALBP,NGCOND,ISCAT,NW,NIFISS,ILEAKS
+ REAL VOLMER(NMERGE),FLXMER(NMERGE,NGCOND),
+ 1 SUNMER(NMERGE,NGCOND,NGCOND,ISCAT),SIGT(NMERGE,NGCOND,NW+1),
+ 2 SIGW(NMERGE,NGCOND,ISCAT+1),DIFF(NMERGE,NGCOND),
+ 3 ZLEAK(NMERGE,NGCOND),OUTG(NGCOND),ALB(NALBP,NGCOND)
+ LOGICAL LFISS(NMERGE)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40)
+ INTEGER ISTATE(NSTATE)
+ DOUBLE PRECISION ZNUMER,ZLEAKA,ZDENUM
+ CHARACTER HSIGN*12,SUFF*2,TEXT12*12
+ TYPE(C_PTR) JPMACR,KPMACR
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NJJ,IJJ,IPOS
+ REAL, ALLOCATABLE, DIMENSION(:) :: SIGMA,XSCAT,SIG1
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PRODUC
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(NJJ(NMERGE),IJJ(NMERGE),IPOS(NMERGE))
+ ALLOCATE(PRODUC(NMERGE,NGCOND,NIFISS),SIGMA(NMERGE*NIFISS),
+ 1 XSCAT(NMERGE*NGCOND))
+*----
+* RECOVER MACROLIB INFORMATION
+*----
+ CALL LCMGTC(IPMACR,'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_MACROLIB') CALL XABORT('SPHMAC: MACROLIB EXPECTED')
+ CALL LCMGET(IPMACR,'STATE-VECTOR',ISTATE)
+ IF(ISTATE(1).NE.NGCOND) CALL XABORT('SPHMAC: INVALID NGCOND')
+ IF(ISTATE(2).NE.NMERGE) CALL XABORT('SPHMAC: INVALID NMERGE')
+ NL=ISTATE(3)
+ IF(ISTATE(4).NE.NIFISS) CALL XABORT('SPHMAC: INVALID NIFISS')
+ IF(NIFISS.EQ.0) CALL XABORT('SPHMAC: NO FISSILE ZONES')
+ ITRANC=ISTATE(6)
+ ILEAK=ISTATE(9)
+ IF(MAX(1,ISTATE(10)).NE.NW) CALL XABORT('SPHMAC: INVALID NW')
+*----
+* SET OUTPUT INFORMATION TO ZERO
+*----
+ PRODUC(:NMERGE,:NGCOND,:NIFISS)=0.0
+ FLXMER(:NMERGE,:NGCOND)=0.0
+ SUNMER(:NMERGE,:NGCOND,:NGCOND,:ISCAT)=0.0
+ SIGT(:NMERGE,:NGCOND,:NW+1)=0.0
+ SIGW(:NMERGE,:NGCOND,:ISCAT+1)=0.0
+ DIFF(:NMERGE,:NGCOND)=0.0
+ ZLEAK(:NMERGE,:NGCOND)=0.0
+ LFISS(:NMERGE)=.FALSE.
+*----
+* RECOVER FLUX AND COMPUTE THE FISSION RATE INFORMATION
+*----
+ ZNUMER=0.0D0
+ ZLEAKA=0.0D0
+ ZDENUM=0.0D0
+ CALL LCMGET(IPMACR,'VOLUME',VOLMER)
+ IF(NALBP.GT.0) CALL LCMGET(IPMACR,'ALBEDO',ALB)
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ DO 40 IGR=1,NGCOND
+ KPMACR=LCMGIL(JPMACR,IGR)
+ CALL LCMLEN(KPMACR,'FLUX-INTG',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.0) CALL XABORT('SPHMAC: MISSING FLUX-INTG INFO')
+ CALL LCMGET(KPMACR,'FLUX-INTG',FLXMER(1,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 IBM=1,NMERGE
+ SS=FLXMER(IBM,IGR)*SIGMA((IFIS-1)*NMERGE+IBM)
+ PRODUC(IBM,IGR,IFIS)=PRODUC(IBM,IGR,IFIS)+SS
+ ZNUMER=ZNUMER+SS
+ 30 CONTINUE
+ 35 CONTINUE
+ ENDIF
+ 40 CONTINUE
+*----
+* RECOVER EIGENVALUES
+*----
+ CALL LCMLEN(IPMACR,'K-EFFECTIVE',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.1) THEN
+ CALL LCMGET(IPMACR,'K-EFFECTIVE',EIGENK)
+ ELSE
+ EIGENK=1.0
+ ENDIF
+ IF(IPRINT.GT.5) WRITE(6,'(/16H SPHMAC: EIGENK=,1P,E12.4)') EIGENK
+ CALL LCMLEN(IPMACR,'B2 B1HOM',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.1) THEN
+ CALL LCMGET(IPMACR,'B2 B1HOM',B2)
+ ELSE
+ B2=0.0
+ ENDIF
+ IF(IPRINT.GT.5) WRITE(6,'(/12H SPHMAC: B2=,1P,E12.4)') B2
+*----
+* RECOVER MERGED/CONDENSED CROSS SECTIONS
+*----
+ DO 175 IGR=1,NGCOND
+ KPMACR=LCMGIL(JPMACR,IGR)
+ CALL LCMLEN(KPMACR,'NTOT0',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'NTOT0',SIGMA(1))
+ ELSE
+ CALL XABORT('SPHMAC: MISSING NTOT0 INFO')
+ ENDIF
+ IF(ITRANC.NE.0) THEN
+* TRANSPORT CORRECTION.
+ ALLOCATE(SIG1(NMERGE))
+ CALL LCMGET(KPMACR,'TRANC',SIG1)
+ DO 45 IBM=1,NMERGE
+ SIGMA(IBM)=SIGMA(IBM)-SIG1(IBM)
+ 45 CONTINUE
+ DEALLOCATE(SIG1)
+ ENDIF
+ DO 50 IBM=1,NMERGE
+ ZDENUM=ZDENUM+SIGMA(IBM)*FLXMER(IBM,IGR)
+ 50 CONTINUE
+ IF(ILEAKS.EQ.1) THEN
+ CALL LCMLEN(KPMACR,'DIFF',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.0) CALL XABORT('SPHMAC: UNABLE TO RECOVER DIFF R'
+ > //'ECORDS IN THE MACROLIB OBJECT.')
+ CALL LCMGET(KPMACR,'DIFF',DIFF(1,IGR))
+ ENDIF
+ DO 60 IBM=1,NMERGE
+ IF(ILEAKS.EQ.1) THEN
+ ZLEAK(IBM,IGR)=DIFF(IBM,IGR)*B2*FLXMER(IBM,IGR)
+ ELSE IF(ILEAKS.GT.1) THEN
+ CALL XABORT('SPHMAC: LEAKAGE MODEL NOT IMPLEMENTED')
+ ELSE
+ ZLEAK(IBM,IGR)=0.0
+ ENDIF
+ SIGT(IBM,IGR,1)=SIGMA(IBM)
+ ZLEAKA=ZLEAKA+ZLEAK(IBM,IGR)
+ 60 CONTINUE
+*
+ CALL LCMLEN(KPMACR,'CHI',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ DO 75 IFIS=1,NIFISS
+ CALL LCMGET(KPMACR,'CHI',SIGMA(1))
+ DO 70 IBM=1,NMERGE
+ DO 65 JGR=1,NGCOND
+ SS=SIGMA((IFIS-1)*NMERGE+IBM)*PRODUC(IBM,JGR,IFIS)/EIGENK
+ IF(SS.NE.0.0) LFISS(IBM)=.TRUE.
+ SUNMER(IBM,JGR,IGR,1)=SUNMER(IBM,JGR,IGR,1)+SS
+ 65 CONTINUE
+ 70 CONTINUE
+ 75 CONTINUE
+ ENDIF
+ DO 90 IW=2,MIN(NW+1,10)
+ WRITE(TEXT12,'(4HNTOT,I1)') IW-1
+ CALL LCMLEN(KPMACR,TEXT12,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,TEXT12,SIGMA(1))
+ DO 80 IBM=1,NMERGE
+ SIGT(IBM,IGR,IW)=SIGMA(IBM)
+ 80 CONTINUE
+ ELSE
+ DO 85 IBM=1,NMERGE
+ SIGT(IBM,IGR,IW)=SIGT(IBM,IGR,1)
+ 85 CONTINUE
+ ENDIF
+ 90 CONTINUE
+*----
+* PROCESS SCATTERING INFORMATION
+*----
+ DO 170 INL=1,ISCAT
+ WRITE(SUFF,'(I2.2)') INL-1
+ CALL LCMLEN(KPMACR,'SIGW'//SUFF,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'SIGW'//SUFF,SIGMA(1))
+ ELSE
+ SIGMA(:NMERGE)=0.0
+ ENDIF
+ IF((ITRANC.NE.0).AND.(INL.EQ.1)) THEN
+* TRANSPORT CORRECTION.
+ ALLOCATE(SIG1(NMERGE))
+ CALL LCMGET(KPMACR,'TRANC',SIG1)
+ DO 120 IBM=1,NMERGE
+ SIGMA(IBM)=SIGMA(IBM)-SIG1(IBM)
+ 120 CONTINUE
+ DEALLOCATE(SIG1)
+ ENDIF
+ CALL LCMLEN(KPMACR,'NJJS'//SUFF,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPMACR,'NJJS'//SUFF,NJJ)
+ CALL LCMGET(KPMACR,'IJJS'//SUFF,IJJ)
+ CALL LCMGET(KPMACR,'IPOS'//SUFF,IPOS)
+ CALL LCMGET(KPMACR,'SCAT'//SUFF,XSCAT)
+ DO 150 IBM=1,NMERGE
+ IPO=IPOS(IBM)
+ DO 130 JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1
+ IF(IGR.EQ.JGR) THEN
+ SS=SIGMA(IBM)*FLXMER(IBM,JGR)
+ SIGW(IBM,IGR,INL)=SIGW(IBM,IGR,INL)+SS
+ ELSE
+ SS=XSCAT(IPO)*FLXMER(IBM,JGR)
+ ENDIF
+ SUNMER(IBM,JGR,IGR,INL)=SUNMER(IBM,JGR,IGR,INL)+SS
+ IF(INL.EQ.1) ZDENUM=ZDENUM-SS
+ IPO=IPO+1
+ 130 CONTINUE
+ 150 CONTINUE
+ ENDIF
+ 170 CONTINUE
+ 175 CONTINUE
+*----
+* COMPUTE REFERENCE LEAKAGE RATES
+*----
+ DO 182 IGR=1,NGCOND
+ OUTG(IGR)=0.0
+ DO 181 IBM=1,NMERGE
+ OUTG(IGR)=OUTG(IGR)-SIGT(IBM,IGR,1)*FLXMER(IBM,IGR)-
+ 1 ZLEAK(IBM,IGR)
+ DO 180 JGR=1,NGCOND
+ OUTG(IGR)=OUTG(IGR)+SUNMER(IBM,JGR,IGR,1)
+ 180 CONTINUE
+ 181 CONTINUE
+ 182 CONTINUE
+*
+ DO 202 INL=1,ISCAT
+ DO 201 IGR=1,NGCOND
+ DO 200 IBM=1,NMERGE
+ IF(VOLMER(IBM).NE.0.0) THEN
+ SIGW(IBM,IGR,INL)=SIGW(IBM,IGR,INL)/FLXMER(IBM,IGR)
+ DO 190 JGR=1,NGCOND
+ SUNMER(IBM,JGR,IGR,INL)=SUNMER(IBM,JGR,IGR,INL)/FLXMER(IBM,JGR)
+ 190 CONTINUE
+ ENDIF
+ 200 CONTINUE
+ 201 CONTINUE
+ 202 CONTINUE
+ DO 215 IGR=1,NGCOND
+ DO 210 IBM=1,NMERGE
+ IF(VOLMER(IBM).NE.0.0) THEN
+ ZLEAK(IBM,IGR)=ZLEAK(IBM,IGR)/FLXMER(IBM,IGR)
+ FLXMER(IBM,IGR)=FLXMER(IBM,IGR)/VOLMER(IBM)
+ ENDIF
+ 210 CONTINUE
+ 215 CONTINUE
+*----
+* PRINT INFORMATION
+*----
+ IF(IPRINT.GT.4) THEN
+ WRITE(6,'(/33H SPHMAC: type of PN weighting NW=,I2)') NW
+ WRITE(6,240) ZNUMER/ZDENUM,ZNUMER/(ZDENUM+ZLEAKA)
+ WRITE(6,250) 'VOLMER',(VOLMER(IKK),IKK=1,NMERGE)
+ DO 220 IW=1,NW+1
+ WRITE(TEXT12,'(4HNTOT,I1)') IW-1
+ WRITE(6,250) TEXT12,((SIGT(IKK,IGR,IW),IKK=1,NMERGE),
+ > IGR=1,NGCOND)
+ 220 CONTINUE
+ WRITE(6,250) 'FLXMER',((FLXMER(IKK,IGR),IKK=1,NMERGE),
+ > IGR=1,NGCOND)
+ WRITE(6,250) 'ZLEAK',((ZLEAK(IKK,IGR),IKK=1,NMERGE),
+ > IGR=1,NGCOND)
+ IF(NALBP.GT.0) THEN
+ WRITE(6,250) 'ALBEDO',((ALB(IAL,IGR),IAL=1,NALBP),
+ > IGR=1,NGCOND)
+ WRITE(6,250) 'OUTG',(OUTG(IGR),IGR=1,NGCOND)
+ ENDIF
+ DO 230 INL=1,ISCAT
+ WRITE(SUFF,'(I2.2)') INL-1
+ WRITE(6,250) 'SIGW'//SUFF,((SIGW(IKK,IGR,INL),IKK=1,NMERGE)
+ > ,IGR=1,NGCOND)
+ WRITE(6,250) 'SUNMER'//SUFF,(((SUNMER(IKK,IGR,JGR,INL),
+ > IKK=1,NMERGE),IGR=1,NGCOND),JGR=1,NGCOND)
+ 230 CONTINUE
+ IF(ILEAKS.EQ.1) THEN
+ WRITE(6,250) 'DIFF',((DIFF(IKK,IGR),IKK=1,NMERGE),IGR=1,
+ > NGCOND)
+ ENDIF
+ WRITE(6,260) 'LFISS',(LFISS(IKK),IKK=1,NMERGE)
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(XSCAT,SIGMA,PRODUC)
+ DEALLOCATE(IPOS,IJJ,NJJ)
+ RETURN
+*
+ 240 FORMAT(/20H SPHMAC: K-INFINITY=,1P,D13.6/8X,12HK-EFFECTIVE=,D13.6,
+ > 25H (FUNDAMENTAL MODE VALUE))
+ 250 FORMAT(/26H SPHMAC: VALUES OF VECTOR ,A,4H ARE/(1X,1P,10E13.5))
+ 260 FORMAT(/26H SPHMAC: VALUES OF VECTOR ,A,4H ARE/(1X,20L6))
+ END