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/BREDRV.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/BREDRV.f')
| -rw-r--r-- | Dragon/src/BREDRV.f | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/Dragon/src/BREDRV.f b/Dragon/src/BREDRV.f new file mode 100644 index 0000000..3e9a12a --- /dev/null +++ b/Dragon/src/BREDRV.f @@ -0,0 +1,307 @@ +*DECK BREDRV + SUBROUTINE BREDRV(NC,IPGEO1,IPMAC1,IPGEO2,IPEDI2,IELEM,ICOL,NG, + > LX1,NMIX1,NMIX2,ITRIAL,IDIFF,NLF,IMIX1,IGAP,HMREFL,ISPH,LALB, + > NGET,ADFREF,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver for the 1D reflector calculation. +* +*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 (=1: DF-NEM or DF-ANM; =2:Lefebvre- +* Lebigot or Koebke method; >=2 ERM-NEM). +* IPGEO1 nodal geometry. +* IPMAC1 nodal macrolib. +* IPGEO2 sn geometry. +* IPEDI2 sn edition. +* IELEM Raviart-Thomas polynomial order. +* ICOL Raviart-Thomas polynomial integration type. +* NG number of energy groups. +* LX1 number of nodes in the nodal calculation. +* NMIX1 number of mixtures in the nodal calculation. +* NMIX2 number of mixtures in the sn calculation after edition. +* ITRIAL type of expansion functions in the nodal calculation. +* (=1: polynomial; =2: hyperbolic). +* IDIFF PN calculation option (=0: diffusion theory; =1: SPN theory +* with NTOT1; =2: SPN theory with 1/(3*D)). +* NLF (NLF-1) is the SPN order (-1: diffusion theory; even integer: +* SPN theory). +* IMIX1 mix index of node (equal to zero if the node is not used). +* IGAP mix index of the right gap where the surface flux is +* recovered (equal to zero if no gap is defined). +* HMREFL type of reflector model. +* ISPH SPH flag (=0: use discontinuity factors; =1: use SPH factors). +* LALB albedo flag (=.TRUE.: compute an equivalent albedo with FD-NEM +* and ERM-NEM methods). +* 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. +* IPRINT edition flag. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NC + TYPE(C_PTR) IPGEO1,IPMAC1,IPGEO2,IPEDI2(NC) + INTEGER IELEM,ICOL,NG,LX1,NMIX1,NMIX2,ITRIAL(NG),IDIFF,NLF, + 1 IMIX1(LX1),IGAP(LX1),ISPH,NGET,IPRINT + REAL ADFREF(NG) + CHARACTER HMREFL*12 + LOGICAL LALB +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + INTEGER ISTATE(NSTATE),NCODE(6),ICODE(6) + REAL ZCODE(6) + CHARACTER HSMG*131,HCASE*12 + LOGICAL LREFL +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IHOM,IMIX,IMIXS,ISPLTX, + 1 ISTOP + REAL, ALLOCATABLE, DIMENSION(:) :: XXX,XXXS,XXX1,ENER,ZKEFF,B2 + REAL, ALLOCATABLE, DIMENSION(:,:) :: VOL1 + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FLX1,DC1,CHI1,SIGF1,JXM, + 1 JXP,ADF1 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: TOT1,FHETXM,FHETXP + REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: SCAT1 + TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPMAC2 +*---- +* RECOVER SN MACROLIBS +*---- + ALLOCATE(IPMAC2(NC)) + ILEAKS=0 + IDF=0 + DO IC=1,NC + CALL LCMGET(IPEDI2(IC),'STATE-VECTOR',ISTATE) + IF(IC.EQ.1) THEN + LXMS=ISTATE(17) + ALLOCATE(IHOM(LXMS),ENER(NG+1)) + ELSE + IF(ISTATE(17).NE.LXMS) CALL XABORT('BREDRV: INVALID LXMS.') + ENDIF + CALL LCMGET(IPEDI2(IC),'REF:MATCOD',IHOM) + NMIX_SN=MAXVAL(IHOM) + CALL LCMGET(IPEDI2(IC),'REF:IMERGE',IHOM) + CALL LCMGTC(IPEDI2(IC),'LAST-EDIT',12,HCASE) + IPMAC2(IC)=LCMGID(IPEDI2(IC),HCASE) + IPMAC2(IC)=LCMGID(IPMAC2(IC),'MACROLIB') + CALL LCMGET(IPMAC2(IC),'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NG) THEN + CALL XABORT('BREDRV: INVALID NUMBER OF CONDENSED GROUPS.') + ELSE IF(ISTATE(2).NE.NMIX2) THEN + CALL XABORT('BREDRV: INVALID NUMBER OF SN MIXTURES.') + ELSE IF(ISTATE(4).NE.1) THEN + CALL XABORT('BREDRV: ONE FISSILE ISOTOPE EXPECTED.') + ENDIF + IF(IC.EQ.1) THEN + ILEAKS=ISTATE(9) + IDF=ISTATE(12) + CALL LCMGET(IPMAC2(1),'ENERGY',ENER) + ENDIF + ENDDO + IF((NGET.EQ.2).AND.(IDF.NE.3)) THEN + CALL XABORT('BREDRV: MISSING ADF INFO IN INPUT MACROLIB.') + ENDIF +*---- +* RECOVER AND PROCESS GEOMETRY INFORMATION +*---- + CALL LCMGET(IPGEO2,'STATE-VECTOR',ISTATE) + CALL LCMGET(IPGEO2,'NCODE',NCODE) + CALL LCMGET(IPGEO2,'ICODE',ICODE) + CALL LCMGET(IPGEO2,'ZCODE',ZCODE) + LREFL=(NCODE(1).EQ.2).OR.((NCODE(1).EQ.6).AND.(ZCODE(1).EQ.1.0)) + IF(ISTATE(1).NE.2) THEN + CALL XABORT('BREDRV: 1D SLAB GEOMETRY EXPECTED.') + ELSE IF(ISTATE(8).NE.0) THEN + CALL XABORT('BREDRV: CELL OPTION IS FORBIDDEN.') + ELSE IF(ISTATE(7).NE.NMIX_SN) THEN + WRITE(HSMG,'(40H BREDRV: INVALID NUMBER OF SN MIX (GEOM=,I5, + 1 7H MACRO=,I5,2H).)') ISTATE(7),NMIX_SN + CALL XABORT(HSMG) + ELSE IF(.NOT.LREFL) THEN + CALL XABORT('BREDRV: REFLEXION MANDATORY AT LEFT BOUNDARY.') + ENDIF + LX=ISTATE(3) + ALLOCATE(IMIX(LX),XXX(LX+1),ISPLTX(LX)) + CALL LCMGET(IPGEO2,'MIX',IMIX) + CALL LCMGET(IPGEO2,'MESHX',XXX) + CALL LCMLEN(IPGEO2,'SPLITX',ILEN2,ITYLCM) + IF(ILEN2.GT.0) THEN + CALL LCMGET(IPGEO2,'SPLITX',ISPLTX) + ELSE + ISPLTX(:LX)=1 + ENDIF + LXS=0 + DO I=1,LX + LXS=LXS+ABS(ISPLTX(I)) + ENDDO + IF(LXS.NE.LXMS) THEN + WRITE(HSMG,'(41H BREDRV: INVALID NUMBER OF REGIONS (GEOM=,I5, + 1 9H EDITION=,I5,2H).)') LXS,LXMS + CALL XABORT(HSMG) + ENDIF + ALLOCATE(IMIXS(LXS),XXXS(LXS+1)) + IF(NCODE(2).EQ.5) THEN + DEL=XXX(LX+1)-XXX(LX) + IF(MOD(ISPLTX(LX),2).EQ.0) THEN + ISPLTX(LX)=ISPLTX(LX)/2 + NCODE(2)=2 + XXX(LX+1)=XXX(LX)+REAL(0.5*DEL) + ELSE + IGAR=ISPLTX(LX) + ISPLTX(LX)=(ISPLTX(LX)+1)/2 + XXX(LX+1)=XXX(LX)+REAL(DEL*(DBLE(ISPLTX(LX))/DBLE(IGAR))) + ENDIF + ENDIF + K=LXS+1 + GAR=XXX(LX+1) + DO IOLD=LX,1,-1 + ISP=ISPLTX(IOLD) + DEL=(GAR-XXX(IOLD))/REAL(ISP) + GAR=XXX(IOLD) + DO I=ABS(ISP),1,-1 + XXXS(K)=REAL(GAR+DEL*DBLE(I)) + K=K-1 + IMIXS(K)=IMIX(IOLD) + ENDDO + ENDDO + XXXS(1)=XXX(1) + DEALLOCATE(ISPLTX,XXX,IMIX) + ALLOCATE(XXX1(LX1+1),ISTOP(LX1)) + ISTOP(:LX1)=0 + DO I=1,LXS + DO J=1,LX1 + IF(IHOM(I).EQ.IGAP(J)) THEN + IF((ISTOP(J).NE.0).AND.(IGAP(J).NE.0)) THEN + WRITE(HSMG,'(23H BREDRV: GAP WITH INDEX,I5,10H IS DEFINE, + 1 8HD TWICE.)') IGAP(J) + CALL XABORT(HSMG) + ENDIF + ISTOP(J)=I + ENDIF + ENDDO + ENDDO + IF(IPRINT.GE.0) THEN + WRITE(6,'(/20H BREDRV: SN GEOMETRY)') + WRITE(6,'(1P,10E12.4)') XXXS(:LXS+1) + ENDIF + XXX1(1)=XXXS(1) + XXX1(LX1+1)=XXXS(LXS+1) + IOF=0 + DO J=1,LX1 + IOF=IOF+1 + IF((IMIX1(J).NE.0) .AND.(IMIX1(J).NE.IOF)) THEN + CALL XABORT('BREDRV: INCONSISTENT MIX VALUE.') + ENDIF + IF(ISTOP(J).GT.0) THEN + IOF=IOF+1 + XXX1(J+1)=XXXS(ISTOP(J)) + ENDIF + ENDDO + NCODE(1)=2 + ICODE(:2)=0 + IF(LALB.AND.(IGAP(LX1).NE.0)) THEN + NCODE(2)=6 + ICODE(2)=1 + ENDIF + DEALLOCATE(ISTOP) + ISTATE(:)=0 + ISTATE(1)=2 + ISTATE(3)=LX1 + ISTATE(6)=LX1 + ISTATE(7)=NMIX1 + CALL LCMPUT(IPGEO1,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPGEO1,'NCODE',6,1,NCODE) + CALL LCMPUT(IPGEO1,'ICODE',6,1,ICODE) + CALL LCMPUT(IPGEO1,'ZCODE',6,2,ZCODE) + ALLOCATE(IMIX(LX1)) + IMIX(:)=0 + IOF=0 + DO J=1,LX1 + IF(IMIX1(J).NE.0) THEN + IOF=IOF+1 + IMIX(J)=IOF + ENDIF + ENDDO + CALL LCMPUT(IPGEO1,'MIX',LX1,1,IMIX) + CALL LCMPUT(IPGEO1,'MESHX',LX1+1,2,XXX1) + IF(IPRINT.GE.0) THEN + WRITE(6,'(/23H BREDRV: NODAL GEOMETRY)') + WRITE(6,'(1P,10E12.4)') XXX1(:LX1+1) + ENDIF +*---- +* COMPUTE MACROSCOPIC CROSS SECTIONS AND SURFACIC DATA +*---- + NL=NLF + ALLOCATE(VOL1(NMIX1,NC),FLX1(NMIX1,NG,NC),DC1(NMIX1,NG,NC), + 1 TOT1(NMIX1,NG,NL,NC),CHI1(NMIX1,NG,NC),SIGF1(NMIX1,NG,NC), + 2 SCAT1(NMIX1,NG,NG,NL,NC),JXM(NMIX1,NG,NC),JXP(NMIX1,NG,NC), + 3 FHETXM(NMIX1,NG,NL,NC),FHETXP(NMIX1,NG,NL,NC),ADF1(NMIX1,NG,NC), + 4 ZKEFF(NC),B2(NC)) + CALL BREMAC(NC,IPMAC2,NG,NL,LX1,NMIX1,NMIX2,IMIX,IMIX1,IGAP, + 1 ILEAKS,IDF,IPRINT,ZKEFF,B2,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1,SCAT1, + 2 JXM,JXP,FHETXM,FHETXP,ADF1) +*---- +* SELECT A REFLECTOR MODEL +*---- + IF(HMREFL.EQ."DF-NEM") THEN + IF(NC.NE.1) CALL XABORT('BREDRV: NC=1 EXPECTED.') + CALL BRENEM(IPMAC1,NG,LX1,NMIX1,ITRIAL,IMIX,ICODE,ISPH,ZKEFF, + 1 B2,ENER,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1,SCAT1,JXM,JXP,FHETXM, + 2 FHETXP,ADF1,NGET,ADFREF,IPRINT) + ELSE IF(HMREFL.EQ."DF-ANM") THEN + IF(NC.NE.1) CALL XABORT('BREDRV: NC=1 EXPECTED.') + CALL BREANM(IPMAC1,NG,LX1,NMIX1,IMIX,ICODE,ISPH,ZKEFF,B2,ENER, + 1 XXX1,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1,SCAT1,JXM,JXP,FHETXM,FHETXP, + 2 ADF1,NGET,ADFREF,IPRINT) + ELSE IF(HMREFL.EQ."DF-RT") THEN + IF(NC.NE.1) CALL XABORT('BREDRV: NC=1 EXPECTED.') + CALL BRERT(IPMAC1,IELEM,ICOL,NG,NL,LX1,NMIX1,IMIX,ICODE,ISPH, + 1 IDIFF,ZKEFF,B2,ENER,XXX1,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1,SCAT1, + 2 JXM,JXP,FHETXM,FHETXP,ADF1,NGET,ADFREF,IPRINT) + ELSE IF(HMREFL.EQ."ERM-NEM") THEN + CALL BREERM(IPMAC1,NC,NG,NL,LX1,NMIX1,ITRIAL,IMIX,ICODE,ISPH, + 1 ZKEFF,B2,ENER,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1,SCAT1,JXM,JXP, + 2 FHETXM,FHETXP,ADF1,NGET,ADFREF,IPRINT) + ELSE IF(HMREFL.EQ."ERM-ANM") THEN + CALL BREERA(IPMAC1,NC,NG,NL,LX1,NMIX1,IMIX,ICODE,ISPH,ZKEFF,B2, + 1 ENER,XXX1,VOL1,FLX1,DC1,TOT1,CHI1,SIGF1,SCAT1,JXM,JXP,FHETXM, + 2 FHETXP,ADF1,NGET,ADFREF,IPRINT) + ELSE IF(HMREFL.EQ."LEFEBVRE-LEB") THEN + IF(NC.NE.2) CALL XABORT('BREDRV: NC=2 EXPECTED.') + CALL BRELLB(IPMAC1,NC,NG,NL,NMIX1,ENER,JXM,FHETXM,IPRINT) + ELSE IF(HMREFL.EQ."KOEBKE") THEN + IF(NC.NE.2) CALL XABORT('BREDRV: NC=2 EXPECTED.') + CALL BREKOE(IPMAC1,NC,NG,NL,NMIX1,ISPH,B2,ENER,DC1,TOT1,SCAT1, + 1 JXM,FHETXM,IPRINT) + ELSE + WRITE(HSMG,'(25H BREDRV: REFLECTOR MODEL ,A,12H IS UNKNOWN.)') + 1 HMREFL + CALL XABORT(HSMG) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(IMIX,B2,ZKEFF,ADF1,FHETXP,FHETXM,JXP,JXM,SCAT1,SIGF1, + 1 CHI1,TOT1,DC1,FLX1,VOL1) + DEALLOCATE(XXX1,XXXS,IMIXS,ENER,IHOM) + DEALLOCATE(IPMAC2) + RETURN + END |
