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/SPHMPO.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/SPHMPO.f')
| -rw-r--r-- | Dragon/src/SPHMPO.f | 716 |
1 files changed, 716 insertions, 0 deletions
diff --git a/Dragon/src/SPHMPO.f b/Dragon/src/SPHMPO.f new file mode 100644 index 0000000..64acbf8 --- /dev/null +++ b/Dragon/src/SPHMPO.f @@ -0,0 +1,716 @@ +*DECK SPHMPO + SUBROUTINE SPHMPO(IPMPO,IPMAC,ICAL,IMPX,HEQUI,HMASL,NMIL,NALBP, + 1 NGROUP,HEDIT,VOSAP,ILUPS,SPH,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Extract a Macrolib corresponding to an elementary calculation in a +* MPO file +* +*Copyright: +* Copyright (C) 2022 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 +* IPMPO pointer to the MPO file. +* ICAL index of the elementary calculation being considered. +* IMPX print parameter (equal to zero for no print). +* HEQUI keyword of SPH-factor set to be recovered. +* HMASL keyword of MASL data set to be recovered. +* NMIL number of mixtures in the elementary calculation. +* NALBP number of physical albedos per energy group. +* NGROUP number of energy groups in the elementary calculation. +* HEDIT name of output group for a (multigroup mesh, output geometry) +* couple (generally equal to 'output_0'). +* VOSAP mixture volumes in the MPO file. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* B2 imposed buckling. +* +*Parameters: output +* IPMAC pointer to the Macrolib (L_MACROLIB signature). +* SPH SPH-factor set extracted from the MPO file. +* B2 buckling recovered from MPO file. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMPO,IPMAC + INTEGER ICAL,IMPX,NMIL,NALBP,NGROUP,ILUPS + REAL VOSAP(NMIL),SPH(NMIL+NALBP,NGROUP),B2 + CHARACTER(LEN=80) HEQUI,HMASL + CHARACTER(LEN=12) HEDIT +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::NSTATE=40 + INTEGER ISTATE(NSTATE) + INTEGER I,NADDRXS,NREA,NISO,NISOM,ADDRZX,ADDRZI,IBM,ISO,ISOM, + & NBISO,NBYTE,RANK,TYPE,DIMSR(5),NL,ILOC,NLOC,IPROF,JOFS,NL1, + & NL2,IPRC,NPRC,IOF,IGR,JGR,ITRANC,NED,IFISS,IGMAX,IGMIN, + & IPOSDE,IL,IREA,NSURFD,IDF,NALBP2,TYPE2,TYPE4,NITMA + REAL FLOTT,DEN,ZIL,FF,CSCAT + LOGICAL LSPH,LMASL,LSTRD,LDIFF,LHFACT,LNEW + CHARACTER RECNAM*80,RECNA2*80,TEXT12*12,CM*2,HSMG*131 + TYPE(C_PTR) JPMAC,KPMAC +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: REACTION,ISOTOPE,IDATAP, + & ADDRISO,LOCAD,FAG,ADR + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: ADDRXS + REAL, ALLOCATABLE, DIMENSION(:) :: FLUXS,CONCEN,RDATAX,RVALO, + & FMASL,LAMBDAD,BETADF,INVEL,LAMB,VREAL + REAL, ALLOCATABLE, DIMENSION(:,:) :: NWT0,EFACT,CHID,SIGS0,TOTAL, + & DIFF,BETAR,INVELS,DISFAC,ALBP,VFLUX + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XS,SIGS,CHIRS,ALBP_ERM, + & SFLUX + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: SS2D + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HEDI,HADF + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: TEXT24,NOMREA, + & NOMISO + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LXS + CHARACTER(LEN=80), ALLOCATABLE, DIMENSION(:) :: LOCTYP,LOCKEY + INTEGER, ALLOCATABLE, DIMENSION(:) :: IPOS,NJJM,IJJM + REAL, ALLOCATABLE, DIMENSION(:) :: SCAT,GAR +*---- +* SCRATCH STORAGE ALLOCATION +* SIGS0 P0 scattering cross sections. +* TOTAL total cross sections. +* DIFF diffusion coefficients. +* FMASL heavy element mass. +*---- + ALLOCATE(IPOS(NMIL),NJJM(NMIL),IJJM(NMIL)) + ALLOCATE(SIGS0(NMIL,NGROUP),TOTAL(NMIL,NGROUP),DIFF(NMIL,NGROUP), + & FMASL(NMIL)) + SIGS0(:NMIL,:NGROUP)=0.0 + TOTAL(:NMIL,:NGROUP)=0.0 + DIFF(:NMIL,:NGROUP)=0.0 + FMASL(:NMIL)=0.0 +*---- +* RECOVER MPO FILE CHARACTERISTICS +*---- + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NADDRXS",NADDRXS) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NREA",NREA) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NISO",NISO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRXS",ADDRXS) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"REACTION",REACTION) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ISOTOPE",ISOTOPE) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"TRANSPROFILE",IDATAP) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRISO",ADDRISO) + NBISO=ADDRISO(SIZE(ADDRISO,1)) + IF(NBISO.EQ.0) CALL XABORT('SPHMPO: NO CROSS SECTIONS.') + ALLOCATE(NOMREA(NREA),NOMISO(NBISO)) + CALL hdf5_read_data(IPMPO,"contents/reactions/REACTIONAME",TEXT24) + DO I=1,NREA + NOMREA(I)=TEXT24(REACTION(I)+1) + ENDDO + DEALLOCATE(TEXT24) + CALL hdf5_read_data(IPMPO,"contents/isotopes/ISOTOPENAME",TEXT24) + DO I=1,NBISO + NOMISO(I)=TEXT24(ISOTOPE(I)+1) + ENDDO + DEALLOCATE(TEXT24) + IF(IMPX.GT.1) THEN + WRITE(6,'(/24H SPHMPO: reaction names:)') + DO I=1,NREA + WRITE(6,'(5X,7HNOMREA(,I3,2H)=,A)') I,TRIM(NOMREA(I)) + ENDDO + WRITE(6,'(/23H SPHMPO: isotope names:)') + DO I=1,NBISO + WRITE(6,'(5X,7HNOMISO(,I3,2H)=,A)') I,TRIM(NOMISO(I)) + ENDDO + WRITE(6,'(/34H SPHMPO: number of energy groups =,I4)') NGROUP + WRITE(6,'(30H SPHMPO: number of mixtures =,I4)') NMIL + WRITE(6,'(30H SPHMPO: number of reactions =,I4)') NREA + WRITE(6,'(30H SPHMPO: number of isotopes =,I4)') NBISO + ENDIF + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0)') TRIM(HEDIT),ICAL-1 + IF(.not.hdf5_group_exists(IPMPO,TRIM(RECNAM))) THEN + WRITE(HSMG,'(38HSPHMPO: missing elementary calculation,I5, + & 10H in group ,A,1H.)') ICAL,TRIM(HEDIT) + CALL XABORT(HSMG) + ENDIF +*---- +* SET EQUIVALENCE AND HEAVY DENSITY FLAGS. +*---- + LSPH=.FALSE. + LMASL=.FALSE. + NLOC=0 + IF(hdf5_group_exists(IPMPO,"/local_values/")) THEN + CALL hdf5_read_data(IPMPO,"local_values/LOCVALTYPE",LOCTYP) + CALL hdf5_read_data(IPMPO,"local_values/LOCVALNAME",LOCKEY) + NLOC=SIZE(LOCTYP,1) + DO ILOC=1,NLOC + LSPH=LSPH.OR.((LOCTYP(ILOC).EQ.'EQUI').AND. + & (LOCKEY(ILOC).EQ.HEQUI)) + LMASL=LMASL.OR.((LOCTYP(ILOC).EQ.'HEAVY_METAL_DENSITY').AND. + & (LOCKEY(ILOC).EQ.HMASL)) + ENDDO + ENDIF +*---- +* FIND SCATTERING ANISOTROPY. +*---- + NL=0 + DO I=1,NADDRXS + DO ISO=1,NISO + NL=MAX(NL,ADDRXS(NREA+1,ISO,I)) + NL=MAX(NL,ADDRXS(NREA+2,ISO,I)) + ENDDO + ENDDO + IF(IMPX.GT.1) THEN + WRITE(6,'(37H SPHMPO: number of legendre orders =,I4)') NL + ENDIF +*---- +* RECOVER GENERAL INFORMATION +*---- + LSTRD=(B2.EQ.0.0) + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,8H/addons/)') + & TRIM(HEDIT),ICAL-1 + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"KEFF",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"KEFF",FLOTT) + CALL LCMPUT(IPMAC,'K-EFFECTIVE',1,2,FLOTT) + IF(IMPX.GT.1) THEN + WRITE(6,'(22H SPHMPO: K-EFFECTIVE =,1P,E13.6)') FLOTT + ENDIF + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"KINF",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"KINF",FLOTT) + CALL LCMPUT(IPMAC,'K-INFINITY',1,2,FLOTT) + IF(IMPX.GT.1) THEN + WRITE(6,'(21H SPHMPO: K-INFINITY =,1P,E13.6)') FLOTT + ENDIF + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"B2",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"B2",B2) + LSTRD=(B2.EQ.0.0) + CALL LCMPUT(IPMAC,'B2 B1HOM',1,2,B2) + IF(IMPX.GT.1) THEN + WRITE(6,'(13H SPHMPO: B2 =,1P,E14.6)') B2 + ENDIF + ENDIF +*---- +* SET NSURFD +*---- + IDF=0 + NSURFD=0 + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,7H/zone_0, + & 15H/discontinuity/)') TRIM(HEDIT),ICAL-1 + LNEW=hdf5_group_exists(IPMPO,TRIM(RECNAM)) + IF(LNEW) THEN +* new specification + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NSURF",NSURFD) + ELSE +* old specification + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,12H/flux/NSURF/)') + & TRIM(HEDIT),ICAL-1 + CALL hdf5_info(IPMPO,TRIM(RECNAM),RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) CALL hdf5_read_data(IPMPO,TRIM(RECNAM),NSURFD) + ENDIF + IF(NSURFD.EQ.0) GO TO 10 +*---- +* RECOVER DISCONTINUITY FACTOR INFORMATION +*---- + IF(LNEW) THEN +* new specification + ALLOCATE(SFLUX(NMIL,NGROUP**2,NSURFD),VFLUX(NMIL,NGROUP)) + DO IBM=1,NMIL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + & TRIM(HEDIT),ICAL-1,IBM-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEFLUX",VREAL) + VFLUX(IBM,:NGROUP)=VREAL(:NGROUP)/VOSAP(IBM) + DEALLOCATE(VREAL) + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0, + & 15H/discontinuity/)') TRIM(HEDIT),ICAL-1,IBM-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NSURF",NITMA) + IF(NITMA.NE.NSURFD) THEN + WRITE(HSMG,'(32HSPHMPO: THE NUMBER OF SURFACES (,I5, + & 12H) IN MIXTURE,I5,31H IS DIFFERENT FROM THE NUMBER (,I5, + & 15H) IN MIXTURE 1.)') NITMA,IBM,NSURFD + CALL XABORT(HSMG) + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"DFACTOR",RANK,TYPE2, + & NBYTE,DIMSR) + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"DFACTORGxG",RANK,TYPE4, + & NBYTE,DIMSR) + IF(TYPE2.NE.99) THEN + IDF=3 ! discontinuity factor information + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"DFACTOR",DISFAC) + DO I=1,NSURFD + SFLUX(IBM,:NGROUP,I)=DISFAC(I,:NGROUP) + ENDDO + DEALLOCATE(DISFAC) + ELSE IF(TYPE4.NE.99) THEN + IDF=4 ! matrix discontinuity factor information + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"DFACTORGxG",DISFAC) + DO I=1,NSURFD + SFLUX(IBM,:NGROUP**2,I)=DISFAC(I,:NGROUP**2) + ENDDO + DEALLOCATE(DISFAC) + ELSE + CALL hdf5_list(IPMPO,TRIM(RECNAM)) + CALL XABORT('SPHMPO: UNABLE TO SET TYPE OF DF.') + ENDIF + ENDDO + ELSE +* old specification + ALLOCATE(SFLUX(NMIL,NGROUP,NSURFD),VFLUX(NMIL,NGROUP)) + IDF=3 ! discontinuity factor information + CALL SPHMOL(IPMPO,ICAL,NMIL,NGROUP,NSURFD,HEDIT,VOSAP,SFLUX, + 1 VFLUX) + ENDIF +*---- +* WRITE DISCONTINUITY FACTOR INFORMATION ON IPMAC +*---- + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'NTYPE',1,1,NSURFD) + CALL LCMPUT(IPMAC,'AVG_FLUX',NMIL*NGROUP,2,VFLUX) + ALLOCATE(HADF(NSURFD)) + IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN + DO I=1,NSURFD + WRITE(HADF(I),'(3HFD_,I5.5)') I + CALL LCMPUT(IPMAC,HADF(I),NMIL*NGROUP,2,SFLUX(1,1,I)) + ENDDO + ELSE IF(IDF.EQ.4) THEN + DO I=1,NSURFD + WRITE(HADF(I),'(3HFD_,I5.5)') I + CALL LCMPUT(IPMAC,HADF(I),NMIL*NGROUP**2,2,SFLUX(1,1,I)) + ENDDO + ENDIF + CALL LCMPTC(IPMAC,'HADF',8,NSURFD,HADF) + DEALLOCATE(VFLUX,SFLUX) + CALL LCMSIX(IPMAC,' ',2) +*---- +* RECOVER ALBEDO INFORMATION +*---- + 10 WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/flux/)') + & TRIM(HEDIT),ICAL-1 + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"ALBEDO",RANK,TYPE,NBYTE, + & DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NALBP",NALBP2) + IF(NALBP2.NE.NALBP) CALL XABORT('SPHMPO: INVALID NALBP(1).') + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ALBEDO",ALBP) + CALL LCMPUT(IPMAC,'ALBEDO',NALBP*NGROUP,2,ALBP) + DEALLOCATE(ALBP) + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"ALBEDOGxG",RANK,TYPE,NBYTE, + & DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NALBP",NALBP2) + IF(NALBP2.NE.NALBP) CALL XABORT('SPHMPO: INVALID NALBP(2).') + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ALBEDOGxG",ALBP_ERM) + CALL LCMPUT(IPMAC,'ALBEDO',NALBP*NGROUP*NGROUP,2,ALBP_ERM) + DEALLOCATE(ALBP_ERM) + ENDIF +*---- +* ALLOCATE MACROLIB WORKING ARRAYS. +*---- + ALLOCATE(LXS(NREA),NWT0(NMIL,NGROUP),EFACT(NMIL,NGROUP), + 1 SIGS(NMIL,NGROUP,NL),SS2D(NMIL,NGROUP,NGROUP,NL), + 2 XS(NMIL,NGROUP,NREA),FAG(NGROUP),ADR(NGROUP)) + NWT0(:NMIL,:NGROUP)=0.0 + EFACT(:NMIL,:NGROUP)=0.0 + SIGS(:NMIL,:NGROUP,:NL)=0.0 + SS2D(:NMIL,:NGROUP,:NGROUP,:NL)=0.0 + XS(:NMIL,:NGROUP,:NREA)=0.0 + LXS(:NREA)=.FALSE. + LDIFF=.FALSE. +*---- +* ALLOCATE DELAYED NEUTRON WORKING ARRAYS. +*---- + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0, + & 24H/zone_0/kinetics/LAMBDAD)') TRIM(HEDIT),ICAL-1 + NPRC=0 + CALL hdf5_info(IPMPO,TRIM(RECNAM),RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) NPRC=DIMSR(1) + IF(IMPX.GT.1) THEN + WRITE(6,'(37H SPHMPO: number of precursor groups =,I4)') NPRC + ENDIF + ALLOCATE(LAMB(NPRC),CHIRS(NGROUP,NPRC,NMIL),BETAR(NPRC,NMIL), + & INVELS(NGROUP,NMIL)) + LAMB(:NPRC)=0.0 + CHIRS(:NGROUP,:NPRC,:NMIL)=0.0 + BETAR(:NPRC,:NMIL)=0.0 + INVELS(:NGROUP,:NMIL)=0.0 +*---- +* LOOP OVER MPO MIXTURES +*---- + DO IBM=1,NMIL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + & TRIM(HEDIT),ICAL-1,IBM-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEFLUX",FLUXS) + DO I=1,NGROUP + NWT0(IBM,I)=NWT0(IBM,I)+FLUXS(I) + ENDDO + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZI",ADDRZI) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZX",ADDRZX) + NISOM=ADDRISO(ADDRZI+2)-ADDRISO(ADDRZI+1) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"CONCENTRATION",CONCEN) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"CROSSECTION",RDATAX) + DO ISOM=1,NISOM + ! loop over the isotopes present in the mix + NL1=ADDRXS(NREA+1,ISOM,ADDRZX+1) + NL2=ADDRXS(NREA+2,ISOM,ADDRZX+1) + IF((NL1.GT.NL).OR.(NL2.GT.NL)) THEN + CALL XABORT('SPHMPO: NL OVERFLOW.') + ENDIF + DEN=CONCEN(ISOM) + IF(DEN.NE.0.0) THEN + IF(IMPX.GT.3) THEN + ISO=ADDRISO(ADDRZI+1)+ISOM + WRITE(6,'(10H mixture=,I5,15H concentration(,A,2H)=,1P, + & E12.4)') IBM,TRIM(NOMISO(ISO)),DEN + ENDIF + DO IREA=1,NREA + IOF=ADDRXS(IREA,ISOM,ADDRZX+1) + IF(IOF.LT.0) CYCLE + IF(NOMREA(IREA).EQ.'Diffusion') THEN + DO IL=1,NL1 + DO IGR=1,NGROUP + FLOTT=DEN*RDATAX(IOF+(IL-1)*NGROUP+IGR) + SIGS(IBM,IGR,IL)=SIGS(IBM,IGR,IL)+FLOTT + LXS(IREA)=LXS(IREA).OR.(FLOTT.NE.0.0) + ENDDO + ENDDO + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + IPROF=ADDRXS(NREA+3,ISOM,ADDRZX+1) + DO IGR=1,NGROUP + FAG(IGR)=IDATAP(IPROF+IGR)+1 + ADR(IGR)=IDATAP(IPROF+NGROUP+IGR) + ENDDO + ADR(NGROUP+1)=IDATAP(IPROF+1+2*NGROUP) + JOFS=0 + DO IL=1,NL2 + ZIL=REAL(2*IL-1) + DO IGR=1,NGROUP + DO JGR=FAG(IGR),FAG(IGR)+(ADR(IGR+1)-ADR(IGR))-1 + IF(JGR.GT.NGROUP) CALL XABORT('SPHMPO: SS2D OVER' + & //'FLOW.') + FLOTT=DEN*RDATAX(IOF+JOFS+1)/ZIL + SS2D(IBM,JGR,IGR,IL)=SS2D(IBM,JGR,IGR,IL)+FLOTT ! JGR <-- IGR + JOFS=JOFS+1 + LXS(IREA)=LXS(IREA).OR.(FLOTT.NE.0.0) + ENDDO + ENDDO + ENDDO + ELSE IF(NOMREA(IREA).EQ.'FissionSpectrum') THEN + DO IGR=1,NGROUP + XS(IBM,IGR,IREA)=RDATAX(IOF+IGR) + LXS(IREA)=LXS(IREA).OR.(RDATAX(IOF+IGR).NE.0.0) + ENDDO + ELSE + DO IGR=1,NGROUP + XS(IBM,IGR,IREA)=XS(IBM,IGR,IREA)+DEN*RDATAX(IOF+IGR) + LXS(IREA)=LXS(IREA).OR.(DEN*RDATAX(IOF+IGR).NE.0.0) + ENDDO + ENDIF + ENDDO ! end of loop over reactions + ENDIF + ENDDO ! end of loop over isotopes + DEALLOCATE(RDATAX,CONCEN,FLUXS) +* + IF(hdf5_group_exists(IPMPO,TRIM(RECNAM)//"kinetics")) THEN + WRITE(RECNA2,'(A,9Hkinetics/)') TRIM(RECNAM) + CALL hdf5_list(IPMPO,TRIM(RECNA2)) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"LAMBDAD",LAMBDAD) + IF(SIZE(LAMBDAD,1).NE.NPRC) CALL XABORT('SPHMPO: WRONG NPRC.') + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"CHID",CHID) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"BETADF",BETADF) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"INVERSESPEED",INVEL) + CHIRS(:NGROUP,:NPRC,IBM)=CHID(:NGROUP,:NPRC) + BETAR(:NPRC,IBM)=BETADF(:NPRC) + INVELS(:NGROUP,IBM)=INVEL(:NGROUP) + DEALLOCATE(INVEL,BETADF,CHID,LAMBDAD) + ENDIF +* +* UP-SCATTERING CORRECTION OF THE MACROLIB. + IF(ILUPS.EQ.1) THEN + DO JGR=2,NGROUP + DO IGR=1,JGR-1 ! IGR < JGR + FF=NWT0(IBM,JGR)/NWT0(IBM,IGR) + CSCAT=SS2D(IBM,IGR,JGR,1) ! IGR < JGR + DO IL=1,NL + CSCAT=SS2D(IBM,IGR,JGR,IL) + SIGS(IBM,IGR,IL)=SIGS(IBM,IGR,IL)-CSCAT*FF + SIGS(IBM,JGR,IL)=SIGS(IBM,JGR,IL)-CSCAT + SS2D(IBM,JGR,IGR,IL)=SS2D(IBM,JGR,IGR,IL)-CSCAT*FF + SS2D(IBM,IGR,JGR,IL)=0.0 + ENDDO + ENDDO + ENDDO + ENDIF +* + IF(LSPH) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"LOCALVALUE",RVALO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"LOCALVALADDR",LOCAD) + DO ILOC=1,NLOC + IF((LOCTYP(ILOC).EQ.'EQUI').AND.(LOCKEY(ILOC).EQ.HEQUI)) + & THEN + IF(LOCAD(ILOC+1)-LOCAD(ILOC).NE.NGROUP) THEN + CALL XABORT('SPHMPO: INVALID NUMBER OF COMPONENTS FOR ' + & //'SPH FACTORS') + ENDIF + DO IGR=1,NGROUP + SPH(IBM,IGR)=RVALO(LOCAD(ILOC)+IGR-1) + ENDDO + ENDIF + ENDDO + DEALLOCATE(LOCAD,RVALO) + ELSE + SPH(IBM,:NGROUP)=1.0 + ENDIF + IF(LMASL) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"LOCALVALUE",RVALO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"LOCALVALADDR",LOCAD) + DO ILOC=1,NLOC + IF((LOCTYP(ILOC).EQ.'HEAVY_METAL_DENSITY').AND. + & (LOCKEY(ILOC).EQ.HMASL)) THEN + IF(LOCAD(ILOC+1)-LOCAD(ILOC).NE.1) THEN + CALL XABORT('SPHMPO: INVALID NUMBER OF COMPONENTS FOR ' + & //'HEAVY_METAL_DENSITY') + ENDIF + FMASL(IBM)=RVALO(LOCAD(ILOC)) + ENDIF + ENDDO + DEALLOCATE(RVALO) + ENDIF +*---- +* RECOVER DIFFUSION COEFFICIENT INFORMATION +*---- + IF(hdf5_group_exists(IPMPO,TRIM(RECNAM)//"leakage")) THEN + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"leakage/DIFFCOEF",RANK, + & TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"leakage/DIFFCOEF", + & VREAL) + DO IGR=1,NGROUP + DIFF(IBM,IGR)=VREAL(IGR) + ENDDO + DEALLOCATE(VREAL) + LDIFF=.TRUE. + LSTRD=.FALSE. + GO TO 20 + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"leakage/DB2",RANK,TYPE, + & NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"leakage/DB2",VREAL) + DO IGR=1,NGROUP + DIFF(IBM,IGR)=VREAL(IGR)/B2 + ENDDO + DEALLOCATE(VREAL) + LDIFF=.TRUE. + LSTRD=.FALSE. + ENDIF + ENDIF + 20 CONTINUE + ENDDO ! end of loop over mixtures + IF(NALBP.GT.0) THEN + SPH(NMIL+1:NMIL+NALBP,:NGROUP)=1.0 ! assigned to albedo function + ENDIF + DEALLOCATE(ADDRISO,IDATAP,ISOTOPE,REACTION,ADDRXS) +*---- +* IDENTIFY SPECIAL FLUX EDITS +*---- + ALLOCATE(HEDI(NREA)) + NED=0 + DO IREA=1,NREA + IF((NOMREA(IREA).EQ.'Total').or. + & (NOMREA(IREA).EQ.'Absorption').or. + & (NOMREA(IREA).EQ.'CaptureEnergyCapture').or. + & (NOMREA(IREA).EQ.'Diffusion').or. + & (NOMREA(IREA).EQ.'FissionEnergyFission').or. + & (NOMREA(IREA).EQ.'FissionSpectrum').or. + & (NOMREA(IREA).EQ.'NuFission').or. + & (NOMREA(IREA).EQ.'Scattering')) CYCLE + NED=NED+1 + IF(NOMREA(IREA).EQ.'Fission') THEN + HEDI(NED)='NFTOT' + ELSE + HEDI(NED)=NOMREA(IREA)(:8) + ENDIF + ENDDO +*---- +* STORE MACROLIB. +*---- + CALL LCMPUT(IPMAC,'VOLUME',NMIL,2,VOSAP) + IF(LMASL) CALL LCMPUT(IPMAC,'MASL',NMIL,2,FMASL) + IFISS=0 + ITRANC=0 + LHFACT=.FALSE. + ALLOCATE(VREAL(NMIL)) + JPMAC=LCMLID(IPMAC,'GROUP',NGROUP) + DO IGR=1,NGROUP + KPMAC=LCMDIL(JPMAC,IGR) + CALL LCMPUT(KPMAC,'FLUX-INTG',NMIL,2,NWT0(1,IGR)) + IF(NPRC.GT.0) THEN + DO IBM=1,NMIL + VREAL(IBM)=INVELS(IGR,IBM) + ENDDO + CALL LCMPUT(KPMAC,'OVERV',NMIL,2,VREAL) + ENDIF + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + IF(NOMREA(IREA).EQ.'Absorption') THEN + TOTAL(:,IGR)=TOTAL(:,IGR)+XS(:,IGR,IREA) + ELSE IF(NOMREA(IREA).EQ.'Nexcess') THEN +* correct scattering XS with excess XS + SIGS0(:,IGR)=SIGS0(:,IGR)+XS(:,IGR,IREA) + CALL LCMPUT(KPMAC,'N2N',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'Fission') THEN + CALL LCMPUT(KPMAC,'NFTOT',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'FissionSpectrum') THEN + CALL LCMPUT(KPMAC,'CHI',NMIL,2,XS(1,IGR,IREA)) + DO IPRC=1,NPRC + DO IBM=1,NMIL + VREAL(IBM)=CHIRS(IGR,IPRC,IBM) + ENDDO + WRITE(TEXT12,'(A3,I2.2)') 'CHI',IPRC + CALL LCMPUT(KPMAC,TEXT12,NMIL,2,VREAL) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'NuFission') THEN + IFISS=1 + CALL LCMPUT(KPMAC,'NUSIGF',NMIL,2,XS(1,IGR,IREA)) + DO IPRC=1,NPRC + DO IBM=1,NMIL + VREAL(IBM)=XS(IBM,IGR,IREA)*BETAR(IPRC,IBM) + ENDDO + WRITE(TEXT12,'(A6,I2.2)') 'NUSIGF',IPRC + CALL LCMPUT(KPMAC,TEXT12,NMIL,2,VREAL) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'CaptureEnergyCapture') THEN + LHFACT=.TRUE. + EFACT(:,IGR)=EFACT(:,IGR)+XS(:,IGR,IREA) + ELSE IF(NOMREA(IREA).EQ.'FissionEnergyFission') THEN + LHFACT=.TRUE. + EFACT(:,IGR)=EFACT(:,IGR)+XS(:,IGR,IREA) + ELSE IF(NOMREA(IREA).EQ.'TransportCorrection') THEN + ITRANC=2 + CALL LCMPUT(KPMAC,'TRANC',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'Diffusion') THEN + DO IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IF(IL.EQ.1) THEN + DO IBM=1,NMIL + SIGS0(IBM,IGR)=SIGS0(IBM,IGR)+SIGS(IBM,IGR,IL) + TOTAL(IBM,IGR)=TOTAL(IBM,IGR)+SIGS(IBM,IGR,IL) + ENDDO + ELSE + CALL LCMPUT(KPMAC,'SIGS'//CM,NMIL,2,SIGS(1,IGR,IL)) + ENDIF + ENDDO + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + ALLOCATE(SCAT(NGROUP*NMIL),GAR(NMIL)) + DO IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IPOSDE=0 + DO IBM=1,NMIL + IPOS(IBM)=IPOSDE+1 + IGMIN=IGR + IGMAX=IGR + DO JGR=NGROUP,1,-1 + IF(SS2D(IBM,IGR,JGR,IL).NE.0.0) THEN + IGMIN=MIN(IGMIN,JGR) + IGMAX=MAX(IGMAX,JGR) + ENDIF + ENDDO + IJJM(IBM)=IGMAX + NJJM(IBM)=IGMAX-IGMIN+1 + DO JGR=IGMAX,IGMIN,-1 + IPOSDE=IPOSDE+1 + SCAT(IPOSDE)=SS2D(IBM,IGR,JGR,IL) ! IGR <-- JGR + ENDDO + GAR(IBM)=SCAT(IPOS(IBM)+IJJM(IBM)-IGR) + ENDDO + CALL LCMPUT(KPMAC,'SCAT'//CM,IPOSDE,2,SCAT) + CALL LCMPUT(KPMAC,'NJJS'//CM,NMIL,1,NJJM) + CALL LCMPUT(KPMAC,'IJJS'//CM,NMIL,1,IJJM) + CALL LCMPUT(KPMAC,'IPOS'//CM,NMIL,1,IPOS) + CALL LCMPUT(KPMAC,'SIGW'//CM,NMIL,2,GAR) + ENDDO + DEALLOCATE(GAR,SCAT) + ELSE + CALL LCMPUT(KPMAC,NOMREA(IREA),NMIL,2,XS(1,IGR,IREA)) + ENDIF + ENDDO ! end of loop over reactions + IF(LSTRD) THEN + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + VREAL(:)=TOTAL(:,IGR)-SIGS(:,IGR,2) + ELSE + VREAL(:)=TOTAL(:,IGR) + ENDIF + DO IBM=1,NMIL + DIFF(IBM,IGR)=1.0/(3.0*VREAL(IBM)) + ENDDO + LDIFF=.TRUE. + ENDIF + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + IF(IGR.EQ.NGROUP) ITRANC=2 + CALL LCMPUT(KPMAC,'TRANC',NMIL,2,SIGS(1,IGR,2)) + ENDIF + IF(LDIFF) CALL LCMPUT(KPMAC,'DIFF',NMIL,2,DIFF(1,IGR)) + IF(LHFACT) CALL LCMPUT(KPMAC,'H-FACTOR',NMIL,2,EFACT(1,IGR)) + ENDDO + DEALLOCATE(VREAL) +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(INVELS,BETAR,CHIRS,LAMB) + DEALLOCATE(ADR,FAG,XS,SS2D,SIGS,EFACT,NWT0,LXS) + DEALLOCATE(NOMISO,NOMREA) +*---- +* SAVE SCATTERING P0 AND TOTAL CROSS SECTION INFO +*---- + DO IGR=1,NGROUP + KPMAC=LCMDIL(JPMAC,IGR) + CALL LCMPUT(KPMAC,'SIGS00',NMIL,2,SIGS0(1,IGR)) + CALL LCMPUT(KPMAC,'NTOT0',NMIL,2,TOTAL(1,IGR)) + ENDDO +*---- +* WRITE STATE VECTOR +*---- + IF(IMPX.GT.1) THEN + WRITE(6,'(32H SPHMPO: fissile isotope index =,I4)') IFISS + WRITE(6,'(37H SPHMPO: transport correction index =,I4)') ITRANC + ENDIF + TEXT12='L_MACROLIB' + CALL LCMPTC(IPMAC,'SIGNATURE',12,TEXT12) + ISTATE(:NSTATE)=0 + ISTATE(1)=NGROUP + ISTATE(2)=NMIL + ISTATE(3)=NL ! 1+scattering anisotropy + ISTATE(4)=IFISS + ISTATE(5)=NED + ISTATE(6)=ITRANC + ISTATE(8)=NALBP + IF(LDIFF) ISTATE(9)=1 + ISTATE(12)=IDF ! ADF information + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(NED.GT.0) CALL LCMPTC(IPMAC,'ADDXSNAME-P0',8,NED,HEDI) + DEALLOCATE(HEDI) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(FMASL,DIFF,TOTAL,SIGS0) + DEALLOCATE(IJJM,NJJM,IPOS) + RETURN + END |
