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/MPOCA2.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MPOCA2.f')
| -rw-r--r-- | Dragon/src/MPOCA2.f | 1012 |
1 files changed, 1012 insertions, 0 deletions
diff --git a/Dragon/src/MPOCA2.f b/Dragon/src/MPOCA2.f new file mode 100644 index 0000000..3fd0927 --- /dev/null +++ b/Dragon/src/MPOCA2.f @@ -0,0 +1,1012 @@ +*DECK MPOCA2 + SUBROUTINE MPOCA2(IPMPO,IPEDIT,HEDIT,NREA,NISO,NADRX,NED,NPRC, + 1 ILEAK,NG,NMIL,NL,ITRANC,NALBP,IMC,NBISO,ICAL,MAXRDA,MAXIDA, + 2 FNORM,IMPX,NISOTS,NISFS,NISPS,VOLMIL,FLXMIL) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the cross sections of an elementary calculation. +* +*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. +* IPEDIT pointer to the edition object (L_EDIT signature). +* HEDIT name of output group for a (multigroup mesh, output geometry) +* couple (generally equal to 'output_0'). +* NREA number of requested reactions. +* NISO number of particularized isotopes. +* NADRX total number of ADRX sets. +* NED number of additional edition cross sections. +* NPRC number of delayed neutron precursors. +* ILEAK type of leakage (=0/1: off/diffusion coefficients). +* NG number of condensed energy groups. +* NMIL number of mixtures in the MPO file. +* NL number of Legendre orders. +* ITRANC type of transport correction. +* NALBP number of physical albedos per energy group. +* IMC type of macro-calculation (1 for diffusion or SPN; +* 2 other method). +* NBISO number of isotopes in the condensed microlib of the edition +* object. A given isotope may appear in many mixtures. +* ICAL index of the current elementary calculation. +* MAXRDA dimension of RDATAX array. +* MAXIDA dimension of IDATAP array. +* FNORM flux normalization factor. +* IMPX print parameter. +* +*Parameters: output +* NISOTS number of distinct isotopes. +* NISFS number of particularized fissile isotopes. +* NISPS number of particularized fission products. +* VOLMIL mixture volumes. +* FLXMIL averaged flux of mixtures. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMPO,IPEDIT + INTEGER NREA,NISO,NADRX,NED,NPRC,ILEAK,NG,NMIL,NL,ITRANC,NALBP, + 1 IMC,NBISO,ICAL,MAXRDA,MAXIDA,IMPX,NISOTS,NISFS,NISPS + REAL FNORM,VOLMIL(NMIL),FLXMIL(NMIL,NG) + CHARACTER(LEN=12) HEDIT +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NREAK=50,MAXISO=800) + TYPE(C_PTR) JPEDIT,KPEDIT,IPTEMP,KPTEMP + INTEGER FGYS(2),RANK,TYPE,NBYTE,DIMSR(5),ADDRZI + CHARACTER ISOTS(MAXISO)*8,CM*2,TEXT8*8,TEXT12*12,HSMG*131, + 1 RECNAM*80 + LOGICAL EXIST,LSPH + DOUBLE PRECISION CONV +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDATAP,IFD1,IAD1,IFD2, + 1 IAD2,IJJ1,NJJ1,IPOS,IJJ2,NJJ2,MIX,ITYPE,IDATAP_MIL,VINTE1D + INTEGER, ALLOCATABLE, DIMENSION(:) :: REACTION,ISOTOPE + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ISONAM,OUPUTID + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: ADRX,VINTE3D + REAL, ALLOCATABLE, DIMENSION(:) :: RDATAX,OVERV,WORKD,WORK1, + 1 WORK2,DEN,DENISO,CONCES,DECAYC,ENERG,VREAL + REAL, ALLOCATABLE, DIMENSION(:,:) :: DNUSIG,DCHI,DATA1,DATA2, + 1 DATA4,SPH + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: DATA3 + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: TEXT24,NOMREA, + 1 NOMISO + TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPISO +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ADRX(NREA+3,NISO,NADRX+NMIL),IDATAP(MAXIDA),IFD1(NG), + 1 IAD1(NG+1),IFD2(NG),IAD2(NG+1),IJJ1(NMIL),NJJ1(NMIL), + 2 IPOS(NMIL),IJJ2(NG),NJJ2(NG),ISONAM(3,NBISO),MIX(NBISO), + 3 ITYPE(NBISO),IDATAP_MIL((2*NG+1)*NISO)) + ALLOCATE(RDATAX(MAXRDA),OVERV(NG),DNUSIG(NG,NPRC+1), + 1 DCHI(NG,NPRC),WORKD(NPRC),WORK1(NG*NMIL+1),WORK2(NG), + 2 DATA1(NG,NREA),DATA2(NG,NL),DATA3(NG,NG,NL),DATA4(NG,NG), + 3 DEN(NBISO),DENISO(NISO),CONCES(NBISO)) +* + CONV=1.0D6 ! convert MeV to eV in H-FACTOR + IF(NREA.GT.NREAK) CALL XABORT('MPOCA2: NOMREA OVERFLOW.') +*---- +* SET ENERGY MESH AND ZONE VOLUMES +*---- + CALL hdf5_read_data(IPMPO,"/energymesh/NENERGYMESH",NENERG) + CALL hdf5_read_data(IPMPO,"/geometry/NGEOMETRY",NGEOME) + CALL hdf5_read_data(IPMPO,"/output/OUPUTID",OUPUTID) + READ(HEDIT,'(7X,I2)') ID + ID_G=-1 + ID_E=-1 + DO I=1,NGEOME + DO J=1,NENERG + IF(OUPUTID(J,I).EQ.ID) THEN + ID_G=I-1 + ID_E=J-1 + GO TO 10 + ENDIF + ENDDO + ENDDO + CALL XABORT('MPOCA2: no ID found in /output/OUPUTID.') + 10 WRITE(RECNAM,'(23H/energymesh/energymesh_,I0,1H/)') ID_E + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NG",NG2) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ENERGY",ENERG) + IF(SIZE(ENERG,1)-1.NE.NG) CALL XABORT('MPOCA2: INVALID NG VALUE.') + DO 20 IGR=1,NG+1 + ENERG(IGR)=ENERG(IGR)/1.0E-6 + 20 CONTINUE + WRITE(RECNAM,'(19H/geometry/geometry_,I0,1H/)') ID_G + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEVOLUME",VREAL) + VOLMIL(:)=VREAL(:) + DEALLOCATE(VREAL) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NZONE",NMIL2) + IF(NMIL.NE.NMIL2) THEN + WRITE(HSMG,'(42HMPOCA2: ELEMENTARY CALCULATION WITH AN INV, + 1 22HALIB NB. OF MIXTURES =,I7,3H NE,I7,1H.)') NMIL2,NMIL + CALL XABORT(HSMG) + ELSE IF(NG.NE.NG2) THEN + WRITE(HSMG,'(42HMPOCA2: ELEMENTARY CALCULATION WITH AN INV, + 1 20HALIB NB. OF GROUPS =,I7,3H NE,I7,1H.)') NG2,NG + CALL XABORT(HSMG) + ENDIF +*---- +* CREATE DUMMY DAYASETS REACTION AND ISOTOPE +*---- + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"REACTION",REACTION) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ISOTOPE",ISOTOPE) +*---- +* RECOVER INFORMATION FROM THE info and contents GROUPS. +*---- + ALLOCATE(NOMREA(NREA+2),NOMISO(NISO)) + IF(NREA.GT.0) THEN + CALL hdf5_read_data(IPMPO,"/contents/reactions/REACTIONAME", + > TEXT24) + DO 30 I=1,NREA + NOMREA(I)=TEXT24(REACTION(I)+1) + 30 continue + DEALLOCATE(TEXT24,REACTION) + ENDIF + CALL hdf5_read_data(IPMPO,"/contents/isotopes/ISOTOPENAME",TEXT24) + DO 40 I=1,NISO + NOMISO(I)=TEXT24(ISOTOPE(I)+1) + 40 CONTINUE + DEALLOCATE(TEXT24,ISOTOPE) + IF(IMPX.GT.2) THEN + WRITE(6,'(/24H MPOCA2: reaction names:)') + DO 50 I=1,NREA + WRITE(6,'(5X,7HNOMREA(,I3,2H)=,A)') I,TRIM(NOMREA(I)) + 50 CONTINUE + WRITE(6,'(/23H MPOCA2: isotope names:)') + DO 60 I=1,NISO + WRITE(6,'(5X,7HNOMISO(,I3,2H)=,A)') I,TRIM(NOMISO(I)) + 60 CONTINUE + ENDIF +*---- +* RECOVER NADRI AND IDATAP. +* NADRI IS THE TOTAL NUMBER OF TRANSPROFILE SETS. +*---- + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + NADRI=0 + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"TRANSPROFILE",RANK,TYPE,NBYTE, + 1 DIMSR) + IF(TYPE.NE.99) THEN + NADRI=DIMSR(1)/(2*NG+1) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"TRANSPROFILE",VINTE1D) + IDATAP(:DIMSR(1))=VINTE1D(:DIMSR(1)) + DEALLOCATE(VINTE1D) + ENDIF +*---- +* RECOVER INFORMATION FROM THE output_id/info GROUP. +*---- + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"ADDRXS",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRXS",VINTE3D) + IF(NADRX.NE.DIMSR(3)) CALL XABORT('MPOCA2: INVALID NADRX.') + ADRX(:,:,:NADRX)=VINTE3D(:,:,:NADRX) + DEALLOCATE(VINTE3D) + ENDIF +*---- +* SAVE INFORMATION TO THE /output/output_id/statept_id/zone_id/yields/ +* GROUP. +*---- + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0)') TRIM(HEDIT),ICAL-1 + CALL hdf5_create_group(IPMPO,TRIM(RECNAM)) + DO 70 IMIL=1,NMIL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + > TRIM(HEDIT),ICAL-1,IMIL-1 + NMGF=1 + CALL hdf5_create_group(IPMPO,TRIM(RECNAM)) + IF(NBISO.GT.0) THEN + FGYS(1)=0 + FGYS(2)=1 + CALL hdf5_create_group(IPMPO,TRIM(RECNAM)//"yields") + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"yields/NMGF",NMGF) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"yields/YIELDGROUP", + > FGYS) + ENDIF + 70 CONTINUE +*---- +* FIND THE NUMBER AND NAMES OF THE ISOTOPES IN THE OUTPUT TABLES. +*---- + IF(NBISO.GT.0) THEN + CALL LCMGET(IPEDIT,'ISOTOPESUSED',ISONAM) + CALL LCMGET(IPEDIT,'ISOTOPESMIX',MIX) + CALL LCMGET(IPEDIT,'ISOTOPESDENS',DEN) + CALL LCMGET(IPEDIT,'ISOTOPESTYPE',ITYPE) + ENDIF + NISOTS=0 + DO 90 IBISO=1,NBISO + IF(MIX(IBISO).EQ.0) GO TO 90 + WRITE(TEXT12,'(3A4)') (ISONAM(I0,IBISO),I0=1,3) + DO 80 ISO=1,NISOTS + IF(TEXT12(:8).EQ.ISOTS(ISO)) GO TO 90 + 80 CONTINUE + NISOTS=NISOTS+1 + IF(NISOTS.GT.MAXISO) CALL XABORT('MPOCA2: ISOTS OVERFLOW.') + IF(NISOTS.GT.NBISO) CALL XABORT('MPOCA2: CONCES OVERFLOW.') + ISOTS(NISOTS)=TEXT12(:8) + 90 CONTINUE +*---- +* RECOVER INVERSE OF SPH EQUIVALENCE FACTORS. +*---- + CALL LCMSIX(IPEDIT,'MACROLIB',1) + JPEDIT=LCMGID(IPEDIT,'GROUP') + LSPH=.FALSE. + ALLOCATE(SPH(NMIL,NG)) + DO 120 IGR=1,NG + KPEDIT=LCMGIL(JPEDIT,IGR) + CALL LCMLEN(KPEDIT,'NSPH',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + LSPH=.TRUE. + CALL LCMGET(KPEDIT,'NSPH',WORK1) + DO 100 IMIL=1,NMIL + SPH(IMIL,IGR)=1.0/WORK1(IMIL) + 100 CONTINUE + ELSE + DO 110 IMIL=1,NMIL + SPH(IMIL,IGR)=1.0 + 110 CONTINUE + ENDIF + 120 CONTINUE + CALL LCMSIX(IPEDIT,' ',2) +*---- +* CREATE A SPH-UNCORRECTED MICROLIB. +*---- + CALL LCMOP(IPTEMP,'*TEMPORARY*',0,1,0) + ALLOCATE(IPISO(NBISO)) + CALL LCMEQU(IPEDIT,IPTEMP) + IF(LSPH) THEN + IF(IMC.EQ.0) CALL XABORT('MPOCA2: UNDEFINED TYPE OF SPH.') + NW=1 ! NTOT1 cross section present + CALL SPHCMI(IPTEMP,0,IMC,NMIL,NBISO,NG,NL,NW,NED,NPRC,NALBP,SPH) + ENDIF + DEALLOCATE(SPH) +*---- +* FIND ISOTOPE POINTERS IN INPUT MICROLIB +*---- + IF(NBISO.GT.0) CALL LIBIPS(IPTEMP,NBISO,IPISO) +*---- +* RECOVER RADIOACTIVE DECAY CONSTANTS. +*---- + IF(ICAL.EQ.1) THEN + ALLOCATE(DECAYC(NISOTS)) + DECAYC(:NISOTS)=0.0 + DO 150 IBISO=1,NBISO + IF(MIX(IBISO).EQ.0) GO TO 150 + WRITE(TEXT12,'(3A4)') (ISONAM(I0,IBISO),I0=1,3) + IISOTS=0 + DO 130 ISO=1,NISOTS + IISOTS=ISO + IF(TEXT12(:8).EQ.ISOTS(ISO)) GO TO 140 + 130 CONTINUE + CALL XABORT('MPOCA2: UNABLE TO FIND ISOTOPE '//TEXT12//'.') + 140 DECAYC(IISOTS)=0.0 + JPEDIT=IPISO(IBISO) + IF(.NOT.C_ASSOCIATED(JPEDIT)) GO TO 150 + CALL LCMLEN(JPEDIT,'DECAY',ILONG,ITYLCM) + IF(ILONG.EQ.1) CALL LCMGET(JPEDIT,'DECAY',DECAYC(IISOTS)) + 150 CONTINUE + DO 160 ISO=1,NISOTS + DECAYC(ISO)=DECAYC(ISO)*1.0E-8 + 160 CONTINUE + CALL hdf5_write_data(IPMPO,"/contents/isotopes/DECAYCONST", + 1 DECAYC) + DEALLOCATE(DECAYC) + ENDIF +*---- +* STORE INFORMATION IN THE output_id/statept_id/addons GROUP. +*---- + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,8H/addons/)') + & TRIM(HEDIT),ICAL-1 + CALL hdf5_create_group(IPMPO,TRIM(RECNAM)) + CALL LCMSIX(IPTEMP,'MACROLIB',1) + JPEDIT=LCMGID(IPTEMP,'GROUP') + CALL LCMLEN(IPTEMP,'K-EFFECTIVE',ILONG,ITYLCM) + IF(ILONG.EQ.1) THEN + CALL LCMGET(IPTEMP,'K-EFFECTIVE',FLOTT) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"KEFF",FLOTT) + ENDIF + CALL LCMLEN(IPTEMP,'K-INFINITY',ILONG,ITYLCM) + IF(ILONG.EQ.1) THEN + CALL LCMGET(IPTEMP,'K-INFINITY',FLOTT) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"KINF",FLOTT) + ENDIF + CALL LCMLEN(IPTEMP,'B2 B1HOM',ILONG,ITYLCM) + IF(ILONG.EQ.1) THEN + CALL LCMGET(IPTEMP,'B2 B1HOM',B2) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"B2",B2) + ENDIF + CALL LCMSIX(IPTEMP,' ',2) +*---- +* LOOP OVER MPO MIXTURES. +*---- + DO 920 IMIL=1,NMIL + IF(NADRX+1.GT.SIZE(ADRX,3)) CALL XABORT('MPOCA2: ADRX OVERFLOW.') + IOI=0 + IOR=0 + DO 165 IGR=1,NG + IFD1(IGR)=NG+1 + IAD1(IGR+1)=0 + 165 CONTINUE + DATA2(:NG,:NL)=0.0 + DATA3(:NG,:NG,:NL)=0.0 + CALL LCMSIX(IPTEMP,'MACROLIB',1) + DO 230 IGR=1,NG + KPEDIT=LCMGIL(JPEDIT,IGR) +*---- +* RECOVER THE NEUTRON FLUX. +*---- + CALL LCMGET(KPEDIT,'FLUX-INTG',WORK1) + IF(FNORM.NE.1.0) THEN + FLXMIL(IMIL,IGR)=WORK1(IMIL)*FNORM*1.0E13 + ELSE + FLXMIL(IMIL,IGR)=WORK1(IMIL) + ENDIF +*---- +* RECOVER DELAYED NEUTRON INFORMATION. +*---- + CALL LCMLEN(KPEDIT,'NUSIGF',ILONG,ITYLCM) + IF((NPRC.GT.0).AND.(ILONG.NE.0)) THEN + CALL LCMGET(KPEDIT,'NUSIGF',WORK1) + DNUSIG(IGR,NPRC+1)=WORK1(IMIL) + CALL LCMGET(KPEDIT,'OVERV',WORK1) + OVERV(IGR)=WORK1(IMIL) + DO 170 IPRC=1,NPRC + WRITE(TEXT12,'(6HNUSIGF,I2.2)') IPRC + CALL LCMGET(KPEDIT,TEXT12,WORK1) + DNUSIG(IGR,IPRC)=WORK1(IMIL) + WRITE(TEXT12,'(3HCHI,I2.2)') IPRC + CALL LCMGET(KPEDIT,TEXT12,WORK1) + DCHI(IGR,IPRC)=WORK1(IMIL) + 170 CONTINUE + ELSE + DNUSIG(:NG,:NPRC+1)=0.0 + ENDIF +* + DO 220 IREA=1,NREA + DATA1(IGR,IREA)=0.0 + IF(NOMREA(IREA).EQ.'Total') THEN + CALL LCMGET(KPEDIT,'NTOT0',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ELSE IF(NOMREA(IREA).EQ.'TotalP1') THEN + CALL LCMGET(KPEDIT,'NTOT1',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ELSE IF(NOMREA(IREA).EQ.'Absorption') THEN + CALL LCMGET(KPEDIT,'NTOT0',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + CALL LCMLEN(KPEDIT,'SIGS00',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'SIGS00',WORK1) + DATA1(IGR,IREA)=DATA1(IGR,IREA)-WORK1(IMIL) + ENDIF + CALL LCMLEN(KPEDIT,'N2N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'N2N',WORK1) + DATA1(IGR,IREA)=DATA1(IGR,IREA)+WORK1(IMIL) + ENDIF + CALL LCMLEN(KPEDIT,'N3N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'N3N',WORK1) + DATA1(IGR,IREA)=DATA1(IGR,IREA)+2.0*WORK1(IMIL) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Fission') THEN + CALL LCMLEN(KPEDIT,'NFTOT',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'NFTOT',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'FissionSpectrum') THEN + CALL LCMLEN(KPEDIT,'CHI',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'CHI',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'NuFission') THEN + CALL LCMLEN(KPEDIT,'NUSIGF',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'NUSIGF',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Energy') THEN + CALL LCMLEN(KPEDIT,'H-FACTOR',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'H-FACTOR',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL)/REAL(CONV) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'FUITES') THEN + CALL LCMLEN(KPEDIT,'DIFF',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + IF(B2.EQ.0.0) B2=1.0E-10 + CALL LCMGET(KPEDIT,'DIFF',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL)*B2 + ENDIF + ELSE IF(NOMREA(IREA).EQ.'STRD') THEN + CALL LCMLEN(KPEDIT,'DIFF',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'DIFF',WORK1) + DATA1(IGR,IREA)=1.0/(3.0*WORK1(IMIL)) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Diffusion') THEN + DO 180 IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMGET(KPEDIT,'SIGS'//CM,WORK1) + DATA2(IGR,IL)=WORK1(IMIL) + 180 CONTINUE + CALL LCMLEN(KPEDIT,'N2N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'N2N',WORK1) + DATA2(IGR,1)=DATA2(IGR,1)-WORK1(IMIL) + ENDIF + CALL LCMLEN(KPEDIT,'N3N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,'N3N',WORK1) + DATA2(IGR,1)=DATA2(IGR,1)-2.0*WORK1(IMIL) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Transport') THEN + IF((ITRANC.EQ.1).AND.(NL.GE.2)) THEN + CALL LCMGET(KPEDIT,'SIGS01',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ELSE IF(ITRANC.EQ.2) THEN + CALL LCMGET(KPEDIT,'TRANC',WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + DO 190 IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMLEN(KPEDIT,'IJJS'//CM,ILONG,ITYLCM) + IF(ILONG.EQ.0) GO TO 190 + CALL LCMGET(KPEDIT,'IJJS'//CM,IJJ1) + CALL LCMGET(KPEDIT,'NJJS'//CM,NJJ1) + DO 185 JGR=IJJ1(IMIL)-NJJ1(IMIL)+1,IJJ1(IMIL) ! IGR <-- JGR + IFD1(JGR)=MIN(IFD1(JGR),IGR) + IAD1(JGR+1)=MAX(IAD1(JGR+1),IGR) + 185 CONTINUE + 190 CONTINUE + DO 210 IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMGET(KPEDIT,'IJJS'//CM,IJJ1) + CALL LCMGET(KPEDIT,'NJJS'//CM,NJJ1) + CALL LCMGET(KPEDIT,'IPOS'//CM,IPOS) + CALL LCMGET(KPEDIT,'SCAT'//CM,WORK1) + IPO=IPOS(IMIL) + J2=IJJ1(IMIL) + J1=IJJ1(IMIL)-NJJ1(IMIL)+1 + DO 200 JGR=J2,J1,-1 + DATA3(IGR,JGR,IL)=WORK1(IPO)*REAL(2*IL-1) + IPO=IPO+1 + 200 CONTINUE + 210 CONTINUE + ELSE + CALL LCMLEN(KPEDIT,NOMREA(IREA)(:12),ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPEDIT,NOMREA(IREA),WORK1) + DATA1(IGR,IREA)=WORK1(IMIL) + ENDIF + ENDIF + 220 CONTINUE + 230 CONTINUE + IAD1(1)=0 + DO 235 IGR=1,NG + IAD1(IGR+1)=IAD1(IGR)+(IAD1(IGR+1)-IFD1(IGR)+1) + 235 CONTINUE + CALL LCMSIX(IPTEMP,' ',2) +*---- +* PROCESS PARTICULARIZED ISOTOPES +*---- + IF(NBISO.GT.0) THEN + DO 250 IISO=1,NISO + DO 240 IREA=1,NREA+3 + ADRX(IREA,IISO,NADRX+1)=-1 + 240 CONTINUE + 250 CONTINUE + CONCES(:NISOTS)=0.0 + DO 540 IBISO=1,NBISO + IF(MIX(IBISO).EQ.IMIL) THEN + WRITE(TEXT12,'(3A4)') (ISONAM(I0,IBISO),I0=1,3) + DO 260 ISO=1,NISO + IISO=ISO + IF(NOMISO(ISO).EQ.TEXT12(:8)) GO TO 270 + 260 CONTINUE + GO TO 540 + 270 IF(IISO.GT.NISO-1) CALL XABORT('MPOCA2: NISO OVERFLOW.') + KPTEMP=IPISO(IBISO) ! set IBISO-th isotope + IF(.NOT.C_ASSOCIATED(KPTEMP)) THEN + WRITE(HSMG,'(17HMPOCA2: ISOTOPE '',A12,7H'' (ISO=,I8,3H) I, + 1 32HS NOT AVAILABLE IN THE MICROLIB.)') TEXT12,IBISO + CALL XABORT(HSMG) + ENDIF + IISOTS=0 + DO 280 ISO=1,NISOTS + IISOTS=ISO + IF(ISOTS(ISO).EQ.TEXT12(:8)) GO TO 290 + 280 CONTINUE + CALL XABORT('MPOCA2: UNABLE TO FIND ISOTOPE '//TEXT12//'.') + 290 CONCES(IISOTS)=DEN(IBISO) + DENISO(IISO)=DEN(IBISO) + DO 530 IREA=1,NREA + WORK2(:NG)=0.0 + IF(NOMREA(IREA).EQ.'Total') THEN + CALL LCMGET(KPTEMP,'NTOT0',WORK2) + ELSE IF(NOMREA(IREA).EQ.'TotalP1') THEN + CALL LCMGET(KPTEMP,'NTOT1',WORK2) + ELSE IF(NOMREA(IREA).EQ.'Absorption') THEN + CALL LCMGET(KPTEMP,'NTOT0',WORK2) + CALL LCMLEN(KPTEMP,'SIGS00',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'SIGS00',WORK1) + DO 300 IGR=1,NG + WORK2(IGR)=WORK2(IGR)-WORK1(IGR) + 300 CONTINUE + ENDIF + CALL LCMLEN(KPTEMP,'N2N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'N2N',WORK1) + DO 310 IGR=1,NG + WORK2(IGR)=WORK2(IGR)+WORK1(IGR) + 310 CONTINUE + ENDIF + CALL LCMLEN(KPTEMP,'N3N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'N3N',WORK1) + DO 320 IGR=1,NG + WORK2(IGR)=WORK2(IGR)+2.0*WORK1(IGR) + 320 CONTINUE + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Nexcess') THEN + CALL LCMLEN(KPTEMP,'N2N',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(KPTEMP,'N2N',WORK2) + CALL LCMLEN(KPTEMP,'N3N',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'N3N',WORK1) + DO 330 IGR=1,NG + WORK2(IGR)=WORK2(IGR)+2.0*WORK1(IGR) + 330 CONTINUE + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Fission') THEN + CALL LCMLEN(KPTEMP,'NFTOT',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(KPTEMP,'NFTOT',WORK2) + ELSE IF(NOMREA(IREA).EQ.'FissionSpectrum') THEN + CALL LCMLEN(KPTEMP,'CHI',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(KPTEMP,'CHI',WORK2) + ELSE IF(NOMREA(IREA).EQ.'NuFission') THEN + CALL LCMLEN(KPTEMP,'NUSIGF',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(KPTEMP,'NUSIGF',WORK2) + ELSE IF(NOMREA(IREA).EQ.'Energy') THEN + CALL LCMLEN(KPTEMP,'MEVF',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'NFTOT',WORK2) + CALL LCMGET(KPTEMP,'MEVF',FLOTT) + DO 340 IGR=1,NG + WORK2(IGR)=WORK2(IGR)*FLOTT + 340 CONTINUE + ENDIF + CALL LCMLEN(KPTEMP,'MEVG',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'NG',WORK1) + CALL LCMGET(KPTEMP,'MEVG',FLOTT) + DO 350 IGR=1,NG + WORK2(IGR)=WORK2(IGR)+WORK1(IGR)*FLOTT + 350 CONTINUE + ENDIF + ELSE IF(NOMREA(IREA).EQ.'FissionEnergyFission') THEN + CALL LCMLEN(KPTEMP,'MEVF',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'NFTOT',WORK2) + CALL LCMGET(KPTEMP,'MEVF',FLOTT) + DO 360 IGR=1,NG + WORK2(IGR)=WORK2(IGR)*FLOTT + 360 CONTINUE + ENDIF + ELSE IF(NOMREA(IREA).EQ.'CaptureEnergyCapture') THEN + CALL LCMLEN(KPTEMP,'MEVG',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'NG',WORK2) + CALL LCMGET(KPTEMP,'MEVG',FLOTT) + DO 370 IGR=1,NG + WORK2(IGR)=WORK2(IGR)*FLOTT + 370 CONTINUE + ENDIF + ELSE IF(NOMREA(IREA).EQ.'STRD') THEN + CALL LCMLEN(KPTEMP,'STRD',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(KPTEMP,'STRD',WORK2) + ELSE IF(NOMREA(IREA).EQ.'Diffusion') THEN + ADRX(IREA,IISO,NADRX+1)=IOR + ADRX(NREA+1,IISO,NADRX+1)=NL + IOR=IOR+NG*NL + IF(IOR.GT.MAXRDA) CALL XABORT('MPOCA2: RDATAX OVERFLOW(1)') + DO 420 IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMLEN(KPTEMP,'SIGS'//CM,ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPTEMP,'SIGS'//CM,WORK2) + ELSE + WORK2(:NG)=0.0 + ENDIF + CALL LCMLEN(KPTEMP,'N2N',ILONG,ITYLCM) + IF((IL.EQ.1).AND.(ILONG.GT.0)) THEN + CALL LCMGET(KPTEMP,'N2N',WORK1) + DO 390 IGR=1,NG + WORK2(IGR)=WORK2(IGR)-WORK1(IGR) + 390 CONTINUE + ENDIF + CALL LCMLEN(KPTEMP,'N3N',ILONG,ITYLCM) + IF((IL.EQ.1).AND.(ILONG.GT.0)) THEN + CALL LCMGET(KPTEMP,'N3N',WORK1) + DO 400 IGR=1,NG + WORK2(IGR)=WORK2(IGR)-2.0*WORK1(IGR) + 400 CONTINUE + ENDIF + DO 410 IGR=1,NG + RDATAX(ADRX(IREA,IISO,NADRX+1)+(IL-1)*NG+IGR-1)=WORK2(IGR) + 410 CONTINUE + 420 CONTINUE + GO TO 530 + ELSE IF(NOMREA(IREA).EQ.'Transport') THEN + IF((ITRANC.EQ.1).AND.(NL.GE.2)) THEN + CALL LCMGET(KPTEMP,'SIGS01',WORK2) + ELSE IF(ITRANC.EQ.2) THEN + CALL LCMGET(KPTEMP,'TRANC',WORK2) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + DO 430 IGR=1,NG + IFD2(IGR)=NG+1 + IAD2(IGR+1)=0 + 430 CONTINUE + DO 450 IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMLEN(KPTEMP,'IJJS'//CM,ILONG,ITYLCM) + IF(ILONG.EQ.0) GO TO 450 + CALL LCMGET(KPTEMP,'IJJS'//CM,IJJ2) + CALL LCMGET(KPTEMP,'NJJS'//CM,NJJ2) + DO 445 JGR=1,NG + DO 440 IGR=IJJ2(JGR)-NJJ2(JGR)+1,IJJ2(JGR) ! JGR <-- IGR + IFD2(IGR)=MIN(IFD2(IGR),JGR) + IAD2(IGR+1)=MAX(IAD2(IGR+1),JGR) + 440 CONTINUE + 445 CONTINUE + 450 CONTINUE + IAD2(1)=0 + DO 460 IGR=1,NG + IAD2(IGR+1)=IAD2(IGR)+(IAD2(IGR+1)-IFD2(IGR)+1) + 460 CONTINUE + ADRX(NREA+1,IISO,NADRX+1)=NL + ADRX(NREA+2,IISO,NADRX+1)=NL + ADRX(NREA+3,IISO,NADRX+1)=IOI + IF(IOI+2*NG+1.GT.(2*NG+1)*NISO) THEN + CALL XABORT('MPOCA2: IDATAP_MIL OVERFLOW(1).') + ENDIF + DO 470 IGR=1,NG + IDATAP_MIL(IOI+IGR)=IFD2(IGR)-1 + IDATAP_MIL(IOI+NG+IGR)=IAD2(IGR) + 470 CONTINUE + IDATAP_MIL(IOI+2*NG+1)=IAD2(NG+1) + ADRX(NREA+3,IISO,NADRX+1)=IOI + IOI=IOI+2*NG+1 +* + ADRX(IREA,IISO,NADRX+1)=IOR + IOR=IOR+IAD2(NG+1)*NL + IF(IOR.GT.MAXRDA) CALL XABORT('MPOCA2: RDATAX OVERFLOW(2)') + JOFS=0 + DO 500 IL=1,NL + CALL XDRLGS(KPTEMP,-1,0,IL-1,IL-1,1,NG,WORK2,DATA4,ITYPRO) + ZIL=REAL(2*IL-1) + DO 490 IGR=1,NG + DO 480 JGR=IFD2(IGR),IFD2(IGR)+(IAD2(IGR+1)-IAD2(IGR))-1 ! JGR <-- IGR + JOFS=JOFS+1 + RDATAX(ADRX(IREA,IISO,NADRX+1)+JOFS-1)=DATA4(JGR,IGR)*ZIL + 480 CONTINUE + 490 CONTINUE + 500 CONTINUE + GO TO 530 + ELSE + CALL LCMLEN(KPTEMP,NOMREA(IREA),ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(KPTEMP,NOMREA(IREA),WORK2) + ENDIF +* + EXIST=.FALSE. + DO 510 IGR=1,NG + EXIST=EXIST.OR.(WORK2(IGR).NE.0.0) + 510 CONTINUE + IF(EXIST) THEN + ADRX(IREA,IISO,NADRX+1)=IOR + IOR=IOR+NG + IF(IOR.GT.MAXRDA) CALL XABORT('MPOCA2: RDATAX OVERFLOW(3)') + DO 520 IGR=1,NG + RDATAX(ADRX(IREA,IISO,NADRX+1)+IGR)=WORK2(IGR) + 520 CONTINUE + ELSE + ADRX(IREA,IISO,NADRX+1)=-1 + ENDIF + 530 CONTINUE + ENDIF + 540 CONTINUE + ENDIF +*---- +* STORE MACROSCOPIC RESIDUAL (ISOTOPE NISO) CROSS SECTIONS IN RDATAX. +*---- + ADRX(NREA+1,NISO,NADRX+1)=0 + ADRX(NREA+2,NISO,NADRX+1)=0 + ADRX(NREA+3,NISO,NADRX+1)=0 + DO 680 IREA=1,NREA + IF(NOMREA(IREA).EQ.'Diffusion') THEN + ADRX(IREA,NISO,NADRX+1)=IOR + ADRX(NREA+1,NISO,NADRX+1)=NL + IOR=IOR+NG*NL + IF(IOR.GT.MAXRDA) CALL XABORT('MPOCA2: RDATAX OVERFLOW(4)') + JOFS=0 + DO 570 IL=1,NL + DO 560 IGR=1,NG + JOFS=JOFS+1 + RDATAX(ADRX(IREA,NISO,NADRX+1)+JOFS)=DATA2(IGR,IL) + 560 CONTINUE + 570 CONTINUE + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + ADRX(NREA+2,NISO,NADRX+1)=NL + ADRX(NREA+3,NISO,NADRX+1)=IOI + IF(IOI+2*NG+1.GT.(2*NG+1)*NISO) THEN + CALL XABORT('MPOCA2: IDATAP_MIL OVERFLOW(2).') + ENDIF + DO 590 IGR=1,NG + IDATAP_MIL(IOI+IGR)=IFD1(IGR)-1 + IDATAP_MIL(IOI+NG+IGR)=IAD1(IGR) + 590 CONTINUE + IDATAP_MIL(IOI+2*NG+1)=IAD1(NG+1) + ADRX(NREA+3,NISO,NADRX+1)=IOI + IOI=IOI+2*NG+1 +* + ADRX(IREA,NISO,NADRX+1)=IOR + IOR=IOR+IAD1(NG+1)*NL + IF(IOR.GT.MAXRDA) CALL XABORT('MPOCA2: RDATAX OVERFLOW(5)') + JOFS=0 + DO 630 IL=1,NL + DO 620 IGR=1,NG + DO 610 JGR=IFD1(IGR),IFD1(IGR)+(IAD1(IGR+1)-IAD1(IGR))-1 ! JGR <-- IGR + JOFS=JOFS+1 + RDATAX(ADRX(IREA,NISO,NADRX+1)+JOFS)=DATA3(JGR,IGR,IL) + 610 CONTINUE + 620 CONTINUE + 630 CONTINUE + ELSE + EXIST=.FALSE. + DO 650 IGR=1,NG + EXIST=EXIST.OR.(DATA1(IGR,IREA).NE.0.0) + 650 CONTINUE + IF(EXIST) THEN + ADRX(IREA,NISO,NADRX+1)=IOR + IOR=IOR+NG + IF(IOR.GT.MAXRDA) CALL XABORT('MPOCA2: RDATAX OVERFLOW(6)') + DO 660 IGR=1,NG + RDATAX(ADRX(IREA,NISO,NADRX+1)+IGR)=DATA1(IGR,IREA) + 660 CONTINUE + ELSE + ADRX(IREA,NISO,NADRX+1)=-1 + ENDIF + ENDIF + 680 CONTINUE +*---- +* REMOVE PARTICULARIZED ISOTOPIC CONTRIBUTIONS FROM MACROS. +* ISOTOPE NISO IS THE MACROSCOPIC RESIDUAL. +*---- + IF(NBISO.GT.0) THEN + DO 750 IREA=1,NREA + IMACR=ADRX(IREA,NISO,NADRX+1) + IF(IMACR+(IAD1(NG+1)-1)*NL-1.GT.MAXRDA) THEN + CALL XABORT('MPOCA2: RDATAX OVERFLOW(6).') + ENDIF + IF(IMACR.EQ.-1) GO TO 750 + IGRTOT=NG + IF(NOMREA(IREA).EQ.'Diffusion') IGRTOT=NG*NL + IF(NOMREA(IREA).EQ.'FissionSpectrum') GO TO 750 + DO 740 IISO=1,NISO-1 + IF(DENISO(IISO).EQ.0.0) GO TO 740 + JMACR=ADRX(IREA,IISO,NADRX+1) + IF(JMACR.EQ.-1) GO TO 740 + IF(NOMREA(IREA).EQ.'Scattering') THEN + IOI=ADRX(NREA+3,IISO,NADRX+1) + DO 690 IGR=1,NG + IFD2(IGR)=IDATAP_MIL(IOI+IGR)+1 + IAD2(IGR)=IDATAP_MIL(IOI+NG+IGR) + 690 CONTINUE + IAD2(NG+1)=IDATAP_MIL(IOI+2*NG+1) + JOFS=0 + DO 720 IL=1,NL + DO 710 IGR=1,NG + DO 700 JGR=IFD2(IGR),IFD2(IGR)+(IAD2(IGR+1)-IAD2(IGR)) ! JGR <-- IGR + I=(IL-1)*(IAD1(NG+1)-1)+IAD1(IGR)+JGR-IFD1(IGR) + JOFS=JOFS+1 + RDATAX(IMACR+I-1)=RDATAX(IMACR+I-1)-DENISO(IISO)* + 1 RDATAX(JMACR+JOFS-1) + 700 CONTINUE + 710 CONTINUE + 720 CONTINUE + ELSE + DO 730 IGR=1,IGRTOT + RDATAX(IMACR+IGR-1)=RDATAX(IMACR+IGR-1)-DENISO(IISO)* + 1 RDATAX(JMACR+IGR-1) + 730 CONTINUE + ENDIF + 740 CONTINUE + 750 CONTINUE + ENDIF + DENISO(NISO)=1.0 +*---- +* TRY TO FIND AN EXISTING IDATAP SET. OTHERWISE, CREATE A NEW ONE. +* STORE INFORMATION IN THE ADRX(NREA+3,IISO,NADRX+1) DATASET. +* NADRI IS THE TOTAL NUMBER OF TRANSPROFILE SETS. +*---- + DO 780 IISO=1,NISO + IOI=ADRX(NREA+3,IISO,NADRX+1) + DO 770 IAD1X=0,NADRI-1 + DO 760 I=1,2*NG+1 + IF(IDATAP_MIL(IOI+I).NE.IDATAP(IAD1X*(2*NG+1)+I)) GO TO 770 + 760 CONTINUE + ADRX(NREA+3,IISO,NADRX+1)=IAD1X*(2*NG+1) + GO TO 780 + 770 CONTINUE + IF((NADRI+1)*(2*NG+1).GT.MAXIDA) THEN + CALL XABORT('MPOCA2: IDATAP OVERFLOW.') + ENDIF + DO I=1,2*NG+1 + IDATAP(NADRI*(2*NG+1)+I)=IDATAP_MIL(IOI+I) + ENDDO + ADRX(NREA+3,IISO,NADRX+1)=NADRI*(2*NG+1) + NADRI=NADRI+1 + 780 CONTINUE +*---- +* TRY TO FIND AN EXISTING ADRX SET. OTHERWISE, CREATE A NEW ONE. +* STORE INFORMATION IN THE output_id/statept_id/zone_id GROUP. +* "ADDRZI" is the index in ADDRISO[NADDRISO+1]-->ISOTOPE +* "ADDRZX" is the index in ADDRXS[NREA+3,NISO,NADRX+1]-->CROSSEXTION +*---- + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + 1 TRIM(HEDIT),ICAL-1,IMIL-1 + DO 810 IAD1X=1,NADRX + DO 800 I=1,NREA+3 + DO 790 J=1,NISO + IF(ADRX(I,J,NADRX+1).NE.ADRX(I,J,IAD1X)) GO TO 810 + 790 CONTINUE + 800 CONTINUE + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"ADDRZX",IAD1X-1) + GO TO 820 + 810 CONTINUE + NADRX=NADRX+1 + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"ADDRZX",NADRX-1) + 820 ADDRZI=0 + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"ADDRZI",ADDRZI) +*---- +* STORE FLUX, CROSS SECTIONS AND NUMBER DENSITIES. +*---- + WORK2(:)=FLXMIL(IMIL,:) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"ZONEFLUX",WORK2) + IF(IOR.GT.0) THEN + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"CROSSECTION", + 1 RDATAX(:IOR)) + ENDIF + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"CONCENTRATION",DENISO) +*---- +* STORE INFORMATION IN THE output_id/statept_id/zone_id/leakage GROUP. +*---- + IF(ILEAK.EQ.1) THEN + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0, + 1 9H/leakage/)') TRIM(HEDIT),ICAL-1,IMIL-1 + DO 830 IGR=1,NG + KPEDIT=LCMGIL(JPEDIT,IGR) + CALL LCMLEN(KPEDIT,'DIFF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('MPOCA2: MISSING DIFF INFO.') + CALL LCMGET(KPEDIT,'DIFF',WORK1) + WORK2(IGR)=WORK1(IMIL) + 830 CONTINUE + CALL hdf5_create_group(IPMPO,TRIM(RECNAM)) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"BUCKLING",B2) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"DIFFCOEF",WORK2) + WORK2(:)=WORK2(:)*B2 + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"DB2",WORK2) + ENDIF +*---- +* STORE INFORMATION IN THE output_id/statept_id/zone_id/kinetics GROUP. +*---- + IF(NPRC.GT.0) THEN + EXIST=.FALSE. + DO 850 IPRC=1,NPRC + DO 840 IGR=1,NG + EXIST=EXIST.OR.(DNUSIG(IGR,IPRC).NE.0.0) + 840 CONTINUE + 850 CONTINUE + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0, + 1 10H/kinetics/)') TRIM(HEDIT),ICAL-1,IMIL-1 + IF(EXIST) THEN + CALL LCMSIX(IPTEMP,'MACROLIB',1) + CALL LCMGET(IPTEMP,'LAMBDA-D',WORKD) + CALL LCMSIX(IPTEMP,' ',2) + CALL hdf5_create_group(IPMPO,TRIM(RECNAM)) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"LAMBDAD",WORKD) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"CHID",DCHI) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"INVERSESPEED", + 1 OVERV) + TGENRS=0.0 + DENOM=0.0 + DO 860 IGR=1,NG + TGENRS=TGENRS+OVERV(IGR)*FLXMIL(IMIL,IGR) + DENOM=DENOM+DNUSIG(IGR,NPRC+1)*FLXMIL(IMIL,IGR) + 860 CONTINUE + TGENRS=TGENRS/DENOM + DO 880 IPRC=1,NPRC + WORKD(IPRC)=0.0 + DO 870 IGR=1,NG + WORKD(IPRC)=WORKD(IPRC)+DNUSIG(IGR,IPRC)*FLXMIL(IMIL,IGR) + 870 CONTINUE + WORKD(IPRC)=WORKD(IPRC)/DENOM + 880 CONTINUE + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"BETADF",WORKD) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"GENERATIONTIME", + 1 TGENRS) + ENDIF + ENDIF +*---- +* STORE INFORMATION IN THE output_id/statept_id/zone_id/yields GROUP. +*---- + NISFS=0 + NISPS=0 + IF(NBISO.GT.0) THEN + DO 910 ISO=1,NISO-1 + DO 890 IBISO=1,NBISO + WRITE(TEXT8,'(2A4)') (ISONAM(I0,IBISO),I0=1,2) + IF(NOMISO(ISO).EQ.TEXT8) THEN + ITY=ITYPE(IBISO) + GO TO 900 + ENDIF + 890 CONTINUE + GO TO 910 + 900 IF(ITY.EQ.2) THEN + NISFS=NISFS+1 + ELSE IF(ITY.EQ.3) THEN + NISPS=NISPS+1 + ENDIF + 910 CONTINUE + NISFS=NISFS+1 ! declare the residual as fissile + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + > TRIM(HEDIT),ICAL-1,IMIL-1 + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"yields/NISF",NISFS) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"yields/NISP",NISPS) + ENDIF +*---- +* END OF LOOP OVER MPO MIXTURES. +*---- + 920 CONTINUE + DEALLOCATE(IPISO) + CALL LCMCL(IPTEMP,2) +*---- +* STORE INFORMATION IN THE output_id/info GROUP. +*---- + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + IF((ICAL.EQ.1).AND.(NADRI.GT.0)) THEN + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"TRANSPROFILE", + 1 IDATAP(:NADRI*(2*NG+1))) + ENDIF + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"NADDRXS",NADRX) + CALL hdf5_write_data(IPMPO,TRIM(RECNAM)//"ADDRXS", + 1 ADRX(:,:,:NADRX)) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(NOMISO,NOMREA) + DEALLOCATE(CONCES,DENISO,DEN,DATA4,DATA3,DATA2,DATA1,WORK2,WORK1, + 1 WORKD,DCHI,DNUSIG,OVERV,RDATAX) + DEALLOCATE(IDATAP_MIL,ITYPE,MIX,ISONAM,NJJ2,IJJ2,IPOS,NJJ1,IJJ1, + 1 IAD2,IFD2,IAD1,IFD1,IDATAP,ADRX) + RETURN + END |
