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/MCRRGR.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/MCRRGR.f')
| -rw-r--r-- | Donjon/src/MCRRGR.f | 923 |
1 files changed, 923 insertions, 0 deletions
diff --git a/Donjon/src/MCRRGR.f b/Donjon/src/MCRRGR.f new file mode 100644 index 0000000..c9c8af8 --- /dev/null +++ b/Donjon/src/MCRRGR.f @@ -0,0 +1,923 @@ +*DECK MCRRGR + SUBROUTINE MCRRGR(IPMPO,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,NBISO, + 1 NCH,NB,NFUEL,NPARM,NPAR,HEDIT,ITER,MAXNIS,MIXC,TERP,NISO,LISO, + 2 HISO,CONC,ITODO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for MPO file interpolation. Use global +* parameters from a fuel-map object and optional user-defined values. +* +*Copyright: +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMPO address of the MPO file. +* IPMAP address of the fuel-map object. +* LCUBIC =.TRUE.: cubic Ceschino interpolation; =.FALSE: linear +* Lagrange interpolation. +* NMIX number of material mixtures in the fuel-map macrolib. +* IMPX print parameter (equal to zero for no print). +* NMIL number of material mixtures in the MPO file. +* NCAL number of elementary calculations in the MPO file. +* NBISO number of particularized and macro isotopes in the MPO file. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NFUEL number of fuel types. +* NPARM number of additional parameters (other than burnup) defined +* in FMAP object +* NPAR number of parameters +* HEDIT name of output group for a (multigroup mesh, output geometry) +* couple (generally equal to 'output_0'). +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another MPO file; +* =2 use another L_MAP + MPO file). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the MPO file corresponding to each microlib +* mixture. +* TERP interpolation factors. +* NISO number of user-selected isotopes. +* LISO type of treatment (=.true.: ALL; =.false.: ONLY). +* HISO name of the user-selected isotopes. +* CONC user-defined number density of the user-selected isotopes. A +* value of -99.99 is set to indicate that the compo value is +* used. +* ITODO non-depletion mask (=1 to force a user-selected isotope to be +* non-depleting) +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMPO,IPMAP + INTEGER NMIX,IMPX,NMIL,NCAL,NBISO,NFUEL,NCH,NB,ITER,MAXNIS, + 1 MIXC(NMIX),NPARM,NPAR,NISO(NMIX),ITODO(NMIX,NBISO) + REAL TERP(NCAL,NMIX),CONC(NMIX,NBISO) + LOGICAL LCUBIC,LISO(NMIX) + CHARACTER(LEN=8) HISO(NMIX,NBISO) + CHARACTER(LEN=12) HEDIT +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXADD=10 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXLIN=50 + REAL, PARAMETER::REPS=1.0E-4 + INTEGER IBMOLD, IBM, IBTYP, IB, ICAL, ICH, IFUEL, ILONG, IMIX, + & IMPY, INDIC, IPAR, ISO, ITYPE, ITYP, IVARTY, I, JBM, JB, JCAL, + & JPARM, JPAR, J, NISOMI, NITMA, NPARMP, NTOT, N, RANK, TYPE, + & NBYTE, DIMSR(5) + REAL BURN0, BURN1, FLOTT, SUM, VALR1, VALR2, VARVAL + CHARACTER TEXT12*12,HSMG*131,TEXT132*132, VALH(MAXPAR)*12, + 1 RECNAM*12,HPARNA*12,HCUBIC*12,HNAVAL*12 + INTEGER VALI(MAXPAR),MAPLET(2*MAXPAR,MAXADD), + 1 MATYPE(2*MAXPAR,MAXADD),IDLTA(2*MAXPAR,MAXADD),NDLTA(2*MAXPAR), + 2 IDLTA1,MUPLT2(2*MAXPAR),MUTYP2(2*MAXPAR) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2),VALRA(2*MAXPAR,2,MAXADD),CONCMI(NBISO) + LOGICAL LDELT(2*MAXPAR),LDELT1,LSET(2*MAXPAR),LADD(2*MAXPAR), + 1 LSET1,LADD1,LDMAP(2*MAXPAR,2),LAMAP(2*MAXPAR,2,MAXADD), + 2 LCUB2(MAXPAR),LTST,LISOMI + TYPE(C_PTR) JPMAP,KPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: MUPLET,MUTYPE,NVALUE,FMIX, + 1 ZONEC,VINTE + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ZONEDP,MUBASE + REAL, ALLOCATABLE, DIMENSION(:) :: BRN0,BRN1,VARC,TERPA,VREAL + REAL, ALLOCATABLE, DIMENSION(:,:) :: WPAR + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LPARM,LDELTA + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HISOMI, PARFMT + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HPAR, VCHAR + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: PARTYP,PARKEY + CHARACTER(LEN=132), ALLOCATABLE, DIMENSION(:) :: TEXT132V1 +*---- +* SCRATCH STORAGE ALLOCATION +* FMIX fuel mixture indices per fuel bundle. +* BRN0 contains either low burnup integration limits or +* instantaneous burnups per fuel bundle. +* BRN1 upper burnup integration limits per fuel bundle. +* WPAR other parameter distributions. +* HPAR 'PARKEY' name of the other parameters. +*---- + ALLOCATE(MUPLET(NPAR),MUTYPE(NPAR)) + ALLOCATE(LPARM(NPARM+1),FMIX(NCH*NB),ZONEDP(NCH,NB),ZONEC(NCH), + 1 BRN0(NCH*NB),BRN1(NCH*NB),WPAR(NCH*NB,NPARM),LDELTA(NMIX), + 2 HPAR(NPARM+1),HISOMI(NBISO)) +*---- +* RECOVER INFORMATION FOR THE MPO FILE. +*---- + CALL hdf5_info(IPMPO,"/info/MPO_CREATION_INFO",RANK,TYPE,NBYTE, + 1 DIMSR) + IF(RANK.GT.MAXLIN) CALL XABORT('MCRRGR: MAXLIN OVERFLOW.') + IF(NPAR.GT.MAXPAR) CALL XABORT('MCRRGR: MAXPAR OVERFLOW.') + CALL hdf5_read_data(IPMPO,"/info/MPO_CREATION_INFO",TEXT132) + IF((RANK.EQ.1).AND.(DIMSR(1).EQ.1)) THEN + CALL hdf5_read_data(IPMPO,"/info/MPO_CREATION_INFO",TEXT132) + IF(IMPX.GT.0) WRITE(IOUT,'(1X,A)') TEXT132 + ELSE IF(RANK.EQ.1) THEN + CALL hdf5_read_data(IPMPO,"/info/MPO_CREATION_INFO",TEXT132V1) + IF(IMPX.GT.0) THEN + DO I=1,DIMSR(1) + WRITE(IOUT,'(1X,A)') TEXT132V1(I) + ENDDO + ENDIF + DEALLOCATE(TEXT132V1) + ENDIF + IF(NPAR.GT.0) THEN + CALL hdf5_read_data(IPMPO,"/parameters/info/PARAMTYPE",PARTYP) + CALL hdf5_read_data(IPMPO,"/parameters/info/PARAMNAME",PARKEY) + CALL hdf5_read_data(IPMPO,"/parameters/info/PARAMFORM",PARFMT) + IF(IMPX.GT.1) THEN + WRITE(IOUT,*) 'NPAR=',NPAR,SIZE(PARKEY,1) + DO I=1,NPAR + WRITE(IOUT,*)'PARKEY(',I,')=',PARKEY(I),' PARFMT=',PARFMT(I) + ENDDO + ENDIF + ENDIF + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 +*---- +* SCAN THE MPO FILE INFORMATION TO RECOVER THE MUPLET DATABASE +*---- + IF(IMPX.GT.5) THEN + WRITE(IOUT,'(24H MCRRGR: MUPLET DATABASE/12H CALCULATION,5X, + 1 10HMUPLET....)') + ENDIF + ALLOCATE(MUBASE(NPAR,NCAL)) + DO ICAL=1,NCAL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0)') TRIM(HEDIT),ICAL-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"/PARAMVALUEORD",VINTE) + IF(SIZE(VINTE).NE.NPAR) THEN + WRITE(HSMG,'(43HMCRRGR: INCONSISTENT PARAMVALUEORD LENGTH (, + 1 I5,3H VS,I5,2H).)') SIZE(VINTE),NPAR + CALL XABORT(HSMG) + ENDIF + DO IPAR=1,NPAR + MUBASE(IPAR,ICAL)=VINTE(IPAR)+1 + ENDDO + IF(IMPX.GT.5) THEN + WRITE(IOUT,'(I8,6X,20I4/(14X,20I4))') ICAL, + 1 MUBASE(:,ICAL) + ENDIF + DEALLOCATE(VINTE) + ENDDO +*---- +* READ (INTERP_DATA) AND SET VALI, VALR AND VALH PARAMETERS +* CORRESPONDING TO THE INTERPOLATION POINT. FILL MUPLET FOR +* PARAMETERS SET WITHOUT INTERPOLATION. +*---- + IBM=0 + MAXNIS=0 + NISOMI=0 + LISOMI=.TRUE. + LDELT1=.FALSE. + LADD1=.FALSE. + NISO(:NMIX)=0 + LISO(:NMIX)=.TRUE. + LDELTA(:NMIX)=.FALSE. + ITODO(:NMIX,:NBISO)=0 + IDLTA1=0 + DO I=1,2*MAXPAR + LSET(I)=.FALSE. + LDELT(I)=.FALSE. + LADD(I)=.FALSE. + LDMAP(I,:2)=.FALSE. + LAMAP(I,:2,:MAXADD)=.FALSE. + NDLTA(I)=0 + ENDDO +*---- +* READ THE PARKEY NAME OF THE BURNUP FOR THIS MPO FILE. +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(1).') + IF((TEXT12.EQ.'MIX').OR.(TEXT12.EQ.';')) THEN + NPARMP=NPARM + GO TO 30 + ELSE +* add burnup to parameters + NPARMP=NPARM+1 + HPAR(NPARMP)=TEXT12 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(2).') + IF((TEXT12.EQ.'MIX').OR.(TEXT12.EQ.';')) GO TO 30 + HNAVAL=TEXT12 + ENDIF +*---- +* MAIN LOOP OF THE SUBROUTINE (UNTIL THE END) +*---- + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(3).') + 30 IF(TEXT12.EQ.'MIX')THEN + NISOMI=0 + LISOMI=.TRUE. + IVARTY=0 + IBTYP=0 + HNAVAL=' ' + MUPLET(:NPAR)=0 + MUTYPE(:NPAR)=0 + VALI(:NPAR)=0 + VALR(:NPAR,1)=0.0 + VALR(:NPAR,2)=0.0 + DO 35 I=1,MAXADD + MAPLET(:NPAR,I)=0 + MATYPE(:NPAR,I)=0 + VALRA(:NPAR,1,I)=0.0 + VALRA(:NPAR,2,I)=0.0 + 35 CONTINUE + DO I=1,2*MAXPAR + LSET(I)=.FALSE. + LDELT(I)=.FALSE. + LADD(I)=.FALSE. + LDMAP(I,:2)=.FALSE. + LAMAP(I,:2,:MAXADD)=.FALSE. + ENDDO + DO 40 I=1,NPAR + VALH(I)=' ' + 40 CONTINUE + LCUB2(:NPAR)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('MCRRGR: INTEGER DATA EXPECTED.') +* CHECK FUEL MIXTURE + JPMAP=LCMGID(IPMAP,'FUEL') + DO IFUEL=1,NFUEL + KPMAP=LCMGIL(JPMAP,IFUEL) + CALL LCMGET(KPMAP,'MIX',IMIX) + IF(IMIX.EQ.IBM)GOTO 50 + ENDDO + WRITE(IOUT,*)'MCRRGR: UNABLE TO FIND FUEL MIXTURE ',IBM + CALL XABORT('MCRRGR: WRONG MIXTURE NUMBER.') + 50 IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(4).') + IF(TEXT12.EQ.'FROM')THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('MCRRGR: INTEGER DATA EXPECTED.') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTE' + 1 //'D(5).') + ELSE IF(TEXT12.EQ.'USE') THEN + IBMOLD=IBM + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTE' + 1 //'D(6).') + ENDIF + GOTO 30 + ELSEIF(TEXT12.EQ.'MICRO')THEN + IF(IBM.EQ.0) CALL XABORT('MCRRGR: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(7).') + IF(TEXT12.EQ.'ALL')THEN + LISOMI=.TRUE. + ELSEIF(TEXT12.EQ.'ONLY')THEN + LISOMI=.FALSE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(8).') + 60 IF(TEXT12.EQ.'ENDMIX')THEN + GOTO 30 + ELSE IF(TEXT12.EQ.'NOEV') THEN + IF(NISOMI.EQ.0) CALL XABORT('MCRRGR: MISPLACED NOEV.') + ITODO(IBM,NISOMI)=1 + ELSE + NISOMI=NISOMI+1 + IF(NISOMI.GT.NBISO) CALL XABORT('MCRRGR: NBISO OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISOMI) + HISOMI(NISOMI)=TEXT12(:8) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2)THEN + CONCMI(NISOMI)=FLOTT + ELSEIF((INDIC.EQ.3).AND.(TEXT12.EQ.'*'))THEN + CONCMI(NISOMI)=-99.99 + ELSE + CALL XABORT('MCRRGR: INVALID HISO DATA.') + ENDIF + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(9).') + GOTO 60 + ELSEIF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA').OR. + 1 (TEXT12.EQ.'ADD'))THEN + IF(IBM.EQ.0) CALL XABORT('MCRRGR: MIX NOT SET (2).') + LSET1=.FALSE. + LDELT1=.FALSE. + LADD1=.FALSE. + ITYPE=0 + IF(TEXT12.EQ.'SET')THEN + ITYPE=1 + LSET1=.TRUE. + ELSEIF(TEXT12.EQ.'DELTA')THEN + ITYPE=2 + LDELT1=.TRUE. + ELSEIF(TEXT12.EQ.'ADD')THEN + ITYPE=2 + LADD1=.TRUE. + IDLTA1=IDLTA1+1 + DO 65 JPAR=1,NPAR + MAPLET(JPAR,IDLTA1)=MUPLET(JPAR) + MATYPE(JPAR,IDLTA1)=MUTYPE(JPAR) + 65 CONTINUE + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(10)' + 1 //'.') + IF((TEXT12.EQ.'LINEAR').OR.(TEXT12.EQ.'CUBIC')) THEN + HCUBIC=TEXT12 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ELSE + HCUBIC=' ' + ENDIF + IF(INDIC.NE.3)CALL XABORT('MCRRGR: CHARACTER DATA EXPECTED(11)' + 1 //'.') + IPAR=0 + DO I=1,NPAR + IF(TEXT12.EQ.PARKEY(I))THEN + IPAR=I + HPARNA=TEXT12 + GOTO 70 + ENDIF + ENDDO + WRITE(HSMG,'(18HMCRRGR: PARAMETER ,A,14H NOT FOUND(1).)') TEXT12 + CALL XABORT(HSMG) +* + 70 IF(HCUBIC.EQ.'LINEAR') THEN + LCUB2(IPAR)=.FALSE. + ELSE IF(HCUBIC.EQ.'CUBIC') THEN + LCUB2(IPAR)=.TRUE. + ENDIF + CALL hdf5_read_data(IPMPO,"/parameters/info/NVALUE",NVALUE) + WRITE(RECNAM,'(25H/parameters/values/PARAM_,I0)') IPAR-1 + CALL hdf5_info(IPMPO,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HMCRRGR: GLOBAL PARAMETER ,A,12H NOT SET(1).)') + 1 TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + IF((IPAR.GT.NPAR).OR. + 1 ((IPAR.LE.NPAR).AND.(PARFMT(IPAR).EQ.'FLOAT')))THEN + CALL hdf5_read_data(IPMPO,RECNAM,VREAL) + CALL REDGET(INDIC,NITMA,VALR1,TEXT12,DFLOTT) + IF(INDIC.EQ.2)THEN + VALR2=VALR1 + IF(LSET1) THEN + LSET(IPAR)=.TRUE. + VALR(IPAR,1)=VALR1 + VALR(IPAR,2)=VALR1 + ENDIF + IF(LDELT1) THEN + LDELT(IPAR)=.TRUE. + VALR(IPAR,1)=VALR1 + VALR(IPAR,2)=VALR1 + ELSEIF(LADD1) THEN + LADD(IPAR)=.TRUE. + VALRA(IPAR,1,IDLTA1)=VALR1 + VALRA(IPAR,2,IDLTA1)=VALR1 + NDLTA(IPAR)=NDLTA(IPAR)+1 + IF(NDLTA(IPAR).GT.MAXADD) CALL XABORT('MCRRGR: MAXADD OV' + 1 //'ERFLOW.') + IDLTA(IPAR,NDLTA(IPAR))=IDLTA1 + ENDIF + ELSEIF(TEXT12.EQ.'MAP')THEN + IF(LDELT1)THEN + LDELT(IPAR)=.TRUE. + LDMAP(IPAR,1)=.TRUE. + ELSEIF(LADD1)THEN + LADD(IPAR)=.TRUE. + NDLTA(IPAR)=NDLTA(IPAR)+1 + IF(NDLTA(IPAR).GT.MAXADD) CALL XABORT('MCRRGR: MAXADD OV' + 1 //'ERFLOW.') + LAMAP(IPAR,1,NDLTA(IPAR))=.TRUE. + IDLTA(IPAR,NDLTA(IPAR))=IDLTA1 + ENDIF + IF(LSET1.AND.(.NOT.LSET(IPAR))) GO TO 20 + ELSE + CALL XABORT('MCRRGR: real value or "MAP" expected(1).') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE.GE.2)THEN + IF(INDIC.EQ.2)THEN + VALR2=FLOTT + IF(LDELT1)THEN + VALR(IPAR,2)=VALR2 + ELSEIF(LADD1)THEN + VALRA(IPAR,2,IDLTA1)=VALR2 + ENDIF + ELSEIF(TEXT12.EQ.'MAP')THEN + IF(LDELT1)THEN + LDMAP(IPAR,2)=.TRUE. + ELSEIF(LADD1)THEN + LAMAP(IPAR,2,IDLTA1)=.TRUE. + ENDIF + ELSE + CALL XABORT('MCRRGR: real value or "MAP" expected(2).') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + LTST=.FALSE. + IF(.NOT.LADD1)THEN + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) LTST=.TRUE. + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + ELSE + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=2 + ENDIF + IF((LTST).AND.(ITYPE.EQ.1))THEN + DO J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J)))THEN + MUPLET(IPAR)=J + GOTO 30 + ENDIF + ENDDO + ENDIF +*---- +* ERRORS HANDLING +*---- + IF(VALR1.LT.VREAL(1))THEN +* OUTSIDE OF THE DOMAIN (1) + WRITE(HSMG,'(23HMCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(1))') HPARNA,VALR1 + WRITE(6,*)'Domain:',VREAL(1),' <-> ',VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSEIF(VALR2.GT.VREAL(NVALUE(IPAR)))THEN +* OUTSIDE OF THE DOMAIN (2) + WRITE(HSMG,'(23HMCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(2))') HPARNA,VALR2 + WRITE(6,*)'Domain:',VREAL(1),' <-> ',VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSEIF((VALR1.GT.VALR2).AND.(ITYPE.EQ.1))THEN +* ITYPE=1 correspond to an integral between VALR1 and VALR2 +* otherwise it is a simple difference + WRITE(HSMG,'(23HMCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(1))') HPARNA, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF + IF((LADD1).AND.(TEXT12.EQ.'REF'))THEN + 120 DEALLOCATE(VREAL) + IPAR=-99 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(TEXT12.EQ.'ENDREF') GOTO 140 + DO I=1,NPAR + IF(TEXT12.EQ.PARKEY(I))THEN + IPAR=I + GOTO 130 + ENDIF + ENDDO + CALL XABORT('MCRRGR: PARAMETER '//TEXT12//' NOT FOUND(2).') + 130 CONTINUE + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2)THEN + VALRA(IPAR,1,IDLTA1)=FLOTT + VALRA(IPAR,2,IDLTA1)=FLOTT + WRITE(RECNAM,'(25H/parameters/values/PARAM_,I0)') IPAR-1 + CALL hdf5_info(IPMPO,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HMCRRGR: GLOBAL PARAMETER ,A, + 1 12H NOT SET(2).)') TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + CALL hdf5_read_data(IPMPO,RECNAM,VREAL) + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=1 + DO J=1,NVALUE(IPAR) + IF(ABS(VALRA(IPAR,1,IDLTA1)-VREAL(J)).LE. + 1 REPS*ABS(VREAL(J)))THEN + MAPLET(IPAR,IDLTA1)=J + GOTO 120 + ENDIF + ENDDO + ELSEIF(TEXT12.EQ.'SAMEASREF')THEN + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=-1 + ELSE + CALL XABORT('MCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 120 + 140 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ELSE IF((LDELT1).AND.(TEXT12.EQ.'REF'))THEN + 150 DEALLOCATE(VREAL) + IPAR=-99 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(TEXT12.EQ.'ENDREF') GOTO 170 + DO I=1,NPAR + IF(TEXT12.EQ.PARKEY(I))THEN + IPAR=I + GOTO 160 + ENDIF + ENDDO + CALL XABORT('MCRRGR: PARAMETER '//TEXT12//' NOT FOUND(3).') + 160 CONTINUE + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2)THEN + VALR(IPAR,1)=FLOTT + VALR(IPAR,2)=FLOTT + WRITE(RECNAM,'(25H/parameters/values/PARAM_,I0)') IPAR-1 + CALL hdf5_info(IPMPO,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HMCRRGR: GLOBAL PARAMETER ,A, + 1 12H NOT SET(3).)') TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + CALL hdf5_read_data(IPMPO,RECNAM,VREAL) + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=1 + DO J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J)))THEN + MUPLET(IPAR)=J + GOTO 150 + ENDIF + ENDDO + ELSEIF(TEXT12.EQ.'SAMEASREF')THEN + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=-1 + ELSE + CALL XABORT('MCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 150 + 170 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + DEALLOCATE(VREAL) + GOTO 30 + ELSEIF(PARFMT(IPAR).EQ.'INTEGER')THEN + IF(ITYPE.NE.1)CALL XABORT('MCRRGR: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('MCRRGR: INTEGER DATA EXPECTED.') + CALL hdf5_read_data(IPMPO,RECNAM,VINTE) + DO 175 J=1,NVALUE(IPAR) + IF(VALI(IPAR).EQ.VINTE(J))THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GOTO 20 + ENDIF + 175 CONTINUE + WRITE(HSMG,'(26HMCRRGR: INTEGER PARAMETER ,A,9H WITH VAL, + 1 2HUE,I5,27H NOT FOUND IN MPO DATABASE.)') TRIM(PARKEY(IPAR)), + 2 VALI(IPAR) + CALL XABORT(HSMG) + ELSEIF(PARFMT(IPAR).EQ.'STRING')THEN + IF(ITYPE.NE.1)CALL XABORT('MCRRGR: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3)CALL XABORT('MCRRGR: STRING DATA EXPECTED.') + CALL hdf5_read_data(IPMPO,RECNAM,VCHAR) + DO 180 J=1,NVALUE(IPAR) + IF(VALH(IPAR).EQ.VCHAR(J))THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GOTO 20 + ENDIF + 180 CONTINUE + WRITE(HSMG,'(25HMCRRGR: STRING PARAMETER ,A,10H WITH VALU, + 1 1HE,A12,27H NOT FOUND IN MPO DATABASE.)') TRIM(PARKEY(IPAR)), + 2 VALH(IPAR) + CALL XABORT(HSMG) + ELSE + CALL XABORT('MCRRGR: INVALID FORMAT='//PARFMT(IPAR)) + ENDIF + ELSEIF(TEXT12.EQ.'TIMAV-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('MCRRGR: MIX NOT SET (3).') + IBTYP=1 + ELSEIF(TEXT12.EQ.'INST-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('MCRRGR: MIX NOT SET (4).') + IBTYP=2 + ELSEIF(TEXT12.EQ.'AVG-EX-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('MCRRGR: MIX NOT SET (5).') + IBTYP=3 + CALL REDGET(INDIC,IVARTY,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('MCRRGR: INTEGER DATA EXPECTED.') + ELSEIF(TEXT12.EQ.'ENDMIX')THEN +*---- +* RECOVER FUEL-MAP INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(PARFMT(IPAR).EQ.'FLOAT')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H MCRRGR: GLOBAL PARAMETER:,A,5H ->CU, + 1 18HBIC INTERPOLATION.)') TRIM(PARKEY(IPAR)) + ELSE + WRITE(IOUT,'(26H MCRRGR: GLOBAL PARAMETER:,A,5H ->LI, + 1 19HNEAR INTERPOLATION.)') TRIM(PARKEY(IPAR)) + ENDIF + ENDIF + ENDDO + ENDIF + FMIX(:NCH*NB)=0 + CALL LCMGET(IPMAP,'FLMIX',FMIX) + CALL NCRMAP(IPMAP,NPARM,HPAR,NCH,NB,IBTYP,HNAVAL,IMPX,BRN0,BRN1, + 1 WPAR,LPARM) + IF(IBTYP.EQ.3) THEN + IF(IVARTY.EQ.0) CALL XABORT('MCRRGR: IVARTY NOT SET.') + CALL LCMGET(IPMAP,'B-ZONE',ZONEC) + DO ICH=1,NCH + DO J=1,NB + IF(ZONEC(ICH).EQ.IVARTY) THEN + ZONEDP(ICH,J)=1 + ELSE + ZONEDP(ICH,J)=0 + ENDIF + ENDDO + ENDDO + CALL LCMLEN(IPMAP,'B-VALUE',ILONG,ITYP) + IF (ILONG.EQ.0) CALL XABORT('MCRRGR: NO SAVED VALUES FOR ' + 1 //'THIS TYPE OF VARIABLE IN L_MAP') + ALLOCATE(VARC(ILONG)) + CALL LCMGET(IPMAP,'B-VALUE',VARC) + VARVAL=VARC(IVARTY) + DEALLOCATE(VARC) + ENDIF +*---- +* PERFORM INTERPOLATION OVER THE FUEL MAP. +*---- + DO 185 JPARM=1,NPARMP + IPAR=0 + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + IF(LSET(IPAR)) THEN + IF(IMPX.GT.0) WRITE(6,*) 'L_MAP values overwritten by ' + 1 // 'the SET option for parameter '//HPAR(JPARM) + IF(.NOT.LADD(IPAR)) LPARM(JPARM)=.FALSE. + ENDIF + GOTO 185 + ENDIF + ENDDO + LPARM(JPARM)=.FALSE. + 185 CONTINUE +*---- +* COMPUTE ALL THE MUPLETS FOR EACH BUNDLE +*---- + IMPY=MAX(0,IMPX-1) + NTOT=0 + DO 285 JB=1,NB + DO 280 ICH=1,NCH + IB=(JB-1)*NCH+ICH + IF(FMIX(IB).EQ.0) GO TO 280 + NTOT=NTOT+1 + IF(FMIX(IB).EQ.IBM)THEN + IF(NTOT.GT.NMIX) CALL XABORT('MCRRGR: NMIX OVERFLOW.') + DO 260 JPARM=1,NPARMP + IF(.NOT.LPARM(JPARM))GOTO 260 + IPAR=0 + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + HPARNA=HPAR(JPARM) + GOTO 190 + ENDIF + ENDDO + WRITE(HSMG,'(18HMCRRGR: PARAMETER ,A,14H NOT FOUND(4).)') + 1 HPAR(JPARM) + CALL XABORT(HSMG) + 190 CONTINUE + WRITE(RECNAM,'(25H/parameters/values/PARAM_,I0)') IPAR-1 + CALL hdf5_info(IPMPO,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HMCRRGR: GLOBAL PARAMETER ,A,12H NOT SET(4).)') + 1 TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + ITYPE=0 + IF((JPARM.EQ.NPARMP).AND.(NPARMP.EQ.NPARM+1))THEN +* parameter JPARAM is burnup + IF(.NOT.LSET(IPAR))THEN + MUTYPE(IPAR)=1 + MUPLET(IPAR)=-1 + BURN0=0.0 + BURN1=0.0 + IF(IBTYP.EQ.1)THEN +* TIME-AVERAGE + BURN0=BRN0(IB) + BURN1=BRN1(IB) + ELSEIF(IBTYP.EQ.2)THEN +* INSTANTANEOUS + BURN0=BRN0(IB) + BURN1=BURN0 + ELSEIF(IBTYP.EQ.3)THEN +* DIFFERENCIATION RELATIVE TO EXIT BURNUP + ITYPE=3 + BURN0=BRN0(IB) + BURN1=BRN1(IB) + ENDIF + VALR(IPAR,1)=BURN0 + VALR(IPAR,2)=BURN1 + VALR1=VALR(IPAR,1) + VALR2=VALR(IPAR,2) + ITYPE=1 + ENDIF + ELSE + IF(.NOT.LSET(IPAR))THEN + VALR(IPAR,1)=WPAR(IB,JPARM) + VALR(IPAR,2)=WPAR(IB,JPARM) + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=1 + VALR1=VALR(IPAR,1) + VALR2=VALR(IPAR,2) + ITYPE=1 + ENDIF + IF(LDMAP(IPAR,1).OR.LDMAP(IPAR,2))THEN + IF(LDMAP(IPAR,1)) VALR(IPAR,1)=WPAR(IB,JPARM) + IF(LDMAP(IPAR,2)) VALR(IPAR,2)=WPAR(IB,JPARM) + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=2 + VALR1=VALR(IPAR,1) + VALR2=VALR(IPAR,2) + ITYPE=2 + ELSE IF(LADD(IPAR))THEN + DO N=1,NDLTA(IPAR) + IDLTA1=IDLTA(IPAR,N) + IF(LAMAP(IPAR,1,IDLTA1)) THEN + VALRA(IPAR,1,IDLTA1)=WPAR(IB,JPARM) + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=2 + ENDIF + IF(LAMAP(IPAR,2,IDLTA1)) THEN + VALRA(IPAR,2,IDLTA1)=WPAR(IB,JPARM) + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=2 + ENDIF + ENDDO + VALR1=VALRA(IPAR,1,IDLTA(IPAR,1)) + VALR2=VALRA(IPAR,2,IDLTA(IPAR,1)) + ITYPE=2 + ENDIF + ENDIF + WRITE(RECNAM,'(25H/parameters/values/PARAM_,I0)') IPAR-1 + CALL hdf5_info(IPMPO,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HMCRRGR: GLOBAL PARAMETER ,A,12H NOT SET(5).)') + 1 TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + CALL hdf5_read_data(IPMPO,RECNAM,VREAL) + IF(ITYPE.EQ.1)THEN + IF(VALR1.EQ.VALR2)THEN + DO J=1,NVALUE(IPAR) + IF(ABS(VALR1-VREAL(J)).LE.REPS*ABS(VREAL(J)))THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GOTO 260 + ENDIF + ENDDO + ENDIF + ENDIF +*---- +* ERRORS HANDLING +*---- + IF(VALR1.LT.VREAL(1))THEN +* OUTSIDE OF THE DOMAIN (1) + WRITE(HSMG,'(23HMCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(3).)') HPARNA,VALR1 + WRITE(6,*)'Domain:',VREAL(1),' <-> ',VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSEIF(VALR2.GT.VREAL(NVALUE(IPAR)))THEN +* OUTSIDE OF THE DOMAIN (2) + WRITE(HSMG,'(23HMCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(4).)') HPARNA,VALR2 + WRITE(6,*)'Domain:',VREAL(1),' <-> ',VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSEIF((ITYPE.EQ.1).AND.(VALR1.GT.VALR2))THEN +* VALR1 > VALR2 + WRITE(HSMG,'(23HMCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(2))') HPARNA, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF + DEALLOCATE(VREAL) +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + 260 CONTINUE + MIXC(NTOT)=IBMOLD + IF(IBMOLD.GT.NMIL) + 1 CALL XABORT('MCRRGR: MIX OVERFLOW (MPO).') + IF(IMPY.GT.2) WRITE(6,'(32H MCRRGR: COMPUTE TERP FACTORS IN, + 1 12H NEW MIXTURE,I5,1H.)') NTOT + NISO(NTOT)=NISOMI + LISO(NTOT)=LISOMI + LDELTA(NTOT)=LDELT1 + DO ISO=1,NISOMI + HISO(NTOT,ISO)=HISOMI(ISO) + CONC(NTOT,ISO)=CONCMI(ISO) + ENDDO + DO JPAR=1,NPAR + MUPLT2(JPAR)=MUPLET(JPAR) + ENDDO + IF(IBTYP.EQ.3)THEN + IF(ZONEDP(ICH,JB).NE.0) THEN + CALL MCRTRP(IPMPO,LCUB2,IMPY,NPAR,NCAL,MUPLT2,MUTYPE(1), + 1 PARTYP,VALR(1,1),VARVAL,MUBASE,TERP(1,NTOT)) + ELSE + TERP(:NCAL,NTOT)=0.0 + ENDIF + ELSE + CALL MCRTRP(IPMPO,LCUB2,IMPY,NPAR,NCAL,MUPLT2,MUTYPE(1), + 1 PARTYP,VALR(1,1),VARVAL,MUBASE,TERP(1,NTOT)) + ENDIF +* DELTA-ADD + DO 270 IPAR=1,NPAR + IF(LADD(IPAR))THEN + DO N=1,NDLTA(IPAR) + IDLTA1=IDLTA(IPAR,N) + DO JPAR=1,NPAR + MUPLT2(JPAR)=MAPLET(JPAR,IDLTA1) + MUTYP2(JPAR)=MATYPE(JPAR,IDLTA1) + ENDDO + DO JPAR=1,NPAR + IF(MUTYP2(JPAR).LT.0)THEN + MUPLT2(JPAR)=MUPLET(JPAR) + MUTYP2(JPAR)=MUTYPE(JPAR) + VALRA(JPAR,1,IDLTA1)=VALR(JPAR,1) + VALRA(JPAR,2,IDLTA1)=VALR(JPAR,2) + ENDIF + ENDDO + ALLOCATE(TERPA(NCAL)) + CALL MCRTRP(IPMPO,LCUB2,IMPY,NPAR,NCAL,MUPLT2,MUTYP2(1), + 1 PARTYP,VALRA(1,1,IDLTA1),VARVAL,MUBASE,TERPA(1)) + DO 275 JCAL=1,NCAL + TERP(JCAL,NTOT)=TERP(JCAL,NTOT)+TERPA(JCAL) + 275 CONTINUE + DEALLOCATE(TERPA) + ENDDO + ENDIF + 270 CONTINUE + ENDIF + 280 CONTINUE + 285 CONTINUE + IF(NTOT.NE.NMIX) CALL XABORT('MCRRGR: ALGORITHM FAILURE.') + IBM=0 + ELSEIF((TEXT12.EQ.'MPO').OR.(TEXT12.EQ.'TABLE').OR. + 1 (TEXT12.EQ.'CHAIN').OR.(TEXT12.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT12.EQ.';') ITER=0 + IF(TEXT12.EQ.'MPO') ITER=1 + IF(TEXT12.EQ.'TABLE') ITER=2 + IF(TEXT12.EQ.'CHAIN') ITER=3 + DO 300 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 300 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('MCRRGR: MAXNIS OVERFLOW.') + IF(LDELTA(IBM)) THEN + SUM=0.0 + ELSE + SUM=1.0 + ENDIF + DO 290 ICAL=1,NCAL + SUM=SUM-TERP(ICAL,IBM) + 290 CONTINUE + IF(ABS(SUM).GT.1.0E-4) THEN + WRITE(HSMG,'(43HMCRRGR: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 300 CONTINUE + DEALLOCATE(NVALUE) +*---- +* EXIT MAIN LOOP OF THE SUBROUTINE +*---- + GO TO 310 + ELSE + CALL XABORT('MCRRGR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GOTO 20 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 310 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H MCRRGR: INTERPOLATION FACTORS)') + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) THEN + WRITE(IOUT,320) ICAL,(TERP(ICAL,JBM),JBM=1,NMIX) + EXIT + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + IF(NPAR.GT.0) DEALLOCATE(PARFMT,PARKEY,PARTYP) + DEALLOCATE(MUBASE) + DEALLOCATE(HISOMI,HPAR,LDELTA,WPAR,BRN1,BRN0,ZONEC,ZONEDP,FMIX, + 1 LPARM) + DEALLOCATE(MUTYPE,MUPLET) + RETURN +* + 320 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END |
