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 /Donjon/src/MCRMAC.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/MCRMAC.f')
| -rw-r--r-- | Donjon/src/MCRMAC.f | 525 |
1 files changed, 525 insertions, 0 deletions
diff --git a/Donjon/src/MCRMAC.f b/Donjon/src/MCRMAC.f new file mode 100644 index 0000000..5c819da --- /dev/null +++ b/Donjon/src/MCRMAC.f @@ -0,0 +1,525 @@ +*DECK MCRMAC + SUBROUTINE MCRMAC(IPMAC,IPMPO,IACCS,NMIL,NMIX,NGRP,LADFM,IMPX, + 1 HEQUI,HMASL,NCAL,HEDIT,NSURFD,NALBP,ILUPS,MIXC,TERP,LPURE,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the Macrolib by scanning the NCAL elementary calculations of +* a HDF5 file and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAC address of the output Macrolib LCM object. +* IPMPO pointer to the MPO file. +* IACCS =0 macrolib is created; =1 ... is updated. +* NMIL number of material mixtures in the MPO file. +* NMIX maximum number of material mixtures in the Macrolib. +* NGRP number of energy groups. +* LADFM type of discontinuity factors (.true.: diagonal; .false.: GxG). +* 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. +* NCAL number of elementary calculations in the MPO file. +* HEDIT name of output group for a (multigroup mesh, output geometry) +* couple (generally equal to 'output_0'). +* NSURFD number of discontinuity factors. +* NALBP number of physical albedos per energy group. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* MIXC mixture index in the MPO file corresponding to each Microlib. +* mixture. Equal to zero if a Microlib mixture is not updated. +* TERP interpolation factors. +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* B2 buckling. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC,IPMPO + INTEGER IACCS,NMIL,NMIX,NGRP,IMPX,NCAL,NSURFD,NALBP,ILUPS, + 1 MIXC(NMIX) + REAL TERP(NCAL,NMIX),B2 + LOGICAL LADFM,LPURE + CHARACTER(LEN=80) HEQUI,HMASL + CHARACTER(LEN=12) HEDIT +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAX1D=40 + INTEGER, PARAMETER::MAX2D=20 + INTEGER, PARAMETER::MAXED=30 + INTEGER, PARAMETER::MAXNFI=1 + INTEGER, PARAMETER::MAXNL=6 + INTEGER, PARAMETER::NSTATE=40 + INTEGER, PARAMETER::MAXRES=MAX1D-8 + INTEGER I, J, I1D, I2D, IBM, IBMOLD, ICAL, IDEL, IDF, IED, IGMAX, + & IGMIN, IGR, JGR, IL, ILONG, IOF, IPOSDE, ITRANC, ITYLCM, LENGTH, + & N1D, N2D, NDEL, NED, NEDTMP, NF, NFTMP, NL, NLTMP, IMC, ID, ID_E, + & ID_G, NENERG, NGEOME, IACCOLD, NALBP2, RANK, NBYTE, TYPE, + & DIMSR(5) + REAL FLOTVA, WEIGHT, B2R + TYPE(C_PTR) JPMAC,KPMAC,IPTMP,JPTMP,KPTMP + INTEGER ISTATE(NSTATE) + LOGICAL LMAKE1(MAX1D),LMAKE2(MAX2D),LWD,LALBG + CHARACTER TEXT8*8,TEXT12*12,CM*2,HMAK1(MAX1D)*12,HMAK2(MAX2D)*12, + 1 HVECT(MAXED)*8,RECNAM*80 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,IJJB,NJJB,IPOSB + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: OUPUTID + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,GAR4B,WORK1,WORK2,VOLMI2, + 1 ENERG,VOSAP,WDLA + REAL, ALLOCATABLE, DIMENSION(:,:) :: SPH + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAR1 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: GAR2,GAR3 + REAL, POINTER, DIMENSION(:) :: FLOT + TYPE(C_PTR) FLOT_PTR +*---- +* DATA STATEMENTS +*---- + DATA HMAK1 / 'FLUX-INTG','NTOT0','OVERV','DIFF','FLUX-INTG-P1', + 1 'NTOT1','H-FACTOR','TRANC',MAXRES*' '/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IJJ(NMIX),NJJ(NMIX),IPOS(NMIX),IJJB(NMIL),NJJB(NMIL), + 1 IPOSB(NMIL)) + ALLOCATE(GAR1(NMIX,NGRP,MAX1D),GAR2(NMIX,MAXNFI,NGRP,MAX2D), + 1 GAR3(NMIX,NGRP,NGRP,MAXNL),GAR4(NMIX*NGRP),GAR4B(NMIL*NGRP), + 2 VOLMI2(NMIX)) + IACCOLD=IACCS ! for ADF +*---- +* MACROLIB INITIALIZATION +*---- + LMAKE1(:MAX1D)=.FALSE. + LMAKE2(:MAX2D)=.FALSE. + GAR1(:NMIX,:NGRP,:MAX1D)=0.0 + GAR2(:NMIX,:MAXNFI,:NGRP,:MAX2D)=0.0 + GAR3(:NMIX,:NGRP,:NGRP,:MAXNL)=0.0 + VOLMI2(:NMIX)=0.0 + IBMOLD=0 + N1D=0 + N2D=0 + NDEL=0 + NL=0 + NF=0 + NED=0 + ITRANC=0 + IDF=0 + N1D=0 + N2D=0 +*---- +* READ EXISTING MACROLIB INFORMATION +*---- + IF(IACCS.EQ.0) THEN + TEXT12='L_MACROLIB' + CALL LCMPTC(IPMAC,'SIGNATURE',12,TEXT12) + ELSE + CALL LCMGTC(IPMAC,'SIGNATURE',12,TEXT12) + IF(TEXT12.NE.'L_MACROLIB') THEN + CALL XABORT('MCRMAC: SIGNATURE OF INPUT MACROLIB IS '//TEXT12 + 1 //'. L_MACROLIB EXPECTED.') + ENDIF + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF ENERGY GROUPS(2).') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF MIXTURES(2).') + ENDIF + NL=ISTATE(3) + NF=ISTATE(4) + IF(NF.GT.MAXNFI) CALL XABORT('MCRMAC: MAXNFI OVERFLOW(1).') + NED=ISTATE(5) + ITRANC=ISTATE(6) + NDEL=ISTATE(7) + IDF=ISTATE(12) + IF(NED.GT.MAXED) CALL XABORT('MCRMAC: MAXED OVERFLOW(1).') + CALL LCMGTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + N1D=8+NED+NL + N2D=2*(NDEL+1) + IF(NL.GT.MAXNL) CALL XABORT('MCRMAC: MAXNL OVERFLOW(1).') + IF(N1D.GT.MAX1D) CALL XABORT('MCRMAC: MAX1D OVERFLOW(1).') + IF(N2D.GT.MAX2D) CALL XABORT('MCRMAC: MAX2D OVERFLOW(1).') + DO 10 IED=1,NED + HMAK1(8+IED)=HVECT(IED) + 10 CONTINUE + DO 20 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+NED+IL)='SIGS'//CM + 20 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 30 IDEL=1,NDEL + WRITE(TEXT8,'(6HNUSIGF,I2.2)') IDEL + HMAK2(2+2*(IDEL-1)+1)=TEXT8 + WRITE(TEXT8,'(3HCHI,I2.2)') IDEL + HMAK2(2+2*(IDEL-1)+2)=TEXT8 + 30 CONTINUE + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + JPMAC=LCMGID(IPMAC,'GROUP') + DO 150 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + DO 60 I1D=1,N1D + CALL LCMLEN(KPMAC,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(KPMAC,HMAK1(I1D),GAR1(1,IGR,I1D)) + DO 50 IBM=1,NMIX + DO 40 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=0.0 + 40 CONTINUE + 50 CONTINUE + ENDIF + 60 CONTINUE + DO 100 I2D=1,N2D + CALL LCMLEN(KPMAC,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(KPMAC,HMAK2(I2D),GAR2(1,1,IGR,I2D)) + DO 90 I=1,NF + DO 80 IBM=1,NMIX + DO 70 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR2(IBM,I,IGR,I2D)=0.0 + 70 CONTINUE + 80 CONTINUE + 90 CONTINUE + ENDIF + 100 CONTINUE + DO 140 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + ILONG=1 + IF(IL.GT.1) CALL LCMLEN(KPMAC,'SCAT'//CM,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(KPMAC,'SCAT'//CM,GAR4) + CALL LCMGET(KPMAC,'NJJS'//CM,NJJ) + CALL LCMGET(KPMAC,'IJJS'//CM,IJJ) + CALL LCMGET(KPMAC,'IPOS'//CM,IPOS) + DO 130 IBM=1,NMIX + IPOSDE=IPOS(IBM) + DO 120 JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR4(IPOSDE) + DO 110 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR3(IBM,JGR,IGR,IL)=0.0 + 110 CONTINUE + IPOSDE=IPOSDE+1 + 120 CONTINUE + 130 CONTINUE + ENDIF + 140 CONTINUE + 150 CONTINUE + ENDIF +*---- +* 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=0 + ID_E=0 + 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 160 + ENDIF + ENDDO + ENDDO + CALL XABORT('MCRMAC: no ID found in /output/OUPUTID.') + 160 WRITE(RECNAM,'(23H/energymesh/energymesh_,I0)') ID_E + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"/ENERGY",ENERG) + IF(SIZE(ENERG,1)-1.NE.NGRP) CALL XABORT('MCRMAC: INVALID NGRP VA' + 1 //'LUE.') + DO IGR=1,NGRP+1 + ENERG(IGR)=ENERG(IGR)/1.0E-6 + ENDDO + WRITE(RECNAM,'(19H/geometry/geometry_,I0,1H/)') ID_G + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEVOLUME",VOSAP) +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + DO 300 ICAL=1,NCAL + DO 170 IBM=1,NMIX ! mixtures in Macrolib + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.NE.0.0) GO TO 180 + 170 CONTINUE + GO TO 300 +*---- +* PRODUCE AN ELEMENTARY MACROLIB +*---- + 180 CALL LCMOP(IPTMP,'*ELEMENTARY*',0,1,0) + ALLOCATE(SPH(NMIL+NALBP,NGRP)) + CALL LCMPUT(IPTMP,'ENERGY',NGRP+1,2,ENERG) + B2R=B2 + CALL SPHMPO(IPMPO,IPTMP,ICAL,IMPX,HEQUI,HMASL,NMIL,NALBP,NGRP, + 1 HEDIT,VOSAP,ILUPS,SPH,B2R) +*---- +* RECOVER MACROLIB PARAMETERS +*---- + CALL LCMGET(IPTMP,'STATE-VECTOR',ISTATE) + NLTMP=ISTATE(3) + NFTMP=ISTATE(4) + NEDTMP=ISTATE(5) + IF(NLTMP.GT.MAXNL) CALL XABORT('MCRMAC: MAXNL OVERFLOW(2).') + IF(NFTMP.GT.MAXNFI) CALL XABORT('MCRMAC: MAXNFI OVERFLOW(2).') + IF(NEDTMP.GT.MAXED) CALL XABORT('MCRMAC: MAXED OVERFLOW(2).') + IF(IACCS.EQ.0) THEN + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.NMIL) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF MIXTURES(3).') + ENDIF + NL=NLTMP + NF=NFTMP + NED=NEDTMP + ITRANC=ISTATE(6) + NDEL=ISTATE(7) + IDF=ISTATE(12) + CALL LCMGTC(IPTMP,'ADDXSNAME-P0',8,NED,HVECT) + N1D=8+NED+NL + N2D=2*(NDEL+1) + IF(N1D.GT.MAX1D) CALL XABORT('MCRMAC: MAX1D OVERFLOW(2).') + IF(N2D.GT.MAX2D) CALL XABORT('MCRMAC: MAX2D OVERFLOW(2).') + DO 190 IED=1,NED + HMAK1(8+IED)=HVECT(IED) + 190 CONTINUE + DO 200 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+NED+IL)='SIGS'//CM + 200 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 210 IDEL=1,NDEL + WRITE(TEXT8,'(6HNUSIGF,I2.2)') IDEL + HMAK2(2+2*(IDEL-1)+1)=TEXT8 + WRITE(TEXT8,'(3HCHI,I2.2)') IDEL + HMAK2(2+2*(IDEL-1)+2)=TEXT8 + 210 CONTINUE + ELSE + IF(NLTMP.GT.NL) CALL XABORT('MCRMAC: NL OVERFLOW.') + ITRANC=MAX(ITRANC,ISTATE(6)) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.NMIL)THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF MIXTURES(3).') + ELSE IF((NFTMP.NE.0).AND.(NFTMP.NE.NF)) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF FISSILE ISOTOPES(3).') + ELSE IF(ISTATE(7).NE.NDEL) THEN + CALL XABORT('MCRMAC: INVALID NUMBER OF PRECURSOR GROUPS(3).') + ELSE IF(LADFM.AND.(ISTATE(12).NE.IDF)) THEN + CALL XABORT('MCRMAC: INVALID TYPE OF ADF DIRECTORY.') + ENDIF + ENDIF +*---- +* SPH CORRECTION OF MACROLIB INFORMATION +*---- + IMC=1 ! SPH correction for SPN macro-calculation + CALL SPHCMA(IPTMP,IMPX,IMC,NMIL,NGRP,NFTMP,NEDTMP,NALBP,SPH) + DEALLOCATE(SPH) +*---- +* RECOVER VOLUMES, ENERGY GROUPS, EDIT NAMES, AND LAMBDA-D. +*---- + CALL LCMLEN(IPTMP,'VOLUME',ILONG,ITYLCM) + IF(ILONG.EQ.NMIL) THEN + DO 220 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) ! mixture in MPO file + IF(IBMOLD.NE.0) VOLMI2(IBM)=VOSAP(IBMOLD) + 220 CONTINUE + ENDIF + CALL LCMLEN(IPTMP,'ENERGY',ILONG,ITYLCM) + IF(ILONG.EQ.NGRP+1) CALL LCMGET(IPTMP,'ENERGY',ENERG) + CALL LCMLEN(IPTMP,'LAMBDA-D',LENGTH,ITYLCM) + LWD=(LENGTH.EQ.NDEL).AND.(NDEL.GT.0) + IF(LWD) THEN + ALLOCATE(WDLA(NDEL)) + CALL LCMGET(IPTMP,'LAMBDA-D',WDLA) + CALL LCMPUT(IPMAC,'LAMBDA-D',NDEL,2,WDLA) + DEALLOCATE(WDLA) + ENDIF +*---- +* PERFORM INTERPOLATION +*---- + JPTMP=LCMGID(IPTMP,'GROUP') + DO 290 IBM=1,NMIX ! mixtures in Macrolib + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 290 + IBMOLD=MIXC(IBM) ! mixture in MPO file + IF(IBMOLD.EQ.0) GO TO 290 +* + DO 280 IGR=1,NGRP + KPTMP=LCMGIL(JPTMP,IGR) + DO 230 I1D=1,N1D + CALL LCMLEN(KPTMP,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGPD(KPTMP,HMAK1(I1D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + FLOTVA=FLOT(IBMOLD) + IF(FLOTVA.NE.0.0) LMAKE1(I1D)=.TRUE. + IF((.NOT.LPURE).AND.(I1D.EQ.4)) FLOTVA=1.0/FLOTVA + GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)+WEIGHT*FLOTVA + ENDIF + 230 CONTINUE + IF(ISTATE(4).GT.0) THEN + DO 250 I2D=1,N2D + CALL LCMLEN(KPTMP,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGPD(KPTMP,HMAK2(I2D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + DO 240 I=1,NF + IOF=(IBMOLD-1)*NF+I + IF(FLOT(IOF).NE.0.0) LMAKE2(I2D)=.TRUE. + GAR2(IBM,I,IGR,I2D)=GAR2(IBM,I,IGR,I2D)+WEIGHT*FLOT(IOF) + 240 CONTINUE + ENDIF + 250 CONTINUE + ENDIF + DO 270 IL=1,NLTMP + WRITE(CM,'(I2.2)') IL-1 + CALL LCMLEN(KPTMP,'SCAT'//CM,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(KPTMP,'SCAT'//CM,GAR4B) + CALL LCMGET(KPTMP,'NJJS'//CM,NJJB) + CALL LCMGET(KPTMP,'IJJS'//CM,IJJB) + CALL LCMGET(KPTMP,'IPOS'//CM,IPOSB) + IPOSDE=IPOSB(IBMOLD) + DO 260 JGR=IJJB(IBMOLD),IJJB(IBMOLD)-NJJB(IBMOLD)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR3(IBM,JGR,IGR,IL)+WEIGHT*GAR4B(IPOSDE) + IPOSDE=IPOSDE+1 + 260 CONTINUE + ENDIF + 270 CONTINUE + 280 CONTINUE + 290 CONTINUE + CALL LCMCL(IPTMP,2) + 300 CONTINUE +*---- +* WRITE INTERPOLATED MACROLIB INFORMATION +*---- + CALL LCMPUT(IPMAC,'VOLUME',NMIX,2,VOLMI2) + CALL LCMPUT(IPMAC,'ENERGY',NGRP+1,2,ENERG) + IF(NED.GT.0) CALL LCMPTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + JPMAC=LCMLID(IPMAC,'GROUP',NGRP) + DO 410 IGR=1,NGRP + KPMAC=LCMDIL(JPMAC,IGR) + DO 350 I1D=1,N1D + IF(LMAKE1(I1D)) THEN + IF((.NOT.LPURE).AND.(I1D.EQ.4)) THEN + DO 320 IBM=1,NMIX + DO 310 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=1./GAR1(IBM,IGR,I1D) + 310 CONTINUE + 320 CONTINUE + ELSE IF(I1D.EQ.7) THEN + DO 340 IBM=1,NMIX + DO 330 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)* + 1 1.0E6 ! convert MeV to eV + 330 CONTINUE + 340 CONTINUE + ENDIF + CALL LCMPUT(KPMAC,HMAK1(I1D),NMIX,2,GAR1(1,IGR,I1D)) + ENDIF + 350 CONTINUE + DO 360 I2D=1,N2D + IF(LMAKE2(I2D).AND.(NF.GT.0)) THEN + CALL LCMPUT(KPMAC,HMAK2(I2D),NMIX*NF,2,GAR2(1,1,IGR,I2D)) + ENDIF + 360 CONTINUE + DO 400 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IPOSDE=0 + DO 390 IBM=1,NMIX + IPOS(IBM)=IPOSDE+1 + IGMIN=IGR + IGMAX=IGR + DO 370 JGR=1,NGRP + IF(GAR3(IBM,JGR,IGR,IL).NE.0.0) THEN + IGMIN=MIN(IGMIN,JGR) + IGMAX=MAX(IGMAX,JGR) + ENDIF + 370 CONTINUE + IJJ(IBM)=IGMAX + NJJ(IBM)=IGMAX-IGMIN+1 + DO 380 JGR=IGMAX,IGMIN,-1 + IPOSDE=IPOSDE+1 + GAR4(IPOSDE)=GAR3(IBM,JGR,IGR,IL) + 380 CONTINUE + 390 CONTINUE + IF(IPOSDE.GT.0) THEN + CALL LCMPUT(KPMAC,'SCAT'//CM,IPOSDE,2,GAR4) + CALL LCMPUT(KPMAC,'NJJS'//CM,NMIX,1,NJJ) + CALL LCMPUT(KPMAC,'IJJS'//CM,NMIX,1,IJJ) + CALL LCMPUT(KPMAC,'IPOS'//CM,NMIX,1,IPOS) + CALL LCMPUT(KPMAC,'SIGW'//CM,NMIX,2,GAR3(1,IGR,IGR,IL)) + ENDIF + 400 CONTINUE + 410 CONTINUE + IACCS=1 +*---- +* UPDATE STATE-VECTOR +*---- + ISTATE(2)=NMIX + ISTATE(3)=NL + ISTATE(4)=NF + ISTATE(5)=NED + ISTATE(6)=ITRANC + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(IOUT,'(/31H MCRMAC: INCLUDE LEAKAGE IN THE, + 1 14H MACROLIB (B2=,1P,E12.5,2H).)') B2 + JPMAC=LCMGID(IPMAC,'GROUP') + ALLOCATE(WORK1(NMIX),WORK2(NMIX)) + DO 430 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + CALL LCMGET(KPMAC,'NTOT0',WORK1) + CALL LCMGET(KPMAC,'DIFF',WORK2) + DO 420 IBM=1,NMIX + IF(MIXC(IBM).NE.0) WORK1(IBM)=WORK1(IBM)+B2*WORK2(IBM) + 420 CONTINUE + CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,WORK1) + 430 CONTINUE + DEALLOCATE(WORK2,WORK1) + ENDIF +*---- +* PROCESS ADF and physical albedos (if required) +*---- + LALBG=.TRUE. + IF(NALBP.GT.0) THEN + WRITE(RECNAM,'(8H/output/,A,16H/statept_0/flux/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NALBP",NALBP2) + IF(NALBP2.NE.NALBP) CALL XABORT('MCRMAC: INVALID NALBP.') + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"ALBEDOGxG",RANK,TYPE,NBYTE, + & DIMSR) + IF(TYPE.NE.99) LALBG=.FALSE. + ENDIF + CALL MCRAGF(IPMAC,IPMPO,IACCOLD,NMIL,NMIX,NGRP,NALBP,LALBG,LADFM, + 1 IMPX,NCAL,TERP,MIXC,NSURFD,HEDIT,VOSAP,VOLMI2,IDF) + IF(NSURFD.GT.0) THEN + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + ISTATE(12)=IDF ! ADF information + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(VOSAP,ENERG) + DEALLOCATE(VOLMI2,GAR4B,GAR4,GAR3,GAR2,GAR1) + DEALLOCATE(IPOSB,NJJB,IJJB,IPOS,NJJ,IJJ) + RETURN + END |
