diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/BREMAC.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/BREMAC.f')
| -rw-r--r-- | Dragon/src/BREMAC.f | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/Dragon/src/BREMAC.f b/Dragon/src/BREMAC.f new file mode 100644 index 0000000..eaba3e9 --- /dev/null +++ b/Dragon/src/BREMAC.f @@ -0,0 +1,369 @@ +*DECK BREMAC + SUBROUTINE BREMAC(NC,IPMAC2,NG,NL,LX1,NMIX1,NMIX2,IMIX,IMIX1, + 1 IGAP,ILEAKS,IDF,IPRINT,ZKEFF,B2,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1, + 2 SCAT1,JXM,JXP,FHETXM,FHETXP,ADF1) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover macroscopic cross sections. +* +*Copyright: +* Copyright (C) 2021 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 +* NC number of sn macrolibs. +* IPMAC2 pointer to the sn macrolib. +* NG number of energy groups. +* NL Legendre order of TOT1 and SCAT1 arrays (=1 for isotropic +* scattering in LAB). +* LX1 number of nodes in the reflector model. +* NMIX1 number of mixtures in the nodal calculation. +* NMIX2 number of mixtures in the sn calculation after edition. +* IMIX mix index of each node in output data. +* IMIX1 mix index of each node in sn editions. +* IGAP mix index of the right gap where the surface flux is +* recovered. +* ILEAKS type of leakage calculation (=0: no; =1: isotropic; +* =2: anisotropic). +* IDF discontinuity factor flag (=0: not used; =3: recovered). +* IPRINT print parameter +* +*Parameters: output +* ZKEFF effective multiplication factor. +* B2 buckling. +* VOL1 volumes. +* FLX1 averaged fluxes +* DC1 diffusion coefficients. +* TOT1 total cross sections. +* CHI1 fission spectra. +* SIGF1 nu*fission cross sections. +* SCAT1 scattering cross sections. +* JXM left boundary currents. +* JXP right boundary currents. +* FHETXM left boundary fluxes. +* FHETXP right boundary fluxes. +* ADF1 assembly discontinuity factors. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NC + TYPE(C_PTR) IPMAC2(NC) + INTEGER NG,NL,LX1,NMIX1,NMIX2,IMIX(LX1),IMIX1(LX1),IGAP(LX1), + 1 ILEAKS,IDF,IPRINT + REAL ZKEFF(NC),B2(NC),VOL1(NMIX1,NC),FLX1(NMIX1,NG,NC), + 1 DC1(NMIX1,NG,NC),TOT1(NMIX1,NG,NL,NC),CHI1(NMIX1,NG,NC), + 2 SIGF1(NMIX1,NG,NC),SCAT1(NMIX1,NG,NG,NL,NC),JXM(NMIX1,NG,NC), + 3 JXP(NMIX1,NG,NC),FHETXM(NMIX1,NG,NL,NC),FHETXP(NMIX1,NG,NL,NC), + 4 ADF1(NMIX1,NG,NC) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMAC2,KPMAC2 + DOUBLE PRECISION DSFIS + CHARACTER CM*2,HADF*8,TEXT12*12 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,IMIX2 + REAL, ALLOCATABLE, DIMENSION(:) :: VOL,WORK,SFIS,SFIS1 + REAL, ALLOCATABLE, DIMENSION(:,:) :: DC,CHI,SIGF + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FLX,TOT + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: SCAT + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: DCOU +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(VOL(NMIX2),FLX(NMIX2,NG,NL),TOT(NMIX2,NG,NL), + 1 DC(NMIX2,NG),CHI(NMIX2,NG),SIGF(NMIX2,NG),SCAT(NMIX2,NG,NG,NL), + 2 IMIX2(NMIX2),SFIS(NMIX2),SFIS1(NMIX1),DCOU(NMIX2+1,NG)) + ALLOCATE(IJJ(NMIX2),NJJ(NMIX2),IPOS(NMIX2),WORK(NG*NMIX2)) +*---- +* SET IMIX2 +*---- + IMIX2(:)=0 + DO J=1,LX1 + IBM=IMIX1(J) + IBG=IGAP(J) + IF(IBM.GT.NMIX2) CALL XABORT('BREMAC: NMIX2 OVERFLOW(1).') + IF(IBG.GT.NMIX2) CALL XABORT('BREMAC: NMIX2 OVERFLOW(2).') + IF(IBM.GT.0) IMIX2(IBM)=IMIX(J) + IF((IBG.GT.0).AND.(J.LT.LX1)) IMIX2(IBG)=IMIX(J+1) + ENDDO +*---- +* LOOP OVER SN MACROLIBS +*---- + DO IC=1,NC +*---- +* RECOVER FLUX, MACROSCOPIC CROSS SECTIONS AND DIFFUSION COEFFICIENTS +*---- + CALL LCMGET(IPMAC2(IC),'VOLUME',VOL) + CALL LCMGET(IPMAC2(IC),'K-EFFECTIVE',ZKEFF(IC)) + B2(IC)=0.0 + IF(ILEAKS.GT.0) THEN + CALL LCMLEN(IPMAC2(IC),'B2 B1HOM',ILONG,ITYLCM) + IF(ILONG.EQ.1) CALL LCMGET(IPMAC2(IC),'B2 B1HOM',B2(IC)) + ENDIF + JPMAC2=LCMGID(IPMAC2(IC),'GROUP') + SCAT(:,:,:,:)=0.0 + DO IGR=1,NG + KPMAC2=LCMGIL(JPMAC2,IGR) + CALL LCMGET(KPMAC2,'FLUX-INTG',FLX(1,IGR,1)) + CALL LCMGET(KPMAC2,'NTOT0',TOT(1,IGR,1)) + IF(NL.GE.2) THEN + CALL LCMLEN(KPMAC2,'FLUX-INTG-P1',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC2,'FLUX-INTG-P1',FLX(1,IGR,2)) + ELSE + FLX(:NMIX2,IGR,2)=FLX(:NMIX2,IGR,1) + ENDIF + CALL LCMLEN(KPMAC2,'NTOT1',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC2,'NTOT1',TOT(1,IGR,2)) + ELSE + TOT(:NMIX2,IGR,2)=TOT(:NMIX2,IGR,1) + ENDIF + DO IL=3,NL + WRITE(TEXT12,'(11HFLUX-INTG-P,I1)') IL-1 + CALL LCMLEN(KPMAC2,TEXT12,ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC2,TEXT12,FLX(1,IGR,IL)) + ELSE + FLX(:NMIX2,IGR,IL)=FLX(:NMIX2,IGR,IL-2) + ENDIF + WRITE(TEXT12,'(4HNTOT,I1)') IL-1 + CALL LCMLEN(KPMAC2,TEXT12,ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC2,TEXT12,TOT(1,IGR,IL)) + ELSE + TOT(:NMIX2,IGR,IL)=TOT(:NMIX2,IGR,IL-2) + ENDIF + ENDDO + ENDIF + CALL LCMGET(KPMAC2,'DIFF',DC(1,IGR)) + CALL LCMGET(KPMAC2,'CHI',CHI(1,IGR)) + CALL LCMGET(KPMAC2,'NUSIGF',SIGF(1,IGR)) + DO IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + CALL LCMLEN(KPMAC2,'IJJS'//CM,ILONG,ITYLCM) + IF(ILONG.EQ.0) CYCLE + CALL LCMGET(KPMAC2,'IJJS'//CM,IJJ) + CALL LCMGET(KPMAC2,'NJJS'//CM,NJJ) + CALL LCMGET(KPMAC2,'IPOS'//CM,IPOS) + CALL LCMGET(KPMAC2,'SCAT'//CM,WORK) + DO IBM=1,NMIX2 + IPOSDE=IPOS(IBM)-1 + DO JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 + IPOSDE=IPOSDE+1 + SCAT(IBM,IGR,JGR,IL)=WORK(IPOSDE) ! IGR <-- JGR + ENDDO + ENDDO + ENDDO + DO IBM=1,NMIX2 + FLX(IBM,IGR,:NL)=FLX(IBM,IGR,:NL)/VOL(IBM) + ENDDO + ENDDO +*---- +* COMPUTE NET CURRENTS BETWEEN NODES USING A BALANCE RELATION +*---- + DCOU(:NMIX2+1,:NG)=0.0D0 + DO IBM=1,NMIX2 + DSFIS=0.0D0 + DO IGR=1,NG + DSFIS=DSFIS+SIGF(IBM,IGR)*FLX(IBM,IGR,1) + ENDDO + DSFIS=DSFIS/ZKEFF(IC) + DO IGR=1,NG + DCOU(IBM+1,IGR)=DCOU(IBM,IGR)+VOL(IBM)*(CHI(IBM,IGR)*DSFIS- + 1 (TOT(IBM,IGR,1)+B2(IC)*DC(IBM,IGR))*FLX(IBM,IGR,1)) + DO JGR=1,NG + DCOU(IBM+1,IGR)=DCOU(IBM+1,IGR)+VOL(IBM)* + 1 SCAT(IBM,IGR,JGR,1)*FLX(IBM,JGR,1) + ENDDO + ENDDO + ENDDO +*---- +* NORMALIZE THE ODD FLUX UNKNOWNS BETWEEN NODES +*---- + IF(NL.GT.1) THEN + DO J=1,LX1 + IBM=IMIX1(J) + IBG=IGAP(J) + IF((IBM.GT.0).AND.(IBG.GT.0)) THEN + DO IGR=1,NG + FACT=REAL(DCOU(IBM+1,IGR))/FLX(IBG,IGR,2) + DO IL=2,NL,2 + FLX(IBG,IGR,IL)=FLX(IBG,IGR,IL)*FACT + ENDDO + ENDDO + ENDIF + ENDDO + ENDIF +*---- +* HOMOGENIZATION OVER THE GAPS AND NODES +*---- + VOL1(:,IC)=0.0 + SFIS1(:)=0.0 + FLX1(:,:,IC)=0.0 + TOT1(:,:,:,IC)=0.0 + DC1(:,:,IC)=0.0 + SIGF1(:,:,IC)=0.0 + CHI1(:,:,IC)=0.0 + SCAT1(:,:,:,:,IC)=0.0 + DO IL=1,NL,2 + FHETXM(:,:,IL,IC)=1.0 + FHETXP(:,:,IL,IC)=1.0 + ENDDO + DO IL=2,NL,2 + FHETXM(:,:,IL,IC)=0.0 + FHETXP(:,:,IL,IC)=0.0 + ENDDO + JXM(:,:,IC)=0.0 + JXP(:,:,IC)=0.0 + ADF1(:,:,IC)=0.0 + DO J=1,LX1 + IBM=IMIX1(J) + IBG=IGAP(J) + IF(IBG.GT.0) THEN + DO IL=1,NL + IF(IMIX(J).GT.0) FHETXP(IMIX(J),:,IL,IC)=FLX(IBG,:,IL) + IF(J.LT.LX1) THEN + IF(IMIX(J+1).GT.0) THEN + FHETXM(IMIX(J+1),:,IL,IC)=FLX(IBG,:,IL) + ENDIF + ENDIF + ENDDO + ENDIF + IF(IBM.GT.0) THEN + IF(IMIX(J).GT.0) THEN + JXM(IMIX(J),:NG,IC)=REAL(DCOU(MAX(1,IBM-1),:NG)) + JXP(IMIX(J),:NG,IC)=REAL(DCOU(IBM+1,:NG)) + ENDIF + ENDIF + ENDDO + DO IBM2=1,NMIX2 + IBM=IMIX2(IBM2) + IF(IBM.EQ.0) CYCLE + VOL1(IBM,IC)=VOL1(IBM,IC)+VOL(IBM2) + SFIS(IBM2)=0.0 + DO IGR=1,NG + SFIS(IBM2)=SFIS(IBM2)+VOL(IBM2)*FLX(IBM2,IGR,1)* + 1 SIGF(IBM2,IGR) + ENDDO + SFIS1(IBM)=SFIS1(IBM)+SFIS(IBM2) + DO IGR=1,NG + FLX1(IBM,IGR,IC)=FLX1(IBM,IGR,IC)+VOL(IBM2)*FLX(IBM2,IGR,1) + DO IL=1,NL + TOT1(IBM,IGR,IL,IC)=TOT1(IBM,IGR,IL,IC)+VOL(IBM2)* + 1 FLX(IBM2,IGR,1)*TOT(IBM2,IGR,IL) + ENDDO + DC1(IBM,IGR,IC)=DC1(IBM,IGR,IC)+VOL(IBM2)*FLX(IBM2,IGR,1)* + 1 DC(IBM2,IGR) + SIGF1(IBM,IGR,IC)=SIGF1(IBM,IGR,IC)+VOL(IBM2)* + 1 FLX(IBM2,IGR,1)*SIGF(IBM2,IGR) + CHI1(IBM,IGR,IC)=CHI1(IBM,IGR,IC)+SFIS(IBM2)*CHI(IBM2,IGR) + DO IL=1,NL + DO JGR=1,NG + SCAT1(IBM,IGR,JGR,IL,IC)=SCAT1(IBM,IGR,JGR,IL,IC)+ + 1 VOL(IBM2)*FLX(IBM2,JGR,1)*SCAT(IBM2,IGR,JGR,IL) + ENDDO + ENDDO + ENDDO + ENDDO + DO IBM=1,NMIX1 + DO IGR=1,NG + DO IL=1,NL + TOT1(IBM,IGR,IL,IC)=TOT1(IBM,IGR,IL,IC)/FLX1(IBM,IGR,IC) + ENDDO + DC1(IBM,IGR,IC)=DC1(IBM,IGR,IC)/FLX1(IBM,IGR,IC) + IF(SFIS1(IBM).NE.0.0) CHI1(IBM,IGR,IC)=CHI1(IBM,IGR,IC)/ + 1 SFIS1(IBM) + SIGF1(IBM,IGR,IC)=SIGF1(IBM,IGR,IC)/FLX1(IBM,IGR,IC) + DO JGR=1,NG + DO IL=1,NL + SCAT1(IBM,IGR,JGR,IL,IC)=SCAT1(IBM,IGR,JGR,IL,IC)/ + 1 FLX1(IBM,JGR,IC) + ENDDO + ENDDO + ENDDO + DO IGR=1,NG + FLX1(IBM,IGR,IC)=FLX1(IBM,IGR,IC)/VOL1(IBM,IC) + ENDDO + ENDDO +*---- +* RECOVER ADF +*---- + IF(IDF.EQ.3) THEN + CALL LCMSIX(IPMAC2(IC),'ADF',1) + IF(IPRINT.GT.5) CALL LCMLIB(IPMAC2(IC)) + CALL LCMLEN(IPMAC2(IC),'HADF',NTYPE,ITYLCM) + IF(NTYPE/2.NE.1) CALL XABORT('BREMAC: NTYPE=1 EXPECTED.') + CALL LCMGTC(IPMAC2(IC),'HADF',8,HADF) + CALL LCMLEN(IPMAC2(IC),HADF,ILONG,ITYLCM) + IF(ILONG.NE.NMIX1*NG) CALL XABORT('BREMAC: ADF OVERFLOW.') + CALL LCMGET(IPMAC2(IC),HADF,ADF1(1,1,IC)) + ENDIF +*---- +* PRINT CROSS SECTIONS +*---- + IF(IPRINT.GT.1) THEN + WRITE(6,'(/36H BREMAC: CROSS SECTION FOR MACROLIB=,I5)') IC + WRITE(6,'(31H BREMAC: SCATTERING ANISOTROPY=,I5)') NL-1 + WRITE(6,'(/6H KEFF=,1P E13.5,4H B2=,E13.5/)') ZKEFF(IC),B2(IC) + WRITE(6,10) 'IMIX',IMIX(:) + WRITE(6,20) 'VOL1',VOL1(:,IC) + WRITE(6,20) 'SFIS1',SFIS1(:) + DO IGR=1,NG + WRITE(6,'(/29H BREMAC: PROCESS ENERGY GROUP,I5)') IGR + WRITE(6,20) 'FLX1',FLX1(:,IGR,IC) + WRITE(6,20) 'TOT1-P0',TOT1(:,IGR,1,IC) + IF(NL.GE.2) WRITE(6,20) 'TOT1-P1',TOT1(:,IGR,2,IC) + WRITE(6,20) 'SIGR',TOT1(:,IGR,1,IC)-SCAT1(:,IGR,IGR,1,IC) + WRITE(6,20) 'DC1',DC1(:,IGR,IC) + WRITE(6,20) 'CHI1',CHI1(:,IGR,IC) + WRITE(6,20) 'SIGF1',SIGF1(:,IGR,IC) + DO JGR=1,NG + IF(IGR.EQ.JGR) THEN + WRITE(6,20) 'INSCAT1-P0',SCAT1(:,IGR,IGR,1,IC) + IF(NL.EQ.2) THEN + WRITE(6,20) 'INSCAT1-P1',SCAT1(:,IGR,IGR,2,IC) + ENDIF + ELSE + WRITE(6,20) 'OUTSCAT1-P0',SCAT1(:,JGR,IGR,1,IC) + IF(NL.GE.2) THEN + WRITE(6,20) 'OUTSCAT1-P1',SCAT1(:,JGR,IGR,2,IC) + ENDIF + ENDIF + ENDDO + WRITE(6,20) 'JXM',JXM(:,IGR,IC) + WRITE(6,20) 'JXP',JXP(:,IGR,IC) + DO IL=1,NL + WRITE(TEXT12,'(8HFHETXM-P,I1)') IL-1 + WRITE(6,20) TEXT12(:9),FHETXM(:,IGR,IL,IC) + WRITE(TEXT12,'(8HFHETXP-P,I1)') IL-1 + WRITE(6,20) TEXT12(:9),FHETXP(:,IGR,IL,IC) + ENDDO + IF(IDF.EQ.3) WRITE(6,20) 'ADF1',ADF1(:,IGR,IC) + ENDDO + ENDIF + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WORK,IPOS,NJJ,IJJ,DCOU,SFIS1,SFIS,IMIX2,SCAT,SIGF,CHI, + 1 DC,TOT,FLX,VOL) + RETURN +* + 10 FORMAT(1X,A12,10I13/(12X,10I13)) + 20 FORMAT(1X,A12,1P,10E13.5/(12X,10E13.5)) + END |
