diff options
Diffstat (limited to 'Dragon/src/BRERT.f')
| -rw-r--r-- | Dragon/src/BRERT.f | 414 |
1 files changed, 414 insertions, 0 deletions
diff --git a/Dragon/src/BRERT.f b/Dragon/src/BRERT.f new file mode 100644 index 0000000..3dd87fb --- /dev/null +++ b/Dragon/src/BRERT.f @@ -0,0 +1,414 @@ +*DECK BRERT + SUBROUTINE BRERT(IPMAC1,IELEM,ICOL,NG,NL,LX1,NMIX1,IMIX,ICODE, + 1 ISPH,IDIFF,ZKEFF,B2,ENER,XXX1,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1, + 2 SCAT1,JXM,JXP,FHETXM,FHETXP,ADF1,NGET,ADFREF,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Implement the 1D DF-RT (Raviart-Thomas) reflector model. +* +*Copyright: +* Copyright (C) 2025 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 +* IPMAC1 nodal macrolib. +* IELEM Raviart-Thomas polynomial order. +* ICOL Raviart-Thomas polynomial integration type. +* NG number of energy groups. +* NL Legendre order of TOT1 and SCAT1 arrays (=1 for isotropic +* scattering in LAB). (NL-1) is the SPN order (if IDIFF>1, +* NL is an even integer). +* LX1 number of nodes in the reflector model. +* NMIX1 number of mixtures in the nodal calculation. +* IMIX mix index of each node. +* ICODE physical albedo index on each side of the domain. +* ISPH SPH flag (=0: use discontinuity factors; =1: use SPH factors). +* IDIFF PN calculation option (=0: diffusion theory; =1: SPN theory +* with 'NTOT1'; =2: SPN theory with 1/(3*D)). +* ZKEFF effective multiplication factor. +* B2 buckling. +* ENER energy limits. +* XXX1 spatial mesh. +* VOL1 volumes. +* FLX1 averaged fluxes +* DC1 diffusion coefficients. +* TOT1 total cross sections. +* CHI1 fission spectra. +* SIGF1 nu*fission cross sections. +* SCAT1 scattering P0 cross sections. +* JXM left boundary currents. +* JXP right boundary currents. +* FHETXM left boundary fluxes. +* FHETXP right boundary fluxes. +* ADF1 assembly discontinuity factors from macrolib. +* NGET type of NGET normalization if discontinuity factors +* (=0: simple; =1: imposed ADF on fuel assembly; =2: recover +* fuel assembly ADF from input macrolib). +* ADFREF imposed ADF values on fuel assembly side. +* IMPX edition flag. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC1 + INTEGER IELEM,ICOL,NG,NL,LX1,NMIX1,IMIX(LX1),ICODE(2),ISPH,IDIFF, + 1 NGET,IMPX + REAL ZKEFF,B2,ENER(NG+1),XXX1(LX1+1),VOL1(NMIX1),FLX1(NMIX1,NG), + 1 DC1(NMIX1,NG),TOT1(NMIX1,NG,NL),CHI1(NMIX1,NG),SIGF1(NMIX1,NG), + 2 SCAT1(NMIX1,NG,NG,NL),JXM(NMIX1,NG),JXP(NMIX1,NG), + 3 FHETXM(NMIX1,NG,NL),FHETXP(NMIX1,NG,NL),ADF1(NMIX1,NG),ADFREF(NG) +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + INTEGER ISTATE(NSTATE) + CHARACTER CM*2,HADF*8,TEXT12*12 + TYPE(C_PTR) JPMAC1,KPMAC1 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS + REAL, ALLOCATABLE, DIMENSION(:) :: WORK,AFACTOR,BETA,WORK1,WORK2, + 1 VOLTOT + REAL, ALLOCATABLE, DIMENSION(:,:) :: FDXM,FDXP,WORK3,WORK4,WORK5, + 1 WORK6,WORK7 + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FHOMM,FHOMP + REAL(KIND=8), ALLOCATABLE, DIMENSION(:,:,:) :: RCAT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + J_FUEL=0 + NLMAX=1 + IF(IDIFF.GT.0) THEN + IF(NL.LT.2) CALL XABORT('BRERT: EVEN NL>=2 EXPECTED WITH SPN.') + NLMAX=NL/2 + ENDIF + ALLOCATE(FHOMM(NMIX1,NG,NLMAX),FHOMP(NMIX1,NG,NLMAX), + 1 FDXM(NMIX1,NG),FDXP(NMIX1,NG),AFACTOR(NG),BETA(NG),VOLTOT(NMIX1), + 2 WORK1(NG),WORK2(NG),WORK3(NG,NG),WORK6(NG,NLMAX),WORK7(NG,NLMAX)) +*---- +* COMPUTE BOUNDARY FLUXES +*---- + FDXM(:NMIX1,:NG)=0.0 + FDXP(:NMIX1,:NG)=0.0 + FHOMM(:NMIX1,:NG,:NLMAX)=0.0 + FHOMP(:NMIX1,:NG,:NLMAX)=0.0 + VOLTOT(:NMIX1)=0.0 + DO I=1,LX1 + IBM=IMIX(I) + IF(IBM.EQ.0) CYCLE + WORK6(:NG,:NLMAX)=0.0 + WORK7(:NG,:NLMAX)=0.0 + DELX=XXX1(I+1)-XXX1(I) + IF(IMPX.GT.0) WRITE(6,'(/15H BRERT: REGION=,I5)') I + IF(IDIFF.EQ.0) THEN +* diffusion theory + ALLOCATE(WORK4(NG,1),WORK5(NG,1)) + WORK1(:NG)=DC1(IBM,:NG) + WORK4(:NG,1)=JXM(IBM,:NG) + WORK5(:NG,1)=JXP(IBM,:NG) + DO IG=1,NG + IF(SIGF1(IBM,IG).GT.0.0) J_FUEL=I + WORK2(IG)=TOT1(IBM,IG,1)+B2*DC1(IBM,IG)-SCAT1(IBM,IG,IG,1) + DO JG=1,NG + WORK3(IG,JG)=CHI1(IBM,IG)*SIGF1(IBM,JG)/ZKEFF + IF(JG.NE.IG) WORK3(IG,JG)=WORK3(IG,JG)+SCAT1(IBM,IG,JG,1) + ENDDO + ENDDO + CALL BRERTD(IELEM,ICOL,NG,DELX,WORK1,WORK2,WORK3,WORK4,WORK5, + 1 IMPX,WORK6,WORK7) + DEALLOCATE(WORK5,WORK4) + ELSE +* SPN theory + ALLOCATE(WORK4(NG,NL/2),WORK5(NG,NL/2),RCAT(NG,NG,NL)) + DO IL=1,NL/2 + WORK4(:NG,IL)=FHETXM(IBM,:NG,2*IL) + WORK5(:NG,IL)=FHETXP(IBM,:NG,2*IL) + ENDDO + RCAT(:NG,:NG,:NL)=0.0 + DO IG=1,NG + IF(SIGF1(IBM,IG).GT.0.0) J_FUEL=I + DO JG=1,NG + RCAT(IG,JG,1)=-CHI1(IBM,IG)*SIGF1(IBM,JG)/ZKEFF + ENDDO + RCAT(IG,IG,1)=RCAT(IG,IG,1)+B2*DC1(IBM,IG) + DO IL=1,NL,2 + RCAT(IG,IG,IL)=RCAT(IG,IG,IL)+TOT1(IBM,IG,IL) + DO JG=1,NG + RCAT(IG,JG,IL)=RCAT(IG,JG,IL)-SCAT1(IBM,IG,JG,IL) + ENDDO + ENDDO + DO IL=2,NL,2 + IF(IDIFF.EQ.1) THEN + DO JG=1,NG + RCAT(IG,JG,IL)=RCAT(IG,JG,IL)-SCAT1(IBM,IG,JG,IL) + ENDDO + ELSE + TOT1(IBM,IG,IL)=1.0/(3.0*DC1(IBM,IG)) + SCAT1(IBM,IG,:NG,IL)=0.0 + ENDIF + RCAT(IG,IG,IL)=RCAT(IG,IG,IL)+TOT1(IBM,IG,IL) + ENDDO + ENDDO + DO IL=1,NL + RCAT(:NG,:NG,IL)=RCAT(:NG,:NG,IL)*REAL(2*IL-1) + ENDDO + CALL BRERTS(IELEM,ICOL,NG,NL,DELX,RCAT,WORK4,WORK5,IMPX, + 1 WORK6,WORK7) + DEALLOCATE(RCAT,WORK5,WORK4) + ENDIF + FHOMM(IBM,:NG,:NLMAX)=FHOMM(IBM,:NG,:NLMAX)+WORK6(:NG,:NLMAX)* + 1 DELX + FHOMP(IBM,:NG,:NLMAX)=FHOMP(IBM,:NG,:NLMAX)+WORK7(:NG,:NLMAX)* + 1 DELX + VOLTOT(IBM)=VOLTOT(IBM)+DELX + ENDDO + DEALLOCATE(WORK7,WORK6,WORK3,WORK2,WORK1) + DO IBM=1,NMIX1 + DO IGR=1,NG + IF(NL.LE.2) THEN + FDXM(IBM,IGR)=VOLTOT(IBM)*FHETXM(IBM,IGR,1)/FHOMM(IBM,IGR,1) + FDXP(IBM,IGR)=VOLTOT(IBM)*FHETXP(IBM,IGR,1)/FHOMP(IBM,IGR,1) + ELSE + ! Yamamoto formula + FDXM(IBM,IGR)=VOLTOT(IBM)*(FHETXM(IBM,IGR,1)+2.0* + 1 FHETXM(IBM,IGR,2))/(FHOMM(IBM,IGR,1)+2.0*FHOMM(IBM,IGR,2)) + FDXP(IBM,IGR)=VOLTOT(IBM)*(FHETXP(IBM,IGR,1)+2.0* + 1 FHETXP(IBM,IGR,2))/(FHOMP(IBM,IGR,1)+2.0*FHOMP(IBM,IGR,2)) + ENDIF + ENDDO + ENDDO + IF(IMPX.GT.0) THEN + WRITE(6,'(/48H BRERT: DISCONTINUITY FACTORS BEFORE NORMALIZATI, + 1 2HON)') + DO IBM=1,NMIX1 + WRITE(6,'(/9H MIXTURE=,I5)') IBM + WRITE(6,20) 'FDXM',FDXM(IBM,:NG) + WRITE(6,20) 'FDXP',FDXP(IBM,:NG) + ENDDO + ENDIF +*---- +* COMPUTE ALBEDOS +*---- + IF(ICODE(2).NE.0) THEN + BETA(:)=0.0 + IBM=IMIX(LX1) + DO IGR=1,NG + IF(IBM.EQ.0) CYCLE + AFACTOR(IGR)=FDXP(IBM,IGR)*JXP(IBM,IGR)/FHETXP(IBM,IGR,1) + BETA(IGR)=(1.0-2.0*AFACTOR(IGR))/(1.0+2.0*AFACTOR(IGR)) + ENDDO + IF(IMPX.GT.0) THEN + WRITE(6,'(/15H BRERT: ALBEDOS)') + WRITE(6,20) 'BETA',BETA(:NG) + ENDIF + ENDIF +*---- +* NGET NORMALIZATION OF THE DISCONTINUITY FACTORS +*---- + IF(J_FUEL.GT.0) THEN + IF(NGET.GT.0) THEN + IBM=IMIX(J_FUEL) + DO IGR=1,NG + ! impose the adf on the fuel assembly side + IF(IBM.EQ.0) CYCLE + IF(NGET.EQ.1) THEN + FNORM=ADFREF(IGR)/FDXP(IBM,IGR) + ELSE + FNORM=ADF1(IBM,IGR)/FDXP(IBM,IGR) + ENDIF + FDXP(IBM,IGR)=FDXP(IBM,IGR)*FNORM + IF(J_FUEL<LX1) THEN + IBMP=IMIX(J_FUEL+1) + IF(IBMP.GT.0) FDXM(IBMP,IGR)=FDXM(IBMP,IGR)*FNORM + ENDIF + ENDDO + ENDIF + DO J=J_FUEL,1,-1 + IBM=IMIX(J) + IF(IBM.EQ.0) CYCLE + DO IGR=1,NG + IF(J>1) THEN + IBMM=IMIX(J-1) + IF(IBMM.GT.0) FDXP(IBMM,IGR)=FDXP(IBMM,IGR)*FDXP(IBM,IGR)/ + 1 FDXM(IBM,IGR) + ENDIF + FDXM(IBM,IGR)=FDXP(IBM,IGR) + ENDDO + ENDDO + ENDIF + DO J=J_FUEL+1,LX1 + IBM=IMIX(J) + IF(IBM.EQ.0) CYCLE + DO IGR=1,NG + IF(J<LX1) THEN + IBMP=IMIX(J+1) + IF(IBMP.GT.0) FDXM(IBMP,IGR)=FDXM(IBMP,IGR)*FDXM(IBM,IGR)/ + 1 FDXP(IBM,IGR) + ENDIF + FDXP(IBM,IGR)=FDXM(IBM,IGR) + ENDDO + ENDDO + IF(IMPX.GT.0) THEN + WRITE(6,'(/48H BRERT: DISCONTINUITY FACTORS AFTER NGET NORMALI, + 1 6HZATION)') + DO IBM=1,NMIX1 + WRITE(6,'(/9H MIXTURE=,I5)') IBM + WRITE(6,20) 'FDX',FDXM(IBM,:NG) + ENDDO + ENDIF +*---- +* APPLY SPH FACTORS +*---- + IF(ISPH.EQ.1) THEN + DO IGR=1,NG + DO IBM=1,NMIX1 + IF(FDXM(IBM,IGR).LE.0) CALL XABORT('BRERT: NEGATIVE SPH F' + 1 //'ACTOR.') + ENDDO + DO J=1,LX1 + IBM=IMIX(J) + IF(IBM.EQ.0) CYCLE + DC1(IBM,IGR)=DC1(IBM,IGR)/FDXM(IBM,IGR) + SIGF1(IBM,IGR)=SIGF1(IBM,IGR)/FDXM(IBM,IGR) + DO IL=1,NL,2 + TOT1(IBM,IGR,IL)=TOT1(IBM,IGR,IL)/FDXM(IBM,IGR) + DO JGR=1,NG + SCAT1(IBM,IGR,JGR,IL)=SCAT1(IBM,IGR,JGR,IL)/FDXM(IBM,JGR) + ENDDO + ENDDO + DO IL=2,NL,2 + TOT1(IBM,IGR,IL)=TOT1(IBM,IGR,IL)*FDXM(IBM,IGR) + DO JGR=1,NG + SCAT1(IBM,IGR,JGR,IL)=SCAT1(IBM,IGR,JGR,IL)*FDXM(IBM,IGR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ICODE(2).NE.0) THEN + BETA(:)=0.0 + IF(ICODE(2).NE.0) THEN + IBM=IMIX(LX1) + DO IGR=1,NG + IF(IBM.EQ.0) CYCLE + AFACTOR(IGR)=AFACTOR(IGR)/FDXM(IBM,IGR) + BETA(IGR)=(1.0-2.0*AFACTOR(IGR))/(1.0+2.0*AFACTOR(IGR)) + ENDDO + ENDIF + IF(IMPX.GT.0) THEN + WRITE(6,'(/29H BRERT: SPH CORRECTED ALBEDOS)') + WRITE(6,20) 'BETA',BETA(:NG) + ENDIF + ENDIF + ENDIF + IF(IMPX.GT.0) THEN + WRITE(6,'(/30H BRERT: DIFFUSION COEFFICIENTS)') + DO IBM=1,NMIX1 + WRITE(6,'(/9H MIXTURE=,I5)') IBM + WRITE(6,20) 'DIFF',DC1(IBM,:NG) + ENDDO + ENDIF +*---- +* SAVE THE OUTPUT NODAL MACROLIB +*---- + ALLOCATE(IJJ(NMIX1),NJJ(NMIX1),IPOS(NMIX1),WORK(NMIX1*NG)) + ISTATE(:)=0 + ISTATE(1)=NG + ISTATE(2)=NMIX1 + ISTATE(3)=NL + IF(J_FUEL.GT.0) ISTATE(4)=1 + IF(ICODE(2).NE.0) ISTATE(8)=1 ! physical albedo information + ISTATE(9)=1 ! diffusion coefficient information + IF(ISPH.EQ.0) ISTATE(12)=3 ! discontinuity factor information + IF(ISPH.EQ.1) ISTATE(14)=1 ! SPH factor information + CALL LCMPUT(IPMAC1,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPMAC1,'ENERGY',NG+1,2,ENER) + CALL LCMPUT(IPMAC1,'VOLUME',NMIX1,2,VOL1) + CALL LCMPUT(IPMAC1,'B2 B1HOM',1,2,B2) + IF(ICODE(2).NE.0) CALL LCMPUT(IPMAC1,'ALBEDO',NG,2,BETA) + IF(ISPH.EQ.0) THEN + CALL LCMSIX(IPMAC1,'ADF',1) + NTYPE=1 + HADF='FD_B' + CALL LCMPUT(IPMAC1,'NTYPE',1,1,NTYPE) + CALL LCMPTC(IPMAC1,'HADF',8,HADF) + CALL LCMPUT(IPMAC1,HADF,NMIX1*NG,2,FDXM) + CALL LCMSIX(IPMAC1,' ',2) + ELSE IF(ISPH.EQ.1) THEN + CALL LCMSIX(IPMAC1,'SPH',1) + ISTATE(:)=0 + ISTATE(1)=4 + ISTATE(2)=1 + ISTATE(6)=1 + ISTATE(7)=1 + ISTATE(8)=NG + CALL LCMPUT(IPMAC1,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMSIX(IPMAC1,' ',2) + ENDIF + JPMAC1=LCMLID(IPMAC1,'GROUP',NG) + DO IGR=1,NG + KPMAC1=LCMDIL(JPMAC1,IGR) + DO IBM=1,NMIX1 + WORK(IBM)=VOL1(IBM)*FLX1(IBM,IGR) + ENDDO + CALL LCMPUT(KPMAC1,'FLUX-INTG',NMIX1,2,WORK) + DO IL=1,NL + WRITE(TEXT12,'(4HNTOT,I1)') IL-1 + CALL LCMPUT(KPMAC1,TEXT12,NMIX1,2,TOT1(:,IGR,IL)) + ENDDO + CALL LCMPUT(KPMAC1,'DIFF',NMIX1,2,DC1(:,IGR)) + CALL LCMPUT(KPMAC1,'CHI',NMIX1,2,CHI1(:,IGR)) + CALL LCMPUT(KPMAC1,'NUSIGF',NMIX1,2,SIGF1(:,IGR)) + IF(ISPH.EQ.1) THEN + DO IBM=1,NMIX1 + WORK(IBM)=1.0/FDXM(IBM,IGR) + ENDDO + CALL LCMPUT(KPMAC1,'NSPH',NMIX1,2,WORK) + ENDIF + DO IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + WORK(:NMIX1)=SCAT1(:NMIX1,IGR,IGR,IL) + CALL LCMPUT(KPMAC1,'SIGW'//CM,NMIX1,2,WORK) + IPOSDE=0 + DO IBM=1,NMIX1 + J2=IGR + J1=IGR + DO JGR=1,NG + IF(SCAT1(IBM,IGR,JGR,IL).NE.0.0) THEN + J2=MAX(J2,JGR) + J1=MIN(J1,JGR) + ENDIF + ENDDO + NJJ(IBM)=J2-J1+1 + IJJ(IBM)=J2 + IPOS(IBM)=IPOSDE+1 + DO JGR=J2,J1,-1 + IPOSDE=IPOSDE+1 + IF(IPOSDE.GT.NG*NMIX1) CALL XABORT('BRERT: SCAT OVERFLOW.') + WORK(IPOSDE)=SCAT1(IBM,IGR,JGR,IL) + ENDDO + ENDDO + CALL LCMPUT(KPMAC1,'SCAT'//CM,IPOSDE,2,WORK) + CALL LCMPUT(KPMAC1,'NJJS'//CM,NMIX1,1,NJJ) + CALL LCMPUT(KPMAC1,'IJJS'//CM,NMIX1,1,IJJ) + CALL LCMPUT(KPMAC1,'IPOS'//CM,NMIX1,1,IPOS) + ENDDO + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WORK,IPOS,NJJ,IJJ) + DEALLOCATE(VOLTOT,BETA,AFACTOR,FDXP,FDXM,FHOMP,FHOMM) + RETURN + 20 FORMAT(1X,A9,1P,10E12.4,/(10X,10E12.4)) + END |
