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/MCRTRP.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/MCRTRP.f')
| -rw-r--r-- | Donjon/src/MCRTRP.f | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/Donjon/src/MCRTRP.f b/Donjon/src/MCRTRP.f new file mode 100644 index 0000000..204120d --- /dev/null +++ b/Donjon/src/MCRTRP.f @@ -0,0 +1,233 @@ +*DECK MCRTRP + SUBROUTINE MCRTRP(IPMPO,LCUB2,IMPX,NPAR,NCAL,MUPLET,MUTYPE,PARTYP, + 1 VALR,VARVAL,MUBASE,TERP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the TERP interpolation/derivation/integration factors using +* table-of-content information of the MPO file. +* +*Copyright: +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMPO address of the multidimensional MPO file. +* LCUB2 interpolation type for each parameter (=.TRUE.: cubic Ceschino +* interpolation; =.FALSE: linear Lagrange interpolation). +* IMPX print parameter (equal to zero for no print). +* NPAR number of global parameters. +* NCAL number of elementary calculations in the MPO file. +* MUPLET tuple used to identify an elementary calculation. +* MUTYPE type of interpolation (=1: interpolation; =2: delta-sigma). +* PARTYP parameter types. +* VALR real values of the interpolated point. +* VARVAL exit burnup used if MUTYPE(IPAR(ID))=3. +* MUBASE muplet database. +* +*Parameters: output +* TERP interpolation factors. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXPAR=50 + TYPE(C_PTR) IPMPO + INTEGER IMPX,NPAR,NCAL,MUPLET(NPAR),MUTYPE(NPAR),MUBASE(NPAR,NCAL) + REAL VALR(2*MAXPAR,2),VARVAL,TERP(NCAL) + LOGICAL LCUB2(NPAR) + CHARACTER(LEN=24) PARTYP(NPAR) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXDIM=10 + INTEGER, PARAMETER::MAXVAL=200 + INTEGER IPAR(MAXDIM),NVAL(MAXDIM),IDDIV(MAXDIM) + REAL BURN0, BURN1, DENOM, TERTMP + INTEGER I, ICAL, ID, IDTMP, IDTOT, JD, NDELTA, NDIM, NID, NTOT, + 1 MCRCAL, IBURN, ITIME + REAL T1D(MAXVAL,MAXDIM),WORK(MAXVAL) + CHARACTER HSMG*131,RECNAM*80 + LOGICAL LCUBIC,LSINGL +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NVALUE,MUPLE2 + REAL, ALLOCATABLE, DIMENSION(:) :: TERPA,VREAL + CHARACTER(LEN=80), ALLOCATABLE, DIMENSION(:) :: PARNAM +*---- +* RECOVER TREE INFORMATION +*---- + IBURN=0 + ITIME=0 + IF(NPAR.GT.0) THEN + CALL hdf5_read_data(IPMPO,"/parameters/info/NVALUE",NVALUE) + DO I=1,NPAR + IF(PARTYP(I).EQ.'BURNUP') IBURN=I + IF(PARTYP(I).EQ.'TIME') ITIME=I + ENDDO + ENDIF +*---- +* COMPUTE TERP FACTORS +*---- + TERP(:NCAL)=0.0 + IPAR(:MAXDIM)=0 + NDIM=0 + NDELTA=0 + DO 10 I=1,NPAR + IF(MUPLET(I).EQ.-1) THEN + NDIM=NDIM+1 + IF(MUTYPE(I).NE.1) NDELTA=NDELTA+1 + IF(NDIM.GT.MAXDIM) THEN + WRITE(HSMG,'(7HMCRTRP:,I4,29H-DIMENSIONAL INTERPOLATION NO, + 1 14HT IMPLEMENTED.)') NDIM + CALL XABORT(HSMG) + ENDIF + IPAR(NDIM)=I + ELSE IF((MUPLET(I).EQ.0).AND.(NVALUE(I).EQ.1)) THEN + MUPLET(I)=1 + ENDIF + 10 CONTINUE + IF(IMPX.GT.2) THEN + WRITE(IOUT,'(16H MCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(8H MCRTRP:,I4,31H-DIMENSIONAL INTERPOLATION IN M, + 1 3HPO.)') NDIM + ENDIF + ALLOCATE(MUPLE2(NPAR)) + IF(NDIM.EQ.0) THEN + MUPLE2(:NPAR)=MUPLET(:NPAR) + IF((MUPLET(IBURN).NE.0).AND.(MUPLET(ITIME).EQ.0)) THEN + MUPLE2(ITIME)=MUPLE2(IBURN) + ELSE IF((MUPLET(IBURN).EQ.0).AND.(MUPLET(ITIME).NE.0)) THEN + MUPLE2(IBURN)=MUPLE2(ITIME) + ENDIF + ICAL=0 + IF(NPAR.GT.0) ICAL=MCRCAL(NPAR,NCAL,MUPLE2,MUBASE) + IF(ICAL.GT.NCAL) CALL XABORT('MCRTRP: TERP OVERFLOW(1).') + IF(ICAL.EQ.0) GO TO 200 + IF(ICAL.EQ.-1) GO TO 210 + TERP(ICAL)=1.0 + ELSE + NTOT=1 + IDDIV(:MAXDIM)=1 + DO 70 ID=1,NDIM + IF(IPAR(ID).LE.NPAR) THEN + WRITE(RECNAM,'(25H/parameters/values/PARAM_,I0)') IPAR(ID)-1 + NID=NVALUE(IPAR(ID)) + ELSE + CALL XABORT('MCRTRP: PARAMETER INDEX OVERFLOW.') + ENDIF + NTOT=NTOT*NID + DO 15 IDTMP=1,NDIM-ID + IDDIV(IDTMP)=IDDIV(IDTMP)*NID + 15 CONTINUE + CALL hdf5_read_data(IPMPO,RECNAM,VREAL) + BURN0=VALR(IPAR(ID),1) + BURN1=VALR(IPAR(ID),2) + LSINGL=(BURN0.EQ.BURN1) + LCUBIC=LCUB2(IPAR(ID)) + IF((MUTYPE(IPAR(ID)).EQ.1).AND.LSINGL) THEN + CALL ALTERP(LCUBIC,NID,VREAL,BURN0,.FALSE.,T1D(1,ID)) + ELSE IF(MUTYPE(IPAR(ID)).EQ.1) THEN + IF(BURN0.GE.BURN1) CALL XABORT('MCRTRP: INVALID BURNUP' + 1 //' LIMITS(1).') + CALL ALTERI(LCUBIC,NID,VREAL,BURN0,BURN1,T1D(1,ID)) + DO 20 I=1,NID + T1D(I,ID)=T1D(I,ID)/(BURN1-BURN0) + 20 CONTINUE + ELSE IF((MUTYPE(IPAR(ID)).EQ.2).AND.(.NOT.LSINGL)) THEN + CALL ALTERP(LCUBIC,NID,VREAL,BURN0,.FALSE.,WORK(1)) + CALL ALTERP(LCUBIC,NID,VREAL,BURN1,.FALSE.,T1D(1,ID)) + DO 30 I=1,NID + T1D(I,ID)=T1D(I,ID)-WORK(I) + 30 CONTINUE + ELSE IF((MUTYPE(IPAR(ID)).EQ.2).AND.(LSINGL)) THEN + T1D(:NID,ID)=0.0 + ELSE IF(MUTYPE(IPAR(ID)).EQ.3) THEN +* DERIVATIVE WITH RESPECT TO A SINGLE EXIT BURNUP. USE +* EQ.(3.3) OF RICHARD CHAMBON'S THESIS. + IF(BURN0.GE.BURN1) CALL XABORT('MCRTRP: INVALID BURNUP' + 1 //' LIMITS(2).') + CALL hdf5_read_data(IPMPO,"/paramdescrip/PARNAM",PARNAM) + IF(PARNAM(IPAR(ID)).NE.'Burnup') THEN + CALL XABORT('MCRTRP: Burnup EXPECTED.') + ENDIF + DEALLOCATE(PARNAM) + ALLOCATE(TERPA(NID)) + CALL ALTERI(LCUBIC,NID,VREAL,BURN0,BURN1,TERPA(1)) + DO 40 I=1,NID + T1D(I,ID)=-TERPA(I) + 40 CONTINUE + CALL ALTERP(LCUBIC,NID,VREAL,BURN0,.FALSE.,TERPA(1)) + DO 50 I=1,NID + T1D(I,ID)=T1D(I,ID)-TERPA(I)*BURN0 + 50 CONTINUE + CALL ALTERP(LCUBIC,NID,VREAL,BURN1,.FALSE.,TERPA(1)) + DENOM=VARVAL*(BURN1-BURN0) + DO 60 I=1,NID + T1D(I,ID)=(T1D(I,ID)+TERPA(I)*BURN1)/DENOM + 60 CONTINUE + DEALLOCATE(TERPA) + ELSE + CALL XABORT('MCRTRP: INVALID OPTION.') + ENDIF + DEALLOCATE(VREAL) + NVAL(ID)=NID + 70 CONTINUE + +* Example: NDIM=3, NVALUE=(3,2,2) +* IDTOT 1 2 3 4 5 6 7 8 9 10 11 12 +* ID(1) 1 2 3 1 2 3 1 2 3 1 2 3 +* ID(2) 1 1 1 2 2 2 1 1 1 2 2 2 +* ID(3) 1 1 1 1 1 1 2 2 2 2 2 2 +* (NTOT=12, IDDIV=(6,3,1)) + DO 100 IDTOT=1,NTOT ! Ex.: IDTOT = 9 + TERTMP=1.0 + IDTMP=IDTOT + DO 80 JD=1,NDIM ! Ex.: JD = 1,2,3 + ID=(IDTMP-1)/IDDIV(JD)+1 ! Ex.: ID(NDIM...1)= 2,1,3 + IDTMP=IDTMP-(ID-1)*IDDIV(JD) ! Ex.: IDTMP = 3,3,1 + MUPLET(IPAR(NDIM-JD+1))=ID + TERTMP=TERTMP*T1D(ID,NDIM-JD+1) + 80 CONTINUE + MUPLE2(:NPAR)=MUPLET(:NPAR) + IF((MUPLET(IBURN).NE.0).AND.(MUPLET(ITIME).EQ.0)) THEN + MUPLE2(ITIME)=MUPLE2(IBURN) + ELSE IF((MUPLET(IBURN).EQ.0).AND.(MUPLET(ITIME).NE.0)) THEN + MUPLE2(IBURN)=MUPLE2(ITIME) + ENDIF + ICAL=MCRCAL(NPAR,NCAL,MUPLE2,MUBASE) + IF(ICAL.GT.NCAL) CALL XABORT('MCRTRP: TERP OVERFLOW(2).') + IF(ICAL.EQ.0) GO TO 200 + IF(ICAL.EQ.-1) GO TO 210 + TERP(ICAL)=TERP(ICAL)+TERTMP + 100 CONTINUE + ENDIF + IF(IMPX.GT.3) THEN + WRITE(IOUT,'(25H MCRTRP: TERP PARAMETERS:/(1X,1P,10E12.4))') + 1 (TERP(I),I=1,NCAL) + ENDIF + DEALLOCATE(MUPLE2) + IF(NPAR.GT.0) DEALLOCATE(NVALUE) + RETURN +*---- +* MISSING ELEMENTARY CALCULATION EXCEPTION. +*---- + 200 WRITE(IOUT,'(16H MCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + CALL XABORT('MCRTRP: MISSING ELEMENTARY CALCULATION.') + 210 WRITE(IOUT,'(16H MCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(9X,7HNVALUE=,10I4/(16X,10I4))') (NVALUE(I),I=1,NPAR) + CALL XABORT('MCRTRP: DEGENERATE ELEMENTARY CALCULATION.') + END |
