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 | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src')
285 files changed, 78529 insertions, 0 deletions
diff --git a/Donjon/src/ACR.f b/Donjon/src/ACR.f new file mode 100644 index 0000000..5ca076e --- /dev/null +++ b/Donjon/src/ACR.f @@ -0,0 +1,594 @@ +*DECK ACR + SUBROUTINE ACR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and interpolate Microlib or Macrolib information from one or +* many Apex database files. +* +*Copyright: +* Copyright (C) 2021 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file; +* IENTRY=6 for HDF5 file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The ACR: calling specifications are: +* MLIB := ACR: [ { MLIB | MLIB2 } ] APXNAM1 [[ APXNAM2 ]] [ MAPFL ] +* :: (acr\_data) ; \\ +* where +* MLIB : name of a \emph{microlib} (type L\_LIBRARY) or \emph{macrolib} +* (type L\_MACROLIB) containing the interpolated data. If this object also +* appears on the RHS of structure (ACR:, it is open in modification mode +* and updated. +* MLIB2 : name of an optional \emph{microlib} object whose content is copied +* on MLIB. +* APXNAM1 : name of the \emph{Apex file} data structure. +* APXNAM2 : name of an additional \emph{Apex file} data structure. This +* object is optional. +* MAPFL : name of the \emph{map} object containing fuel regions description, +* global parameter information (burnup, fuel/coolant temperatures, coolant +* density, etc). Keyword TABLE is expected in (acr\_data). +* acr\_data : input data structure containing interpolation information. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXR=12 + INTEGER, PARAMETER::NSTATE=40 + REAL B2, FLOTT + INTEGER ITYLCM, MAXISO, MAXNIS, MD1, MD2, MY1, MY2, NB, NCAL, + > NCH, NCOMB, NDEPL, NDFI, NDFP, NFUEL, NGRP, NHEAVY, NISOF, NISOP, + > NISOS, NITMA, NLIGHT, NBMAC, NMIL, NMIX, NOTHER, NPARM, NPAR, + > NVP, NREAC, NSTABL, NSURFD, NVTOT, NBISO, NLAM, NREA, NISOTS, + > NPRC, IMPX, ILONG, IMPY, INDIC, ITER, ITEXT4, I, IACCS, ITH, J, + > NBESP, ILUPS + CHARACTER TEXT4*4,TEXT12*12,HSMG*131,HSIGN*12,HEQUI*80, + > NMDEPL(MAXR)*8 + LOGICAL LMACRO,LCUBIC,LRES,LPURE,LTOTAL,LFROM + DOUBLE PRECISION DFLOTT + INTEGER ISTATE(NSTATE) + TYPE(C_PTR) IPMAP,IPAPX,IPLIB,IPLIB2 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXC,NISO,LISO,IADRY,ITNAM, + 1 ITZEA,MATNO,KPAX,INAM,IZAE,HREAC,IDR,KPAR,ITODO + REAL, ALLOCATABLE, DIMENSION(:) :: CONC,BPAX,RER,RRD,BPAR,YIELD + REAL, ALLOCATABLE, DIMENSION(:,:) :: TERP + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VTOT + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: YLDS,DECAY + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: TYPISO + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: NOMISO,NOMMAC,NOMIS + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:,:) :: HISO +* + SAVE NMDEPL + DATA NMDEPL/'DECAY ','NFTOT ','NG ','N2N ', + > 'N3N ','N4N ','NA ','NP ', + > 'N2A ','NNP ','ND ','NT '/ +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LE.1) CALL XABORT('ACR: MINIMUM OF 2 OBJECTS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('ACR: MACRO' + 1 //'LIB LCM OBJECT EXPECTED AT LHS.') + IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('ACR: MACRO' + 1 //'LIB IN CREATE OR MODIFICATION MODE EXPECTED.') + IACCS=JENTRY(1) + IPLIB=KENTRY(1) + IPLIB2=C_NULL_PTR + IPMAP=C_NULL_PTR + NGRP=0 + NMIX=0 + IF(IACCS.EQ.1) THEN + CALL LCMGTC(IPLIB,'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(3) + NMIX=ISTATE(1) + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ELSE + TEXT12=HENTRY(1) + CALL XABORT('ACR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_LIBRARY OR L_MACROLIB EXPECTED.') + ENDIF + ENDIF + DO 10 I=2,NENTRY + IF((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2).AND.(IENTRY(I).NE.6)) + 1 THEN + CALL XABORT('ACR: LCM OR HDF5 OBJECTS EXPECTED AT RHS.') + ENDIF + IF(JENTRY(I).NE.2) CALL XABORT('ACR:OBJECTS IN READ-ONLY MODE ' + 1 //'EXPECTED AT RHS.') + IF((IENTRY(I).EQ.1).OR.(IENTRY(I).EQ.2)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + IF(C_ASSOCIATED(IPLIB2)) CALL XABORT('ACR: ONLY ONE MICROL' + 1 //'IB EXPECTED AT RHS.') + IPLIB2=KENTRY(I) + GO TO 10 + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL XABORT('ACR: ANOTHER MACROLIB NOT EXPECTED AT RHS.') + ELSE IF(HSIGN.EQ.'L_MAP') THEN + IF(I.NE.NENTRY)CALL XABORT('ACR: FUEL-MAP EXPECTED TO BE T' + 1 //'HE LAST OBJECT.') + IF(NENTRY.LT.3)CALL XABORT('ACR: MISSING APEX FILE.') + IPMAP=KENTRY(NENTRY) + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NMIX=ISTATE(9) + ENDIF + ENDIF + 10 CONTINUE +*---- +* READ THE INPUT DATA +*---- + NVTOT=0 + LMACRO=.TRUE. + LTOTAL=.FALSE. + LCUBIC=.FALSE. + LRES=.FALSE. + LPURE=.FALSE. + B2=0.0 + ITER=-1 + IPAPX=C_NULL_PTR + HEQUI=' ' + ILUPS=0 + IMPX=1 + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACR: CHARACTER DATA EXPECTED(1).') + 30 IF(TEXT12.EQ.'EDIT') THEN +* READ THE PRINT INDEX. + CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('ACR: INTEGER DATA EXPECTED(1).') + ELSE IF(TEXT12.EQ.'NMIX') THEN +* READ THE MAXIMUM NUMBER OF MATERIAL MIXTURES. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('ACR: INTEGER DATA EXPECTED(2).') + IF(NITMA.LT.NMIX) THEN + WRITE(HSMG,'(20HACR: NMIX MUST BE >=,I8)') NMIX + CALL XABORT(HSMG) + ENDIF + NMIX=NITMA + ELSE IF(TEXT12.EQ.'MACRO') THEN + LMACRO=.TRUE. + ELSE IF(TEXT12.EQ.'MICRO') THEN + LMACRO=.FALSE. + ELSE IF(TEXT12.EQ.'TOTAL') THEN + IF(LMACRO) CALL XABORT('ACR: TOTAL LIMITED TO MICRO OPTION.') + LTOTAL=.TRUE. + ELSE IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + ELSE IF(TEXT12.EQ.'RES') THEN + IF((IACCS.EQ.0).AND.(.NOT.C_ASSOCIATED(IPLIB2))) THEN + CALL XABORT('ACR: RHS MICROLIB EXPECTED WITH RES OPTION.') + ENDIF + LRES=.TRUE. + ELSE IF(TEXT12.EQ.'PURE') THEN + LPURE=.TRUE. + ELSE IF(TEXT12.EQ.'UPS') THEN + ILUPS=1 + ELSE IF(TEXT12.EQ.'APEX') THEN + IF(NMIX.EQ.0) CALL XABORT('ACR: ZERO NUMBER OF MIXTURES.') + IF(C_ASSOCIATED(IPMAP)) THEN + WRITE(IOUT,'(/43H ACR: ***WARNING*** A FUEL MAP IS SET AT RH, + 1 26HS; KEYWORD TABLE EXPECTED.)') + ENDIF + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACR: CHARACTER DATA EXPECTED(2).') + ITH=0 + DO 50 I=2,NENTRY + IF(C_ASSOCIATED(KENTRY(I),IPLIB2)) GO TO 50 + IF(TEXT12.EQ.HENTRY(I)) THEN + IPAPX=KENTRY(I) + ITH=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('ACR: APEX '//TEXT12//' NOT FOUND.') + 60 WRITE(IOUT,320) HENTRY(ITH) + CALL APXTOC(IPAPX,IMPX,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,NVP, + 1 NISOF,NISOP,NISOS,NCAL,NGRP,NISOTS,NSURFD,NPRC) + MY1=NBMAC+NISOF + MY2=NISOP + MD1=NLAM + MD2=NBISO+NBMAC + ALLOCATE(MIXC(NMIX),NISO(NMIX),LISO(NMIX),HISO(NMIX,MD2), + 1 ITODO(NMIX*MD2)) + ALLOCATE(TERP(NCAL,NMIX),CONC(NMIX*MD2)) +* + CALL ACRDRV(IPAPX,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2,NPAR,ITER, + 1 MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC,ITODO,LFROM) + GO TO 130 + ELSE IF(TEXT12.EQ.'TABLE') THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('ACR: MISSING FUEL-MA' + 1 //'P OBJECT.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + NGRP=ISTATE(4) + NFUEL=ISTATE(7) + NPARM=ISTATE(8) + IF(NCOMB.EQ.0) CALL XABORT('ACR: NUMBER OF COMBUSTION ZONES NO' + 1 //'T YET DEFINED IN THE FUEL MAP NCOMB=0.') + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACR: CHARACTER DATA EXPECTED(3).') + ITH=0 + DO 80 I=2,NENTRY + IF((C_ASSOCIATED(KENTRY(I),IPLIB2)).OR. + 1 (C_ASSOCIATED(KENTRY(I),IPMAP))) GO TO 80 + IF(TEXT12.EQ.HENTRY(I)) THEN + IPAPX=KENTRY(I) + ITH=I + GO TO 90 + ENDIF + 80 CONTINUE + CALL XABORT('ACR: APEX FILE '//TEXT12//' NOT FOUND.') + 90 WRITE(IOUT,320) HENTRY(ITH) + CALL APXTOC(IPAPX,IMPX,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,NVP, + 1 NISOF,NISOP,NISOS,NCAL,NGRP,NISOTS,NSURFD,NPRC) + MY1=NBMAC+NISOF + MY2=NISOP + MD1=NLAM + MD2=NBISO+NBMAC + ALLOCATE(MIXC(NMIX),NISO(NMIX),LISO(NMIX),HISO(NMIX,MD2), + 1 ITODO(NMIX*MD2)) + ALLOCATE(TERP(NCAL,NMIX),CONC(NMIX*MD2)) +* + CALL ACRRGR(IPAPX,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2,NCH,NB, + 1 NFUEL,NPARM,NPAR,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC, + 2 ITODO,LFROM) + GO TO 130 + ELSE IF(TEXT12.EQ.'EQUI') THEN + CALL REDGET(INDIC,NITMA,FLOTT,HEQUI,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACR: CHARACTER DATA EXPECTED(4).') + ELSE IF(TEXT12.EQ.'LEAK') THEN + CALL REDGET(INDIC,NITMA,B2,TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('ACR: REAL DATA EXPECTED.') + ELSE IF(TEXT12.EQ.'CHAIN') THEN + IF(LMACRO) CALL XABORT('ACR: MICRO KEYWORD EXPECTED.') + IF(LTOTAL) CALL XABORT('ACR: TOTAL AND CHAIN KEYWORDS ARE EXCL' + 1 //'USIVE.') + CALL APXTOC(IPAPX,0,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,NVP,NISOF, + 1 NISOP,NISOS,NCAL,NGRP,NISOTS,NSURFD,NPRC) + IF(NBISO.EQ.0) CALL XABORT('ACR: NO PARTICULARIZED ISOTOPES.') + IF(NBMAC.EQ.0) CALL XABORT('ACR: NO MACROSCOPIC SETS.') + MY1=NBMAC+NISOF + MY2=NISOP + MD1=NLAM + MD2=NBISO+NBMAC + CALL LCMLEN(IPLIB,'VTOT_',ILONG,ITYLCM) + IF(ILONG.NE.NVTOT) CALL XABORT('ACR: INVALID LENGTH: VTOT(1).') + CALL LCMLEN(IPLIB,'YLDS_',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2*NVTOT) CALL XABORT('ACR: INVALID LENGTH: Y' + 1 //'LDS(1).') + CALL LCMLEN(IPLIB,'DECAYC_',ILONG,ITYLCM) + IF(ILONG.NE.MD1*MD2*NVTOT) CALL XABORT('ACR: INVALID LENGTH: D' + 1 //'ECAYC(1)') + ALLOCATE(VTOT(NVTOT),YLDS(MY1,MY2,NVTOT),DECAY(MD1,MD2,NVTOT), + 1 NOMIS(NBISO+NBMAC)) + CALL LCMGET(IPLIB,'VTOT_',VTOT) + CALL LCMGET(IPLIB,'YLDS_',YLDS) + CALL LCMGET(IPLIB,'DECAYC_',DECAY) + IF(hdf5_group_exists(IPAPX,"/explicit/")) THEN + CALL hdf5_read_data(IPAPX,"/explicit/ISONAME",NOMISO) + ELSE IF(hdf5_group_exists(IPAPX,"/expli001/")) THEN + CALL hdf5_read_data(IPAPX,"/expli001/ISONAME",NOMISO) + ELSE + CALL XABORT('ACR: GROUP explicit NOT FOUND IN HDF5 FILE.') + ENDIF + NOMIS(:NBISO)=NOMISO(:NBISO) + DEALLOCATE(NOMISO) + IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN + CALL hdf5_read_data(IPAPX,"/physconst/ISOTYP",TYPISO) + ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN + CALL hdf5_read_data(IPAPX,"/physc001/ISOTYP",TYPISO) + ELSE + CALL XABORT('ACR: GROUP physconst NOT FOUND IN HDF5 FILE.') + ENDIF + ALLOCATE(IADRY(MD2)) + NISOF=0 + NISOP=0 + NISOS=0 + DO I=1,NBISO + IF(TYPISO(I).EQ.'FISS') THEN + NISOF=NISOF+1 + IADRY(I)=NISOF + ELSE IF(TYPISO(I).EQ.'F.P.') THEN + NISOP=NISOP+1 + IADRY(I)=-NISOP + ELSE + NISOS=NISOS+1 + IADRY(I)=0 + ENDIF + ENDDO + IF(NBMAC.GT.0) THEN + IF(hdf5_group_exists(IPAPX,"/explicit/")) THEN + CALL hdf5_read_data(IPAPX,"/explicit/MACNAME",NOMMAC) + ELSE IF(hdf5_group_exists(IPAPX,"/expli001/")) THEN + CALL hdf5_read_data(IPAPX,"/expli001/MACNAME",NOMMAC) + ELSE + CALL XABORT('ACR: GROUP explicit NOT FOUND IN HDF5 FILE.') + ENDIF + DO I=1,NBMAC + IF(NOMMAC(I).EQ.'TOTAL') THEN + NOMIS(NBISO+I)=' ' + IADRY(NBISO+I)=0 + ELSE IF(NOMMAC(I).EQ.'RESIDUAL') THEN + NOMIS(NBISO+I)='*MAC*RES' + IADRY(NBISO+I)=0 + ENDIF + ENDDO + DEALLOCATE(NOMMAC) + ENDIF +* + NBESP=1 + ALLOCATE(ITNAM(3*MD2),ITZEA(MD2),MATNO(MD2), + 1 KPAX((MD2+MAXR)*MD2),BPAX((MD2+MAXR)*MD2*NBESP)) + TEXT4=' ' + READ(TEXT4,'(A4)') ITEXT4 + ITNAM(:3*MD2)=ITEXT4 + ITZEA(:MD2)=0 + MATNO(:MD2)=0 + KPAX(:(MD2+MAXR)*MD2)=0 + BPAX(:(MD2+MAXR)*MD2*NBESP)=0.0 + CALL SCREIR(NMDEPL,MY1,MY2,MD1,MD2,NOMIS,IADRY,NVTOT,VTOT, + 1 YLDS,DECAY,ITNAM,ITZEA,KPAX,BPAX) + DEALLOCATE(IADRY,NOMIS,DECAY,YLDS,VTOT) + CALL LIBWET(MAXR,MD2,NBESP,NSTATE,NMDEPL,ITNAM,ISTATE,MATNO, + 1 KPAX,BPAX) + NDEPL=ISTATE(1) + NDFI=ISTATE(2) + NDFP=ISTATE(3) + NHEAVY=ISTATE(4) + NLIGHT=ISTATE(5) + NOTHER=ISTATE(6) + NSTABL=ISTATE(7) + NREAC=ISTATE(8) + NPAR=ISTATE(9) + NBESP=MAX(1,ISTATE(10)) +*---- +* ALLOCATE DECAY CHAIN +*---- + NDEPL=MAX(NDEPL,1) + NDFI=MAX(NDFI,1) + NDFP=MAX(NDFP,1) + ALLOCATE(INAM(3*NDEPL),IZAE(NDEPL),IDR(NREAC*NDEPL), + 1 RER(NREAC*NDEPL),RRD(NDEPL),KPAR(NPAR*NDEPL),BPAR(NPAR*NDEPL), + 2 YIELD(NDFI*NDFP*NBESP)) +*---- +* SET DECAY CHAIN +*---- + CALL LIBWED(MAXR,MD2,NBESP,NDEPL,NDFI,NDFP,NHEAVY,NLIGHT,NOTHER, + > NREAC,NPAR,ITNAM,ITZEA,MATNO,KPAX,BPAX,INAM,IZAE, + > IDR,RER,RRD,KPAR,BPAR,YIELD) +*---- +* RELEASE WORK VECTORS FOR WIMS-AECL, WIMS-NEA, DRAGLIB +* AND INPUT FILE +*---- + DEALLOCATE(BPAX,KPAX,MATNO,ITZEA,ITNAM) +*---- +* SELECT USED DEPLETION REACTION NAMES +*---- + ALLOCATE(HREAC(2*NREAC)) + DO 100 I=1,NREAC + READ(NMDEPL(I),'(2A4)') (HREAC(2*(I-1)+J),J=1,2) + 100 CONTINUE +*---- +* PRINT DECAY CHAIN IF REQUIRED +*---- + IMPY=IMPX+2 + CALL LIBEPR(IMPY,NBESP,NDEPL,NSTABL,NDFI,NDFP,NREAC,NPAR,INAM, + > HREAC,IDR,RER,RRD,KPAR,BPAR,YIELD,IZAE) +*---- +* SAVE CHAIN +*---- + CALL LCMSIX(IPLIB,'DEPL-CHAIN',1) + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + NDEPL=ISTATE(1) + CALL LCMPUT(IPLIB,'ISOTOPESDEPL',3*NDEPL,3,INAM) + CALL LCMPUT(IPLIB,'CHARGEWEIGHT',NDEPL,1,IZAE) + CALL LCMPUT(IPLIB,'DEPLETE-IDEN',2*NREAC,3,HREAC) + CALL LCMPUT(IPLIB,'DEPLETE-REAC',NREAC*NDEPL,1,IDR) + CALL LCMPUT(IPLIB,'DEPLETE-ENER',NREAC*NDEPL,2,RER) + CALL LCMPUT(IPLIB,'DEPLETE-DECA',NDEPL,2,RRD) + CALL LCMPUT(IPLIB,'PRODUCE-REAC',NPAR*NDEPL,1,KPAR) + CALL LCMPUT(IPLIB,'PRODUCE-RATE',NPAR*NDEPL,2,BPAR) + IF(NDFP.GT.0) CALL LCMPUT(IPLIB,'FISSIONYIELD',NDFI*NDFP*NBESP, + > 2,YIELD) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(11)=NDEPL + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* DEALLOCATE DECAY CHAIN ARRAYS +*---- + DEALLOCATE(YIELD,BPAR,KPAR,RRD,RER,IDR,IZAE,INAM) + ELSE IF(TEXT12.EQ.';') THEN + GO TO 200 + ELSE + CALL XABORT('ACR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* PERFORM MULTIPARAMETER INTERPOLATION +*---- + 130 CALL APXTOC(IPAPX,0,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,NVP,NISOF, + 1 NISOP,NISOS,NCAL,NGRP,NISOTS,NSURFD,NPRC) + MD2=NBISO+NBMAC + IF(.NOT.LFROM) NMIL=1 +*---- +* BUILD THE INTERPOLATED MACROLIB +*---- + IF(LMACRO.AND.(MAXNIS.EQ.0)) THEN +* build a macrolib + CALL ACRMAC(IPLIB,IPAPX,IACCS,NMIL,NMIX,NGRP,IMPX,HEQUI,NCAL, + 1 NSURFD,ILUPS,MIXC,TERP,LPURE,B2,LFROM) + ELSE +* build a microlib + IF(LMACRO)THEN + CALL LCMOP(IPLIB,'*TEMPORARY*',0,1,0) + IACCS=0 + ENDIF + IF(IACCS.EQ.0)THEN + MAXISO=MD2*NMIX + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXISO=MAX(MD2*NMIX,ISTATE(2)) + ENDIF + NVTOT=NVTOT+1 + ALLOCATE(VTOT(NVTOT),YLDS(MY1,MY2,NVTOT),DECAY(MD1,MD2,NVTOT)) + IF(NVTOT.GT.1) THEN + CALL LCMLEN(IPLIB,'VTOT_',ILONG,ITYLCM) + IF(ILONG.NE.NVTOT-1) CALL XABORT('ACR: INVALID LENGTH: VTOT(' + 1 //'2).') + CALL LCMLEN(IPLIB,'YLDS_',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2*(NVTOT-1)) CALL XABORT('ACR: INVALID LEN' + 1 //'GTH: YLDS(2).') + CALL LCMGET(IPLIB,'VTOT_',VTOT) + IF(MY1*MY2.GT.0) CALL LCMGET(IPLIB,'YLDS_',YLDS) + IF(MD1*MD2.GT.0) CALL LCMGET(IPLIB,'DECAYC_',DECAY) + ENDIF + CALL ACRLIB(MAXNIS,MAXISO,IPLIB,IPAPX,IACCS,NMIX,NGRP,IMPX, + 1 HEQUI,NCAL,ITER,MY1,MY2,MD1,MD2,TERP,NISO,LISO,HISO,CONC,ITODO, + 2 MIXC,LRES,LPURE,LTOTAL,ILUPS,B2,LFROM,VTOT(NVTOT), + 3 YLDS(1,1,NVTOT),DECAY(1,1,NVTOT)) + CALL LCMPUT(IPLIB,'VTOT_',NVTOT,4,VTOT) + IF(MY1*MY2.GT.0) THEN + CALL LCMPUT(IPLIB,'YLDS_',MY1*MY2*NVTOT,4,YLDS) + ENDIF + IF(MD1*MD2.GT.0) THEN + CALL LCMPUT(IPLIB,'DECAYC_',MD1*MD2*NVTOT,4,DECAY) + ENDIF + DEALLOCATE(VTOT,DECAY,YLDS) + IF(LMACRO) THEN + CALL LCMVAL(IPLIB,' ') + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMEQU(IPLIB,KENTRY(1)) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMCL(IPLIB,2) + ENDIF + ENDIF + DEALLOCATE(LISO,NISO,HISO,ITODO,CONC,TERP,MIXC) +*---- +* PRINT THE STATE VECTOR +*---- + IF(IMPX.GT.0) THEN + IF(LMACRO) THEN + CALL LCMGET(KENTRY(1),'STATE-VECTOR',ISTATE) + WRITE(IOUT,290) IMPX,(ISTATE(I),I=1,7),ISTATE(9),ISTATE(12) + IF(IMPX.GT.3) CALL LCMLIB(KENTRY(1)) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,300) IMPX,(ISTATE(I),I=1,12) + WRITE(IOUT,310) (ISTATE(I),I=13,15),(ISTATE(I),I=17,24) + IF(IMPX.GT.3) CALL LCMLIB(IPLIB) + ENDIF + ENDIF +*---- +* CONTINUE DATA PROCESSING +*---- + IF(ITER.EQ.0) THEN + GO TO 200 + ELSE IF(ITER.EQ.1) THEN + TEXT12='APEX' + GO TO 30 + ELSE IF(ITER.EQ.2) THEN + TEXT12='TABLE' + GO TO 30 + ELSE IF(ITER.EQ.3) THEN + TEXT12='CHAIN' + GO TO 30 + ENDIF +*---- +* LEAVE ACR: +*---- + 200 RETURN +* + 290 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NGROUP,I6,28H (NUMBER OF ENERGY GROUPS)/ + 3 7H NBMIX ,I6,39H (NUMBER OF MIXTURES IN THE MACROLIB)/ + 4 7H NANISO,I6,34H (MAXIMUM SCATTERING ANISOTROPY)/ + 5 7H NIFISS,I6,45H (MAXIMUM NUMBER OF FISSILE ISOTOPES IN A M, + 6 7HIXTURE)/ + 7 7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 8 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 9 43H=RECOVER FROM LIBRARY/4=LEAKAGE CORRECTION)/ + 1 7H NLG ,I6,39H (NUMBER OF DELAYED PRECURSOR GROUPS)/ + 2 7H ILEAK ,I6,40H (1=DIFF AVAILABLE; 2=DIFFX AVAILABLE)/ + 3 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 4 10H GAP INFO)) + 300 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H MAXMIX,I6,31H (MAXIMUM NUMBER OF MIXTURES)/ + 3 7H NBISO ,I6,36H (NUMBER OF ISOTOPES OR MATERIALS)/ + 4 7H NGRP ,I6,28H (NUMBER OF ENERGY GROUPS)/ + 5 7H NL ,I6,30H (NUMBER OF LEGENDRE ORDERS)/ + 6 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 7 57H=RECOVER FROM LIBRARY/3=WIMS-D TYPE/4=LEAKAGE CORRECTION)/ + 8 7H IPROB ,I6,23H (0=DIRECT/1=ADJOINT)/ + 9 7H ITIME ,I6,28H (1=STEADY-STATE/2=PROMPT)/ + 1 7H NLIB ,I6,32H (NUMBER OF SETS OF LIBRARIES)/ + 2 7H NGF ,I6,48H (NUMBER OF FAST GROUP WITHOUT SELF-SHIELDING)/ + 3 7H IGRMAX,I6,41H (LAST GROUP INDEX WITH SELF-SHIELDING)/ + 4 7H NDEPL ,I6,33H (NUMBER OF DEPLETING ISOTOPES)/ + 5 7H NCOMB ,I6,33H (NUMBER OF DEPLETING MIXTURES)) + 310 FORMAT(7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 1 7H NBMIX ,I6,23H (NUMBER OF MIXTURES)/ + 2 7H NRES ,I6,40H (NUMBER OF SETS OF RESONANT MIXTURES)/ + 3 7H IPROC ,I6,48H (-1=SKIP LIBRARY PROCESSING/0=DILUTION INTERP, + 4 48HOLATION/1=USE PHYSICAL TABLES/2=BUILD A DRAGLIB/, + 5 55H3=COMPUTE CALENDF TABLES/4=COMPUTE SLOWING-DOWN TABLES)/ + 6 7H IMAC ,I6,45H (0=DO NOT/1=DO BUILD AN EMBEDDED MACROLIB)/ + 7 7H NDEL ,I6,31H (NUMBER OF PRECURSOR GROUPS)/ + 8 7H NFISS ,I6,31H (NUMBER OF FISSILE ISOTOPES)/ + 9 7H ISOADD,I6,37H (0=COMPLETE BURNUP CHAIN/1=DO NOT)/ + 1 7H MAXISM,I6,40H (MAX. NUMBER OF ISOTOPES PER MIXTURE)/ + 2 7H IPRECI,I6,34H (CALENDF ACCURACY FLAG:1/2/3/4)/ + 3 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 4 10H GAP INFO)) + 320 FORMAT(/31H ACR: INTERPOLATING APEX FILE ',A12,2H'.) + END diff --git a/Donjon/src/ACRDRV.f b/Donjon/src/ACRDRV.f new file mode 100644 index 0000000..f306c2a --- /dev/null +++ b/Donjon/src/ACRDRV.f @@ -0,0 +1,404 @@ +*DECK ACRDRV + SUBROUTINE ACRDRV(IPAPX,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2,NPAR, + 1 ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC,ITODO,LFROM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for Apex file interpolation. Use user-defined +* global parameters. +* +*Copyright: +* Copyright (C) 2021 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPAPX address of the Apex file. +* LCUBIC =.TRUE.: cubic Ceschino interpolation; =.FALSE: linear +* Lagrange interpolation. +* NMIX maximum number of material mixtures in the microlib. +* IMPX print parameter (equal to zero for no print). +* NMIL number of material mixtures in the Apex file. +* NCAL number of elementary calculations in the Apex file. +* MD2 number of particularized and macro isotopes in the Apex file. +* NPAR number of parameters +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another Apex file; +* =2 use another L_MAP + Apex file). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the Apex 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) +* LFROM macroregion flag (=.true. if 'xs n' groups are set). +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPAPX + INTEGER NMIX,IMPX,NMIL,NCAL,MD2,NPAR,ITER,MAXNIS,MIXC(NMIX), + 1 NISO(NMIX),ITODO(NMIX,MD2) + REAL TERP(NCAL,NMIX),CONC(NMIX,MD2) + LOGICAL LCUBIC,LISO(NMIX),LFROM + CHARACTER(LEN=8) HISO(NMIX,MD2) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXLIN=132 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + REAL, PARAMETER::REPS=1.0E-4 + INTEGER I, J, IBM, IBMOLD, ICAL, INDIC, IPAR, ITYPE, JBM, NITMA + REAL SUM, FLOTT + CHARACTER TEXT24*24,TEXT72*72,HSMG*131,TEXT132*132, + 1 VALH(MAXPAR)*12,RECNAM*80,HCUBIC*12 + INTEGER VALI(MAXPAR),MUPLET(2*MAXPAR),MUTYPE(2*MAXPAR) + INTEGER RANK,TYPE,NBYTE,DIMSR(5) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2) + LOGICAL LCUB2(MAXPAR) +*---- +* ALLOCATABLE ARRAYS +*---- + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LDELTA + INTEGER, ALLOCATABLE, DIMENSION(:) :: NVALUE,VINTE + REAL, ALLOCATABLE, DIMENSION(:) :: VREAL + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: PARFMT + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: VCHAR + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: PARKEY + CHARACTER(LEN=132), ALLOCATABLE, DIMENSION(:) :: TEXT132V1 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(LDELTA(NMIX)) +*---- +* RECOVER INFORMATION FOR THE APEX FILE. +*---- + CALL hdf5_info(IPAPX,"/Calculation_Content",RANK,TYPE,NBYTE,DIMSR) + IF(RANK.GT.MAXLIN) CALL XABORT('ACRDRV: MAXLIN OVERFLOW.') + IF(NPAR.GT.MAXPAR) CALL XABORT('ACRDRV: MAXPAR OVERFLOW.') + IF((RANK.EQ.1).AND.(DIMSR(1).EQ.1)) THEN + CALL hdf5_read_data(IPAPX,"/Calculation_Content",TEXT132) + IF(IMPX.GT.0) WRITE(IOUT,'(1X,A)') TEXT132 + ELSE IF(RANK.EQ.1) THEN + CALL hdf5_read_data(IPAPX,"/Calculation_Content",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(IPAPX,"/paramdescrip/PARNAM",PARKEY) + CALL hdf5_read_data(IPAPX,"/paramdescrip/PARFMT",PARFMT) + ENDIF + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 + 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 +*---- +* 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 + NISO(:NMIX)=0 + LISO(:NMIX)=.TRUE. + LDELTA(:NMIX)=.FALSE. + ITODO(:NMIX,:MD2)=0 + LFROM=.FALSE. + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + 20 IF(TEXT72.EQ.'MIX') THEN + MUPLET(:NPAR)=0 + MUTYPE(:NPAR)=0 + VALI(:NPAR)=0 + VALR(:NPAR,1)=0.0 + VALR(:NPAR,2)=0.0 + DO 30 I=1,NPAR + VALH(I)=' ' + 30 CONTINUE + LCUB2(:NPAR)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('ACRDRV: INTEGER DATA EXPECTED.') + IF(IBM.GT.NMIX) THEN + WRITE(HSMG,'(27HACRDRV: NMIX OVERFLOW (IBM=,I8,6H NMIX=,I8, + 1 2H).)') IBM,NMIX + CALL XABORT(HSMG) + ENDIF + IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT72.EQ.'FROM') THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('ACRDRV: INTEGER DATA EXPECTED.') + IF(IBMOLD.GT.NMIL) CALL XABORT('ACRDRV: APEX MIX OVERFLOW' + 1 //'(1).') + MIXC(IBM)=IBMOLD + LFROM=.TRUE. + GO TO 10 + ELSE IF(TEXT72.EQ.'USE') THEN + IF(IBM.GT.NMIL) CALL XABORT('SCRDRV: APEX MIX OVERFLOW(2).') + MIXC(IBM)=IBM + LFROM=.TRUE. + GO TO 10 + ENDIF + MIXC(IBM)=IBMOLD + GO TO 20 + ELSE IF(TEXT72.EQ.'MICRO') THEN + IF(IBM.EQ.0) CALL XABORT('ACRDRV: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT72.EQ.'ALL') THEN + LISO(IBM)=.TRUE. + ELSE IF(TEXT72.EQ.'ONLY') THEN + LISO(IBM)=.FALSE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + 40 IF(TEXT72.EQ.'ENDMIX') THEN + GO TO 20 + ELSE IF(TEXT72.EQ.'NOEV') THEN + IF(NISO(IBM).EQ.0) CALL XABORT('ACRDRV: MISPLACED NOEV.') + ITODO(IBM,NISO(IBM))=1 + ELSE + NISO(IBM)=NISO(IBM)+1 + IF(NISO(IBM).GT.MD2) CALL XABORT('ACRDRV: MD2 OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISO(IBM)) + HISO(IBM,NISO(IBM))=TEXT72(:8) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.EQ.2) THEN + CONC(IBM,NISO(IBM))=FLOTT + ELSE IF((INDIC.EQ.3).AND.(TEXT72.EQ.'*')) THEN + CONC(IBM,NISO(IBM))=-99.99 + ELSE + CALL XABORT('ACRDRV: INVALID HISO DATA.') + ENDIF + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + GO TO 40 + ELSE IF((TEXT72.EQ.'SET').OR.(TEXT72.EQ.'DELTA')) THEN + IF(IBM.EQ.0) CALL XABORT('ACRDRV: MIX NOT SET (2).') + ITYPE=0 + IF(TEXT72.EQ.'SET') THEN + ITYPE=1 + ELSE IF(TEXT72.EQ.'DELTA') THEN + ITYPE=2 + LDELTA(IBM)=.TRUE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + IF((TEXT72.EQ.'LINEAR').OR.(TEXT72.EQ.'CUBIC')) THEN + HCUBIC=TEXT24(:12) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + ELSE + HCUBIC=' ' + ENDIF + IF(INDIC.NE.3) CALL XABORT('ACRDRV: CHARACTER DATA EXPECTED.') + DO 50 I=1,NPAR + IF(TEXT24.EQ.PARKEY(I)) THEN + IPAR=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('ACRDRV: PARAMETER '//TRIM(TEXT24)//' NOT FOUND.') + 60 IF(HCUBIC.EQ.'LINEAR') THEN + LCUB2(IPAR)=.FALSE. + ELSE IF(HCUBIC.EQ.'CUBIC') THEN + LCUB2(IPAR)=.TRUE. + ENDIF + CALL hdf5_read_data(IPAPX,"/paramdescrip/NVALUE",NVALUE) + IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('ACRDRV: MAXVAL OVERFL' + 1 //'OW.') + WRITE(RECNAM,'(''/paramvalues/PVAL'',I8)') IPAR + CALL hdf5_info(IPAPX,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + CALL hdf5_list(IPAPX,RECNAM) + FLUSH(6) + WRITE(HSMG,'(25HACRDRV: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + IF(PARFMT(IPAR).EQ.'ENTIER') THEN + IF(ITYPE.NE.1) CALL XABORT('ACRDRV: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('ACRDRV: INTEGER DATA EXPECTED.') + CALL hdf5_read_data(IPAPX,RECNAM,VINTE) + DO 70 J=1,NVALUE(IPAR) + IF(VALI(IPAR).EQ.VINTE(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VINTE) + GO TO 10 + ENDIF + 70 CONTINUE + WRITE(HSMG,'(26HACRDRV: INTEGER PARAMETER ,A,9H WITH VAL, + 1 2HUE,I5,33H NOT FOUND IN APEX FILE DATABASE.)') + 2 TRIM(PARKEY(IPAR)),VALI(IPAR) + CALL XABORT(HSMG) + ELSE IF(PARFMT(IPAR).EQ.'FLOTTANT') THEN + CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT72,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('ACRDRV: REAL DATA EXPECTED.') + VALR(IPAR,2)=VALR(IPAR,1) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.EQ.2) THEN + VALR(IPAR,2)=FLOTT + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + ENDIF + CALL hdf5_read_data(IPAPX,RECNAM,VREAL) + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) THEN + DO 80 J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN + MUPLET(IPAR)=J + IF(ITYPE.NE.1) MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VREAL) + GO TO 20 + ENDIF + 80 CONTINUE + ENDIF + IF(VALR(IPAR,1).LT.VREAL(1)) THEN + WRITE(HSMG,'(23HACRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (<,E12.4,1H))') + 2 TRIM(PARKEY(IPAR)),VALR(IPAR,1),VREAL(1) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,2).GT.VREAL(NVALUE(IPAR))) THEN + WRITE(HSMG,'(23HACRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (>,E12.4,1H))') + 2 TRIM(PARKEY(IPAR)),VALR(IPAR,1),VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,1).GT.VALR(IPAR,2)) THEN + WRITE(HSMG,'(23HACRDRV: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,1H.)') TRIM(PARKEY(IPAR)), + 2 VALR(IPAR,1),VALR(IPAR,2) + CALL XABORT(HSMG) + ENDIF + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VREAL) + GO TO 20 + ELSE IF(PARFMT(IPAR).EQ.'CHAINE') THEN + IF(ITYPE.NE.1) CALL XABORT('ACRDRV: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3) CALL XABORT('ACRDRV: STRING DATA EXPECTED.') + CALL hdf5_read_data(IPAPX,RECNAM,VCHAR) + DO 90 J=1,NVALUE(IPAR) + IF(VALH(IPAR).EQ.VCHAR(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VCHAR) + GO TO 10 + ENDIF + 90 CONTINUE + WRITE(HSMG,'(25HACRDRV: STRING PARAMETER ,A,10H WITH VALU, + 1 2HE ,A12,33H NOT FOUND IN APEX FILE DATABASE.)') + 2 TRIM(PARKEY(IPAR)), VALH(IPAR) + CALL XABORT(HSMG) + ELSE + CALL XABORT('ACRDRV: INVALID FORMAT='//PARFMT(IPAR)) + ENDIF + ELSE IF(TEXT72.EQ.'ENDMIX') THEN +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(PARFMT(IPAR).EQ.'FLOTTANT')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H ACRDRV: GLOBAL PARAMETER:,A,7H ->CUBI, + 1 16HC INTERPOLATION.)') TRIM(PARKEY(IPAR)) + ELSE + WRITE(IOUT,'(26H ACRDRV: GLOBAL PARAMETER:,A,7H ->LINE, + 1 17HAR INTERPOLATION.)') TRIM(PARKEY(IPAR)) + ENDIF + ENDIF + ENDDO + ENDIF + IF(IBMOLD.GT.NMIL)CALL XABORT('ACRDRV: APEX MIX OVERFLOW(3).') + IF(IBM.GT.NMIX)CALL XABORT('ACRDRV: MIX OVERFLOW (MICROLIB).') + IF(NCAL.EQ.1) THEN + TERP(1,IBM)=1.0 + ELSE + CALL ACRTRP(IPAPX,LCUB2,IMPX,NPAR,NCAL,MUPLET,MUTYPE,VALR, + 1 0.0,TERP(1,IBM)) + ENDIF + IBM=0 + ELSE IF((TEXT72.EQ.'APEX').OR.(TEXT72.EQ.'TABLE').OR. + 1 (TEXT72.EQ.'CHAIN').OR.(TEXT72.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT72.EQ.';') ITER=0 + IF(TEXT72.EQ.'APEX') ITER=1 + IF(TEXT72.EQ.'TABLE') ITER=2 + IF(TEXT72.EQ.'CHAIN') ITER=3 + DO 150 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 150 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('ACRDRV: MAXNIS OVERFLOW.') + IF(LDELTA(IBM)) THEN + SUM=0.0 + ELSE + SUM=1.0 + ENDIF + DO 140 ICAL=1,NCAL + SUM=SUM-TERP(ICAL,IBM) + 140 CONTINUE + IF(ABS(SUM).GT.1.0E-4) THEN + WRITE(HSMG,'(43HACRDRV: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 150 CONTINUE + GO TO 160 + ELSE + CALL XABORT('ACRDRV: '//TEXT72//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 10 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 160 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H ACRDRV: INTERPOLATION FACTORS)') + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) THEN + WRITE(IOUT,170) ICAL,(TERP(ICAL,JBM),JBM=1,NMIX) + EXIT + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + IF(NPAR.GT.0) DEALLOCATE(PARFMT,PARKEY) + DEALLOCATE(LDELTA) + RETURN + 170 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/ACRISO.f b/Donjon/src/ACRISO.f new file mode 100644 index 0000000..11645b8 --- /dev/null +++ b/Donjon/src/ACRISO.f @@ -0,0 +1,262 @@ +*DECK ACRISO + SUBROUTINE ACRISO(IPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS,SIGS, + > SS2D,TAUXFI,LXS,LAMB,CHIRS,BETAR,INVELS,INAME,LSTRD,LPURE,ILUPS, + > ITRANC,IFISS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store an isotopic data recovered from an APEX file into a Microlib. +* +*Copyright: +* Copyright (C) 2021 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 +* IPLIB address of the output microlib LCM object +* NREA number of reactions in the Apex file +* NGRP number of energy groups +* NL maximum Legendre order (NL=1 is for isotropic scattering) +* NPRC number of delayed neutron precursor groups +* NOMREA names of reactions in the Apex file +* NWT0 average flux +* XS cross sections per reaction +* SIGS scattering cross sections +* SS2D complete scattering matrix +* TAUXFI interpolated fission rate +* LXS existence flag of each reaction +* LAMB decay constants of the delayed neutron precursor groups +* CHIRS delayed neutron emission spectrums +* BETAR delayed neutron fractions +* INVELS group-average of the inverse neutron velocity +* INAME name of the isotope. +* LSTRD flag set to .true. if B2=0.0. +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* +*Parameters: output +* ITRANC transport correction flag +* IFISS fission flag +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB + INTEGER NREA,NGRP,NL,NPRC,INAME(2),ITRANC,IFISS,ILUPS + REAL NWT0(NGRP),XS(NGRP,NREA),SIGS(NGRP,NL),SS2D(NGRP,NGRP,NL), + > TAUXFI,LAMB(NPRC),CHIRS(NGRP,NPRC),BETAR(NPRC),INVELS(NGRP) + LOGICAL LXS(NREA),LSTRD,LPURE + CHARACTER NOMREA(NREA)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER I0, IGFROM, IGMAX, IGMIN, IGR, JGR, IGTO, ILEG, IPRC, + & IREA, NXSCMP, IL, IRENT0 + LOGICAL LDIFF,LHFACT,LZERO + REAL CONVEN,FF,CSCAT + CHARACTER TEXT12*12 + CHARACTER HCM(0:10)*2,NAMLEG*2 + INTEGER, ALLOCATABLE, DIMENSION(:) :: ITYPRO,NJJ,IJJ + REAL, ALLOCATABLE, DIMENSION(:) :: STRD,WRK,XSSCMP,EFACT + DATA HCM /'00','01','02','03','04','05','06','07','08','09','10'/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(STRD(NGRP),EFACT(NGRP)) +*---- +* UP-SCATTERING CORRECTION +*---- + IRENT0=0 + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'TOTA') IRENT0=IREA + ENDDO + IF(IRENT0.EQ.0) CALL XABORT('ACRISO: MISSING NTOT0.') + IF(ILUPS.EQ.1) THEN + DO JGR=2,NGRP + DO IGR=1,JGR-1 ! IGR < JGR + CSCAT=SS2D(IGR,JGR,1) + FF=NWT0(JGR)/NWT0(IGR) + XS(IGR,IRENT0)=XS(IGR,IRENT0)-CSCAT*FF + XS(JGR,IRENT0)=XS(JGR,IRENT0)-CSCAT + DO IL=1,NL + CSCAT=SS2D(IGR,JGR,IL) + SIGS(IGR,IL)=SIGS(IGR,IL)-CSCAT*FF + SIGS(JGR,IL)=SIGS(JGR,IL)-CSCAT + SS2D(JGR,IGR,IL)=SS2D(JGR,IGR,IL)-CSCAT*FF + SS2D(IGR,JGR,IL)=0.0 + ENDDO + ENDDO + ENDDO + ENDIF +*---- +* BUILD MICROLIB +*---- + WRITE(TEXT12,'(2A4)') (INAME(I0),I0=1,2) + CALL LCMPTC(IPLIB,'ALIAS',12,TEXT12) + CALL LCMPUT(IPLIB,'NWT0',NGRP,2,NWT0) + IF(NPRC.GT.0) THEN + CALL LCMPUT(IPLIB,'LAMBDA-D',NPRC,2,LAMB) + CALL LCMPUT(IPLIB,'OVERV',NGRP,2,INVELS) + ENDIF + ITRANC=0 + IFISS=0 + LDIFF=.FALSE. + LHFACT=.FALSE. + STRD(:NGRP)=0.0 + EFACT(:NGRP)=0.0 + CONVEN=1.0E6 ! convert MeV to eV + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + LZERO=.TRUE. + DO IGR=1,NGRP + LZERO=LZERO.AND.(XS(IGR,IREA).EQ.0.0) + ENDDO + IF(LZERO) CYCLE + IF(NOMREA(IREA).EQ.'TOTA') THEN + IF(LSTRD) THEN + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)+XS(IGR,IREA) + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'NTOT0',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'N2N') THEN +* correct scattering XS with excess XS + DO IGR=1,NGRP + SIGS(IGR,1)=SIGS(IGR,1)+XS(IGR,IREA) + ENDDO + CALL LCMPUT(IPLIB,'N2N',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'FISS') THEN + CALL LCMPUT(IPLIB,'NFTOT',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'ABSO') THEN + CALL LCMPUT(IPLIB,'NG',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'CHI') THEN + IF(.NOT.LPURE) THEN + DO IGR=1,NGRP + IF(XS(IGR,IREA).NE.0.0) THEN + XS(IGR,IREA)=XS(IGR,IREA)/TAUXFI + ENDIF + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'CHI',NGRP,2,XS(1,IREA)) + DO IPRC=1,NPRC + WRITE(TEXT12,'(A3,I2.2)') 'CHI',IPRC + CALL LCMPUT(IPLIB,TEXT12,NGRP,2,CHIRS(1,IPRC)) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'NUFI') THEN + IFISS=1 + CALL LCMPUT(IPLIB,'NUSIGF',NGRP,2,XS(1,IREA)) + IF(NPRC.GT.0) THEN + ALLOCATE(WRK(NGRP)) + DO IPRC=1,NPRC + DO IGR=1,NGRP + WRK(IGR)=XS(IGR,IREA)*BETAR(IPRC) + ENDDO + WRITE(TEXT12,'(A6,I2.2)') 'NUSIGF',IPRC + CALL LCMPUT(IPLIB,TEXT12,NGRP,2,WRK) + ENDDO + DEALLOCATE(WRK) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'ENER') THEN + LHFACT=.TRUE. + DO IGR=1,NGRP + EFACT(IGR)=EFACT(IGR)+XS(IGR,IREA)*CONVEN + ENDDO + ELSE IF(NOMREA(IREA).EQ.'EGAM') THEN + LHFACT=.TRUE. + DO IGR=1,NGRP + EFACT(IGR)=EFACT(IGR)+XS(IGR,IREA)*CONVEN + ENDDO + ELSE IF(NOMREA(IREA).EQ.'KAFI') THEN + LHFACT=.TRUE. + DO IGR=1,NGRP + EFACT(IGR)=EFACT(IGR)+XS(IGR,IREA)*CONVEN + ENDDO + ELSE IF(NOMREA(IREA).EQ.'LEAK') THEN + LDIFF=LSTRD + IF(.NOT.LSTRD) THEN + DO IGR=1,NGRP + LDIFF=LDIFF.OR.(XS(IGR,IREA).NE.0.0) + STRD(IGR)=XS(IGR,IREA) + ENDDO + ENDIF + ELSE IF(NOMREA(IREA).EQ.'DIFF') THEN + CYCLE + ELSE IF(NOMREA(IREA).EQ.'SCAT') THEN + CYCLE + ELSE + CALL LCMPUT(IPLIB,NOMREA(IREA),NGRP,2,XS(1,IREA)) + ENDIF + ENDDO + IF(LSTRD) THEN + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)-SIGS(IGR,2) + ENDDO + ENDIF + ELSE + DO IGR=1,NGRP + STRD(IGR)=1.0/(3.0*STRD(IGR)) + ENDDO + ENDIF + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + ITRANC=2 + CALL LCMPUT(IPLIB,'TRANC',NGRP,2,SIGS(1,2)) + ENDIF + IF(LDIFF.OR.LSTRD) CALL LCMPUT(IPLIB,'STRD',NGRP,2,STRD) + IF(LHFACT) CALL LCMPUT(IPLIB,'H-FACTOR',NGRP,2,EFACT) +*---- +* SAVE SCATTERING VECTORS AND MATRICES (DO NOT USE XDRLGS TO SAVE CPU +* TIME) +*---- + ALLOCATE(NJJ(NGRP),IJJ(NGRP),XSSCMP(NGRP*NGRP),ITYPRO(NL)) + DO ILEG=1,NL + IF(ILEG.LE.11) THEN + NAMLEG=HCM(ILEG-1) + ELSE + WRITE(NAMLEG,'(I2.2)') ILEG-1 + ENDIF + CALL LCMPUT(IPLIB,'SIGS'//NAMLEG,NGRP,2,SIGS(1,ILEG)) + NXSCMP=0 + DO IGTO=1,NGRP + IGMIN=IGTO + IGMAX=IGTO + DO IGFROM=1,NGRP + IF(SS2D(IGTO,IGFROM,ILEG).NE.0.0) THEN + IGMIN=MIN(IGMIN,IGFROM) + IGMAX=MAX(IGMAX,IGFROM) + ENDIF + ENDDO + IJJ(IGTO)=IGMAX + NJJ(IGTO)=IGMAX-IGMIN+1 + DO IGFROM=IGMAX,IGMIN,-1 + NXSCMP=NXSCMP+1 + XSSCMP(NXSCMP)=SS2D(IGTO,IGFROM,ILEG) + ENDDO + ENDDO + CALL LCMPUT(IPLIB,'NJJS'//NAMLEG,NGRP,1,NJJ) + CALL LCMPUT(IPLIB,'IJJS'//NAMLEG,NGRP,1,IJJ) + CALL LCMPUT(IPLIB,'SCAT'//NAMLEG,NXSCMP,2,XSSCMP) + ITYPRO(ILEG)=1 + ENDDO + CALL LCMPUT(IPLIB,'SCAT-SAVED',NL,1,ITYPRO) + DEALLOCATE(ITYPRO,XSSCMP,IJJ,NJJ) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(EFACT,STRD) + RETURN + END diff --git a/Donjon/src/ACRLIB.f b/Donjon/src/ACRLIB.f new file mode 100644 index 0000000..cc2cf8e --- /dev/null +++ b/Donjon/src/ACRLIB.f @@ -0,0 +1,899 @@ +*DECK ACRLIB + SUBROUTINE ACRLIB(MAXNIS,MAXISO,IPLIB,IPAPX,IACCS,NMIX,NGRP,IMPX, + 1 HEQUI,NCAL,ITER,MY1,MY2,MD1,MD2,TERP,NISO,LISO,HISO,CONC,ITODO, + 2 MIXC,LRES,LPURE,LTOTAL,ILUPS,B2,LFROM,VTOT,YLDS,DECAYC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the Microlib by scanning the NCAL elementary calculations in +* a Apex file and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2021 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* MAXISO maximum allocated space for output Microlib TOC information. +* IPLIB address of the output Microlib LCM object. +* IPAPX pointer to the Apex file. +* IACCS =0 Microlib is created; =1 ... is updated. +* NMIX maximum number of material mixtures in the Microlib. +* NGRP number of energy groups. +* IMPX print parameter (equal to zero for no print). +* HEQUI keyword of SPH-factor set to be recovered. +* NCAL number of elementary calculations in the Apex file. +* ITER completion flag (=0: compute the macrolib). +* MY1 number of fissile isotopes including macroscopic sets. +* MY2 number of fission fragment. +* MD1 number of types of radioactive decay reactions. +* MD2 number of particularized isotopes including macro. +* 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 Apex file value is +* used. +* ITODO non-depletion mask (=1 to force a user-selected isotope to be +* non-depleting) +* MIXC mixture index in the Apex file corresponding to each Microlib +* mixture. Equal to zero if a Microlib mixture is not updated. +* LRES =.true. if the interpolation is done without updating isotopic +* densities +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* LTOTAL =.true. to use the mac/TOTAL macroscopic set. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* B2 buckling +* LFROM macroregion flag (=.true. if 'xs n' groups are set). +* VTOT volume of updated core. +* YLDS fission yields. +* DECAYC radioactive decay constants. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,IPAPX + INTEGER MAXNIS,MAXISO,IACCS,NMIX,NGRP,IMPX,NCAL,ITER,MY1,MY2,MD1, + 1 MD2,NISO(NMIX),ITODO(NMIX,MAXNIS),MIXC(NMIX),ILUPS + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + DOUBLE PRECISION VTOT,YLDS(MY1,MY2),DECAYC(MD1,MD2) + LOGICAL LISO(NMIX),LRES,LPURE,LTOTAL,LFROM + CHARACTER(LEN=80) HEQUI + CHARACTER(LEN=8) HISO(NMIX,MD2) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXMAC=2 + INTEGER, PARAMETER::MAXREA=50 + INTEGER, PARAMETER::NSTATE=40 + INTEGER, PARAMETER::MAXFRD=4 + TYPE(C_PTR) JPLIB,KPLIB + REAL B2APEX, FACT0, WEIGHT + INTEGER I, I0, K, IBM, IBMOLD, ICAL, ID1, IED2, IFISS, IGR, + & ILONG, IMAC, IOF, IPRC, IREA, IREAF, IRES, ISO, ITRANC, ITSTMP, + & ITYLCM, IY1, IY2, JSO, KSO, KSO1, LMY1, LSO, MAXMIX, NBISO, + & NBISO1, NBISO2, NBISO2I, NBS1, NCALS, NED2, NL, NLAM, NBMAC, + & NMIL, NPAR, NPRC, NREA, NSURFD, NISOF, NISOP, NISOS, NISOTS, + & NVP, RANK, NBYTE, TYPE, ISURF, DIMSR(5) + CHARACTER RECNAM*80,TEXT8*8, TEXT12*12,HSMG*131,HVECT2(MAXREA)*8, + 1 HRESID*8,HHAD(MAXFRD)*16 + INTEGER ISTATE(NSTATE),INAME(2),IHRES(2) + REAL TMPDAY(3) + LOGICAL LUSER,LSTRD +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMIX2,ITOTM,IRESM,ISONA, + 1 ISOMI,ITOD2,ISTY1,ISTY2,IPIFI,IMICR,ITOD1,JJSO,IPYMIX,DIMS_APX + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: HUSE2,HNAM2 + REAL, ALLOCATABLE, DIMENSION(:) :: DENS2,DENS3,VOL2,VOLMI2,SPH, + 1 ENER,XVOLM,CONCE,TAUXFI,NWT0,FLUXS,DENIS,GAR1,GAR2,LAMB,BETAR, + 2 INVELS,BETARB,INVELSB + REAL, ALLOCATABLE, DIMENSION(:,:) :: ADF,DENS1,FACT,DECAY2, + 1 CHIRS,CHIRSB + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XS,SIGS,DENS0,FLUX,ADF2, + 1 YLDS2 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: SS2D + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: YLDSM + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LXS,MASK,MASKL + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF,HNOMIS,NOMISO, + 1 NOMMAC,HPYNAM + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: NOMREA +*---- +* RECOVER APEX FILE CHARACTERISTICS +*---- + I=0 + CALL APXTOC(IPAPX,0,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,NVP,NISOF, + 1 NISOP,NISOS,NCALS,I,NISOTS,NSURFD,NPRC) + IF(NGRP.NE.I) CALL XABORT('ACRLIB: INVALID VALUE OF NGRP.') + IF(NREA.GT.MAXREA) CALL XABORT('ACRLIB: MAXREA OVERFLOW') + IF(NBMAC.GT.MAXMAC) CALL XABORT('ACRLIB: MAXMAC OVERFLOW') +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IMIX2(MAXISO),ITOD2(MAXISO),ISTY1(MAXISO),ISTY2(MAXISO), + 1 HUSE2(3,MAXISO),HNAM2(3,MAXISO)) + ALLOCATE(DENS2(MAXISO),DENS3(MAXISO),VOL2(MAXISO),VOLMI2(NMIX), + 1 FLUX(NMIX,NGRP,2),SPH(NGRP)) + ALLOCATE(HADF(NSURFD),ADF2(NMIX,NGRP,NSURFD)) +*---- +* MICROLIB INITIALIZATION +*---- + VOLMI2(:NMIX)=0.0 + DENS2(:MAXISO)=0.0 + VOL2(:MAXISO)=0.0 + IMIX2(:MAXISO)=0 + ITOD2(:MAXISO)=0 + ISTY2(:MAXISO)=0 + IF(NSURFD.GT.0) ADF2(:NMIX,:NGRP,:NSURFD)=0.0 + IF(IACCS.EQ.0) THEN + IF(LRES) CALL XABORT('ACRLIB: RES OPTION IS INVALID.') + NBISO2=0 + NED2=0 + TEXT12='L_LIBRARY' + CALL LCMPTC(IPLIB,'SIGNATURE',12,TEXT12) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NMIX) CALL XABORT('ACRLIB: INVALID NUMBER OF ' + 1 //'MATERIAL MIXTURES IN THE MICROLIB.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('ACRLIB: INVALID NUMBER OF ' + 1 //'ENERGY GROUPS IN THE MICROLIB.') + NBISO2=ISTATE(2) + IF(NBISO2.GT.MAXISO) CALL XABORT('ACRLIB: MAXISO OVERFLOW(1).') + NED2=ISTATE(13) + IF(NED2.GT.MAXREA) CALL XABORT('ACRLIB: MAXREA OVERFLOW.') + CALL LCMLEN(IPLIB,'MIXTURESVOL',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPLIB,'MIXTURESVOL',VOLMI2) + ELSE + VOLMI2(:NMIX)=0.0 + ENDIF + CALL LCMGET(IPLIB,'ISOTOPESUSED',HUSE2) + CALL LCMGET(IPLIB,'ISOTOPERNAME',HNAM2) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS2) + CALL LCMGET(IPLIB,'ISOTOPESVOL',VOL2) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX2) + CALL LCMGET(IPLIB,'ISOTOPESTODO',ITOD2) + CALL LCMGET(IPLIB,'ISOTOPESTYPE',ISTY2) + IF(NED2.GT.0) CALL LCMGTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + IF(NSURFD.GT.0) THEN + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMLEN(IPLIB,'ADF',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPLIB) + CALL XABORT('ACRLIB: UNABLE TO FIND DIRECTORY ADF.') + ENDIF + CALL LCMSIX(IPLIB,'ADF',1) + CALL LCMGTC(IPLIB,'HADF',8,NSURFD,HADF) + DO I=1,NSURFD + CALL LCMGET(IPLIB,HADF(I),ADF2(1,1,I)) + ENDDO + CALL LCMSIX(IPLIB,' ',2) + CALL LCMSIX(IPLIB,' ',2) + ENDIF + ENDIF +*---- +* RECOVER INFORMATION FROM physconst GROUP. +*---- + IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN + CALL hdf5_read_data(IPAPX,"/physconst/ENRGS",ENER) + ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN + CALL hdf5_read_data(IPAPX,"/physco001/ENRGS",ENER) + ELSE + CALL XABORT('ACRLIB: GROUP physconst NOT FOUND IN HDF5 FILE.') + ENDIF + DO IGR=1,NGRP+1 + ENER(IGR)=ENER(IGR)/1.0E-6 + ENDDO + CALL LCMPUT(IPLIB,'ENERGY',NGRP+1,2,ENER) + DO IGR=1,NGRP + ENER(IGR)=LOG(ENER(IGR)/ENER(IGR+1)) + ENDDO + CALL LCMPUT(IPLIB,'DELTAU',NGRP,2,ENER) + DEALLOCATE(ENER) +*---- +* RECOVER INFORMATION FROM explicit GROUP. +*---- + ALLOCATE(ITOTM(NMIL),IRESM(NMIL)) + ITOTM(:)=0 + IRESM(:)=0 + IREAF=0 + IF(NREA.GT.0) THEN + IF(hdf5_group_exists(IPAPX,"/explicit/")) THEN + CALL hdf5_read_data(IPAPX,"/explicit/REANAME",NOMREA) + ELSE IF(hdf5_group_exists(IPAPX,"/expli001/")) THEN + CALL hdf5_read_data(IPAPX,"/expli001/REANAME",NOMREA) + ELSE + CALL XABORT('ACRLIB: GROUP explicit NOT FOUND IN HDF5 FILE.') + ENDIF + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(29H ACRLIB: Available reactions:/(1X,10A13))') + 1 (NOMREA(I),I=1,NREA) + ENDIF + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'NUFI') THEN + IREAF=IREA + EXIT + ENDIF + ENDDO + ENDIF + IF(NBISO.GT.0) THEN + IF(hdf5_group_exists(IPAPX,"/explicit/")) THEN + CALL hdf5_read_data(IPAPX,"/explicit/ISONAME",NOMISO) + ELSE IF(hdf5_group_exists(IPAPX,"/expli001/")) THEN + CALL hdf5_read_data(IPAPX,"/expli001/ISONAME",NOMISO) + ELSE + CALL XABORT('ACRLIB: GROUP explicit NOT FOUND IN HDF5 FILE.') + ENDIF + ENDIF + IF(LTOTAL.AND.(NBMAC.EQ.0)) CALL XABORT('ACRLIB: NBMAC=0.') + IF(NBMAC.GT.0) THEN + IF(hdf5_group_exists(IPAPX,"/explicit/")) THEN + CALL hdf5_read_data(IPAPX,"/explicit/MACNAME",NOMMAC) + ELSE IF(hdf5_group_exists(IPAPX,"/expli001/")) THEN + CALL hdf5_read_data(IPAPX,"/expli001/MACNAME",NOMMAC) + ELSE + CALL XABORT('ACRLIB: GROUP explicit NOT FOUND IN HDF5 FILE.') + ENDIF + DO I=1,NBMAC + IF(NOMMAC(I).EQ.'TOTAL') ITOTM(:)=I + IF(NOMMAC(I).EQ.'RESIDUAL') IRESM(:)=I + ENDDO + NBISO1=NBISO+NBMAC + ALLOCATE(HNOMIS(NBISO1)) + IF(NBISO.GT.0) HNOMIS(:NBISO)=NOMISO(:NBISO) + IF(LTOTAL) THEN + ! use the mac/TOTAL macroscopic set + HNOMIS(:NBISO)=' ' + DO I=1,NBMAC + IF(NOMMAC(I).EQ.'TOTAL') THEN + HNOMIS(NBISO+I)='*MAC*RES' + ELSE IF(NOMMAC(I).EQ.'RESIDUAL') THEN + HNOMIS(NBISO+I)=' ' + ENDIF + ENDDO + ELSE + ! use the mac/RESIDUAL macroscopic set + DO I=1,NBMAC + IF(NOMMAC(I).EQ.'TOTAL') THEN + HNOMIS(NBISO+I)=' ' + ELSE IF(NOMMAC(I).EQ.'RESIDUAL') THEN + HNOMIS(NBISO+I)='*MAC*RES' + ENDIF + ENDDO + ENDIF + ELSE + NBISO1=NBISO + ALLOCATE(HNOMIS(NBISO1)) + IF(NBISO.GT.0) HNOMIS(:NBISO)=NOMISO(:NBISO) + ENDIF +*---- +* RECOVER VOLUMES. +*---- + ALLOCATE(XVOLM(NMIL)) + RECNAM='calc 1/xs/' + DO IBMOLD=1,NMIL + IF(LFROM) WRITE(RECNAM,'(4Hcalc,I8,3H/xs,I8,1H/)') ICAL,IBMOLD + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"MEDIA_VOLUME",RANK, + 1 TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + XVOLM(IBMOLD)=1.0 + WRITE(IOUT,'(44H ACRLIB: WARNING -- Record MEDIA_VOLUME is m, + 1 42Hissing in the Apex file. Volume set to 1.0)') + ELSE + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"MEDIA_VOLUME", + 1 XVOLM(IBMOLD)) + ENDIF + ENDDO +*---- +* FIND SCATTERING ANISOTROPY. +*---- + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"mac/TOTAL/DIFF",RANK, + 1 TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) CALL XABORT('ACRLIB: MISSING SCATTERING INFO.') + NL=DIMSR(2) + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(36H ACRLIB: number of Legendre orders =,I4)') NL + ENDIF +*---- +* LOOP OVER APEX MIXTURES TO COMPUTE DENS0(NMIL,NCAL,NBISO1) +*---- + ALLOCATE(DENS0(NMIL,NCAL,NBISO1)) + DENS0(:NMIL,:NCAL,:NBISO1)=0.0 + DO 30 IBMOLD=1,NMIL + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF((TERP(ICAL,IBM).NE.0.0).AND.(MIXC(IBM).EQ.IBMOLD)) GO TO 10 + ENDDO + CYCLE + 10 WRITE(RECNAM,'(4Hcalc,I8,4H/xs/)') ICAL + IF(LFROM) WRITE(RECNAM,'(4Hcalc,I8,3H/xs,I8,1H/)') ICAL,IBMOLD + IF(NBISO.GT.0) THEN + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"mic/CONC",CONCE) + DO 20 ISO=1,NBISO + DENS0(IBMOLD,ICAL,ISO)=CONCE(ISO) + 20 CONTINUE + ENDIF + ENDDO + 30 CONTINUE + IF(NBISO.GT.0) DEALLOCATE(CONCE) +*---- +* LOOP OVER MICROLIB MIXTURES +*---- + YLDS(:MY1,:MY2)=0.0D0 + DECAYC(:MD1,:MD2)=0.0D0 + VTOT=0.0D0 + DO 40 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.NE.0) VTOT=VTOT+XVOLM(IBMOLD) + 40 CONTINUE + ALLOCATE(JJSO(NBISO+NBMAC),YLDSM(MY1,MY2),ITOD1(NBISO1)) + ALLOCATE(TAUXFI(NBISO+NBMAC),NWT0(NGRP), + 1 SIGS(NGRP,NL,NBISO+NBMAC),SS2D(NGRP,NGRP,NL,NBISO+NBMAC), + 2 XS(NGRP,NREA,NBISO+NBMAC)) + ALLOCATE(LXS(NREA)) + ALLOCATE(CHIRS(NGRP,NPRC),BETAR(NPRC),INVELS(NGRP)) + CHIRS(:NGRP,:NPRC)=0.0 + BETAR(:NPRC)=0.0 + INVELS(:NGRP)=0.0 + ALLOCATE(BETARB(NPRC),INVELSB(NGRP)) + ALLOCATE(DENS1(NBISO1,NCAL),FACT(NBISO1,NCAL)) + JPLIB=LCMLID(IPLIB,'ISOTOPESLIST',(NBISO+NBMAC)*NMIX) +* + DO 180 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 180 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('ACRLIB: MAXNIS OVERFLOW.') + VOLMI2(IBM)=XVOLM(IBMOLD) + IMAC=ITOTM(IBMOLD) + IRES=IRESM(IBMOLD) +*---- +* RECOVER ITOD1(NBISO1) INDICES. +*---- + ITOD1(:NBISO1)=0 + DO 50 ISO=1,NBISO1 ! Apex file isotope + DO KSO=1,NISO(IBM) ! user-selected isotope + IF(NOMISO(ISO).EQ.HISO(IBM,KSO)) THEN + ITOD1(ISO)=ITODO(IBM,KSO) + GO TO 50 + ENDIF + ENDDO + 50 CONTINUE +*---- +* COMPUTE THE NUMBER DENSITIES OF EACH ELEMENTARY CALCULATION. +*---- + DENS1(:NBISO1,:NCAL)=0.0 + DENS3(:NBISO1)=0.0 + DO ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) CYCLE + DO ISO=1,NBISO + LUSER=.FALSE. + KSO1=0 + DO KSO=1,NISO(IBM) ! user-selected isotope + IF(NOMISO(ISO).EQ.HISO(IBM,KSO)) THEN + KSO1=KSO + LUSER=(CONC(IBM,KSO1).NE.-99.99) + GO TO 60 + ENDIF + ENDDO + 60 IF(LUSER) THEN + DENS1(ISO,ICAL)=CONC(IBM,KSO1) + CYCLE + ENDIF + IF(.NOT.LISO(IBM)) CYCLE + DENS1(ISO,ICAL)=DENS0(IBMOLD,ICAL,ISO) + ENDDO + IF((NBISO.NE.0).AND.(.NOT.LTOTAL)) THEN + DENS1(NBISO+IRES,ICAL)=1.0 + ELSE IF(IMAC.NE.0) THEN + DENS1(NBISO+IMAC,ICAL)=1.0 + ENDIF + DO ISO=1,NBISO1 + DENS3(ISO)=DENS3(ISO)+WEIGHT*DENS1(ISO,ICAL) + ENDDO + ENDDO + FACT(:NBISO1,:NCAL)=1.0 + IF(.NOT.LPURE) THEN + DO ICAL=1,NCAL + IF(TERP(ICAL,IBM).EQ.0.0) CYCLE + DO ISO=1,NBISO1 + IF(DENS3(ISO).GT.DENS1(ISO,ICAL)*1.0E-9) THEN + FACT(ISO,ICAL)=DENS1(ISO,ICAL)/DENS3(ISO) + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* INITIALIZE WORKING ARRAYS. +*---- + TAUXFI(:NBISO1)=0.0 + NWT0(:NGRP)=0.0 + SIGS(:NGRP,:NL,:NBISO1)=0.0 + SS2D(:NGRP,:NGRP,:NL,:NBISO1)=0.0 + XS(:NGRP,:NREA,:NBISO1)=0.0 + LXS(:NREA)=.FALSE. + YLDSM(:MY1,:MY2)=0.0D0 +*---- +* MAIN LOOP OVER ELEMENTARY CALCULATIONS +*---- + TEXT12='*MAC*RES' + READ(TEXT12,'(2A4)') IHRES(1),IHRES(2) + LSTRD=.FALSE. + B2APEX=B2 + DO 80 ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 80 +*---- +* RECOVER INFORMATION FROM caldir GROUP. +*---- + WRITE(RECNAM,'(4Hcalc,I8,10H/kinetics/)') ICAL + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"LAMBDA",RANK,TYPE,NBYTE,DIMSR) + NPRC=0 + IF(TYPE.NE.99) THEN + NPRC=DIMSR(1) + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"LAMBDA",LAMB) + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"CHIDA",CHIRSB) + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"BETADA",BETARB) + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"INVELA",INVELSB) + ENDIF +*---- +* SELECT APEX MIXTURE IBMOLD. +*---- + WRITE(RECNAM,'(4Hcalc,I8,4H/xs/)') ICAL + IF(LFROM) WRITE(RECNAM,'(4Hcalc,I8,3H/xs,I8,1H/)') ICAL,IBMOLD + IF(HEQUI.NE.' ') THEN + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"MEDIA_SPH/"//HEQUI,SPH) + ELSE + SPH(:NGRP)=1.0 + ENDIF + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"FLUX",FLUXS) + DO I=1,NGRP + FLUXS(I)=FLUXS(I)/XVOLM(IBMOLD) + NWT0(I)=NWT0(I)+WEIGHT*FLUXS(I)/SPH(I) + ENDDO + IF((NBISO.NE.0).AND.(.NOT.LTOTAL)) THEN + DO ISO=1,NBISO + FACT0=FACT(ISO,ICAL) + CALL ACRSX2(IPAPX,RECNAM,NREA,NGRP,NISOF,NISOP,NL,ISO, + 1 NOMREA,B2APEX,FACT0,WEIGHT,SPH,FLUXS,IREAF,LPURE,LXS, + 2 XS(1,1,ISO),SIGS(1,1,ISO),SS2D(1,1,1,ISO),TAUXFI(ISO)) + ENDDO + IF(IRES.NE.0) THEN + FACT0=1.0 + CALL ACRSX2(IPAPX,RECNAM,NREA,NGRP,NISOF,NISOP,NL,-2,NOMREA, + 1 B2APEX,FACT0,WEIGHT,SPH,FLUXS,IREAF,LPURE,LXS,XS(1,1,NBISO+1), + 2 SIGS(1,1,NBISO+1),SS2D(1,1,1,NBISO+1),TAUXFI(NBISO+IRES)) + ENDIF + ELSE IF(IMAC.NE.0) THEN + FACT0=1.0 + CALL ACRSX2(IPAPX,RECNAM,NREA,NGRP,NISOF,NISOP,NL,-1,NOMREA, + 1 B2APEX,FACT0,WEIGHT,SPH,FLUXS,IREAF,LPURE,LXS,XS(1,1,NBISO+1), + 2 SIGS(1,1,NBISO+1),SS2D(1,1,1,NBISO+1),TAUXFI(NBISO+IMAC)) + ELSE + CALL XABORT('ACRLIB: NO MACROSCOPIC SET.') + ENDIF + DEALLOCATE(FLUXS) +* + IF(NPRC.GT.0) THEN + DO IGR=1,NGRP + INVELS(IGR)=INVELS(IGR)+SPH(IGR)*WEIGHT*INVELSB(IGR) + DO IPRC=1,NPRC + CHIRS(IGR,IPRC)=CHIRS(IGR,IPRC)+WEIGHT*CHIRSB(IGR,IPRC) + ENDDO + ENDDO + DO IPRC=1,NPRC + BETAR(IPRC)=BETAR(IPRC)+WEIGHT*BETARB(IPRC) + ENDDO + ENDIF +*---- +* COMPUTE DEPLETION CHAIN DATA +*---- + IF(NISOF*NISOP.GT.0) THEN + IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN + CALL hdf5_read_data(IPAPX,"/physconst/FYIELDS",YLDS2) + ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN + CALL hdf5_read_data(IPAPX,"/physco001/FYIELDS",YLDS2) + ELSE + CALL XABORT('ACRLIB: GROUP physconst NOT FOUND IN HDF5 FILE.') + ENDIF + DO IY2=1,NISOP + DO IY1=1,NISOF + YLDSM(IY1,IY2)=YLDSM(IY1,IY2)+WEIGHT*YLDS2(IY1,IY2,1) + YLDS(IY1,IY2)=YLDS(IY1,IY2)+WEIGHT*YLDS2(IY1,IY2,1)* + > VOLMI2(IBM)/VTOT + ENDDO + ENDDO + DEALLOCATE(YLDS2) + ENDIF + IF((MD1*MD2.GT.0).AND.(NBISO.GT.0)) THEN + IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN + CALL hdf5_read_data(IPAPX,"/physconst/DECAYC",DECAY2) + ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN + CALL hdf5_read_data(IPAPX,"/physco001/DECAYC",DECAY2) + ELSE + CALL XABORT('ACRLIB: GROUP physconst NOT FOUND IN HDF5 FILE.') + ENDIF + DO ISO=1,NBISO + DO ID1=1,NLAM + DECAYC(ID1,ISO)=DECAYC(ID1,ISO)+WEIGHT*DECAY2(ID1,ISO)* + > VOLMI2(IBM)/VTOT + ENDDO + ENDDO + DEALLOCATE(DECAY2) + ENDIF + 80 CONTINUE ! end of loop over elementary calculations. +*---- +* IDENTIFY SPECIAL FLUX EDITS +*---- + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'ABSO') THEN + DO 90 IED2=1,NED2 + IF(HVECT2(IED2).EQ.'ABSO') GO TO 100 + 90 CONTINUE + NED2=NED2+1 + IF(NED2.GT.MAXREA) CALL XABORT('ACRLIB: MAXREA OVERFLOW(1).') + HVECT2(NED2)='ABSO' + ELSE IF(NOMREA(IREA).EQ.'FISS') THEN + DO 95 IED2=1,NED2 + IF(HVECT2(IED2).EQ.'NFTOT') GO TO 100 + 95 CONTINUE + NED2=NED2+1 + IF(NED2.GT.MAXREA) CALL XABORT('ACRLIB: MAXREA OVERFLOW(2).') + HVECT2(NED2)='NFTOT' + ENDIF + 100 CONTINUE + ENDDO +*---- +* SET FLAG LSTRD +*---- + LSTRD=.TRUE. + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'LEAK') THEN + IF(LXS(IREA).AND.(B2APEX.NE.0.0)) LSTRD=.FALSE. + EXIT + ENDIF + ENDDO +*---- +* SAVE CROSS SECTIONS IN MICROLIB FOR MIXTURE IBM +*---- + ISTY1(:NBISO1)=0 + JJSO(:NBISO1)=0 + NBISO2I=NBISO2 + IF((NBISO.NE.0).AND.(.NOT.LTOTAL)) THEN + HRESID=' ' + DO ISO=1,NBISO + READ(HNOMIS(ISO),'(2A4)') INAME(:2) + CALL SCRFND(MAXISO,NBISO2I,NBISO2,INAME,IBM,HRESID,HUSE2, + 1 HNAM2,IMIX2,JJSO(ISO)) + KPLIB=LCMDIL(JPLIB,JJSO(ISO)) ! step up isot JJSO(ISO) + CALL ACRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS(1,1,ISO), + 1 SIGS(1,1,ISO),SS2D(1,1,1,ISO),TAUXFI(ISO),LXS,LAMB,CHIRS, + 2 BETAR,INVELS,INAME,LSTRD,LPURE,ILUPS,ITRANC,IFISS) + IF(MY1*MY2.GT.0) CALL ACRNDF(IMPX,NBISO+NBMAC,ISO,IBM,HNOMIS, + 1 IPAPX,KPLIB,MY1,MY2,YLDSM,ISTY1(ISO)) + ENDDO + IF(IRES.NE.0) THEN + HRESID=NOMMAC(IRES) + CALL SCRFND(MAXISO,NBISO2I,NBISO2,IHRES,IBM,HRESID,HUSE2, + 1 HNAM2,IMIX2,JJSO(NBISO+IRES)) + KPLIB=LCMDIL(JPLIB,JJSO(NBISO+IRES)) ! step up isot JJSO(NBISO+IRES) + CALL ACRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0, + 1 XS(1,1,NBISO+1),SIGS(1,1,NBISO+1),SS2D(1,1,1,NBISO+1), + 2 TAUXFI(NBISO+IRES),LXS,LAMB,CHIRS,BETAR,INVELS,IHRES, + 3 LSTRD,LPURE,ILUPS,ITRANC,IFISS) + IF(MY1*MY2.GT.0) CALL ACRNDF(IMPX,NBISO+NBMAC,NBISO+IRES, + 1 IBM,HNOMIS,IPAPX,KPLIB,MY1,MY2,YLDSM,ISTY1(NBISO+IRES)) + ENDIF + DEALLOCATE(NOMMAC) + ELSE IF(IMAC.NE.0) THEN + HRESID=NOMMAC(IMAC) + CALL SCRFND(MAXISO,NBISO2I,NBISO2,IHRES,IBM,HRESID,HUSE2,HNAM2, + 1 IMIX2,JJSO(NBISO+IMAC)) + KPLIB=LCMDIL(JPLIB,JJSO(NBISO+IMAC)) ! step up isot JJSO(NBISO+IMAC) + CALL ACRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS(1,1,NBISO+1), + 1 SIGS(1,1,NBISO+1),SS2D(1,1,1,NBISO+1),TAUXFI(NBISO+IMAC),LXS, + 2 LAMB,CHIRS,BETAR,INVELS,IHRES,LSTRD,LPURE,ILUPS,ITRANC,IFISS) + DEALLOCATE(NOMMAC) + ENDIF +*---- +* SET NUMBER DENSITIES AND VOLUMES IN OUTPUT MICROLIB +*---- + IF(LRES) THEN +* -- Number densities are left unchanged except if they are +* -- listed in HISO array. + DO 110 KSO=1,NISO(IBM) ! user-selected isotope + DO JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).NE.IBM) CYCLE + WRITE(TEXT8,'(2A4)') HUSE2(1,JSO),HUSE2(2,JSO) + IF(HISO(IBM,KSO).EQ.TEXT8) THEN + ITOD2(JSO)=ITODO(IBM,KSO) + IF(CONC(IBM,KSO).EQ.-99.99) THEN +* -- Only number densities of isotopes set with "MICR" and +* -- "*" keywords are interpolated + DENS2(JSO)=0.0 + DO ISO=1,NBISO1 ! Apex file isotope + IF(JJSO(ISO).EQ.JSO) DENS2(JSO)=DENS2(JSO)+DENS3(ISO) + ENDDO + ELSE IF(CONC(IBM,KSO).NE.-99.99) THEN +* -- Number densities of isotopes set with "MICR" and +* -- fixed value are forced to this value + DENS2(JSO)=CONC(IBM,KSO) + ENDIF + GO TO 110 + ENDIF + ENDDO + WRITE(HSMG,'(31HACRLIB: UNABLE TO FIND ISOTOPE ,A8,6H IN MI, + 1 5HXTURE,I8,1H.)') HISO(IBM,KSO),IBM + CALL XABORT(HSMG) + 110 CONTINUE + ELSE +* -- Number densities are interpolated or not according to +* -- ALL/ONLY option + DO JSO=1,NBISO2 ! microlib isotope + WRITE(TEXT8,'(2A4)') HUSE2(1,JSO),HUSE2(2,JSO) + IF(IBM.EQ.IMIX2(JSO)) THEN + DO ISO=1,NBISO1 ! Apex file isotope + IF(HNOMIS(ISO).EQ.TEXT8) THEN + DENS2(JSO)=0.0 + VOL2(JSO)=0.0 + CYCLE + ENDIF + ENDDO + ENDIF + ENDDO + DO 130 ISO=1,NBISO1 ! Apex file isotope + IF(.NOT.LISO(IBM)) THEN +* --ONLY option + DO KSO=1,NISO(IBM) ! user-selected isotope + IF(HNOMIS(ISO).EQ.HISO(IBM,KSO)) GO TO 120 + ENDDO + GO TO 130 + ENDIF + 120 JSO=JJSO(ISO) + IF(JSO.GT.0) THEN + ITOD2(JSO)=ITOD1(ISO) + ISTY2(JSO)=ISTY1(ISO) + DENS2(JSO)=DENS2(JSO)+DENS3(ISO) + VOL2(JSO)=VOL2(JSO)+XVOLM(IBMOLD) + ENDIF + 130 CONTINUE + ENDIF +*---- +* SET PIFI INFORMATION +*---- + ALLOCATE(IMICR(NBISO1)) + IMICR(:NBISO1)=0 + NBS1=0 + DO 140 JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).EQ.IBM) THEN + NBS1=NBS1+1 + IF(NBS1.GT.NBISO1) CALL XABORT('ACRLIB: NBISO1 OVERFLOW.') + IMICR(NBS1)=JSO + ENDIF + 140 CONTINUE + DO 170 ISO=1,NBS1 ! Apex file isotope + JSO=IMICR(ISO) + KPLIB=LCMDIL(JPLIB,JSO) ! step up isot JSO + CALL LCMLEN(KPLIB,'PYIELD',LMY1,ITYLCM) + IF(LMY1.GT.0) THEN + ALLOCATE(HPYNAM(LMY1),IPYMIX(LMY1),IPIFI(LMY1)) + IPIFI(:LMY1)=0 + CALL LCMGTC(KPLIB,'PYNAM',8,LMY1,HPYNAM) + CALL LCMGET(KPLIB,'PYMIX',IPYMIX) + DO 160 IY1=1,LMY1 + IF(HPYNAM(IY1).NE.' ') THEN + DO 150 KSO=1,NBS1 + LSO=IMICR(KSO) + WRITE(TEXT8,'(2A4)') HUSE2(:2,LSO) + IF((HPYNAM(IY1).EQ.TEXT8).AND.(IPYMIX(IY1).EQ.IMIX2(LSO))) + 1 THEN + IPIFI(IY1)=LSO + GO TO 160 + ENDIF + 150 CONTINUE + IF(IPIFI(IY1).EQ.0) THEN + WRITE(HSMG,'(40HACRLIB: FAILURE TO FIND FISSILE ISOTOPE , + 1 A12,25H AMONG MICROLIB ISOTOPES.)') HPYNAM(IY1) + CALL XABORT(HSMG) + ENDIF + ENDIF + 160 CONTINUE + CALL LCMPUT(KPLIB,'PIFI',LMY1,1,IPIFI) + DEALLOCATE(IPIFI,IPYMIX,HPYNAM) + ENDIF + 170 CONTINUE + DEALLOCATE(IMICR) + 180 CONTINUE ! end of loop over microlib mixtures. +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(FACT,DENS1) + IF(NPRC.GT.0) DEALLOCATE(INVELSB,BETARB,CHIRSB,INVELS,BETAR, + 1 CHIRS,LAMB) + DEALLOCATE(LXS,XS,SS2D,SIGS,NWT0,TAUXFI) + DEALLOCATE(ITOD1,YLDSM) + IF(NBISO.GT.0) DEALLOCATE(NOMISO) + DEALLOCATE(JJSO,DENS0,XVOLM,HNOMIS,IRESM,ITOTM) +*---- +* MICROLIB FINALIZATION +*---- + IF(.NOT.LRES) THEN + ISTATE(:NSTATE)=0 + ISTATE(1)=NMIX + ISTATE(2)=NBISO2 + ISTATE(3)=NGRP + ISTATE(4)=NL + ISTATE(5)=ITRANC + ISTATE(7)=1 + IF(ITER.EQ.3) ISTATE(12)=NMIX + ISTATE(13)=NED2 + ISTATE(14)=NMIX + ISTATE(18)=1 + ISTATE(19)=NPRC + ISTATE(20)=MY1 + ISTATE(22)=MAXISO/NMIX + IF(NSURFD.GT.0) ISTATE(24)=3 ! ADF/CPDF information + IF(NBISO2.EQ.0) CALL XABORT('ACRLIB: NBISO2=0.') + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPLIB,'MIXTURESVOL',NMIX,2,VOLMI2) + CALL LCMPUT(IPLIB,'ISOTOPESUSED',3*NBISO2,3,HUSE2) + CALL LCMPUT(IPLIB,'ISOTOPERNAME',3*NBISO2,3,HNAM2) + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESMIX',NBISO2,1,IMIX2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + IF(NED2.GT.0) CALL LCMPTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMPUT(IPLIB,'ISOTOPESTODO',NBISO2,1,ITOD2) + CALL LCMPUT(IPLIB,'ISOTOPESTYPE',NBISO2,1,ISTY2) + ELSE IF(LRES.AND.(NBISO.GT.0)) THEN + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + ENDIF + IF(IMPX.GT.5) CALL LCMLIB(IPLIB) + IACCS=1 +*---- +* COMPUTE THE MACROSCOPIC X-SECTIONS +*---- + IF((ITER.NE.0).AND.(ITER.NE.3)) GO TO 280 + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + IF(MAXMIX.NE.NMIX) CALL XABORT('ACRLIB: INVALID NMIX.') + NBISO=ISTATE(2) + ALLOCATE(MASK(MAXMIX),MASKL(NGRP)) + ALLOCATE(ISONA(3*NBISO),ISOMI(NBISO),DENIS(NBISO)) + CALL LCMGET(IPLIB,'ISOTOPESUSED',ISONA) + CALL LCMGET(IPLIB,'ISOTOPESMIX',ISOMI) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENIS) + MASK(:MAXMIX)=.TRUE. + MASKL(:NGRP)=.TRUE. + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 + CALL LCMLEN(IPLIB,'MACROLIB',ILONG,ITYLCM) + IF(ILONG.NE.0) CALL LCMDEL(IPLIB,'MACROLIB') + CALL LIBMIX(IPLIB,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS,MASK,MASKL, + 1 ITSTMP,TMPDAY) + DEALLOCATE(MASKL,MASK) + DEALLOCATE(DENIS,ISOMI,ISONA) + IF(NSURFD.GT.0) THEN + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(12)=3 ! ADF information + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(IOUT,'(/31H ACRLIB: INCLUDE LEAKAGE IN THE, + 1 14H MACROLIB (B2=,1P,E12.5,2H).)') B2 + CALL LCMSIX(IPLIB,'MACROLIB',1) + JPLIB=LCMGID(IPLIB,'GROUP') + ALLOCATE(GAR1(NMIX),GAR2(NMIX)) + DO 270 IGR=1,NGRP + KPLIB=LCMGIL(JPLIB,IGR) + CALL LCMGET(KPLIB,'NTOT0',GAR1) + CALL LCMGET(KPLIB,'DIFF',GAR2) + DO 260 IBM=1,NMIX + IF(MIXC(IBM).NE.0) GAR1(IBM)=GAR1(IBM)+B2*GAR2(IBM) + 260 CONTINUE + CALL LCMPUT(KPLIB,'NTOT0',NMIX,2,GAR1) + 270 CONTINUE + DEALLOCATE(GAR2,GAR1) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* PROCESS ADF INFORMATION +*---- + 280 IF(NSURFD.GT.0) THEN + DO 285 IBM=1,NMIX ! mixtures in Macrolib + IF(MIXC(IBM).NE.0) ADF2(IBM,:NGRP,:NSURFD)=0.0 + 285 CONTINUE + DO 300 ICAL=1,NCAL + DO 290 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 290 + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 290 + WRITE(RECNAM,'(4Hcalc,I8,15H/miscellaneous/)') ICAL + K=0 + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"ADF",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + HHAD(K+1)='ADF' + K=K+1 + ENDIF + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"CPDF",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + HHAD(K+1)='CPDF' + K=K+1 + ENDIF + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"INTERNAL_ADF",RANK,TYPE, + 1 NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + HHAD(K+1)='INTERNAL_ADF' + K=K+1 + ENDIF + CALL hdf5_info(IPAPX,TRIM(RECNAM)//"INTERNAL_CPDF",RANK,TYPE, + 1 NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + HHAD(K+1)='INTERNAL_CPDF' + K=K+1 + ENDIF + IF(4*K.NE.NSURFD) CALL XABORT('ACRLIB: INVALID ADF COUNT.') + DO I=1,K + CALL hdf5_get_shape(IPAPX,TRIM(RECNAM)//HHAD(I),DIMS_APX) + ISURF=DIMS_APX(1) + DEALLOCATE(DIMS_APX) + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//HHAD(I),ADF) + DO I0=1,ISURF + IF(HHAD(I).EQ.'ADF') THEN + WRITE(TEXT8,'(3HADF,I1)') I0 + ELSE IF(HHAD(I).EQ.'CPDF') THEN + WRITE(TEXT8,'(4HCPDF,I1)') I0 + ELSE IF(HHAD(I).EQ.'INTERNAL_ADF') THEN + WRITE(TEXT8,'(6HIN_ADF,I1)') I0 + ELSE IF(HHAD(I).EQ.'INTERNAL_CPDF') THEN + WRITE(TEXT8,'(7HIN_CPDF,I1)') I0 + ENDIF + IOF=(I-1)*ISURF+I0 + HADF(IOF)=TEXT8 + DO IGR=1,NGRP + ADF2(IBM,IGR,IOF)=ADF2(IBM,IGR,IOF)+WEIGHT*ADF(I0,IGR) + ENDDO + ENDDO + DEALLOCATE(ADF) + ENDDO + 290 CONTINUE + 300 CONTINUE + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMSIX(IPLIB,'ADF',1) + CALL LCMPUT(IPLIB,'NTYPE',1,1,NSURFD) + CALL LCMPTC(IPLIB,'HADF',8,NSURFD,HADF) + DO I=1,NSURFD + CALL LCMPUT(IPLIB,HADF(I),NMIX*NGRP,2,ADF2(1,1,I)) + ENDDO + CALL LCMSIX(IPLIB,' ',2) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ADF2,HADF) + DEALLOCATE(SPH,FLUX,VOLMI2,VOL2,DENS3,DENS2) + DEALLOCATE(HNAM2,HUSE2,ISTY2,ISTY1,ITOD2,IMIX2) + RETURN + END diff --git a/Donjon/src/ACRMAC.f b/Donjon/src/ACRMAC.f new file mode 100644 index 0000000..37f5444 --- /dev/null +++ b/Donjon/src/ACRMAC.f @@ -0,0 +1,521 @@ +*DECK ACRMAC + SUBROUTINE ACRMAC(IPMAC,IPAPX,IACCS,NMIL,NMIX,NGRP,IMPX,HEQUI, + 1 NCAL,NSURFD,ILUPS,MIXC,TERP,LPURE,B2,LFROM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the Macrolib by scanning the NCAL elementary calculations of +* a HDF5 file and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2021 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAC address of the output Macrolib LCM object. +* IPAPX pointer to the Apex file. +* IACCS =0 macrolib is created; =1 ... is updated. +* NMIL number of material mixtures in the Apex file. +* NMIX maximum number of material mixtures in the Macrolib. +* NGRP number of energy groups. +* IMPX print parameter (equal to zero for no print). +* HEQUI keyword of SPH-factor set to be recovered. +* NCAL number of elementary calculations in the Apex file. +* NSURFD number of discontinuity factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* MIXC mixture index in the Apex 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 +* LFROM macroregion flag (=.true. if 'xs n' groups are set). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC,IPAPX + INTEGER IACCS,NMIL,NMIX,NGRP,IMPX,NCAL,NSURFD,ILUPS,MIXC(NMIX) + REAL TERP(NCAL,NMIX),B2 + LOGICAL LPURE,LFROM + CHARACTER(LEN=80) HEQUI +*---- +* 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 + REAL FLOTVA, WEIGHT, FKEFF, B2R + INTEGER I, I1D, I2D, IBM, IBMOLD, ICAL, IDEL, IDF, IED, IGMAX, + & IGMIN, IGR, JGR, IKEFF, IL, ILONG, IOF, IPOSDE, ITRANC, ITYLCM, + & ITYPE, LENGTH, N1D, N2D, NDEL, NED, NEDTMP, NF, NFTMP, NL, NLTMP, + & NTYPE, IMC, NALBP + TYPE(C_PTR) JPMAC,KPMAC,IPTMP,JPTMP,KPTMP + INTEGER ISTATE(NSTATE) + LOGICAL LMAKE1(MAX1D),LMAKE2(MAX2D),LWD + CHARACTER TEXT8*8,TEXT12*12,CM*2,HMAK1(MAX1D)*12,HMAK2(MAX2D)*12, + 1 HVECT(MAXED)*8 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,IJJB,NJJB,IPOSB + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,GAR4B,WORK1,WORK2,XVOLM, + 1 ENERG,VOSAP,WDLA + REAL, ALLOCATABLE, DIMENSION(:,:) :: SPH + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAR1,ADF2 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: GAR2,GAR3 + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF + 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*' '/ +*---- +* ACRATCH 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 ADF2(NMIX,NGRP,NSURFD)) + ALLOCATE(HADF(NSURFD)) +*---- +* 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 + IF(NSURFD.GT.0) ADF2(:NMIX,:NGRP,:NSURFD)=0.0 + ALLOCATE(XVOLM(NMIX),ENERG(NGRP+1)) + XVOLM(:NMIX)=0.0 + ENERG(:NGRP+1)=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('ACRMAC: 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('ACRMAC: INVALID NUMBER OF ENERGY GROUPS(1).') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF MIXTURES(1).') + ENDIF + NL=ISTATE(3) + NF=ISTATE(4) + IF(NF.GT.MAXNFI) CALL XABORT('ACRMAC: MAXNFI OVERFLOW(1).') + NED=ISTATE(5) + ITRANC=ISTATE(6) + NDEL=ISTATE(7) + IDF=ISTATE(12) + IF(NED.GT.MAXED) CALL XABORT('ACRMAC: 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('ACRMAC: MAXNL OVERFLOW(1).') + IF(N1D.GT.MAX1D) CALL XABORT('ACRMAC: MAX1D OVERFLOW(1).') + IF(N2D.GT.MAX2D) CALL XABORT('ACRMAC: MAX2D OVERFLOW(1).') + DO 20 IED=1,NED + HMAK1(8+IED)=HVECT(IED) + 20 CONTINUE + DO 30 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+NED+IL)='SIGS'//CM + 30 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 40 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 + 40 CONTINUE + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + CALL LCMGET(IPMAC,'VOLUME',XVOLM) + JPMAC=LCMGID(IPMAC,'GROUP') + DO 105 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + DO 60 I1D=1,N1D + CALL LCMLEN(KPMAC,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE1(I1D)=.TRUE. + CALL LCMGET(KPMAC,HMAK1(I1D),GAR1(1,IGR,I1D)) + DO 55 IBM=1,NMIX + DO 50 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=0.0 + 50 CONTINUE + 55 CONTINUE + ENDIF + 60 CONTINUE + DO 80 I2D=1,N2D + CALL LCMLEN(KPMAC,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE2(I2D)=.TRUE. + CALL LCMGET(KPMAC,HMAK2(I2D),GAR2(1,1,IGR,I2D)) + DO 72 I=1,NF + DO 71 IBM=1,NMIX + DO 70 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR2(IBM,I,IGR,I2D)=0.0 + 70 CONTINUE + 71 CONTINUE + 72 CONTINUE + ENDIF + 80 CONTINUE + DO 100 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 95 IBM=1,NMIX + IPOSDE=IPOS(IBM) + DO 90 JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR4(IPOSDE) + DO 85 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR3(IBM,JGR,IGR,IL)=0.0 + 85 CONTINUE + IPOSDE=IPOSDE+1 + 90 CONTINUE + 95 CONTINUE + ENDIF + 100 CONTINUE + 105 CONTINUE + IF(IDF.EQ.3) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGTC(IPMAC,'HADF',8,NSURFD,HADF) + DO ITYPE=1,NSURFD + CALL LCMGET(IPMAC,HADF(ITYPE),ADF2(1,1,ITYPE)) + ENDDO + CALL LCMSIX(IPMAC,' ',2) + ENDIF + ENDIF +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + DO 210 ICAL=1,NCAL + DO 110 IBM=1,NMIX ! mixtures in Macrolib + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.NE.0.0) GO TO 120 + 110 CONTINUE + GO TO 210 +*---- +* PRODUCE AN ELEMENTARY MACROLIB +*---- + 120 CALL LCMOP(IPTMP,'*ELEMENTARY*',0,1,0) + ALLOCATE(SPH(NMIL,NGRP)) + B2R=B2 + CALL SPHAPX(IPAPX,IPTMP,ICAL,IMPX,HEQUI,NMIL,NGRP,LFROM,ILUPS, + 1 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('ACRMAC: MAXNL OVERFLOW(2).') + IF(NFTMP.GT.MAXNFI) CALL XABORT('ACRMAC: MAXNFI OVERFLOW(2).') + IF(NEDTMP.GT.MAXED) CALL XABORT('ACRMAC: MAXED OVERFLOW(2).') + IF(IACCS.EQ.0) THEN + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF ENERGY GROUPS(2).') + ELSE IF(ISTATE(2).NE.NMIL) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF MIXTURES(2).') + 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('ACRMAC: MAX1D OVERFLOW(2).') + IF(N2D.GT.MAX2D) CALL XABORT('ACRMAC: MAX2D OVERFLOW(2).') + DO 130 IED=1,NED + HMAK1(8+IED)=HVECT(IED) + 130 CONTINUE + DO 140 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+NED+IL)='SIGS'//CM + 140 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 150 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 + 150 CONTINUE + NLTMP=NL + NFTMP=NF + ELSE + NL=MAX(NL,NLTMP) + IF(NLTMP.GT.NL) CALL XABORT('ACRMAC: NL OVERFLOW.') + ITRANC=MAX(ITRANC,ISTATE(6)) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.NMIL)THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF MIXTURES(3).') + ELSE IF(ISTATE(5).NE.NED) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF EDIT REACTIONS(3).') + ELSE IF((NFTMP.NE.0).AND.(NFTMP.NE.NF)) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF FISSILE ISOTOPES(3).') + ELSE IF(ISTATE(7).NE.NDEL) THEN + CALL XABORT('ACRMAC: INVALID NUMBER OF PRECURSOR GROUPS(3).') + ELSE IF(ISTATE(12).NE.IDF) THEN + CALL XABORT('ACRMAC: INVALID TYPE OF ADF DIRECTORY.') + ENDIF + ENDIF +*---- +* SPH CORRECTION OF MACROLIB INFORMATION +*---- + IMC=1 ! SPH correction for SPN macro-calculation + NALBP=0 ! no albedo correction + CALL SPHCMA(IPTMP,IMPX,IMC,NMIL,NGRP,NFTMP,NEDTMP,NALBP,SPH) + DEALLOCATE(SPH) +*---- +* RECOVER KEFF, VOLUMES, ENERGY GROUPS, EDIT NAMES, AND LAMBDA-D. +*---- + CALL LCMLEN(IPTMP,'K-EFFECTIVE',IKEFF,ITYLCM) + IF(IKEFF.EQ.1) CALL LCMGET(IPTMP,'K-EFFECTIVE',FKEFF) + CALL LCMLEN(IPTMP,'VOLUME',ILONG,ITYLCM) + IF(ILONG.EQ.NMIL) THEN + ALLOCATE(VOSAP(NMIL)) + CALL LCMGET(IPTMP,'VOLUME',VOSAP) + DO 160 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) ! mixture in Apex file + IF(IBMOLD.NE.0) XVOLM(IBM)=VOSAP(IBMOLD) + 160 CONTINUE + DEALLOCATE(VOSAP) + 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 200 IBM=1,NMIX ! mixtures in Macrolib + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 200 + IBMOLD=MIXC(IBM) ! mixture in Apex file + IF(IBMOLD.EQ.0) GO TO 200 +* + DO 195 IGR=1,NGRP + KPTMP=LCMGIL(JPTMP,IGR) + DO 170 I1D=1,N1D + CALL LCMLEN(KPTMP,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE1(I1D)=.TRUE. + CALL LCMGPD(KPTMP,HMAK1(I1D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + FLOTVA=FLOT(IBMOLD) + IF((.NOT.LPURE).AND.(I1D.EQ.4)) FLOTVA=1.0/FLOTVA + GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)+WEIGHT*FLOTVA + ENDIF + 170 CONTINUE + IF(ISTATE(4).GT.0) THEN + DO 175 I2D=1,N2D + CALL LCMLEN(KPTMP,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE2(I2D)=.TRUE. + CALL LCMGPD(KPTMP,HMAK2(I2D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + DO 174 I=1,NF + IOF=(IBMOLD-1)*NF+I + GAR2(IBM,I,IGR,I2D)=GAR2(IBM,I,IGR,I2D)+WEIGHT*FLOT(IOF) + 174 CONTINUE + ENDIF + 175 CONTINUE + ENDIF + DO 190 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 180 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 + 180 CONTINUE + ENDIF + 190 CONTINUE + 195 CONTINUE +*---- +* PROCESS ADF INFORMATION +*---- + IF(IDF.EQ.3) THEN + CALL LCMSIX(IPTMP,'ADF',1) + CALL LCMGET(IPTMP,'NTYPE',NTYPE) + IF(NTYPE.NE.NSURFD) CALL XABORT('ACRMAC: INVALID NTYPE VALUE.') + CALL LCMGTC(IPTMP,'HADF',8,NSURFD,HADF) + DO ITYPE=1,NSURFD + CALL LCMGET(IPTMP,HADF(ITYPE),GAR4) + DO IGR=1,NGRP + ADF2(IBM,IGR,ITYPE)=ADF2(IBM,IGR,ITYPE)+WEIGHT*GAR4(IGR) + ENDDO + ENDDO + CALL LCMSIX(IPTMP,' ',2) + ENDIF + 200 CONTINUE + CALL LCMCL(IPTMP,2) + 210 CONTINUE +*---- +* WRITE INTERPOLATED MACROLIB INFORMATION +*---- + IF(IKEFF.EQ.1) CALL LCMPUT(IPMAC,'K-EFFECTIVE',1,2,FKEFF) + CALL LCMPUT(IPMAC,'VOLUME',NMIX,2,XVOLM) + CALL LCMPUT(IPMAC,'ENERGY',NGRP+1,2,ENERG) + DEALLOCATE(ENERG,XVOLM) + IF(NED.GT.0) CALL LCMPTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + JPMAC=LCMLID(IPMAC,'GROUP',NGRP) + DO 365 IGR=1,NGRP + KPMAC=LCMDIL(JPMAC,IGR) + DO 320 I1D=1,N1D + IF(LMAKE1(I1D)) THEN + IF((.NOT.LPURE).AND.(I1D.EQ.4)) THEN + DO 311 IBM=1,NMIX + DO 310 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=1./GAR1(IBM,IGR,I1D) + 310 CONTINUE + 311 CONTINUE + ELSE IF(I1D.EQ.7) THEN + DO 316 IBM=1,NMIX + DO 315 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)* + 1 1.0E6 ! convert MeV to eV + 315 CONTINUE + 316 CONTINUE + ENDIF + CALL LCMPUT(KPMAC,HMAK1(I1D),NMIX,2,GAR1(1,IGR,I1D)) + ENDIF + 320 CONTINUE + DO 325 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 + 325 CONTINUE + DO 360 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IPOSDE=0 + DO 350 IBM=1,NMIX + IPOS(IBM)=IPOSDE+1 + IGMIN=IGR + IGMAX=IGR + DO 330 JGR=1,NGRP + IF(GAR3(IBM,JGR,IGR,IL).NE.0.0) THEN + IGMIN=MIN(IGMIN,JGR) + IGMAX=MAX(IGMAX,JGR) + ENDIF + 330 CONTINUE + IJJ(IBM)=IGMAX + NJJ(IBM)=IGMAX-IGMIN+1 + DO 340 JGR=IGMAX,IGMIN,-1 + IPOSDE=IPOSDE+1 + GAR4(IPOSDE)=GAR3(IBM,JGR,IGR,IL) + 340 CONTINUE + 350 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 + 360 CONTINUE + 365 CONTINUE + IF(IDF.EQ.3) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'NTYPE',1,1,NSURFD) + CALL LCMPTC(IPMAC,'HADF',8,NSURFD,HADF) + DO ITYPE=1,NSURFD + CALL LCMPUT(IPMAC,HADF(ITYPE),NMIX*NGRP,2,ADF2(1,1,ITYPE)) + ENDDO + CALL LCMSIX(IPMAC,' ',2) + ENDIF + 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 ACRMAC: INCLUDE LEAKAGE IN THE, + 1 14H MACROLIB (B2=,1P,E12.5,2H).)') B2 + JPMAC=LCMGID(IPMAC,'GROUP') + ALLOCATE(WORK1(NMIX),WORK2(NMIX)) + DO 520 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + CALL LCMGET(KPMAC,'NTOT0',WORK1) + CALL LCMGET(KPMAC,'DIFF',WORK2) + DO 510 IBM=1,NMIX + IF(MIXC(IBM).NE.0) WORK1(IBM)=WORK1(IBM)+B2*WORK2(IBM) + 510 CONTINUE + CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,WORK1) + 520 CONTINUE + DEALLOCATE(WORK2,WORK1) + ENDIF +*---- +* ACRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(HADF) + DEALLOCATE(ADF2,GAR4B,GAR4,GAR3,GAR2,GAR1) + DEALLOCATE(IPOSB,NJJB,IJJB,IPOS,NJJ,IJJ) + RETURN + END diff --git a/Donjon/src/ACRNDF.f b/Donjon/src/ACRNDF.f new file mode 100644 index 0000000..583ea46 --- /dev/null +++ b/Donjon/src/ACRNDF.f @@ -0,0 +1,106 @@ +*DECK ACRNDF + SUBROUTINE ACRNDF(IMPX,NBISO1,ISO,IBM,HNOMIS,IPAPX,IPLIB,MY1,MY2, + 1 YLDS,ISTYP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store records PYNAM, PYMIX and PYIELD into a Microlib. +* +*Copyright: +* Copyright (C) 2021 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 +* IMPX print parameter (equal to zero for no print). +* NBISO1 number of particularized isotopes. +* ISO particularized isotope index. +* IBM material mixture. +* HNOMIS array containing the names of the particularized isotopes. +* IPAPX address of the Apex file. +* IPLIB address of the output microlib LCM object. +* MY1 number of fissile isotopes including macroscopic sets. +* MY2 number of fission fragment. +* YLDS fission yields. +* +*Parameters: output +* ISTYP type of isotope ISO (=1: stable;=2: fissile; =3: fission +* product). +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPAPX,IPLIB + INTEGER IMPX,NBISO1,ISO,IBM,MY1,MY2,ISTYP + DOUBLE PRECISION YLDS(MY1,MY2) + CHARACTER(LEN=8) HNOMIS(NBISO1) +*---- +* LOCAL VARIABLES +*---- + INTEGER I, IOF, NBISO +*---- +* ALLOCATABLE AYYAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IPYMIX + REAL, ALLOCATABLE, DIMENSION(:) :: PYIELD + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: TYPISO + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HPYNAM +* + IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN + CALL hdf5_read_data(IPAPX,"/physconst/ISOTYP",TYPISO) + ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN + CALL hdf5_read_data(IPAPX,"/physco001/ISOTYP",TYPISO) + ELSE + CALL XABORT('ACRNDF: GROUP physconst NOT FOUND IN HDF5 FILE.') + ENDIF + NBISO=SIZE(TYPISO,1) + IF(ISO.LE.NBISO) THEN + IF(TYPISO(ISO).EQ.'OTHE') ISTYP=1 + IF(TYPISO(ISO).EQ.'FISS') ISTYP=2 + IF(TYPISO(ISO).EQ.'F.P.') ISTYP=3 + ELSE + ISTYP=1 + ENDIF + IF(ISTYP.EQ.3) THEN + ALLOCATE(HPYNAM(MY1),PYIELD(MY1),IPYMIX(MY1)) + IOF=0 + DO I=1,NBISO + IF(TYPISO(I).EQ.'FISS') THEN + IOF=IOF+1 + IF(IOF.GT.MY1) CALL XABORT('ACRNDF: MY1 OVERFLOW.') + HPYNAM(IOF)=HNOMIS(I) + IPYMIX(IOF)=IBM + PYIELD(IOF)=REAL(YLDS(IOF,ISO)) + ENDIF + ENDDO + DO I=NBISO+1,NBISO1 + IOF=IOF+1 + IF(IOF.GT.MY1) CALL XABORT('ACRNDF: MY1 OVERFLOW.') + HPYNAM(IOF)=HNOMIS(I) + IPYMIX(IOF)=IBM + PYIELD(IOF)=0.0 + ENDDO + IF(IOF.NE.MY1) CALL XABORT('ACRNDF: MY1 COUNT ERROR.') + CALL LCMPTC(IPLIB,'PYNAM',8,MY1,HPYNAM) + CALL LCMPUT(IPLIB,'PYMIX',MY1,1,IPYMIX) + CALL LCMPUT(IPLIB,'PYIELD',MY1,2,PYIELD) + IF(IMPX.GT.2) THEN + WRITE(6,'(3X,7HPYIELD=,1P,8E12.4/(8X,10E12.4))') (PYIELD(I), + 1 I=1,MY1) + ENDIF + DEALLOCATE(IPYMIX,PYIELD,HPYNAM) + ENDIF + DEALLOCATE(TYPISO) + RETURN + END diff --git a/Donjon/src/ACRRGR.f b/Donjon/src/ACRRGR.f new file mode 100644 index 0000000..544c480 --- /dev/null +++ b/Donjon/src/ACRRGR.f @@ -0,0 +1,894 @@ +*DECK ACRRGR + SUBROUTINE ACRRGR(IPAPX,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2, + 1 NCH,NB,NFUEL,NPARM,NPAR,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO, + 2 CONC,ITODO,LFROM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for Apex file interpolation. Use global +* parameters from a fuel-map object and optional user-defined values. +* +*Copyright: +* Copyright (C) 2021 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPAPX address of the Apex 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 Apex file. +* NCAL number of elementary calculations in the Apex file. +* MD2 number of particularized and macro isotopes in the Apex 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 +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another Apex file; +* =2 use another L_MAP + Apex file). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the Apex 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) +* LFROM macroregion flag (=.true. if 'xs n' groups are set). +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPAPX,IPMAP + INTEGER NMIX,IMPX,NMIL,NCAL,MD2,NFUEL,NCH,NB,ITER,MAXNIS, + 1 MIXC(NMIX),NPARM,NPAR,NISO(NMIX),ITODO(NMIX,MD2) + REAL TERP(NCAL,NMIX),CONC(NMIX,MD2) + LOGICAL LCUBIC,LISO(NMIX),LFROM + CHARACTER(LEN=8) HISO(NMIX,MD2) +*---- +* 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 TEXT24*24,HSMG*131,TEXT132*132,VALH(MAXPAR)*12, + 1 RECNAM*12,HPARNA*24,HCUBIC*24,TEXT12*12,HNAVAL*12 + INTEGER VALI(MAXPAR),MUPLET(2*MAXPAR),MUTYPE(2*MAXPAR), + 1 MAPLET(2*MAXPAR,MAXADD),MATYPE(2*MAXPAR,MAXADD), + 2 IDLTA(2*MAXPAR,MAXADD),NDLTA(2*MAXPAR),IDLTA1, + 3 MUPLT2(2*MAXPAR),MUTYP2(2*MAXPAR) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2),VALRA(2*MAXPAR,2,MAXADD),CONCMI(MD2) + 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(:) :: NVALUE,FMIX,ZONEC,VINTE + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ZONEDP + 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(:) :: VCHAR + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: HPAR, 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(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(MD2)) +*---- +* RECOVER INFORMATION FOR THE APEX FILE. +*---- + CALL hdf5_info(IPAPX,"/Calculation_Content",RANK,TYPE,NBYTE,DIMSR) + IF(RANK.GT.MAXLIN) CALL XABORT('ACRRGR: MAXLIN OVERFLOW.') + IF(NPAR.GT.MAXPAR) CALL XABORT('ACRRGR: MAXPAR OVERFLOW.') + CALL hdf5_read_data(IPAPX,"/Calculation_Content",TEXT132) + IF((RANK.EQ.1).AND.(DIMSR(1).EQ.1)) THEN + CALL hdf5_read_data(IPAPX,"/Calculation_Content",TEXT132) + IF(IMPX.GT.0) WRITE(IOUT,'(1X,A)') TEXT132 + ELSE IF(RANK.EQ.1) THEN + CALL hdf5_read_data(IPAPX,"/Calculation_Content",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(IPAPX,"/paramdescrip/PARNAM",PARKEY) + CALL hdf5_read_data(IPAPX,"/paramdescrip/PARFMT",PARFMT) + ENDIF + 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 + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 +*---- +* 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,:MD2)=0 + IDLTA1=0 + LFROM=.FALSE. + 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 APEX. +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(1).') + IF((TEXT24.EQ.'MIX').OR.(TEXT24.EQ.';')) THEN + NPARMP=NPARM + GO TO 30 + ELSE +* add burnup to parameters + NPARMP=NPARM+1 + HPAR(NPARMP)=TEXT24 + 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,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(2).') + 30 IF(TEXT24.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,TEXT24,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('ACRRGR: 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,*)'ACRRGR: UNABLE TO FIND FUEL MIXTURE ',IBM + CALL XABORT('ACRRGR: WRONG MIXTURE NUMBER.') + 50 IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(3).') + IF(TEXT24.EQ.'FROM')THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('ACRRGR: INTEGER DATA EXPECTED.') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') + LFROM=.TRUE. + ELSE IF(TEXT24.EQ.'USE') THEN + IBMOLD=IBM + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') + LFROM=.TRUE. + ENDIF + GOTO 30 + ELSEIF(TEXT24.EQ.'MICRO')THEN + IF(IBM.EQ.0) CALL XABORT('ACRRGR: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(4).') + IF(TEXT24.EQ.'ALL')THEN + LISOMI=.TRUE. + ELSEIF(TEXT24.EQ.'ONLY')THEN + LISOMI=.FALSE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(5).') + 60 IF(TEXT24.EQ.'ENDMIX')THEN + GOTO 30 + ELSE IF(TEXT24.EQ.'NOEV') THEN + IF(NISOMI.EQ.0) CALL XABORT('ACRRGR: MISPLACED NOEV.') + ITODO(IBM,NISOMI)=1 + ELSE + NISOMI=NISOMI+1 + IF(NISOMI.GT.MD2) CALL XABORT('ACRRGR: MD2 OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISOMI) + HISOMI(NISOMI)=TEXT24(:8) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.EQ.2)THEN + CONCMI(NISOMI)=FLOTT + ELSEIF((INDIC.EQ.3).AND.(TEXT24.EQ.'*'))THEN + CONCMI(NISOMI)=-99.99 + ELSE + CALL XABORT('ACRRGR: INVALID HISO DATA.') + ENDIF + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED.') + GOTO 60 + ELSEIF((TEXT24.EQ.'SET').OR.(TEXT24.EQ.'DELTA').OR. + 1 (TEXT24.EQ.'ADD'))THEN + IF(IBM.EQ.0) CALL XABORT('ACRRGR: MIX NOT SET (2).') + LSET1=.FALSE. + LDELT1=.FALSE. + LADD1=.FALSE. + ITYPE=0 + IF(TEXT24.EQ.'SET')THEN + ITYPE=1 + LSET1=.TRUE. + ELSEIF(TEXT24.EQ.'DELTA')THEN + ITYPE=2 + LDELT1=.TRUE. + ELSEIF(TEXT24.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,TEXT24,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(7).') + IF((TEXT24.EQ.'LINEAR').OR.(TEXT24.EQ.'CUBIC')) THEN + HCUBIC=TEXT24 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + ELSE + HCUBIC=' ' + ENDIF + IF(INDIC.NE.3)CALL XABORT('ACRRGR: CHARACTER DATA EXPECTED(8).') + DO I=1,NPAR + IF(TEXT24.EQ.PARKEY(I))THEN + IPAR=I + HPARNA=TEXT24 + GOTO 70 + ENDIF + ENDDO + WRITE(HSMG,'(18HACRRGR: PARAMETER ,A,14H NOT FOUND(1).)') TEXT24 + 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(IPAPX,"/paramdescrip/NVALUE",NVALUE) + WRITE(RECNAM,'(''/paramvalues/PVAL'',I8)') IPAR + CALL hdf5_info(IPAPX,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HACRRGR: 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.'FLOTTANT')))THEN + CALL hdf5_read_data(IPAPX,RECNAM,VREAL) + CALL REDGET(INDIC,NITMA,VALR1,TEXT24,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('ACRRGR: MAXADD OV' + 1 //'ERFLOW.') + IDLTA(IPAR,NDLTA(IPAR))=IDLTA1 + ENDIF + ELSEIF(TEXT24.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('ACRRGR: 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('ACRRGR: real value or "MAP" expected(1).') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,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(TEXT24.EQ.'MAP')THEN + IF(LDELT1)THEN + LDMAP(IPAR,2)=.TRUE. + ELSEIF(LADD1)THEN + LAMAP(IPAR,2,IDLTA1)=.TRUE. + ENDIF + ELSE + CALL XABORT('ACRRGR: real value or "MAP" expected(2).') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,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,'(23HACRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(1))') TRIM(HPARNA), + 2 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,'(23HACRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(2))') TRIM(HPARNA), + 2 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,'(23HACRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(1))') TRIM(HPARNA), + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF + IF((LADD1).AND.(TEXT24.EQ.'REF'))THEN + 120 DEALLOCATE(VREAL) + IPAR=-99 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(TEXT24.EQ.'ENDREF') GOTO 140 + DO I=1,NPAR + IF(TEXT24.EQ.PARKEY(I))THEN + IPAR=I + GOTO 130 + ENDIF + ENDDO + CALL XABORT('ACRRGR: PARAMETER '//TEXT24//' NOT FOUND(2).') + 130 CONTINUE + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.EQ.2)THEN + VALRA(IPAR,1,IDLTA1)=FLOTT + VALRA(IPAR,2,IDLTA1)=FLOTT + WRITE(RECNAM,'(''/paramvalues/PVAL'',I8)') IPAR + CALL hdf5_info(IPAPX,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HACRRGR: GLOBAL PARAMETER ,A, + 1 12H NOT SET(2).)') TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + CALL hdf5_read_data(IPAPX,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(TEXT24.EQ.'SAMEASREF')THEN + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=-1 + ELSE + CALL XABORT('ACRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 120 + 140 CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + ELSE IF((LDELT1).AND.(TEXT24.EQ.'REF'))THEN + 150 DEALLOCATE(VREAL) + IPAR=-99 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(TEXT24.EQ.'ENDREF') GOTO 170 + DO I=1,NPAR + IF(TEXT24.EQ.PARKEY(I))THEN + IPAR=I + GOTO 160 + ENDIF + ENDDO + CALL XABORT('ACRRGR: PARAMETER '//TEXT24//' NOT FOUND(3).') + 160 CONTINUE + CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + IF(INDIC.EQ.2)THEN + VALR(IPAR,1)=FLOTT + VALR(IPAR,2)=FLOTT + WRITE(RECNAM,'(''/paramvalues/PVAL'',I8)') IPAR + CALL hdf5_info(IPAPX,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HACRRGR: GLOBAL PARAMETER ,A, + 1 12H NOT SET(3).)') TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + CALL hdf5_read_data(IPAPX,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(TEXT24.EQ.'SAMEASREF')THEN + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=-1 + ELSE + CALL XABORT('ACRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 150 + 170 CALL REDGET(INDIC,NITMA,FLOTT,TEXT24,DFLOTT) + ENDIF + DEALLOCATE(VREAL) + GOTO 30 + ELSEIF(PARFMT(IPAR).EQ.'ENTIER')THEN + IF(ITYPE.NE.1)CALL XABORT('ACRRGR: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('ACRRGR: INTEGER DATA EXPECTED.') + CALL hdf5_read_data(IPAPX,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,'(26HACRRGR: INTEGER PARAMETER ,A,9H WITH VAL, + 1 2HUE,I5,28H NOT FOUND IN APEX DATABASE.)') PARKEY(IPAR), + 2 VALI(IPAR) + CALL XABORT(HSMG) + ELSEIF(PARFMT(IPAR).EQ.'CHAINE')THEN + IF(ITYPE.NE.1)CALL XABORT('ACRRGR: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3)CALL XABORT('ACRRGR: STRING DATA EXPECTED.') + CALL hdf5_read_data(IPAPX,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,'(25HACRRGR: STRING PARAMETER ,A,10H WITH VALU, + 1 1HE,A12,28H NOT FOUND IN APEX DATABASE.)') PARKEY(IPAR), + 2 VALH(IPAR) + CALL XABORT(HSMG) + ELSE + CALL XABORT('ACRRGR: INVALID FORMAT='//PARFMT(IPAR)) + ENDIF + ELSEIF(TEXT24.EQ.'TIMAV-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('ACRRGR: MIX NOT SET (3).') + IBTYP=1 + ELSEIF(TEXT24.EQ.'INST-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('ACRRGR: MIX NOT SET (4).') + IBTYP=2 + ELSEIF(TEXT24.EQ.'AVG-EX-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('ACRRGR: MIX NOT SET (5).') + IBTYP=3 + CALL REDGET(INDIC,IVARTY,FLOTT,TEXT24,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('ACRRGR: INTEGER DATA EXPECTED.') + ELSEIF(TEXT24.EQ.'ENDMIX')THEN +*---- +* RECOVER FUEL-MAP INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(PARFMT(IPAR).EQ.'FLOTTANT')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H ACRRGR: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H ACRRGR: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') 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('ACRRGR: 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('ACRRGR: 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 '//TRIM(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('ACRRGR: NMIX OVERFLOW.') + DO 260 JPARM=1,NPARMP + IF(.NOT.LPARM(JPARM))GOTO 260 + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + HPARNA=HPAR(JPARM) + GOTO 190 + ENDIF + ENDDO + WRITE(HSMG,'(18HACRRGR: PARAMETER ,A,14H NOT FOUND(4).)') + 1 TRIM(HPAR(JPARM)) + CALL XABORT(HSMG) + 190 CONTINUE + WRITE(RECNAM,'(''/paramvalues/PVAL'',I8)') IPAR + CALL hdf5_info(IPAPX,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HACRRGR: 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,'(''/paramvalues/PVAL'',I8)') IPAR + CALL hdf5_info(IPAPX,RECNAM,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.EQ.99) THEN + WRITE(HSMG,'(25HACRRGR: GLOBAL PARAMETER ,A,12H NOT SET(5).)') + 1 TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + CALL hdf5_read_data(IPAPX,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,'(23HACRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(3).)') TRIM(HPARNA), + 2 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,'(23HACRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(4).)') TRIM(HPARNA), + 2 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,'(23HACRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(2))') TRIM(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('ACRRGR: MIX OVERFLOW (APEX).') + IF(IMPY.GT.2) WRITE(6,'(32H ACRRGR: 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 ACRTRP(IPAPX,LCUB2,IMPY,NPAR,NCAL,MUPLT2,MUTYPE, + 1 VALR(1,1),VARVAL,TERP(1,NTOT)) + ELSE + TERP(:NCAL,NTOT)=0.0 + ENDIF + ELSE + CALL ACRTRP(IPAPX,LCUB2,IMPY,NPAR,NCAL,MUPLT2,MUTYPE, + 1 VALR(1,1),VARVAL,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 ACRTRP(IPAPX,LCUB2,IMPY,NPAR,NCAL,MUPLT2,MUTYP2, + 1 VALRA(1,1,IDLTA1),VARVAL,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('ACRRGR: ALGORITHM FAILURE.') + IBM=0 + ELSEIF((TEXT24.EQ.'APEX').OR.(TEXT24.EQ.'TABLE').OR. + 1 (TEXT24.EQ.'CHAIN').OR.(TEXT24.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT24.EQ.';') ITER=0 + IF(TEXT24.EQ.'APEX') ITER=1 + IF(TEXT24.EQ.'TABLE') ITER=2 + IF(TEXT24.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('ACRRGR: 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,'(43HACRRGR: 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('ACRRGR: '//TRIM(TEXT24)//' IS AN INVALID KEYWORD.') + ENDIF + GOTO 20 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 310 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H ACRRGR: 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) + DEALLOCATE(HISOMI,HPAR,LDELTA,WPAR,BRN1,BRN0,ZONEC,ZONEDP,FMIX, + 1 LPARM) + RETURN +* + 320 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/ACRSX2.f b/Donjon/src/ACRSX2.f new file mode 100644 index 0000000..46b36eb --- /dev/null +++ b/Donjon/src/ACRSX2.f @@ -0,0 +1,197 @@ +*DECK ACRSX2 + SUBROUTINE ACRSX2(IPAPX,RECNAM,NREA,NGRP,NISOF,NISOP,NL,INDX, + 1 NOMREA,B2APEX,FACT,WEIGHT,SPH,FLUXS,IREAF,LPURE,LXS,XS,SIGS, + 2 SS2D,TAUXFI) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the cross sections of an elementary calculation and single +* mixture in an Apex file and perform multiparameter interpolation. +* +*Copyright: +* Copyright (C) 2021 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 +* IPAPX pointer to the Apex file. +* RECNAM character identification of calculation. +* NREA number of reactions in the Apex file. +* NGRP number of energy groups. +* NISOF number of fissile isotopes. +* NISOP number of fission products. +* NL maximum Legendre order (NL=1 is for isotropic scattering). +* INDX position of isotopic set in current mixture (=-2: residual +* set; -1: total set; >0 isotope index). +* NOMREA names of reactions in the Apex file. +* B2APEX buckling as recovered from the Apex file +* FACT number density ratio for the isotope +* WEIGHT interpolation weight +* SPH SPH factors +* FLUXS averaged flux +* IREAF position of 'NUFI' reaction in NOMREA array +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* +*Parameters: input/output +* LXS existence flag of each reaction. +* XS interpolated cross sections per reaction +* SIGS interpolated scattering cross sections +* SS2D interpolated scattering matrix +* TAUXFI interpolated fission rate +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPAPX + CHARACTER RECNAM*80 + INTEGER NREA,NGRP,NISOF,NISOP,NL,INDX,IREAF + REAL B2APEX,FACT,WEIGHT,SPH(NGRP),FLUXS(NGRP),SS2D(NGRP,NGRP,NL), + 1 SIGS(NGRP,NL),XS(NGRP,NREA),TAUXFI + LOGICAL LXS(NREA),LPURE + CHARACTER NOMREA(NREA)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER RANK,TYPE,NBYTE,DIMSR(5),IREA,IOF,IL,IGR,JGR + REAL TAUXF,XSECT + CHARACTER RECNAM2*80,RECNAM3*80 + REAL, ALLOCATABLE, DIMENSION(:) :: WORK1D + REAL, ALLOCATABLE, DIMENSION(:,:) :: WORK2D,SIGSB,XSB + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: WORK3D,SS2DB + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: WORK4D +*---- +* FILL OUTPUT ARRAYS +*---- + ALLOCATE(SIGSB(NGRP,NL),SS2DB(NGRP,NGRP,NL),XSB(NGRP,NREA)) + SIGSB(:NGRP,:NL)=0.0 + SS2DB(:NGRP,:NGRP,:NL)=0.0 + XSB(:NGRP,:NREA)=0.0 + IOF=0 + IF(INDX.EQ.-2) THEN + ! residual set + RECNAM2=TRIM(RECNAM)//"mac/RESIDUAL/" + ELSE IF(INDX.EQ.-1) THEN + ! total set + RECNAM2=TRIM(RECNAM)//"mac/TOTAL/" + ELSE IF((INDX.GE.1).AND.(INDX.LE.NISOF)) THEN + ! particularized fissile isotope set + IOF=0 + RECNAM2=TRIM(RECNAM)//"mic/f.p./" + ELSE IF((INDX.GE.NISOF+1).AND.(INDX.LE.NISOF+NISOP)) THEN + ! particularized fission product set + IOF=NISOF + RECNAM2=TRIM(RECNAM)//"mic/fiss/" + ELSE IF(INDX.GE.NISOF+NISOP+1) THEN + ! particularized stable isotope set + IOF=NISOF+NISOP + RECNAM2=TRIM(RECNAM)//"mic/othe/" + ENDIF + DO IREA=1,NREA + RECNAM3=TRIM(RECNAM2)//NOMREA(IREA) + IF(NOMREA(IREA).EQ.'PROF') CYCLE + CALL hdf5_info(IPAPX,RECNAM3,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + LXS(IREA)=.TRUE. + IF(NOMREA(IREA).EQ.'DIFF') THEN + IF(INDX.LT.0) THEN + CALL hdf5_read_data(IPAPX,RECNAM3,WORK2D) + SIGSB(:,:)=WORK2D(:,:) + DEALLOCATE(WORK2D) + ELSE + CALL hdf5_read_data(IPAPX,RECNAM3,WORK3D) + SIGSB(:,:)=WORK3D(:,:,INDX-IOF) + DEALLOCATE(WORK3D) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'SCAT') THEN + IF(INDX.LT.0) THEN + CALL hdf5_read_data(IPAPX,RECNAM3,WORK3D) + SS2DB(:,:,:)=WORK3D(:,:,:) + DEALLOCATE(WORK3D) + ELSE + CALL hdf5_read_data(IPAPX,RECNAM3,WORK4D) + SS2DB(:,:,:)=WORK4D(:,:,:,INDX-IOF) + DEALLOCATE(WORK4D) + ENDIF + NL=SIZE(SS2DB,3) + DO IL=2,NL + SS2DB(:,:,IL)=SS2DB(:,:,IL)/REAL(2*IL-1) + ENDDO + ELSE + IF(INDX.LT.0) THEN + CALL hdf5_read_data(IPAPX,RECNAM3,WORK1D) + XSB(:,IREA)=WORK1D(:) + DEALLOCATE(WORK1D) + ELSE + CALL hdf5_read_data(IPAPX,RECNAM3,WORK2D) + XSB(:,IREA)=WORK2D(:,INDX-IOF) + DEALLOCATE(WORK2D) + ENDIF + ENDIF + ENDIF + ENDDO +*---- +* COMPUTE FISSION RATE FOR AN ELEMENTARY CALCULATION +*---- + TAUXF=0.0 + IF(.NOT.LPURE.AND.(IREAF.GT.0)) THEN + DO IGR=1,NGRP + TAUXF=TAUXF+XSB(IGR,IREAF)*FLUXS(IGR) + ENDDO + TAUXFI=TAUXFI+WEIGHT*FACT*TAUXF + ENDIF +*---- +* WEIGHT MICROSCOPIC CROSS SECTION DATA IN AN INTERPOLATED MICROLIB +*---- + DO IGR=1,NGRP + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + IF(LPURE.AND.NOMREA(IREA).EQ.'CHI') THEN + XS(IGR,IREA)=XS(IGR,IREA)+WEIGHT*XSB(IGR,IREA) + ELSE IF(NOMREA(IREA).EQ.'CHI') THEN + IF(IREAF.EQ.0) CALL XABORT('ACRSX2: IREAF=0.') + XS(IGR,IREA)=XS(IGR,IREA)+WEIGHT*FACT*TAUXF*XSB(IGR,IREA) + ELSE IF(NOMREA(IREA).EQ.'LEAK') THEN + IF(B2APEX.NE.0.0) THEN + XSECT=XSB(IGR,IREA)/B2APEX + XS(IGR,IREA)=XS(IGR,IREA)+SPH(IGR)*FACT*WEIGHT*XSECT + ENDIF + ELSE + XS(IGR,IREA)=XS(IGR,IREA)+FACT*SPH(IGR)*WEIGHT*XSB(IGR,IREA) + ENDIF + ENDDO + DO IL=1,NL + IF(MOD(IL,2).EQ.1) THEN + SIGS(IGR,IL)=SIGS(IGR,IL)+FACT*SPH(IGR)*WEIGHT*SIGSB(IGR,IL) + ELSE + DO JGR=1,NGRP + SIGS(IGR,IL)=SIGS(IGR,IL)+FACT*WEIGHT*SS2DB(JGR,IGR,IL) + 1 /SPH(JGR) + ENDDO + ENDIF + ENDDO + DO JGR=1,NGRP + DO IL=1,NL + IF(MOD(IL,2).EQ.1) THEN + SS2D(IGR,JGR,IL)=SS2D(IGR,JGR,IL)+FACT*SPH(JGR)*WEIGHT* + 1 SS2DB(IGR,JGR,IL) + ELSE + SS2D(IGR,JGR,IL)=SS2D(IGR,JGR,IL)+FACT*WEIGHT* + 1 SS2DB(IGR,JGR,IL)/SPH(IGR) + ENDIF + ENDDO + ENDDO + ENDDO + DEALLOCATE(XSB,SS2DB,SIGSB) + RETURN + END diff --git a/Donjon/src/ACRTRP.f b/Donjon/src/ACRTRP.f new file mode 100644 index 0000000..6a3e875 --- /dev/null +++ b/Donjon/src/ACRTRP.f @@ -0,0 +1,207 @@ +*DECK ACRTRP + SUBROUTINE ACRTRP(IPAPX,LCUB2,IMPX,NPAR,NCAL,MUPLET,MUTYPE,VALR, + 1 VARVAL,TERP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the TERP interpolation/derivation/integration factors using +* table-of-content information of the Apex file. +* +*Copyright: +* Copyright (C) 2021 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPAPX address of the multidimensional Apex 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 Apex file. +* MUPLET tuple used to identify an elementary calculation. +* MUTYPE type of interpolation (=1: interpolation; =2: delta-sigma). +* VALR real values of the interpolated point. +* VARVAL exit burnup used if MUTYPE(IPAR(ID))=3. +* +*Parameters: output +* TERP interpolation factors. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXPAR=50 + TYPE(C_PTR) IPAPX + INTEGER IMPX,NPAR,NCAL,MUPLET(NPAR),MUTYPE(NPAR) + REAL VALR(2*MAXPAR,2),VARVAL,TERP(NCAL) + LOGICAL LCUB2(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, MAXNVP, NDELTA, NDIM, + 1 NID, NTOT, NCRCAL + REAL T1D(MAXVAL,MAXDIM),WORK(MAXVAL) + CHARACTER HSMG*131,RECNAM*80 + LOGICAL LCUBIC,LSINGL +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NVALUE,JDEBAR,JARBVA + REAL, ALLOCATABLE, DIMENSION(:) :: TERPA,VREAL + CHARACTER(LEN=80), ALLOCATABLE, DIMENSION(:) :: PARNAM +*---- +* RECOVER TREE INFORMATION +*---- + CALL hdf5_read_data(IPAPX,"/paramtree/DEBTREE",JDEBAR) + CALL hdf5_read_data(IPAPX,"/paramtree/TREEVAL",JARBVA) + CALL hdf5_read_data(IPAPX,"/paramdescrip/NVALUE",NVALUE) +*---- +* 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,'(7HACRTRP:,I4,29H-DIMENSIONAL INTERPOLATION NO, + 1 14HT IMPLEMENTED.)') NDIM + CALL XABORT(HSMG) + ENDIF + IPAR(NDIM)=I + ENDIF + 10 CONTINUE + IF(IMPX.GT.2) THEN + WRITE(IOUT,'(16H ACRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(8H ACRTRP:,I4,31H-DIMENSIONAL INTERPOLATION IN A, + 1 9HPEX FILE.)') NDIM + ENDIF + IF(NDIM.EQ.0) THEN + ICAL=NCRCAL(1,MAXNVP,NPAR,JDEBAR,JARBVA,MUPLET) + IF(ICAL.GT.NCAL) CALL XABORT('ACRTRP: 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,'(''paramvalues/PVAL'',I8)') IPAR(ID) + NID=NVALUE(IPAR(ID)) + ELSE + CALL XABORT('ACRTRP: PARAMETER INDEX OVERFLOW.') + ENDIF + NTOT=NTOT*NID + DO 15 IDTMP=1,NDIM-ID + IDDIV(IDTMP)=IDDIV(IDTMP)*NID + 15 CONTINUE + CALL hdf5_read_data(IPAPX,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('ACRTRP: 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('ACRTRP: INVALID BURNUP' + 1 //' LIMITS(2).') + CALL hdf5_read_data(IPAPX,"/paramdescrip/PARNAM",PARNAM) + IF(PARNAM(IPAR(ID)).NE.'Burnup') THEN + CALL XABORT('ACRTRP: 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('ACRTRP: 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 + ICAL=NCRCAL(1,MAXNVP,NPAR,JDEBAR,JARBVA,MUPLET) + IF(ICAL.GT.NCAL) CALL XABORT('ACRTRP: 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 ACRTRP: TERP PARAMETERS:/(1X,1P,10E12.4))') + 1 (TERP(I),I=1,NCAL) + ENDIF + DEALLOCATE(JARBVA,JDEBAR,NVALUE) + RETURN +*---- +* MISSING ELEMENTARY CALCULATION EXCEPTION. +*---- + 200 WRITE(IOUT,'(16H ACRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + CALL XABORT('ACRTRP: MISSING ELEMENTARY CALCULATION.') + 210 WRITE(IOUT,'(16H ACRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(9X,7HNVALUE=,10I4/(16X,10I4))') (NVALUE(I),I=1,NPAR) + CALL XABORT('ACRTRP: DEGENERATE ELEMENTARY CALCULATION.') + END diff --git a/Donjon/src/AFM.f b/Donjon/src/AFM.f new file mode 100644 index 0000000..a835024 --- /dev/null +++ b/Donjon/src/AFM.f @@ -0,0 +1,261 @@ +*DECK AFM + SUBROUTINE AFM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Generate a macrolib using the AFM feedback model +* +*Copyright: +* Copyright (C) 2002 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): +* M.T. Sissaoui +* +*Update(s): +* E. Varin, B. Dionne +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Reference: +* M. T. Sissaoui, G. Marleau and D. Rozon, "CANDU Reactor Simulations +* Using the Feedback Model with Actinide Burnup History," Nucl. +* Technology, 125, 197 (1999). +* +*Comments: +* The AFM: calling specifications are: +* MACRO := AFM: [ MACRO ] DBASE [ MAPFL ] :: (descafm) ; +* where +* MACRO : name of the extended \emph{macrolib} +* DBASE : name of the \emph{database} object containing fuel properties with +* respect to local parameters. +* MAPFL : name of the \emph{map} object containing fuel regions description +* and burnupinformations. This file is only required when a \emph{MACRO is +* created for fuel area. +* (descafm) : structure containing the data to module AFM:. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + CHARACTER TEXT12*12,HSMG*131,HSIGN*12,TEXT*5,CTITRE*72,TINFO*72 + LOGICAL LMCR,LMAP + DOUBLE PRECISION DFLOTT + INTEGER IPAR(NSTATE),IDATA(NSTATE) + TYPE(C_PTR) IPLIST +* + LMCR=.FALSE. + LMAP=.FALSE. + MSFT=0 +* +* PARAMETER VALIDATION. + IF(NENTRY.LE.1) CALL XABORT('AFM: 2 PARAMETER EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('AFM:' + 1 //' MACROLIB LINKED LIST OR XSM FILE EXPECTED AT LHS.') +* + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2)) CALL XABORT('AFM:' + 1 //' DATABASE LINKED LIST OR XSM FILE EXPECTED AT RHS.') + IF(JENTRY(2).NE.2) CALL XABORT('AFM: DATABASE IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') +* + CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'MCR') THEN + LMCR=.TRUE. + WRITE(6,'(A37)') 'AFM: GENERATION OF A SINGLE MACROLIB' + CALL REDGET (INDIC,MXSH,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFM: INTEGER DATA EXPECTED.') + ELSEIF(TEXT.EQ.'MAP') THEN + LMAP=.TRUE. + IF((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2)) CALL XABORT('AFM:' + 1 //' FUEL MAP LINKED LIST OR XSM FILE EXPECTED AT RHS.') + IF(JENTRY(3).NE.2) CALL XABORT('AFM: COMPO IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') + ELSE + CALL XABORT('AFM: MAP OR MCR KEY WORD EXPECTED') + ENDIF +* + ITYPE=JENTRY(1) + IPLIST=KENTRY(1) + MMIX=1 +*---------------------------------------------------------------* +* CHECK THE SIGNTURE OF THE LINKED LIST OR XSM FILE + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'REACTOR_XSDB') THEN + TEXT12=HENTRY(2) + CALL XABORT('AFM: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. REACTOR_XSDB EXPECTED.') + ENDIF +*---------------------------------------------------------------* +* IF L_MAP IS NOT AVAILABLE AFM GENERATE ONLY A TABLE + IF(LMAP) THEN + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP') THEN + TEXT12=HENTRY(3) + CALL XABORT('AFM: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_MAP EXPECTED.') + ENDIF + WRITE(6,'(A42)') 'AFM: GENARATION OF A MACROLIB USING L_MAP' + ENDIF +*---------------------------------------------------------------* +* READ THE INFORMATION TITLE. + CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'INFOR') THEN + CALL REDGET(INDIC,NITMA,FLOTT,TINFO,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + ELSE + CALL XABORT('AFM:KEY WORD INFOR EXPECTED.') + ENDIF +* +* RECOVER SOME INFORMATIONS FROM THE DATABASE. + TEXT12='INFORMATION' + CALL LCMLEN(KENTRY(2),TEXT12,LENGT,ITYLCM) + IF(LENGT.GT.0) THEN + CALL LCMGTC(KENTRY(2),'INFORMATION',72,CTITRE) + WRITE(6,*)'INFORMATION TITLE ',TINFO +* + IF(CTITRE.NE.TINFO) THEN + CALL XABORT('AFM: INCONSISTENT TITLES '//CTITRE// + 1 ' EXPECTED. INSTEAD OF ' //TINFO// ' ') + ENDIF + ELSE + CALL XABORT('AFM: DATA BASE TITLE IS NOT PROVIDED ') + ENDIF +*---------------------------------------------------------------* +* CHECK THE NAMES OF THE DIFFERENTS DIRECTORIES + CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + IF(TEXT.NE.'DNAME') CALL XABORT('AFM:KEY WORD DNAME EXPECTED.') + CALL REDGET(INDIC,NUT,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFM: INTEGER DATA EXPECTED.') + IF(NUT.GT.1.AND.LMCR) CALL XABORT('AFM: INVALID NUMBER.') + DO 100 IJ=1,NUT + CALL REDGET (INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + CALL LCMLEN(KENTRY(2),TEXT12,LENGT,ITYLCM) + IF(LENGT.EQ.0) THEN + CALL XABORT('AFM: DATA NAME '//TEXT12// + 1 ' DO NOT EXIST ') + ENDIF + 100 CONTINUE +*---------------------------------------------------------------* +* RECOVER SOME INFORMATIONS FROM DATABASE. +* TEXT12='SIGNATURE' + CALL LCMSIX(KENTRY(2),TEXT12,1) +* RECOVER THE TITLE. + CALL LCMLEN(KENTRY(2),'TITLE',LENGT,ITYLCM) + IF(LENGT.GT.0) THEN + CALL LCMGTC(KENTRY(2),'TITLE',72,CTITRE) + ELSE + CTITRE='*** NO TITLE PROVIDED ***' + ENDIF +* READ PARAMETERS DANS L_FBM + CALL LCMGET(KENTRY(2),'PARAM',IPAR) + CALL LCMSIX(KENTRY(2),' ',2) + NGRP =IPAR(1) + NISO =IPAR(2) + NL =IPAR(3) + NBURN=IPAR(4) + IXYZ =IPAR(5) +*---------------------------------------------------------------* + IF(LMCR) THEN + NBCH=MXSH + NCCO=1 + NCZO=1 + ISC=4 + MMIX=NBCH*NCCO + MSFT =0 + ELSEIF (LMAP) THEN +* RECOVER INFORMATIONS FROM L_MAP. +* READ PARAMETERS + CALL LCMGET(KENTRY(3),'STATE-VECTOR',IPAR) + NBCH =IPAR(1) + NCCO =IPAR(2) + NCZO =IPAR(3) + ISC =IPAR(5) + MSFT =IPAR(6) + NPARM =IPAR(8) + MMIX=NBCH*NCCO +C HISTORY PARAMETER + IF(IPAR(4).NE.NGRP) THEN + WRITE(HSMG,'(A40,I5,A18,I5)') 'AFM: INCONSISTENT NB OF ' + 1 //'GROUPS. IN MAP =',IPAR(4),' IN REACTOR_XSDB =',NGRP + CALL XABORT(HSMG) + ENDIF + ENDIF +* MSFT IS THE TOTAL NUMBER OF SHIFT + MNPS=MSFT+2 +* READ THE INPUT DATA. +* TO USE THE SAME VECTOR TO GET THE REFERENCE LOCAL PARAMETER +* IF(NISO.LT.8) THEN +* NISM=8 + IF(NISO.LT.7) THEN + NISM=7 + ELSE + NISM=NISO + ENDIF + IF(ITYPE.NE.0) THEN + CALL LCMGET(IPLIST,'STATE-VECTOR',IDATA) + IF(NGRP.NE.IDATA(1)) CALL XABORT('WRONG NUMBER OF ENERGY' + 1 //' GROUPS IN UPDATED MACROLIB') + IF(MMIX.NE.IDATA(2)) CALL XABORT('WRONG NUMBER OF MATER' + 1 //'IAL MIXTURES IN UPDATED MACROLIB') + IF(NL.NE.IDATA(3)) CALL XABORT('WRONG ORDER OF ANISOTROPY' + 1 //'IN UPDATED MACROLIB') + ENDIF +*---------------------------------------------------------------* +* NTYP TYPE OF CROSS-SECTIONS CONSIDERED + NTYP=5+NL+IXYZ*2 +*---------------------------------------------------------------* +* DRIVER TO COMPUTE THE FEEDBACK COEFFICIENTS. +*---------------------------------------------------------------* + CALL AFMDRV(KENTRY,NENTRY,NPARM,ITYPE,NBURN,NGRP,NISO,ISC,MNPS, + 1 NL,ILEAK,NTYP,NBCH,NCCO,NCZO,NUT,CTITRE,LMCR,IXYZ,MMIX,MSFT, + 2 NISM) +*---------------------------------------------------------------* + IF(JENTRY(1).EQ.0) THEN + IDATA(:NSTATE)=0 + HSIGN='L_MACROLIB' + CALL LCMPTC(IPLIST,'SIGNATURE',12,HSIGN) + IDATA(1)=NGRP + IDATA(2)=MMIX + IDATA(3)=NL + IDATA(4)=1 + IDATA(9)=ILEAK + CALL LCMPUT(IPLIST,'STATE-VECTOR',NSTATE,1,IDATA) + ELSE + IDATA(1)=NGRP + IDATA(2)=MMIX + IDATA(3)=1 + IDATA(4)=1 + IDATA(9)=ILEAK + CALL LCMPUT(IPLIST,'STATE-VECTOR',NSTATE,1,IDATA) + ENDIF + RETURN + END diff --git a/Donjon/src/AFMCPT.f b/Donjon/src/AFMCPT.f new file mode 100644 index 0000000..5b697a7 --- /dev/null +++ b/Donjon/src/AFMCPT.f @@ -0,0 +1,467 @@ +*DECK AFMCPT + SUBROUTINE AFMCPT (KENTRY,NBURN,NGRP,NISO,NL,IMPX, + 1 SMACB,XBORB,XPURB,XXENB,XT1FB,XT2FB,XT1CB, + 1 XT2CB,XT1MB,XT2MB,XD1CB,XD2CB,XD1MB,XD2MB, + 1 XSMB,XNP9B,XMFDB,XMMDB,XPF1B,XPF2B,XPF1LB,XPF2LB, + 1 DENSITB,CPW1B,CPW2B,FLUXB,OVERVB,CHIB, + 1 IJJ,NJJ,HISO,CTITRE,NMIX,SIGMA,NTYP,TF,TC, + 1 TM,DC,DM,BOR,XEN,SM,RNP9,XI,TFR,TCR,TMR,XIR, + 1 OVERV,FLUX,CHI,SCAT,MMIX,NPS,PW,XBRH,XBURN, + 1 LTAV,IRAV,IDF,JTAB,IXYZ,ILIN) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the cross sections +* +*Copyright: +* Copyright (C) 1996 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): +* M.T. Sissaoui +* +*Parameters: input +* KENTRY address of the linked list or handle to the xsm file. +* NGRP number of energy groups. +* NISO number of extracted isotopes. +* NL number of Legendre orders (=1 for isotropic scattering). +* NBURN number of burnup steps. +* NTYP total number of cross sections type. +* TF fuel temperature. +* TC coolant temperature. +* TM moderator temperature. +* DC coolant density. +* DM moderator density. +* BOR Boron concentration. +* XEN Xenon concentration. +* SM Samarium concentration. +* RNP9 Neptunium concentration. +* XI moderator purity. +* NMIX mixture number. +* NPS NPS-2 power shift. +* IXYZ type of diffusion coefficient (=0: isotropic; =1: directional) +* +*Parameters: +* IMPX +* SMACB +* XBORB +* XPURB +* XXENB +* XT1FB +* XT2FB +* XT1CB +* XT2CB +* XT1MB +* XT2MB +* XD1CB +* XD2CB +* XD1MB +* XD2MB +* XSMB +* XNP9B +* XMFDB +* XMMDB +* XPF1B +* XPF2B +* XPF1LB +* XPF2LB +* DENSITB +* CPW1B +* CPW2B +* FLUXB +* OVERVB +* CHIB +* IJJ +* NJJ +* HISO +* CTITRE +* SIGMA +* TFR +* TCR +* TMR +* XIR +* OVERV +* FLUX +* CHI +* SCAT +* MMIX +* PW +* XBRH +* XBURN +* LTAV +* IRAV +* IDF +* JTAB +* ILIN +* +*----------------------------------------------------------------------- +* + CHARACTER HMICRO*12,CTITRE*72 + LOGICAL LTAV + DOUBLE PRECISION XCOF(3) + REAL CPF1(3) + DIMENSION KENTRY(*), + 1 SMACB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XBORB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XXENB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XT1FB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XT2FB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XT1CB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XT2CB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XT1MB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XT2MB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XD1CB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XD2CB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XD1MB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XD2MB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XSMB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XNP9B(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XMFDB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XMMDB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XPF1B(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XPF2B(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XPF1LB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XPF2LB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 XPURB(NGRP*NGRP,NTYP,NISO,NBURN,*), + 1 DENSITB(NISO,NBURN,*),CPW1B(2,NBURN,*), + 1 CPW2B(2,NBURN,*),FLUXB(NGRP,NBURN,*), + 1 CHIB(NGRP,NBURN,*),OVERVB(NGRP,NBURN,*), + 2 HISO(*),JTAB(*), + 6 ELMT(3),PW(*), + 7 SIGMA(MMIX,NGRP,NTYP),XBRH(*), + 8 OVERV(MMIX,*),FLUX(MMIX,*), + 7 CHI(MMIX,*),SCAT(MMIX,NL,NGRP,*), + 1 XBURN(NBURN,*),NJJ(*),IJJ(*) + REAL, ALLOCATABLE, DIMENSION(:) :: DEL + REAL, ALLOCATABLE, DIMENSION(:,:) :: CPW1,CPW2 + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: SMAC +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(SMAC(NGRP*NGRP,NTYP,NISO),DEL(NISO),CPW1(3,NPS), + 1 CPW2(3,NPS)) +* +* Remove warning for uninitialized variable + ISOB=0 + D2MB=0.0 + D2CB=0.0 + D1M=0.0 + D2C=0.0 + CX=0.0 + CSM=0.0 + D1C=0.0 + D2M=0.0 + CNP9=0.0 + CB=0.0 + PUR=0.0 +*---------------------------------------------------------------* + IF(NBURN.EQ.0) CALL XABORT('AFMCPT: ZERO NUMBER OF MIXTURES.') + IF(NGRP.EQ.0) CALL XABORT('AFMCPT: ZERO NUMBER OF GROUPS.') +*---------------------------------------------------------------* + NG2=NGRP*NGRP + NTM=4+2*IXYZ + IF(IMPX.GT.5) THEN + WRITE(6,'(9H AFMCPT: ,A)') CTITRE + WRITE(6,*) ' NTYP ',NTYP + ENDIF + XECON=0.0 + TFAV=0.0 + DCAV=0.0 + CPF2=0.0 + CF=0.0 + DO 81 ISO=1,NISO + DO 80 ITY=1,NTYP + DO 79 IGR=1,NG2 + SMAC(IGR,ITY,ISO)=0.0 + 79 CONTINUE + 80 CONTINUE + 81 CONTINUE + DO 82 IGR=1,NGRP + FLUX(NMIX,IGR)=0.0 + OVERV(NMIX,IGR)=0.0 + CHI(NMIX,IGR)=0.0 + 82 CONTINUE + DO 161 ISO=1,NISO + DEL(ISO)=0.0 + 161 CONTINUE + DO 73 II=1,3 + XCOF(II)=0.0D0 + ELMT(II)=0.0 + CPF1(II)=0.0 + 73 CONTINUE + DO 74 K=1,NPS + DO II=1,3 + CPW1(II,K)=0.0 + CPW2(II,K)=0.0 + ENDDO + 74 CONTINUE +* + PREF=PW(1) + IPFBM=KENTRY(2) +*---------------------------------------------------------------* +* COMPUTE THE HISTORY COEFFICIENTS + NPSX=NPS+NPS-1 + DO 101 K=2,NPSX +* XSECTION FOR SNAP-SHOT OR (TIME AVERAGE-HOMOG.) + IF(LTAV) THEN + IRMAX=IRAV + IRMIN=IRAV + XCOF(1)=1.0D0 + ELSE +* + IF(K.GT.NPS) THEN + XIRAD=XBRH(K-NPS+1) + ELSE + XIRAD=XBRH(NPS)-XBRH(K-1) + ENDIF + CALL AFMLOC(NBURN,NTP,XIRAD,XIRAD,XBURN(1,IDF), + 1 IRMAX,IRMIN,XCOF,ILIN) + ENDIF +* +* INTERPOLATE THE HISTORY COEFFICIENTS + IH=0 + DO 910 I = IRMIN,IRMAX + IH=IH+1 + IF(K.LE.NPS) THEN + IF(PW(K).GT.PREF) THEN + CPW1(IH,K)=CPW1B(1,I,IDF) + CPW1(IH,K) + CPW2(IH,K)=CPW2B(1,I,IDF) + CPW2(IH,K) + ELSE + CPW1(IH,K)=CPW1B(2,I,IDF) + CPW1(IH,K) + CPW2(IH,K)=CPW2B(2,I,IDF) + CPW2(IH,K) + ENDIF +* + IF(K.GT.2) THEN + IF(PW(K-1).GT.PREF) THEN + CPW1(IH,K-1)=-CPW1B(1,I,IDF) + CPW1(IH,K-1) + CPW2(IH,K-1)=-CPW2B(1,I,IDF) + CPW2(IH,K-1) + ELSE + CPW1(IH,K-1)=-CPW1B(2,I,IDF) + CPW1(IH,K-1) + CPW2(IH,K-1)=-CPW2B(2,I,IDF) + CPW2(IH,K-1) + ENDIF + ENDIF + ENDIF + 910 CONTINUE + 101 CONTINUE +* + YF=0.0 + DO 111 K=2,NPS + IF(K.EQ.2) THEN +* CORRECTE THE STURATING PSEUDO-FISSILE ISOTOPE + IF(PW(K).GT.PREF) THEN + XPW=ALOG(PW(K)/PW(1)) + XPWM=1.0/PW(K)-1.0/PW(1) + YF=0.0 + ELSE + XPW=PW(K)-PW(1) + XPWM=(PW(K)-PW(1))**2 + YF=1.0 + ENDIF + DO IH=1,3 + CPF1(IH)=CPF1(IH) +CPW1(IH,K)*XPW + CPW2(IH,K)*XPWM + ENDDO +C + ELSE + IF(PW(K).GT.PREF) THEN + XPW=ALOG(PW(K)/PW(1)) + XPWM=1.0/PW(K)-1.0/PW(1) + ELSE + XPW=PW(K)-PW(1) + XPWM=(PW(K)-PW(1))**2 +C + ENDIF + DO IH=1,3 + CPF1(IH)=CPF1(IH) +CPW1(IH,K)*XPW + CPW2(IH,K)*XPWM + ENDDO + ENDIF + 111 CONTINUE +*---------------------------------------------------------------* +* COMPUTE THE DEVIATION OF THE PSEUDO-ISOTOPE +* CPF1 AND CPF2 +* CPF2=CPF1*CPF1 +*---------------------------------------------------------------* +* APPLY THE FEEDBACK MODEL + T1F=SQRT(TF)-SQRT(TFR) + T2F=TF-TFR + T1C=ALOG(TC/TCR) + T2C=1.0/TC - 1.0/TCR + T1M=ALOG(TM/TMR) + T2M=1.0/TM - 1.0/TMR +* +* RECOVER LOCAL PARAMETER COEFFICIENT AND X-SECTIONS + II=0 + DMOD=0.0 + DO 900 I = IRMIN,IRMAX + II=II+1 + RXCOEF=REAL(XCOF(II)) + DO 249 IGR=1,NGRP + FLUX(NMIX,IGR)=FLUX(NMIX,IGR)+RXCOEF*FLUXB(IGR,I,IDF) + OVERV(NMIX,IGR)=OVERV(NMIX,IGR)+RXCOEF*OVERVB(IGR,I,IDF) + 249 CONTINUE +* COMPUTE DELTA-CONCENTRATION + DO 49 ISO=1,NISO + IF(DENSITB(ISO,I,IDF).EQ.0.0) GO TO 49 + WRITE(HMICRO,'(3A4)') (HISO((ISO-1)*3+IH),IH=1,3) + IF(HMICRO.EQ.'XE135') THEN + DEL(ISO)=XEN/(IRMAX-IRMIN+1)-DENSITB(ISO,I,IDF)*RXCOEF + 1 +DEL(ISO) + CX=DEL(ISO) + ELSE IF(HMICRO.EQ.'BMOD') THEN + ISOB=ISO +* +* ERROR IN CALCULATING BORON CONCENTRATION, +* BUT ADEQUATELY APPROXIMATED IF THE BORON REF EQ 0.0ppm +* +* DEL(ISO)=BOR/(IRMAX-IRMIN+1)- +* 1 DENSITB(ISO,I,IDF)*RXCOEF+DEL(ISO) + DEL(ISO)=-DENSITB(ISO,I,IDF)*RXCOEF+DEL(ISO) + CB=DEL(ISO) + ELSE IF(HMICRO.EQ.'CWAT') THEN + DEL(ISO)=(DC-1.0)*DENSITB(ISO,I,IDF) + D1C=DEL(ISO) + D2C=D1C*D1C + D2CB=D1C*D1C + ELSE IF(HMICRO.EQ.'MWAT') THEN + DMOD=DENSITB(ISO,I,IDF)/(IRMAX-IRMIN+1)+DMOD + DEL(ISO)=(DM-1.0)*DENSITB(ISO,I,IDF) + D1M=ALOG(DM) + D2M=1.0/(DM*DENSITB(ISO,I,IDF)) - 1.0/DENSITB(ISO,I,IDF) + D2MB=DEL(ISO) +* PURITY + PUR=(XI-XIR)*DM*DENSITB(ISO,I,IDF) + ELSE IF(HMICRO.EQ.'SM149') THEN + DEL(ISO)=SM/(IRMAX-IRMIN+1)-DENSITB(ISO,I,IDF)*RXCOEF + 1 +DEL(ISO) + CSM=DEL(ISO) + ELSE IF(HMICRO.EQ.'NP239') THEN + DEL(ISO)=RNP9/(IRMAX-IRMIN+1)-DENSITB(ISO,I,IDF)*RXCOEF + 1 +DEL(ISO) + CNP9=DEL(ISO) + ELSE IF(HMICRO.EQ.'FPC') THEN +* + CF= CF+DENSITB(ISO,I,IDF)*RXCOEF + DEL(ISO)=CPF1(II)*RXCOEF+DEL(ISO) + ELSE IF(HMICRO.EQ.'MACR') THEN + DEL(ISO)=DENSITB(ISO,I,IDF) + DO 271 IGR=1,NGRP + CHI(NMIX,IGR)=CHIB(IGR,I,IDF)*RXCOEF+CHI(NMIX,IGR) + 271 CONTINUE + ENDIF + 49 CONTINUE + 900 CONTINUE +* R.C. 24/05/2011 +* boron unit correction +* Bnat = 10.811 g/mol +* O16 = 15.9949 g/mol +* H1 = 1.0078 g/mol +* D2 = 2.0141 g/mol + CB=DMOD*BOR/10.811*((1.0078*(1-XI)+2.0141*XI)*2+15.9949)/3+CB + CB=CB*DM + DEL(ISOB)=CB +* R.C. +* CORRECT THE FUEL TEMPERATURE + CQ=REAL((CPF1(1)*XCOF(1)+CPF1(2)*XCOF(2)+CPF1(3)*XCOF(3)+CF)/CF) + RCQ=1.0-CQ + CQ2=CQ*CQ + RCQ2=1.0-CQ2 + IF(JTAB(1).EQ.0) THEN + CQ=0.0 + RCQ=0.0 + CQ2=0.0 + RCQ2=0.0 + CX=0.0 + CSM=0.0 + CNP9=0.0 + D1C=0.0 + D2C=0.0 + D2CB=0.0 + T1F=0.0 + T2F=0.0 + T1C=0.0 + T2C=0.0 + ENDIF +* +* RECOVER MACROSCOPIC X-SECTIONS + II=0 + DO 901 I = IRMIN,IRMAX + II=II+1 + RXCOEF=REAL(XCOF(II)) + CPF2=CPF1(II)*CPF1(II) + DO 98 ISO=1,NISO + DO 99 ITY=1,NTYP + IF(ISO.EQ.1) THEN + ZZ=1.0 + IF(ITY.EQ.1) THEN + VD2M=D2MB + VD2C=D2CB + ELSE IF(ITY.GE.5) THEN + VD2M=D2MB + VD2C=D2C + ELSE + VD2M=D2M + VD2C=D2C + ENDIF + ELSE + ZZ=0.0 + VD2M=D2M + VD2C=D2C + ENDIF + DO 100 IGR=1,NG2 + SMAC(IGR,ITY,1)=SMAC(IGR,ITY,1)+ + 1 SMACB(IGR,ITY,1,I,IDF)*RXCOEF*ZZ+ + 1 (XBORB(IGR,ITY,ISO,I,IDF)*RXCOEF*CB + + 1 XPURB(IGR,ITY,ISO,I,IDF)*RXCOEF*PUR*ZZ + + 1 XXENB(IGR,ITY,ISO,I,IDF)*RXCOEF*CX + + 1 XT1FB(IGR,ITY,ISO,I,IDF)*RXCOEF*T1F*CQ + + 1 XT1FB(IGR,ITY,ISO,1,IDF)*RXCOEF*T1F*RCQ + + 1 XT2FB(IGR,ITY,ISO,I,IDF)*RXCOEF*T2F*CQ2 + + 1 XT2FB(IGR,ITY,ISO,1,IDF)*RXCOEF*T2F*RCQ2 + + 1 XT1CB(IGR,ITY,ISO,I,IDF)*RXCOEF*T1C + + 1 XT2CB(IGR,ITY,ISO,I,IDF)*RXCOEF*T2C + + 1 XT1MB(IGR,ITY,ISO,I,IDF)*RXCOEF*T1M + + 1 XT2MB(IGR,ITY,ISO,I,IDF)*RXCOEF*T2M + + 1 XD1CB(IGR,ITY,ISO,I,IDF)*RXCOEF*D1C + + 1 XD2CB(IGR,ITY,ISO,I,IDF)*RXCOEF*VD2C + + 1 XD1MB(IGR,ITY,ISO,I,IDF)*RXCOEF*D1M + + 1 XD2MB(IGR,ITY,ISO,I,IDF)*RXCOEF*VD2M + + 1 XSMB(IGR,ITY,ISO,I,IDF)*RXCOEF*CSM + + 1 XNP9B(IGR,ITY,ISO,I,IDF)*RXCOEF*CNP9 + + 1 XMFDB(IGR,ITY,ISO,I,IDF)*RXCOEF*T1F*D1C + + 1 XMMDB(IGR,ITY,ISO,I,IDF)*RXCOEF*T1C*D1C + + 1 XPF1B(IGR,ITY,ISO,I,IDF)*RXCOEF*CPF1(II)*(1.-YF) + + 1 XPF2B(IGR,ITY,ISO,I,IDF)*RXCOEF*CPF2*(1.-YF)+ + 1 XPF1LB(IGR,ITY,ISO,I,IDF)*RXCOEF*CPF1(II)*YF + + 1 XPF2LB(IGR,ITY,ISO,I,IDF)*RXCOEF*CPF2*YF)*DEL(ISO) +* + 100 CONTINUE + 99 CONTINUE + 98 CONTINUE + 901 CONTINUE +* STORE SCATTERING + IL= 1 + ITY=5+2*IXYZ+IL + IGAR=0 + DO 130 JGR=1,NGRP + DO 120 IGR=IJJ(JGR),IJJ(JGR)-NJJ(JGR)+1,-1 + IGAR=IGAR+1 + SCAT(NMIX,IL,IGR,JGR)=SMAC(IGAR,ITY,1) +* TOTAL OR ABS + SMAC(IGR,2,1)=SMAC(IGR,2,1)+SCAT(NMIX,IL,IGR,JGR) + 120 CONTINUE + 130 CONTINUE +* STORE X-SECTIONS + DO 261 ITY=1,NTYP + DO 260 IGR=1,NGRP + SIGMA(NMIX,IGR,ITY)=SMAC(IGR,ITY,1) + 260 CONTINUE + 261 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(CPW2,CPW1,DEL,SMAC) + RETURN + END diff --git a/Donjon/src/AFMDRV.f b/Donjon/src/AFMDRV.f new file mode 100644 index 0000000..35b3ec7 --- /dev/null +++ b/Donjon/src/AFMDRV.f @@ -0,0 +1,1407 @@ +*DECK AFMDRV + SUBROUTINE AFMDRV (KENTRY,NENTRY,NPARM,ITYPE,NBURN,NGRP,NISO,ISC, + 1 MNPS,NL,ILEAK,NTYP,NBCH,NCCO,NCZO,NUT,CTITRE,LMCR,IXYZ,MMIX,MSFT, + 2 NISM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver to generate a macrolib using fbm +* +*Copyright: +* Copyright (C) 2002 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): +* M.T. Sissaoui +* +*Update(s): +* E. Varin 28/03/00, B. Dionne 26/02/01, +* A. Lagarrigue 30/07/05 +* A. Hebert 11/11/11 (remove table support) +* +*Parameters: input +* KENTRY address of the LCM objects +* NENTRY number of LCM objects +* NPARM number of parameters in L_MAP object +* ITYPE creation/modification flag for output macrolib +* NBURN number of burnup steps +* NGRP 1+number of energy groups +* NISO number of extracted isotopes +* ISC type of cross-section calculation (=1: time average; +* =2: instantaneous; =3: homogeneous) +* MNPS number of shifts + 2 +* NL number of legendre orders (=1 for isotropic scattering) +* ILEAK type of leakage +* NTYP +* NBCH number of bundles per channel +* NCCO number of channels in the core +* NCZO number of combustion zones +* NUT number of fuel types +* CTITRE character*72 title +* LMCR if true, create a macrolib containing only one non-zero +* mixture +* IXYZ type of diffusion coefficient (=0: isotropic; =1: directional) +* MMIX number of mixtures in the output macrolib +* MSFT second dimension of BSFT and PSFT +* NISM +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) KENTRY(NENTRY) + INTEGER NPARM,ITYPE,NBURN,NGRP,NISO,ISC,MNPS,NL,ILEAK,NTYP,NBCH, + 1 NCCO,NCZO,NUT,IXYZ,MMIX,MSFT,NISM + CHARACTER*72 CTITRE + LOGICAL LMCR +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXTR*12,CM*2,TEXT4*5,HMICRO*12,TEXTB*12,TEXTD*12 + TYPE(C_PTR) IPMACX,JPMAC,KPMAC,IPFBM,IPMAP,JPMAP,KPMAP + DOUBLE PRECISION DFLOTT,XCOF(3) + REAL STORE,RLOC(7) + LOGICAL LNOMP,LTAV,LXENON,LSAM,LNEP,LXEREF,LNEREF,LTFUEL,LDRAH, + 1 LTCOOL,LDCOOL,LPWF,LINI + CHARACTER PNAME*12,PARKEY*12 + INTEGER, DIMENSION(:), ALLOCATABLE :: IPOS,IJ,IZONE,IWORK,NJ, + 1 HISO,JTAB,INDEX,KTYP,ISFT,ITEXTR + INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: IJJ,NJJ + REAL, DIMENSION(:), ALLOCATABLE :: VOL,ENER,WORK,BURBG,BURED, + 1 POWER,PW,BRH,XSIGF,XSIGX,XFLUN,PDCOOL,PTCOOL,PTFUEL,SSCAT + REAL, DIMENSION(:,:), ALLOCATABLE :: XBURN,OVERV,SIGS,FLUX,CHI, + 1 DIFFX,DIFFY,DIFFZ,FLUAV,BFLUX,BSFT,PSFT + REAL, DIMENSION(:,:,:), ALLOCATABLE :: SIGMA,SIGAV,DENSITB,HXEN1, + 1 HXEN2,HSAM1,HSAM2,HNEP1,HNEP2,CPW1B,CPW2B,FLUXB,CHIB,OVERVB + REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: SCAT,SCATAV + REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: SMACB,XBORB,XXENB, + 1 XT1FB,XT2FB,XT1CB,XT2CB,XT1MB,XT2MB,XD1CB,XD2CB,XD1MB,XD2MB, + 2 XSMB,XNP9B,XMFDB,XMMDB,XPF1B,XPF2B,XPF1LB,XPF2LB,XPURB + DOUBLE PRECISION XDRCST,EVJ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(SIGMA(MMIX,NGRP,NTYP),IJJ(MMIX,NL,NGRP),VOL(MMIX), + 1 NJJ(MMIX,NL,NGRP),XBURN(NBURN,NUT),OVERV(MMIX,NGRP), + 2 SIGS(MMIX,NGRP),FLUX(MMIX,NGRP),CHI(MMIX,NGRP),ENER(NGRP+1), + 3 IPOS(MMIX),SCAT(MMIX,NL,NGRP,NGRP),DIFFX(MMIX,NGRP), + 4 DIFFY(MMIX,NGRP),DIFFZ(MMIX,NGRP),IJ(NGRP),WORK(MMIX*NGRP*NBURN), + 5 IZONE(NCCO),BURBG(MMIX),BURED(MMIX),POWER(MMIX), + 6 FLUAV(NBURN,NGRP),SIGAV(NBURN,NGRP,NTYP),IWORK(MMIX*NGRP), + 7 SCATAV(NBURN,NL,NGRP,NGRP),PW(MNPS),BRH(MNPS),NJ(NGRP), + 8 BFLUX(NGRP,MMIX),DENSITB(NISO,NBURN,NUT),HISO(3*NISM), + 9 HXEN1(2,NBURN,NUT),HXEN2(2,NBURN,NUT),HSAM1(2,NBURN,NUT), + 1 HSAM2(2,NBURN,NUT),HNEP1(2,NBURN,NUT),HNEP2(2,NBURN,NUT), + 2 CPW1B(2,NBURN,NUT),CPW2B(2,NBURN,NUT),FLUXB(NGRP,NBURN,NUT), + 3 JTAB(NISO),CHIB(NGRP,NBURN,NUT),OVERVB(NGRP,NBURN,NUT), + 4 INDEX(MMIX),KTYP(NUT),XSIGF(NGRP),XSIGX(NGRP),XFLUN(NGRP), + 5 BSFT(MMIX,MSFT),PSFT(MMIX,MSFT),ISFT(MMIX),PDCOOL(MMIX), + 6 PTCOOL(MMIX),PTFUEL(MMIX),ITEXTR(3*NUT)) + ALLOCATE(SMACB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 1 XBORB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 2 XXENB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 3 XT1FB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 4 XT2FB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 5 XT1CB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 6 XT2CB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 7 XT1MB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 8 XT2MB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 9 XD1CB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 1 XD2CB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 2 XD1MB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 3 XD2MB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 4 XSMB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 5 XNP9B(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 6 XMFDB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 7 XMMDB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 8 XPF1B(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 9 XPF2B(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 1 XPF1LB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 2 XPF2LB(NGRP*NGRP,NTYP,NISO,NBURN,NUT), + 3 XPURB(NGRP*NGRP,NTYP,NISO,NBURN,NUT)) +* + EVJ=XDRCST('eV','J') + IPMACX=KENTRY(1) + IPFBM=KENTRY(2) + IF( .NOT.LMCR )IPMAP=KENTRY(3) + CALL LCMLIB(IPMAP) +*---------------------------------------------------------------* +* SET THE DEFAULT OPTIONS + LNOMP=.FALSE. + LTAV=.FALSE. + LXENON=.FALSE. + LSAM=.FALSE. + LNEP=.FALSE. + LXEREF=.FALSE. + LNEREF=.FALSE. + LTFUEL=.FALSE. + LDRAH =.FALSE. + LTCOOL=.FALSE. + LDCOOL=.FALSE. + LPWF=.TRUE. + ILBFLU=0 + IMPX=0 + IXENO=0 + ISAMA=0 + INEPT=0 + IPROF2=0 + LINI=.FALSE. + ILEAK=0 + PWREF=0.0 + DMR=0.0 + DCR=0.0 + NTM=0 +* Set burnup interpolation method +* (default 0 for lagrangian interpolation) +* (1 for linear) + ILIN=0 +* SET HERMITE INTERPOLATION FOR TIME-AVERAGE CALCULATION + ITM=3 +*---------------------------------------------------------------* +* MX IS THE MAXIMUN MIXTURE NUMBER + MX=NBCH*NCCO +*---------------------------------------------------------------* +* CHECK THE PARAMETERS + IF(MX.EQ.0) CALL XABORT('AFMDRV: ZERO NUMBER OF MIXTURES.') + IF(NGRP.EQ.0) CALL XABORT('AFMDRV: ZERO NUMBER OF GROUPS.') + IF(NBURN.EQ.0) CALL XABORT('AFMDRV: ZERO NUMBER OF BURNUPS.') +*---------------------------------------------------------------* +* INITIALISATION OF THE MATRICES + NG2=NGRP*NGRP + DO 50 IGR=1,NG2 + DO 40 IN=1,NUT + DO 30 I=1,NBURN + DO 20 ITY=1,NTYP + DO 10 ISO=1,NISO + XBORB(IGR,ITY,ISO,I,IN)=0.0 + XPURB(IGR,ITY,ISO,I,IN)=0.0 + XXENB(IGR,ITY,ISO,I,IN)=0.0 + XT1FB(IGR,ITY,ISO,I,IN)=0.0 + XT2FB(IGR,ITY,ISO,I,IN)=0.0 + XT1CB(IGR,ITY,ISO,I,IN)=0.0 + XT2CB(IGR,ITY,ISO,I,IN)=0.0 + XT1MB(IGR,ITY,ISO,I,IN)=0.0 + XT2MB(IGR,ITY,ISO,I,IN)=0.0 + XD1CB(IGR,ITY,ISO,I,IN)=0.0 + XD2CB(IGR,ITY,ISO,I,IN)=0.0 + XD1MB(IGR,ITY,ISO,I,IN)=0.0 + XD2MB(IGR,ITY,ISO,I,IN)=0.0 + XSMB(IGR,ITY,ISO,I,IN)=0.0 + XNP9B(IGR,ITY,ISO,I,IN)=0.0 + XMFDB(IGR,ITY,ISO,I,IN)=0.0 + XMMDB(IGR,ITY,ISO,I,IN)=0.0 + XPF1B(IGR,ITY,ISO,I,IN)=0.0 + XPF2B(IGR,ITY,ISO,I,IN)=0.0 + XPF1LB(IGR,ITY,ISO,I,IN)=0.0 + XPF2LB(IGR,ITY,ISO,I,IN)=0.0 + SMACB(IGR,ITY,ISO,I,IN)=0.0 + 10 CONTINUE + 20 CONTINUE + 30 CONTINUE + 40 CONTINUE + 50 CONTINUE +* + DO 100 IGR=1,NGRP + DO 90 IMX=1,MX + DIFFX(IMX,IGR)=0.0 + DIFFY(IMX,IGR)=0.0 + DIFFZ(IMX,IGR)=0.0 + FLUX(IMX,IGR)=0.0 + OVERV(IMX,IGR)=0.0 + CHI(IMX,IGR)=0.0 + DO 70 IL=1,NL + DO 60 JGR=1,NGRP + SCAT(IMX,IL,IGR,JGR)=0.0 + 60 CONTINUE + IJJ(IMX,IL,IGR)=IGR + NJJ(IMX,IL,IGR)=1 + 70 CONTINUE + DO 80 ITYP=1,NTYP + SIGMA(IMX,IGR,ITYP)=0.0 + 80 CONTINUE + 90 CONTINUE + 100 CONTINUE +C + DO 150 IBR=1,NBURN + DO 140 IGR=1,NGRP + FLUAV(IBR,IGR)=0.0 + DO 110 ITYP=1,NTYP + SIGAV(IBR,IGR,ITYP)=0.0 + 110 CONTINUE + DO 130 JGR=1,NGRP + DO 120 IL=1,NL + SCATAV(IBR,IL,IGR,JGR)=0.0 + 120 CONTINUE + 130 CONTINUE + 140 CONTINUE + 150 CONTINUE +* INITIALISATION OF THE HISTORY COEFFICIENT + DO 180 IBR=1,NBURN + DO 170 IN=1,NUT + DO 160 I=1,2 + CPW1B(I,IBR,IN)=0.0 + CPW2B(I,IBR,IN)=0.0 + HXEN1(I,IBR,IN)=0.0 + HXEN2(I,IBR,IN)=0.0 + HSAM1(I,IBR,IN)=0.0 + HSAM2(I,IBR,IN)=0.0 + HNEP1(I,IBR,IN)=0.0 + HNEP2(I,IBR,IN)=0.0 + 160 CONTINUE + 170 CONTINUE + 180 CONTINUE +*---------------------------------------------------------------* +* READ AN OPTION KEY WORD + 185 CALL REDGET (INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFMDRV: CHARACTER DATA EXPECTED.') + IF(TEXT4.EQ.'EDIT') THEN +* READ THE PRINT INDEX. + CALL REDGET(INDIC,IMPX,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFMDRV: INTEGER DATA EXPECTED.') + ELSE IF(TEXT4.EQ.'REFT') THEN + DO 190 IN=1,NUT + CALL REDGET(INDIC,KTYP(IN),FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFMDRV: INTEGER DATA EXPECTED.') + CALL REDGET (INDIC,NITMA,FLOTT,TEXTR,DFLOTT) + IF(INDIC.NE.3) + 1 CALL XABORT('AFMDRV: CHARACTER DATA EXPECTED.') + READ(TEXTR,'(3A4)') (ITEXTR((IN-1)*3+I),I=1,3) + 190 CONTINUE + IF(LMCR .AND. KTYP(1).GT.MX) + + CALL XABORT('AFMDRV: INVALID INDEX NUMBER.') +C +* CHECK THE NAME OF THE DIRECTORY + WRITE(TEXTR,'(3A4)') (ITEXTR(I1),I1=1,3) + CALL LCMLEN(IPFBM,TEXTR,ILENGT,ITYLCM) + IF(ILENGT.EQ.0) THEN + CALL XABORT('AFMDRV: UNABLE TO FIND '//TEXTR//' .') + ENDIF +* RECOVER THE REFERENCE LOCAL PARAMETERS VALUES + CALL LCMSIX(IPFBM,TEXTR,1) + CALL LCMSIX(IPFBM,'INFO-NOMINA',1) + CALL LCMLEN(IPFBM,'NOMINALP',ILP,ITYLCM) + IF(ILP.GT.0) THEN + CALL LCMGET(IPFBM,'NOMINALP',RLOC) + CALL LCMGET(IPFBM,'NOMINALN',HISO) + DO 200 I=1,ILP + WRITE(HMICRO,'(3A4)') (HISO((I-1)*3+IH),IH=1,3) + IF(HMICRO.EQ.'PW') PWREF=RLOC(I) + IF(HMICRO.EQ.'TCOOL') TCR=RLOC(I) + IF(HMICRO.EQ.'TMOD') TMR=RLOC(I) + IF(HMICRO.EQ.'TFUEL') TFR=RLOC(I) + IF(HMICRO.EQ.'RHOC') DCR=RLOC(I) + IF(HMICRO.EQ.'RHOM') DMR=RLOC(I) + IF(HMICRO.EQ.'PUR') XIR=RLOC(I) + 200 CONTINUE + ENDIF + CALL LCMSIX(IPFBM,' ',2) + CALL LCMSIX(IPFBM,' ',2) +* REFERENCE PARAMETER VALUES + PFIX=PWREF + AW=15.9994 +2*(1-XIR)*1.0079 +2*XIR*2.014101 + PH=2*1.0079/AW + PD=2*2.014101/AW +* INITIALISATION OF PERTURBED PARAMETER + TF=TFR + TC=TCR + TM=TMR + DC=1.0 + DM=1.0 + XI=XIR + BOR=0.0 + SM=0.0 + RNP9=0.0 + XEN=0.0 +* + DO 210 IMX=1,MX + POWER(IMX)=PWREF + ISFT(IMX)=0 + BURBG(IMX)=0.0 + BURED(IMX)=0.0 + VOL(IMX)=0.0 + PDCOOL(IMX)=DCR + PTCOOL(IMX)=TCR + PTFUEL(IMX)=TFR + 210 CONTINUE +* RECOVER THE TEMERATURE AND DENSITY PROFILES + IF( (.NOT.LMCR).AND.(NPARM.GT.0) ) THEN + JPMAP=LCMGID(IPMAP,'PARAM') + DO 220 IPARM=1,NPARM + KPMAP=LCMGIL(JPMAP,IPARM) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + CALL LCMGTC(KPMAP,'PARKEY',12,PARKEY) + CALL LCMGET(KPMAP,'P-TYPE',IPTYPE) + IF(IPTYPE.EQ.1) THEN + CALL LCMGET(KPMAP,'P-VALUE',FLOTT) + ELSE IF(IPTYPE.EQ.2) THEN + CALL LCMLEN(KPMAP,'P-VALUE',NITMA,ITYLCM) + IF(NITMA.NE.MX) CALL XABORT('@AFMDRV: INVALID LENGTH FO' + 1 //'R P-VALUE.') + ENDIF + IF(PNAME.EQ.'T-COOL') THEN + WRITE(6,716) PNAME,PARKEY + IF(IPTYPE.EQ.1) THEN + PTCOOL(:MX)=FLOTT + ELSE IF(IPTYPE.EQ.2) THEN + CALL LCMGET(KPMAP,'P-VALUE',PTCOOL) + ENDIF + ELSE IF(PNAME.EQ.'D-COOL') THEN + WRITE(6,716) PNAME,PARKEY + IF(IPTYPE.EQ.1) THEN + PDCOOL(:MX)=FLOTT + ELSE IF(IPTYPE.EQ.2) THEN + CALL LCMGET(KPMAP,'P-VALUE',PDCOOL) + ENDIF + ELSE IF(PNAME.EQ.'T-FUEL') THEN + WRITE(6,716) PNAME,PARKEY + IF(IPTYPE.EQ.1) THEN + PTFUEL(:MX)=FLOTT + ELSE IF(IPTYPE.EQ.2) THEN + CALL LCMGET(KPMAP,'P-VALUE',PTFUEL) + ENDIF + ENDIF + 220 CONTINUE + ENDIF +* + PW(:MNPS)=PWREF + BRH(:MNPS)=0.0 + POWER(:MX)=PWREF +* + ELSE IF(TEXT4.EQ.'TFUEL') THEN + CALL REDGET (INDIC,NITMA,TFU,TEXT4,DFLOTT) + LTFUEL = .TRUE. + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') +* + ELSE IF(TEXT4.EQ.'TCOOL') THEN + CALL REDGET (INDIC,NITMA,TCU,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') + LTCOOL = .TRUE. + PTCOOL(:MX)=TCU +* + ELSE IF(TEXT4.EQ.'TMOD') THEN + CALL REDGET (INDIC,NITMA,TM,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') +* + ELSE IF(TEXT4.EQ.'RDCL') THEN + CALL REDGET (INDIC,NITMA,DCU,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') + LDCOOL = .TRUE. + PDCOOL(:MX)=DCU +* + ELSE IF(TEXT4.EQ.'RDMD') THEN + CALL REDGET (INDIC,NITMA,DM,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') + DM=DM/DMR +* + ELSE IF(TEXT4.EQ.'BORON') THEN + CALL REDGET (INDIC,NITMA,BOR,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') +* +* ppm eq 10**-6, NO CONSISTENCY WITH CFC CONCENTRATIONS +* NEED TO ADD A COEFFICIENT TO FIT THE DATA (BREF should be 0.0ppm) +* + BOR=BOR*1.E-6 +* + ELSE IF(TEXT4.EQ.'PUR') THEN + CALL REDGET (INDIC,NITMA,XI,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') + XI=XI*1.0E-02 +* + ELSE IF(TEXT4.EQ.'FIXP') THEN + CALL REDGET (INDIC,NITMA,PFIX,TEXT4,DFLOTT) + IF(INDIC.EQ.2) THEN + LNOMP=.TRUE. + ELSE IF(TEXT4.EQ.'INIT') THEN + LINI=.TRUE. + ELSE + CALL XABORT('AFMDRV: "INIT" or REAL DATA EXPECTED.') + ENDIF +* + ELSE IF(TEXT4.EQ.'IMET') THEN + CALL REDGET(INDIC,ITM,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFMDRV: INTEGER DATA EXPECTED.') +* + ELSE IF(TEXT4.EQ.'XENON') THEN + LXENON=.TRUE. + CALL REDGET (INDIC,NITMA,FXEN,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') +* + ELSE IF(TEXT4.EQ.'XEREF') THEN + LXEREF=.TRUE. +* + ELSE IF(TEXT4.EQ.'DRAH') THEN + LDRAH=.TRUE. +* + ELSE IF(TEXT4.EQ.'SAM') THEN + LSAM=.TRUE. + CALL REDGET (INDIC,NITMA,FSAM,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') +* + ELSE IF(TEXT4.EQ.'NEP') THEN + LNEP=.TRUE. + CALL REDGET (INDIC,NITMA,FNEP,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') +* + ELSE IF(TEXT4.EQ.'NREF') THEN + LNEREF=.TRUE. +* + ELSE IF(TEXT4.EQ.'BURN') THEN + IF(LMCR) THEN + CALL REDGET (INDIC,NITMA,FBUR,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('AFMDRV: REAL DATA EXPECTED.') + ELSE + CALL XABORT('AFMDRV: INVALID KEYWORD BURN.') + ENDIF +* + ELSE IF(TEXT4.EQ.'NPWF') THEN + LPWF=.FALSE. + ELSE IF(TEXT4.EQ.'PWF') THEN + LPWF=.TRUE. + ELSE IF(TEXT4.EQ.'BLIN') THEN + ILIN=1 + ELSE IF(TEXT4.EQ.';') THEN + GO TO 230 + ELSE + CALL XABORT('AFMDRV: '//TEXT4//' IS AN INVALID KEY-WORD.') + ENDIF + GO TO 185 +* EQUIVALENT MODERATOR DENSITY FOR THE REFERENCE PURITY + 230 DXI = XI - XIR +* pas de modification de densite selon la purete D2O +* DM=DM/(1.0+DXI*(PD-PH)) +*---------------------------------------------------------------* +* RECOVER NEUTRONICS PARAMETRES + WRITE(TEXTR,'(3A4)') (ITEXTR(I1),I1=1,3) + CALL LCMSIX(IPFBM,TEXTR,1) + CALL LCMGET(IPFBM,'VOLUME',VOL(1)) + CALL LCMGET(IPFBM,'ENERGY',ENER) + CALL LCMGET(IPFBM,'HITAB',HISO) + CALL LCMGET(IPFBM,'JTAB',JTAB) + CALL LCMSIX(IPFBM,' ',2) + DO 280 IN=1,NUT + WRITE(TEXTR,'(3A4)') (ITEXTR((IN-1)*3+I1),I1=1,3) + CALL LCMSIX(IPFBM,TEXTR,1) + CALL LCMGET(IPFBM,'BURNUP',XBURN(1,IN)) +* RECOVER THE EXISTING DATABASE. +* RECOVER THE HISTORY COEFFICIENTS + DO 270 I = 1,NBURN + WRITE(TEXTB,'(4HBURN,4X,I4)') I + CALL LCMSIX(IPFBM,TEXTB,1) +* + IF(JTAB(1).EQ.1) THEN + CALL LCMSIX(IPFBM,'HISTORY',1) + CALL LCMGET(IPFBM,'PHIL1',CPW1B(1,I,IN)) + CALL LCMGET(IPFBM,'PHIS1',CPW1B(2,I,IN)) + CALL LCMGET(IPFBM,'PHIL2',CPW2B(1,I,IN)) + CALL LCMGET(IPFBM,'PHIS2',CPW2B(2,I,IN)) + CALL LCMLEN(IPFBM,'PHISX1',IHISTO,ITYLCM) + IF(IHISTO.GT.0) THEN + CALL LCMGET(IPFBM,'PHILX1',HXEN1(1,I,IN)) + CALL LCMGET(IPFBM,'PHISX1',HXEN1(2,I,IN)) + CALL LCMGET(IPFBM,'PHILX2',HXEN2(1,I,IN)) + CALL LCMGET(IPFBM,'PHISX2',HXEN2(2,I,IN)) +C + CALL LCMGET(IPFBM,'PHILS1',HSAM1(1,I,IN)) + CALL LCMGET(IPFBM,'PHISS1',HSAM1(2,I,IN)) + CALL LCMGET(IPFBM,'PHILS2',HSAM2(1,I,IN)) + CALL LCMGET(IPFBM,'PHISS2',HSAM2(2,I,IN)) +C + CALL LCMGET(IPFBM,'PHILN1',HNEP1(1,I,IN)) + CALL LCMGET(IPFBM,'PHISN1',HNEP1(2,I,IN)) + CALL LCMGET(IPFBM,'PHILN2',HNEP2(1,I,IN)) + CALL LCMGET(IPFBM,'PHISN2',HNEP2(2,I,IN)) + ENDIF + CALL LCMSIX(IPFBM,' ',2) + ENDIF +* + CALL LCMGET(IPFBM,'FLUX-INTG',FLUXB(1,I,IN)) + CALL LCMGET(IPFBM,'OVERV',OVERVB(1,I,IN)) + CALL LCMGET(IPFBM,'ISOTOPESDENS',DENSITB(1,I,IN)) +* COMPUTE DELTA-CONCENTRATION + DO 250 ISO=1,NISO + WRITE(HMICRO,'(3A4)') (HISO((ISO-1)*3+IH),IH=1,3) + CALL LCMSIX(IPFBM,HMICRO,1) + IF(JTAB(1).EQ.1) THEN + IF((HMICRO.EQ.'XE135').OR.(HMICRO.EQ.'Xe135')) IXENO=ISO + IF((HMICRO.EQ.'SM149').OR.(HMICRO.EQ.'Sm149')) ISAMA=ISO + IF((HMICRO.EQ.'NP239').OR.(HMICRO.EQ.'Np239')) INEPT=ISO + IF(HMICRO.EQ.'MACR ') + 1 CALL LCMGET(IPFBM,'CHI',CHIB(1,I,IN)) + ENDIF +* RECOVER MACROSCOPIC X-SECTIONS + NTM=4+2*IXYZ + DO 240 ITY=1,NTM + IF(ITY.EQ.1) THEN + IF(IXYZ.EQ.0) THEN + TEXTD = 'STRD' + ELSE IF(IXYZ.EQ.1) THEN + TEXTD = 'STRD X' + ENDIF + ENDIF + IF(ITY.EQ.2) TEXTD = 'ABS' + IF(ITY.EQ.3) TEXTD = 'NUSIGF' + IF(ITY.EQ.4) TEXTD = 'H-FACTORS' + IF(ITY.EQ.5) TEXTD = 'STRD Y' + IF(ITY.EQ.6) TEXTD = 'STRD Z' + CALL LCMLEN(IPFBM,TEXTD,ILENG,ITYXSM) +* + IF(ILENG.NE.0) THEN + CALL LCMSIX(IPFBM,TEXTD,1) + CALL LCMGET(IPFBM,'REF',SMACB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'BOR',XBORB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'PUR',XPURB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T1M',XT1MB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T2M',XT2MB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D1M',XD1MB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D2M',XD2MB(1,ITY,ISO,I,IN)) + IF(JTAB(1).EQ.1) THEN + CALL LCMLEN(IPFBM,'XEN',ILENGX,ITYXSM) + IF(ILENGX.GT.0) + + CALL LCMGET(IPFBM,'XEN',XXENB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T1F',XT1FB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T2F',XT2FB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T1C',XT1CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T2C',XT2CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D1C',XD1CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D2C',XD2CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'SM149',XSMB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'NP239',XNP9B(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'MIXFD',XMFDB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'MIXMD',XMMDB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCH1',XPF1B(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCL1',XPF1LB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCH2',XPF2B(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCL2',XPF2LB(1,ITY,ISO,I,IN)) + ENDIF +* + CALL LCMSIX(IPFBM,' ',2) + ENDIF + 240 CONTINUE +* + CALL LCMLEN(IPFBM,'NFTOT',ILNF,ITYXSM) + IF(ILNF.NE.0) THEN + CALL LCMGET(IPFBM,'NFTOT',SMACB(1,NTM+1,ISO,I,IN)) + ENDIF + CALL LCMSIX(IPFBM,' ',2) + 250 CONTINUE +* SCATTERING CROSS-SECTIONS + DO 260 ISO=1,NISO + WRITE(HMICRO,'(3A4)') (HISO((ISO-1)*3+IH),IH=1,3) + CALL LCMLEN(IPFBM,HMICRO,ILENG,ITYLCM) + IF(ILENG.EQ.0) GO TO 230 + CALL LCMSIX(IPFBM,HMICRO,1) +C DO 150 IL=1,NL + IL=1 + ITY=NTM+1+IL + LTST=0 + WRITE (CM,'(I2.2)') IL-1 + CALL LCMLEN(IPFBM,'SCAT'//CM,ILENG,ITYXSM) + IF(ILENG.NE.0) THEN + LTST=1 + ELSE + WRITE (CM,'(I2)') IL-1 + CALL LCMLEN(IPFBM,'SCAT'//CM,ILENG,ITYXSM) + IF(ILENG.NE.0) THEN + LTST=2 + ENDIF + ENDIF + IF (LTST.GE.1) THEN + CALL LCMSIX(IPFBM,'SCAT'//CM,1) + IF(HMICRO.EQ.'MACR') THEN + IF (LTST.EQ.1) THEN + CALL LCMGET(IPFBM,'NJJS',NJ) + CALL LCMGET(IPFBM,'IJJS',IJ) + ELSE + CALL LCMGET(IPFBM,'NJJ',NJ) + CALL LCMGET(IPFBM,'IJJ',IJ) + ENDIF + ENDIF + CALL LCMGET(IPFBM,'REF',SMACB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'BOR',XBORB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'PUR',XPURB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T1M',XT1MB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T2M',XT2MB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D1M',XD1MB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D2M',XD2MB(1,ITY,ISO,I,IN)) + IF(JTAB(1).EQ.1) THEN + CALL LCMLEN(IPFBM,'XEN',ILENG,ITYXSM) + IF(ILENG.GT.0) THEN + CALL LCMGET(IPFBM,'XEN',XXENB(1,ITY,ISO,I,IN)) + ENDIF + CALL LCMGET(IPFBM,'T1F',XT1FB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T2F',XT2FB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T1C',XT1CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'T2C',XT2CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D1C',XD1CB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'D2C',XD2CB(1,ITY,ISO,I,IN)) +* + CALL LCMGET(IPFBM,'SM149',XSMB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'NP239',XNP9B(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'MIXFD',XMFDB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'MIXMD',XMMDB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCH1',XPF1B(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCL1',XPF1LB(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCH2',XPF2B(1,ITY,ISO,I,IN)) + CALL LCMGET(IPFBM,'FPCL2',XPF2LB(1,ITY,ISO,I,IN)) + ENDIF +* + CALL LCMSIX(IPFBM,' ',2) + ENDIF + CALL LCMSIX(IPFBM,' ',2) + 260 CONTINUE +C + CALL LCMSIX(IPFBM,' ',2) + 270 CONTINUE + CALL LCMSIX(IPFBM,' ',2) + 280 CONTINUE + IF(JTAB(1).EQ.1) THEN + IF(IXENO.EQ.0) CALL XABORT('NO XE135 FOUND ') + IF(ISAMA.EQ.0) CALL XABORT('NO SM149 FOUND ') + IF(INEPT.EQ.0) CALL XABORT('NO NP239 FOUND ') + ENDIF +* END OF THE RECOVERING PROCESS +*---------------------------------------------------------------* +* ISC INDICATE THE TYPE OF CROSS-SECTION CALCULATION +* ISC=1 ; TIME AVERAGE CALCULATION +* ISC=2 ; INSTANTANEOUS CALCULATION +* ISC=3 ; HOMOGENEOUS CALCULATION +*---------------------------------------------------------------* +* + IF(ISC.EQ.0) THEN + CALL XABORT('AFMDRV: TIMAV/INSTANT BURNUP TREATMENT NOT SET') + ELSE IF(ISC.EQ.1) THEN +* Time-averaged calculation + WRITE(6,699) + MMIX=NBCH*NCCO + LTAV=.TRUE. + CALL LCMGET(IPMAP,'FLMIX',INDEX) + CALL LCMGET(IPMAP,'BURN-BEG',BURBG) + CALL LCMGET(IPMAP,'BURN-END',BURED) + CALL LCMLEN(IPMAP,'BUND-PW',ILPW,ITYLCM) + IF((ILPW.NE.0).AND.LPWF) THEN + IF(IMPX.GE.1) WRITE(6,702) + IF(.NOT.LINI) THEN + CALL LCMGET(IPMAP,'BUND-PW',POWER) + ELSE + CALL LCMLEN(IPMAP,'BUND-PW-INI',ILPW,ITYLCM) + IF(ILPW.NE.0) THEN + CALL LCMGET(IPMAP,'BUND-PW-INI',POWER) + ELSE + CALL XABORT('AFMDRV: NO INITIAL POWER IN L_MAP') + ENDIF + ENDIF + ELSE + POWER(:MMIX)=PWREF + ENDIF + CALL LCMLEN(IPMAP,'FLUX-AV',ILBFLU,ITYLCM) + IF(ILBFLU.NE.0) THEN + IF(IMPX.GE.1) WRITE(6,703) + CALL LCMGET(IPMAP,'FLUX-AV',WORK) + DO 300 IGR=1,NGRP + DO 290 IBF=1,MMIX + IIBF=MMIX*(IGR-1)+IBF + BFLUX(IGR,IBF)=WORK(IIBF) + 290 CONTINUE + 300 CONTINUE + ENDIF + ELSE IF(ISC.EQ.2) THEN +* Instantaneous calculation + IF(LMCR) THEN + MMIX=NBCH*NCCO + POWER(:MMIX)=PWREF + ELSE + WRITE(6,701) + MMIX=NBCH*NCCO + CALL LCMGET(IPMAP,'FLMIX',INDEX) + CALL LCMGET(IPMAP,'BURN-INST',BURBG) + CALL LCMLEN(IPMAP,'BUND-PW',ILPW,ITYLCM) + IF((ILPW.NE.0).AND.LPWF) THEN + IF(IMPX.GE.1) WRITE(6,702) + IF(.NOT.LINI) THEN + CALL LCMGET(IPMAP,'BUND-PW',POWER) + ELSE + CALL LCMLEN(IPMAP,'BUND-PW-INI',ILPW,ITYLCM) + IF(ILPW.NE.0) THEN + CALL LCMGET(IPMAP,'BUND-PW-INI',POWER) + ELSE + CALL XABORT('AFMDRV: NO INITIAL POWER IN L_MAP') + ENDIF + ENDIF + ELSE + POWER(:MMIX)=PWREF + ENDIF + CALL LCMLEN(IPMAP,'FLUX-AV',ILBFLU,ITYLCM) + IF(ILBFLU.NE.0) THEN + IF(IMPX.GE.1) WRITE(6,703) + CALL LCMGET(IPMAP,'FLUX-AV',WORK) + DO 320 IGR=1,NGRP + DO 310 IBF=1,MMIX + IIBF=MMIX*(IGR-1)+IBF + BFLUX(IGR,IBF)=WORK(IIBF) + 310 CONTINUE + 320 CONTINUE + ENDIF +* RECOVER THE SHIFT INFORMATION + IF(MNPS.GT.2) THEN + IF(IMPX.GE.1) WRITE(6,704) + CALL LCMGET(IPMAP,'ISHIFT',ISFT) + DO 330 IS=1,MNPS-2 + WRITE (CM,'(I2)') IS + CALL LCMGET(IPMAP,'BSHIFT'//CM,BSFT(1,IS)) + CALL LCMGET(IPMAP,'PSHIFT'//CM,PSFT(1,IS)) + 330 CONTINUE + ENDIF + ENDIF + ELSE IF(ISC.EQ.3) THEN +* Homogeneous calculation + MMIX=NCZO + LTAV=.TRUE. + CALL LCMGET(IPMAP,'B-ZONE',IZONE) + CALL LCMGET(IPMAP,'FLMIX',INDEX) + CALL LCMGET(IPMAP,'BURN-AVG',BURED) + ENDIF +*---------------------------------------------------------------* + IF(IMPX.GE.1) THEN + IF(LNOMP) WRITE(6,705) PFIX + IF(LXENON) WRITE(6,706) FXEN + IF(LSAM) WRITE(6,719) FSAM + IF(LNEP) WRITE(6,711) FNEP + IF(LXEREF) WRITE(6,712) + IF(LNEREF) WRITE(6,713) + IF(LTFUEL) WRITE(6,714) TFU + IF(IHISTO.GT.0.AND.LDRAH) WRITE(6,715) + IF(LTCOOL) WRITE(6,717) TCU + IF(LDCOOL) WRITE(6,718) DCU + ENDIF +*---------------------------------------------------------------* +* MIXTURE SHIFT + IF(LMCR) THEN + MXSH=MMIX + VOL(:MMIX)=VOL(1) + ELSE + MXSH=1 + ENDIF +*---------------------------------------------------------------* +* LOOP OVER THE MIXTURES + DO 540 NMIX=MXSH,MMIX + TC=PTCOOL(NMIX) + DC=PDCOOL(NMIX)/DCR + IF(LMCR) THEN + NPS=2 + IDF=1 + ELSE + VOL(NMIX)=VOL(1) + NPS=ISFT(NMIX)+2 + KDF=0 + DO 340 IN=1,NUT + IF(INDEX(NMIX).EQ.KTYP(IN)) THEN + IDF=IN + KDF=1 + ENDIF + 340 CONTINUE + IF(KDF.EQ.0) CALL XABORT('AFMDRV: WRONG NUMBER OF INDEX') + ENDIF +* IF TIME AVERAGE CALCULATION: +* EVALUATION OF THE BURNUPS STEPS EMBEDED IN THE INTEGRATION + IF(LTAV) THEN + XBMIN=BURBG(NMIX) + XBMAX=BURED(NMIX) +* TIME AVERAGE BURNUP LOCALISATION + CALL AFMLOC(NBURN,NTP,XBMAX,XBMIN,XBURN(1,IDF), + 1 IMAX,IMIN,XCOF,ILIN) +* LAGRANGE METHOD (TIME-AVERAGE) + IMINR=IMIN + IMAXR=ABS(IMAX) +* SPLINE OR HERMITE METHOD (TIME-AVERAGE) + IF(ITM.EQ.2.OR.ITM.EQ.3) THEN + IMINR=1 + IMAXR=NBURN + ENDIF +* + ELSE + IMINR=1 + IMAXR=1 + ENDIF +C + DO 450 JR=IMINR,IMAXR + IF(LTAV) THEN + IRAV=JR + NPS=2 + ELSE + IF(NPS.GT.2) THEN + DO 350 K=2,NPS-1 + IS=K-1 + BRH(K)=BSFT(NMIX,IS) + 350 CONTINUE + ENDIF + IF(LMCR) THEN + BRH(NPS)=FBUR + IF(JTAB(1).EQ.0) BRH(NPS)=0.0 + ELSE + BRH(NPS)=BURBG(NMIX) + ENDIF + ENDIF +* + IF(LNOMP) THEN + DO 360 K=2,NPS + PW(K)=PFIX + 360 CONTINUE + ELSE + IF(NPS.GT.2) THEN + DO 370 K=2,NPS-1 + IS=K-1 + PW(K)=PSFT(NMIX,IS) + 370 CONTINUE + ENDIF + PW(NPS)=POWER(NMIX) + ENDIF +* D. Rozon 'Introduction a la Cinetique des Reacteur Nucleaires' +* Edition E.P., 1992. (p.217) or 1998 (p.185) +* PW is assumed to be in kW. + IF(IPROF2.GT.0) THEN + TF = PTFUEL(NMIX) + ELSE + TF= TC + 0.476*PW(NPS) + 2.267*PW(NPS)*PW(NPS)*1.0E-04 + ENDIF +C INITIAL CONCENTRATIONS + ZXREF=0.0 + SM=0.0 + ZRNP9=0.0 +* IF FUEL + IF(JTAB(1).EQ.1) THEN +* BURNUP LOCALISATION FOR XENON AND FISSION X-SECTION INTERPOLATION + IF(LTAV) THEN + XIFL=XBURN(IRAV,IDF) + IMAXX=IRAV + IMINX=IRAV + XCOF(1)=1.0D0 + XCOF(2)=0.0D0 + XCOF(3)=0.0D0 + ELSE + XIFL=BRH(NPS) + CALL AFMLOC(NBURN,NTP,BRH(NPS),BRH(NPS),XBURN(1,IDF), + 1 IMAXX,IMINX,XCOF,ILIN) + ENDIF +* + DO 380 IGR = 1,NGRP + XSIGX(IGR)=0.0 + XFLUN(IGR)=0.0 + XSIGF(IGR)=0.0 + 380 CONTINUE +* INTERPOLATION OF THE CONCENTRATION +* + IIX=0 + DO 395 I = IMINX,IMAXX + IIX=IIX+1 + RXCOF=REAL(XCOF(IIX)) + ZXREF=DENSITB(IXENO,I,IDF)*RXCOF +ZXREF + XEN=ZXREF + SM=DENSITB(ISAMA,I,IDF)*RXCOF +SM + ZRNP9=DENSITB(INEPT,I,IDF)*RXCOF +ZRNP9 + RNP9=ZRNP9 +* + DO 390 IGR=1,NGRP + XSIGX(IGR)=SMACB(IGR,2,IXENO,I,IDF)*RXCOF + 1 + XSIGX(IGR) + XFLUN(IGR)=FLUXB(IGR,I,IDF)*RXCOF + XFLUN(IGR) + XSIGF(IGR)=SMACB(IGR,5,1,I,IDF)*RXCOF + XSIGF(IGR) + 390 CONTINUE + 395 CONTINUE + IF(LDRAH.AND.IHISTO.GT.0) THEN + IF(PW(NPS).GT.PWREF) THEN + XPW=ALOG(PW(NPS)/PW(1)) + XPWM=1.0/PW(NPS)-1.0/PW(1) + IFH=1 + ELSE + XPW=PW(NPS)-PW(1) + XPWM=(PW(NPS)-PW(1))**2 + IFH=2 + ENDIF +C + XEN =ZXREF + RNP9 =ZRNP9 + IIX=0 + DO 400 I = IMINX,IMAXX + IIX=IIX+1 + RXCOF=REAL(XCOF(IIX)) +* COMPUTE XENON-SAMRIUM-NEPTUNIUM CONCENTRATION USING DRAGON + XEN =XEN +HXEN1(IFH,I,IDF)*XPW*RXCOF+ + 1 HXEN2(IFH,I,IDF)*XPWM*RXCOF + SM =SM +HSAM1(IFH,I,IDF)*XPW*RXCOF+ + 1 HSAM2(IFH,I,IDF)*XPWM*RXCOF + RNP9 =RNP9 +HNEP1(IFH,I,IDF)*XPW*RXCOF+ + 1 HNEP2(IFH,I,IDF)*XPWM*RXCOF + 400 CONTINUE + ELSE IF(ILBFLU.NE.0.AND.XIFL.NE.0.0) THEN +* COMPUTE THE XENON AND NEPTUNIUM CONCENTRATIONS + CALL AFMXNC(NGRP,XSIGX,XSIGF,BFLUX(1,NMIX), + 1 XEN,RNP9,XFLUN) + ENDIF +* COMPUTE THE XENON AND NEPTUNIUM CONCENTRATIONS + IF(LXENON) XEN=FXEN + IF(LSAM) SM=FSAM + IF(LNEP) RNP9=FNEP + IF(LXEREF) XEN=ZXREF + IF(LNEREF) RNP9=ZRNP9 + IF(LTFUEL) THEN +! fuel temperature as input + TF=TFU +! reference fuel temperature + ELSEIF(LMCR) THEN + TF=TFR + ENDIF + ENDIF +*---------------------------------------------------------------* +* XSECTION CALCULATION +*---------------------------------------------------------------* + CALL AFMCPT(KENTRY,NBURN,NGRP,NISO, + 1 NL,IMPX,SMACB,XBORB,XPURB,XXENB,XT1FB,XT2FB,XT1CB, + 1 XT2CB,XT1MB,XT2MB,XD1CB,XD2CB,XD1MB,XD2MB, + 1 XSMB,XNP9B,XMFDB,XMMDB,XPF1B,XPF2B,XPF1LB,XPF2LB, + 1 DENSITB,CPW1B,CPW2B,FLUXB,OVERVB,CHIB, + 1 IJ,NJ,HISO,CTITRE, + 1 NMIX,SIGMA,NTYP,TF,TC,TM,DC,DM,BOR,XEN,SM,RNP9,XI, + 1 TFR,TCR,TMR,XIR,OVERV,FLUX,CHI,SCAT,MX,NPS,PW,BRH, + 1 XBURN,LTAV,IRAV,IDF,JTAB,IXYZ,ILIN) +*---------------------------------------------------------------* +* + DO 420 IGR=1,NGRP + FLUAV(JR,IGR)=FLUX(NMIX,IGR) + DO 410 ITY=1,NTM+1 + SIGAV(JR,IGR,ITY)=SIGMA(NMIX,IGR,ITY) + 410 CONTINUE + 420 CONTINUE + IL =1 + DO 440 IGR=1,NGRP + DO 430 JGR=1,NGRP + SCATAV(JR,IL,JGR,IGR)=SCAT(NMIX,IL,JGR,IGR) + 430 CONTINUE + 440 CONTINUE + 450 CONTINUE + IF(LTAV) THEN +* COMPUTE TIME AVERAGED X-SECTIONS + DO 470 IGR=1,NGRP + CALL AFMTAV(NBURN,ITM,XBMAX,XBMIN,FLUAV(1,IGR),IMIN,IMAX, + 1 XBURN,FLUX(NMIX,IGR)) + DO 460 ITY=1,NTM+1 + CALL AFMTAV(NBURN,ITM,XBMAX,XBMIN,SIGAV(1,IGR,ITY),IMIN, + 1 IMAX,XBURN,SIGMA(NMIX,IGR,ITY)) + 460 CONTINUE + 470 CONTINUE +* + DO 490 IGR=1,NGRP + DO 480 JGR=1,NGRP + IL=1 + CALL AFMTAV(NBURN,ITM,XBMAX,XBMIN,SCATAV(1,IL,IGR,JGR), + 1 IMIN,IMAX,XBURN,SCAT(NMIX,IL,IGR,JGR)) + 480 CONTINUE + 490 CONTINUE +* + ENDIF +* COMPUTE DIRECTIONAL DIFFUSION COEFFICIENTS FROM STRD +* X-SECTIONS. + IF(IXYZ.EQ.0) THEN + DO 500 IGR=1,NGRP + DIFFX(NMIX,IGR)=1.0/(3.0*SIGMA(NMIX,IGR,1)) + 500 CONTINUE + ILEAK=1 + ELSE IF(IXYZ.EQ.1) THEN + DO 510 IGR=1,NGRP + DIFFX(NMIX,IGR)=1.0/(3.0*SIGMA(NMIX,IGR,1)) + DIFFY(NMIX,IGR)=1.0/(3.0*SIGMA(NMIX,IGR,5)) + DIFFZ(NMIX,IGR)=1.0/(3.0*SIGMA(NMIX,IGR,6)) + ILEAK=2 + 510 CONTINUE + ENDIF +* + IL=1 + DO 530 IGR=1,NGRP + NJJ(NMIX,IL,IGR)=NJ(IGR) + IJJ(NMIX,IL,IGR)=IJ(IGR) + IF(LMCR) THEN + DO 520 NI=1,MMIX + NJJ(NI,IL,IGR)=NJ(IGR) + IJJ(NI,IL,IGR)=IJ(IGR) + 520 CONTINUE + ENDIF + 530 CONTINUE +* MIX LOOP + 540 CONTINUE +* + IF(LTAV) THEN + IF(IMPX.GE.1.AND.ITM.EQ.1) WRITE(6,707) + IF(IMPX.GE.1.AND.ITM.EQ.2) WRITE(6,708) + IF(IMPX.GE.1.AND.ITM.EQ.3) WRITE(6,709) + ENDIF +*---------------------------------------------------------------* +* DECOMPRESS BURN ZONE FOR ALL THE BUNDLES + IF(ISC.EQ.3) THEN + MMIX=NBCH*NCCO + DO 870 IGR=1,NGRP + DO 550 IZ=1,NCZO + WORK(IZ)=DIFFX(IZ,IGR) + 550 CONTINUE + DO 570 IC=1,NCCO + DO 560 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + DIFFX(ICB,IGR)=WORK(IZONE(IC)) + 560 CONTINUE + 570 CONTINUE +* + IF(ILEAK.EQ.2) THEN + DO 580 IZ=1,NCZO + WORK(IZ)=DIFFY(IZ,IGR) + 580 CONTINUE + DO 600 IC=1,NCCO + DO 590 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + DIFFY(ICB,IGR)=WORK(IZONE(IC)) + 590 CONTINUE + 600 CONTINUE +* + DO 610 IZ=1,NCZO + WORK(IZ)=DIFFZ(IZ,IGR) + 610 CONTINUE + DO 630 IC=1,NCCO + DO 620 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + DIFFZ(ICB,IGR)=WORK(IZONE(IC)) + 620 CONTINUE + 630 CONTINUE + ENDIF +* + DO 670 ITY=2,NTM+1 + DO 640 IZ=1,NCZO + WORK(IZ)=SIGMA(IZ,IGR,ITY) + 640 CONTINUE + DO 660 IC=1,NCCO + DO 650 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + SIGMA(ICB,IGR,ITY)=WORK(IZONE(IC)) + 650 CONTINUE + 660 CONTINUE + 670 CONTINUE +* + DO 680 IZ=1,NCZO + WORK(IZ)=FLUX(IZ,IGR) + 680 CONTINUE + DO 700 IC=1,NCCO + DO 690 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + FLUX(ICB,IGR)=WORK(IZONE(IC)) + 690 CONTINUE + 700 CONTINUE +* + DO 710 IZ=1,NCZO + WORK(IZ)=OVERV(IZ,IGR) + 710 CONTINUE + DO 730 IC=1,NCCO + DO 720 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + OVERV(ICB,IGR)=WORK(IZONE(IC)) + 720 CONTINUE + 730 CONTINUE +* + DO 740 IZ=1,NCZO + WORK(IZ)=CHI(IZ,IGR) + 740 CONTINUE + DO 760 IC=1,NCCO + DO 750 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + CHI(ICB,IGR)=WORK(IZONE(IC)) + 750 CONTINUE + 760 CONTINUE +* + IL=1 + DO 800 JGR=1,NGRP + DO 770 IZ=1,NCZO + WORK(IZ)=SCAT(IZ,IL,IGR,JGR) + 770 CONTINUE + DO 790 IC=1,NCCO + DO 780 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + SCAT(ICB,IL,IGR,JGR)=WORK(IZONE(IC)) + 780 CONTINUE + 790 CONTINUE + 800 CONTINUE +* + DO 810 IZ=1,NCZO + IWORK(IZ)=NJJ(IZ,IL,IGR) + 810 CONTINUE + DO 830 IC=1,NCCO + DO 820 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + NJJ(ICB,IL,IGR)=IWORK(IZONE(IC)) + 820 CONTINUE + 830 CONTINUE +* + DO 840 IZ=1,NCZO + IWORK(IZ)=IJJ(IZ,IL,IGR) + 840 CONTINUE + DO 860 IC=1,NCCO + DO 850 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + IJJ(ICB,IL,IGR)=IWORK(IZONE(IC)) + 850 CONTINUE + 860 CONTINUE +* + 870 CONTINUE +* + DO 880 IZ=1,NCZO + WORK(IZ)=VOL(IZ) + 880 CONTINUE + DO 900 IC=1,NCCO + DO 890 IB=1,NBCH + ICB=NBCH*(IC-1)+IB + VOL(ICB)=WORK(IZONE(IC)) + 890 CONTINUE + 900 CONTINUE +* + ENDIF +*--- +* STORE MACROLIB INFORMATIONS +*--- + IF(ITYPE.EQ.0)THEN + CALL LCMPUT(IPMACX,'VOLUME',MMIX,2,VOL) + CALL LCMPUT(IPMACX,'ENERGY',NGRP+1,2,ENER) + ENDIF +* + IF(LMCR) THEN + STORE=VOL(MMIX) + VOL(MMIX)= 0.0 +* MACROLIB EN MODIFICATION + IF(ITYPE.NE.0) THEN + CALL LCMGET(IPMACX,'VOLUME',VOL) + ENDIF + VOL(KTYP(1)) = STORE + CALL LCMPUT(IPMACX,'VOLUME',MMIX,2,VOL) + JPMAC=LCMLID(IPMACX,'GROUP',NGRP) + DO 950 JGR=1,NGRP + KPMAC=LCMDIL(JPMAC,JGR) + STORE=SIGMA(MMIX,JGR,2) + SIGMA(MMIX,JGR,2) = 0.0 +* MACROLIB EN MODIFICATION + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'NTOT0',SIGMA(1,JGR,2)) + ENDIF + SIGMA(KTYP(1),JGR,2) = STORE +* + STORE=OVERV(MMIX,JGR) + OVERV(MMIX,JGR) = 0.0 +* MACROLIB EN MODIFICATION + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'OVERV',OVERV(1,JGR)) + ENDIF + OVERV(KTYP(1),JGR) = STORE +* + STORE=DIFFX(MMIX,JGR) + DIFFX(MMIX,JGR) = 0.0 +* MACROLIB EN MODIFICATION + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'DIFFX',DIFFX(1,JGR)) + ENDIF + DIFFX(KTYP(1),JGR) = STORE +* + IF(ILEAK.EQ.2) THEN + STORE=DIFFY(MMIX,JGR) + DIFFY(MMIX,JGR) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'DIFFY',DIFFY(1,JGR)) + ENDIF + DIFFY(KTYP(1),JGR) = STORE +* + STORE=DIFFZ(MMIX,JGR) + DIFFZ(MMIX,JGR) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'DIFFZ',DIFFZ(1,JGR)) + ENDIF + DIFFZ(KTYP(1),JGR) = STORE + ENDIF +* + STORE = FLUX(MMIX,JGR) + FLUX(MMIX,JGR) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'FLUX-INTG',FLUX(1,JGR)) + ENDIF + FLUX(KTYP(1),JGR) = STORE +* + IF(JTAB(1).EQ.1 .OR. ITYPE.NE.0) THEN + STORE = CHI(MMIX,JGR) + CHI(MMIX,JGR) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'CHI',CHI(1,JGR)) + ENDIF + CHI(KTYP(1),JGR) = STORE +* + STORE=SIGMA(MMIX,JGR,3) + SIGMA(MMIX,JGR,3) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'NUSIGF',SIGMA(1,JGR,3)) + ENDIF + SIGMA(KTYP(1),JGR,3) = STORE +* + STORE=SIGMA(MMIX,JGR,5) + SIGMA(MMIX,JGR,5) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'NFTOT',SIGMA(1,JGR,5)) + ENDIF + SIGMA(KTYP(1),JGR,5) = STORE +* + STORE=SIGMA(MMIX,JGR,4) + SIGMA(MMIX,JGR,4) = 0.0 + IF(ITYPE.NE.0) THEN + CALL LCMGET(KPMAC,'H-FACTOR',SIGMA(1,JGR,4)) + ENDIF + SIGMA(KTYP(1),JGR,4) = STORE +* + ENDIF +* + IL=1 + ALLOCATE(SSCAT(NGRP)) + DO 910 IGR=1,NGRP + SSCAT(IGR)= SCAT(MMIX,IL,IGR,JGR) + SCAT(MMIX,IL,IGR,JGR) = 0.0 + 910 CONTINUE + IF(ITYPE.NE.0) THEN +!! ATTENTION isotropy is supposed +!! + IL=1 + WRITE (CM,'(I2.2)') IL-1 + CALL LCMGET(KPMAC,'SCAT'//CM,WORK) + CALL LCMGET(KPMAC,'NJJS'//CM,NJJ(1,IL,JGR)) + CALL LCMGET(KPMAC,'IJJS'//CM,IJJ(1,IL,JGR)) + CALL LCMGET(KPMAC,'IPOS'//CM,IPOS) + DO 930 IBM=1,MMIX + IJJ0=IJJ(IBM,IL,JGR) + IPOSDE = IPOS(IBM) + DO 920 IGR=IJJ0,IJJ0-NJJ(IBM,IL,JGR)+1,-1 + SCAT(IBM,IL,IGR,JGR)=WORK(IPOSDE) + IPOSDE=IPOSDE+1 + 920 CONTINUE + 930 CONTINUE + ENDIF +* + DO 940 IGR=1,NGRP + SCAT(KTYP(1),IL,IGR,JGR) = SSCAT(IGR) + 940 CONTINUE + DEALLOCATE(SSCAT) + 950 CONTINUE + ENDIF +* + DO 990 IX=1,MMIX + DO 980 JGR=1,NGRP + DO 970 IL=1,NL + IGMIN=JGR + IGMAX=JGR + DO 960 IGR=NGRP,1,-1 + IF (SCAT(IX,IL,IGR,JGR).NE.0.0) THEN + IGMIN=MIN(IGMIN,IGR) + IGMAX=MAX(IGMAX,IGR) + ENDIF + 960 CONTINUE + IJJ(IX,IL,JGR)=IGMAX + NJJ(IX,IL,JGR)=IGMAX-IGMIN+1 + 970 CONTINUE + 980 CONTINUE + 990 CONTINUE +* + SIGS(:MMIX,:NGRP)=0.0 + JPMAC=LCMLID(IPMACX,'GROUP',NGRP) + DO 1002 JGR=1,NGRP + KPMAC=LCMDIL(JPMAC,JGR) + CALL LCMPUT(KPMAC,'NTOT0',MMIX,2,SIGMA(1,JGR,2)) + CALL LCMPUT(KPMAC,'OVERV',MMIX,2,OVERV(1,JGR)) + IF(ILEAK.EQ.1) THEN + CALL LCMPUT(KPMAC,'DIFF',MMIX,2,DIFFX(1,JGR)) + ELSE IF(ILEAK.EQ.2) THEN + CALL LCMPUT(KPMAC,'DIFFX',MMIX,2,DIFFX(1,JGR)) + CALL LCMPUT(KPMAC,'DIFFY',MMIX,2,DIFFY(1,JGR)) + CALL LCMPUT(KPMAC,'DIFFZ',MMIX,2,DIFFZ(1,JGR)) + ENDIF + CALL LCMPUT(KPMAC,'FLUX-INTG',MMIX,2,FLUX(1,JGR)) + IF(JTAB(1).EQ.1 .OR. ITYPE.NE.0) THEN + CALL LCMPUT(KPMAC,'CHI ',MMIX,2,CHI(1,JGR)) + CALL LCMPUT(KPMAC,'NUSIGF ',MMIX,2,SIGMA(1,JGR,3)) + ! Caution: H-FACTORS are J-barn. Convert them to eV-barn + SIGMA(:MMIX,JGR,4)=SIGMA(:MMIX,JGR,4)/REAL(EVJ) + CALL LCMPUT(KPMAC,'H-FACTOR',MMIX,2,SIGMA(1,JGR,4)) + CALL LCMPUT(KPMAC,'NFTOT',MMIX,2,SIGMA(1,JGR,5)) + ENDIF +* + IL=1 + WRITE (CM,'(I2.2)') IL-1 + IPOSDE=0 + DO 1001 IX=1,MMIX + IPOS(IX)=IPOSDE+1 + DO 1000 IGR=IJJ(IX,IL,JGR),IJJ(IX,IL,JGR)-NJJ(IX,IL,JGR)+1,-1 + IPOSDE=IPOSDE+1 + WORK(IPOSDE)=SCAT(IX,IL,IGR,JGR) + SIGS(IX,IGR)=SIGS(IX,IGR)+ SCAT(IX,IL,IGR,JGR) + 1000 CONTINUE + 1001 CONTINUE +* + CALL LCMPUT(KPMAC,'SCAT'//CM,IPOSDE,2,WORK) + CALL LCMPUT(KPMAC,'IPOS'//CM,MMIX,1,IPOS) + CALL LCMPUT(KPMAC,'NJJS'//CM,MMIX,1,NJJ(1,IL,JGR)) + CALL LCMPUT(KPMAC,'IJJS'//CM,MMIX,1,IJJ(1,IL,JGR)) + CALL LCMPUT(KPMAC,'SIGW'//CM,MMIX,2,SCAT(1,IL,JGR,JGR)) + 1002 CONTINUE + DO 1003 JGR=1,NGRP + KPMAC=LCMDIL(JPMAC,JGR) + IL=1 + WRITE (CM,'(I2.2)') IL-1 + CALL LCMPUT(KPMAC,'SIGS'//CM,MMIX,2,SIGS(1,JGR)) + 1003 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(XPURB,XPF2LB,XPF1LB,XPF2B,XPF1B,XMMDB,XMFDB,XNP9B, + 1 XSMB,XD2MB,XD1MB,XD2CB,XD1CB,XT2MB,XT1MB,XT2CB,XT1CB,XT2FB,XT1FB, + 2 XXENB,XBORB,SMACB) + DEALLOCATE(ITEXTR,PTFUEL,PTCOOL,PDCOOL,ISFT,PSFT,BSFT,XFLUN,XSIGX, + 1 XSIGF,KTYP,INDEX,OVERVB,CHIB,JTAB,FLUXB,CPW2B,CPW1B,HNEP2,HNEP1, + 2 HSAM2,HSAM1,HXEN2,HXEN1,HISO,DENSITB,BFLUX,NJ,BRH,PW,SCATAV, + 3 IWORK,SIGAV,FLUAV,POWER,BURED,BURBG,IZONE,WORK,IJ,DIFFZ,DIFFY, + 4 DIFFX,SCAT,IPOS,ENER,CHI,FLUX,SIGS,OVERV,XBURN,NJJ,VOL,IJJ,SIGMA) + RETURN +* + 699 FORMAT(/' AFMDRV: THE CROSS SECTIONS ARE GENERATED FOR A', + 1 ' TIME AVERAGE CALCULATION.') + 701 FORMAT(/' AFMDRV: THE CROSS SECTIONS ARE GENERATED FOR A', + 1 ' SNAPSHOT CALCULATION.') + 702 FORMAT(/' AFMDRV: POWER ARE RECOVERED FROM L_MAP.') + 703 FORMAT(/' AFMDRV: FLUX ARE RECOVERED FROM L_MAP.') + 704 FORMAT(/' AFMDRV: BUNDLES POWER SHIFT ARE CORRECTED.') + 705 FORMAT(/' AFMDRV: BUNDLES POWER = ',F12.2,1X,'KW IS FIXED', + 1 ' BY THE USER.') + 706 FORMAT(/' AFMDRV: BUNDLES XENON = ',E15.8,1X,'IS FIXED', + 1 ' BY THE USER.') + 707 FORMAT(/' AFMDRV: LAGRANGE INTERPOLATION IS USED TO COMPUTE', + 1 ' TIME AVERAGED CROSS SECTIONS.') + 708 FORMAT(/' AFMDRV: SPLINE 3 INTERPOLATION IS USED TO COMPUTE', + 1 ' TIME AVERAGED CROSS SECTIONS.') + 709 FORMAT(/' AFMDRV: HERMITE 3 INTERPOLATION IS USED TO COMPUT', + 1 'E TIME AVERAGED CROSS SECTIONS.') + 711 FORMAT(/' AFMDRV: BUNDLES NEPTUNIUM = ',E15.8,1X,'IS FIXED', + 1 ' BY THE USER.') + 712 FORMAT(/' AFMDRV: NOMINAL XENON IS USED.') + 713 FORMAT(/' AFMDRV: NOMINAL NEPTUNIUM IS USED.') + 714 FORMAT(/' AFMDRV: BUNDLES TFUEL = ',F12.2,1X,'K IS FIXED', + 1 ' BY THE USER.') + 715 FORMAT(/' AFMDRV: DRAGON CONCENTRATIONS ARE USED (XE135' + 1 //' NP239, SM149).') + 716 FORMAT(/' AFMDRV: ',A12,' PROFILES ARE RECOVERED FROM L_MAP.', + 1 ' PARKEY=',A12) + 717 FORMAT(/' AFMDRV: BUNDLES COOL. TEMP. TCOOL = ',F12.2,1X, + 1 'K IS FIXED BY THE USER.') + 718 FORMAT(/' AFMDRV: BUNDLES COOL. DENSITY RDCL = ',F12.9,1X, + 1 'K IS FIXED BY THE USER.') + 719 FORMAT(/' AFMDRV: BUNDLES SAMARIUM = ',E15.8,1X,'IS FIXED', + 1 ' BY THE USER.') + END diff --git a/Donjon/src/AFMLOC.f b/Donjon/src/AFMLOC.f new file mode 100644 index 0000000..746eb0d --- /dev/null +++ b/Donjon/src/AFMLOC.f @@ -0,0 +1,120 @@ +*DECK AFMLOC + SUBROUTINE AFMLOC(NBURN,NTP,XBMAX,XBMIN,XBURN,MAX,MIN,COF,ILIN) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Burnup localisation and interpolation +* +*Copyright: +* Copyright (C) 1996 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): +* M.T. Sissaoui +* +*Parameters: input +* NBURN total number of burnup steps. +* XBURN burnup steps dimemsion (NBURN). +* XBMAX higher burnup value. +* XBMIN lower burnup value. +* +*Parameters: output +* MAX maximum burnup number +* MIN minimum burnup number +* COF interpolation coefficient (Lagrange) +* +*Parameters: +* NTP +* MAX +* MIN +* ILIN +* +*---------------------------------------------------------------* +* + DIMENSION XBURN(NBURN),ELMT(3) + DOUBLE PRECISION COF(3),XCOF(1) + NTP=2 + COF(1)=0.0D0 + COF(2)=0.0D0 + COF(3)=0.0D0 + IF(XBMAX.EQ.XBMIN) NTP=1 + IF(XBMAX.GT.XBURN(NBURN)) THEN + WRITE(6,100) XBMAX,XBURN(NBURN) + CALL XABORT('AFMLOC: THE HIGHER BURNUP VALUE IS BEYOND' + 1 //' THE MAXIMUM BURNUP IN THE DATABASE') + ELSE IF(NBURN.EQ.1.AND.NTP.EQ.2) THEN + CALL XABORT('AFMLOC: TIME AVERAGE CALCULATION REQUIRE' + 1 //' AT LEAST TWO IRRADIATIONS STEPS') + ELSE IF(NBURN.EQ.1.AND.NTP.EQ.1) THEN + COF(1)=1.0D0 + MIN=1 + MAX=1 + ELSE IF(NBURN.EQ.2) THEN + MIN=1 + MAX=2 + IF(NTP.EQ.1) THEN + XIRAD=XBMIN + IF(ILIN.EQ.1) THEN + NTOX=-1 + ELSE + NTOX=2 + ENDIF + NELE=2 + ELMT(1)=XBURN(1) + ELMT(2)=XBURN(2) + CALL LIBLEX(NELE,XIRAD,ELMT,NTOX,XCOF(1)) + ENDIF + ELSE IF(NBURN.GE.3) THEN + DO 85 IV=1,NTP + IF(IV.EQ.1) THEN + XIRAD=XBMIN + ELSE + XIRAD=XBMAX + ENDIF +* + DO 80 I=2,NBURN + IF(XIRAD.GE.XBURN(I-1).AND.XIRAD.LE.XBURN(I)) THEN + IF(NTP.EQ.2) THEN + IF(IV.EQ.1) THEN + MIN=I-1 + ELSE + IF(I+1.LE.NBURN) THEN + MAX=I+1 + ELSE + MAX=I + ENDIF + ENDIF + ELSE + IF(I+1.LE.NBURN) THEN + MIN=I-1 + MAX=I+1 + ELSE + MIN=I-2 + MAX=I + ENDIF + ENDIF + ENDIF + 80 CONTINUE + 85 CONTINUE + IF(NTP.EQ.1) THEN + IF(ILIN.EQ.1) THEN + NTOX=-1 + ELSE + NTOX=3 + ENDIF + NELE=3 + ELMT(1)=XBURN(MAX-2) + ELMT(2)=XBURN(MAX-1) + ELMT(3)=XBURN(MAX) + CALL LIBLEX(NELE,XIRAD,ELMT,NTOX,COF(1)) + ENDIF + ENDIF + RETURN +* + 100 FORMAT(/30H AFMLOC: MAXIMUM BURNUP VALUE=,1P,E12.4/ + 1 9X,25HMAXIMUM TABULATED BURNUP=,E12.4) + END diff --git a/Donjon/src/AFMTAV.f b/Donjon/src/AFMTAV.f new file mode 100644 index 0000000..481280f --- /dev/null +++ b/Donjon/src/AFMTAV.f @@ -0,0 +1,173 @@ +*DECK AFMTAV + SUBROUTINE AFMTAV (NBURN,ITM,XBMAX,XBMIN,YS,NBMIN,NBMAX,XB,SIGAV) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Time average calculation using different approximation. +* +*Copyright: +* Copyright (C) 1996 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): +* M.T. Sissaoui +* +*Parameters: input +* NBURN total number of steps. +* ITM type of the approximation (1-Lagrange; 2-spline; 3-Hermite) +* XBMAX highest value. +* XBMIN lower value. +* YS parameter to be integrated +* NBMIN +* NBMAX +* XB steps +* +*Parameters: output +* SIGAV average value of YS +* +*----------------------------------------------------------------------- +* + REAL YS(NBURN),XB(NBURN),SIGAV + REAL UU(2) + DOUBLE PRECISION DD + REAL, ALLOCATABLE, DIMENSION(:) :: Y,U +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(Y(NBURN),U(NBURN)) +* + IF(NBMAX.GT.0) THEN + INMAX=NBMAX-2 + INMIN=NBMIN + ELSE + INMAX=ABS(NBMAX)-1 + INMIN=NBMIN + IF(ITM.EQ.1) + 1 CALL XABORT('AFMTAV: MORE BURNUP STEPS ARE REQUIRED TO USE ' + 1 //' LAGRANGE METHOD, CHOOSE HERMIT OR SPLINE METHOD') + ENDIF + IF(ABS(NBMAX).GT.NBMIN) THEN + SIGAV=0.0 +* + IF(ITM.EQ.1) THEN +* TIME AVERAGE CALCULATION USING LAGRANGE APPROXIMATION. +* + DO 113 IR=INMIN,INMAX + I1=IR + I2=IR+1 + I3=IR+2 + XBI=MAX(XBMIN,XB(IR)) + XBF=MIN(XBMAX,XB(IR+1)) + TX=XBF-XBI + TX2=XBF**2-XBI**2 + TX3=XBF**3-XBI**3 + X12=XB(I1)-XB(I2) + X13=XB(I1)-XB(I3) + X23=XB(I2)-XB(I3) + XA12=XB(I1)+XB(I2) + XA13=XB(I1)+XB(I3) + XA23=XB(I2)+XB(I3) + XM12=XB(I1)*XB(I2) + XM13=XB(I1)*XB(I3) + XM23=XB(I2)*XB(I3) + Y1=YS(I1)/(X12*X13) + Y2=-YS(I2)/(X12*X23) + Y3=YS(I3)/(X13*X23) +* + SIGAV=SIGAV + + 1 Y1*(TX3/3.0-XA23*TX2/2.0+XM23*TX)+ + 1 Y2*(TX3/3.0-XA13*TX2/2.0+XM13*TX)+ + 1 Y3*(TX3/3.0-XA12*TX2/2.0+XM12*TX) + 113 CONTINUE +* + ELSE IF(ITM.EQ.2) THEN +* TIME AVERAGE CALCULATION USING SPLINE APPROXIMATION. +* THE LOWER BOUNDARY CONDITION IS SET TO BE NATURAL + Y(1)=0.0 + U(1)=0.0 +* THE UPPER BOUNDARY CONDITION IS SET EITHER TO BE NATURAL + QN=0.0 + UN=0.0 +* + DO 103 IR=2,NBURN-1 + SIG=(XB(IR)-XB(IR-1))/(XB(IR+1)-XB(IR-1)) + P=SIG*Y(IR-1)+2.0 + Y(IR)=(SIG-1.0)/P + U(IR)=(6.*((YS(IR+1)-YS(IR))/(XB(IR+1)-XB(IR))- + 1 (YS(IR)-YS(IR-1))/(XB(IR)-XB(IR-1)))/(XB(IR+1)- + 1 XB(IR-1))-SIG*U(IR-1))/P + 103 CONTINUE +* + Y(NBURN)=(UN-QN*U(NBURN-1))/(QN*Y(NBURN-1)+1.0) +* + DO 104 K=NBURN-1,1,-1 + Y(K)=Y(K)*Y(K+1)+U(K) + 104 CONTINUE +* +* COMPUTE THE INTEGRAL OF THE X-SECTION + INMAX=NBMAX-2 + INMIN=NBMIN + DO 300 IR=INMIN,INMAX + H=XB(IR+1)-XB(IR) + XBI=MAX(XBMIN,XB(IR)) + XBF=MIN(XBMAX,XB(IR+1)) +* + DB=XBF-XBI + HF=XB(IR+1)-XBF + HI=XB(IR+1)-XBI +* + AI=-0.5*(HF**2-HI**2)/H + BI=DB-AI + CI=-(AI/6)*H**2-(HF**4-HI**4)/(24*H) + DI=-(BI/6)*H**2-(HF**4-HI**4)/(24*H) +* + SIGAV=SIGAV+AI*YS(IR)+BI*YS(IR+1)+ + 1 CI*Y(IR)+DI*Y(IR+1) + 300 CONTINUE + ELSE IF(ITM.EQ.3) THEN +* TIME AVERAGE CALCULATION USING HERMIT APPROXIMATION. + DO 101 I=1,NBURN + Y(I)=YS(I) + 101 CONTINUE +* TAKE THE DERIVATIVE WITH RESPECT TO BURNUP OR NEUTRON EXPOSURE AT +* TABULATION POINTS. + CALL ALDERV(NBURN,XB,Y) +* +* COMPUTE THE INTEGRAL OF THE X-SECTION + DD=0.0D0 + DO 200 IR=1,NBURN-1 + IF((XBMIN.LT.XB(IR+1)).AND.(XBMAX.GT.XB(IR))) THEN + DX=XB(IR+1)-XB(IR) + XBI=MAX(XBMIN,XB(IR)) + XBF=MIN(XBMAX,XB(IR+1)) + CC=0.5*(XBF-XBI) + U1=(XBI-0.5*(XB(IR)+XB(IR+1)))/DX + U2=(XBF-0.5*(XB(IR)+XB(IR+1)))/DX + UU(1)=0.5*(-(U2-U1)*0.577350269189626+U1+U2) + UU(2)=0.5*((U2-U1)*0.577350269189626+U1+U2) + DO 190 J=1,2 + H1=3.0*(0.5-UU(J))**2-2.0*(0.5-UU(J))**3 + H2=(0.5-UU(J))**2-(0.5-UU(J))**3 + H3=3.0*(0.5+UU(J))**2-2.0*(0.5+UU(J))**3 + H4=-(0.5+UU(J))**2+(0.5+UU(J))**3 + DD=DD+(H1*YS(IR)+H2*Y(IR)*DX+H3*YS(IR+1)+ + 1 H4*Y(IR+1)*DX)*CC + 190 CONTINUE + ENDIF + 200 CONTINUE + SIGAV=REAL(DD) + ENDIF + SIGAV=SIGAV/(XBMAX-XBMIN) + ELSE + SIGAV=YS(NBMIN) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(U,Y) + RETURN + END diff --git a/Donjon/src/AFMXNC.f b/Donjon/src/AFMXNC.f new file mode 100644 index 0000000..62986eb --- /dev/null +++ b/Donjon/src/AFMXNC.f @@ -0,0 +1,59 @@ +*DECK AFMXNC + SUBROUTINE AFMXNC (NGRP,SIGX,SIGF,FLUX,XXE,XNP,FLUR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Computation of Xenon and Neptunium concentrations. +* +*Copyright: +* Copyright (C) 1996 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): +* M.T. Sissaoui +* +*Parameters: input +* NGRP +* SIGX Xenon absorption micro-x-section dimension (ngrp). +* SIGF fission macro-x-section dimension (ngrp). +* FLUX flux dimension (ngrp) +* +*Parameters: output +* XXE Xenon concentration +* XNP Neptunium concentration +* FLUR +* +*----------------------------------------------------------------------- +* + DIMENSION FLUX(NGRP),SIGF(NGRP),SIGX(NGRP),FLUR(NGRP) + REAL CF +* SET THE YIELD AND THE DECAY CONSTANTE FOR XENON AND NEPTUNIUM + XLAMBDAX = 2.09E-5 + XLAMBDAI = 2.85E-5 + GAMMAI = 0.0631 + GAMMAX = 0.0045 +* CF=1.E-24(barn) + CF=1.0E-24 + CINTG=1.0E+13 +* CALCUL DES TAUX DE FISSION + TAUF=0.0 + TAUAX=0.0 + FLR=0.0 + FLX=0.0 + DO 10 IGR = 1,NGRP + TAUF = TAUF+FLUX(IGR)*SIGF(IGR) + TAUAX = TAUAX+FLUX(IGR)*SIGX(IGR) + FLR=FLR+FLUR(IGR)*CINTG + FLX=FLX+FLUX(IGR) + 10 CONTINUE +* COMPUTE THE XENON CONCENTRATION + XXE=CF*(GAMMAX+GAMMAI)*TAUF/(XLAMBDAX+TAUAX*CF) +* COMPUTE THE NEPTUNIUM CONCENTRATION + XNP=XNP*FLX/FLR +* + RETURN + END diff --git a/Donjon/src/CRE.f b/Donjon/src/CRE.f new file mode 100644 index 0000000..f6a53d7 --- /dev/null +++ b/Donjon/src/CRE.f @@ -0,0 +1,186 @@ +*DECK CRE
+ SUBROUTINE CRE(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Recover and interpolate a macrolib from one or many compo objects;
+* generate a fuel-map macrolib.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert
+*
+*Parameters: input/output
+* NENTRY number of data structures transfered to this module.
+* HENTRY name of the data structures.
+* IENTRY data structure type where:
+* IENTRY=1 for LCM memory object;
+* IENTRY=2 for XSM file;
+* IENTRY=3 for sequential binary file;
+* IENTRY=4 for sequential ASCII file.
+* JENTRY access permission for the data structure where:
+* JENTRY=0 for a data structure in creation mode;
+* JENTRY=1 for a data structure in modifications mode;
+* JENTRY=2 for a data structure in read-only mode.
+* KENTRY data structure pointer.
+*
+*Comments:
+* The CRE: module specifications are:
+* Option 1:
+* MACRO := CRE: [ MACRO ] [[ CPO ]] :: (desccre1) ;
+* Option 2
+* MACFL := CRE: [[ CPO ]] FMAP :: (desccre2) ;
+* where
+* MACRO : name of the \emph{macrolib}
+* object to be created or updated for the few reactor material properties.
+* Note that if MACRO appears on the RHS, the information previously
+* stored in MACRO is kept.
+* CPO : name of the \emph{compo}
+* object containing the mono-parameter database from transport calculations.
+* MACFL : name of the fuel-map \emph{macrolib}
+* that will be created only for the fuel properties over the fuel lattice.
+* FMAP : name of the \emph{fmap}
+* object containing the fuel-map specification and burnup informations.
+* (desccre1) : structure describing the input data to the CRE:
+* module when the \emph{fmap} object is not specified.
+* (desccre2) : structure describing the input data to the CRE:
+* module for the fuel-map \emph{macrolib} construction.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ TYPE(C_PTR) KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40)
+ TYPE(C_PTR) IPMAC,IPMAP
+ CHARACTER TEXT*12,HSMG*131,HSIGN*12
+ INTEGER ISTATE(NSTATE)
+ LOGICAL LMAC
+ DOUBLE PRECISION DFLOT
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.LE.1)CALL XABORT('@CRE: TWO PARAMETERS EXPECTED.')
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@CRE'
+ 1 //': LCM OBJECT EXPECTED AT LHS.')
+ IF(JENTRY(1).EQ.0)THEN
+ HSIGN='L_MACROLIB'
+ CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ LMAC=.FALSE.
+ ELSEIF(JENTRY(1).EQ.1)THEN
+ CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_MACROLIB')THEN
+ TEXT=HENTRY(1)
+ CALL XABORT('@CRE: SIGNATURE OF '//TEXT//' IS '//HSIGN//
+ 1 '. L_MACROLIB EXPECTED.')
+ ENDIF
+ LMAC=.TRUE.
+ ELSE
+ CALL XABORT('@CRE: MACROLIB IN CREATE OR MODIFICATION MOD'
+ 1 //'E EXPECTED.')
+ ENDIF
+ IPMAC=KENTRY(1)
+ IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@CRE:'
+ 1 //' LCM OBJECT EXPECTED AT RHS.')
+ IF(JENTRY(2).NE.2)CALL XABORT('@CRE: COMPO IN READ-ONLY MOD'
+ 1 //'E EXPECTED AT RHS.')
+ CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_COMPO')THEN
+ TEXT=HENTRY(2)
+ CALL XABORT('@CRE: SIGNATURE OF '//TEXT//' IS '//HSIGN//
+ 1 '. L_COMPO EXPECTED.')
+ ENDIF
+ IPMAP=C_NULL_PTR
+ IF(NENTRY.EQ.2)GOTO 10
+ DO 5 IEN=3,NENTRY
+ IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@C'
+ 1 //'RE: LCM OBJECT EXPECTED AT RHS.')
+ IF(JENTRY(IEN).NE.2)CALL XABORT('@CRE: LCM OBJECT IN READ-ON'
+ 1 //'LY MODE EXPECTED AT RHS.')
+ CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_COMPO')THEN
+ IF(HSIGN.EQ.'L_MAP')THEN
+ IF(LMAC)CALL XABORT('@CRE: MACROLIB IN CREATE MODE EXPEC'
+ 1 //'TED WITH FUEL-MAP OBJECT.')
+ IF(IEN.EQ.NENTRY)THEN
+ IPMAP=KENTRY(IEN)
+ ELSE
+ CALL XABORT('@CRE: FUEL-MAP OBJECT EXPECTED TO BE THE '
+ 1 //'LAST PARAMETER.')
+ ENDIF
+ ELSE
+ TEXT=HENTRY(IEN)
+ CALL XABORT('@CRE: SIGNATURE OF '//TEXT//' IS '//HSIGN//
+ 1 '. L_COMPO EXPECTED.')
+ ENDIF
+ ENDIF
+ 5 CONTINUE
+*----
+* RECOVER INFORMATION
+*----
+ 10 ISTATE(:NSTATE)=0
+ CALL LCMGET(KENTRY(2),'STATE-VECTOR',ISTATE)
+ NGRP=ISTATE(2)
+ NL=ISTATE(4)
+ NMIXT=0
+ IF(C_ASSOCIATED(IPMAP)) CALL LCMLEN(IPMAP,'FLMIX',NMIXT,ITYP)
+ IF(LMAC)THEN
+ ISTATE(:NSTATE)=0
+ CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE)
+ IF(ISTATE(1).NE.NGRP)THEN
+ WRITE(HSMG,'(40HCRE: INCONSISTENT NB OF GROUPS. IN MACRO,
+ 1 5HLIB =,I5,11H IN COMPO =,I5)') ISTATE(1),NGRP
+ CALL XABORT(HSMG)
+ ENDIF
+ IF(ISTATE(3).NE.NL)THEN
+ WRITE(HSMG,'(40HCRE: INCONSISTENT NB OF LEGENDRE ORDERS.,
+ 1 14H IN MACROLIB =,I5,11H IN COMPO =,I5)') ISTATE(3),NL
+ CALL XABORT(HSMG)
+ ENDIF
+ NMIXT=ISTATE(2)
+ ENDIF
+*----
+* READ THE INPUT DATA
+*----
+ IMPX=0
+ 20 CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3)CALL XABORT('@CRE: CHARACTER DATA EXPECTED.')
+ IF(TEXT.EQ.'EDIT')THEN
+* READ THE PRINT INDEX.
+ CALL REDGET(INDIC,IMPX,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1)CALL XABORT('@CRE: INTEGER DATA EXPECTED(1).')
+ ELSEIF(TEXT.EQ.'NMIX')THEN
+* READ THE MAXIMUM NUMBER OF MATERIAL MIXTURES.
+ IF(NMIXT.NE.0)CALL XABORT('@CRE: NMIX IS ALREADY DEFINED.')
+ CALL REDGET(INDIC,NMIXT,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1)CALL XABORT('@CRE: INTEGER DATA EXPECTED(2).')
+ ELSEIF(TEXT.EQ.'READ')THEN
+ IF(NMIXT.EQ.0)CALL XABORT('@CRE: ZERO NUMBER OF MIXTURES.')
+ IF(NGRP.EQ.0)CALL XABORT('@CRE: ZERO NUMBER OF GROUPS.')
+ CALL CREDRV(IPMAC,IPMAP,NENTRY,HENTRY,KENTRY,LMAC,NMIXT,NGRP,
+ 1 NL,ILEAK,IMPX)
+ GOTO 30
+ ELSE
+ CALL XABORT('@CRE: '//TEXT//' IS AN INVALID KEYWORD.')
+ ENDIF
+ GOTO 20
+ 30 ISTATE(:NSTATE)=0
+ ISTATE(1)=NGRP
+ ISTATE(2)=NMIXT
+ ISTATE(3)=NL
+ ISTATE(4)=1
+ ISTATE(9)=ILEAK
+ CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IMPX.GT.1)CALL LCMLIB(IPMAC)
+ RETURN
+ END
diff --git a/Donjon/src/CREBUR.f b/Donjon/src/CREBUR.f new file mode 100644 index 0000000..a46ba15 --- /dev/null +++ b/Donjon/src/CREBUR.f @@ -0,0 +1,110 @@ +*DECK CREBUR
+ SUBROUTINE CREBUR(IPCPO,NISO,NGRP,NL,IMPX,HISO,DERIV,NBURN,BURN0,
+ 1 BURN1,BURNUP,ITY,CONC,ILEAK,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,
+ 2 DIFFY,DIFFZ,H,SCAT,FLUX,UPS)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Interpolate l_compo for a given burnup value.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert
+*
+*Parameters: input
+* IPCPO pointer to l_compo information.
+* NISO 1+number of extracted isotopes.
+* NGRP number of energy groups.
+* NL number of legendre orders (=1 for isotropic scattering).
+* IMPX printing index (=0 for no print).
+* HISO hollerith name information for extracted isotopes.
+* DERIV =.true.: derivative of macrolib info is computed with
+* respect to burn1.
+* NBURN number of tabulated burnup steps.
+* BURN0 user defined initial burnup.
+* BURN1 user defined final burnup:
+* if burn0=burn1, a simple interpolation is performed;
+* if burn0<burn1, a time-average calculation is performed.
+* BURNUP burnup tabulation points.
+* ITY =0: do not process the isotope; =1: use number density
+* stored in conc(i); =2: use number density stored in compo.
+* CONC user defined number density.
+*
+*Parameters: output
+* ILEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic).
+* TOTAL total macroscopic x-sections.
+* ZNUG nu*fission macroscopic x-sections.
+* SNUGF fission macroscopic x-sections.
+* CHI fission spectrum.
+* OVERV reciprocal neutron velocities.
+* DIFFX x-directed diffusion coefficients.
+* DIFFY y-directed diffusion coefficients.
+* DIFFZ z-directed diffusion coefficients.
+* H h-factors (kappa*fission macroscopic x-sections).
+* SCAT scattering macroscopic x-sections.
+* FLUX integrated flux.
+* UPS
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPCPO
+ INTEGER NISO,NGRP,NL,IMPX,NBURN,HISO(3*NISO),ITY(NISO),ILEAK
+ REAL BURNUP(NBURN),CONC(NISO),TOTAL(NGRP),ZNUG(NGRP),
+ 1 CHI(NGRP),OVERV(NGRP),DIFFX(NGRP),DIFFY(NGRP),DIFFZ(NGRP),
+ 2 H(NGRP),SCAT(NL,NGRP,NGRP),SNUGF(NGRP),FLUX(NGRP),BURN0,BURN1
+ LOGICAL DERIV,UPS
+*----
+* LOCAL VARIABLES
+*----
+ LOGICAL LCUBIC
+ PARAMETER(LCUBIC=.TRUE.)
+ REAL, ALLOCATABLE, DIMENSION(:) :: TERP
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTOTAL,ZZNUG,ZNUGF,ZCHI,
+ 1 ZOVERV,ZDIFFX,ZDIFFY,ZDIFFZ,ZH,ZFLUX
+ REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ZSCAT
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(ZTOTAL(NBURN,NGRP),ZZNUG(NBURN,NGRP),ZNUGF(NBURN,NGRP),
+ 1 ZCHI(NBURN,NGRP),ZOVERV(NBURN,NGRP),ZDIFFX(NBURN,NGRP),
+ 2 ZDIFFY(NBURN,NGRP),ZDIFFZ(NBURN,NGRP),ZH(NBURN,NGRP),
+ 3 ZFLUX(NBURN,NGRP),ZSCAT(NBURN,NL,NGRP,NGRP),TERP(NBURN))
+*----
+* RECOVER MACROSCOPIC X-SECTION INFO FROM BURNUP DIRECTORIES
+*----
+ IF(NBURN.LE.1)CALL XABORT('@CREBUR: NO BURNUP INFORMATION.')
+ CALL CRETAB(IPCPO,NISO,NGRP,NL,IMPX,HISO,NBURN,ITY,CONC,ILEAK,
+ 1 ZTOTAL,ZZNUG,ZNUGF,ZCHI,ZOVERV,ZDIFFX,ZDIFFY,ZDIFFZ,ZH,ZSCAT,
+ 2 ZFLUX,UPS)
+*----
+* PERFORM INTERPOLATION OR TIME AVERAGING
+*----
+ IF(BURN0.LT.BURN1)THEN
+* TIME-AVERAGED
+ CALL ALTERI(LCUBIC,NBURN,BURNUP,BURN0,BURN1,TERP)
+ DO 100 I=1,NBURN
+ TERP(I)=TERP(I)/(BURN1-BURN0)
+ 100 CONTINUE
+ ELSE IF(BURN0.EQ.BURN1)THEN
+* INSTANTANEOUS
+ CALL ALTERP(LCUBIC,NBURN,BURNUP,BURN0,DERIV,TERP)
+ ELSE
+ CALL XABORT('@CREBUR: ILLEGAL BURN1 VALUE.')
+ ENDIF
+ CALL CREITP(NGRP,NL,NBURN,TERP,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,
+ 1 DIFFY,DIFFZ,H,SCAT,FLUX,ZTOTAL,ZZNUG,ZNUGF,ZCHI,ZOVERV,ZDIFFX,
+ 2 ZDIFFY,ZDIFFZ,ZH,ZSCAT,ZFLUX)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(TERP,ZFLUX,ZSCAT,ZH,ZDIFFZ,ZDIFFY,ZDIFFX,ZOVERV,ZCHI,
+ 1 ZNUGF,ZZNUG,ZTOTAL)
+ RETURN
+ END
diff --git a/Donjon/src/CREDRV.f b/Donjon/src/CREDRV.f new file mode 100644 index 0000000..71091e4 --- /dev/null +++ b/Donjon/src/CREDRV.f @@ -0,0 +1,210 @@ +*DECK CREDRV
+ SUBROUTINE CREDRV(IPMAC,IPMAP,NENTRY,HENTRY,KENTRY,LMAC,NMIX,
+ 1 NGRP,NL,ILEAK,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Recover and/or interpolate l_compo information, store properties
+* in a new or existing macrolib.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert, M. Guyot
+*
+*Parameters: input/output
+* IPMAC pointer to the macrolib information.
+* IPMAP pointer to fuel-map information (=0 if no l_fmap).
+* NENTRY number of lcm or xsm objects used by the module.
+* HENTRY character*12 name of each lcm or xsm objects.
+* KENTRY pointers to the lcm or xsm objects.
+* LMAC flag for macrolib object type: =.false. in create mode;
+* =.true. in modification mode.
+* NMIX maximum number of material mixtures.
+* NGRP number of energy groups.
+* NL number of legendre orders (=1 for isotropic scattering).
+* ILEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic).
+* IMPX printing index (=0 for no print).
+*
+*NOTE: a cross section not read is set to zero.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,NMIX,NGRP,NL,ILEAK,IMPX
+ TYPE(C_PTR) IPMAC,IPMAP,KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+ LOGICAL LMAC
+*----
+* LOCAL VARIABLES
+*----
+ CHARACTER CM*2
+ TYPE(C_PTR) JPMAC,KPMAC
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IPOS
+ INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: IJJ,NJJ
+ REAL, ALLOCATABLE, DIMENSION(:) :: WORK
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: TOTAL,ZNUG,SNUGF,CHI,OVERV,
+ 1 DIFFX,DIFFY,DIFFZ
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: H
+ REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: SCAT
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(IPOS(NMIX),IJJ(NMIX,NL,NGRP),NJJ(NMIX,NL,NGRP))
+ ALLOCATE(TOTAL(NMIX,NGRP),ZNUG(NMIX,NGRP),SNUGF(NMIX,NGRP),
+ 1 CHI(NMIX,NGRP),OVERV(NMIX,NGRP),DIFFX(NMIX,NGRP),
+ 2 DIFFY(NMIX,NGRP),DIFFZ(NMIX,NGRP),WORK(NMIX*NGRP),
+ 3 SCAT(NMIX,NL,NGRP,NGRP),H(NMIX,NGRP,NL))
+*
+ TOTAL(:NMIX,:NGRP)=0.0
+ ZNUG(:NMIX,:NGRP)=0.0
+ SNUGF(:NMIX,:NGRP)=0.0
+ CHI(:NMIX,:NGRP)=0.0
+ OVERV(:NMIX,:NGRP)=0.0
+ DIFFX(:NMIX,:NGRP)=0.0
+ DIFFY(:NMIX,:NGRP)=0.0
+ DIFFZ(:NMIX,:NGRP)=0.0
+ WORK(:NMIX*NGRP)=0.0
+ SCAT(:NMIX,:NL,:NGRP,:NGRP)=0.0
+ H(:NMIX,:NGRP,:NL)=0.0
+ IPOS(:NMIX)=0
+ DO 12 IGR=1,NGRP
+ DO 11 IBM=1,NMIX
+ DO 10 IL=1,NL
+ IJJ(IBM,IL,IGR)=IGR
+ NJJ(IBM,IL,IGR)=1
+ 10 CONTINUE
+ 11 CONTINUE
+ 12 CONTINUE
+ IF((IMPX.GT.1).AND.LMAC) CALL LCMLIB(IPMAC)
+*----
+* RECOVER THE EXISTING MACROLIB DATA
+*----
+ ILEAK=0
+ IF(LMAC)THEN
+ JPMAC=LCMGID(IPMAC,'GROUP')
+ DO 40 JGR=1,NGRP
+ KPMAC=LCMGIL(JPMAC,JGR)
+ CALL LCMLEN(KPMAC,'NTOT0',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)THEN
+ CALL LCMGET(KPMAC,'NTOT0',TOTAL(1,JGR))
+ ELSEIF(ILENGT.NE.0)THEN
+ CALL XABORT('@CREDRV: INVALID INPUT MACROLIB(1).')
+ ENDIF
+ CALL LCMLEN(KPMAC,'NUSIGF',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)CALL LCMGET(KPMAC,'NUSIGF',ZNUG(1,JGR))
+ CALL LCMLEN(KPMAC,'NFTOT',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)CALL LCMGET(KPMAC,'NFTOT',SNUGF(1,JGR))
+ CALL LCMLEN(KPMAC,'CHI',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)CALL LCMGET(KPMAC,'CHI',CHI(1,JGR))
+ CALL LCMLEN(KPMAC,'OVERV',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)CALL LCMGET(KPMAC,'OVERV',OVERV(1,JGR))
+ CALL LCMLEN(KPMAC,'DIFF',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)THEN
+ ILEAK=1
+ CALL LCMGET(KPMAC,'DIFF',DIFFX(1,JGR))
+ ENDIF
+ CALL LCMLEN(KPMAC,'DIFFX',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)THEN
+ ILEAK=2
+ CALL LCMGET(KPMAC,'DIFFX',DIFFX(1,JGR))
+ CALL LCMGET(KPMAC,'DIFFY',DIFFY(1,JGR))
+ CALL LCMGET(KPMAC,'DIFFZ',DIFFZ(1,JGR))
+ ENDIF
+ CALL LCMLEN(KPMAC,'H-FACTOR',ILENGT,ITYLCM)
+ IF(ILENGT.EQ.NMIX)CALL LCMGET(KPMAC,'H-FACTOR',H(1,JGR,1))
+ DO IL=1,NL
+ WRITE (CM,'(I2.2)') IL-1
+ CALL LCMLEN(KPMAC,'SCAT'//CM,ILENGT,ITYLCM)
+ IF(ILENGT.GT.NMIX*NL*NGRP*NGRP)THEN
+ CALL XABORT('@CREDRV: INVALID INPUT MACROLIB(2).')
+ ELSEIF(ILENGT.GT.0)THEN
+ CALL LCMGET(KPMAC,'SCAT'//CM,WORK)
+ CALL LCMGET(KPMAC,'NJJS'//CM,NJJ(1,IL,JGR))
+ CALL LCMGET(KPMAC,'IJJS'//CM,IJJ(1,IL,JGR))
+ IPOSDE=0
+ DO 25 IBM=1,NMIX
+ IJJ0=IJJ(IBM,IL,JGR)
+ DO 20 IGR=IJJ0,IJJ0-NJJ(IBM,IL,JGR)+1,-1
+ IPOSDE=IPOSDE+1
+ SCAT(IBM,IL,IGR,JGR)=WORK(IPOSDE)
+ 20 CONTINUE
+ 25 CONTINUE
+ ELSE
+ CALL XABORT('@CREDRV: OLD FORMAT OF THE MACROLIB.')
+ ENDIF
+ ENDDO
+ 40 CONTINUE
+ ENDIF
+*----
+* READ INPUT DATA
+*----
+ CALL CREXSI(IPMAP,NENTRY,HENTRY,KENTRY,NMIX,NGRP,NL,ILEAK,IMPX,
+ 1 TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,IJJ,NJJ,SCAT)
+*----
+* MACROLIB DATA STORAGE
+*----
+ JPMAC=LCMLID(IPMAC,'GROUP',NGRP)
+ DO 190 JGR=1,NGRP
+ KPMAC=LCMDIL(JPMAC,JGR)
+ CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,TOTAL(1,JGR))
+ CALL LCMPUT(KPMAC,'NUSIGF',NMIX,2,ZNUG(1,JGR))
+ CALL LCMPUT(KPMAC,'NFTOT',NMIX,2,SNUGF(1,JGR))
+ CALL LCMPUT(KPMAC,'CHI',NMIX,2,CHI(1,JGR))
+ CALL LCMPUT(KPMAC,'OVERV',NMIX,2,OVERV(1,JGR))
+ IF(ILEAK.EQ.1)THEN
+ CALL LCMPUT(KPMAC,'DIFF',NMIX,2,DIFFX(1,JGR))
+ ELSEIF(ILEAK.EQ.2)THEN
+ CALL LCMPUT(KPMAC,'DIFFX',NMIX,2,DIFFX(1,JGR))
+ CALL LCMPUT(KPMAC,'DIFFY',NMIX,2,DIFFY(1,JGR))
+ CALL LCMPUT(KPMAC,'DIFFZ',NMIX,2,DIFFZ(1,JGR))
+ ENDIF
+ CALL LCMPUT(KPMAC,'H-FACTOR',NMIX,2,H(1,JGR,1))
+ 190 CONTINUE
+*----
+* SCATTERING DATA
+*----
+ H(:NMIX,:NGRP,:NL)=0.0
+ DO 215 JGR=1,NGRP
+ KPMAC=LCMDIL(JPMAC,JGR)
+ DO 210 IL=1,NL
+ WRITE (CM,'(I2.2)') IL-1
+ IPOSDE=0
+ DO 205 IBM=1,NMIX
+ IPOS(IBM)=IPOSDE+1
+ DO 200 IGR=IJJ(IBM,IL,JGR),IJJ(IBM,IL,JGR)-NJJ(IBM,IL,JGR)+1,-1
+ IPOSDE=IPOSDE+1
+ WORK(IPOSDE)=SCAT(IBM,IL,IGR,JGR)
+ H(IBM,IGR,IL)=H(IBM,IGR,IL)+SCAT(IBM,IL,IGR,JGR)
+ 200 CONTINUE
+ 205 CONTINUE
+ CALL LCMPUT(KPMAC,'SCAT'//CM,IPOSDE,2,WORK)
+ CALL LCMPUT(KPMAC,'IPOS'//CM,NMIX,1,IPOS)
+ CALL LCMPUT(KPMAC,'NJJS'//CM,NMIX,1,NJJ(1,IL,JGR))
+ CALL LCMPUT(KPMAC,'IJJS'//CM,NMIX,1,IJJ(1,IL,JGR))
+ CALL LCMPUT(KPMAC,'SIGW'//CM,NMIX,2,SCAT(1,IL,JGR,JGR))
+ 210 CONTINUE
+ 215 CONTINUE
+ DO 225 IGR=1,NGRP
+ KPMAC=LCMDIL(JPMAC,IGR)
+ DO 220 IL=1,NL
+ WRITE (CM,'(I2.2)') IL-1
+ CALL LCMPUT(KPMAC,'SIGS'//CM,NMIX,2,H(1,IGR,IL))
+ IF(IMPX.GT.2)CALL LCMLIB(KPMAC)
+ 220 CONTINUE
+ 225 CONTINUE
+*
+ IF(IMPX.GT.1)CALL LCMLIB(IPMAC)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(H,SCAT,WORK,DIFFZ,DIFFY,DIFFX,OVERV,CHI,SNUGF,ZNUG,
+ 1 TOTAL)
+ DEALLOCATE(NJJ,IJJ,IPOS)
+ RETURN
+ END
diff --git a/Donjon/src/CREGET.f b/Donjon/src/CREGET.f new file mode 100644 index 0000000..974da1e --- /dev/null +++ b/Donjon/src/CREGET.f @@ -0,0 +1,135 @@ +*DECK CREGET
+ SUBROUTINE CREGET(IPMAP,NCH,NB,IBTYP,IMPX,BRN0,BRN1,FMIX,ZONEDP,
+ 1 IVARTY,VARVAL)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* recover the necessary information from the fuel-map object.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s): D. Sekki, A. Hebert
+*
+*Parameters: input
+* IPMAP pointer to the fuel-map information.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* IBTYP type of interpolation:
+* =0 not provided;
+* =1 time-average;
+* =2 instantaneous;
+* =3 derivative with respect to a single exit burnup.
+* IMPX printing index (=0 for no print).
+* IVARTY index of the exit burnup used to compute derivatives;
+* used if IBTYP=3.
+*
+*Parameters: output
+* 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.
+* VARVAL single exit burnup; used if IBTYP=3.
+* ZONEDP switch related to Chambon formula.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAP
+ INTEGER NCH,NB,IBTYP,IMPX,FMIX(NCH,NB),ZONEDP(NCH,NB),IVARTY
+ REAL BRN0(NCH,NB),BRN1(NCH,NB),VARVAL
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6,NSTATE=40)
+ INTEGER ISTATE(NSTATE)
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IZONE
+ REAL, ALLOCATABLE, DIMENSION(:) :: VARC
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(IZONE(NCH))
+*
+ FMIX(:NCH,:NB)=0
+ BRN0(:NCH,:NB)=0.0
+ BRN1(:NCH,:NB)=0.0
+ CALL LCMGET(IPMAP,'FLMIX',FMIX)
+ IF(IBTYP.EQ.0) THEN
+ CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE)
+ IBTYP=ISTATE(5)
+ ENDIF
+*----
+* TIME-AVERAGE
+*----
+ IF(IBTYP.EQ.1)THEN
+* LOW BURNUP LIMITS
+ CALL LCMLEN(IPMAP,'BURN-BEG',LENGT,ITYP)
+ IF(LENGT.EQ.0)CALL XABORT('@CREGET: MISSI'
+ 1 //'NG BURN-BEG VALUES IN FUEL MAP.')
+ CALL LCMGET(IPMAP,'BURN-BEG',BRN0)
+* UPPER BURNUP LIMITS
+ CALL LCMLEN(IPMAP,'BURN-END',LENGT,ITYP)
+ IF(LENGT.EQ.0)CALL XABORT('@CREGET: MISSI'
+ 1 //'NG BURN-END VALUES IN FUEL MAP.')
+ CALL LCMGET(IPMAP,'BURN-END',BRN1)
+ IF(IMPX.GT.0)WRITE(IOUT,1000)
+*----
+* INSTANTANEOUS
+*----
+ ELSEIF(IBTYP.EQ.2)THEN
+ CALL LCMLEN(IPMAP,'BURN-INST',LENGT,ITYP)
+ IF(LENGT.EQ.0)CALL XABORT('@CREGET: MISSI'
+ 1 //'NG BURN-INST VALUES IN FUEL MAP.')
+ CALL LCMGET(IPMAP,'BURN-INST',BRN0)
+ IF(IMPX.GT.0)WRITE(IOUT,1001)
+*----
+* SINGLE EXIT BURNUP
+*----
+ ELSEIF(IBTYP.EQ.3)THEN
+ IF(IVARTY.EQ.0)CALL XABORT('@CREGET: IVARTY NOT SET.')
+* LOW BURNUP LIMITS
+ CALL LCMLEN(IPMAP,'BURN-BEG',LENGT,ITYP)
+ IF(LENGT.EQ.0)CALL XABORT('@CREGET: MISSI'
+ 1 //'NG BRN0 VALUES IN FUEL MAP.')
+ CALL LCMGET(IPMAP,'BURN-BEG',BRN0)
+* UPPER BURNUP LIMITS
+ CALL LCMLEN(IPMAP,'BURN-END',LENGT,ITYP)
+ IF(LENGT.EQ.0)CALL XABORT('@CREGET: MISSI'
+ 1 //'NG BRN1 VALUES IN FUEL MAP.')
+ CALL LCMGET(IPMAP,'BURN-END',BRN1)
+ IF(IMPX.GT.0)WRITE(IOUT,1000)
+ CALL LCMGET(IPMAP,'B-ZONE',IZONE)
+ DO 35 ICH=1,NCH
+ DO 30 IB=1,NB
+ IF(IZONE(ICH).EQ.IVARTY)THEN
+ ZONEDP(ICH,IB)=1
+ ELSE
+ ZONEDP(ICH,IB)=0
+ ENDIF
+ 30 CONTINUE
+ 35 CONTINUE
+ CALL LCMLEN(IPMAP,'BURN-AVG',ILONG,ITYP)
+ IF (ILONG.EQ.0)CALL XABORT('@CREGET: NO SAVED VA'
+ 1 //'LUES FOR THIS TYPE OF VARIABLE IN FUEL MAP')
+ ALLOCATE(VARC(ILONG))
+ CALL LCMGET(IPMAP,'BURN-AVG',VARC)
+ VARVAL=VARC(IVARTY)
+ DEALLOCATE(VARC)
+ ELSE
+ CALL XABORT('@CREGET: INVALID OPTION IBTYP.')
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(IZONE)
+ RETURN
+*
+ 1000 FORMAT(/1X,'** PERFORMING THE TIME-AVERAGE',
+ 1 1X,'INTEGRATION OVER THE FUEL LATTICE **'/)
+ 1001 FORMAT(/1X,'** PERFORMING THE INSTANTANEOU',
+ 1'S INTERPOLATION OVER THE FUEL LATTICE **'/)
+ END
diff --git a/Donjon/src/CREINT.f b/Donjon/src/CREINT.f new file mode 100644 index 0000000..76d3d43 --- /dev/null +++ b/Donjon/src/CREINT.f @@ -0,0 +1,136 @@ +*DECK CREINT + SUBROUTINE CREINT(IPCPO,NISO,DERIV,NBURN,KBURN,BURN0,BURN1,NGRP, + 1 NL,IMPX,HISO,ITY,CONC,ILEAK,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX, + 2 DIFFY,DIFFZ,H,SCAT,FLUX,UPS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and interpolate l_compo information according to burnup and +* extracted isotope density. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPCPO pointer to l_compo information. +* NISO 1+number of extracted isotopes. +* DERIV =.true.: derivative of macrolib info is computed with +* respect to burn1. +* UPS =.true.: no upscatering cross sections will be stored. +* NBURN number of tabulated burnup steps. +* KBURN =0: no burnup parameters; =1: use mw day/tonne of initial +* heavy elements). +* BURN0 user defined initial burnup. +* BURN1 user defined final burnup: +* if burn0=burn1, a simple interpolation is performed; +* if burn0<burn1, a time-average calculation is performed. +* NGRP number of energy groups. +* NL number of legendre orders (=1 for isotropic scattering). +* IMPX print parameter (=0 for no print). +* HISO hollerith name information for extracted isotopes. +* ITY =0: do not process the isotope; =1: use number density +* stored in conc(i); =2: use number density stored in compo. +* CONC user defined number density. +* ILEAK +* +*Parameters: output +* TOTAL total macroscopic x-sections. +* ZNUG nu*fission macroscopic x-sections. +* SNUGF fission macroscopic x-sections. +* CHI fission spectrum. +* OVERV reciprocal neutron velocities. +* DIFFX x-directed diffusion coefficients. +* DIFFY y-directed diffusion coefficients. +* DIFFZ z-directed diffusion coefficients. +* H h-factors (kappa*fission macroscopic x-sections). +* SCAT scattering macroscopic x-sections. +* FLUX integrated fluxes. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPCPO + INTEGER NISO,NGRP,IMPX,NBURN,KBURN,HISO(3*NISO),ITY(NISO),ILEAK + REAL CONC(NISO),TOTAL(NGRP),ZNUG(NGRP),SNUGF(NGRP),CHI(NGRP), + 1 OVERV(NGRP),DIFFX(NGRP),DIFFY(NGRP),DIFFZ(NGRP),H(NGRP), + 2 SCAT(NL,NGRP,NGRP),FLUX(NGRP),BURN0,BURN1 + LOGICAL DERIV,UPS +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT12*12 + REAL, ALLOCATABLE, DIMENSION(:) :: BURNUP,DENSIT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(BURNUP(NBURN),DENSIT(NISO)) +*---- +* CASE WITH NO BURNUP +*---- + IF(KBURN.EQ.0)THEN + CALL LCMSIX(IPCPO,'BURN 1',1) + CALL LCMGET(IPCPO,'ISOTOPESDENS',DENSIT) + IF(DENSIT(1).NE.1.)CALL XABORT('@CREINT: DENSIT(1).NE.1.') + DO I=2,NISO + IF(ITY(I).EQ.0)THEN + DENSIT(I)=0. + ELSEIF(ITY(I).EQ.1)THEN + DENSIT(I)=CONC(I) + ELSEIF(ITY(I).NE.2)THEN + CALL XABORT('@CREINT: INVALID VALUE OF ITY.') + ENDIF + ENDDO + CALL CREMAC(IPCPO,NISO,NGRP,NL,IMPX,HISO,DENSIT,ILEAK,TOTAL, + 1 ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,SCAT,FLUX,UPS) + CALL LCMSIX(IPCPO,' ',2) + ELSE +*---- +* CASE WITH BURNUP +*---- + CALL LCMGET(IPCPO,'BURNUP',BURNUP) + TEXT12=' ' + IF(BURN0.EQ.BURN1)THEN + DO I=1,NBURN + IF(BURN0.EQ.BURNUP(I))THEN + WRITE(TEXT12,'(4HBURN,4X,I4)') I + GOTO 30 + ENDIF + ENDDO + ENDIF + 30 IF((TEXT12.NE.' ').AND.(.NOT.DERIV))THEN +* BURN0=BURN1 IS A TABULATION POINT. + CALL LCMSIX(IPCPO,TEXT12,1) + CALL LCMGET(IPCPO,'ISOTOPESDENS',DENSIT) + IF(DENSIT(1).NE.1.)CALL XABORT('@CREINT: DENSIT(1).NE.1.') + DO I=2,NISO + IF(ITY(I).EQ.0)THEN + DENSIT(I)=0. + ELSEIF(ITY(I).EQ.1)THEN + DENSIT(I)=CONC(I) + ELSEIF(ITY(I).NE.2)THEN + CALL XABORT('@CREINT: INVALID VALUE OF ITY.') + ENDIF + ENDDO + CALL CREMAC(IPCPO,NISO,NGRP,NL,IMPX,HISO,DENSIT,ILEAK,TOTAL, + 1 ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,SCAT,FLUX,UPS) + CALL LCMSIX(IPCPO,' ',2) + ELSE +* INTERPOLATION IS REQUIRED. + CALL CREBUR(IPCPO,NISO,NGRP,NL,IMPX,HISO,DERIV,NBURN,BURN0, + 1 BURN1,BURNUP,ITY,CONC,ILEAK,TOTAL,ZNUG,SNUGF,CHI,OVERV, + 2 DIFFX,DIFFY,DIFFZ,H,SCAT,FLUX,UPS) + ENDIF + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DENSIT,BURNUP) + RETURN + END diff --git a/Donjon/src/CREITP.f b/Donjon/src/CREITP.f new file mode 100644 index 0000000..95200e4 --- /dev/null +++ b/Donjon/src/CREITP.f @@ -0,0 +1,94 @@ +*DECK CREITP
+ SUBROUTINE CREITP(NGRP,NL,NBURN,TERP,TOTAL,ZNUG,SNUGF,CHI,
+ 1 OVERV,DIFFX,DIFFY,DIFFZ,H,SCAT,FLUX,ZTOTAL,ZZNUG,ZNUGF,
+ 2 ZCHI,ZOVERV,ZDIFFX,ZDIFFY,ZDIFFZ,ZH,ZSCAT,ZFLUX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Interpolate burnup dependent table for a given burnup value or
+* time-average or derivatives.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert
+*
+*Parameters: input
+* NGRP number of energy groups.
+* NL number of legendre orders (=1 for isotropic scattering).
+* NBURN number of tabulated burnup steps.
+* TERP interpolation factors.
+* ZTOTAL burnup dependent total macroscopic x-sections
+* ZZNUG burnup dependent nu*fission macroscopic x-sections.
+* ZNUGF burnup dependent fission macroscopic x-sections.
+* ZCHI burnup dependent fission spectrum.
+* ZOVERV burnup dependent reciprocal neutron velocities.
+* ZDIFFX burnup dependent x-directed diffusion coefficients.
+* ZDIFFY burnup dependent y-directed diffusion coefficients.
+* ZDIFFZ burnup dependent z-directed diffusion coefficients.
+* ZH burnup dependent h-factors.
+* ZSCAT burnup dependent scattering macroscopic x-sections.
+* ZFLUX burnup dependent integrated flux.
+*
+*Parameters: output
+* TOTAL total macroscopic x-sections.
+* ZNUG nu*fission macroscopic x-sections.
+* SNUGF fission macroscopic x-sections.
+* CHI fission spectrum.
+* OVERV reciprocal neutron velocities.
+* DIFFX x-directed diffusion coefficients.
+* DIFFY y-directed diffusion coefficients.
+* DIFFZ z-directed diffusion coefficients.
+* H h-factors (kappa*fission macroscopic x-sections).
+* SCAT scattering macroscopic x-sections.
+* FLUX integrated flux.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NGRP,NL,NBURN
+ REAL TERP(NBURN),TOTAL(NGRP),ZNUG(NGRP),CHI(NGRP),OVERV(NGRP),
+ 1 DIFFX(NGRP),DIFFY(NGRP),DIFFZ(NGRP),H(NGRP),SCAT(NL,NGRP,NGRP),
+ 2 SNUGF(NGRP),FLUX(NGRP),ZTOTAL(NBURN,NGRP),ZZNUG(NBURN,NGRP),
+ 3 ZCHI(NBURN,NGRP),ZOVERV(NBURN,NGRP),ZDIFFX(NBURN,NGRP),
+ 4 ZDIFFY(NBURN,NGRP),ZDIFFZ(NBURN,NGRP),ZH(NBURN,NGRP),
+ 5 ZSCAT(NBURN,NL,NGRP,NGRP),ZFLUX(NBURN,NGRP),ZNUGF(NBURN,NGRP)
+*----
+* PERFORM INTERPOLATION OR TIME AVERAGING
+*----
+ TOTAL(:NGRP)=0.0
+ ZNUG(:NGRP)=0.0
+ CHI(:NGRP)=0.0
+ OVERV(:NGRP)=0.0
+ DIFFX(:NGRP)=0.0
+ DIFFY(:NGRP)=0.0
+ DIFFZ(:NGRP)=0.0
+ H(:NGRP)=0.0
+ SCAT(:NL,:NGRP,:NGRP)=0.0
+ DO 100 IBURN=1,NBURN
+ WEIGHT=TERP(IBURN)
+ IF(WEIGHT.EQ.0.0) GO TO 100
+ DO 92 JGR=1,NGRP
+ TOTAL(JGR)=TOTAL(JGR)+WEIGHT*ZTOTAL(IBURN,JGR)
+ ZNUG(JGR)=ZNUG(JGR)+WEIGHT*ZZNUG(IBURN,JGR)
+ SNUGF(JGR)=SNUGF(JGR)+WEIGHT*ZNUGF(IBURN,JGR)
+ CHI(JGR)=CHI(JGR)+WEIGHT*ZCHI(IBURN,JGR)
+ OVERV(JGR)=OVERV(JGR)+WEIGHT*ZOVERV(IBURN,JGR)
+ DIFFX(JGR)=DIFFX(JGR)+WEIGHT*ZDIFFX(IBURN,JGR)
+ DIFFY(JGR)=DIFFY(JGR)+WEIGHT*ZDIFFY(IBURN,JGR)
+ DIFFZ(JGR)=DIFFZ(JGR)+WEIGHT*ZDIFFZ(IBURN,JGR)
+ H(JGR)=H(JGR)+WEIGHT*ZH(IBURN,JGR)
+ FLUX(JGR)=FLUX(JGR)+WEIGHT*ZFLUX(IBURN,JGR)
+ DO 91 IGR=1,NGRP
+ DO 90 IL=1,NL
+ SCAT(IL,IGR,JGR)=SCAT(IL,IGR,JGR)+WEIGHT*ZSCAT(IBURN,IL,IGR,JGR)
+ 90 CONTINUE
+ 91 CONTINUE
+ 92 CONTINUE
+ 100 CONTINUE
+ RETURN
+ END
diff --git a/Donjon/src/CREMAC.f b/Donjon/src/CREMAC.f new file mode 100644 index 0000000..6f063db --- /dev/null +++ b/Donjon/src/CREMAC.f @@ -0,0 +1,327 @@ +*DECK CREMAC + SUBROUTINE CREMAC(IPCPO,NISO,NGRP,NL,IMPX,HISO,DENSIT,ILEAK,TOTAL, + 1 ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,SCAT,FLUX,UPS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Add the microscopic x-sections of the extracted isotopes to the +* macroscopic residual. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Update(s): +* E. Varin (2010/01/26) +* +*Parameters: input +* IPCPO pointer to l_compo information. +* NISO 1+number of extracted isotopes. +* NGRP number of energy groups. +* NL number of legendre orders (=1 for isotropic scattering). +* IMPX print parameter (=0 for no print). +* HISO hollerith name information for extracted isotopes. +* DENSIT number densities. +* UPS =.true.: no upscatering cross sections will be stored. +* +*Parameters: output +* ILEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic). +* TOTAL total macroscopic x-sections. +* ZNUG nu*fission macroscopic x-sections. +* SNUGF fission macroscopic x-sections. +* CHI fission spectrum. +* OVERV reciprocal neutron velocities. +* DIFFX x-directed diffusion coefficients. +* DIFFY y-directed diffusion coefficients. +* DIFFZ z-directed diffusion coefficients. +* H h-factors (kappa*fission macroscopic x-sections). +* SCAT scattering macroscopic x-sections. +* FLUX integrated fluxes. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPCPO + INTEGER NISO,NGRP,NL,IMPX,ILEAK,HISO(3*NISO) + REAL DENSIT(NISO),TOTAL(NGRP),ZNUG(NGRP),SNUGF(NGRP),CHI(NGRP), + 1 OVERV(NGRP),DIFFX(NGRP),DIFFY(NGRP),DIFFZ(NGRP),H(NGRP), + 2 SCAT(NL,NGRP,NGRP),FLUX(NGRP) + LOGICAL UPS +*---- +* LOCAL VARIABLES +*---- + CHARACTER HMICRO*12,CM*2 + LOGICAL LFISS + DOUBLE PRECISION XDRCST,EVJ +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,INDXS + REAL, ALLOCATABLE, DIMENSION(:) :: WORK2,ENGFIS + REAL, ALLOCATABLE, DIMENSION(:,:) :: WORK1 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IJJ(NGRP),NJJ(NGRP),WORK1(NGRP,3),WORK2(NGRP*NGRP), + 1 INDXS(21+NL),ENGFIS(NISO)) +*---- +* RECOVER MACROSCOPIC RESIDUAL OF VECTORIAL X-SECTIONS +*---- + EVJ=XDRCST('eV','J') + DO 10 IGR=1,NGRP + TOTAL(IGR)=0.0 + DIFFX(IGR)=0.0 + DIFFY(IGR)=0.0 + DIFFZ(IGR)=0.0 + ZNUG(IGR)=0.0 + SNUGF(IGR)=0.0 + CHI(IGR)=0.0 + 10 CONTINUE + CALL LCMGET(IPCPO,'FLUX-INTG',FLUX) + CALL LCMGET(IPCPO,'OVERV',OVERV) + CALL LCMGET(IPCPO,'ISOTOPES-EFJ',ENGFIS) + CALL LCMSIX(IPCPO,'MACR',1) + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + IF(INDXS(1).EQ.1)CALL LCMGET(IPCPO,'TOTAL',TOTAL) + ILEAK=0 + IF(INDXS(17).EQ.1)THEN + ILEAK=1 + CALL LCMGET(IPCPO,'STRD',DIFFX) + ELSE IF(INDXS(18).EQ.1)THEN + ILEAK=2 + CALL LCMGET(IPCPO,'STRD X',DIFFX) + CALL LCMGET(IPCPO,'STRD Y',DIFFY) + CALL LCMGET(IPCPO,'STRD Z',DIFFZ) + ENDIF + IF(INDXS(3).EQ.1)THEN + CALL LCMGET(IPCPO,'NUSIGF',ZNUG) + CALL LCMGET(IPCPO,'NFTOT',SNUGF) + CALL LCMGET(IPCPO,'CHI',CHI) + ENDIF + DO 11 IGR=1,NGRP + H(IGR)=ENGFIS(1)*SNUGF(IGR)/REAL(EVJ) + 11 CONTINUE + CALL LCMSIX(IPCPO,' ',2) +*---- +* RECOVER MICROSCOPIC CONTRIBUTIONS OF VECTORIAL X-SECTIONS +*---- + LFISS=.FALSE. + DO 40 ISO=2,NISO + IF(DENSIT(ISO).EQ.0.)GOTO 40 + WRITE(HMICRO,'(3A4)') (HISO((ISO-1)*3+I),I=1,3) + CALL LCMLEN(IPCPO,HMICRO,ILENG,ITYLCM) + IF(ILENG.EQ.0)GOTO 40 + IF(IMPX.GT.1)WRITE(6,'(/29H CREMAC: PROCESSING ISOTOPE '',A12, + 1 16H'' WITH DENSITY =,1P,E13.5,2H .)') HMICRO,DENSIT(ISO) + CALL LCMSIX(IPCPO,HMICRO,1) + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + IF(INDXS(1).EQ.1)THEN + CALL LCMGET(IPCPO,'TOTAL',WORK1(1,1)) + DO 20 IGR=1,NGRP + TOTAL(IGR)=TOTAL(IGR)+DENSIT(ISO)*WORK1(IGR,1) + 20 CONTINUE + ENDIF + IF(INDXS(17).EQ.1)THEN + CALL LCMGET(IPCPO,'STRD',WORK1(1,1)) + DO 21 IGR=1,NGRP + DIFFX(IGR)=DIFFX(IGR)+DENSIT(ISO)*WORK1(IGR,1) + 21 CONTINUE + ELSE IF(INDXS(18).EQ.1)THEN + CALL LCMGET(IPCPO,'STRD X',WORK1(1,1)) + CALL LCMGET(IPCPO,'STRD Y',WORK1(1,2)) + CALL LCMGET(IPCPO,'STRD Z',WORK1(1,3)) + DO 22 IGR=1,NGRP + DIFFX(IGR)=DIFFX(IGR)+DENSIT(ISO)*WORK1(IGR,1) + DIFFY(IGR)=DIFFY(IGR)+DENSIT(ISO)*WORK1(IGR,2) + DIFFZ(IGR)=DIFFZ(IGR)+DENSIT(ISO)*WORK1(IGR,3) + 22 CONTINUE + ENDIF + IF(INDXS(3).EQ.1)THEN + CALL LCMGET(IPCPO,'NUSIGF',WORK1(1,1)) + CALL LCMGET(IPCPO,'NFTOT',WORK1(1,2)) + CALL LCMGET(IPCPO,'CHI',WORK1(1,3)) + DO 30 IGR=1,NGRP + LFISS=LFISS.OR.(CHI(IGR).NE.WORK1(IGR,3)) + ZNUG(IGR)=ZNUG(IGR)+DENSIT(ISO)*WORK1(IGR,1) + SNUGF(IGR)=SNUGF(IGR)+DENSIT(ISO)*WORK1(IGR,2) + H(IGR)=H(IGR)+DENSIT(ISO)*WORK1(IGR,2)*ENGFIS(ISO)/REAL(EVJ) + 30 CONTINUE + ENDIF + CALL LCMSIX(IPCPO,' ',2) + 40 CONTINUE +*---- +* COMPUTE AN AVERAGE FISSION SPECTRUM +*---- + IF(LFISS)THEN + CALL LCMGET(IPCPO,'FLUX-INTG',WORK1(1,1)) + CALL LCMSIX(IPCPO,'MACR',1) + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + IF(INDXS(3).EQ.1)THEN + CALL LCMGET(IPCPO,'NUSIGF',WORK1(1,2)) + CALL LCMGET(IPCPO,'CHI',WORK1(1,3)) + DO 55 JGR=1,NGRP + DO 50 IGR=1,NGRP + SCAT(1,IGR,JGR)=WORK1(IGR,1)*WORK1(IGR,2)*WORK1(JGR,3) + 50 CONTINUE + 55 CONTINUE + ELSE + DO 65 JGR=1,NGRP + DO 60 IGR=1,NGRP + SCAT(1,IGR,JGR)=0. + 60 CONTINUE + 65 CONTINUE + ENDIF + CALL LCMSIX(IPCPO,' ',2) + DO 80 ISO=2,NISO + IF(DENSIT(ISO).EQ.0.)GOTO 80 + WRITE(HMICRO,'(3A4)') (HISO((ISO-1)*3+I),I=1,3) + CALL LCMLEN(IPCPO,HMICRO,ILENG,ITYLCM) + IF(ILENG.EQ.0)GOTO 80 + CALL LCMSIX(IPCPO,HMICRO,1) + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + IF(INDXS(3).EQ.1)THEN + CALL LCMGET(IPCPO,'NUSIGF',WORK1(1,2)) + CALL LCMGET(IPCPO,'CHI',WORK1(1,3)) + DO 75 JGR=1,NGRP + DO 70 IGR=1,NGRP + SCAT(1,IGR,JGR)=SCAT(1,IGR,JGR)+DENSIT(ISO)* + 1 WORK1(IGR,1)*WORK1(IGR,2)*WORK1(JGR,3) + 70 CONTINUE + 75 CONTINUE + ENDIF + CALL LCMSIX(IPCPO,' ',2) + 80 CONTINUE + SSUM=0. + DO 95 JGR=1,NGRP + CHI(JGR)=0. + DO 90 IGR=1,NGRP + SSUM=SSUM+SCAT(1,IGR,JGR) + CHI(JGR)=CHI(JGR)+SCAT(1,IGR,JGR) + 90 CONTINUE + 95 CONTINUE + DO 100 JGR=1,NGRP + CHI(JGR)=CHI(JGR)/SSUM + 100 CONTINUE + ENDIF +*---- +* RECOVER MACROSCOPIC RESIDUAL OF SCATTERING X-SECTIONS +*---- + CALL LCMSIX(IPCPO,'MACR',1) + CALL LCMLEN(IPCPO,'SCAT-SAVED',ILONG,ITYP) + IF(ILONG.EQ.0)THEN + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + ELSE + CALL LCMGET(IPCPO,'SCAT-SAVED',INDXS(21)) + ENDIF + DO 130 IL=1,NL + DO 115 JGR=1,NGRP + DO 110 IGR=1,NGRP + SCAT(IL,IGR,JGR)=0. + 110 CONTINUE + 115 CONTINUE + WRITE (CM,'(I2.2)') IL-1 + IF(INDXS(20+IL).EQ.1)THEN +* OLD COMPO DEFINITION + CALL LCMLEN(IPCPO,'SCAT'//CM,ILONG,ITYP) + IF(ILONG.EQ.0)THEN + WRITE (CM,'(I2)') IL-1 + CALL LCMGET(IPCPO,'SCAT'//CM,WORK2) + CALL LCMGET(IPCPO,'NJJ '//CM,NJJ) + CALL LCMGET(IPCPO,'IJJ '//CM,IJJ) + ELSE + CALL LCMGET(IPCPO,'SCAT'//CM,WORK2) + CALL LCMGET(IPCPO,'NJJS'//CM,NJJ) + CALL LCMGET(IPCPO,'IJJS'//CM,IJJ) + ENDIF + IGAR=0 + DO 125 JGR=1,NGRP + DO 120 IGR=IJJ(JGR),IJJ(JGR)-NJJ(JGR)+1,-1 + IGAR=IGAR+1 + SCAT(IL,IGR,JGR)=WORK2(IGAR) + 120 CONTINUE + 125 CONTINUE + ENDIF + 130 CONTINUE + CALL LCMSIX(IPCPO,' ',2) +*---- +* RECOVER MICROSCOPIC CONTRIBUTIONS OF SCATTERING X-SECTIONS +*---- + DO 160 ISO=2,NISO + IF(DENSIT(ISO).EQ.0.)GOTO 160 + WRITE(HMICRO,'(3A4)') (HISO((ISO-1)*3+I),I=1,3) + CALL LCMLEN(IPCPO,HMICRO,ILENG,ITYLCM) + IF(ILENG.EQ.0)GOTO 160 + CALL LCMSIX(IPCPO,HMICRO,1) + CALL LCMLEN(IPCPO,'SCAT-SAVED',ILONG,ITYP) +*EV + IF(ILONG.EQ.0)THEN + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + ELSE + CALL LCMGET(IPCPO,'SCAT-SAVED',INDXS(21)) + ENDIF +*EV + DO 150 IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + IF(INDXS(20+IL).EQ.1)THEN +* OLD COMPO DEFINITION + CALL LCMLEN(IPCPO,'SCAT'//CM,ILONG,ITYP) + IF(ILONG.EQ.0)THEN + WRITE (CM,'(I2)') IL-1 + CALL LCMGET(IPCPO,'SCAT'//CM,WORK2) + CALL LCMGET(IPCPO,'NJJ '//CM,NJJ) + CALL LCMGET(IPCPO,'IJJ '//CM,IJJ) + ELSE + CALL LCMGET(IPCPO,'SCAT'//CM,WORK2) + CALL LCMGET(IPCPO,'NJJS'//CM,NJJ) + CALL LCMGET(IPCPO,'IJJS'//CM,IJJ) + ENDIF + IGAR=0 + DO 145 JGR=1,NGRP + DO 140 IGR=IJJ(JGR),IJJ(JGR)-NJJ(JGR)+1,-1 + IGAR=IGAR+1 + SCAT(IL,IGR,JGR)=SCAT(IL,IGR,JGR) + 1 +DENSIT(ISO)*WORK2(IGAR) + 140 CONTINUE + 145 CONTINUE + ENDIF + 150 CONTINUE + CALL LCMSIX(IPCPO,' ',2) + 160 CONTINUE +*---- +* COMPUTE DIFFUSION COEFFICIENTS FROM STRD X-SECTIONS +*---- + CALL LCMSIX(IPCPO,'MACR',1) + CALL LCMGET(IPCPO,'XS-SAVED',INDXS) + CALL LCMSIX(IPCPO,' ',2) + IF(INDXS(17).EQ.1)THEN + DO 170 IGR=1,NGRP + DIFFX(IGR)=1.0/(3.0*DIFFX(IGR)) + 170 CONTINUE + ELSE IF(INDXS(18).EQ.1)THEN + DO 180 IGR=1,NGRP + DIFFX(IGR)=1.0/(3.0*DIFFX(IGR)) + DIFFY(IGR)=1.0/(3.0*DIFFY(IGR)) + DIFFZ(IGR)=1.0/(3.0*DIFFZ(IGR)) + 180 CONTINUE + ENDIF +*---- +* COMPUTE TOTAL CROSS SECTION FOR UPSCATERING CORRECTION +*---- + IF((UPS).AND.(NGRP.EQ.2))THEN + DO 200 IL=1,NL + TOTAL(2)=TOTAL(2)-SCAT(IL,2,1) + SCAT(IL,2,1)=0. + 200 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ENGFIS,INDXS,WORK2,WORK1,NJJ,IJJ) + RETURN + END diff --git a/Donjon/src/CRERGR.f b/Donjon/src/CRERGR.f new file mode 100644 index 0000000..0e12c37 --- /dev/null +++ b/Donjon/src/CRERGR.f @@ -0,0 +1,261 @@ +*DECK CRERGR
+ SUBROUTINE CRERGR(IPCPO,IPMAP,NISO,NGRP,NMIXT,NL,IBM,IMPX,IBTYP,
+ 1 DERIV,UPS,NBURN,BURNUP,ILEAK,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,
+ 2 DIFFY,DIFFZ,H,SCAT,IJJ,NJJ,HISO,ITY,CONC,FMIX,BRN0,BRN1,NCH,NB,
+ 3 IVARTY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Perform interpolation of fuel properties over the fuel lattice.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert, D. Sekki
+*
+*Parameters: input
+* IPCPO pointer to L_COMPO information.
+* IPMAP pointer to L_MAP information.
+* NISO 1+number of extracted isotopes.
+* NGRP number of energy groups.
+* NMIXT number of material mixtures in the fuel-map macrolib.
+* NL number of legendre orders (=1 for isotropic scattering).
+* IBM mixture number to be treat.
+* IMPX printing index (=0 for no print).
+* IBTYP type of interpolation: =1 time-average; =2 instantaneous;
+* derivative with respect to a single exit burnup.
+* DERIV =.true.: derivative of macrolib info is computed with
+* respect to burn1.
+* UPS =.true.: no upscatering cross sections will be stored.
+* NBURN number of tabulated burnup steps.
+* BURNUP burnup tabulated values from compo file.
+* HISO hollerith name information for extracted isotopes.
+* ITY =0: do not process the isotope; =1: use number density
+* stored in conc(i); =2: use number density stored in compo.
+* CONC user defined number density.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* 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.
+* IVARTY index of the exit burnup used to compute derivatives. Used
+* if IBTYP=3.
+*
+*Parameters: output
+* ILEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic).
+* TOTAL total macroscopic x-sections.
+* ZNUG nu*fission macroscopic x-sections.
+* SNUGF fission macroscopic x-sections.
+* CHI fission spectrum.
+* OVERV reciprocal neutron velocities.
+* DIFFX x-directed diffusion coefficients.
+* DIFFY y-directed diffusion coefficients.
+* DIFFZ z-directed diffusion coefficients.
+* H h-factors (kappa*fission macroscopic x-sections).
+* SCAT scattering macroscopic x-sections.
+*
+*Parameters:
+* IJJ
+* NJJ
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPCPO,IPMAP
+ INTEGER NISO,IBTYP,IBM,NMIXT,NBURN,NGRP,NL,IMPX,NCH,NB,ILEAK,
+ 1 IJJ(NMIXT,NL,NGRP),NJJ(NMIXT,NL,NGRP),FMIX(NCH*NB),
+ 2 HISO(3*NISO),ITY(NISO),IVARTY
+ REAL CONC(NISO),TOTAL(NMIXT,NGRP),BURNUP(NBURN),SNUGF(NMIXT,NGRP),
+ 1 CHI(NMIXT,NGRP),OVERV(NMIXT,NGRP),DIFFX(NMIXT,NGRP),
+ 2 DIFFY(NMIXT,NGRP),DIFFZ(NMIXT,NGRP),BRN0(NCH*NB),
+ 3 BRN1(NCH*NB),H(NMIXT,NGRP),SCAT(NMIXT,NL,NGRP,NGRP),
+ 4 ZNUG(NMIXT,NGRP)
+ LOGICAL DERIV,UPS
+*----
+* LOCAL VARIABLES
+*----
+ LOGICAL LCUBIC
+ PARAMETER(LCUBIC=.TRUE.)
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ZONEDP
+ REAL, ALLOCATABLE, DIMENSION(:) :: TERP,TERPW
+ REAL, ALLOCATABLE, DIMENSION(:) :: YTOTAL,YZNUG,YNUGF,YCHI,YOVERV,
+ 1 YDIFX,YDIFY,YDIFZ,YH,YSCAT,YFLUX
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTOTAL,ZZNUG,ZNUGF,ZCHI,
+ 1 ZOVERV,ZDIFX,ZDIFY,ZDIFZ,ZH,ZSCAT,ZFLUX
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(TERP(NBURN),ZONEDP(NCH,NB),TERPW(NBURN))
+*
+ BURNUP(:NBURN)=0.0
+ CALL LCMGET(IPCPO,'BURNUP',BURNUP)
+*----
+* FUEL-MAP INFORMATION
+*----
+ CALL CREGET(IPMAP,NCH,NB,IBTYP,IMPX,BRN0,BRN1,FMIX,ZONEDP,
+ 1 IVARTY,VARVAL)
+*----
+* CREATE BURNUP-DEPENDENT TABLE
+*----
+ ALLOCATE(YTOTAL(NGRP),YZNUG(NGRP),YNUGF(NGRP),YCHI(NGRP),
+ 1 YOVERV(NGRP),YDIFX(NGRP),YDIFY(NGRP),YDIFZ(NGRP),YH(NGRP),
+ 2 YSCAT(NL*NGRP*NGRP),YFLUX(NGRP))
+*
+ YTOTAL(:NGRP)=0.0
+ YZNUG(:NGRP)=0.0
+ YNUGF(:NGRP)=0.0
+ YCHI(:NGRP)=0.0
+ YOVERV(:NGRP)=0.0
+ YDIFX(:NGRP)=0.0
+ YDIFY(:NGRP)=0.0
+ YDIFZ(:NGRP)=0.0
+ YH(:NGRP)=0.0
+ YSCAT(:NL*NGRP*NGRP)=0.0
+ YFLUX(:NGRP)=0.0
+*
+ ALLOCATE(ZTOTAL(NGRP,NBURN),ZZNUG(NGRP,NBURN),ZNUGF(NGRP,NBURN),
+ 1 ZCHI(NGRP,NBURN),ZOVERV(NGRP,NBURN),ZDIFX(NGRP,NBURN),
+ 2 ZDIFY(NGRP,NBURN),ZDIFZ(NGRP,NBURN),ZH(NGRP,NBURN),
+ 3 ZSCAT(NL*NGRP*NGRP,NBURN),ZFLUX(NGRP,NBURN))
+*
+ ZTOTAL(:NGRP,:NBURN)=0.0
+ ZZNUG(:NGRP,:NBURN)=0.0
+ ZNUGF(:NGRP,:NBURN)=0.0
+ ZCHI(:NGRP,:NBURN)=0.0
+ ZOVERV(:NGRP,:NBURN)=0.0
+ ZDIFX(:NGRP,:NBURN)=0.0
+ ZDIFY(:NGRP,:NBURN)=0.0
+ ZDIFZ(:NGRP,:NBURN)=0.0
+ ZH(:NGRP,:NBURN)=0.0
+ ZSCAT(:NL*NGRP*NGRP,:NBURN)=0.0
+ ZFLUX(:NGRP,:NBURN)=0.0
+*
+ CALL CRETAB(IPCPO,NISO,NGRP,NL,IMPX,HISO,NBURN,ITY,CONC,ILEAK,
+ 1 ZTOTAL,ZZNUG,ZNUGF,ZCHI,ZOVERV,ZDIFX,ZDIFY,ZDIFZ,ZH,ZSCAT,ZFLUX,
+ 2 UPS)
+*----
+* PERFORM INTERPOLATION
+*----
+ DO 105 ICH=1,NCH
+ DO 100 J=1,NB
+ IB=(J-1)*NCH+ICH
+ IF(FMIX(IB).EQ.IBM)THEN
+ IF(IBTYP.EQ.1)THEN
+* TIME-AVERAGE
+ BURN0=BRN0(IB)
+ BURN1=BRN1(IB)
+ IF(BURN0.GE.BURN1) CALL XABORT('@CRERGR: INVALID BURNUP LIMI'
+ 1 //'TS(1).')
+ CALL ALTERI(LCUBIC,NBURN,BURNUP,BURN0,BURN1,TERP)
+ DO 20 I=1,NBURN
+ TERP(I)=TERP(I)/(BURN1-BURN0)
+ 20 CONTINUE
+ ELSEIF(IBTYP.EQ.2)THEN
+* INSTANTANEOUS
+ BURN0=BRN0(IB)
+ BURN1=BURN0
+ IF(NBURN.EQ.1) THEN
+ TERP(1)=1.0
+ ELSE
+ CALL ALTERP(LCUBIC,NBURN,BURNUP,BURN0,DERIV,TERP)
+ ENDIF
+ ELSEIF(IBTYP.EQ.3)THEN
+* DERIVATIVE WITH RESPECT TO A SINGLE EXIT BURNUP. USE EQ.(3.3)
+* OF RICHARD CHAMBON'S THESIS.
+ IF(ZONEDP(ICH,J).NE.0) THEN
+ BURN0=BRN0(IB)
+ BURN1=BRN1(IB)
+ IF(BURN0.GE.BURN1) CALL XABORT('@CRERGR: INVALID BURNUP LI'
+ 1 //'MITS(2).')
+ CALL ALTERI(LCUBIC,NBURN,BURNUP,BURN0,BURN1,TERPW)
+ DO 30 I=1,NBURN
+ TERP(I)=-TERPW(I)
+ 30 CONTINUE
+ CALL ALTERP(LCUBIC,NBURN,BURNUP,BURN0,.FALSE.,TERPW)
+ DO 40 I=1,NBURN
+ TERP(I)=TERP(I)-TERPW(I)*BURN0
+ 40 CONTINUE
+ CALL ALTERP(LCUBIC,NBURN,BURNUP,BURN1,.FALSE.,TERPW)
+ DO 50 I=1,NBURN
+ TERP(I)=(TERP(I)+TERPW(I)*BURN1)/(VARVAL*(BURN1-BURN0))
+ 50 CONTINUE
+ ELSE
+ TERP(:NBURN)=0.0
+ ENDIF
+ ENDIF
+ IF(BURN1.GT.BURNUP(NBURN))THEN
+ WRITE(*,*)'@CRERGR: BURN1 VALUE :',BURN1
+ WRITE(*,*)'@CRERGR: BURNUP LIMIT :',BURNUP(NBURN)
+ CALL XABORT('@CRERGR: INTERPOLATION IS OUT OF BURNUP LIMIT.')
+ ENDIF
+*
+ IF((IBTYP.EQ.3).AND.(ZONEDP(ICH,J).EQ.0)) THEN
+ YTOTAL(:NGRP)=0.0
+ YZNUG(:NGRP)=0.0
+ YNUGF(:NGRP)=0.0
+ YCHI(:NGRP)=0.0
+ YOVERV(:NGRP)=0.0
+ YDIFX(:NGRP)=0.0
+ YDIFY(:NGRP)=0.0
+ YDIFZ(:NGRP)=0.0
+ YH(:NGRP)=0.0
+ YSCAT(:NL*NGRP*NGRP)=0.0
+ YFLUX(:NGRP)=0.0
+ ELSE
+ CALL CREITP(NGRP,NL,NBURN,TERP,YTOTAL,YZNUG,YNUGF,YCHI,
+ 1 YOVERV,YDIFX,YDIFY,YDIFZ,YH,YSCAT,YFLUX,ZTOTAL,ZZNUG,ZNUGF,
+ 2 ZCHI,ZOVERV,ZDIFX,ZDIFY,ZDIFZ,ZH,ZSCAT,ZFLUX)
+ ENDIF
+* DATA STORAGE
+ DO 72 JGR=1,NGRP
+ TOTAL(IB,JGR)=YTOTAL(JGR)
+ ZNUG(IB,JGR)=YZNUG(JGR)
+ SNUGF(IB,JGR)=YNUGF(JGR)
+ CHI(IB,JGR)=YCHI(JGR)
+ OVERV(IB,JGR)=YOVERV(JGR)
+ DIFFX(IB,JGR)=YDIFX(JGR)
+ DIFFY(IB,JGR)=YDIFY(JGR)
+ DIFFZ(IB,JGR)=YDIFZ(JGR)
+ H(IB,JGR)=YH(JGR)
+ DO 71 IGR=1,NGRP
+ DO 70 IL=1,NL
+ SCAT(IB,IL,IGR,JGR)=YSCAT(NL*((JGR-1)*NGRP+IGR-1)+IL)
+ 70 CONTINUE
+ 71 CONTINUE
+ 72 CONTINUE
+* JGR IS THE SECONDARY GROUP.
+ DO 85 JGR=1,NGRP
+ DO 80 IL=1,NL
+ IGMIN=JGR
+ IGMAX=JGR
+ DO IGR=NGRP,1,-1
+ IF(SCAT(IB,IL,IGR,JGR).NE.0.)THEN
+ IGMIN=MIN(IGMIN,IGR)
+ IGMAX=MAX(IGMAX,IGR)
+ ENDIF
+ ENDDO
+ IJJ(IB,IL,JGR)=IGMAX
+ NJJ(IB,IL,JGR)=IGMAX-IGMIN+1
+ 80 CONTINUE
+ 85 CONTINUE
+ ENDIF
+ 100 CONTINUE
+ 105 CONTINUE
+*
+ DEALLOCATE(YFLUX,YSCAT,YH,YDIFZ,YDIFY,YDIFX,YOVERV,YCHI,YNUGF,
+ 1 YZNUG,YTOTAL)
+*
+ DEALLOCATE(ZFLUX,ZSCAT,ZH,ZDIFZ,ZDIFY,ZDIFX,ZOVERV,ZCHI,ZNUGF,
+ 1 ZZNUG,ZTOTAL)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(TERPW,ZONEDP,TERP)
+ RETURN
+ END
diff --git a/Donjon/src/CRETAB.f b/Donjon/src/CRETAB.f new file mode 100644 index 0000000..87fd42c --- /dev/null +++ b/Donjon/src/CRETAB.f @@ -0,0 +1,128 @@ +*DECK CRETAB + SUBROUTINE CRETAB(IPCPO,NISO,NGRP,NL,IMPX,HISO,NBURN,ITY,CONC, + 1 ILEAK,ZTOTAL,ZZNUG,ZNUGF,ZCHI,ZOVERV,ZDIFFX,ZDIFFY,ZDIFFZ,ZH, + 3 ZSCAT,ZFLUX,UPS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Create burnup dependent table with the extracted isotope. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPCPO pointer to l_compo information. +* NISO 1+number of extracted isotopes. +* NGRP number of energy groups. +* NL number of legendre orders (=1 for isotropic scattering). +* IMPX print parameter (=0 for no print). +* HISO hollerith name information for extracted isotopes. +* NBURN number of tabulated burnup steps +* ITY =0: do not process the isotope; =1: use number density +* stored in conc(i); =2: use number density stored in compo. +* CONC user defined number density. +* +*Parameters: output +* ILEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic). +* ZTOTAL burnup dependent total macroscopic x-sections +* ZZNUG burnup dependent nu*fission macroscopic x-sections. +* ZNUGF burnup dependent fission macroscopic x-sections. +* ZCHI burnup dependent fission spectrum. +* ZOVERV burnup dependent reciprocal neutron velocities. +* ZDIFFX burnup dependent x-directed diffusion coefficients. +* ZDIFFY burnup dependent y-directed diffusion coefficients. +* ZDIFFZ burnup dependent z-directed diffusion coefficients. +* ZH burnup dependent h-factors (kappa*fission macroscopic +* x-sections). +* ZSCAT burnup dependent scattering macroscopic x-sections. +* ZFLUX burnup dependent integrated flux. +* +*Parameters: scratch +* TOTAL total macroscopic x-sections. +* ZNUG nu*fission macroscopic x-sections. +* SNUGF fission macroscopic x-sections. +* CHI fission spectrum. +* OVERV reciprocal neutron velocities. +* DIFFX x-directed diffusion coefficients. +* DIFFY y-directed diffusion coefficients. +* DIFFZ z-directed diffusion coefficients. +* H h-factors (kappa*fission macroscopic x-sections). +* SCAT scattering macroscopic x-sections. +* FLUX integrated flux. +* DENSIT isotopic number densities. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPCPO + INTEGER NISO,NGRP,NL,IMPX,NBURN,HISO(3*NISO),ITY(NISO),ILEAK + REAL CONC(NISO),ZTOTAL(NBURN,NGRP),ZZNUG(NBURN,NGRP), + 1 ZCHI(NBURN,NGRP),ZOVERV(NBURN,NGRP),ZDIFFX(NBURN,NGRP), + 2 ZDIFFY(NBURN,NGRP),ZDIFFZ(NBURN,NGRP),ZH(NBURN,NGRP), + 3 ZSCAT(NBURN,NL,NGRP,NGRP),ZNUGF(NBURN,NGRP),ZFLUX(NBURN,NGRP) + LOGICAL UPS +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT12*12 + REAL, ALLOCATABLE, DIMENSION(:) :: TOTAL,ZNUG,CHI,OVERV,DIFFX, + 1 DIFFY,DIFFZ,H,SNUGF,FLUX,DENSIT + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: SCAT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(TOTAL(NGRP),ZNUG(NGRP),CHI(NGRP),OVERV(NGRP),DIFFX(NGRP), + 1 DIFFY(NGRP),DIFFZ(NGRP),H(NGRP),SCAT(NL,NGRP,NGRP),SNUGF(NGRP), + 2 FLUX(NGRP),DENSIT(NISO)) +*---- +* RECOVER MACROSCOPIC X-SECTION INFO FROM BURNUP DIRECTORIES +*---- + DO 20 IBURN=1,NBURN + WRITE(TEXT12,'(4HBURN,4X,I4)') IBURN + CALL LCMSIX(IPCPO,TEXT12,1) + CALL LCMGET(IPCPO,'ISOTOPESDENS',DENSIT) + IF(DENSIT(1).NE.1.)CALL XABORT('@CRETAB: DENSIT(1).NE.1.') + DO I=2,NISO + IF(ITY(I).EQ.0)THEN + DENSIT(I)=0. + ELSEIF(ITY(I).EQ.1)THEN + DENSIT(I)=CONC(I) + ELSEIF(ITY(I).NE.2)THEN + CALL XABORT('@CRETAB: INVALID VALUE OF ITY.') + ENDIF + ENDDO + CALL CREMAC(IPCPO,NISO,NGRP,NL,IMPX,HISO,DENSIT,ILEAK,TOTAL, + 1 ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,SCAT,FLUX,UPS) + CALL LCMSIX(IPCPO,' ',2) + DO 21 JGR=1,NGRP + ZTOTAL(IBURN,JGR)=TOTAL(JGR) + ZZNUG(IBURN,JGR)=ZNUG(JGR) + ZNUGF(IBURN,JGR)=SNUGF(JGR) + ZCHI(IBURN,JGR)=CHI(JGR) + ZOVERV(IBURN,JGR)=OVERV(JGR) + ZDIFFX(IBURN,JGR)=DIFFX(JGR) + ZDIFFY(IBURN,JGR)=DIFFY(JGR) + ZDIFFZ(IBURN,JGR)=DIFFZ(JGR) + ZH(IBURN,JGR)=H(JGR) + ZFLUX(IBURN,JGR)=FLUX(JGR) + DO 22 IGR=1,NGRP + DO 23 IL=1,NL + ZSCAT(IBURN,IL,IGR,JGR)=SCAT(IL,IGR,JGR) + 23 CONTINUE + 22 CONTINUE + 21 CONTINUE + 20 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DENSIT,FLUX,SNUGF,SCAT,H,DIFFZ,DIFFY,DIFFX,OVERV,CHI, + 1 ZNUG,TOTAL) + RETURN + END diff --git a/Donjon/src/CREXSI.f b/Donjon/src/CREXSI.f new file mode 100644 index 0000000..4819bf4 --- /dev/null +++ b/Donjon/src/CREXSI.f @@ -0,0 +1,213 @@ +*DECK CREXSI
+ SUBROUTINE CREXSI(IPMAP,NENTRY,HENTRY,KENTRY,NMIX,NGRP,NL,ILEAK,
+ 1 IMPX,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,IJJ,NJJ,SCAT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Recover and/or interpolate l_compo data.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert, D. Sekki
+*
+*Parameters: input
+* IPMAP pointer to the fuel-map information.
+* NENTRY number of lcm or xsm objects used by the module.
+* HENTRY character*12 name of each lcm or xsm objects.
+* KENTRY pointers to the lcm or xsm objects.
+* NMIX maximum number of material mixtures.
+* NGRP number of energy groups.
+* NL number of legendre orders (=1 for isotropic scattering).
+* ILEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic).
+* IMPX printing index (=0 for no print).
+*
+*Parameters: output
+* TOTAL total macroscopic x-sections.
+* ZNUG nu*fission macroscopic x-sections.
+* SNUGF fission macroscopic x-sections.
+* CHI fission spectrum.
+* OVERV reciprocal neutron velocities.
+* DIFFX x-directed diffusion coefficients.
+* DIFFY y-directed diffusion coefficients.
+* DIFFZ z-directed diffusion coefficients.
+* H h-factors (kappa*fission macroscopic x-sections).
+* IJJ profile storage index.
+* NJJ profile storage width.
+* SCAT scattering macroscopic x-sections.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,NMIX,NGRP,NL,ILEAK,IMPX,IJJ(NMIX,NL,NGRP),
+ 1 NJJ(NMIX,NL,NGRP)
+ TYPE(C_PTR) IPMAP,KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+ REAL TOTAL(NMIX,NGRP),ZNUG(NMIX,NGRP),SNUGF(NMIX,NGRP),
+ 1 CHI(NMIX,NGRP),OVERV(NMIX,NGRP),DIFFX(NMIX,NGRP),
+ 2 DIFFY(NMIX,NGRP),DIFFZ(NMIX,NGRP),H(NMIX,NGRP),
+ 3 SCAT(NMIX,NL,NGRP,NGRP)
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) IPCPO,JPCPO,JPMAP,KPMAP
+ PARAMETER(NSTATE=40,IOUT=6)
+ CHARACTER TEXT*12,NAMDIR*12,HCOMPO*12,HSMG*131
+ INTEGER IPAR(NSTATE),IDATA(NSTATE)
+ LOGICAL DERIV,UPS,LTAB
+ DOUBLE PRECISION DFLOT
+ REAL, ALLOCATABLE, DIMENSION(:) :: YTOTAL,YZNUG,YNUGF,YCHI,YOVERV,
+ 1 YDIFX,YDIFY,YDIFZ,YH,YSCAT,YFLUX
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: HISO,ITY,FMIX
+ REAL, ALLOCATABLE, DIMENSION(:) :: CONC,BURNU,BRN0,BRN1
+*
+ IVARTY=0
+ UPS=.FALSE.
+ LTAB=.FALSE.
+ DERIV=.FALSE.
+ NFUEL=0
+ MAXEN=NENTRY
+ IF(C_ASSOCIATED(IPMAP))THEN
+ CALL LCMGET(IPMAP,'STATE-VECTOR',IDATA)
+ IF(IDATA(4).NE.NGRP)CALL XABORT('@CREXSI: DIFFERENT NUM'
+ 1 //'BER OF ENERGY GROUPS IN COMPO AND FUEL MAP.')
+ NB=IDATA(1)
+ NCH=IDATA(2)
+ NFUEL=IDATA(7)
+ MAXEN=MAXEN-1
+ LTAB=.TRUE.
+ ENDIF
+*----
+* READ INTERPOLATION OPTION
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ DO 200 IEN=2,MAXEN
+* KEYWORD COMPO OR TABLE
+ IF(TEXT.EQ.'COMPO')THEN
+ IF(C_ASSOCIATED(IPMAP))CALL XABORT('@CREXSI: ONLY USE '
+ 1 //'OF EITHER COMPO OR TABLE OPTION. BOTH OPTIONS ARE '
+ 2 //'NOT ALLOWED.')
+ ELSEIF(TEXT.EQ.'TABLE')THEN
+ IF(.NOT.C_ASSOCIATED(IPMAP))CALL XABORT('@CREXSI: MISS'
+ 1 //'ING FUEL MAP.')
+ ELSE
+ CALL XABORT('@CREXSI: KEYWORD COMPO OR TABLE EXPECTED.')
+ ENDIF
+* COMPO NAME
+ CALL REDGET(ITYP,NITMA,FLOT,HCOMPO,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CREXSI: COMPO NAME EXPECTED.')
+ DO JEN=2,MAXEN
+ IF(HCOMPO.EQ.HENTRY(JEN))THEN
+ IPCPO=KENTRY(JEN)
+ IF(IMPX.GT.1)CALL LCMLIB(IPCPO)
+ GOTO 10
+ ENDIF
+ ENDDO
+ WRITE(HSMG,'(44HCREXSI: UNABLE TO FIND THE COMPO WITH NAME '',
+ 1 A12,2H''.)') TEXT
+ CALL XABORT(HSMG)
+*----
+* READ MIX INFO
+*----
+ 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'MIX')CALL XABORT('@CREXSI: KEYWORD MIX EXPECTED.')
+ CALL LCMGET(IPCPO,'STATE-VECTOR',IPAR)
+ NGRP1=IPAR(2)
+ NL1=IPAR(4)
+ NISO=IPAR(3)
+ IF(NGRP1.NE.NGRP)THEN
+ WRITE(HSMG,'(43HCREXSI: INCONSISTENT NB OF GROUPS. IN MACRO,
+ 1 5HLIB =,I5,11H IN COMPO =,I5)') NGRP,NGRP1
+ CALL XABORT(HSMG)
+ ENDIF
+ IF(NL1.LT.NL)THEN
+ WRITE(HSMG,'(43HCREXSI: INCONSISTENT NB OF LEGENDRE ORDERS.,
+ 1 14H IN MACROLIB =,I5,11H IN COMPO =,I5)') NL,NL1
+ CALL XABORT(HSMG)
+ ENDIF
+ 20 ALLOCATE(HISO(3*NISO),ITY(NISO),CONC(NISO))
+ CALL CREXSR(IPCPO,LTAB,HCOMPO,NMIX,IMPX,NISO,IBM,DERIV,UPS,
+ 1 NAMDIR,NISO1,HISO,ITY,CONC,NBURN,KBURN,IVARTY,
+ 2 IBTYP,BURN0,BURN1)
+ JPCPO=LCMGID(IPCPO,NAMDIR)
+*----
+* TABLE-OPTION INTERPOLATION
+*----
+ IF(LTAB)THEN
+* CHECK FUEL MIXTURE
+ JPMAP=LCMGID(IPMAP,'FUEL')
+ DO 30 IFUEL=1,NFUEL
+ KPMAP=LCMGIL(JPMAP,IFUEL)
+ CALL LCMGET(KPMAP,'MIX',IMIX)
+ IF(IMIX.EQ.IBM)GOTO 40
+ CALL LCMLEN(KPMAP,'MIX-VOID',LENGT,ITYP)
+ IF(LENGT.EQ.0)GOTO 30
+ CALL LCMGET(KPMAP,'MIX-VOID',IMIX)
+ IF(IMIX.EQ.IBM)GOTO 40
+ 30 CONTINUE
+ WRITE(IOUT,*)'@CREXSI: UNABLE TO FIND FUEL MIXTURE ',IBM
+ CALL XABORT('@CREXSI: WRONG MIXTURE NUMBER.')
+*
+ 40 ALLOCATE(BURNU(NBURN),BRN0(NCH*NB),BRN1(NCH*NB),FMIX(NCH*NB))
+ CALL CRERGR(JPCPO,IPMAP,NISO1,NGRP,NMIX,NL,IBM,IMPX,IBTYP,DERIV,
+ 1 UPS,NBURN,BURNU,ILEAK,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,
+ 2 DIFFZ,H,SCAT,IJJ,NJJ,HISO,ITY,CONC,FMIX,BRN0,BRN1,NCH,NB,IVARTY)
+ DEALLOCATE(FMIX,BRN1,BRN0,BURNU)
+ DEALLOCATE(CONC,ITY,HISO)
+*----
+* COMPO-OPTION INTERPOLATION
+*----
+ ELSE
+ ALLOCATE(YTOTAL(NGRP),YZNUG(NGRP),YNUGF(NGRP),YCHI(NGRP),
+ 1 YOVERV(NGRP),YDIFX(NGRP),YDIFY(NGRP),YDIFZ(NGRP),YH(NGRP),
+ 2 YSCAT(NL*NGRP*NGRP),YFLUX(NGRP))
+ CALL CREINT(JPCPO,NISO1,DERIV,NBURN,KBURN,BURN0,BURN1,NGRP,
+ 1 NL,IMPX,HISO,ITY,CONC,ILEAK,YTOTAL,YZNUG,YNUGF,YCHI,YOVERV,
+ 2 YDIFX,YDIFY,YDIFZ,YH,YSCAT,YFLUX,UPS)
+* DATA STORAGE.
+ DO 112 JGR=1,NGRP
+ TOTAL(IBM,JGR)=YTOTAL(JGR)
+ ZNUG(IBM,JGR)=YZNUG(JGR)
+ SNUGF(IBM,JGR)=YNUGF(JGR)
+ CHI(IBM,JGR)=YCHI(JGR)
+ OVERV(IBM,JGR)=YOVERV(JGR)
+ DIFFX(IBM,JGR)=YDIFX(JGR)
+ DIFFY(IBM,JGR)=YDIFY(JGR)
+ DIFFZ(IBM,JGR)=YDIFZ(JGR)
+ H(IBM,JGR)=YH(JGR)
+ DO 111 IGR=1,NGRP
+ DO 110 IL=1,NL
+ SCAT(IBM,IL,IGR,JGR)=YSCAT(NL*((JGR-1)*NGRP+IGR-1)+IL)
+ 110 CONTINUE
+ 111 CONTINUE
+ 112 CONTINUE
+ DEALLOCATE(YFLUX,YSCAT,YH,YDIFZ,YDIFY,YDIFX,YOVERV,YCHI,YNUGF,
+ 1 YZNUG,YTOTAL)
+ DEALLOCATE(CONC,ITY,HISO)
+* JGR IS THE SECONDARY GROUP.
+ DO 135 JGR=1,NGRP
+ DO 130 IL=1,NL
+ IGMIN=JGR
+ IGMAX=JGR
+ DO IGR=NGRP,1,-1
+ IF(SCAT(IBM,IL,IGR,JGR).NE.0.)THEN
+ IGMIN=MIN(IGMIN,IGR)
+ IGMAX=MAX(IGMAX,IGR)
+ ENDIF
+ ENDDO
+ IJJ(IBM,IL,JGR)=IGMAX
+ NJJ(IBM,IL,JGR)=IGMAX-IGMIN+1
+ 130 CONTINUE
+ 135 CONTINUE
+ ENDIF
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.EQ.'MIX')GOTO 20
+ 200 CONTINUE
+ IF(TEXT.NE.';') CALL XABORT('@CREXSI: FINAL ; EXPECTED.')
+ RETURN
+ END
diff --git a/Donjon/src/CREXSR.f b/Donjon/src/CREXSR.f new file mode 100644 index 0000000..dcc41eb --- /dev/null +++ b/Donjon/src/CREXSR.f @@ -0,0 +1,170 @@ +*DECK CREXSR + SUBROUTINE CREXSR(IPCPO,LTAB,HCOMPO,NMIXT,IMPX,NISO,IBM,DERIV,UPS, + 1 NAMDIR,NISOR,HISO,ITY,CONC,NBURN,KBURN,IVARTY,IBTYP,BURN0,BURN1) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read input data stream for MIX record and recover the information +* from l_compo linked list. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input/output +* IPCPO pointer to l_compo information. +* HCOMPO name of l_compo linked list. +* LTAB flag: =.true. table option; =.false. compo option. +* NMIXT maximum number of material mixtures. +* IMPX printing index (=0 for no print). +* NISO 1+maximum number of extracted isotopes. +* IBM mixture number to be treated. +* NAMDIR character*12 name of directory in l_compo object. +* DERIV flag: =.true. derivative of the macrolib is computed with +* respect to burn1. +* UPS flag: =.true. no up-scatering cross section will be stored. +* NISOR 1+number of extracted isotopes. +* HISO hollerith name information for extracted isotopes. +* ITY =0: do not process the isotope; =1: use number density +* stored in conc(i); =2: use number density stored in compo. +* CONC user defined number density. +* NBURN number of burnup steps in compo linked list. +* BURN0 user defined initial burnup. +* BURN1 user defined final burnup: if burn0=burn1 => a simple +* interpolation is performed; if burn0<burn1 => a time-average +* calculation is performed. +* KBURN =0: no burnup parameters; =1: use mw day/tonne of initial +* heavy elements. +* IVARTY index of the exit burnup used to compute derivatives. Set to +* zero to avoid taking the derivative. +* IBTYP type of interpolation: =1 time-average; =2 instantaneous; +* derivative with respect to a single exit burnup. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPCPO + INTEGER NMIXT,IMPX,NISO,IBM,NISOR,NBURN,KBURN,IVARTY,IBTYP, + 1 HISO(3*NISO),ITY(NISO) + LOGICAL DERIV,UPS,LTAB + CHARACTER NAMDIR*12,HCOMPO*12 + REAL CONC(NISO),BURN0,BURN1 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + TYPE(C_PTR) JPCPO + INTEGER IPAR(NSTATE) + CHARACTER TEXT12*12,TEXT*12,CGRPNM*12 + DOUBLE PRECISION DFLOT +* + KBURN=0 + ITY(:NISO)=0 + ITY(1)=2 +*---- +* RECOVER INFORMATION +*---- + IBM=0 + TEXT12='MIX' + 10 IF(TEXT12.EQ.'MIX')THEN + IVARTY=0 + IBTYP=0 + IF(IBM.NE.0)CALL XABORT('@CREXSR: MIX ALREADY SELECTED.') + CALL REDGET(ITYP,IBM,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@CREXSR: INTEGER DATA EXPECTED.') + IF(IBM.GT.NMIXT)CALL XABORT('@CREXSR: INVALID MIX INDEX.') + CALL REDGET(ITYP,NITMA,FLOT,NAMDIR,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@CREXSR: CHARACTER DATA EXPECTED.') + IF(IMPX.GT.0)WRITE(6,'(/27H CREXSR: ACCESS DIRECTORY '',A12, + 1 17H'' IN COMPO FILE '',A12,2H''.)') NAMDIR,HCOMPO + JPCPO=LCMGID(IPCPO,NAMDIR) + CALL LCMGET(JPCPO,'PARAM',IPAR) + NISOR=IPAR(2) + NBURN=IPAR(4) + IF(NISOR.GT.1)CALL LCMGET(JPCPO,'ISOTOPESNAME',HISO) + ELSEIF(TEXT12.EQ.'I-BURNUP')THEN + IF(LTAB )CALL XABORT('@CREXSR: INVALID OPTION I-BURNUP WITH' + 1 //' FUEL MAP OBJECT.') + IF(NBURN.LE.1)CALL XABORT('@CREXSR: NO BURNUP INFORMATION.') + KBURN=1 + CALL REDGET(ITYP,NITMA,BURN0,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@CREXSR: REAL DATA EXPECTED(1).') + BURN1=BURN0 + ELSEIF(TEXT12.EQ.'T-BURNUP')THEN + IF(LTAB )CALL XABORT('@CREXSR: INVALID OPTION T-BURNUP WITH' + 1 //' FUEL MAP OBJECT.') + IF(NBURN.LE.1)CALL XABORT('@CREXSR: NO BURNUP INFORMATION.') + KBURN=1 + CALL REDGET(ITYP,NITMA,BURN0,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@CREXSR: REAL DATA EXPECTED(2).') + CALL REDGET(ITYP,NITMA,BURN1,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@CREXSR: REAL DATA EXPECTED(3).') + IF(BURN1.LE.BURN0)CALL XABORT('@CREXSR: INVALID BURN1.') + ELSEIF(TEXT12.EQ.'MICRO')THEN + IF(NISO.LE.1)CALL XABORT('NO EXTRACTED ISOTOPES IN L_COMPO.') + 20 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@CREXSR: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'ALL')THEN + DO 30 I=2,NISO + ITY(I)=2 + 30 CONTINUE + ELSEIF(TEXT.EQ.'ENDMIX')THEN + TEXT12=TEXT + GOTO 10 + ELSEIF(TEXT.EQ.'UPS')THEN + TEXT12=TEXT + GOTO 10 + ELSE + DO 50 I=1,NISO + WRITE(CGRPNM,'(3A4)') (HISO(3*(I-1)+J),J=1,3) + IF(CGRPNM.EQ.TEXT)THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.2)THEN + CONC(I)=FLOT + ITY(I)=1 + ELSEIF((ITYP.EQ.3).AND.(TEXT.EQ.'*'))THEN + ITY(I)=2 + ELSE + CALL XABORT('@CREXSR: REAL NUMBER OR * EXPECTED.') + ENDIF + GOTO 20 + ENDIF + 50 CONTINUE + CALL XABORT('@CREXSR: UNABLE TO MATCH ISOTOPE'//TEXT//'.') + ENDIF + ELSEIF(TEXT12.EQ.'DERIV')THEN + DERIV=.TRUE. + ELSEIF(TEXT12.EQ.'TIMAV-BURN')THEN + IBTYP=1 + ELSEIF(TEXT12.EQ.'INST-BURN')THEN + IBTYP=2 + ELSEIF(TEXT12.EQ.'AVG-EX-BURN') THEN + IBTYP=3 + CALL REDGET(INDIC,IVARTY,FLOTT,TEXT12,DFLOT) + IF(INDIC.NE.1) CALL XABORT('CREXSR: INTEGER DATA EXPECTED' + 1 //'(AVG-EX-BURN).') + ELSEIF(TEXT12.EQ.'UPS')THEN + UPS=.TRUE. + ELSEIF(TEXT12.EQ.'ENDMIX')THEN + IF(LTAB)THEN + IF(NBURN.LE.0)CALL XABORT('@CREXSR: NO BURNUP INFORMATION ' + 1 //'FOR THIS MIXTURE.') + ELSE + IF((KBURN.EQ.0).AND.(NBURN.GT.1))CALL XABORT('@CREXSR: BUR' + 1 //'NUP INTEGRATION OPTION REQUIRED.') + ENDIF + RETURN + ELSE + WRITE(IOUT,'(A40)')'@CREXSR: MIX SHOULD FINISH WITH ENDMIX.' + CALL XABORT('@CREXSR: WRONG KEYWORD '//TEXT12//'.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@CREXSR: CHARACTER DATA EXPECTED.') + GOTO 10 + END diff --git a/Donjon/src/CVR.f b/Donjon/src/CVR.f new file mode 100644 index 0000000..3ca5280 --- /dev/null +++ b/Donjon/src/CVR.f @@ -0,0 +1,114 @@ +*DECK CVR
+ SUBROUTINE CVR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Perform reordering of fuel-regions properties in the reactor core,
+* according to the specified voiding pattern.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* NENTRY number of data structures transfered to this module.
+* HENTRY name of the data structures.
+* IENTRY data structure type where:
+* IENTRY=1 for LCM memory object;
+* IENTRY=2 for XSM file;
+* IENTRY=3 for sequential binary file;
+* IENTRY=4 for sequential ASCII file.
+* JENTRY access permission for the data structure where:
+* JENTRY=0 for a data structure in creation mode;
+* JENTRY=1 for a data structure in modifications mode;
+* JENTRY=2 for a data structure in read-only mode.
+* KENTRY data structure pointer.
+*
+*Comments:
+* The CVR: module specification is:
+* FMAPV := CVR: FMAP :: (descrcvr) ;
+* where
+* FMAP : name of a read-only \emph{fmap} object,
+* created in the RESINI: module. This object must contain the non-perturbed
+* fuel-cell properties.
+* FMAPV : name of a new \emph{fmap} object,
+* that will contain the modified fuel-type indices and reordered coolant
+* densities according to the specified core-voiding pattern.
+* (descrcvr) : structure describing the input data to the CVR: module.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ TYPE(C_PTR) KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40)
+ CHARACTER TEXT*12,HSIGN*12
+ INTEGER ISTATE(NSTATE),IGST(NSTATE)
+ DOUBLE PRECISION DFLOT
+ TYPE(C_PTR) IPMAP,JPMAP
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.NE.2)CALL XABORT('@CVR: TWO PARAMETERS EXPECTED.')
+ TEXT=HENTRY(1)
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@CVR:'
+ 1 //' LCM OBJECT EXPECTED AT LHS ('//TEXT//').')
+ IF(JENTRY(1).NE.0)CALL XABORT('@CVR: FUEL MAP OBJECT IN CRE'
+ 1 //'ATE MODE EXPECTED AT LHS ('//TEXT//').')
+ TEXT=HENTRY(2)
+ IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@CVR:'
+ 1 //' LCM OBJECT EXPECTED AT RHS ('//TEXT//').')
+ IF(JENTRY(2).NE.2)CALL XABORT('@CVR: FUEL MAP OBJECT IN REA'
+ 1 //'D-ONLY MODE EXPECTED AT RHS ('//TEXT//').')
+ CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_MAP')THEN
+ TEXT=HENTRY(2)
+ CALL XABORT('@CVR: SIGNATURE OF '//TEXT//' IS '//HSIGN//
+ 1 '. L_MAP EXPECTED.')
+ ENDIF
+ IPMAP=KENTRY(1)
+ CALL LCMEQU(KENTRY(2),IPMAP)
+*----
+* RECOVER INFORMATION
+*----
+ ISTATE(:NSTATE)=0
+ CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE)
+ NB=ISTATE(1)
+ NCH=ISTATE(2)
+ NFUEL=ISTATE(7)
+ NPARM=ISTATE(8)
+* FUEL-MAP GEOMETRY
+ JPMAP=LCMGID(IPMAP,'GEOMAP')
+ IGST(:NSTATE)=0
+ CALL LCMGET(JPMAP,'STATE-VECTOR',IGST)
+ IF(IGST(1).NE.7)CALL XABORT('@CVR: ONLY 3-D CART'
+ 1 //'ESIAN GEOMETRY ALLOWED.')
+ NX=IGST(3)
+ NY=IGST(4)
+ NZ=IGST(5)
+* PRINTING INDEX
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVR: CHARACTER DATA EXPECTED.')
+ IF(TEXT.NE.'EDIT')CALL XABORT('@CVR: KEYWORD EDIT EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@CVR: INTEGER FOR EDIT EXPECTED.')
+ IMPX=MAX(0,NITMA)
+* READ INPUT DATA
+ CALL CVRDRV(IPMAP,NCH,NB,NFUEL,NPARM,NX,NY,NZ,NVD,IVD,IMPX)
+* UPDATE STATE-VECTOR
+ ISTATE(10)=NVD
+ ISTATE(11)=IVD
+ CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IMPX.GT.1) CALL LCMLIB(IPMAP)
+ RETURN
+ END
diff --git a/Donjon/src/CVRCOR.f b/Donjon/src/CVRCOR.f new file mode 100644 index 0000000..c7ea5d1 --- /dev/null +++ b/Donjon/src/CVRCOR.f @@ -0,0 +1,130 @@ +*DECK CVRCOR + SUBROUTINE CVRCOR(IPMAP,NCH,NB,NFUEL,NX,NY,NZ,IVOID,NVOID,NPARM, + 1 PNAME,PVALUE,VCOOL,LCOOL,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modify channels data according to the specified core-voiding pattern. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input/output +* IPMAP pointer to the perturbed fuel-map. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NFUEL number of fuel types. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* IVOID index associated with the core-voiding pattern: +* =1 full-core; =2 half-core; =3 quarter-core; +* =4 checkerboard-full; =5 checkerboard-half; +* =6 checkerboard-quarter. +* NVOID total number of voided channels. +* NPARM total number of recorded parameters. +* PNAME recorded parameter name for the coolant density. +* PVALUE structure containing the coolant density values +* throughout the reactor core. +* VCOOL coolant density value for voided channels. +* LCOOL flag with respect to the coolant densities: +* =.true. to modify these values; +* =.false. coolant densities not provided. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCH,NB,NFUEL,NX,NY,NZ,IVOID,NVOID,NPARM,IMPX + REAL PVALUE(NCH,NB),VCOOL + CHARACTER PNAME*12 + LOGICAL LCOOL +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER FLMIX(NCH,NB),NSCH(NCH),INAME(3) + CHARACTER TEXT*20,TEXT12*12 + LOGICAL LCHK + TYPE(C_PTR) JPMAP,KPMAP +*---- +* RECOVER INFORMATION +*---- + FLMIX(:NCH,:NB)=0 + NSCH(:NCH)=0 + LCHK=.FALSE. + CALL LCMGET(IPMAP,'FLMIX',FLMIX) + CALL LCMLEN(IPMAP,'REF-SCHEME',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@CVRCOR: MISSI' + 1 //'NG REF-SCHEME DATA IN FUEL-MAP.') + CALL LCMGET(IPMAP,'REF-SCHEME',NSCH) + IF(IVOID.EQ.1)THEN + TEXT='FULL-CORE' + ELSEIF(IVOID.EQ.2)THEN + TEXT='HALF-CORE' + ELSEIF(IVOID.EQ.3)THEN + TEXT='QUARTER-CORE' + ELSEIF(IVOID.EQ.4)THEN + TEXT='CHECKERBOARD-FULL' + LCHK=.TRUE. + ELSEIF(IVOID.EQ.5)THEN + TEXT='CHECKERBOARD-HALF' + LCHK=.TRUE. + ELSEIF(IVOID.EQ.6)THEN + TEXT='CHECKERBOARD-QUARTER' + LCHK=.TRUE. + ENDIF + IF(IMPX.GT.0)WRITE(IOUT,1000)TEXT,NVOID +*---- +* MODIFY CHANNEL DATA +*---- + ITOT=0 + JPMAP=LCMGID(IPMAP,'FUEL') + DO IFUEL=1,NFUEL + KPMAP=LCMGIL(JPMAP,IFUEL) + CALL LCMGET(KPMAP,'MIX',MIXF) + CALL LCMGET(KPMAP,'MIX-VOID',MIXV) + DO 20 ICH=1,NVOID + IF(LCHK)THEN + IF(NSCH(ICH).LT.0)GOTO 20 +* POSITIVE DIRECTION ONLY + ENDIF + DO 10 IB=1,NB + IF(FLMIX(ICH,IB).NE.MIXF)GOTO 10 + FLMIX(ICH,IB)=MIXV + IF(LCOOL) PVALUE(ICH,IB)=VCOOL + ITOT=ITOT+1 + 10 CONTINUE + 20 CONTINUE + ENDDO + IF(IMPX.GT.0)WRITE(IOUT,1001)ITOT + IF(IMPX.LT.2)GOTO 30 +* PRINTING + CALL CVRPRN(IPMAP,NCH,NB,NX,NY,NZ,FLMIX,PVALUE,LCOOL,IMPX) +* STORE NEW DATA + 30 CALL LCMPUT(IPMAP,'FLMIX',NCH*NB,1,FLMIX) + IF(.NOT.LCOOL)GOTO 40 + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGET(KPMAP,'P-NAME',INAME) + WRITE(TEXT12,'(3A4)') (INAME(I),I=1,3) + IF(PNAME.EQ.TEXT12)THEN + CALL LCMPUT(KPMAP,'P-VALUE',NCH*NB,2,PVALUE) + GOTO 40 + ENDIF + ENDDO + 40 RETURN +* + 1000 FORMAT(/2X,'SELECTED VOIDING PATTERN',2X,'=>',2X,A20 + 1 //2X,'TOTAL NUMBER OF VOIDED CHANNELS =',1X,I3/) + 1001 FORMAT(2X,'TOTAL NUMBER OF MODIFIED VALUES :',1X,I4/) + END diff --git a/Donjon/src/CVRDRV.f b/Donjon/src/CVRDRV.f new file mode 100644 index 0000000..08cbe5c --- /dev/null +++ b/Donjon/src/CVRDRV.f @@ -0,0 +1,174 @@ +*DECK CVRDRV
+ SUBROUTINE CVRDRV(IPMAP,NCH,NB,NFUEL,NPARM,NX,NY,NZ,NVOID,IVOID,
+ 1 IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Read the input data required for the voiding simulations.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* IPMAP pointer to the perturbed fuel-map.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* NFUEL number of fuel types.
+* NPARM total number of recorded parameters.
+* NX number of elements along x-axis in fuel map.
+* NY number of elements along y-axis in fuel map.
+* NZ number of elements along z-axis in fuel map.
+* IMPX printing index (=0 for no print).
+*
+*Parameters: output
+* IVOID index associated with the core-voiding pattern.
+* NVOID total number of voided channels.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAP
+ INTEGER NCH,NB,NFUEL,NPARM,NX,NY,NZ,NVOID,IVOID,IMPX
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ CHARACTER TEXT*12,PNAME*12,CHANX*4,CHANY*4
+ INTEGER INAME(3)
+ DOUBLE PRECISION DFLOT
+ REAL PVALUE(NCH,NB)
+ LOGICAL LCOOL
+ TYPE(C_PTR) JPMAP,KPMAP
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NXX,NYY
+*----
+* FUEL-TYPE INDICES
+*----
+ JPMAP=LCMGID(IPMAP,'FUEL')
+ DO IFUEL=1,NFUEL
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT.NE.'MIX-FUEL')CALL XABORT('@CVRDRV: KEYWORD MIX-FUEL'
+ 1 //' EXPECTED.')
+* UNPERTURBED-CELL FUEL MIXTURE NUMBER
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@CVRDRV: INTEGER DATA EXPECTED(1).')
+ KPMAP=LCMGIL(JPMAP,IFUEL)
+ CALL LCMGET(KPMAP,'MIX',IMIX)
+ IF(IMIX.NE.NITMA)THEN
+ WRITE(IOUT,*)'@CVRDRV: RECORDED FUEL MIXTURE NUMBER ',IMIX
+ WRITE(IOUT,*)'@CVRDRV: READ FROM INPUT THE MIXTURE ',NITMA
+ CALL XABORT('@CVRDRV: WRONG INPUT ORDER OF FUEL MIXTURES.')
+ ENDIF
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHARACTER DATA EXPECTED(2).')
+ IF(TEXT.NE.'MIX-VOID')CALL XABORT('@CVRDRV: KEYWORD MIX-VOI'
+ 1 //'D EXPECTED.')
+* PERTURBED-CELL FUEL MIXTURE NUMBER
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@CVRDRV: INTEGER DATA EXPECTED(2).')
+ IF(NITMA.LE.0)CALL XABORT('@CVRDRV: MIX-VOID NUMBER MUST BE'
+ 1 //' POSITIVE AND GREATER THAN ZERO.')
+ CALL LCMPUT(KPMAP,'MIX-VOID',1,1,NITMA)
+ ENDDO
+*----
+* COOLANT DENSITIES
+*----
+ LCOOL=.FALSE.
+ PVALUE(:NCH,:NB)=0.0
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHARACTER DATA EXPECTED(3).')
+ IF(TEXT.NE.'DENS-COOL')GOTO 20
+ IF(NPARM.EQ.0)CALL XABORT('@CVRDRV: NO DEFINED PARAMETERS IN T'
+ 1 //'HE FUEL-MAP NPARM=0')
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHARACTER DATA FOR PARAMETE'
+ 1 //'R PNAME EXPECTED.')
+ JPMAP=LCMGID(IPMAP,'PARAM')
+ DO IPAR=1,NPARM
+ KPMAP=LCMGIL(JPMAP,IPAR)
+ CALL LCMGET(KPMAP,'P-NAME',INAME)
+ WRITE(PNAME,'(3A4)') (INAME(I),I=1,3)
+ IF(PNAME.EQ.TEXT)THEN
+ CALL LCMGET(KPMAP,'P-VALUE',PVALUE)
+ GOTO 10
+ ENDIF
+ ENDDO
+ CALL XABORT('@CVRDRV: UNABLE TO FIND PARAMETER WITH PNAME '//TEXT)
+*
+ 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'SET')CALL XABORT('@CVRDRV: KEYWORD SET EXPECTED.')
+ CALL REDGET(ITYP,NITMA,VCOOL,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@CVRDRV: REAL DATA FOR THE COOLANT DEN'
+ 1 //'SITY EXPECTED.')
+ IF(VCOOL.LT.0.)CALL XABORT('@CVRDRV: INVALID VALUE FOR THE COOLA'
+ 1 //'NT DENSITY <0.')
+ LCOOL=.TRUE.
+*----
+* CORE-VOIDING PATTERN
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ 20 IF(TEXT.NE.'VOID-PATTERN')CALL XABORT('@CVRDRV: KEYWORD VOID-'
+ 1 //'PATTERN EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHARACTER DATA EXPECTED(4).')
+ IF(TEXT.EQ.'FULL')THEN
+ IVOID=1
+ NVOID=NCH
+ ELSEIF(TEXT.EQ.'HALF')THEN
+ IVOID=2
+ NVOID=NCH/2
+ ELSEIF(TEXT.EQ.'QUARTER')THEN
+ IVOID=3
+ NVOID=NCH/4
+ ELSEIF(TEXT.EQ.'CHECKER')THEN
+ IVOID=4
+ NVOID=NCH
+ ELSEIF(TEXT.EQ.'CHECKER-1/2')THEN
+ IVOID=5
+ NVOID=NCH/2
+ ELSEIF(TEXT.EQ.'CHECKER-1/4')THEN
+ IVOID=6
+ NVOID=NCH/4
+ ELSEIF(TEXT.EQ.'CHAN-VOID')THEN
+*----
+* USER-DEFINED PATTERN
+*----
+ IVOID=7
+* TOTAL NUMBER OF VOIDED CHANNELS
+ CALL REDGET(ITYP,NVOID,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@CVRDRV: INTEGER TOTAL NUMBER OF V'
+ 1 //'OIDED CHANNELS EXPECTED.')
+ IF((NVOID.LT.1).OR.(NVOID.GT.NCH))CALL XABORT('@CVRDRV: TH'
+ 1 //'E NUMBER OF VOIDED CHANNELS MUST BE > 0 AND < NCH')
+ ALLOCATE(NXX(NVOID),NYY(NVOID))
+ DO I=1,NVOID
+* VOIDED-CHANNEL YNAME
+ CALL REDGET(ITYP,NITMA,FLOT,CHANY,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHANNEL YNAME EXPECTED.')
+ READ(CHANY,'(A4)') NYY(I)
+* VOIDED-CHANNEL XNAME
+ CALL REDGET(ITYP,NITMA,FLOT,CHANX,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@CVRDRV: CHANNEL XNAME EXPECTED.')
+ READ(CHANX,'(A4)') NXX(I)
+ ENDDO
+ CALL CVRUSR(IPMAP,NCH,NB,NFUEL,NX,NY,NZ,NVOID,NXX,NYY,NPARM,
+ 1 PNAME,PVALUE,VCOOL,LCOOL,IMPX)
+ DEALLOCATE(NXX,NYY)
+ ELSE
+ CALL XABORT('@CVRDRV: WRONG KEYWORD '//TEXT)
+ ENDIF
+*
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.';')CALL XABORT('@CVRDRV: FINAL ; EXPECTED.')
+* SPECIFIED CORE-VOIDING PATTERN
+ IF(IVOID.LT.7) CALL CVRCOR(IPMAP,NCH,NB,NFUEL,NX,NY,NZ,IVOID,
+ 1 NVOID,NPARM,PNAME,PVALUE,VCOOL,LCOOL,IMPX)
+ RETURN
+ END
diff --git a/Donjon/src/CVRPRN.f b/Donjon/src/CVRPRN.f new file mode 100644 index 0000000..dc60cc5 --- /dev/null +++ b/Donjon/src/CVRPRN.f @@ -0,0 +1,124 @@ +*DECK CVRPRN + SUBROUTINE CVRPRN(IPMAP,NCH,NB,NX,NY,NZ,MIXNEW,PVALUE,LCOOL,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Print the fuel-type indices per bundle for each reactor channel. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* MIXNEW updated fuel-type index. +* PVALUE structure containing the modified coolant density +* values throughout the reactor core. +* LCOOL flag with respect to the coolant densities: +* =.true. coolant densities were modified; +* =.false. coolant densities not provided. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCH,NB,NX,NY,NZ,MIXNEW(NCH,NB),IMPX + REAL PVALUE(NCH,NB) + LOGICAL LCOOL +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER MIX(NX*NY*NZ),MIXOLD(NCH,NB), + 1 NSCH(NCH),NAMX(NX),NAMY(NY),FMIX(NX,NY,NB) + CHARACTER TEXT*12,CHANX*2,CHANY*2,FORM1*14,FORM2*14 +*---- +* RECOVER INFORMATION +*---- + MIX(:NX*NY*NZ)=0 + MIXOLD(:NCH,NB)=0 + NSCH(:NCH)=0 + NAMX(:NX)=0 + NAMY(:NY)=0 + FMIX(:NX,:NY,:NB)=0 + CALL LCMGET(IPMAP,'BMIX',MIX) + CALL LCMGET(IPMAP,'FLMIX',MIXOLD) +* CHANNEL NAMES + CALL LCMGET(IPMAP,'XNAME',NAMX) + CALL LCMGET(IPMAP,'YNAME',NAMY) +* REFUELLING SCHEME + CALL LCMLEN(IPMAP,'REF-SCHEME',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@CVRPRN: MISSI' + 1 //'NG REF-SCHEME DATA IN FUEL-MAP.') + CALL LCMGET(IPMAP,'REF-SCHEME',NSCH) + IF((IMPX.NE.2).AND.(IMPX.LT.4))GOTO 20 +*---- +* PRINTING OVER EACH CHANNEL +*---- + IEL=0 + ICH=0 + DO 15 J=1,NY + DO 10 I=1,NX + IEL=IEL+1 + IF(MIX(IEL).EQ.0)GOTO 10 + ICH=ICH+1 + WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH + WRITE(CHANX,'(A2)') (NAMX(I)) + WRITE(CHANY,'(A2)') (NAMY(J)) + WRITE(IOUT,1001)TEXT,CHANY,CHANX,NSCH(ICH) + WRITE(IOUT,1002) (MIXOLD(ICH,IB),IB=1,NB) + WRITE(IOUT,1003) (MIXNEW(ICH,IB),IB=1,NB) + IF(LCOOL)WRITE(IOUT,1004)(PVALUE(ICH,IB),IB=1,NB) + 10 CONTINUE + 15 CONTINUE + 20 IF((IMPX.NE.3).AND.(IMPX.LT.4))GOTO 50 +*---- +* PRINTING PER RADIAL PLANE +*---- + WRITE(FORM1,'(A4,I2,A8)')'(A4,',NX,'(A3,1X))' + WRITE(FORM2,'(A4,I2,A8)')'(A2,',NX,'(I3,1X))' + WRITE(IOUT,1005) + IEL=0 + DO IB=1,NB + ICH=0 + DO 35 J=1,NY + DO 30 I=1,NX + IEL=IEL+1 + IF(MIX(IEL).EQ.0)GOTO 30 + ICH=ICH+1 + FMIX(I,J,IB)=MIXNEW(ICH,IB) + 30 CONTINUE + 35 CONTINUE + ENDDO + DO IB=1,NB + WRITE(IOUT,1006)IB + WRITE(IOUT,FORM1)' ',(NAMX(I),I=1,NX) + WRITE(IOUT,*)' ' + DO 40 J=1,NY + WRITE(CHANY,'(A2)') (NAMY(J)) + IF(INDEX(CHANY,'-').EQ.1)GOTO 40 + WRITE(IOUT,FORM2)CHANY,(FMIX(I,J,IB),I=1,NX) + 40 CONTINUE + ENDDO + 50 RETURN +* + 1001 FORMAT(/10X,'* ',A12,' *',5X,'NAME:',1X,A2,A2, + 1 5X,'REF-SCHEME:',1X,I2) + 1002 FORMAT(2X,'OLD FUEL INDICES :',2X,12(I2,2X)) + 1003 FORMAT(2X,'NEW FUEL INDICES :',2X,12(I2,2X)/) + 1004 FORMAT(2X,'COOLANT DENSITIES:',1X,12(F4.2,1X)/) + 1005 FORMAT(//20X,'** FUEL-TYPE INDICES PER RADIAL PLANE **') + 1006 FORMAT(//2X,'RADIAL PLANE',1X,'#',I2.2/) + END diff --git a/Donjon/src/CVRUSR.f b/Donjon/src/CVRUSR.f new file mode 100644 index 0000000..6405cc7 --- /dev/null +++ b/Donjon/src/CVRUSR.f @@ -0,0 +1,144 @@ +*DECK CVRUSR
+ SUBROUTINE CVRUSR(IPMAP,NCH,NB,NFUEL,NX,NY,NZ,NVOID,NAMXV,NAMYV,
+ 1 NPARM,PNAME,PVALUE,VCOOL,LCOOL,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Modify channels data according to the user-defined voiding pattern.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input/output
+* IPMAP pointer to fuel-map information.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* NFUEL number of fuel types.
+* NX number of elements along x-axis in fuel map.
+* NY number of elements along y-axis in fuel map.
+* NZ number of elements along z-axis in fuel map.
+* NVOID total number of voided channels.
+* NAMXV names of voided channels along x-axis.
+* NAMYV names of voided channels along y-axis.
+* NPARM total number of recorded parameters.
+* PNAME recorded parameter name for the coolant density.
+* PVALUE structure containing the coolant density values
+* throughout the reactor core.
+* VCOOL coolant density value for voided channels.
+* LCOOL flag with respect to the coolant densities:
+* =.true. to modify these values;
+* =.false. coolant densities not provided.
+* IMPX printing index (=0 for no print).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAP
+ INTEGER NCH,NB,NFUEL,NX,NY,NZ,NVOID,NPARM,IMPX,NAMXV(NVOID),
+ 1 NAMYV(NVOID)
+ REAL PVALUE(NCH,NB),VCOOL
+ CHARACTER PNAME*12
+ LOGICAL LCOOL
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ INTEGER MIX(NX*NY*NZ),FLMIX(NCH,NB),NAMX(NX),NAMY(NY),INAME(3)
+ CHARACTER TEXT*12,CHANX*2,CHANY*2
+ TYPE(C_PTR) JPMAP,KPMAP
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: CNANV
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(CNANV(NVOID))
+*----
+* RECOVER INFORMATION
+*----
+ MIX(:NX*NY*NZ)=0
+ FLMIX(:NCH,NB)=0
+ NAMX(:NX)=0
+ NAMY(:NY)=0
+ CALL LCMGET(IPMAP,'BMIX',MIX)
+ CALL LCMGET(IPMAP,'FLMIX',FLMIX)
+* CHANNEL NAMES
+ CALL LCMGET(IPMAP,'XNAME',NAMX)
+ CALL LCMGET(IPMAP,'YNAME',NAMY)
+ TEXT='USER-DEFINED'
+ IF(IMPX.GT.0)WRITE(IOUT,1000)TEXT,NVOID
+*----
+* CHECK VOIDED CHANNELS
+*----
+ DO 20 IVD=1,NVOID
+ IEL=0
+ ICH=0
+ DO 15 J=1,NY
+ DO 10 I=1,NX
+ IEL=IEL+1
+ IF(MIX(IEL).EQ.0)GOTO 10
+ ICH=ICH+1
+ IF(NAMXV(IVD).NE.NAMX(I))GOTO 10
+ IF(NAMYV(IVD).NE.NAMY(J))GOTO 10
+ CNANV(IVD)=ICH
+ GOTO 20
+ 10 CONTINUE
+ 15 CONTINUE
+ WRITE(CHANX,'(A2)') (NAMXV(IVD))
+ WRITE(CHANY,'(A2)') (NAMYV(IVD))
+ WRITE(IOUT,1001)CHANY,CHANX
+ CALL XABORT('@CVRUSR: INVALID INPUT DATA.')
+ 20 CONTINUE
+*----
+* MODIFY CHANNEL DATA
+*----
+ ITOT=0
+ JPMAP=LCMGID(IPMAP,'FUEL')
+ DO IFUEL=1,NFUEL
+ KPMAP=LCMGIL(JPMAP,IFUEL)
+ CALL LCMGET(KPMAP,'MIX',MIXF)
+ CALL LCMGET(KPMAP,'MIX-VOID',MIXV)
+ DO IVD=1,NVOID
+ ICH=CNANV(IVD)
+ DO 30 IB=1,NB
+ IF(FLMIX(ICH,IB).NE.MIXF)GOTO 30
+ FLMIX(ICH,IB)=MIXV
+ IF(LCOOL) PVALUE(ICH,IB)=VCOOL
+ ITOT=ITOT+1
+ 30 CONTINUE
+ ENDDO
+ ENDDO
+ IF(IMPX.GT.0)WRITE(IOUT,1002)ITOT
+ IF(IMPX.LT.2)GOTO 40
+* PRINTING
+ CALL CVRPRN(IPMAP,NCH,NB,NX,NY,NZ,FLMIX,PVALUE,LCOOL,IMPX)
+* STORE NEW DATA
+ 40 CALL LCMPUT(IPMAP,'FLMIX',NCH*NB,1,FLMIX)
+ IF(.NOT.LCOOL)GOTO 50
+ JPMAP=LCMGID(IPMAP,'PARAM')
+ DO IPAR=1,NPARM
+ KPMAP=LCMGIL(JPMAP,IPAR)
+ CALL LCMGET(KPMAP,'P-NAME',INAME)
+ WRITE(TEXT,'(3A4)') (INAME(I),I=1,3)
+ IF(PNAME.EQ.TEXT)THEN
+ CALL LCMPUT(KPMAP,'P-VALUE',NCH*NB,2,PVALUE)
+ GOTO 50
+ ENDIF
+ ENDDO
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ 50 DEALLOCATE(CNANV)
+ RETURN
+*
+ 1000 FORMAT(/2X,'SELECTED VOIDING PATTERN',2X,'=>',2X,A20
+ 1 //2X,'TOTAL NUMBER OF VOIDED CHANNELS =',1X,I3/)
+ 1001 FORMAT(/1X,'@CVRUSR: UNABLE TO FIND THE CHANN',
+ 1 'EL NAME:',1X,A2,A2)
+ 1002 FORMAT(2X,'TOTAL NUMBER OF MODIFIED VALUES :',1X,I4/)
+ END
diff --git a/Donjon/src/D2P.f b/Donjon/src/D2P.f new file mode 100644 index 0000000..96b1ccf --- /dev/null +++ b/Donjon/src/D2P.f @@ -0,0 +1,1155 @@ +*DECK PMAXS + SUBROUTINE D2P(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* PMAXS interface file generation. +* +*Copyright: +* Copyright (C) 2015 IRSN +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* None +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER :: STAVEC(40) = 0 + CHARACTER TEXT*72 + INTEGER UV + INTEGER :: NFC1 = 0 + INTEGER :: NFC2 = 0 + INTEGER :: NFC3 = 0 + INTEGER :: NFC4 = 0 + INTEGER :: NXC = 0 + INTEGER :: JOBT = 0 + INTEGER :: NGP = 2 + INTEGER :: NCRD = 0 + INTEGER :: MIX = 1 + INTEGER :: FA_K = -1 + INTEGER :: IUPS = 0 + INTEGER :: USRSTA = 0 + INTEGER :: XESM = 3 + INTEGER :: ITEMP = 0 + INTEGER :: NOTHPK = 0 + INTEGER :: IOTHPK = 0 + REAL :: VERS = 3.0 + REAL :: SFAC = 1.0 + REAL :: BFAC = 1.0 + REAL :: THCK = -1. + REAL FLOTT + INTEGER PHASE, ITYPLIR, NITMA + DOUBLE PRECISION DFLOT + INTEGER :: IPRINT = -1 + INTEGER,DIMENSION(20) :: CRDINF = -1 + INTEGER,DIMENSION(12) :: USRVAL = 0 + INTEGER ,DIMENSION(12) :: OTHTYP = 2 + REAL,DIMENSION(5) :: LOCYLD = (/0.,-1.,-1.,-1.,-1. /) + REAL,DIMENSION(5)::FC1=(/17.0,17.0,3.0,0.0,0.73659 /) + REAL,DIMENSION(8)::FC2 + DATA FC2/6.2506E-01,1E-04,6*0.0/ + REAL,DIMENSION(7)::FC3 + DATA FC3/2.4921E+02, 2.4921E+02, 2.4921E+02, 2.3020E+01, + 1 1.4407E+02, 4.5099E+01, 4.5099E+01/ + REAL,DIMENSION(3)::FC4 + DATA FC4/1.44270E+00, 7.21350E-01, 7.21350E-01/ + REAL,DIMENSION(3)::XSC + DATA XSC/ 1.0, 1.0, 5.32151E-01/ + REAL,DIMENSION(3)::YLD + DATA YLD/ 0.06386, 0.00228, 0.0113/ + CHARACTER*16 :: JOBTIT = 'D2P.PMAXS' + CHARACTER*40 :: COM = 'PWR CASE : UOX/MOX CORE FUEL' + CHARACTER*12 :: FILNAM = 'HELIOS.dra' + CHARACTER*12 :: MIXDIR = 'default ' + CHARACTER*12 :: HDET = 'NULL ' + CHARACTER*4 :: DER = 'T' + CHARACTER*1 :: JOBOPT(16) + CHARACTER*5 :: MESH = 'SAP' + CHARACTER*12 :: USRPAR(12) = ' ' + CHARACTER*12 :: OTHPK(12) = ' ' + CHARACTER*8 :: HCUR(2)= 'NUL' + CHARACTER*8 :: HFLX(2)= 'NUL' + + CHARACTER*12,DIMENSION(12) :: OTHVAL = ' ' + REAL :: OTHVAR(12) + + REAL USRVAPK(12,10) + CHARACTER*4 :: CRDMOD = ' ' + CHARACTER*3 :: ADF = 'NUL' + CHARACTER*3 :: CDF = 'NUL' + CHARACTER*8,DIMENSION(4) :: ADFD = 'FD_B ' + CHARACTER*8,DIMENSION(8) :: CDFD = 'FD_C ' + CHARACTER*3 :: GFF = 'NUL' + CHARACTER*12,DIMENSION(6) :: PKEY + DATA PKEY/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + CHARACTER*12,DIMENSION(6) :: REFNAM + DATA REFNAM/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + CHARACTER*12,DIMENSION(8) :: ISOT + DATA ISOT/ "XE135PF","SM149PF","I135PF","PM149PF","PM148PF", + > "PM148MPF","ND147PF","PM147PF"/ + DATA JOBOPT/14*'F',"",""/ + CHARACTER*3 :: YLDOPT = 'REF' + CHARACTER*4 :: OPT = 'NONE' + CHARACTER*4 :: HEQUI = 'NONE' + CHARACTER*4 :: HMASL = 'NONE' + CHARACTER*1 :: ISOTOPT = '*' + REAL :: ISOTVAL = 0. + LOGICAL :: SAP=.FALSE. + LOGICAL :: MIC=.TRUE. + LOGICAL :: EXCESS=.FALSE. + LOGICAL :: SCAT=.FALSE. + LOGICAL :: LADD=.FALSE. + LOGICAL :: LNEW=.FALSE. + LOGICAL :: LPRC=.FALSE. + LOGICAL :: LMEM=.FALSE. + LOGICAL :: LCOR=.FALSE. + OTHVAR(:) = -1 +*---- +* parameters VALIDATION +*---- +*---- +* RECOVER iPHASE AND iPRINT INDICES +*---- + WRITE(6,*) "****************************************************" + WRITE(6,*) "* RECOVERING D2P: DATA INPUT *" + WRITE(6,*) "****************************************************" + + 100 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT ('@D2P: KEYWORD EXPECTED AS INPUT OF D2P: MODULE') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT.EQ.'PHASE' ) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.1) THEN + PHASE=NITMA + GO TO 100 + ELSE + CALL XABORT('@D2P: INTEGER EXPECTED AFTER PHASE KEYWORD') + ENDIF + ELSE IF (TEXT.EQ.'EDIT' ) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.1) THEN + IPRINT=NITMA + GO TO 100 + ELSE + CALL XABORT('@D2P: INTEGER EXPECTED AFTER EDIT KEYWORD') + ENDIF + ELSE IF (TEXT.EQ.'MIX') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.1) THEN + MIX = NITMA + GO TO 100 + ELSE + CALL XABORT('@D2P: INTEGER EXPECTED AFTER MIX KEYWORD') + ENDIF + ELSE IF (TEXT.EQ.'NAMDIR' ) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + MIXDIR=TEXT(1:12) + IF(NITMA.GT.12) CALL XABORT('@D2P: C*12 EXPECTED FOR NAMDIR') + GO TO 100 + ELSE + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER NAMDIR') + ENDIF + ELSE IF (TEXT.EQ. 'TEMP') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + IF (NITMA.NE.1) THEN + CALL XABORT('@D2P: "C" or "K" EXPECTED AFTER TEMP KEYWORD') + ELSE + IF (TEXT.EQ. 'C') THEN + ITEMP=0 + GO TO 100 + ELSE IF (TEXT.EQ. 'K') THEN + ITEMP=1 + GO TO 100 + ELSE + CALL XABORT('@D2P: "C" or "K" EXPECTED AFTER TEMP KEYWORD') + ENDIF + ENDIF + ELSE + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER TEMP KEYWORD') + ENDIF + ELSE IF (TEXT .EQ. 'PKEY') THEN + 15 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER PKEY KEYWORD') + ELSE + IF (TEXT.EQ.REFNAM(1)) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + PKEY(1)=TEXT(:12) + GO TO 15 + ELSE IF (TEXT.EQ.REFNAM(2)) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + PKEY(2)=TEXT(:12) + GO TO 15 + ELSE IF (TEXT.EQ.REFNAM(3)) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + PKEY(3)=TEXT(:12) + GO TO 15 + ELSE IF (TEXT.EQ.REFNAM(4)) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + PKEY(4)=TEXT(:12) + GO TO 15 + ELSE IF (TEXT.EQ.REFNAM(5)) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + PKEY(5)=TEXT(:12) + GO TO 15 + ELSE IF (TEXT.EQ.REFNAM(6)) THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + PKEY(6)=TEXT(:12) + GO TO 15 + ELSE IF (TEXT.EQ.'ENDPKEY') THEN + GO TO 100 + ELSE + CALL XABORT('@D2P: UNKNOWN PKEY NAME : '//TEXT//'.') + ENDIF + ENDIF + ELSE IF (TEXT .EQ. 'OTHER') THEN + IOTHPK=0 + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.1)THEN + CALL XABORT('@D2P: INTEGER EXPECTED AFTER OTHPK CARD') + ENDIF + NOTHPK=NITMA + STAVEC(20)=NOTHPK + DO WHILE (IOTHPK.LT.NOTHPK) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3)THEN + CALL XABORT('@D2P: C*12 (othnam) EXPECTED AFTER OTHPK CARD') + ELSE + IF(NITMA.GT.12)THEN + CALL XABORT('@D2P: C*12 EXPECTED AFTER OTHPK CARD') + ELSE + IOTHPK=IOTHPK+1 + OTHPK(IOTHPK)=TEXT(:12) + ENDIF + ENDIF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3)THEN + CALL XABORT('@D2P: C*1 ((othtyp) EXPECTED AFTER OTHPK CARD') + ELSE + IF(NITMA.GT.1)THEN + CALL XABORT('@D2P: C*1 (othtyp) EXPECTED AFTER OTHPK CARD') + ELSE + IF (TEXT.EQ.'R') THEN + OTHTYP(IOTHPK)=2 + ELSE IF (TEXT.EQ.'I') THEN + OTHTYP(IOTHPK)=1 + ELSE IF (TEXT.EQ.'S') THEN + OTHTYP(IOTHPK)=3 + ELSE + WRITE(6,*) '@D2P: UNKNOWN TYPE (',TEXT(:1),') FOR (', + > OTHPK(IOTHPK),') PKEY.' + CALL XABORT('@D2P: PLEASE USE I/R or S') + ENDIF + ENDIF + ENDIF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.EQ.OTHTYP(IOTHPK))THEN + IF (ITYPLIR.EQ.1) THEN + WRITE(OTHVAL(IOTHPK),*)NITMA + OTHVAR(IOTHPK)=NITMA + ENDIF + IF (ITYPLIR.EQ.2) THEN + WRITE(OTHVAL(IOTHPK),'(f12.5)')FLOTT + OTHVAR(IOTHPK)=FLOTT + ENDIF + IF (ITYPLIR.EQ.3) OTHVAL(IOTHPK)=TEXT(:12) + ELSE + CALL XABORT('@D2P: INCONSISTENT VALUE (othval)') + ENDIF + ENDDO + GO TO 100 + ELSE IF (TEXT .EQ. 'ADF') THEN + 17 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3)THEN + CALL XABORT('@D2P: C*3 EXPECTED AFTER ADF CARD') + ENDIF + IF(NITMA.GT.5) THEN + CALL XABORT('@D2P: C*3 OR C*5 EXPECTED AFTER ADF CARD') + ENDIF + ADF=TEXT(:3) + IF (TEXT(:5).EQ.'MERGE') THEN + STAVEC(21)=1 + GO TO 17 + ELSE IF ((ADF.NE.'SEL') .AND. (ADF .NE.'GET') + > .AND. (ADF .NE.'DRA').AND. (ADF .NE.'GEN')) THEN + WRITE(6,*) "@D2P: UNKNOWN KEYWORD :", ADF + CALL XABORT('@D2P: DRA, SEL OR GET EXPECTED AFTER ADF CARD') + ENDIF + IF (ADF.EQ.'DRA') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.1) THEN + CALL XABORT('@D2P: INTEGER EXPECTED AFTER ADF DRA CARD') + ENDIF + STAVEC(13)=NITMA !NADF + IF((NITMA.NE.1).AND.(NITMA.NE.4)) THEN + CALL XABORT('@D2P: 1 or 4 EXPECTED AFTER ADF DRA CARD') + ENDIF + DO I=1,STAVEC(13) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: NADF STRING EXPECTED AFTER ADF DRA' + > //' CARD') + ENDIF + ADFD(I)=TEXT(:8) + ENDDO + GO TO 100 + ELSEIF (ADF .EQ. 'GEN') THEN + STAVEC(13)= 1 !NADF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF((ITYPLIR.NE.3).AND.(TEXT(:5).NE.'THICK')) THEN + CALL XABORT('@D2P: REFLECTOR THICKNESS (THICK) EXPECTED') + ELSE + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.2) THEN + CALL XABORT('@D2P: REAL EXPECTED FOR REFLECTOR THICKNESS') + ELSE + THCK=FLOTT + ENDIF + ENDIF + DO J=1,2 + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER ADF GEN CARD') + ENDIF + IF ((TEXT(:4).NE.'FLUX').AND.(TEXT.NE.'CURR'))THEN + CALL XABORT('@D2P: FLUX OR CURR KEYWORD EXPECTED AFTER GEN') + ELSE + DO I=1,2 + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED CURR OR FLUX') + ENDIF + IF (J.EQ.1)HFLX(I)=TEXT(:8) + IF (J.EQ.2)HCUR(I)=TEXT(:8) + ENDDO + ENDIF + ENDDO + GO TO 100 + ENDIF + ELSE IF (TEXT .EQ. 'CDF') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3)THEN + CALL XABORT('@D2P: C*3 EXPECTED AFTER CDF CARD') + ENDIF + IF(NITMA.NE.3) THEN + CALL XABORT('@D2P: C*3 EXPECTED AFTER CDF CARD') + ENDIF + CDF=TEXT(:3) + IF ((CDF .NE.'DRA')) THEN + WRITE(6,*) "@D2P: UNKNOWN KEYWORD :", CDF + CALL XABORT('@D2P: DRA EXPECTED AFTER CDF CARD') + ENDIF + IF (CDF.EQ.'DRA') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.1) THEN + CALL XABORT('@D2P: Integer EXPECTED AFTER CDF DRA CARD') + ENDIF + STAVEC(15)=NITMA !NCDF + IF((NITMA.NE.1).AND.(NITMA.NE.2).AND.(NITMA.NE.3).AND. + > (NITMA.NE.4).AND.(NITMA.NE.5).AND.(NITMA.NE.8)) THEN + CALL XABORT('@D2P: 1 to 5 or 8 EXPECTED AFTER CDF DRA' + > //' CARD') + ENDIF + DO I=1,STAVEC(15) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: NCDF String EXPECTED AFTER CDF DRA' + > //' CARD') + ENDIF + CDFD(I)=TEXT(:8) + ENDDO + ENDIF + GO TO 100 + ELSE IF (TEXT .EQ. 'GFF') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3)THEN + CALL XABORT('@D2P: C*3 EXPECTED AFTER GFF CARD') + ENDIF + IF(NITMA.NE.3) THEN + CALL XABORT('@D2P: C*3 EXPECTED AFTER GFF CARD') + ENDIF + GFF=TEXT(:3) + IF ((GFF .NE.'DRA')) THEN + WRITE(6,*) "@D2P: UNKNOWN KEYWORD :", GFF + CALL XABORT('@D2P: DRA EXPECTED AFTER GFF CARD') + ENDIF + GO TO 100 + ELSE IF (TEXT.EQ.'FUEL' ) THEN + FA_K=1 + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT ('@D2P: KEYWORD BARR EXPECTED AFTER FUEL CARD') + ELSE IF (TEXT.EQ.'BARR') THEN + 10 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.1 .AND. TEXT .NE.'ENDBARR') THEN + IF (TEXT .EQ. 'DEF' .OR. TEXT .EQ. 'USER') THEN + NCRD = NCRD + 1 + IF (NCRD <= 20) THEN + CRDINF(NCRD)=NITMA + GO TO 10 + ELSE + CALL XABORT('@D2P: NUMBER OF BARR COMPOSITIONS EXCEED 20') + ENDIF + ELSE + CALL XABORT('@D2P: DEF OR USER KEYWORD EXPECTED AFTER BARR' + 1 //' KEYWORD') + ENDIF + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT .NE. ';' ) THEN + 11 IF (TEXT .EQ. 'GRID') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER GRID KEYWORD') + ELSE + IF((TEXT.EQ.'SAP').OR.(TEXT.EQ.'DEF').OR. + 1 (TEXT.EQ.'USER')) THEN + IF (TEXT.EQ.'SAP') THEN + MESH=TEXT(:5) + GO TO 10 + ELSE IF (TEXT.EQ.'DEF') THEN + MESH=TEXT(:5) + GO TO 10 + ELSE IF (TEXT.EQ.'USER') THEN + 12 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: KEYWORD EXPECTED AFTER USER KEYWORD') + ELSE IF (TEXT.EQ.'NEW') THEN + LNEW=.TRUE. + GO TO 12 + ELSE IF (TEXT.EQ.'GLOBAL') THEN + IF (LNEW) THEN + CALL XABORT('@D2P: INCOMPATIBLE OPT GLOBAL WITH NEW') + ENDIF + MESH='GLOB' + 90 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: PKEY NAME EXPECTED IN GLOBAL OPT') + ELSE + IF (TEXT.EQ.'ENDGLOBAL') GO TO 10 + IF(NITMA > 12) THEN + CALL XABORT('@D2P: PKEY NAME IN GLOBAL MUST BE C*12') + ELSE + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + USRSTA = USRSTA+1 + USRPAR(USRSTA)=TEXT(:12) + IF (ITYPLIR.NE.1) THEN + CALL XABORT ('@D2P: NB OF VALUES FOR STATE '//TEXT// + 1 ' EXPECTED') + ELSE + USRVAL(USRSTA)=NITMA + GO TO 90 + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'ADD') THEN + MESH='ADD' + LADD=.TRUE. + 95 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: PKEY NAME EXPECTED IN USER ADD OPT') + ELSE + IF (TEXT.EQ.'ENDADD') GO TO 10 + IF(NITMA.GE.12) THEN + CALL XABORT('@D2P: STATE NAME IN ADD MUST BE C*12') + ELSE + USRSTA = USRSTA+1 + USRPAR(USRSTA)=TEXT(:12) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.1) THEN + CALL XABORT('@D2P: NB OF VALUES FOR STATE '//TEXT// + 1 'EXPECTED') + ELSE + USRVAL(USRSTA)=NITMA + DO UV=1,USRVAL(USRSTA) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR .NE. 2) THEN + CALL XABORT ('@D2P: REAL EXPECTED IN USER ADD OPT') + ELSE + USRVAPK(USRSTA,UV)=FLOTT + ENDIF + ENDDO + UV=1 + GO TO 95 + ENDIF + ENDIF + ENDIF + ELSE + CALL XABORT('@D2P: UNKNOWN OPTION '//TEXT// + 1 'FOR USER OPT') + ENDIF + ENDIF + ELSE + CALL XABORT('@D2P: UNKNOWN OPTION FOR GRID KEYWORD') + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'DEF' .OR. TEXT.EQ.'USER') THEN + CRDMOD=TEXT(:4) + GO TO 10 + ELSE IF (TEXT.EQ.'ENDBARR') THEN + IF (CRDMOD=='DEF') THEN + CALL XABORT('@D2P: ENDBARR KEYWORD IS EXPECTED ONLY FOR' + 1 //' USER BARR COMPOSITION') + ELSE + GO TO 10 + ENDIF + ELSE IF (TEXT .EQ. 'SCATTERING') THEN + SCAT=.TRUE. + GO TO 10 + ELSE IF (TEXT .EQ. 'DET') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF(ITYPLIR.NE.3)THEN + CALL XABORT('@D2P: C*12 EXPECTED AFTER DET CARD') + ENDIF + IF(NITMA.GT.12) THEN + CALL XABORT('@D2P: C*12 EXPECTED AFTER GFF CARD') + ENDIF + HDET=TEXT(:12) + GO TO 10 + ELSE IF (TEXT .EQ. 'ABSORPTION') THEN + 5 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: C*6 EXPECTED AFTER ABSORPTION KEYWORD') + ELSE IF (TEXT .EQ. 'MIC') THEN + MIC =.TRUE. + GO TO 10 + ELSE IF (TEXT .EQ. 'SAP') THEN + SAP =.TRUE. + MIC =.FALSE. + GO TO 5 + ELSE IF (TEXT .EQ. 'EXCESS') THEN + IF (SAP .EQV. .FALSE.) THEN + CALL XABORT('@D2P: SAP KEYWORD EXPECTED BEFORE EXCESS') + ELSE + EXCESS = .TRUE. + GO TO 10 + ENDIF + ELSE + GO TO 11 + ENDIF + ELSE IF (TEXT .EQ. 'ISOTOPES') THEN + 25 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER PKEY KEYWORD') + ELSE + IF (TEXT.EQ.'XE135') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(1)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'SM149') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(2)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'I135') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(3)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'PM149') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(4)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'PM148') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(5)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'PM148M') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(6)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'PM147') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(8)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'ND147') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + ISOT(7)=TEXT(:12) + GO TO 25 + ELSE IF (TEXT.EQ.'ENDISOTOPES') THEN + GO TO 10 + ELSE + CALL XABORT('@D2P: UNKNOWN NAME OF ISOTOPE: '//TEXT//'.') + ENDIF + ENDIF + ELSE IF (TEXT .EQ. 'YLD') THEN + 37 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER YLD KEYWORD') + ELSE + IF (TEXT(:3).EQ.'COR') THEN + LCOR=.TRUE. + GO TO 37 + ELSE + IF (.NOT.LCOR) STAVEC(22)=0 + YLDOPT=TEXT(:3) + IF (YLDOPT.EQ.'REF') THEN + IF (LCOR) STAVEC(22)=1 + GO TO 10 + ELSE IF (YLDOPT.EQ.'FIX') THEN + IF (LCOR) THEN + WRITE (6,*) '@D2P : NO CORRECTION POSSIBLE OF FISSION' + CALL XABORT ('YIELDS WITH THE FIX OPTION') + ENDIF + DO I=1, 3 + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR==2) THEN + YLD(I)=FLOTT + ELSE + CALL XABORT('REAL EXPECTED FOR YIELD VALUES') + ENDIF + ENDDO + GO TO 10 + ELSE IF (YLDOPT.EQ.'MAN') THEN + IF (LCOR) STAVEC(22)=2 + 35 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + I=1 + DO WHILE (TEXT.NE.REFNAM(I).AND.(I.LE.5)) + I=I+1 + ENDDO + IF (I.GT.5) THEN + IF (TEXT.EQ.'ENDMAN') GO TO 10 + CALL XABORT('@D2P: PKEY NAME ('//TEXT(:12)//') NOT ' + > //'ALLOWED IN YIELD CARD') + ELSE + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF (ITYPLIR.EQ.2) THEN + LOCYLD(I)=FLOTT + GO TO 35 + ELSE + CALL XABORT('@D2P: SOMETHING WRONG OCCURS IN YLD CARD') + ENDIF + ENDIF + ELSE + CALL XABORT('@D2P: UNKNOWN OPTION FOR YLD: '//TEXT//'.') + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'GENPMAXS') THEN + GO TO 120 + ELSE IF (TEXT.EQ.'HELIOS') THEN + GO TO 21 + ELSE IF (TEXT.EQ.'PROC') THEN + GO TO 220 + ELSE + CALL XABORT('@D2P: SOMETHING WRONG OCCURS IN INPUT DATA') + ENDIF + ELSE + GOTO 200 + ENDIF + ENDIF + ELSE + CALL XABORT('@D2P: UNKNOWN KEYWORD '//TEXT//', BARR EXPECTED') + ENDIF + ELSE IF (TEXT .EQ. 'REFLECTOR') THEN + FA_K=0 + NCRD=1 + CRDINF(1)=1 + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: SOMETHING WRONG OCCURS IN REFLECTOR DATA') + ELSE IF (ITYPLIR.EQ.3) THEN + IF ((TEXT.NE.';'))THEN + IF (TEXT.EQ.'GENPMAXS') THEN + GO TO 120 + ELSE IF (TEXT.EQ.'HELIOS') THEN + GO TO 21 + ELSE IF (TEXT.EQ.'PROC') THEN + GO TO 220 + ELSE + CALL XABORT('@D2P: SOMETHING WRONG OCCURS IN INPUT DATA') + ENDIF + ELSE + GOTO 200 + ENDIF + ELSE + CALL XABORT('@D2P: UNKNOWN KEYWORD'//TEXT//', IN INPUT DATA') + ENDIF + ENDIF + + 21 IF (TEXT .EQ. 'HELIOS') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + 30 IF (ITYPLIR.NE.3) THEN + CALL XABORT ('@D2P: KEYWORD EXPECTED AFTER HELIOS CARD') + ELSE IF (TEXT.EQ.'FILE_CONT_1') THEN + 40 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.EQ.1).OR.(ITYPLIR.EQ.2)) THEN + NFC1 = NFC1 +1 + IF (NFC1 <= 5) THEN + IF (ITYPLIR.EQ.1) FC1(NFC1) = NITMA + IF (ITYPLIR.EQ.2) FC1(NFC1) = FLOTT + GO TO 40 + ELSE + CALL XABORT('@D2P: FIVE VALUES FOR FILE_CONT_1 ARE EXPECTED') + ENDIF + ELSE IF (ITYPLIR.EQ.3) THEN + IF (NFC1.NE.5) THEN + CALL XABORT('@D2P: FIVE VALUES FOR FILE_CONT_1 ARE EXPECTED') + ENDIF + IF (TEXT .NE. ';' ) THEN + GO TO 30 + ELSE + GOTO 200 + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'FILE_CONT_2') THEN + + 50 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF (ITYPLIR.EQ.2) THEN + NFC2 = NFC2 +1 + IF (NFC2 <= 8) THEN + FC2(NFC2) = FLOTT + GO TO 50 + ELSE + CALL XABORT('@D2P: 8 VALUES AT MOST IN FILE_CONT_2') + ENDIF + ELSE IF (ITYPLIR.EQ.1) THEN + CALL XABORT('@D2P: REAL VALUES EXPECTED IN FILE_CONT_2') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (NFC2<2) THEN + CALL XABORT('@D2P: 2 VALUES AT LEAST IN FILE_CONT_2') + ENDIF + IF (TEXT .NE. ';' ) THEN + GO TO 30 + ELSE + GOTO 200 + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'FILE_CONT_3') THEN + + 60 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF (ITYPLIR.EQ.2) THEN + NFC3 = NFC3 +1 + IF (NFC3 <= 7) THEN + FC3(NFC3) = FLOTT + GO TO 60 + ELSE + CALL XABORT('@D2P: 7 VALUES IN FILE_CONT_3 EXPECTED') + ENDIF + ELSE IF (ITYPLIR.EQ.1) THEN + CALL XABORT('@D2P: REAL VALUES EXPECTED IN FILE_CONT_3 ') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (NFC3<7) THEN + CALL XABORT('@D2P: 7 VALUES FOR FILE_CONT_3 EXPECTED') + ENDIF + IF (TEXT .NE. ';' ) THEN + GO TO 30 + ELSE + GOTO 200 + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'FILE_CONT_4') THEN + + 70 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF (ITYPLIR.EQ.2) THEN + NFC4 = NFC4 +1 + IF (NFC4 <= 3) THEN + FC4(NFC4) = FLOTT + GO TO 70 + ELSE + CALL XABORT('@D2P: 3 VALUES IN FILE_CONT_4 EXPECTED') + ENDIF + ELSE IF (ITYPLIR.EQ.1) THEN + CALL XABORT('@D2P: REAL VALUES EXPECTED IN FILE_CONT_4') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (NFC4<3) THEN + CALL XABORT('@D2P: 3 VALUES IN FILE_CONT_4 EXPECTED') + ENDIF + IF (TEXT .NE. ';' ) THEN + GO TO 30 + ELSE + GOTO 200 + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'XS_CONT') THEN + + 80 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF ((ITYPLIR.EQ.1).OR.(ITYPLIR.EQ.2)) THEN + NXC = NXC +1 + IF (NXC <= 3) THEN + IF (ITYPLIR.EQ.1) XSC(NXC) = NITMA + IF (ITYPLIR.EQ.2) XSC(NXC) = FLOTT + GO TO 80 + ELSE + CALL XABORT('@D2P: 3 VALUES IN XS_CONT ARE EXPECTED') + ENDIF + ELSE IF (ITYPLIR.EQ.3) THEN + IF (NXC<3) THEN + CALL XABORT('@D2P: 3 VALUES FOR XS_CONT ARE EXPECTED') + ENDIF + IF (TEXT .NE. ';' ) THEN + GO TO 30 + ELSE + GOTO 200 + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'GENPMAXS')THEN + GO TO 120 + ELSE IF (TEXT.EQ.'PROC')THEN + GO TO 220 + ELSE + CALL XABORT ('@D2P: UNKNOWN KEYWORD: '//TEXT//'.') + ENDIF + ENDIF + + + + 120 IF (TEXT .EQ. 'GENPMAXS') THEN + + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + 130 IF (ITYPLIR.NE.3) THEN + CALL XABORT ('@D2P: KEYWORD EXPECTED AFTER GENPMAXS CARD') + ELSE IF (TEXT.EQ.'JOB_TIT') THEN + + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF ((ITYPLIR.NE.3)) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER JOB_TIT CARD') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT .NE. ';' ) THEN + JOBTIT=TEXT(:16) + IF (NITMA>16) THEN + CALL XABORT('@D2P: JOB_TIT NAME TOO LONG (>C*16)') + ENDIF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + GO TO 130 + ELSE + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER JOB_TIT CARD') + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'FILE_NAME') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.3)) THEN + CALL XABORT('CHARACTER EXPECTED AFTER JOB_TIT CARD') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT .NE. ';' ) THEN + FILNAM=TEXT(:12) + IF (NITMA>12) THEN + CALL XABORT('FILE_NAME NAME TOO LONG (>C*12)') + ENDIF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + GO TO 130 + ELSE + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER FILE_NAME CARD') + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'DERIVATIVE') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.3)) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER DERIVATIVE CARD') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT .NE. ';' ) THEN + IF ((TEXT.EQ.'T').OR.(TEXT.EQ.'F')) THEN + DER=TEXT(:4) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + GO TO 130 + ELSE + CALL XABORT('@D2P: (T/F) EXECTED AFTER DERIVATIVE CARD') + ENDIF + ELSE + CALL XABORT('@D2P: (T/F) EXPECTED AFTER DERIVATIVE CARD') + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'COMMENT') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.3)) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER COMMENT CARD') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT .NE. ';' ) THEN + COM=TEXT(:40) + IF (NITMA>40)THEN + CALL XABORT('@D2P: COMMENT NAME TOO LONG (>C*40)') + ENDIF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + GO TO 130 + ELSE + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER COMMENT CARD') + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'JOB_OPT') THEN + 140 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF ((ITYPLIR.NE.3)) THEN + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER JOB_OPT CARD') + ELSE IF (ITYPLIR.EQ.3) THEN + IF (TEXT .NE. ';' ) THEN + JOBT=JOBT+1 + + IF ((TEXT.EQ.'T').OR.(TEXT.EQ.'F')) THEN + IF (JOBT<=14) THEN + JOBOPT(JOBT)=TEXT(:1) + GO TO 140 + ELSE + WRITE (6,*) '@D2P: LAST JOB_OPT VALUE :', TEXT + CALL XABORT('@D2P: 14 VALUES EXPECTED FOR JOB_OPT CARD') + ENDIF + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + GO TO 130 + ELSE + IF (JOBT<=14) THEN + WRITE (6,*)'@D2P: ',JOBT,'th JOB_OPT VALUE :', TEXT + CALL XABORT('@D2P: (T/F) VALUES EXPECTED FOR JOB_OPT CARD') + ELSE + GO TO 130 + ENDIF + ENDIF + ELSE IF (JOBT==14 .and. TEXT==';') THEN + GO TO 190 + ELSE IF (JOBT==15) THEN + GO TO 130 + ELSE + CALL XABORT('@D2P: CHARACTER EXPECTED AFTER JOB_OPT CARD') + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'IUPS') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.1)) THEN + CALL XABORT('@D2P: INTEGER EXPECTED AFTER IUPS CARD') + ELSE IF (ITYPLIR.EQ.1) THEN + IF ((NITMA>2).OR.(NITMA<0)) THEN + CALL XABORT ('@D2P: IUPS INTEGER MUST BE 0,1 or 2') + ELSE + IUPS=NITMA + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + GO TO 130 + ELSE + CALL XABORT('@D2P: ONLY 1 VALUE IS EXPECTED FOR IUPS') + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'XESM') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.1)) THEN + CALL XABORT('@D2P: INTEGER EXPECTED AFTER XESM CARD') + ELSE IF (ITYPLIR.EQ.1) THEN + IF ((NITMA>3).OR.(NITMA<1)) THEN + CALL XABORT ('@D2P: XESM CARD INTEGER MUST BE 1,2 or 3') + ELSE + XESM=NITMA + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + GO TO 130 + ELSE + CALL XABORT('@D2P: ONLY 1 VALUE IS EXPECTED FOR XESM') + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'VERSION') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.2)) THEN + CALL XABORT('@D2P: REAL EXPECTED AFTER VERSION CARD') + ELSE IF (ITYPLIR.EQ.2) THEN + IF ((FLOTT<0)) THEN + CALL XABORT ('@D2P: VERSION NUMBER MUST BE POSITIVE') + ELSE + VERS=FLOTT + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + GO TO 130 + ELSE + CALL XABORT('@D2P: ONLY ONE VALUE IS EXPECTED FOR VERSION') + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'SFAC') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.2)) THEN + CALL XABORT('@D2P: REAL EXPECTED AFTER SFAC CARD') + ELSE IF (ITYPLIR.EQ.2) THEN + IF ((FLOTT<0)) THEN + CALL XABORT ('@D2P: SFAC FACTOR MUST BE POSITIVE') + ELSE + SFAC=FLOTT + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + GO TO 130 + ELSE + CALL XABORT('@D2P: ONLY ONE VALUE IS EXPECTED FOR SFAC ') + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT.EQ.'BFAC') THEN + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF ((ITYPLIR.NE.2)) THEN + CALL XABORT('@D2P: REAL EXPECTED AFTER BFAC CARD') + ELSE IF (ITYPLIR.EQ.2) THEN + IF ((FLOTT<0)) THEN + CALL XABORT ('@D2P: BFAC FACTOR MUST BE POSITIVE') + ELSE + BFAC=FLOTT + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + IF (ITYPLIR.EQ.3) THEN + GO TO 130 + ELSE + CALL XABORT('@D2P: ONLY 1 VALUE IS EXPETCTED FOR BFAC') + ENDIF + ENDIF + ENDIF + ELSE IF (TEXT .EQ. ';' ) THEN + GO TO 190 + ELSE IF (TEXT .EQ. 'PROC') THEN + GO TO 220 + ELSE + CALL XABORT ('@D2P: UNKNOWN KEYWORD: '//TEXT//'.') + ENDIF + ENDIF + + 220 IF (TEXT .EQ. 'PROC') THEN + LPRC=.TRUE. + 221 CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + + IF (ITYPLIR.NE.3) THEN + CALL XABORT ('@D2P: C*4 EXPECTED AFTER PROC CARD') + ELSE IF (TEXT.EQ.';') THEN + GO TO 190 + ELSE IF (TEXT.EQ.'MEMO')THEN + LMEM=.TRUE. + GO TO 221 + ELSE IF ((NITMA .NE. 4)) THEN + CALL XABORT ('@D2P: C*4 EXPECTED AFTER PROC CARD') + ELSE + OPT=TEXT(:4) + CALL REDGET(ITYPLIR,NITMA,FLOTT,TEXT,DFLOT) + SELECT CASE (OPT) + CASE ('ISOT') + IF (TEXT.EQ."*") THEN + ISOTOPT=TEXT(:1) + ELSE IF(ITYPLIR.NE.2) THEN + CALL XABORT('@D2P: * OR REAL EXPECTED AFTER ISOT CARD') + ELSE + ISOTOPT='R' + ISOTVAL=FLOTT + ENDIF + CASE ('EQUI') + IF(ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: HEQUI (C*4) EXPECTED AFTER EQUI CARD') + ELSE + IF (NITMA.NE.4) THEN + CALL XABORT('@D2P: HEQUI (C*4) EXPECTED AFTER EQUI CARD') + ELSE + HEQUI=TEXT(:4) + ENDIF + ENDIF + CASE ('MASL') + IF(ITYPLIR.NE.3) THEN + CALL XABORT('@D2P: HMASL (C*4) EXPECTED AFTER MASL CARD') + ELSE + IF (NITMA.NE.4) THEN + CALL XABORT('@D2P: HMASL (C*4) EXPECTED AFTER MASL CARD') + ELSE + HMASL=TEXT(:4) + ENDIF + ENDIF + + CASE DEFAULT + CALL XABORT('@D2P: UNKNOWN OPTION ('//OPT//') IN PROC CARD') + END SELECT + GO TO 221 + ENDIF + + + ENDIF + + 190 IF (TEXT(:1) .EQ. ';' ) THEN + IF (NFC2.NE.0) NGP = NFC2 + IF (JOBT.NE.14) THEN + IF (JOBT.NE.15) THEN + IF (JOBT.NE.0)THEN + CALL XABORT('@D2P: 14 VALUES EXPECTED FOR JOB_OPT') + ENDIF + ENDIF + ENDIF + GO TO 200 + ELSE + CALL XABORT('@D2P: UNKNOWN KEYWORD:'//TEXT//'.') + ENDIF + ENDIF + + + + 200 IF (PHASE.EQ.1) THEN + IF ((ADF.EQ.'NUL') .and. (JOBOPT(1).EQ.'T')) THEN + WRITE(6,*)"@D2P: ADF CALCULATION REQUIRED, PLEASE USE THE 'ADF'", + > " CARD." + CALL XABORT("") + ELSE IF ((ADF.NE.'NUL') .and. (JOBOPT(1).EQ.'F')) THEN + WRITE(6,*)"@D2P: ADF CALCULATION REQUIRED, PLEASE TURN ON THE ", + > "'ladf' FLAG IN JOB_OPT CARD." + CALL XABORT("") + ENDIF + IF ((CDF.EQ.'NUL') .and. (JOBOPT(10).EQ.'T')) THEN + WRITE(6,*)"@D2P: CDF CALCULATION REQUIRED, PLEASE USE THE 'CDF'", + > " CARD." + CALL XABORT("") + ELSE IF ((CDF.NE.'NUL') .and. (JOBOPT(10).EQ.'F')) THEN + WRITE(6,*)"@D2P: CDF CALCULATION REQUIRED, PLEASE TURN ON THE ", + > "'lcdf' FLAG IN JOB_OPT CARD." + CALL XABORT("") + ENDIF + IF ((GFF.EQ.'NUL') .and. (JOBOPT(11).EQ.'T')) THEN + WRITE(6,*)"@D2P: GFF CALCULATION REQUIRED, PLEASE USE THE 'GFF'", + > " CARD." + CALL XABORT("") + ELSE IF ((CDF.NE.'NUL') .and. (JOBOPT(10).EQ.'F')) THEN + WRITE(6,*)"@D2P: GFF CALCULATION REQUIRED, PLEASE TURN ON THE ", + > "'lgff' FLAG IN JOB_OPT CARD." + CALL XABORT("") + ENDIF + IF (FA_K==0) THEN + IF ((ADF.EQ.'SEL').OR.(ADF.EQ.'GET')) THEN + CALL XABORT('@D2P: ADF OF TYPE DRA EXPECTED FOR REFLECTOR CASE') + ENDIF + DO I=2, 16 + IF (JOBOPT(I).EQ.'T') THEN + JOBOPT(I)='F' + WRITE(6,*)"@D2P: JOB_OPT(",I,") SET TO 'F' FOR RELFECTOR CASE" + ENDIF + ENDDO + ENDIF + ENDIF + CALL D2PDRV( NENTRY, HENTRY, IENTRY, JENTRY, KENTRY, NGP, + > NCRD, MIX, FA_K, IUPS, USRSTA, PHASE, + > IPRINT, STAVEC, CRDINF, USRVAL, VERS, SFAC, + > BFAC, FC1, FC2, FC3, FC4, XSC, + > USRVAPK, ADF, DER, JOBOPT, USRPAR, MESH, + > PKEY, FILNAM, ISOT, JOBTIT, COM, SAP, + > MIC, EXC, SCAT, LADD, LNEW, MIXDIR, + > CDF, GFF, ADFD, CDFD, YLD, YLDOPT, + > LOCYLD, XESM, ITEMP, OTHPK, OTHTYP, OTHVAL, + > HDET, LPRC, HEQUI, HMASL ,ISOTOPT,ISOTVAL, + > LMEM, OTHVAR, THCK, HFLX, HCUR ) + + END diff --git a/Donjon/src/D2PADF.f b/Donjon/src/D2PADF.f new file mode 100644 index 0000000..7cbb735 --- /dev/null +++ b/Donjon/src/D2PADF.f @@ -0,0 +1,364 @@ +*DECK D2PADF + SUBROUTINE D2PADF (IPDAT,IPRINT,NG,NMIL, ADF, NSF, DIFC,CURRN, + 1 SRFLX,ZAFLX,RPAR,IPAR,ADF_T,STAIDX,NVAR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* CALL to GET_SAP_ADF to recover ADF information. +* +*Author(s): +* J. Taforeau +* +*Parameters: +* IPDAT +* IPRINT +* NG +* NMIL +* ADF +* NSF +* DIFC +* CURRN +* SRFLX +* ZAFLX +* RPAR +* IPAR +* ADF_T +* STAIDX +* NVAR +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPTH,KPTH + INTEGER IPRINT,NG,NMIL,NSF,IPAR(3,NSF),NVAR + REAL ADF(NSF,NG,10),DIFC(NG),CURRN(NSF,NG,2),SRFLX(NSF,NG), + 1 ZAFLX(NMIL,NG) + DOUBLE PRECISION RPAR(6,NSF) + CHARACTER*3 ADF_T + INTEGER STAIDX(NVAR) ! Index of current branch state values +*---- +* LOCAL VARIABLES +*---- + REAL SIDE,APOTHEM,VOLUME + INTEGER :: NSD = 4 + INTEGER TOS(-1:1,-1:1) + REAL SIGF(4) + INTEGER DX, DY, SOT, IAXIS + INTEGER NAXIS,NPAIR(2),CAXIS(4),PAXIS(0:1,2),TRF_I(2,4) + INTEGER ICELL(2),NSURF(2) + INTEGER IND, NZ, NC, IPAIR, IA, IP, NSURFAC,P, TR,NS,NGRP + REAL*8 :: J_NET,J_PLUS,J_MINOS,FI_HET,TRANSV_CURR,FI_HOMOG,FAVE + REAL*8 :: J_SUMM + REAL :: B2_VECT(NMIL,NG), DIFF_C(NMIL,NG) ! B2 and D vectors + REAL :: APOTH(NMIL,4) + LOGICAL :: HASSYM(2,NMIL) + INTEGER INTCORR(0:1,1,2) + REAL CURR_INFO(1:(NMIL+1),NG,NSF,9) + + IF(NMIL > 1) CALL XABORT ('@D2P: MORE THAN 1 MIXTRURE ') + IF(NSF .NE. NSD) CALL XABORT('@D2PADF: NUMBER OF SURFACE NE 4') + + SIDE= REAL(MAXVAL(RPAR(5,:))) + APOTHEM= SIDE/2.0 + VOLUME= NSF*SIDE*APOTHEM/2.0 + CURR_INFO= 0.0 + ! TOS is the interface number corresponding to the cell + ! to the right of the equation number (interface) + TOS= 0 + TOS( 0, 1)= 4 !DX=0 DY>0 west + TOS( 0,-1)= 2 !DX=0 DY<0 east + TOS( 1, 0)= 1 !DX>0 DY=0 north + TOS(-1, 0)= 3 !DX<0 DY=0 south + + SIGF(1)= 1. + SIGF(2)= 1. + SIGF(3)= 1. + SIGF(4)= 1. + + !deltas in sense counterclokwise around the geometry + !AXIS 1 DX>0 DY=0 + !AXIS 2 DX=0 DY>0 + NPAIR= 0 + NAXIS= 2 + + INTCORR= 0 + !AXIS 1 + INTCORR(0,1,1)= 1 + INTCORR(1,1,1)= 3 + NPAIR(1)= 1 + !AXIS 2 + INTCORR(0,1,2)= 2 + INTCORR(1,1,2)= 4 + NPAIR(2)= 1 + + !axis not crossing the surface + CAXIS(1)= 1 + CAXIS(2)= 2 + CAXIS(3)= CAXIS(1) + CAXIS(4)= CAXIS(2) + !axis crossing a surface + PAXIS(0,1)= 2 + PAXIS(1,1)= 4 + PAXIS(0,2)= 1 + PAXIS(1,2)= 3 + + HASSYM= .FALSE. + ! coefficient related to the transversal component of the J+. + ! each surface has its 2 transversal components + ! first surface + TRF_I(1,1)= 2 + TRF_I(2,1)= 4 + + ! 2-nd surface + TRF_I(1,2)= 1 + TRF_I(2,2)= 3 + + ! 3-th surface + TRF_I(1,3)= 2 + TRF_I(2,3)= 4 + + ! 4-th surface + TRF_I(1,4)= 1 + TRF_I(2,4)= 3 + + ADF=0.0 + SOT=0 + + CURR_INFO= 0.0 !this is needed to know where to apply simmetries + + DO NS= 1,NSF + + ICELL(1)= IPAR(2,NS) + ICELL(2)= IPAR(3,NS) + + IF(RPAR(3,NS).LT.-1.E-3) THEN + DX = -1 + ELSEIF(RPAR(3,NS).GT.1.E-3) THEN + DX = 1 + ELSE + DX = 0 + ENDIF + + IF(RPAR(4,NS).LT.-1.E-3) THEN + DY = -1 + ELSEIF(RPAR(4,NS).GT.1.E-3) THEN + DY = 1 + ELSE + DY = 0 + ENDIF + ! check for the boundary regions + + IF(ICELL(1).LE.0) THEN + ICELL(1)= NMIL+1 +! WRITE (*,*) 'BORDER TO THE RIGHT! MESH CH ', ICELL(1) + ENDIF + + IF(ICELL(2).LE.0) THEN + ICELL(2)= NMIL+1 +! WRITE (*,*) 'BORDER TO THE LEFT! MESH CH ', ICELL(2) + ENDIF + ! equations at the boundary: + ! mesh on the left indicator of the surface ------------ + IF(TOS(DX,DY).EQ.1) SOT= 3 + IF(TOS(DX,DY).EQ.2) SOT= 4 + IF(TOS(DX,DY).EQ.3) SOT= 1 + IF(TOS(DX,DY).EQ.4) SOT= 2 + ! + !------------------------------------------------------- + ! loop for the values of the J+-, J, FI + DO NGRP= 1,NG + ! J+ + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),1)= + > CURRN(NS,NGRP,2)/REAL(RPAR(5,NS)) + CURR_INFO(ICELL(2),NGRP,SOT,1)= + > CURRN(NS,NGRP,1)/REAL(RPAR(5,NS)) + ! J- + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),2)= + > CURRN(NS,NGRP,1)/REAL(RPAR(5,NS)) + CURR_INFO(ICELL(2),NGRP,SOT ,2)= + > CURRN(NS,NGRP,2)/REAL(RPAR(5,NS)) + + ! J + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),3)= + > CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),1) - + > CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),2) + + CURR_INFO(ICELL(2),NGRP,SOT ,3)= + > CURR_INFO(ICELL(2),NGRP,SOT ,1) - + > CURR_INFO(ICELL(2),NGRP,SOT ,2) + ! F-surf(het) + IF(ICELL(1).EQ.(NMIL+1)) THEN + IF(HASSYM(CAXIS(SOT),ICELL(2))) THEN + CURR_INFO(ICELL(2),NGRP,SOT,4) = 0.0 + ELSE + CURR_INFO(ICELL(2),NGRP,SOT,4) = SRFLX(NS,NGRP) + > / REAL(RPAR(5,NS)) + ENDIF + ELSEIF(ICELL(2).EQ.(NMIL+1)) THEN + IF(HASSYM(CAXIS(TOS(DX,DY)),ICELL(1))) THEN + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),4) = 0.0 + ELSE + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),4) = + > SRFLX(NS,NGRP)/REAL(RPAR(5,NS)) + ENDIF + ELSE ! both cells are real + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),4) = + > SRFLX(NS,NGRP)/REAL(RPAR(5,NS)) + CURR_INFO(ICELL(2),NGRP,SOT ,4) = + > SRFLX(NS,NGRP)/REAL(RPAR(5,NS)) + ENDIF + ! side dimension + CURR_INFO(ICELL(1),NGRP,TOS(DX,DY),9)= REAL(RPAR(5,NS)) + CURR_INFO(ICELL(2),NGRP,SOT ,9)= REAL(RPAR(5,NS)) + + NSURF(1)= TOS(DX,DY) + NSURF(2)= SOT + DO IND= 1,2 + IF(ICELL(IND) < (NMIL+1)) THEN + NZ= ICELL(IND) + ! FI + CURR_INFO(NZ,NGRP,:,5)=ZAFLX(NZ,NGRP) + ENDIF + ENDDO + ENDDO + ENDDO ! NS + + DO NC= 1,NMIL + DO IAXIS= 1,NAXIS + IF(HASSYM(IAXIS,NC)) THEN + DO IPAIR= 1,NPAIR(IAXIS) + ! put current value in the interface in front of it + IF(CURR_INFO(NC,1,INTCORR(0,IPAIR,IAXIS),4).NE.0.) THEN + CURR_INFO(NC,:,INTCORR(1,IPAIR,IAXIS),1:9)= + > CURR_INFO(NC,:,INTCORR(0,IPAIR,IAXIS),1:9) + ELSEIF(CURR_INFO(NC,1,INTCORR(1,IPAIR,IAXIS),4).NE.0.) + > THEN + CURR_INFO(NC,:,INTCORR(0,IPAIR,IAXIS),1:9)= + > CURR_INFO(NC,:,INTCORR(1,IPAIR,IAXIS),1:9) + ENDIF + ENDDO + ENDIF + ENDDO + + ! now put the possible zero dimension values + DO IA= 1,NAXIS + DO IP= 1,NPAIR(IA) + ! put current value in the interface in front of it + IF(CURR_INFO(NC,1,INTCORR(0,IP,IA),9) .NE. 0.) THEN + ELSE + CURR_INFO(NC,:,INTCORR(0,IP,IA),1:9) = + > CURR_INFO(NC,:,INTCORR(1,IP,IA),1:9) + ENDIF + IF(CURR_INFO(NC,1,INTCORR(1,IP,IA),9) .NE. 0.)THEN + ELSE + CURR_INFO(NC,:,INTCORR(1,IP,IA),1:9) = + > CURR_INFO(NC,:,INTCORR(0,IP,IA),1:9) + ENDIF + ENDDO + ENDDO + ENDDO ! NC + +!------------------------------------------------------- + DO NC= 1,NMIL + DO NSURFAC= 1,NSD + DO NGRP= 1,NG + + DIFF_C(NC,NGRP)= DIFC(NGRP) + J_PLUS = CURR_INFO(NC,NGRP,NSURFAC,1) + J_MINOS= CURR_INFO(NC,NGRP,NSURFAC,2) + J_NET = CURR_INFO(NC,NGRP,NSURFAC,3) + FI_HET = CURR_INFO(NC,NGRP,NSURFAC,4) + FAVE = CURR_INFO(NC,NGRP,NSURFAC,5) + + APOTH(NC,NSURFAC)= + > CURR_INFO(NC,NGRP,PAXIS(0,CAXIS(NSURFAC)),9)/2.0 + CURR_INFO(NC,NGRP,NSURFAC,8)= APOTH(NC,NSURFAC) + FI_HOMOG = SIGF(NSURFAC)*J_NET * APOTH(NC,NSURFAC) + > / DIFF_C(NC,NGRP) + FAVE + ! FG: + CURR_INFO(NC,NGRP,NSURFAC,6)= REAL(FI_HET / FI_HOMOG) + ! FS: + CURR_INFO(NC,NGRP,NSURFAC,7)= REAL(2. * + > ( J_PLUS + J_MINOS ) / FI_HOMOG) + + ENDDO !NGRP + ENDDO !NSURFAC + ENDDO !NC + ! + ! B2 loop: + ! + DO NCELL= 1,NMIL + DO NGRP= 1,NG + J_SUMM = SUM(CURR_INFO(NCELL,NGRP,:,3)) + + B2_VECT(NCELL,NGRP)= REAL(J_SUMM / ( DIFF_C(NCELL,NGRP) + > * CURR_INFO(NCELL,NGRP,1,5) )) + ENDDO + ENDDO + + DO NCELL= 1,NMIL + DO NGRP= 1,NG + DO NSURFAC= 1,NSD + ! TRANSVERSAL CURRENTS SUMMATION + TRANSV_CURR= 0. + DO TR= 1,2 + TRANSV_CURR= TRANSV_CURR + + > CURR_INFO(NCELL,NGRP,TRF_I(TR,NSURFAC),3) + ENDDO + ! no need to be stored !!!! + ! CURR_INFO(NCELL,NGRP,NSURFAC,8)= TRANSV_CURR + ENDDO + ENDDO + ENDDO + ! store new IDF in the corresponding module to be used in + ! writenemtab + DO NCELL= 1,NMIL + DO NGRP= 1,NG + ! B2XS(K,NCELL,NGRP)=B2_VECT(NCELL,NGRP) + DO NSURFAC= 1,NSD + DO P=1,9 + ! 1 -> J+ + ! 2 -> J- + ! 3 -> J + ! 4 -> F-surf + ! 5 -> F-ave + ! 6 -> GET_IDF + ! 7 -> SEL_IDF + ! 8 -> apotheme + ! 9 -> side length + ADF(NSURFAC,NGRP,P)=CURR_INFO(NCELL,NGRP,NSURFAC,P) + ENDDO + ENDDO + ENDDO + ENDDO + + IF(IPRINT > 1) THEN + WRITE(6,*) "*** RECOVER ASSEMBLY DISCONTINUITY FACTOR ***" + IF(ADF_T.EQ.'GET') WRITE(6,*) "ADF TYPE : GET " + IF(ADF_T.EQ.'SEL') WRITE(6,*) "ADF TYPE : SELENGUT " + DO NGRP=1, NG + WRITE(6,*) "GROUP :",NGRP + IF(ADF_T.EQ.'GET') WRITE(6,*)"ADF(N/E/S/W) :",ADF (:,NGRP,6) + IF(ADF_T.EQ.'SEL') WRITE(6,*)"ADF(N/E/S/W) :",ADF (:,NGRP,7) + ENDDO + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IPTH=LCMGID(IPDAT,'CROSS_SECT') + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + CALL LCMSIX(KPTH,'MACROLIB_XS',1) + IF(ADF_T.EQ.'GET') THEN + CALL LCMPUT(KPTH,'ADF',NSF*NG,2,ADF(:,:,6)) + ELSEIF(ADF_T.EQ.'SEL') THEN + CALL LCMPUT(KPTH,'ADF',NSF*NG,2,ADF(:,:,7)) + ELSE + CALL XABORT('@D2PADF: UNKNOW ADF TYPE'//ADF_T//'.') + ENDIF + END diff --git a/Donjon/src/D2PBRA.f b/Donjon/src/D2PBRA.f new file mode 100644 index 0000000..301d191 --- /dev/null +++ b/Donjon/src/D2PBRA.f @@ -0,0 +1,1693 @@ +*DECK D2PBRA + SUBROUTINE D2PBRA( IPDAT,IPINP,IPHEL,STAVEC,DEB,SIGNAT,IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover information from the INFO data block for a complete branch +* and write it in the IPHEL file . The format of this file is described +* in the DRAG2PARCS: manual. This routine write sequentially the IPHEL +* file, branch after branch +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* IPINP file unit of the input file GENPMAXS.inp +* IPHEL file unit of the HELIOS.dra file +* STAVEC various parameters associated with the IPDAT structure +* DEB flag for D2PGEN +* SIGNAT signature of the object containing cross sections +* IPRINT control the printing on screen +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + INTEGER IPINP,IPHEL,STAVEC(40),DEB,IPRINT + + CHARACTER*16 SIGNAT +*---- +* LOCAL VARIABLES +*---- + INTEGER GRID,ITBRAN,NVAR,i,j,k + INTEGER NSF,NGP,NXS,NBU,FLPRIN,LMER + INTEGER STAIDX(STAVEC(2)),PKIDX(STAVEC(2)) + INTEGER IUPS,FA_K,NADF,NCDF,NPIN,NCOLA,NROWA,XESM + REAL XS(STAVEC(1),STAVEC(3),STAVEC(4)) ! TABLE FOR XS + REAL ADF(STAVEC(13),STAVEC(1),STAVEC(4)) + REAL FLXL(STAVEC(1),STAVEC(4)) + REAL FLXR(STAVEC(1),STAVEC(4)) + REAL CURL(STAVEC(1),STAVEC(4)) + REAL CURR(STAVEC(1),STAVEC(4)) + REAL CDF(STAVEC(15),STAVEC(1),STAVEC(4)) + REAL GFF(STAVEC(8),STAVEC(9),STAVEC(1),STAVEC(4)) + REAL SCAT(STAVEC(1)*STAVEC(1),STAVEC(4)) + REAL BURN(STAVEC(4)),XSC(3),DATSRC(5) + REAL DIV(3,STAVEC(4)) + REAL ND(2,STAVEC(4)) + CHARACTER(len=4) BRANCH,JOB(4) + CHARACTER*12 FILNAM + CHARACTER COM + CHARACTER*16 JOBTIT + CHARACTER JOBOPT(16) + CHARACTER*3 ADF_T + CHARACTER*1 DER + REAL FC1(5) + REAL FC2(8) + REAL FC3(7) + REAL FC4(3) + REAL VERS,SFAC,BFAC + LOGICAL :: LTH = .FALSE. + LOGICAL :: LADF = .FALSE. + LOGICAL :: LXES = .FALSE. + LOGICAL :: LCDF = .FALSE. + LOGICAL :: LGFF = .FALSE. + LOGICAL :: LDET = .FALSE. + + + ! INITIALIZATION OF VARIABLES + NGP=STAVEC(1) + NVAR=STAVEC(2) + NXS=STAVEC(3) + NBU=STAVEC(4) + GRID=STAVEC(5) + NCOLA=STAVEC(8) + NROWA=STAVEC(9) + NPART=STAVEC(10) + NSF=STAVEC(11) + NCF=STAVEC(12) + NADF=STAVEC(13) + NCDF=STAVEC(15) + NGFF=STAVEC(16) + NPIN=STAVEC(17) + LMER=STAVEC(21) + + + IF(IPRINT > 0) THEN + WRITE(6,*) + WRITE(6,*) "**** WRITING CURRENT BRANCH IN HELIOS FILE ****" + + ENDIF + ! RECOVER INFORMATION FROM INFO DATA BLOCK + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'HELIOS_HEAD',1) + CALL LCMGET(IPDAT,'FILE_CONT_1',FC1) + CALL LCMGET(IPDAT,'FILE_CONT_2',FC2) + CALL LCMGET(IPDAT,'FILE_CONT_3',FC3) + CALL LCMGET(IPDAT,'FILE_CONT_4',FC4) + CALL LCMGET(IPDAT,'XS_CONT',XSC) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGET(IPDAT,'DAT_SRC',DATSRC) + CALL LCMGTC(IPDAT,'JOB_OPT',4,4,JOB) + CALL LCMGET(IPDAT,'VERSION',VERS) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'PRINT',FLPRIN) + CALL LCMGET(IPDAT,'STATE_INDEX',STAIDX) + CALL LCMGET(IPDAT,'BRANCH_IT',ITBRAN) + CALL LCMGTC(IPDAT,'BRANCH',4,BRANCH) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGET(IPDAT,'PKIDX',PKIDX) + CALL LCMGET(IPDAT,'BURN',BURN) + + i=1 + DO j=1,4 + DO k=1,4 + JOBOPT(i)= JOB(j)(k:k) + i=i+1 + ENDDO + ENDDO + + IF(JOBOPT(1)=='T') THEN + LADF = .TRUE. + CALL LCMGTC(IPDAT,'ADF_TYPE',3,ADF_T) + ENDIF + IF(JOBOPT(2)=='T') LXES = .TRUE. + IF(JOBOPT(8)=='T') LDET = .TRUE. + IF((JOBOPT(5)=='T').OR.(JOBOPT(7)=='T').OR. + > (JOBOPT(9)=='T').OR.(JOBOPT(13)=='T').OR.(JOBOPT(12)=='T'))THEN + LTH =.TRUE. + ENDIF + IF(JOBOPT(10)=='T') LCDF = .TRUE. + IF(JOBOPT(11)=='T') LGFF = .TRUE. + + ! WRITE THE CURRENT BRANCH IN THE HELIOS.DRA FILE + IF(FLPRIN==1) THEN + ! RECOVER CROSS SECTIONS FROM THE TEMPORARY FILE + CALL READXS (IPDAT, XS, SCAT, ND, DIV, NGP, + > NXS, ADF, CDF, GFF, NBU, NADF, + > DATSRC, GRID, NCDF, NCOLA, NROWA, LADF, + > LCDF, LGFF, LXES, LDET, SIGNAT, LMER, + > IPRINT, ADF_T, FLXL, FLXR, CURL, CURR) + ! WRITE IN HELIOS.DRA THE SET OF BURNUP POINTS + CALL SETBU (IPHEL,BRANCH,ITBRAN,XSC,BURN,NBU, IPRINT) + + ! WRITE IN HELIOS.DRA THE SET OF CROSS SECTIONS + CALL SETXS ( IPHEL, BRANCH, ITBRAN, XS, NGP, NXS, + > NBU, BURN, DATSRC, LXES, LDET,IPRINT) + + ! WRITE IN HELIOS.DRA THE ELEMENT OF THE SCATTERING MATRIX + CALL SETSCT(IPHEL,BRANCH,ITBRAN,SCAT,NGP,NBU,BURN, IPRINT) + + IF(LADF.AND.(LMER.EQ.0)) THEN + CALL SETADF( IPHEL, BRANCH, ITBRAN, ADF, NADF, NGP, + > NBU, BURN, IPRINT, ADF_T, FLXR, FLXL, + > CURL, CURR) + ENDIF + + IF(DATSRC(3)==1.0) THEN + IF(LXES) THEN + ! WRITE IN HELIOS.DRA THE NUMBRE DENSITIES FOR XENON AND + ! SAMARIUM + CALL SETND (IPHEL,BRANCH,ITBRAN, ND,NBU,BURN, IPRINT) + ENDIF + IF((GRID<2).AND.(SIGNAT.EQ.'L_SAPHYB'))THEN + ! WRITE IN HELIOS.DRA THE DIVERS INFORMATION + CALL SETDIV(IPHEL,BRANCH,ITBRAN,DIV,NBU,BURN,IPRINT) + ENDIF + IF(LTH) THEN + ! WRITE IN HELIOS.DRA THE T:H INVARIANT DATA BLOCK + CALL SETTH ( IPHEL, BRANCH, ITBRAN, BURN, NBU, JOBOPT, + > NGP, IPDAT, IPRINT ) + ENDIF + + IF(LCDF) THEN + CALL SETCDF( IPHEL, BRANCH, ITBRAN, CDF, NCDF, NGP, + > NBU, BURN, IPRINT ) + ENDIF + IF(LGFF) THEN + IF ((NCOLA .NE. NPIN) .OR. (NROWA .NE.NPIN)) THEN + WRITE (6,*) "@D2PBRA: NUMBER OF PIN IN MCO (NPIN= ",NPIN, + > ") INCOHERENT WITH ncols AND nrows (",NCOLA,') IN D2P: INPUT' + CALL XABORT ('') + ENDIF + CALL SETGFF( IPHEL, BRANCH, ITBRAN, GFF, NCOLA, NROWA, + > NPART, NGP, NBU, BURN, NGFF, IPRINT, + > VERS) + ENDIF + ENDIF + ! SIGNATURE OF THE END OF A BRANCH (MANDATORY FOR GENPMAXS + ! CODE) + WRITE(IPHEL,*) + WRITE(IPHEL,30)'*********************************************' + WRITE(IPHEL,30)'* Normal End, No warning messages issued *' + WRITE(IPHEL,30)'* *' + WRITE(IPHEL,30)'* Total CPU time used = *' + WRITE(IPHEL,30)'*********************************************' + 30 FORMAT(25X,A) + ENDIF + + ! UPDATE OF THE INFO DATA BLOCK + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMPUT(IPDAT,'FLAG',1,1,1) + + IF(IPRINT > 0) THEN + WRITE(6,*) "******** UPDATING the GENPMAXS.INP FILE *********" + ENDIF + ! UPDATE OF THE GENPMAXS.INP FILE (MANY ARGUMENTS IN THIS CALL + ! ARE NOT USED IN D2PGEN) + CALL D2PGEN( IPINP, IPDAT, STAVEC, JOBTIT, FILNAM, DER, + > VERS, COM, JOBOPT, IUPS, FA_K, SFAC, + > BFAC, DEB, XESM, FC1 , FC2, FC3, + > FC4, XSC, IPRINT ) + IF(IPRINT > 0) THEN + WRITE(6,*)"********* SELECTING A NEW BRANCH CALCULATION *****" + ENDIF + + CALL D2PSEL ( IPDAT, IPINP, STAVEC,BRANCH, ITBRAN, STAIDX, + > NVAR, JOBOPT, DEB, FC1 , FC2, FC3, + > FC4, XSC, IPRINT ) + + + WRITE(6,*) "********* BRANCH SELECTED *****" + + END + + SUBROUTINE SETBU(IPHEL,BRANCH,ITBRAN,XSC,BURN,NBU,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the inforamtion about burnup points and +* XSC card (sides in assembly (NSIDES), +* corners in assembly (NCORNERS), VFCM). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* XSC content of the XS_CONT card +* BURN set of burnup points +* NBU number of bunup points +* IPRINT control the printing on screen +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NBU,ITBRAN,IPHEL,IPRINT + REAL XSC(3),BURN (NBU) + CHARACTER BRANCH*4 +*---- +* LOCAL VARIABLES +*---- + ! number of sides and corners in assembly + INTEGER NSIDE, NCORNER + + + + NSIDE = NINT(XSC(1)) + NCORNER = NINT(XSC(2)) + + ! XS_CONT CARD (Cf DRAG2PARCS Manual for details on HELIOS format) + IF (IPRINT>5) WRITE(6,*) 'SETBU: WRITE BURNUP INFO' + ! HEADER OF XS_CONT card + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) ===========================' + WRITE(IPHEL,*) ' 2) %STAT_xxxx' + WRITE(IPHEL,*) ' 3) ===========================' + WRITE(IPHEL,*) ' 4)%XS_CONT' + WRITE(IPHEL,*) ' 5)Meaning : NBN,NSIDE,NCORNER,' + 1 //'VFCM' + + + ! RIEGO block of HELIOS.dra file + CALL SET_RIEGO(IPHEL) + + + ! Set the content of XS_CONT in HELIOS.dra + WRITE(IPHEL,'(25X,4A14)') ' NBN', + 1 ' NSIDE',' NCORNER',' VFCM' + WRITE(IPHEL,200) 'Label E','.-.-E-.-.','.-.-E-.-.','.-.-E-.-.', + 1 '1-.-E-.-.' + WRITE(IPHEL,'(I4,1X,A,I4,A,A,I4,A,I5,3I12,ES12.5E2)') + 1 1,BRANCH(1:2),ITBRAN,' ',BRANCH(1:2),ITBRAN,':', + 2 0,NBU,NSIDE,NCORNER, + 3 XSC(3) + + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + ! BURNUP INFORMATION + + + ! HEADER OF Burnup card + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) ===========================' + WRITE(IPHEL,*) ' 2) %XS_STAT' + WRITE(IPHEL,*) ' 3) ===========================' + WRITE(IPHEL,*) ' 4)Meaning : Bunrup' + + + ! RIEGO block of HELIOS.dra file + CALL SET_RIEGO(IPHEL) + + + WRITE(IPHEL,'(30X,A6)') 'BURNUP' + WRITE(IPHEL,210) 'Label E','.-.-E-.-.' + ! LOOP over burnup points + DO IT=1, NBU + + WRITE(IPHEL,220) IT,BRANCH(1:2),ITBRAN,' ', + 1 BRANCH(1:2),ITBRAN,':',NINT(BURN(IT)),BURN(IT)/1000.0 + + ENDDO + + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + + ! format of HELIOS.dra file + 200 FORMAT(6X,A,12X,A,3X,A,3X,A,3X,A) + 210 FORMAT(6X,A,12X,A) + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5,6X,F6.3) + END + + SUBROUTINE READXS (IPDAT, XS, SCAT, ND, DIV, NGP, + > NXS, ADF, CDF, GFF, NBU, NADF, + > DATSRC, GRID, NCDF, NCOLA, NROWA, LADF, + > LCDF, LGFF, LXES, LDET, SIGNAT, LMER, + > IPRINT, ADF_T, FLXL, FLXR, CURL, CURR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover cross section from the INFO data block. +* +*parameters: input +* IPDAT address of info data block +* XS table of cross sections +* SCAT scattering matrix +* ND number densities for xenon and samarium +* DIV divers info directory +* NGP number of energy groups +* NXS number of cross sections +* NBU number of burnup points +* ADF assembly dicontinuity factor +* NADF number of surfaces in assembly +* NCDF number of corners in assembly +* NCOLA number of pin in assembly along x-axis +* NROWA number of pin in assembly along y-axis +* GRID type of gridding for branching calculation +* LADF flag for assembly discontinuity factors +* LCDF flag for corner discontinuity factors +* LGFF flag for group form factors +* LXES flag for microscopic cross sections +* DAT SRC array containing the DATA source (reflector of fuel) +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + INTEGER NGP,NBU,NXS,NADF,GRID,NCDF,LMER + REAL DATSRC(5) + REAL XS(NGP,NXS,NBU) + REAL SCAT(NGP*NGP,NBU) + REAL ND(2,NBU) + REAL DIV(3,NBU) + REAL ADF(NADF,NGP,NBU) + REAL FLXL(NGP,NBU) + REAL FLXR(NGP,NBU) + REAL CURL(NGP,NBU) + REAL CURR(NGP,NBU) + REAL CDF(NCDF,NGP,NBU) + REAL GFF(NCOLA,NROWA,NGP,NBU) + REAL ADFMOY(NGP,NBU) + LOGICAL LADF,LXES,LCDF,LGFF,LDET + CHARACTER*16 SIGNAT +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPTH,KPTH + INTEGER BU + CHARACTER*3 ADF_T + + IF(IPRINT>5) WRITE(6,*) 'READXS: RECOVER INFO DATA BLOCK' + + ! LOOP over burnup points + DO BU=1, NBU + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IPTH=LCMGID(IPDAT,'CROSS_SECT') + KPTH=LCMDIL(IPTH,BU) + CALL LCMSIX(KPTH,'MACROLIB_XS',1) + CALL LCMGET(KPTH,'XTR',XS(1:NGP,1,BU)) + CALL LCMGET(KPTH,'ABSORPTION',XS(1:NGP,2,BU)) + CALL LCMGET(KPTH,'X_NU_FI',XS(1:NGP,3,BU)) + CALL LCMGET(KPTH,'KAPPA_FI',XS(1:NGP,4,BU)) + IF(LXES)CALL LCMGET(KPTH,'SFI',XS(1:NGP,7,BU)) + IF(LADF) THEN + IF (ADF_T.EQ.'DRA')THEN + CALL LCMGET(KPTH,'ADF',ADF(:,:,BU)) + ELSE IF(ADF_T.EQ.'GEN')THEN + CALL LCMGET(KPTH,'FLXL',FLXL(:,BU)) + CALL LCMGET(KPTH,'FLXR',FLXR(:,BU)) + CALL LCMGET(KPTH,'CURR',CURR(:,BU)) + CALL LCMGET(KPTH,'CURL',CURL(:,BU)) + ENDIF + ENDIF + IF(LCDF)CALL LCMGET(KPTH,'CDF',CDF(:,:,BU)) + IF(LGFF)CALL LCMGET(KPTH,'GFF',GFF(:,:,:,BU)) + + + CALL LCMGET(KPTH,'SCAT',SCAT(1:NGP*NGP,BU)) + IF(DATSRC(3)==1) THEN + + IF((LXES).OR.(LDET)) THEN + CALL LCMSIX(KPTH,' ',2) + CALL LCMSIX(KPTH,'MICROLIB_XS',1) + + IF(LDET) CALL LCMGET(KPTH,'DET',XS(1:NGP,8,BU)) + IF (LXES) THEN + CALL LCMGET(KPTH,'XENG',XS(1:NGP,5,BU)) + CALL LCMGET(KPTH,'SMNG',XS(1:NGP,6,BU)) + CALL LCMGET(KPTH,'XEND',ND(1,BU)) + CALL LCMGET(KPTH,'SMND',ND(2,BU)) + ENDIF + ENDIF + IF((GRID<2).and. (SIGNAT.EQ.'L_SAPHYB')) THEN + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IPTH=LCMGID(IPDAT,'DIVERS') + KPTH=LCMDIL(IPTH,BU) + CALL LCMGET(KPTH,'KEFF',DIV(1,BU)) + CALL LCMGET(KPTH,'KINF',DIV(2,BU)) + CALL LCMGET(KPTH,'B2',DIV(3,BU)) + ENDIF + ENDIF + ENDDO + IF (LMER.EQ.1) THEN + DO I=1,NGP + DO BU=1,NBU + ADFMOY(I,BU)=SUM(ADF(1:NADF,I,BU))/NADF + ENDDO + ENDDO + + DO I=1,NGP + DO BU=1,NBU + SCAT(I,BU)=SCAT(I,BU)/ADFMOY(NGP-1+1,BU) + SCAT(I+NGP,BU)=SCAT(I+NGP,BU)/ADFMOY(NGP-I+1,BU) + XS(I,1,BU)=XS(I,1,BU)*ADFMOY(I,BU) + XS(I,2:NXS,BU)=XS(I,2:NXS,BU)/ADFMOY(I,BU) + ENDDO + ENDDO + ENDIF + CALL LCMSIX(IPDAT,' ',0) + END + + SUBROUTINE SETXS( IPHEL, BRANCH, ITBRAN, XS, NGP, NXS, + > NBU, BURN, DATSRC, LXES, LDET, IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* XS table of cross sections +* NGP number of energy groups +* NXS number of cross sections +* NBU number of burnup points +* BURN set of burnup points +* IPRINT control the printing on screen +* DATSRC array containing the DATA source (reflector of fuel) +* LXES flag for presence of micoscopic cross sections +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,NXS,NGP,ITBRAN +! REAL XS(NGP,NXS,NBU),BURN (NBU),DATSRC(3) + REAL XS(NGP,NXS,NBU),BURN (NBU),DATSRC(5) + CHARACTER(len=4) BRANCH,XS_name + LOGICAL LXES,LDET +*---- +* LOCAL VARIABLES +*---- + INTEGER XST ! INDEX OF CROSS SECTIONS + REAL FA_KIND + LOGICAL :: LXS = .TRUE. + + IF(IPRINT>5) WRITE(6,*) 'SETXS: WRITE INFO FOR A BANCH' + + FA_KIND=DATSRC(3) + + ! LOOP OVER CROSS SECTIONS TYPE + DO XST=1, NXS + LXS = .TRUE. + SELECT CASE (XST) + CASE (1) + XS_name = 'STR' ! TRANSPORT XS + CASE (2) + XS_name = 'SAB' ! ABSORPTION XS + CASE (3) + XS_name = 'SNF' ! NU SIGMA FISSION XS + CASE (4) + XS_name = 'SKF' ! KAPPA FISSION XS + CASE (5) + IF(.NOT. LXES) LXS=.FALSE. + XS_name = 'XENG' ! XE MICROSCOPIC ABSORPTION XS + CASE (6) + IF(.NOT. LXES) LXS=.FALSE. + XS_name = 'SMNG' ! SM MICROSCOPIC ABSORPTION XS + CASE (7) + IF(.NOT. LXES) LXS=.FALSE. + XS_name = 'SFI' ! FISSION XS + CASE (8) + IF(.NOT. LDET) LXS=.FALSE. + XS_name = 'DET' ! DETECTOR XS + END SELECT + IF(LXS) THEN + ! LABEL FOR XS TYPE + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,110) XS_name + WRITE(IPHEL,120) XS_name + + 110 FORMAT(29H List Title(s) 1) %XS_PRIN %,A) + 120 FORMAT(34H Meaning : (.-.-E-G-.) G-th Group ,A, + 1 15H cross sections) + + CALL SET_RIEGO(IPHEL) + + ! LOOP OVER ENERGY GROUPS + ! CREATION OF LABEL FOR CROSS SECTIONS + DO IT=1, NGP + IF(IT==1) THEN + WRITE(IPHEL,'(27X,A4,A2)',advance='no') XS_name,'Xs' + ELSE IF(IT==NGP .OR. IT==8 ) THEN + WRITE(IPHEL,'(5X,A4,A2)')XS_name,'Xs' + ELSE + WRITE(IPHEL,'(5X,A4,A2)',advance='no')XS_name,'Xs' + ENDIF + ENDDO + DO IT=1, NGP + IF(IT==1) THEN + WRITE(IPHEL,'(6X,A,12X,A,I1,A)',advance='no') + 1 'Label E','.-.-E-',IT,'-.' + ELSE IF(IT==NGP .OR. IT==8 ) THEN + WRITE(IPHEL,'(3X,A,I1,A)') + 1 '.-.-E-',IT,'-.' + ELSE + WRITE(IPHEL,'(3X,A,I1,A)',advance='no') + 1 '.-.-E-',IT,'-.' + ENDIF + ENDDO + + ! STORE XS DATA IN HELIOS.DRA FILE + ! LOOP OVER BURNUP POINTS + DO NB=1, NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + DO NG=1, NGP + IF(NG == 1) THEN + WRITE(IPHEL,'(ES12.5E2)',advance='no') XS(NG,XST,NB) + ELSE IF(NG.NE.NGP) THEN + WRITE(IPHEL,'(ES12.5E2)',advance='no') XS(NG,XST,NB) + ELSE + WRITE(IPHEL,'(ES12.5E2)') XS(NG,XST,NB) + ENDIF + ENDDO ! NG + ENDDO ! NB + + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + ENDIF + ENDDO ! XST + END + + SUBROUTINE SETADF( IPHEL, BRANCH, ITBRAN, ADF, NADF, NGP, + > NBU, BURN, IPRINT,ADF_T, FLXR, FLXL, + > CURL, CURR ) +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* ADF Assembly discontinuity factor +* NADF number of Assembly discontinuity factor +* NGP number of energy groups +* NBU number of burnup points +* BURN set of burnup points +* IPRINT control the printing on screen +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,NGP,NADF,ITBRAN,NIT,IPRINT + REAL ADF(NADF,NGP,NBU),BURN (NBU) + REAL FLXR(NGP,NBU),FLXL(NGP,NBU) + REAL CURR(NGP,NBU),CURL(NGP,NBU), BNO(NGP,NBU) + CHARACTER*3 ADF_T + CHARACTER BRANCH*4 +*---- +* LOCAL ARGUMENTS +*---- + INTEGER IT,ITA + REAL ADF_TMP(NADF,NGP,NBU) + CHARACTER*4 BOUND + CHARACTER*12 LABEL,XSPRIN + + IF(IPRINT>5) WRITE(6,*) 'SETADF: RECOVER ADF INFO' + IF (ADF_T.EQ.'DRA') THEN + NIT=0 + IF((NADF.NE.1) .AND. (NADF.NE.4)) THEN + WRITE(6,*) "NUMBER OF ADF : ",NADF + CALL XABORT (" NUMBER OF ADF MUST BE 4 (SEL/GET/DRA) OR 1 " + > //"(DRA)") + ELSE IF(NADF == 4) THEN + ! CASE FOR SEL OR GET ADF + ! REARRANGEMENT OF ADF ORDER TO MATCH HELIOS iN CASE OD SEL OR + ! GET ADF + ! SAPHYB SURF => SIDE + ! 1 N + ! 2 E + ! 3 S + ! 4 W + ! HELIOS SURF => SIDE + ! 1 W + ! 2 S + ! 3 E + ! 4 N + + ADF_TMP(:,:,:)=ADF(:,:,:) + ADF(1,:,:)=ADF_TMP(4,:,:) + ADF(2,:,:)=ADF_TMP(3,:,:) + ADF(3,:,:)=ADF_TMP(2,:,:) + ADF(4,:,:)=ADF_TMP(1,:,:) + ENDIF + NIT = NGP*NADF + ! LABEL FOR XS TYPE : ADF + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_PRIN %SDF 2' + WRITE(IPHEL,*)'2) Meaning : (F-.-E-G-.) F-Face, G-Group' + IF(NADF==4) THEN + WRITE(IPHEL,*)'3) F=1/2/3/4 denotes W/S/E/N Side' + ELSE + WRITE(IPHEL,*)'3) F=1 denotes average ADF' + ENDIF + + CALL SET_RIEGO(IPHEL) + + ! LOOP OVER ENERGY GROUPS + ! CREATION OF LABEL FOR CROSS SECTIONS + ngrp=1 + nsurf=0 + DO ITA=1,NIT,7 ! ITA + NITTMP=MIN(NIT-ITA+1,7) + ngrpb=ngrp + nsurfb=nsurf + DO IT=1,NITTMP + IF((IT==1).AND.(IT.LT.NITTMP)) THEN + WRITE(IPHEL,'(30X,A6)',advance='no') 'SideDF' + ELSEIF((IT==1).AND.(IT.EQ.NITTMP)) THEN + WRITE(IPHEL,'(30X,A6)') 'SideDF' + ELSE IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(6X,A6)')'SideDF' + ELSE + WRITE(IPHEL,'(6X,A6)',advance='no')'SideDF' + ENDIF + ENDDO + + DO IT=1,NITTMP + nsurf=nsurf+1 + IF(nsurf.GT.NADF) THEN + nsurf=1 + ngrp=ngrp+1 + ENDIF + IF((IT==1).AND.(IT.LT.NITTMP)) THEN + WRITE(IPHEL,'(6X,A,14X,I1,A,I1,A)',advance='no') + > 'Label E',nsurf,'-.-E-',ngrp,'-.' + ELSEIF((IT==1).AND.(IT.EQ.NITTMP)) THEN + WRITE(IPHEL,'(6X,A,14X,I1,A,I1,A)') + > 'Label E',nsurf,'-.-E-',ngrp,'-.' + ELSE IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(3X,I1,A,I1,A)') nsurf,'-.-E-',ngrp,'-.' + ELSE + WRITE(IPHEL,'(3X,I1,A,I1,A)',advance='no') + > nsurf,'-.-E-',ngrp,'-.' + ENDIF + ENDDO + + ! STORE XS DATA IN HELIOS.DRA FILE + ! LOOP OVER BURNUP POINTS + + DO NB=1,NBU + ngrp=ngrpb + nsurf=nsurfb + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + DO IT=1,NITTMP + nsurf=nsurf+1 + IF(nsurf.GT.NADF) THEN + nsurf=1 + ngrp=ngrp+1 + ENDIF +! in xs_helios_read.f90 +! l1015 READ(XS_set_unit,hfnF5) rvector(1:RIEGO%how_many_data) +! in xs_heliosM.f90 +! l104 hfnF5='( X,8F13.5) ' + IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(5X,F7.5)') ADF(nsurf,ngrp,NB) + ELSE + WRITE(IPHEL,'(5X,F7.5)',advance='no') ADF(nsurf,ngrp,NB) + ENDIF + ENDDO + ENDDO + + WRITE(IPHEL,*) + ENDDO + + + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + ELSE IF (ADF_T.EQ.'GEN') THEN + DO I=1,4 + SELECT CASE (I) + CASE(1) + XSPRIN='%PHW 1' + BOUND='West' + LABEL='FluxWest' + BNO=FLXL + CASE(2) + XSPRIN='%PHE 1' + BOUND='East' + LABEL='FluxEast' + BNO=FLXR + CASE(3) + XSPRIN='%JNW 1' + BOUND='West' + LABEL='JnetWest' + BNO=CURL + CASE(4) + XSPRIN='%JNE 1' + BOUND='East' + LABEL='JnetEast' + BNO=CURR + END SELECT + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_PRIN ',XSPRIN + WRITE(IPHEL,'(16X,3A)')'2) Meaning : (E-.-E-G-.) ', + > BOUND,'-Face, G-Group' + + CALL SET_RIEGO(IPHEL) + WRITE(IPHEL,'(31X,A8,4X,A8)') LABEL,LABEL + WRITE(IPHEL,'(18X,A)') 'Label E 1-.-E-1-. 1-.-E-2-.' + DO NB=1,NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2,1X,ES11.4E2)') BNO(:,NB) + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + ENDDO + ENDDO + ENDIF + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + END + + SUBROUTINE SETCDF( IPHEL, BRANCH, ITBRAN, CDF, NCDF, NGP, + > NBU, BURN, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* CDF Corner discontinuity factor +* NCDF number of corner discontinuity factor +* NGP number of energy groups +* NBU number of burnup points +* BURN set of burnup points +* IPRINT control the printing on screen +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,NGP,NCDF,ITBRAN,NIT,IPRINT + REAL CDF(NCDF,NGP,NBU),BURN (NBU) + CHARACTER BRANCH*4 +*---- +* LOCAL ARGUMENTS +*---- + INTEGER IT,ITA + + IF(IPRINT>5) WRITE(6,*) 'SETCDF: RECOVER CDF INFO' + NIT = NGP*NCDF + + ! LABEL FOR XS TYPE : CDF + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_PRIN %CDF' + WRITE(IPHEL,*)'2) Meaning : (F-.-E-G-.) F-Face, G-Group' + IF(NCDF==1) THEN + WRITE(IPHEL,*)'3) F=1 denotes average CDF' + ELSE + WRITE(IPHEL,*)'3) F= custom' + ENDIF + + CALL SET_RIEGO(IPHEL) + + ! LOOP OVER ENERGY GROUPS + ! CREATION OF LABEL FOR CROSS SECTIONS + ngrp=1 + nsurf=0 + DO ITA=1,NIT,7 ! ITA + NITTMP=MIN(NIT-ITA+1,7) + ngrpb=ngrp + nsurfb=nsurf + DO IT=1,NITTMP + IF((IT==1).AND.(IT.LT.NITTMP)) THEN + WRITE(IPHEL,'(30X,A6)',advance='no') 'CornDF' + ELSEIF((IT==1).AND.(IT.EQ.NITTMP)) THEN + WRITE(IPHEL,'(30X,A6)') 'CornDF' + ELSE IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(6X,A6)')'CornDF' + ELSE + WRITE(IPHEL,'(6X,A6)',advance='no')'CornDF' + ENDIF + ENDDO + + DO IT=1,NITTMP + nsurf=nsurf+1 + IF(nsurf.GT.NCDF) THEN + nsurf=1 + ngrp=ngrp+1 + ENDIF + IF((IT==1).AND.(IT.LT.NITTMP)) THEN + WRITE(IPHEL,'(6X,A,15X,I1,A,I1,A)',advance='no') + > 'Label E',nsurf,'-.-E-',ngrp,'-.' + ELSEIF((IT==1).AND.(IT.EQ.NITTMP)) THEN + WRITE(IPHEL,'(6X,A,15X,I1,A,I1,A)') + > 'Label E',nsurf,'-.-E-',ngrp,'-.' + ELSE IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(2X,I1,A,I1,A)') nsurf,'-.-E-',ngrp,'-.' + ELSE + WRITE(IPHEL,'(2X,I1,A,I1,A)',advance='no') + > nsurf,'-.-E-',ngrp,'-.' + ENDIF + ENDDO + + ! STORE XS DATA IN HELIOS.DRA FILE + ! LOOP OVER BURNUP POINTS + + + DO NB=1,NBU + ngrp=ngrpb + nsurf=nsurfb + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + DO IT=1,NITTMP + nsurf=nsurf+1 + IF(nsurf.GT.NCDF) THEN + nsurf=1 + ngrp=ngrp+1 + ENDIF +! in xs_helios_read.f90 l1015 READ(XS_set_unit,hfnF5) rvector(1:RIEGO +! in xs_heliosM.f90 l104 hfnF5='( X,8F13.5) ' + IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(5X,F7.5)') CDF(nsurf,ngrp,NB) + ELSE + WRITE(IPHEL,'(5X,F7.5)',advance='no') CDF(nsurf,ngrp,NB) + ENDIF + ENDDO + ENDDO + + WRITE(IPHEL,*) + ENDDO + + + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + END + + SUBROUTINE SETGFF( IPHEL, BRANCH, ITBRAN, GFF, NCOLA, NROWA, + > NPART, NGP, NBU, BURN, NGFF , IPRINT, + > VERS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* GFF Group form factor +* NCOLA number of pin in assembly along x-axis +* NROWA number of pin in assembly along y-axis +* NPART symmetry level of assembly +* 0 1 2 3 +* whole half quarter eight +* PARCS Version 32.17 and GenPMAXS 6.1 +* 123XXXX 1...... 123X... 1...... +* XXXXXXX 23..... XXXX... 23..... +* XXXXXXX XXX.... XXXX... XXX.... +* XXXXXXX XXXX... XXXn... XXXn... +* XXXXXXX XXXXX.. ....... ....... +* XXXXXXX XXXXXX. ....... ....... +* XXXXXXn XXXXXXn ....... ....... +* Note: Helios format is different from the documentation +* provided in GenPMAXS. +* Version 32.18 and GenPMAXS 6.2 +* 123XXXX 1...... ....... ....... +* XXXXXXX 23..... ....... ....... +* XXXXXXX XXX.... ....... ....... +* XXXXXXX XXXX... ...123X ...1... +* XXXXXXX XXXXX.. ...XXXX ...23.. +* XXXXXXX XXXXXX. ...XXXX ...XXX. +* XXXXXXn XXXXXXn ...XXXn ...XXXn +* Note: Helios format is the same as in the documentation +* provided in GenPMAXS. +* NGP number of energy groups +* NBU number of burnup points +* BURN set of burnup points +* IPRINT control the printing on screen +* VERS version of PARCS to be used +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,NGP,ITBRAN,NIT,IPRINT,NGFF + REAL GFF(NCOLA,NROWA,NGP,NBU),BURN (NBU),VERS + CHARACTER BRANCH*4 +*---- +* LOCAL ARGUMENTS +*---- + INTEGER IT,ITA,ipxn,ipyn + + IF(IPRINT>5) WRITE(6,*) 'SETGFF: RECOVER GFF INFO' + NIT = NGP*NCOLA*NROWA + NPIN2 = NCOLA*NROWA + NCOLA2= 1 + ipxn=1 + ipyn=1 + IF((NPART.GE.1).AND.(NCOLA.NE.NROWA))THEN + CALL XABORT('@D2PBRA: NPART > 0 and NCOLA.NE.NROWA') + ENDIF + IF(NPART.EQ.1)THEN + NIT=NGP*NCOLA*(NCOLA+1)/2 + NPIN2 = NCOLA*(NCOLA+1)/2 + ELSEIF(NPART.EQ.2)THEN + NCOLA2=CEILING(REAL(NCOLA)/2) + NIT=NGP*NCOLA2*NCOLA2 + NPIN2 = NCOLA2*NCOLA2 + ELSEIF(NPART.EQ.3)THEN + NCOLA2=CEILING(REAL(NCOLA)/2) + NIT=NGP*NCOLA2*(NCOLA2+1)/2 + NPIN2 = NCOLA2*(NCOLA2+1)/2 + ENDIF + IF((VERS.GE.3.2018).AND.(NPART.GE.2))THEN + ipxn=CEILING(REAL(NCOLA)/2) + ipyn=CEILING(REAL(NCOLA)/2) + NCOLA2=NCOLA + ENDIF + IF (NGFF.NE.NPIN2) THEN + WRITE (6,*) '@D2PBRA: INCOHERENT NUMBER OF GFF IN MCO (', + > NGFF,') AND COMPUTED PART OF ASSEMBLY (PART =', + > NPART,').' + CALL XABORT ('') + ENDIF + ! LABEL FOR XS TYPE: GFF + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_GFF %GFF 1 ' + WRITE(IPHEL,*)'2) Meaning : (F-.-E-G-.) F-Face, G-Group' + WRITE(IPHEL,*)'3) F=1 to NPIN*NPIN average GFF' + + CALL SET_RIEGO(IPHEL) + + ! LOOP OVER ENERGY GROUPS + ! CREATION OF LABEL FOR CROSS SECTIONS + ngrp=1 + nsurf=0 + ipx=ipxn-1 + ipy=ipyn + DO ITA=1,NIT,7 ! ITA + NITTMP=MIN(NIT-ITA+1,7) + ngrpb=ngrp + nsurfb=nsurf + ipxb=ipx + ipyb=ipy + DO IT=1,NITTMP + IF((IT==1).AND.(IT.LT.NITTMP)) THEN + WRITE(IPHEL,'(33X,A6)',advance='no') 'GNorRR' + ELSEIF((IT==1).AND.(IT.EQ.NITTMP)) THEN + WRITE(IPHEL,'(33X,A6)') 'GNorRR' + ELSE IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(8X,A6)')'GNorRR' + ELSE + WRITE(IPHEL,'(8X,A6)',advance='no')'GNorRR' + ENDIF + ENDDO + DO IT=1,NITTMP + nsurf=nsurf+1 + IF(nsurf.GT.NPIN2) THEN + nsurf=1 + ngrp=ngrp+1 + ENDIF + IF((IT==1).AND.(IT.LT.NITTMP)) THEN + WRITE(IPHEL,'(6X,A,12X,I3,A,I1,A)',advance='no') + > 'Label E',nsurf,'-.-E-',ngrp,'-.' + ELSEIF((IT==1).AND.(IT.EQ.NITTMP)) THEN + WRITE(IPHEL,'(6X,A,12X,I3,A,I1,A)') + > 'Label E',nsurf,'-.-E-',ngrp,'-.' + ELSE IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(1X,I3,A,I1,A)') nsurf,'-.-E-',ngrp,'-.' + ELSE + WRITE(IPHEL,'(1X,I3,A,I1,A)',advance='no') + > nsurf,'-.-E-',ngrp,'-.' + ENDIF + ENDDO + ! STORE XS DATA IN HELIOS.DRA FILE + ! LOOP OVER BURNUP POINTS + + + DO NB=1,NBU + ngrp=ngrpb + nsurf=nsurfb + ipx=ipxb + ipy=ipyb + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + DO IT=1,NITTMP + ipx=ipx+1 + IF(((NPART.EQ.0).AND.(ipx.GT.NCOLA)).OR. + > ((NPART.EQ.2).AND.(ipx.GT.NCOLA2)).OR. + > (((NPART.EQ.1).OR.(NPART.EQ.3)).AND.(ipx.GT.ipy)))THEN + ipx=ipxn + ipy=ipy+1 + ENDIF + nsurf=nsurf+1 + IF(nsurf.GT.NPIN2) THEN + nsurf=1 + ngrp=ngrp+1 + ipy=ipxn + ipx=ipyn + ENDIF +! in xs_helios_read.f90 l1015 READ(XS_set_unit,hfnE4) rvector(1:RIEGO +! in xs_heliosM.f90 l104 hfnF5='( X,8F13.5) ' +! l114 hfnE4=hfnE5 +! l115 hfnE4(11:11)='4' + IF(IT.EQ.NITTMP) THEN + WRITE(IPHEL,'(5X,F7.4)') GFF(ipx,ipy,ngrp,NB) + ELSE + WRITE(IPHEL,'(5X,F7.4)',advance='no') GFF(ipx,ipy,ngrp,NB) + ENDIF + ENDDO + ENDDO + + WRITE(IPHEL,*) + ENDDO + + + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + + END + + SUBROUTINE SETSCT(IPHEL,BRANCH,ITBRAN,SCAT,NGP,NBU,BURN,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the scattering cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* SCAT table of elements of scattering matrix +* NGP number of energy groups +* NBU number of burnup points +* BURN set of burnup points +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,NGP,ITBRAN,IPRINT + REAL SCAT(NGP*NGP,NBU),BURN (NBU) + + CHARACTER BRANCH*2 + +*---- +* LOCAL ARGUMENTS +*---- + INTEGER IT,G,I + REAL SCATTMP(8,NBU) + CHARACTER*45 LABEL + CHARACTER*45 LABELE + CHARACTER*210 :: TOTLABELE = '' + CHARACTER*210 :: TOTLABEL = '' + + IF(IPRINT>5) WRITE(6,*) 'SETSCT: WRITE SCATTERING INFO' + + ! LABEL FOR SCATTERING XS + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,110) '%SCT' + WRITE(IPHEL,*)'Meaning : (.-.-E-G-O) From O to G-th Group scat' + + CALL SET_RIEGO(IPHEL) + IT=1 + ITT=1 + I=0 + ! CREATION OF HEADER FOR SCATTERING BLOCK IN HELIOS.DRA FILE + + DO G=1,NGP + DO J=1, NGP + IF (IT==1) THEN + TOTLABELE = '' + TOTLABEL = '' + WRITE(LABELE,'(6X,A7,14X)') 'Label E' + TOTLABELE=TOTLABELE(1:len( trim(TOTLABELE) )) + 1 // LABELE + ENDIF + IF (IT==1) THEN + WRITE(LABEL,'(25X,A)')'ScattMatrix' + WRITE(LABELE,'(12X,A,I1,A,I1)') + 1 '1-.-E-',G,'-',J + ELSE + WRITE(LABEL,'(1X,A)')'ScattMatrix' + WRITE(LABELE,'(3X,A,I1,A,I1)') + 1 '1-.-E-',G,'-',J + ENDIF + SCATTMP(IT,:)=SCAT(ITT,:) + TOTLABEL=TOTLABEL(1:len( trim(TOTLABEL) )) + > //LABEL + TOTLABELE=TOTLABELE(1:len( trim(TOTLABELE) )) + > //LABELE + + IF ((IT==8).OR.(ITT==NGP*NGP)) THEN + WRITE(IPHEL,'(A)') TOTLABEL + WRITE(IPHEL,'(A)') TOTLABELE + DO NB=1, NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(8(ES12.5E2))')SCATTMP(1:IT,NB) + ENDDO + WRITE (IPHEL,*) + TOTLABELE = '' + TOTLABEL = '' + IT=1 + ELSE + IT=IT+1 + ENDIF + + ITT=ITT+1 + ENDDO + ENDDO + + ! DO JT=1, NGP + ! IF(IT==1 .and. JT==1) THEN + ! WRITE(IPHEL,'(28X,A)',advance='no') 'ScattMatrix' + ! ELSE IF((IT==(NGP).and.JT==(NGP)) .OR. JT==7 ) THEN + ! WRITE(IPHEL,'(3X,A)')'ScattMatrix' + ! ELSE + ! WRITE(IPHEL,'(3X,A)',advance='no')'ScattMatrix' + ! ENDIF + ! ENDDO + ! DO IT=1, NGP + ! DO JT=1, NGP + ! IF(IT==1 .and. JT==1) THEN + ! WRITE(IPHEL,'(6X,A,14X,A,I1,A,I1)',advance='no') + ! 1 'Label E','1-.-E-',JT,'-',IT + ! ELSE IF((IT==(NGP).and.JT==(NGP)) .OR. JT==8 ) THEN + ! WRITE(IPHEL,'(5X,A,I1,A,I1)') + ! 1 '1-.-E-',JT,'-',IT + ! ELSE + ! WRITE(IPHEL,'(5X,A,I1,A,I1)',advance='no') + ! 1 '1-.-E-',JT,'-',IT + ! ENDIF + ! ENDDO + ! ENDDO + ! + ! DO NB=1, NBU + ! WRITE(IPHEL,220,advance='no') NB,'t',BRANCH(1:2), + ! 1 ITBRAN,'(s',BRANCH(1:2),ITBRAN,'):',NINT(BURN(NB)) + ! DO IG=1, NGP*NGP + ! IF(IG == 1) THEN + ! WRITE(IPHEL,'(3X,ES11.5E2)',advance='no') SCAT(IG,NB) + ! ELSE IF(IG.EQ.NGP*NGP) THEN + ! WRITE(IPHEL,'(3X,ES11.5E2)') SCAT(IG,NB) + ! ELSE IF(IG.EQ.8 ) THEN + ! WRITE(IPHEL,'(3X,ES11.5E2)') SCAT(IG,NB) + ! ELSE + ! WRITE(IPHEL,'(3X,ES11.5E2)',advance='no') SCAT(IG,NB) + ! ENDIF + ! ENDDO + ! ENDDO + + 110 FORMAT(28H List Title(s) 1) %XS_SCT ,A) + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + END + + SUBROUTINE SETND(IPHEL,BRANCH,ITBRAN,ND,NBU,BURN,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the scattering cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* NGP number of energy groups +* NBU number of burnup points +* ND number densities for Xenon and samarium : KEFF , KINF, B2 +* BURN set of burnup points +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,ITBRAN,IPRINT + REAL ND(2,NBU),BURN (NBU) + CHARACTER BRANCH*2 +*---- +* LOCAL ARGUMENTS +*---- + INTEGER NB + + IF(IPRINT>5) WRITE(6,*) 'SETND: WRITE HEADER FOR XENON DENSITY' + + ! CREATION OF HEADER FOR XENON DENSITY + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_XESM %XEND' + WRITE(IPHEL,*)'Meaning : Xe-135 Number Density [/cm.barn]' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,'(31X,A)') 'nXe' + WRITE(IPHEL,'(6X,A,12X,A)') 'Label E','1-1-E-.-.' + + ! LOOP OVER BUNRNUP + DO NB=1,NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2)') ND(1,NB) + ENDDO + + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + ! CREATION OF HEADER FOR SAMARIUM DENSITY + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_XESM %SMND' + WRITE(IPHEL,*)'Meaning : SM-149 Number Density [/cm.barn]' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,'(27X,A)') 'nSm' + WRITE(IPHEL,'(6X,A,12X,A)') 'Label E','1-1-E-.-.' + + ! LOOP OVER BUNRNUP + DO NB=1,NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2)') ND(2,NB) + ENDDO + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + END + + SUBROUTINE SETDIV(IPHEL,BRANCH,ITBRAN,DIV,NBU,BURN,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the scattering cross sections for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*parameters: input +* IPHEL file unit of the HELIOS.dra file +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* NGP number of energy groups +* NBU number of burnup points +* DIV conttnent of DIV table : KEFF , KINF, B2 +* BURN set of burnup points +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPHEL,NBU,ITBRAN,IPRINT + REAL DIV(3,NBU),BURN (NBU) + CHARACTER BRANCH*2 +*---- +* LOCAL ARGUMENTS +*---- + INTEGER NB + REAL M2 + + IF(IPRINT>5) WRITE(6,*) 'SETDIV: WRITE HEADER FOR DIVERS INFO' + + ! CREATION OF HEADER FOR DIVERS INFO (B2, KEFF, KINF) + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_PRIN %KINF' + WRITE(IPHEL,*)' Meaning : K-eff, K-inf, M^2, B^2 [cm^-2] ' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,'(27X,A,10X,A,6X,A,6X,A)') 'K-EFF','KINF', + 1 'MigrArea','CritArea' + WRITE(IPHEL,'(6X,A,12X,A,5X,A,5X,A,5X,A)') + 1 'Label E','.-.-E-.-.','.-.-E-.-.','.-.-E-.-.','.-.-E-.-.' + ! LOOP OVER BURNUP POINTS + DO NB=1,NBU + M2=(DIV(2,NB)-1)/(DIV(3,NB)) + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(5X,F7.5,5X,F7.5,ES12.5E2,ES12.5E2)') + 1 DIV(1,NB),DIV(2,NB),M2,DIV(3,NB) + ENDDO + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + END + + SUBROUTINE SETTH( IPHEL, BRANCH, ITBRAN, BURN, NBU, JOBOPT, + > NGP, IPDAT, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Write in the HELIOS.dra file the invaraint TH DATA for a banch +* (including all burnup points). +* This routine write sequentially the HELIOS.dra file, branch after +* branch. +* +*----------------------------------------------------------------------- +* + USE GANLIB + TYPE(C_PTR) IPDAT,IPTH,KPTH + INTEGER :: DIM_LAMBDA = 6 + INTEGER NGP,ILONG + INTEGER ITYLCM,NBU,ITBRAN + CHARACTER (len=4) BRANCH,DLAY + CHARACTER JOBOPT(16) + INTEGER :: BU = 1 + REAL BURN(NBU) + REAL YLDXe(NBU),YLDPm(NBU),YLDI(NBU) + REAL OVERV(NGP,NBU),CHI(NGP,NBU),LAMBDA(6,NBU),BETA(6,NBU) + LOGICAL :: LAMB = .FALSE. + LOGICAL :: LCHI = .FALSE. + LOGICAL :: LYLD = .FALSE. + LOGICAL :: LINV = .FALSE. + LOGICAL :: LBET = .FALSE. + + IF(IPRINT>5) WRITE(6,*) 'SETTH: WRITE TH DATA' + + ! RECOVER FLAG INFORMATION + IF(JOBOPT(5)=='T') LCHI = .TRUE. + IF(JOBOPT(7)=='T') LINV = .TRUE. + IF(JOBOPT(9)=='T') LYLD = .TRUE. + IF(JOBOPT(13)=='T') LAMB = .TRUE. + IF(JOBOPT(12)=='T') LBET = .TRUE. + + IF(NGP>2)THEN + CALL XABORT('@D2P: NGP > 2 NOT IMPLEMENTED FOR T/H BLOCK') + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + IPTH=LCMGID(IPDAT,'TH_DATA') + + DO BU=1,NBU + KPTH=LCMDIL(IPTH,BU) + + IF(LCHI) THEN + IF(BU ==1) THEN + CALL LCMLEN(KPTH,'CHI',ILONG,ITYLCM) + IF (ILONG .NE. NGP) THEN + CALL XABORT (' MORE THAN 2 (NGP) VALUES FOR CHI RECORD') + ENDIF + ENDIF + CALL LCMGET(KPTH,'CHI',CHI(1:NGP,BU)) + + ENDIF + + IF(LINV) THEN + CALL LCMGET(KPTH,'OVERV',OVERV(1:NGP,BU)) + + ENDIF + + IF(LYLD) THEN + CALL LCMGET(KPTH,'YLDPm',YLDPm(BU)) + CALL LCMGET(KPTH,'YLDXe',YLDXe(BU)) + CALL LCMGET(KPTH,'YLDI',YLDI(BU)) + + ENDIF + + IF(LAMB)THEN + IF(BU == 1) THEN + CALL LCMLEN(KPTH,'LAMBDA',ILONG,ITYLCM) + IF (ILONG .NE. DIM_LAMBDA) THEN + CALL XABORT('MORE THAN 6 (NDLAY) VALUES FOR LAMBDA RECORD') + ENDIF + ENDIF + CALL LCMGET(KPTH,'LAMBDA',LAMBDA(1:DIM_LAMBDA,BU)) + ENDIF + + IF(LBET)THEN + IF(BU == 1) THEN + CALL LCMLEN(KPTH,'BETA',ILONG,ITYLCM) + IF (ILONG .NE. DIM_LAMBDA) THEN + CALL XABORT('MORE THAN 6 (NDLAY) VALUES FOR BETA RECORD') + ENDIF + ENDIF + CALL LCMGET(KPTH,'BETA',BETA(1:DIM_LAMBDA,BU)) + ENDIF + ENDDO + + IF(LCHI) CALL SET_CHI(IPHEL,BRANCH,ITBRAN,BURN,CHI,NGP,NBU) + IF(LINV) CALL SET_OVERV(IPHEL,BRANCH,ITBRAN,BURN,OVERV,NGP,NBU) + IF(LYLD) CALL SET_YIELD(IPHEL,BRANCH,ITBRAN,BURN,YLDPm,YLDXe, + > YLDI,NBU) + IF(LAMB) THEN + DLAY='LAMB' + CALL SET_DLAY(IPHEL,BRANCH,ITBRAN,BURN,LAMBDA,DIM_LAMBDA,DLAY, + > NBU) + ENDIF + IF(LBET) THEN + DLAY='BETA' + CALL SET_DLAY(IPHEL,BRANCH,ITBRAN,BURN,BETA,DIM_LAMBDA,DLAY,NBU) + ENDIF + END + + SUBROUTINE SET_CHI(IPHEL,BRANCH,ITBRAN,BURN,CHI,DIM_CHI,NBU) + INTEGER DIM_CHI,NBU,ITBRAN,NB + REAL CHI(DIM_CHI,NBU),BURN(NBU) + CHARACTER (len=4) BRANCH + + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_PRIN %CHI' + WRITE(IPHEL,*) 'Meaning :(.-.-E-G-.) G-th Group Fission Spect' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,'(31X,A3,11X,A3)') 'chi','chi' + WRITE(IPHEL,'(6X,A,12X,A,5X,A)') 'Label E','1-.-E-1-.','1-.-E-2-.' + ! LOOP OVER burnup points + DO NB=1,NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2,ES12.5E2)') + 1 CHI(1:DIM_CHI,NB) + ENDDO + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + END + + SUBROUTINE SET_OVERV(IPHEL,BRANCH,ITBRAN,BURN,OVERV,NG,NBU) + INTEGER NG,NBU,ITBRAN,NB + REAL OVERV(NG,NBU),BURN(NBU) + CHARACTER (len=4) BRANCH + + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_PRIN %VEL' + WRITE(IPHEL,*) 'Meaning :' + WRITE(IPHEL,*) '(.-.-E-G-.) G-th Group Neutron Velocity [m/s]' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,'(31X,A3,11X,A3)') 'vel','vel' + WRITE(IPHEL,'(6X,A,12X,A,5X,A)') 'Label E','.-.-E-1-.','.-.-E-2-.' + ! LOOP OVER burnup points + DO NB=1,NBU + + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2,ES12.5E2)') + 1 (1/(OVERV(1:NG,NB))) + ENDDO + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + END + + SUBROUTINE SET_YIELD(IPHEL,BRANCH,ITBRAN,BURN,YLDPm,YLDXe,YLDI, + 1 NBU) + INTEGER NBU,ITBRAN,NB,I,iXe,iPm,iI + REAL YLDPm(NBU), YLDXe(NBU),YLDI(NBU),BURN(NBU) + REAL YLD(NBU) + CHARACTER (len=4) BRANCH + CHARACTER (len=5) YIELD + CHARACTER (len=6) MEANING + CHARACTER (len=10 ) LABEL + + DO I=1, 3 + SELECT CASE (I) + CASE(1) + YIELD='YLDXE' + MEANING='Xe-135' + LABEL='YieldXe135' + DO iXe=1,NBU + YLD(iXe)=YLDXe(iXe) + ENDDO + CASE(2) + YIELD='YLDID' + MEANING=' I-135' + LABEL=' YieldI135' + DO iI=1,NBU + YLD(iI)=YLDI(iI) + ENDDO + CASE(3) + YIELD='YLDPM' + MEANING='Pr-149' + LABEL='YieldPm149' + DO iPm=1,NBU + YLD(iPm)=YLDPm(iPm) + ENDDO + END SELECT + + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + WRITE(IPHEL,*) 'List Title(s) 1) %XS_XESM %',YIELD + WRITE(IPHEL,*) 'Meaning : Effective ,',MEANING,' Yield' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,'(29X,A10)') LABEL + WRITE(IPHEL,'(6X,A,12X,A)') 'Label E','1-.-E-1-.' + ! LOOP OVER burnup points + DO NB=1,NBU + + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2)') YLD(NB) + ENDDO + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + ENDDO + END + + SUBROUTINE SET_DLAY(IPHEL,BRANCH,ITBRAN,BURN,VECT,DIM_LAMBDA, + 1 DLAY,NBU) + INTEGER DIM_LAMBDA,NBU,ITBRAN,NB + REAL VECT(DIM_LAMBDA,NBU),BURN(NBU) + CHARACTER (len=4) BRANCH,DLAY + CHARACTER (len=6) LABEL + + IF(DLAY.EQ.'LAMB') THEN + LABEL="lambda" + ELSE + LABEL="beta " + ENDIF + IF(DIM_LAMBDA.GT.8) THEN + WRITE (6,*) "@D2PBRA: NB OF DELAY NEUTRON GROUPS:",DIM_LAMBDA + CALL XABORT("MAX EIGHT DELAY NEUTRON GROUPS ARE ALLOWED") + ENDIF + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : PrintVector' + IF(LABEL=="lambda")THEN + WRITE(IPHEL,*) 'List Title(s) 1) %XS_BETA %DCAYB 1' + WRITE(IPHEL,*) 'Meaning : Decay Cst of the Delayed Neutron /s' + ELSE + WRITE(IPHEL,*) 'List Title(s) 1) %XS_BETA %BETA 1 ' + WRITE(IPHEL,*) 'Meaning : Delayed Neutron Fraction' + ENDIF + WRITE(IPHEL,*) ' (.-.-E-G-.) From 0 To 6-th Group' + + CALL SET_RIEGO(IPHEL) + IF(DIM_LAMBDA.EQ.6) THEN + WRITE(IPHEL,'(31X,A6,6X,A6,6X,A6,6X,A6,6X,A6,6X,A6)') + > LABEL,LABEL,LABEL,LABEL,LABEL,LABEL + WRITE(IPHEL,200) + > 'Label E','.-.-E-1-.','.-.-E-2-.','.-.-E-3-.','.-.-E-4-.', + > '.-.-E-5-.','.-.-E-6-.' + ! LOOP OVER burnup points + DO NB=1,NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2,5(ES12.5E2))') + > VECT(1:DIM_LAMBDA,NB) + ENDDO + ELSE IF(DIM_LAMBDA.EQ.8) THEN + WRITE(IPHEL,'(26X,A6,6X,A6,6X,A6,6X,A6,6X,A6,6X,A6,6X,A6)') + > LABEL,LABEL,LABEL,LABEL,LABEL,LABEL,LABEL + WRITE(IPHEL,210) + > 'Label E','.-.-E-1-.','.-.-E-2-.','.-.-E-3-.','.-.-E-4-.', + > '.-.-E-5-.','.-.-E-6-.','.-.-E-7-.' + ! LOOP OVER burnup points + DO NB=1,NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2,6(ES12.5E2))') VECT(1:7,NB) + ENDDO + + WRITE(IPHEL,*) + + WRITE(IPHEL,'(26X,A6)') 'lambda' + WRITE(IPHEL,'(6X,A,12X,A)') 'Label E',LABEL + DO NB=1, NBU + WRITE(IPHEL,220,advance='no') NB,BRANCH(1:2), + 1 ITBRAN,' ',BRANCH(1:2),ITBRAN,':',NINT(BURN(NB)) + WRITE(IPHEL,'(ES12.5E2)') VECT(DIM_LAMBDA,NB) + ENDDO + ENDIF + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + 200 FORMAT(6X,A,12X,A,3X,A,3X,A,3X,A,3X,A,3X,A) + 210 FORMAT(6X,A,12X,A,3X,A,3X,A,3X,A,3X,A,3X,A,3X,A) + 220 FORMAT(I4,1X,A,I4,A,A,I4,A,I5) + END diff --git a/Donjon/src/D2PDEF.f b/Donjon/src/D2PDEF.f new file mode 100644 index 0000000..92e3ea0 --- /dev/null +++ b/Donjon/src/D2PDEF.f @@ -0,0 +1,199 @@ +*DECK D2PDEF + SUBROUTINE D2PDEF( IPDAT, PKEY, VALPAR, NVALPA, STAIDX,REFIDX, + > REFSTA,HSTSTA, STATE, CRDINF, NCRD, NVAR, + > PKIDX, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Select the reference state. This routine determine the reference +* state in both cases: default meshing and initial meshing from Saphyb +* the default meshing is the folllowing : +* For other parameters than BARR and BURN, the subroutine keep three +* values from the list: the first, middle and last of Saphyb. For +* parameters BARR and BURN, all values are kept +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* NVAR number of state variables +* NCRD number of control rod composotion +* CRDINF control rod compositions array +* VALPAR array of values taken for each state variables +* STATE state values for current branch calculation +* STAIDX index of state values for current branch calculation +* REFSTA values for each state variables of reference branch +* HSTSTA values for each state variables of history branch +* +*Parameters: +* IPDAT +* PKEY +* VALPAR +* NVALPA +* STAIDX +* REFIDX +* REFSTA +* HSTSTA +* STATE +* CRDINF +* NCRD +* NVAR +* PKIDX +* IPRINT +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + + INTEGER NVAR,NCRD + INTEGER NVALPA(NVAR),CRDINF(NCRD) + INTEGER STAIDX(NVAR),REFIDX(NVAR) + REAL STATE(NVAR),VALPAR(NVAR,100) + REAL REFSTA(NVAR-1), HSTSTA(NVAR-1) + CHARACTER*12 PKEY(NVAR) + INTEGER PKIDX(NVAR) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPTH,KPTH + INTEGER ITYLCM,i,PK,IDX(NVAR),j + INTEGER :: NBR = 1 + ! number of values for each default state variable ( 1 if the + ! initial number of values is less than 3, 3 otherwise) + ! 1 : DMOD ; 2 : CBOR ; 3 : TCOM ; 4 : TMOD + INTEGER :: DMS(5) = 0 ! NB OF VALUE FOR PARAMETER + REAL :: REF(5) = -999.9 ! REFERENC VALUE + REAL :: STA(5) = -999.9 ! INITIAL VALUE + REAL :: HST(5) = -999.9 ! HISTORY VALUE + CHARACTER*12 PKNAM(6) + LOGICAL LFLAG(6) + CHARACTER*12,DIMENSION(6) :: PKREF + DATA PKREF/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + REAL DEF(5,3) + DEF(:5,:3)=0 + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + + DO PK=1, 6 + IPTH=LCMGID(IPDAT,'PKEY_INFO') + KPTH=LCMDIL(IPTH,PK) + CALL LCMGET(KPTH,'LFLAG',LFLAG(PK)) + IF (PK == 1 .OR. PK==6)THEN + CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ELSE + IF(LFLAG(PK)) CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ENDIF + ENDDO + + DO i=1, NVAR + IF (PKIDX(i).EQ.-1) THEN + IDX(i)=1 + ELSE + IDX(i)=PKIDX(i) + ENDIF + CALL LCMLEN(IPDAT,PKREF(IDX(i)),NVALPA(i),ITYLCM) + CALL LCMGET(IPDAT,PKREF(IDX(i)),VALPAR(i,1:NVALPA(i))) + IF (PKREF(IDX(i)).EQ.PKREF(1)) THEN + NBR=NBR*NVALPA(i) + PKEY(1)=PKNAM(1) + REFSTA(1)=CRDINF(1) + HSTSTA(1)= CRDINF(1) + STATE(1)= CRDINF(1) + STAIDX(1)=1 + REFIDX(1)=1 + ENDIF + ENDDO + + DO i=1, NVAR + DO j=2,5 + IF (PKREF(IDX(i)).EQ.PKREF(j)) THEN + IF(NVALPA(i)>2) THEN + DMS(j)=3 + DEF(j,2)=VALPAR(i,NINT(NVALPA(i)/2.0)) + DEF(j,3)=VALPAR(i,NVALPA(i)) + STAIDX(j)=2 ! DMOD INDEX OF INITIAL DEFAULT VALUE + REFIDX(j)=2 ! DMOD INDEX OF REFERENCE DEFAULT VALUE + NBR=NBR*3 + ELSE + DMS(j)=1 + STAIDX(j)=1 ! DMOD INDEX OF INITIAL DEFAULT VALUE + REFIDX(j)=1 ! DMOD INDEX OF REFERENCE DEFAULT VALUE + ENDIF + DEF(j,1)=VALPAR(i,1) + STA(j)=VALPAR(i,NINT(NVALPA(i)/2.0)) + HST(j)=VALPAR(i,NINT(NVALPA(i)/2.0)) + REF(j)=HST(j) + ENDIF + ENDDO + ENDDO + + DO k=2,5 + IF (k==6) THEN + PKEY(k)=PKNAM(6) + STATE(k)= VALPAR(NVAR,1) + STAIDX(k)=1 + REFIDX(k)=1 + CALL LCMDEL(IPDAT,PKREF(k)) + CALL LCMPUT(IPDAT,PKREF(k),NVALPA(NVAR),2, + 1 VALPAR(NVAR,1:NVALPA(NVAR)) ) + ELSE IF (LFLAG(k)) THEN + l=k-1 + DO WHILE ((.NOT.(LFLAG(l)).and. (l.GT.1))) + l=l-1 + ENDDO + PKEY(l+1)=PKNAM(k) + REFSTA(l+1)=REF(k) + HSTSTA(l+1)=HST(k) + STATE(l+1)=STA(k) + CALL LCMPUT(IPDAT,PKREF(k),DMS(k),2,DEF(k,1:DMS(k))) + ENDIF + ENDDO + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMPTC(IPDAT,'STATE_VAR',12,NVAR,PKEY) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMPTC(IPDAT,'BRANCH',12,PKNAM(1)) + CALL LCMPUT(IPDAT,'BRANCH_IT',1,1,1) + CALL LCMPUT(IPDAT,'REF_STATE',NVAR-1,2,REFSTA) + CALL LCMPUT(IPDAT,'HST_STATE',NVAR-1,2,REFSTA) + CALL LCMPUT(IPDAT,'BRANCH_NB',1,1,NBR) + CALL LCMPUT(IPDAT,'STATE_INDEX',NVAR,1,STAIDX) + CALL LCMPUT(IPDAT,'REF_INDEX',NVAR,1,REFIDX) + CALL LCMPUT(IPDAT,'BRANCH_INDEX',1,1,1) + CALL LCMPUT(IPDAT,'REWIND',1,1,1) + CALL LCMPUT(IPDAT,'STATE',NVAR,2,STATE) + CALL LCMPUT(IPDAT,'STOP',1,1,0) + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "*** INFORMATION ABOUT BRANCHING CALCULATION ***" + WRITE(6,*) + WRITE(6,*) "DEFAULT MESHING (Y/N) : Y" + WRITE(6,*) "==> NEW VALUES FOR PARAMTERS", + 1 " OTHER THAN BARR AND BURN :" + WRITE(6,*) " DMOD : ", DEF(2,1:DMS(2)) + WRITE(6,*) " CBOR : ", DEF(3,1:DMS(3)) + WRITE(6,*) " TCOM : ", DEF(4,1:DMS(4)) + IF(LFLAG(5)) THEN + WRITE(6,*) " TMOD : ", DEF(5,1:DMS(5)) + ENDIF + WRITE(6,*) + WRITE(6,*) "NUMBER OF BRANCHES : ", NBR + WRITE(6,*) + WRITE(6,*) "STATE PARAMETERS : ",PKEY(1:NVAR) + WRITE(6,*) "REFERENCE STATES VALUES :", REFSTA + WRITE(6,*) + WRITE(6,*) "INITIAL STATES VALUES :", STATE + WRITE(6,*) "INITIAL STATES INDEX VALUES :", STAIDX + WRITE(6,*) + ENDIF + + END diff --git a/Donjon/src/D2PDIV.f b/Donjon/src/D2PDIV.f new file mode 100644 index 0000000..6ee5701 --- /dev/null +++ b/Donjon/src/D2PDIV.f @@ -0,0 +1,290 @@ +*DECK D2PDIV + SUBROUTINE D2PDIV( IPDAT, IPSAP , IPRINT, NGP, NBU, NVAR, + > GRID, NPAR , NREA, NISO, NMAC, NMIL, + > NANI, NADRX , STAIDX, STATE, STAVAR, NSF, + > LABS, SCAT, LADF ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the DIVERS directory of an elementary calculation and store +* additional XS recovered directly from IPSAP +* WARNING: the GET_DIVERS_INFO subroutine cannot recover DIVERS +* information in the case where cross sections are interpolated by +* the SCR: module +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of the INFO data block +* IPSAP address of the saphyb object +* IPRINT control the printing on screen +* NGP number of energy groups +* NBU number of burnup point in IPSAP +* NVAR number of state parameters in INFO data block +* GRID type of gridding for branches (0 = default, 1 = Saphyb +* branching etc ) +* NPAR number of state parameters in saphyb (including FLUE and +* TIME) +* NREA number of reactions in IPSAP +* NISO number of isotopoes in IPSAP +* NMAC number of macros in IPSAP +* NMIL number of mixtrures in IPSAP +* NANI number of anisotropy +* STAIDX index of state variables +* STATE state variables of current branch calculation +* STAVAR state variables in INFO data block +* NSF nummber of surface in IPSAP +* LABS information for absorption reconstruction +* SCAT information for scattering XS reconstruction +* LADF flag for ADF reconstrcution +* +*Parameters: +* NADRX +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPSAP + INTEGER NPAR,NMIL,GRID,NVAR,NBU,NSF,NREA,NISO,NADRX + INTEGER NGP,IPRINT,NMAC,NANI,STAIDX (NVAR) + REAL STATE(NVAR) + CHARACTER(LEN=12) STAVAR(NVAR) + LOGICAL LABS(3),SCAT,LADF +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPTH,KPTH + ! LOOP INDEX + INTEGER i, It, Ib,PK + ! LOOP INDEX OF : PARAMETERS (ISV=1..NPAR), STATES (INP=1..NVAR) + INTEGER ISV,INP + ! DIMENSION OF ARBVAL + INTEGER DIMARB + ! NUMBER OF ELEMENTARY CALCULATIONS + INTEGER NCALS + ! TYPE OF DATA RECOVERED FROM GANLIB SUBROUTINES + INTEGER ITYLCM + ! NUMBER OF VALUES IN IDVAL ET VALDIV + INTEGER NVDIV + ! ORDER NUMBERS OF FLUE PARAMETERS IN SAPHYB + INTEGER :: FLUE_ID = 0 + ! ORDER NUMBERS OF TIME PARAMETERS IN SAPHYB + INTEGER :: TIME_ID = 0 + ! CF : APOLLO2 : NOTICE INFORMATIQUE DE LA VERSION 2.8-1 + INTEGER MUPLET(NPAR) + ! VECTOR OF : RANK ORDER OF STATE PARAMETERS, NUMBER OF VALUES + ! FOR EACH STATE PARAMETERS + INTEGER RANK_ORDER(NPAR), NVALUE(NPAR) + REAL B2 + CHARACTER*3 :: ADF_T = 'DRA' + ! NAME OF DIRECTORIES IN SAPHYB : ELEMENTARY CALCULATION, + ! CONTROL ROD + CHARACTER(LEN=12) CALDIR,BARRDIR + ! NAME OF STATE VARIABLES IN SAPHYB + CHARACTER(LEN=12) PKNAM(6) + ! STATE VARIABLES IN SAPHYB + CHARACTER(LEN=12) PKEY(NPAR) + LOGICAL LFLAG(6) + + ! CF : APOLLO2 : NOTICE INFORMATIQUE DE LA VERSION 2.8-1 + ! VALUES OF : VALDIV = (KEFF, KINF,B2), CONTROL ROD KEFF, KINF,B + INTEGER, ALLOCATABLE, DIMENSION(:) :: DEBARB,ARBVAL + REAL, ALLOCATABLE, DIMENSION(:) :: VALDIV,BARR_VAL + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: IDVAL + + ! RECOVER INFOMATION FROM INFO DATA BLOCK AND SAPHYB OBJECT + + ! MOVING INTO INFO DATA BLOCK + CALL LCMSIX (IPSAP,' ',0) + + CALL LCMSIX (IPSAP,'paramdescrip',1) + CALL LCMGTC(IPSAP,'PARKEY',4,NPAR,PKEY) + CALL LCMGET (IPSAP,'NVALUE',NVALUE) + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + IF (LADF) CALL LCMGTC(IPDAT,'ADF_TYPE',3,ADF_T) + PKEY (1:NPAR) (5:12) = " " + DO PK=1, 6 + IPTH=LCMGID(IPDAT,'PKEY_INFO') + KPTH=LCMDIL(IPTH,PK) + CALL LCMGET(KPTH,'LFLAG',LFLAG(PK)) + IF (PK == 1 .OR. PK==6)THEN + CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ELSE + IF(LFLAG(PK)) CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ENDIF + ENDDO + ! LOOP TO STORE THE INDEX OF FLUE AND + ! LINK THE FLUE AND TIME VARIABLES INDEX TO BURN VARIABLE INDEX + DO It=1, NPAR + IF(PKEY(It)=="TIME") TIME_ID=It + IF(PKEY(It)=="FLUE") FLUE_ID=It + ENDDO + ! LOOP OVER NUMBER OF STATE PARAMETERS IN SAPHYB + DO ISV=1, NPAR + ! LOOP OVER NUMBER OF STATE PARAMETERS IN INFO DATA BLOCK + DO INP=1, NVAR + ! IF NAME OF STATE VARIABLE IN INFO AND SAPHYB ARE EQUAL + IF(PKEY(ISV)==STAVAR(INP)) THEN + ! SPECIAL CASE FOR BARR parameters + IF(PKEY(ISV)==PKNAM(1)) THEN + !SPECIAL CASE FOR CONTROL ROD + ALLOCATE (BARR_VAL(NVALUE(ISV))) + WRITE(BARRDIR,'("pval", I8)') ISV + ! NAME OF DIRECTORY IN SAPHYB CONTAINING CONTROL ROD VALUES + IF(LFLAG(1)) THEN + ! RECOVER CONTROL ROD VALUES + CALL LCMSIX (IPSAP,' ',0) + CALL LCMSIX (IPSAP,'paramvaleurs',1) + CALL LCMGET(IPSAP,BARRDIR,BARR_VAL) + + ! LOOP OVER POSSIBLE VALUES OF CONTROL ROD IN SAPHYB + DO Ib=1, NVALUE(ISV) + IF(STATE(INP)==BARR_VAL(Ib)) THEN + ! STORE THE ORDER NUMBERS OF CURRENT CONTROL VALUES + ! CORRESPONDING TO THE BRANCH CALCULATED + RANK_ORDER(ISV)=Ib + ENDIF + ENDDO + ENDIF + DEALLOCATE (BARR_VAL) + + ! SPECIAL CASE WITH DEFAULT VALUES FOR STATE VARIABLES + ! (OTHER THAN BARR) + ELSE IF(GRID==0) THEN + ! TREATEMENT OF THE MID VALUE OF THE GRID + IF(STAIDX(INP)==2) THEN + ! ONLY DMOD,TCOM AND CBOR ARE AFFECTED BY THE DEFAULT + ! GRIDDING + IF((PKEY(ISV)==PKNAM(2))) THEN + RANK_ORDER(ISV)=NINT (NVALUE(ISV)/2.0) + ELSE IF((PKEY(ISV)==PKNAM(4)))THEN + RANK_ORDER(ISV)=NINT (NVALUE(ISV)/2.0) + ELSE IF((PKEY(ISV)==PKNAM(3)))THEN + RANK_ORDER(ISV)=NINT (NVALUE(ISV)/2.0) + ELSE + RANK_ORDER(ISV)=STAIDX(INP) + ENDIF + ! TREATEMENT OF THE LAST VALUE OF THE GRID + ELSE IF(STAIDX(INP)==3) THEN + ! ONLY DMOD,TCOM AND CBOR ARE AFFECTED BY THE DEFAULT + ! GRIDDING + IF((PKEY(ISV)==PKNAM(2))) THEN + RANK_ORDER(ISV)=NVALUE(ISV) + ELSE IF((PKEY(ISV)==PKNAM(4)))THEN + RANK_ORDER(ISV)=NVALUE(ISV) + ELSE IF((PKEY(ISV)==PKNAM(3)))THEN + RANK_ORDER(ISV)=NVALUE(ISV) + ELSE + RANK_ORDER(ISV)=STAIDX(INP) + ENDIF + ! ONLY DMOD,TCOM AND CBOR ARE AFFECTED BY THE DEFAULT + ! GRIDDING + ELSE ! THE FIRST VALUE IS UNCHANGED BY SET_DEFAULT_VALUE + RANK_ORDER(ISV)=STAIDX(INP) + ENDIF + ! IF WE KEEP THE INITIAL STATE VARIABLE GRID OF SAPHYB + ELSE + RANK_ORDER(ISV)=STAIDX(INP) + ENDIF + !TREATMENT OF FLUE AND TIME VARIABLES + IF(PKEY(ISV)==PKNAM(6)) THEN + IF(FLUE_ID>0) RANK_ORDER(FLUE_ID)=RANK_ORDER(ISV) + IF(TIME_ID>0) RANK_ORDER(TIME_ID)=RANK_ORDER(ISV) + ENDIF + ENDIF + ENDDO + ENDDO + + ! RECOVER INFORMATION FROM SAPHYB + CALL LCMSIX (IPSAP,' ',0) + CALL LCMSIX (IPSAP,'paramarbre',1) + CALL LCMLEN (IPSAP,'ARBVAL',DIMARB,ITYLCM) + ALLOCATE (ARBVAL(DIMARB),DEBARB(DIMARB+1)) + CALL LCMGET (IPSAP,'NCALS',NCALS) + CALL LCMGET (IPSAP,'ARBVAL',ARBVAL) + CALL LCMGET (IPSAP,'DEBARB',DEBARB) + ! PROCEDURE TO RECOVER THE NUMBER OF THE ELEMENTARY CALCULATION + ! CORREPSONDING TO THE CURRENT BRANCH + ! CF APOLLO2 : NOTICE INFORMATIQUE DE LA VERSION 2.8-1 + II=1 + DO 30 IPAR=1,NPAR + MUPLET(IPAR) =RANK_ORDER(IPAR) + DO 10 I=DEBARB(II),DEBARB(II+1)-1 + IF(MUPLET(IPAR).LE.ARBVAL(I))THEN + IF(MUPLET(IPAR).EQ.ARBVAL(I))THEN + II=I + GO TO 30 + ELSE + GO TO 20 + ENDIF + ENDIF +10 CONTINUE +20 ICAL=0 + WRITE(6,*) " MUPLET : ", MUPLET + CALL XABORT ("@D2PDIV: ELEMENTARY CALCULATION UNKNOWN") + RETURN +30 CONTINUE + ! END OF APPOLO2 PROCEDURE + + ICAL=DEBARB(II+1) ! number of the elementary calculation + + ! MOVING IN THE ELEMENTARY CALCULATION AND RECONVER THE B2, KEFF + ! AND KINF DATA + WRITE(CALDIR,'("calc", I8)') ICAL + CALL LCMSIX (IPSAP,' ',0) + CALL LCMSIX (IPSAP,CALDIR,1) + CALL LCMSIX(IPSAP,'divers',1) + CALL LCMGET(IPSAP,'NVDIV',NVDIV) + + ALLOCATE(IDVAL(NVDIV),VALDIV(NVDIV)) + CALL LCMGTC(IPSAP,'IDVAL',4,NVDIV,IDVAL) + CALL LCMGET(IPSAP,'VALDIV',VALDIV) + + + ! STORE RESULTS (IF CORRESPONDING DATA IS AVAILABLE) INTO INFO + ! data block at : + ! INFO/BRANCH_INFO/KEFF + ! INFO/BRANCH_INFO/B2 + ! INFO/BRANCH_INFO/KINF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IF(STAIDX(NVAR)==1) THEN + IPTH=LCMLID(IPDAT,'DIVERS',NBU) + ELSE + IPTH=LCMGID(IPDAT,'DIVERS') + ENDIF + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + + IF(IPRINT>1) THEN + WRITE(6,*) + WRITE(6,*) "**** DIVERS INFORMATION ****" + ENDIF + DO Idiv=1, NVDIV + IF(IDVAL(Idiv)=="KEFF") THEN + CALL LCMPUT(KPTH,'KEFF',1,2,VALDIV(Idiv)) + IF(IPRINT>1) WRITE(6,*)"KEFF :",VALDIV(Idiv) + ENDIF + IF(IDVAL(Idiv)=="KINF") THEN + CALL LCMPUT(KPTH,'KINF',1,2,VALDIV(Idiv)) + IF(IPRINT>1) WRITE(6,*)"KINF :",VALDIV(Idiv) + ENDIF + IF(IDVAL(Idiv)=="B2") THEN + CALL LCMPUT(KPTH,'B2',1,2,VALDIV(Idiv)) + B2=VALDIV(Idiv) + IF(IPRINT>1) WRITE(6,*)"B2 :",VALDIV(Idiv) + ENDIF + ENDDO + ! TEMPORARY SUBROUTINE WAITING FOR FURTHER DEVELOMENTS TO RECOVER + ! ADDITIONAL INFORMATION + CALL D2PXSA(IPDAT,IPSAP,ICAL,IPRINT,NGP,NREA,NISO,NMAC,NMIL, + 1 NANI,NVAR,NADRX,STAIDX,B2,ADF_T,NSF,LABS,SCAT,LADF) + DEALLOCATE (ARBVAL,DEBARB,VALDIV,IDVAL) ! FREE MEMORY + END diff --git a/Donjon/src/D2PDRV.f b/Donjon/src/D2PDRV.f new file mode 100644 index 0000000..fe41a0a --- /dev/null +++ b/Donjon/src/D2PDRV.f @@ -0,0 +1,419 @@ +*DECK D2PDRV + SUBROUTINE D2PDRV( NENTRY, HENTRY, IENTRY, JENTRY, KENTRY, NGP, + > NCRD, MIX, FA_K, IUPS, USRSTA, PHASE, + > IPRINT, STAVEC, CRDINF, USRVAL, VERS, SFAC, + > BFAC, FC1, FC2, FC3, FC4, XSC, + > USRVAPK, ADF, DER, JOBOPT, USRPAR, MESH, + > PKEY, FILNAM, ISOT, JOBTIT, COM, SAP, + > MIC, EXC, SCAT, LADD, LNEW, MIXDIR, + > CDF, GFF, ADFD, CDFD, YLD, YLDOPT, + > LOCYLD, XESM, ITEMP, OTHPK, OTHTYP, OTHVAL, + > HDET, LPRC, HEQUI, HMASL,ISOTOPT,ISOTVAL, + > LMEM,OTHVAR, THCK, HFLX, HCUR ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store an isotopic data recovered from a Saphyb into a Microlib. +* +*Copyright: +* Copyright (C) 2015 IRSN +* +*Author(s): +* J. Taforeau +* +*Parameters: input/output +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* NGP number of energy groups recovered from D2P input user +* NCRD number of control rod composition recovered from D2P input +* user +* MIX index of mixture on which XS are to be extracted (only for +* reflector cases) +* FA_K assembly type +* =0 reflector +* =1 assembly +* IUPS treatment for upscattering +* =0 keep up scatter XS +* =1 remove up scatter XS, modify down scatter with DRAGON +* spectrum (not available in this version) +* =2 remove up scatter XS, modify down scatter with infinite +* medium spectrum +* USRSTA state variable names recovered from GLOBAL record in D2P: +* USRVAL number of value for state variables recovered from GLOBAL +* record in D2P: +* PHASE the current phase of D2P: +* IPRINT control the printing on screen +* STAVEC various parameters associated with the IPDAT structure +* CRDINF meaning of control rods in the IPSAP object +* VERS version of PARCS to be used +* SFAC the scattering cross section factor +* BFAC the multiplier for betas +* FC1 FILE_CONT_1 recovered from D2P: input +* FC2 FILE_CONT_2 recovered from D2P: input +* FC3 FILE_CONT_3 recovered from D2P: input +* FC4 FILE_CONT_4 recovered from D2P: input +* XSC XS_CONT recovered from D2P: input +* USRVAPK value of state prameter set by the user and recoverd from +* USER ADD option in D2P: +* ADF type of ADF to be selected +* DER partials derivative (T) or row cross section (F) to be stored +* in PMAXS +* JOBOPT flag for JOB_OPT record in IPINP object +* USRPAR name of state variables (sapnam) in IPSAP associated to +* DMOD TCOM etc. recovered from PKEY card in D2P: +* MESH type of meshing to be applied for the branching calculation +* PKEY name of state variable (refnam) recovered from PKEY card in +* D2P: +* FILNAM name of IPINP +* ISOT name of isotopes in IPSAP for xenon samarium and promethium +* JOBTIT title of in header of PMAXS file +* COM comment to be printed in PMAXS file +* SAP flag to indicate that absorption cross section must be +* directly recovered from IPSAP +* MIC flag to indicate that absorption cross section must be +* directly recovered from IPMIC +* EXC flag to indicate that excess cross section is to be extracted +* from absoption xs (only if SAP) +* SCAT flag to indicate that scattering cross section must be +* directly reconstructed from IPSAP +* LADD flag to indicate that new points must be added to the IPSAP +* original meshing +* LNEW flag to indicate that only new points must be used during the +* branching calculation +* MIXDIR directory that contains homogeneous mixture information +* CDF type of CDF to be selected +* GFF type of GFF to be selected +* ADFD name of record for 'DRA' type of ADF +* CDFD name of record for 'DRA' type of CDF +* YLD user defined values for fission yields (1:I, 2:XE, 3:PM) +* LOCYLD value for state parameter on which fission yield will be calcu +* YLDOPT option for fission yield calculation (DEF, MAN, FIX) +* XESM option for comparing k-inf in GenPMAX (1: using Pm/Sm data; +* 2: using I/Xe data; 3: using I/Xe/Pm/Sm data) +* ITEMP indicate if temperature is in C or in K in the SAP/MCO objec +* HDET name of isotope for the detector cross sections +* LMER ADF are merged in the cross sections +* THCK Thickness of reflector +* HFLX Name of the record for the flux +* HCUR Name of the record for the current +* +*Parameters: +* OTHPK +* OTHTYP +* OTHVAL +* LPRC +* HEQUI +* HMASL +* ISOTOPT +* ISOTVAL +* LMEM +* OTHVAR +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 + INTEGER NGP,NCRD,MIX,FA_K,IUPS,USRSTA,XESM + INTEGER PHASE,IPRINT,ITEMP + REAL THCK + INTEGER STAVEC(40),CRDINF(20),USRVAL(12) + REAL VERS,SFAC,BFAC,YLD(3),LOCYLD(5) + REAL FC1(5),FC2(8),FC3(7),FC4(3),XSC(3) + REAL USRVAPK(12,10),ISOTVAL,OTHVAR(12) + CHARACTER JOBOPT(16) + CHARACTER*12 OTHTYP(12),OTHPK(12),OTHVAL(12),HDET + CHARACTER*3 ADF,CDF,GFF,YLDOPT + CHARACTER*8 ADFD(4),CDFD(8) + CHARACTER*4 DER,HEQUI,HMASL,JOB(4) + CHARACTER*1 ISOTOPT + CHARACTER*5 MESH + CHARACTER*8 PKEY(6) + CHARACTER*12 FILNAM,ISOT(6),SIGNAT,MIXDIR,USRPAR(12) + CHARACTER*16 JOBTIT + CHARACTER*8 HCUR(2),HFLX(2) + CHARACTER*40 COM + LOGICAL SAP, MIC, EXC,SCAT,LADD,LNEW,LPRC,LMEM +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPSAP,IPDAT,IPMIC + INTEGER IPHEL,IPINP,IPPRC + INTEGER DEB,REW + CHARACTER TEXT12*12,HSIGN*12,HSMG*131 + + IF (IPRINT.EQ.-1) IPRINT = 0 +*---- +* PHASE 1 : SET HEADER OF GENPMAXS INPUT FILE (.inp) AND HELIOS LIKE FI +*---- + IF (PHASE.EQ.1) THEN + IF(NENTRY.NE.3) CALL XABORT('@D2PDRV: 3 PARAMETERS EXPECTED.') + IF((IENTRY(1).NE.4)) THEN + WRITE(HSMG,'(12H@D2P: ENTRY ,A12,24H IS NOT OF SEQUENTIAL AS, + > 9HNCII TYPE)') HENTRY(2) + CALL XABORT(HSMG) + ELSE IF(JENTRY(1).EQ.2) THEN + WRITE(HSMG,'(12H@D2P: ENTRY ,A12,24H IS NOT IN CREATION OR I, + > 19HN MODIFICATION MODE)') + > HENTRY(1) + CALL XABORT(HSMG) + ENDIF + IF(IENTRY(2).NE.1) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,19H IS NOT OF LCM TYPE)') + > HENTRY(2) + CALL XABORT(HSMG) + ELSE IF(JENTRY(2).EQ.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT IN CREATION OR I, + > 19HN MODIFICATION MODE)') + > HENTRY(2) + CALL XABORT(HSMG) + ENDIF + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_INFO') THEN + TEXT12=HENTRY(2) + CALL XABORT('@D2P: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_INFO EXPECTED.') + ENDIF + IF(IENTRY(3).GT.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,19H IS NOT OF LCM TYPE)') + > HENTRY(3) + CALL XABORT(HSMG) + ELSE IF(JENTRY(3).NE.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,20H IS NOT IN READ ONLY, + > 5H MODE)') + > HENTRY(3) + CALL XABORT(HSMG) + ENDIF + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + SIGNAT=HSIGN + IF((HSIGN.NE.'L_SAPHYB')) THEN + IF(HSIGN.NE.'L_MULTICOMPO') THEN + TEXT12=HENTRY(3) + CALL XABORT('@D2PDRV: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_SAPHYB OR L_MULTICOMPO EXPECTED.') + ENDIF + ENDIF + + IPPRC=FILUNIT(KENTRY(1)) + IPDAT=KENTRY(2) ! output INFO address + IPSAP=KENTRY(3) ! input saphyb address +* + STAVEC(8)=INT(FC1(1)) + STAVEC(9)=INT(FC1(2)) + STAVEC(10)=INT(FC1(3)) + STAVEC(11)=INT(XSC(1)) + STAVEC(12)=INT(XSC(2)) + STAVEC(19)=ITEMP + IF ((XSC(1).GT.4).OR.(XSC(2).GT.8)) THEN + CALL XABORT ('@D2PDRV: CARD XS_CONT : NSIDE AND NCORNER' + 1 //' CANNOT EXCEED 4 AND 8 RESPECTIVELY.') + ENDIF + IF (MESH.EQ.'GLOB'.OR.MESH.EQ.'ADD') THEN + IF ((JOBOPT(1).EQ.'T').AND. (ADF .NE. 'DRA')) THEN + CALL XABORT('@D2PDRV: ADF OF TYPE (SEL/GET) CANNOT BE EXTRACT' + 1 //'ED WITH USER DEFINED BRANCHING CALCULATION') + ENDIF + ENDIF + WRITE(6,*) "****************************************************" + WRITE(6,*) "* DRAG2PARCS INPUT DATA RECOVERED *" + WRITE(6,*) "****************************************************" + IF(IPRINT > 0) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* PHASE 1 : RECOVER DATA AND CREATE INPUT FILES *" + WRITE(6,*) "****************************************************" + WRITE(6,*) + ENDIF +*---- + CALL D2PINP( IPSAP, IPDAT , IPRINT, STAVEC, CRDINF, NCRD, + > PKEY, ISOT, MESH, USRPAR, USRVAL, USRSTA, + > USRVAPK, SAP, MIC, EXC , SCAT, ADF , + > DEB, FA_K, LADD, LNEW, MIX, XSC, + > JOBOPT, SIGNAT, MIXDIR, CDF, GFF, ADFD, + > CDFD, YLD, YLDOPT, LOCYLD, OTHPK,OTHTYP, + > OTHVAL, HDET, OTHVAR, THCK, HFLX, HCUR) + + CALL D2PGEN ( IPINP, IPDAT, STAVEC, JOBTIT, FILNAM, DER, + > VERS, COM, JOBOPT, IUPS, FA_K, SFAC, + > BFAC, DEB, XESM, FC1 , FC2, FC3, + > FC4, XSC, IPRINT ) + + IF (LPRC) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* BUILDING PROCEDURE *" + WRITE(6,*) "****************************************************" + CALL D2PPRC( IPDAT, IPPRC,HEQUI, HMASL, ISOTVAL, ISOTOPT,LMEM, + > IPRINT,MIXDIR,JOBOPT ) + ENDIF + IF(IPRINT > 0) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* END OF PHASE 1 *" + WRITE(6,*) "****************************************************" + ENDIF +*---- +* PHASE 2 : BRANCHING CALCULATION +*---- + ELSE IF (PHASE.EQ.2) THEN + IF(NENTRY.NE.5) CALL XABORT('@D2PDRV: 5 PARAMETERS EXPECTED.') + IF(IENTRY(1).NE.4) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT OF SEQUENTIAL AS, + > 9HNCII TYPE)') HENTRY(1) + CALL XABORT(HSMG) + ELSE IF(JENTRY(1).EQ.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT IN CREATION OR I, + > 19HN MODIFICATION MODE)') + > HENTRY(1) + CALL XABORT(HSMG) + ENDIF + IF((IENTRY(5).GT.2)) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,19H IS NOT OF XSM TYPE)') + > HENTRY(5) + CALL XABORT(HSMG) + ELSE IF(JENTRY(5).NE.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT IN READ-ONLY MOD, + > 1HE)') + > HENTRY(5) + CALL XABORT(HSMG) + ENDIF + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_INFO') THEN + TEXT12=HENTRY(3) + CALL XABORT('@D2PDRV: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_INFO EXPECTED.') + ENDIF + CALL LCMGTC(KENTRY(5),'SIGNATURE',12,SIGNAT) + IF((SIGNAT.NE.'L_SAPHYB')) THEN + IF(SIGNAT.NE.'L_MULTICOMPO') THEN + TEXT12=HENTRY(5) + CALL XABORT('@D2PDRV: SIGNATURE OF '//TEXT12//' IS '//SIGNAT// + 1 '. L_SAPHYB OR L_MULTICOMPO EXPECTED.') + ENDIF + ENDIF + IPHEL=FILUNIT(KENTRY(1)) + IPINP=FILUNIT(KENTRY(2)) ! input GENPMAXS file unit + IPDAT=KENTRY(3) ! input DATA vector address + IPMIC=KENTRY(4) ! input Microlib vector address + IPSAP=KENTRY(5) ! input SAPHYB OBJECT + IF(IPRINT > 0) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* PHASE 2 : RECOVER CROSS SECTIONS OF BRANCH *" + WRITE(6,*) "****************************************************" + ENDIF + CALL LCMSIX(IPDAT,' ',0) + + CALL LCMGET(IPDAT,'STATE-VECTOR',STAVEC) + IF (STAVEC(18).EQ.1) THEN + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGTC(IPDAT,'NAMDIR',12,MIXDIR) + CALL LCMSIX(IPDAT,' ',0) + ENDIF + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGTC(IPDAT,'JOB_OPT',4,4,JOB) + NGP = STAVEC(1) + i=1 + DO j=1,4 + DO k=1,4 + JOBOPT(i)= JOB(j)(k:k) + i=i+1 + ENDDO + ENDDO + CALL LCMGET(IPDAT,'FLAG',DEB) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'REWIND',REW) + IF ((DEB.LE.0).AND.(REW.EQ.1))THEN + + WRITE(6,*)"******* CREATION OF HELIOS ANS GENPMAXS FILES *****" + CALL D2PHEL( IPHEL, IPDAT, IPMIC , IPINP, STAVEC, + > JOBOPT, IPRINT ) + + ENDIF + + CALL D2PXS(IPDAT,IPMIC,IPSAP,STAVEC,SIGNAT,MIXDIR,JOBOPT,IPRINT) + + CALL LCMSIX(IPDAT,' ',0) + + CALL LCMPUT(IPDAT,'STATE-VECTOR',40,1,STAVEC) + + IF(IPRINT > 0) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* END OF PHASE 2 *" + WRITE(6,*) "****************************************************" + ENDIF +*---- +* PHASE 3 : STORE BRANCHES IN HELIOS FILE +*---- + ELSE IF (PHASE.EQ.3) THEN + IF(NENTRY.GT.4) CALL XABORT('@D2PDRV: 3 PARAMETERS EXPECTED.') + IF((IENTRY(1).NE.4)) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT OF SEQUENTIAL AS, + > 9HNCII TYPE)') HENTRY(1) + CALL XABORT(HSMG) + ELSE IF(JENTRY(1).EQ.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT IN CREATION OR I, + > 19HN MODIFICATION MODE)') + > HENTRY(1) + CALL XABORT(HSMG) + ENDIF + IF(IENTRY(2).NE.4) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT OF SEQUENTIAL AS, + > 9HNCII TYPE)') HENTRY(2) + CALL XABORT(HSMG) + ELSE IF(JENTRY(2).EQ.2) THEN + WRITE(HSMG,'(15H@D2PDRV: ENTRY ,A12,24H IS NOT IN CREATION OR I, + > 19HN MODIFICATION MODE)') + > HENTRY(2) + CALL XABORT(HSMG) + ENDIF + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_INFO') THEN + TEXT12=HENTRY(2) + CALL XABORT('@D2PDRV: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + > '. L_INFO EXPECTED.') + ENDIF + IPHEL=FILUNIT(KENTRY(1)) ! dragon file unit + IPINP=FILUNIT(KENTRY(2)) ! GENPMAXS file unit + IPDAT=KENTRY(3) ! DATA vector address + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGET(IPDAT,'FLAG',DEB) + IF (DEB<0) THEN + DEB=1 + WRITE(6,*) "****************************************************" + WRITE(6,*) "* END OF FISSION YIELD BRANCH *" + WRITE(6,*) "****************************************************" + CALL LCMPUT(IPDAT,'FLAG',1,1,DEB) + ELSE + IF(IPRINT > 0) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* PHASE 3 : STORE BRANCHES IN HELIOS FILE *" + WRITE(6,*) "****************************************************" + ENDIF + WRITE(6,*) "***** STORE CURRENT BRANCH IN HELIOS LIKE FILE *****" + DEB=1 + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMGET(IPDAT,"STATE-VECTOR",STAVEC) + CALL D2PBRA( IPDAT,IPINP,IPHEL,STAVEC,DEB,SIGNAT,IPRINT) + + IF(IPRINT > 0) THEN + WRITE(6,*) "****************************************************" + WRITE(6,*) "* END OF PHASE 3 *" + WRITE(6,*) "****************************************************" + ENDIF + ENDIF + ENDIF + END diff --git a/Donjon/src/D2PGEN.f b/Donjon/src/D2PGEN.f new file mode 100644 index 0000000..635bae9 --- /dev/null +++ b/Donjon/src/D2PGEN.f @@ -0,0 +1,404 @@ +*DECK D2PGEN + SUBROUTINE D2PGEN( IPINP, IPDAT, STAVEC, JOBTIT, FILNAM, DER, + > VERS, COM, JOBOPT, IUPS, FA_K, SFAC, + > BFAC, DEB, XESM, FC1 , FC2, FC3, + > FC4, XSC, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Create the GENPMAXS input file GENPMAXS.inp at phase 1 +* WARNING: 04/2014: the format of this file respects the GENPMAXS format +* (it can't be changed) +* The information is recovered from the input file (.x2m) and stored in +* the INFO DATA block. The user can change any values in the input file +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPINP file unit of GENPMAXS.inp file +* IPDAT address of info data block +* VERS version of PARCS to be used +* SFAC the scattering cross section factor +* BFAC the multiplier for betas +* DEB FLAG to indicate the first call to the D2PGEN subroutine +* FA_K assembly type +* =0 reflector +* =1 assembly +* IUPS treatment for upscattering +* =0 keep up scatter XS +* =1 remove up scatter XS, modify down scatter with DRAGON +* spectrum (not available in this version) +* =2 remove up scatter XS, modify down scatter with infinite +* medium spectrum +* STAVEC various parameters associated with the IPDAT structure +* FILNAM name of IPINP +* JOBTIT title of in header of PMAXS file +* COM comment to be printed in PMAXS file +* DER partials derivative (T) or row cross section (F) to be stored +* in PMAXS +* JOBOPT array of flag to indicate the content option in the HELIOS +* like file and PMAXS +* XESM option for comparing k-inf in GenPMAX (1: using Pm/Sm data; +* 2: using I/Xe data; 3: using I/Xe/Pm/Sm data) +* +*Parameters: +* FC1 +* FC2 +* FC3 +* FC4 +* XSC +* IPRINT +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + INTEGER IPINP,STAVEC(40),FA_K,IUPS,DEB,XESM + REAL SFAC,BFAC,VERS + CHARACTER FILNAM*12,COM*40 + CHARACTER*16 JOBTIT + CHARACTER*1 DER + REAL FC1(5) + REAL FC2(8) + REAL FC3(7) + REAL FC4(3) + REAL XSC(3) + +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPTH,KPTH + ! INDEX AND FLAG EXISTENCE OF : TEMPERATURE OF FUEL AND MODERATO + INTEGER ITCOM, ITMOD,TMOD, TCOM + ! NUMBER OF STATES VARIABLES, BURNUP EXEPTED + INTEGER NVAR + ! NUMBER OF STATES VARIABLES + INTEGER STVARN + ! IF FLAG=1, END OF A BRANCH CALCULATION + INTEGER FLAG_PRINT, FLAG + ! NUMBER OF BRANCH CONTAINED IN THE FINAL PMAXS FILE + INTEGER NBR + ! INDEX OF THE CURRENT BRANCH AND NUMBER OF BURNUP POINTS + INTEGER BR_IT, NBU + INTEGER CRDINF(STAVEC(6)),STAIDX(STAVEC(2)) + INTEGER IB,PK,GRID,NCRD,NDEL,NLOC,ST + ! DATA SOURCE INFORMATION (CF GENPMAXS MANUAL) + REAL DATSRC(5),LOCYLD(5),THCK + REAL STATE(STAVEC(2)),HISTORY(STAVEC(2)-1), BU(STAVEC(4)) + CHARACTER(len=12) STATE_VAR(STAVEC(2)) + CHARACTER(len=4) STAVAR(STAVEC(2)) + INTEGER PKIDX(STAVEC(2)) + CHARACTER*1 JOBOPT(16) + CHARACTER*4 BR + CHARACTER*3 ADF_T + CHARACTER*12,DIMENSION(6) :: PKNAM + DATA PKNAM/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + LOGICAL LFLAG(6) + LOGICAL :: LYLD=.FALSE. + CHARACTER*3 YLDOPT + + ! INITIALIZATION OF ARRAYS + DATSRC(1)= 2.0 + DATSRC(2)= 1.0 + DATSRC(3)= FA_K + DATSRC(4)= SFAC + DATSRC(5)= BFAC + NGP=STAVEC(1) + NBU=STAVEC(4) + STVARN=STAVEC(2) + NVAR=STVARN-1 + NCRD=STAVEC(6) + NDEL=STAVEC(7) + + !RECOVER INFORMATION FROM INFO DATA block + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + IF (JOBOPT(9).EQ. 'T') LYLD = .TRUE. + IF (LYLD) THEN + CALL LCMGTC(IPDAT,'YLD_OPT',3,YLDOPT) + CALL LCMGET(IPDAT,'YLD_LOC',LOCYLD) + ENDIF + CALL LCMGTC(IPDAT,'STATE_VAR',12,STVARN,STATE_VAR) + CALL LCMGET(IPDAT,'PKIDX',PKIDX) + + DO PK=1, 6 + IPTH=LCMGID(IPDAT,'PKEY_INFO') + KPTH=LCMDIL(IPTH,PK) + + CALL LCMGET(KPTH,'LFLAG',LFLAG(PK)) + IF (PK == 1 .OR. PK==6)THEN + CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ELSE + IF(LFLAG(PK)) CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ENDIF + ENDDO + + IF(FA_K==1) THEN + GRID=STAVEC(5) + ELSE + GRID = 2 ! NO XE/SM FOR REFLECTOR CASE + ENDIF + ITCOM=0 + ITMOD=0 + TCOM=0 + TMOD=0 + + DO IST=1, STVARN + IF(STATE_VAR(IST)==PKNAM(1)) STAVAR(IST)='CR ' + IF(STATE_VAR(IST)==PKNAM(2)) STAVAR(IST)='DC ' + IF(STATE_VAR(IST)==PKNAM(3)) STAVAR(IST)='PC ' + IF(STATE_VAR(IST)==PKNAM(6)) STAVAR(IST)='BU ' + IF(STATE_VAR(IST)==PKNAM(4)) THEN + ITCOM=IST + TCOM=1 + STAVAR(IST)='TF ' + ENDIF + IF(STATE_VAR(IST)==PKNAM(5)) THEN + ITMOD=IST + TMOD = 1 + STAVAR(IST)='TC ' + ENDIF + ENDDO + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMPTC(IPDAT,'IDEVAR',4,STVARN,STAVAR) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + + IF(DEB.LE.0) THEN + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMPUT(IPDAT,'FLAG',1,1,DEB) + FLAG=DEB + CALL LCMSIX(IPDAT,' ',0) + CALL LCMGET(IPDAT,'BARR_INFO',CRDINF) + CALL D2PREF( IPDAT, STVARN, CRDINF, NCRD, GRID, PKIDX, + 1 PKNAM, IPRINT ) + IF (LYLD.and. (YLDOPT.EQ.'MAN')) THEN + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'STATE',STATE) + NLOC=0 + ST=0 + DO I=1,5 + IF (LOCYLD(I).NE. -1) THEN + NLOC=NLOC+1 + IF (LFLAG(I)) THEN + ST=ST+1 + STATE(I)=LOCYLD(I) + STATE_VAR(I)=PKNAM(I) + ELSE IF (I.EQ.1) THEN + ST=ST+1 + STATE_VAR(I)=PKNAM(I) + ENDIF + ENDIF + ENDDO + IF ((NLOC.NE.ST).OR.(NLOC.NE.NVAR)) THEN + WRITE(6,*) '@D2PGEN : INCORRECT NUMBER OF STATE PARAMETERS', + > ' SET IN "YLD MAN" CARD : ',NLOC + CALL XABORT('=> PLEASE FOLLOW THE SAP/MCO OBJECT CONTENT.') + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMPUT(IPDAT,'STATE',STVARN,2,STATE) + ENDIF + + ELSE + CALL LCMGET(IPDAT,'FLAG',FLAG) + ENDIF + + IF(FLAG .LE. 0) THEN + !FIRST CALL TO D2PGEN SUBROUTINE + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + ! CHECK THE JOB_OPT VECTOR + + ! LDED : DIRECT ENERGY DEPOSITION FRACTION NOT IMPLEMENTED + IF(JOBOPT(3)=='T') JOBOPT(3)='F' + ! LJ1F : J1 FACTOR FOR MINIMAL CRITICAL POWER RATIO + IF(JOBOPT(6)=='T') JOBOPT(6)='F' + ! LCHD : DELAY NEUTRON FISSION SPECTRUM NOT IMPLEMENTED + ! IF(JOBOPT(8)=='T') JOBOPT(8)='F' + ! LBET : BETA NOT IMPLEMENTED + IF((JOBOPT(12)=='T') .and. NDEL > 6) THEN + JOBOPT(12)='F' + WRITE(6,*) "@D2PGEN: WARNING " + WRITE(6,*) "NUMBER OF DELAYED NEUTRON GROUPS > 6 " + ! HELIOS FORMAT ACCEPTS ONLY NDEL =6 + WRITE(6,*) "lbet (JOBOPT(12)) FLAG FORCED TO FALSE " + ENDIF + ! LDEC : DECAY HEAT DATA NOT IMPLEMENTED + IF(JOBOPT(14)=='T') JOBOPT(14)='F' + IF((JOBOPT(13)=='T') .and. NDEL > 6) THEN + JOBOPT(13)='F' + WRITE(6,*) "@D2PGEN: WARNING " + WRITE(6,*) "NUMBER OF DELAYED NEUTRON GROUPS > 6 " + ! HELIOS FORMAT ACCEPTS ONLY NDEL =6 + WRITE(6,*) "lamb (JOBOPT(13)) FLAG FORCED TO FALSE " + ENDIF + + ! RECOVER INFORMATION FROM GENPMAXS_INP + CALL LCMPTC(IPDAT,'JOB_TIT',16,JOBTIT) + CALL LCMPTC(IPDAT,'DERIVATIVE',1,DER) + CALL LCMPTC(IPDAT,'JOB_OPT',1,16,JOBOPT(:16)) + CALL LCMPUT(IPDAT,'IUPS',1,1,IUPS) + CALL LCMPUT(IPDAT,'XESMOPT',1,1,XESM) + CALL LCMPUT(IPDAT,'DAT_SRC',5,2,DATSRC) + CALL LCMPTC(IPDAT,'COMMENT',40,COM) + CALL LCMPUT(IPDAT,'VERSION',1,2,VERS) + CALL LCMPTC(IPDAT,'FILE_NAME',12,FILNAM) + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'HELIOS_HEAD',1) + CALL LCMPUT(IPDAT,'FILE_CONT_1',2,2,FC1(4:5)) + CALL LCMPUT(IPDAT,'FILE_CONT_2',8,2,FC2) + CALL LCMPUT(IPDAT,'FILE_CONT_3',7,2,FC3) + CALL LCMPUT(IPDAT,'FILE_CONT_4',3,2,FC4) + CALL LCMPUT(IPDAT,'XS_CONT',3,2,XSC) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + ! RECOVER HISTORY STATE AND number of branches + CALL LCMGET(IPDAT,'HST_STATE',HISTORY) + CALL LCMGET(IPDAT,'BRANCH_NB',NBR) + + ! WRITING JOBTIT CARD + + IF(IPRINT > 2) THEN + WRITE(6,*) + WRITE(6,*) "******* INFORMATION FOR GENPMAXS INPUT *********" + WRITE(6,*) + WRITE(6,*) "JOB_TIT CARD : JOB_TIT,DERIVATIVE,", + 1 " VERSION, COMMENT" + WRITE(6,*) "VALUES :",JOBTIT,DER, VERS, COM + WRITE(6,*) + WRITE(6,*) "JOB_OPT CARD : ad,xe,de,j1,ch,Xd,iv,dt,yl,cd,gf,", + 1 " be,lb,dc,ups" + WRITE(6,'(A,14(A,1X))') "VALUES :",JOBOPT(1:14) + WRITE(6,*) + WRITE(6,*) "DAT_SRC CARD : SRC_KIND, NFILE, FA_KIND, SFAC,", + 1 " BFAC" + WRITE(6,*) "VALUES :",INT(DATSRC) + WRITE(6,*) + WRITE(6,*) "STAVAR CARD :" + WRITE(6,*) "NUMBER :",STVARN + WRITE(6,*) "VALUES :",STAVAR(1:STVARN) + WRITE(6,*) + WRITE(6,*) "HISTORY CARD (IN GENPMAXS FORMALISM):" + WRITE(6,*) "VALUES OF STATES VARIABLES :",HISTORY(1:NVAR) + WRITE(6,*) + WRITE(6,*) "BRANCH CARD :" + WRITE(6,*) "NUMBER OF BRANCHES : ",NBR + WRITE(6,*) + + ENDIF + ELSE IF(FLAG == 1) THEN + CALL LCMSIX(IPDAT,' ',0) + CALL LCMGET(IPDAT,'BARR_INFO',CRDINF) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'STATE',STATE) + CALL LCMGET(IPDAT,'STATE_INDEX',STAIDX) + CALL LCMGET(IPDAT,'PRINT',FLAG_PRINT) + CALL LCMGTC(IPDAT,'BRANCH',4,BR) + CALL LCMGET(IPDAT,'BRANCH_IT',BR_IT) + + ! REORG BARR INFORMATION + + DO IB=1 ,NCRD + IF(STATE(1)==CRDINF(IB)) THEN + STATE(1)=IB-1 + EXIT + ENDIF + ENDDO + ! TEMPERATURE CONVERSION + IF (STAVEC(19).EQ.0) THEN + IF(TCOM==1) STATE(ITCOM)=STATE(ITCOM)+273.15 ! convert C to K + IF(TMOD==1) STATE(ITMOD)=STATE(ITMOD)+273.15 + ENDIF + ! CONTINUE WRITING BRANCH CARD + IF(FLAG_PRINT==1) THEN + WRITE (IPINP,'(A,A,I4.4,3X,3(F11.5,1X,F11.5,1X))') + 1 'HIST',BR(1:2),BR_IT,(STATE(I), I=1,NVAR) + ENDIF + + IF(IPRINT > 2) THEN + WRITE(6,*) + WRITE(6,*) "*CONTINUE WRITING BRANCH CARD IN GENPMAXS INPUT*" + WRITE(6,*) + WRITE(6,*) "BRANCH TYPE : ",BR + WRITE(6,*) "BRANCH INDEX : ",BR_IT + WRITE(6,*) "BRANCH STATE VALUES : ",STATE(1:NVAR) + WRITE(6,*) "BRANCH STATE INDEX : ",STAIDX(1:NVAR) + WRITE(6,*) + ENDIF + ELSE IF(FLAG == 2) THEN + ! RECOVER INFORMATION FROM INFO + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + + CALL LCMGET(IPDAT,'BURN',BU) + IF(JOBOPT(1)=='T') THEN + CALL LCMGTC(IPDAT,'ADF_TYPE',3,ADF_T) + IF (ADF_T.EQ.'GEN') CALL LCMGET(IPDAT,'THCK',THCK) + ENDIF + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'BRANCH_NB',NBR) + + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGTC(IPDAT,'FILE_NAME',12,FILNAM) + CALL LCMGET(IPDAT,'DAT_SRC',DATSRC) + + + ! WRITING BURNUP CARD + WRITE (IPINP,'(A)') '%BURNUP' + WRITE (IPINP,'(I1,/,A,3X,I2)') 1, 'set1',NBU + WRITE (IPINP,'(5(3X,F8.3),/)') (BU(I)/1000, I=1,NBU) + WRITE (IPINP,'(A,1X,I4,A,I1)') 'HIST01',NBR,'*',1 + + IF ((INT(DATSRC(3)).EQ.0).AND.(JOBOPT(1)=='T') + > .AND.(ADF_T.EQ.'GEN'))THEN + WRITE (IPINP,'(A)')'%ADF_1D' + WRITE (IPINP,'(A)')'ANM 0 1' + WRITE (IPINP,'(F8.5)')THCK + ENDIF + ! WRITING HEL_FMT CARD + WRITE (IPINP,'(A)') '%HEL_FMT' + WRITE (IPINP,'(I1,/,I1,1X,I2,1X,I2,1X,I1)') 1,1,24,12,8 + + ! WRITING FIL_CNT CARD + WRITE (IPINP,'(A)') '%FIL_CNT' + WRITE (IPINP,'(I1,3X,A,3X,I4,3X,I1)') 1,FILNAM,NBR,1 + DO IB=1,NBR + WRITE (IPINP,'(I4,1X,I1,1X,I4,1X,I1,1X,I2)') IB,1,IB,1,NBU + ENDDO + + ! WRITING JOB_END CARD + WRITE (IPINP,'(A)') '%JOB_END' + + IF(IPRINT > 2) THEN + WRITE(6,*) + WRITE(6,*) "***** END OF EDITING THE GENPMAXS INPUT ******" + WRITE(6,*) + WRITE(6,*) "BURNUP CARD : " + WRITE(6,*) "VALUES OF BURNUP POINTS :",BU/1000 + WRITE(6,*) + WRITE(6,*) "HEL_FMT CARD : NFMT, Index, LABEL, WIDTH, COLUMN" + WRITE(6,*) "VALUES (FIXED) :",1,4,24,12,8 + WRITE(6,*) + WRITE(6,*) "EDIT FIL_CNT CARD " + WRITE(6,*) + ENDIF + ENDIF + CALL LCMSIX(IPDAT,' ',0) + + END diff --git a/Donjon/src/D2PHEL.f b/Donjon/src/D2PHEL.f new file mode 100644 index 0000000..3360d32 --- /dev/null +++ b/Donjon/src/D2PHEL.f @@ -0,0 +1,363 @@ + SUBROUTINE D2PHEL ( IPHEL, IPDAT, IPMIC , IPINP, STAVEC, + > JOBOPT, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store the header of HELIOS.dra file - (independant data compared with +* branching calculation) at phase 1 +* WARNING: 04/2014 : the format of this file respect the HELIOS format +* (it cannot be changed) +* The information is recovered from the input file (.x2m) and stored in +* the INFO DATA block. The user can change any values in the input file +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPHEL file unit of HELIOS like file +* IPDAT adress of info data block +* STAVEC various parameters associated with the IPDAT structure +* FC1 FILE_CONT_1 recovered from D2P: input +* FC2 FILE_CONT_2 recovered from D2P: input +* FC3 FILE_CONT_3 recovered from D2P: input +* FC4 FILE_CONT_4 recovered from D2P: input +* XSC XS_CONT recovered from D2P: input +* IPRINT control the printing on screen +* +*Parameters: +* IPMIC +* IPINP +* JOBOPT +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPMIC + INTEGER IPHEL + INTEGER STAVEC(40) + ! FILE_CONT DATA BLOC ( CF D2P: DOCUMENTATION) + REAL FC1(2) + REAL FC2(8) + REAL FC3(7) + REAL FC4(3) + REAL XSC(3) + REAL DATSRC(5) +*---- +* LOCAL VARIABLES +*---- + INTEGER NBU,FA_K + CHARACTER*16 JOBTIT + CHARACTER*12 FILNAM + CHARACTER*1 DER + CHARACTER*40 COM + CHARACTER*1 JOBOPT(16) + REAL HISTORY(STAVEC(2)-1) + CHARACTER*4 STAVAR(STAVEC(2)) + INTEGER IUPS,XESM + REAL VERS + + + NBU=STAVEC(4) + NPAR=STAVEC(2) + NVAR=NPAR-1 + + ! RECOVER INFORMATION FROM INFO/HELIOS_HEAD DATA BLOCK + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + + CALL LCMGTC(IPDAT,'IDEVAR',4,NPAR,STAVAR) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGET(IPDAT,'DAT_SRC',DATSRC) + CALL LCMGTC(IPDAT,'JOB_TIT',16,JOBTIT) + CALL LCMGTC(IPDAT,'DERIVATIVE',1,DER) + CALL LCMGET(IPDAT,'IUPS',IUPS) + CALL LCMGET(IPDAT,'XESMOPT',XESM) + CALL LCMGTC(IPDAT,'COMMENT',40,COM) + CALL LCMGET(IPDAT,'VERSION',VERS) + CALL LCMGTC(IPDAT,'FILE_NAME',12,FILNAM) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'HELIOS_HEAD',1) + CALL LCMGET(IPDAT,'FILE_CONT_1',FC1) + CALL LCMGET(IPDAT,'FILE_CONT_2',FC2) + CALL LCMGET(IPDAT,'FILE_CONT_3',FC3) + CALL LCMGET(IPDAT,'FILE_CONT_4',FC4) + CALL LCMGET(IPDAT,'XS_CONT',XSC) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + !RECOVER HISTORY STATE AND number of branches + CALL LCMGET(IPDAT,'HST_STATE',HISTORY) + CALL LCMGET(IPDAT,'BRANCH_NB',NBR) + + IF (IUPS.EQ.2) IUPS=0 + FA_K=INT(DATSRC(3)) + IF ((STAVEC(21).EQ.1) .and. (JOBOPT(1).EQ.'T') )THEN + JOBOPT(1)='F' + ENDIF + IF (STAVEC(19).EQ.0) THEN + DO I=1,NVAR + IF (STAVAR(I).EQ.'TF ') THEN + + HISTORY(I)=HISTORY(I)+273.15 + ENDIF + IF (STAVAR(I).EQ.'TC ') THEN + HISTORY(I)=HISTORY(I)+273.15 + ENDIF + ENDDO + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMPUT(IPDAT,'HST_STATE',NVAR,2,HISTORY) + ! WRITING JOBTIT CARD + WRITE (IPINP,*) '%JOB_TIT' + WRITE (IPINP,'(A,A,A,1X,A,1X,F3.1,1X,A,A,A)') + 1'"',JOBTIT,'"',DER, VERS, '"',COM,'"' + + ! WRITING JOB_OPT CARD + WRITE (IPINP,*) '%JOB_OPT' + WRITE (IPINP,'(14(A,1X),2(I1,1X))',advance="no") + 1 JOBOPT(1:14),IUPS,XESM + WRITE (IPINP,'(/A)') + 1'!ad,xe,de,j1,ch,Xd,iv,dt,yl,cd,gf,be,lb,dc,ups' + + ! WRITING DAT_SRC CARD + WRITE (IPINP,*) '%DAT_SRC' + WRITE(IPINP,'(I2,1X,I2,1X,I2,1X,F3.1,1X,F3.1)')INT(DATSRC(1)), + 1INT(DATSRC(2)),INT(DATSRC(3)),DATSRC(4),DATSRC(5) + + ! WRITING STA_VAR CARD + WRITE (IPINP,*) '%STA_VAR' + WRITE (IPINP,'(I2/,3(A,1X,A))') NVAR,(STAVAR(I), I=1,NVAR) + + ! WRITING HISTORY CARD + ! CONCERN THE CONTROL ROD COMPOSITION + IF(HISTORY(1)==0) THEN + HISTORY(1)=1 + ELSE IF(HISTORY(1)==1) THEN + HISTORY(1)=0 + ELSE IF(HISTORY(1)==2) THEN + HISTORY(1)=2 + ENDIF + + WRITE (IPINP,*) '%HISTORY' + WRITE (IPINP,'(I1,1X,I1,/,A,1X,3(F11.5,1X,F11.5,1X))') 1,1, + 1'HIST01',(HISTORY(I), I=1,NVAR) + + ! WRITING BRANCH CARD + WRITE (IPINP,*) '%BRANCH' + WRITE (IPINP,'(I4,1X,I1)') NBR, 1 + + + ! WRITE FILE_CONT DATA in HELIOS.dra file + IF(IPRINT > 0) WRITE(6,*) "STEP 1 : EDIT THE HEADER " + CALL SET_INFO(IPHEL) + IF(IPRINT > 0) WRITE(6,*) "STEP 2 : EDIT THE CONT1 BLOCK " + IF (FA_K.EQ.0) THEN + FC1(1)=0. + ELSE + IF (FC1(1).EQ.0.) THEN + + CALL LCMSIX(IPMIC,'',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMLEN(IPMIC,'MASL',ILONG,ITYLCM) + IF (ILONG.GT.1) THEN + CALL XABORT("@D2PHEL: MORE THAN 1 METAL DENS. IN THE MICROLIB") + ELSE IF (ILONG.EQ.0) THEN + WRITE(6,*)"@D2PHEL: RECORD MASL NOT FOUND IN MICROLIB" + WRITE(6,*)"=> PLEASE USE THE FILE_CONT_1 CARD IN D2P:" + CALL XABORT(" OR USE THE 'REFLECTOR' KEYWORD") + ELSE + CALL LCMGET(IPMIC,'MASL',FC1(1)) + ENDIF + ELSE IF (FC1(1).LE.0.) THEN + CALL XABORT('@D2PHEL: NEGATIVE VALUE FOR HEAVY METAL DENSITY') + ENDIF + ENDIF + CALL LCMPUT(IPDAT,'FILE_CONT_1',2,2,FC1) + CALL SET_CONT1(IPHEL,STAVEC,FC1,IPRINT) + ! IF(IPRINT > 0) WRITE(6,*) "STEP 3 : EDIT THE CONT2 BLOCK " + ! CALL SET_CONT2(IPHEL,FC2,NGP,IPRINT) + IF(IPRINT > 0) WRITE(6,*) "STEP 4 : EDIT THE CONT3 BLOCK " + CALL SET_CONT3(IPHEL,FC3,IPRINT) + IF(IPRINT > 0) WRITE(6,*) "STEP 5 : EDIT THE CONT4 BLOCK " + CALL SET_CONT4(IPHEL,FC4,IPRINT) + + ! MOVE TO GENPMAXS_INP DIRECTORY + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + IF ((STAVEC(21).EQ.1) .and. (JOBOPT(1).EQ.'F') )THEN + JOBOPT(1)='T' + ENDIF + END + + SUBROUTINE SET_CONT1(IPHEL,STAVEC,FILE_CONT_1,IPRINT) + INTEGER STAVEC(40) + REAL FILE_CONT_1(2) + + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) ===========================' + WRITE(IPHEL,*) ' 2) %FILE_CONT 1' + WRITE(IPHEL,*) ' 3) ===========================' + WRITE(IPHEL,*) ' 4) Meaning : NGROUP, NCOLS, NR' + 1 //'OWS, PART,' + WRITE(IPHEL,*) ' HM Density, Bypass Density ' + CALL SET_RIEGO(IPHEL) + WRITE(IPHEL,120) 'NGROUP','NCOLS','NROWS','PART', + 1 'DenHM','DenByp' + WRITE(IPHEL,125) 'Label E','.-.-E-.-.','.-.-E-.-.','.-.-E-.-.', + 1 '.-.-E-.-.','1-.-E-.-.','.-.-E-.-.' + WRITE(IPHEL,130) ' 1 HST 1 HST : 0',STAVEC(1), + 1 STAVEC(8),STAVEC(9), STAVEC(10), + 2 FILE_CONT_1(1),FILE_CONT_1(2) + WRITE(IPHEL,'()') + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "CONTENT : NGROUP, NCOLS, NROWS, PART,", + 1 " HM Density, Bypass Density " + WRITE(6,*) "VALUES :",STAVEC(1),STAVEC(8:10),FILE_CONT_1 + WRITE(6,*) + ENDIF + 120 FORMAT(27X,A,9X,A,9X,A,10X,A,9X,A,8X,A) + 125 FORMAT(6X,A,12X,A,3X,A,3X,A,3X,A,3X,A,3X,A) + 130 FORMAT(A,10X,I2,10X,I2,10X,I2,10X,I2,5X,F7.5,5X,F7.5) + END + + SUBROUTINE SET_CONT2(IPHEL,FILE_CONT_2,NGROUP,IPRINT) + INTEGER NGROUP + CHARACTER*9 LABEL + REAL FILE_CONT_2(NGROUP) + + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) ===========================' + WRITE(IPHEL,*) ' 2) %FILE_CONT 2' + WRITE(IPHEL,*) ' 3) ===========================' + WRITE(IPHEL,*) ' 4)Meaning : Lower Energy of Neu' + 1 //'tron Groups' + CALL SET_RIEGO(IPHEL) + + IF(NGROUP .EQ. 8) THEN + WRITE(IPHEL,220) 'EMIN','EMIN' + WRITE(IPHEL,225) 'Label E' + DO I=1, NGROUP + WRITE(LABEL,'(A,I1,A)')".-.-E-",I,"-." + PRINT*,"LABEL",LABEL + WRITE(IPHEL,'(A9,5X)',advance='no')LABEL + ENDDO + WRITE(IPHEL,230) ' 1 HST 1 HST : 0',FILE_CONT_2(1), + 1 FILE_CONT_2(2) + ELSE + CALL XABORT ("@D2PHEL: NUMBER OF ENERGY GROUPS MUST BE 2") + ENDIF + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "CONTENT : Lower Energy of Neutron Groups" + WRITE(6,*) "VALUES :",FILE_CONT_2 (1:NGROUP) + WRITE(6,*) + ENDIF + + 220 FORMAT(32X,A,10X,A) + 225 FORMAT(6X,A,17X) + 230 FORMAT(A,ES12.5E2,ES12.5E2) + END + + SUBROUTINE SET_CONT3(IPHEL,FILE_CONT_3,IPRINT) + REAL FILE_CONT_3(7) + + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) ===========================' + WRITE(IPHEL,*) ' 2) %FILE_CONT 3' + WRITE(IPHEL,*) ' 3) ===========================' + WRITE(IPHEL,*) ' 4)Meaning : Regions Volume' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,320) 'VCool','VWatR','VModr','VCnRd','VFuel', + 1 'VClad','VChan' + WRITE(IPHEL,310) 'Label E','1-.-E-.-.','.-.-E-.-.','1-.-E-.-.', + 1 '1-.-E-.-.','1-.-E-.-.','1-.-E-.-.','1-.-E-.-.' + WRITE(IPHEL,390) ' 1 HST 1 HST : 0',FILE_CONT_3(1), + 1 FILE_CONT_3(2),FILE_CONT_3(3),FILE_CONT_3(4),FILE_CONT_3(5), + 2 FILE_CONT_3(6),FILE_CONT_3(7) + + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "CONTENT : VCool, VWatR, VModr, VCnRd, VFuel,", + 1 " VClad, VChan" + WRITE(6,*) "VALUES :",FILE_CONT_3 + WRITE(6,*) + ENDIF + + 310 FORMAT(6X,A,12X,A,3X,A,3X,A,3X,A,3X,A,3X,A,3X,A) + 320 FORMAT(27X,A,2X,A,9X,A,9X,A,9X,A,9X,A,9X,A,9X,A) + 390 FORMAT(A,ES12.5E2,ES12.5E2,ES12.5E2,ES12.5E2, + 1 ES12.5E2,ES12.5E2,ES12.5E2,ES12.5E2) + END + + SUBROUTINE SET_CONT4(IPHEL,FILE_CONT_4,IPRINT) + REAL FILE_CONT_4(3) + + WRITE(IPHEL,'()') + WRITE(IPHEL,*) 'List name : PMAX_FILE_DATA' + WRITE(IPHEL,*) 'Labels Array : KINF' + WRITE(IPHEL,*) 'List Title(s) 1) ===========================' + WRITE(IPHEL,*) ' 2) %FILE_CONT 4' + WRITE(IPHEL,*) ' 3) ===========================' + WRITE(IPHEL,*) ' 4) Cell Pitch and X,Y Pos of F' + 1 //'irst Cell' + + CALL SET_RIEGO(IPHEL) + + WRITE(IPHEL,320) 'PITCH','XBE','YBE' + WRITE(IPHEL,410) 'Label E','.-.-E-.-.','.-.-E-.-.','.-.-E-.-.' + WRITE(IPHEL,390) ' 1 HST 1 HST : 0',FILE_CONT_4(1), + 1 FILE_CONT_4(2),FILE_CONT_4(3) + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "CONTENT : PITCH ,XBE , YBE" + WRITE(6,*) "VALUES :", FILE_CONT_4 + WRITE(6,*) + ENDIF + + 320 FORMAT(24X,A,11X,A,11X,A) + 390 FORMAT(A,ES12.5E2,ES12.5E2,ES12.5E2) + 410 FORMAT(6X,A,12X,A,5X,A,5X,A) + END + + SUBROUTINE SET_INFO(IPHEL) + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + WRITE(IPHEL,*) 'Pre-processing for PMAXS Generation' + DO I=1, 18 + WRITE(IPHEL,*) '*' + ENDDO + WRITE(IPHEL,*) '<<< DRAGON >>> Version: 5.0.0 <<< DRAGON >>>' + WRITE(IPHEL,*) 'DRAGON CALCULATION BY J.TAFOREAU' + + WRITE(IPHEL,*) 'HELIOS Cases Used:' + WRITE(IPHEL,'()') + WRITE(IPHEL,*) ' 1) IMP-operator name : kkk' + WRITE(IPHEL,*) ' DRAGON case : kkk' + WRITE(IPHEL,*) ' Title(s) 1 : kkk' + WRITE(IPHEL,'()') + END + + SUBROUTINE SET_RIEGO(IPDRA) + WRITE(IPDRA,'()') + WRITE(IPDRA,*) '(R) Area/Face names : unlabeled' + WRITE(IPDRA,*) '(I) Isotope Identifiers : unlabeled' + WRITE(IPDRA,*) '(E) Path (STATE) idents : * ' + WRITE(IPDRA,*) '(G) Group name : unlabeled' + WRITE(IPDRA,*) '(O) Originating Group : unlabeled' + WRITE(IPDRA,'()') + END diff --git a/Donjon/src/D2PINP.f b/Donjon/src/D2PINP.f new file mode 100644 index 0000000..2d7e44d --- /dev/null +++ b/Donjon/src/D2PINP.f @@ -0,0 +1,241 @@ +*DECK D2PINP + SUBROUTINE D2PINP( IPSAP, IPDAT , IPRINT, STAVEC, CRDINF, NCRD, + > PKEY, ISOT, MESH, USRPAR, USRVAL, USRSTA, + > USRVAPK, SAP, MIC, EXC , SCAT, ADF , + > DEB, FA_K, LADD, LNEW, MIX, XSC, + > JOBOPT, SIGNAT, MIXDIR, CDF, GFF, ADFD, + > CDFD, YLD, YLDOPT, LOCYLD, OTHPK, OTHTYP, + > OTHVAL, HDET, OTHVAR, THCK, HFLX, HCUR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* 1) Recover data from saphyb or multicompo object. +* 2) Build headers of GenPMAXS and Helios like file +* +*Copyright: +* Copyright (C) 2015 IRSN +* +*Author(s): +* J. Taforeau +* +*Parameters: input/output +* IPSAP address of saphyb or multicompo object +* IPDAT address of data structure INFO +* NCRD number of control rod composition recovered from D2P +* input user +* MIX index of mixture on which XS are to be extracted (only +* for reflector cases) +* FA_K assembly type +* =0 reflector +* =1 assembly +* USRSTA state variable names recovered from GLOBAL record in D2P: +* USRVAL number of value for state variables recovered from GLOBAL +* record in D2P: +* IPRINT control the printing on screen +* STAVEC various parameters associated with the IPDAT structure +* CRDINF meaning of control rods in the IPSAP object +* XSC XS_CONT recovered from D2P: input +* DEB FLAG to indicate the first call to the D2PGEN subroutine +* USRVAPK value of state prameter set by the user and recoverd from +* USER ADD option in D2P: +* ADF type of ADF to be selected +* JOBOPT flag for JOB_OPT record in IPINP object +* USRPAR name of state variables (sapnam) in IPSAP associated to +* DMOD TCOM etc. recovered from PKEY card in D2P: +* MESH type of meshing to be applied for the branching calculation +* PKEY name of state variable (refnam) recovered from PKEY card in +* D2P: +* ISOT name of isotopes in IPSAP for xenon samarium and promethium +* SAP flag to indicate that absorption cross section must be +* directly recovered from IPSAP +* MIC flag to indicate that absorption cross section must be +* directly recovered from IPMIC +* EXC flag to indicate that excess cross section is to be extracted +* from absoption xs (only if SAP) +* SCAT flag to indicate that scattering cross section must be +* directly reconstructed from IPSAP +* LADD flag to indicate that new points must be added to the IPSAP +* original meshing +* LNEW flag to indicate that only new points must be used during the +* branching calculation +* SIGNAT signature of the object containing cross sections +* MIXDIR directory that contains homogeneous mixture information +* CDF type of CDF to be selected +* GFF type of GFF to be selected +* ADFD name of record for 'DRA' type of ADF +* CDFD name of record for 'DRA' type of CDF +* YLD user defined values for fission yields (1:I, 2:XE, 3:PM) +* LOCYLD value for state parameter on which fission yield will be +* calculated +* YLDOPT option for fission yields calculation (DEF, MAN, FIX) +* HDET name of isotope for the detector cross sections +* THCK Thickness of reflector +* HFLX Name of the record for the flux +* HCUR Name of the record for the current +* +*Parameters: +* OTHPK +* OTHTYP +* OTHVAL +* OTHVAR +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP,IPDAT + INTEGER NCRD,MIX,FA_K,USRSTA + INTEGER IPRINT,DEB + REAL THCK + INTEGER STAVEC(40),CRDINF(20),USRVAL(12) + REAL YLD(3),LOCYLD(5) + REAL XSC(3) + REAL USRVAPK(12,10),OTHVAR(12) + CHARACTER JOBOPT(16) + CHARACTER*3 ADF,CDF,GFF,YLDOPT + CHARACTER*8 ADFD(4),CDFD(8) + CHARACTER*5 MESH + CHARACTER*8 PKEY(6),HFLX(2),HCUR(2) + CHARACTER*12 ISOT(8), SIGNAT,MIXDIR,USRPAR(12) + CHARACTER*12 OTHPK(12), OTHTYP(12), OTHVAL(12),HDET + LOGICAL SAP, MIC, EXC,SCAT,LADD,LNEW +*---- +* LOCAL VARIABLES +*---- + LOGICAL :: LADF=.FALSE. + LOGICAL :: LCDF=.FALSE. + LOGICAL :: LGFF=.FALSE. + LOGICAL :: LYLD=.FALSE. + INTEGER NADF,NCDF + + IF (JOBOPT(1)=='T') THEN + NADF=STAVEC(13) + IF (NADF.NE.XSC(1)) THEN + WRITE(6,*)'@D2PINP: INCOHERENT NUMBER OF ADF (',NADF, + > ')','AND NUMBER OF SIDES IN ASSEMBLY (',XSC(1),').' + CALL XABORT ("=> CHECK CARD 'ADF' AND 'XS_CONT'") + ENDIF + IF ((SIGNAT.EQ.'L_SAPHYB').and.(ADF.EQ.'DRA')) THEN + WRITE(6,*) "@D2PINP: ADF OF TYPE (",ADF, + 1 ") NOT YET IMPLEMENTED WITH SAPHYB OBJECT" + WRITE(6,*)"=> WARNING : ADF CALUCLATION IGNORED" + LADF = .FALSE. + JOBOPT(1)='F' + ELSE IF ((SIGNAT.EQ.'L_MULTICOMPO').and. + > ((ADF.EQ.'SEL').OR.(ADF.EQ.'SEL'))) THEN + WRITE(6,*) "@D2PINP: ADF OF TYPE (",ADF, + 1 " NOT YET IMPLEMENTED WITH MULTICOMPO OBJECT" + WRITE(6,*)"=> WARNING : ADF CALUCLATION IGNORED" + LADF = .FALSE. + JOBOPT(1)='F' + ELSE + LADF = .TRUE. + ENDIF + ELSE + LADF = .FALSE. + ENDIF + IF (JOBOPT(10)=='T') THEN + NCDF=STAVEC(15) + IF (NCDF.NE.XSC(2)) THEN + WRITE(6,*)'@D2PINP: INCOHERENT NUMBER OF CDF (',NCDF, + > ')','AND NUMBER OF CORNERS IN ASSEMBLY (',XSC(2),').' + CALL XABORT ("=> CHECK CARD 'CDF' AND 'XS_CONT'") + ENDIF + IF (SIGNAT.EQ.'L_SAPHYB') THEN + WRITE(6,*) "@D2PINP: CDF CALCULATION", + 1 " NOT YET IMPLEMENTED WITH SAPHYB OBJECT" + WRITE(6,*)"=> WARNING : CDF CALUCLATION IGNORED" + LCDF = .FALSE. + JOBOPT(10)='F' + ENDIF + IF (CDF.NE. 'DRA') THEN + CALL XABORT ("@D2PINP UNKNOW CDF TYPE : "//CDF//'.') + ENDIF + LCDF = .TRUE. + ELSE + LCDF = .FALSE. + ENDIF + IF (JOBOPT(11)=='T') THEN + IF (SIGNAT.EQ.'L_SAPHYB') THEN + WRITE(6,*) "@D2PINP: GFF CALCULATION", + 1 " NOT YET IMPLEMENTED WITH SAPHYB OBJECT" + WRITE(6,*)"=> WARNING : GFF CALUCLATION IGNORED" + LGFF = .FALSE. + JOBOPT(11)='F' + ENDIF + IF (GFF.NE. 'DRA') THEN + CALL XABORT ("@D2PINP UNKNOW GFF TYPE : '"//GFF//"'.") + ENDIF + LGFF = .TRUE. + ELSE + LGFF = .FALSE. + ENDIF + + IF (JOBOPT(9)=='T') LYLD = .TRUE. + IF ((JOBOPT(2)=='T').and.(JOBOPT(9)=='F')) THEN + WRITE(6,*) "@D2PINP: JOB_OPT : XE/SM ARE REQUESTED (lxes=T) ", + 1 "BUT FISSION YIELDS ARE NOT RECOVERED (lyld=F) " + WRITE(6,*) "=> THE lyld FLAG IS FORCED TO TRUE" + JOBOPT(9)='T' + LYLD = .TRUE. + ENDIF + + IF((FA_K.EQ.1).OR.(FA_K.EQ.0)) THEN +* CASE FOR FUEL PMAXS + IF (SIGNAT.EQ.'L_SAPHYB') THEN + STAVEC(18)=0 + WRITE(6,*) "******* EXTRACTION OF DATA FROM SAPHYB ****" + CALL D2PSAP ( IPSAP, IPDAT, STAVEC, CRDINF, NCRD, PKEY, + > ISOT , MESH, USRPAR, USRVAL, USRSTA,USRVAPK, + > SAP , MIC, EXC, SCAT, ADF, LADD, + > LNEW , LADF, IPRINT, LYLD, YLD, YLDOPT, + > LOCYLD, HDET ) + + ELSE IF (SIGNAT.EQ.'L_MULTICOMPO') THEN + STAVEC(18)=1 + WRITE(6,*) "******* EXTRACTION OF DATA FROM MULTICOMPO ****" + WRITE(6,*) + WRITE(6,*) "DIRECTORY:'",MIXDIR,"' AT MIXUTRE INDEX ",MIX,"." + WRITE(6,*) "=> WARNING: CHECK EXISTENCE OF ",MIXDIR,"DIRECTORY." + CALL LCMLIB(IPSAP) + IF (LADF) THEN + WRITE(6,*) "ADF CALCULATION REQUESTED:" + WRITE(6,*)"=> WARNING: CHECK EXISTENCE OF ADF RECORDS" + ENDIF + IF (LCDF) THEN + WRITE(6,*) "CDF CALCULATION REQUESTED:" + WRITE(6,*)"=> WARNING: CHECK EXISTENCE OF '",CDFD(1:NCDF), + > "' RECORDS" + ENDIF + + CALL D2PMCO ( IPSAP, IPDAT, STAVEC, CRDINF, NCRD, PKEY, + > ISOT , MESH, USRPAR, USRVAL, USRSTA,USRVAPK, + > SAP , MIC, EXC, SCAT, ADF, LADD, + > LNEW , LADF, IPRINT, MIXDIR, MIX, LCDF, + > LGFF , CDF, GFF, ADFD, CDFD, LYLD , + > YLD, YLDOPT, LOCYLD, OTHPK, OTHTYP, OTHVAL, + > OTHVAR, THCK, HFLX, HCUR ) + ELSE + CALL XABORT ('@D2PINP: UNKNOWN SIGNATURE') + ENDIF + ELSE + CALL XABORT('@D2PINP: PHASE 1: FUEL OR REFLECTOR CARD EXPECTED') + ENDIF + + IF (YLDOPT.EQ.'MAN') THEN + DEB = -1 + ELSE + DEB = 0 + ENDIF + + IF (STAVEC(19).EQ.1) THEN + WRITE(6,*)"=> WARNING: THE TEMPERATURE ARE INDIACTED IN K" + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMPUT(IPDAT,'STATE-VECTOR',40,1,STAVEC) + + END diff --git a/Donjon/src/D2PMAC.f b/Donjon/src/D2PMAC.f new file mode 100644 index 0000000..d08bb63 --- /dev/null +++ b/Donjon/src/D2PMAC.f @@ -0,0 +1,367 @@ +*DECK D2PMAC + SUBROUTINE D2PMAC( IPDAT, IPMIC , IPRINT, NBU, NGP, NBMIX, + > NADD, NANI, NVAR, STAIDX, LADF, NADF, + > NTYPE, LCDF, NCDF, LGFF, NGFF, NPIN, + > FLUX ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover macroscopic cross sections from a microlib object and write +* cross sections for one branch at a fixed burnup point in the INFO +* data block. +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* IPMIC address of the microlib object +* IPRINT +* NBU number of burnup points +* NBMIX number of mixturess +* NBISO number of isotopes +* NGP number of energy groups +* NADD number of additional cross sections +* NDEL number of delayed neutron groups +* NANI number of anisotropy +* NVAR number of state variables +* STAIDX table of states index order +* LADF flag for assembly discontinuity factor +* NADF number of assembly discontinuity factor per energy groups +* NTYPE number of type of assembly discontinuity factor +* LCDF flag for corner discontinuity factor +* NCDF number of corner discontinuity factor per energy groups +* LGFF flag for group form factor +* NGFF number of group form factor per energy groups +* NPIN number of pin on each side of the assembly +* (note: if NADF, NCDF, NGFF or NPIN are not defined +* a fake value of 1 is assigned for allocation memory issue) +* +*Parameters: +* FLUX +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPMIC + INTEGER STAIDX(NVAR) + INTEGER NBU,NADD,NVAR,NBMIX,NGP,NANI,NADF,NCDF,NGFF,NPIN + LOGICAL LADF,LCDF,LGFF + REAL FLUX (NGP) +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE + PARAMETER (NSTATE=40) + TYPE(C_PTR) JPMIC,KPMIC,IPTH,KPTH + INTEGER NSCAT,ITYLCM,ILONG,IUPS + INTEGER IJJ(NBMIX),NJJ(NBMIX),IPOS(NBMIX) + REAL GAR2(NGP,NGP,NBMIX,NANI),GAR3(NBMIX*NGP) + REAL XSECT(NGP) ! TOTAL CROSS SECTIONS + REAL KAPPA_FI(NGP) ! KAPPA FISSION CROSS SECTIONS + REAL X_NU_FI(NGP) ! NU SIGMA FISSION CROSS SECTIONS + REAL XTR(NGP) ! TRANSPORT CROSS SECTIONS + REAL DIFF(NGP) ! DIFFUSION COEFF + REAL SCAT(NGP) ! SCATTERING CROSS SECTIONS + !REAL TRANC(NGP) ! TRANSPORT CORRECTION + REAL ABSORPTION(NGP) ! ABSORPTION CROSS SECTIONS + REAL SCAT_MAT(NGP*NGP) ! SCATTERING MATRIX + REAL SCAT_TMP(NGP,NGP,NBMIX,NANI) ! TEMPORARY SCATTERING MATRIX + REAL SIGW00(NGP) + DOUBLE PRECISION SUMSCAT(NGP) + ! AVERAGE HOMOGENE SURFACIC FLUX (FLUX-INTG/VOLUME) and + ! HETEROGENE + REAL FLXHOM(NGP),FLXHET(NGP) + REAL VOLUME + CHARACTER(len=8) ADDXSNAM(NADD) + CHARACTER*8 :: HFLX(8) = 'NUL' + CHARACTER*8 :: HCUR(8) = 'NUL' + CHARACTER CM*2,ADF_T*3,CDF_T*3,GFF_T*3 + CHARACTER(LEN=8) ADFD(NADF),CDFD(NCDF) + CHARACTER(LEN=8) HADF(NTYPE) ! ADF NAME IN MACROLIB + REAL ADF(NADF,NGP) ! ASSEMBLY AND CORNER DF + ! NADF=1 for DRA, NTYPE=1 for SEL + ! and GET + REAL CDF(NCDF,NGP) ! ASSEMBLY AND CORNER DF + REAL GFFC(NGFF,NGP) ! GROUP FORM FACTORS GFF by mixture + REAL KFC(NGFF,NGP) ! h-factor +! REAL VOLG(NGFF) ! volume of GROUP FORM FACTORS + REAL GFF(NPIN,NPIN,NGP) ! GFF pin by pin + ! GFF geometry + INTEGER MIXG(NPIN,NPIN) ! mixture + + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMGET(IPMIC,'VOLUME',VOLUME) + IF(NADD.GT.0)CALL LCMGTC(IPMIC,'ADDXSNAME-P0',8,NADD,ADDXSNAM) + IF(NBMIX.NE.1) THEN + ! SAPHYB MUST CONTAIN ONLY ONE MIXTURES + CALL XABORT('D2PMAC: MORE THAN ONE MIXTURE IN SAPHYB') + ENDIF + JPMIC=LCMGID(IPMIC,'GROUP') + SUMSCAT=0.0D0 + SCAT_TMP(:NGP,:NGP,:NBMIX,:NANI)=0.0 + ! LOOP OVER ENERGY GROUPS + DO IGR=1,NGP + KPMIC=LCMGIL(JPMIC,IGR) + CALL LCMLEN(KPMIC,'NTOT0',ILONG,ITYLCM) + IF(ILONG.NE.NBMIX) THEN + CALL XABORT('@D2PMAC: MORE THAN ONE MIXTURE IN SAP/MCO') + ENDIF + ! RECOVER CROSS SECTIONS INFORMATION + CALL LCMGET(KPMIC,'NTOT0',XSECT(IGR)) + CALL LCMGET(KPMIC,'SIGS00',SCAT(IGR)) + CALL LCMGET(KPMIC,'SIGW00',SIGW00(IGR)) + ! CALL LCMGET(KPMIC,'TRANC',TRANC(IGR)) + CALL LCMGET(KPMIC,'NUSIGF',X_NU_FI(IGR)) + + CALL LCMGET(KPMIC,'H-FACTOR',KAPPA_FI(IGR)) + CALL LCMLEN(KPMIC,'DIFF',ILONG,ITYLCM) + IF (ILONG>0) THEN + PRINT*,'ILONG DIFF ',ILONG + CALL LCMGET(KPMIC,'DIFF',DIFF(IGR)) + XTR(IGR)=1/(3*DIFF(IGR)) + ELSE + DIFF(:)=0 + CALL LCMLEN(KPMIC,'NTOT1',ILONG,ITYLCM) + IF (ILONG.EQ.NGP) THEN + CALL LCMGET(KPMIC,'NTOT1',XTR(IGR)) + WRITE(6,*) "WARNING : NTOT1 RECOVERED AS TRANSPORT + > CROSS SECTION (SUITABLE FOR SPn WITH NG>=2)" + ELSE + CALL LCMGET(KPMIC,'NTOT0',XTR(IGR)) + WRITE(6,*) "WARNING : NTOT0 RECOVERED AS TRANSPORT + > CROSS SECTION (SUITABLE FOR SPn WITH NG>2)" + ENDIF + ENDIF + + CALL LCMGET(KPMIC,'FLUX-INTG',FLXHOM(IGR)) + + ! INITIALIZATION OF GAR2 VECTOR + GAR2(:NGP,:NGP,:NBMIX,:NANI)=0.0 + + ! LOOP OVER ANISOTROPY COMPONENT + DO IL=1,NANI + WRITE(CM,'(I2.2)') IL-1 + LENGTH=1 + IF(IL.GT.1) CALL LCMLEN(KPMIC,'SCAT'//CM,LENGTH,ITYLCM) + IF(LENGTH.GT.0) THEN + CALL LCMGET(KPMIC,'SCAT'//CM,GAR3) + CALL LCMGET(KPMIC,'NJJS'//CM,NJJ) + CALL LCMGET(KPMIC,'IJJS'//CM,IJJ) + CALL LCMGET(KPMIC,'IPOS'//CM,IPOS) + ! LOOP OVER MIXTRURE + DO IMIL=1,NBMIX + IPOSDE=IPOS(IMIL) + ! LOOP OVER ENERGY GROUPS + DO JGR=IJJ(IMIL),IJJ(IMIL)-NJJ(IMIL)+1,-1 + GAR2(IGR,JGR,IMIL,IL)=GAR3(IPOSDE) ! IGR <-- JGR + + ! ELEMENTS OF THE SCATTERING MATRIX + SCAT_TMP(IGR,JGR,IMIL,IL)=GAR2(IGR,JGR,IMIL,IL) + IPOSDE=IPOSDE+1 + ENDDO + ENDDO + ENDIF + ENDDO + ENDDO + + + ! STORE THE SCATTERING MATRIX CORRESPONDING TO L=0 AND MIX=1 + ! IN SCAT_MAT + NSCAT=1 + DO J=1, NGP + DO I=1, NGP + + SCAT_MAT(NSCAT)=SCAT_TMP(J,I,1,1) ! I <-- J 1<-1 2<-1 + + IF (SCAT_MAT(NSCAT)<0) THEN + SUMSCAT(J)=SUMSCAT(J)+SCAT_MAT(NSCAT) + SCAT_MAT(NSCAT)=0 + WRITE(6,*) "WARNING : NEGATIVE VALUES FOR SCATTERING MATRIX + > ELEMENT (",J,"->",I,")." + ENDIF + NSCAT=NSCAT+1 + ENDDO + XTR(J)=XTR(J)+REAL(SUMSCAT(J)) + SUMSCAT=0.0D0 + + ENDDO + + DO I=1, NGP + ABSORPTION(I)=XSECT(I)-SCAT(I) + ENDDO + + ! STORE CROSS SECTIONS IN INFO/CROSS_SECT/MACROLIB_XS + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGET(IPDAT,'IUPS',IUPS) + IF ((IUPS.EQ.2).AND.(NGP.EQ.2)) THEN + SCAT_MAT(2)=SCAT_MAT(2)-FLXHOM(2)/FLXHOM(1)*SCAT_MAT(3) + SCAT_MAT(3)=0. + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + + IF(STAIDX(NVAR)==1) THEN + IPTH=LCMLID(IPDAT,'CROSS_SECT',NBU) + ELSE + IPTH=LCMGID(IPDAT,'CROSS_SECT') + ENDIF + + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + + CALL LCMSIX(KPTH,'MACROLIB_XS',1) + CALL LCMPUT(KPTH,'XTR',NGP,2,XTR) + CALL LCMPUT(KPTH,'ABSORPTION',NGP,2,ABSORPTION) + CALL LCMPUT(KPTH,'X_NU_FI',NGP,2,X_NU_FI) + CALL LCMPUT(KPTH,'KAPPA_FI',NGP,2,KAPPA_FI) + CALL LCMPUT(KPTH,'SCAT',NGP*NGP,2,SCAT_MAT) + + ! RECOVER THE ASSEMBLY DISCONTINUITY FACTOR IF ADF DRA IS SET + ! BY THE USER + IF((LADF).OR.(LCDF)) THEN + FLXHOM(:)=FLXHOM(:) / VOLUME + CALL LCMSIX (IPDAT,' ',0) + CALL LCMSIX (IPDAT,'SAPHYB_INFO',1) + ADF_T=" " + IF(LADF) THEN + CALL LCMGTC(IPDAT,'ADF_TYPE',3,ADF_T) + IF (ADF_T.EQ.'DRA') THEN + CALL LCMGTC(IPDAT,'HADF',8*NADF,1,ADFD) + ELSE IF (ADF_T.EQ.'GEN') THEN + CALL LCMLEN(IPDAT,'HFLX',NFLX,ITYLCM) + CALL LCMGTC(IPDAT,'HFLX',8*NFLX,1,HFLX(1:NFLX)) + CALL LCMGTC(IPDAT,'HCUR',8*NFLX,1,HCUR(1:NFLX)) + ENDIF + ENDIF + CDF_T=" " + IF(LCDF) THEN + CALL LCMGTC(IPDAT,'CDF_TYPE',3,CDF_T) + CALL LCMGTC(IPDAT,'HCDF',8*NCDF,1,CDFD) + ENDIF + IF((ADF_T(:3) .EQ. 'DRA').OR.(CDF_T(:3) .EQ. 'DRA') + > .OR.(ADF_T(:3) .EQ. 'GEN' ) )THEN + ! NADF = 1 or 4, NCDF = 1 or 4 + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMSIX(IPMIC,'ADF',1) + CALL LCMGTC(IPMIC,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMGET(IPMIC,HADF(ITYPE),FLXHET) + IF(LADF) THEN + IF (ADF_T(:3) .EQ. 'DRA') THEN + DO I=1,NADF + IF(HADF(ITYPE).EQ.ADFD(I))THEN + DO IGR=1, NGP + ADF(I,IGR)= FLXHET(IGR)/FLXHOM(IGR) + ENDDO + ENDIF + ENDDO + ELSE IF ((ADF_T(:3) .EQ. 'GEN')) THEN + IF(HADF(ITYPE).EQ.HFLX(1))THEN + CALL LCMPUT(KPTH,'FLXL',NGP,2,FLXHET) + ENDIF + IF(HADF(ITYPE).EQ.HFLX(2))THEN + CALL LCMPUT(KPTH,'FLXR',NGP,2,FLXHET) + ENDIF + IF (HADF(ITYPE).EQ.HCUR(1))THEN + CALL LCMPUT(KPTH,'CURL',NGP,2,FLXHET) + ENDIF + IF (HADF(ITYPE).EQ.HCUR(2))THEN + CALL LCMPUT(KPTH,'CURR',NGP,2,FLXHET) + ENDIF + ENDIF + ENDIF + IF(LCDF) THEN + DO I=1,NCDF + IF(HADF(ITYPE).EQ.CDFD(I))THEN + DO IGR=1, NGP + CDF(I,IGR)= FLXHET(IGR)/FLXHOM(IGR) + ENDDO + ENDIF + ENDDO + ENDIF + ENDDO + IF(LADF) CALL LCMPUT(KPTH,'ADF',NADF*NGP,2,ADF) + IF(LCDF) CALL LCMPUT(KPTH,'CDF',NCDF*NGP,2,CDF) + IF(IPRINT>1) THEN + WRITE(6,*) + IF(LADF) WRITE(6,*)"ADF :",ADF + IF(LCDF) WRITE(6,*)"CDF :",CDF + ENDIF + ENDIF + FLXHOM(:)=FLXHOM(:) * VOLUME + ENDIF + IF(LGFF) THEN + FLXHOM(:)=FLXHOM(:) / VOLUME + CALL LCMSIX (IPDAT,' ',0) + CALL LCMSIX (IPDAT,'SAPHYB_INFO',1) + CALL LCMGTC(IPDAT,'GFF_TYPE',3,GFF_T) + + + IF(GFF_T .EQ. 'DRA') THEN + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMSIX(IPMIC,'GFF',1) + CALL LCMSIX(IPMIC,'GFF-GEOM',1) + CALL LCMGET(IPMIC,'MIX',MIXG) + CALL LCMSIX(IPMIC,'GFF-GEOM',2) + CALL LCMLEN(IPMIC,'NWT0',ILONG,ITYLCM) + IF (ILONG .NE. NGP*NGFF) THEN + CALL XABORT("@D2PMAC : ERROR IN NUMBER OF GFF IN MCO") + ENDIF + CALL LCMGET(IPMIC,'NWT0',GFFC) +! CALL LCMGET(IPMIC,'VOLUME',VOLG) + CALL LCMGET(IPMIC,'H-FACTOR',KFC) + DO J=1,NPIN + DO I=1,NPIN + DO IG=1,NGP + GFF(I,J,IG)=GFFC(MIXG(I,J),IG)*KFC(MIXG(I,J),IG) + > /FLXHOM(IG)/KAPPA_FI(IG) + ENDDO + ENDDO + ENDDO + + IF(IPRINT>1) THEN + WRITE(6,*) + WRITE(6,*)"GFF :" + DO IG=1,NGP + WRITE(6,*)"Group :",IG + DO J=1,NPIN + WRITE(6,*)GFF(:,J,IG) + ENDDO + ENDDO + ENDIF + CALL LCMPUT(KPTH,'GFF',NPIN*NPIN*NGP,2,GFF) + ENDIF + FLXHOM(:)=FLXHOM(:) * VOLUME + ENDIF + + FLUX(:)=FLXHOM(:) + CALL LCMSIX(KPTH,' ',0) + CALL LCMSIX(IPDAT,' ',0) + + IF(IPRINT>1) THEN + WRITE(6,'(A)',advance="no") "Energy group :" + DO I=1,NGP + WRITE(6,'(5X,I12)',advance="no") I + ENDDO + WRITE(6,*) + WRITE(6,'(A,8(5X,ES12.5E2))') "SIGWOO :",SIGW00 + WRITE(6,'(A,8(5X,ES12.5E2))') "SIGSOO :",SCAT + WRITE(6,'(A,8(5X,ES12.5E2))') "TOTALE :",XSECT + WRITE(6,'(A,8(5X,ES12.5E2))') "DIFF :",DIFF + WRITE(6,'(A,8(5X,ES12.5E2))') "TRANSPORT :",XTR + WRITE(6,'(A,8(5X,ES12.5E2))') "ABSORPTION :",ABSORPTION + WRITE(6,'(A,8(5X,ES12.5E2))') "NU FISSION :",X_NU_FI + WRITE(6,'(A,8(5X,ES12.5E2))') "KAPPA FISSION :",KAPPA_FI + WRITE(6,'(A,8(5X,ES12.5E2))') "SCATTERING g->g' :" + WRITE(6,'(8(5X,ES12.5E2))')SCAT_MAT + ENDIF + END diff --git a/Donjon/src/D2PMCO.f b/Donjon/src/D2PMCO.f new file mode 100644 index 0000000..ed36b3f --- /dev/null +++ b/Donjon/src/D2PMCO.f @@ -0,0 +1,816 @@ +*DECK D2PMCO + SUBROUTINE D2PMCO( IPSAP, IPDAT, STAVEC, CRDINF, NCRD, PKNAM, + > ISOT , MESH, USRPAR, USRVAL, USRSTA,USRVAPK, + > SAP , MIC, EXC, SCAT, ADF, LADD , + > LNEW , LADF, IPRINT, MIXDIR, MIX, LCDF, + > LGFF , CDF, GFF, ADFD, CDFD, LYLD, + > YLD, YLDOPT, LOCYLD, OTHPK, OTHTYP, OTHVAL, + > OTHREA, THCK, HFLX, HCUR ) +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the global stated variable data contained in the SAPHYB object +* +*Author(s): +* J. Taforeau +* +*Parameters: input/output +* IPDAT address of the INFO data block +* IPSAP address of the saphyb object +* NCRD number of control rod composition recovered from D2P input +* user +* MIX index of mixture on which XS are to be extracted (only for +* reflector cases) +* USRSTA state variable names recovered from GLOBAL record in D2P: +* USRVAL number of value for state variables recovered from GLOBAL +* record in D2P: +* IPRINT control the printing on screen +* STAVEC various parameters associated with the IPDAT structure +* CRDINF meaning of control rods in the IPSAP object +* USRVAPK value of state prameter set by the user and recoverd from +* USER ADD option in D2P: +* ADF type of ADF to be selected +* DER partials derivative (T) or row cross section (F) to be stored +* in PMAXS +* USRPAR name of state variables (sapnam) in IPSAP associated to +* DMOD TCOM etc. recovered from PKEY card in D2P: +* MESH type of meshing to be applied for the branching calculation +* PKNAM name of state variable (refnam) recovered from PKEY card in +* D2P: +* ISOT name of isotopes in IPSAP for xenon samarium and spomethium +* SAP flag to indicate that absorption cross section must be +* directly recovered from IPSAP +* MIC flag to indicate that absorption cross section must be +* directly recovered from IPMIC +* EXC flag to indicate that excess cross section is to be extracted +* from absoption xs (only if SAP) +* SCAT flag to indicate that scattering cross section must be +* directly reconstructed from IPSAP +* LADD flag to indicate that new points must be added to the IPSAP +* original meshing +* LNEW flag to indicate that only new points must be used during the +* branching calculation +* LADF Assembly Discontinuity Factors must be recovered +* MIXDIR directory that contains homogeneous mixture information +* MIX Index of mixture that contains homogeneous cross sections +* LCDF Corner Discontinuity Factors must be recovered +* LGFF Group Form Factors must be recovered +* CDF type of CDF to be selected +* GFF type of GFF to be selected +* ADFD name of record for 'DRA' type of ADF +* CDFD name of record for 'DRA' type of CDF +* LYLD Fission Yield must be recovered +* YLD user defined values for fission yields (1:I, 2:XE, 3:PM) +* LOCYLD value for state parameter on which fission yield will be +* calculated +* YLDOPT option for fission yields calculation (DEF, MAN, FIX) +* OTHREA real (or integer) value for OTHER parameter +* LMER ADF are merged in the cross sections +* THCK Thickness of reflector +* HFLX Name of the record for the flux +* HCUR Name of the record for the current +* +*Parameters: +* OTHPK +* OTHTYP +* OTHVAL +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP,IPDAT + INTEGER NCRD,USRSTA,MIX + INTEGER IPRINT + REAL THCK + INTEGER STAVEC(40),CRDINF(20),USRVAL(12),OTHTYP(12) + REAL USRVAPK(12,10),YLD(3),LOCYLD(5),OTHREA(12) + CHARACTER*3 ADF,CDF,GFF,YLDOPT + CHARACTER*8 ADFD(4),CDFD(8),HFLX(2),HCUR(2) + CHARACTER*12 USRPAR(12),OTHVALC + CHARACTER*5 MESH + CHARACTER*12 PKNAM(6),OTHPK(12), OTHVAL(12) + CHARACTER*12 ISOT(8), MIXDIR + LOGICAL SAP, MIC, EXC,SCAT,LADD,LNEW,LADF,LCDF,LGFF,LYLD +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPROOT,IPDIR,IPTH,KPTH,IPMCO,JPMCO + + PARAMETER(NSTATE=40) + INTEGER :: N_XS = 8 + INTEGER :: NTOT = 0 + INTEGER,DIMENSION(6) :: ORDER_VAL = 0 + INTEGER DIMMCO(NSTATE),DIMCAL(NSTATE),DIMGEO(NSTATE) + INTEGER NPAR,NCALS,NSVAR,NOTH + INTEGER NCRD_SAP,NVALTMP(10) + INTEGER RKOTH(STAVEC(20)) + INTEGER :: NOTHTH = 0 + REAL OTHR(20,20) + REAL :: OTHVAR(20) = -1 + INTEGER i, j, k, l , n, UV + REAL FIRST_VAL,LAST_VAL,PITCH + LOGICAL LABS(3) + LOGICAL :: LBARR = .FALSE. + LOGICAL :: LDMOD = .FALSE. + LOGICAL :: LCBOR = .FALSE. + LOGICAL :: LTCOM = .FALSE. + LOGICAL :: LTMOD = .FALSE. + LOGICAL :: LBURN = .FALSE. + LOGICAL :: LOTH(12) =.FALSE. + CHARACTER(LEN=12) PKEY_BARR(6), OTHC(20,20) + CHARACTER(LEN=12) :: OTHVAC(20) = 'NULL ' + CHARACTER*12,DIMENSION(6) :: PKREF + DATA PKREF/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + + INTEGER, ALLOCATABLE, DIMENSION(:) :: NVAL, RANK,RANK_INDEX,PKIDX + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: PKEY,PKEY_TMP + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: PVALDIR + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: PARFMT +! REAL, ALLOCATABLE, DIMENSION(:) :: SV_VAL + REAL, ALLOCATABLE, DIMENSION(:,:) :: VALPAR + + IPROOT=IPSAP + NOTH=STAVEC(20) + LABS(1)=MIC + LABS(2)=SAP + LABS(3)=EXC + + CALL LCMPUT(IPDAT,'BARR_INFO',NCRD,1,CRDINF) + ! RECOVER DIMMCO INFORMATION FROM SAPHYB + DIMMCO(:NSTATE)=0 + CALL LCMSIX(IPSAP,MIXDIR,1) + IPDIR=IPSAP + CALL LCMGET(IPDIR,'STATE-VECTOR',DIMMCO) + NGFF = DIMMCO(14) + IPMCO=LCMGID(IPDIR,'MIXTURES') + JPMCO=LCMGIL(IPMCO,MIX) + IPMCO=LCMGID(JPMCO,'CALCULATIONS') + JPMCO=LCMGIL(IPMCO,1) + CALL LCMGET (JPMCO,'STATE-VECTOR',DIMCAL) + NPAR = DIMMCO(5) + NMIL = DIMMCO(1) + NCALS = DIMMCO(4) + NDEL = DIMCAL(19) + ! RECOVER NPIN FOR GFF + NPIN=1 + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMPUT(IPDAT,'NPAR',1,1,NPAR) + CALL LCMSIX(IPDAT,' ',0) + IF(LGFF) THEN + CALL LCMSIX(JPMCO,'MACROLIB',1) + CALL LCMSIX(JPMCO,'GFF',1) + CALL LCMSIX(JPMCO,'GFF-GEOM',1) + CALL LCMGET(JPMCO,'STATE-VECTOR',DIMGEO) + NXG=DIMGEO(3) + NYG=DIMGEO(4) + IF(NXG.NE. NYG) THEN + WRITE(6,*) "@D2PMAC:", + 1 " NPIN NOT THE SAME X AND Y AXES IN MCO" + CALL XABORT("=> NXG .NE. NYG") + ENDIF + NPIN=NXG + CALL LCMSIX(JPMCO,' ',2) + CALL LCMSIX(JPMCO,' ',2) + CALL LCMSIX(JPMCO,' ',2) + ENDIF + + ! INITIALIZATION OF PARAMETERS + NSVAR = 0 + k = 1 + ! MEMORY ALLOCATION + ALLOCATE (PKEY(NPAR)) + ALLOCATE (NVAL(NPAR)) + ALLOCATE (PKEY_TMP(NPAR)) + ALLOCATE (RANK(NPAR)) + ALLOCATE (RANK_INDEX(NPAR+1)) + ALLOCATE (PARFMT(NPAR)) + + CALL LCMSIX(IPDIR,'GLOBAL',1) + CALL LCMGTC(IPDIR,'PARKEY',12,NPAR,PKEY) + CALL LCMGTC(IPDIR,'PARFMT',8,NPAR,PARFMT) + + CALL LCMGET(IPDIR,'NVALUE',NVAL) + IF(NPAR.GT.10) CALL XABORT('D2PMCO: NVAL OVERFLOW.') + NVALTMP(:NPAR)=NVAL(:NPAR) + + ! LOOP OVER STATE VARIABLES OF SAPHYB + ! CHECK OF EXISTENCE OF STATE PARAMETER + + DO i=1, NPAR + IF ((PKEY(i).NE.'FLUE').AND.(PKEY(i).NE.'TIME')) NTOT=NTOT+1 + IF(PKEY(i)==PKNAM(1)) THEN ! BARR + LBARR=.TRUE. + ELSE IF(PKEY(i)==PKNAM(2)) THEN ! DMOD + LDMOD=.TRUE. + ELSE IF(PKEY(i)==PKNAM(4)) THEN ! TCOM + LTCOM=.TRUE. + ELSE IF(PKEY(i)==PKNAM(5)) THEN ! TMOD + LTMOD=.TRUE. + ELSE IF(PKEY(i)==PKNAM(3)) THEN ! CBOR + LCBOR=.TRUE. + ELSE IF(PKEY(i)==PKNAM(6)) THEN ! BURN + LBURN =.TRUE. + ELSE + DO j=1,NOTH + IF (PKEY(i)==OTHPK(j)) THEN + LOTH(j) = .TRUE. + SELECT CASE (PARFMT(i)) + CASE ('REAL') + IF (OTHTYP(j) .EQ. 2) GO TO 100 + CASE ('STRING') + IF (OTHTYP(j) .EQ. 3) GO TO 100 + CASE ('INTEGER') + IF (OTHTYP(j) .EQ. 1) GO TO 100 + CASE DEFAULT + WRITE(6,*) '@D2PMCO : UNKNOWN TYPE (',PARFMT(i),') FOR', + > ' PKEY (',PKEY(i),').' + CALL XABORT('') + END SELECT + WRITE(6,*) '@D2PMCO : INCONSITENT TYPE FOR', + > ' PKEY (',PKEY(i),'), TYPE (',PARFMT(i),') EXPECTED.' + CALL XABORT ('') + 100 RKOTH(j)=i + EXIT + ENDIF + ENDDO + ENDIF + RANK_INDEX(i)=0 + ENDDO + RANK_INDEX(NPAR+1)=0 + + ! DETERMINE ODER_VAL ARRAY + IF(LBARR) THEN + ORDER_VAL(1)=1 + ELSE + NCRD_SAP=1 + IF(NCRD>1) THEN + WRITE(6,*) "@D2PMCO:", + 1 " CONTROL ROD STATE VARIABLE IS MISSING IN SAPHYB" + CALL XABORT("=> NUMBER OF CTRL ROD VALUE MUST BE SET TO 1") + ELSE IF(CRDINF(1).NE. 1) THEN + WRITE(6,*) "@D2PMCO:", + 1 " CONTROL ROD STATE VARIABLE IS MISSING IN SAPHYB" + CALL XABORT("=> CTRL ROD UNRODDED INDEX MUST BE SET TO 1") + ENDIF + ENDIF + IF(LDMOD) THEN + ORDER_VAL(2)=1 + IF(LBARR) ORDER_VAL(2)=2 + ENDIF + IF(LCBOR) THEN + IF(LDMOD) THEN + ORDER_VAL(3)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(3)=2 + ELSE + ORDER_VAL(3)=1 + ENDIF + ENDIF + IF(LTCOM) THEN + IF(LCBOR) THEN + ORDER_VAL(4)=ORDER_VAL(3)+1 + ELSE IF(LDMOD) THEN + ORDER_VAL(4)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(4)=2 + ELSE + ORDER_VAL(4)=1 + ENDIF + ENDIF + IF(LTMOD) THEN + IF(LTCOM) THEN + ORDER_VAL(5)=ORDER_VAL(4)+1 + ELSE IF(LCBOR) THEN + ORDER_VAL(5)=ORDER_VAL(3)+1 + ELSE IF(LDMOD) THEN + ORDER_VAL(5)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(5)=2 + ELSE + ORDER_VAL(5)=1 + ENDIF + ENDIF + ! STORE THE NAME OF CURENT PKEY IN PKEY_TMP + DO i=1, NPAR + PKEY_TMP(i)=PKEY(i) + ENDDO + + IF(.NOT.LBURN) THEN + WRITE(6,*) + WRITE(6,*)('WARNING: BURN VARIABLE IS MISSING IN MCO') + WRITE(6,*)('=> 0 MWJ/T SINGLE EXPOSURE ASSUMED') + WRITE(6,*) + DEALLOCATE (PKEY,NVAL) + NPAR=NPAR+1 + ALLOCATE (PKEY(NPAR),NVAL(NPAR)) + DO i=1, NPAR-1 + PKEY(i)=PKEY_TMP(i) + NVAL(i)=NVALTMP(i) + ENDDO + PKEY(NPAR)="BURN" + NVAL(NPAR)=1 + DEALLOCATE (PKEY_TMP) + ALLOCATE(PKEY_TMP (NPAR)) + PKEY_TMP=PKEY + ENDIF + IF(LTMOD) THEN + ORDER_VAL(6)=ORDER_VAL(5)+1 + ELSE IF(LTCOM) THEN + ORDER_VAL(6)=ORDER_VAL(4)+1 + ELSE IF(LCBOR) THEN + ORDER_VAL(6)=ORDER_VAL(3)+1 + ELSE IF(LDMOD) THEN + ORDER_VAL(6)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(6)=2 + ELSE + ORDER_VAL(6)=1 + ENDIF + + ALLOCATE (PVALDIR(NPAR)) + ALLOCATE(VALPAR(NPAR,100)) + + OTHR(:,:)=0. + OTHC(:,:)='' + + DO i=1, NPAR + ! NAME OF DIRECTORY IN SAPHYB CONTAINING VALUES OF STATE + ! VARIABLES : PKEY(I) + IF ((PARFMT(i).NE.'STRING')) THEN + IF ((PKEY(i).NE.PKNAM(6))) THEN + + WRITE(PVALDIR(i),'("pval", I8.8)') i + ! STORE VALUES IN VALPAR + CALL LCMGET(IPDIR,PVALDIR(i),VALPAR(i,1:NVAL(i))) + + ELSE IF(LBURN) THEN + + WRITE(PVALDIR(i),'("pval", I8.8)') i + ! STORE VALUES IN VALPAR LBURN + CALL LCMGET(IPDIR,PVALDIR(i),VALPAR(i,1:NVAL(i))) + ELSE + ! STORE VALUES IN VALPAR + VALPAR(i,1:NVAL(i))=0.0 + ENDIF + ENDIF + + DO j=1,NOTH + IF (LOTH(j).EQV. .FALSE.) THEN + WRITE(6,*) '@D2PMCO: UNKNOWN PKEY (',OTHPK(j),') IN MCO' + CALL XABORT ('=> PLEASE CHECK MCO CONTENT') + ELSE IF (PKEY(i).EQ.OTHPK(j)) THEN + WRITE(PVALDIR(i),'("pval", I8.8)') i + IF (OTHTYP(j).EQ.3) THEN + CALL LCMGTC(IPDIR,PVALDIR(i),12,NVAL(i),OTHC(i,1:NVAL(i))) + DO k=1, NVAL(i) + IF (OTHC(i,k).EQ.OTHVAL(j)) THEN + OTHVAC(j)=OTHVAL(j) + EXIT + ENDIF + IF (k.EQ.NVAL(i)) THEN + WRITE (6,*) '@D2PMCO: VALUE (',OTHVAL(j),') FOR PKEY(', + > PKEY(i),') IS OUT OF RANGE' + WRITE (6,*) '=> POSSIBLE VALUES ARE :' + WRITE (6,'(A12,1X)') OTHC(i,1:NVAL(i)) + CALL XABORT ("") + ENDIF + ENDDO + ELSE + CALL LCMGET(IPDIR,PVALDIR(i),OTHR(i,1:NVAL(i))) + DO k=1, NVAL(i) + WRITE(OTHVALC,'(f12.5)')OTHR(i,k) + IF (OTHVALC.EQ.OTHVAL(j)) THEN + OTHVAR(j)=OTHR(i,k) + EXIT + ENDIF + IF (k.EQ.NVAL(i)) THEN + OTHVAR(j)=OTHREA(j) + WRITE (6,*) 'WARNING : VALUE (',OTHVAL(j),') FOR PKEY(', + > PKEY(i),') IS OUT OF RANGE' + WRITE (6,*) '=> POSSIBLE VALUES ARE :' + WRITE (6,'(e12.5,1X)') OTHR(i,1:NVAL(i)) + WRITE (6,*) '=>INTERPOLATION WILL BE NEEDED' + ENDIF + ENDDO + + ENDIF + ENDIF + ENDDO + + + ! CASE OF CONTROL ROD + IF(PKEY(i)==PKNAM(1)) THEN + RANK(i)=ORDER_VAL(1); + RANK_INDEX(ORDER_VAL(1))=i + + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(1)) THEN + WRITE(6,*)('@D2PMCO: IMPOSSIBLE TO ADD A CONTROL ') + CALL XABORT ('ROD VALUE IN THE PMAXS TREE') + ENDIF + ENDDO + ENDIF + ! CASE OF MODERATOR DENSITY + ELSE IF(PKEY(i)==PKNAM(2)) THEN + RANK(i)=ORDER_VAL(2) + RANK_INDEX(ORDER_VAL(2))=i + + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(2)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + NVAL(i)=0 + ENDIF + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF BORON CONCENTRATION + ELSE IF(PKEY(i)==PKNAM(3)) THEN + RANK(i)=ORDER_VAL(3) + RANK_INDEX(ORDER_VAL(3))=i + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(3)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + NVAL(i)=0 + ENDIF + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF FUEL TEMPERATURE + ELSE IF(PKEY(i)==PKNAM(4)) THEN + RANK(i)=ORDER_VAL(4) + RANK_INDEX(ORDER_VAL(4))=i + + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(4)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + NVAL(i)=0 + ENDIF + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF MODERATOR DENSITY + ELSE IF(PKEY(i)==PKNAM(5)) THEN + RANK(i)=ORDER_VAL(5) + RANK_INDEX(ORDER_VAL(5))=i + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(5)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + NVAL(i)=0 + ENDIF + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF BURN UP + ELSE IF(PKEY(i)==PKNAM(6)) THEN + RANK(i)=NPAR + RANK_INDEX(NPAR)=i + STAVEC(4)=NVAL(i) + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(6)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + NVAL(i)=0 + ENDIF + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + STAVEC(4)=NVAL(i) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ELSE + NOTHTH=NPAR-MAXVAL(ORDER_VAL) + IF((PKEY(i)=='FLUE').OR.(PKEY(i)=='TIME')) NOTHTH=NOTHTH-1 + RANK(i) = NPAR+i + RANK_INDEX(NPAR+1)=NPAR+1 + END IF + ENDDO + + ! D2PSOR STATE VARIABLE INPUT TO MATCH GENPMAXS ORDER + CALL D2PSOI(RANK,NPAR) + + ! LOOP OVER STATES VARIABLES IN SAPHYB + DO i=1, NPAR + ! WE KEEP ONLY "REAL" STATES VARIABLE (IE EXEPT FLUE, TIME ETC. + IF(RANK(i)<=NPAR) THEN + ! RESTORE THE NAME OK PKEY AFTER THE CALL TO D2PSOR SUBROUTINE + PKEY(i)=PKEY_TMP(RANK_INDEX(RANK(i))) + NSVAR = NSVAR + 1 + ENDIF + ENDDO + + ! CREATION OF THE SAPHYB_INFO DIRECTORY INTO THE INFO DATA BLOCK + STAVEC(2) = NSVAR ! NVAR + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + ! CREATION OF : INFO/SAPHYB_INFO/STATE_VAR + CALL LCMPUT(IPDAT,'NTOT',1,1,NTOT) + CALL LCMPTC(IPDAT,'NAMDIR',12,MIXDIR) + CALL LCMPTC(IPDAT,'STATE_VAR',12,NSVAR,PKEY) + IF(.NOT.(LBARR)) THEN + PKEY_BARR(1)="BARR " + DO j=1, NSVAR + PKEY_BARR(j+1)=PKEY(j) + ENDDO + ! CREATION OF : INFO/SAPHYB_INFO/STATE_VAR + CALL LCMPTC(IPDAT,'STATE_VAR',12,NSVAR+1,PKEY_BARR) + ! CREATION OF : INFO/SAPHYB_INFO/BARR + CALL LCMPUT(IPDAT,'BARR',1,2,1.0) + STAVEC(2) = NSVAR + 1 ! NVAR +! NSVAR=NSVAR+1 + ENDIF + + ALLOCATE (PKIDX(STAVEC(2))) + PKIDX(:STAVEC(2))=0 + IF (.NOT. LBARR) PKIDX(STAVEC(2))= -1 + DO i=1, NSVAR + DO j=2,6 + IF(PKEY(i)==PKNAM(j)) THEN + PKIDX(i)=j + ENDIF + ENDDO + IF(PKEY(i)==PKNAM(1)) THEN + IF (LBARR) PKIDX(i)=1 + NCRD_SAP=NVAL(RANK_INDEX(RANK(i))) + ! REORGANIZATION OF BARR PARAMETERS TO MATCH GENPMAXS + ! FORMALISM. SPECIAL TREATMENT FOR BARR PARAMETERS TO TAKE + ! INTO ACCOUNT THE MEANING OF BARR VALUES + IF(NCRD.NE.NCRD_SAP) THEN + WRITE(6,*) "@D2PMCO: ERROR IN CONTROL ROD COMPOSITION " + WRITE(6,*) "THE NUMBER OF CONTROL ROD COMPOSITIONS IN ", + 1 "SAP (",NCRD_SAP,") IS DIFFERENT FROM D2P INPUT (",NCRD,")" + WRITE(6,*) "SAP :",VALPAR(RANK_INDEX(RANK(i)),1:NCRD_SAP) + WRITE(6,*) "D2P INPUT :",CRDINF(1:5) + CALL XABORT('D2PMCO: INPUT ERROR') + ENDIF + CALL D2PREO(IPDAT,VALPAR,RANK_INDEX(RANK(i)),NPAR, + 1 NVAL(RANK_INDEX(RANK(i))),IPRINT) + ENDIF + + IF(MESH.EQ.'GLOB') THEN + CALL LCMPUT(IPDAT,PKREF(PKIDX(i)), + 1 NVAL(RANK_INDEX(RANK(i))),2,VALPAR(RANK_INDEX(RANK(i)), + 2 1:NVAL(RANK_INDEX(RANK(i))))) + DO l=1,USRSTA + IF(USRPAR(l)==PKEY(i)) THEN + IF(PKEY(i) =='BARR') THEN + CALL XABORT('@D2PMCO: THE CR STATE CANNOT BE SET BY USER') + ENDIF + IF((USRVAL(l)>1).and.NVAL(RANK_INDEX(RANK(i)))==1) THEN + WRITE(6,*)"@D2PMCO: IMPOSSIBLE TO DEFINE USER MESHING", + 1 " FOR ",PKEY(i) + CALL XABORT ('ONLY ONE VALUE IS CONTAINED IN THE MCO') + ENDIF + + FIRST_VAL=VALPAR(RANK_INDEX(RANK(i)),1) + LAST_VAL=NVAL(RANK_INDEX(RANK(i))) + LAST_VAL=VALPAR(RANK_INDEX(RANK(i)),INT(LAST_VAL)) + NVAL(RANK_INDEX(RANK(i))) = USRVAL(l) + IF(USRVAL(l)>1) THEN + PITCH = (LAST_VAL-FIRST_VAL)/(USRVAL(l)-1) + + DO n=1,USRVAL(l) + VALPAR(RANK_INDEX(RANK(i)),n)=FIRST_VAL+PITCH*(n-1) + ENDDO + ELSE + VALPAR(RANK_INDEX(RANK(i)),1)=(FIRST_VAL+LAST_VAL)/2.0 + ENDIF + + CALL LCMPUT(IPDAT,PKREF(PKIDX(i)),USRVAL(l),2, + 1 VALPAR(RANK_INDEX(RANK(i)),1:USRVAL(l))) + ENDIF + ENDDO + ELSE + ! CREATION OF: INFO/SAPHYB_INFO/SVNAME + + CALL LCMPUT(IPDAT,PKREF(PKIDX(i)), + 1 NVAL(RANK_INDEX(RANK(i))),2,VALPAR(RANK_INDEX(RANK(i)), + 2 1:NVAL(RANK_INDEX(RANK(i)))) ) + ENDIF + ENDDO + + CALL LCMPUT(IPDAT,'PKIDX',STAVEC(2),1,PKIDX) + IF (NOTH>0) THEN + CALL LCMPTC(IPDAT,'OTHPK',12,NOTH,OTHPK) + CALL LCMPUT(IPDAT,'OTHTYP',NOTH,1,OTHTYP) + CALL LCMPTC(IPDAT,'OTHVAC',12,NOTH,OTHVAC) + CALL LCMPUT(IPDAT,'OTHVAR',NOTH,2,OTHVAR) + ENDIF + IF(MESH=='DEF') THEN + STAVEC(5) = 0 + ELSE IF(MESH=='SAP') THEN + STAVEC(5) = 1 + ELSE IF(MESH=='GLOB') THEN + STAVEC(5) = 2 + ELSE IF(MESH=='ADD') THEN + STAVEC(5) = 3 + IF(LNEW) STAVEC(5) = 4 + ENDIF + IF (LADF) THEN + CALL LCMPTC(IPDAT,'ADF_TYPE',3,ADF) + IF (ADF.EQ.'DRA') THEN + CALL LCMPTC(IPDAT,'HADF',8,STAVEC(13),ADFD) + ELSE IF (ADF.EQ.'GEN') THEN + CALL LCMPTC(IPDAT,'HFLX',8,2,HFLX) + CALL LCMPTC(IPDAT,'HCUR',8,2,HCUR) + CALL LCMPUT(IPDAT,'THCK',2,1,THCK) + ENDIF + ENDIF + + IF (LCDF) THEN + CALL LCMPTC(IPDAT,'CDF_TYPE',3,CDF) + CALL LCMPTC(IPDAT,'HCDF',8,STAVEC(15),CDFD) + ENDIF + + IF (LGFF) CALL LCMPTC(IPDAT,'GFF_TYPE',3,GFF) + + IF (LYLD) THEN + CALL LCMPTC(IPDAT,'YLD_OPT',3,YLDOPT) + CALL LCMPUT(IPDAT,'YLD_FIX',3,2,YLD) + CALL LCMPUT(IPDAT,'YLD_LOC',5,2,LOCYLD) + ENDIF + CALL LCMPUT(IPDAT,'LABS', 3,5,LABS) + CALL LCMPUT(IPDAT,'SCAT', 1,5,SCAT) + CALL LCMSIX(IPDAT,'ISOTOPES',1) + CALL LCMPTC(IPDAT,'XE135',12,ISOT(1)) + CALL LCMPTC(IPDAT,'SM149',12,ISOT(2)) + CALL LCMPTC(IPDAT,'I135',12,ISOT(3)) + CALL LCMPTC(IPDAT,'PM149',12,ISOT(4)) + CALL LCMPTC(IPDAT,'PM148',12,ISOT(5)) + CALL LCMPTC(IPDAT,'PM148M',12,ISOT(6)) + CALL LCMPTC(IPDAT,'ND147',12,ISOT(7)) + CALL LCMPTC(IPDAT,'PM147',12,ISOT(8)) + + ! SET THE IPDAT/STAVEC + STAVEC(1) = DIMMCO(2) ! NGROUP + STAVEC(3) = N_XS ! N_XS + STAVEC(6) = NCRD ! NCOMPO + + STAVEC(7) = NDEL ! NDLAY + + STAVEC(16)= NGFF ! GFF(NGFF,NG) + STAVEC(17)= NPIN ! GFFP(NPIN,NPIN,NG) + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMPUT(IPDAT,'STATE-VECTOR',40,1,STAVEC) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMPUT(IPDAT,'MIX',1,1,MIX) + + IPTH=LCMLID(IPDAT,'PKEY_INFO',6) + DO J=1, 6 + KPTH=LCMDIL(IPTH,J) + IF(J==1) THEN + CALL LCMPTC(KPTH,'NAME',12,PKNAM(1)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LBARR) + ELSE IF(J==2)THEN + IF(LDMOD) CALL LCMPTC(KPTH,'NAME',12,PKNAM(2)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LDMOD) + ELSE IF(J==3) THEN + IF(LCBOR) CALL LCMPTC(KPTH,'NAME',12,PKNAM(3)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LCBOR) + ELSE IF(J==4)THEN + IF(LTCOM) CALL LCMPTC(KPTH,'NAME',12,PKNAM(4)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LTCOM) + ELSE IF(J==5)THEN + IF(LTMOD) CALL LCMPTC(KPTH,'NAME',12,PKNAM(5)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LTMOD) + ELSE IF(J==6) THEN + CALL LCMPTC(KPTH,'NAME',12,PKNAM(6)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LBURN) + ENDIF + ENDDO + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'HELIOS_HEAD',1) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMSIX(IPDAT,' ',0) + + ! EDIT THE LISTING FILE + IF(IPRINT > 0) THEN + WRITE(6,*) "******* CONTENT OF MULTICOMPO RECOVERED **********" + WRITE(6,*) " DIRECTORY NAME : ", MIXDIR + WRITE(6,*) " INDEX OF MIXTURE : ", MIX + WRITE(6,*) + WRITE(6,*) "******* CONTENT OF MULTICOMPO RECOVERED **********" + WRITE(6,*) + WRITE(6,*)"NB OF STATE VARIBALE IN MCO :", NPAR + WRITE(6,*)"NB OF STATE VARIABLES RECOGNIZED :", NSVAR + WRITE(6,*)"NAME OF STATE VARIABLES IN MCO :", PKEY_TMP + WRITE(6,*)"RECOGNIZED STATE VARIABLES :",PKEY(1:NSVAR) + IF (NOTH.GE.1) THEN + WRITE(6,*)"OTHER STATE VARIABLES :",OTHPK(1:NOTH) + WRITE(6,*)"OTHER STATE VALUES :",OTHVAL(1:NOTH) + ENDIF + IF(NOTHTH.NE.NOTH) THEN + WRITE(6,*) "=> WARNING: UNRECOGNIZED VARIABLES !" + WRITE(6,*) "==>PLEASE USE THE PKEY CARD OF D2P: MODULE" + CALL XABORT("") + ENDIF + WRITE(6,*) "FLAG FOR STATE VARIABLES : " + WRITE(6,*) " CONTROL ROD : ", LBARR + WRITE(6,*) " MODERATOR DENSITY : ", LDMOD + WRITE(6,*) " BORON CONCENTRATION : ", LCBOR + WRITE(6,*) " FUEL TEMPERATURE : ", LTCOM + WRITE(6,*) " MODERATOR TEMPERATURE : ", LTMOD + WRITE(6,*) " BURNUP : ", LBURN + WRITE(6,*) "ASSEMBLY DISCONTINUITY FACTORS : ", LADF + IF(LADF) THEN + IF(ADF .EQ. 'DRA') WRITE(6,*) "TYPE OF ADF : DRAGON" + IF(ADF .EQ. 'GET') WRITE(6,*) "TYPE OF ADF : GET" + IF(ADF .EQ. 'SEL') WRITE(6,*) "TYPE OF ADF : SELENGUT" + IF(ADF .EQ. 'GEN') WRITE(6,*) "TYPE OF ADF : GENPMAXS" + ENDIF + IF (STAVEC(21).EQ.1) THEN + WRITE(6,*)'WARNING => ADF ARE INTEGRATED IN CROSS SECTIONS' + ENDIF + WRITE(6,*) "CORNER DISCONTINUITY FACTORS : ", LCDF + IF(LCDF) THEN + IF(CDF .EQ. 'DRA') WRITE(6,*) "TYPE OF CDF : DRAGON" + ENDIF + WRITE(6,*) "GROUP FORM FACTORS : ", LGFF + IF(LGFF) THEN + IF(GFF .EQ. 'DRA') WRITE(6,*) "TYPE OF GFF : DRAGON" + ENDIF + WRITE(6,*) "ABSORPTION TYPE : " + WRITE(6,*) " SAP : ", SAP + WRITE(6,*) " MIC : ", MIC + WRITE(6,*) " EXC : ", EXC + + WRITE(6,*) + DO i=1, NSVAR + WRITE(6,*) "NUMBER OF VALUES FOR ",PKEY(i)," PARAMETER :", + 1 NVAL(RANK_INDEX(RANK(i))) + WRITE(6,*) "VALUES FOR ",PKEY(i)," PARAMETER :", + 1 VALPAR(RANK_INDEX(RANK(i)),1:NVAL(RANK_INDEX(RANK(i)))) + WRITE(6,*) + ENDDO + WRITE(6,*) + WRITE(6,*) "NAME OF FISSION PRODUCTS FOR FISSION YIELD :" + WRITE(6,*) "XE135 : ",ISOT(1) + WRITE(6,*) "SM149 : ",ISOT(2) + WRITE(6,*) "I135 : ",ISOT(3) + WRITE(6,*) "PM149 : ",ISOT(4) + WRITE(6,*) "PM148 : ",ISOT(5) + WRITE(6,*) "PM148M : ",ISOT(6) + WRITE(6,*) "ND147 : ",ISOT(7) + WRITE(6,*) "PM147 : ",ISOT(8) + WRITE(6,*) + IF (LYLD) THEN + WRITE(6,*) "OPTION FOR FISSION YIELD RECOVERY: ",YLDOPT + IF (STAVEC(22)>0) THEN + WRITE(6,*)"CORRECTION FOR SAMARIUM PRODUCTION IS APPLIED" + ENDIF + IF (YLDOPT.EQ.'MAN')THEN + WRITE(6,*)"LOCAL CONDITIONS SET BY THE USER :" + DO I=1,5 + IF (LOCYLD(I).NE.-1) THEN + WRITE(6,*) PKNAM(I)," = ",LOCYLD(I) + ENDIF + ENDDO + ENDIF + ENDIF + + WRITE(6,*) + ENDIF + ! free memory + DEALLOCATE (PKEY) + DEALLOCATE (PKIDX) + DEALLOCATE (NVAL) + DEALLOCATE (PVALDIR) + DEALLOCATE (PKEY_TMP) + DEALLOCATE (RANK) + DEALLOCATE (RANK_INDEX) + DEALLOCATE (VALPAR) + DEALLOCATE (PARFMT) + RETURN + END diff --git a/Donjon/src/D2PMIC.f b/Donjon/src/D2PMIC.f new file mode 100644 index 0000000..c1f2a1d --- /dev/null +++ b/Donjon/src/D2PMIC.f @@ -0,0 +1,279 @@ +*DECK D2PMIC + SUBROUTINE D2PMIC( IPDAT, IPMIC , IPRINT, NGP, NBMIX, NBISO, + > NED, NVAR, STAIDX, LXES, LDET, LCOR, + > FLUX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover microscopic cross sections from a microlib object and write +* cross sections for one branch at a fixed burnup point in the INFO +* data block +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* IPMIC address of the microlib object +* NBMIX number of mixturess +* NBISO number of isotopes +* NED number of P0 additional XS +* NGP number of energy groups +* NVAR number of state variables +* STAIDX table of states index order +* +*Parameters: +* IPRINT +* NGP +* LXES +* LDET +* LCOR +* FLUX +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPMIC + INTEGER NBMIX,NBISO,NED,NGP,NVAR + INTEGER STAIDX(NVAR) + REAL FLUX(NGP) + LOGICAL LDET,LXES,LCOR +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPTH,KPTH,JPMIC + INTEGER :: iXE = 0 + INTEGER :: iSM = 0 + INTEGER :: IMR = 0 + INTEGER :: iDT = 0 + INTEGER ,DIMENSION(5) :: iCHAIN = 0 + INTEGER :: DEB = -999 + REAL XEND,SMND,MRND + REAL XSECT(NGP),XENG(NGP),SMNG(NGP),SCAT(NGP),DET(NGP) + REAL NFTOT(NGP),N2N(NGP) + REAL :: NUM = 0. + REAL :: DENO = 0. + REAL DEN(NBISO) + REAL NGXS(5,NGP),RPHI,YLDPM + CHARACTER(LEN=12) HUSE(NBISO),ISOTNAME(NBISO) + CHARACTER*8 XSNAM(12) + ! RECOVER ONLY EIGHT FIRST CHARACTER OF ISOTOPES + CHARACTER(LEN=8) ISOTOPES(2),HDET,SMCHAIN(5) + + CALL LCMSIX (IPDAT,' ',0) + CALL LCMSIX (IPDAT,'SAPHYB_INFO',1) + CALL LCMSIX (IPDAT,'ISOTOPES',1) + CALL LCMGTC (IPDAT,'XE135',12,ISOTOPES(1)) + CALL LCMGTC (IPDAT,'SM149',12,ISOTOPES(2)) + CALL LCMGTC (IPDAT,'PM148',12,SMCHAIN(1)) + CALL LCMGTC (IPDAT,'PM148M',12,SMCHAIN(2)) + CALL LCMGTC (IPDAT,'PM149',12,SMCHAIN(3)) + CALL LCMGTC (IPDAT,'PM147',12,SMCHAIN(4)) + CALL LCMGTC (IPDAT,'ND147',12,SMCHAIN(5)) + IF (LDET) CALL LCMGTC (IPDAT,'DET',12,HDET) + + IF(NBMIX.NE.1) THEN + CALL XABORT('@D2P: MORE THAN ONE MIXTRURE IN SAPHYB') + ENDIF + IF(NED.GT.12) THEN + CALL XABORT('@D2P: MORE THAN 12 ADDITIONAL ISOTOPES') + ENDIF + + CALL LCMSIX(IPMIC,' ',0) + CALL LCMGET(IPMIC,'ISOTOPESDENS',DEN) + CALL LCMGTC(IPMIC,'ISOTOPESUSED',12,NBISO,HUSE) + CALL LCMGTC(IPMIC,'ISOTOPERNAME',12,NBISO,ISOTNAME) + CALL LCMGTC(IPMIC,'ADDXSNAME-P0',8,NED,XSNAM) + + DO I=1,NBISO + IF(INDEX(HUSE(I),ISOTOPES(1))>0) iXE=I + IF(INDEX(HUSE(I),ISOTOPES(2))>0) iSM=I + IF(INDEX(HUSE(I),'*MAC*RES')>0) iMR=I + IF (INDEX(HUSE(I),SMCHAIN(1))>0) iCHAIN(1)=I + IF (INDEX(HUSE(I),SMCHAIN(2))>0) iCHAIN(2)=I + IF (INDEX(HUSE(I),SMCHAIN(3))>0) iCHAIN(3)=I + IF (INDEX(HUSE(I),SMCHAIN(4))>0) iCHAIN(4)=I + IF (INDEX(HUSE(I),SMCHAIN(5))>0) iCHAIN(5)=I + IF (LDET) THEN + IF(INDEX(HUSE(I),HDET)>0) iDT=I + ENDIF + ENDDO + + IF (LXES) THEN + ! CHECK THE EXISTENCE OF XE AND SM ISOTOPES + + IF(iXE==0) THEN + CALL XABORT('@D2PMIC: XE MUST BE A PARTICULARIZED ISOTOPE') + ELSE IF(iSM==0) THEN + CALL XABORT('@D2PMIC: SM MUST BE A PARTICULARIZED ISOTOPE') + ENDIF + XEND=DEN(iXE) + SMND=DEN(iSM) + MRND=DEN(iMR) + CALL LCMSIX(IPMIC,' ',0) + ! PROCESS MICROSCOPIC TOTAL XS INFORMATION FOR XE + JPMIC=LCMGID(IPMIC,'ISOTOPESLIST') + IPMIC=LCMGIL(JPMIC,iXE) + + CALL LCMLEN(IPMIC,'NTOT0',ILONG,ITYLCM) + + IF(ILONG.NE.NGP) THEN + CALL XABORT('@D2PMIC: INCONSISTENT NUMBERS OF ENERGY GROUP') + ENDIF + ! CALCULATION OF MICROSCOPIC ABSORPTION CROSS SECTIONS OF XE + CALL LCMGET(IPMIC,'NTOT0',XSECT) + CALL LCMGET(IPMIC,'SIGS00',SCAT) + DO I=1, NGP + XENG(I)=(XSECT(I)-SCAT(I)) + IF (XENG(I)<0) THEN + XENG(I)= 0. + WRITE(6,*) '@D2PMIC: WARNING : XE NEGATIVE CROSS SECTION', + > '=> ZERO CROSS SECTION ASSUMED' + ENDIF + ENDDO + + ! PROCESS MICROSCOPIC TOTAL XS INFORMATION FOR SM + CALL LCMSIX(IPMIC,' ',0) + JPMIC=LCMGID(IPMIC,'ISOTOPESLIST') + IPMIC=LCMGIL(JPMIC,iSM) + CALL LCMLEN(IPMIC,'NTOT0',ILONG,ITYLCM) + IF(ILONG.NE.NGP) THEN + CALL XABORT('@D2PMIC: MORE THAN ONE MIXTRURE IN SAPHYB') + ENDIF + XSECT(:NGP)=0.0 + SCAT(:NGP)=0.0 + + ! CALCULATION OF MICROSCOPIC ABSORPTION CROSS SECTIONS OF SM + CALL LCMGET(IPMIC,'NTOT0',XSECT) + CALL LCMGET(IPMIC,'SIGS00',SCAT) + DO I=1, NGP + SMNG(I)=(XSECT(I)-SCAT(I)) + IF (SMNG(I)<0) THEN + SMNG(I)= 0. + WRITE(6,*) '@D2PMIC: WARNING : SM NEGATIVE CROSS SECTION', + > '=> ZERO CROSS SECTION ASSUMED' + ENDIF + ENDDO + ENDIF + + IF (LCOR.OR.LXES) THEN + ! RECOVER FISSION CROSS SECTION OF MACROSCOPIC RESIDUAL + CALL LCMSIX(IPMIC,' ',0) + JPMIC=LCMGID(IPMIC,'ISOTOPESLIST') + IPMIC=LCMGIL(JPMIC,iMR) + CALL LCMLEN(IPMIC,'NFTOT',ILONG,ITYLCM) + CALL LCMGET(IPMIC,'N2N',N2N) + IF(ILONG.NE.NGP) THEN + CALL XABORT('@D2PMIC: MORE THAN ONE MIXTRURE IN SAPHYB') + ENDIF + + NFTOT(:NGP)=0 + CALL LCMGET(IPMIC,'NFTOT',NFTOT) + + NFTOT(:)=NFTOT(:)*MRND + CALL LCMSIX(IPMIC,' ',0) + ENDIF + + IF (LCOR) THEN + RPHI=FLUX(1)/FLUX(2) + DO I=1,4 + JPMIC=LCMGID(IPMIC,'ISOTOPESLIST') + IPMIC=LCMGIL(JPMIC,iCHAIN(I)) + CALL LCMGET(IPMIC,'NG',NGXS(I,:)) + CALL LCMSIX(IPMIC,' ',0) + ENDDO + NUM=0. + DO I=1,2 + NUM=NUM+DEN(iCHAIN(I))*(NGXS(I,1)*RPHI+NGXS(I,2)) + ENDDO + DENO=NFTOT(1)*RPHI+NFTOT(2) + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGET(IPDAT,'FLAG',DEB) + CALL LCMSIX(IPDAT,' ',0) + IPTH=LCMGID(IPDAT,'TH_DATA') + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + CALL LCMGET(KPTH,'YLDPm',YLDPM) + DENO=DENO*YLDPM + YLDPM=YLDPM*(1+(NUM/DENO)) + IF (DEB.EQ.-999) THEN + CALL XABORT ("@D2PMIC : PROBLEM IN YIELD CORRECTION") + ELSE IF (DEB<0) THEN + CALL LCMPUT(KPTH,'YLDPm',1,2,YLDPM) + ENDIF + + ENDIF + + + IF (LDET) THEN + IF(iDT==0) THEN + WRITE(6,*) '@D2PMIC: UNKNOWN ISOTOPE (',HDET,') FOR DETECTOR', + > ' CROSS SECTIONS' + CALL XABORT ('=> PLEASE USE THE DET CARD IN D2P:') + ENDIF + CALL LCMSIX(IPMIC,' ',0) + + JPMIC=LCMGID(IPMIC,'ISOTOPESLIST') + IPMIC=LCMGIL(JPMIC,iDT) + CALL LCMLEN(IPMIC,'NFTOT',ILONG,ITYLCM) + PRINT*,'ICI' + IF(ILONG.NE.NGP) THEN + CALL XABORT('@D2PMIC: INCONSISTENT NUMBERS OF ENERGY GROUP') + ENDIF + ! CALCULATION OF MICROSCOPIC ABSORPTION CROSS SECTIONS OF XE + CALL LCMGET(IPMIC,'NFTOT',DET) + CALL LCMSIX(IPMIC,' ',0) + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IPTH=LCMGID(IPDAT,'CROSS_SECT') + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + + + CALL LCMSIX(KPTH,'MACROLIB_XS',1) + IF (LXES) CALL LCMPUT(KPTH,'SFI',NGP,2,NFTOT) + CALL LCMSIX(KPTH,' ',2) + CALL LCMSIX(KPTH,'MICROLIB_XS',1) + IF (LXES) THEN + CALL LCMPUT(KPTH,'XENG',NGP,2,XENG) + CALL LCMPUT(KPTH,'SMNG',NGP,2,SMNG) + CALL LCMPUT(KPTH,'XEND',1,2,XEND) + CALL LCMPUT(KPTH,'SMND',1,2,SMND) + ENDIF + IF (LDET) CALL LCMPUT(KPTH,'DET',NGP,2,DET) + CALL LCMSIX(KPTH,' ',0) + + + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "**************************************************" + WRITE(6,*) "* SUMMARY *" + WRITE(6,*) "**************************************************" + WRITE(6,*) + WRITE(6,*) "**** MICROSCOPIC cross sections ****" + IF (LDET) THEN + WRITE(6,*) "DETECTOR :",DET + ENDIF + IF (LXES) THEN + WRITE(6,*) "XENON ABSORPTION :",XENG + WRITE(6,*) "SAMARIUM ABSORPTION :",SMNG + WRITE(6,*) "XENON NUMBER DENSITY :",XEND + WRITE(6,*) "SAMARIUM NUMBER DENSITY :",SMND + WRITE(6,*) + WRITE(6,*) "**** MACROSCOPIC cross sections(1:NGP) ****" + WRITE(6,*) "FISSION :",NFTOT + WRITE(6,*) "MAC*RES* NUMBER DENSITY :",MRND + ENDIF + + IF (LCOR) THEN + WRITE(6,*) "PM149 FISSION YIELD CORRECTED:",YLDPM + ENDIF + ENDIF + END diff --git a/Donjon/src/D2PMUL.f b/Donjon/src/D2PMUL.f new file mode 100644 index 0000000..25ffd02 --- /dev/null +++ b/Donjon/src/D2PMUL.f @@ -0,0 +1,161 @@ +*DECK D2PMUL + SUBROUTINE D2PMUL( IPMUL, IPDAT, STAVEC, MIX, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the global stated variable data contained in the Multicompo +* object (for reflector cross sections) +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of the INFO data block +* IPMUL address of the MULTICOMPO object +* STAVEC various parameters associated with the IPDAT structure +* MIX index of mixture on which XS are to be extracted (only for +* reflector cases) +* IPRINT control the printing on screen +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMUL, IPDAT + INTEGER IPRINT + INTEGER MIX ! MIX = 1 (RADIAL); MIX = 2 (LOW) ; MIX = 3 (TOP) + INTEGER STAVEC(40) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPROOT,IPTH,KPTH + PARAMETER(NSTATE=40) + ! DEFAULT CR DC PC TF + INTEGER :: NPAR = 5 + ! NUMBER OF CROSS SECTIONS TO BE RECOVERED + INTEGER :: N_XS = 8 + ! NUMBER OF CB VALUES CONTAINED IN MULTICOMPO + INTEGER CB_NB + ! NUMBER OF VALUES FOR EACH DEFAULT STATES VARIABLES + INTEGER NVAL(5) + ! VALUES FOR EACH DEFAULT STATES VARIABLES + REAL VALPAR(5,100) + ! NAME OF PKEY + CHARACTER (len=4) PKEY(5) + ! NAME OF PKEY FOR BORON CONCENTRATION (MUST BE C-BORE) + CHARACTER(LEN=6) CB_name + ! VALUES FOR BORON CONCENTRATION + REAL, ALLOCATABLE, DIMENSION(:) :: VAL_CB + + STAVEC(1)=2 + STAVEC(2)=NPAR + STAVEC(3)=N_XS + STAVEC(4)=1 + STAVEC(5)=2 + STAVEC(6)=1 + STAVEC(7)=0 + + IPROOT=IPMUL + ! MOVING AND RECOVER INFORMATION FROM MULTICOMPO + CALL LCMSIX(IPMUL,'default',1) + CALL LCMSIX(IPMUL,'GLOBAL',1) + CALL LCMGTC(IPMUL,'PARKEY',6,CB_name) + ! CHECK IF PKEY FOR BORON CONCENTRATION IS C-BORE + IF(CB_name.NE.'C-BORE') THEN + CALL XABORT('@D2PMUL: ONLY C-BORE PKEY EXPECTED') + ENDIF + ! RECOVER BORON CONCENTRATION VALUES + CALL LCMLEN(IPMUL,'pval00000001',CB_NB,ITYLCM) + ALLOCATE (VAL_CB(CB_NB)) + CALL LCMGET(IPMUL,'pval00000001',VAL_CB) + + ! CREATION OF INFO/SAPHYB_INFO/ CONTENT + CALL LCMPUT(IPDAT,'BARR_INFO',1,1,1) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMPUT(IPDAT,'MIX',1,1,MIX) + + ! ATTRIBUTION OF DEFAULT VALUES FOR OTHER STATE VARIABLES THAN + ! C_BORE + PKEY(1)='BARR' ! CONTROL ROD + PKEY(2)='DMOD' ! MODERATOR DENSITY + PKEY(3)='CBOR' ! BORON CONCENTRATION + PKEY(4)='TCOM' ! FUEL TEMPERATURE + PKEY(5)='BURN' ! BURN UP + CALL LCMPTC(IPDAT,'STATE_VAR',4,5,PKEY) + ! ALL STATE VARIABLE (EXCEPT CBOR) ARE FIXED + NVAL(1)=1 + NVAL(2)=1 + NVAL(3)= CB_NB + NVAL(4)=1 + NVAL(5)=1 + VALPAR(1,1) = 1 ! NO CONTROL ROD IS INSERTED + VALPAR(3,1:CB_NB) = VAL_CB + VALPAR(2,1) = 0.75206 ! DEFAULT MODERATOR DENSITY= 0.75206 G/CM3 + VALPAR(4,1) = 560 ! FUEL TEMPERATURE= 560 Celsius + VALPAR(5,1) = 0 ! BURN-UP= 0 MWJ/T + + ! CREATION OF INFO/SAPHYB_INFO/SVNAME + ! LOOP OVER STATE VARIABLE + DO i=1, NPAR + CALL LCMPUT(IPDAT,PKEY(i),NVAL(i),2,VALPAR(i,1:NVAL(i))) + ENDDO + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + IPTH=LCMLID(IPDAT,'PKEY_INFO',6) + DO J=1, 6 + KPTH=LCMDIL(IPTH,J) + IF(J==1) THEN + CALL LCMPTC(KPTH,"NAME",8,"BARR ") + CALL LCMPUT(KPTH,"LFLAG",1,5,.TRUE.) + ELSE IF(J==2)THEN + CALL LCMPTC(KPTH,"NAME",8,"DMOD ") + CALL LCMPUT(KPTH,"LFLAG",1,5,.TRUE.) + ELSE IF(J==3) THEN + CALL LCMPTC(KPTH,"NAME",8,"CBOR ") + CALL LCMPUT(KPTH,"LFLAG",1,5,.TRUE.) + ELSE IF(J==4)THEN + CALL LCMPTC(KPTH,"NAME",8,"TCOM ") + CALL LCMPUT(KPTH,"LFLAG",1,5,.TRUE.) + ELSE IF(J==5)THEN + CALL LCMPTC(KPTH,"NAME",8,"TMOD ") + CALL LCMPUT(KPTH,"LFLAG",1,5,.FALSE.) + ELSE IF(J==6) THEN + CALL LCMPTC(KPTH,"NAME",8,"BURN ") + CALL LCMPUT(KPTH,"LFLAG",1,5,.TRUE.) + ENDIF + ENDDO + ! CREATION OF : + ! INFO/HELIOS_HEAD/ DIRECTORY + ! INFO/GENPMAXS_INP/ DIRECTORY + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'HELIOS_HEAD',1) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMSIX(IPDAT,' ',0) + + ! EDIT THE LISTING FILE + IF(IPRINT > 0) THEN + !"**************************************************" + WRITE(6,*) "******** CONTENT OF MULTICOMPO RECOVERED *********" + WRITE(6,*) + WRITE(6,*) "NUMBER OF STATE VARIABLES :", NPAR + WRITE(6,*) "NAME OF STATE VARIABLES :", PKEY + WRITE(6,*) + DO i=1, NPAR + WRITE(6,*) "NUMBER OF VALUES FOR ",PKEY(i)," PARAMETERS :", + 1 NVAL(i) + WRITE(6,*) "VALUES FOR ",PKEY(i)," PARAMETERS :", + 1 VALPAR(i,1:NVAL(i)) + WRITE(6,*) + ENDDO + WRITE(6,*) + ENDIF + + ! FREE MEMORY + DEALLOCATE (VAL_CB) + END diff --git a/Donjon/src/D2PPRC.f b/Donjon/src/D2PPRC.f new file mode 100644 index 0000000..1e989bb --- /dev/null +++ b/Donjon/src/D2PPRC.f @@ -0,0 +1,290 @@ + SUBROUTINE D2PPRC ( IPDAT,IPPRC, HEQUI, HMASL, ISOTVAL, ISOTOPT, + > LMEM,IPRINT,MIXDIR,JOBOPT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build a procedure file for the interpolation of cross sections +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT adress of info data block +* HEQUI name of the equivalence record in the saphyb|MCO object +* HMASL name of heavy metal density record in the saphyb|MCO object +* ISOTVAL concentration of particularized isotopes +* ISOTOPT otpion for paticularised isotopes +* +*Parameters: +* IPPRC +* LMEM +* IPRINT +* MIXDIR +* JOBOPT +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPTH,KPTH + INTEGER IPPRC,PK,IPRINT + CHARACTER*4 HEQUI,HMASL + CHARACTER*1 ISOTOPT,JOBOPT(14) + CHARACTER*12,ISOTOPES(8) + REAL ISOTVAL + LOGICAL LMEM,LFLAG(6) +*---- +* LOCAL VARIABLES +*---- + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: PKEY + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: OTHPK + INTEGER, ALLOCATABLE, DIMENSION(:) :: OTHTYP + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: OTHVAC + REAL, ALLOCATABLE, DIMENSION(:) :: OTHVAR + CHARACTER*12 PKNAM(6),MIXDIR + INTEGER STAVEC(40),NVAR,ITYP,NOTH + INTEGER :: NTOT = 0 + INTEGER :: NPKEY = 0 + INTEGER :: ORDER(6) = -1 + CHARACTER*6 :: NAMSAP='XSLIB' + CHARACTER*4,DIMENSION(6) :: REFNAM + DATA REFNAM/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*)'! Auto Generation of input file for D2P *' + WRITE(IPPRC,*)'! - Recovering of information from D2P PHASE 1 *' + WRITE(IPPRC,*)'! - call to the interpolation module(SCR|NCR) *' + WRITE(IPPRC,*)'! - call of D2P for PHASE 2 and 3 *' + WRITE(IPPRC,*)'! Author(s) : J. TAFOREAU (2016) *' + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*) + + WRITE(IPPRC,*)" SEQ_ASCII GENPMAXS :: FILE 'GENPMAXS.inp' ; " + WRITE(IPPRC,*)" SEQ_ASCII HELIOS :: FILE 'HELIOS.dra' ; " + WRITE(IPPRC,*)" XSM_FILE XSLIB :: FILE 'XSLIB' ; " + WRITE(IPPRC,*)" XSM_FILE D2PINFO :: FILE 'Info.xsm' ; " + WRITE(IPPRC,*)" LINKED_LIST INFO ; " + IF (LMEM) THEN + WRITE(IPPRC,*)'LINKED_LIST XSL ; ' + NAMSAP='XSL' + ENDIF + + WRITE(IPPRC,*)'LINKED_LIST Micro ; ' + WRITE(IPPRC,*)'MODULE END: D2P: SCR: NCR: GREP: DELETE: UTL: ;' + WRITE(IPPRC,*) + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*)'! STEP 0 : Initializing state parameters *' + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*) + + CALL LCMGET(IPDAT,'STATE-VECTOR',STAVEC) + NVAR=STAVEC(2) + ITYP=STAVEC(18) + NOTH=STAVEC(20) + ALLOCATE(PKEY(NVAR)) + ALLOCATE(OTHPK(NOTH),OTHTYP(NOTH),OTHVAC(NOTH),OTHVAR(NOTH)) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGTC(IPDAT,'ISOTOPES',12,4,ISOTOPES) + CALL LCMGTC(IPDAT,'STATE_VAR',12,NVAR,PKEY) + CALL LCMGET(IPDAT,'NTOT',NTOT) + IF (NOTH>0) THEN + CALL LCMGTC(IPDAT,'OTHPK',12,NOTH,OTHPK) + CALL LCMGET(IPDAT,'OTHTYP',OTHTYP) + CALL LCMGTC(IPDAT,'OTHVAC',12,NOTH,OTHVAC) + CALL LCMGET(IPDAT,'OTHVAR',OTHVAR) + ENDIF + + DO PK=1, 6 + IPTH=LCMGID(IPDAT,'PKEY_INFO') + KPTH=LCMDIL(IPTH,PK) + CALL LCMGET(KPTH,'LFLAG',LFLAG(PK)) + IF(LFLAG(PK)) THEN + NPKEY=NPKEY+1 + CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + WRITE(IPPRC,*) 'STRING ', + > REFNAM(PK),' := "',TRIM(PKNAM(PK)),'" ; ' + WRITE(IPPRC,*) 'REAL ',REFNAM(PK),'_VAL ; ' + DO I=1,NVAR + IF (PKNAM(PK).EQ.PKEY(I)) THEN + ORDER(PK)=I + ENDIF + ENDDO + ENDIF + ENDDO + + IF (NTOT.NE.(NOTH+NPKEY)) THEN + WRITE(6,*) "@D2PPROC: INCONSISTENT D2P INPUT DATA WITH", + > "XS LIBRARY" + WRITE(6,*) "D2P INPUT DATA : " + WRITE(6,*) " STATE VARIABLE : ", NPKEY + WRITE(6,*) " OTHER VARIABLE : ", NOTH + WRITE(6,*) "D2P TOTAL = ", NPKEY+NOTH + WRITE(6,*) "XS LIBRARY CONTENT = ", NTOT + CALL XABORT ("=>PLEASE USE THE D2P CARD 'PKEY'AND/OR 'OTHER'") + ENDIF + + IF (NPKEY .EQ. 0) THEN + WRITE(6,*) "@D2PPROC : NUMBER OF STATE VARIABLES IS ZERO" + CALL XABORT ("=> PLEASE CHECK THE D2P DATA INPUT ") + ENDIF + WRITE(IPPRC,*)'INFO := D2PINFO ; ' + IF (LMEM) WRITE(IPPRC,*)'XSL := XSLIB ;' + WRITE(IPPRC,*)'INTEGER NVAR := ',NPKEY,' ; ' + WRITE(IPPRC,*)'INTEGER STOP REWIND ITER := 0 0 0 ; ' + + WRITE(IPPRC,*) + WRITE(IPPRC,*)'WHILE STOP 1 <> DO' + + WRITE(IPPRC,*) + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*)'! STEP 1 : recovering state parameters *' + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*) + + DO PK=1, 6 + IF (LFLAG(PK)) THEN + WRITE(IPPRC,*) "GREP: INFO :: STEP UP 'BRANCH_INFO'" + WRITE(IPPRC,*) "GETVAL STATE ",ORDER(PK)," NVAL 1 >>", + > REFNAM(PK),"_VAL<< ;" + ENDIF + ENDDO + + WRITE(IPPRC,*) + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*)'! STEP 2 : interpolation of cross sections *' + WRITE(IPPRC,*)'! warning => check the isotopes names *' + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*) + + WRITE(IPPRC,*)'EVALUATE ITER := ITER 1 + ;' + IF (ITYP.EQ.0) WRITE(IPPRC,*)' Micro := SCR: ',NAMSAP,' ::' + IF (ITYP.EQ.1) WRITE(IPPRC,*)' Micro := NCR: ',NAMSAP,' ::' + WRITE(IPPRC,*)' EDIT ',IPRINT + IF (ITYP.EQ.0) THEN + IF (HEQUI.NE.'NONE') WRITE(IPPRC,*)' EQUI ',HEQUI + IF (HMASL.NE.'NONE') WRITE(IPPRC,*)' MASL ',HMASL + ENDIF + + WRITE(IPPRC,*)' MICRO LINEAR NMIX 1' + IF (ITYP.EQ.0)WRITE(IPPRC,*)' SAPHYB ',NAMSAP + IF (ITYP.EQ.1)WRITE(IPPRC,*)' COMPO ',NAMSAP,' ', + > TRIM(MIXDIR) + + WRITE(IPPRC,*)' MIX 1' + DO IOTH=1,NOTH + WRITE(IPPRC,'(A,A)',advance='no')' SET LINEAR ', + > TRIM(OTHPK(IOTH)) + SELECT CASE (OTHTYP(IOTH)) + CASE (1) + WRITE(IPPRC,*) ' ',INT(OTHVAR(IOTH)) + CASE (2) + WRITE(IPPRC,*) ' ',OTHVAR(IOTH) + CASE (3) + WRITE(IPPRC,*) " '", TRIM(OTHVAC(IOTH)),"'" + END SELECT + ENDDO + DO PK=1,6 + IF (LFLAG(PK)) THEN + WRITE(IPPRC,*)' SET LINEAR <<',REFNAM(PK),'>> <<', + > REFNAM(PK),'_VAL>>' + ENDIF + ENDDO + + IF (JOBOPT(2).EQ.'T') THEN + CALL LCMSIX(IPDAT,'',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMSIX(IPDAT,'ISOTOPES',1) + CALL LCMGTC(IPDAT,'XE135',12,ISOTOPES(1)) + CALL LCMGTC(IPDAT,'I135',12,ISOTOPES(2)) + CALL LCMGTC(IPDAT,'SM149',12,ISOTOPES(3)) + CALL LCMGTC(IPDAT,'PM149',12,ISOTOPES(4)) + CALL LCMGTC(IPDAT,'PM148',12,ISOTOPES(5)) + CALL LCMGTC(IPDAT,'PM148M',12,ISOTOPES(6)) + CALL LCMGTC(IPDAT,'ND147',12,ISOTOPES(7)) + CALL LCMGTC(IPDAT,'PM147',12,ISOTOPES(8)) + WRITE(IPPRC,*)' MICRO ALL' + + DO I=1,8 + SELECT CASE (ISOTOPT) + CASE ('*') + WRITE(IPPRC,*)" '",TRIM(ISOTOPES(I)),"' *" + CASE DEFAULT + IF ((I.EQ.1).OR.(I.EQ.3).OR.(I.EQ.8)) THEN + WRITE(IPPRC,*)" '",TRIM(ISOTOPES(I)),"' *" + ELSE + WRITE(IPPRC,*)" '",TRIM(ISOTOPES(I)),"'",ISOTVAL + ENDIF + END SELECT + ENDDO + ENDIF + WRITE(IPPRC,*)' ENDMIX' + + IF ((JOBOPT(9).EQ.'T').AND.(ITYP.EQ.0) ) THEN + WRITE(IPPRC,*)" CHAIN" + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(2))," NG 0.0" + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(7))," NG 0.0" + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(1)), + > " NG 0.0 FROM DECAY 1.0E+00 ",TRIM(ISOTOPES(2)) + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(8)), + > " NG 0.0 FROM DECAY 1.0E+00 ",TRIM(ISOTOPES(7)) + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(5)), + > " NG 0.0 FROM NG 5.3E-01 ",TRIM(ISOTOPES(8)) + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(6)), + > " NG 0.0 FROM NG 4.7E-01 ",TRIM(ISOTOPES(8)) + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(4)), + > " NG 0.0 FROM NG 1.0E+00 ",TRIM(ISOTOPES(5)), + > " NG 1.0E+00 ",TRIM(ISOTOPES(6)) + WRITE(IPPRC,*)" ",TRIM(ISOTOPES(3)), + > " NG 0.0 FROM DECAY 1.0E+00 ",TRIM(ISOTOPES(4)) + WRITE(IPPRC,*)" MACR NFTOT 0.0" + WRITE(IPPRC,*)" ENDCHAIN" + ENDIF + WRITE(IPPRC,*)' ;' + WRITE(IPPRC,*) + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*)'! STEP 3 : branching calculation *' + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*) + WRITE(IPPRC,*)"IF ITER 1 = THEN " + WRITE(IPPRC,*)"HELIOS GENPMAXS INFO Micro := D2P: " + WRITE(IPPRC,*)"Micro INFO ", + > NAMSAP," ::" + WRITE(IPPRC,*)"PHASE 2 EDIT",IPRINT,";" + WRITE(IPPRC,*)"ELSE" + WRITE(IPPRC,*)"HELIOS GENPMAXS INFO Micro := D2P: " + WRITE(IPPRC,*)"Micro INFO GENPMAXS ", + > NAMSAP," HELIOS ::" + WRITE(IPPRC,*)"PHASE 2 EDIT",IPRINT,";" + WRITE(IPPRC,*) + WRITE(IPPRC,*)"ENDIF ;" + WRITE(IPPRC,*)"Micro := DELETE: Micro ;" + WRITE(IPPRC,*) + WRITE(IPPRC,*)"GREP: INFO :: STEP UP 'BRANCH_INFO'" + WRITE(IPPRC,*)"GETVAL REWIND 1 NVAL 1 >>REWIND<< ;" + + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*)'! STEP 4 : storing the current branch *' + WRITE(IPPRC,*)'!************************************************' + WRITE(IPPRC,*) + WRITE(IPPRC,*)"IF REWIND 1 = THEN" + WRITE(IPPRC,*) + WRITE(IPPRC,*)" HELIOS GENPMAXS INFO := D2P: INFO " + WRITE(IPPRC,*)" GENPMAXS HELIOS ::" + WRITE(IPPRC,*)" PHASE 3 EDIT",IPRINT," ;" + + WRITE(IPPRC,*)" GREP: INFO :: STEP UP 'BRANCH_INFO'" + WRITE(IPPRC,*)" GETVAL STOP 1 NVAL 1 >>STOP<< ;" + + WRITE(IPPRC,*)"ENDIF ;" + WRITE(IPPRC,*) + WRITE(IPPRC,*)"ENDWHILE ;" + WRITE(IPPRC,*) + WRITE(IPPRC,*)"END: ;" + WRITE(IPPRC,*)"QUIT ." + DEALLOCATE(PKEY) + DEALLOCATE(OTHPK,OTHTYP,OTHVAC,OTHVAR) + END diff --git a/Donjon/src/D2PREF.f b/Donjon/src/D2PREF.f new file mode 100644 index 0000000..0ea9a2b --- /dev/null +++ b/Donjon/src/D2PREF.f @@ -0,0 +1,145 @@ +*DECK D2PREF + SUBROUTINE D2PREF( IPDAT, NVAR, CRDINF, NCRD, GRID, PKIDX, + > PKNAM, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Select the reference state. This routine determine the reference state +* for all cases of meshing +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* NVAR number of state variables +* CRDINF control rod compostition array +* NCRD number of crontrol rod comosition +* GRID type of griddind for branching calculation +* +*Parameters: +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + INTEGER NVAR,NBR,NCRD,GRID + INTEGER CRDINF(NCRD) + INTEGER PKIDX(NVAR) + CHARACTER*12 PKNAM(6) +*---- +* LOCAL VARIABLES +*---- + INTEGER ITYLCM,i,IDX + INTEGER :: IP = 2 + INTEGER STAIDX(NVAR),REFIDX(NVAR) + INTEGER NVALPA(NVAR) + REAL STATE(NVAR) ,REFSTA(NVAR-1),HSTSTA(NVAR-1) + REAL VALPAR(NVAR,100) + CHARACTER(LEN=12) PKEY(NVAR),BARNAM + CHARACTER*12,DIMENSION(6) :: PKREF + DATA PKREF/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + ! RECOVER INFORMATION FROM INFO DATA BLOCK + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGTC(IPDAT,'STATE_VAR',12,NVAR,PKEY) + + !INITIALIZATION OF THE NUMBER OF BRANCHES TO BE CALCULATED + + VALPAR(:NVAR,:100)=0.0 + NBR=1 + DO i=1, NVAR + IF (PKIDX(i).EQ.-1) THEN + IDX=1 + ELSE + IDX=PKIDX(i) + ENDIF + CALL LCMLEN(IPDAT,PKREF(IDX),NVALPA(i),ITYLCM) + CALL LCMGET(IPDAT,PKREF(IDX),VALPAR(i,1:NVALPA(i))) + ENDDO + + DO i=1, NVAR + IF (PKIDX(i).EQ.-1) THEN + IDX=1 + ELSE + IDX=PKIDX(i) + ENDIF + ! ATTRIBUTION OF VALUES FOR THE BARR PARAMETERS + IF (PKREF(IDX)==PKREF(1)) THEN + BARNAM=PKNAM(1) + REFSTA(1)= CRDINF(1) + HSTSTA(1)= CRDINF(1) + REFIDX(1)=1 ! INITIALIZATION OF BARR REFERENCE INDEX + STATE(1)=CRDINF(1) ! ATTRIBUTION OF CONTROL ROD COMPOSITION + STAIDX(1)=1 ! ATTRIBUTION OF CONTROL ROD COMPOSITION INDEX + NBR=NBR*NVALPA(i) ! CALCULATION OF NUMBER OF BRANCHES + ! IDEM FOR BURN PARAMETERS + ELSE IF (PKREF(IDX)==PKREF(6)) THEN + STATE(NVAR)=VALPAR(i,1) + STAIDX(NVAR)=1 + REFIDX(NVAR)=1 + !IDEM FOR OTHER PARAMETERS + ! EXIT + + ELSE + + ! THE REFERENCE STATES IS SET TO THE MIDDLE VALUE IN THE LIST + REFSTA(IP)=VALPAR(i,NINT(NVALPA(i)/2.0)) + HSTSTA(IP)= VALPAR(i,NINT(NVALPA(i)/2.0)) + REFIDX(IP)=NINT(NVALPA(i)/2.0) + STATE(IP)=REFSTA(IP) + STAIDX(IP)=NINT(NVALPA(i)/2.0) + NBR=NBR*NVALPA(i) + IP=IP+1 + ENDIF + ENDDO + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMPUT(IPDAT,'PRINT',1,1,1) + + IF((NBR>9999).OR.(GRID==0)) THEN + ! IN THE CASE WHERE THE NUMBER OF BRANCHES EXCEED 999, A + ! DEFAULT BANCHING CALCULATION IS CALLED + GRID = 0 + CALL D2PDEF( IPDAT, PKEY, VALPAR, NVALPA, STAIDX, REFIDX, + > REFSTA,HSTSTA, STATE, CRDINF, NCRD, NVAR, + > PKIDX ,IPRINT ) + ELSE + ! UPDATE THE INFO DATA BLOCK + ! WITH THE INITIAL MESHING FROMSAPHYB + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMPTC(IPDAT,'BRANCH',12,BARNAM) + CALL LCMPUT(IPDAT,'BRANCH_IT',1,1,1) + CALL LCMPUT(IPDAT,'REF_STATE',NVAR-1,2,REFSTA) + CALL LCMPUT(IPDAT,'HST_STATE',NVAR-1,2,REFSTA) + CALL LCMPUT(IPDAT,'REF_INDEX',NVAR,1,REFIDX) + CALL LCMPUT(IPDAT,'BRANCH_NB',1,1,NBR) + CALL LCMPUT(IPDAT,'STATE',NVAR,2,STATE) + CALL LCMPUT(IPDAT,'STATE_INDEX',NVAR,1,STAIDX) + CALL LCMPUT(IPDAT,'BRANCH_INDEX',1,1,1) + CALL LCMPUT(IPDAT,'REWIND',1,1,1) + CALL LCMPUT(IPDAT,'STOP',1,1,0) + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "*** INFORMATION ABOUT BRANCHING CALCULATION ***" + WRITE(6,*) + WRITE(6,*) "DEFAULT MESHING (Y/N) : N" + IF(GRID==4) WRITE(6,*) "MESHING: NEW GRID WITH ADDITIONAL PTS" + IF(GRID==3) WRITE(6,*) "MESHING: SAP/MCO WITH ADDITIONAL PTS" + IF(GRID==2) WRITE(6,*) "MESHING: USER DEFINED " + IF(GRID==1) WRITE(6,*) "MESHING: SAP/MCO " + WRITE(6,*) "STATE PARAMETERS : ",PKEY(1:NVAR) + WRITE(6,*) "REFERENCE STATES VALUES :", REFSTA + WRITE(6,*) "INITIAL STATES VALUES :", STATE + WRITE(6,*) "INITIAL STATES INDEX VALUES :", STAIDX + ENDIF + + ENDIF + END diff --git a/Donjon/src/D2PREO.f b/Donjon/src/D2PREO.f new file mode 100644 index 0000000..c118c7a --- /dev/null +++ b/Donjon/src/D2PREO.f @@ -0,0 +1,64 @@ +*DECK D2PREO + SUBROUTINE D2PREO(IPDAT,VALPAR,IND,NPAR,NVAL,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* take into account the meanning of the control rod composition in +* Saphyb, attribute to each value of control rod the corresponding value +* in GENMAPXS formalism +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of the INFO data block +* VALPAR vector of values for each state variable +* IND index of the control rod parameter +* NPAR number of state variables +* NVAL number of values for control rod parameter +* IPRINT control the printing on screen +* +*Parameters: +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + INTEGER NVAL + REAL VALPAR(NPAR,100) +*---- +* LOCAL VARIABLES +*---- + ! USER INPUT: MEANING OF BARR PARAMETERS : LOCATED AT INFO/CRDINF + INTEGER CRDINF(NVAL) + + ! RECOVER CRDINF DATA BLOCK + CALL LCMSIX(IPDAT,' ',0) + CALL LCMGET(IPDAT,'BARR_INFO',CRDINF) + + DO I=1, NVAL + VALPAR(IND,I)=CRDINF(I) + IF (CRDINF(I)<0) THEN + CALL XABORT('@D2PREO: CONTROL ROD COMPO MUST BE POSITIVE') + ENDIF + ENDDO + ! ATTRIBUTION OF CRDINF TO THE BARR PARAMETERS + + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + + ! EDIT THE LISTING FILE + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "****** CONTROL ROD COMPOSITION (IN SAPHYB) ******" + WRITE(6,*) + WRITE(6,*) "UNRODDED CROSS SECTIONS :",VALPAR(IND,1) + DO J=2, NVAL + WRITE(6,*) "RODDED COMPOSITION ",J-1,": ",VALPAR(IND,J) + ENDDO + WRITE(6,*) + ENDIF + END diff --git a/Donjon/src/D2PRFL.f b/Donjon/src/D2PRFL.f new file mode 100644 index 0000000..d9d6429 --- /dev/null +++ b/Donjon/src/D2PRFL.f @@ -0,0 +1,262 @@ +*DECK D2PRFL + SUBROUTINE D2PRFL( IPDAT, IPMIC , IPRINT, NBU, NGP, NBMIX, + > NANI, NVAR, STAIDX, LADF, NADF, NTYPE) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover macroscopic and microscopic cross sections from a microlib +* object and write cross sections for one branch at a fixed burnup point +* in the INFO data block. +* WARNING: 04/2014 The information recovered by this routine is exactly +* the same than GET_MACROLIB_XS but is used for reflector case, in this +* case the following reactions are set to zero : +* DET(IGR) = 0 +* SFI(IGR) = 0 +* KAPPA_FI(IGR)= 0 +* FLUX(IGR) = 0 +* VELINV(IGR) = 0 +* CHI_SPEC(IGR) = 0 +* X_NU_FI(IGR) = 0 +* KAPPA_FI(IGR) = 0 +* XENG(IGR)=0 +* SMNG(IGR)=0 +* NB : for reflector case, the upscattering is fixed to zero +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* IPMIC address of the microlib object +* NBU number of burnup points +* NBMIX number of mixturess +* NGP number of energy groups +* NANI number of anisotropy +* NVAR number of state variables +* STAIDX table of states index order +* NADF number of ADF to be recovered +* NTYPE number of adf type +* LADF flag for adf +* +*Parameters: +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPMIC + INTEGER STAIDX(NVAR) + INTEGER NBU,NVAR,NBMIX,NGP,NANI,NADF,NTYPE + LOGICAL LADF +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMIC,KPMIC,IPTH,KPTH + INTEGER NSCAT,MIX + INTEGER IJJ(NBMIX),NJJ(NBMIX),IPOS(NBMIX) + REAL GAR2(NGP,NGP,NBMIX,NANI),GAR3(NBMIX*NGP) + REAL XSECT(NGP,NBMIX) ! TOTAL CROSS SECTIONS + REAL KAPPA_FI(NGP) ! KAPPA FISSION CROSS SECTIONS + REAL X_NU_FI(NGP) ! NU SIGMA FISSION CROSS SECTIONS + REAL XTR(NGP) ! TRANSPORT CROSS SECTIONS + REAL DIFF(NGP,NBMIX) ! DIFFUSION COEFF + REAL SCAT(NGP,NBMIX) ! SCATTERING CROSS SECTIONS + REAL DET(NGP) ! DETECTOR CROSS SECTIONS + REAL SFI(NGP) ! FISSION CROSS SECTIONS + REAL ABSORPTION(NGP) ! ABSORPTION CROSS SECTIONS + REAL SCAT_MAT(NGP*NGP) ! SCATTERING MATRIX + REAL SCAT_TMP(NGP,NGP,NBMIX,NANI) ! TEMPORARY SCATTERING MATRIX + REAL FLUX(NGP) + REAL VELINV(NGP) + REAL XENG(NGP) + REAL CHI_SPEC(NGP),VOLUME(NBMIX) + REAL SMNG(NGP),FLXHET(NGP*NBMIX),FLXHOM(NGP,NBMIX) + REAL FLXL(NGP),FLXR(NGP),CURL(NGP),CURR(NGP) + REAL ADF(NADF,NGP) + CHARACTER CM*2,ADF_T*3 + CHARACTER*8 ADFD(NADF),HADF(NTYPE),HFLX(2),HCUR(2) + IF(IPRINT > 0) THEN + WRITE(6,*) + WRITE(6,*) "****** RECOVER REFLECTOR CROSS SECTIONS ******" + ENDIF + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + IF(LADF) THEN + ADF_T=" " + CALL LCMGTC(IPDAT,'ADF_TYPE',3,ADF_T) + IF ((ADF_T.NE.'DRA').AND.(ADF_T.NE.'GEN')) THEN + WRITE(6,*)'@D2PRFL:',ADF_T,'ADF NOT SUPPORTED ', + > 'WITH REFL CALCULATION' + CALL XABORT('') + ENDIF + IF ((ADF_T.EQ.'DRA')) THEN + CALL LCMGTC(IPDAT,'HADF',8,NADF,ADFD) + ELSE IF ((ADF_T.EQ.'GEN')) THEN + CALL LCMGTC(IPDAT,'HFLX',8,2,HFLX) + CALL LCMGTC(IPDAT,'HCUR',8,2,HCUR) + ENDIF + + ENDIF + + CALL LCMGET(IPDAT,'MIX',MIX) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMGET(IPMIC,'VOLUME',VOLUME) + + IF (LADF) THEN + CALL LCMSIX(IPMIC,'ADF',1) + CALL LCMGTC(IPMIC,'HADF',8,NTYPE,HADF) + ITYPE=1 + IF ((ADF_T.EQ.'DRA')) THEN + DO ITYPE=1,NTYPE + CALL LCMGET(IPMIC,HADF(ITYPE),FLXHET) + DO I=1,NADF + IF(HADF(ITYPE).EQ.ADFD(I))THEN + DO IGR=1, NGP + ADF(I,IGR)= FLXHET((IGR-1)*NBMIX+MIX) + ENDDO + ENDIF + ENDDO + ENDDO + ELSE IF ((ADF_T.EQ.'GEN')) THEN + DO ITYPE=1,NTYPE + CALL LCMGET(IPMIC,HADF(ITYPE),FLXHET) + IF(HADF(ITYPE).EQ.HFLX(1))THEN + FLXL(:)=FLXHET + ENDIF + IF (HADF(ITYPE).EQ.HFLX(2))THEN + FLXR(:)=FLXHET + ENDIF + IF (HADF(ITYPE).EQ.HCUR(1))THEN + CURL(:)=FLXHET + ENDIF + IF (HADF(ITYPE).EQ.HCUR(2))THEN + CURR(:)=FLXHET + ENDIF + ENDDO + ENDIF + CALL LCMSIX(IPMIC,'',2) + + ENDIF + + JPMIC=LCMGID(IPMIC,'GROUP') + + ! RECOVER CROSS SECTIONS INFORMATION + DO IGR=1,NGP + WRITE(6,'(/28H PROCESS ENERGY GROUP NUMBER,I4)') IGR + KPMIC=LCMGIL(JPMIC,IGR) + CALL LCMLEN(KPMIC,'NTOT0',ILONG,ITYLCM) + + IF(ILONG.NE.NBMIX) THEN + CALL XABORT('D2P: MORE THAN ONE MIXTURE IN SAPHYB') + ENDIF + CALL LCMGET(KPMIC,'FLUX-INTG',FLXHOM(IGR,1:NBMIX)) + CALL LCMGET(KPMIC,'NTOT0',XSECT(IGR,1:NBMIX)) + CALL LCMGET(KPMIC,'SIGS00',SCAT(IGR,1:NBMIX)) + CALL LCMGET(KPMIC,'DIFF',DIFF(IGR,1:NBMIX)) + ABSORPTION(IGR)=XSECT(IGR,MIX)-SCAT(IGR,MIX) + IF (LADF) ADF(:,IGR)= VOLUME * ADF(:,IGR) / FLXHOM(IGR,MIX) + DET(IGR) = 0 + SFI(IGR) = 0 + KAPPA_FI(IGR)= 0 + FLUX(IGR) = 0 + VELINV(IGR) = 0 + CHI_SPEC(IGR) = 0 + X_NU_FI(IGR) = 0 + KAPPA_FI(IGR) = 0 + XENG(IGR)=0 + SMNG(IGR)=0 + XTR(IGR)=1/(3*DIFF(IGR,MIX)) + + GAR2(:NGP,:NGP,:NBMIX,:NANI)=0.0 + DO IL=1,NANI + WRITE(CM,'(I2.2)') IL-1 + LENGTH=1 + IF(IL.GT.1) CALL LCMLEN(KPMIC,'SCAT'//CM,LENGTH,ITYLCM) + IF(LENGTH.GT.0) THEN + CALL LCMGET(KPMIC,'SCAT'//CM,GAR3) + CALL LCMGET(KPMIC,'NJJS'//CM,NJJ) + CALL LCMGET(KPMIC,'IJJS'//CM,IJJ) + CALL LCMGET(KPMIC,'IPOS'//CM,IPOS) + DO IMIL=1,NBMIX + IPOSDE=IPOS(IMIL) + DO JGR=IJJ(IMIL),IJJ(IMIL)-NJJ(IMIL)+1,-1 + GAR2(IGR,JGR,IMIL,IL)=GAR3(IPOSDE) ! IGR <-- JGR + SCAT_TMP(IGR,JGR,IMIL,IL)=GAR2(IGR,JGR,IMIL,IL) + IPOSDE=IPOSDE+1 + ENDDO + ENDDO + ENDIF + ENDDO + ENDDO + + NSCAT=1 + DO J=1, NGP + DO I=1, NGP + SCAT_MAT(NSCAT)=SCAT_TMP(I,J,MIX,1) ! I <-- J + IF(NSCAT==3) SCAT_MAT(NSCAT)=0 + NSCAT=NSCAT+1 + ENDDO + ENDDO + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IF(STAIDX(NVAR)==1) THEN + IPTH=LCMLID(IPDAT,'CROSS_SECT',NBU) + ELSE + IPTH=LCMGID(IPDAT,'CROSS_SECT') + ENDIF + + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + CALL LCMSIX(KPTH,'MICROLIB_XS',1) + + CALL LCMPUT(KPTH,'XENG',NGP,2,XENG) + CALL LCMPUT(KPTH,'SMNG',NGP,2,SMNG) + + CALL LCMSIX(KPTH,' ',2) + CALL LCMSIX(KPTH,'MACROLIB_XS',1) + + CALL LCMPUT(KPTH,'XTR',NGP,2,XTR) + CALL LCMPUT(KPTH,'ABSORPTION',NGP,2,ABSORPTION) + CALL LCMPUT(KPTH,'X_NU_FI',NGP,2,X_NU_FI) + CALL LCMPUT(KPTH,'KAPPA_FI',NGP,2,KAPPA_FI) + CALL LCMPUT(KPTH,'SFI',NGP,2,SFI) + CALL LCMPUT(KPTH,'DET',NGP,2,DET) + CALL LCMPUT(KPTH,'SCAT',NGP*NGP,2,SCAT_MAT) + IF (LADF) THEN + IF (ADF_T.EQ.'DRA') THEN + CALL LCMPUT(KPTH,'ADF',NADF*NGP,2,ADF) + ELSE IF (ADF_T.EQ.'GEN') THEN + CALL LCMPUT(KPTH,'FLXL',NGP,2,FLXL) + CALL LCMPUT(KPTH,'FLXR',NGP,2,FLXR) + CALL LCMPUT(KPTH,'CURL',NGP,2,CURL) + CALL LCMPUT(KPTH,'CURR',NGP,2,CURR) + ENDIF + ENDIF + IF(IPRINT>1) THEN + WRITE(6,*) + WRITE(6,*) "**** MACROSCOPIC cross sections (1:NGP) ****" + WRITE(6,*) "TOTALE :",XSECT(:,MIX) + WRITE(6,*) "DIFFUSION :",DIFF(:,MIX) + WRITE(6,*) "TRANSPORT :",XTR + WRITE(6,*) "ABSORPTION :",ABSORPTION + WRITE(6,*) "NU FISSION :",X_NU_FI + WRITE(6,*) "KAPPA FISSION :",KAPPA_FI + WRITE(6,*) "DETECTOR :",DET + WRITE(6,*) "SCATTERING (g to g') :",SCAT_MAT + IF (LADF) THEN + IF (ADF_T.EQ.'DRA') THEN + WRITE(6,*) "ADF([N/E/W/S]||[W/E]) :",ADF + ELSE IF (ADF_T.EQ.'GEN') THEN + WRITE(6,*) "WEST FLUX BOUNDARY :",FLXL + WRITE(6,*) "EST FLUX BOUNDARY :",FLXR + WRITE(6,*) "WEST CURRENT BOUNDARY :",CURL + WRITE(6,*) "EST CURRENT BOUNDARY :",CURR + ENDIF + ENDIF + ENDIF + END diff --git a/Donjon/src/D2PSAP.f b/Donjon/src/D2PSAP.f new file mode 100644 index 0000000..ff3b5eb --- /dev/null +++ b/Donjon/src/D2PSAP.f @@ -0,0 +1,655 @@ +*DECK D2PSAP + SUBROUTINE D2PSAP( IPSAP, IPDAT, STAVEC, CRDINF, NCRD, PKNAM, + > ISOT , MESH, USRPAR, USRVAL, USRSTA,USRVAPK, + > SAP , MIC, EXC, SCAT, ADF, LADD , + > LNEW , LADF, IPRINT, LYLD, YLD, YLDOPT, + > LOCYLD, HDET ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the global stated variable data contained in the SAPHYB object +* +*Author(s): +* J. Taforeau +* +*Parameters: input/output +* IPDAT address of the INFO data block +* IPSAP address of the saphyb object +* NCRD number of control rod composition recovered from D2P input +* user +* MIX index of mixture on which XS are to be extracted (only for +* reflector cases) +* USRSTA state variable names recovered from GLOBAL record in D2P: +* USRVAL number of value for state variables recovered from GLOBAL +* record in D2P: +* IPRINT control the printing on screen +* STAVEC various parameters associated with the IPDAT structure +* CRDINF meaning of control rods in the IPSAP object +* USRVAPK value of state prameter set by the user and recoverd from +* USER ADD option in D2P: +* ADF type of ADF to be selected +* DER partials derivative (T) or row cross section (F) to be stored +* in PMAXS +* USRPAR name of state variables (sapnam) in IPSAP associated to +* DMOD TCOM etc. recovered from PKEY card in D2P: +* MESH type of meshing to be applied for the branching calculation +* PKNAM name of state variable (refnam) recovered from PKEY card in +* D2P: +* ISOT name of isotopes in IPSAP for xenon samarium and spomethium +* SAP flag to indicate that absorption cross section must be +* directly recovered from IPSAP +* MIC flag to indicate that absorption cross section must be +* directly recovered from IPMIC +* EXC flag to indicate that excess cross section is to be extracted +* from absoption xs (only if SAP) +* SCAT flag to indicate that scattering cross section must be +* directly reconstructed from IPSAP +* LADD flag to indicate that new points must be added to the IPSAP +* original meshing +* LNEW flag to indicate that only new points must be used during the +* branching calculation +* LADF Assembly Discontinuity Factors must be recovered +* LYLD Fission Yield must be recovered +* YLD user defined values for fission yields (1:I, 2:XE, 3:PM) +* LOCYLD value for state parameter on which fission yield will be +* calculated +* YLDOPT option for fission yields calculation (DEF, MAN, FIX) +* HDET name of isotope for the detector cross sections +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP,IPDAT + INTEGER NCRD,USRSTA + INTEGER IPRINT + INTEGER STAVEC(40),CRDINF(20),USRVAL(12) + REAL USRVAPK(12,10),YLD(3),LOCYLD(5) + CHARACTER*3 ADF,YLDOPT + CHARACTER*12 USRPAR(12) + CHARACTER*5 MESH + CHARACTER*12 PKNAM(6) + CHARACTER*12 ISOT(8) + LOGICAL SAP, MIC, EXC,SCAT,LADD,LNEW,LADF,LYLD + CHARACTER*12 HDET +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPROOT,IPTH,KPTH + + PARAMETER(NDIMSAP=50) + INTEGER :: N_XS = 8 + INTEGER,DIMENSION(6) :: ORDER_VAL = 0 + INTEGER DIMSAP(NDIMSAP) + INTEGER NPAR,NCALS,NSVAR,NBREA,ITYLCM,VALTOT + INTEGER NCRD_SAP,NVALTMP(10) + INTEGER i, j, k, l , n, UV,ILONG + INTEGER :: NTOT = 0 + REAL FIRST_VAL,LAST_VAL,PITCH + LOGICAL LABS(3) + LOGICAL :: LBARR = .FALSE. + LOGICAL :: LDMOD = .FALSE. + LOGICAL :: LCBOR = .FALSE. + LOGICAL :: LTCOM = .FALSE. + LOGICAL :: LTMOD = .FALSE. + LOGICAL :: LBURN = .FALSE. + CHARACTER(LEN=12) PKEY_BARR(6) + CHARACTER*12,DIMENSION(6) :: PKREF + DATA PKREF/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + + INTEGER, ALLOCATABLE, DIMENSION(:) :: NVAL,RANK,RANK_INDEX,PKIDX + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: PKEY,PKEY_TMP + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: PVALDIR, NOMREA + REAL, ALLOCATABLE, DIMENSION(:) :: SV_VAL + REAL, ALLOCATABLE, DIMENSION(:,:) :: VALPAR + + IPROOT=IPSAP + LABS(1)=MIC + LABS(2)=SAP + LABS(3)=EXC + CALL LCMSIX(IPDAT,' ',0) + CALL LCMPUT(IPDAT,'BARR_INFO',NCRD,1,CRDINF) + ! RECOVER DIMSAP INFORMATION FROM SAPHYB + DIMSAP(:NDIMSAP)=0 + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + + NPAR =DIMSAP(8) + NMIL =DIMSAP(7) + NREA =DIMSAP(4) + NISO =DIMSAP(5) + NMAC =DIMSAP(6) + ! INITIALIZATION OF PARAMETERS + VALTOT = 0 + NSVAR = 0 + k = 1 + + ! MEMORY ALLOCATION + ALLOCATE (PKEY(NPAR),NVAL(NPAR),RANK(NPAR)) + ALLOCATE (PKEY_TMP(NPAR),RANK_INDEX(NPAR+1)) + CALL LCMSIX (IPSAP,' ',0) + CALL LCMSIX (IPSAP,'paramarbre',1) + CALL LCMGET (IPSAP,'NCALS',NCALS) + CALL LCMSIX (IPSAP,' ',0) + CALL LCMSIX (IPSAP,'contenu',1) + CALL LCMLEN(IPSAP,'NOMREA',NBREA,ITYLCM) + ALLOCATE (NOMREA(NBREA)) + CALL LCMGTC(IPSAP,'NOMREA',12,NBREA,NOMREA) + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,'paramdescrip',1) + CALL LCMLEN(IPSAP,'PARKEY',ILONG,ITYLCM) + CALL LCMGTC(IPSAP,'PARKEY',4,NPAR,PKEY) + CALL LCMGET(IPSAP,'NVALUE',NVAL) + IF(NPAR.GT.10) CALL XABORT('D2PSAP: NVAL OVERFLOW.') + NVALTMP(:NPAR)=NVAL(:NPAR) + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,'paramvaleurs',1) + ! LOOP OVER STATE VARIABLES OF SAPHYB + ! CHECK OF EXISTENCE OF STATE PARAMETER + PKEY (1:NPAR) (5:12) = " " + + DO i=1, NPAR + IF ((PKEY(i).NE.'FLUE').AND.(PKEY(i).NE.'TIME')) NTOT=NTOT+1 + IF(PKEY(i)==PKNAM(1)) THEN ! BARR + LBARR=.TRUE. + ELSE IF(PKEY(i)==PKNAM(2)) THEN ! DMOD + LDMOD=.TRUE. + ELSE IF(PKEY(i)==PKNAM(4)) THEN ! TCOM + LTCOM=.TRUE. + ELSE IF(PKEY(i)==PKNAM(5)) THEN ! TMOD + LTMOD=.TRUE. + ELSE IF(PKEY(i)==PKNAM(3)) THEN ! CBOR + LCBOR=.TRUE. + ELSE IF(PKEY(i)==PKNAM(6)) THEN ! BURN + LBURN =.TRUE. + ENDIF + RANK_INDEX(i)=0 + ENDDO + RANK_INDEX(NPAR+1)=0 + + ! DETERMINE ODER_VAL ARRAY + IF(LBARR) THEN + ORDER_VAL(1)=1 + ELSE + NCRD_SAP=1 + IF(NCRD>1) THEN + WRITE(6,*) "@D2PSAP:", + 1 " CONTROL ROD STATE VARIABLE IS MISSING IN SAPHYB" + CALL XABORT("=> NUMBER OF CTRL ROD VALUE MUST BE SET TO 1") + ELSE IF(CRDINF(1).NE. 1) THEN + WRITE(6,*) "@D2PSAP:", + 1 " CONTROL ROD STATE VARIABLE IS MISSING IN SAPHYB" + CALL XABORT("=> CTRL ROD UNRODDED INDEX MUST BE SET TO 1") + ENDIF + ENDIF + IF(LDMOD) THEN + ORDER_VAL(2)=1 + IF(LBARR) ORDER_VAL(2)=2 + ENDIF + IF(LCBOR) THEN + IF(LDMOD) THEN + ORDER_VAL(3)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(3)=2 + ELSE + ORDER_VAL(3)=1 + ENDIF + ENDIF + IF(LTCOM) THEN + IF(LCBOR) THEN + ORDER_VAL(4)=ORDER_VAL(3)+1 + ELSE IF(LDMOD) THEN + ORDER_VAL(4)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(4)=2 + ELSE + ORDER_VAL(4)=1 + ENDIF + ENDIF + IF(LTMOD) THEN + IF(LTCOM) THEN + ORDER_VAL(5)=ORDER_VAL(4)+1 + ELSE IF(LCBOR) THEN + ORDER_VAL(5)=ORDER_VAL(3)+1 + ELSE IF(LDMOD) THEN + ORDER_VAL(5)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(5)=2 + ELSE + ORDER_VAL(5)=1 + ENDIF + ENDIF + DO i=1, NPAR + PKEY_TMP(i)=PKEY(i) + ENDDO + + IF(.NOT.LBURN) THEN + WRITE(6,*) + WRITE(6,*)('WARNING: BURN VARIABLE IS MISSING IN MCO') + WRITE(6,*)('=> 0 MWJ/T SINGLE EXPOSURE IS ASSUMED') + WRITE(6,*) + DEALLOCATE (PKEY,NVAL) + NPAR=NPAR+1 + ALLOCATE (PKEY(NPAR),NVAL(NPAR)) + DO i=1, NPAR-1 + PKEY(i)=PKEY_TMP(i) + NVAL(i)=NVALTMP(i) + ENDDO + PKEY(NPAR)="BURN" + NVAL(NPAR)=1 + DEALLOCATE (PKEY_TMP) + ALLOCATE(PKEY_TMP (NPAR)) + PKEY_TMP=PKEY + ENDIF + + IF(LTMOD) THEN + ORDER_VAL(6)=ORDER_VAL(5)+1 + ELSE IF(LTCOM) THEN + ORDER_VAL(6)=ORDER_VAL(4)+1 + ELSE IF(LCBOR) THEN + ORDER_VAL(6)=ORDER_VAL(3)+1 + ELSE IF(LDMOD) THEN + ORDER_VAL(6)=ORDER_VAL(2)+1 + ELSE IF(LBARR) THEN + ORDER_VAL(6)=2 + ELSE + ORDER_VAL(6)=1 + ENDIF + + ALLOCATE (PVALDIR(NPAR),VALPAR(NPAR,100)) + + DO i=1, NPAR + ! NAME OF DIRECTORY IN SAPHYB CONTAINING VALUES OF STATE + IF ((PKEY(i).NE.PKNAM(6))) THEN + WRITE(PVALDIR(i),'("pval", I8)') i + CALL LCMGET(IPSAP,PVALDIR(i),VALPAR(i,1:NVAL(i))) + ELSE IF(LBURN) THEN + WRITE(PVALDIR(i),'("pval", I8)') i + CALL LCMGET(IPSAP,PVALDIR(i),VALPAR(i,1:NVAL(i))) + ELSE + VALPAR(i,1:NVAL(i))=0.0 + ENDIF + ! CASE OF CONTROL ROD + IF(PKEY(i)==PKNAM(1)) THEN + RANK(i)=ORDER_VAL(1); + RANK_INDEX(ORDER_VAL(1))=i + VALTOT=VALTOT+NVAL(i); + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(1)) THEN + WRITE(6,*)('@D2PSAP: IMPOSSIBLE TO ADD A CONTROL ') + CALL XABORT ('ROD VALUE IN THE PMAXS TREE') + ENDIF + ENDDO + ENDIF + ! CASE OF MODERATOR DENSITY + ELSE IF(PKEY(i)==PKNAM(2)) THEN + RANK(i)=ORDER_VAL(2) + RANK_INDEX(ORDER_VAL(2))=i + VALTOT=VALTOT+NVAL(i); + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(2)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + VALTOT=VALTOT-NVAL(i); + NVAL(i)=0 + ENDIF + VALTOT=VALTOT+USRVAL(UV) + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF BORON CONCENTRATION + ELSE IF(PKEY(i)==PKNAM(3)) THEN + RANK(i)=ORDER_VAL(3) + RANK_INDEX(ORDER_VAL(3))=i + VALTOT=VALTOT+NVAL(i); + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(3)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + VALTOT=VALTOT-NVAL(i); + NVAL(i)=0 + ENDIF + VALTOT=VALTOT+USRVAL(UV) + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF FUEL TEMPERATURE + ELSE IF(PKEY(i)==PKNAM(4)) THEN + RANK(i)=ORDER_VAL(4) + RANK_INDEX(ORDER_VAL(4))=i + VALTOT=VALTOT+NVAL(i); + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(4)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + VALTOT=VALTOT-NVAL(i); + NVAL(i)=0 + ENDIF + VALTOT=VALTOT+USRVAL(UV) + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ! CASE OF MODERATOR DENSITY + ELSE IF(PKEY(i)==PKNAM(5)) THEN + RANK(i)=ORDER_VAL(5) + RANK_INDEX(ORDER_VAL(5))=i + VALTOT=VALTOT+NVAL(i); + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(5)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + VALTOT=VALTOT-NVAL(i); + NVAL(i)=0 + ENDIF + VALTOT=VALTOT+USRVAL(UV) + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ELSE IF(PKEY(i)==PKNAM(6)) THEN + RANK(i)=NPAR + RANK_INDEX(NPAR)=i + VALTOT=VALTOT+NVAL(i) + STAVEC(4)=NVAL(i) + IF(LADD) THEN + DO UV=1,USRSTA + IF(USRPAR(UV)==PKNAM(6)) THEN + IF(LNEW) THEN + VALPAR(i,1:NVAL(i))=0.0 + VALTOT=VALTOT-NVAL(i); + NVAL(i)=0 + ENDIF + VALTOT=VALTOT+USRVAL(UV) + VALPAR(i,NVAL(i)+1:NVAL(i)+1+USRVAL(UV))= + > USRVAPK(UV,1:USRVAL(UV)) + NVAL(i)=NVAL(i)+USRVAL(UV) + STAVEC(4)=NVAL(i) + CALL D2PSOR(VALPAR(i,1:NVAL(i)),NVAL(i)) + ENDIF + ENDDO + ENDIF + ELSE + RANK(i) = NPAR+i + RANK_INDEX(NPAR+1)=NPAR+1 + END IF + ENDDO + + ALLOCATE (SV_VAL(VALTOT)) + ! D2PSOR STATE VARIABLE INPUT TO MATCH GENPMAXS ORDER + CALL D2PSOI(RANK,NPAR) + + ! LOOP OVER STATES VARIABLES IN SAPHYB + DO i=1, NPAR + ! WE KEEP ONLY "REAL" STATES VARIABLE (IE EXEPT FLUE, TIME ETC. + IF(RANK(i)<=NPAR) THEN + ! RESTORE THE NAME OK PKEY AFTER THE CALL TO D2PSOR SUBROUTINE + PKEY(i)=PKEY_TMP(RANK_INDEX(RANK(i))) + NSVAR = NSVAR + 1 + DO j=1, NVAL(RANK_INDEX(RANK(i))) + SV_VAL(k)=VALPAR(RANK_INDEX(RANK(i)),j) + k=k+1 + ENDDO + ENDIF + ENDDO + + ! CREATION OF THE SAPHYB_INFO DIRECTORY INTO THE INFO DATA BLOCK + STAVEC(2) = NSVAR ! NVAR + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + ! CREATION OF : INFO/SAPHYB_INFO/STATE_VAR + CALL LCMPUT(IPDAT,'NTOT',1,1,NTOT) + CALL LCMPTC(IPDAT,'STATE_VAR',12,NSVAR,PKEY) + IF(.NOT.(LBARR)) THEN + PKEY_BARR(1)="BARR " + DO j=1, NSVAR + PKEY_BARR(j+1)=PKEY(j) + ENDDO + ! CREATION OF : INFO/SAPHYB_INFO/STATE_VAR + CALL LCMPTC(IPDAT,'STATE_VAR',12,NSVAR+1,PKEY_BARR) + ! CREATION OF : INFO/SAPHYB_INFO/BARR + CALL LCMPUT(IPDAT,'BARR',1,2,1.0) + STAVEC(2) = NSVAR + 1 ! NVAR +! NSVAR=NSVAR+1 + ENDIF + + ALLOCATE (PKIDX(STAVEC(2))) + PKIDX(:STAVEC(2))=0 + IF (.NOT. LBARR) PKIDX(STAVEC(2))= -1 + + DO i=1, NSVAR + DO j=2,6 + IF(PKEY(i)==PKNAM(j)) THEN + PKIDX(i)=j + ENDIF + ENDDO + IF(PKEY(i)==PKNAM(1)) THEN + IF (LBARR) PKIDX(i)=1 + NCRD_SAP=NVAL(RANK_INDEX(RANK(i))) + ! REORGANIZATION OF BARR PARAMETERS TO MATCH GENPMAXS + ! FORMALISM. SPECIAL TREATMENT FOR BARR PARAMETERS TO TAKE + ! INTO ACCOUNT THE MEANING OF BARR VALUES + IF(NCRD.NE.NCRD_SAP) THEN + WRITE(6,*) "@D2PSAP: ERROR IN CONTROL ROD COMPOSITION " + WRITE(6,*) "THE NUMBER OF CONTROL ROD COMPOSITIONS IN ", + 1 "SAP (",NCRD_SAP,") IS DIFFERENT FROM D2P INPUT (",NCRD,")" + WRITE(6,*) "SAP :",VALPAR(RANK_INDEX(RANK(i)),1:NCRD_SAP) + WRITE(6,*) "D2P INPUT :",CRDINF(1:5) + CALL XABORT('') + ENDIF + CALL D2PREO(IPDAT,VALPAR,RANK_INDEX(RANK(i)),NPAR, + 1 NVAL(RANK_INDEX(RANK(i))),IPRINT) + ENDIF + + IF(MESH.EQ.'GLOB') THEN + CALL LCMPUT(IPDAT,PKREF(PKIDX(i)), + 1 NVAL(RANK_INDEX(RANK(i))),2,VALPAR(RANK_INDEX(RANK(i)), + 2 1:NVAL(RANK_INDEX(RANK(i))))) + DO l=1,USRSTA + IF(USRPAR(l)==PKEY(i)) THEN + IF(PKEY(i) =='BARR') THEN + CALL XABORT('@D2PSAP: THE CR STATE CANNOT BE SET BY USER') + ENDIF + IF((USRVAL(l)>1).and.NVAL(RANK_INDEX(RANK(i)))==1) THEN + WRITE(6,*)"@D2PSAP: IMPOSSIBLE TO DEFINE USER MESHING", + 1 " FOR ",PKEY(i) + CALL XABORT ('ONLY ONE VALUE IS CONTAINED IN THE SAPHYB') + ENDIF + + FIRST_VAL=VALPAR(RANK_INDEX(RANK(i)),1) + LAST_VAL=NVAL(RANK_INDEX(RANK(i))) + LAST_VAL=VALPAR(RANK_INDEX(RANK(i)),INT(LAST_VAL)) + NVAL(RANK_INDEX(RANK(i))) = USRVAL(l) + IF(USRVAL(l)>1) THEN + PITCH = (LAST_VAL-FIRST_VAL)/(USRVAL(l)-1) + + DO n=1,USRVAL(l) + VALPAR(RANK_INDEX(RANK(i)),n)=FIRST_VAL+PITCH*(n-1) + ENDDO + ELSE + VALPAR(RANK_INDEX(RANK(i)),1)=(FIRST_VAL+LAST_VAL)/2.0 + ENDIF + + CALL LCMPUT(IPDAT,PKREF(PKIDX(i)),USRVAL(l),2, + 1 VALPAR(RANK_INDEX(RANK(i)),1:USRVAL(l))) + ENDIF + ENDDO + ELSE + ! CREATION OF: INFO/SAPHYB_INFO/SVNAME + CALL LCMPUT(IPDAT,PKREF(PKIDX(i)), + 1 NVAL(RANK_INDEX(RANK(i))),2,VALPAR(RANK_INDEX(RANK(i)), + 2 1:NVAL(RANK_INDEX(RANK(i)))) ) + ENDIF + ENDDO + + CALL LCMPUT(IPDAT,'PKIDX',STAVEC(2),1,PKIDX) + + IF(MESH=='DEF') THEN + STAVEC(5) = 0 + ELSE IF(MESH=='SAP') THEN + STAVEC(5) = 1 + ELSE IF(MESH=='GLOB') THEN + STAVEC(5) = 2 + ELSE IF(MESH=='ADD') THEN + STAVEC(5) = 3 + IF(LNEW) STAVEC(5) = 4 + ENDIF + IF (LYLD) THEN + CALL LCMPTC(IPDAT,'YLD_OPT',3,YLDOPT) + CALL LCMPUT(IPDAT,'YLD_FIX',3,2,YLD) + CALL LCMPUT(IPDAT,'YLD_LOC',5,2,LOCYLD) + ENDIF + + CALL LCMPTC(IPDAT,'ADF',3,ADF) + CALL LCMPUT(IPDAT,'LABS', 3,5,LABS) + CALL LCMPUT(IPDAT,'SCAT', 1,5,SCAT) + CALL LCMSIX(IPDAT,'ISOTOPES',1) + CALL LCMPTC(IPDAT,'XE135',12,ISOT(1)) + CALL LCMPTC(IPDAT,'SM149',12,ISOT(2)) + CALL LCMPTC(IPDAT,'I135',12,ISOT(3)) + CALL LCMPTC(IPDAT,'PM149',12,ISOT(4)) + CALL LCMPTC(IPDAT,'PM148',12,ISOT(5)) + CALL LCMPTC(IPDAT,'PM148M',12,ISOT(6)) + CALL LCMPTC(IPDAT,'ND147',12,ISOT(7)) + CALL LCMPTC(IPDAT,'PM147',12,ISOT(8)) + CALL LCMPTC(IPDAT,'DET',12,HDET) + ! SET THE IPDAT/STAVEC + STAVEC(1) = DIMSAP(20) ! NGROUP + STAVEC(3) = N_XS ! N_XS + STAVEC(6) = NCRD ! NCOMPO + STAVEC(7) = DIMSAP(31) ! NDLAY + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMPUT(IPDAT,'STATE-VECTOR',40,1,STAVEC) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + IPTH=LCMLID(IPDAT,'PKEY_INFO',6) + DO J=1, 6 + KPTH=LCMDIL(IPTH,J) + IF(J==1) THEN + CALL LCMPTC(KPTH,'NAME',12,PKNAM(1)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LBARR) + ELSE IF(J==2)THEN + IF(LDMOD) CALL LCMPTC(KPTH,'NAME',12,PKNAM(2)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LDMOD) + ELSE IF(J==3) THEN + IF(LCBOR) CALL LCMPTC(KPTH,'NAME',12,PKNAM(3)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LCBOR) + ELSE IF(J==4)THEN + IF(LTCOM) CALL LCMPTC(KPTH,'NAME',12,PKNAM(4)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LTCOM) + ELSE IF(J==5)THEN + IF(LTMOD) CALL LCMPTC(KPTH,'NAME',12,PKNAM(5)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LTMOD) + ELSE IF(J==6) THEN + CALL LCMPTC(KPTH,'NAME',12,PKNAM(6)) + CALL LCMPUT(KPTH,'LFLAG',1,5,LBURN) + ENDIF + ENDDO + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'HELIOS_HEAD',1) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMSIX(IPDAT,' ',0) + + ! EDIT THE LISTING FILE + IF(IPRINT > 0) THEN + WRITE(6,*) "********** CONTENT OF SAPHYB RECOVERED ***********" + WRITE(6,*) + WRITE(6,*) "NUMBER OF STATE VARIBALE IN PARAMDESCRIP : ", NPAR + WRITE(6,*) "NUMBER OF STATE VARIABLES : ", NSVAR + WRITE(6,*) "NAME OF STATE VARIABLES IN SAPHYB : ", PKEY + WRITE(6,*) "STATE VARIABLES RECOGNIZED : ",PKEY(1:NSVAR) + IF(NSVAR<NPAR-1) THEN + WRITE(6,*) "WARNING:" + WRITE(6,*) "STATE VARIABLES UNRECOGNIZED:",PKEY(NSVAR+1:NPAR-1) + WRITE(6,*) "==>PLEASE USE THE PKEY CARD OF D2P: MODULE" + ENDIF + WRITE(6,*) "FLAG FOR STATE VARIABLES : " + WRITE(6,*) " CONTROL ROD : ", LBARR + WRITE(6,*) " MODERATOR DENSITY : ", LDMOD + WRITE(6,*) " BORON CONCENTRATION : ", LCBOR + WRITE(6,*) " FUEL TEMPERATURE : ", LTCOM + WRITE(6,*) " MODERATOR TEMPERATURE : ", LTMOD + WRITE(6,*) " BURNUP : ", LBURN + WRITE(6,*) "ASSEMBLY DISCONTINUITY FACTORS : ", LADF + IF(LADF) THEN + IF(ADF .EQ. 'DRA') WRITE(6,*) "TYPE OF ADF : DRAGON" + IF(ADF .EQ. 'GET') WRITE(6,*) "TYPE OF ADF : GET" + IF(ADF .EQ. 'SEL') WRITE(6,*) "TYPE OF ADF : SELENGUT" + ENDIF + IF (STAVEC(21).EQ.1) THEN + WRITE(6,*)'WARNING => ADF ARE INTEGRATED IN CROSS SECTIONS' + CALL XABORT('STOP') + ENDIF + WRITE(6,*) "ABSORPTION TYPE : " + WRITE(6,*) " SAP : ", SAP + WRITE(6,*) " MIC : ", MIC + WRITE(6,*) " EXC : ", EXC + + WRITE(6,*) + DO i=1, NSVAR + WRITE(6,*) "NUMBER OF VALUES FOR ",PKEY(i)," PARAMETER :", + 1 NVAL(RANK_INDEX(RANK(i))) + WRITE(6,*) "VALUES FOR ",PKEY(i)," PARAMETER :", + 1 VALPAR(RANK_INDEX(RANK(i)),1:NVAL(RANK_INDEX(RANK(i)))) + WRITE(6,*) + ENDDO + WRITE(6,*) + WRITE(6,*) "NAME OF FISSION PRODUCTS FOR FISSION YIELD :" + WRITE(6,*) "XE135 : ",ISOT(1) + WRITE(6,*) "SM149 : ",ISOT(2) + WRITE(6,*) "I135 : ",ISOT(3) + WRITE(6,*) "PM149 : ",ISOT(4) + WRITE(6,*) "PM148 : ",ISOT(5) + WRITE(6,*) "PM148M : ",ISOT(6) + WRITE(6,*) "ND147 : ",ISOT(7) + WRITE(6,*) "PM147 : ",ISOT(8) + WRITE(6,*) + + IF (LYLD) THEN + WRITE(6,*) "OPTION FOR FISSION YIELD RECOVERY: ",YLDOPT + IF (STAVEC(22)>0) THEN + WRITE(6,*)"CORRECTION FOR SAMARIUM PRODUCTION IS APPLIED" + ENDIF + IF (YLDOPT.EQ.'MAN')THEN + WRITE(6,*)"LOCAL CONDITIONS SET BY THE USER :" + DO I=1,5 + IF (LOCYLD(I).NE.-1) THEN + WRITE(6,*) PKNAM(I)," = ",LOCYLD(I) + ENDIF + ENDDO + ENDIF + ENDIF + WRITE(6,*) + ENDIF + + ! free memory + DEALLOCATE (PKIDX) + DEALLOCATE (SV_VAL) + DEALLOCATE (VALPAR,PVALDIR) + DEALLOCATE (NOMREA) + DEALLOCATE (RANK_INDEX,PKEY_TMP) + DEALLOCATE (RANK,NVAL,PKEY) + RETURN + END diff --git a/Donjon/src/D2PSEL.f b/Donjon/src/D2PSEL.f new file mode 100644 index 0000000..2e459bc --- /dev/null +++ b/Donjon/src/D2PSEL.f @@ -0,0 +1,397 @@ +*DECK D2PSEL + SUBROUTINE D2PSEL( IPDAT, IPINP, STAVEC,BRANCH, ITBRAN, STAIDX, + > NVAR, JOBOPT, DEB, FC1 , FC2, FC3, + > FC4, XSC, IPRINT ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Select the next branch calculation . This routine determines also +* when to stop the calculation and updates the INFO data block. +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* IPINP file unit of the GENPMAXS input file +* JOBOPT array for JOBOPT configuration +* NGP number of energy groups +* BRANCH nature of the current branch ( CR, DC, CB, TC, TM etc ) +* ITBRAN index of the current branch +* STAIDX array of state variables index +* NVAR number of state variables +* STAVEC various parameters associated with the IPDAT structure +* DEB flag for D2PGEN +* +*Parameters: +* FC1 +* FC2 +* FC3 +* FC4 +* XSC +* IPRINT +* X +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT + INTEGER IPINP,STAVEC(40),NVAR,ITBRAN,IPRINT,DEB + INTEGER STAIDX(NVAR) + CHARACTER*4 BRANCH + CHARACTER JOBOPT(16) +*---- +* LOCAL VRAIABLES +*---- + TYPE(C_PTR) IPTH,KPTH + INTEGER CHANGE,ITYLCM,BRAIDX,PK + INTEGER FA_K + INTEGER :: IP = 0 + INTEGER NVAL(NVAR),REFIDX(NVAR) + ! VALUES OF CURRENT STATE VARIABLE ( IE FOR THE CURRENT BRANCH + ! CALCULATION) + REAL STATE(NVAR) + ! VALUES OF THE CHOOSEN REFERENCE STATE VARIABLES + REAL REFSTA(NVAR) + ! VALUES OF STATES VARIABLES IN SAPHYB + REAL VALPAR(NVAR,100) + REAL SFAC,BFAC,IUPS,VERS,XESM + CHARACTER*12 BARNAM + CHARACTER*12 PKEY(NVAR),PKNAM(6) + CHARACTER FILNAM*12,COM*40 + CHARACTER*16 JOBTIT + CHARACTER*1 DER + CHARACTER*12,DIMENSION(6) :: PKREF + DATA PKREF/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/ + LOGICAL :: BRANCH_STOP = .FALSE. + LOGICAL :: ONE_VAL = .FALSE. + LOGICAL LFLAG(6) + + VALPAR(:NVAR,:100)=0.0 + ! RECOVER INFORMATION FROM INFO data block + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGTC(IPDAT,'STATE_VAR',12,NVAR,PKEY) + DO PK=1, 6 + IPTH=LCMGID(IPDAT,'PKEY_INFO') + KPTH=LCMDIL(IPTH,PK) + CALL LCMGET(KPTH,'LFLAG',LFLAG(PK)) + IF (PK == 1 .OR. PK==6)THEN + CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ELSE + IF(LFLAG(PK)) CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK)) + ENDIF + ENDDO + + BARNAM=PKNAM(1) + IP=0 + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 0' + ! RECOVER VALUES FOR STATE VARIABLES + DO i=1,6 + IF (LFLAG(i).OR. i==1 .OR. i==6) THEN + IP=IP+1 + CALL LCMLEN(IPDAT,PKREF(i),NVAL(IP),ITYLCM) + CALL LCMGET(IPDAT,PKREF(i),VALPAR(IP,1:NVAL(IP))) + ENDIF + ENDDO + + ! RECOVER INFORMATION ABOUT THE CURRENT BRANCH CALCULATION + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'STATE',STATE) + CALL LCMGET(IPDAT,'REF_INDEX',REFIDX) + CALL LCMGET(IPDAT,'REF_STATE',REFSTA) + CALL LCMGET(IPDAT,'BRANCH_INDEX',BRAIDX) + + DO i=1, NVAR + + IF(BRANCH==PKEY(i)(:4)) THEN + BRAIDX=i +! IF (PKEY(i)(:4) == 'C-BO') CALL XABORT( 'STOP BRANCH') + ENDIF + ENDDO + + ! initialization of the flag: CHANGE + CHANGE=1 + 30 DO i=1, NVAR + IF(i<=BRAIDX) THEN + + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 1' + ! A NEW BRANCH TYPE MUST BE SET IF THE CURRENT VALUE OF A + ! GIVEN STATE VARIABLE IS THE LAST OF THE LIST + IF(STAIDX(i)==NVAL(i)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 2' + ! WE KEEP THE FLAG CHANGE TO 1 + CHANGE=CHANGE*1 + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 3' + ! IF THE BRANCH INDEX CORREPOND TO THE LAST "REAL" STATE + ! VARIABLE (IE THE STATE VARIABLE BEFORE BURN) + IF((BRAIDX==NVAR-1)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 4' + ! THE CHANGE FLAG MUST BE SET TO FALSE + CHANGE=0 + IF(NVAL(BRAIDX)==1) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 5' + ! EXCEPT IF THERE IS ONLY ONE VALUE FOR THE STATE VARIABLE + ! IN THIS CASE THE CHANGE FLAG IS RESET TO 1 + CHANGE=1 + ENDIF + ELSE + ! IN OTHER CASE WE CONTINUE THE CURRENT BRANCH TYPE + ! CALCULATION + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 6' + CHANGE=0 + IF(NVAL(BRAIDX)==1) THEN + ! EXCEPT IF THERE IS ONLY ONE VALUE FOR THE STATE VARIABLE + ! IN THIS CASE THE CHANGE FLAG IS RESET TO 1 + CHANGE=1 + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 7' + ENDIF + ENDIF + ENDIF + ENDIF + ENDDO + ONE_VAL=.FALSE. + + IF(CHANGE==1) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 8' + IF(NVAL(BRAIDX+1)==1 .and. (BRAIDX >.1))THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 9' + IF((BRAIDX+1)<(NVAR)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 10' + BRAIDX=BRAIDX+1 + IF(NVAL(BRAIDX)==1) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 11' + IF(BRAIDX==NVAR-1) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 12' + BRANCH_STOP=.TRUE. + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 13' + ONE_VAL=.TRUE. + ENDIF + ENDIF + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 14' + BRANCH_STOP=.TRUE. + ENDIF + ENDIF + + IF(ONE_VAL) GO TO 30 + + IF((BRAIDX+1)<(NVAR)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 15' + ! UPDATE OF THE INDEX OF THE BRANCH TYPE + BRAIDX=BRAIDX+1 + ! UPDATE OF THE BRANCH TYPE + BRANCH=PKEY(BRAIDX) (:4) + ! INITIALIZATION OF THE INDEX OF THE BRANCH TYPE + ITBRAN=1 + DO i=1,NVAR + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 16' + IF(i<=BRAIDX) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 17' + !INITIALIZATION AT THE FIRST VALUE OF STATE PARAMETERS + STATE(i)=VALPAR(i,1) + ! INITIALIZATION AT THE FIRST ORDER NUMBERS OF STATE + ! PARAMETERS + STAIDX(i)=1 + ! CASE WHERE THE REFERENCE VALUE IS THE FIRST VALUE + ! (IE WHEN NVAL(BRAIDX) = 2) + IF(i==BRAIDX) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 18' + IF(STAIDX(i)==REFIDX(i)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 19' + STAIDX(i)=2 + STATE(i)=VALPAR(i,2) + ENDIF + ENDIF + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 20' + ! INITIALIZATION AT REFERENCE VALUES OF STATE PARAMETERS + STATE(i)=VALPAR(i,REFIDX(i)) + ! INITIALIZATION AT REFERENCE ORDER NUMBERS OF STATE + ! PARAMETERS + STAIDX(i)=REFIDX(i) + ENDIF + ENDDO + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 21' + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + ! THE FLAG STOP IS SET TO FALSE (IE THE BRANCHING CALCULATION + ! MUST CONTINUE) + CALL LCMPUT(IPDAT,'STOP',1,1,0) + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 22' + BRANCH_STOP=.TRUE. + ENDIF + + IF(BRANCH_STOP) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 23' + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + ! THE FLAG STOP IS SET TO TRUE (IE THE BRANCHING CALCULATION + ! MUST STOP) + CALL LCMPUT(IPDAT,'STOP',1,1,1) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + ! THE FLAG FOR WRITTING THE GENPMAXS.INP IS SET TO 2 + CALL LCMPUT(IPDAT,'FLAG',1,1,2) + ! UPDATE OF THE GENPMAXS.INP FILE (MANY ARGUMENTS IN THIS CALL + ! ARE NOT USED IN D2PGEN) + CALL D2PGEN( IPINP, IPDAT, STAVEC, JOBTIT, FILNAM, DER, + > VERS, COM, JOBOPT, IUPS, FA_K, SFAC, + > BFAC, DEB, XESM, FC1 , FC2, FC3, + > FC4, XSC, IPRINT ) + + ENDIF + ELSE + ! update of the index of the branch type + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 24' + ITBRAN=ITBRAN+1 + ! CASE WHERE THE STATE VARIABLE VALUE CORRESPOND TO THE + ! REFERENCE STATE VALUE + IF(STATE(BRAIDX)==REFSTA(BRAIDX)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 25' + ! we skip the reference value' + STAIDX(BRAIDX)=STAIDX(BRAIDX)+1 + IF(NVAL(BRAIDX)>=1) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 26' + ! the new value for the state variable is the next in the + ! list + STATE(BRAIDX)=VALPAR(BRAIDX,STAIDX(BRAIDX)) + ENDIF + ELSE + + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 27' + ! POSITIONNING OF THE LOOP INDEX AT THE CURRENT BRANCH TYPE + ! CALCULATION + i=BRAIDX + ! DECREASE THE INDEX WHILE THE STATE VARIABLE IS BARR + DO WHILE (i>0) + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 28' + ! IF THE CURRENT VALUE OF STATE VARIABLE IS THE LAST OF THE + ! LIST + IF(STAIDX(i)==NVAL(i)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 29' + IF(NVAL(i)>2) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 30' + ! RESET OF THE ORDER NUMBERS FOR THE STATE VALUE + STAIDX(i)=1 + ! ATTRIBUTION OF THE FIRST VALUE OF THE LIST TO THE STATE + STATE(i)=VALPAR(i,STAIDX(i)) + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 31' + j=i-1 + ! INCREASE THE ORDER NUMBERS OF THE VALUE OF THIS STATE + STAIDX(j)=STAIDX(j)+1 + ! ATTRIBUTION OF THE STATE(J) VALUES + STATE(j)=VALPAR(j,STAIDX(j)) + ! WHILE J>0 (IE THE STATE VARIABLE EXISTS) + DO WHILE (STAIDX(j)>NVAL(j).and.j>0) + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 32' + ! IF THE STATE VARAIBLE IS NOT BARR: INITIALIZATION OF THE + ! ORDER NUMBERS + IF(j>1)STAIDX(j)=1 + ! IF THE STATE VARAIBLE IS NOT BARR: ATTRIBUTION OF THE + ! STATE VARIABLE VALUE + IF(j>1)STATE(j)=VALPAR(j,STAIDX(j)) + ! DECREASE THE J PARAMETERS + j=j-1 + ! IF THE STATE PRAMETER EXISTS: UPDATE THE ORDER NUMBERS + IF(j>0)STAIDX(j)=STAIDX(j)+1 + ! IF THE STATE PRAMETER EXISTS: ATTRIBUTION OF THE STATE + ! VARIABLE VALUE + IF(j>0)STATE(j)=VALPAR(j,STAIDX(j)) + ! EXIT OF THE IF CONDITION + ENDDO + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 33' + EXIT + ENDIF + ELSE IF(NVAL(i)==2) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 34' + IF(PKEY(i).NE.BARNAM)THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 35' + IF(STAIDX(i-1).NE.NVAL(i-1)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 36' + j=i-1 + ! INCREASE THE ORDER NUMBERS OF THE VALUE OF THIS STATE + STAIDX(j)=STAIDX(j)+1 + ! ATTRIBUTION OF THE STATE(J) VALUES + STATE(j)=VALPAR(j,STAIDX(j)) + EXIT + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 37' + ! IF THE BRANCH TYPE IS BARR OR THE CURRENT STATE VALUE I$ + STAIDX(i)=STAIDX(i)+1 + IF(i>1)STAIDX(i-1)=1 + STATE(i)=VALPAR(i,STAIDX(i)) + IF(i>1)STATE(i-1)=VALPAR(i-1,STAIDX(i-1)) + EXIT + ENDIF + ELSE + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 38' + IF(STAIDX(i).NE.NVAL(i)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 39' + j=i + ! INCREASE THE ORDER NUMBERS OF THE VALUE OF THIS STATE + STAIDX(j)=STAIDX(j)+1 + ! ATTRIBUTION OF THE STATE(J) VALUES + STATE(j)=VALPAR(j,STAIDX(j)) + EXIT + ENDIF + ENDIF + ELSE + + ! IF THE BRANCH TYPE IS BARR OR THE CURRENT STATE VALUE IS + ! NOT THE LAST OF THE LIST + STAIDX(i)=STAIDX(i)+1 + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 40' + IF((STAIDX(i)==REFIDX(i)).and.(BRANCH.NE.BARNAM)) THEN + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 41' + ! IF IT IS THE REFERENCE VALUE BUT NOT THE BARR REF VALUE + ! UPDATE THE ORDER NUMBERS OF STATE VARIABLE VALUE + IF(i==BRAIDX) STAIDX(i)=STAIDX(i)+1 + ENDIF + ! ATTRIBUTION OF THE STATE VARIABLE VALUE + STATE(i)=VALPAR(i,STAIDX(i)) + EXIT + ENDIF + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 42' + i=i-1 + ENDDO + ENDIF + ENDIF + IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 43' + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IF((BRANCH .NE.BARNAM(:4)).and.NVAL(BRAIDX)==1) THEN + CALL LCMPUT(IPDAT,'PRINT',1,1,0) + ELSE + CALL LCMPUT(IPDAT,'PRINT',1,1,1) + ENDIF + + CALL LCMPTC(IPDAT,'BRANCH',4,BRANCH) + CALL LCMPUT(IPDAT,'BRANCH_IT',1,1,ITBRAN) + CALL LCMPUT(IPDAT,'STATE',NVAR,2,STATE) + CALL LCMPUT(IPDAT,'STATE_INDEX',NVAR,1,STAIDX) + CALL LCMPUT(IPDAT,'BRANCH_INDEX',1,1,BRAIDX) + + IF(IPRINT > 0) THEN + WRITE(6,*) + WRITE(6,*) "**** SELECTING THE NEXT BRANCH CALCULATION ****" + WRITE(6,*) "****** NEXT BRANCH CHARACTERISTICS *****" + WRITE(6,*) "BRANCH TYPE :",BRANCH + WRITE(6,*) "BRANCH INDEX :",BRAIDX + WRITE(6,*) "BRANCH ITERATION :",ITBRAN + WRITE(6,*) "STATE VARIABLE NAME :",PKEY + WRITE(6,*) "BRANCH STATE VALUES :",STATE + WRITE(6,*) "BRANCH STATE INDEX :",STAIDX + ENDIF + CALL LCMSIX(IPDAT,' ',0) + + END diff --git a/Donjon/src/D2PSOI.f b/Donjon/src/D2PSOI.f new file mode 100644 index 0000000..8a7a14d --- /dev/null +++ b/Donjon/src/D2PSOI.f @@ -0,0 +1,42 @@ +*DECK D2PSOI + SUBROUTINE D2PSOI(TAB,DIMTAB) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Sort D2PSOR state variable integer array to match GENPMAXS order, in +* ascendent order +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* TAB vector of rank index of state variables +* DIMTAB dimension of TAB +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER DIMTAB + INTEGER TAB(DIMTAB) +*---- +* LOCAL VARIABLES +*---- + INTEGER Rtmp + INTEGER :: I, J + + DO I = 2, DIMTAB + Rtmp = TAB(I) + DO J = I-1, 1, -1 + IF (Rtmp < TAB(J)) THEN + TAB(J+1) = TAB(J) + ELSE + EXIT + ENDIF + ENDDO + TAB(J+1) = Rtmp + ENDDO + RETURN + END diff --git a/Donjon/src/D2PSOR.f b/Donjon/src/D2PSOR.f new file mode 100644 index 0000000..f56f49d --- /dev/null +++ b/Donjon/src/D2PSOR.f @@ -0,0 +1,42 @@ +*DECK D2PSOR + SUBROUTINE D2PSOR(TAB,DIMTAB) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Sort D2PSOR state variable real array to match GENPMAXS order, in +* ascendent order +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* TAB vector of rank index of state variables +* DIMTAB dimension of TAB +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER DIMTAB + REAL TAB(DIMTAB) +*---- +* LOCAL VARIABLES +*---- + REAL Rtmp + INTEGER :: I, J + + DO I = 2, DIMTAB + Rtmp = TAB(I) + DO J = I-1, 1, -1 + IF (Rtmp < TAB(J)) THEN + TAB(J+1) = TAB(J) + ELSE + EXIT + ENDIF + ENDDO + TAB(J+1) = Rtmp + ENDDO + RETURN + END diff --git a/Donjon/src/D2PTH.f b/Donjon/src/D2PTH.f new file mode 100644 index 0000000..ffb6a46 --- /dev/null +++ b/Donjon/src/D2PTH.f @@ -0,0 +1,268 @@ +*DECK D2PTH + SUBROUTINE D2PTH( IPDAT, IPMIC , IPRINT, NBU, NGP, NBMIX, + > NFISS, NDEL, NVAR, STAIDX,JOBOPT, FLAG) + +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover T/H inveariant data block and store in INFO/TH_DATA/ +* WARNING: These data are extracted only if the corresponding flag is +* set to T in the GENPMAXS_INP/JOBOPT vector. +* NB 1 : The data for T/H are recovered from the reference state, the +* branching calculation not includes the TH informations. +* NB 3 : The Helios format cannot recover the CHID (delay neutron +* fission spectrum), it is fixed to default values even if JOBOPT(6)=T. +* NB 4 : The Helios format cannot recover the Decay Heat Data (DBET and +* DLAM in GenPMAXS), it is fixed to default values even if JOBOPT(14)=T. +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of the INFO data block +* IPMIC address of the MICROLIB object +* IPPRINT control the printing on screen +* NGP number of energy groups +* NBU number of burnup point in IPSAP +* NVAR number of state parameters in INFO data block +* NDEL number of delaued neutron groups +* NBMIX number of mixtrures in IPSAP +* NFISS number of fissile isotopes +* STAIDX index of state variables +* FLAG End of a bran calculation (=-1: branch for yields calculation) +* +*Parameters: +* IPRINT +* JOBOPT +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPMIC + INTEGER IPRINT,NVAR,NBU, NBMIX,NGP + INTEGER NFISS,NDEL + INTEGER STAIDX(NVAR) + INTEGER FLAG +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMIC,KPMIC,IPTH,KPTH + PARAMETER(NSTATE=40) + INTEGER DSTATE(NSTATE) + INTEGER NDFI,NDFP,MR,MI,MI_REAL,ITYLCM + INTEGER :: I_PF = 0 + INTEGER :: iso = 1 + REAL YLDI,YLDXe,YLDPm + REAL CHI(NFISS,NGP) + REAL OVERV(NGP),BURN(NBU), STATE(NVAR) + REAL FLX(NGP),NUSIGF_D(NDEL,NGP),NUSIGF(NGP) + REAL BETA_D(NDEL,NFISS),LAMBDA_D(NDEL,NFISS) + REAL NUM(NDEL) + REAL :: DEN = 0.0 + CHARACTER*12 ISOTOPES(4) + CHARACTER*1 JOBOPT(16) + CHARACTER*8 NUSID + CHARACTER*3 YLDOPT + REAL YLDFIX(3) + + + REAL, ALLOCATABLE, DIMENSION(:) :: DEPLETE_ENER,DEPLETE_DECA + REAL, ALLOCATABLE, DIMENSION(:) :: FISSIONYIELD + CHARACTER(len=12),ALLOCATABLE, DIMENSION(:) :: ISOTOPERNAME + CHARACTER(len=12),ALLOCATABLE, DIMENSION(:) :: ISOTOPESDEPL,PF + + IF(IPRINT > 1) THEN + WRITE(6,*) + WRITE(6,*) "**************************************************" + WRITE(6,*) "* T/H INVARIANT BLOCK *" + WRITE(6,*) "**************************************************" + WRITE(6,*) + ENDIF + + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + + IF(JOBOPT(13)=='T') CALL LCMGET(IPMIC,'LAMBDA-D',LAMBDA_D) + + + + JPMIC=LCMGID(IPMIC,'GROUP') + + IF(NBMIX.NE.1) THEN + CALL XABORT('@D2PTH: MORE THAN ONE MIXTURE IN SAPHYB') + ENDIF + IF(NFISS.NE.1) THEN + CALL XABORT('@D2PTH: MORE THAN 1 FISSILE ISOTOPE IN MACROLIB') + ENDIF + + DO IGR=1,NGP + KPMIC=LCMGIL(JPMIC,IGR) + IF(JOBOPT(7)=='T')CALL LCMGET(KPMIC,'OVERV',OVERV(IGR)) + IF(JOBOPT(5)=='T')CALL LCMGET(KPMIC,'CHI',CHI(1:NFISS,IGR)) + IF(JOBOPT(12)=='T') THEN + CALL LCMGET(KPMIC,'NUSIGF',NUSIGF(IGR)) + CALL LCMGET(KPMIC,'FLUX-INTG',FLX(IGR)) + DO ND=1,NDEL + WRITE(NUSID,' (A6, I2.2)') 'NUSIGF', ND + CALL LCMGET(KPMIC,NUSID,NUSIGF_D(ND,IGR)) + ENDDO + ENDIF + ENDDO + + IF(JOBOPT(12)=='T') THEN + DO ND=1,NDEL + + DEN=0. + NUM(ND)=0.0 + DO IGR= 1,NGP + DEN=DEN+NUSIGF(IGR)*FLX(IGR) + NUM(ND)=NUM(ND)+NUSIGF_D(ND,IGR)*FLX(IGR) + ENDDO + BETA_D(ND,NFISS)=NUM(ND)/DEN + ENDDO +! CALL XABORT ('STOP TEST') + ENDIF + IF(JOBOPT(9)=='T') THEN + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGTC(IPDAT,'YLD_OPT',3,YLDOPT) + + CALL LCMGET(IPDAT,'YLD_FIX',YLDFIX) + + IF ((YLDOPT=='REF').OR.(YLDOPT=='MAN')) THEN + CALL LCMSIX(IPMIC,' ',0) + CALL LCMLEN(IPMIC,'ISOTOPESDENS',MI_REAL,ITYLCM) + CALL LCMLEN(IPMIC,'ISOTOPERNAME',MI,ITYLCM) + ALLOCATE (ISOTOPERNAME(MI)) + CALL LCMGTC(IPMIC,'ISOTOPERNAME',12,MI,ISOTOPERNAME) + CALL LCMLEN(IPMIC,'DEPL-CHAIN',ILONG,ITYLCM) + IF (ILONG.EQ.0) THEN + YLDI=YLDFIX(1) + YLDXe=YLDFIX(2) + YLDPm=YLDFIX(3) + WRITE(6,*)"@D2PTH : NO RECORD DEPL-CHAIN IN SAP/MCO :" + WRITE(6,*)"=> DEFAULT VALUES FOR FISSION YLDS CONSIDERED" + ELSE + CALL LCMSIX(IPMIC,'DEPL-CHAIN',1) + CALL LCMGET(IPMIC,'STATE-VECTOR',DSTATE) + + NDEPL = DSTATE(1) + NDFI = DSTATE(2) + NDFP = DSTATE(3) + MR = DSTATE(8) + + ALLOCATE (FISSIONYIELD(NDFI*NDFP), DEPLETE_ENER(NDEPL*MR)) + ALLOCATE (ISOTOPESDEPL(NDEPL), PF(NDEPL),DEPLETE_DECA(NDEPL)) + CALL LCMGET(IPMIC,'DEPLETE-DECA',DEPLETE_DECA) + CALL LCMGET(IPMIC,'DEPLETE-ENER',DEPLETE_ENER) + CALL LCMGTC(IPMIC,'ISOTOPESDEPL',12,NDEPL,ISOTOPESDEPL) + + IF ((NDFI.EQ.0 ).OR. (NDFP .EQ. 0)) THEN + WRITE(6,*) "@D2PTH : NUMBER OF DIRECT FISSILE ISOTOPES", + 1 " OR FISSION FRAGMENT IS ZERO" + CALL XABORT('=> PLEASE TURN OFF THE LYLD FLAG IN JOB_OPT' + > //' OR USE THE "YLD FIX" OPTION' ) + ENDIF + CALL LCMGET(IPMIC,'FISSIONYIELD',FISSIONYIELD) + + + I_PF=0 + iso=1 + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + CALL LCMGET(IPDAT,'BURN',BURN) + CALL LCMSIX (IPDAT,'ISOTOPES',1) + CALL LCMGTC (IPDAT,'XE135',12,ISOTOPES(1)) + CALL LCMGTC (IPDAT,'SM149',12,ISOTOPES(2)) + CALL LCMGTC (IPDAT,'I135',12,ISOTOPES(3)) + CALL LCMGTC (IPDAT,'PM149',12,ISOTOPES(4)) + + DO iso=1, NDEPL + IF(INDEX(ISOTOPESDEPL(iso), 'MACR')==0) THEN + + I_PF=I_PF+1 + PF(I_PF)=ISOTOPESDEPL(iso) + IF(PF(I_PF)==ISOTOPES(3)) YLDI=FISSIONYIELD(I_PF) + IF(PF(I_PF)==ISOTOPES(1)) YLDXe=FISSIONYIELD(I_PF) + IF(PF(I_PF)==ISOTOPES(4)) YLDPm=FISSIONYIELD(I_PF) + ENDIF + ENDDO + + IF(IPRINT > 1) THEN + WRITE(6,*)"********* STATE VECTOR INFORMATION *************" + WRITE(6,*) + WRITE(6,*)"Number of isotopes (MI) : ",MI + WRITE(6,*)"Number of groups (NGP) : ",NGP + WRITE(6,*)"Number of fissile isotopes (NFISS) : ",NFISS + WRITE(6,*)"Number of delayed neutron groups (NDEL) : ",NDEL + WRITE(6,*)"Number of depleted isotopes (NDEPL) : ",NDEPL + WRITE(6,*)"Number of direct fissile isotopes (NDFI) : ",NDFI + WRITE(6,*)"Number of fission fragments (NDFP) : ",NDFP + WRITE(6,*)"Maximum number of depleting reactions(MR): ",MR + WRITE(6,*) + WRITE(6,*)"**************** ISOTOPE NAME ******************" + WRITE(6,*) + WRITE(6,'(10A12)')ISOTOPERNAME(1:MI_REAL) + WRITE(6,*) + ENDIF + DEALLOCATE (ISOTOPERNAME) + DEALLOCATE (FISSIONYIELD,ISOTOPESDEPL,PF) + DEALLOCATE (DEPLETE_ENER,DEPLETE_DECA) + ENDIF + ELSE IF (YLDOPT=='FIX') THEN + YLDI=YLDFIX(1) + YLDXe=YLDFIX(2) + YLDPm=YLDFIX(3) + ENDIF + ENDIF + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'STATE',STATE) + CALL LCMSIX(IPDAT,' ',0) + + IF(STAIDX(NVAR)==1) THEN + IPTH=LCMLID(IPDAT,'TH_DATA',NBU) + ELSE + IPTH=LCMGID(IPDAT,'TH_DATA') + ENDIF + + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + + IF(JOBOPT(13)=='T') THEN + CALL LCMPUT(KPTH,'LAMBDA',NDEL*NFISS,2,LAMBDA_D) + ENDIF + IF(JOBOPT(9)=='T') THEN + IF((YLDOPT.EQ.'FIX').OR.(YLDOPT.EQ.'REF')) THEN + CALL LCMPUT(KPTH,'YLDPm',1,2,YLDPm) + CALL LCMPUT(KPTH,'YLDXe',1,2,YLDXe) + CALL LCMPUT(KPTH,'YLDI',1,2,YLDI) + ELSE IF ((YLDOPT.EQ.'MAN').AND.(FLAG.EQ.-1)) THEN + CALL LCMPUT(KPTH,'YLDPm',1,2,YLDPm) + CALL LCMPUT(KPTH,'YLDXe',1,2,YLDXe) + CALL LCMPUT(KPTH,'YLDI',1,2,YLDI) + ENDIF + ENDIF + + IF(JOBOPT(7)=='T')CALL LCMPUT(KPTH,'OVERV',NGP,2,OVERV) + IF(JOBOPT(5)=='T')CALL LCMPUT(KPTH,'CHI',NFISS*NGP,2,CHI) + IF(JOBOPT(12)=='T')CALL LCMPUT(KPTH,'BETA',NDEL*NFISS,2,BETA_D) + IF(IPRINT > 1) THEN + WRITE(6,*) "**************** T/H INFORMATION *****************" + IF(JOBOPT(5)=='T') WRITE(6,*) "CHI(NFISS,NGP) :",CHI + IF(JOBOPT(7)=='T') WRITE(6,*) "OVERV(NGP) :",OVERV + IF(JOBOPT(13)=='T')WRITE(6,*) "LAMBDA(NDEL,NFISS) :",LAMBDA_D + IF(JOBOPT(12)=='T')WRITE(6,*) "BETA(NDEL,NFISS) :",BETA_D + IF(JOBOPT(9)=='T') WRITE(6,*) "PM-149 YIELD :",YLDPm + IF(JOBOPT(9)=='T') WRITE(6,*) "XE-135 YIELD :",YLDXe + IF(JOBOPT(9)=='T') WRITE(6,*) "I-135 YIELD :",YLDI + WRITE(6,*) + ENDIF + + END diff --git a/Donjon/src/D2PXS.f b/Donjon/src/D2PXS.f new file mode 100644 index 0000000..48db05b --- /dev/null +++ b/Donjon/src/D2PXS.f @@ -0,0 +1,295 @@ +*DECK D2PXS + SUBROUTINE D2PXS (IPDAT,IPMIC,IPSAP,STAVEC,SIGNAT,MIXDIR, + > JOBOPT,IPRINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover cross sections from a microlib object and write cross +* sections for one branch at a fixed burnup point in the INFO data +* block. +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of info data block +* IPSAP address of the saphyb object +* IPMIC address of the microlib object +* STAVEC various parameters associated with the IPDAT structure +* SIGNAT signature of the object containing cross sections +* MIXDIR directory that contains homogeneous mixture information +* IPRINT control the printing on screen +* +*Parameters: +* JOBOPT +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPMIC,IPSAP + INTEGER STAVEC(40),IPRINT + CHARACTER*12 SIGNAT,MIXDIR +*---- +* LOCAL VARIABLES +*---- + ! INDEX OF CURRENT VALUE FOR EACH STATE VARIABLES + PARAMETER(NSTATE=40) + INTEGER STAIDX (STAVEC(2)),ISTATE(NSTATE) + INTEGER DIMSAP(50) + INTEGER ITBRA,NSF,ITR + INTEGER ::NREA = 0 + INTEGER :: NISO = 0 + INTEGER ::NMIL = 0 + INTEGER ::NBISO = 0 + INTEGER ::NANI = 0 + INTEGER ::NFISS = 0 + INTEGER :: NADD = 0 + INTEGER :: NBMIX = 0 + INTEGER :: NMAC = 0 + INTEGER :: NADRX = 0 + INTEGER :: NPAR = 0 + INTEGER :: NDEL = 0 + INTEGER :: ISPH = 0 + ! INDICATES THE END OF A BRANCH CALCULATION (REW=1), AND A + ! DEFAULT MESHING (GRID) + INTEGER REW,GRID + ! NUMBER OF STATES VARIABLES + INTEGER NVAR + ! NUMBER OF BURNUP POINTS + INTEGER NBU,NGP + INTEGER :: NADF = 1 + INTEGER :: NCDF = 1 + INTEGER :: NGFF = 1 + INTEGER :: NPIN = 1 + INTEGER :: NTYPE = 1 + INTEGER FLAG + INTEGER ICOR + REAL STATE(STAVEC(2)),BURN(STAVEC(4)),REFSTA(STAVEC(2)-1) + ! DATSRC BLOCK OF INFO/GENPMAXS DIRECTORY + REAL DATSRC(5),FLUX(STAVEC(1)) + ! STATE VARIABLE NAMES + CHARACTER(len=12) STAVAR(STAVEC(2)) + CHARACTER JOBOPT(16) + + CHARACTER*4 BRANCH + CHARACTER*3 ADF_T,CDF_T,GFF_T + LOGICAL LABS(3),SCAT + LOGICAL :: LADF = .FALSE. + LOGICAL :: LCDF = .FALSE. + LOGICAL :: LGFF = .FALSE. + LOGICAL :: LXES = .FALSE. + LOGICAL :: LDET = .FALSE. + LOGICAL :: LTH = .FALSE. + LOGICAL :: LCOR = .FALSE. + + + ! INITIALIZATION OF PARAMETERS + NVAR=STAVEC(2) + NBU=STAVEC(4) + GRID=STAVEC(5) + NGP=STAVEC(1) + NSF=STAVEC(11) + ICOR=STAVEC(22) + + ! RECOVER INFORMATION FROM INFO date block + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'GENPMAXS_INP',1) + CALL LCMGET(IPDAT,'FLAG',FLAG) + CALL LCMGET(IPDAT,'DAT_SRC',DATSRC) + + + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'SAPHYB_INFO',1) + + IF (ICOR>0) LCOR=.TRUE. + IF(JOBOPT(1)=='T') THEN + CALL LCMGTC(IPDAT,'ADF_TYPE',3,ADF_T) + LADF = .TRUE. + IF((ADF_T.EQ.'SEL').OR.(ADF_T.EQ.'GET')) THEN + STAVEC(13)=NSF + STAVEC(14)=1 + ENDIF + IF((ADF_T.EQ. 'DRA').OR.(ADF_T.EQ. 'GEN'))THEN + STAVEC(13)=1 + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMSIX(IPMIC,'ADF',1) + CALL LCMGET(IPMIC,'NTYPE',STAVEC(14)) + ENDIF + NADF=STAVEC(13) + NTYPE=STAVEC(14) + ENDIF + + IF(JOBOPT(2)=='T') LXES = .TRUE. + IF(JOBOPT(8)=='T') LDET = .TRUE. + IF((JOBOPT(5)=='T').OR.(JOBOPT(7)=='T').OR. + > (JOBOPT(9)=='T').OR.(JOBOPT(13)=='T')) THEN + LTH =.TRUE. + ENDIF + + IF(JOBOPT(10)=='T') THEN + CALL LCMGTC(IPDAT,'CDF_TYPE',3,CDF_T) + LCDF = .TRUE. + IF(CDF_T.EQ. 'DRA')THEN + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMSIX(IPMIC,'ADF',1) + CALL LCMGET(IPMIC,'NTYPE',STAVEC(14)) + ENDIF + NCDF=STAVEC(15) + NTYPE=STAVEC(14) + ENDIF + IF(JOBOPT(11)=='T') THEN + CALL LCMGTC(IPDAT,'GFF_TYPE',3,GFF_T) + LGFF = .TRUE. + NGFF=STAVEC(16) + NPIN=STAVEC(17) + ENDIF + + IF(DATSRC(3).NE.0.0) THEN + CALL LCMGET(IPDAT,'LABS',LABS) + CALL LCMGET(IPDAT,'SCAT',SCAT) + ENDIF + + CALL LCMGTC(IPDAT,'STATE_VAR',12,NVAR,STAVAR) + CALL LCMGET(IPDAT,'BURN',BURN) + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'REWIND',REW) + CALL LCMGTC(IPDAT,'BRANCH',4,BRANCH) + CALL LCMGET(IPDAT,'BRANCH_IT',ITBRA) + + CALL LCMGET(IPDAT,'STATE_INDEX',STAIDX) + CALL LCMGET(IPDAT,'STATE',STATE) + CALL LCMSIX(IPMIC,' ',0) + CALL LCMGET(IPMIC,'STATE-VECTOR',ISTATE) + + NBISO=ISTATE(2) ! NUMBER OF ISOTOPES + NDEL=ISTATE(19) ! NUMBER OF DELAYED NEUTRON GROUPS + + IF(NDEL.NE.STAVEC(7)) THEN + WRITE(6,*) "@D2PXS: ERROR IN NUMBER OF DELAYED NEUTRON GROUPS" + WRITE(6,*) "THE NUMBER OF DELAYED NEUTRON GROUPS IN SAP (", + 1 STAVEC(7),") IS DIFFERENT FROM MICROLIB (",NDEL,")" + CALL XABORT('@D2PXS: DELAYED NEUTRON DATA ERROR') + ENDIF + + ISTATE(:NSTATE)=0 + CALL LCMSIX(IPMIC,' ',0) + CALL LCMSIX(IPMIC,'MACROLIB',1) + CALL LCMGET(IPMIC,'STATE-VECTOR',ISTATE) + + NBMIX=ISTATE(2) ! NUMBER OF MIXTURESS + NANI=ISTATE(3) ! SCATTERING ANISOTROPY + NADD=ISTATE(5) ! NUMBER OF ADDITIONAL CROSS SECTIONS + NFISS=ISTATE(4) ! NUMBER OF FISSILE ISOTOPES + ITR=ISTATE(6) ! TRANSPORT CORRECTION OTPION + NED=ISTATE(13) ! NUMBER OF P0 ADDITIONAL XS + ISPH=ISTATE(14) + + IF(IPRINT > 0) THEN + WRITE(6,*) + WRITE(6,*) "****** BRANCH CHARACTERISTICS ******" + WRITE(6,*) "BRANCH TYPE :",BRANCH + WRITE(6,*) "BRANCH INDEX :",ITBRA + WRITE(6,*) "STATE VARIABLE NAME :",STAVAR + WRITE(6,*) "BRANCH STATE VALUES :",STATE + ENDIF + + IF(DATSRC(3)==0.0) THEN + CALL D2PRFL( IPDAT, IPMIC , IPRINT, NBU, NGP, NBMIX, + > NANI, NVAR, STAIDX, LADF, NADF, NTYPE) + ELSE IF(DATSRC(3) == 1.0) THEN + ! CASE FOR FUEL CROSS SECTIONS + CALL LCMSIX(IPSAP,' ',0) + DIMSAP(:50)=0 + IF (SIGNAT .EQ. 'L_SAPHYB') THEN + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) ! recover DIMSAP info + NREA=DIMSAP(4) ! NUMBER OF REACTIONS + NISO=DIMSAP(5) ! NUMBER OF PARTICULARIZED ISOTOPES + NMAC=DIMSAP(6) ! NUMBER OF MACROSCOPIC SETS + NMIL=DIMSAP(7) ! NUMBER OF MIXTURES + NPAR=DIMSAP(8) ! NUMBER OF STATE VARIABLE IN SAPHYB + NADRX=DIMSAP(18) ! CONCERN CROSS SECTIONS + ! (INCLUDING FLUE AND TIME) + ELSE + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,MIXDIR,1) + CALL LCMGET(IPSAP,'STATE-VECTOR',DIMSAP) + NMIL = DIMSAP(1) + ENDIF + IF(STAVEC(1).NE.ISTATE(1)) THEN + CALL XABORT("@D2PBRA: INCOHERENT NUMBER OF ENERGY GROUPS ") + ENDIF + + + IF(NMIL.NE.NBMIX) THEN + CALL XABORT("@D2PBRA: DIFFERENT NUMBER OF MIX ") + ENDIF + + ! RECOVER MACROLIB CROSS SECTIONS FROM SAPHYB + CALL D2PMAC( IPDAT, IPMIC , IPRINT, NBU, NGP, NBMIX, + > NADD, NANI, NVAR, STAIDX, LADF, NADF, + > NTYPE, LCDF, NCDF, LGFF, NGFF, NPIN, + > FLUX ) + + IF(LTH) THEN + ICOR=STAVEC(22) + ! RECOVER THE T/H INVARIANT BLOCK (OPTIONAL IN PMAXS FILES) + CALL D2PTH( IPDAT, IPMIC , IPRINT, NBU, NGP, NBMIX, + > NFISS, NDEL, NVAR, STAIDX,JOBOPT, FLAG) + ENDIF + + IF((LXES).OR.(LDET).OR.(LCOR)) THEN + ! RECOVER MICROSCOPIC CROSS SECTIONS FROM SAPHYB + CALL D2PMIC ( IPDAT, IPMIC , IPRINT, NGP, NBMIX, NBISO, + > NED, NVAR, STAIDX, LXES, LDET, LCOR, + > FLUX ) + ENDIF + + IF((GRID<2).and. (SIGNAT .EQ. 'L_SAPHYB')) THEN + + ! RECOVER THE DIVERS DIRECTORY OF SAPHYB + CALL D2PDIV( IPDAT, IPSAP , IPRINT, NGP, NBU, NVAR, + > GRID, NPAR, NREA, NISO, NMAC, NMIL, + > NANI, NADRX, STAIDX, STATE, STAVAR, NSF, + > LABS, SCAT, LADF ) + ENDIF + + + ENDIF + + IF(REW.EQ.NBU) THEN + ! REINITIALIZATION OF INDEX + IF (FLAG.EQ.-1) THEN + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMGET(IPDAT,'REF_STATE',REFSTA) + STATE(1:NVAR-1)=REFSTA(:) + FLAG=0 + CALL LCMPUT(IPDAT,'FLAG',1,1,FLAG) + ENDIF + STAIDX(NVAR)= 1 + REW = 1 + STATE(NVAR)=BURN(1) + + + ELSE + ! UPDATE THE INDEX FOR THE CALCULATION OF THE NEXT BRANCH + REW=0 + STAIDX(NVAR)= STAIDX(NVAR)+1 + REW = STAIDX(NVAR) + STATE(NVAR)=BURN(STAIDX(NVAR)) + ENDIF + + ! STORE NEW VALUES OF BRANCH CALCULATION + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + CALL LCMPUT(IPDAT,'REWIND',1,1,REW) + CALL LCMPUT(IPDAT,'STATE',NVAR,2,STATE) + CALL LCMPUT(IPDAT,'STATE_INDEX',NVAR,1,STAIDX) + END diff --git a/Donjon/src/D2PXSA.f b/Donjon/src/D2PXSA.f new file mode 100644 index 0000000..316188c --- /dev/null +++ b/Donjon/src/D2PXSA.f @@ -0,0 +1,315 @@ +*DECK D2PXSA + SUBROUTINE D2PXSA(IPDAT,IPSAP,ICAL,IPRINT,NGP,NREA,NISO,NMAC, + 1 NMIL,NANI,NVAR,NADRX,STAIDX,B2,ADF_T,NSF,LABS,SCAT,LADF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover FISSION cross sections of an elementary calculation and store +* in INFO/BRANCH_INFO/MACROLIB_XS/SFI. +* WARNING: the GET_SFI_XS subroutine cannot recover FISSION XS in the +* case where cross sections are ineterpolated by the SCR: module +* +*Author(s): +* J. Taforeau +* +*Parameters: input +* IPDAT address of the INFO data block +* ICAL number of the elementary calculation in which fission cross +* sections is to be recovered +* IPSAP address of the Saphyb object +* NGP number of group energies in Saphyb +* NREA number of reactions in Saphyb +* NISO number of isotopes in Saphyb +* NMAC number of macros in Saphyb +* NMIL number of mixtures in Saphyb +* NANI number of Legendre orders in Saphyb +* NADRX concerne cross section vector (ADRX) +* STAIDX index of current branch state values +* NSF number of elements of the tranfert matrix +* LABS content of absorption xs LABS(1) : ABS XS = TOTAL - SIGS00 ; +* LABS(2) abs xs recovered from sap ; LABS (3) abs xs recovered +* from SAP minus excess xs + +*Parameters: output +* SFI fission cross sections of the current BRANCH: +* INFO/BRANCH_INFO/MACROLIB_XS/SFI +* +*Parameters: +* IPRINT +* NVAR +* B2 +* ADF_T +* SCAT +* LADF +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDAT,IPSAP + INTEGER ICAL,IPRINT,NGP,NREA,NISO,NMAC, NMIL,NANI,NVAR, + 1 STAIDX(NVAR),NSF,NADRX + REAL B2 + CHARACTER*3 ADF_T + LOGICAL LABS(3),SCAT,LADF +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPTH,KPTH + ! order numbers of current : reaction , isotope, macro + INTEGER iprf,isot,imil,imac,iabs,iexc,idif,itra + INTEGER idifc + INTEGER ani, il, nj, ii, it, i1,i2, j1, j2, iadc,g + INTEGER ND + ! location of excess cross sections in RDATAX + INTEGER ADR_EXC + ! location of absorption cross sections in RDATAX + INTEGER ADR_ABS + ! location of profil cross sections in RDATAX + INTEGER ADR_PRF + ! location of TRANSFERT cross sections in RDATAX + INTEGER ADR_TRA + INTEGER ADR_DIF + ! number of group energies in Saphyb + INTEGER NG + ! type of data recovered from GANLIB subroutines + INTEGER ITYLCM + ! name of : isotopes, macros + CHARACTER(LEN=8) NOM_MAC(NMAC) + ! name of reactions + CHARACTER(LEN=10) NOM_REA(NREA) + ! residual macro + INTEGER RESMAC(NMIL) + ! 3rd index of ADRX + INTEGER ISADRX(NMIL) + ! number of elements in RADATAX + INTEGER LENGDX(NMIL) + ! name of total macro + INTEGER TOTMAC(NMIL) + ! number of elements in IDATAP + INTEGER LENGDP(NMIL) + ! contains the adress of the 1st element in RDATAX + INTEGER ADRX (NREA+2,NISO+NMAC,NADRX) + REAL ABSORPTION(NGP) + REAL TRANSFERT (NANI,NGP*NGP) + REAL DIFC(NGP) + CHARACTER(LEN=12) CALDIR + INTEGER fagg, lagg,fdgg,wgal,fag,lag ! CF SAPHTOOL MANUAL + INTEGER fdg(NGP),adr(NGP+1) ! CF SAPHTOOL MANUAL + INTEGER NSCAT + REAL CURRN(NSF,NGP,2) + REAL SRFLX(NSF,NGP) + REAL ZAFLX(NMIL,NGP) + DOUBLE PRECISION RPAR (6,NSF) + INTEGER IPAR (3,NSF) + REAL ADF(NGP,NSF,10) + REAL SCAT_MAT(NGP*NGP) + ! transfert matrix + INTEGER ,ALLOCATABLE, DIMENSION(:) :: IDATAP + ! contains values of cross sections of an elementary calculation + REAL,ALLOCATABLE, DIMENSION(:) :: RDATAX + + TRANSFERT(:,:) = 0 + + WRITE(CALDIR,'("calc", I8)') ICAL + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,'contenu',1) + IF(NMIL.NE.1) THEN + ! the number of mixtures must be equal to one for converting + ! Saphyb into PMAXS format + CALL XABORT('@D2P: MORE THAN ONE MIXTRURE IN SAPHYB') + ENDIF + CALL LCMGTC(IPSAP,'NOMREA',10,NREA,NOM_REA) + CALL LCMGTC(IPSAP,'NOMMAC',8,NMAC,NOM_MAC) + CALL LCMGET(IPSAP,'RESMAC',RESMAC) + CALL LCMGET(IPSAP,'TOTMAC',TOTMAC) + CALL LCMSIX(IPSAP,' ',0) + + CALL LCMSIX(IPSAP,'adresses',1) + CALL LCMGET(IPSAP,'ADRX',ADRX) + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,CALDIR,1) + CALL LCMSIX(IPSAP,'info',1) + CALL LCMGET(IPSAP,'ISADRX',ISADRX) + CALL LCMGET(IPSAP,'LENGDX',LENGDX) + CALL LCMGET(IPSAP,'LENGDP',LENGDP) + ALLOCATE (RDATAX(LENGDX(1)),IDATAP(LENGDP(1))) + imac=0 + IF(RESMAC(1).NE.0) THEN + imac=RESMAC(1) ! recover name of residual macro + ELSE IF(TOTMAC(1).NE.0) THEN + imac=TOTMAC(1) ! recover name of total macro + ELSE + CALL XABORT('@D2P: NO MACRO DEFINED') + ENDIF + isot=NISO+imac ! we interest in macro fission cross sections + imil=1 ! set the mixtures number to 1 + iprf=0 + iexc=0 + iabs=0 + idif=0 + iadc=0 + itra=0 + idifc=0 + !TEST HFATC + NSCAT=1 + + DO ir=1,NREA + ! store the order numbers of PROFIL matrix + IF((SCAT) .and. NOM_REA(ir)=="PROFIL") iprf=ir + IF((SCAT) .and. NOM_REA(ir)=="DIFFUSION") idif=ir + IF((SCAT) .and. NOM_REA(ir)=="TRANSFERT") itra=ir + IF(NOM_REA(ir)=="NU*FISSION") iabs=ir + ! store the order numbers of EXCESS matrix + IF(LABS(3).and. NOM_REA(ir)=="EXCESS") iexc=ir + IF((LADF) .and. NOM_REA(ir)=="FUITES") idifc=ir + ENDDO + IF(iabs==0) CALL XABORT ('@D2P: NO ABSORPTION XS AVAILABLE') + IF(LABS(3).and.iexc==0) THEN + CALL XABORT('@D2P: NO EXCESS XS AVAILABLE') + ENDIF + IF(SCAT .and. iprf==0) THEN + CALL XABORT('@D2P: NO PROFIL XS AVAILABLE') + ENDIF + IF(SCAT .and. idif==0) THEN + CALL XABORT('@D2P: NO DIFFUSION XS AVAILABLE') + ENDIF + IF(SCAT .and. itra==0) THEN + CALL XABORT('@D2P: NO TRANSFERT XS AVAILABLE') + ENDIF + IF((LADF) .and. idifc==0) THEN + CALL XABORT('@D2P: NO FUITES XS AVAILABLE') + ENDIF + NANI=ADRX(NREA+2,isot,ISADRX(imil))-1 + ND=ADRX(NREA+1,isot,ISADRX(imil)) + IF(MOD(idif,NREA+1).GT.0 .AND. ND.GE.1) THEN + iadc=ADRX(idif,isot,ISADRX(imil))+NGP + ENDIF + ! address in RDATAX of ABSORPTION XS + ADR_ABS=ADRX(iabs,isot,ISADRX(imil)) + + + ! address in RDATAX of EXCESS XS + ADR_EXC=0 + IF(LABS(3)) ADR_EXC=ADRX(iexc,isot,ISADRX(imil)) + ! address in RDATAX of PROFIL XS + ADR_PRF=0 + IF(SCAT) ADR_PRF=ADRX(iprf,isot,ISADRX(imil)) + ! address in RDATAX of TRANSFERT XS + ADR_TRA=0 + IF(SCAT) ADR_TRA=ADRX(itra,isot,ISADRX(imil)) + ! address in RDATAX of FUITES XS + ADR_DIF=0 + IF(LADF) ADR_DIF=ADRX(idifc,isot,ISADRX(imil)) + + ! moving in the saphyyb object to recover RDATAX information + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,CALDIR,1) + CALL LCMSIX(IPSAP,'mili 1',1) + CALL LCMGET(IPSAP,'RDATAX',RDATAX) + CALL LCMGET(IPSAP,'IDATAP',IDATAP) + + ! LOOP over energy groups + DO ig=1, NGP + ABSORPTION(ig)=RDATAX(ADR_ABS+ig-1) + IF(LADF) DIFC(ig)=RDATAX(ADR_DIF+ig-1) + IF(LABS(3)) THEN + ABSORPTION(ig)=ABSORPTION(ig)-RDATAX(ADR_EXC+ig-1) + ENDIF + ENDDO + + + IF(SCAT)THEN ! recover the scattering XS from Saphyb + ii = ADR_PRF + nj = IDATAP(ii+6+2*NGP)-1 + + DO ani=0, NANI + il = ADR_TRA + (ani) * nj + fagg =IDATAP(ii) + lagg =IDATAP(ii+1) + fdgg =IDATAP(ii+2) + wgal =IDATAP(ii+3) + fag =IDATAP(ii+4) + lag =IDATAP(ii+5) + fdg =IDATAP(ii+6:ii+5+NGP) + adr =IDATAP(ii+6+NGP:ii+6+2*NGP) + IF(wgal.GT.0)THEN + it=il + DO g=fagg,lagg + i1=(g-1)*NGP+fdgg + i2=(g-1)*NGP+fdgg+wgal-1 + TRANSFERT(ani+1,i1:i2)=RDATAX(it:it+wgal-1) + it=it+wgal + ENDDO + ENDIF + DO g=fag,lag + i1=(g-1)*NGP+fdg(g) + i2=(g-1)*NGP+fdg(g)+adr(g+1)-adr(g)-1 + j1=il-1+adr(g) + j2=il-1+adr(g+1)-1 + TRANSFERT(ani+1,i1:i2)=RDATAX(j1:j2) + ENDDO + ENDDO + IF(iadc.NE.0)THEN + NG=NGP +! TRANSFERT(1,1:NG*NG:NG+1) = +! > TRANSFERT(1,1:NG*NG:NG+1) - RDATAX(iadc:iadc+NGP-1) + ENDIF + ENDIF + DO g=1, NGP + DO ig=1, NGP + SCAT_MAT(NSCAT) = TRANSFERT(1,g+(ig-1)*NGP) + NSCAT=NSCAT+1 + ENDDO + ENDDO + + ! RECOVER ADF IN SAPHYB (IF AVAILABLE) (adapted from ! + ! saphyb_browser of UPM) + + IF(LADF) THEN + IF((ADF_T.EQ.'SEL').OR.(ADF_T.EQ.'GET')) THEN + CALL LCMSIX (IPSAP,' ',0) + CALL LCMSIX (IPSAP,'geom ',1) + CALL LCMSIX (IPSAP,'outgeom ',1) + CALL LCMLEN(IPSAP,'SURF',NSURF,ITYLCM) + IF(NSF.NE.NSURF) THEN + WRITE(6,*) "@D2P: ERROR IN NUMBER OF ASSEMBLY SURFACES" + WRITE(6,*) "THE NUMBER OF SURFACES IN SAP (", + 1 NSURF,") IF DIFFERENT FROM DRAG2PARCS INPUT (",NSF,")" + CALL XABORT('') + ENDIF + + CALL LCMGET(IPSAP,'IPAR',IPAR) + CALL LCMGET(IPSAP,'RPAR',RPAR) + + CALL LCMSIX(IPSAP,' ',0) + CALL LCMSIX(IPSAP,CALDIR,1) + CALL LCMSIX(IPSAP,'outflx ',1) + + CALL LCMGET(IPSAP,'CURRM',CURRN(:,:,2)) + CALL LCMGET(IPSAP,'CURRP',CURRN(:,:,1)) + CALL LCMGET(IPSAP,'SURFLX',SRFLX(:,:)) + CALL LCMGET(IPSAP,'REGFLX',ZAFLX(:,:)) + ADF = 0. + DIFC(:)=DIFC(:)/B2 + + ! CALL to GET_SFI_XS to recover ADF + CALL D2PADF(IPDAT,IPRINT,NGP,NMIL, ADF, NSF, DIFC,CURRN,SRFLX, + 1 ZAFLX,RPAR,IPAR,ADF_T,STAIDX,NVAR) + ENDIF + ENDIF + ! STORE RESULTS IN INFO DATA BLOCK + CALL LCMSIX(IPDAT,' ',0) + CALL LCMSIX(IPDAT,'BRANCH_INFO',1) + IPTH=LCMGID(IPDAT,'CROSS_SECT') + KPTH=LCMDIL(IPTH,STAIDX(NVAR)) + CALL LCMSIX(KPTH,'MACROLIB_XS',1) + IF(LABS(2)) CALL LCMPUT(KPTH,'ABSORPTION',NGP,2,ABSORPTION) + IF(SCAT) CALL LCMPUT(KPTH,'SCAT',NGP*NGP,2,SCAT_MAT) + IF(LABS(2)) WRITE(6,*) "ABSORPTION EXCESS :", ABSORPTION + IF(SCAT) WRITE(6,*) "SCATTERING MATRIX :", SCAT_MAT + DEALLOCATE (RDATAX,IDATAP) + END diff --git a/Donjon/src/DETCDRV.f b/Donjon/src/DETCDRV.f new file mode 100644 index 0000000..0a13bfb --- /dev/null +++ b/Donjon/src/DETCDRV.f @@ -0,0 +1,202 @@ +*DECK DETCDRV + SUBROUTINE DETCDRV(IPDET,NGRP,NEL,NUN,NX,NY,NZ,MESHX,MESHY,MESHZ, + 1 KEYF,FLUX,IPRT,KC,DT,LHEX,LSIMEX,LNORM,VNORM,LPARAB) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver for the module DETECT: +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: +* IPDET pointer to the library object +* NGRP number of energy groups +* NEL number of finite elements +* NUN number of unknowns +* NX number of x mesh-splitted elements +* NY number of y mesh-splitted elements +* NZ number of z mesh-splitted elements +* MESHX +* MESHY +* MESHZ +* KEYF keyflux recover from L_TRACk object +* FLUX flux for each mesh-splitted elements +* IPRT printing index +* KC calculation type reference +* DT time step +* LHEX =.TRUE. if hexagonal detectors are present +* LSIMEX =.TRUE. if keyword SIMEX is present +* LNORM =.TRUE. if keyword NORM is present +* VNORM real used for normalization +* LPARAB =.TRUE. if parabolic interpolation is performed +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDET + INTEGER IPRT,KC,NGRP,NEL,NX,NY,NZ,KEYF(NEL),NUN + LOGICAL LHEX,LSIMEX,LNORM,LPARAB + REAL FLUX(NUN,NGRP),DT,MESHX(NX+1),MESHY(NY+1),MESHZ(NZ+1), + 1 VNORM +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE,IOUT + PARAMETER (NSTATE=40,IOUT=6) + INTEGER ILONG,ITYLCM,INFO(2),NREP,ITHEX,NHEX,J + REAL DEVPOS(6),PLNL,REF,RESP,VLAMDA,XMULT,TLG + CHARACTER NXTYP*12,FIRST*12,NXDET*12,FIRST1*12 + LOGICAL LREGUL + INTEGER, ALLOCATABLE, DIMENSION(:) :: IHEX + REAL, ALLOCATABLE, DIMENSION(:) :: SPEC,REP,FRACT,NVCST,PDD,APD, + 1 BPD +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(SPEC(NGRP)) +* + IF(IPRT.GE.1) THEN + IF(KC.EQ.0) THEN + WRITE(IOUT,*) 'DETECT: CALCULATION TYPE REFERENCE, KC = ',KC + ELSE + WRITE(IOUT,*) 'DETECT: CALCULATION TYPE NORMAL, KC = ',KC + ENDIF + WRITE(IOUT,*) 'DETECT: TIME STEP USED, DT = ',DT + ENDIF + CALL LCMSIX(IPDET,' ',0) + NXTYP = ' ' + CALL LCMNXT(IPDET,NXTYP) + FIRST = NXTYP + 10 CALL LCMNXT(IPDET,NXTYP) + CALL LCMLEN(IPDET,NXTYP,ILONG,ITYLCM) + IF (ITYLCM.EQ.0) THEN + CALL LCMSIX(IPDET,NXTYP,1) + CALL LCMGET(IPDET,'INFORMATION',INFO) + CALL LCMGET(IPDET,'SPECTRAL',SPEC) + NREP = INFO(2) + ALLOCATE(REP(NREP)) + IF( NXTYP(1:5).EQ.'PLATN' )THEN + ALLOCATE(FRACT(NREP-1),NVCST(NREP-2),PDD(NREP-2),APD(NREP-2), + 1 BPD(NREP-2)) + CALL LCMGET(IPDET,'FRACTION',FRACT) + CALL LCMGET(IPDET,'INV-CONST',NVCST) + ENDIF + NXDET = ' ' + CALL LCMNXT(IPDET,NXDET) + FIRST1 = NXDET + 20 CALL LCMNXT(IPDET,NXDET) + CALL LCMLEN(IPDET,NXDET,ILONG,ITYLCM) + IF (ITYLCM.EQ.0) THEN + IF(IPRT.GT.3) WRITE(IOUT,*) 'NAME DETECTOR ',NXDET + CALL LCMSIX(IPDET,NXDET,1) + IF(LHEX) THEN + CALL LCMLEN(IPDET,'NHEX',NHEX,ITHEX) + IF(NHEX.EQ.0) CALL XABORT('@DETCDRV: HEXAGON NUMBERS' + + //' NOT PRESENT IN DETECT') + ALLOCATE(IHEX(NHEX)) + CALL LCMGET(IPDET,'NHEX',IHEX) + ENDIF + CALL LCMGET(IPDET,'POSITION',DEVPOS) + CALL LCMGET(IPDET,'RESPON',REP) + IF(LSIMEX.AND.NXTYP.EQ.'VANAD_REGUL') THEN + CALL DETINT(NX,NY,NZ,NEL,NUN,LPARAB,MESHX,MESHY,MESHZ, + + KEYF,FLUX,NGRP,DEVPOS,RESP,IPRT) + ELSE + CALL DETFLU(LHEX,NX,NY,NZ,NEL,NUN,MESHX,MESHY,MESHZ,KEYF, + + FLUX,NGRP,SPEC,DEVPOS,NHEX,IHEX,RESP,IPRT) + ENDIF +*---- +* DETECTOR RESPONSE CALCULATION +*---- + IF(.NOT.LNORM)THEN + PLNL = REP(1) + REF = REP(2) + IF(NXTYP.EQ.'VANAD_REGUL')THEN +*---- +* VANADIUM RESPONSE CALCULATION +*---- + IF(LSIMEX) THEN + REF = RESP + ELSE + IF(KC.EQ.1) THEN + VLAMDA = 1./225. + XMULT = 1.0 + VLAMDA*DT + XMULT = 1.0/XMULT + RESP = XMULT*(PLNL+DT*VLAMDA*RESP) + REF = PLNL + ELSE + REF = RESP + ENDIF + ENDIF + ELSEIF(NXTYP(1:5).EQ.'PLATN')THEN +*---- +* PLATINIUM RESPONSE CALCULATION +*---- + LREGUL = .FALSE. + DO 30 J=1,NREP-2 + PDD(J) = REP(J) + 30 CONTINUE + IF(NXTYP.EQ.'PLATN_REGUL')THEN + LREGUL = .TRUE. + ENDIF + CALL DETPLAT(DT,RESP,REF,KC,PDD,LREGUL,FRACT,NVCST, + + NREP-2,APD,BPD) + DO 40 J=1,NREP-2 + REP(J) = PDD(J) + 40 CONTINUE + ELSEIF (NXTYP(1:5).EQ.'CHION') THEN +*---- +* LECTURE DE CHAMBRES D'ION +*---- + IF(NREP.NE.3)CALL XABORT('@DETCDRV: ION CHAMBERS MUST ' + + //'HAVE THREE STORED VALUES FOR RESPONSES') + IF (KC.EQ.1) THEN + REF = REP(3) + RESP = LOG10(RESP/REF) + TLG = (RESP-PLNL)/DT + REF = TLG + ELSE + REP(3) = RESP + RESP =LOG10(RESP/REP(3)) + ENDIF + ENDIF + ELSE + REF = VNORM/RESP + RESP = VNORM + ENDIF +*---- +* DETECTOR RESPONSE STORAGE +*---- + REP(1) = RESP + REP(2) = REF + IF(IPRT.GT.4) WRITE(6,*) 'RESP, REF ',RESP, REF + CALL LCMPUT(IPDET,'RESPON',NREP,2,REP) + CALL LCMSIX(IPDET,' ',2) + ENDIF + IF(LHEX) DEALLOCATE(IHEX) + IF(NXDET.EQ.FIRST1) GOTO 45 + GOTO 20 + 45 CALL LCMSIX(IPDET,' ',2) + DEALLOCATE(REP) + IF(NXTYP(1:5).EQ.'PLATN')THEN + DEALLOCATE(FRACT,NVCST,PDD,APD,BPD) + ENDIF + ENDIF + IF (NXTYP.EQ.FIRST) GOTO 50 + GOTO 10 + 50 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(SPEC) + RETURN + END diff --git a/Donjon/src/DETCTL.f b/Donjon/src/DETCTL.f new file mode 100644 index 0000000..111ca23 --- /dev/null +++ b/Donjon/src/DETCTL.f @@ -0,0 +1,181 @@ +*DECK DETCTL + SUBROUTINE DETCTL(NX,NY,NZ,NEL,VECT,RESP,NDET,XCT,YCT,ZCT,COR, + 1 KEYF,IPRT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Call the subroutines that perform the parabolic interpolation. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: +* NX number of x mesh-splitted elements +* NY number of y mesh-splitted elements +* NZ number of z mesh-splitted elements +* NEL number of finite elements +* VECT +* RESP flux reads by the detector +* NDET number of detectors +* XCT center coordinates of each mesh-splitted elements for x +* YCT center coordinates of each mesh-splitted elements for y +* ZCT center coordinates of each mesh-splitted elements for z +* COR coordinates of the center of the detector +* KEYF keyflux recover from L_TRACK object +* IPRT printing index +* +*----------------------------------------------------------------------- * + +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NX,NY,NZ,NEL,NDET,KEYF(NEL),IPRT + REAL VECT(*),COR(*),XCT,YCT,ZCT,RESP(NDET) +*---- +* LOCAL VARIABLES +*---- + REAL D1,D2,D3,X1,X2,X3,XX1,XX2,XX3,Y1,Y2, + 1 Y3,YY1,YY2,YY3,Z1,Z2,Z3,ZZ1,ZZ2,ZZ3,PD1,PD2,PD3,PPD1, + 2 PPD2,PPD3,CE,BE,AH + INTEGER I,III,NIJK,I1,I2,I3,IP1,IP2,IP3,J1,J2,J3,JP1,JP2,JP3, + 1 K1,K2,K3,KP1,KP2,KP3,K0,JJJ + + IF(IPRT.GT.4) WRITE(6,1000) + + IF (NDET.LE.0) RETURN + NIJK = NX*NY + + DO 10 III=1,NDET + I = (III-1)*3 + D1 = COR(I+1) + D2 = COR(I+2) + D3 = COR(I+3) +*---- +* DETERMINE CENTER OF INTERPOLATE RANGE +*---- + CALL DETRTR(D1,XCT,NX,XX1,XX2,XX3,IP1,IP2,IP3) + X1 = XX1 + X2 = XX2 + X3 = XX3 + I1 = IP1 + I2 = IP2 + I3 = IP3 + + CALL DETRTR(D2,YCT,NY,YY1,YY2,YY3,JP1,JP2,JP3) + Y1 = YY1 + Y2 = YY2 + Y3 = YY3 + J1 = JP1 + J2 = JP2 + J3 = JP3 + + CALL DETRTR(D3,ZCT,NZ,ZZ1,ZZ2,ZZ3,KP1,KP2,KP3) + Z1 = ZZ1 + Z2 = ZZ2 + Z3 = ZZ3 + K1 = KP1 + K2 = KP2 + K3 = KP3 + + IF (IPRT.GT.4) THEN + IF (MOD(III,25).EQ.0) WRITE(6,1000) + ENDIF + + IF(IPRT.GT.4) THEN + WRITE(6,2000) III,D1,X1,X2,X3,D2,Y1,Y2,Y3,D3,Z1,Z2,Z3, + > I1,I2,I3, J1,J2,J3, K1,K2,K3 + ENDIF +*---- +* INTERPOLATION IN X AT PLANE Z=K1 +*---- + K0 = (K1-1)*NIJK +*---- +* INTERPOLATION IN X AT PLANE Y=J1,Z=K1 +*---- + JJJ = NX*(J1-1) + PD1 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN X AT PLANE Y=J2,Z=K1 +*---- + JJJ = NX*(J2-1) + PD2 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN X AT PLANE Y=J3,Z=K1 +*---- + JJJ = NX*(J3-1) + PD3 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN Y AT PLANE Z=K1 +*---- + CALL DETPAR(Y1,Y2,Y3,PD1,PD2,PD3,AH,BE,CE) + PPD1 = AH*D2*D2 + BE*D2 + CE +*---- +* INTERPOLATION IN X AT PLANE Z=K2 +*---- + K0 = (K2-1)*NIJK +*---- +* INTERPOLATION IN X AT PLANE Y=J1,Z=K2 +*---- + JJJ = NX*(J1-1) + PD1 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN X AT PLANE Y=J2,Z=K2 +*---- + JJJ = NX*(J2-1) + PD2 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN X AT PLANE Y=J3,Z=K2 +*---- + JJJ = NX*(J3-1) + PD3 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN Y AT PLANE Z=K2 +*---- + CALL DETPAR2(Y1,Y2,Y3,PD1,PD2,PD3,AH,BE,CE) + PPD2 = AH*D2*D2 + BE*D2 + CE +*---- +* INTERPOLATION IN X AT PLANE Z=K3 +*---- + K0 = (K3-1)*NIJK +*---- +* INTERPOLATION IN X AT PLANE Y=J1,Z=K3 +*---- + JJJ = NX*(J1-1) + PD1 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN X AT PLANE Y=J2,Z=K3 +*---- + JJJ = NX*(J2-1) + PD2 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN X AT PLANE Y=J3,Z=K3 +*---- + JJJ = NX*(J3-1) + PD3 = DETPOL(VECT,KEYF,JJJ,K0,I1,I2,I3,X1,X2,X3,D1) +*---- +* INTERPOLATION IN Y AT PLANE Z=K3 +*---- + CALL DETPAR2(Y1,Y2,Y3,PD1,PD2,PD3,AH,BE,CE) + PPD3 = AH*D2*D2 + BE*D2 + CE +*---- +* INTERPOLATION IN Z +*---- + CALL DETPAR2(Z1,Z2,Z3,PPD1,PPD2,PPD3,AH,BE,CE) + RESP(III) = AH*D3*D3 + BE*D3 + CE + + 10 CONTINUE + + RETURN + + 1000 FORMAT(//,57X,'BRACKETING PROCESS', + > /,57X,'******************', + > //,5X,'DET',4X,'X ',8X,'X1',8X,'X2',8X,'X3',4X, + > 4X,'Y ',8X,'Y1',8X,'Y2',8X,'Y3',4X, + > 4X,'Z ',8X,'Z1',8X,'Z2',8X,'Z3',4X,/) + 2000 FORMAT(5X,I3.3,12F10.4,/,5X,3X,3(10X,3(2X,I6.6,2X))) + + END diff --git a/Donjon/src/DETDRV.f b/Donjon/src/DETDRV.f new file mode 100644 index 0000000..2a22b4d --- /dev/null +++ b/Donjon/src/DETDRV.f @@ -0,0 +1,148 @@ +*DECK DETDRV + SUBROUTINE DETDRV(IPDET,NGRP,IPRT,LHEX,NDETOT,LENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver for module DETINI: +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, E. Varin, M. Guyot +* +*Parameters: input/output +* IPDET pointer to the L_DETECT object. +* NGRP number of energy groups +* IPRT printing flag +* LHEX =.TRUE. if it is an hexagonal geometry +* NDETOT total number of detectors +* LENTRY =.TRUE. if the L_DETECT object is updated +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDET + INTEGER NGRP,IPRT,NDETOT + LOGICAL LHEX,LENTRY +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT*12,TYPE*12 + INTEGER ITYP,NITMA,NDETEC,NREP,I,INFO(2) + REAL FLOT + DOUBLE PRECISION DFLOT + REAL, ALLOCATABLE, DIMENSION(:) :: SPEC,CST,FRACT +*---- +* READING INFORMATION LINKED TO DETECTOR TYPE +*---- + CALL REDGET(ITYP,NITMA,FLOT,TYPE,DFLOT) + IF (ITYP.NE.3) CALL XABORT('@DETDRV: CHARACTER DATA' + + //' EXPECTED(1)') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF ((ITYP.NE.3).OR.(TEXT.NE.'INFO')) CALL XABORT('@DETINI:' + + //' CHARACTER INFO EXPECTED') + CALL REDGET(ITYP,NDETEC,FLOT,TEXT,DFLOT) + IF (ITYP.NE.1) CALL XABORT('@DETDRV: INTEGER DATA EXPECTED(1)') + CALL REDGET(ITYP,NREP,FLOT,TEXT,DFLOT) + IF(NREP.LT.2)CALL XABORT('@DETDRV: AT LEAST TWO RESPONSES') +*---- +* READING INFORMATION LINKED TO ENERGY SPECTRAL +*---- + IF(NGRP.EQ.0)CALL XABORT('@DETDRV: NUMBER OF GROUPS REQUIRED') + ALLOCATE(SPEC(NGRP)) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF (ITYP.NE.3) CALL XABORT('@DETDRV: CHARACTER DATA' + + //' EXPECTED(2)') + IF(TEXT.EQ.'SPECTRAL') THEN + DO 10 I=1,NGRP + CALL REDGET(ITYP,NITMA,SPEC(I),TEXT,DFLOT) + IF (ITYP.NE.2) CALL XABORT('@DETDRV: REAL DATA EXPECTED ' + + //'FOR SPECTRAL') + 10 CONTINUE + ELSEIF(TEXT.EQ.'DEFAULT')THEN + DO 20 I=1,NGRP-1 + SPEC(I) = 0.0 + 20 CONTINUE + SPEC(NGRP) = 1.0 + WRITE(6,*) '**** WARINING **** ENERGY SPECTRAL INITIALIZED ' + + //'TO 1.0 IN THE HIGHEST GROUP ONLY ' + ELSE + CALL XABORT('@DETDRV: KEYWORDS FOR SPECTRAL EXPECTED') + ENDIF +*---- +* READING INFORMATION LINKED TO DELAY CONSTANT AND FRACTION READING +*---- + IF(TYPE(1:5).EQ.'PLATN') THEN + IF(NREP.LE.2)CALL XABORT('@DETDRV: MORE THAN TWO RESPONSES' + + //' MUST BE SPECIFIED') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF (ITYP.NE.3) CALL XABORT('@DETDRV: CHARACTER DATA' + + //' EXPECTED(3)') + IF(TEXT.EQ.'INVCONST') THEN + ALLOCATE(CST(NREP-2)) + DO 40 I=1,NREP-2 + CALL REDGET(ITYP,NITMA,CST(I),TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@DETDRV: REAL DATA EXPECTED ' + + //'FOR TIME CONSTANTS') + 40 CONTINUE + CALL LCMSIX(IPDET,' ',0) + CALL LCMSIX(IPDET,TYPE,1) + CALL LCMPUT(IPDET,'INV-CONST',NREP-2,2,CST) + CALL LCMSIX(IPDET,' ',0) + DEALLOCATE(CST) + ELSE + CALL XABORT('@DETDRV: KEYWORD INVCONST EXPECTED FOR' + + //' PLATINIUM DETECTORS') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF (ITYP.NE.3) CALL XABORT('@DETDRV: CHARACTER DATA' + + //' EXPECTED(4)') + IF(TEXT.EQ.'FRACTION') THEN + ALLOCATE(FRACT(NREP-1)) + DO 50 I=1,NREP-1 + CALL REDGET(ITYP,NITMA,FRACT(I),TEXT,DFLOT) + IF (ITYP.NE.2) CALL XABORT('@DETDRV: REAL DATA EXPECTED' + + //' FOR FRACTION') + 50 CONTINUE + CALL LCMSIX(IPDET,' ',0) + CALL LCMSIX(IPDET,TYPE,1) + CALL LCMPUT(IPDET,'FRACTION',NREP-1,2,FRACT) + CALL LCMSIX(IPDET,' ',0) + DEALLOCATE(FRACT) + ELSE + CALL XABORT('@DETDRV: KEYWORD FRACTION EXPECTED FOR' + + //' PLATINIUM DETECTORS') + ENDIF + ENDIF + + DO 30 I=1,NDETEC + CALL DETREAD(IPDET,TYPE,NREP,IPRT,LHEX) + 30 CONTINUE +*---- +* STORAGE OF INFORMATION +*---- + CALL LCMSIX(IPDET,' ',0) + CALL LCMSIX(IPDET,TYPE,1) + IF (.NOT.LENTRY) THEN + INFO(1)=NDETEC + INFO(2)=NREP + ELSE + CALL LCMGET(IPDET,'INFORMATION',INFO) + INFO(1) = INFO(1) + NDETEC + IF (NREP.NE.INFO(2)) + + CALL XABORT('@DETDRV: RESPONS NUMBER INCONSISTENT WITH '// + + ' THE PREVIOUS VALUE') + ENDIF + CALL LCMPUT(IPDET,'INFORMATION',2,1,INFO) + CALL LCMPUT(IPDET,'SPECTRAL',NGRP,2,SPEC) + CALL LCMSIX(IPDET,' ',0) + NDETOT = NDETOT + NDETEC + DEALLOCATE(SPEC) + RETURN + END diff --git a/Donjon/src/DETECT.f b/Donjon/src/DETECT.f new file mode 100644 index 0000000..dd39019 --- /dev/null +++ b/Donjon/src/DETECT.f @@ -0,0 +1,249 @@ +*DECK DETECT + SUBROUTINE DETECT(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* This module compute detectors readings +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The DETECT: module specifications are: +* DETEC := DETECT: DETEC FLUX TRACK GEOM :: (descdetect) ; +* where +* DETEC : name of the \emph{detect} containing the detector positions and +* responses. +* FLUX : name of the \emph{flux} containing the flux solution computed by +* the FLUD: or FLPOW: modules. To obtain a correct result, the best is to +* use a normalized flux, coming from the FLPOW: module. In this case, the +* fluxes are normalized to the reactor power. +* TRACK : name of the \emph{track} containing the TRIVAC tracking. +* GEOM : name of the \emph{geometry} containing the mesh-splitting +* geometry created by the USPLIT: or GEO: modules. +* (descdetect) : structure containing the data to module DETECT:. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE,IOUT + PARAMETER (NSTATE=40,IOUT=6) + REAL FLOT,DT,VNORM + TYPE(C_PTR) IPFLU,JPFLUX,IPTRK,IPGEO,IPDET + INTEGER ISTATE(NSTATE),NEL,NUN, + 1 PARAM(NSTATE),I,IPRT,ITYP,NITMA,KC,NX,NY,NZ,NXP1, + 2 NYP1,NZP1,NGRP,IGR,GEOTYP,ILONG,ITYLCM,IUN + LOGICAL LTRK,LFLU,LGEO,LDET,LHEX,LNORM,LSIMEX,LPARAB + CHARACTER HSIGN*12,TEXT*12 + DOUBLE PRECISION DFLOT + INTEGER, ALLOCATABLE, DIMENSION(:) :: KEYF + REAL, ALLOCATABLE, DIMENSION(:) :: MESHX,MESHY,MESHZ,FUNKN + REAL, ALLOCATABLE, DIMENSION(:,:) :: FLU +*---- +* PARAMETERS VALIDATION +*---- + IF(NENTRY.LE.3) CALL XABORT('@DETECT: FOUR PARAMETER EXPECTED.') + LTRK = .FALSE. + LFLU = .FALSE. + LGEO = .FALSE. + LDET = .FALSE. + IPFLU = C_NULL_PTR + IPTRK = C_NULL_PTR + IPGEO = C_NULL_PTR + IPDET = C_NULL_PTR + DO 10 I=1,NENTRY + IF((IENTRY(I).EQ.1).OR.(IENTRY(I).EQ.2)) THEN + TEXT=HENTRY(I) + CALL LCMSIX(KENTRY(I),' ',0) + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF (HSIGN.EQ.'L_DETECT') THEN + IPDET=KENTRY(I) + LDET = .TRUE. + IF(JENTRY(I).NE.1) CALL XABORT('@DET' + + //'ECT: MODIFICATION MODE EXPECTED FOR OBJECT'//HSIGN//'.') + ELSEIF (HSIGN.EQ.'L_GEOM') THEN + IPGEO=KENTRY(I) + LGEO = .TRUE. + IF(JENTRY(I).NE.2) CALL XABORT('@DET' + + //'ECT: READ-ONLY MODE EXPECTED FOR OBJECT'//HSIGN//'.') + ELSEIF (HSIGN.EQ.'L_TRACK') THEN + IF (.NOT.LTRK) THEN + IPTRK=KENTRY(I) + LTRK = .TRUE. + IF(JENTRY(I).NE.2) CALL XABORT('@DET' + + //'ECT: READ-ONLY MODE EXPECTED FOR OBJECT'//HSIGN//'.') + ELSE + CALL XABORT('@DETECT: ONLY ONE L_TRACK FILE IS REQUIRED') + ENDIF + ELSEIF ((HSIGN.EQ.'L_FLUX').AND.(.NOT.LFLU)) THEN + IPFLU=KENTRY(I) + LFLU = .TRUE. + IF(JENTRY(I).NE.2) CALL XABORT('@DET' + + //'ECT: READ-ONLY MODE EXPECTED FOR OBJECT'//HSIGN//'.') + ELSE + CALL XABORT('@DETECT: ONLY ONE L_FLUX FILE IS REQUIRED') + ENDIF + ELSE + CALL XABORT('@DETECT: INVALIV OBJECT='//TEXT) + ENDIF + 10 CONTINUE + IF (.NOT.(LFLU.AND.LGEO.AND.LTRK.AND.LDET)) + + CALL XABORT('@DETECT: MISSING OBJECTS IN CALL') +*---- +* READ DATA +*---- + IPRT = 1 + LHEX = .FALSE. + LNORM = .FALSE. + LSIMEX = .FALSE. + LPARAB = .TRUE. + DT = 0.0 + KC = 0 + + 15 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.3) THEN + IF (TEXT.EQ.'EDIT') THEN + CALL REDGET(ITYP,IPRT,FLOT,TEXT,DFLOT) + IF (ITYP.NE.1) + + CALL XABORT('@DETECT: INTEGER DATA EXPECTED(1)') + ELSEIF (TEXT.EQ.'TIME') THEN + CALL REDGET(ITYP,NITMA,DT,TEXT,DFLOT) + IF (ITYP.NE.2) + + CALL XABORT('@DETECT: REAL DATA EXPECTED(1)') + ELSEIF (TEXT.EQ.'REF') THEN + CALL REDGET(ITYP,KC,FLOT,TEXT,DFLOT) + IF (ITYP.NE.1) + + CALL XABORT('@DETECT: INTEGER DATA EXPECTED(2)') + ELSEIF (TEXT.EQ.'SIMEX') THEN + LSIMEX = .TRUE. + ELSEIF (TEXT.EQ.'SPLINE') THEN + IF(.NOT.LSIMEX) CALL XABORT('@DETECT: WRONG KEYWORD, ' + + //' SIMEX REQUIRED') + LPARAB = .FALSE. + ELSEIF (TEXT.EQ.'PARAB') THEN + IF(.NOT.LSIMEX) CALL XABORT('@DETECT: WRONG KEYWORD, ' + + //' SIMEX REQUIRED') + LPARAB = .TRUE. + ELSEIF (TEXT.EQ.'NORM') THEN + LNORM = .TRUE. + CALL REDGET(ITYP,NITMA,VNORM,TEXT,DFLOT) + IF (ITYP.NE.2) + + CALL XABORT('@DETECT: REAL DATA EXPECTED(3)') + IF( VNORM.EQ.0.0 )CALL XABORT('@DETECT: ILLEGAL VALUE ' + + // 'OF NORM') + ELSEIF (TEXT.EQ.';') THEN + GOTO 20 + ELSE + CALL XABORT('@DETECT: CONTROLLED TYPE EXPECTED'//TEXT) + ENDIF + ELSE + CALL XABORT('@DETECT: CHARACTER DATA EXPECTED(1)') + ENDIF + GOTO 15 +*---- +* RECOVER L_GEOM INFORMATION +*---- + 20 IF(DT.EQ.0.0) CALL XABORT('@DETECT: TIME NOT SET') + IF(LSIMEX.AND.LNORM) CALL XABORT('@DETECT: WRONG ASSOCIATION ' + + //' SIMEX INT AND NORMALIZATION') + CALL LCMGET(IPDET,'STATE-VECTOR',PARAM) + CALL LCMGET(IPGEO,'STATE-VECTOR',ISTATE) + GEOTYP = ISTATE(1) + IF(PARAM(3).EQ.1) LHEX = .TRUE. + IF(LSIMEX.AND.GEOTYP.NE.7) + + CALL XABORT('@DETECT: SIMEX INTERPOLATION ONLY FOR 3D ' + + //'CARTESIAN') + IF((LHEX.AND.(GEOTYP.LT.8)).OR.(.NOT.LHEX.AND.(GEOTYP.GE.8))) + + CALL XABORT('@DETECT: INCOMPATIBLE DETECT WITH GEOMETRY') + IF(GEOTYP.LT.5.OR.GEOTYP.EQ.6) + + CALL XABORT('@DETECT: GEOMETRY TYPE NOT SUPPORTED IN DETECT') + NX = ISTATE(3) + NY = ISTATE(4) + IF(NY.EQ.0) NY=1 + NZ = ISTATE(5) + IF(NZ.EQ.0) NZ=1 + NXP1 = NX+1 + NYP1 = NY+1 + NZP1 = NZ+1 + ALLOCATE(MESHX(NXP1),MESHY(NYP1),MESHZ(NZP1)) + IF((GEOTYP.EQ.7).OR.(GEOTYP.EQ.5)) THEN + CALL LCMGET(IPGEO,'MESHX',MESHX) + CALL LCMGET(IPGEO,'MESHY',MESHY) + ELSE + MESHY(1)=0. + MESHY(2)=1. + MESHX(1)=0. + MESHX(2)=1. + ENDIF + IF(GEOTYP.EQ.9.OR.GEOTYP.EQ.7)THEN + CALL LCMGET(IPGEO,'MESHZ',MESHZ) + ELSE IF(GEOTYP.EQ.5.OR.GEOTYP.EQ.8)THEN + MESHZ(1)=0. + MESHZ(2)=1. + ENDIF +*---- +* RECOVER L_TRACK INFORMATION +*---- + CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE) + NEL = ISTATE(1) + NUN = ISTATE(2) + ALLOCATE(KEYF(NEL)) + CALL LCMGET(IPTRK,'KEYFLX',KEYF) + CALL LCMGET(IPDET,'STATE-VECTOR',ISTATE) + NGRP = ISTATE(1) +*---- +* RECOVER L_FLUX INFORMATION +*---- + CALL LCMGET(IPFLU,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP)CALL XABORT('@DETECT: NUMBER OF ENERGY ' + + //'GROUPS INCOMPATIBLE BETWEEN FLUX AND DETECT') + ALLOCATE(FLU(NUN,NGRP)) + CALL LCMSIX(IPFLU,' ',0) + JPFLUX=LCMGID(IPFLU,'FLUX') + CALL LCMLEL(JPFLUX,1,ILONG,ITYLCM) + ALLOCATE(FUNKN(ILONG)) + DO 30 IGR=1,NGRP + CALL LCMGDL(JPFLUX,IGR,FUNKN) + DO 25 IUN=1,NUN + FLU(IUN,IGR)=FUNKN(IUN) + 25 CONTINUE + 30 CONTINUE + DEALLOCATE(FUNKN) +*---- +* CALL DRIVER +*---- + CALL DETCDRV(IPDET,NGRP,NEL,NUN,NX,NY,NZ,MESHX,MESHY,MESHZ,KEYF, + + FLU,IPRT,KC,DT,LHEX,LSIMEX,LNORM,VNORM,LPARAB) +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(FLU,KEYF,MESHX,MESHY,MESHZ) + RETURN + END diff --git a/Donjon/src/DETFIL.f b/Donjon/src/DETFIL.f new file mode 100644 index 0000000..cb4b16c --- /dev/null +++ b/Donjon/src/DETFIL.f @@ -0,0 +1,45 @@ +*DECK DETFIL + SUBROUTINE DETFIL(Y,X,XL,TC,DT,N) +* +*---------------------------------------------------------------------- +* +*Purpose: +* Filters the n values of x vector for TC seconds. +* Formulations are taken from the expression of the different +* equation of a filter with a linear variation of x in DT time +* step. +* +*Author(s): +* xxx +* +*Parameters: +* Y real variables Y(I) at previous time +* X real variables to filtered +* XL real variables X(I) at previous time +* TC filter time constant +* DT time step between two calculations +* N dimension of the vectors X,XL,Y +* +*-------------------------------------------------------------------- +* + IMPLICIT NONE + INTEGER N,I + REAL Y(N),X(N),XL(N),TC,DT,AA,A,B,C +* +* COMPUTE PONDERATION FACTORS FOR Y,X ET XL +* + AA = - DT / TC + A = EXP ( AA ) + B = 1. - A + C = 1. - B * TC/DT +* +* COMPUTE NEW Y +* + DO 10 I=1,N +* + Y(I) = A * Y(I) + ( B - C ) * XL(I) + C * X(I) + XL(I) = X(I) +* + 10 CONTINUE + RETURN + END diff --git a/Donjon/src/DETFLU.f b/Donjon/src/DETFLU.f new file mode 100644 index 0000000..a2938bd --- /dev/null +++ b/Donjon/src/DETFLU.f @@ -0,0 +1,145 @@ +*DECK DETFLU + SUBROUTINE DETFLU(LHEX,NX,NY,NZ,NEL,NUN,MESHX,MESHY,MESHZ,KEYF, + > FLUX,NGRP,SPEC,DEVPOS,NHEX,IHEX,RESP,IPRT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute flux at detector site +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: +* LHEX =.TRUE. if hexagonal detectors are present +* NX number of x mesh-splitted elements +* NY number of y mesh-splitted elements +* NZ number of z mesh-splitted elements +* NEL number of finite elements +* NUN number of unknowns +* MESHX regions coordinates according to x +* MESHY regions coordinates according to y +* MESHZ regions coordinates according to z +* KEYF keyflux recover from L_TRACk object +* FLUX flux for each mesh-splitted elements +* NGRP number of energy groups +* SPEC spectral information +* DEVPOS detector coordinates +* NHEX number of hexagons in the detector +* IHEX index number of hexagons +* COR center detector coordinates +* RESP flux reads by the detector +* IPRT printing index +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NX,NY,NZ,NEL,NUN,NGRP,IPRT,NHEX,NT,KEYF(NEL),IHEX(NHEX) + REAL MESHX(NX+1),MESHY(NY+1),MESHZ(NZ+1),FLUX(NUN,NGRP),RESP, + 1 DEVPOS(6),SPEC(NGRP) + LOGICAL LHEX +*---- +* LOCAL VARIABLES +*---- + INTEGER NXP1,NYP1,NZP1,I,J,K,I1,I2,J1,J2,K1,K2,IAM,IGR + REAL X1,X2,Y1,Y2,Z1,Z2 + + NXP1 = NX+1 + NYP1 = NY+1 + NZP1 = NZ+1 + + X1=DEVPOS(1) + X2=DEVPOS(2) + Y1=DEVPOS(3) + Y2=DEVPOS(4) + Z1=DEVPOS(5) + Z2=DEVPOS(6) + + IF(.NOT.LHEX) THEN + IF(X1.LT.MESHX(1)) X1=MESHX(1) + IF(X2.LT.MESHX(1)) X2=MESHX(1) + IF(X2.GT.MESHX(NXP1)) X2=MESHX(NXP1) + IF(X1.GT.MESHX(NXP1)) X1=MESHX(NXP1) + + IF(Y1.LT.MESHY(1)) Y1=MESHY(1) + IF(Y2.LT.MESHY(1)) Y2=MESHY(1) + IF(Y2.GT.MESHY(NYP1)) Y2=MESHY(NYP1) + IF(Y1.GT.MESHY(NYP1)) Y1=MESHY(NYP1) + ENDIF + + IF(Z1.LT.MESHZ(1)) Z1=MESHZ(1) + IF(Z2.LT.MESHZ(1)) Z2=MESHZ(1) + IF(Z2.GT.MESHZ(NZP1)) Z2=MESHZ(NZP1) + IF(Z1.GT.MESHZ(NZP1)) Z1=MESHZ(NZP1) + + IF(.NOT.LHEX) THEN + I1=0 + DO 20 I=1,NXP1 + IF(X1.GE.MESHX(I) .AND. X1.LE.MESHX(I+1)) THEN + I1=I + ENDIF + IF(X2.GE.MESHX(I) .AND. X2.LE.MESHX(I+1)) THEN + I2=I + GOTO 10 + ENDIF + 20 CONTINUE + + 10 DO 30 J=1,NYP1 + IF(Y1.GE.MESHY(J) .AND. Y1.LE.MESHY(J+1)) THEN + J1=J + ENDIF + IF(Y2.GE.MESHY(J) .AND. Y2.LE.MESHY(J+1)) THEN + J2=J + GOTO 40 + ENDIF + 30 CONTINUE + 40 CONTINUE + ELSE + J1 = 1 + J2 = 1 + I1 = 1 + I2 = NHEX + ENDIF + + DO 50 K=1,NZP1 + IF(Z1.GE.MESHZ(K) .AND. Z1.LE.MESHZ(K+1)) THEN + K1=K + ENDIF + IF(Z2.GE.MESHZ(K) .AND. Z2.LE.MESHZ(K+1)) THEN + K2=K + GOTO 60 + ENDIF + 50 CONTINUE + + 60 RESP = 0.0 + NT = 0 + + IF(IPRT.GT.4) WRITE(6,*) 'POS GEOM ',I1,I2,J1,J2,K1,K2 + DO 70 K=K1,K2 + DO 71 J=J1,J2 + DO 72 I=I1,I2 + NT = NT+1 + IF(LHEX) THEN + IAM = (K-1)*NX+IHEX(I) + ELSE + IAM=(K-1)*NX*NY+(J-1)*NX+I + ENDIF + DO 73 IGR=1,NGRP + RESP = RESP + SPEC(IGR)*FLUX(KEYF(IAM),IGR) + 73 CONTINUE + IF(IPRT.GT.4) WRITE(6,*) 'DETFLU: FINITE ELEMENT NUMBER ', + + IAM + 72 CONTINUE + 71 CONTINUE + 70 CONTINUE + + RESP = RESP / FLOAT(NT) + + RETURN + END diff --git a/Donjon/src/DETINI.f b/Donjon/src/DETINI.f new file mode 100644 index 0000000..395ab02 --- /dev/null +++ b/Donjon/src/DETINI.f @@ -0,0 +1,130 @@ +*DECK DETINI + SUBROUTINE DETINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Reads detector information and stores them +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, E. Varin, M. Guyot +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The DETINI: module specification is: +* DETECT := DETINI: [ DETECT ] :: (descdet) ; +* where +* DETECT : name of the \emph{detect} object that will be created by the +* module; it will contain the detector informations. If \emph{detect} +* appear on RHS, it is updated, otherwise, it is created. +* (descdev) : structure describing the input data to the DETINI: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE + PARAMETER (NSTATE=40) + CHARACTER TEXT*12,HSIGN*12 + INTEGER ISTATE(NSTATE),NGRP,NDETOT,IPRT,IHEX,ITYP,NITMA + REAL FLOT + DOUBLE PRECISION DFLOT + LOGICAL LHEX,LDET,LENTRY + TYPE(C_PTR) IPDET +*---- +* PARAMETER VALIDATION +*---- + NDETOT = 0 + NGRP = 0 + LENTRY=.FALSE. + ISTATE(:NSTATE)=0 +* + IF(NENTRY.NE.1) CALL XABORT('@DETINI: PARAMETER EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('@D' + + //'ETINI: LINKED LIST OR XSM FILE EXPECTED AT LHS.') + IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('@D' + + //'ETINI: CREATE OR MODIFICATION MODE EXPECTED.') +* + IPDET=KENTRY(1) + IF(JENTRY(1).EQ.1) THEN + TEXT=HENTRY(1) + LENTRY=.TRUE. + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_DETECT')CALL XABORT('@DETINI: L_DETECT' + + //' OBJECT IS EXPECTED (OBJECT='//TEXT//')') + CALL LCMGET(IPDET,'STATE-VECTOR',ISTATE) + NGRP = ISTATE(1) + NDETOT = ISTATE(2) + ENDIF +*---- +* READ INPUT DATA +*---- + IPRT = 0 + LHEX = .FALSE. + LDET= .FALSE. + IHEX = 0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@DETINI: CHARACTER DATA' + + //' EXPECTED(1).') + IF(TEXT.EQ.'EDIT') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DETINI: INTEGER DATA EXPECTED(1).') + IPRT=MAX(0,NITMA) + ELSEIF(TEXT.EQ.'HEXZ')THEN + LHEX=.TRUE. + ELSEIF(TEXT.EQ.'NGRP')THEN + CALL REDGET(ITYP,NGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DETINI: INTEGER DATA EXPECTED(2).') + IF(JENTRY(1).EQ.1) THEN + CALL XABORT('@DETINI: ENERGY GROUP NUMBER REQUIRED ONLY AT' + + //' CREATION OF L_DETECT OBJECT') + ENDIF + ELSEIF(TEXT.EQ.'TYPE')THEN + CALL DETDRV(IPDET,NGRP,IPRT,LHEX,NDETOT,LENTRY) + ELSEIF(TEXT.EQ.';')THEN + LDET=.TRUE. + ELSE + CALL XABORT('@DETINI: INVALID KEYWORD '//TEXT) + ENDIF + IF(.NOT.LDET) GOTO 10 +*---- +* STATE-VECTOR STORAGE +*---- + IF(JENTRY(1).EQ.0) THEN + HSIGN='L_DETECT' + CALL LCMSIX(IPDET,' ',0) + CALL LCMPTC(IPDET,'SIGNATURE',12,HSIGN) + ENDIF + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NDETOT + IF(LHEX) ISTATE(3)=1 + CALL LCMPUT(IPDET,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(IPRT.GT.2) CALL LCMLIB(IPDET) + RETURN + END diff --git a/Donjon/src/DETINT.f b/Donjon/src/DETINT.f new file mode 100644 index 0000000..5ee212c --- /dev/null +++ b/Donjon/src/DETINT.f @@ -0,0 +1,100 @@ +*DECK DETINT + SUBROUTINE DETINT(NX,NY,NZ,NEL,NUN,LPARAB,MESHX,MESHY,MESHZ, + + KEYF,FLUX,NGRP,DEVPOS,RESP,IPRT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver for the interpolation. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: +* NX number of x mesh-splitted elements +* NY number of y mesh-splitted elements +* NZ number of z mesh-splitted elements +* NEL number of finite elements +* NUN number of unknowns +* LPARAB =.TRUE. if parabolic interpolation is performed +* MESHX regions coordinates according to x +* MESHY regions coordinates according to y +* MESHZ regions coordinates according to z +* KEYF keyflux recover from L_TRACk object +* FLUX flux for each mesh-splitted elements +* NGRP number of energy groups +* DEVPOS detector coordinates +* RESP flux reads by the detector +* IPRT printing index +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NX,NY,NZ,NEL,NUN,NGRP,IPRT,KEYF(NEL) + REAL MESHX(NX+1),MESHY(NY+1),MESHZ(NZ+1),FLUX(NUN,NGRP),RESP, + 1 DEVPOS(6) + LOGICAL LPARAB +*---- +* LOCAL VARIABLES +*---- + INTEGER NXP1,NYP1,NZP1,NDET,I,IM + REAL COR(3) + REAL, ALLOCATABLE, DIMENSION(:) :: XCT,YCT,ZCT +*---- +* SCRATCH STORAGE ALLOCATION +* XCT center coordinates of each mesh-splitted elements for x +* YCT center coordinates of each mesh-splitted elements for y +* ZCT center coordinates of each mesh-splitted elements for z +* COR center detector coordinates +*---- + ALLOCATE(XCT(NX),YCT(NY),ZCT(NZ)) +* + NXP1 = NX+1 + NYP1 = NY+1 + NZP1 = NZ+1 + + IF(IPRT.GT.1) + + WRITE(6,*) 'INTERPOLATION POLYNOMIALE DES LECTURES AUX VANADIUM' + NDET = 1 +*---- +* CENTER MESH CALCULATION +*---- + DO 10 I=1,NX + XCT(I) = (MESHX(I+1) + MESHX(I)) /2. + 10 CONTINUE + DO 11 I=1,NY + YCT(I) = (MESHY(I+1) + MESHY(I)) /2. + 11 CONTINUE + DO 12 I=1,NZ + ZCT(I) = (MESHZ(I+1) + MESHZ(I)) /2. + 12 CONTINUE +*---- +* CENTER DETECTOR COORDINATE +*---- + DO 13 I=1,3 + COR(I) = (DEVPOS(2*I) + DEVPOS(2*I-1)) /2. + 13 CONTINUE + IF(LPARAB) THEN +*---- +* POLYNOMIAL FLUX INTERPOLATION AT DETECTOR SITES +*---- + CALL DETCTL(NX,NY,NZ,NEL,FLUX(1,2),RESP,NDET,XCT,YCT,ZCT,COR, + > KEYF,IPRT) + ELSE + IM = MAX(NX,NY) + IM = MAX(IM,NZ) + CALL DETSPL(NX,NY,NZ,IM,FLUX(1,2),RESP,NDET,XCT,YCT,ZCT,COR, + > KEYF,IPRT) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ZCT,YCT,XCT) + RETURN + END diff --git a/Donjon/src/DETLIN.f b/Donjon/src/DETLIN.f new file mode 100644 index 0000000..a326560 --- /dev/null +++ b/Donjon/src/DETLIN.f @@ -0,0 +1,25 @@ +*DECK DETLIN + SUBROUTINE DETLIN(X1,X2,Y1,Y2,BS,CS) +* +*---------------------------------------------------------------------- +*Purpose: +* Routine calculating the linear coefficient needed for a linear +* interpolation Y = BS*X + CS +* +*Author(s): +* M. Beaudet +* +*Parameters: +* X1 +* X2 +* Y1 +* Y2 +* BS +* CS +* +*---------------------------------------------------------------------- +* + BS = (Y1-Y2)/(X1-X2) + CS = Y1-BS*X1 + RETURN + END diff --git a/Donjon/src/DETPAR.f b/Donjon/src/DETPAR.f new file mode 100644 index 0000000..d4feb2a --- /dev/null +++ b/Donjon/src/DETPAR.f @@ -0,0 +1,31 @@ +*DECK DETPAR + SUBROUTINE DETPAR(X1,X2,X3,Y1,Y2,Y3,AS,BS,CS) +* +*---------------------------------------------------------------------- +*Purpose: +* Routine calculating the parabolic coefficients needed for +* a parabolic interpolation Y = AS*X*X + BS*X + CS +* +*Author(s): +* M. Beaudet +* +*Parameters: +* X1 +* X2 +* X3 +* Y1 +* Y2 +* Y3 +* AS +* BS +* CS +* +*---------------------------------------------------------------------- +* + ANUM = Y1*(X2-X3)+Y3*(X1-X2)+Y2*(X3-X1) + ADEN = (X1-X2)*(X1-X3)*(X2-X3) + AS = ANUM/ADEN + BS = (Y2-Y3-AS*(X2*X2-X3*X3))/(X2-X3) + CS = Y1-BS*X1-AS*X1*X1 + RETURN + END diff --git a/Donjon/src/DETPAR2.f b/Donjon/src/DETPAR2.f new file mode 100644 index 0000000..94f0db9 --- /dev/null +++ b/Donjon/src/DETPAR2.f @@ -0,0 +1,31 @@ +*DECK DETPAR2 + SUBROUTINE DETPAR2(V1,V2,V3,U1,U2,U3,AS,BS,CS) +* +*---------------------------------------------------------------------- +*Purpose: routine de HQSIMEX +* +*Author(s): +* M. Beaudet +* +*Parameters: +* V1 +* V2 +* V3 +* U1 +* U2 +* U3 +* AS +* BS +* CS +* +*---------------------------------------------------------------------- +* + CHARACTER*6 CLNAME + CLNAME = 'PAR' + ANUM = U1*(V2-V3)+U3*(V1-V2)+U2*(V3-V1) + ADEN = (V1-V2)*(V1-V3)*(V2-V3) + AS = ANUM/ADEN + BS = (U2-U3-AS*(V2*V2-V3*V3))/(V2-V3) + CS = U1-BS*V1-AS*V1*V1 + RETURN + END diff --git a/Donjon/src/DETPLAT.f b/Donjon/src/DETPLAT.f new file mode 100644 index 0000000..cca4764 --- /dev/null +++ b/Donjon/src/DETPLAT.f @@ -0,0 +1,95 @@ +*DECK DETPLAT + SUBROUTINE DETPLAT(DT,RESPON,REF,KC,PDD,REGUL,PDF,PDT,NDDG, + + AP,BP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Computes platinum detector reading with delay time consideration +* and normalized to a reference value. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin +* +*Parameters: +* DT +* RESPON +* REF +* KC +* PDD +* REGUL +* PDF +* PDT +* NDDG +* AP +* BP +* +*----------------------------------------------------------------------- +* + INTEGER NDDG,I + REAL RESPON,REF,DT + REAL AEP,AP(NDDG),BP(NDDG),PDT(NDDG),PDF(NDDG+1),PDD(NDDG),PDO + LOGICAL REGUL +* +* FLUX AT DETECTOR SITE +* --------------------- + IF ( KC.EQ.0) THEN +* REFERENCE CALCULATION +* + PDO = RESPON + IF (REGUL) THEN + CALL DETFIL(PDO,RESPON,RESPON,25.,DT,1) + ENDIF + IF (PDO.EQ.0.0) THEN + PDO = 1. + WRITE(6,*)'===> DETECTOR HAS AN INITIAL ZERO VALUE <===' + ENDIF + REF = PDO + ENDIF +* +* NORMALIZATION TO REFERENCE VALUE +* + RESPON = RESPON/REF +* + DO 10 I = 1 , NDDG +* + AEP = DT*PDT(I) + AP(I) = 1.0 +* + IF (AEP.GT.20.0) THEN + AEP = 20.0 + ENDIF + IF (AEP.GT.1.0E-6) THEN + AP(I) = EXP ( -AEP ) + ENDIF + BP(I) = 1.0 - AP(I) +* +10 CONTINUE +* + IF (KC.EQ.0) THEN +* +* INITIALISATION AT REFERENCE CALCULATION +* --------------------------------------- +* + DO 20 I = 1 , NDDG + PDD(I) = PDF(I+1) * RESPON +20 CONTINUE + ENDIF +* +* CALCULATION OF DETECTOR RESPONSE +* -------------------------------- +* + PDO = 0.0 + PDO = PDF(1)*RESPON + DO 30 I = 1 , NDDG + PDD(I) = AP(I)*PDD(I) + BP(I)*PDF(I+1)*RESPON + PDO = PDO + PDD(I) + 30 CONTINUE +* + RESPON = PDO +* + RETURN + END diff --git a/Donjon/src/DETPOL.f b/Donjon/src/DETPOL.f new file mode 100644 index 0000000..10e0544 --- /dev/null +++ b/Donjon/src/DETPOL.f @@ -0,0 +1,73 @@ +*DECK DETPOL + REAL FUNCTION DETPOL(VECT,IXX,JJJ,K0,I1,I2,I3,X1,X2,X3,X) +* +*---------------------------------------------------------------------- +*Purpose: +* Function performing the parabolic interpolation at X. +* +*Author(s): +* M. Beaudet +* +*Parameters: +* DETPOL +* VECT +* IXX +* JJJ +* K0 +* I1 +* I2 +* I3 +* X1 +* X2 +* X3 +* X +* +*---------------------------------------------------------------------- +* + INTEGER*4 IXX(*) + REAL*4 VECT(*) +* + CHARACTER*6 CLNAME + DATA CLNAME /'INTPOL'/ +* + IJK1 = IXX(JJJ+K0+I1) + IJK2 = IXX(JJJ+K0+I2) + IJK3 = IXX(JJJ+K0+I3) +* + IZERO = 0 +* + IF (IJK1.LE.0) IZERO = IZERO + 1 + IF (IJK2.LE.0) IZERO = IZERO + 1 + IF (IJK3.LE.0) IZERO = IZERO + 1 +* + IF (IZERO.GE.2) CALL XABORT('DETPOL: INVALID VALUE OF INDICES') +* + IF (IJK1.LE.0) THEN + A2 = VECT(IJK2) + A3 = VECT(IJK3) + CALL DETLIN(X2,X3,A2,A3,BE,CE) + AH = 0.0 +* + ELSE IF (IJK2.LE.0) THEN + A1 = VECT(IJK1) + A3 = VECT(IJK3) + CALL DETLIN(X1,X3,A1,A3,BE,CE) + AH = 0.0 +* + ELSE IF (IJK3.LE.0) THEN + A1 = VECT(IJK1) + A2 = VECT(IJK2) + CALL DETLIN(X1,X2,A1,A2,BE,CE) + AH = 0.0 +* + ELSE + A1 = VECT(IJK1) + A2 = VECT(IJK2) + A3 = VECT(IJK3) + CALL DETPAR(X1,X2,X3,A1,A2,A3,AH,BE,CE) + ENDIF +* + DETPOL = AH*X*X + BE*X + CE +* + RETURN + END diff --git a/Donjon/src/DETREAD.f b/Donjon/src/DETREAD.f new file mode 100644 index 0000000..cdac6be --- /dev/null +++ b/Donjon/src/DETREAD.f @@ -0,0 +1,119 @@ +*DECK DETREAD + SUBROUTINE DETREAD(IPDET,TYPE,NREP,IPRT,LHEX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* This subroutine reads detector parameters and store them +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, E. Varin, M. Guyot +* +*Parameters: input/output +* IPDET pointer to the L_DETECT object. +* TYPE +* NREP number of values stored for detector response +* IPRT printing flag +* LHEX =.TRUE. if it is an hexagonal geometry +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDET + INTEGER NREP,IPRT + LOGICAL LHEX + CHARACTER TYPE*12 +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT*12,NAMDET*12 + INTEGER ITYP,NITMA,NHEX,I + REAL FLOT,DEVPOS(6) + DOUBLE PRECISION DFLOT + LOGICAL LEND,LPOS,LRESP,LHEX2 + INTEGER, ALLOCATABLE, DIMENSION(:) :: IHEX + REAL, ALLOCATABLE, DIMENSION(:) :: REP +*---- +* READING INFORMATION LINKED TO DETECTOR PARAMETERS +*---- + LEND=.FALSE. + LPOS=.FALSE. + LRESP=.FALSE. + LHEX2=.FALSE. + + ALLOCATE(REP(NREP)) + + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@DETREAD: CHARACTER DATA' + + //' EXPECTED(1)') + IF(TEXT.EQ.'NAME') THEN + CALL REDGET(ITYP,NITMA,FLOT,NAMDET,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@DETREAD: CHARACTER DATA' + + //' EXPECTED(2)') + ELSEIF(TEXT.EQ.'NHEX') THEN + LHEX2=.TRUE. + IF(.NOT.LHEX )CALL XABORT('@DETREAD: INVALID KEYWORD NHEX') + CALL REDGET(ITYP,NHEX,FLOT,TEXT,DFLOT) + IF (ITYP.NE.1) CALL XABORT('@DETREAD: INTEGER DATA' + + //' EXPECTED(1)') + ALLOCATE(IHEX(NHEX)) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF((ITYP.NE.3).AND.(TEXT.EQ.'HEX')) CALL XABORT('@DETREAD:' + + //' CHARACTER DATA EXPECTED HEX') + ELSEIF(TEXT.EQ.'HEX') THEN + DO 20 I=1,NHEX + CALL REDGET(ITYP,IHEX(I),FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) + + CALL XABORT('@DETREAD: INTEGER DATA EXPECTED FOR HEX') + 20 CONTINUE + ELSEIF(TEXT.EQ.'POSITION') THEN + LPOS=.TRUE. + DO 30 I=1,6 + CALL REDGET(ITYP,NITMA,DEVPOS(I),TEXT,DFLOT) + IF (ITYP.NE.2) CALL XABORT('@DETREAD: REAL DATA EXPECTED(2)') + 30 CONTINUE + ELSEIF(TEXT.EQ.'RESP') THEN + LRESP=.TRUE. + DO 40 I=1,NREP + CALL REDGET(ITYP,NITMA,REP(I),TEXT,DFLOT) + IF (ITYP.NE.2)CALL XABORT('@DETREAD: REAL DATA EXPECTED(2)') + 40 CONTINUE + ELSEIF(TEXT.EQ.'ENDN') THEN + LEND=.TRUE. + ELSE + CALL XABORT('@DETREAD: WRONG KEYWORD') + ENDIF + + IF(.NOT.LEND) GOTO 10 +*---- +* READING INFORMATION LINKED TO DETECTOR PARAMETERS +*---- + IF((.NOT.LPOS).OR.(.NOT.LRESP)) CALL XABORT('@DETREAD: POSITIONS' + + //' OR RESP NOT SPECIFIED') + IF(LHEX.NEQV.LHEX2) CALL XABORT('@DETREAD: NHEX SHOULD BE' + + //' SPECIFIED') + + CALL LCMSIX(IPDET,' ',0) + CALL LCMSIX(IPDET,TYPE,1) + CALL LCMSIX(IPDET,NAMDET,1) + CALL LCMPUT(IPDET,'POSITION',6,2,DEVPOS) + IF(LHEX)CALL LCMPUT(IPDET,'NHEX',NHEX,1,IHEX) + CALL LCMPUT(IPDET,'RESPON',NREP,2,REP) + IF(IPRT.GT.5) THEN + IF(LHEX) WRITE(6,50) (IHEX(I),I=1,NHEX) + WRITE(6,60) (REP(I),I=1,NREP) + ENDIF + IF(LHEX) DEALLOCATE(IHEX) + DEALLOCATE(REP) + RETURN +* + 50 FORMAT(/20H DETREAD: IHEX ARRAY/(10X,20I6)) + 60 FORMAT(/19H DETREAD: REP ARRAY/(10X,1P,10E12.4)) + END diff --git a/Donjon/src/DETRTR.f b/Donjon/src/DETRTR.f new file mode 100644 index 0000000..b014028 --- /dev/null +++ b/Donjon/src/DETRTR.f @@ -0,0 +1,59 @@ +*DECK DETRTR + SUBROUTINE DETRTR(DA,A,IA,A1,A2,A3,II1,II2,II3) +* +*---------------------------------------------------------------------- +*Purpose: +* Obtain the coordinates of a point where the interpolation is +* performed +* +*Author(s): +* ??? +* +*Parameters: +* DA +* A +* IA +* A1 +* A2 +* A3 +* II1 +* II2 +* II3 +* +*---------------------------------------------------------------------- +* + DIMENSION A(*) + CHARACTER*6 CLNAME +* + CLNAME = 'SORTR ' + DIF1 = 1000000. + DIF2 = 1000001. + DIF3 = 1000002. + II1 = 1000000 + II2 = 1000001 + II3 = 1000002 +* + DO 10 II=1,IA + DIF = ABS(DA-A(II)) + IF ( DIF .LE. DIF1 ) THEN + DIF3 = DIF2 + DIF2 = DIF1 + DIF1 = DIF + II3 = II2 + II2 = II1 + II1 = II + ELSE IF ( DIF .LE. DIF2 ) THEN + DIF3 = DIF2 + DIF2 = DIF + II3 = II2 + II2 = II + ELSE IF ( DIF .LE. DIF3 ) THEN + DIF3 = DIF + II3 = II + ENDIF + 10 CONTINUE + A1 = A(II1) + A2 = A(II2) + A3 = A(II3) + RETURN + END diff --git a/Donjon/src/DETSPL.f b/Donjon/src/DETSPL.f new file mode 100644 index 0000000..4915c51 --- /dev/null +++ b/Donjon/src/DETSPL.f @@ -0,0 +1,163 @@ +*DECK DETSPL + SUBROUTINE DETSPL(NXMAX,NYMAX,NZMAX,IM,FLUX,FLUXIN,NINT,XCNTR, + > YCNTR,ZCNTR,COORD,IXX,IPRT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver for the spline interpolation. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin +* +*Parameters: +* NXMAX +* NYMAX +* NZMAX +* IM +* FLUX +* FLUXIN +* NINT +* XCNTR +* YCNTR +* ZCNTR +* COORD +* IXX +* IPRT +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NXMAX,NYMAX,NZMAX,IM,NINT,IXX(*),IPRT + REAL FLUX(*),FLUXIN(NINT),XCNTR(NXMAX),YCNTR(NYMAX),ZCNTR(NZMAX), + > COORD(*) +*---- +* LOCAL VARIABLES +*---- + LOGICAL L1DSET + REAL, ALLOCATABLE, DIMENSION(:) :: FDUMMY,FXINT,FYINT,FZINT,F2X, + > F2Y,F2Z + REAL, ALLOCATABLE, DIMENSION(:,:) :: FXY,FYZ,FZX + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FXYZ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(FXYZ(NXMAX,NYMAX,NZMAX),FDUMMY(IM),FXINT(NXMAX), + > FYINT(NYMAX),FZINT(NZMAX),FXY(NXMAX,NYMAX),FYZ(NYMAX,NZMAX), + > FZX(NZMAX,NXMAX),F2X(NXMAX),F2Y(NYMAX),F2Z(NZMAX)) +*---- +* SECOND DERIVATIVE IS CALCULATED BASED ON X(I), Y(I) (DEFAULT) +*---- + FP1 = 0.0 + FP2 = 0.0 +*---- +* ASSEMBLE THE ARRAY FXYZ OVER THE FULL MESH +*---- + NXNY = NXMAX*NYMAX +* + DO 10 J=1,NXMAX + IX = J + DO 20 I=1,NYMAX + IY = NXMAX*(I - 1) + DO 30 K=1,NZMAX + IZ = NXNY*(K - 1) +* + IDX = IX + IY + IZ + IF (IXX(IDX).EQ.0) THEN + FXYZ(J,I,K) = 0.0 + ELSE + FXYZ(J,I,K) = FLUX(IXX(IDX)) + ENDIF +* + 30 CONTINUE + 20 CONTINUE +10 CONTINUE +*---- +* CALCULATE THE COORDINATES TO INTERPOLATE +*---- + IF(IPRT.GT.4) WRITE(6,1000) + IF(IPRT.GT.4) WRITE(6,2000) + + N1 = NXMAX + N2 = NYMAX + N3 = NZMAX + + DO 40 N=1,NINT + ININT = 3*(N-1) + + XINT = COORD(ININT + 1) + YINT = COORD(ININT + 2) + ZINT = COORD(ININT + 3) +*---- +* INTERPOLATE IN TWO DIMENSIONS AT XINT,YINT FOR EACH Z PLANE +*---- + ITYPE = 1 + CALL DETSPL3(XCNTR ,YCNTR ,ZCNTR , + > NXMAX ,NYMAX ,NZMAX , + > FXYZ ,FXY ,FDUMMY, + > F2X ,F2Y ,F2Z , + > XINT ,YINT ,ZINT , + > FP1 ,FP2 , + > FYINT ,FZINT ,FINTR1, + > N1 ,N2 ,N3 ,ITYPE) + + L1DSET = .TRUE. + IF (L1DSET) GOTO 1 +*---- +* INTERPOLATE IN TWO DIMENSIONS AT YINT,ZINT FOR EACH X PLANE +*---- + ITYPE = 2 + CALL DETSPL3(YCNTR ,ZCNTR ,XCNTR , + > NYMAX ,NZMAX ,NXMAX , + > FXYZ ,FYZ ,FDUMMY, + > F2Y ,F2Z ,F2X , + > YINT ,ZINT ,XINT , + > FP1 ,FP2 , + > FZINT ,FXINT ,FINTR2, + > N1 ,N2 ,N3 ,ITYPE) +* + IF(IPRT.GT.4) WRITE(6,3000) XINT,YINT,ZINT,FINTR2 +*---- +* INTERPOLATE IN TWO DIMENSIONS AT ZINT,XINT FOR EACH Y PLANE +*---- + ITYPE = 3 + CALL DETSPL3(ZCNTR ,XCNTR ,YCNTR , + > NZMAX ,NXMAX ,NYMAX , + > FXYZ ,FZX ,FDUMMY, + > F2Z ,F2X ,F2Y , + > ZINT ,XINT ,YINT , + > FP1 ,FP2 , + > FXINT ,FYINT ,FINTR3, + > N1 ,N2 ,N3 ,ITYPE) + + IF(IPRT.GT.4) WRITE(6,3000) XINT,YINT,ZINT,FINTR3 +*---- +* GET AVERAGE VALUE +*---- + 1 FI = FINTR1 + + IF(IPRT.GT.4) WRITE(6,4000) N,XINT,YINT,ZINT,FI + + FLUXIN(N) = FI + + 40 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(F2Z,F2Y,F2X,FZX,FYZ,FXY,FZINT,FYINT,FXINT,FDUMMY,FXYZ) + RETURN +* + 1000 FORMAT(1H1,//,5X,'*** INTERPOLATION PROCESS',/) + 2000 FORMAT(//,1X,'DET NO' ,5X,4X,'XP',4X, 4X,'YP',4X, 4X,'ZP',4X, + > 7X,'FI',6X,//) + 3000 FORMAT( 1X,6X ,5X,F8.3 ,2X, F8.3 ,2X, F8.3,2X, + > 3X,1PE12.5) + 4000 FORMAT( 4X,I3.3 ,5X,F8.3 ,2X, F8.3 ,2X, F8.3,2X, + > 3X,1PE12.5) + + END diff --git a/Donjon/src/DETSPL2.f b/Donjon/src/DETSPL2.f new file mode 100644 index 0000000..f5aa08d --- /dev/null +++ b/Donjon/src/DETSPL2.f @@ -0,0 +1,65 @@ +*DECK DETSPL2 + SUBROUTINE DETSPL2(XCNTR ,YCNTR ,NXMAX ,NYMAX ,FXY, + > FP1 ,FP2 ,F2X ,F2Y ,FDUMMY, + > XINT ,YINT ,FYINT ,FXYINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Perform spline interpolation. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin +* +*Parameters: +* XCNTR +* YCNTR +* NXMAX +* NYMAX +* FXY +* FP1 +* FP2 +* F2X +* F2Y +* FDUMMY +* XINT +* YINT +* FYINT +* FXYINT +* +*----------------------------------------------------------------------- +* + REAL*4 XCNTR(NXMAX),YCNTR(NYMAX),FXY(NXMAX,NYMAX), + > XINT ,YINT ,FXYINT, + > F2X(NXMAX) ,F2Y(NYMAX) ,FYINT(NYMAX), + > FDUMMY(NXMAX) +*---- +* CALCULATE THE SECOND DERIVATIVES ALONG XCNTR FOR EACH Y +*---- + DO 10 I=1,NYMAX + + DO 20 J=1,NXMAX + FDUMMY(J) = FXY(J,I) + 20 CONTINUE + + CALL DETSPLI(XCNTR,FDUMMY,NXMAX,FP1,FP2,F2X) +*---- +* INTERPOLATE ALONG THE X COORDINATE FOR EACH Y +*---- + CALL DETSPLI2(XCNTR,FDUMMY,F2X,NXMAX,XINT,FYINT(I)) + + 10 CONTINUE +*---- +* CALCULATE SECOND DERIVATIVE ALONG Y FOR XINT +*---- + CALL DETSPLI(YCNTR,FYINT,NYMAX,FP1,FP2,F2Y) +*---- +* INTERPOLATE ALONG Y FOR XINT +*---- + CALL DETSPLI2(YCNTR,FYINT,F2Y,NYMAX,YINT,FXYINT) + + RETURN + END diff --git a/Donjon/src/DETSPL3.f b/Donjon/src/DETSPL3.f new file mode 100644 index 0000000..7327366 --- /dev/null +++ b/Donjon/src/DETSPL3.f @@ -0,0 +1,94 @@ +*DECK DETSPL3 + SUBROUTINE DETSPL3(XCNTR ,YCNTR ,ZCNTR , + > NXMAX ,NYMAX ,NZMAX , + > FXYZ ,FXY ,FDUMMY, + > F2X ,F2Y ,F2Z , + > XINT ,YINT ,ZINT , + > FP1 ,FP2 , + > FYINT ,FZINT ,FINTRP, + > N1 ,N2 ,N3 ,ITYPE) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Perform spline interpolation. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin +* +* +*Parameters: +* XCNTR +* YCNTR +* ZCNTR +* NXMAX +* NYMAX +* NZMAX +* FXYZ +* FXY +* FDUMMY +* F2X +* F2Y +* F2Z +* XINT +* YINT +* ZINT +* FP1 +* FP2 +* FYINT +* FZINT +* FINTRP +* N1 +* N2 +* N3 +* ITYPE +* +*----------------------------------------------------------------------- +* + REAL*4 XCNTR(NXMAX) ,YCNTR(NYMAX) ,ZCNTR(NZMAX), + > FXYZ(N1,N2,N3),FXY(NXMAX,NYMAX) , + > FYINT(NYMAX) ,FZINT(NZMAX) , + > F2X(NXMAX) ,F2Y(NYMAX) ,F2Z(NZMAX), + > FDUMMY(NXMAX) +*---- +* INTERPOLATE IN TWO DIMENSIONS AT XINT,YINT FOR EACH Z PLANE +*---- + DO 10 K=1,NZMAX + + DO 20 J=1,NXMAX + DO 30 I=1,NYMAX + + IF (ITYPE.EQ.1) THEN + FXY(J,I) = FXYZ(J,I,K) + ELSE IF (ITYPE.EQ.2) THEN + FXY(J,I) = FXYZ(K,J,I) + ELSE IF (ITYPE.EQ.3) THEN + FXY(J,I) = FXYZ(I,K,J) + ELSE + CALL XABORT('DETSPL3: ERROR IN SPLIN3') + ENDIF + + 30 CONTINUE + 20 CONTINUE + + CALL DETSPL2(XCNTR,YCNTR,NXMAX ,NYMAX ,FXY, + > FP1 ,FP2 ,F2X ,F2Y ,FDUMMY, + > XINT ,YINT ,FYINT ,FXYINT) + + FZINT(K) = FXYINT + + 10 CONTINUE +*---- +* CALCULATE SECOND DERIVATIVE ALONG Z AT XINT,YINT +*---- + CALL DETSPLI(ZCNTR,FZINT,NZMAX,FP1,FP2,F2Z) +*---- +* INTERPOLATE ALONG Z FOR XINT,YINT +*---- + CALL DETSPLI2(ZCNTR,FZINT,F2Z,NZMAX,ZINT,FINTRP) + + RETURN + END diff --git a/Donjon/src/DETSPLI.f b/Donjon/src/DETSPLI.f new file mode 100644 index 0000000..93eaa70 --- /dev/null +++ b/Donjon/src/DETSPLI.f @@ -0,0 +1,40 @@ +*DECK DETSPLI + SUBROUTINE DETSPLI(X,Y,N,YP1,YPN,Y2) +* +*Parameters: +* X +* Y +* N +* YP1 +* YPN +* Y2 +* + PARAMETER (NMAX=100) + DIMENSION X(N),Y(N),Y2(N),U(NMAX) + IF (YP1.GT..99E30) THEN + Y2(1)=0. + U(1)=0. + ELSE + Y2(1)=-0.5 + U(1)=(3./(X(2)-X(1)))*((Y(2)-Y(1))/(X(2)-X(1))-YP1) + ENDIF + DO 11 I=2,N-1 + SIG=(X(I)-X(I-1))/(X(I+1)-X(I-1)) + P=SIG*Y2(I-1)+2. + Y2(I)=(SIG-1.)/P + U(I)=(6.*((Y(I+1)-Y(I))/(X(I+1)-X(I))-(Y(I)-Y(I-1)) + * /(X(I)-X(I-1)))/(X(I+1)-X(I-1))-SIG*U(I-1))/P +11 CONTINUE + IF (YPN.GT..99E30) THEN + QN=0. + UN=0. + ELSE + QN=0.5 + UN=(3./(X(N)-X(N-1)))*(YPN-(Y(N)-Y(N-1))/(X(N)-X(N-1))) + ENDIF + Y2(N)=(UN-QN*U(N-1))/(QN*Y2(N-1)+1.) + DO 12 K=N-1,1,-1 + Y2(K)=Y2(K)*Y2(K+1)+U(K) +12 CONTINUE + RETURN + END diff --git a/Donjon/src/DETSPLI2.f b/Donjon/src/DETSPLI2.f new file mode 100644 index 0000000..1d37d25 --- /dev/null +++ b/Donjon/src/DETSPLI2.f @@ -0,0 +1,31 @@ +*DECK DETSPLI2 + SUBROUTINE DETSPLI2(XA,YA,Y2A,N,X,Y) +* +*Parameters: +* XA +* YA +* Y2A +* N +* X +* Y +* + DIMENSION XA(N),YA(N),Y2A(N) + KLO=1 + KHI=N +1 IF (KHI-KLO.GT.1) THEN + K=(KHI+KLO)/2 + IF(XA(K).GT.X)THEN + KHI=K + ELSE + KLO=K + ENDIF + GOTO 1 + ENDIF + H=XA(KHI)-XA(KLO) + IF (H.EQ.0.) CALL XABORT('DETSPLI2: BAD XA INPUT.') + A=(XA(KHI)-X)/H + B=(X-XA(KLO))/H + Y=A*YA(KLO)+B*YA(KHI)+ + * ((A**3-A)*Y2A(KLO)+(B**3-B)*Y2A(KHI))*(H**2)/6. + RETURN + END diff --git a/Donjon/src/DEVDGD.f b/Donjon/src/DEVDGD.f new file mode 100644 index 0000000..2f9d7f5 --- /dev/null +++ b/Donjon/src/DEVDGD.f @@ -0,0 +1,155 @@ +*DECK DEVDGD + SUBROUTINE DEVDGD(IPDEV,NROD,DGRP,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Create rod-device group directories on the device data structure. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPDEV pointer to device information. +* NROD total number of rod-devices. +* DGRP total number of rod-device groups. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDEV + INTEGER NROD,DGRP,IMPX +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + CHARACTER TEXT*12 + INTEGER RODID(NROD) + DOUBLE PRECISION DFLOT + TYPE(C_PTR) JPDEV,KPDEV +*---- +* CREATE GROUPS +*---- + JPDEV=LCMLID(IPDEV,'ROD_GROUP',DGRP) + IGRP=0 + IF(IMPX.GT.0)WRITE(IOUT,1001) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVDGD: KEYWORD GROUP-ID EXPECTED.') + IF(TEXT.NE.'GROUP-ID')CALL XABORT('@DEVDGD: KEYWORD GROUP-' + 1 //'ID EXPECTED.') + 10 IGRP=IGRP+1 + CALL REDGET(ITYP,JGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DEVDGD: INTEGER GROUP-ID NUMBER' + 1 //' EXPECTED.') + IF(JGRP.NE.IGRP)THEN + WRITE(IOUT,*)'@DEVDGD: READ GROUP-ID NUMBER #',JGRP + WRITE(IOUT,*)'@DEVDGD: EXPECTED GROUP-ID NUMBER #',IGRP + CALL XABORT('@DEVDGD: WRONG GROUP-ID NUMBER.') + ENDIF + IF(JGRP.GT.DGRP)THEN + WRITE(IOUT,*)'@DEVDGD: GIVEN TOTAL NUMBER OF GROUPS ',DGRP + WRITE(IOUT,*)'@DEVDGD: READ GROUP-ID NUMBER #',JGRP + CALL XABORT('@DEVDGD: WRONG GROUP-ID NUMBER.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVDGD: KEYWORD EXPECTED.') +*---- +* OPTION ALL +*---- + IF(TEXT.EQ.'ALL')THEN + KPDEV=LCMDIL(JPDEV,IGRP) + DO 30 ID=1,NROD + RODID(ID)=ID + 30 CONTINUE + CALL LCMPUT(KPDEV,'GROUP-ID',1,1,IGRP) + CALL LCMPUT(KPDEV,'NUM-ROD',1,1,NROD) + CALL LCMPUT(KPDEV,'ROD-ID',NROD,1,RODID) +* + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVDGD: WRONG INPUT DATA.') + IF(TEXT.EQ.';')THEN + IF(IGRP.EQ.DGRP)THEN + NDG=NROD + GOTO 100 + ENDIF + WRITE(IOUT,*)'@DEVDGD: GIVEN TOTAL NUMBER OF GROUPS ',DGRP + WRITE(IOUT,*)'@DEVDGD: CREATED ONLY NUMBER OF GROUPS ',IGRP + CALL XABORT('@DEVDGD: WRONG NUMBER OF GROUPS.') + ELSEIF(TEXT.EQ.'GROUP-ID')THEN + IF(IMPX.GT.0)WRITE(IOUT,1000)IGRP,NROD + GOTO 10 + ELSE + CALL XABORT('@DEVDGD: WRONG KEYWORD '//TEXT) + ENDIF +*---- +* OPTION ROD-ID +*---- + ELSEIF(TEXT.EQ.'ROD-ID')THEN + NDG=0 + RODID(:NROD)=0 + KPDEV=LCMDIL(JPDEV,IGRP) +* + 50 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.3)THEN + IF(TEXT.EQ.';')THEN + IF(IGRP.EQ.DGRP)GOTO 100 + WRITE(IOUT,*)'@DEVDGD: GIVEN TOTAL NUMBER OF GROUPS ',DGRP + WRITE(IOUT,*)'@DEVDGD: CREATED ONLY NUMBER OF GROUPS ',IGRP + CALL XABORT('@DEVDGD: WRONG NUMBER OF GROUPS.') + ELSEIF(TEXT.EQ.'GROUP-ID')THEN + IF(IMPX.GT.0)WRITE(IOUT,1000)IGRP,NDG + GOTO 10 + ELSE + CALL XABORT('@DEVDGD: WRONG KEYWORD '//TEXT) + ENDIF +*---- +* ROD-ID NUMBERS +*---- + ELSEIF(ITYP.EQ.1)THEN + ID=NITMA + IF((ID.GT.NROD).OR.(ID.LE.0))THEN + WRITE(IOUT,*)'@DEVDGD: FOR THE GROUP #',IGRP + WRITE(IOUT,*)'@DEVDGD: READ ROD-ID #',ID + CALL XABORT('@DEVDGD: WRONG ROD-ID NUMBER.') + ENDIF + DO I=1,NROD + IF(ID.EQ.RODID(I))THEN + WRITE(IOUT,*)'@DEVDGD: FOR THE GROUP #',IGRP + WRITE(IOUT,*)'@DEVDGD: REPEATED ROD-ID #',ID + CALL XABORT('@DEVDGD: WRONG ROD-ID NUMBER.') + ENDIF + ENDDO +* + NDG=NDG+1 + IF(NDG.GT.NROD)THEN + WRITE(IOUT,*)'@DEVDGD: FOR THE GROUP #',IGRP + WRITE(IOUT,*)'@DEVDGD: WRONG TOTAL NUMBER OF RODS ',NDG + CALL XABORT('@DEVDGD: INVALID INPUT OF ROD-DEVICES.') + ENDIF + RODID(NDG)=ID + CALL LCMPUT(KPDEV,'GROUP-ID',1,1,IGRP) + CALL LCMPUT(KPDEV,'NUM-ROD',1,1,NDG) + CALL LCMPUT(KPDEV,'ROD-ID',NDG,1,RODID) + ELSE + CALL XABORT('@DEVDGD: WRONG INPUT DATA.') + ENDIF + GOTO 50 + ELSE + CALL XABORT('@DEVDGD: WRONG KEYWORD '//TEXT) + ENDIF + 100 IF(IMPX.GT.0)WRITE(IOUT,1000)IGRP,NDG + IF(IMPX.GT.0)WRITE(IOUT,1002)DGRP + RETURN +* + 1000 FORMAT(/1X,' => CREATED A GROUP #',I2.2, + 1 4X,'INCLUDES TOTAL NUMBER OF RODS:',I3) + 1001 FORMAT(/1X,'** CREATING GROUPS FOR ROD-DEVICES **') + 1002 FORMAT(/1X,39('-')/1X,'TOTAL NUMBER OF GROUPS CREATED: ',I2) + END diff --git a/Donjon/src/DEVDRV.f b/Donjon/src/DEVDRV.f new file mode 100644 index 0000000..bbe4f20 --- /dev/null +++ b/Donjon/src/DEVDRV.f @@ -0,0 +1,154 @@ +*DECK DEVDRV + SUBROUTINE DEVDRV(IPDEV,IPMTX,IGEO,NMIX,NTOT,LIMIT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read specifications for the rod-devices from the input file. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki and A. Hebert +* +*Parameters: input +* IPDEV pointer to device information. +* IPMTX pointer to matex information. +* IGEO index related to the reactor geometry. +* NMIX old maximum number of material mixtures. +* NTOT old total number of all mixtures. +* LIMIT core limiting coordinates. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDEV,IPMTX + INTEGER IGEO,NMIX,NTOT + REAL LIMIT(6) +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6,MAXPRT=10) + CHARACTER TEXT*12,HSMG*131 + TYPE(C_PTR) JPDEV,KPDEV + INTEGER ISTATE(NSTATE),NRGRP,DMIX(2,MAXPRT) + DOUBLE PRECISION DFLOT + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX +*---- +* CORE LIMITS +*---- + CALL LCMPUT(IPDEV,'CORE-LIMITS',6,2,LIMIT) +*---- +* READ INPUT DATA +*---- + IMPX=1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVDRV: CHARACTER DATA EXPECTED(1).') + IF(TEXT.NE.'EDIT')GOTO 10 +* PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DEVDRV: INTEGER FOR EDIT EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVDRV: CHARACTER DATA EXPECTED(2).') + 10 IF(TEXT.NE.'NUM-ROD')CALL XABORT('@DEVDRV: KEYWORD NUM-ROD EX' + 1 //'PECTED.') +* TOTAL NUMBER OF RODS + CALL REDGET(ITYP,NROD,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DEVDRV: INTEGER TOTAL NUMBER OF ROD' + 1 //'S EXPECTED.') + IF(NROD.LT.1)CALL XABORT('@DEVDRV: WRONG TOTAL NUMBER OF RODS <1') + IF(IMPX.GT.1)WRITE(IOUT,1003) LIMIT(1),LIMIT(3),LIMIT(5),LIMIT(2), + 1 LIMIT(4),LIMIT(6) + IF(IMPX.GT.0)WRITE(IOUT,1000) NROD +* + MAXTOT=NTOT+NROD*2*MAXPRT + ALLOCATE(MIX(MAXTOT)) + MIX(:MAXTOT)=0 + CALL LCMGET(IPMTX,'MAT',MIX) +*---- +* READ OPTION +*---- + NRGRP=0 + IMODE=1 + JPDEV=LCMLID(IPDEV,'DEV_ROD',NROD) + 30 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'ROD')THEN +* READ INDIVIDUAL ROD DATA + CALL DEVGET(JPDEV,NROD,LIMIT,IMODE,IMPX) + ELSE IF(TEXT.EQ.'CREATE')THEN +* CREATE ROD-GROUPS + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'ROD-GR') CALL XABORT('@DEVDRV: KEYWORD ROD-GR EX' + 1 //'PECTED.') + CALL REDGET(ITYP,NRGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@DEVDRV: INTEGER NUMBER OF ROD-GR' + 1 //'OUPS EXPECTED.') + IF(NRGRP.LT.1) CALL XABORT('@DEVDRV: WRONG NUMBER OF GROUPS <1') + CALL DEVDGD(IPDEV,NROD,NRGRP,IMPX) + GO TO 40 + ELSE IF(TEXT.EQ.'FADE')THEN + IMODE=1 + ELSE IF(TEXT.EQ.'MOVE')THEN + IMODE=2 + ELSE IF(TEXT.EQ.';') THEN + GOTO 40 + ELSE + WRITE(HSMG,'(26H@DEVDRV: INVALID KEYWORD (,A,2H).)') TEXT + CALL XABORT(HSMG) + ENDIF + GOTO 30 +*---- +* VALIDATE ROD DATA AND SET MIXTURE INDICES +*---- + 40 IOFSET=0 + DO 60 ID=1,NROD + CALL LCMLEL(JPDEV,ID,LENGT,ITYLCM) + IF(LENGT.EQ.0) THEN + WRITE(HSMG,'(18H@DEVDRV: ROD INDEX,I5,16H IS NOT DEFINED.)') ID + CALL XABORT(HSMG) + ENDIF + KPDEV=LCMGIL(JPDEV,ID) + CALL LCMGET(KPDEV,'ROD-PARTS',NPART) + IF(NPART.GT.MAXPRT) CALL XABORT('@DEVDRV: MAXPRT OVERFLOW.') + CALL LCMGET(KPDEV,'ROD-MIX',DMIX) + DO 55 IPART=1,NPART + DO 50 I=1,2 + IOFSET=IOFSET+1 + IF(IOFSET.GT.MAXTOT) CALL XABORT('@DEVDRV: MAXTOT OVERFLOW.') + MIX(NTOT+IOFSET)=DMIX(I,IPART) + DMIX(I,IPART)=NMIX+IOFSET + 50 CONTINUE + 55 CONTINUE + CALL LCMPUT(KPDEV,'ROD-MIX',2*NPART,1,DMIX) + 60 CONTINUE +*---- +* STATE-VECTORS +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=IGEO + ISTATE(2)=NROD + ISTATE(3)=NRGRP + ISTATE(6)=IMODE + CALL LCMPUT(IPDEV,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(IMPX.GT.1)CALL LCMLIB(IPDEV) +* UPDATE MATEX + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) + ISTATE(2)=NMIX+IOFSET + ISTATE(5)=NTOT+IOFSET + CALL LCMPUT(IPMTX,'MAT',NTOT+IOFSET,1,MIX) + CALL LCMPUT(IPMTX,'STATE-VECTOR',NSTATE,1,ISTATE) + DEALLOCATE(MIX) + IF(IMPX.GT.4) CALL LCMLIB(IPMTX) + RETURN +* + 1000 FORMAT(/1X,'DEVDRV: GIVEN TOTAL NUMBER OF ROD-DEVICES:', + 1 I5//' ** READING INPUT DATA FOR RODS **') + 1003 FORMAT(//5X,'--- REACTOR CORE LIMITS ---'// + 1 1X,'Xmin',F10.4,5X,'Ymin',F10.4,5X,'Zmin',F10.4/ + 2 1X,'Xmax',F10.4,5X,'Ymax',F10.4,5X,'Zmax',F10.4/) + END diff --git a/Donjon/src/DEVGET.f b/Donjon/src/DEVGET.f new file mode 100644 index 0000000..9744aaf --- /dev/null +++ b/Donjon/src/DEVGET.f @@ -0,0 +1,279 @@ +*DECK DEVGET + SUBROUTINE DEVGET(JPDEV,NROD,LIMIT,IMODE,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read the specification for a given rod from the input file. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki and A. Hebert +* +*Parameters: input +* JPDEV pointer to LCM list object with device information. +* NROD total number of rods. +* LIMIT full-core limits. +* IMODE type of rod movement. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) JPDEV + INTEGER NROD,IMODE,IMPX + REAL LIMIT(6) +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6,MAXPRT=10) + INTEGER DMIX(2,MAXPRT) + REAL MAXPOS(6,MAXPRT),RODPOS(6,MAXPRT),LENG(2),LEVEL + DOUBLE PRECISION DFLOT + CHARACTER TEXT*12,RNAME*12,AXIS,FROM*2,HSMG*131 + TYPE(C_PTR) KPDEV +*---- +* ROD INDEX +*---- + CALL REDGET(ITYP,ID,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@DEVGET: INTEGER ROD-ID EXPECTED.') + IF(ID.LE.0) CALL XABORT('@DEVGET: POSITIVE ROD-ID EXPECTED.') + IF(ID.GT.NROD)THEN + WRITE(IOUT,*)'@DEVGET: READ CURRENT ROD-ID #',ID + WRITE(IOUT,*)'@DEVGET: GIVEN TOTAL NUMBER OF RODS:',NROD + CALL XABORT('@DEVGET: WRONG INPUT OF ROD-ID NUMBER. GREATER' + 1 //' THAN THE TOTAL NUMBER OF RODS.') + ENDIF + CALL LCMLEL(JPDEV,ID,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + WRITE(HSMG,'(18H@DEVGET: ROD INDEX,I5,16H ALREADY EXISTS.)') ID + CALL XABORT(HSMG) + ENDIF + IF(IMPX.GT.1) WRITE(IOUT,1000) ID + KPDEV=LCMDIL(JPDEV,ID) +*---- +* READ ROD-SPECIFIC DATA +*---- + IAXIS=0 + NPART=0 + ITOP=0 + LEVEL=-999.0 + SPEED=-999.0 + TIME=-999.0 + RNAME='NOT_DEFINED' + LENG(1)=MAX(LIMIT(2),LIMIT(4),LIMIT(6)) + LENG(2)=MIN(LIMIT(1),LIMIT(3),LIMIT(5)) + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@DEVGET: CHARECTER NAME EXPECTED.') + IF(TEXT.EQ.'ROD-NAME') THEN + CALL REDGET(ITYP,NITMA,FLOT,RNAME,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVGET: ROD NAME EXPECTED.') + ELSE IF(TEXT.EQ.'LEVEL') THEN + CALL REDGET(ITYP,NITMA,LEVEL,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@DEVGET: REAL LEVEL EXPECTED.') + IF(LEVEL.GT.1.0) CALL XABORT('@DEVGET: WRONG LEVEL VALUE > 1.') + IF(LEVEL.LT.0.0) CALL XABORT('@DEVGET: WRONG LEVEL VALUE < 0.') + ELSE IF(TEXT.EQ.'TIME') THEN + CALL REDGET(ITYP,NITMA,TIME,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@DEVGET: REAL FOR TIME EXPECTED.') + IF(TIME.LT.0.0) CALL XABORT('@DEVGET: WRONG TIME VALUE < 0.') + ELSE IF(TEXT.EQ.'SPEED') THEN + CALL REDGET(ITYP,NITMA,SPEED,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@DEVGET: REAL FOR SPEED EXPECTED.') + IF(SPEED.LT.0.0) CALL XABORT('@DEVGET: WRONG SPEED VALUE < 0.') + ELSE IF(TEXT.EQ.'AXIS') THEN + CALL REDGET(ITYP,NITMA,FLOT,AXIS,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DEVGET: AXIS NAME EXPECTED.') + IF(AXIS.EQ.'X') THEN + IAXIS=1 + ELSE IF(AXIS.EQ.'Y') THEN + IAXIS=2 + ELSE IF(AXIS.EQ.'Z') THEN + IAXIS=3 + ELSE + CALL XABORT('@DEVGET: X, Y OR Z EXPECTED FOR AXIS.') + ENDIF + ELSE IF(TEXT.EQ.'FROM') THEN + CALL REDGET(ITYP,NITMA,FLOT,FROM,DFLOT) + IF(FROM.EQ.'H+')THEN + ITOP=1 + ELSEIF(FROM.EQ.'H-')THEN + ITOP=-1 + ELSE + CALL XABORT('@DEVGET: KEYWORD H+ OR H- EXPECTED.') + ENDIF + ELSE IF(TEXT.EQ.'MAXPOS') THEN + NPART=NPART+1 + IF(NPART.GT.MAXPRT) CALL XABORT('@DEVGET: MAXPRT OVERFLOW.') + DO I=1,6 + CALL REDGET(ITYP,NITMA,MAXPOS(I,NPART),TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@DEVGET: REAL POSITION EXPECTED.') + ENDDO + IF(MAXPOS(2,NPART).LT.MAXPOS(1,NPART)) THEN + CALL XABORT('@DEVGET: WRONG X ROD COORDINATES: X- > X+') + ELSE IF(MAXPOS(1,NPART).LT.LIMIT(1)) THEN + CALL XABORT('@DEVGET: WRONG X- VALUE.') + ELSE IF(MAXPOS(2,NPART).GT.LIMIT(2)) THEN + CALL XABORT('@DEVGET: WRONG X+ VALUE.') + ELSE IF(MAXPOS(4,NPART).LT.MAXPOS(3,NPART)) THEN + CALL XABORT('@DEVGET: WRONG Y ROD COORDINATES: Y- > Y+') + ELSE IF(MAXPOS(3,NPART).LT.LIMIT(3)) THEN + CALL XABORT('@DEVGET: WRONG Y- VALUE.') + ELSE IF(MAXPOS(4,NPART).GT.LIMIT(4)) THEN + CALL XABORT('@DEVGET: WRONG Y+ VALUE.') + ELSE IF(MAXPOS(6,NPART).LT.MAXPOS(5,NPART)) THEN + CALL XABORT('@DEVGET: WRONG Z ROD COORDINATES: Z- > Z+') + ELSE IF(MAXPOS(5,NPART).LT.LIMIT(5)) THEN + CALL XABORT('@DEVGET: WRONG Z- VALUE.') + ELSE IF(MAXPOS(6,NPART).GT.LIMIT(6)) THEN + CALL XABORT('@DEVGET: WRONG Z+ VALUE.') + ENDIF + IF(IAXIS.EQ.0) THEN + WRITE(HSMG,'(33H@DEVGET: MISSING AXIS DATA IN ROD,I5)') ID + CALL XABORT(HSMG) + ELSE IF(IAXIS.EQ.1) THEN + LENG(1)=MIN(LENG(1),MAXPOS(1,NPART)) + LENG(2)=MAX(LENG(2),MAXPOS(2,NPART)) + ELSE IF(IAXIS.EQ.2) THEN + LENG(1)=MIN(LENG(1),MAXPOS(3,NPART)) + LENG(2)=MAX(LENG(2),MAXPOS(4,NPART)) + ELSE IF(IAXIS.EQ.3) THEN + LENG(1)=MIN(LENG(1),MAXPOS(5,NPART)) + LENG(2)=MAX(LENG(2),MAXPOS(6,NPART)) + ENDIF +* + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'DMIX') THEN + WRITE(HSMG,'(30H@DEVGET: DMIX EXPECTED FOR ROD,I5)') ID + CALL XABORT(HSMG) + ENDIF + DO I=1,2 + CALL REDGET(ITYP,DMIX(I,NPART),FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@DEVGET: INTEGER DMIX EXPECTED.') + ENDDO + ELSE IF(TEXT.EQ.'ENDROD') THEN + GO TO 20 + ELSE + WRITE(HSMG,'(26H@DEVGET: INVALID KEYWORD (,A,9H) FOR ROD,I5)') + 1 TEXT,ID + CALL XABORT(HSMG) + ENDIF + GO TO 10 +*---- +* VALIDATE ROD POSITION +*---- + 20 IF(IMPX.GT.1) THEN + DO 25 IPART=1,NPART + WRITE(IOUT,1001) RNAME,IPART,MAXPOS(1,IPART),MAXPOS(3,IPART), + 1 MAXPOS(5,IPART),MAXPOS(2,IPART),MAXPOS(4,IPART),MAXPOS(6,IPART) + 25 CONTINUE + ENDIF + EPS=1.0E-4*(LENG(2)-LENG(1)) + DO 30 IPART=1,NPART-1 + IF(IAXIS.EQ.1) THEN + IF((ABS(MAXPOS(1,IPART)-MAXPOS(2,IPART+1)).GT.EPS).AND. + 1 (ABS(MAXPOS(2,IPART)-MAXPOS(1,IPART+1)).GT.EPS)) THEN + WRITE(HSMG,1008) IPART,ID + CALL XABORT(HSMG) + ENDIF + ELSE IF(IAXIS.EQ.2) THEN + IF((ABS(MAXPOS(3,IPART)-MAXPOS(4,IPART+1)).GT.EPS).AND. + 1 (ABS(MAXPOS(4,IPART)-MAXPOS(3,IPART+1)).GT.EPS)) THEN + WRITE(HSMG,1008) IPART,ID + CALL XABORT(HSMG) + ENDIF + ELSE IF(IAXIS.EQ.3) THEN + IF((ABS(MAXPOS(5,IPART)-MAXPOS(6,IPART+1)).GT.EPS).AND. + 1 (ABS(MAXPOS(6,IPART)-MAXPOS(5,IPART+1)).GT.EPS)) THEN + WRITE(HSMG,1008) IPART,ID + CALL XABORT(HSMG) + ENDIF + ENDIF + 30 CONTINUE +*---- +* SET CURRENT ROD POSITION +*---- + IF(NPART.EQ.0) THEN + WRITE(HSMG,'(35H@DEVGET: MISSING MAXPOS DATA IN ROD,I5)') ID + CALL XABORT(HSMG) + ELSE IF(ITOP.EQ.0) THEN + WRITE(HSMG,'(33H@DEVGET: MISSING FROM DATA IN ROD,I5)') ID + CALL XABORT(HSMG) + ENDIF + IF(LEVEL.GE.0.0) THEN + DO 45 IPART=1,NPART + DO 40 I=1,6 + RODPOS(I,IPART)=MAXPOS(I,IPART) + 40 CONTINUE + 45 CONTINUE + IF(IMODE.EQ.1) THEN +* FADING ROD + DELH=LEVEL*(LENG(2)-LENG(1)) + ELSE IF(IMODE.EQ.2) THEN +* MOVING ROD + IF(ITOP.EQ.-1) THEN + DELH=LEVEL*(LENG(2)-LIMIT(1))+LIMIT(1) + ELSE IF(ITOP.EQ.1) THEN + DELH=LIMIT(2)-LEVEL*(LIMIT(2)-LENG(1)) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + IF(IMPX.GT.3) THEN + WRITE(IOUT,*) ' ADJ ',NXSEQ,' LEVEL ',LEVEL*100., + 1 '% OF INSERTION' + WRITE(IOUT,*) ' NEW POSITION (L_sup)= ',DELH + ENDIF + ENDIF + CALL MOVCHK(0,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS) + ENDIF +*---- +* STORE ROD DATA +*---- + CALL LCMPUT(KPDEV,'ROD-ID',1,1,ID) + CALL LCMPUT(KPDEV,'ROD-PARTS',1,1,NPART) + CALL LCMPTC(KPDEV,'ROD-NAME',12,RNAME) + CALL LCMPUT(KPDEV,'FROM',1,1,ITOP) + CALL LCMPUT(KPDEV,'AXIS',1,1,IAXIS) + CALL LCMPUT(KPDEV,'LENGTH',2,2,LENG) + IF(LEVEL.GE.0.0) CALL LCMPUT(KPDEV,'LEVEL',1,2,LEVEL) + IF(SPEED.GE.0.0) CALL LCMPUT(KPDEV,'SPEED',1,2,SPEED) + IF(TIME.GE.0.0) CALL LCMPUT(KPDEV,'TIME',1,2,TIME) + IF(LEVEL.GE.0.0) CALL LCMPUT(KPDEV,'MAX-POS',6*NPART,2,MAXPOS) + CALL LCMPUT(KPDEV,'ROD-POS',6*NPART,2,RODPOS) + CALL LCMPUT(KPDEV,'ROD-MIX',2*NPART,1,DMIX) +* + IF(IMPX.GT.1) THEN + DO 50 IPART=1,NPART + WRITE(IOUT,1002) RNAME,IPART,RODPOS(1,IPART),RODPOS(3,IPART), + 1 RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART),RODPOS(6,IPART) + 50 CONTINUE + WRITE(IOUT,1003) LENG(2)-LENG(1),FROM,AXIS + IF(LEVEL.GE.0.0) WRITE(IOUT,1004) LEVEL + IF(SPEED.GE.0.0) WRITE(IOUT,1005) SPEED + IF(TIME.GE.0.0) WRITE(IOUT,1006) TIME + WRITE(IOUT,1007) + ENDIF + RETURN +* + 1000 FORMAT(/3X,'DEVGET: =>',2X,'ROD #',I3.3) + 1001 FORMAT(/5X,'ROD NAME',1X,'=>',1X,A,'(PART',I5,')'/ + 1 5X,'FULL-INSERTED ROD POSITION :', + 2 4X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 3 37X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/5X,80(1H-)) + 1002 FORMAT(/5X,'ROD NAME',1X,'=>',1X,A,'(PART',I5,')'/ + 1 5X,'CURRENT ROD POSITION :', + 1 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 2 32X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/5X,80(1H-)) + 1003 FORMAT(5X,'ROD LENGTH =',F9.4/ + 1 5X,'INSERTION FROM : ',A2,5X,'MOVEMENT AXIS : ',A1) + 1004 FORMAT(5X,'INSERTION LEVEL =',F8.4) + 1005 FORMAT(5X,'INSERTION SPEED =',1P,E11.4) + 1006 FORMAT(5X,'INSERTION TIME =',1P,E11.4) + 1007 FORMAT(5X,80(1H-)/5X,80(1H-)) + 1008 FORMAT(39H@DEVGET: INCORRECT ROD POSITION IN PART,I5, + 1 7H OF ROD,I5) + END diff --git a/Donjon/src/DEVINI.f b/Donjon/src/DEVINI.f new file mode 100644 index 0000000..28c3315 --- /dev/null +++ b/Donjon/src/DEVINI.f @@ -0,0 +1,115 @@ +*DECK DEVINI + SUBROUTINE DEVINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read specification for the rod-devices, create a device object. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The DEVINI: module specification is: +* DEVICE MATEX := DEVINI: MATEX :: (descdev) ; +* where +* DEVICE : name of the \emph{device) object that will be created by the +* module; it will contain the devices information. +* MATEX : name of the \emph{matex} object that will be updated by the +* module. The rod-devices material mixtures are appended to the previous +* material index and the rod-devices indices are also modified, accordingly. +* (descdev) : structure describing the input data to the DEVINI: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + CHARACTER HSIGN*12,TEXT12*12 + INTEGER ISTATE(NSTATE) + REAL LIMIT(6) + TYPE(C_PTR) IPDEV,IPMTX + REAL, ALLOCATABLE, DIMENSION(:) :: XXX,YYY,ZZZ +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.NE.2)CALL XABORT('@DEVINI: TWO PARAMETERS EXPECTED') + TEXT12=HENTRY(1) + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@DEVI' + 1 //'NI: LCM OBJECT FOR L_DEVICE EXPECTED ('//TEXT12//').') + IF(JENTRY(1).NE.0)CALL XABORT('@DEVINI: CREATE MODE EXPECTE' + 1 //'D FOR L_DEVICE.') + HSIGN='L_DEVICE' + CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IPDEV=KENTRY(1) + TEXT12=HENTRY(2) + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@DEVI' + 1 //'NI: LCM OBJECT FOR L_MATEX EXPECTED ('//TEXT12//').') + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MATEX')CALL XABORT('@DEVINI: MISSING L_MATEX.') + IF(JENTRY(2).NE.1)CALL XABORT('@DEVINI: MODIFICATION MODE E' + 1 //'XPECTED FOR L_MATEX.') + IPMTX=KENTRY(2) +*---- +* RECOVER INFORMATION +*---- + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) + IGEO=ISTATE(6) + IF(IGEO.NE.7)CALL XABORT('@DEVINI: ON' + 1 //'LY 3D-CARTESIAN GEOMETRY ALLOWED.') + NMIX=ISTATE(2) + NTOT=ISTATE(5) + LX=ISTATE(8) + LY=ISTATE(9) + LZ=ISTATE(10) +* CORE LIMITS ALONG X-AXIS + ALLOCATE(XXX(LX+1)) + XXX(:LX+1)=0.0 + CALL LCMGET(IPMTX,'MESHX',XXX) + LIMIT(1)=XXX(1) + LIMIT(2)=XXX(LX+1) + DEALLOCATE(XXX) +* CORE LIMITS ALONG Y-AXIS + ALLOCATE(YYY(LY+1)) + YYY(:LY+1)=0.0 + CALL LCMGET(IPMTX,'MESHY',YYY) + LIMIT(3)=YYY(1) + LIMIT(4)=YYY(LY+1) + DEALLOCATE(YYY) +* CORE LIMITS ALONG Z-AXIS + ALLOCATE(ZZZ(LZ+1)) + ZZZ(:LZ+1)=0.0 + CALL LCMGET(IPMTX,'MESHZ',ZZZ) + LIMIT(5)=ZZZ(1) + LIMIT(6)=ZZZ(LZ+1) + DEALLOCATE(ZZZ) +* READ ROD-DEVICES DATA + CALL DEVDRV(IPDEV,IPMTX,IGEO,NMIX,NTOT,LIMIT) + RETURN + END diff --git a/Donjon/src/DLEAK.f b/Donjon/src/DLEAK.f new file mode 100644 index 0000000..f3e629b --- /dev/null +++ b/Donjon/src/DLEAK.f @@ -0,0 +1,303 @@ +*DECK DLEAK
+ SUBROUTINE DLEAK(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Create a delta Macrolib with respect to leakage information.
+*
+*Copyright:
+* Copyright (C) 2012 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert
+*
+*Parameters: input
+* NENTRY number of data structures transfered to this module.
+* HENTRY name of the data structures.
+* IENTRY data structure type where:
+* IENTRY=1 for LCM memory object;
+* IENTRY=2 for XSM file;
+* IENTRY=3 for sequential binary file;
+* IENTRY=4 for sequential ASCII file.
+* JENTRY access permission for the data structure where:
+* JENTRY=0 for a data structure in creation mode;
+* JENTRY=1 for a data structure in modifications mode;
+* JENTRY=2 for a data structure in read-only mode.
+* KENTRY data structure pointer.
+*
+*Comments:
+* None
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+ TYPE(C_PTR) KENTRY(NENTRY)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40)
+ CHARACTER HSIGN*12,TEXT12*12
+ DOUBLE PRECISION DFLOTT
+ INTEGER ISTATE(NSTATE)
+ DOUBLE PRECISION OPTPRR(NSTATE)
+ TYPE(C_PTR) IPOPT,IPNEW,IPOLD,JPNEW,JPOLD,KPNEW,KPOLD,LPNEW,MPNEW
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ
+ REAL, ALLOCATABLE, DIMENSION(:) :: GAR,PER
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV,WEI
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.NE.3)CALL XABORT('DLEAK: THREE PARAMETERS EXPECTED.')
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@DLEAK'
+ 1 //': LCM OBJECT EXPECTED AT LHS.')
+ IF(JENTRY(1).EQ.0)THEN
+ HSIGN='L_MACROLIB'
+ CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ ELSE
+ CALL XABORT('DLEAK: EMPTY DELTA MACROLIB EXPECTED AT LHS.')
+ ENDIF
+ IPNEW=KENTRY(1)
+ IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('DLEAK: LC'
+ 1 //'M OBJECT EXPECTED AT LHS.')
+ IF(JENTRY(2).EQ.0)THEN
+ HSIGN='L_OPTIMIZE'
+ CALL LCMPTC(KENTRY(2),'SIGNATURE',12,HSIGN)
+ ELSE
+ CALL XABORT('DLEAK: EMPTY OPTIMIZE OBJECT EXPECTED AT LHS.')
+ ENDIF
+ IPOPT=KENTRY(2)
+ IF((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2))CALL XABORT('DLEAK: LC'
+ 1 //'M OBJECT EXPECTED AT RHS.')
+ IF(JENTRY(3).NE.2)CALL XABORT('DLEAK: MACROLIB IN READ-ONLY MOD'
+ 1 //'E EXPECTED AT RHS.')
+ CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_MACROLIB')THEN
+ CALL XABORT('DLEAK: SIGNATURE OF '//HENTRY(3)//' IS '//HSIGN//
+ 1 '. L_MACROLIB EXPECTED.')
+ ENDIF
+ IPOLD=KENTRY(3)
+ CALL LCMGET(IPOLD,'STATE-VECTOR',ISTATE)
+ NGRP=ISTATE(1)
+ NMIX=ISTATE(2)
+ ILEAK=ISTATE(9)
+*----
+* READ THE INPUT DATA
+*----
+ IMPX=1
+ ITYPE=0
+ IDELTA=0
+ NGR1=1
+ NGR2=NGRP
+ IBM1=1
+ IBM2=NMIX
+ 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.EQ.10) GO TO 30
+ IF(INDIC.NE.3) CALL XABORT('DLEAK: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT12.EQ.'EDIT') THEN
+* READ THE PRINT INDEX.
+ CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DLEAK: INTEGER DATA EXPECTED(1).')
+ ELSE IF(TEXT12.EQ.'TYPE') THEN
+* READ THE TYPE OF LEAKAGE.
+ CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.3) CALL XABORT('DLEAK: CHARACTER DATA EXPECTED(2).')
+ IF(TEXT12.EQ.'DIFF') THEN
+ ITYPE=1
+ ELSE IF(TEXT12.EQ.'NTOT1') THEN
+ ITYPE=2
+ ELSE
+ CALL XABORT('DLEAK: INVALID TYPE OF CROSS SECTION.')
+ ENDIF
+ ELSE IF(TEXT12.EQ.'DELTA') THEN
+* READ THE TYPE OF DELTA.
+ CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.3) CALL XABORT('DLEAK: CHARACTER DATA EXPECTED(3).')
+ IF(TEXT12.EQ.'VALUE') THEN
+ IDELTA=1
+ ELSE IF(TEXT12.EQ.'FACTOR') THEN
+ IDELTA=2
+ ELSE
+ CALL XABORT('DLEAK: INVALID DELTA TYPE.')
+ ENDIF
+ ELSE IF(TEXT12.EQ.'MIXMIN') THEN
+* READ THE MINIMUM MIXTURE INDEX.
+ CALL REDGET(INDIC,IBM1,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DLEAK: INTEGER DATA EXPECTED(2).')
+ IF((IBM1.LE.0).OR.(IBM1.GT.NMIX)) CALL XABORT('DLEAK: INVALID '
+ 1 //'VALUE OF MIXMIN.')
+ ELSE IF(TEXT12.EQ.'MIXMAX') THEN
+* READ THE MAXIMUM MIXTURE INDEX.
+ CALL REDGET(INDIC,IBM2,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DLEAK: INTEGER DATA EXPECTED(3).')
+ IF((IBM2.LT.IBM1).OR.(IBM2.GT.NMIX)) CALL XABORT('DLEAK: INVAL'
+ 1 //'ID VALUE OF MIXMAX.')
+ ELSE IF(TEXT12.EQ.'GRPMIN') THEN
+* READ THE MINIMUM GROUP INDEX.
+ CALL REDGET(INDIC,NGR1,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DLEAK: INTEGER DATA EXPECTED(4).')
+ IF((NGR1.LE.0).OR.(NGR1.GT.NGRP)) CALL XABORT('DLEAK: INVALID '
+ 1 //'VALUE OF GRPMIN.')
+ ELSE IF(TEXT12.EQ.'GRPMAX') THEN
+* READ THE MAXIMUM GROUP INDEX.
+ CALL REDGET(INDIC,NGR2,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DLEAK: INTEGER DATA EXPECTED(5).')
+ IF((NGR2.LT.NGR1).OR.(NGR2.GT.NGRP)) CALL XABORT('DLEAK: INVAL'
+ 1 //'ID VALUE OF GRPMAX.')
+ ELSE IF(TEXT12.EQ.';') THEN
+ GO TO 30
+ ELSE
+ CALL XABORT('DLEAK: '//TEXT12//' IS AN INVALID KEYWORD.')
+ ENDIF
+ GO TO 20
+ 30 IF(ITYPE.EQ.0) CALL XABORT('DLEAK: LEAKAGE TYPE NOT SET.')
+ IF(IDELTA.EQ.0) CALL XABORT('DLEAK: DELTA TYPE NOT SET.')
+ IF(IBM2.LT.IBM1) CALL XABORT('DLEAK: INVALID MIXTURE INDICES.')
+ IF(NGR2.LT.NGR1) CALL XABORT('DLEAK: INVALID GROUP INDICES.')
+ IF((ITYPE.EQ.1).AND.(ILEAK.EQ.0)) CALL XABORT('DLEAK: NO LEAKAGE'
+ 1 //' ON INPUT MACROLIB.')
+ NPERT=(IBM2-IBM1+1)*(NGR2-NGR1+1)
+ IF(IMPX.GT.0) WRITE(6,'(/36H DLEAK: NUMBER OF CROSS-SECTION PERT,
+ 1 10HURBATIONS=,I5)') NPERT
+*----
+* SET THE PERTURBED MACROLIB
+*----
+ ALLOCATE(VARV(NPERT),WEI(NPERT))
+ JPNEW=LCMLID(IPNEW,'STEP',NPERT)
+ JPOLD=LCMGID(IPOLD,'GROUP')
+ IPERT=0
+ ALLOCATE(IJJ(NMIX),NJJ(NMIX),GAR(NMIX),PER(NMIX))
+ DO 52 IGRP=NGR1,NGR2
+ DO 51 IBMP=IBM1,IBM2
+ IPERT=IPERT+1
+ KPNEW=LCMDIL(JPNEW,IPERT)
+ LPNEW=LCMLID(KPNEW,'GROUP',NGRP)
+ DO 50 IGR=1,NGRP
+ MPNEW=LCMDIL(LPNEW,IGR)
+ KPOLD=LCMGIL(JPOLD,IGR)
+ GAR(:NMIX)=0.0
+ NJJ(:NMIX)=1
+ DO 40 IMIX=1,NMIX
+ IJJ(IMIX)=IGR
+ 40 CONTINUE
+ CALL LCMPUT(MPNEW,'NTOT0',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SIGS00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SIGW00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SCAT00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'NJJS00',NMIX,1,NJJ)
+ CALL LCMPUT(MPNEW,'IJJS00',NMIX,1,IJJ)
+ CALL LCMPUT(MPNEW,'IPOS00',NMIX,1,NJJ)
+ PER(:NMIX)=0.0
+ IF((IDELTA.EQ.1).AND.(ITYPE.EQ.1).AND.(ILEAK.EQ.1)) THEN
+ IF(IGR.EQ.IGRP) PER(IBMP)=1.0
+ CALL LCMPUT(MPNEW,'DIFF',NMIX,2,PER)
+ CALL LCMGET(KPOLD,'DIFF',GAR)
+ IF(IGR.EQ.IGRP) VARV(IPERT)=GAR(IBMP)
+ ELSE IF((IDELTA.EQ.1).AND.(ITYPE.EQ.1).AND.(ILEAK.EQ.2)) THEN
+ IF(IGR.EQ.IGRP) PER(IBMP)=1.0
+ CALL LCMPUT(MPNEW,'DIFFX',NMIX,2,PER)
+ CALL LCMPUT(MPNEW,'DIFFY',NMIX,2,PER)
+ CALL LCMPUT(MPNEW,'DIFFZ',NMIX,2,PER)
+ CALL LCMGET(KPOLD,'DIFFX',GAR)
+ IF(IGR.EQ.IGRP) VARV(IPERT)=GAR(IBMP)
+ ELSE IF((IDELTA.EQ.1).AND.(ITYPE.EQ.2)) THEN
+ IF(IGR.EQ.IGRP) PER(IBMP)=1.0
+ CALL LCMPUT(MPNEW,'NTOT1',NMIX,2,PER)
+ CALL LCMLEN(KPOLD,'NTOT1',ILONG,ITYLCM)
+ IF(ILONG.NE.0) THEN
+ CALL LCMGET(KPOLD,'NTOT1',GAR)
+ ELSE
+ CALL LCMGET(KPOLD,'NTOT0',GAR)
+ ENDIF
+ IF(IGR.EQ.IGRP) VARV(IPERT)=GAR(IBMP)
+ ELSE IF((IDELTA.EQ.2).AND.(ITYPE.EQ.1).AND.(ILEAK.EQ.1)) THEN
+ CALL LCMGET(KPOLD,'DIFF',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)
+ CALL LCMPUT(MPNEW,'DIFF',NMIX,2,PER)
+ IF(IGR.EQ.IGRP) VARV(IPERT)=1.0D0
+ IF(IGR.EQ.IGRP) WEI(IPERT)=GAR(IBMP)**2
+ ELSE IF((IDELTA.EQ.2).AND.(ITYPE.EQ.1).AND.(ILEAK.EQ.2)) THEN
+ CALL LCMGET(KPOLD,'DIFFX',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)
+ CALL LCMPUT(MPNEW,'DIFFX',NMIX,2,PER)
+ CALL LCMPUT(MPNEW,'DIFFY',NMIX,2,PER)
+ CALL LCMPUT(MPNEW,'DIFFZ',NMIX,2,PER)
+ IF(IGR.EQ.IGRP) VARV(IPERT)=1.0D0
+ IF(IGR.EQ.IGRP) WEI(IPERT)=GAR(IBMP)**2
+ ELSE IF((IDELTA.EQ.2).AND.(ITYPE.EQ.2)) THEN
+ CALL LCMLEN(KPOLD,'NTOT1',ILONG,ITYLCM)
+ IF(ILONG.NE.0) THEN
+ CALL LCMGET(KPOLD,'NTOT1',GAR)
+ ELSE
+ CALL LCMGET(KPOLD,'NTOT0',GAR)
+ ENDIF
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)
+ CALL LCMPUT(MPNEW,'NTOT1',NMIX,2,PER)
+ IF(IGR.EQ.IGRP) VARV(IPERT)=1.0D0
+ IF(IGR.EQ.IGRP) WEI(IPERT)=GAR(IBMP)**2
+ ENDIF
+ 50 CONTINUE
+ 51 CONTINUE
+ 52 CONTINUE
+ DEALLOCATE(PER,GAR,NJJ,IJJ)
+*----
+* SET THE PERTURBED MACROLIB STATE-VECTOR
+*----
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NGRP
+ ISTATE(2)=NMIX
+ ISTATE(3)=1
+ ISTATE(9)=ILEAK
+ ISTATE(11)=NPERT
+ CALL LCMPUT(IPNEW,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IMPX.GT.1) CALL LCMLIB(IPNEW)
+*----
+* PUT OPTIMIZE OBJECT INFORMATION
+*----
+ CALL LCMPUT(IPOPT,'VAR-VALUE',NPERT,4,VARV)
+ IF(IDELTA.EQ.2) CALL LCMPUT(IPOPT,'VAR-WEIGHT',NPERT,4,WEI)
+ DEALLOCATE(WEI,VARV)
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NGRP
+ ISTATE(2)=NMIX
+ ISTATE(3)=ITYPE
+ ISTATE(4)=IDELTA
+ ISTATE(5)=NGR1
+ ISTATE(6)=NGR2
+ ISTATE(7)=IBM1
+ ISTATE(8)=IBM2
+ IF(IMPX.GT.0) WRITE(6,100) (ISTATE(I),I=1,8)
+ CALL LCMPUT(IPOPT,'DEL-STATE',NSTATE,1,ISTATE)
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NPERT
+ ISTATE(2)=0
+ ISTATE(3)=1
+ ISTATE(4)=0
+ ISTATE(5)=0
+ ISTATE(6)=2
+ ISTATE(9)=2
+ ISTATE(10)=0
+ CALL LCMPUT(IPOPT,'STATE-VECTOR',NSTATE,1,ISTATE)
+ OPTPRR(:NSTATE)=0.0D0
+ OPTPRR(1)=1.0
+ OPTPRR(2)=0.1
+ OPTPRR(3)=1.0E-4
+ OPTPRR(4)=1.0E-4
+ OPTPRR(5)=1.0E-4
+ CALL LCMPUT(IPOPT,'OPT-PARAM-R',NSTATE,4,OPTPRR)
+ RETURN
+*
+ 100 FORMAT(/18H DEL-STATE OPTIONS/18H -----------------/
+ 1 7H NGRP ,I8,28H (NUMBER OF ENERGY GROUPS)/
+ 2 7H NMIX ,I8,32H (NUMBER OF MATERIAL MIXTURES)/
+ 3 7H ITYPE ,I8,29H (=1/2: USE DIFF/USE NTOT1)/
+ 4 7H IDELTA,I8,31H (=1/2: USE VALUE/USE FACTOR)/
+ 5 7H NGR1 ,I8,24H (MINIMUM GROUP INDEX)/
+ 6 7H NGR2 ,I8,24H (MAXIMUM GROUP INDEX)/
+ 7 7H IBM1 ,I8,26H (MINIMUM MIXTURE INDEX)/
+ 8 7H IBM2 ,I8,26H (MAXIMUM MIXTURE INDEX))
+ END
diff --git a/Donjon/src/DONDRV.F b/Donjon/src/DONDRV.F new file mode 100644 index 0000000..ee42c61 --- /dev/null +++ b/Donjon/src/DONDRV.F @@ -0,0 +1,329 @@ +*DECK DONDRV + INTEGER FUNCTION DONDRV(HMODUL,NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Module-dependent driver for DONJON. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* D. Sekki +* +*Parameters: input/output +* HMODUL name of module to process. +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file; +* IENTRY=6 for HDF5 file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Parameters: output +* DONDRV completion flag: =0 module exists; =1 does not exists. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + CHARACTER HMODUL*(*),HENTRY(NENTRY)*12 + INTEGER IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + REAL TBEG,TEND + DOUBLE PRECISION DMEMB,DMEMD + CHARACTER DSR*72,NAM*72,COD*12 + LOGICAL :: DONMOD +* + DONDRV=0 + DONMOD=.TRUE. + CALL KDRCPU(TBEG) + CALL KDRMEM(DMEMB) +*---- +* CALL MODULE AND PRINT CREDITS +*---- + IF(HMODUL.EQ.'NCR:')THEN + COD='DRAGON' + DSR='ACCESS MULTI-PARAMETER REACTOR COMPOSITION DATABASE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL NCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'CRE:')THEN + COD='DONJON' + DSR='ACCESS MONO-PARAMETER REACTOR COMPOSITION DATABASE' + NAM='A. HEBERT, D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL CRE(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'USPLIT:')THEN + COD='DONJON' + DSR='LINK MATERIAL INDEX AND REACTOR GEOMETRY' + NAM='J. KOCLAS, D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL USPLIT(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'MACINI:')THEN + COD='DONJON' + DSR='EXPAND MACROLIB OVER THE REACTOR GEOMETRY' + NAM='J. KOCLAS, E. VARIN, D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL MACINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'RESINI:')THEN + COD='DONJON' + DSR='FUEL LATTICE GEOMETRY AND PROPERTIES' + NAM='E. VARIN, D. SEKKI, R. CHAMBON' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL RESINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'FLPOW:')THEN + COD='DONJON' + DSR='COMPUTE FLUXES AND POWERS' + NAM='D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL FLPOW(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'DEVINI:')THEN + COD='DONJON' + DSR='MODELING OF ROD-DEVICES IN THE REACTOR CORE' + NAM='D. SEKKI ' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DEVINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'DSET:')THEN + COD='DONJON' + DSR='UPDATE DEVICES PARAMETERS' + NAM='D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DSET(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'MOVDEV:')THEN + COD='DONJON' + DSR='MOVE DEVICES IN THE REACTOR CORE' + NAM='D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL MOVDEV(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'NEWMAC:')THEN + COD='DONJON' + DSR='UPDATE MACROLIB FOR DEVICES PROPERTIES' + NAM='J. KOCLAS, D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL NEWMAC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'DETINI:')THEN + COD='DONJON' + DSR='CONSTRUCT 2D AND 3D DETECTORS IN THE CORE' + NAM='J. KOCLAS, E. VARIN, M. GUYOT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DETINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'DETECT:')THEN + COD='DONJON' + DSR='COMPUTE DETECTORS READING' + NAM='J. KOCLAS, M. GUYOT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DETECT(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'TAVG:')THEN + COD='DONJON' + DSR='TIME-AVERAGE CALCULATION' + NAM='D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL TAVG(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'TINST:')THEN + COD='DONJON' + DSR='INSTANTANEOUS CALCULATION' + NAM='B. TOUEG' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL TINST(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'CVR:')THEN + COD='DONJON' + DSR='UPDATE DATA FOR VOIDING SIMULATION' + NAM='D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL CVR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'LZC:')THEN + COD='DONJON' + DSR='MODELING OF LIQUID ZONE CONTROLLERS' + NAM='D. SEKKI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL LZC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'HST:')THEN + COD='DONJON' + DSR='HISTORY BASED CALCULATION SUPPORT' + NAM='G. MARLEAU AND E. VARIN' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL HST(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'XENON:')THEN + COD='DONJON' + DSR='COMPUTE THE XENON DISTRIBUTION' + NAM='M. GUYOT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL XENON(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSEIF(HMODUL.EQ.'AFM:')THEN + COD='DONJON' + DSR='MULTI-PARAMETER FEEDBACK MODEL' + NAM='T. SISSAOUI' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL AFM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'NCR:') THEN + COD='DONJON' + DSR='ACCESS MULTI-PARAMETER REACTOR COMPOSITION DATABASE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL NCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'SCR:') THEN + COD='DONJON' + DSR='ACCESS MULTI-PARAMETER REACTOR SAPHYB DATABASE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL SCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +#if defined(HDF5_LIB) + ELSE IF(HMODUL.EQ.'ACR:') THEN + COD='DONJON' + DSR='ACCESS MULTI-PARAMETER REACTOR APEX DATABASE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL ACR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'MCR:') THEN + COD='DONJON' + DSR='ACCESS MULTI-PARAMETER REACTOR MPO DATABASE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL MCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +#endif /* defined(HDF5_LIB) */ + ELSE IF(HMODUL.EQ.'PCR:') THEN + COD='DONJON' + DSR='ACCESS MULTI-PARAMETER REACTOR PMAXS DATABASE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL PCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'T16CPO:') THEN + COD='DONJON' + DSR='INTERFACE FOR WIMS-AECL' + NAM='G. MARLEAU' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL T16CPO(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'THM:') THEN + COD='DONJON' + DSR='SIMPLIFIED THERMAL-HYDRAULICS CALCULATION' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL THM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'DLEAK:') THEN + COD='DONJON' + DSR='COMPUTE A DELTA MACROLIB RELATIVE TO LEAKAGE INFORMATION' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DLEAK(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'DSPH:') THEN + COD='DONJON' + DSR='COMPUTE A DELTA MACROLIB RELATIVE TO SPH FACTORS' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DSPH(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'DREF:') THEN + COD='DONJON' + DSR='SET THE GPT ADJOINT SOURCES FOR RMS REACTION RATE ERRORS' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL DREF(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'GRAD:') THEN + COD='DONJON' + DSR='COMPUTE GRADIENTS OF SYSTEM CHARACTERISTICS' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL GRAD(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'PLQ:') THEN + COD='DONJON' + DSR='LINEAR OPTIMIZATION PROBLEM WITH A QUADRATIC CONSTRAINT' + NAM='A. HEBERT AND R. CHAMBON' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL PLQ(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'LNSR:') THEN + COD='DONJON' + DSR='LINE OPTIMIZATION OF THE OBJECTIVE FUNCTION' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL LNSR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'SIM:') THEN + COD='DONJON' + DSR='PWR FUELLING SIMULATOR' + NAM='A. HEBERT AND V. SALINO' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL SIM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'MCC:') THEN + COD='DONJON' + DSR='FUEL MAP MODIFICATION' + NAM='M. CORDIEZ' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL MCC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'NAP:') THEN + COD='DONJON' + DSR='PIN POWER RECONSTRUCTION AND ENRICHED L_COMPO CONSTRUCTION' + NAM='R. CHAMBON' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL NAP(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'D2P:') THEN + COD='DONJON' + DSR='PMAXS INTERFACE FILE GENERATION' + NAM='J. TAFOREAU' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL D2P(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'ROD:') THEN + COD='DONJON' + DSR='CONTROL ROD INSERTION MANAGEMENT FOR PWR' + NAM='G. TIXIER' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL ROD(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'PKINI:') THEN + COD='DONJON' + DSR='POINT KINETIC INITIALIZATION MODULE' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL PKINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'PKINS:') THEN + COD='DONJON' + DSR='POINT KINETIC SOLUTION AND GLOBAL FEEDBACK' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL PKINS(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'IDET:') THEN + COD='DONJON' + DSR='DETECTOR INTEGRATED RESPONSE EVALUATION' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL IDET(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE IF(HMODUL.EQ.'FPSPH:') THEN + COD='DONJON' + DSR='SINGLE SPH FACTOR FIXED POINT ITERATION' + NAM='A. HEBERT' + WRITE(IOUT,1000)HMODUL,COD,DSR,NAM + CALL FPSPH(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ELSE + DONMOD=.FALSE. + DONDRV=KDRDRV(HMODUL,NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) + ENDIF + IF(DONMOD)THEN + WRITE(IOUT,1001)HMODUL + CALL KDRCPU(TEND) + CALL KDRMEM(DMEMD) + WRITE(IOUT,1002) HMODUL,(TEND-TBEG),REAL(DMEMD-DMEMB) + ENDIF + RETURN +* + 1000 FORMAT(/1X,15('~')/ + 1 1X,'@BEGIN MODULE -> ',A12/ + 2 1X,'@FROM CODE -> ',A12/ + 3 1X,'@DESCRIPTION -> ',A72/ + 4 1X,'@CREDITS -> ',A72/ + 5 1X,'@COPYRIGHTS -> ECOLE POLYTECHNIQUE DE MONTREAL'/ + 6 18X,'GNU LESSER GENERAL PUBLIC LICENSE'/1X,15('~')/) + 1001 FORMAT(1X,'@END MODULE -> ',A12) + 1002 FORMAT('-->>MODULE ',A12,': TIME SPENT=',F13.3,' MEMORY USAGE=', + 1 1P,E10.3) + END diff --git a/Donjon/src/DONJON.f90 b/Donjon/src/DONJON.f90 new file mode 100644 index 0000000..c338298 --- /dev/null +++ b/Donjon/src/DONJON.f90 @@ -0,0 +1,81 @@ +program DONJON + use GANLIB + implicit none + integer, parameter :: iout=6 + character(len=131) :: hsmg +!---- +! local storage +!---- + integer :: iprint,ier +!---- +! gan-2000 external functions +!---- + integer, external :: KERNEL + interface + integer(c_int) function donmod(cmodul, nentry, hentry, ientry, jentry, & + kentry, hparam_c) bind(c) + use, intrinsic :: iso_c_binding + character(kind=c_char), dimension(*) :: cmodul + integer(c_int), value :: nentry + character(kind=c_char), dimension(13,*) :: hentry + integer(c_int), dimension(nentry) :: ientry, jentry + type(c_ptr), dimension(nentry) :: kentry + character(kind=c_char), dimension(73,*) :: hparam_c + end function donmod + end interface +!---- +! variables for DONJON version +!---- + integer :: imvers + character(len=64) :: date + character(len=48) :: rev + character(len=6), parameter :: namsbr='donjon' +!---- +! version information recovered from cvs +!---- + imvers=5 + call KDRVER(rev,date) + write(iout,6000) namsbr,imvers,rev,date + write(iout,6010) namsbr +!---- +! execute the cle-2000 driver +!---- + iprint=0 + ier=KERNEL(donmod,iprint) + if( ier /= 0 )then + write(hsmg,'(27hDONJON: kernel error (code=,I5,2h).)') ier + call XABORT(hsmg) + endif +!---- +! all modules processed +!---- + write(iout,6030) namsbr,imvers,rev + stop +!---- +! formats +!---- + 6000 FORMAT( & + ' @@@@@@@ @@@@@ @@ @@ @@@@@@ @@@@@ @@ @@'/ & + ' @@@@@@@@ @@@@@@@ @@@ @@ @@ @@@@@@@ @@@ @@'/ & + ' @@ @@ @@ @@ @@@@ @@ @@ @@ @@ @@@@ @@'/ & + ' @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@'/ & + ' @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@'/ & + ' @@ @@ @@ @@ @@ @@@@ @@ @@ @@ @@ @@@@'/ & + ' @@@@@@@@ @@@@@@@ @@ @@@ @@ @@ @@@@@@@ @@ @@@'/ & + ' @@@@@@@ @@@@@ @@ @@ @@@@@@ @@@@@ @@ @@'// & + ' VERSION ',A6,I2,2X,A,4X,A/ & + ' GROUPE D''ANALYSE NUCLEAIRE'/ & + ' ECOLE POLYTECHNIQUE DE MONTREAL'//) + 6010 FORMAT( & + ' COPYRIGHT NOTICE FOR THIS VERSION OF ',A6,':'/ & + ' --------------------------------------------'/ & + ' Copyright (C) 2007 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 '///) + 6030 FORMAT(/1x,'normal end of execution for ',a6,i2,2x,a/ & + 1x,'check for warning in listing'/ & + 1x,'before assuming your run was successful') +end program DONJON diff --git a/Donjon/src/DREF.f b/Donjon/src/DREF.f new file mode 100644 index 0000000..56a4a90 --- /dev/null +++ b/Donjon/src/DREF.f @@ -0,0 +1,245 @@ +*DECK DREF + SUBROUTINE DREF(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Set the source of an adjoint fixed source eigenvalue problem. The +* source is the gradient of the RMS power or absorption distribution. +* +*Copyright: +* Copyright (C) 2012 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + TYPE(C_PTR) IPGRAD,IPDREF,IPMAC1,IPMAC2,IPFLX,IPTRK + CHARACTER HSIGN*12,TEXT12*12,CMODUL*12 + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION DFLOTT,RMSD + LOGICAL LNO,LRMS,LNEWT + INTEGER, ALLOCATABLE, DIMENSION(:) :: MAT,KEY + REAL, ALLOCATABLE, DIMENSION(:) :: VOL +*---- +* PARAMETER VALIDATION. +*---- + IF(NENTRY.NE.6) CALL XABORT('DREF: SIX PARAMETERS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('DREF: LCM' + 1 //' OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.0) CALL XABORT('DREF: FIRST ENTRY IN CREATE MODE' + 1 //' EXPECTED.') + IPDREF=KENTRY(1) + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2)) CALL XABORT('DREF: LCM' + 1 //' OBJECT EXPECTED AT LHS.') + IF(JENTRY(2).NE.1) CALL XABORT('DREF: SECOND ENTRY IN MODIFICATI' + 1 //'ON MODE EXPECTED.') + IPGRAD=KENTRY(2) + CALL LCMGTC(IPGRAD,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_OPTIMIZE') THEN + TEXT12=HENTRY(2) + CALL XABORT('DREF: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_OPTIMIZE EXPECTED.') + ENDIF + CALL LCMGET(IPGRAD,'STATE-VECTOR',ISTATE) + LNEWT=ISTATE(8).EQ.4 + CALL LCMGET(IPGRAD,'DEL-STATE',ISTATE) + ICONT=ISTATE(4) + DO I=3,6 + IF((JENTRY(I).NE.2).OR.((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2))) + 1 CALL XABORT('DREF: LCM OBJECT IN READ-ONLY MODE EXPECTED AT R' + 2 //'HS.') + ENDDO +*---- +* RECOVER THE ACTUAL FLUX SOLUTION AND CORRESPONDING TRACKING. +*---- + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_FLUX') THEN + TEXT12=HENTRY(3) + CALL XABORT('DREF: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_FLUX EXPECTED.') + ENDIF + IPFLX=KENTRY(3) + CALL LCMGET(IPFLX,'STATE-VECTOR',ISTATE) + NG=ISTATE(1) + NUN=ISTATE(2) + CALL LCMGTC(KENTRY(3+1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_TRACK') THEN + TEXT12=HENTRY(4) + CALL XABORT('DREF: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_TRACK EXPECTED.') + ENDIF + IPTRK=KENTRY(4) + CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE) + NREG=ISTATE(1) + ITYPE=ISTATE(6) + IELEM=ISTATE(9) + ICHX=ISTATE(12) + IF(ISTATE(2).NE.NUN) CALL XABORT('DREF: INVALID NUN.') + CALL LCMGTC(IPTRK,'TRACK-TYPE',12,CMODUL) + IF((CMODUL.NE.'TRIVAC').AND.(CMODUL.NE.'SN')) THEN + CALL XABORT('DREF: TRIVAC OR SN EXPECTED.') + ENDIF + ALLOCATE(MAT(NREG),KEY(NREG),VOL(NREG)) + CALL LCMGET(IPTRK,'MATCOD',MAT) + CALL LCMGET(IPTRK,'KEYFLX',KEY) + CALL LCMGET(IPTRK,'VOLUME',VOL) +*---- +* RECOVER THE ACTUAL MACROLIB. +*---- + CALL LCMGTC(KENTRY(5),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_MACROLIB') THEN + IPMAC1=KENTRY(5) + ELSE IF(HSIGN.EQ.'L_LIBRARY') THEN + IPMAC1=LCMGID(KENTRY(5),'MACROLIB') + ELSE + TEXT12=HENTRY(5) + CALL XABORT('DREF: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. ACTUAL L_MACROLIB OR L_LIBRARY EXPECTED.') + ENDIF + CALL LCMGET(IPMAC1,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NG) CALL XABORT('DREF: INVALID NUMBER OF GROUPS.') + NMIL=ISTATE(2) + NFIS1=ISTATE(4) + ILEAK1=ISTATE(9) +*---- +* RECOVER THE REFERENCE MACROLIB. +*---- + CALL LCMGTC(KENTRY(6),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_MACROLIB') THEN + IPMAC2=KENTRY(6) + ELSE IF(HSIGN.EQ.'L_LIBRARY') THEN + IPMAC2=LCMGID(KENTRY(6),'MACROLIB') + ELSE + TEXT12=HENTRY(6) + CALL XABORT('DREF: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. REFERENCE L_MACROLIB OR L_LIBRARY EXPECTED.') + ENDIF + CALL LCMGET(IPMAC2,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NG) THEN + CALL XABORT('DREF: INVALID NUMBER OF REFERENCE GROUPS.') + ELSE IF(ISTATE(2).NE.NMIL) THEN + CALL XABORT('DREF: INVALID NUMBER OF REFERENCE MIXTURES.') + ENDIF + NFIS2=ISTATE(4) + NALBP=ISTATE(8) + ILEAK2=ISTATE(9) + IDF=ISTATE(12) + IF((NALBP.GT.0).AND.(ICHX.NE.2)) CALL XABORT('DREF: RAVIART-THOM' + 1 //'AS FINITE ELEMENTS EXPECTED.') +*---- +* READ INPUT PARAMETERS +*---- + IPRINT=1 + LNO=.FALSE. + LRMS=.FALSE. + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.10) GO TO 20 + IF(INDIC.NE.3) CALL XABORT('DREF: CHARACTER DATA EXPECTED') + IF(TEXT12(1:4).EQ.'EDIT') THEN + CALL REDGET(INDIC,IPRINT,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('DREF: INTEGER DATA EXPECTED FOR IP' + 1 //'RINT') + ELSE IF(TEXT12.EQ.'NODERIV') THEN + LNO=.TRUE. + GO TO 10 + ELSE IF(TEXT12.EQ.'NEWTON') THEN + LNEWT=.TRUE. + GO TO 10 + ELSE IF(TEXT12(1:3).EQ.'RMS') THEN + LRMS=.TRUE. + GO TO 20 + ELSE IF(TEXT12(1:1).EQ.';') THEN + IF(LRMS) RETURN + GO TO 20 + ELSE + CALL XABORT('DREF: '//TEXT12//' IS AN INVALID KEYWORD') + ENDIF + GO TO 10 +*---- +* COMPUTE THE GPT SOURCE +*---- + 20 IF((ICONT.EQ.1).OR.(ICONT.EQ.2)) THEN + CALL DRESOU(IPRINT,IPDREF,IPMAC1,IPMAC2,IPFLX,IPGRAD,NG,NREG, + 1 NMIL,NUN,MAT,KEY,VOL,LNO,RMSD) + NFUNC=1 + ELSE IF(((ICONT.EQ.3).OR.(ICONT.EQ.4)).AND.LNEWT) THEN +* NEWTONIAN SPH TECHNIQUE + CALL DRENOU(IPRINT,IPDREF,IPMAC1,IPMAC2,IPFLX,IPTRK,IPGRAD,NG, + 1 NREG,ITYPE,IELEM,NMIL,NALBP,NUN,NFIS1,NFIS2,ILEAK1,ILEAK2, + 2 IDF,MAT,KEY,VOL,LNO,NFUNC,RMSD) + ELSE IF((ICONT.EQ.3).OR.(ICONT.EQ.4).OR.(ICONT.EQ.5)) THEN +* QUASI-NEWTONIAN SPH TECHNIQUE + CALL DREKOU(IPRINT,IPDREF,IPMAC1,IPMAC2,IPFLX,IPTRK,IPGRAD, + 1 NG,NREG,ITYPE,IELEM,NMIL,NALBP,NUN,NFIS1,NFIS2,ILEAK1,ILEAK2, + 2 IDF,MAT,KEY,VOL,LNO,RMSD) + NFUNC=1 + ENDIF +* + DEALLOCATE(VOL,KEY,MAT) +*---- +* SAVE THE SIGNATURE AND STATE VECTOR +*---- + HSIGN='L_SOURCE' + CALL LCMPTC(IPDREF,'SIGNATURE',12,HSIGN) + CALL LCMPTC(IPDREF,'TRACK-TYPE',12,CMODUL) + ISTATE(:NSTATE)=0 + ISTATE(1)=NG + ISTATE(2)=NUN + ISTATE(3)=0 + ISTATE(4)=NFUNC + ISTATE(5)=NMIL + ISTATE(6)=NG + IF(IPRINT.GT.0) WRITE(6,100) (ISTATE(I),I=1,6) + CALL LCMPUT(IPDREF,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(.NOT.LRMS) RETURN +*---- +* SEND BACK RMS ERROR TOWARDS CLE-2000 +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + INDIC=-INDIC + IF(INDIC.EQ.2) THEN + CALL REDPUT(INDIC,NITMA,REAL(RMSD),TEXT12,DFLOTT) + ELSE IF(INDIC.EQ.4) THEN + CALL REDPUT(INDIC,NITMA,FLOTT,TEXT12,RMSD) + ENDIF + GO TO 10 +* + 100 FORMAT(/8H OPTIONS/8H -------/ + 1 7H NG ,I8,28H (NUMBER OF ENERGY GROUPS)/ + 2 7H NUN ,I8,40H (NUMBER OF UNKNOWNS PER ENERGY GROUP)/ + 3 7H NDIR ,I8,35H (NUMBER OF DIRECT FIXED SOURCES)/ + 4 7H NCST ,I8,36H (NUMBER OF ADJOINT FIXED SOURCES)/ + 5 7H NMIL ,I8,34H (NUMBER OF HOMOGENIZED REGIONS)/ + 6 7H NG ,I8,38H (NUMBER OF CONDENSED ENERGY GROUPS)) + END diff --git a/Donjon/src/DREJ02.f b/Donjon/src/DREJ02.f new file mode 100644 index 0000000..8ef8176 --- /dev/null +++ b/Donjon/src/DREJ02.f @@ -0,0 +1,171 @@ +*DECK DREJ02 + SUBROUTINE DREJ02(ITYPE,IELEM,NREG,NUN,MAXKN,MAXQF,MAT,KN,QFR, + 1 IQFR,VOL,FUNKNO,OUT,GAMMA) +* +*----------------------------------------------------------------------- +* +*Purpose: +* One-speed net surfacic current calculation in 3D mixed-dual finite +* element approximation. +* +*Copyright: +* Copyright (C) 2018 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 +* ITYPE type of geometry: =5/7 (Cartesian); =8/9 (hexagonal). +* IELEM degree of the Lagrangian finite elements: =1 (linear); +* =2 (parabolic); =3 (cubic); =4 (quartic). +* NREG number of elements. +* NUN dimension of array FUNKNO. +* MAXKN dimension of array KN. +* MAXQF dimension of array QFR. +* MAT mixture index per region. +* KN element-ordered unknown list. +* QFR element-ordered surfaces. +* IQFR element-ordered physical albedo indices. +* VOL volume of regions. +* FUNKNO neutron fluxes. +* +*Parameters: output +* OUT net surfacic current. +* GAMMA gamma function. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER ITYPE,IELEM,NREG,NUN,MAXKN,MAXQF,MAT(NREG),KN(MAXKN), + 1 IQFR(MAXQF) + REAL QFR(MAXQF),VOL(NREG),FUNKNO(NUN),OUT,GAMMA(NUN) +* + IF(IELEM.LT.0) CALL XABORT('DREJ02: TYPE OF DISCRETIZATION NOT I' + 1 //'MPLEMENTED.') + GAMMA(:NUN)=0.0 + OUT=0.0 + NUM1=0 + NUM2=0 + IF((ITYPE.NE.5).OR.(ITYPE.NE.7)) THEN + DO 20 K=1,NREG + IF(MAT(K).EQ.0) GO TO 20 + IF(VOL(K).EQ.0.0) GO TO 10 + IF(NUM2+4.GT.MAXQF) call XABORT('overflow') + IALB=IQFR(NUM2+1) + IF((IALB.NE.0).AND.(QFR(NUM2+1).GT.0.0)) THEN + IND1=KN(NUM1+2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug1') + GAMMA(IND1)=-QFR(NUM2+1) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+1) + ENDIF + IALB=IQFR(NUM2+2) + IF((IALB.NE.0).AND.(QFR(NUM2+2).GT.0.0)) THEN + IND1=KN(NUM1+2+IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug2') + GAMMA(IND1)=QFR(NUM2+2) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+2) + ENDIF + IALB=IQFR(NUM2+3) + IF((IALB.NE.0).AND.(QFR(NUM2+3).GT.0.0)) THEN + IND1=KN(NUM1+2+2*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug3') + GAMMA(IND1)=-QFR(NUM2+3) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+3) + ENDIF + IALB=IQFR(NUM2+4) + IF((IALB.NE.0).AND.(QFR(NUM2+4).GT.0.0)) THEN + IND1=KN(NUM1+2+3*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug4') + GAMMA(IND1)=QFR(NUM2+4) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+4) + ENDIF + IALB=IQFR(NUM2+5) + IF((IALB.NE.0).AND.(QFR(NUM2+5).GT.0.0)) THEN + IND1=KN(NUM1+2+4*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug5') + GAMMA(IND1)=-QFR(NUM2+5) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+5) + ENDIF + IALB=IQFR(NUM2+6) + IF((IALB.NE.0).AND.(QFR(NUM2+6).GT.0.0)) THEN + IND1=KN(NUM1+2+5*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug6') + GAMMA(IND1)=QFR(NUM2+6) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+6) + ENDIF + 10 NUM1=NUM1+1+6*IELEM**2 + NUM2=NUM2+6 + 20 CONTINUE + ELSE IF((ITYPE.NE.8).OR.(ITYPE.NE.9)) THEN + DO 40 K=1,NREG + IF(MAT(K).EQ.0) GO TO 40 + IF(VOL(K).EQ.0.0) GO TO 30 + IF((IALB.NE.0).AND.(QFR(NUM2+1).GT.0.0)) THEN + IND1=KN(NUM1+2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug7') + GAMMA(IND1)=-QFR(NUM2+1) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+1) + ENDIF + IALB=IQFR(NUM2+2) + IF((IALB.NE.0).AND.(QFR(NUM2+2).GT.0.0)) THEN + IND1=KN(NUM1+2+IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug8') + GAMMA(IND1)=QFR(NUM2+2) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+2) + ENDIF + IALB=IQFR(NUM2+3) + IF((IALB.NE.0).AND.(QFR(NUM2+3).GT.0.0)) THEN + IND1=KN(NUM1+2+2*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug9') + GAMMA(IND1)=-QFR(NUM2+3) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+3) + ENDIF + IALB=IQFR(NUM2+4) + IF((IALB.NE.0).AND.(QFR(NUM2+4).GT.0.0)) THEN + IND1=KN(NUM1+2+3*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug10') + GAMMA(IND1)=QFR(NUM2+4) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+4) + ENDIF + IALB=IQFR(NUM2+5) + IF((IALB.NE.0).AND.(QFR(NUM2+5).GT.0.0)) THEN + IND1=KN(NUM1+2+4*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug11') + GAMMA(IND1)=-QFR(NUM2+5) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+5) + ENDIF + IALB=IQFR(NUM2+6) + IF((IALB.NE.0).AND.(QFR(NUM2+6).GT.0.0)) THEN + IND1=KN(NUM1+2+5*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug12') + GAMMA(IND1)=QFR(NUM2+6) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+6) + ENDIF + IALB=IQFR(NUM2+7) + IF((IALB.NE.0).AND.(QFR(NUM2+7).GT.0.0)) THEN + IND1=KN(NUM1+2+6*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug13') + GAMMA(IND1)=-QFR(NUM2+7) + OUT=OUT-FUNKNO(IND1)*QFR(NUM2+7) + ENDIF + IALB=IQFR(NUM2+8) + IF((IALB.NE.0).AND.(QFR(NUM2+8).GT.0.0)) THEN + IND1=KN(NUM1+2+7*IELEM**2) + IF(IND1.LE.0) CALL XABORT('DREJ02: bug14') + GAMMA(IND1)=QFR(NUM2+8) + OUT=OUT+FUNKNO(IND1)*QFR(NUM2+8) + ENDIF + 30 NUM1=NUM1+1+8*IELEM**2 + NUM2=NUM2+8 + 40 CONTINUE + ELSE + CALL XABORT('DREJ02: TYPE OF GEOMETRY NOT IMPLEMENTED.') + ENDIF + RETURN + END diff --git a/Donjon/src/DREKOU.f b/Donjon/src/DREKOU.f new file mode 100644 index 0000000..a9b1a97 --- /dev/null +++ b/Donjon/src/DREKOU.f @@ -0,0 +1,511 @@ +*DECK DREKOU + SUBROUTINE DREKOU(IPRINT,IPGPT,IPMAC1,IPMAC2,IPFLX,IPTRK,IPGRAD, + 1 NG,NREG,ITYPE,IELEM,NMIL,NALBP,NUN,NFIS1,NFIS2,ILEAK1,ILEAK2, + 2 IDF2,MATCOD,KEYFLX,VOL,LNO,RMSD) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the GPT sources corresponding to the gradient of the RMS +* absorption distribution. Case with direct effect. +* +*Copyright: +* Copyright (C) 2017 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 +* IPRINT print parameter +* IPGPT pointer to the L_SOURCE data structure. +* IPMAC1 pointer to the actual macrolib structure. +* IPMAC2 pointer to the reference macrolib structure. +* IPFLX pointer to the multigroup flux. +* IPTRK pointer to the tracking object. +* IPGRAD pointer to the L_OPTIMIZE object. +* NG number of energy groups. +* NREG number of regions. +* NMIL number of material mixtures. +* NALBP number of physical albedos. +* NUN number of unknowns per energy group. +* NFIS1 number of fissile isotopes in actual macrolib. +* NFIS2 number of fissile isotopes in reference macrolib. +* ILEAK1 type of leakage calculation in actual macrolib +* =0: no leakage; =1: homogeneous leakage (Diffon). +* ILEAK2 type of leakage calculation in reference macrolib. +* IDF2 ADF type, 0 = none, 1 = Albedo, 2 = FD_B/FD_C/..., 3 = ADF. +* MATCOD material mixture indices per region. +* KEYFLX position of averaged fluxes in unknown vector. +* VOL volumes. +* LNO flag set to .true. to exit after calculation of RMS. +* +*Parameters: output +* RMSD RMS error on rate distribution. +* +*Parameters: +* ITYPE +* IELEM +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPGPT,IPMAC1,IPMAC2,IPFLX,IPTRK,IPGRAD + INTEGER IPRINT,NG,NREG,ITYPE,IELEM,NMIL,NALBP,NUN,NFIS1,NFIS2, + > ILEAK1,ILEAK2,IDF2,MATCOD(NREG),KEYFLX(NREG) + REAL VOL(NREG) + DOUBLE PRECISION RMSD + LOGICAL LNO +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + TYPE(C_PTR) JPMAC1,JPMAC2,KPMAC1,KPMAC2,JPFLX,JPGPT,KPGPT + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION SOUT1,SOUT2,GRATOT,SOUTOT,AB1TOT,AB2TOT,FI1TOT, + > FI2TOT,SUM1,DSUM,DELTA,OUT,SA,SF,SUNGAR,ABS2M,OUT2M,AIL,BIL,DEN1, + > DEN2 + CHARACTER HSMG*131 + DOUBLE PRECISION, PARAMETER :: EPS=1.0E-4,EPSL=1.0E-4 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,IREL,KN,IQFR + REAL, ALLOCATABLE, DIMENSION(:) :: GAR,WORK,SUNK,FLUX,QFR,OUTG1, + > OUTG2,DIFHOM,DIFF + REAL, ALLOCATABLE, DIMENSION(:,:) :: PHI1,PHI2,ABS1,ABS2,NUF1, + > NUF2,GAMMA,OUTG2R + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: CHI1,CHI2,RHS1,LHS1,RHS2, + > LHS2 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV,GRAD,RHS,CONST + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: SIGA,SIGF +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(PHI1(NMIL,NG),PHI2(NMIL,NG),ABS1(NMIL,NG),ABS2(NMIL,NG), + 1 RHS1(NMIL,NG,NG),LHS1(NMIL,NG,NG),RHS2(NMIL,NG,NG), + 2 LHS2(NMIL,NG,NG),CONST(NG),IREL(NG),RHS(NG),GAMMA(NUN,NG), + 3 OUTG1(NG),OUTG2(NG),OUTG2R(NG,2),SIGA(NMIL,NG),SIGF(NMIL,NG)) +*---- +* COMPUTE THE ACTUAL AND REFERENCE REACTION RATE MATRICES +*---- + CALL LCMGET(IPMAC1,'K-EFFECTIVE',ZKEFF1) + CALL LCMGET(IPMAC2,'K-EFFECTIVE',ZKEFF2) + IF(IDF2.EQ.1) THEN + CALL LCMSIX(IPMAC2,'ADF',1) + CALL LCMLEN(IPMAC2,'ALBS00',ILCMLN,ITYLCM) + IF(ILCMLN.NE.2*NG) CALL XABORT('DREKOU: WRONG ALBS00 LENGTH.') + CALL LCMGET(IPMAC2,'ALBS00',OUTG2R) + CALL LCMSIX(IPMAC2,' ',2) + ENDIF + CALL LCMLEN(IPMAC1,'B2 B1HOM',ILCMLN,ITYLCM) + IF(ILCMLN.EQ.1) THEN + CALL LCMGET(IPMAC1,'B2 B1HOM',B21) + ELSE + B21=0.0 + ENDIF + CALL LCMLEN(IPMAC2,'B2 B1HOM',ILCMLN,ITYLCM) + IF(ILCMLN.EQ.1) THEN + CALL LCMGET(IPMAC2,'B2 B1HOM',B22) + ELSE + B22=0.0 + ENDIF + IF((ILEAK1.EQ.1).AND.(IPRINT.GT.0)) THEN + WRITE(6,'(/22H DREKOU: MACRO B2=,1P,E12.4)') B21 + ENDIF + IF((ILEAK2.EQ.1).AND.(IPRINT.GT.0)) THEN + WRITE(6,'(/22H DREKOU: REFERENCE B2=,1P,E12.4)') B22 + ENDIF + RHS1(:NMIL,:NG,:NG)=0.0 + LHS1(:NMIL,:NG,:NG)=0.0 + RHS2(:NMIL,:NG,:NG)=0.0 + LHS2(:NMIL,:NG,:NG)=0.0 + SIGA(:NMIL,:NG)=0.0D0 + SIGF(:NMIL,:NG)=0.0D0 + JPMAC1=LCMGID(IPMAC1,'GROUP') + JPMAC2=LCMGID(IPMAC2,'GROUP') + ALLOCATE(IJJ(NMIL),NJJ(NMIL),IPOS(NMIL),GAR(NMIL),WORK(NMIL*NG), + 1 CHI1(NMIL,NFIS1,NG),NUF1(NMIL,NFIS1),CHI2(NMIL,NFIS2,NG), + 2 NUF2(NMIL,NFIS2),DIFHOM(NG),DIFF(NMIL)) + DO IG=1,NG + KPMAC1=LCMGIL(JPMAC1,IG) + CALL LCMGET(KPMAC1,'CHI',CHI1(1,1,IG)) + KPMAC2=LCMGIL(JPMAC2,IG) + CALL LCMGET(KPMAC2,'CHI',CHI2(1,1,IG)) + CALL LCMLEN(KPMAC1,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.NE.NMIL) CALL XABORT('DREKOU: MISSING ACTUAL FLUX.') + CALL LCMLEN(KPMAC2,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.NE.NMIL) CALL XABORT('DREKOU: MISSING REFERENCE FLUX.') + CALL LCMGET(KPMAC1,'FLUX-INTG',PHI1(1,IG)) + CALL LCMGET(KPMAC2,'FLUX-INTG',PHI2(1,IG)) + ENDDO + DO IG=1,NG + KPMAC1=LCMGIL(JPMAC1,IG) + KPMAC2=LCMGIL(JPMAC2,IG) + IF(ILEAK1.EQ.1) THEN + CALL LCMLEN(KPMAC1,'DIFF',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC1,'DIFF',DIFF) + ELSE + CALL LCMGET(IPMAC1,'DIFHOMB1HOM',DIFHOM) + DO IBM=1,NMIL + DIFF(IBM)=DIFHOM(IG) + ENDDO + ENDIF + ELSE + DIFF(:NMIL)=0.0 + ENDIF + CALL LCMGET(KPMAC1,'NTOT0',GAR) + CALL LCMGET(KPMAC1,'SCAT00',WORK) + CALL LCMGET(KPMAC1,'NJJS00',NJJ) + CALL LCMGET(KPMAC1,'IJJS00',IJJ) + CALL LCMGET(KPMAC1,'IPOS00',IPOS) + DO IBM=1,NMIL + SIGA(IBM,IG)=SIGA(IBM,IG)+GAR(IBM) + IPOSDE=IPOS(IBM) + DO JG=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 +* IG <-- JG + RHS1(IBM,IG,JG)=RHS1(IBM,IG,JG)-WORK(IPOSDE)*PHI1(IBM,JG) + SIGA(IBM,JG)=SIGA(IBM,JG)-WORK(IPOSDE) + IPOSDE=IPOSDE+1 + ENDDO + RHS1(IBM,IG,IG)=RHS1(IBM,IG,IG)+(GAR(IBM)+B21*DIFF(IBM))* + > PHI1(IBM,IG) + ENDDO + CALL LCMGET(KPMAC1,'NUSIGF',NUF1) + DO IBM=1,NMIL + DO IFIS=1,NFIS1 + DO JG=1,NG + LHS1(IBM,JG,IG)=LHS1(IBM,JG,IG)+CHI1(IBM,IFIS,JG)* + > NUF1(IBM,IFIS)*PHI1(IBM,IG) + SIGF(IBM,IG)=SIGF(IBM,IG)+CHI1(IBM,IFIS,JG)*NUF1(IBM,IFIS) + ENDDO + ENDDO + ENDDO +* + IF(ILEAK2.EQ.1) THEN + CALL LCMLEN(KPMAC2,'DIFF',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC2,'DIFF',DIFF) + ELSE + CALL LCMGET(IPMAC2,'DIFHOMB1HOM',DIFHOM) + DO IBM=1,NMIL + DIFF(IBM)=DIFHOM(IG) + ENDDO + ENDIF + ELSE + DIFF(:NMIL)=0.0 + ENDIF + CALL LCMGET(KPMAC2,'NTOT0',GAR) + CALL LCMGET(KPMAC2,'SCAT00',WORK) + CALL LCMGET(KPMAC2,'NJJS00',NJJ) + CALL LCMGET(KPMAC2,'IJJS00',IJJ) + CALL LCMGET(KPMAC2,'IPOS00',IPOS) + DO IBM=1,NMIL + IPOSDE=IPOS(IBM) + DO JG=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 +* IG <-- JG + RHS2(IBM,IG,JG)=RHS2(IBM,IG,JG)-WORK(IPOSDE)*PHI2(IBM,JG) + IPOSDE=IPOSDE+1 + ENDDO + RHS2(IBM,IG,IG)=RHS2(IBM,IG,IG)+(GAR(IBM)+B22*DIFF(IBM))* + > PHI2(IBM,IG) + ENDDO + CALL LCMGET(KPMAC2,'NUSIGF',NUF2) + DO IBM=1,NMIL + DO IFIS=1,NFIS2 + DO JG=1,NG + LHS2(IBM,JG,IG)=LHS2(IBM,JG,IG)+CHI2(IBM,IFIS,JG)* + > NUF2(IBM,IFIS)*PHI2(IBM,IG) + ENDDO + ENDDO + ENDDO + ENDDO + DEALLOCATE(DIFF,DIFHOM,NUF2,CHI2,NUF1,CHI1,WORK,GAR,IPOS,NJJ,IJJ) +*---- +* COMPUTE THE ACTUAL AND REFERENCE ABSORPTION AND FISSION RATES +*---- + AB1TOT=0.0D0 + AB2TOT=0.0D0 + FI1TOT=0.0D0 + FI2TOT=0.0D0 + DO IG=1,NG + OUTG1(IG)=0.0 + OUTG2(IG)=0.0 + DO IBM=1,NMIL + OUTG1(IG)=OUTG1(IG)+SUM(LHS1(IBM,IG,:NG))/ZKEFF1- + 1 SUM(RHS1(IBM,IG,:NG)) + OUTG2(IG)=OUTG2(IG)+SUM(LHS2(IBM,IG,:NG))/ZKEFF2- + 1 SUM(RHS2(IBM,IG,:NG)) + ABS1(IBM,IG)=SUM(RHS1(IBM,:NG,IG)) + ABS2(IBM,IG)=SUM(RHS2(IBM,:NG,IG)) + AB1TOT=AB1TOT+ABS1(IBM,IG) + AB2TOT=AB2TOT+ABS2(IBM,IG) + FI1TOT=FI1TOT+SUM(LHS1(IBM,:NG,IG)) + FI2TOT=FI2TOT+SUM(LHS2(IBM,:NG,IG)) + ENDDO + IF(IDF2.EQ.1) OUTG2(IG)=OUTG2R(IG,1)-OUTG2R(IG,2) + IF((NALBP.GT.0).AND.(OUTG2(IG).LT.-1.0E-6)) THEN + WRITE(HSMG,'(44HDREKOU: INCONSISTENT REFERENCE LEAKAGE IN GR, + 1 3HOUP,I4,7H. LEAK=,1P,E13.4)') IG,OUTG2(IG) + CALL XABORT(HSMG) + ENDIF + ENDDO +*---- +* COMPUTE THE ACTUAL LEAKAGE FROM OUT-CURRENTS +*---- + OUT=0.0D0 + GAMMA(:NUN,:NG)=0.0 + IF(NALBP.GT.0) THEN + CALL LCMLEN(IPTRK,'KN',MAXKN,ITYLCM) + CALL LCMLEN(IPTRK,'QFR',MAXQF,ITYLCM) + ALLOCATE(KN(MAXKN),QFR(MAXQF),IQFR(MAXQF),FLUX(NUN)) + CALL LCMGET(IPTRK,'KN',KN) + CALL LCMGET(IPTRK,'QFR',QFR) + CALL LCMGET(IPTRK,'IQFR',IQFR) + JPFLX=LCMGID(IPFLX,'FLUX') + DO IG=1,NG + CALL LCMGDL(JPFLX,IG,FLUX) + CALL DREJ02(ITYPE,IELEM,NREG,NUN,MAXKN,MAXQF,MATCOD,KN,QFR, + 1 IQFR,VOL,FLUX,OUTG1(IG),GAMMA(1,IG)) + OUT=OUT+OUTG1(IG) + IF(IPRINT.GT.0) WRITE(6,130) IG,OUTG1(IG)/REAL(AB1TOT), + 1 OUTG2(IG)/REAL(AB2TOT) + ENDDO + DEALLOCATE(FLUX,IQFR,QFR,KN) + ENDIF +*---- +* COMPUTE MACRO AND REFERENCE K-EFFECTIVE +*---- + DEN1=0.0D0 + DEN2=0.0D0 + DO IG=1,NG + OUTG1(IG)=OUTG1(IG)+SUM(ABS1(:NMIL,IG)) + OUTG2(IG)=OUTG2(IG)+SUM(ABS2(:NMIL,IG)) + DEN1=DEN1+OUTG1(IG) + DEN2=DEN2+OUTG2(IG) + ENDDO + IF(IPRINT.GT.0) THEN + WRITE(6,'(/24H DREKOU: MACRO KEFF=,1P,E12.5)') FI1TOT/DEN1 + WRITE(6,'(/24H DREKOU: REFERENCE KEFF=,1P,E12.5)') FI2TOT/DEN2 + ENDIF +*---- +* GET INFORMATION FROM L_OPTIMIZE OBJECT +*---- + CALL LCMGET(IPGRAD,'DEL-STATE',ISTATE) + IF(ISTATE(4).LE.2) CALL XABORT('DREKOU: NO DIRECT EFFECT WITH ' + > //'THIS TYPE OF PERTURBATION.') + IF(ISTATE(7).NE.1) CALL XABORT('DREKOU: IBM1=1 EXPECTED.') + IF(ISTATE(8).NE.NMIL) CALL XABORT('DREKOU: IBM2=NMIL EXPECTED.') + IMC=ISTATE(4)-2 + NGR1=ISTATE(5) + NGR2=ISTATE(6) + IF(IMC.LE.2) THEN + NPERT=(NMIL+NALBP)*(NGR2-NGR1+1) + ELSE + NPERT=NALBP*(NGR2-NGR1+1) + ENDIF + ALLOCATE(VARV(NPERT)) + CALL LCMGET(IPGRAD,'VAR-VALUE',VARV) +*---- +* COMPUTE THE RMS FUNCTIONAL AND CONSTRAINTS +*---- + IREL(:NGR2-NGR1+1)=0 + RHS(:NGR2-NGR1+1)=0.0D0 + WEI=REAL(NMIL) + RMSD=0.0D0 + IF(IMC.LE.2) THEN + IPERT=0 + DO IG=NGR1,NGR2 + SUM1=0.0D0 + DSUM=0.0D0 + DO IBM=1,NMIL + IPERT=IPERT+1 + ABS2M=MAX(EPS*AB2TOT,DBLE(ABS2(IBM,IG))) + DELTA=ABS1(IBM,IG)*AB2TOT/(ABS2M*AB1TOT)-ABS2(IBM,IG)/ABS2M + RMSD=RMSD+DELTA**2 + SUM1=SUM1+PHI2(IBM,IG)/VARV(IPERT) + DSUM=DSUM+PHI2(IBM,IG) + ENDDO + DELTA=SUM1/DSUM-1.0D0 + RMSD=RMSD+DELTA**2 + CONST(IG-NGR1+1)=DELTA + IPERT=IPERT+NALBP + ENDDO + ENDIF + IF(NALBP.GT.0) THEN + DO IG=1,NG + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(IG))) + DELTA=OUTG1(IG)*FI2TOT/(OUT2M*FI1TOT)-OUTG2(IG)/OUT2M + RMSD=RMSD+WEI*DELTA**2 + ENDDO + ENDIF + IF(IPRINT.GT.0) THEN + WRITE(6,100) RMSD + IF(IMC.LE.2) THEN + DO IG=NGR1,NGR2 + WRITE(6,110) IG,CONST(IG-NGR1+1) + ENDDO + ENDIF + ENDIF + IF((IPRINT.GT.2).AND.(IMC.LE.2)) THEN + DO IG=1,NG + WRITE(6,'(7H GROUP=,I4)') IG + DO IBM=1,NMIL + WRITE(6,120) IBM,ABS1(IBM,IG)/REAL(AB1TOT), + 1 ABS2(IBM,IG)/REAL(AB2TOT) + ENDDO + ENDDO + ENDIF +*---- +* STORE INFORMATION ON L_OPTIMIZE OBJECT +*---- + CALL LCMPUT(IPGRAD,'FOBJ-CST-VAL',1,4,RMSD) + IF(LNO) GO TO 20 +*---- +* COMPUTE THE GRADIENT OF THE RMS FUNCTIONAL +*---- + ALLOCATE(SUNK(NUN)) + JPGPT=LCMLID(IPGPT,'ASOUR',1) + KPGPT=LCMLIL(JPGPT,1,NG) + DO IG=1,NG + SUNK(:NUN)=0.0 + DO IR=1,NREG + IUNK=KEYFLX(IR) + IF(IUNK.EQ.0) CYCLE + IBM=MATCOD(IR) + IF(IBM.EQ.0) CYCLE + SA=SIGA(IBM,IG) + SF=SIGF(IBM,IG) + SOUT1=0.0D0 + SOUT2=0.0D0 + SUNGAR=0.0D0 + IF(IMC.LE.2) THEN + DO JG=1,NG + DO JBM=1,NMIL + ABS2M=MAX(EPS*AB2TOT,DBLE(ABS2(JBM,JG))) + DELTA=ABS1(JBM,JG)*AB2TOT/(ABS2M*AB1TOT)-ABS2(JBM,JG)/ + 1 ABS2M + IF((IG.EQ.JG).AND.(IBM.EQ.JBM)) THEN + SOUT1=SOUT1+DELTA/ABS2M + ENDIF + SOUT2=SOUT2+(ABS1(JBM,JG)/AB1TOT)*DELTA/ABS2M + ENDDO + ENDDO + SUNGAR=2.0D0*VOL(IR)*SA*AB2TOT*(SOUT1-SOUT2)/AB1TOT + ENDIF + IF(NALBP.GT.0) THEN + SOUT1=0.0D0 + SOUT2=0.0D0 + DO JG=1,NG + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(JG))) + DELTA=OUTG1(JG)*FI2TOT/(OUT2M*FI1TOT)-OUTG2(JG)/OUT2M + IF(IG.EQ.JG) SOUT1=SOUT1+DELTA*SA/OUT2M + SOUT2=SOUT2+(OUTG1(JG)/FI1TOT)*DELTA*SF/OUT2M + ENDDO + SUNGAR=SUNGAR+2.0D0*VOL(IR)*WEI*FI2TOT*(SOUT1-SOUT2)/FI1TOT + ENDIF + SUNK(IUNK)=REAL(SUNGAR) + ENDDO + IF(NALBP.GT.0) THEN + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(IG))) + DELTA=OUTG1(IG)*FI2TOT/(OUT2M*FI1TOT)-OUTG2(IG)/OUT2M + DO IUNK=1,NUN + SOUT1=DELTA*GAMMA(IUNK,IG)/OUT2M + SUNK(IUNK)=SUNK(IUNK)+2.0*WEI*REAL(FI2TOT*SOUT1/FI1TOT) + ENDDO + ENDIF + CALL LCMPDL(KPGPT,IG,NUN,2,SUNK) + ENDDO +*---- +* CHECK SOURCE ORTHOGONALITY +*---- + ALLOCATE(FLUX(NUN)) + JPFLX=LCMGID(IPFLX,'FLUX') + AIL=0.0D0 + BIL=0.0D0 + DO IG=1,NG + CALL LCMGDL(KPGPT,IG,SUNK) + CALL LCMGDL(JPFLX,IG,FLUX) + DO IUNK=1,NUN + GAZ=FLUX(IUNK)*SUNK(IUNK) + DAZ=FLUX(IUNK)**2 + AIL=AIL+GAZ + BIL=BIL+DAZ + ENDDO + ENDDO + DSUM=ABS(AIL)/ABS(BIL)/REAL(NUN) + IF(IPRINT.GT.0) THEN + WRITE(6,'(/21H DREKOU: DOT PRODUCT=,1P,E11.4)') DSUM + ENDIF + IF(ABS(DSUM).GT.1.0E-4) THEN + WRITE(HSMG,'(36HDREKOU: NON ORTHOGONAL SOURCE (DSUM=,1P,E11.3, + 1 2H).)') DSUM + CALL XABORT(HSMG) + ENDIF + DEALLOCATE(FLUX,SUNK) +*---- +* COMPUTE THE DIRECT GRADIENTS +*---- + ALLOCATE(GRAD(NPERT)) + GRAD(:NPERT)=0.0D0 + IF(IMC.GT.2) GO TO 10 + IPERT=0 + DO IG=NGR1,NGR2 + DSUM=0.0D0 + DO IBM=1,NMIL + DSUM=DSUM+PHI2(IBM,IG) + ENDDO + DO IBM=1,NMIL + IPERT=IPERT+1 + GRATOT=0.0D0 + DO JG=1,NG + DO JBM=1,NMIL + SOUTOT=0.0D0 + IF((IG.EQ.JG).AND.(IBM.EQ.JBM)) SOUTOT=1.0 + SOUTOT=SOUTOT-ABS1(IBM,IG)/AB1TOT + ABS2M=MAX(EPS*AB2TOT,DBLE(ABS2(JBM,JG))) + DELTA=ABS1(JBM,JG)*AB2TOT/(ABS2M*AB1TOT)-ABS2(JBM,JG)/ABS2M + GRATOT=GRATOT+SOUTOT*ABS1(JBM,JG)*DELTA*AB2TOT/ABS2M + ENDDO + ENDDO + GRAD(IPERT)=2.0D0*GRATOT/AB1TOT/VARV(IPERT) + IF(NALBP.GT.0) THEN + SOUT1=0.0D0 + SOUT2=0.0D0 + DO JG=1,NG + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(JG))) + DELTA=OUTG1(JG)*FI2TOT/(OUT2M*FI1TOT)-OUTG2(JG)/OUT2M + IF(IG.EQ.JG) SOUT1=SOUT1+ABS1(IBM,IG)*DELTA/OUT2M + SOUT2=SOUT2+(OUTG1(JG)/FI1TOT)*SUM(LHS1(IBM,:NG,IG))* + 1 DELTA/OUT2M + ENDDO + GRAD(IPERT)=GRAD(IPERT)+2.0D0*WEI*FI2TOT*(SOUT1-SOUT2)/ + 1 FI1TOT/VARV(IPERT) + ENDIF +* equality constraints + GRAD(IPERT)=GRAD(IPERT)-2.0D0*CONST(IG-NGR1+1)*PHI2(IBM,IG)/ + 1 (DSUM*VARV(IPERT)**2) + ENDDO + IPERT=IPERT+NALBP + ENDDO + 10 CALL LCMPUT(IPGRAD,'GRADIENT-DIR',NPERT,4,GRAD) + DEALLOCATE(GRAD) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 20 DEALLOCATE(VARV,SIGF,SIGA,OUTG2R,OUTG2,OUTG1,GAMMA,RHS,IREL,CONST, + 1 LHS2,RHS2,LHS1,RHS1,ABS2,ABS1,PHI2,PHI1) + RETURN +* + 100 FORMAT(/40H DREKOU: RMS ERROR ON RATE DISTRIBUTION=,1P,E11.4) + 110 FORMAT(23H DREKOU: CONSTRAINT(,I4,2H)=,1P,E11.4) + 120 FORMAT(5X,16HABSORPTION RATE(,I4,2H)=,1P,2E12.4) + 130 FORMAT(5X,6HGROUP=,I4,9H LEAKAGE=,1P,2E12.4) + END diff --git a/Donjon/src/DRENOU.f b/Donjon/src/DRENOU.f new file mode 100644 index 0000000..ea5941f --- /dev/null +++ b/Donjon/src/DRENOU.f @@ -0,0 +1,549 @@ +*DECK DRENOU + SUBROUTINE DRENOU(IPRINT,IPGPT,IPMAC1,IPMAC2,IPFLX,IPTRK,IPGRAD, + 1 NG,NREG,ITYPE,IELEM,NMIL,NALBP,NUN,NFIS1,NFIS2,ILEAK1,ILEAK2, + 2 IDF2,MATCOD,KEYFLX,VOL,LNO,NFUNC,RMSD) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the GPT sources corresponding to the gradient of the RMS +* absorption distribution. Case with NFUNC individual components to be +* used with a Newtonian method. +* +*Copyright: +* Copyright (C) 2019 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 +* IPRINT print parameter +* IPGPT pointer to the L_GPT data structure. +* IPMAC1 pointer to the actual macrolib structure. +* IPMAC2 pointer to the reference macrolib structure. +* IPFLX pointer to the multigroup flux. +* IPTRK pointer to the tracking object. +* IPGRAD pointer to the L_OPTIMIZE object. +* NG number of energy groups. +* NREG number of regions. +* NMIL number of material mixtures. +* NALBP number of physical albedos. +* NUN number of unknowns per energy group. +* NFIS1 number of fissile isotopes in actual macrolib. +* NFIS2 number of fissile isotopes in reference macrolib. +* ILEAK1 type of leakage calculation in actual macrolib +* =0: no leakage; =1: homogeneous leakage (Diffon). +* ILEAK2 type of leakage calculation in reference macrolib. +* IDF2 ADF type, 0 = none, 1 = Albedo, 2 = FD_B/FD_C/..., 3 = ADF. +* MATCOD material mixture indices per region. +* KEYFLX position of averaged fluxes in unknown vector. +* VOL volumes. +* LNO flag set to .true. to exit after calculation of RMS. +* +*Parameters: output +* NFUNC number of individual components in the gradient terms. +* RMSD RMS error on rate distribution. +* +*Parameters: +* ITYPE +* IELEM +* +* Reference: +* A. Hebert,"Developpement de la methode SPH: Homogeneisation de +* cellules dans un reseau non uniforme et calcul des parametres de +* reflecteur," Note CEA-N-2209, Sect. 3.5.1, 1981. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPGPT,IPMAC1,IPMAC2,IPFLX,IPTRK,IPGRAD + INTEGER IPRINT,NG,NREG,ITYPE,IELEM,NMIL,NALBP,NUN,NFIS1,NFIS2, + > ILEAK1,ILEAK2,IDF2,MATCOD(NREG),KEYFLX(NREG),NFUNC + REAL VOL(NREG) + DOUBLE PRECISION RMSD + LOGICAL LNO +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + TYPE(C_PTR) JPMAC1,JPMAC2,KPMAC1,KPMAC2,JPFLX,JPGPT,KPGPT + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION SOUT1,SOUT2,SOUTOT,AB1TOT,AB2TOT,FI1TOT,FI2TOT, + > SUM1,DSUM,DELTA,OUT,SA,SF,ABS2M,OUT2M,AIL,BIL,DEN1,DEN2 + CHARACTER HSMG*131 + DOUBLE PRECISION, PARAMETER :: EPS=1.0E-4,EPSL=1.0E-4 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,IREL,KN,IQFR + REAL, ALLOCATABLE, DIMENSION(:) :: GAR,WORK,SUNK,FLUX,QFR,OUTG1, + > OUTG2,DIFHOM,DIFF + REAL, ALLOCATABLE, DIMENSION(:,:) :: PHI1,PHI2,ABS1,ABS2,NUF1, + > NUF2,GAMMA,OUTG2R + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: CHI1,CHI2,RHS1,LHS1,RHS2, + > LHS2 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV,RHS,CONST,FF + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: SIGA,SIGF,DFF +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(PHI1(NMIL,NG),PHI2(NMIL,NG),ABS1(NMIL,NG),ABS2(NMIL,NG), + 1 RHS1(NMIL,NG,NG),LHS1(NMIL,NG,NG),RHS2(NMIL,NG,NG), + 2 LHS2(NMIL,NG,NG),CONST(NG),IREL(NG),RHS(NG),GAMMA(NUN,NG), + 3 OUTG1(NG),OUTG2(NG),OUTG2R(NG,2),SIGA(NMIL,NG),SIGF(NMIL,NG)) +*---- +* COMPUTE THE ACTUAL AND REFERENCE REACTION RATE MATRICES +*---- + CALL LCMGET(IPMAC1,'K-EFFECTIVE',ZKEFF1) + CALL LCMGET(IPMAC2,'K-EFFECTIVE',ZKEFF2) + IF(IDF2.EQ.1) THEN + CALL LCMSIX(IPMAC2,'ADF',1) + CALL LCMLEN(IPMAC2,'ALBS00',ILCMLN,ITYLCM) + IF(ILCMLN.NE.2*NG) CALL XABORT('DRENOU: WRONG ALBS00 LENGTH.') + CALL LCMGET(IPMAC2,'ALBS00',OUTG2R) + CALL LCMSIX(IPMAC2,' ',2) + ENDIF + CALL LCMLEN(IPMAC1,'B2 B1HOM',ILCMLN,ITYLCM) + IF(ILCMLN.EQ.1) THEN + CALL LCMGET(IPMAC1,'B2 B1HOM',B21) + ELSE + B21=0.0 + ENDIF + CALL LCMLEN(IPMAC2,'B2 B1HOM',ILCMLN,ITYLCM) + IF(ILCMLN.EQ.1) THEN + CALL LCMGET(IPMAC2,'B2 B1HOM',B22) + ELSE + B22=0.0 + ENDIF + IF((ILEAK1.EQ.1).AND.(IPRINT.GT.0)) THEN + WRITE(6,'(/22H DRENOU: MACRO B2=,1P,E12.4)') B21 + ENDIF + IF((ILEAK2.EQ.1).AND.(IPRINT.GT.0)) THEN + WRITE(6,'(/22H DRENOU: REFERENCE B2=,1P,E12.4)') B22 + ENDIF + RHS1(:NMIL,:NG,:NG)=0.0 + LHS1(:NMIL,:NG,:NG)=0.0 + RHS2(:NMIL,:NG,:NG)=0.0 + LHS2(:NMIL,:NG,:NG)=0.0 + SIGA(:NMIL,:NG)=0.0D0 + SIGF(:NMIL,:NG)=0.0D0 + JPMAC1=LCMGID(IPMAC1,'GROUP') + JPMAC2=LCMGID(IPMAC2,'GROUP') + ALLOCATE(IJJ(NMIL),NJJ(NMIL),IPOS(NMIL),GAR(NMIL),WORK(NMIL*NG), + 1 CHI1(NMIL,NFIS1,NG),NUF1(NMIL,NFIS1),CHI2(NMIL,NFIS2,NG), + 2 NUF2(NMIL,NFIS2),DIFHOM(NG),DIFF(NMIL)) + DO IG=1,NG + KPMAC1=LCMGIL(JPMAC1,IG) + CALL LCMGET(KPMAC1,'CHI',CHI1(1,1,IG)) + KPMAC2=LCMGIL(JPMAC2,IG) + CALL LCMGET(KPMAC2,'CHI',CHI2(1,1,IG)) + CALL LCMLEN(KPMAC1,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.NE.NMIL) CALL XABORT('DRENOU: MISSING ACTUAL FLUX.') + CALL LCMLEN(KPMAC2,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.NE.NMIL) CALL XABORT('DRENOU: MISSING REFERENCE FLUX.') + CALL LCMGET(KPMAC1,'FLUX-INTG',PHI1(1,IG)) + CALL LCMGET(KPMAC2,'FLUX-INTG',PHI2(1,IG)) + ENDDO + DO IG=1,NG + KPMAC1=LCMGIL(JPMAC1,IG) + KPMAC2=LCMGIL(JPMAC2,IG) + IF(ILEAK1.EQ.1) THEN + CALL LCMLEN(KPMAC1,'DIFF',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC1,'DIFF',DIFF) + ELSE + CALL LCMGET(IPMAC1,'DIFHOMB1HOM',DIFHOM) + DO IBM=1,NMIL + DIFF(IBM)=DIFHOM(IG) + ENDDO + ENDIF + ELSE + DIFF(:NMIL)=0.0 + ENDIF + CALL LCMGET(KPMAC1,'NTOT0',GAR) + CALL LCMGET(KPMAC1,'SCAT00',WORK) + CALL LCMGET(KPMAC1,'NJJS00',NJJ) + CALL LCMGET(KPMAC1,'IJJS00',IJJ) + CALL LCMGET(KPMAC1,'IPOS00',IPOS) + DO IBM=1,NMIL + SIGA(IBM,IG)=SIGA(IBM,IG)+GAR(IBM) + IPOSDE=IPOS(IBM) + DO JG=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 +* IG <-- JG + RHS1(IBM,IG,JG)=RHS1(IBM,IG,JG)-WORK(IPOSDE)*PHI1(IBM,JG) + SIGA(IBM,JG)=SIGA(IBM,JG)-WORK(IPOSDE) + IPOSDE=IPOSDE+1 + ENDDO + RHS1(IBM,IG,IG)=RHS1(IBM,IG,IG)+(GAR(IBM)+B21*DIFF(IBM))* + > PHI1(IBM,IG) + ENDDO + CALL LCMGET(KPMAC1,'NUSIGF',NUF1) + DO IBM=1,NMIL + DO IFIS=1,NFIS1 + DO JG=1,NG + LHS1(IBM,JG,IG)=LHS1(IBM,JG,IG)+CHI1(IBM,IFIS,JG)* + > NUF1(IBM,IFIS)*PHI1(IBM,IG) + SIGF(IBM,IG)=SIGF(IBM,IG)+CHI1(IBM,IFIS,JG)*NUF1(IBM,IFIS) + ENDDO + ENDDO + ENDDO +* + IF(ILEAK2.EQ.1) THEN + CALL LCMLEN(KPMAC2,'DIFF',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC2,'DIFF',DIFF) + ELSE + CALL LCMGET(IPMAC2,'DIFHOMB1HOM',DIFHOM) + DO IBM=1,NMIL + DIFF(IBM)=DIFHOM(IG) + ENDDO + ENDIF + ELSE + DIFF(:NMIL)=0.0 + ENDIF + CALL LCMGET(KPMAC2,'NTOT0',GAR) + CALL LCMGET(KPMAC2,'SCAT00',WORK) + CALL LCMGET(KPMAC2,'NJJS00',NJJ) + CALL LCMGET(KPMAC2,'IJJS00',IJJ) + CALL LCMGET(KPMAC2,'IPOS00',IPOS) + DO IBM=1,NMIL + IPOSDE=IPOS(IBM) + DO JG=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 +* IG <-- JG + RHS2(IBM,IG,JG)=RHS2(IBM,IG,JG)-WORK(IPOSDE)*PHI2(IBM,JG) + IPOSDE=IPOSDE+1 + ENDDO + RHS2(IBM,IG,IG)=RHS2(IBM,IG,IG)+(GAR(IBM)+B22*DIFF(IBM))* + > PHI2(IBM,IG) + ENDDO + CALL LCMGET(KPMAC2,'NUSIGF',NUF2) + DO IBM=1,NMIL + DO IFIS=1,NFIS2 + DO JG=1,NG + LHS2(IBM,JG,IG)=LHS2(IBM,JG,IG)+CHI2(IBM,IFIS,JG)* + > NUF2(IBM,IFIS)*PHI2(IBM,IG) + ENDDO + ENDDO + ENDDO + ENDDO + DEALLOCATE(DIFF,DIFHOM,NUF2,CHI2,NUF1,CHI1,WORK,GAR,IPOS,NJJ,IJJ) +*---- +* COMPUTE THE ACTUAL AND REFERENCE ABSORPTION AND FISSION RATES +*---- + AB1TOT=0.0D0 + AB2TOT=0.0D0 + FI1TOT=0.0D0 + FI2TOT=0.0D0 + DO IG=1,NG + OUTG1(IG)=0.0 + OUTG2(IG)=0.0 + DO IBM=1,NMIL + OUTG1(IG)=OUTG1(IG)+SUM(LHS1(IBM,IG,:NG))/ZKEFF1- + 1 SUM(RHS1(IBM,IG,:NG)) + OUTG2(IG)=OUTG2(IG)+SUM(LHS2(IBM,IG,:NG))/ZKEFF2- + 1 SUM(RHS2(IBM,IG,:NG)) + ABS1(IBM,IG)=SUM(RHS1(IBM,:NG,IG)) + ABS2(IBM,IG)=SUM(RHS2(IBM,:NG,IG)) + AB1TOT=AB1TOT+ABS1(IBM,IG) + AB2TOT=AB2TOT+ABS2(IBM,IG) + FI1TOT=FI1TOT+SUM(LHS1(IBM,:NG,IG)) + FI2TOT=FI2TOT+SUM(LHS2(IBM,:NG,IG)) + ENDDO + IF(IDF2.GT.0) OUTG2(IG)=OUTG2R(IG,1)-OUTG2R(IG,2) + IF((NALBP.GT.0).AND.(OUTG2(IG).LT.-1.0E-6)) THEN + WRITE(HSMG,'(44HDRENOU: INCONSISTENT REFERENCE LEAKAGE IN GR, + 1 3HOUP,I4,7H. LEAK=,1P,E13.4)') IG,OUTG2(IG) + CALL XABORT(HSMG) + ENDIF + ENDDO +*---- +* COMPUTE THE ACTUAL LEAKAGE FROM OUT-CURRENTS +*---- + OUT=0.0D0 + GAMMA(:NUN,:NG)=0.0 + IF(NALBP.GT.0) THEN + CALL LCMLEN(IPTRK,'KN',MAXKN,ITYLCM) + CALL LCMLEN(IPTRK,'QFR',MAXQF,ITYLCM) + ALLOCATE(KN(MAXKN),QFR(MAXQF),IQFR(MAXQF),FLUX(NUN)) + CALL LCMGET(IPTRK,'KN',KN) + CALL LCMGET(IPTRK,'QFR',QFR) + CALL LCMGET(IPTRK,'IQFR',IQFR) + JPFLX=LCMGID(IPFLX,'FLUX') + DO IG=1,NG + CALL LCMGDL(JPFLX,IG,FLUX) + CALL DREJ02(ITYPE,IELEM,NREG,NUN,MAXKN,MAXQF,MATCOD,KN,QFR, + 1 IQFR,VOL,FLUX,OUTG1(IG),GAMMA(1,IG)) + OUT=OUT+OUTG1(IG) + IF(IPRINT.GT.0) THEN + WRITE(6,130) IG,OUTG1(IG)/REAL(AB1TOT),OUTG2(IG)/REAL(AB2TOT) + ENDIF + ENDDO + DEALLOCATE(FLUX,IQFR,QFR,KN) + ENDIF +*---- +* COMPUTE MACRO AND REFERENCE K-EFFECTIVE +*---- + DEN1=0.0D0 + DEN2=0.0D0 + DO IG=1,NG + OUTG1(IG)=OUTG1(IG)+SUM(ABS1(:NMIL,IG)) + OUTG2(IG)=OUTG2(IG)+SUM(ABS2(:NMIL,IG)) + DEN1=DEN1+OUTG1(IG) + DEN2=DEN2+OUTG2(IG) + ENDDO + IF(IPRINT.GT.0) THEN + WRITE(6,'(/24H DRENOU: MACRO KEFF=,1P,E12.5)') FI1TOT/DEN1 + WRITE(6,'(/24H DRENOU: REFERENCE KEFF=,1P,E12.5)') FI2TOT/DEN2 + ENDIF +*---- +* GET INFORMATION FROM L_OPTIMIZE OBJECT +*---- + CALL LCMGET(IPGRAD,'DEL-STATE',ISTATE) + IF(ISTATE(4).LE.2) CALL XABORT('DRENOU: NO DIRECT EFFECT WITH ' + > //'THIS TYPE OF PERTURBATION.') + IF(ISTATE(7).NE.1) CALL XABORT('DRENOU: IBM1=1 EXPECTED.') + IF(ISTATE(8).NE.NMIL) CALL XABORT('DRENOU: IBM2=NMIL EXPECTED.') + NGR1=ISTATE(5) + NGR2=ISTATE(6) + NPERT=(NMIL+NALBP)*(NGR2-NGR1+1) + NFUNC=(NMIL+NALBP+1)*(NGR2-NGR1+1) + ALLOCATE(VARV(NPERT)) + ALLOCATE(FF(NFUNC),DFF(NPERT,NFUNC)) + CALL LCMGET(IPGRAD,'VAR-VALUE',VARV) +*---- +* COMPUTE THE RMS FUNCTIONAL AND CONSTRAINTS +*---- + IREL(:NGR2-NGR1+1)=0 + RHS(:NGR2-NGR1+1)=0.0D0 + FF(:NFUNC)=0.0D0 + WEI=REAL(NMIL) + RMSD=0.0D0 + IPERT=0 + IFUNC=0 + DO IG=NGR1,NGR2 + SUM1=0.0D0 + DSUM=0.0D0 + DO IBM=1,NMIL + IPERT=IPERT+1 + IFUNC=IFUNC+1 + ABS2M=MAX(EPS*AB2TOT,DBLE(ABS2(IBM,IG))) + DELTA=ABS1(IBM,IG)*AB2TOT/(ABS2M*AB1TOT)-ABS2(IBM,IG)/ABS2M + FF(IFUNC)=DELTA + RMSD=RMSD+DELTA**2 + SUM1=SUM1+PHI2(IBM,IG)/VARV(IPERT) + DSUM=DSUM+PHI2(IBM,IG) + ENDDO + IF(NALBP.GT.0) THEN + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(IG))) + DELTA=OUTG1(IG)*FI2TOT/(OUT2M*FI1TOT)-OUTG2(IG)/OUT2M + IFUNC=IFUNC+1 + FF(IFUNC)=SQRT(WEI)*DELTA + RMSD=RMSD+WEI*DELTA**2 + ENDIF + DELTA=SUM1/DSUM-1.0D0 + IFUNC=IFUNC+1 + FF(IFUNC)=DELTA + RMSD=RMSD+DELTA**2 + CONST(IG-NGR1+1)=DELTA + IPERT=IPERT+NALBP + ENDDO + IF(IPRINT.GT.0) THEN + WRITE(6,100) RMSD,DOT_PRODUCT(FF,FF) + DO IG=NGR1,NGR2 + WRITE(6,110) IG,CONST(IG-NGR1+1) + ENDDO + ENDIF + IF(IPRINT.GT.2) THEN + DO IG=1,NG + WRITE(6,'(7H GROUP=,I4)') IG + DO IBM=1,NMIL + WRITE(6,120) IBM,ABS1(IBM,IG)/REAL(AB1TOT), + 1 ABS2(IBM,IG)/REAL(AB2TOT) + ENDDO + ENDDO + ENDIF +*---- +* STORE INFORMATION ON L_OPTIMIZE OBJECT +*---- + CALL LCMPUT(IPGRAD,'FOBJ-CST-VAL',NFUNC,4,FF) + IF(LNO) GO TO 10 +*---- +* COMPUTE THE GRADIENT MATRIX OF THE RMS FUNCTIONAL +*---- + ALLOCATE(SUNK(NUN)) + JPGPT=LCMLID(IPGPT,'ASOUR',NFUNC) + IFUNC=0 + DO IG=NGR1,NGR2 + DO IBM=1,NMIL + ABS2M=MAX(EPS*AB2TOT,DBLE(ABS2(IBM,IG))) + SOUTOT=AB2TOT/AB1TOT/ABS2M + SOUT2=ABS1(IBM,IG)/AB1TOT + IFUNC=IFUNC+1 + KPGPT=LCMLIL(JPGPT,IFUNC,NG) + DO JG=1,NG + SUNK(:NUN)=0.0 + DO IR=1,NREG + IUNK=KEYFLX(IR) + IF(IUNK.EQ.0) CYCLE + JBM=MATCOD(IR) + IF(JBM.EQ.0) CYCLE + SA=SIGA(JBM,JG) + SOUT1=0.0D0 + IF((IG.EQ.JG).AND.(IBM.EQ.JBM)) SOUT1=1.0D0 + SUNK(IUNK)=REAL(SOUTOT*VOL(IR)*SA*(SOUT1-SOUT2)) + ENDDO + CALL LCMPDL(KPGPT,JG,NUN,2,SUNK) + ENDDO + ENDDO + IF(NALBP.GT.0) THEN + IFUNC=IFUNC+1 + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(IG))) + SOUTOT=SQRT(WEI)*FI2TOT/FI1TOT/OUT2M + SOUT2=OUTG1(IG)/FI1TOT + KPGPT=LCMLIL(JPGPT,IFUNC,NG) + DO JG=1,NG + SUNK(:NUN)=0.0 + DO IR=1,NREG + IUNK=KEYFLX(IR) + IF(IUNK.EQ.0) CYCLE + JBM=MATCOD(IR) + IF(JBM.EQ.0) CYCLE + SA=SIGA(JBM,JG) + SF=SIGF(JBM,JG) + SOUT1=0.0D0 + IF(IG.EQ.JG) SOUT1=1.0D0 + SUNK(IUNK)=REAL(SOUTOT*VOL(IR)*(SA*SOUT1-SF*SOUT2)) + ENDDO + IF(IG.EQ.JG) THEN + DO IUNK=1,NUN + SOUT1=GAMMA(IUNK,IG) + SUNK(IUNK)=SUNK(IUNK)+REAL(SOUTOT*SOUT1) + ENDDO + ENDIF + CALL LCMPDL(KPGPT,JG,NUN,2,SUNK) + ENDDO + ENDIF + IFUNC=IFUNC+1 + KPGPT=LCMLIL(JPGPT,IFUNC,NG) + SUNK(:NUN)=0.0 + DO JG=1,NG + CALL LCMPDL(KPGPT,JG,NUN,2,SUNK) + ENDDO + ENDDO +*---- +* CHECK SOURCE ORTHOGONALITY +*---- + ALLOCATE(FLUX(NUN)) + JPFLX=LCMGID(IPFLX,'FLUX') + DO IFUNC=1,NFUNC + KPGPT=LCMGIL(JPGPT,IFUNC) + AIL=0.0D0 + BIL=0.0D0 + DO IG=1,NG + CALL LCMGDL(KPGPT,IG,SUNK) + CALL LCMGDL(JPFLX,IG,FLUX) + DO IUNK=1,NUN + GAZ=FLUX(IUNK)*SUNK(IUNK) + DAZ=FLUX(IUNK)**2 + AIL=AIL+GAZ + BIL=BIL+DAZ + ENDDO + ENDDO + DSUM=ABS(AIL)/ABS(BIL)/REAL(NUN) + IF(IPRINT.GT.3) THEN + WRITE(6,'(/21H DRENOU: DOT PRODUCT=,1P,E11.4,11H COMPONENT=, + 1 I5)') DSUM,IFUNC + ENDIF + IF(ABS(DSUM).GT.1.0E-4) THEN + WRITE(HSMG,'(36HDRENOU: NON ORTHOGONAL SOURCE (DSUM=,1P,E11.3, + 1 26H) FOR INDIVIDUAL COMPONENT,I5,1H.)') DSUM,IFUNC + CALL XABORT(HSMG) + ENDIF + ENDDO + DEALLOCATE(FLUX,SUNK) +*---- +* COMPUTE THE DIRECT GRADIENT MATRIX +*---- + IFUNC=0 + DFF(:NPERT,:NFUNC)=0.0D0 + DO IG=NGR1,NGR2 + DSUM=0.0D0 + DO IBM=1,NMIL + DSUM=DSUM+PHI2(IBM,IG) + ENDDO + DO IBM=1,NMIL + ABS2M=MAX(EPS*AB2TOT,DBLE(ABS2(IBM,IG))) + SOUTOT=ABS1(IBM,IG)*AB2TOT/AB1TOT/ABS2M + IFUNC=IFUNC+1 + IPERT=0 + DO JG=NGR1,NGR2 + DO JBM=1,NMIL + IPERT=IPERT+1 + IF((IG.EQ.JG).AND.(IBM.EQ.JBM)) THEN + DFF(IPERT,IFUNC)=DFF(IPERT,IFUNC)+SOUTOT/VARV(IPERT) + ENDIF + DFF(IPERT,IFUNC)=DFF(IPERT,IFUNC)-SOUTOT*ABS1(JBM,JG)/ + > AB1TOT/VARV(IPERT) + ENDDO + IF(NALBP.GT.0) IPERT=IPERT+1 + ENDDO + ENDDO + IF(NALBP.GT.0) THEN + IFUNC=IFUNC+1 + IPERT=0 + OUT2M=MAX(EPSL*FI2TOT,DBLE(OUTG2(IG))) + SOUTOT=SQRT(WEI)*FI2TOT/FI1TOT/OUT2M + DO JG=NGR1,NGR2 + DO JBM=1,NMIL + IPERT=IPERT+1 + IF(IG.EQ.JG) THEN + DFF(IPERT,IFUNC)=DFF(IPERT,IFUNC)+SOUTOT*ABS1(JBM,JG)/ + > VARV(IPERT) + ENDIF + DFF(IPERT,IFUNC)=DFF(IPERT,IFUNC)-SOUTOT*OUTG1(IG)* + > SUM(LHS1(JBM,:NG,JG))/FI1TOT/VARV(IPERT) + ENDDO + IPERT=IPERT+1 + ENDDO + ENDIF + IFUNC=IFUNC+1 + IPERT=0 + DO JG=NGR1,NGR2 + DO JBM=1,NMIL + IPERT=IPERT+1 + IF(IG.EQ.JG) THEN + DFF(IPERT,IFUNC)=DFF(IPERT,IFUNC)-PHI2(JBM,IG)/(DSUM* + > VARV(IPERT)**2) + ENDIF + ENDDO + IF(NALBP.GT.0) IPERT=IPERT+1 + ENDDO + ENDDO + CALL LCMPUT(IPGRAD,'GRADIENT-DIR',NPERT*NFUNC,4,DFF) +*---- +* MODIFY STATE VECTOR OF OPTIMIZE OBJECT +*---- + 10 CALL LCMGET(IPGRAD,'STATE-VECTOR',ISTATE) + ISTATE(2)=NFUNC-1 + ISTATE(8)=4 + CALL LCMPUT(IPGRAD,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DFF,FF) + DEALLOCATE(VARV,SIGF,SIGA,OUTG2R,OUTG2,OUTG1,GAMMA,RHS,IREL,CONST, + 1 LHS2,RHS2,LHS1,RHS1,ABS2,ABS1,PHI2,PHI1) + RETURN +* + 100 FORMAT(/40H DRENOU: RMS ERROR ON RATE DISTRIBUTION=,1P,2E11.4) + 110 FORMAT(23H DRENOU: CONSTRAINT(,I4,2H)=,1P,E11.4) + 120 FORMAT(5X,16HABSORPTION RATE(,I4,2H)=,1P,2E12.4) + 130 FORMAT(5X,6HGROUP=,I4,9H LEAKAGE=,1P,2E12.4) + END diff --git a/Donjon/src/DRESOU.f b/Donjon/src/DRESOU.f new file mode 100644 index 0000000..e82d4e3 --- /dev/null +++ b/Donjon/src/DRESOU.f @@ -0,0 +1,167 @@ +*DECK DRESOU + SUBROUTINE DRESOU(IPRINT,IPGPT,IPMAC1,IPMAC2,IPFLX,IPGRAD,NG,NREG, + 1 NMIL,NUN,MATCOD,KEYFLX,VOL,LNO,RMSD) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the GPT sources corresponding to the gradient of the RMS power +* distribution. Case with no direct effect. +* +*Copyright: +* Copyright (C) 2012 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 +* IPRINT print parameter +* IPGPT pointer to the L_GPT data structure. +* IPMAC1 pointer to the actual macrolib structure. +* IPMAC2 pointer to the reference macrolib structure. +* IPFLX pointer to the multigroup flux. +* IPGRAD pointer to the L_OPTIMIZE object. +* NG number of energy groups. +* NREG number of regions. +* NMIL number of material mixtures. +* NUN number of unknowns per energy group. +* MATCOD material mixture indices per region. +* KEYFLX position of averaged fluxes in unknown vector. +* VOL volumes. +* LNO flag set to .true. to exit after calculation of RMS. +* +*Parameters: output +* RMSD RMS error on power distribution. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPGPT,IPMAC1,IPMAC2,IPFLX,IPGRAD + INTEGER IPRINT,NG,NREG,NMIL,NUN,MATCOD(NREG),KEYFLX(NREG) + REAL VOL(NREG) + DOUBLE PRECISION RMSD + LOGICAL LNO +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMAC1,JPMAC2,KPMAC1,KPMAC2,JPFLX,JPGPT,KPGPT + DOUBLE PRECISION SOUT2,SOUTOT,PW1TOT,PW2TOT,DSUM,AIL,BIL + REAL, ALLOCATABLE, DIMENSION(:) :: POW1,H1,F1,POW2,H2,F2,SUNK, + 1 FLUX + CHARACTER HSMG*131 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(POW1(NMIL),H1(NMIL),F1(NMIL),POW2(NMIL),H2(NMIL), + 1 F2(NMIL)) +*---- +* COMPUTE THE ACTUAL AND REFERENCE POWER DISTRIBUTION +*---- + POW1(:NMIL)=0.0 + POW2(:NMIL)=0.0 + JPMAC1=LCMGID(IPMAC1,'GROUP') + JPMAC2=LCMGID(IPMAC2,'GROUP') + DO IG=1,NG + KPMAC1=LCMGIL(JPMAC1,IG) + KPMAC2=LCMGIL(JPMAC2,IG) + CALL LCMLEN(KPMAC1,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.EQ.0) CALL XABORT('DRESOU: MISSING ACTUAL FLUX.') + CALL LCMLEN(KPMAC2,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.EQ.0) CALL XABORT('DRESOU: MISSING REFERENCE FLUX.') + CALL LCMLEN(KPMAC1,'H-FACTOR',ILG,ITYLCM) + IF(ILG.EQ.0) CALL XABORT('DRESOU: MISSING ACTUAL H-FACTOR.') + CALL LCMLEN(KPMAC2,'H-FACTOR',ILG,ITYLCM) + IF(ILG.EQ.0) CALL XABORT('DRESOU: MISSING REFERENCE H-FACTOR.') + CALL LCMGET(KPMAC1,'FLUX-INTG',F1) + CALL LCMGET(KPMAC2,'FLUX-INTG',F2) + CALL LCMGET(KPMAC1,'H-FACTOR',H1) + CALL LCMGET(KPMAC2,'H-FACTOR',H2) + DO IBM=1,NMIL + POW1(IBM)=POW1(IBM)+F1(IBM)*H1(IBM) + POW2(IBM)=POW2(IBM)+F2(IBM)*H2(IBM) + ENDDO + ENDDO +*---- +* COMPUTE THE RMS FUNCTIONAL +*---- + PW1TOT=0.0D0 + PW2TOT=0.0D0 + DO IBM=1,NMIL + PW1TOT=PW1TOT+POW1(IBM) + PW2TOT=PW2TOT+POW2(IBM) + ENDDO + RMSD=0.0D0 + DO IBM=1,NMIL + RMSD=RMSD+(POW1(IBM)/PW1TOT-POW2(IBM)/PW2TOT)**2 + ENDDO + CALL LCMPUT(IPGRAD,'FOBJ-CST-VAL',1,4,RMSD) + IF(IPRINT.GT.0) WRITE(6,100) RMS + IF(LNO) GO TO 10 +*---- +* COMPUTE THE GRADIENT OF THE RMS FUNCTIONAL +*---- + ALLOCATE(SUNK(NUN)) + JPFLX=LCMGID(IPFLX,'FLUX') + JPGPT=LCMLID(IPGPT,'ASOUR',1) + KPGPT=LCMLIL(JPGPT,1,NG) + DO IG=1,NG + SUNK(:NUN)=0.0 + KPMAC1=LCMGIL(JPMAC1,IG) + CALL LCMGET(KPMAC1,'H-FACTOR',H1) + DO IR=1,NREG + IUNK=KEYFLX(IR) + IF(IUNK.EQ.0) CYCLE + IBM=MATCOD(IR) + IF(IBM.EQ.0) CYCLE + SOUT2=0.0D0 + DO JBM=1,NMIL + SOUTOT=0.0D0 + IF(IBM.EQ.JBM) SOUTOT=1.0D0 + SOUTOT=SOUTOT-POW1(JBM)/PW1TOT + SOUT2=SOUT2+SOUTOT*(POW1(JBM)/PW1TOT-POW2(JBM)/PW2TOT) + ENDDO + SUNK(IUNK)=2.0*VOL(IR)*H1(IBM)*REAL(SOUT2/PW1TOT) + ENDDO + CALL LCMPDL(KPGPT,IG,NUN,2,SUNK) + ENDDO +*---- +* CHECK SOURCE ORTHOGONALITY +*---- + ALLOCATE(FLUX(NUN)) + AIL=0.0D0 + BIL=0.0D0 + DO IG=1,NG + CALL LCMGDL(KPGPT,IG,SUNK) + CALL LCMGDL(JPFLX,IG,FLUX) + DO IUNK=1,NUN + GAZ=FLUX(IUNK)*SUNK(IUNK) + DAZ=FLUX(IUNK)**2 + AIL=AIL+GAZ + BIL=BIL+DAZ + ENDDO + ENDDO + DSUM=ABS(AIL)/ABS(BIL)/REAL(NUN) + IF(IPRINT.GT.0) THEN + WRITE(6,'(/21H DRESOU: DOT PRODUCT=,1P,E11.4)') DSUM + ENDIF + IF(ABS(DSUM).GT.1.0E-5) THEN + WRITE(HSMG,'(36HDRESOU: NON ORTHOGONAL SOURCE (DSUM=,1P,E11.3, + 1 2H).)') DSUM + CALL XABORT(HSMG) + ENDIF + DEALLOCATE(FLUX,SUNK) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 10 DEALLOCATE(F2,H2,POW2,F1,H1,POW1) + RETURN +* + 100 FORMAT(/41H DRESOU: RMS ERROR ON POWER DISTRIBUTION=,1P,E11.4) + END diff --git a/Donjon/src/DSET.f b/Donjon/src/DSET.f new file mode 100644 index 0000000..7c30e46 --- /dev/null +++ b/Donjon/src/DSET.f @@ -0,0 +1,165 @@ +*DECK DSET + SUBROUTINE DSET(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Set new parameters for the user-selected devices and/or for the +* groups of devices. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + INTEGER ISTATE(NSTATE),RGRP + DOUBLE PRECISION DFLOT + CHARACTER TEXT*12,HSIGN*12 + LOGICAL LROD + TYPE(C_PTR) IPDEV +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.GT.1) CALL XABORT('@DSET: ONE PARAMETER ALLOWED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('@DSET:' + 1 //' LCM OBJECT EXPECTED AT LHS.') + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_DEVICE') THEN + TEXT=HENTRY(1) + CALL XABORT('@DSET: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_DEVICE EXPECTED.') + ENDIF + IF(JENTRY(1).NE.1) CALL XABORT('@DSET: MODIFICATION MODE EX' + 1 //'PECTED FOR L_DEVICE.') + IPDEV=KENTRY(1) +*---- +* RECOVER INFORMATION +*---- + CALL LCMGET(IPDEV,'STATE-VECTOR',ISTATE) + IGEO=ISTATE(1) + IF(IGEO.NE.7) CALL XABORT('@DSET: ONLY 3D-CARTESIAN GEOMETRY ALL' + 1 //'OWED.') + NROD=ISTATE(2) + RGRP=ISTATE(3) + NLZC=ISTATE(4) + LGRP=ISTATE(5) + IMODE=ISTATE(6) + IF((IMODE.EQ.0).AND.(NROD.GT.0)) CALL XABORT('@DSET: IMODE NOT S' + 1 //'ET.') +* READ PRINTING INDEX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@DSET: CHARACTER DATA EXPECTED.') + IF(TEXT.NE.'EDIT') CALL XABORT('@DSET: KEYWORD EDIT EXPECTED.') + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@DSET: INTEGER FOR EDIT EXPECTED.') + NDEV=0 + NGRP=0 + 10 NDEV=NDEV+1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) +*---- +* ROD OPTION +*---- + IF(TEXT.EQ.'ROD') THEN + CALL REDGET(ITYP,ID,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@DSET: INTEGER ROD-ID NUMB' + 1 //'ER EXPECTED.') + IF((ID.GT.NROD).OR.(ID.EQ.0)) THEN + WRITE(IOUT,*)'@DSET: READ CURRENT ROD-ID #',ID + CALL XABORT('@DSET: WRONG ROD-ID NUMBER.') + ENDIF + IF(IMPX.GT.0) WRITE(IOUT,1000)ID + LROD=.TRUE. + CALL DSET1D(IPDEV,IMODE,ID,LROD,IMPX) +*---- +* LZC OPTION +*---- + ELSEIF(TEXT.EQ.'LZC') THEN + CALL REDGET(ITYP,ID,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DSET: INTEGER LZC-ID NUMB' + 1 //'ER EXPECTED.') + IF((ID.GT.NLZC).OR.(ID.EQ.0)) THEN + WRITE(IOUT,*)'@DSET: READ CURRENT LZC-ID #',ID + CALL XABORT('@DSET: WRONG LZC-ID NUMBER.') + ENDIF + IF(IMPX.GT.0) WRITE(IOUT,1001)ID + LROD=.FALSE. + CALL DSET1D(IPDEV,IMODE,ID,LROD,IMPX) +*---- +* ROD-GROUP OPTION +*---- + ELSEIF(TEXT.EQ.'ROD-GROUP') THEN + CALL REDGET(ITYP,IGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DSET: INTEGER GROUP-ID NUM' + 1 //'BER EXPECTED.') + IF((IGRP.GT.RGRP).OR.(IGRP.LE.0)) THEN + WRITE(IOUT,*)'@DSET: READ CURRENT GROUP-ID #',IGRP + CALL XABORT('@DSET: WRONG ROD GROUP-ID NUMBER.') + ENDIF + IF(IMPX.GT.0) WRITE(IOUT,1002)IGRP + LROD=.TRUE. + CALL DSETGR(IPDEV,IMODE,IGRP,NDGR,LROD,IMPX) + NDEV=NDEV+NDGR-1 + NGRP=NGRP+1 +*---- +* LZC-GROUP OPTION +*---- + ELSEIF(TEXT.EQ.'LZC-GROUP') THEN + CALL REDGET(ITYP,IGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@DSET: INTEGER GROUP-ID NUM' + 1 //'BER EXPECTED.') + IF((IGRP.GT.LGRP).OR.(IGRP.LE.0)) THEN + WRITE(IOUT,*)'@DSET: READ CURRENT GROUP-ID #',IGRP + CALL XABORT('@DSET: WRONG LZC GROUP-ID NUMBER.') + ENDIF + IF(IMPX.GT.0) WRITE(IOUT,1003)IGRP + LROD=.FALSE. + CALL DSETGR(IPDEV,IMODE,IGRP,NDGR,LROD,IMPX) + NDEV=NDEV+NDGR-1 + NGRP=NGRP+1 +* + ELSEIF(TEXT.EQ.';') THEN + GOTO 20 + ELSE + CALL XABORT('@DSET: WRONG KEYWORD '//TEXT) + ENDIF + GOTO 10 + 20 IF(IMPX.GT.0) WRITE(IOUT,1004)NGRP,NDEV-1 + IF(IMPX.GT.4) CALL LCMLIB(IPDEV) + RETURN +* + 1000 FORMAT(/5X,'DSET: ** SETING PARAMETERS FOR ROD #',I3.3) + 1001 FORMAT(/5X,'DSET: ** SETING PARAMETERS FOR LZC #',I2.2) + 1002 FORMAT(/5X,'DSET: ** SETING PARAMETERS FOR ROD-GROUP #',I2.2) + 1003 FORMAT(/5X,'DSET: ** SETING PARAMETERS FOR LZC-GROUP #',I2.2) + 1004 FORMAT(/5X,'--------------------------------------'/ + 1 5X,'TOTAL NUMBER OF UPDATED GROUPS :',I4/ + 2 5X,'TOTAL NUMBER OF UPDATED DEVICES :',I4/) + END diff --git a/Donjon/src/DSET1D.f b/Donjon/src/DSET1D.f new file mode 100644 index 0000000..80e5727 --- /dev/null +++ b/Donjon/src/DSET1D.f @@ -0,0 +1,245 @@ +*DECK DSET1D + SUBROUTINE DSET1D(IPDEV,IMODE,ID,LROD,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modify some parameters for a specified device. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPDEV pointer to device information. +* IMODE type of displacement: =1 for FADE; =2 for MOVE (DONJON3-type +* movement). +* ID identification number of a specified device. +* LROD flag for the device type: +* =.true. if rod-type device; =.false. if lzc-type device. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDEV + INTEGER IMODE,ID,IMPX + LOGICAL LROD +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6,MAXPRT=10) + REAL RODPOS(6,MAXPRT),MAXPOS(6,MAXPRT),EMTPOS(6),FULPOS(6), + 1 LENG(2),LVOLD,LVNEW,LIMIT(6) + DOUBLE PRECISION DFLOT + CHARACTER TEXT*12,NXSEQ*12 + TYPE(C_PTR) JPDEV,KPDEV +*---- +* READ OPTION +*---- + ILEVEL=0 + ISPEED=0 + ISTIME=0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DSET1D: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'LEVEL')THEN + IF(ILEVEL.EQ.1)CALL XABORT('@DSET1D: LEVEL ALREADY DEFINED.') + CALL REDGET(ITYP,NITMA,LVNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@DSET1D: REAL FOR LEVEL EXPECTED.') + IF(LVNEW.GT.1.)CALL XABORT('@DSET1D: WRONG LEVEL VALUE > 1.') + IF(LVNEW.LT.0.)CALL XABORT('@DSET1D: WRONG LEVEL VALUE < 0.') + ILEVEL=1 + ELSEIF(TEXT.EQ.'SPEED')THEN + IF(ISPEED.EQ.1)CALL XABORT('@DSET1D: SPEED ALREADY DEFINED.') + CALL REDGET(ITYP,NITMA,SPNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@DSET1D: REAL FOR SPEED EXPECTED.') + IF(SPNEW.LT.0.)CALL XABORT('@DSET1D: WRONG SPEED VALUE < 0.') + ISPEED=1 + ELSEIF(TEXT.EQ.'TIME')THEN + IF(ISTIME.EQ.1)CALL XABORT('@DSET1D: TIME ALREADY DEFINED.') + CALL REDGET(ITYP,NITMA,TMNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@DSET1D: REAL FOR TIME EXPECTED.') + IF(TMNEW.LT.0.)CALL XABORT('@DSET1D: WRONG TIME VALUE < 0.') + ISTIME=1 + ELSEIF(TEXT.EQ.'END')THEN + GOTO 20 + ELSE + WRITE(IOUT,*)'@DSET1D: INVALID KEYWORD ',TEXT + CALL XABORT('@DSET1D: OPTION OR END EXPECTED.') + ENDIF + GOTO 10 +*---- +* RECOVER DEVICE +*---- + 20 IF(LROD)THEN + CALL LCMGET(IPDEV,'CORE-LIMITS',LIMIT) + JPDEV=LCMGID(IPDEV,'DEV_ROD') + KPDEV=LCMGIL(JPDEV,ID) + CALL LCMGTC(KPDEV,'ROD-NAME',12,TEXT) + IF(IMPX.GT.0) WRITE(IOUT,1011) ID,TEXT + ELSE + JPDEV=LCMGID(IPDEV,'DEV_LZC') + KPDEV=LCMGIL(JPDEV,ID) + IF(IMPX.GT.0) WRITE(IOUT,1012) ID + ENDIF + IF((ILEVEL.NE.0).AND.LROD) THEN +*---- +* UPDATE ROD POSITION +*---- +* RECOVER OLD ROD PARAMETERS + CALL LCMGET(KPDEV,'ROD-PARTS',NPART) + CALL LCMGET(KPDEV,'LENGTH',LENG) + CALL LCMGET(KPDEV,'AXIS',IAXIS) + CALL LCMGET(KPDEV,'FROM',ITOP) + CALL LCMLEN(KPDEV,'LEVEL',ILONG,ITYLCM) + CALL LCMGTC(KPDEV,'ROD-NAME',12,NXSEQ) + IF((ILONG.GT.0).AND.(IMPX.GT.2)) THEN + CALL LCMGET(KPDEV,'ROD-POS',RODPOS) + CALL LCMGET(KPDEV,'LEVEL',LVOLD) + WRITE(IOUT,1000) LVOLD + DO 30 IPART=1,NPART + WRITE(IOUT,1001) IPART,RODPOS(1,IPART),RODPOS(3,IPART), + 1 RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART), + 2 RODPOS(6,IPART) + 30 CONTINUE + ENDIF +* MODIFY ROD POSITION + IF(IMPX.GT.1) WRITE(IOUT,1002) LVNEW + IF(IMODE.EQ.1) THEN +* FADING ROD + DELH=LVNEW*(LENG(2)-LENG(1)) + ELSE IF(IMODE.EQ.2) THEN +* MOVING ROD + IF(ITOP.EQ.-1) THEN + DELH=LVNEW*(LENG(2)-LIMIT(1))+LIMIT(1) + ELSE IF(ITOP.EQ.1) THEN + DELH=LIMIT(2)-LVNEW*(LIMIT(2)-LENG(1)) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + IF(IMPX.GT.3) THEN + WRITE(IOUT,*) ' ADJ ',NXSEQ,' LEVEL ',LVNEW*100., + 1 '% OF INSERTION' + WRITE(IOUT,*) ' NEW POSITION (L_sup)= ',DELH + ENDIF + ENDIF + CALL LCMGET(KPDEV,'MAX-POS',RODPOS) + CALL MOVCHK(IMPX,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS) +* STORE NEW PARAMETERS + CALL LCMPUT(KPDEV,'ROD-POS',6*NPART,2,RODPOS) + CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW) +*---- +* UPDATE LZC POSITION +*---- + ELSE IF(ILEVEL.NE.0) THEN +* RECOVER OLD LZC PARAMETERS + CALL LCMGET(KPDEV,'MAX-POS',MAXPOS) + CALL LCMGET(KPDEV,'EMPTY-POS',EMTPOS) + CALL LCMGET(KPDEV,'FULL-POS',FULPOS) + CALL LCMGET(KPDEV,'HEIGHT',HEIGHT) + CALL LCMGET(KPDEV,'LEVEL',LVOLD) + CALL LCMGET(KPDEV,'AXIS',IAXIS) + IF(IMPX.GT.1) WRITE(IOUT,1005) LVOLD,EMTPOS(1),EMTPOS(3), + 1 EMTPOS(5),EMTPOS(2),EMTPOS(4),EMTPOS(6),FULPOS(1), + 2 FULPOS(3),FULPOS(5),FULPOS(2),FULPOS(4),FULPOS(6) +* MODIFY LZC POSITION + DELH=LVNEW*HEIGHT + IF(IAXIS.EQ.1) THEN + FULPOS(1)=MAXPOS(2,1)-DELH + EMTPOS(2)=FULPOS(1) + ELSEIF(IAXIS.EQ.2) THEN + FULPOS(3)=MAXPOS(4,1)-DELH + EMTPOS(4)=FULPOS(3) + ELSEIF(IAXIS.EQ.3) THEN + FULPOS(5)=MAXPOS(6,1)-DELH + EMTPOS(6)=FULPOS(5) + ENDIF +* STORE NEW PARAMETERS + CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW) + CALL LCMPUT(KPDEV,'EMPTY-POS',6,2,EMTPOS) + CALL LCMPUT(KPDEV,'FULL-POS',6,2,FULPOS) + IF(IMPX.GT.1) WRITE(IOUT,1006) LVNEW,EMTPOS(1),EMTPOS(3), + 1 EMTPOS(5),EMTPOS(2),EMTPOS(4),EMTPOS(6),FULPOS(1), + 2 FULPOS(3),FULPOS(5),FULPOS(2),FULPOS(4),FULPOS(6) + ENDIF +*---- +* UPDATE SPEED +*---- + IF((ISPEED.NE.0).AND.LROD) THEN + CALL LCMLEN(KPDEV,'SPEED',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPDEV,'SPEED',SPOLD) + IF(IMPX.GE.2) WRITE(IOUT,1007) SPOLD,SPNEW + ELSE + IF(IMPX.GE.2) WRITE(IOUT,1008) SPNEW + ENDIF + CALL LCMPUT(KPDEV,'SPEED',1,2,SPNEW) + ELSE IF(ISPEED.NE.0) THEN + CALL LCMLEN(KPDEV,'RATE',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPDEV,'RATE',SPOLD) + IF(IMPX.GE.2) WRITE(IOUT,1007) SPOLD,SPNEW + ELSE + IF(IMPX.GE.2) WRITE(IOUT,1008) SPNEW + ENDIF + CALL LCMPUT(KPDEV,'RATE',1,2,SPNEW) + ENDIF +*---- +* UPDATE TIME +*---- + IF(ISTIME.NE.0) THEN + CALL LCMLEN(KPDEV,'TIME',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPDEV,'TIME',TMOLD) + IF(IMPX.GE.2) WRITE(IOUT,1009) TMOLD,TMNEW + ELSE + IF(IMPX.GE.2) WRITE(IOUT,1010) TMNEW + ENDIF + CALL LCMPUT(KPDEV,'TIME',1,2,TMNEW) + ENDIF + RETURN +* + 1000 FORMAT( + 1 /5X,'DSET1D: PREVIOUS INSERTION LEVEL =',F8.4) + 1001 FORMAT( + 1 /5X,'DSET1D: PART =',I5/ + 2 5X,'PREVIOUS ROD POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1002 FORMAT( + 1 /5X,'DSET1D: NEW INSERTION LEVEL =',F8.4) + 1005 FORMAT( + 1 /5X,'PREVIOUS LZC LEVEL =',F8.4/ + 2 5X,'PREVIOUS EMPTY-PART POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/ + 5 5X,'PREVIOUS FULL-PART POSITION :'/ + 6 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 7 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/) + 1006 FORMAT( + 1 /5X,'NEW LZC LEVEL =',F8.4/ + 2 5X,'NEW EMPTY-PART POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/ + 5 5X,'NEW FULL-PART POSITION :'/ + 6 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 7 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/) + 1007 FORMAT(/5X,'** SETING DEVICE SPEED **', + 1 /5X,'PREVIOUS SPEED:',F10.4 + 2 /5X,'NEW SPEED:',F10.4/) + 1008 FORMAT(/5X,'** SETING DEVICE SPEED **', + 1 /5X,'PREVIOUS SPEED: (UNDEFINED)' + 2 /5X,'NEW SPEED:',F10.4/) + 1009 FORMAT(/5X,'** SETING DEVICE TIME **', + 1 /5X,'PREVIOUS TIME:',F10.4 + 2 /5X,'NEW TIME:',F10.4/) + 1010 FORMAT(/5X,'** SETING DEVICE TIME **', + 1 /5X,'PREVIOUS TIME: (UNDEFINED)' + 2 /5X,'NEW TIME:',F10.4/) + 1011 FORMAT(/5X,' => ROD #',I3.3,4X,'ROD-NAME:',1X,A) + 1012 FORMAT(/5X,' => LZC #',I2.2) + END diff --git a/Donjon/src/DSETGR.f b/Donjon/src/DSETGR.f new file mode 100644 index 0000000..e7aeb9a --- /dev/null +++ b/Donjon/src/DSETGR.f @@ -0,0 +1,273 @@ +*DECK DSETGR + SUBROUTINE DSETGR(IPDEV,IMODE,IGRP,NDGR,LROD,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modify some parameters for a specified group of devices. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPDEV pointer to device information. +* IMODE type of displacement: =1 for FADE; =2 for MOVE (DONJON3-type +* movement). +* IGRP current group identification number. +* LROD flag for the device type: +* =.true. if rod-type devices; =.false. if lzc-type devices. +* IMPX printing index (=0 for no print). +* +*Parameters: output +* NDGR number of devices in the group. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDEV + INTEGER IMODE,IGRP,NDGR,IMPX + LOGICAL LROD +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6,MAXPRT=10) + REAL RODPOS(6,MAXPRT),MAXPOS(6,MAXPRT),EMTPOS(6),FULPOS(6), + 1 LENG(2),LVOLD,LVNEW,LIMIT(6) + DOUBLE PRECISION DFLOT + CHARACTER TEXT*12,NXSEQ*12 + TYPE(C_PTR) JPDEV,KPDEV + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDEV +*---- +* READ OPTION +*---- + ILEVEL=0 + ISPEED=0 + ISTIME=0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@DSETGR: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'LEVEL')THEN + IF(ILEVEL.EQ.1)CALL XABORT('@DSETGR: LEVEL ALREADY DEFINED.') + CALL REDGET(ITYP,NITMA,LVNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@DSETGR: REAL FOR LEVEL EXPECTED.') + IF(LVNEW.GT.1.)CALL XABORT('@DSETGR: WRONG LEVEL VALUE > 1.') + IF(LVNEW.LT.0.)CALL XABORT('@DSETGR: WRONG LEVEL VALUE < 0.') + ILEVEL=1 + ELSEIF(TEXT.EQ.'SPEED')THEN + IF(ISPEED.EQ.1)CALL XABORT('@DSETGR: SPEED ALREADY DEFINED.') + CALL REDGET(ITYP,NITMA,SPNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@DSETGR: REAL FOR SPEED EXPECTED.') + IF(SPNEW.LT.0.)CALL XABORT('@DSETGR: WRONG SPEED VALUE < 0.') + ISPEED=1 + ELSEIF(TEXT.EQ.'TIME')THEN + IF(ISTIME.EQ.1)CALL XABORT('@DSETGR: TIME ALREADY DEFINED.') + CALL REDGET(ITYP,NITMA,TMNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@DSETGR: REAL FOR TIME EXPECTED.') + IF(TMNEW.LT.0.)CALL XABORT('@DSETGR: WRONG TIME VALUE < 0.') + ISTIME=1 + ELSEIF(TEXT.EQ.'END')THEN + GOTO 20 + ELSE + WRITE(IOUT,*)'@DSETGR: INVALID KEYWORD ',TEXT + CALL XABORT('@DSETGR: OPTION OR END EXPECTED.') + ENDIF + GOTO 10 +*---- +* RECOVER GROUP INFORMATION +*---- + 20 CALL LCMGET(IPDEV,'CORE-LIMITS',LIMIT) + IF(LROD)THEN + JPDEV=LCMGID(IPDEV,'ROD_GROUP') + KPDEV=LCMGIL(JPDEV,IGRP) + CALL LCMGET(KPDEV,'NUM-ROD',NDGR) + ALLOCATE(IDEV(NDGR)) + IDEV(:NDGR)=0 + CALL LCMGET(KPDEV,'ROD-ID',IDEV) + ELSE + JPDEV=LCMGID(IPDEV,'LZC_GROUP') + KPDEV=LCMGIL(JPDEV,IGRP) + CALL LCMGET(KPDEV,'NUM-LZC',NDGR) + ALLOCATE(IDEV(NDGR)) + IDEV(:NDGR)=0 + CALL LCMGET(KPDEV,'LZC-ID',IDEV) + ENDIF +*---- +* UPDATE DEVICES +*---- + DO 60 I=1,NDGR + ID=IDEV(I) +* RECOVER ROD + IF(LROD)THEN + JPDEV=LCMGID(IPDEV,'DEV_ROD') + KPDEV=LCMGIL(JPDEV,ID) + CALL LCMGTC(KPDEV,'ROD-NAME',12,TEXT) + IF(IMPX.GT.0) WRITE(IOUT,1011) ID,TEXT + ELSE + JPDEV=LCMGID(IPDEV,'DEV_LZC') + KPDEV=LCMGIL(JPDEV,ID) + IF(IMPX.GT.0) WRITE(IOUT,1012) ID + ENDIF +*---- +* UPDATE ROD POSITION +*---- + IF((ILEVEL.NE.0).AND.LROD) THEN +* RECOVER OLD ROD PARAMETERS + CALL LCMGET(KPDEV,'ROD-PARTS',NPART) + CALL LCMGET(KPDEV,'LENGTH',LENG) + CALL LCMGET(KPDEV,'AXIS',IAXIS) + CALL LCMGET(KPDEV,'FROM',ITOP) + CALL LCMLEN(KPDEV,'LEVEL',ILONG,ITYLCM) + CALL LCMGTC(KPDEV,'ROD-NAME',12,NXSEQ) + IF((ILONG.GT.0).AND.(IMPX.GT.2)) THEN + CALL LCMGET(KPDEV,'ROD-POS',RODPOS) + CALL LCMGET(KPDEV,'LEVEL',LVOLD) + WRITE(IOUT,1000) LVOLD + DO 30 IPART=1,NPART + WRITE(IOUT,1001) IPART,RODPOS(1,IPART),RODPOS(3,IPART), + 1 RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART), + 2 RODPOS(6,IPART) + 30 CONTINUE + ENDIF +* MODIFY ROD POSITION + IF(IMPX.GT.1) WRITE(IOUT,1002) LVNEW + IF(IMODE.EQ.1) THEN +* FADING ROD + DELH=LVNEW*(LENG(2)-LENG(1)) + ELSE IF(IMODE.EQ.2) THEN +* MOVING ROD + IF(ITOP.EQ.-1) THEN + DELH=LVNEW*(LENG(2)-LIMIT(1))+LIMIT(1) + ELSE IF(ITOP.EQ.1) THEN + DELH=LIMIT(2)-LVNEW*(LIMIT(2)-LENG(1)) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + IF(IMPX.GT.3) THEN + WRITE(IOUT,*) ' ADJ ',NXSEQ,' LEVEL ',LVNEW*100., + 1 '% OF INSERTION' + WRITE(IOUT,*) ' NEW POSITION (L_sup)= ',DELH + ENDIF + ENDIF + CALL LCMGET(KPDEV,'MAX-POS',RODPOS) + CALL MOVCHK(IMPX,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS) +* STORE NEW PARAMETERS + CALL LCMPUT(KPDEV,'ROD-POS',6*NPART,2,RODPOS) + CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW) +*---- +* UPDATE LZC POSITION +*---- + ELSE IF(ILEVEL.NE.0) THEN +* RECOVER OLD LZC PARAMETERS + CALL LCMGET(KPDEV,'MAX-POS',MAXPOS) + CALL LCMGET(KPDEV,'EMPTY-POS',EMTPOS) + CALL LCMGET(KPDEV,'FULL-POS',FULPOS) + CALL LCMGET(KPDEV,'HEIGHT',HEIGHT) + CALL LCMGET(KPDEV,'LEVEL',LVOLD) + CALL LCMGET(KPDEV,'AXIS',IAXIS) + IF(IMPX.GT.1) WRITE(IOUT,1005) LVOLD,EMTPOS(1),EMTPOS(3), + 1 EMTPOS(5),EMTPOS(2),EMTPOS(4),EMTPOS(6),FULPOS(1), + 2 FULPOS(3),FULPOS(5),FULPOS(2),FULPOS(4),FULPOS(6) +* MODIFY LZC POSITION + DELH=LVNEW*HEIGHT + IF(IAXIS.EQ.1) THEN + FULPOS(1)=MAXPOS(2,1)-DELH + EMTPOS(2)=FULPOS(1) + ELSEIF(IAXIS.EQ.2) THEN + FULPOS(3)=MAXPOS(4,1)-DELH + EMTPOS(4)=FULPOS(3) + ELSEIF(IAXIS.EQ.3) THEN + FULPOS(5)=MAXPOS(6,1)-DELH + EMTPOS(6)=FULPOS(5) + ENDIF +* STORE NEW PARAMETERS + CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW) + CALL LCMPUT(KPDEV,'EMPTY-POS',6,2,EMTPOS) + CALL LCMPUT(KPDEV,'FULL-POS',6,2,FULPOS) + IF(IMPX.GT.1) WRITE(IOUT,1006) LVNEW,EMTPOS(1),EMTPOS(3), + 1 EMTPOS(5),EMTPOS(2),EMTPOS(4),EMTPOS(6),FULPOS(1), + 2 FULPOS(3),FULPOS(5),FULPOS(2),FULPOS(4),FULPOS(6) + ENDIF +*---- +* UPDATE SPEED +*---- + IF((ISPEED.NE.0).AND.LROD) THEN + CALL LCMLEN(KPDEV,'SPEED',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPDEV,'SPEED',SPOLD) + IF(IMPX.GE.2) WRITE(IOUT,1007) SPOLD,SPNEW + ELSE + IF(IMPX.GE.2) WRITE(IOUT,1008) SPNEW + ENDIF + CALL LCMPUT(KPDEV,'SPEED',1,2,SPNEW) + ELSE IF(ISPEED.NE.0) THEN + CALL LCMLEN(KPDEV,'RATE',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPDEV,'RATE',SPOLD) + IF(IMPX.GE.2) WRITE(IOUT,1007) SPOLD,SPNEW + ELSE + IF(IMPX.GE.2) WRITE(IOUT,1008) SPNEW + ENDIF + CALL LCMPUT(KPDEV,'RATE',1,2,SPNEW) + ENDIF +*---- +* UPDATE TIME +*---- + IF(ISTIME.NE.0) THEN + CALL LCMLEN(KPDEV,'TIME',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(KPDEV,'TIME',TMOLD) + IF(IMPX.GE.2) WRITE(IOUT,1009) TMOLD,TMNEW + ELSE + IF(IMPX.GE.2) WRITE(IOUT,1010) TMNEW + ENDIF + CALL LCMPUT(KPDEV,'TIME',1,2,TMNEW) + ENDIF +* PROCEED NEXT ROD + 60 CONTINUE + DEALLOCATE(IDEV) + RETURN +* + 1000 FORMAT( + 1 /5X,'DSETGR: PREVIOUS INSERTION LEVEL =',F8.4) + 1001 FORMAT( + 1 /5X,'DSETGR: PART =',I5/ + 2 5X,'PREVIOUS ROD POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1002 FORMAT( + 1 /5X,'DSETGR: NEW INSERTION LEVEL =',F8.4) + 1005 FORMAT( + 1 /5X,'PREVIOUS LZC LEVEL =',F8.4/ + 2 5X,'PREVIOUS EMPTY-PART POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/ + 5 5X,'PREVIOUS FULL-PART POSITION :'/ + 6 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 7 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/) + 1006 FORMAT( + 1 /5X,'NEW LZC LEVEL =',F8.4/ + 2 5X,'NEW EMPTY-PART POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/ + 5 5X,'NEW FULL-PART POSITION :'/ + 6 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 7 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/) + 1007 FORMAT(/5X,'** SETING DEVICE SPEED **', + 1 /5X,'PREVIOUS SPEED:',F10.4 + 2 /5X,'NEW SPEED:',F10.4/) + 1008 FORMAT(/5X,'** SETING DEVICE SPEED **', + 1 /5X,'PREVIOUS SPEED: (UNDEFINED)' + 2 /5X,'NEW SPEED:',F10.4/) + 1009 FORMAT(/5X,'** SETING DEVICE TIME **', + 1 /5X,'PREVIOUS TIME:',F10.4 + 2 /5X,'NEW TIME:',F10.4/) + 1010 FORMAT(/5X,'** SETING DEVICE TIME **', + 1 /5X,'PREVIOUS TIME: (UNDEFINED)' + 2 /5X,'NEW TIME:',F10.4/) + 1011 FORMAT(/5X,' => ROD #',I3.3,4X,'ROD-NAME:',1X,A) + 1012 FORMAT(/5X,' => LZC #',I2.2) + END diff --git a/Donjon/src/DSPH.f b/Donjon/src/DSPH.f new file mode 100644 index 0000000..f52b811 --- /dev/null +++ b/Donjon/src/DSPH.f @@ -0,0 +1,544 @@ +*DECK DSPH
+ SUBROUTINE DSPH(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Create a delta Macrolib with respect to a SPH correction.
+*
+*Copyright:
+* Copyright (C) 2017 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* A. Hebert
+*
+*Parameters: input
+* NENTRY number of data structures transfered to this module.
+* HENTRY name of the data structures.
+* IENTRY data structure type where:
+* IENTRY=1 for LCM memory object;
+* IENTRY=2 for XSM file;
+* IENTRY=3 for sequential binary file;
+* IENTRY=4 for sequential ASCII file.
+* JENTRY access permission for the data structure where:
+* JENTRY=0 for a data structure in creation mode;
+* JENTRY=1 for a data structure in modifications mode;
+* JENTRY=2 for a data structure in read-only mode.
+* KENTRY data structure pointer.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+ TYPE(C_PTR) KENTRY(NENTRY)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40)
+ CHARACTER HSIGN*12,TEXT2*2,TEXT8*8,TEXT12*12
+ DOUBLE PRECISION DFLOTT
+ INTEGER ISTATE(NSTATE)
+ DOUBLE PRECISION OPTPRR(NSTATE)
+ TYPE(C_PTR) IPOPT,IPNEW,IPOLD,JPNEW,JPOLD,KPNEW,KPOLD,LPNEW,MPNEW
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IHEDIT
+ REAL, ALLOCATABLE, DIMENSION(:) :: DIFHOM,GAR,PER,GAR1,PER1
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: SPH,GAR2,PER2,ALBP,PALBP
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: PSIGS
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.NE.3)CALL XABORT('DSPH: THREE PARAMETERS EXPECTED.')
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@DSPH'
+ 1 //': LCM OBJECT EXPECTED AT LHS.')
+ IF(JENTRY(1).EQ.0)THEN
+ HSIGN='L_MACROLIB'
+ CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ ELSE
+ CALL XABORT('DSPH: EMPTY DELTA MACROLIB EXPECTED AT LHS.')
+ ENDIF
+ IPNEW=KENTRY(1)
+ IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('DSPH: LCM '
+ 1 //'OBJECT EXPECTED AT LHS.')
+ IF(JENTRY(2).EQ.0)THEN
+ HSIGN='L_OPTIMIZE'
+ CALL LCMPTC(KENTRY(2),'SIGNATURE',12,HSIGN)
+ ELSE IF(JENTRY(2).EQ.1)THEN
+ CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_OPTIMIZE')THEN
+ CALL XABORT('DSPH: SIGNATURE OF '//HENTRY(2)//' IS '//HSIGN//
+ 1 '. L_OPTIMIZE EXPECTED.')
+ ENDIF
+ ELSE IF(JENTRY(2).EQ.2)THEN
+ CALL XABORT('DSPH: OPTIMIZE OBJECT IN CREATION OR MODIFICATION'
+ 1 //' MODE EXPECTED.')
+ ENDIF
+ IPOPT=KENTRY(2)
+ IF((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2))CALL XABORT('DSPH: LCM '
+ 1 //'OBJECT EXPECTED AT RHS.')
+ IF(JENTRY(3).NE.2)CALL XABORT('DSPH: MACROLIB IN READ-ONLY MODE '
+ 1 //'EXPECTED AT RHS.')
+ CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_MACROLIB')THEN
+ CALL XABORT('DSPH: SIGNATURE OF '//HENTRY(3)//' IS '//HSIGN//
+ 1 '. L_MACROLIB EXPECTED.')
+ ENDIF
+ IPOLD=KENTRY(3)
+ CALL LCMGET(IPOLD,'STATE-VECTOR',ISTATE)
+ NGRP=ISTATE(1)
+ NMIX=ISTATE(2)
+ NL=ISTATE(3)
+ NIFISS=ISTATE(4)
+ NED=ISTATE(5)
+ NDEL=ISTATE(7)
+ NALBP=ISTATE(8)
+ ILEAKS=ISTATE(9)
+*----
+* READ THE INPUT DATA
+*----
+ IMPX=1
+ IMC=2
+ NGR1=1
+ NGR2=NGRP
+ NMIXP=NMIX
+ 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.EQ.10) GO TO 30
+ IF(INDIC.NE.3) CALL XABORT('DSPH: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT12.EQ.'EDIT') THEN
+* READ THE PRINT INDEX.
+ CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DSPH: INTEGER DATA EXPECTED(1).')
+ ELSE IF(TEXT12.EQ.'SPH') THEN
+* READ THE TYPE OF SPH CORRECTION.
+ CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.3) CALL XABORT('DSPH: CHARACTER DATA EXPECTED(2).')
+ IF(TEXT12.EQ.'PN') THEN
+ IMC=1
+ ELSE IF(TEXT12.EQ.'SN') THEN
+ IMC=2
+ ELSE IF(TEXT12.EQ.'ALBEDO') THEN
+ IMC=3
+ ELSE
+ CALL XABORT('DSPH: INVALID TYPE OF SPH CORRECTION.')
+ ENDIF
+ ELSE IF(TEXT12.EQ.'GRPMIN') THEN
+* READ THE MINIMUM GROUP INDEX.
+ CALL REDGET(INDIC,NGR1,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DSPH: INTEGER DATA EXPECTED(4).')
+ IF((NGR1.LE.0).OR.(NGR1.GT.NGRP)) CALL XABORT('DSPH: INVALID '
+ 1 //'VALUE OF GRPMIN.')
+ ELSE IF(TEXT12.EQ.'GRPMAX') THEN
+* READ THE MAXIMUM GROUP INDEX.
+ CALL REDGET(INDIC,NGR2,FLOTT,TEXT12,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('DSPH: INTEGER DATA EXPECTED(5).')
+ IF((NGR2.LT.NGR1).OR.(NGR2.GT.NGRP)) CALL XABORT('DSPH: INVAL'
+ 1 //'ID VALUE OF GRPMAX.')
+ ELSE IF(TEXT12.EQ.';') THEN
+ GO TO 30
+ ELSE
+ CALL XABORT('DSPH: '//TEXT12//' IS AN INVALID KEYWORD.')
+ ENDIF
+ GO TO 20
+ 30 IF(NGR2.LT.NGR1) CALL XABORT('DSPH: INVALID GROUP INDICES.')
+ NMIXP=NMIX
+ IF(IMC.EQ.3) NMIXP=0
+ NPERT=(NMIXP+NALBP)*(NGR2-NGR1+1)
+ IF(IMPX.GT.0) WRITE(6,'(/36H DSPH: NUMBER OF CROSS-SECTION PERTU,
+ 1 9HRBATIONS=,I5)') NPERT
+*----
+* SET THE PERTURBED MACROLIB
+*----
+ JPNEW=LCMLID(IPNEW,'STEP',NPERT)
+ JPOLD=LCMGID(IPOLD,'GROUP')
+ IPERT=0
+ ALLOCATE(SPH(NMIXP+NALBP,NGRP),VARV(NPERT),ALBP(NALBP,NGRP),
+ 1 PALBP(NALBP,NGRP))
+ ALLOCATE(IHEDIT(2,NED+1),IJJ(NMIX),NJJ(NMIX),IPOS(NMIX))
+ ALLOCATE(DIFHOM(NGRP),GAR(NMIX),PER(NMIX),GAR1(NMIX*NGRP),
+ 1 PER1(NMIX*NGRP),GAR2(NMIX,NIFISS),PER2(NMIX,NIFISS),
+ 2 PSIGS(NMIX,NGRP,NL))
+*----
+* RECOVER SPH FACTORS
+*----
+ IF(NALBP.GT.0) CALL LCMGET(IPOLD,'ALBEDO',ALBP)
+ SPH(:NMIXP+NALBP,:NGRP)=1.0
+ DO 40 IGRP=NGR1,NGR2
+ KPOLD=LCMGIL(JPOLD,IGRP)
+ CALL LCMLEN(KPOLD,'NSPH',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.NMIX) THEN
+ CALL LCMGET(KPOLD,'NSPH',SPH(1,IGRP))
+ IF(NALBP.GT.0) SPH(NMIXP+1:NMIXP+NALBP,IGRP)=1.0
+ ELSE
+ SPH(:NMIXP+NALBP,IGRP)=1.0
+ ENDIF
+ 40 CONTINUE
+*----
+* MACROSCOPIC TOTAL CROSS SECTIONS
+*----
+ DO 190 IGRP=NGR1,NGR2
+ DO 130 IBMP=1,NMIXP
+ PSIGS(:NMIX,:NGRP,:NL)=0.0
+ IPERT=IPERT+1
+ IF(IPERT.GT.NPERT) CALL XABORT('DSPH: NPERT OVERFLOW(1).')
+ VARV(IPERT)=SPH(IBMP,IGRP)
+ KPNEW=LCMDIL(JPNEW,IPERT)
+ IF(NALBP.GT.0) THEN
+ PALBP(:NALBP,:NGRP)=1.0
+ CALL LCMPUT(KPNEW,'ALBEDO',NALBP*NGRP,2,PALBP)
+ ENDIF
+ LPNEW=LCMLID(KPNEW,'GROUP',NGRP)
+ DO 110 IGR=1,NGRP
+ MPNEW=LCMDIL(LPNEW,IGR)
+ KPOLD=LCMGIL(JPOLD,IGR)
+ GAR(:NMIX)=0.0
+ NJJ(:NMIX)=1
+ IJJ(:NMIX)=IGR
+ CALL LCMPUT(MPNEW,'NTOT0',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SIGS00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SIGW00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SCAT00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'NJJS00',NMIX,1,NJJ)
+ CALL LCMPUT(MPNEW,'IJJS00',NMIX,1,IJJ)
+ CALL LCMPUT(MPNEW,'IPOS00',NMIX,1,NJJ)
+*----
+* MACROSCOPIC TOTAL CROSS SECTIONS
+*----
+ PER(:NMIX)=0.0
+ CALL LCMLEN(KPOLD,'NTOT0',ILCMLN,ITYLCM)
+ IF(ILCMLN.EQ.0) CALL XABORT('DSPH: MISSING NTOT0 INFO')
+ CALL LCMGET(KPOLD,'NTOT0',GAR)
+ IF(IMC.EQ.1) THEN
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)/SPH(IBMP,IGR)
+ CALL LCMPUT(MPNEW,'NTOT0',NMIX,2,PER)
+ ENDIF
+ PER(:NMIX)=0.0
+ CALL LCMLEN(KPOLD,'NTOT1',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) CALL LCMGET(KPOLD,'NTOT1',GAR)
+ IF(IMC.EQ.1) THEN
+ IF(IGR.EQ.IGRP) PER(IBMP)=-GAR(IBMP)/SPH(IBMP,IGR)
+ CALL LCMPUT(MPNEW,'NTOT1',NMIX,2,PER)
+ ENDIF
+*----
+* MACROSCOPIC NU*FISSION CROSS SECTIONS (STEADY-STATE AND DELAYED)
+*----
+ IF(NIFISS.GT.0) THEN
+ PER2(:NMIX,:NIFISS)=0.0
+ CALL LCMGET(KPOLD,'NUSIGF',GAR2)
+ IF(IGR.EQ.IGRP) THEN
+ DO 50 IFIS=1,NIFISS
+ PER2(IBMP,IFIS)=GAR2(IBMP,IFIS)/SPH(IBMP,IGR)
+ 50 CONTINUE
+ ENDIF
+ CALL LCMPUT(MPNEW,'NUSIGF',NMIX*NIFISS,2,PER2)
+ DO 70 IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL
+ PER2(:NMIX,:NIFISS)=0.0
+ CALL LCMGET(KPOLD,TEXT12,GAR2)
+ IF(IGR.EQ.IGRP) THEN
+ DO 60 IFIS=1,NIFISS
+ PER2(IBMP,IFIS)=GAR2(IBMP,IFIS)/SPH(IBMP,IGR)
+ 60 CONTINUE
+ ENDIF
+ CALL LCMPUT(MPNEW,TEXT12,NMIX*NIFISS,2,PER2)
+ 70 CONTINUE
+ ENDIF
+*----
+* MACROSCOPIC SCATTERING CROSS SECTIONS
+*----
+ DO 90 IL=1,NL
+ WRITE(TEXT2,'(I2.2)') IL-1
+ CALL LCMLEN(KPOLD,'NJJS'//TEXT2,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMGET(KPOLD,'NJJS'//TEXT2,NJJ)
+ CALL LCMGET(KPOLD,'IJJS'//TEXT2,IJJ)
+ CALL LCMGET(KPOLD,'IPOS'//TEXT2,IPOS)
+ CALL LCMGET(KPOLD,'SCAT'//TEXT2,GAR1)
+ CALL LCMLEN(KPOLD,'NTOT1',ILCMLN,ITYLCM)
+ IF((MOD(IL-1,2).EQ.1).AND.(ILCMLN.GT.0)) THEN
+ CALL LCMGET(KPOLD,'NTOT1',GAR)
+ ELSE
+ CALL LCMGET(KPOLD,'NTOT0',GAR)
+ ENDIF
+ PER1(:NMIX*NGRP)=0.0
+ IPO=IPOS(IBMP)
+ DO 80 JGR=IJJ(IBMP),IJJ(IBMP)-NJJ(IBMP)+1,-1
+ IF(MOD(IL-1,2).EQ.0) THEN
+ IF((IGR.EQ.JGR).AND.(IMC.GT.1)) THEN
+ IF(IGR.EQ.IGRP) THEN
+ PER1(IPO)=GAR1(IPO)/SPH(IBMP,IGR)-GAR(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ELSE
+ IF(JGR.EQ.IGRP) THEN
+ PER1(IPO)=GAR1(IPO)/SPH(IBMP,JGR) ! IGR <- JGR
+ ENDIF
+ ENDIF
+ ELSE
+ IF((IGR.EQ.JGR).AND.(IMC.GT.1)) THEN
+ IF(IGR.EQ.IGRP) THEN
+ PER1(IPO)=-GAR1(IPO)/SPH(IBMP,IGR)+GAR(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ELSE
+ IF(IGR.EQ.IGRP) THEN
+ PER1(IPO)=-GAR1(IPO)/SPH(IBMP,IGR)
+ ENDIF
+ ENDIF
+ ENDIF
+ PSIGS(IBMP,IGR,IL)=PSIGS(IBMP,IGR,IL)+PER1(IPO)
+ IPO=IPO+1
+ 80 CONTINUE
+ CALL LCMPUT(MPNEW,'NJJS'//TEXT2,NMIX,1,NJJ)
+ CALL LCMPUT(MPNEW,'IJJS'//TEXT2,NMIX,1,IJJ)
+ CALL LCMPUT(MPNEW,'IPOS'//TEXT2,NMIX,1,IPOS)
+ CALL LCMPUT(MPNEW,'SCAT'//TEXT2,IPOS(NMIX)+NJJ(NMIX)-1,2,PER1)
+ ENDIF
+ CALL LCMLEN(KPOLD,'SIGW'//TEXT2,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,'SIGW'//TEXT2,GAR1)
+ CALL LCMLEN(KPOLD,'NTOT1',ILCMLN,ITYLCM)
+ IF((MOD(IL-1,2).EQ.1).AND.(ILCMLN.GT.0)) THEN
+ CALL LCMGET(KPOLD,'NTOT1',GAR)
+ ELSE
+ CALL LCMGET(KPOLD,'NTOT0',GAR)
+ ENDIF
+ IF(MOD(IL-1,2).EQ.0) THEN
+ IF(IMC.EQ.1) THEN
+ IF(IGR.EQ.IGRP) THEN
+ PER(IBMP)=GAR1(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ELSE
+ IF(IGR.EQ.IGRP) THEN
+ PER(IBMP)=-GAR1(IBMP)/SPH(IBMP,IGR)+GAR(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ENDIF
+ ELSE
+ IF(IMC.EQ.1) THEN
+ IF(IGR.EQ.IGRP) THEN
+ PER(IBMP)=-GAR1(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ELSE
+ IF(IGR.EQ.IGRP) THEN
+ PER(IBMP)=-GAR1(IBMP)/SPH(IBMP,IGR)+GAR(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ENDIF
+ ENDIF
+ CALL LCMPUT(MPNEW,'SIGW'//TEXT2,NMIX,2,PER)
+ ENDIF
+ 90 CONTINUE
+*----
+* DIFFUSION COEFFICIENTS
+*----
+ IF(ILEAKS.EQ.1) THEN
+ CALL LCMLEN(KPOLD,'DIFF',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,'DIFF',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)/SPH(IBMP,IGR)
+ ELSE
+ PER(:NMIX)=0.0
+ CALL LCMGET(IPOLD,'DIFHOMB1HOM',DIFHOM)
+ IF(IGR.EQ.IGRP) PER(IBMP)=DIFHOM(IGR)/SPH(IBMP,IGR)
+ ENDIF
+ CALL LCMPUT(MPNEW,'DIFF',NMIX,2,PER)
+ ELSE IF(ILEAKS.EQ.2) THEN
+ CALL LCMLEN(KPOLD,'DIFFX',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,'DIFFX',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)/SPH(IBMP,IGR)
+ CALL LCMPUT(MPNEW,'DIFFX',NMIX,2,PER)
+ ENDIF
+ CALL LCMLEN(KPOLD,'DIFFY',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,'DIFFY',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)/SPH(IBMP,IGR)
+ CALL LCMPUT(MPNEW,'DIFFY',NMIX,2,PER)
+ ENDIF
+ CALL LCMLEN(KPOLD,'DIFFZ',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,'DIFFZ',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)/SPH(IBMP,IGR)
+ CALL LCMPUT(MPNEW,'DIFFZ',NMIX,2,PER)
+ ENDIF
+ ENDIF
+*----
+* SPECIFIC REACTIONS
+*----
+ CALL LCMLEN(KPOLD,'TRANC',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,'TRANC',GAR)
+ IF(IGR.EQ.IGRP) PER(IBMP)=-GAR(IBMP)/SPH(IBMP,IGR)
+ CALL LCMPUT(MPNEW,'TRANC',NMIX,2,PER)
+ ENDIF
+*----
+* ADDITIONAL PHI-WEIGHTED EDITS
+*----
+ DO 100 IED=1,NED
+ WRITE(TEXT8,'(2A4)') (IHEDIT(I0,IED),I0=1,2)
+ IF(TEXT8(:5).EQ.'TRANC') GO TO 100
+ CALL LCMLEN(KPOLD,TEXT8,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PER(:NMIX)=0.0
+ CALL LCMGET(KPOLD,TEXT8,GAR)
+ IF(TEXT8(:4).EQ.'STRD') THEN
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)/SPH(IBMP,IGR)
+ ELSE
+ IF(IGR.EQ.IGRP) PER(IBMP)=GAR(IBMP)*SPH(IBMP,IGR)
+ ENDIF
+ CALL LCMPUT(MPNEW,TEXT8,NMIX,2,PER)
+ ENDIF
+ 100 CONTINUE
+ 110 CONTINUE
+*----
+* STORE SCATTERING CROSS SECTIONS
+*----
+ DO 125 IGR=1,NGRP
+ MPNEW=LCMDIL(LPNEW,IGR)
+ KPOLD=LCMGIL(JPOLD,IGR)
+ CALL LCMLEN(KPOLD,'SIGS00',ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ PSIGS(:NMIX,IGR,1)=0.0
+ CALL LCMGET(KPOLD,'SIGS00',GAR1)
+ CALL LCMGET(KPOLD,'NTOT0',GAR)
+ IF(IMC.EQ.1) THEN
+ IF(IGR.EQ.IGRP) PSIGS(IBMP,IGR,1)=GAR1(IBMP)/SPH(IBMP,IGR)
+ ELSE
+ IF(IGR.EQ.IGRP) PSIGS(IBMP,IGR,1)=GAR1(IBMP)/SPH(IBMP,IGR)-
+ > GAR(IBMP)/SPH(IBMP,IGR)
+ ENDIF
+ ENDIF
+ DO 120 IL=1,NL
+ WRITE(TEXT2,'(I2.2)') IL-1
+ CALL LCMLEN(KPOLD,'SIGS'//TEXT2,ILCMLN,ITYLCM)
+ IF(ILCMLN.GT.0) THEN
+ CALL LCMPUT(MPNEW,'SIGS'//TEXT2,NMIX,2,PSIGS(1,IGR,IL))
+ ENDIF
+ 120 CONTINUE
+ 125 CONTINUE
+ 130 CONTINUE
+*----
+* DERIVATIVE RELATIVE TO PHYSICAL ALBEDOS
+*----
+ DO 180 IALP=1,NALBP
+ IPERT=IPERT+1
+ IF(IPERT.GT.NPERT) CALL XABORT('DSPH: NPERT OVERFLOW(2).')
+ VARV(IPERT)=SPH(NMIXP+IALP,IGRP)
+ KPNEW=LCMDIL(JPNEW,IPERT)
+ PALBP(:NALBP,:NGRP)=1.0
+ FAT=0.5*(1.0-ALBP(IALP,IGRP))/(1.0+ALBP(IALP,IGRP))/
+ 1 REAL(VARV(IPERT))
+ PALBP(IALP,IGRP)=(1.0-2.0*FAT)/(1.0+2.0*FAT)
+ LPNEW=LCMLID(KPNEW,'GROUP',NGRP)
+ CALL LCMPUT(KPNEW,'ALBEDO',NALBP*NGRP,2,PALBP)
+ DO 170 IGR=1,NGRP
+ MPNEW=LCMDIL(LPNEW,IGR)
+ GAR(:NMIX)=0.0
+ NJJ(:NMIX)=1
+ DO 140 IMIX=1,NMIX
+ IJJ(IMIX)=IGR
+ 140 CONTINUE
+ CALL LCMPUT(MPNEW,'NTOT0',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SIGS00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SIGW00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'SCAT00',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'NJJS00',NMIX,1,NJJ)
+ CALL LCMPUT(MPNEW,'IJJS00',NMIX,1,IJJ)
+ CALL LCMPUT(MPNEW,'IPOS00',NMIX,1,NJJ)
+ CALL LCMPUT(MPNEW,'NTOT0',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'NTOT1',NMIX,2,GAR)
+ IF(NIFISS.GT.0) THEN
+ PER2(:NMIX,:NIFISS)=0.0
+ CALL LCMPUT(MPNEW,'NUSIGF',NMIX*NIFISS,2,PER2)
+ DO 150 IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL
+ PER2(:NMIX,:NIFISS)=0.0
+ CALL LCMPUT(MPNEW,TEXT12,NMIX*NIFISS,2,PER2)
+ 150 CONTINUE
+ ENDIF
+ IF(ILEAKS.EQ.1) THEN
+ CALL LCMPUT(MPNEW,'DIFF',NMIX,2,GAR)
+ ELSE IF(ILEAKS.EQ.2) THEN
+ CALL LCMPUT(MPNEW,'DIFFX',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'DIFFY',NMIX,2,GAR)
+ CALL LCMPUT(MPNEW,'DIFFZ',NMIX,2,GAR)
+ ENDIF
+ DO 160 IED=1,NED
+ WRITE(TEXT8,'(2A4)') (IHEDIT(I0,IED),I0=1,2)
+ IF(TEXT8(:5).EQ.'TRANC') GO TO 160
+ CALL LCMPUT(MPNEW,TEXT8,NMIX,2,GAR)
+ 160 CONTINUE
+*----
+* END OF LOOP OVER PERTURBED MACROLIBS
+*----
+ 170 CONTINUE
+ 180 CONTINUE
+ 190 CONTINUE
+ DEALLOCATE(PSIGS,PER2,GAR2,PER1,GAR1,PER,GAR,DIFHOM)
+ DEALLOCATE(IPOS,NJJ,IJJ,IHEDIT)
+ DEALLOCATE(PALBP,ALBP,SPH)
+*----
+* SET THE PERTURBED MACROLIB STATE-VECTOR
+*----
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NGRP
+ ISTATE(2)=NMIX
+ ISTATE(3)=1
+ ISTATE(7)=NALBP
+ ISTATE(9)=ILEAKS
+ ISTATE(11)=NPERT
+ CALL LCMPUT(IPNEW,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IMPX.GT.1) CALL LCMLIB(IPNEW)
+*----
+* PUT OPTIMIZE OBJECT INFORMATION
+*----
+ CALL LCMPUT(IPOPT,'VAR-VALUE',NPERT,4,VARV)
+ DEALLOCATE(VARV)
+ IF(JENTRY(2).EQ.0)THEN
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NGRP
+ ISTATE(2)=NMIX
+ ISTATE(3)=1
+ ISTATE(4)=2+IMC
+ ISTATE(5)=NGR1
+ ISTATE(6)=NGR2
+ ISTATE(7)=1
+ ISTATE(8)=NMIX
+ ISTATE(9)=NALBP
+ IF(IMPX.GT.0) WRITE(6,200) (ISTATE(I),I=1,6)
+ CALL LCMPUT(IPOPT,'DEL-STATE',NSTATE,1,ISTATE)
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NPERT
+ ISTATE(2)=0
+ ISTATE(3)=1
+ ISTATE(4)=0
+ ISTATE(5)=0
+ ISTATE(6)=2
+ ISTATE(9)=2
+ ISTATE(10)=0
+ CALL LCMPUT(IPOPT,'STATE-VECTOR',NSTATE,1,ISTATE)
+ OPTPRR(:NSTATE)=0.0D0
+ OPTPRR(1)=1.0D0
+ OPTPRR(2)=0.1D0
+ OPTPRR(3)=1.0D-4
+ OPTPRR(4)=1.0D-4
+ OPTPRR(5)=1.0D-4
+ CALL LCMPUT(IPOPT,'OPT-PARAM-R',NSTATE,4,OPTPRR)
+ ENDIF
+ RETURN
+*
+ 200 FORMAT(/18H DEL-STATE OPTIONS/18H -----------------/
+ 1 7H NGRP ,I8,28H (NUMBER OF ENERGY GROUPS)/
+ 2 7H NMIX ,I8,32H (NUMBER OF MATERIAL MIXTURES)/
+ 3 7H ITYPE ,I8,13H (NOT USED)/
+ 4 7H IDELTA,I8,43H (=3/4/5: USE PN-TYPE/USE SN-TYPE/ALBEDO)/
+ 5 7H NGR1 ,I8,24H (MINIMUM GROUP INDEX)/
+ 6 7H NGR2 ,I8,24H (MAXIMUM GROUP INDEX))
+ END
diff --git a/Donjon/src/FLFSTH.f b/Donjon/src/FLFSTH.f new file mode 100644 index 0000000..0878021 --- /dev/null +++ b/Donjon/src/FLFSTH.f @@ -0,0 +1,62 @@ +*DECK FLFSTH + SUBROUTINE FLFSTH(PTOT,POWER,POWC,POWB,FLUX,NGRP,NCH, + + NB,NEL,FSTH,FLUB) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Update the fuel average fluxes and the channel and bundle powers +* over the fuel lattice using FTSH +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* M. Guyot +* +*Parameters: input +* PTOT total power in MW +* POWER total power computed with H-factors in MW +* POWC channel powers in kW +* POWB bundle powers in kW +* FLUX average fluxes per regions +* NGRP number of energy groups +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NEL total number of finite elements. +* FSTH thermal to fission ratio power +* FLUB average fluxers per bundles +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NCH,NB,NGRP,NEL + REAL FLUX(NEL,NGRP),FSTH,FLUB(NCH,NB,NGRP), + 1 POWB(NCH,NB),POWC(NCH) + DOUBLE PRECISION POWER,FACT,PTOT +*---- +* LOCAL VARIABLES +*---- + INTEGER I,J,K +* + FACT=PTOT/POWER + FACT= FACT/FSTH + DO 10 I=1,NCH + POWC(I)=POWC(I)*REAL(FACT) + DO 20 J=1,NB + POWB(I,J)=POWB(I,J)*REAL(FACT) + DO 30 K=1,NGRP + FLUB(I,J,K)=FLUB(I,J,K)*REAL(FACT) + 30 CONTINUE + 20 CONTINUE + 10 CONTINUE + DO 40 I=1,NEL + DO 50 J=1,NGRP + FLUX(I,J)=FLUX(I,J)*REAL(FACT) + 50 CONTINUE + 40 CONTINUE + RETURN + END diff --git a/Donjon/src/FLPDRV.f b/Donjon/src/FLPDRV.f new file mode 100644 index 0000000..c57c28b --- /dev/null +++ b/Donjon/src/FLPDRV.f @@ -0,0 +1,304 @@ +*DECK FLPDRV + SUBROUTINE FLPDRV(IPPOW,IPNFX,IPFLX,IPKIN,IPTRK,IPMTX,IPMAP, + 1 IPMAC,PTOT,LNEW,LMAP,JMOD,LFLX,LPOW,LRAT,IMPX,FSTH,LFSTH,LFLU, + 2 LBUN,LNRM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver for the powers and fluxes computations. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki, M. Guyot +* +*Parameters: input/output +* IPPOW pointer to power information. +* IPNFX pointer to normalized flux information. +* IPFLX pointer to flux information. +* IPKIN pointer to kinetics information. +* IPTRK pointer to tracking information. +* IPMTX pointer to matex information. +* IPMAP pointer to fuel-map information. +* IPMAC pointer to macrolib information. +* PTOT given total reactor power in mega-watts. +* LNEW new total power flag (=.true. for new computation). +* LMAP fuel-map printing on file flag (=.true. for print). +* JMOD modification index for L_MAP object. +* LFLX flux printing on file flag (=.true. for print). +* LPOW power printing on file flag (=.true. for print). +* LRAT flux-ratio printing on file flag (=.true. for print). +* IMPX printing on screen index (=0 for no print). +* FSTH thermal to fission power ratio +* LFSTH =.true if the thermal fission ratio is specified +* LFLU =.true. if an output flux is to be created +* LBUN =.true. if the output flux is a flux per bundle +* LNRM =.true. if the output flux is a flux per mesh-splitted element +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPPOW,IPNFX,IPFLX,IPKIN,IPTRK,IPMTX,IPMAP,IPMAC + INTEGER JMOD,IMPX + LOGICAL LNEW,LMAP,LFLX,LPOW,LRAT,LFSTH,LFLU,LBUN,LNRM + REAL PTOT,FSTH +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + INTEGER ISTATE(NSTATE),IGR,NUN,NGRP,IGEO + DOUBLE PRECISION ZNRM,VTOT,POWR + CHARACTER HSIGN*12 + TYPE(C_PTR) JPMAC,KPMAC,MPFLUX + INTEGER, ALLOCATABLE, DIMENSION(:) :: MAT,IDL,FMIX + REAL, ALLOCATABLE, DIMENSION(:) :: HFC,VECT,FLUX,VOL,FXYZ,RAT, + 1 PXYZ,VMAP,FMAP,POWC,POWB,VECNR +*---- +* CHECK THE TYPE OF FLUX SELECTED FOR OUTPUT +*---- + IF(LFLU)THEN + IF(LNRM.AND.LBUN) CALL XABORT('@FLPDRV: KEYWORD NORM AND BUND ' + 1 //'BOTH SELECTED.') + IF((.NOT.LNRM).AND.(.NOT.LBUN)) THEN + LNRM=.TRUE. + WRITE(6,*) 'FLPDRV: default option for L_FLUX object is NORM.' + ENDIF + ENDIF +*---- +* RECOVER INFORMATION +*---- + ISTATE(:NSTATE)=0 + IF(C_ASSOCIATED(IPFLX)) THEN +* L_FLUX object + CALL LCMGET(IPFLX,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NUN=ISTATE(2) + CALL LCMGET(IPFLX,'K-EFFECTIVE',FKEFF) + ELSE IF(C_ASSOCIATED(IPKIN)) THEN +* L_KINET object + CALL LCMGET(IPKIN,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(3) + NUN=ISTATE(6) + CALL LCMGET(IPKIN,'E-KEFF',FKEFF) + CALL LCMGET(IPKIN,'E-POW',PTOT) + ENDIF + ISTATE(:NSTATE)=0 + CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE) + NEL=ISTATE(1) + IF(ISTATE(2).NE.NUN) CALL XABORT('@FLPDRV: INCOMPATIBLE L_TRACK ' + 1 //'AND L_FLUX/L_KINET OBJECTS') + LX=ISTATE(14) + LY=ISTATE(15) + LZ=ISTATE(16) +*---- +* RECOVER H-FACTOR +*---- + ISTATE(:NSTATE)=0 + IF(C_ASSOCIATED(IPMAC))THEN + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP)CALL XABORT('@FLPDRV: INVALID NUM' + 1 //'BER OF ENERGY GROUPS IN MACROLIB.') + NMIX=ISTATE(2) + ALLOCATE(HFC(NMIX*NGRP)) + JPMAC=LCMGID(IPMAC,'GROUP') + DO JGR=1,NGRP + KPMAC=LCMGIL(JPMAC,JGR) + CALL LCMLEN(KPMAC,'H-FACTOR',LENGT,ITYP) + IF(LENGT.NE.NMIX)CALL XABORT('@FLPDRV: UNABLE TO FIND' + 1 //' H-FACTOR BLOCK DATA IN THE MACROLIB.') + CALL LCMGET(KPMAC,'H-FACTOR',HFC((JGR-1)*NMIX+1)) + ENDDO + ELSEIF(C_ASSOCIATED(IPMTX))THEN + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP)CALL XABORT('@FLPDRV: INVALID NUM' + 1 //'BER OF ENERGY GROUPS IN MATEX.') + NMIX=ISTATE(2) + ALLOCATE(HFC(NMIX*NGRP)) + HFC(:NMIX*NGRP)=0.0 + CALL LCMGET(IPMTX,'H-FACTOR',HFC) + ENDIF +*---- +* RECOVER FUELMAP AND MATEX INFORMATION +*---- + IF(C_ASSOCIATED(IPMAP).AND.C_ASSOCIATED(IPMTX))THEN + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + IGEO=ISTATE(12) + IF((IGEO.NE.7).AND.(IGEO.NE.9))CALL XABORT('@FLPDRV: INVALID' + 1 //' GEOMETRY IN FUEL MAP : ONLY 3-D CARTESIAN OR 3-D HEXAGO' + 2 //'NAL GEOMETRIES AVAILABLE') + IF(ISTATE(4).NE.NGRP)CALL XABORT('@FLPDRV: INVALID NUM' + 1 //'BER OF ENERGY GROUPS IN FUEL MAP OR FLUX.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) + NMIX=ISTATE(2) + NTOT=ISTATE(5) + IF(ISTATE(6).NE.IGEO)CALL XABORT('@FLPDRV: GEOMETRIES IN' + 1 //' MATEX AND FUEL MAP ARE DIFFERENT') + IF(ISTATE(7).NE.NEL)CALL XABORT('@FLPDRV: INVALID TOTAL' + 1 //' NUMBER OF REGIONS IN FUEL MAP OR TRACK.') + ENDIF +*---- +* FLUX NORMALIZATION +*---- + ALLOCATE(VECT(NUN*NGRP),FLUX(NEL*NGRP),MAT(NEL),VOL(NEL),IDL(NEL)) + IF(LNEW)THEN +* NEW TOTAL REACTOR POWER + CALL LCMLEN(IPPOW,'NORM',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@FLPDRV: UNABLE TO F' + 1 //'IND FLUX NORMALIZATION FACTOR IN L_POWER.') + CALL LCMGET(IPPOW,'NORM',ZNRM) + CALL FLPTOT(IPFLX,IPKIN,IPTRK,NMIX,NGRP,NEL,NUN,VECT,FLUX,MAT, + 1 VOL,IDL,HFC,POWR,ZNRM,IMPX) + ELSE +* GIVEN TOTAL REACTOR POWER + POWR=DBLE(PTOT*10**6) + IF(PTOT.EQ.0.0)CALL XABORT('@FLPDRV: PTOT IS NOT DEFINED') + CALL FLPNRM(IPFLX,IPKIN,IPTRK,NMIX,NGRP,NEL,NUN,VECT,FLUX,MAT, + 1 VOL,IDL,HFC,POWR,ZNRM,IMPX) + CALL LCMPUT(IPPOW,'NORM',1,4,ZNRM) + ENDIF + DEALLOCATE(IDL) + CALL LCMPUT(IPPOW,'FLUX',NEL*NGRP,2,FLUX) + POWR=POWR/(10**6) + CALL LCMPUT(IPPOW,'PTOT',1,4,POWR) +*---- +* WHOLE REACTOR +*---- + ALLOCATE(FXYZ(NEL*NGRP),RAT(NEL*(NGRP-1))) +* FLUX DISTRIBUTION + IF(IGEO.EQ.7) THEN + CALL FLPFLX(NGRP,NEL,LX,LY,LZ,MAT,VOL,FLUX,FXYZ,RAT,VTOT,IMPX, + 1 LFLX,LRAT) + ELSEIF(IGEO.EQ.9) THEN + CALL FLPHFX(NGRP,NEL,LX,LZ,MAT,VOL,FLUX,FXYZ,RAT,VTOT,IMPX, + 1 LFLX,LRAT) + ENDIF + CALL LCMPUT(IPPOW,'VTOT',1,4,VTOT) + CALL LCMPUT(IPPOW,'FLUX-DISTR',NEL*NGRP,2,FXYZ) + IF(NGRP.GT.1) CALL LCMPUT(IPPOW,'FLUX-RATIO',NEL*(NGRP-1),2,RAT) + DEALLOCATE(RAT,FXYZ) +* POWER DISTRIBUTION + ALLOCATE(PXYZ(NEL)) + IF(IGEO.EQ.7) THEN + CALL FLPOWR(NMIX,NGRP,NEL,LX,LY,LZ,MAT,VOL,FLUX,HFC,PXYZ,VTOT, + 1 IMPX,LPOW) + ELSEIF(IGEO.EQ.9) THEN + CALL FLPHPW(NMIX,NGRP,NEL,LX,LZ,MAT,VOL,FLUX,HFC,PXYZ,VTOT, + 1 IMPX,LPOW) + ENDIF + CALL LCMPUT(IPPOW,'POWER-DISTR',NEL,2,PXYZ) + DEALLOCATE(PXYZ) + CALL LCMPUT(IPPOW,'K-EFFECTIVE',1,2,FKEFF) +*---- +* FUEL-MAP +*---- + IF((C_ASSOCIATED(IPMAP)).AND.(C_ASSOCIATED(IPMTX))) THEN + ALLOCATE(FMIX(NCH*NB),VMAP(NCH*NB),FMAP(NCH*NB*NGRP)) + CALL LCMGET(IPMAP,'FLMIX',FMIX) +* COMPUTE FLUXES + CALL FLPFLB(IPMTX,NTOT,NGRP,NEL,NCH,NB,FLUX,VOL,FMIX,VMAP,FMAP, + 1 IMPX,LMAP) + ALLOCATE(POWC(NCH),POWB(NCH*NB)) +* COMPUTE POWERS + CALL FLPOWB(IPPOW,IPMAP,IPMTX,NMIX,NTOT,NGRP,NCH,NB,NEL,MAT, + 1 VOL,HFC,FLUX,POWB,POWC,IMPX,POWR,FSTH,LFSTH,FMIX,FMAP,IGEO) + CALL LCMPUT(IPPOW,'POWER-CHAN',NCH,2,POWC) + CALL LCMPUT(IPPOW,'POWER-BUND',NCH*NB,2,POWB) + CALL LCMPUT(IPPOW,'FLUX',NEL*NGRP,2,FLUX) + CALL LCMPUT(IPPOW,'VOLU-BUND',NCH*NB,2,VMAP) + CALL LCMPUT(IPPOW,'FLUX-BUND',NCH*NB*NGRP,2,FMAP) + CALL LCMPUT(IPPOW,'FLMIX',NCH*NB,1,FMIX) + IF(JMOD.GE.1) THEN + CALL LCMPUT(IPMAP,'TOT-PW',1,2,PTOT) + CALL LCMPUT(IPMAP,'BUND-PW',NCH*NB,2,POWB) + CALL LCMPUT(IPMAP,'FLUX-AV',NCH*NB*NGRP,2,FMAP) + IF(JMOD.EQ.2) THEN + CALL LCMPUT(IPMAP,'BUND-PW-INI',NCH*NB,2,POWB) + ENDIF + PTOT=0.0 + DO I=1,NCH*NB + PTOT=PTOT+POWB(I) + ENDDO + PTOT=PTOT/1.0E3 + CALL LCMPUT(IPMAP,'REACTOR-PW',1,2,PTOT) + ENDIF + DEALLOCATE(POWB,POWC) + ENDIF + DEALLOCATE(VOL,MAT,FLUX,HFC) + + IF(LFLU) THEN +*---- +* STATE-VECTOR FOR L_FLUX OBJECT +*---- + IF(LNRM) THEN + ISTATE(:NSTATE)=0 + IF(C_ASSOCIATED(IPFLX)) THEN + CALL LCMGET(IPFLX,'STATE-VECTOR',ISTATE) + ELSE IF(C_ASSOCIATED(IPKIN)) THEN + ISTATE(1)=NGRP + ISTATE(2)=NUN + ENDIF + CALL LCMPUT(IPNFX,'STATE-VECTOR',NSTATE,1,ISTATE) + HSIGN='L_FLUX' + CALL LCMPTC(IPNFX,'SIGNATURE',12,HSIGN) + ALLOCATE(VECNR(NUN*NGRP)) + DO 10 I=1,NUN*NGRP + VECNR(I)=VECT(I)*REAL(ZNRM) + 10 CONTINUE + MPFLUX=LCMLID(IPNFX,'FLUX',NGRP) + DO 20 IGR=1,NGRP + IOFSET=(IGR-1)*NUN + CALL LCMPDL(MPFLUX,IGR,NUN,2,VECNR(IOFSET+1)) + 20 CONTINUE + DEALLOCATE(VECNR) + ELSE + MPFLUX=LCMLID(IPNFX,'FLUX',NGRP) + DO 30 IGR=1,NGRP + IOFSET=(IGR-1)*NB*NCH + CALL LCMPDL(MPFLUX,IGR,NB*NCH,2,FMAP(IOFSET+1)) + 30 CONTINUE + ENDIF + ENDIF + IF(C_ASSOCIATED(IPMAP)) DEALLOCATE(VMAP,FMAP,FMIX) + DEALLOCATE(VECT) +*---- +* STATE-VECTOR FOR L_FLUX OBJECT +*---- + IF(LFLU) THEN + ISTATE(:NSTATE)=0 + IF(C_ASSOCIATED(IPFLX)) THEN + CALL LCMGET(IPFLX,'STATE-VECTOR',ISTATE) + ELSE IF(C_ASSOCIATED(IPKIN)) THEN + ISTATE(1)=NGRP + ISTATE(2)=NUN + ENDIF + IF(LBUN) ISTATE(2)=NB*NCH + CALL LCMPUT(IPNFX,'STATE-VECTOR',NSTATE,1,ISTATE) + HSIGN='L_FLUX' + CALL LCMPTC(IPNFX,'SIGNATURE',12,HSIGN) + ENDIF +*---- +* STATE-VECTOR FOR L_POWER OBJECT +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NEL + ISTATE(3)=LX + ISTATE(4)=LY + ISTATE(5)=LZ + ISTATE(6)=NCH + ISTATE(7)=NB + ISTATE(8)=IGEO + CALL LCMPUT(IPPOW,'STATE-VECTOR',NSTATE,1,ISTATE) + HSIGN='L_POWER' + CALL LCMPTC(IPPOW,'SIGNATURE',12,HSIGN) + IF(IMPX.GT.1)CALL LCMLIB(IPPOW) + RETURN + END diff --git a/Donjon/src/FLPFLB.f b/Donjon/src/FLPFLB.f new file mode 100644 index 0000000..c6e3e2e --- /dev/null +++ b/Donjon/src/FLPFLB.f @@ -0,0 +1,163 @@ +*DECK FLPFLB
+ SUBROUTINE FLPFLB(IPMTX,NMAT,NGRP,NEL,NCH,NB,FLUX,VOL,FMIX,VOLB,
+ 1 FLXB,IMPX,LMAP)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute average fluxes per fuel bundle and other related quantities;
+* print bundle fluxes on file.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* IPMTX pointer to matex information.
+* NMAT total number of mixtures (includes virtual regions).
+* NGRP number of energy groups.
+* NEL total number of elements.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* FLUX normalized fluxes associated with each volume.
+* VOL element-ordered mesh-splitted volumes.
+* IMPX printing index (=0 for no print).
+* LMAP flux printing flag (=.true. print on file).
+* FMIX fuel bundle indices.
+*
+*Parameters: output
+* VOLB bundle volumes.
+* FLXB bundle fluxes.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMTX
+ INTEGER NMAT,NEL,NGRP,NCH,NB,IMPX,FMIX(NCH*NB)
+ REAL FLUX(NEL,NGRP),VOL(NEL),VOLB(NCH,NB),FLXB(NCH,NB,NGRP)
+ LOGICAL LMAP
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6,INIT=1)
+ INTEGER FMAT(NMAT)
+ CHARACTER TEXT*12,FNAM*12
+ REAL RATIO(NCH,NB,NGRP-1)
+ DOUBLE PRECISION FAVG(NGRP)
+*----
+* PERFORM CALCULATION
+*----
+ FMAX=0.
+ ICM=0
+ IBM=0
+ MGR=0
+ FAVG(:NGRP)=0.0D0
+ FMAT(:NMAT)=0
+ CALL LCMGET(IPMTX,'MAT',FMAT)
+ FLXB(:NCH,:NB,:NGRP)=0.0
+ IF(IMPX.GT.0)WRITE(IOUT,1004)
+ NTOT=0
+ VTOT=0.0
+ DO 45 IB=1,NB
+ DO 40 ICH=1,NCH
+ NUM=(IB-1)*NCH+ICH
+ VOLB(ICH,IB)=0.0
+ IF(FMIX(NUM).EQ.0) GO TO 40
+ NTOT=NTOT+1
+ DO 20 IEL=1,NEL
+ IF(FMAT(IEL).NE.-NTOT)GOTO 20
+ DO 10 JGR=1,NGRP
+ FLXB(ICH,IB,JGR)=FLXB(ICH,IB,JGR)+FLUX(IEL,JGR)*VOL(IEL)
+ 10 CONTINUE
+ VOLB(ICH,IB)=VOLB(ICH,IB)+VOL(IEL)
+ 20 CONTINUE
+ DO JGR=1,NGRP
+ FLXB(ICH,IB,JGR)=FLXB(ICH,IB,JGR)/VOLB(ICH,IB)
+ IF(ABS(FLXB(ICH,IB,JGR)).GT.FMAX)THEN
+ FMAX=FLXB(ICH,IB,JGR)
+ ICM=ICH
+ IBM=IB
+ MGR=JGR
+ ENDIF
+ FAVG(JGR)=FAVG(JGR)+FLXB(ICH,IB,JGR)*VOLB(ICH,IB)
+ ENDDO
+ VTOT=VTOT+VOLB(ICH,IB)
+ 40 CONTINUE
+ 45 CONTINUE
+* MAX AND CORE-AVERAGE FLUXES
+ IF(IMPX.GT.0)WRITE(IOUT,1007)FMAX,ICM,IBM,MGR
+ DO JGR=1,NGRP
+ FAVG(JGR)=FAVG(JGR)/VTOT
+ IF(IMPX.GT.0)WRITE(IOUT,1008)FAVG(JGR),JGR
+ ENDDO
+* FORM FACTOR
+ IF(MGR.EQ.0) CALL XABORT('FLPFLB: FLUX NORMALIZATION FAILURE.')
+ FACT=REAL(FAVG(MGR))/FMAX
+ FACT2=1./FACT
+ IF(IMPX.GT.0)WRITE(IOUT,1009)MGR,FACT,FACT2,VTOT
+* FLUXES RATIOS
+ RATIO(:NCH,:NB,:NGRP-1)=0.0
+ DO 52 IB=1,NB
+ DO 51 ICH=1,NCH
+ DO 50 JGR=1,NGRP-1
+ RATIO(ICH,IB,JGR)=FLXB(ICH,IB,JGR)/FLXB(ICH,IB,NGRP)
+ 50 CONTINUE
+ 51 CONTINUE
+ 52 CONTINUE
+ IF(.NOT.LMAP)GOTO 80
+*----
+* PRINTING
+*----
+ FNAM='FluxMAP.res'
+ OPEN(UNIT=INIT,FILE=FNAM,STATUS='UNKNOWN')
+ WRITE(INIT,1000)NCH,NB,NGRP
+ DO 65 JGR=1,NGRP
+ WRITE(INIT,1001)JGR
+ DO 60 ICH=1,NCH
+ WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH
+ WRITE(INIT,1002)TEXT
+ WRITE(INIT,1003)(FLXB(ICH,IB,JGR),IB=1,NB)
+ 60 CONTINUE
+ 65 CONTINUE
+ WRITE(INIT,1010)
+ DO 75 JGR=1,NGRP-1
+ WRITE(INIT,1011)JGR,NGRP
+ DO 70 ICH=1,NCH
+ WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH
+ WRITE(INIT,1002)TEXT
+ WRITE(INIT,1012)(RATIO(ICH,IB,JGR),IB=1,NB)
+ 70 CONTINUE
+ 75 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1006)FNAM
+ 80 RETURN
+*
+ 1000 FORMAT(/20X,5('*'),3X,'AVERAGE FUEL-BUNDLES ',
+ 1 'FLUXES',3X,5('*')//5X,'NUMBER OF CHANNELS:',
+ 2 1X,I3,4X,'NUMBER OF BUNDLES:',1X,I2,4X,
+ 3 'NUMBER OF GROUPS:',I2)
+ 1001 FORMAT(//18X,'ENERGY GROUP =>',1X,I2.2)
+ 1002 FORMAT(/1X,A12)
+ 1003 FORMAT(6(1P,E15.8))
+ 1004 FORMAT(/1X,'** COMPUTING AVERAGE',1X,'BUNDLE FLUXES **'/)
+ 1006 FORMAT(/1X,'PRINTING BUNDLE FLUXES ON FILE:',
+ 1 1X,'<',A11,'>',3X,'=>',2X,'DONE.')
+ 1007 FORMAT(1X,'MAX FLUX =',1P,E13.6,2X,'=>',
+ 1 2X,'CHANNEL #',I3.3,2X,'BUNDLE #',I2.2,
+ 2 2X,'GROUP #',I2.2/)
+ 1008 FORMAT(1X,'FUEL-ZONE AVERAGE FLUX =',
+ 1 1P,E13.6,3X,'=>',2X,'GROUP #',I2.2)
+ 1009 FORMAT(/1X,'FLUX-FORM FACTOR FOR GROUP #',I2.2,
+ 1 2X,'=>',2X,'AVG/MAX = ',F8.4,2X,'(MAX/AVG = ',
+ 2 F8.4,')'/' FUEL-ZONE VOLUME =',1P,E13.6,' CM3'/)
+ 1010 FORMAT(//16X,5('*'),3X,'FUEL-BUNDLES',
+ 1 1X,'FLUXES RATIOS',3X,5('*')/)
+ 1011 FORMAT(/18X,'FLUX RATIO: GROUP #',I2.2,
+ 1 1X,'=>',1X,'GROUP #',I2.2)
+ 1012 FORMAT(6(1P,E13.6))
+ END
diff --git a/Donjon/src/FLPFLX.f b/Donjon/src/FLPFLX.f new file mode 100644 index 0000000..85c08ff --- /dev/null +++ b/Donjon/src/FLPFLX.f @@ -0,0 +1,168 @@ +*DECK FLPFLX
+ SUBROUTINE FLPFLX(NGRP,NEL,LX,LY,LZ,MAT,VOL,FLUX,FXYZ,RATIO,VTOT,
+ 1 IMPX,LFLX,LRAT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the flux distributions and ratios over the whole reactor core;
+* print the normalized fluxes on files.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* NGRP total number of energy groups.
+* NEL total number of finite elements.
+* LX number of elements along x-axis.
+* LY number of elements along y-axis.
+* LZ number of elements along z-axis.
+* MAT index-number of mixture assigned to each volume.
+* VOL element-ordered mesh-splitted volumes.
+* FLUX normalized fluxes associated with each volume.
+* IMPX screen printing index (=0 for no print).
+* LFLX fluxes printing flag: =.true. print on files.
+* LRAT ratios printing flag: =.true. print on files.
+*
+*Parameters: output
+* FXYZ mesh-ordered fluxes.
+* RATIO fluxes ratios with respect to thermal fluxes.
+* VTOT total reactor-core volume.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NGRP,NEL,LX,LY,LZ,MAT(NEL),IMPX
+ REAL FXYZ(LX,LY,LZ,NGRP),FLUX(NEL,NGRP),
+ 1 RATIO(LX,LY,LZ,NGRP-1),VOL(NEL)
+ DOUBLE PRECISION VTOT
+ LOGICAL LFLX,LRAT
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6,INIT=1)
+ CHARACTER TEXT*12
+ DOUBLE PRECISION FAVG(NGRP)
+*----
+* PERFORM CALCULATION
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1010)
+ FMAX=0.
+ IM=0
+ KM=0
+ MGR=0
+ VTOT=0.0D0
+ FAVG(:NGRP)=0.0D0
+ FXYZ(:LX,:LY,:LZ,:NGRP)=0.0
+ IEL=0
+ DO 12 K=1,LZ
+ DO 11 J=1,LY
+ DO 10 I=1,LX
+ IEL=IEL+1
+ IF(MAT(IEL).EQ.0)GOTO 10
+ VTOT=VTOT+VOL(IEL)
+ DO JGR=1,NGRP
+ FXYZ(I,J,K,JGR)=FLUX(IEL,JGR)
+ IF(ABS(FXYZ(I,J,K,JGR)).GT.FMAX)THEN
+ FMAX=FXYZ(I,J,K,JGR)
+ IM=I
+ JM=J
+ KM=K
+ MGR=JGR
+ ENDIF
+ FAVG(JGR)=FAVG(JGR)+FXYZ(I,J,K,JGR)*VOL(IEL)
+ ENDDO
+ 10 CONTINUE
+ 11 CONTINUE
+ 12 CONTINUE
+* MAX AND CORE-AVERAGE FLUXES
+ IF(IMPX.GT.0)WRITE(IOUT,1000)FMAX,IM,JM,KM,MGR
+ DO JGR=1,NGRP
+ FAVG(JGR)=FAVG(JGR)/VTOT
+ IF(IMPX.GT.0)WRITE(IOUT,1001)FAVG(JGR),JGR
+ ENDDO
+ IF(MGR.EQ.0) CALL XABORT('FLPFLX: FLUX NORMALIZATION FAILURE.')
+ FACT=REAL(FAVG(MGR))/FMAX
+ FACT2=1./FACT
+ IF(IMPX.GT.0)WRITE(IOUT,1002)MGR,FACT,FACT2,VTOT
+* FLUXES RATIOS
+ RATIO(:LX,:LY,:LZ,:NGRP-1)=0.0
+ DO 32 K=1,LZ
+ DO 31 J=1,LY
+ DO 30 I=1,LX
+ IF(FXYZ(I,J,K,NGRP).EQ.0.)GOTO 30
+ DO 20 JGR=1,NGRP-1
+ RATIO(I,J,K,JGR)=FXYZ(I,J,K,JGR)/FXYZ(I,J,K,NGRP)
+ 20 CONTINUE
+ 30 CONTINUE
+ 31 CONTINUE
+ 32 CONTINUE
+ IF(.NOT.LFLX)GOTO 60
+*----
+* PRINTING
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1006)
+* FLUXES
+ DO 50 JGR=1,NGRP
+ WRITE(TEXT,'(A4,I2.2,A4)')'Flux',JGR,'.res'
+ OPEN(UNIT=INIT,FILE=TEXT,STATUS='UNKNOWN')
+ WRITE(INIT,1011)LX,LY,LZ,JGR
+ DO 40 K=1,LZ
+ DO J=1,LY
+ WRITE(INIT,1009)J,K
+ WRITE(INIT,1005) (FXYZ(I,J,K,JGR),I=1,LX)
+ ENDDO
+ 40 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1003)JGR,TEXT
+ 50 CONTINUE
+*
+ 60 IF(.NOT.LRAT)GOTO 90
+ IF(IMPX.GT.0)WRITE(IOUT,1007)
+* RATIOS
+ DO 80 JGR=1,NGRP-1
+ WRITE(TEXT,'(A4,I2.2,A4)')'Rati',JGR,'.res'
+ OPEN(UNIT=INIT,FILE=TEXT,STATUS='UNKNOWN')
+ WRITE(INIT,1012)JGR,NGRP,LX,LY,LZ
+ DO 70 K=1,LZ
+ DO J=1,LY
+ WRITE(INIT,1009)J,K
+ WRITE(INIT,1008) (RATIO(I,J,K,JGR),I=1,LX)
+ ENDDO
+ 70 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1004)JGR,NGRP,TEXT
+ 80 CONTINUE
+ 90 RETURN
+*
+ 1000 FORMAT(1X,'MAX FLUX =',1P,E13.6,4X,'AT COORD :',1X,
+ 1 'I =',I3,2X,'J =',I3,2X,'K =',I3,2X,'GROUP #',I2.2/)
+ 1001 FORMAT(1X,'CORE-AVERAGE FLUX =',1P,E13.6,
+ 1 2X,'=>',2X,'GROUP #',I2.2)
+ 1002 FORMAT(/1X,'OVERALL FLUX-FORM FACTOR FOR GROUP #',I2.2,
+ 1 2X,'=>',2X,'AVG/MAX =',1X,F8.4,2X,'(MAX/AVG = ',F8.4,
+ 2 ')'/1X,'TOTAL CORE VOLUME =',1P,E13.6,1X,'CM3'/)
+ 1003 FORMAT(1X,'FLUXES',2X,'=>',2X,'GROUP #',I2.2,2X,
+ 1 '=>',2X,'FILE NAME: <',A10,'>',2X,'=>',2X,'DONE.')
+ 1004 FORMAT(1X,'FLUX RATIOS',2X,'=>',2X,'GR.#',I2.2,
+ 1 '/GR.#',I2.2,2X,'=>',2X,'FILE NAME: <',A10,'>',
+ 1 2X,'=>',2X,'DONE.')
+ 1005 FORMAT(1X,1P,6E16.8)
+ 1006 FORMAT(/15X,'** PRINTING OF FLUXES ON FILES **'/)
+ 1007 FORMAT(/15X,'** PRINTING OF RATIOS ON FILES **'/)
+ 1008 FORMAT(1X,1P,6E14.6)
+ 1009 FORMAT(//3X,'PLANE-Y #',I2.2,5X,'PLANE-Z #',I2.2/)
+ 1010 FORMAT(/1X,'** COMPUTING FLUX-DISTRIBUTION',
+ 1 1X,'OVER THE REACTOR CORE **'/)
+ 1011 FORMAT(/10X,5('*'),3X,'FLUX-DISTRIBUTION OVER THE',
+ 1 1X,'REACTOR CORE',3X,5('*')//21X,'NX=',I2,',',2X,
+ 2 'NY=',I2,',',2X,'NZ=',I2,',',2X,'GROUP #',I2.2)
+ 1012 FORMAT(/10X,5('*'),3X,'FLUXES RATIO',1X,'#',I2.2,
+ 1 '/#',I2.2,1X,'OVER THE REACTOR CORE',3X,5('*')//
+ 2 25X,'NX=',I2,',',2X,'NY=',I2,',',2X,'NZ=',I2)
+ END
diff --git a/Donjon/src/FLPHFX.f b/Donjon/src/FLPHFX.f new file mode 100644 index 0000000..17268f7 --- /dev/null +++ b/Donjon/src/FLPHFX.f @@ -0,0 +1,161 @@ +*DECK FLPHFX
+ SUBROUTINE FLPHFX(NGRP,NEL,LX,LZ,MAT,VOL,FLUX,FXYZ,RATIO,VTOT,
+ 1 IMPX,LFLX,LRAT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the flux distributions and ratios over the whole reactor core;
+* print the normalized fluxes on files.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Update(s):
+* V. Descotes 5/06/2010
+*
+*Parameters: input
+* NGRP total number of energy groups.
+* NEL total number of finite elements.
+* LX number of hexagons.
+* LZ number of elements along z-axis.
+* MAT index-number of mixture assigned to each volume.
+* VOL element-ordered mesh-splitted volumes.
+* FLUX normalized fluxes associated with each volume.
+* IMPX screen printing index (=0 for no print).
+* LFLX fluxes printing flag: =.true. print on files.
+* LRAT ratios printing flag: =.true. print on files.
+*
+*Parameters: output
+* FXYZ mesh-ordered fluxes.
+* RATIO fluxes ratios with respect to thermal fluxes.
+* VTOT total reactor-core volume.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NGRP,NEL,LX,LZ,MAT(NEL),IMPX
+ REAL FXYZ(LX,LZ,NGRP),FLUX(NEL,NGRP),
+ 1 RATIO(LX,LZ,NGRP-1),VOL(NEL)
+ DOUBLE PRECISION VTOT
+ LOGICAL LFLX,LRAT
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6,INIT=1)
+ CHARACTER TEXT*12
+ DOUBLE PRECISION FAVG(NGRP)
+*----
+* PERFORM CALCULATION
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1010)
+ FMAX=0.
+ IM=0
+ KM=0
+ MGR=0
+ VTOT=0.0D0
+ FAVG(:NGRP)=0.0D0
+ FXYZ(:LX,:LZ,:NGRP)=0.0
+ IEL=0
+ DO 15 K=1,LZ
+ DO 10 I=1,LX
+ IEL=IEL+1
+ IF(MAT(IEL).EQ.0)GOTO 10
+ VTOT=VTOT+VOL(IEL)
+ DO JGR=1,NGRP
+ FXYZ(I,K,JGR)=FLUX(IEL,JGR)
+ IF(ABS(FXYZ(I,K,JGR)).GT.FMAX)THEN
+ FMAX=FXYZ(I,K,JGR)
+ IM=I
+ KM=K
+ MGR=JGR
+ ENDIF
+ FAVG(JGR)=FAVG(JGR)+FXYZ(I,K,JGR)*VOL(IEL)
+ ENDDO
+ 10 CONTINUE
+ 15 CONTINUE
+* MAX AND CORE-AVERAGE FLUXES
+ IF(IMPX.GT.0)WRITE(IOUT,1000)FMAX,IM,KM,MGR
+ DO JGR=1,NGRP
+ FAVG(JGR)=FAVG(JGR)/VTOT
+ IF(IMPX.GT.0)WRITE(IOUT,1001)FAVG(JGR),JGR
+ ENDDO
+ IF(MGR.EQ.0) CALL XABORT('FLPHFX: FLUX NORMALIZATION FAILURE.')
+ FACT=REAL(FAVG(MGR))/FMAX
+ FACT2=1./FACT
+ IF(IMPX.GT.0)WRITE(IOUT,1002)MGR,FACT,FACT2,VTOT
+* FLUXES RATIOS
+ RATIO(:LX,:LZ,:NGRP-1)=0.0
+ DO 35 K=1,LZ
+ DO 30 I=1,LX
+ IF(FXYZ(I,K,NGRP).EQ.0.)GOTO 30
+ DO 20 JGR=1,NGRP-1
+ RATIO(I,K,JGR)=FXYZ(I,K,JGR)/FXYZ(I,K,NGRP)
+ 20 CONTINUE
+ 30 CONTINUE
+ 35 CONTINUE
+ IF(.NOT.LFLX)GOTO 60
+*----
+* PRINTING
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1006)
+* FLUXES
+ DO 50 JGR=1,NGRP
+ WRITE(TEXT,'(A4,I2.2,A4)')'Flux',JGR,'.res'
+ OPEN(UNIT=INIT,FILE=TEXT,STATUS='UNKNOWN')
+ WRITE(INIT,1011)LX,LZ,JGR
+ DO 40 K=1,LZ
+ WRITE(INIT,1009)K
+ WRITE(INIT,1005) (FXYZ(I,K,JGR),I=1,LX)
+ 40 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1003)JGR,TEXT
+ 50 CONTINUE
+*
+ 60 IF(.NOT.LRAT)GOTO 90
+ IF(IMPX.GT.0)WRITE(IOUT,1007)
+* RATIOS
+ DO 80 JGR=1,NGRP-1
+ WRITE(TEXT,'(A4,I2.2,A4)')'Rati',JGR,'.res'
+ OPEN(UNIT=INIT,FILE=TEXT,STATUS='UNKNOWN')
+ WRITE(INIT,1012)JGR,NGRP,LX,LZ
+ DO 70 K=1,LZ
+ WRITE(INIT,1009)K
+ WRITE(INIT,1008) (RATIO(I,K,JGR),I=1,LX)
+ 70 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1004)JGR,NGRP,TEXT
+ 80 CONTINUE
+ 90 RETURN
+*
+ 1000 FORMAT(1X,'MAX FLUX =',1X,1PE12.6,4X,'AT COORD :',1X,
+ 1 'HEX # =',I3,2X,'K =',I3,2X,'GROUP #',I2.2/)
+ 1001 FORMAT(1X,'CORE-AVERAGE FLUX =',1X,1PE12.6,
+ 1 2X,'=>',2X,'GROUP #',I2.2)
+ 1002 FORMAT(/1X,'OVERALL FLUX-FORM FACTOR FOR GROUP #',I2.2,
+ 1 2X,'=>',2X,'AVG/MAX =',1X,F8.4,2X,'(MAX/AVG = ',F8.4,
+ 2 ')'/1X,'TOTAL CORE VOLUME =',1X,1PE12.6,1X,'CM3'/)
+ 1003 FORMAT(1X,'FLUXES',2X,'=>',2X,'GROUP #',I2.2,2X,
+ 1 '=>',2X,'FILE NAME: <',A10,'>',2X,'=>',2X,'DONE.')
+ 1004 FORMAT(1X,'FLUX RATIOS',2X,'=>',2X,'GR.#',I2.2,
+ 1 '/GR.#',I2.2,2X,'=>',2X,'FILE NAME: <',A10,'>',
+ 1 2X,'=>',2X,'DONE.')
+ 1005 FORMAT(1X,1P,6E16.8)
+ 1006 FORMAT(/15X,'** PRINTING OF FLUXES ON FILES **'/)
+ 1007 FORMAT(/15X,'** PRINTING OF RATIOS ON FILES **'/)
+ 1008 FORMAT(1X,1P,6E14.6)
+ 1009 FORMAT(//5X,'PLANE-Z #',I2.2/)
+ 1010 FORMAT(/1X,'** COMPUTING FLUX-DISTRIBUTION',
+ 1 1X,'OVER THE REACTOR CORE (HEXAGONAL GEOMETRY) **'/)
+ 1011 FORMAT(/10X,5('*'),3X,'FLUX-DISTRIBUTION OVER THE',
+ 1 1X,'REACTOR CORE',3X,5('*')//21X,'HEX#=',I2,',',2X,
+ 2 'NZ=',I2,',',2X,'GROUP #',I2.2)
+ 1012 FORMAT(/10X,5('*'),3X,'FLUXES RATIO',1X,'#',I2.2,
+ 1 '/#',I2.2,1X,'OVER THE REACTOR CORE',3X,5('*')//
+ 2 25X,'HEX # =',I2,',',2X,'NZ=',I2)
+ END
diff --git a/Donjon/src/FLPHPR.f b/Donjon/src/FLPHPR.f new file mode 100644 index 0000000..fd46631 --- /dev/null +++ b/Donjon/src/FLPHPR.f @@ -0,0 +1,188 @@ +*DECK FLPHPR
+ SUBROUTINE FLPHPR(IPMAP,NCH,NB,NX,NZ,POWB,PBNM,ICHM,IBNM,POWC,
+ 1 PCHM,BAVG,BFACT,CAVG,CFACT,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Print the bundle and channel powers over the fuel lattice. Adapted
+* from FLPRNT.
+*
+*Copyright:
+* Copyright (C) 2010 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* V. Descotes
+*
+*Parameters: input/output
+* IPMAP pointer to fuel-map information.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* NX number of elements along x-axis.
+* NZ number of elements along z-axis.
+* POWB bundle powers in kW.
+* PBNM maximum bundle power.
+* ICHM maximum-power channel number.
+* IBNM maximum-power bundle number.
+* POWC channel powers in kW.
+* PCHM maximum channel power.
+* BAVG average bundle power.
+* BFACT bundle power-form factor.
+* CAVG average channel power.
+* CFACT channel power-form factor.
+* IMPX printing index: 0 = no print
+* 1 = minimal printing
+* 2 = channel power only
+* 3 = bundle power by plane only
+* 10 = bundle power by channel
+* any added values of 2, 3 and 10: 5,12,13,15
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAP
+ INTEGER NCH,NB,NX,NZ,ICHM,IBNM,IMPX
+ REAL POWB(NCH,NB),POWC(NCH),PBNM,PCHM
+ DOUBLE PRECISION BAVG,CAVG,BFACT
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ REAL RADB(NX,NB),RADC(NX)
+ INTEGER MIX(NX,NZ)
+ CHARACTER TEXT*12
+*
+ MIX(:NX,:NZ)=0
+ CALL LCMGET(IPMAP,'BMIX',MIX)
+*----
+* BUNDLE POWERS OVER EACH CHANNEL
+*----
+ WRITE(IOUT,1009)
+ IEL=0
+ ICH=0
+ DO 10 I=1,NX
+ IEL=IEL+1
+ DO 5 K=1,NZ
+ IF(MIX(IEL,K).NE.0)GOTO 6
+ 5 CONTINUE
+ GO TO 10
+ 6 ICH=ICH+1
+ IF(IMPX.GE.10) THEN
+ WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH
+ WRITE(IOUT,1000)TEXT,POWC(ICH)
+ IF(PBNM.LT.1.)THEN
+ WRITE(IOUT,'(1X,1P,12E11.4)')(POWB(ICH,IB),IB=1,NB)
+ ELSE IF(PBNM.LT.1000.)THEN
+ WRITE(IOUT,'(1X,12F11.3)')(POWB(ICH,IB),IB=1,NB)
+ ELSE
+ WRITE(IOUT,'(1X,12F11.1)')(POWB(ICH,IB),IB=1,NB)
+ ENDIF
+ ENDIF
+ 10 CONTINUE
+*
+ IF((IMPX.LT.3).OR.((IMPX.GE.10).AND.(IMPX.LT.13)))GOTO 50
+*----
+* BUNDLE POWERS PER RADIAL PLANE
+*----
+ RADB(:NX,:NB)=0.0
+ WRITE(IOUT,1010)
+ DO IB=1,NB
+ IEL=0
+ ICH=0
+ DO 20 I=1,NX
+ IEL=IEL+1
+ DO 15 K=1,NZ
+ IF(MIX(IEL,K).NE.0)GOTO 16
+ 15 CONTINUE
+ GO TO 20
+ 16 ICH=ICH+1
+ RADB(I,IB)=POWB(ICH,IB)
+ 20 CONTINUE
+ ENDDO
+ DO IB=1,NB
+ WRITE(IOUT,1011)IB
+ ENDDO
+ 50 IF((IMPX.EQ.0).OR.(IMPX.EQ.1).OR.(IMPX.EQ.3).OR.(IMPX.EQ.4)
+ 1 .OR.(IMPX.EQ.10).OR.(IMPX.EQ.11).OR.(IMPX.EQ.13).OR.(IMPX.EQ.14))
+ 2 GOTO 90
+*----
+* CHANNEL POWERS IN RADIAL PLANE
+*----
+ RADC(:NX)=0.0
+ WRITE(IOUT,1013)
+ IEL=0
+ ICH=0
+ DO 60 I=1,NX
+ IEL=IEL+1
+ DO 55 K=1,NZ
+ IF(MIX(IEL,K).NE.0)GOTO 56
+ 55 CONTINUE
+ GO TO 60
+ 56 ICH=ICH+1
+ RADC(I)=POWC(ICH)
+ 60 CONTINUE
+ WRITE(IOUT,*)' '
+*----
+* FINAL INFORMATION
+*----
+ 90 WRITE(IOUT,1002)
+ IF(PBNM.LT.1000.)THEN
+ WRITE(IOUT,1003)PBNM,IBNM
+ ELSE
+ WRITE(IOUT,1016)PBNM,ICHM,IBNM
+ ENDIF
+ IF(BAVG.LT.1000.)THEN
+ WRITE(IOUT,1005)BAVG
+ ELSE
+ WRITE(IOUT,1017)BAVG
+ ENDIF
+ FACT=1./REAL(BFACT)
+ WRITE(IOUT,1006)BFACT,FACT
+ IF(PCHM.LT.10000.)THEN
+ WRITE(IOUT,1004)PCHM,ICHM
+ ELSE
+ WRITE(IOUT,1018)PCHM,ICHM
+ ENDIF
+ IF(CAVG.LT.10000.)THEN
+ WRITE(IOUT,1007)CAVG
+ ELSE
+ WRITE(IOUT,1019)CAVG
+ ENDIF
+ FACT=1./CFACT
+ WRITE(IOUT,1008)CFACT,FACT
+ RETURN
+*
+ 1000 FORMAT(/5X,A12,5X,'CHANNEL POWER =',1X,1P,E11.4,'kW')
+ 1002 FORMAT(/5X,5('--o--',6X)/)
+ 1003 FORMAT(/1X,'MAXIMUM BUNDLE POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'BUNDLE #',I2.2)
+ 1004 FORMAT(/1X,'MAXIMUM CHANNEL POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL #',I2,3X)
+ 1005 FORMAT(1X,'AVERAGE POWER OVER ALL BUNDLES',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1006 FORMAT(1X,'BUNDLE-POWER FORM FACTOR',2X,'=>',2X,
+ 1 'AVG/MAX =',1X,F8.4,3X,'(MAX/AVG = ',F8.4,')')
+ 1007 FORMAT(1X,'AVERAGE POWER OVER ALL CHANNELS',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1008 FORMAT(1X,'CHANNEL-POWER FORM FACTOR',2X,'=>',2X,
+ 1 'AVG/MAX =',1X,F8.4,2X,'(MAX/AVG = ',F8.4,')'/)
+ 1009 FORMAT(/20X,'** BUNDLE POWERS OVER EACH',
+ 1 1X,'CHANNEL (kW) **'/)
+ 1010 FORMAT(//20X,'** BUNDLE POWERS PER RADIAL',
+ 1 1X,'PLANE **'/)
+ 1011 FORMAT(//1X,'BUNDLE POWERS',1X,'(kW)',1X,
+ 1 '=>',1X,'RADIAL PLANE',1X,'#',I2.2/)
+ 1013 FORMAT(//20X,'** CHANNEL POWERS IN RADIAL',
+ 1 1X,'PLANE (kW) **'/)
+ 1016 FORMAT(/1X,'MAXIMUM BUNDLE POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL #',1X,I2,3X,'BUNDLE #',I2.2)
+ 1017 FORMAT(1X,'AVERAGE POWER OVER ALL BUNDLES',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1018 FORMAT(/1X,'MAXIMUM CHANNEL POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL #',1X,I2)
+ 1019 FORMAT(1X,'AVERAGE POWER OVER ALL CHANNELS',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ END
diff --git a/Donjon/src/FLPHPW.f b/Donjon/src/FLPHPW.f new file mode 100644 index 0000000..3ea0bbc --- /dev/null +++ b/Donjon/src/FLPHPW.f @@ -0,0 +1,116 @@ +*DECK FLPHPW
+ SUBROUTINE FLPHPW(NMIX,NGRP,NEL,LX,LZ,MAT,VOL,FLUX,HFAC,PXYZ,
+ 1 VTOT,IMPX,LPOW)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute and print a power distribution over the whole reactor core
+* in hexagonal geometry.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Update(s):
+* V. Descotes 5/06/2010
+*
+*Parameters: input
+* NMIX maximum number of material mixtures.
+* NGRP total number of energy groups.
+* NEL total number of finite elements.
+* LX number of hexagons.
+* LZ number of elements along z-axis.
+* FLUX normalized fluxes associated with each volume.
+* MAT index-number of mixture assigned to each volume.
+* VOL element-ordered mesh-splitted volumes.
+* HFAC h-factors over the reactor core.
+* VTOT total reactor core volume.
+* IMPX printing index (=0 for no print).
+* LPOW file printing flag: =.true. print on file.
+*
+*Parameters: output
+* PXYZ power distribution over the reactor core.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NGRP,NMIX,NEL,LX,LZ,MAT(NEL),IMPX
+ REAL FLUX(NEL,NGRP),VOL(NEL),HFAC(NMIX,NGRP),PXYZ(LX,LZ)
+ DOUBLE PRECISION VTOT
+ LOGICAL LPOW
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6,INIT=1)
+ DOUBLE PRECISION PTOT,XDRCST,EVJ
+ CHARACTER TEXT*12
+*----
+* CHECK TOTAL POWER
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1005)
+ EVJ=XDRCST('eV','J')
+ PTOT=0.0D0
+ DO 20 IEL=1,NEL
+ IF(MAT(IEL).EQ.0)GOTO 20
+ DO 10 JGR=1,NGRP
+ PTOT=PTOT+FLUX(IEL,JGR)*VOL(IEL)*HFAC(MAT(IEL),JGR)*EVJ
+ 10 CONTINUE
+ 20 CONTINUE
+ PAVG=REAL(PTOT/VTOT)
+ IF(IMPX.GT.0)WRITE(IOUT,1001)PTOT,PAVG
+*----
+* PERFORM CALCULATION
+*----
+ PXYZ(:LX,:LZ)=0.0
+ IEL=0
+ PMAX=0.
+ DO 55 K=1,LZ
+ DO 50 I=1,LX
+ IEL=IEL+1
+ IF(MAT(IEL).EQ.0)GOTO 50
+ DO 40 JGR=1,NGRP
+ PXYZ(I,K)=PXYZ(I,K)+
+ 1 HFAC(MAT(IEL),JGR)*FLUX(IEL,JGR)*VOL(IEL)*REAL(EVJ)
+ 40 CONTINUE
+ IF(PXYZ(I,K).GT.PMAX)THEN
+ PMAX=PXYZ(I,K)
+ IMX=I
+ KMX=K
+ ENDIF
+ 50 CONTINUE
+ 55 CONTINUE
+ IF(IMPX.GT.0)WRITE(IOUT,1000)PMAX,IMX,KMX
+ IF(.NOT.LPOW)GOTO 70
+*----
+* PRINTING
+*----
+ TEXT='Pdistr.res'
+ OPEN(UNIT=INIT,FILE=TEXT,STATUS='UNKNOWN')
+ WRITE(INIT,1008)LX,LZ
+ DO 60 K=1,LZ
+ WRITE(INIT,1007)K
+ WRITE(INIT,1002) (PXYZ(I,K),I=1,LX)
+ 60 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1006)TEXT
+ 70 RETURN
+*
+ 1000 FORMAT(/1X,'MAX POWER =',1P,E13.6,1X,'WATTS',4X,
+ 1 'AT COORD :',1X,'HEX # =',I3,2X,'K =',I3/)
+ 1001 FORMAT(1X,'COMPUTED TOTAL POWER :',1P,E15.8,1X,'WATTS'/
+ 1 1X,'MEAN POWER DENSITY',3X,':',1P,E15.8,1X,'WATTS/CM3')
+ 1002 FORMAT(6(1P,E15.8))
+ 1005 FORMAT(/1X,'** COMPUTING POWER-DISTRIBUTION OVER',
+ 1 1X,'THE REACTOR CORE (HEXAGONAL GEOMETRY) **'/)
+ 1006 FORMAT(/1X,'PRINTING POWER-DISTRIBUTION ON FILE:',
+ 1 1X,'<',A10,'>',3X,'=>',2X,'DONE.')
+ 1007 FORMAT(//3X,'PLANE-Z #',I2.2/)
+ 1008 FORMAT(/10X,5('*'),3X,'POWER-DISTRIBUTION OVER THE',
+ 1 1X,'REACTOR CORE',3X,5('*')//25X,'NHEX=',I2,',',
+ 2 2X,'NZ=',I2)
+ END
diff --git a/Donjon/src/FLPNRM.f b/Donjon/src/FLPNRM.f new file mode 100644 index 0000000..d22c3e5 --- /dev/null +++ b/Donjon/src/FLPNRM.f @@ -0,0 +1,104 @@ +*DECK FLPNRM + SUBROUTINE FLPNRM(IPFLX,IPKIN,IPTRK,NMIX,NGRP,NEL,NUN,EVECT,FLUX, + 1 MAT,VOL,IDL,HFAC,PTOT,ZNRM,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover element-ordered fluxes associated with each mesh-splitted +* volume over the whole reactor core, normalize fluxes to a given +* total reactor power. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPFLX pointer to flux information. +* IPKIN pointer to kinetics information. +* IPTRK pointer to tracking information. +* NMIX maximum number of material mixtures. +* NGRP total number of energy groups. +* NEL total number of finite elements. +* NUN total number of unknowns per group. +* HFAC h-factors over the reactor core. +* PTOT given total reactor power in watts. +* IMPX printing index (=0 for no print). +* +*Parameters: output +* FLUX normalized fluxes associated with each volume. +* MAT index-number of mixture assigned to each volume. +* VOL element-ordered mesh-splitted volumes. +* ZNRM flux normalization factor. +* +*Parameters: scratch +* EVECT +* IDL +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPFLX,IPKIN,IPTRK + INTEGER NUN,NEL,NGRP,NMIX,IMPX,IDL(NEL),MAT(NEL) + REAL FLUX(NEL,NGRP),EVECT(NUN,NGRP),HFAC(NMIX,NGRP),VOL(NEL) + DOUBLE PRECISION ZNRM,PTOT +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + TYPE(C_PTR) JPFLX + DOUBLE PRECISION XDRCST,EVJ +*---- +* RECOVER INFORMATION +*---- + EVECT(:NUN,:NGRP)=0.0 + IF(C_ASSOCIATED(IPFLX)) THEN +* L_FLUX object + JPFLX=LCMGID(IPFLX,'FLUX') + DO 10 JGR=1,NGRP + CALL LCMGDL(JPFLX,JGR,EVECT(1,JGR)) + 10 CONTINUE + ELSE IF(C_ASSOCIATED(IPKIN)) THEN +* L_KINET object + CALL LCMGET(IPKIN,'E-VECTOR',EVECT) + ENDIF +* + MAT(:NEL)=0 + CALL LCMGET(IPTRK,'MATCOD',MAT) + IDL(:NEL)=0 + CALL LCMGET(IPTRK,'KEYFLX',IDL) + VOL(:NEL)=0.0 + CALL LCMGET(IPTRK,'VOLUME',VOL) +*---- +* FLUX NORMALIZATION +*---- + EVJ=XDRCST('eV','J') + ZNRM=0.0D0 + IF(IMPX.GT.0)WRITE(IOUT,1002) + FLUX(:NEL,:NGRP)=0.0 + DO 25 JGR=1,NGRP + DO 20 IEL=1,NEL + IF(MAT(IEL).EQ.0)GOTO 20 + FLUX(IEL,JGR)=EVECT(IDL(IEL),JGR) + ZNRM=ZNRM+HFAC(MAT(IEL),JGR)*FLUX(IEL,JGR)*VOL(IEL)*EVJ + 20 CONTINUE + 25 CONTINUE + ZNRM=PTOT/ZNRM + IF(IMPX.GT.0)WRITE(IOUT,1000) PTOT,ZNRM + DO 35 JGR=1,NGRP + DO 30 IEL=1,NEL + FLUX(IEL,JGR)=FLUX(IEL,JGR)*REAL(ZNRM) + 30 CONTINUE + 35 CONTINUE + RETURN +* + 1000 FORMAT(/37H FLPNRM: GIVEN TOTAL REACTOR POWER =>,1P,E15.8,1X, + 1 5HWATTS/37H FLPNRM: FLUX NORMALIZATION FACTOR =>,1P,E15.8) + 1002 FORMAT(/53H FLPNRM: ** NORMALIZING FLUXES TO A GIVEN REACTOR POW, + 1 5HER **) + END diff --git a/Donjon/src/FLPOW.f b/Donjon/src/FLPOW.f new file mode 100644 index 0000000..7de9241 --- /dev/null +++ b/Donjon/src/FLPOW.f @@ -0,0 +1,291 @@ +*DECK FLPOW + SUBROUTINE FLPOW(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* compute and print power and flux distributions over the reactor core. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Update(s): +* M. Guyot 15/07/10 : Creation of L_FLUX object to be used by +* module DETECT:, +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The FLPOW: module specifications are: +* Option 1 +* POWER [ NRMFLUX ] [ FMAP ] := FLPOW: [ POWOLD ] FMAP +* { FLUX | KINET } TRACK MATEX [ MACRO ] :: (descflpow} ; +* Option 2 +* POWER := FLPOW: [ POWOLD ] { FLUX | KINET } TRACK MACRO :: (descflpow) ; +* where +* POWER : name of the \emph{power} object that will be created by the +* module. It will contain the information related to the reactor fluxes +* and powers. +* NRMFLUX : name of the \emph{flux} object, in creation mode. According to +* the chosen option, this object contains either the fluxes normalized to +* the given total reactor power or the fluxes per bundle. Is it useful if +* you want to compute the detectors readings with the DETECT: module. +* POWOLD : name of the read-only \emph{power} object. It must contain the +* previously computed flux normalization factor, which corresponds to the +* reactor nominal or equilibrium conditions. +* FMAP : name of the \emph{fmap} object containing the fuel lattice +* specification. When FMAP is specified on the RHS, the fluxes and powers +* calculations are performed over the fuel lattice as well as over the +* whole reactor geometry. If FMAP is specified on the LHS, its records +* 'BUND-PW' and 'FLUX-AV' will be set according to the information present +* in POWER. +* FLUX : name of the \emph{flux} object, previously created by the +* FLUD: module. The numerical flux solution contained in FLUX is +* recovered and all flux are normalized to the given total reactor power. +* KINET : name of the \emph{kinet} object, previously created by the +* KINSOL: module. The numerical flux solution contained in KINET is +* recovered. +* TRACK : name of the \emph{track} object, created by the TRIVAT: module. +* The information stored in TRACK is recovered and used for the average +* flux calculation. +* MATEX : name of the \emph{matex} object, containing the reactor material +* index and the h-factors that will be recovered and used for the power +* calculation. +* MACRO name of the \emph{macrolib} object, containing the h-factors that +* will be recovered and used for the power calculation. +* (descflpow) : structure describing the input data to the FLPOW: module . +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + CHARACTER HSIGN*12,TEXT*12 + LOGICAL LNEW,LMAP,LFLX,LRAT,LPOW,LFSTH,LFLU,LNRM,LBUN + DOUBLE PRECISION DFLOT + TYPE(C_PTR) IPPOW,IPFLX,IPKIN,IPTRK,IPMTX,IPMAP,IPMAC,IPNFX +*---- +* PARAMETER VALIDATION +*---- + LFLU=.FALSE. + IF(NENTRY.LT.4)CALL XABORT('@FLPOW: PARAMETER EXPECTED.') + TEXT=HENTRY(1) + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@FLPOW' + 1 //': LCM OBJECT FOR L_POWER EXPECTED AT LHS ('//TEXT//').') + IF(JENTRY(1).NE.0)CALL XABORT('@FLPOW: CREATE MODE FOR L_POW' + 1 //'ER EXPECTED AT LHS ('//TEXT//').') + IPPOW=KENTRY(1) + IF(JENTRY(2).EQ.0)THEN + LFLU=.TRUE. + IPNFX=KENTRY(2) + ENDIF + IPFLX=C_NULL_PTR + IPKIN=C_NULL_PTR + IPTRK=C_NULL_PTR + IPMTX=C_NULL_PTR + IPMAP=C_NULL_PTR + IPMAC=C_NULL_PTR + LNEW=.FALSE. + JMOD=0 + IF(LFLU)THEN + NRHS=3 + ELSE + NRHS=2 + IPNFX=C_NULL_PTR + ENDIF + DO 10 IEN=NRHS,NENTRY + IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@F' + 1 //'LPOW: LCM OBJECT EXPECTED AT THE RHS.') + CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_POWER')THEN + IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE' + 1 //'CTED FOR THE L_POWER OBJECT AT RHS.') + IF(LNEW)CALL XABORT('@FLPOW: L_POWER ALREADY DEFINED AT RHS.') + CALL LCMEQU(KENTRY(IEN),IPPOW) + LNEW=.TRUE. + ELSEIF(HSIGN.EQ.'L_MATEX')THEN + IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE' + 1 //'CTED FOR THE L_MATEX OBJECT AT RHS.') + IF(.NOT.C_ASSOCIATED(IPMTX))THEN + IPMTX=KENTRY(IEN) + ELSE + CALL XABORT('@FLPOW: L_MATEX ALREADY DEFINED.') + ENDIF + ELSEIF(HSIGN.EQ.'L_FLUX')THEN + IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE' + 1 //'CTED FOR THE L_FLUX OBJECT AT RHS.') + IF(.NOT.C_ASSOCIATED(IPFLX))THEN + IPFLX=KENTRY(IEN) + ELSE + CALL XABORT('@FLPOW: L_FLUX ALREADY DEFINED.') + ENDIF + ELSEIF(HSIGN.EQ.'L_KINET')THEN + IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE' + 1 //'CTED FOR THE L_KINET OBJECT AT RHS.') + IF(.NOT.C_ASSOCIATED(IPKIN))THEN + IPKIN=KENTRY(IEN) + ELSE + CALL XABORT('@FLPOW: L_KINET ALREADY DEFINED.') + ENDIF + ELSEIF(HSIGN.EQ.'L_TRACK')THEN + IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE' + 1 //'CTED FOR THE L_TRACK OBJECT AT RHS.') + IF(.NOT.C_ASSOCIATED(IPTRK))THEN + IPTRK=KENTRY(IEN) + ELSE + CALL XABORT('@FLPOW: L_TRACK ALREADY DEFINED.') + ENDIF + ELSEIF(HSIGN.EQ.'L_MACROLIB')THEN + IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE' + 1 //'CTED FOR THE L_MACROLIB OBJECT AT RHS.') + IF(.NOT.C_ASSOCIATED(IPMAC))THEN + IPMAC=KENTRY(IEN) + ELSE + CALL XABORT('@FLPOW: L_MACROLIB ALREADY DEFINED.') + ENDIF + ELSEIF(HSIGN.EQ.'L_MAP')THEN + IF(JENTRY(IEN).EQ.1) JMOD=1 + IF(.NOT.C_ASSOCIATED(IPMAP))THEN + IPMAP=KENTRY(IEN) + ELSE + CALL XABORT('@FLPOW: L_MAP ALREADY DEFINED.') + ENDIF + ENDIF + 10 CONTINUE + IF((.NOT.C_ASSOCIATED(IPFLX)).AND.(.NOT.C_ASSOCIATED(IPKIN))) THEN + CALL XABORT('@FLPOW: MISSING L_FLUX OR L_KINET OBJECT.') + ELSE IF((C_ASSOCIATED(IPFLX)).AND.(C_ASSOCIATED(IPKIN))) THEN + CALL XABORT('@FLPOW: L_FLUX AND L_KINET OBJECTS BOTH DEFINED.') + ELSE IF(.NOT.C_ASSOCIATED(IPTRK)) THEN + CALL XABORT('@FLPOW: MISSING L_TRACK OBJECT.') + ELSE IF((C_ASSOCIATED(IPMAP)).AND.(.NOT.C_ASSOCIATED(IPMTX))) THEN + CALL XABORT('@FLPOW: MISSING L_MATEX OBJECT.') + ELSE IF((.NOT.C_ASSOCIATED(IPMAP)).AND.(C_ASSOCIATED(IPMTX))) THEN + CALL XABORT('@FLPOW: MISSING L_MAP OBJECT.') + ELSE IF((.NOT.C_ASSOCIATED(IPMTX)).AND. + 1 (.NOT.C_ASSOCIATED(IPMAC))) THEN + CALL XABORT('@FLPOW: MISSING L_MATEX OR L_MACROLIB OBJECT.') + ELSE IF((.NOT.C_ASSOCIATED(IPMAP)).AND. + 1 (.NOT.C_ASSOCIATED(IPMAC))) THEN + CALL XABORT('@FLPOW: MISSING L_MAP OR L_MACROLIB OBJECT.') + ENDIF +*---- +* READ KEYWORD +*---- + IMPX=1 + PTOT=0.0 + LFSTH=.FALSE. + LNRM=.FALSE. + LBUN=.FALSE. + FSTH=0.0 + LFLX=.FALSE. + LPOW=.FALSE. + LMAP=.FALSE. + LRAT=.FALSE. + 20 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.10) GO TO 40 + 30 IF(ITYP.NE.3)CALL XABORT('@FLPOW: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'EDIT') THEN +* PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@FLPOW: INTEGER DATA EXPECTED.') + ELSE IF(TEXT.EQ.'P-NEW') THEN + IF(.NOT.LNEW)CALL XABORT('@FLPOW: MISSING READ-ONLY L_POWER' + 1 //' OBJECT AT RHS.') + ELSE IF(TEXT.EQ.'PTOT') THEN + IF(LNEW)CALL XABORT('@FLPOW: ONLY ONE L_POWER OBJECT IN CRE' + 1 //'ATE MODE EXPECTED WITH PTOT OPTION.') + CALL REDGET(ITYP,NITMA,PTOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@FLPOW: REAL FOR PTOT EXPECTED.') + IF(PTOT.LE.0.)CALL XABORT('@FLPOW: INVALID VALUE PTOT < 0.') + ELSE IF(TEXT.EQ.'FSTH') THEN + CALL REDGET(ITYP,NITMA,FSTH,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@FLPOW: REAL DATA EXPECTED FOR FSTH.') + IF((FSTH.GT.1.0).OR.(FSTH.LE.0.0)) CALL XABORT('@FLPOW: FSTH ' + 1 //'SHOULD BE BETWEEN 0.0 AND 1.0.') + LFSTH=.TRUE. + ELSE IF(TEXT.EQ.'NORM') THEN + LNRM=.TRUE. + ELSE IF(TEXT.EQ.'BUND') THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('@FLPOW: NO RHS FUELM' + 1 //'AP DEFINED.') + LBUN=.TRUE. + ELSE IF(TEXT.EQ.'PRINT') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'MAP')THEN + IF(.NOT.C_ASSOCIATED(IPMAP))CALL XABORT('@FLPOW: INVALID KEY' + 1 //'WORD MAP. MISSING L_MAP OBJECT FOR PRINT.') + LMAP=.TRUE. + ELSEIF(TEXT.EQ.'ALL')THEN + LFLX=.TRUE. + LPOW=.TRUE. + IF(C_ASSOCIATED(IPMAP))LMAP=.TRUE. + LRAT=.TRUE. + ELSEIF(TEXT.EQ.'DISTR')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@FLPOW: CHARACTER DATA EXPECTED AF' + 1 //'TER DISTR.') + IF(TEXT.EQ.'FLUX')THEN + IF(LFLX)CALL XABORT('@FLPOW: KEYWORD FLUX ALREADY READ.') + LFLX=.TRUE. + ELSEIF(TEXT.EQ.'POWER')THEN + IF(LPOW)CALL XABORT('@FLPOW: KEYWORD POWER ALREADY READ.') + LPOW=.TRUE. + ELSEIF(TEXT.EQ.'RATIO')THEN + IF(LRAT)CALL XABORT('@FLPOW: KEYWORD RATIO ALREADY READ.') + LRAT=.TRUE. + ELSE + GO TO 30 + ENDIF + ELSE + CALL XABORT('@FLPOW: KEYWORD MAP/DISTR/ALL EXPECTED.') + ENDIF + ELSE IF(TEXT.EQ.'INIT') THEN + IF(JENTRY(IEN).EQ.1) JMOD=2 + ELSE IF(TEXT.EQ.';') THEN + GO TO 40 + ELSE + CALL XABORT('@FLPOW: INVALID KEYWORD '//TEXT//'.') + ENDIF + GO TO 20 +*---- +* CHECK CONSISTENCY +*---- + 40 IF(LMAP) THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) THEN + CALL XABORT('@FLPOW: MISSING L_MAP OBJECT.') + ELSE IF(.NOT.C_ASSOCIATED(IPMTX)) THEN + CALL XABORT('@FLPOW: MISSING L_MATEX OBJECT.') + ELSE IF(.NOT.C_ASSOCIATED(IPMAC)) THEN + CALL XABORT('@FLPOW: MISSING L_MACROLIB OBJECT.') + ENDIF + ENDIF +*---- +* PERFORM CALCULATION +*---- + CALL FLPDRV(IPPOW,IPNFX,IPFLX,IPKIN,IPTRK,IPMTX,IPMAP,IPMAC,PTOT, + 1 LNEW,LMAP,JMOD,LFLX,LPOW,LRAT,IMPX,FSTH,LFSTH,LFLU,LBUN,LNRM) + RETURN + END diff --git a/Donjon/src/FLPOWB.f b/Donjon/src/FLPOWB.f new file mode 100644 index 0000000..2bafb80 --- /dev/null +++ b/Donjon/src/FLPOWB.f @@ -0,0 +1,230 @@ +*DECK FLPOWB
+ SUBROUTINE FLPOWB(IPPOW,IPMAP,IPMTX,NMIX,NMAT,NGRP,NCH,NB,NEL,MAT,
+ 1 VOL,HFAC,FLUX,POWB,POWC,IMPX,PTOT,FSTH,LFSTH,FMIX,FLUB,IGEO)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the channel and bundle powers over the fuel lattice.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki, M. Guyot, V. Descotes
+*
+*Parameters: input
+* IPPOW pointer to power information.
+* IPMAP pointer to fuel-map information.
+* IPMTX pointer to matex information.
+* NMIX maximum number of material mixtures.
+* NMAT total number of mixtures (includes virtual regions).
+* NGRP number of energy groups.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* NEL total number of finite elements.
+* MAT index-number of mixture assigned to each volume.
+* VOL element-ordered mesh-splitted volumes.
+* HFAC h-factors over the reactor core.
+* FLUX normalized average fluxes associated with each volume.
+* IMPX printing index (=0 for no print).
+* PTOT total power in MW
+* FSTH thermal to fission ratio power
+* LFSTH boolean =.true. if FSTH is specified
+* FMIX fuel bundle indices.
+* FLUB normalized average fluxes associated with each bundle
+* IGEO type of the geometry (=7 or =9)
+*
+*Parameters: output
+* POWB bundle powers in kW.
+* POWC channel powers in kW.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPPOW,IPMAP,IPMTX
+ INTEGER NMIX,NMAT,NCH,NB,NGRP,NEL,MAT(NEL),IMPX,NX,NY,NZ,IGEO,
+ 1 FMIX(NCH*NB)
+ REAL HFAC(NMIX,NGRP),VOL(NEL),FLUX(NEL,NGRP),BFACT1,CFACT1,
+ 1 POWB(NCH,NB),POWC(NCH),FSTH,FLUB(NCH,NB,NGRP)
+ LOGICAL LFSTH
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40,IOUT=6)
+ INTEGER IGST(NSTATE),FMAT(NMAT),IB,ICH,IEL,ICMX,IBMX,IPCH
+ DOUBLE PRECISION POWER,BAVG,CAVG,BFACT,XDRCST,EVJ
+ REAL PBMX,VTOT,VOLB(NCH,NB)
+ CHARACTER TEXT*12
+ TYPE(C_PTR) JPMAP
+*----
+* BUNDLE POWERS
+*----
+ PBMX=0.
+ BAVG=0.0D0
+ POWER=0.0D0
+ IBMX=0
+ ICMX=0
+ FMAT(:NMAT)=0
+ CALL LCMGET(IPMTX,'MAT',FMAT)
+ POWB(:NCH,:NB)=0.0
+ IF(IMPX.GT.0)WRITE(IOUT,1004)
+*
+ EVJ=XDRCST('eV','J')
+ NTOT=0
+ DO 35 IB=1,NB
+ DO 30 ICH=1,NCH
+ POWB(ICH,IB)=0.0
+ VOLB(ICH,IB)=0.0
+ NUM=(IB-1)*NCH+ICH
+ IF(FMIX(NUM).EQ.0) GO TO 30
+ NTOT=NTOT+1
+ DO 20 IEL=1,NEL
+ IF((FMAT(IEL).EQ.-NTOT).AND.(MAT(IEL).GT.0)) THEN
+ DO 10 JGR=1,NGRP
+ POWB(ICH,IB)=POWB(ICH,IB)+
+ 1 FLUX(IEL,JGR)*HFAC(MAT(IEL),JGR)*VOL(IEL)*REAL(EVJ)
+ 10 CONTINUE
+ VOLB(ICH,IB)=VOLB(ICH,IB)+VOL(IEL)
+ ENDIF
+ 20 CONTINUE
+ POWER=POWER+DBLE(POWB(ICH,IB))
+ 30 CONTINUE
+ 35 CONTINUE
+ POWER=POWER/(10**6)
+ VTOT=0.0
+ DO 45 IB=1,NB
+ DO 40 ICH=1,NCH
+ POWB(ICH,IB)=POWB(ICH,IB)/1000.
+ IF(POWB(ICH,IB).GT.PBMX)THEN
+ PBMX=POWB(ICH,IB)
+ ICMX=ICH
+ IBMX=IB
+ ENDIF
+ BAVG=BAVG+DBLE(POWB(ICH,IB)*VOLB(ICH,IB))
+ VTOT=VTOT+VOLB(ICH,IB)
+ 40 CONTINUE
+ 45 CONTINUE
+ BAVG=BAVG/VTOT
+ BFACT=BAVG/PBMX
+
+* CHECK TOTAL POWER
+ IF(IMPX.EQ.99)WRITE(IOUT,1000)POWER
+ IF((IMPX.EQ.0).OR.(IMPX.GT.1))GOTO 50
+ WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICMX
+ IF(PBMX.LT.1000.)THEN
+ WRITE(IOUT,1001)PBMX,TEXT,IBMX
+ ELSE
+ WRITE(IOUT,1011)PBMX,TEXT,IBMX
+ ENDIF
+ IF(BAVG.LT.1000.)THEN
+ WRITE(IOUT,1007)BAVG
+ ELSE
+ WRITE(IOUT,1012)BAVG
+ ENDIF
+ FACT=1./REAL(BFACT)
+ WRITE(IOUT,1009)BFACT,FACT
+*----
+* CHANNEL POWERS
+*----
+ 50 PCMX=0.
+ CAVG=0.0D0
+ POWER=0.0D0
+ POWC(:NCH)=0.0
+ DO 70 ICH=1,NCH
+ VOLCH=0.0
+ DO 60 IB=1,NB
+ POWC(ICH)=POWC(ICH)+POWB(ICH,IB)
+ VOLCH=VOLCH+VOLB(ICH,IB)
+ 60 CONTINUE
+ POWER=POWER+DBLE(POWC(ICH))
+ IF(POWC(ICH).GT.PCMX)THEN
+ PCMX=POWC(ICH)
+ IPCH=ICH
+ ENDIF
+ CAVG=CAVG+DBLE(POWC(ICH)*VOLCH)
+ 70 CONTINUE
+ POWER=POWER/(10**3)
+ CAVG=CAVG/VTOT
+ CFACT=REAL(CAVG)/PCMX
+*----
+* THERMAL TO FISSION RATIO POWER
+*----
+ IF(LFSTH) THEN
+ CALL FLFSTH(PTOT,POWER,POWC,POWB,FLUX,NGRP,NCH,
+ + NB,NEL,FSTH,FLUB)
+ ENDIF
+
+ IF(IMPX.EQ.0)GOTO 90
+* CHECK TOTAL POWER
+ IF(IMPX.EQ.99)WRITE(IOUT,1002)POWER
+ IF(IMPX.GT.1)GOTO 80
+ WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',IPCH
+ IF(PCMX.LT.10000.)THEN
+ WRITE(IOUT,1003)PCMX,TEXT
+ ELSE
+ WRITE(IOUT,1013)PCMX,TEXT
+ ENDIF
+ IF(CAVG.LT.10000.)THEN
+ WRITE(IOUT,1008)CAVG
+ ELSE
+ WRITE(IOUT,1014)CAVG
+ ENDIF
+ FACT=1./CFACT
+ WRITE(IOUT,1010)CFACT,FACT
+ GOTO 90
+*----
+* PRINTING
+*----
+ 80 JPMAP=LCMGID(IPMAP,'GEOMAP')
+ CALL LCMGET(JPMAP,'STATE-VECTOR',IGST)
+ NX=IGST(3)
+ NY=IGST(4)
+ NZ=IGST(5)
+ IF(IGEO.NE.IGST(1)) CALL XABORT('@FLPOWB: WRONG GEOMETRY '
+ 1 // 'EMBEDDED IN THE FUEL MAP')
+ IF(IGEO.EQ.7) THEN
+ CALL FLPRNT(IPMAP,NCH,NB,NX,NY,NZ,POWB,PBMX,ICMX,
+ 1 IBMX,POWC,PCMX,IPCH,BAVG,BFACT,CAVG,CFACT,IMPX)
+ ELSEIF(IGEO.EQ.9) THEN
+ CALL FLPHPR(IPMAP,NCH,NB,NX,NZ,POWB,PBMX,ICMX,
+ 1 IBMX,POWC,PCMX,BAVG,BFACT,CAVG,CFACT,IMPX)
+ ENDIF
+ 90 BFACT1=1./REAL(BFACT)
+ CALL LCMPUT(IPPOW,'PMAX-BUND',1,2,PBMX)
+ CALL LCMPUT(IPPOW,'FORM-BUND',1,2,BFACT1)
+ CFACT1=1./CFACT
+ CALL LCMPUT(IPPOW,'PMAX-CHAN',1,2,PCMX)
+ CALL LCMPUT(IPPOW,'FORM-CHAN',1,2,CFACT1)
+ RETURN
+*
+ 1000 FORMAT(1X,'COMPUTED TOTAL POWER OVER ',
+ 1 'ALL BUNDLES =>',1P,E13.6,1X,'MW')
+ 1001 FORMAT(1X,'MAXIMUM BUNDLE POWER =',1X,F9.1,
+ 1 1X,'kW',2X,'=>',2X,A12,2X,'BUNDLE #',I2.2)
+ 1002 FORMAT(1X,'COMPUTED TOTAL POWER OVER',
+ 1 'ALL CHANNELS =>',1P,E13.6,1X,'MW')
+ 1003 FORMAT(1X,'MAXIMUM CHANNEL POWER =',1X,F9.1,
+ 1 1X,'kW',2X,'=>',2X,A12)
+ 1004 FORMAT(/1X,'** COMPUTING CHANNEL AND',
+ 1 1X,'BUNDLE POWERS **'/)
+ 1007 FORMAT(1X,'AVERAGE POWER OVER ALL BUNDLES',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1008 FORMAT(1X,'AVERAGE POWER OVER ALL CHANNELS',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1009 FORMAT(1X,'BUNDLE-POWER FORM FACTOR',2X,'=>',2X,
+ 1 'AVG/MAX =',1X,F8.4,3X,'(MAX/AVG = ',F8.4,')'/)
+ 1010 FORMAT(1X,'CHANNEL-POWER FORM FACTOR',2X,'=>',2X,
+ 1 'AVG/MAX =',1X,F8.4,3X,'(MAX/AVG = ',F8.4,')'/)
+ 1011 FORMAT(1X,'MAXIMUM BUNDLE POWER =',1X,F9.1,
+ 1 1X,'kW',2X,'=>',2X,A12,2X,'BUNDLE #',I2.2)
+ 1012 FORMAT(1X,'AVERAGE POWER OVER ALL BUNDLES',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1013 FORMAT(1X,'MAXIMUM CHANNEL POWER =',1X,F9.1,
+ 1 1X,'kW',2X,'=>',2X,A12)
+ 1014 FORMAT(1X,'AVERAGE POWER OVER ALL CHANNELS',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ END
diff --git a/Donjon/src/FLPOWR.f b/Donjon/src/FLPOWR.f new file mode 100644 index 0000000..7125b83 --- /dev/null +++ b/Donjon/src/FLPOWR.f @@ -0,0 +1,118 @@ +*DECK FLPOWR
+ SUBROUTINE FLPOWR(NMIX,NGRP,NEL,LX,LY,LZ,MAT,VOL,FLUX,HFAC,PXYZ,
+ 1 VTOT,IMPX,LPOW)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute and print a power distribution over the whole reactor core.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* NMIX maximum number of material mixtures.
+* NGRP total number of energy groups.
+* NEL total number of finite elements.
+* LX number of elements along x-axis.
+* LY number of elements along y-axis.
+* LZ number of elements along z-axis.
+* FLUX normalized fluxes associated with each volume.
+* MAT index-number of mixture assigned to each volume.
+* VOL element-ordered mesh-splitted volumes.
+* HFAC h-factors over the reactor core.
+* VTOT total reactor core volume.
+* IMPX printing index (=0 for no print).
+* LPOW file printing flag: =.true. print on file.
+*
+*Parameters: output
+* PXYZ power distribution over the reactor core.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NGRP,NMIX,NEL,LX,LY,LZ,MAT(NEL),IMPX
+ REAL FLUX(NEL,NGRP),VOL(NEL),HFAC(NMIX,NGRP),PXYZ(LX,LY,LZ)
+ DOUBLE PRECISION VTOT
+ LOGICAL LPOW
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6,INIT=1)
+ DOUBLE PRECISION PTOT,XDRCST,EVJ
+ CHARACTER TEXT*12
+*----
+* CHECK TOTAL POWER
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1005)
+ EVJ=XDRCST('eV','J')
+ PTOT=0.0D0
+ DO 20 IEL=1,NEL
+ IF(MAT(IEL).EQ.0)GOTO 20
+ DO 10 JGR=1,NGRP
+ PTOT=PTOT+FLUX(IEL,JGR)*VOL(IEL)*HFAC(MAT(IEL),JGR)*EVJ
+ 10 CONTINUE
+ 20 CONTINUE
+ PAVG=REAL(PTOT/VTOT)
+ IF(IMPX.GT.0)WRITE(IOUT,1001)PTOT,PAVG
+*----
+* PERFORM CALCULATION
+*----
+ PXYZ(:LX,:LY,:LZ)=0.0
+ IEL=0
+ PMAX=0.
+ DO 52 K=1,LZ
+ DO 51 J=1,LY
+ DO 50 I=1,LX
+ IEL=IEL+1
+ IF(MAT(IEL).EQ.0)GOTO 50
+ DO 40 JGR=1,NGRP
+ PXYZ(I,J,K)=PXYZ(I,J,K)+
+ 1 HFAC(MAT(IEL),JGR)*FLUX(IEL,JGR)*VOL(IEL)*REAL(EVJ)
+ 40 CONTINUE
+ IF(PXYZ(I,J,K).GT.PMAX)THEN
+ PMAX=PXYZ(I,J,K)
+ IMX=I
+ JMX=J
+ KMX=K
+ ENDIF
+ 50 CONTINUE
+ 51 CONTINUE
+ 52 CONTINUE
+ IF(IMPX.GT.0)WRITE(IOUT,1000)PMAX,IMX,JMX,KMX
+ IF(.NOT.LPOW)GOTO 70
+*----
+* PRINTING
+*----
+ TEXT='Pdistr.res'
+ OPEN(UNIT=INIT,FILE=TEXT,STATUS='UNKNOWN')
+ WRITE(INIT,1008)LX,LY,LZ
+ DO 65 K=1,LZ
+ DO 60 J=1,LY
+ WRITE(INIT,1007)J,K
+ WRITE(INIT,1002) (PXYZ(I,J,K),I=1,LX)
+ 60 CONTINUE
+ 65 CONTINUE
+ CLOSE(UNIT=INIT)
+ IF(IMPX.GT.0)WRITE(IOUT,1006)TEXT
+ 70 RETURN
+*
+ 1000 FORMAT(/1X,'MAX POWER =',1P,E13.6,1X,'WATTS',4X,
+ 1 'AT COORD :',1X,'I =',I3,2X,'J =',I3,2X,'K =',I3/)
+ 1001 FORMAT(1X,'COMPUTED TOTAL POWER :',1P,E15.8,1X,'WATTS'/
+ 1 1X,'MEAN POWER DENSITY',3X,':',1P,E15.8,1X,'WATTS/CM3')
+ 1002 FORMAT(6(1P,E15.8))
+ 1005 FORMAT(/1X,'** COMPUTING POWER-DISTRIBUTION OVER',
+ 1 1X,'THE REACTOR CORE **'/)
+ 1006 FORMAT(/1X,'PRINTING POWER-DISTRIBUTION ON FILE:',
+ 1 1X,'<',A10,'>',3X,'=>',2X,'DONE.')
+ 1007 FORMAT(//3X,'PLANE-Y #',I2.2,5X,'PLANE-Z #',I2.2/)
+ 1008 FORMAT(/10X,5('*'),3X,'POWER-DISTRIBUTION OVER THE',
+ 1 1X,'REACTOR CORE',3X,5('*')//25X,'NX=',I2,',',2X,
+ 2 'NY=',I2,',',2X,'NZ=',I2)
+ END
diff --git a/Donjon/src/FLPRNT.f b/Donjon/src/FLPRNT.f new file mode 100644 index 0000000..bdbdc22 --- /dev/null +++ b/Donjon/src/FLPRNT.f @@ -0,0 +1,272 @@ +*DECK FLPRNT
+ SUBROUTINE FLPRNT(IPMAP,NCH,NB,NX,NY,NZ,POWB,PBNM,ICHM,IBNM,POWC,
+ 1 PCHM,IPCH,BAVG,BFACT,CAVG,CFACT,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Print the bundle and channel powers over the fuel lattice.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input/output
+* IPMAP pointer to fuel-map information.
+* NCH number of reactor channels.
+* NB number of fuel bundles per channel.
+* NX number of elements along x-axis.
+* NY number of elements along y-axis.
+* NZ number of elements along z-axis.
+* POWB bundle powers in kW.
+* PBNM maximum bundle power.
+* ICHM maximum-power channel number.
+* IBNM maximum-power bundle number.
+* POWC channel powers in kW.
+* PCHM maximum channel power.
+* IPCH maximum-power channel number.
+* BAVG average bundle power.
+* BFACT bundle power-form factor.
+* CAVG average channel power.
+* CFACT channel power-form factor.
+* IMPX printing index: 0 = no print
+* 1 = minimal printing
+* 2 = channel power only
+* 3 = bundle power by plane only
+* 10 = bundle power by channel
+* any added values of 2, 3 and 10: 5,12,13,15
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAP
+ INTEGER NCH,NB,NX,NY,NZ,ICHM,IBNM,IPCH,IMPX
+ REAL POWB(NCH,NB),POWC(NCH),PBNM,PCHM
+ DOUBLE PRECISION BAVG,CAVG,BFACT
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ REAL RADB(NX,NY,NB),RADC(NX,NY)
+ INTEGER MIX(NX*NY,NZ),NAMX(NX),NAMY(NY)
+ CHARACTER TEXT*12,CHANX*2,CHANY*2,TEXT1A*17,TEXT2A*17,TEXT3A*17,
+ 1 TEXT1B*17,TEXT2B*17,TEXT3B*17
+*
+ MIX(:NX*NY,NZ)=0
+ NAMX(:NX)=0
+ NAMY(:NY)=0
+ CALL LCMGET(IPMAP,'BMIX',MIX)
+* CHANNEL NAMES
+ CALL LCMGET(IPMAP,'XNAME',NAMX)
+ CALL LCMGET(IPMAP,'YNAME',NAMY)
+*----
+* BUNDLE POWERS OVER EACH CHANNEL
+*----
+ IF(IMPX.GE.10) WRITE(IOUT,1009)
+ IEL=0
+ ICH=0
+ JCM=0
+ ICM=0
+ JBM=0
+ IBM=0
+ DO 11 J=1,NY
+ DO 10 I=1,NX
+ IEL=IEL+1
+ DO 5 K=1,NZ
+ IF(MIX(IEL,K).NE.0)GOTO 6
+ 5 CONTINUE
+ GO TO 10
+ 6 ICH=ICH+1
+ IF(ICH.EQ.IPCH)THEN
+ JCM=J
+ ICM=I
+ ENDIF
+ IF(ICH.EQ.ICHM)THEN
+ JBM=J
+ IBM=I
+ ENDIF
+ IF(IMPX.GE.10) THEN
+ WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH
+ WRITE(CHANX,'(A2)') (NAMX(I))
+ WRITE(CHANY,'(A2)') (NAMY(J))
+ WRITE(IOUT,1000)TEXT,CHANY,CHANX,POWC(ICH)
+ IF(PBNM.LT.1.)THEN
+ WRITE(IOUT,'(1X,1P,12E11.4)')(POWB(ICH,IB),IB=1,NB)
+ ELSE IF(PBNM.LT.1000.)THEN
+ WRITE(IOUT,'(1X,12F11.3)')(POWB(ICH,IB),IB=1,NB)
+ ELSE
+ WRITE(IOUT,'(1X,12F11.1)')(POWB(ICH,IB),IB=1,NB)
+ ENDIF
+ ENDIF
+ 10 CONTINUE
+ 11 CONTINUE
+*
+ WRITE(TEXT1A,'(A6,I2,A8)') '(A4,',(NX/2),'(A9,2X))'
+ WRITE(TEXT2A,'(A4,I2,A6)') '(A3,',(NX/2),'F11.3)'
+ WRITE(TEXT3A,'(A8,I2,A6)') '(A3,1P,',(NX/2),'E11.3)'
+ WRITE(TEXT1B,'(A4,I2,A8)') '(A4,',NX-(NX/2),'(A9,2X))'
+ WRITE(TEXT2B,'(A4,I2,A6)') '(A3,',NX-(NX/2),'F11.3)'
+ WRITE(TEXT3B,'(A8,I2,A6)') '(A3,1P,',NX-(NX/2),'E11.3)'
+ IF((IMPX.LT.3).OR.((IMPX.GE.10).AND.(IMPX.LT.13)))GOTO 50
+*----
+* BUNDLE POWERS PER RADIAL PLANE
+*----
+ RADB(:NX,:NY,:NB)=0.0
+ WRITE(IOUT,1010)
+ DO IB=1,NB
+ IEL=0
+ ICH=0
+ DO 25 J=1,NY
+ DO 20 I=1,NX
+ IEL=IEL+1
+ DO 15 K=1,NZ
+ IF(MIX(IEL,K).NE.0)GOTO 16
+ 15 CONTINUE
+ GO TO 20
+ 16 ICH=ICH+1
+ RADB(I,J,IB)=POWB(ICH,IB)
+ 20 CONTINUE
+ 25 CONTINUE
+ ENDDO
+ DO IB=1,NB
+ WRITE(IOUT,1011)IB
+ WRITE(IOUT,TEXT1A)' ',(NAMX(I),I=1,(NX/2))
+ WRITE(IOUT,*)' '
+ DO 30 J=1,NY
+ WRITE(CHANY,'(A2)') (NAMY(J))
+ IF(INDEX(CHANY,'-').EQ.1)GOTO 30
+ IF(PBNM.GE.1.)THEN
+ WRITE(IOUT,TEXT2A)CHANY,(RADB(I,J,IB),I=1,(NX/2))
+ ELSE
+ WRITE(IOUT,TEXT3A)CHANY,(RADB(I,J,IB),I=1,(NX/2))
+ ENDIF
+ 30 CONTINUE
+ WRITE(IOUT,*)' '
+ WRITE(IOUT,TEXT1B)' ',(NAMX(I),I=(NX/2+1),NX)
+ WRITE(IOUT,*)' '
+ DO 40 J=1,NY
+ WRITE(CHANY,'(A2)') (NAMY(J))
+ IF(INDEX(CHANY,'-').EQ.1)GOTO 40
+ IF(PBNM.GE.1.)THEN
+ WRITE(IOUT,TEXT2B)CHANY,(RADB(I,J,IB),I=(NX/2+1),NX)
+ ELSE
+ WRITE(IOUT,TEXT3B)CHANY,(RADB(I,J,IB),I=(NX/2+1),NX)
+ ENDIF
+ 40 CONTINUE
+ ENDDO
+ 50 IF((IMPX.EQ.0).OR.(IMPX.EQ.1).OR.(IMPX.EQ.3).OR.(IMPX.EQ.4)
+ 1 .OR.(IMPX.EQ.10).OR.(IMPX.EQ.11).OR.(IMPX.EQ.13).OR.(IMPX.EQ.14))
+ 2 GOTO 90
+*----
+* CHANNEL POWERS IN RADIAL PLANE
+*----
+ RADC(:NX,:NY)=0.0
+ WRITE(IOUT,1013)
+ IEL=0
+ ICH=0
+ DO 65 J=1,NY
+ DO 60 I=1,NX
+ IEL=IEL+1
+ DO 55 K=1,NZ
+ IF(MIX(IEL,K).NE.0)GOTO 56
+ 55 CONTINUE
+ GO TO 60
+ 56 ICH=ICH+1
+ RADC(I,J)=POWC(ICH)
+ 60 CONTINUE
+ 65 CONTINUE
+ WRITE(IOUT,TEXT1A)' ',(NAMX(I),I=1,(NX/2))
+ WRITE(IOUT,*)' '
+ DO 70 J=1,NY
+ WRITE(CHANY,'(A2)') (NAMY(J))
+ IF(INDEX(CHANY,'-').EQ.1)GOTO 70
+ IF(PBNM.GE.1.)THEN
+ WRITE(IOUT,TEXT2A)CHANY,(RADC(I,J),I=1,(NX/2))
+ ELSE
+ WRITE(IOUT,TEXT3A)CHANY,(RADC(I,J),I=1,(NX/2))
+ ENDIF
+ 70 CONTINUE
+ WRITE(IOUT,*)' '
+ WRITE(IOUT,TEXT1B)' ',(NAMX(I),I=(NX/2+1),NX)
+ WRITE(IOUT,*)' '
+ DO 80 J=1,NY
+ WRITE(CHANY,'(A2)') (NAMY(J))
+ IF(INDEX(CHANY,'-').EQ.1)GOTO 80
+ IF(PBNM.GE.1.)THEN
+ WRITE(IOUT,TEXT2B)CHANY,(RADC(I,J),I=(NX/2+1),NX)
+ ELSE
+ WRITE(IOUT,TEXT3B)CHANY,(RADC(I,J),I=(NX/2+1),NX)
+ ENDIF
+ 80 CONTINUE
+*----
+* FINAL INFORMATION
+*----
+ 90 IF((IBM.EQ.0).OR.(JBM.EQ.0)) CALL XABORT('FLPRNT: INVALID POWERS')
+ WRITE(IOUT,1002)
+ WRITE(CHANX,'(A2)') (NAMX(IBM))
+ WRITE(CHANY,'(A2)') (NAMY(JBM))
+ IF(PBNM.LT.1000.)THEN
+ WRITE(IOUT,1003)PBNM,CHANY,CHANX,IBNM
+ ELSE
+ WRITE(IOUT,1016)PBNM,CHANY,CHANX,IBNM
+ ENDIF
+ IF(BAVG.LT.1000.)THEN
+ WRITE(IOUT,1005)BAVG
+ ELSE
+ WRITE(IOUT,1017)BAVG
+ ENDIF
+ FACT=1./REAL(BFACT)
+ IF((ICM.EQ.0).OR.(JCM.EQ.0)) CALL XABORT('FLPRNT: INVALID POWERS')
+ WRITE(IOUT,1006)BFACT,FACT
+ WRITE(CHANX,'(A2)') (NAMX(ICM))
+ WRITE(CHANY,'(A2)') (NAMY(JCM))
+ IF(PCHM.LT.10000.)THEN
+ WRITE(IOUT,1004)PCHM,CHANY,CHANX
+ ELSE
+ WRITE(IOUT,1018)PCHM,CHANY,CHANX
+ ENDIF
+ IF(CAVG.LT.10000.)THEN
+ WRITE(IOUT,1007)CAVG
+ ELSE
+ WRITE(IOUT,1019)CAVG
+ ENDIF
+ FACT=1./CFACT
+ WRITE(IOUT,1008)CFACT,FACT
+ RETURN
+*
+ 1000 FORMAT(/5X,A12,5X,'NAME:',1X,A2,A2,5X,'CHANNEL POWER =',1X,1P,
+ 1 E11.4,'kW')
+ 1002 FORMAT(/5X,5('--o--',6X)/)
+ 1003 FORMAT(/1X,'MAXIMUM BUNDLE POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL:',1X,A2,A2,3X,'BUNDLE #',I2.2)
+ 1004 FORMAT(/1X,'MAXIMUM CHANNEL POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL:',1X,A2,A2)
+ 1005 FORMAT(1X,'AVERAGE POWER OVER ALL BUNDLES',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1006 FORMAT(1X,'BUNDLE-POWER FORM FACTOR',2X,'=>',2X,
+ 1 'AVG/MAX =',1X,F8.4,3X,'(MAX/AVG = ',F8.4,')')
+ 1007 FORMAT(1X,'AVERAGE POWER OVER ALL CHANNELS',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1008 FORMAT(1X,'CHANNEL-POWER FORM FACTOR',2X,'=>',2X,
+ 1 'AVG/MAX =',1X,F8.4,2X,'(MAX/AVG = ',F8.4,')'/)
+ 1009 FORMAT(/20X,'** BUNDLE POWERS OVER EACH',
+ 1 1X,'CHANNEL (kW) **'/)
+ 1010 FORMAT(//20X,'** BUNDLE POWERS PER RADIAL',
+ 1 1X,'PLANE **'/)
+ 1011 FORMAT(//1X,'BUNDLE POWERS',1X,'(kW)',1X,
+ 1 '=>',1X,'RADIAL PLANE',1X,'#',I2.2/)
+ 1013 FORMAT(//20X,'** CHANNEL POWERS IN RADIAL',1X,'PLANE (kW) **'/)
+ 1016 FORMAT(/1X,'MAXIMUM BUNDLE POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL:',1X,A2,A2,3X,'BUNDLE #',I2.2)
+ 1017 FORMAT(1X,'AVERAGE POWER OVER ALL BUNDLES',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ 1018 FORMAT(/1X,'MAXIMUM CHANNEL POWER =',1X,F9.1,1X,'kW',
+ 1 3X,'=>',3X,'CHANNEL:',1X,A2,A2)
+ 1019 FORMAT(1X,'AVERAGE POWER OVER ALL CHANNELS',
+ 1 1X,'=',1X,F9.1,1X,'kW')
+ END
diff --git a/Donjon/src/FLPTOT.f b/Donjon/src/FLPTOT.f new file mode 100644 index 0000000..9e53dfc --- /dev/null +++ b/Donjon/src/FLPTOT.f @@ -0,0 +1,96 @@ +*DECK FLPTOT + SUBROUTINE FLPTOT(IPFLX,IPKIN,IPTRK,NMIX,NGRP,NEL,NUN,EVECT,FLUX, + 1 MAT,VOL,IDL,HFAC,PTOT,ZNRM,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Normalize fluxes using a previous normalization factor; update the +* total reactor power. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPFLX pointer to flux information. +* IPKIN pointer to kinetics information. +* IPTRK pointer to tracking information. +* NMIX maximum number of material mixtures. +* NGRP total number of energy groups. +* NEL total number of finite elements. +* NUN total number of unknowns per group. +* HFAC h-factors over the reactor core. +* ZNRM previous flux-normalization factor. +* IMPX printing index (=0 for no print). +* +*Parameters: output +* FLUX normalized fluxes associated with each volume. +* MAT index-number of mixture assigned to each volume. +* VOL element-ordered mesh-splitted volumes. +* PTOT new total reactor power in watts. +* +*Parameters: scratch +* EVECT +* IDL +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPFLX,IPKIN,IPTRK + INTEGER NUN,NEL,NGRP,NMIX,IMPX,IDL(NEL),MAT(NEL) + REAL FLUX(NEL,NGRP),EVECT(NUN,NGRP),HFAC(NMIX,NGRP),VOL(NEL) + DOUBLE PRECISION ZNRM,PTOT +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + TYPE(C_PTR) JPFLX + DOUBLE PRECISION XDRCST,EVJ +*---- +* RECOVER INFORMATION +*---- + EVECT(:NUN,:NGRP)=0.0 + IF(C_ASSOCIATED(IPFLX)) THEN +* L_FLUX object + JPFLX=LCMGID(IPFLX,'FLUX') + DO 10 JGR=1,NGRP + CALL LCMGDL(JPFLX,JGR,EVECT(1,JGR)) + 10 CONTINUE + ELSE IF(C_ASSOCIATED(IPKIN)) THEN +* L_KINET object + CALL LCMGET(IPKIN,'E-VECTOR',EVECT) + ENDIF +* + MAT(:NEL)=0 + CALL LCMGET(IPTRK,'MATCOD',MAT) + IDL(:NEL)=0 + CALL LCMGET(IPTRK,'KEYFLX',IDL) + VOL(:NEL)=0.0 + CALL LCMGET(IPTRK,'VOLUME',VOL) +*---- +* PERFORM CALCULATION +*---- + EVJ=XDRCST('eV','J') + PTOT=0.0D0 + IF(IMPX.GT.0)WRITE(IOUT,1001) + FLUX(:NEL,:NGRP)=0.0 + DO 25 JGR=1,NGRP + DO 20 IEL=1,NEL + IF(MAT(IEL).EQ.0)GOTO 20 + FLUX(IEL,JGR)=EVECT(IDL(IEL),JGR) + FLUX(IEL,JGR)=FLUX(IEL,JGR)*REAL(ZNRM) + PTOT=PTOT+HFAC(MAT(IEL),JGR)*FLUX(IEL,JGR)*VOL(IEL)*EVJ + 20 CONTINUE + 25 CONTINUE + IF(IMPX.GT.0)WRITE(IOUT,1000)PTOT + RETURN +* + 1000 FORMAT(/1X,'TOTAL REACTOR POWER =>',1P,E15.8,1X,'WATTS'/) + 1001 FORMAT(/1X,'** COMPUTING OF A NEW TOTAL',1X,'REACTOR POWER **') + END diff --git a/Donjon/src/FPSOUT.f b/Donjon/src/FPSOUT.f new file mode 100644 index 0000000..5d78203 --- /dev/null +++ b/Donjon/src/FPSOUT.f @@ -0,0 +1,150 @@ +*DECK FPSOUT + SUBROUTINE FPSOUT(IPMAC,IPRINT,NG,NMIL,NFIS,ILEAKS,TEXT9,OUTG) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the leakage rate in each energy group +* +*Copyright: +* Copyright (C) 2019 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 +* IPMAC pointer to the macrolib structure. +* IPRINT print parameter +* NG number of energy groups. +* NMIL number of material mixtures. +* NFIS number of fissile isotopes. +* ILEAKS type of leakage calculation =0: no leakage; =1: homogeneous +* leakage (Diffon). +* TEXT9 type of calculation ('REFERENCE' or 'MACRO'). +* +*Parameters: output +* OUTG leakage rates. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC + INTEGER IPRINT,NG,NMIL,NFIS,ILEAKS + CHARACTER TEXT9*9 + REAL OUTG(NG) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMAC,KPMAC + CHARACTER HSMG*131 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS + REAL, ALLOCATABLE, DIMENSION(:) :: GAR,WORK,DIFHOM,DIFF + REAL, ALLOCATABLE, DIMENSION(:,:) :: PHI,NUF + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: CHI,RHS,LHS +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(PHI(NMIL,NG),RHS(NMIL,NG,NG),LHS(NMIL,NG,NG)) + ALLOCATE(IJJ(NMIL),NJJ(NMIL),IPOS(NMIL),GAR(NMIL),WORK(NMIL*NG), + > CHI(NMIL,NFIS,NG),NUF(NMIL,NFIS),DIFHOM(NG),DIFF(NMIL)) +*---- +* COMPUTE THE ACTUAL AND REFERENCE REACTION RATE MATRICES +*---- + CALL LCMGET(IPMAC,'K-EFFECTIVE',ZKEFF) + IF(IPRINT.GT.1) WRITE(6,120) TEXT9,ZKEFF + CALL LCMLEN(IPMAC,'B2 B1HOM',ILCMLN,ITYLCM) + IF(ILCMLN.EQ.1) THEN + CALL LCMGET(IPMAC,'B2 B1HOM',B2) + ELSE + B2=0.0 + ENDIF + IF((ILEAKS.EQ.1).AND.(IPRINT.GT.1)) THEN + WRITE(6,'(/9H FPSOUT: ,A,4H B2=,1P,E12.4)') TEXT9,B2 + ENDIF + RHS(:NMIL,:NG,:NG)=0.0 + LHS(:NMIL,:NG,:NG)=0.0 + JPMAC=LCMGID(IPMAC,'GROUP') + DO IG=1,NG + KPMAC=LCMGIL(JPMAC,IG) + CALL LCMGET(KPMAC,'CHI',CHI(1,1,IG)) + CALL LCMLEN(KPMAC,'FLUX-INTG',ILG,ITYLCM) + IF(ILG.NE.NMIL) CALL XABORT('FPSOUT: MISSING REFERENCE FLUX.') + CALL LCMGET(KPMAC,'FLUX-INTG',PHI(1,IG)) + ENDDO + DO IG=1,NG + KPMAC=LCMGIL(JPMAC,IG) + IF(ILEAKS.EQ.1) THEN + CALL LCMLEN(KPMAC,'DIFF',ILCMLN,ITYLCM) + IF(ILCMLN.GT.0) THEN + CALL LCMGET(KPMAC,'DIFF',DIFF) + ELSE + CALL LCMGET(IPMAC,'DIFHOMB1HOM',DIFHOM) + DO IBM=1,NMIL + DIFF(IBM)=DIFHOM(IG) + ENDDO + ENDIF + ELSE + DIFF(:NMIL)=0.0 + ENDIF + CALL LCMGET(KPMAC,'NTOT0',GAR) + CALL LCMGET(KPMAC,'SCAT00',WORK) + CALL LCMGET(KPMAC,'NJJS00',NJJ) + CALL LCMGET(KPMAC,'IJJS00',IJJ) + CALL LCMGET(KPMAC,'IPOS00',IPOS) + DO IBM=1,NMIL + IPOSDE=IPOS(IBM) + DO JG=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 +* IG <-- JG + RHS(IBM,IG,JG)=RHS(IBM,IG,JG)-WORK(IPOSDE)*PHI(IBM,JG) + IPOSDE=IPOSDE+1 + ENDDO + RHS(IBM,IG,IG)=RHS(IBM,IG,IG)+(GAR(IBM)+B2*DIFF(IBM))* + > PHI(IBM,IG) + ENDDO + CALL LCMGET(KPMAC,'NUSIGF',NUF) + DO IBM=1,NMIL + DO IFIS=1,NFIS + DO JG=1,NG + LHS(IBM,JG,IG)=LHS(IBM,JG,IG)+CHI(IBM,IFIS,JG)* + > NUF(IBM,IFIS)*PHI(IBM,IG) + ENDDO + ENDDO + ENDDO + ENDDO +*---- +* COMPUTE THE ACTUAL AND REFERENCE ABSORPTION AND FISSION RATES +*---- + DO IG=1,NG + OUTG(IG)=0.0 + DO IBM=1,NMIL + OUTG(IG)=OUTG(IG)+SUM(LHS(IBM,IG,:NG))/ZKEFF- + 1 SUM(RHS(IBM,IG,:NG)) + ENDDO + IF(OUTG(IG).LT.-1.0E-6) THEN + WRITE(HSMG,'(21HFPSOUT: INCONSISTENT ,A,17H LEAKAGE IN GROUP, + 1 I4,7H. LEAK=,1P,E13.4)') TEXT9,IG,OUTG(IG) + CALL XABORT(HSMG) + ENDIF + IF(IPRINT.GT.1) WRITE(6,130) IG,TEXT9,OUTG(IG) + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DIFF,DIFHOM,NUF,CHI,WORK,GAR,IPOS,NJJ,IJJ) + DEALLOCATE(LHS,RHS,PHI) + RETURN +* + 120 FORMAT(/9H FPSOUT: ,A,33H EFFECTIVE MULTIPLICATION FACTOR=,1P, + 1 E12.4) + 130 FORMAT(/8H FPSOUT:,5X,6HGROUP=,I4,1X,A,9H LEAKAGE=,1P,E12.4) + END diff --git a/Donjon/src/FPSPH.f b/Donjon/src/FPSPH.f new file mode 100644 index 0000000..96db43a --- /dev/null +++ b/Donjon/src/FPSPH.f @@ -0,0 +1,472 @@ +*DECK FPSPH + SUBROUTINE FPSPH(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Perform a single SPH factor fixed point iteration +* +*Copyright: +* Copyright (C) 2019 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The FPSPH: calling specifications are: +* OPTIM := FPSPH: [ OPTIM ] MACROLIB MACROREF :: (fpsph\_data) ; +* where +* OPTIM : name of the \emph{optimize} object (L\_OPTIMIZE signature) +* containing the SPH factors. At the first call, object OPTIM must appear on +* LHS to receive its initial values. On subsequent calls, object OPTIM must +* appear on both LHS and RHS to be able to update the previous values. +* MACROLIB : name of the read-only extended \emph{macrolib} object +* (L\_MACROLIB signature) containing the macroscopic cross sections used by +* the macro-calculation and fluxes produced by the macro-calculation. +* MACROREF : name of the read-only extended \emph{macrolib} object +* (L\_MACROLIB signature) containing the reference macroscopic cross +* sections and fluxes. +* (fpsph\_data) : structure containing the data to the module FPSPH: +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + TYPE(C_PTR) IPOPT,IPMAC1,IPMAC2,JPMAC1,JPMAC2,KPMAC1,KPMAC2 + CHARACTER HSIGN*12,TEXT12*12 + INTEGER ISTATE(NSTATE),DNVTST + DOUBLE PRECISION OPTPRR(NSTATE),DFLOTT,ZNORM1,ZNORM2,EPSPH,ERRT, + > ERR2,ERROR,SPHMIN,SPHMAX +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: SPH,FLUX1,FLUX2,OUTG1,OUTG2 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV,VAROLD,XMIN, + > XMAX,P,FF,UD + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: DFF,TDFF +*---- +* PARAMETER VALIDATION. +*---- + IF(NENTRY.NE.3) CALL XABORT('FPSPH: THREE PARAMETERS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('FPSPH: LCM' + > //' OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).EQ.0)THEN + HSIGN='L_OPTIMIZE' + CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN) + ELSE IF(JENTRY(1).EQ.1)THEN + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_OPTIMIZE')THEN + CALL XABORT('FPSPH: SIGNATURE OF '//HENTRY(2)//' IS '//HSIGN// + > '. L_OPTIMIZE EXPECTED.') + ENDIF + ELSE IF(JENTRY(1).EQ.2)THEN + CALL XABORT('FPSPH: OPTIMIZE OBJECT IN CREATION OR MODIFICATIO' + > //'N MODE EXPECTED.') + ENDIF + IPOPT=KENTRY(1) + IF(JENTRY(1).EQ.1) THEN + CALL LCMGET(IPOPT,'STATE-VECTOR',ISTATE) + NVAR=ISTATE(1) + NFUNC=ISTATE(2)+1 + ITER=ISTATE(5) + IMETH=ISTATE(8) + CALL LCMGET(IPOPT,'OPT-PARAM-R',OPTPRR) + EPSPH=OPTPRR(3) + CALL LCMGET(IPOPT,'DEL-STATE',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ICONT=ISTATE(4) + NGR1=ISTATE(5) + NGR2=ISTATE(6) + NALBP=ISTATE(9) + IF((ICONT.NE.3).AND.(ICONT.NE.4)) CALL XABORT('FPSPH: SPH FACT' + > //'ORS EXPECTED IN OPTIMIZE OBJECT.') + IF(NVAR.NE.(NGR2-NGR1+1)*(NMIX+NALBP)) CALL XABORT('FPSPH: INC' + > //'OHERENT NUMBER OF DECISION VARIABLES.') + ELSE + ITER=0 + IMETH=3 + EPSPH=1.0D-4 + NGRP=0 + NMIX=0 + ENDIF + DO I=2,3 + IF((JENTRY(I).NE.2).OR.((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2))) + 1 CALL XABORT('FPSPH: LCM OBJECT IN READ-ONLY MODE EXPECTED AT R' + 2 //'HS.') + ENDDO + ITER=ITER+1 +*---- +* RECOVER THE ACTUAL MACROLIB. +*---- + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_MACROLIB') THEN + IPMAC1=KENTRY(2) + ELSE IF(HSIGN.EQ.'L_LIBRARY') THEN + IPMAC1=LCMGID(KENTRY(5),'MACROLIB') + ELSE + TEXT12=HENTRY(2) + CALL XABORT('FPSPH: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + > '. ACTUAL L_MACROLIB OR L_LIBRARY EXPECTED.') + ENDIF + CALL LCMGET(IPMAC1,'STATE-VECTOR',ISTATE) + IF(JENTRY(1).EQ.0) THEN + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ELSE IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('FPSPH: INVALID NUMBER OF GROUPS.') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('FPSPH: INVALID NUMBER OF MIXTURES.') + ENDIF + NFIS1=ISTATE(4) + ILEAKS=ISTATE(9) +*---- +* RECOVER THE REFERENCE MACROLIB. +*---- + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_MACROLIB') THEN + IPMAC2=KENTRY(3) + ELSE IF(HSIGN.EQ.'L_LIBRARY') THEN + IPMAC2=LCMGID(KENTRY(3),'MACROLIB') + ELSE + TEXT12=HENTRY(3) + CALL XABORT('FPSPH: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. REFERENCE L_MACROLIB OR L_LIBRARY EXPECTED.') + ENDIF + CALL LCMGET(IPMAC2,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('FPSPH: INVALID NUMBER OF REFERENCE GROUPS.') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('FPSPH: INVALID NUMBER OF REFERENCE MIXTURES.') + ELSE IF(ISTATE(9).NE.ILEAKS) THEN + CALL XABORT('FPSPH: INVALID TYPE OF LEAKAGE.') + ENDIF + NFIS2=ISTATE(4) + NALBP=ISTATE(8) + IF(NALBP.GT.1) CALL XABORT('FPSPH: NALBP>1 NOT SUPPORTED.') +*---- +* READ INPUT PARAMETERS +*---- + IPICK=0 + IPRINT=1 + SPHMIN=0.0D0 + SPHMAX=10.0D0 + IF(JENTRY(1).EQ.0) THEN + IMC=2 + NGR1=1 + NGR2=NGRP + ENDIF + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.10) GO TO 50 + IF(INDIC.NE.3) CALL XABORT('FPSPH: CHARACTER DATA EXPECTED') + IF(TEXT12(1:4).EQ.'EDIT') THEN + CALL REDGET(INDIC,IPRINT,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FPSPH: INTEGER DATA EXPECTED FOR I' + 1 //'PRINT') + ELSE IF(TEXT12.EQ.'SPH') THEN +* READ THE TYPE OF SPH CORRECTION. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('FPSPH: CHARACTER DATA EXPECTED(2).') + IF(TEXT12.EQ.'PN') THEN + IMC=1 + ELSE IF(TEXT12.EQ.'SN') THEN + IMC=2 + ELSE + CALL XABORT('FPSPH: INVALID TYPE OF SPH CORRECTION.') + ENDIF + ELSE IF(TEXT12.EQ.'GRPMIN') THEN +* READ THE MINIMUM GROUP INDEX. + CALL REDGET(INDIC,NGR1,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FPSPH: INTEGER DATA EXPECTED(4).') + IF((NGR1.LE.0).OR.(NGR1.GT.NGRP)) CALL XABORT('FPSPH: INVALID ' + > //'VALUE OF GRPMIN.') + ELSE IF(TEXT12.EQ.'GRPMAX') THEN +* READ THE MAXIMUM GROUP INDEX. + CALL REDGET(INDIC,NGR2,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FPSPH: INTEGER DATA EXPECTED(5).') + IF((NGR2.LT.NGR1).OR.(NGR2.GT.NGRP)) CALL XABORT('FPSPH: INVAL' + > //'ID VALUE OF GRPMAX.') + ELSE IF(TEXT12.EQ.'OUT-STEP-EPS') THEN +* Set the tolerence used for SPH iterations. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + EPSPH=FLOTT + ELSE IF(INDIC.EQ.4) THEN + EPSPH=DFLOTT + ELSE + CALL XABORT('FPSPH: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'VAR-VAL-MIN') THEN +* Set the minimum value for SPH dactors. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + SPHMIN=FLOTT + ELSE IF(INDIC.EQ.4) THEN + SPHMIN=DFLOTT + ELSE + CALL XABORT('FPSPH: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'VAR-VAL-MAX') THEN +* Set the maximum value for SPH dactors. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + SPHMAX=FLOTT + ELSE IF(INDIC.EQ.4) THEN + SPHMAX=DFLOTT + ELSE + CALL XABORT('FPSPH: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'OUT-CONV-TST') THEN +* Convergence test + IPICK=1 + GO TO 50 + ELSE IF(TEXT12(1:1).EQ.';') THEN + GO TO 50 + ELSE + CALL XABORT('FPSPH: '//TEXT12//' IS AN INVALID KEYWORD') + ENDIF + GO TO 10 +*---- +* RECOVER SPH FACTORS FROM PREVIOUS ITERATION +*---- + 50 NPERT=(NGR2-NGR1+1)*(NMIX+NALBP) + ALLOCATE(VARV(NPERT),VAROLD(NPERT),XMIN(NPERT),XMAX(NPERT)) + CALL LCMLEN(IPOPT,'VAR-VAL-MIN',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + XMIN(:NPERT)=SPHMIN + CALL LCMPUT(IPOPT,'VAR-VAL-MIN',NPERT,4,XMIN) + ELSE + CALL LCMGET(IPOPT,'VAR-VAL-MIN',XMIN) + ENDIF + CALL LCMLEN(IPOPT,'VAR-VAL-MAX',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + XMAX(:NPERT)=SPHMAX + CALL LCMPUT(IPOPT,'VAR-VAL-MAX',NPERT,4,XMAX) + ELSE + CALL LCMGET(IPOPT,'VAR-VAL-MAX',XMAX) + ENDIF + CALL LCMLEN(IPOPT,'VAR-VALUE',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + VAROLD(:NPERT)=1.0D0 + ELSE + CALL LCMGET(IPOPT,'VAR-VALUE',VAROLD) + ENDIF +*---- +* PERFORM A FIXED POINT SPH ITERATION +*---- + IF(IPRINT.GT.0) WRITE(6,'(/34H FPSPH: COMPUTE SPH FACTORS AT ITE, + > 6HRATION,I5,12H WITH METHOD,I2,1H.)') ITER,IMETH + IF(IMETH.EQ.3) THEN + IPERT=0 + JPMAC1=LCMGID(IPMAC1,'GROUP') + JPMAC2=LCMGID(IPMAC2,'GROUP') + ALLOCATE(SPH(NMIX+NALBP),FLUX1(NMIX),FLUX2(NMIX),OUTG1(NGRP), + > OUTG2(NGRP)) + IF(IPRINT.GT.4) WRITE(6,'(/32H FPSPH: SPH FACTORS AT ITERATION, + > I5)') ITER + IF(NALBP.GT.0) THEN + CALL FPSOUT(IPMAC1,IPRINT,NGRP,NMIX,NFIS1,ILEAKS,' MACRO', + > OUTG1) + CALL FPSOUT(IPMAC2,IPRINT,NGRP,NMIX,NFIS2,ILEAKS,'REFERENCE', + > OUTG2) + ENDIF + DO 120 IGR=NGR1,NGR2 + SPH(:NMIX+NALBP)=1.0 + KPMAC1=LCMGIL(JPMAC1,IGR) + KPMAC2=LCMGIL(JPMAC2,IGR) + CALL LCMGET(KPMAC1,'FLUX-INTG',FLUX1) + CALL LCMGET(KPMAC2,'FLUX-INTG',FLUX2) + DO 60 IBM=1,NMIX + SPH(IBM)=FLUX2(IBM)/FLUX1(IBM) + 60 CONTINUE + DO 70 IAL=1,NALBP + IF(OUTG1(IGR).NE.0.0) THEN + SPH(NMIX+IAL)=REAL(VAROLD(IPERT+NMIX+1))*OUTG2(IGR)/OUTG1(IGR) + ENDIF + 70 CONTINUE + ZNORM1=0.0D0 + ZNORM2=0.0D0 + DO 80 IBM=1,NMIX + ZNORM1=ZNORM1+FLUX2(IBM)/SPH(IBM) + ZNORM2=ZNORM2+FLUX2(IBM) + 80 CONTINUE + ZNORM1=ZNORM1/ZNORM2 + IF(IPRINT.GT.1) THEN + WRITE(6,'(/14H FPSPH: GROUP=,I4,22H NORMALIZATION FACTOR=,1P, + > E12.4)') IGR,ZNORM1 + ENDIF + DO 90 IBM=1,NMIX+NALBP + SPH(IBM)=SPH(IBM)*REAL(ZNORM1) + 90 CONTINUE + DO 100 IBM=1,NMIX + IPERT=IPERT+1 + VARV(IPERT)=SPH(IBM) + 100 CONTINUE + DO 110 IAL=1,NALBP + IPERT=IPERT+1 + VARV(IPERT)=SPH(NMIX+IAL) + 110 CONTINUE + 120 CONTINUE + DEALLOCATE(OUTG2,OUTG1,FLUX2,FLUX1,SPH) +*---- +* PERFORM A NEWTONIAN SPH ITERATION +*---- + ELSE IF(IMETH.EQ.4) THEN + ALLOCATE(P(NPERT),FF(NFUNC),DFF(NPERT,NFUNC),TDFF(NFUNC,NPERT), + > UD(NPERT)) + CALL LCMGET(IPOPT,'FOBJ-CST-VAL',FF) + CALL LCMGET(IPOPT,'GRADIENT',DFF) + TDFF=TRANSPOSE(DFF) + CALL ALST2F(NFUNC,NFUNC,NPERT,TDFF,UD) + CALL ALST2S(NFUNC,NFUNC,NPERT,TDFF,UD,FF,P) + DO 130 IPERT=1,NPERT + VARV(IPERT)=VAROLD(IPERT)-P(IPERT) + 130 CONTINUE + DEALLOCATE(UD,TDFF,DFF,FF,P) + ENDIF +*---- +* APPLY CONSTRAINTS ON SPH FACTORS +*---- + DO 135 IPERT=1,NPERT + VARV(IPERT)=MAX(VARV(IPERT),XMIN(IPERT)) + VARV(IPERT)=MIN(VARV(IPERT),XMAX(IPERT)) + 135 ENDDO +*---- +* PRINT SPH FACTORS +*---- + IF(IPRINT.GT.4) THEN + ALLOCATE(SPH(NMIX+NALBP)) + IPERT=0 + DO 150 IGR=NGR1,NGR2 + DO 140 IBM=1,NMIX+NALBP + IPERT=IPERT+1 + SPH(IBM)=REAL(VARV(IPERT)) + 140 CONTINUE + WRITE(6,200) 'NSPH',IGR,(SPH(IBM),IBM=1,NMIX+NALBP) + 150 CONTINUE + DEALLOCATE(SPH) + ENDIF +*---- +* TEST CONVERGENCE +*---- + ICONV=0 + IF(JENTRY(1).EQ.1) THEN + ERROR=0.0 + ERR2=0.0 + DO 160 IPERT=1,NPERT + ERRT=ABS((VARV(IPERT)-VAROLD(IPERT))/VARV(IPERT)) + ERR2=ERR2+ERRT*ERRT + ERROR=MAX(ERROR,ERRT) + 160 CONTINUE + ERR2=SQRT(ERR2/REAL(NPERT)) + IF(IPRINT.GT.0) WRITE(6,230) ITER,ERROR,ERR2 + IF(ERR2.LT.EPSPH) THEN + ICONV=1 + IF(IPRINT.GT.0) WRITE(6,220) ITER + ENDIF + ELSE + ERR2=1.0E10 + ENDIF +*---- +* PUT OPTIMIZE OBJECT INFORMATION +*---- + CALL LCMPUT(IPOPT,'VAR-VALUE',NPERT,4,VARV) + DEALLOCATE(XMAX,XMIN,VAROLD,VARV) + IF(JENTRY(1).EQ.0)THEN + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NMIX + ISTATE(3)=1 + ISTATE(4)=2+IMC + ISTATE(5)=NGR1 + ISTATE(6)=NGR2 + ISTATE(7)=1 + ISTATE(8)=NMIX + ISTATE(9)=NALBP + IF(IPRINT.GT.0) WRITE(6,210) (ISTATE(I),I=1,6) + CALL LCMPUT(IPOPT,'DEL-STATE',NSTATE,1,ISTATE) + ISTATE(:NSTATE)=0 + ISTATE(1)=NPERT + ISTATE(8)=IMETH ! set to fixed point or Newtonian method + CALL LCMPUT(IPOPT,'STATE-VECTOR',NSTATE,1,ISTATE) + OPTPRR(:NSTATE)=0.0D0 + OPTPRR(1)=1.0D0 + OPTPRR(2)=0.1D0 + OPTPRR(3)=EPSPH + OPTPRR(4)=1.0D-4 + OPTPRR(5)=1.0D-4 + CALL LCMPUT(IPOPT,'OPT-PARAM-R',NSTATE,4,OPTPRR) + ELSE + CALL LCMGET(IPOPT,'STATE-VECTOR',ISTATE) + ISTATE(1)=NPERT + ISTATE(4)=ICONV ! convergence index + ISTATE(5)=ITER ! number of iterations + ISTATE(8)=IMETH ! set to fixed point or Newtonian method + CALL LCMPUT(IPOPT,'STATE-VECTOR',NSTATE,1,ISTATE) + ENDIF +*---- +* RECOVER THE CONVERGENCE FLAGS AND SAVE IT IN A CLE-2000 VARIABLE +*---- + IF(IPICK.EQ.1) THEN + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.-5) CALL XABORT('FPSPH: OUTPUT LOGICAL EXPECTED.') + INDIC=5 + IF(ICONV.EQ.0) THEN + DNVTST=-1 ! not converged + ELSE IF(ICONV.EQ.1) THEN + DNVTST=1 ! converged + ENDIF + CALL REDPUT(INDIC,DNVTST,FLOTT,TEXT12,DFLOTT) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.-4) THEN + INDIC=4 + CALL REDPUT(INDIC,NITMA,FLOTT,TEXT12,ERR2) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + IF((INDIC.NE.3).OR.(TEXT12.NE.';')) THEN + CALL XABORT('FPSPH: ; CHARACTER EXPECTED.') + ENDIF + ENDIF + RETURN +* + 200 FORMAT(/25H FPSPH: VALUES OF VECTOR ,A,9H IN GROUP,I5,4H ARE/ + > (1X,1P,10E13.5)) + 210 FORMAT(/18H DEL-STATE OPTIONS/18H -----------------/ + 1 7H NGRP ,I8,28H (NUMBER OF ENERGY GROUPS)/ + 2 7H NMIX ,I8,32H (NUMBER OF MATERIAL MIXTURES)/ + 3 7H ITYPE ,I8,13H (NOT USED)/ + 4 7H IDELTA,I8,34H (=3/4: USE PN-TYPE/USE SN-TYPE)/ + 5 7H NGR1 ,I8,24H (MINIMUM GROUP INDEX)/ + 6 7H NGR2 ,I8,24H (MAXIMUM GROUP INDEX)) + 220 FORMAT(/39H FPSPH: CONVERGENCE OF SPH ALGORITHM IN,I5, + > 12H ITERATIONS.) + 230 FORMAT(/13H FPSPH: ITER=,I3,4X,6HERROR=,1P,E10.3,1X,5HERR2=, + > E10.3) + END diff --git a/Donjon/src/GRA001.f b/Donjon/src/GRA001.f new file mode 100644 index 0000000..90569f5 --- /dev/null +++ b/Donjon/src/GRA001.f @@ -0,0 +1,107 @@ +*DECK GRA001 + SUBROUTINE GRA001(IPFLX,IPGPT,NVAR,NCST,DERIV) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute new gradients of system characteristics (part 2). +* +*Copyright: +* Copyright (C) 2012 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 +* IPFLX pointer of a LCM object containing a set solutions of +* fixed-source eigenvalue problems. +* IPGPT pointer of a LCM object containing a set of fixed sources. +* NVAR number of control variables. +* NCST number of constraints with indirect effects (can be zero). +* +*Parameters: output +* DERIV gradient matrix. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPFLX,IPGPT + INTEGER NVAR,NCST + DOUBLE PRECISION DERIV(NVAR,NCST+1) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPFLX,KPFLX,JPGPT,KPGPT + PARAMETER (NSTATE=40) + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION SUM + REAL, ALLOCATABLE, DIMENSION(:) :: DFLUX,SOUR +* + CALL LCMGET(IPFLX,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NUN=ISTATE(2) + ITYPE=ISTATE(3) + NGPT=ISTATE(5) + CALL LCMGET(IPGPT,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP) CALL XABORT('GRA001: INVALID NGRP') + IF(ISTATE(2).NE.NUN) CALL XABORT('GRA001: INVALID NUN') + ND=ISTATE(3) + NA=ISTATE(4) +* + ALLOCATE(SOUR(NUN),DFLUX(NUN)) + DERIV(:NVAR,:NCST+1)=0.0D0 + IF(ITYPE.EQ.100) THEN +* EXPLICIT APPROACH + IF(NVAR.NE.NGPT) CALL XABORT('GRA001: INVALID NGPT(1)') + IF(NCST+1.NE.NA) CALL XABORT('GRA001: INVALID NA(1)') + JPFLX=LCMGID(IPFLX,'DFLUX') + JPGPT=LCMGID(IPGPT,'ASOUR') + DO 25 IVAR=1,NVAR + KPFLX=LCMGIL(JPFLX,IVAR) + DO 20 ICST=1,NCST+1 + KPGPT=LCMGIL(JPGPT,ICST) + SUM=0.0D0 + DO 15 IGR=1,NGRP + CALL LCMGDL(KPGPT,IGR,SOUR) + CALL LCMGDL(KPFLX,IGR,DFLUX) + DO 10 IUN=1,NUN + SUM=SUM+SOUR(IUN)*DFLUX(IUN) + 10 CONTINUE + 15 CONTINUE + DERIV(IVAR,ICST)=SUM + 20 CONTINUE + 25 CONTINUE + ELSE IF(ITYPE.EQ.1000) THEN +* IMPLICIT APPROACH + IF(NVAR.NE.ND) CALL XABORT('GRA001: INVALID ND(2)') + IF(NCST+1.NE.NGPT) CALL XABORT('GRA001: INVALID NGPT(2)') + JPFLX=LCMGID(IPFLX,'ADFLUX') + JPGPT=LCMGID(IPGPT,'DSOUR') + DO 45 ICST=1,NCST+1 + KPFLX=LCMGIL(JPFLX,ICST) + DO 40 IVAR=1,NVAR + KPGPT=LCMGIL(JPGPT,IVAR) + SUM=0.0D0 + DO 35 IGR=1,NGRP + CALL LCMGDL(KPGPT,IGR,SOUR) + CALL LCMGDL(KPFLX,IGR,DFLUX) + DO 30 IUN=1,NUN + SUM=SUM+SOUR(IUN)*DFLUX(IUN) + 30 CONTINUE + 35 CONTINUE + DERIV(IVAR,ICST)=SUM + 40 CONTINUE + 45 CONTINUE + ELSE + CALL XABORT('GRA001: INVALID FLUX OBJECT') + ENDIF + DEALLOCATE(DFLUX,SOUR) + RETURN + END diff --git a/Donjon/src/GRAD.f b/Donjon/src/GRAD.f new file mode 100644 index 0000000..26ca070 --- /dev/null +++ b/Donjon/src/GRAD.f @@ -0,0 +1,382 @@ +*DECK GRAD + SUBROUTINE GRAD(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute gradients of system characteristics. +* +*Copyright: +* Copyright (C) 2012 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The calling specifications are: +* OPTIM := GRAD: [ OPTIM ] DFLUX GPT :: (grad\_data) ; +* where +* OPTIM : name of the \emph{optimize} object (L\_OPTIMIZE signature) +* containing the optimization informations. Object OPTIM must appear on the +* RHS to be able to updated the previous values. +* DFLUX : name of the \emph{flux} object (L\_FLUX signature) containing a set +* of solutions of fixed-source eigenvalue problems. +* GPT : name of the \emph{gpt} object (L\_GPT signature) containing a set +* of direct or adjoint sources. +* (grad\_data) : structure containing the data to the module GRAD:. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + TYPE(C_PTR) IPFLX,IPGPT,IPGRAD + CHARACTER HSIGN*12,TEXT4*4,TEXT12*12,TEXT16*16 + INTEGER ISTATE(NSTATE) + REAL FLOTT + DOUBLE PRECISION DFLOTT,SR,EPS1,EPS2,EPS3,EPS4 + DOUBLE PRECISION OPTPRR(NSTATE) +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IREL + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV,CSTV,RHS, + 1 DERIV,DERIV0 +*---- +* PARAMETER VALIDATION. +*---- + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('GRAD: LCM' + 1 //' OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).EQ.2) CALL XABORT('GRAD: OPTIMIZE ENTRY IN CREATE O' + 1 //'R MODIFICATION MODE EXPECTED.') + DO I=2,NENTRY + TEXT12=HENTRY(I) + IF((JENTRY(I).NE.2).OR.((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2))) + 1 CALL XABORT('GRAD: LCM OBJECT IN READ-ONLY MODE EXPECTED AT R' + 2 //'HS ('//TEXT12//').') + ENDDO + IPGRAD=KENTRY(1) + IPFLX=C_NULL_PTR + IPGPT=C_NULL_PTR +*---- +* RECOVER THE ACTUAL FLUX SOLUTION AND CORRESPONDING TRACKING. +*---- + NVAR0=0 + NCST0=0 + ITYPE=0 + IF(NENTRY.EQ.3) THEN + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_FLUX') THEN + TEXT12=HENTRY(2) + CALL XABORT('GRAD: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_FLUX EXPECTED.') + ENDIF + IPFLX=KENTRY(2) + CALL LCMGET(IPFLX,'STATE-VECTOR',ISTATE) + ITYPE=ISTATE(3) + NGPT=ISTATE(5) + IF(NGPT.EQ.0) CALL XABORT('GRAD: MISSING FIXED-SOURCE EIGENVA' + 1 //'LUE SOLUTION') + IPGPT=KENTRY(3) + CALL LCMGTC(IPGPT,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_SOURCE') THEN + TEXT12=HENTRY(3) + CALL XABORT('GRAD: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_SOURCE EXPECTED.') + ENDIF + CALL LCMGET(IPGPT,'STATE-VECTOR',ISTATE) + ND=ISTATE(3) + NA=ISTATE(4) +*---- +* COMPUTE THE NUMBER OF CONSTRAINTS AND OF CONTROL VARIABLES +*---- + IF(ITYPE.EQ.100) THEN + NVAR0=NGPT + NCST0=NA-1 + ELSE IF(ITYPE.EQ.1000) THEN + NVAR0=ND + NCST0=NGPT-1 + ELSE + CALL XABORT('GRAD: INVALID FLUX OBJECT') + ENDIF + ENDIF +*---- +* READ INPUT PARAMETERS +*---- + IPRINT=1 + IOPT=1 + ICONV=0 + IEXT=0 + IEDSTP=2 + IHESS=0 + ISEARC=0 + IMETH=2 + ISTEP=0 + JCONV=0 + SR=1.0D0 + EPS1=0.1D0 + EPS2=1.0D-4 + EPS3=1.0D-4 + EPS4=1.0D-4 + IF(JENTRY(1).EQ.0) THEN + HSIGN='L_OPTIMIZE' + CALL LCMPTC(IPGRAD,'SIGNATURE',12,HSIGN) + ELSE IF (JENTRY(1).EQ.1) THEN + CALL LCMGTC(IPGRAD,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_OPTIMIZE') THEN + TEXT12=HENTRY(3) + CALL XABORT('GRAD: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_OPTIMIZE EXPECTED.') + ENDIF + CALL LCMGET(IPGRAD,'STATE-VECTOR',ISTATE) + NVAR=ISTATE(1) + NCST=ISTATE(2) + IOPT=ISTATE(3) + ICONV=ISTATE(4) + IEXT=ISTATE(5) + IEDSTP=ISTATE(6) + IHESS=ISTATE(7) + ISEARC=ISTATE(8) + IMETH=ISTATE(9) + MAXEXT=ISTATE(12) + NSTART=ISTATE(13) + CALL LCMGET(IPGRAD,'OPT-PARAM-R',OPTPRR) + SR=OPTPRR(1) + EPS1=OPTPRR(2) + EPS2=OPTPRR(3) + EPS3=OPTPRR(4) + EPS4=OPTPRR(5) + ENDIF + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.10) GO TO 20 + IF(INDIC.NE.3) CALL XABORT('GRAD: CHARACTER DATA EXPECTED.') + IF(TEXT12(:4).EQ.'EDIT') THEN + CALL REDGET(INDIC,IPRINT,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('GRAD: INTEGER DATA EXPECTED FOR IP' + 1 //'RINT.') + ELSE IF(TEXT12(:8).EQ.'MINIMIZE') THEN + IOPT=1 + ELSE IF(TEXT12(:8).EQ.'MAXIMIZE') THEN + IOPT=-1 + ELSE IF(TEXT12.EQ.'OUT-STEP-LIM') THEN + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(1)') + SR=FLOTT + ELSE IF((TEXT12(:9).EQ.'VAR-VALUE').OR. + 1 (TEXT12(:10).EQ.'VAR-WEIGHT')) THEN + ALLOCATE(VARV(NVAR)) + DO IVAR=1,NVAR + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(2)') + VARV(IVAR)=FLOTT + ENDDO + CALL LCMPUT(IPGRAD,TEXT12,NVAR,4,VARV) + DEALLOCATE(VARV) + ELSE IF((TEXT12(:11).EQ.'VAR-VAL-MIN').OR. + 1 (TEXT12(:11).EQ.'VAR-VAL-MAX')) THEN + ALLOCATE(VARV(NVAR)) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.EQ.2) THEN + VARV=FLOTT + DO IVAR=2,NVAR + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(3)') + VARV(IVAR)=FLOTT + ENDDO + ELSE IF((INDIC.EQ.3).AND.(TEXT4.EQ.'ALL')) THEN + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(4)') + DO IVAR=1,NVAR + VARV(IVAR)=FLOTT + ENDDO + ELSE + CALL XABORT('GRAD: REAL DATA OR ALL KEYWORD EXPECTED') + ENDIF + CALL LCMPUT(IPGRAD,TEXT12,NVAR,4,VARV) + DEALLOCATE(VARV) + ELSE IF(TEXT12.EQ.'FOBJ-CST-VAL') THEN + ALLOCATE(CSTV(NCST+1)) + DO ICST=1,NCST+1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(5)') + CSTV(ICST)=FLOTT + ENDDO + CALL LCMPUT(IPGRAD,'FOBJ-CST-VAL',NCST+1,4,CSTV) + OBJNEW=CSTV(1) + DEALLOCATE(CSTV) + ELSE IF(TEXT12(:8).EQ.'CST-TYPE') THEN + IF(NCST.EQ.0) CALL XABORT('GRAD: CST-TYPE KEYWORD FORBIDDEN') + ALLOCATE(IREL(NCST)) + DO ICST=1,NCST + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) THEN + CALL XABORT('GRAD: INTEGER DATA EXPECTED') + ELSE IF((NITMA.LT.-1).OR.(NITMA.GT.1)) THEN + CALL XABORT('GRAD: -1, 0 or 1 EXPECTED') + ENDIF + IREL(ICST)=NITMA + ENDDO + CALL LCMPUT(IPGRAD,'CST-TYPE',NCST,1,IREL) + DEALLOCATE(IREL) + ELSE IF(TEXT12(:7).EQ.'CST-OBJ') THEN + IF(NCST.EQ.0) CALL XABORT('GRAD: CST-OBJ KEYWORD FORBIDDEN') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.EQ.2) THEN + ALLOCATE(RHS(NCST)) + RHS(1)=FLOTT + DO ICST=2,NCST + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(6)') + RHS(ICST)=FLOTT + ENDDO + CALL LCMPUT(IPGRAD,'CST-OBJ',NCST,4,RHS) + DEALLOCATE(RHS) + ELSE + CALL XABORT('GRAD: REAL DATA OR KEEP KEYWORD EXPECTED') + ENDIF + ELSE IF(TEXT12(:10).EQ.'CST-WEIGHT') THEN + IF(NCST.EQ.0) CALL XABORT('GRAD: CST-WEIGHT KEYWORD FORBIDDEN') + ALLOCATE(RHS(NCST)) + DO ICST=1,NCST + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('GRAD: REAL DATA EXPECTED(7)') + RHS(ICST)=FLOTT + ENDDO + CALL LCMPUT(IPGRAD,'CST-WEIGHT',NCST,4,RHS) + DEALLOCATE(RHS) + ELSE IF(TEXT12(:1).EQ.';') THEN + GO TO 20 + ELSE + CALL XABORT('GRAD: '//TEXT12//' IS AN INVALID KEYWORD') + ENDIF + GO TO 10 +*---- +* CALCULATION OF THE NEW GRADIENT +*---- + 20 IF(IPRINT.GT.0) THEN + IF(ITYPE.EQ.100) THEN + WRITE(6,'(/25H GRAD: EXPLICIT APPROACH.)') + ELSE IF(ITYPE.EQ.1000) THEN + WRITE(6,'(/25H GRAD: IMPLICIT APPROACH.)') + ENDIF + ENDIF + ALLOCATE(DERIV(NVAR*(NCST+1))) + DERIV(:NVAR*(NCST+1))=0.0D0 + IF(C_ASSOCIATED(IPFLX).AND.C_ASSOCIATED(IPGPT)) THEN + IF(NVAR0.NE.NVAR) CALL XABORT('GRAD: INCONSISTENT NVAR.') + IF(NCST0.GT.NCST) CALL XABORT('GRAD: INCONSISTENT NCST.') +* ------------------------------------------ + CALL GRA001(IPFLX,IPGPT,NVAR0,NCST0,DERIV) +* ------------------------------------------ + ENDIF + CALL LCMLEN(IPGRAD,'GRADIENT-DIR',LENGTH,ITYLCM) + IF(LENGTH.EQ.NVAR*(NCST+1)) THEN + ALLOCATE(DERIV0(NVAR*(NCST+1))) + CALL LCMGET(IPGRAD,'GRADIENT-DIR',DERIV0) + DO I=1,NVAR*(NCST+1) + DERIV(I)=DERIV(I)+DERIV0(I) + ENDDO + DEALLOCATE(DERIV0) + ENDIF + CALL LCMPUT(IPGRAD,'GRADIENT',NVAR*(NCST+1),4,DERIV) + DEALLOCATE(DERIV) +*---- +* PRINT INFORMATION +*---- + IF(IPRINT.GT.0) THEN + WRITE(6,'(/31H GRAD: INFORMATION AT ITERATION,I5)') IEXT+1 + CALL LCMLEN(IPGRAD,'VAR-VALUE',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + ALLOCATE(VARV(NVAR)) + CALL LCMGET(IPGRAD,'VAR-VALUE',VARV) + WRITE(6,100) 'CONTROL VARIABLES:',(VARV(IVAR),IVAR=1,NVAR) + DEALLOCATE(VARV) + ENDIF + IF(IPRINT.GT.1) THEN + ALLOCATE(DERIV(NVAR*(NCST+1))) + CALL LCMGET(IPGRAD,'GRADIENT',DERIV) + WRITE(6,'(/29H GRADIENTS-------------------)') + WRITE(6,100) 'OBJECTIVE FUNCTION:',(DERIV(IVAR),IVAR=1,NVAR) + IF(IPRINT.GT.2) THEN + DO 60 ICST=1,NCST + WRITE(TEXT16,'(10HCONSTRAINT,I4,1H:)') ICST + WRITE(6,100) TEXT16,(DERIV(ICST*NVAR+IVAR),IVAR=1,NVAR) + 60 CONTINUE + ENDIF + DEALLOCATE(DERIV) + ENDIF + ENDIF +*---- +* SAVE THE STATE VECTORS +*---- + ISTATE(1)=NVAR + ISTATE(2)=NCST + ISTATE(3)=IOPT + ISTATE(4)=ICONV + ISTATE(5)=IEXT + ISTATE(6)=IEDSTP + ISTATE(7)=IHESS + ISTATE(8)=ISEARC + ISTATE(9)=IMETH + ISTATE(10)=ISTEP + ISTATE(11)=JCONV + ISTATE(14)=0 + IF(IPRINT.GT.0) WRITE(6,110) (ISTATE(I),I=1,9) + CALL LCMPUT(IPGRAD,'STATE-VECTOR',NSTATE,1,ISTATE) + OPTPRR(:NSTATE)=0.0D0 + OPTPRR(1)=SR + OPTPRR(2)=EPS1 + OPTPRR(3)=EPS2 + OPTPRR(4)=EPS3 + OPTPRR(5)=EPS4 + IF(IPRINT.GT.0) WRITE(6,120) (OPTPRR(I),I=1,5) + CALL LCMPUT(IPGRAD,'OPT-PARAM-R',NSTATE,4,OPTPRR) + IF(IPRINT.GT.2) CALL LCMLIB(IPGRAD) + RETURN +* + 100 FORMAT(1X,A28,1P,8E12.4/(29X,8E12.4)) + 110 FORMAT(/8H OPTIONS/8H -------/ + 1 7H NVAR ,I8,32H (NUMBER OF CONTROL VARIABLES)/ + 2 7H NCST ,I8,26H (NUMBER OF CONSTRAINTS)/ + 3 7H IOPT ,I8,37H (=1/-1: MINIMIZATION/MAXIMIZATION)/ + 4 7H ICONV ,I8,43H (=0/1: EXTERNAL NOT CONVERGED/CONVERGED)/ + 5 7H IEXT ,I8,32H (INDEX OF EXTERNAL ITERATION)/ + 6 7H IEDSTP,I8,43H (=1/2: HALF REDUCTION/PARABOLIC FORMULA)/ + 7 7H IHESS ,I8,29H (=0/1/2: STEEPEST/CG/BFGS)/ + 8 7H ISEARC,I8,35H (=0/1/2: NO SEARCH/OPTEX/NEWTON)/ + 9 7H IMETH ,I8,42H (=1/2/3: SIMPLEX-LEMKE/LEMKE-LEMKE/MAP)) + 120 FORMAT(/ + 1 12H REAL PARAM:,1P/12H -----------/ + 2 7H SR ,D12.4,39H (RADIUS OF THE QUADRATIC CONSTRAINT)/ + 3 7H EPS1 ,D12.4,13H (NOT USED)/ + 4 7H EPS2 ,D12.4,31H (EXTERNAL CONVERGENCE LIMIT)/ + 5 7H EPS3 ,D12.4,31H (INTERNAL CONVERGENCE LIMIT)/ + 6 7H EPS4 ,D12.4,43H (QUADRATIC CONSTRAINT CONVERGENCE LIMIT)) + END diff --git a/Donjon/src/HST.f b/Donjon/src/HST.f new file mode 100644 index 0000000..16ba333 --- /dev/null +++ b/Donjon/src/HST.f @@ -0,0 +1,622 @@ +*DECK HST + SUBROUTINE HST(NENTRY, HENTRY, IENTRY, JENTRY, KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* To extract from or save to a \dds{history} data structure +* the information related to various cells in a reactor. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau, E. Varin +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* For HST:, the possible calling specifications are: +* Option 1: Updating an \emph{history} structure using a \emph{map} structure +* history := HST: [ history ] map [ :: [ (hstdim) ] [ GET (hstpar) ] ] ; +* Option 2: Updating an \emph{history} structure using a \emph{burnup} structure +* history := HST: [ history ] [ burnup ] [ :: [ (hstdim) ] +* [ GET (hstpar) ] [ CELLID icha ibun [ idfuel ] [ GET (hstpar) ] ] ] ; +* Option 3: Updating a \emph{burnup} structure using an \emph{history} structure +* burnup := HST: history [ :: [ (hstdim ] +* [ PUT (hstpar) ] +* CELLID icha ibun +* [ PUT { BREFL (hstbrn) (hstpar) AREFL (hstbrn) (hstpar) +* | [ AREFL ] (hstbrn) (hstpar) } ] ] ; +* Option 4: Updating a \emph{map} data structure from the information available +* on an \emph{history} data structure: +* map := HST: map history ; +* where +* history : name of an \emph{history} data structure. +* burnup : name of a \emph{burnup} data structure. +* map : name of a \emph{map} data structure. +* (hstdim) : structure containing the dimensions for the \emph{history} +* data structure. +* CELLID : keyword to identify the cell for which history information is +* to be processed. +* icha : channel number for which history information is to be processed. +* ibun : bundle number for which history information is to be processed. +* idfuel : fuel type number associated with this cell. One can associate to +* each fuel cell a different fuel type. By default a single fuel type is +* defined and it fills every fuel cell. Only the initial properties of each +* fuel type are saved. These properties are used for refueling. +* GET : keyword to specify that the values of the parameters selected in +* (brnpar will be read from the input stream or CLE-2000 local variables +* and stored on the \emph{history data structure. +* PUT : keyword to specify that the values of the parameters selected in +* (brnpar will be read from the \emph{history data structure and +* transferred to local CLE-2000 variables. +* BREFL : to specify that the information to extract from the \emph{history} +* data structure is related to the properties of the cell before refueling +* takes place. +* AREFL : to specify that the information to extract from the \emph{history} +* data base is related to the properties of the cell after refueling took +* place. +* (hstbrn) : structure containing the burnup options. +* (hstpar) : structure containing the local parameters options. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT,ILCMUP,ILCMDN,NSTATE,NTC,MAXENT + CHARACTER NAMSBR*6,TEXT12*12 + PARAMETER (IOUT=6,ILCMUP=1,ILCMDN=2,NSTATE=40, + > NTC=3,MAXENT=2,NAMSBR='HST ') + INTEGER NSTOLD + PARAMETER (NSTOLD=20) +*---- +* Debug print flag +* IDEB = 0 -> no print debug +* > 0 -> print debug +*---- + INTEGER IDEB + PARAMETER (IDEB=0) +*---- +* LOCAL VARIABLES +*---- + CHARACTER CBLANK*4,SIGENT(MAXENT)*12 + INTEGER IBLANK,NAMTMP(NTC) + INTEGER ISTATB(NSTATE),ISTATH(NSTATE),ISTATM(NSTATE) + INTEGER ILCMLN,ILCMTY + INTEGER IEN,ITC,ITYPRO + INTEGER IKHST,IKEVO,IKMAP + INTEGER NCELL,IUPDC,IUPDB + TYPE(C_PTR) IPHST,IPEVO,IPMAP +*---- +* HISTORY Parameters +*---- + INTEGER MAXG,MAXL,NBUNH,NCHAH, + > ITSOLH,ITBURH,MAXIH,NREGH + REAL BUNLEN +*---- +* BURNUP Parameters +*---- + INTEGER ITSOLB,ITBURB,NBBTS,MAXIB + REAL REVOL(5) +*---- +* MAP Parameters +*---- + INTEGER NBUNM,NCHAM,NBFUEL +*---- +* Variables from HSTGDM +*---- + INTEGER IPRINT,NGLO,NLOC,NBUN,NCHA,ITYRED + CHARACTER*12 CARRED + INTEGER II +*---- +* MEMORY ALLOCATION +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NAMG,NAML,IDCELL,IDFUEL, + > IREFUS + REAL, ALLOCATABLE, DIMENSION(:) :: PARAG,PARAL,REFUT,DENI,POWR, + > BURN +*---- +* initialize blank signatures +*---- + DO 100 IEN=1,MAXENT + SIGENT(IEN)=' ' + 100 CONTINUE + CBLANK=' ' + READ(CBLANK,'(A4)') IBLANK + ISTATB(:NSTATE)=0 + ISTATH(:NSTATE)=0 + ISTATM(:NSTATE)=0 +*---- +* PARAMETER VALIDATION. +* 1 or 2 data structures permitted +* If one data structure it must be an +* HISTORY structure, +* If two data structure, one of them must be and history +* while the second one can be a BURNUP or MAP structure +* Options: +* 2) [History] := HST: [History] [Burnup] :: ... ; +* 3) History := HST: [History] Map :: ... ; +* 3) Burnup := HST: History :: ... ; +*---- + IF(NENTRY .EQ. 0) THEN + CALL XABORT(NAMSBR// + >': At least one data structure expected.') + ELSE IF(NENTRY .GT. MAXENT) THEN + CALL XABORT(NAMSBR// + >': Maximum number of structures exceeded.') + ENDIF + DO 110 IEN=1,NENTRY + TEXT12=HENTRY(IEN) + IF(IENTRY(IEN) .NE. 1 .AND. IENTRY(IEN) .NE. 2) + > CALL XABORT(NAMSBR// + >': Data structure '//TEXT12//' must be of type LCM or XSM.') + 110 CONTINUE + IEN = 1 + IF(JENTRY(IEN) .EQ. 2 ) THEN + IF(NENTRY .EQ. 2) CALL XABORT(NAMSBR// + > ': First data structure must be in create or update mode.') + CALL LCMLEN(KENTRY(IEN),'SIGNATURE',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + CALL LCMGET(KENTRY(IEN),'SIGNATURE',NAMTMP) + WRITE(SIGENT(IEN),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + ENDIF + ELSE IF(JENTRY(IEN) .EQ. 1 ) THEN + CALL LCMLEN(KENTRY(IEN),'SIGNATURE',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + CALL LCMGET(KENTRY(IEN),'SIGNATURE',NAMTMP) + WRITE(SIGENT(IEN),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + ENDIF + ENDIF + IF(NENTRY .EQ. 2) THEN + IEN = 2 + IF(JENTRY(IEN) .NE. 2 ) CALL XABORT(NAMSBR// + > ': Second data structure must be in read-only mode.') + CALL LCMLEN(KENTRY(IEN),'SIGNATURE',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0) CALL XABORT(NAMSBR// + >': No signature found on second data structure') + CALL LCMGET(KENTRY(IEN),'SIGNATURE',NAMTMP) + WRITE(SIGENT(IEN),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + ENDIF + IKHST=0 + IKEVO=0 + IKMAP=0 + DO 111 IEN=1,NENTRY + IF (SIGENT(IEN) .EQ. 'L_HISTORY ') THEN + IF(IKHST .NE. 0) CALL XABORT(NAMSBR// + > ': Two history structure forbidden.') + IKHST=IEN + ELSE IF(SIGENT(IEN) .EQ. 'L_BURNUP ') THEN + IF(IKEVO .NE. 0) CALL XABORT(NAMSBR// + > ': Two burnup structure forbidden.') + IKEVO=IEN + ELSE IF(SIGENT(IEN) .EQ. 'L_MAP ') THEN + IF(IKMAP .NE. 0) CALL XABORT(NAMSBR// + > ': Two map structure forbidden.') + IKMAP=IEN + ELSE IF(SIGENT(IEN) .NE. ' ') THEN + CALL XABORT(NAMSBR// + > ': At least on structure type is invalid.') + ENDIF + 111 CONTINUE + BUNLEN=1.0 +*---- +* For structures with SIGNATURE read STATE-VECTOR +*---- + IF(IKHST .GT. 0) THEN + CALL LCMGET(KENTRY(IKHST),'STATE-VECTOR',ISTATH) + CALL LCMGET(KENTRY(IKHST),'BUNDLELENGTH',BUNLEN) + ENDIF + IF(IKEVO .GT. 0) THEN + CALL LCMGET(KENTRY(IKEVO),'STATE-VECTOR',ISTATB) + CALL LCMGET(KENTRY(IKEVO),'EVOLUTION-R ',REVOL) + ENDIF + IF(IKMAP .GT. 0) THEN + CALL LCMGET(KENTRY(IKMAP),'STATE-VECTOR',ISTATM) + ENDIF +*---- +* Select type of processing depending +* on order of structures +* ITYPRO = 1 : History := HST: :: +* ITYPRO = 2 : History := HST: History :: +* ITYPRO = 3 : History := HST: Burnup :: +* ITYPRO = 4 : History := HST: History Burnup :: +* ITYPRO = 5 : History := HST: Map :: +* ITYPRO = 6 : History := HST: History Map :: +* ITYPRO = -1 : := HST: History :: +* ITYPRO = -3 : Burnup := HST: History :: +* ITYPRO = -4 : Burnup := HST: Burnup History :: +* ITYPRO = -5 : Map := HST: Map History :: +*---- + IF(NENTRY .EQ. 1) THEN + IF(IKEVO .NE. 0 .OR. IKMAP .NE. 0) CALL XABORT(NAMSBR// + > ': A single burnup or map structure forbidden.') + IF(IKHST .EQ. 1) THEN + ITYPRO=2 + IF(JENTRY(1) .EQ. 2) THEN + ITYPRO=-1 + ENDIF + ELSE + IKHST=1 + ITYPRO=1 + SIGENT(IKHST)='L_HISTORY ' + READ(SIGENT(IKHST),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + CALL LCMPUT(KENTRY(IKHST),'SIGNATURE',NTC,3,NAMTMP) + ENDIF + ELSE + IF(IKHST .EQ. 2) THEN + IF(IKMAP .EQ. 1) THEN + ITYPRO = -5 + ELSE IF(IKEVO .EQ. 1) THEN + ITYPRO=-4 + ELSE + ITYPRO=-3 + IKEVO=1 + SIGENT(IKEVO)='L_BURNUP ' + READ(SIGENT(IKEVO),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + CALL LCMPUT(KENTRY(IKEVO),'SIGNATURE',NTC,3,NAMTMP) + ENDIF + ELSE IF(IKEVO.EQ.2) THEN + IF(IKHST .EQ. 1) THEN + ITYPRO=4 + ELSE + ITYPRO=3 + IKHST=1 + SIGENT(IKHST)='L_HISTORY ' + READ(SIGENT(IKHST),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + CALL LCMPUT(KENTRY(IKHST),'SIGNATURE',NTC,3,NAMTMP) + ENDIF + ELSE IF(IKMAP.EQ.2) THEN + IF(IKHST .EQ. 1) THEN + ITYPRO=6 + ELSE + ITYPRO=5 + IKHST=1 + SIGENT(IKHST)='L_HISTORY ' + READ(SIGENT(IKHST),'(3A4)') (NAMTMP(ITC),ITC=1,NTC) + CALL LCMPUT(KENTRY(IKHST),'SIGNATURE',NTC,3,NAMTMP) + ENDIF + ELSE + CALL XABORT(NAMSBR// + > ': A read-only burnup or map structure required.') + ENDIF + ENDIF + IF(IKHST .NE. 0) IPHST=KENTRY(IKHST) + IF(IKEVO .NE. 0) IPEVO=KENTRY(IKEVO) + IF(IKMAP .NE. 0) IPMAP=KENTRY(IKMAP) +*---- +* Get elements of HISTORY STATE-VECTOR +*---- + MAXG =ISTATH( 1) + MAXL =ISTATH( 2) + NBUNH =ISTATH( 3) + NCHAH =ISTATH( 4) + ITSOLH=ISTATH( 6) + ITBURH=ISTATH( 7) + MAXIH =ISTATH( 8) + NREGH =ISTATH(10) + IF(IDEB .EQ. 1) THEN + WRITE(IOUT,7000) (ISTATH(II),II=1,8),ISTATH(10) + ENDIF +*---- +* Get elements of BURNUP STATE-VECTOR +*---- + ITSOLB=ISTATB(1) + ITBURB=ISTATB(2) + NBBTS =ISTATB(3) + MAXIB =ISTATB(4) + IF(IDEB .EQ. 1) THEN + WRITE(IOUT,7001) (ISTATB(II),II=1,6) + ENDIF + IF(ITYPRO .EQ. 3 .OR. ITYPRO .EQ. 4) THEN + ITSOLH=ITSOLB + ITBURH=ITBURB + IF(MAXIH .NE. 0 .AND. MAXIH .NE. MAXIB) CALL XABORT(NAMSBR// + > ': Different number of isotopes in history and burnup') + MAXIH=MAXIB + ELSE IF(ITYPRO .EQ. -3 .OR. ITYPRO .EQ. -4) THEN + ITSOLB=ITSOLH + ITBURB=ITBURH + IF(MAXIB .NE. 0 .AND. MAXIB .NE. MAXIH) CALL XABORT(NAMSBR// + > ': Different number of isotopes in history and burnup') + MAXIB=MAXIH + ENDIF +*---- +* Get elements of MAP STATE-VECTOR +* and verify consistency with history information +*---- + NBUNM =ISTATM(1) + NCHAM =ISTATM(2) + IF(NBUNM .NE. 0) THEN + IF(NBUNH .EQ. 0) THEN + NBUNH=NBUNM + ELSE IF(NBUNH .NE. NBUNM) THEN + CALL XABORT(NAMSBR//': Different number of bundles in'// + > ' MAP and HISTORY structures') + ENDIF + ENDIF + IF(NCHAM .NE. 0) THEN + IF(NCHAH .EQ. 0) THEN + NCHAH=NCHAM + ELSE IF(NCHAH .NE. NCHAM) THEN + CALL XABORT(NAMSBR//': Different number of channels in'// + > ' MAP and HISTORY structures') + ENDIF + ENDIF +*---- +* Test compatibility of HISTORY, BURNUP and MAP data structures. +*---- + IF(ITYPRO .EQ. 4 .OR. ITYPRO .EQ. -4) THEN + IF(ITSOLB .NE. ITSOLH .OR. + > ITBURB .NE. ITBURH .OR. + > MAXIB .NE. MAXIH ) CALL XABORT(NAMSBR// + > ': HISTORY and BURNUP parameters incompatible') + ELSE IF(ITYPRO .EQ. 6) THEN + IF(NBUNM .NE. NBUNH .OR. + > NCHAM .NE. NCHAH ) CALL XABORT(NAMSBR// + > ': HISTORY and MAP parameters incompatible') + ENDIF +*---- +* Get EDIT level and dimensioning parameters for history structure +* and test their validity +*---- + IPRINT=1 + NGLO =MAXG + NLOC =MAXL + NBUN =NBUNH + NCHA =NCHAH + CALL HSTGDM(IPRINT,NGLO ,NLOC ,NCHA ,NBUN , + > BUNLEN,ITYRED,CARRED) +*---- +* Test dimensioning parameters for coherence +* with already defined parameters +*---- + MAXG=MAX(MAXG,NGLO) + MAXL=MAX(MAXL,NLOC) + IF(NBUN .LE. 0 ) CALL XABORT(NAMSBR// + >': Number of bundles must be larger than 0') + IF(NCHA .LE. 0 ) CALL XABORT(NAMSBR// + >': Number of channels must be larger than 0') + IF(NBUNH .GT. 0 .AND. NBUN .NE. NBUNH) CALL XABORT(NAMSBR// + >': Number of bundles on input'// + >' different from HISTORY, MAP or BURNUP structures') + NBUNH=MAX(NBUN,NBUNH) + IF(NCHAH .GT. 0 .AND. NCHA .NE. NCHAH) CALL XABORT(NAMSBR// + >': Number of channels on input'// + >' different from HISTORY, MAP or BURNUP structures') + NCHAH=MAX(NCHA,NCHAH) + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6010) NGLO,NLOC,NCHA,NBUN + ENDIF +*---- +* Allocate memory for global and local parameters +*---- + ALLOCATE(NAMG(3*(MAXG+1)),PARAG(MAXG+1),NAML(3*(MAXL+1)), + > PARAL((MAXL+1)*2)) + NAMG(:3*(MAXG+1))=IBLANK + PARAG(:MAXG+1)=0.0 + NAML(:3*(MAXL+1))=IBLANK + IF(ISTATH(1) .GT. 0) THEN + CALL LCMGET(IPHST,'NAMEGLOBAL ',NAMG(4)) + CALL LCMGET(IPHST,'PARAMGLOBAL ',PARAG(2)) + IF(IDEB .GE. 1) THEN + WRITE(IOUT,'(A18,2I10)') 'Initial NAMEGLOBAL',MAXG,ISTATH(1) + WRITE(IOUT,'(6(3A4,2X))') (NAMG(3+II),II=1,3*MAXG) + ENDIF + ENDIF + IF(ISTATH(2) .GT. 0) THEN + CALL LCMGET(IPHST,'NAMELOCAL ',NAML(4)) + IF(IDEB .GE. 1) THEN + WRITE(IOUT,'(A18,2I10)') 'Initial NAMELOCAL ',MAXL,ISTATH(2) + WRITE(IOUT,'(6(3A4,2X))') (NAML(3+II),II=1,3*MAXL) + ENDIF + ENDIF + IF(NCHAH .LT. 1 .OR. NBUNH .LT. 1 ) CALL XABORT(NAMSBR// + >': Both the number of channels and bundles must be > 0') +*---- +* Allocate memory for core description +*---- + NCELL=NCHAH*NBUNH + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6011) NCELL,NCHAH,MAXIH + ENDIF + ALLOCATE(IDCELL(NCELL),IDFUEL(NCELL),IREFUS(NCHAH),REFUT(NCHAH)) + IDCELL(:NCELL)=0 + IDFUEL(:NCELL)=0 + IF(ISTATH( 3)*ISTATH( 4) .GT. 0) THEN + CALL LCMGET(IPHST,'CELLID ',IDCELL) + CALL LCMGET(IPHST,'FUELID ',IDFUEL) + ENDIF + IREFUS(:NCHAH)=0 + REFUT(:NCHAH)=0.0 + ALLOCATE(DENI(MAXIH+1)) + NBFUEL=0 +*---- +* Allocate memory for MAP power +*---- + ALLOCATE(POWR(NCELL),BURN(NCELL)) + POWR(:NCELL)=0.0 + BURN(:NCELL)=0.0 + IF(ITYPRO .EQ. 5 .OR. ITYPRO .EQ. 6) THEN +*---- +* Read information from MAP data structure +* and update history using this information +*---- + CALL HSTUHM(IPHST, IPMAP, IPRINT, MAXL, NCHAH ,NBUNH, MAXIH, + > POWR,BURN,IREFUS, + > REFUT,BUNLEN,IDCELL,IDFUEL,PARAL,DENI) +*---- +* Update Map with History +*---- + ELSE IF(ITYPRO .EQ. -5) THEN + CALL HSTUMH(IPMAP, IPHST, IPRINT,NCHAH ,NBUNH, IDCELL, BURN) + ENDIF +*---- +* Release memory for MAP power +*---- + DEALLOCATE(BURN,POWR) +*---- +* Read or write remaining information on input +* Also extract information from history if required +*---- + CALL HSTGET(IPHST ,IPRINT,MAXG ,MAXL ,NCHAH ,NBUNH , + > ITYPRO,ITYRED,CARRED,IUPDC ,IUPDB , + > NAMG ,PARAG,NAML , + > PARAL,IDCELL,IDFUEL) + IF(ITYPRO .GT. 0) THEN + IF(MAXG .GT. 0) THEN + CALL LCMPUT(IPHST,'NAMEGLOBAL ',3*MAXG,3,NAMG(4)) + CALL LCMPUT(IPHST,'PARAMGLOBAL ', MAXG,2,PARAG(2)) + IF(IDEB .GE. 1) THEN + WRITE(IOUT,'(A18,2I10)') 'Final NAMEGLOBAL ',MAXG,ISTATH(1) + WRITE(IOUT,'(6(3A4,2X))') (NAMG(3+II),II=1,3*MAXG) + ENDIF + ENDIF + IF(MAXL .GT. 0) THEN + CALL LCMPUT(IPHST,'NAMELOCAL ',3*MAXL,3,NAML(4)) + IF(IDEB .GE. 1) THEN + WRITE(IOUT,'(A18,2I10)') 'Final NAMELOCAL ',MAXL,ISTATH(2) + WRITE(IOUT,'(6(3A4,2X))') (NAML(3+II),II=1,3*MAXL) + ENDIF + ENDIF + IF(NCELL .GT. 0) THEN + CALL LCMPUT(IPHST,'CELLID ',NCELL,1,IDCELL) + CALL LCMPUT(IPHST,'FUELID ',NCELL,1,IDFUEL) + ENDIF + ENDIF +*---- +* If channel and bundle specified +* Update information on HISTORY or BURNUP structures +*---- + IF(IUPDC .GT. 0 .AND. IUPDB .GT. 0) THEN +*---- +* Allocate memory for isotopes and burnup +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR,IUPDC,IUPDB + ENDIF + IF(ITYPRO .EQ. 3 .OR. ITYPRO .EQ. 4) THEN +*---- +* Update HISTORY information from BURNUP data for +* channel IUPDC, bundle IUPDB. +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6001) + ENDIF + CALL HSTUHB(IPHST ,IPEVO ,IPRINT,MAXIH ,NBBTS , + > NCHAH ,NBUNH ,IUPDC ,IUPDB , + > IDCELL,IDFUEL, + > DENI ,MAXL, PARAL) + ELSE IF(ITYPRO .EQ. -3 .OR. ITYPRO .EQ. -4) THEN +*---- +* Update BURNUP information from HISTORY data for +* channel IUPDC, bundle IUPDB. +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6002) + ENDIF + CALL HSTUBH(IPEVO ,IPHST ,IPRINT,MAXIH ,NBBTS , + > NCHAH ,NBUNH ,IUPDC ,IUPDB , + > IDCELL,IDFUEL,DENI) + ENDIF + ENDIF + DEALLOCATE(DENI,REFUT,IREFUS,IDFUEL,IDCELL,PARAL,NAML,PARAG,NAMG) + IF(ITYPRO .GT. 0) THEN +*---- +* Saving updated HISTORY state vector +*---- + CALL LCMPUT(IPHST,'BUNDLELENGTH',1,2,BUNLEN) + ISTATH(:NSTATE)=0 + ISTATH( 1) = MAXG + ISTATH( 2) = MAXL + ISTATH( 3) = NBUNH + ISTATH( 4) = NCHAH + ISTATH( 5) = 0 + ISTATH( 6) = ITSOLH + ISTATH( 7) = ITBURH + ISTATH( 8) = MAXIH + ISTATH(10) = NREGH + IF(IPRINT .EQ. 10) THEN + WRITE(IOUT,7010) (ISTATH(II),II=1,8),ISTATH(10) + ENDIF + CALL LCMPUT(IPHST,'STATE-VECTOR',NSTATE,1,ISTATH) + ELSE IF(ITYPRO .EQ. -3 .OR. ITYPRO .EQ. -4 ) THEN +*---- +* Set burnup parameters to default values +* See subroutine EVO.f +*---- + REVOL(1)=1.0E-5 + REVOL(2)=1.0E-4 + REVOL(3)=80.0 + REVOL(4)=1.0E-4 + REVOL(5)=0.0 + CALL LCMPUT(IPEVO,'EVOLUTION-R ',5,2,REVOL) +*---- +* Saving updated BURNUP state vector +*---- + ISTATB(:NSTATE)=0 + ISTATB( 1) = ITSOLB + ISTATB( 2) = ITBURB + IF(ISTATB( 1) .EQ. 0) ISTATB( 1) = 2 + IF(ISTATB( 2) .EQ. 0) ISTATB( 2) = 2 + ISTATB( 3) = 1 + ISTATB( 4) = MAXIH + ISTATB( 8) = NCHA*NBUN + IF(IPRINT .GT. 1) THEN + WRITE(IOUT,7011) (ISTATB(II),II=1,8) + ENDIF + CALL LCMPUT(IPEVO,'STATE-VECTOR',NSTOLD,1,ISTATB) + ENDIF +*---- +* Module execution completed +*---- + RETURN +*---- +* FORMATS +*---- + 6000 FORMAT(' ***** OUTPUT FROM ',A6/ + >' Processing: Channel ',I10,5X,'Bundle ',I10) + 6001 FORMAT(' Updating HISTORY from BURNUP') + 6002 FORMAT(' Updating BURNUP from HISTORY') + 6010 FORMAT(' ***** General dimensioning '/ + > 10X,'NGLO =',I10,5X,'NLOC =',I5/ + > 10X,'NCHA =',I10,5X,'NBUN =',I5) + 6011 FORMAT(10X,'NCELL =',I10,5X,'NCHAH =',I5/ + > 10X,'MAXIH =',I10) + 7000 FORMAT(' Initial contents of HISTORY state vector'/ + >5X,'MAXG = ',I5,5X,'MAXL = ',I5,5X,'NBUNH = ',I5,/ + >5X,'NCHAH = ',I5,5X,' = ',I5,5X,'ITSOLH= ',I5,/ + >5X,'ITBURH= ',I5,5X,'MAXIH = ',I5,5X,'NREGH = ',I5) + 7001 FORMAT(' Initial contents of BURNUP state vector'/ + >5X,'ITSOL = ',I5,5X,'ITBUR = ',I5,5X,'NBBTS = ',I5,/ + >5X,'MAXI = ',I5,5X,'NGRP = ',I5,5X,'NREG = ',I5) + 7010 FORMAT(' Final contents of HISTORY state vector'/ + >5X,'MAXG = ',I5,5X,'MAXL = ',I5,5X,'NBUNH = ',I5,/ + >5X,'NCHAH = ',I5,5X,' = ',I5,5X,'ITSOLH= ',I5,/ + >5X,'ITBURH= ',I5,5X,'MAXIH = ',I5,5X,'NREGH = ',I5) + 7011 FORMAT(' Final contents of BURNUP state vector'/ + >5X,'ITSOL = ',I5,5X,'ITBUR = ',I5,5X,'NBBTS = ',I5,/ + >5X,'MAXI = ',I5,5X,' = ',I5,5X,' = ',I5,/ + >5X,' = ',I5,5X,'NBMIX = ',I5) + END diff --git a/Donjon/src/HSTGDM.f b/Donjon/src/HSTGDM.f new file mode 100644 index 0000000..d87011b --- /dev/null +++ b/Donjon/src/HSTGDM.f @@ -0,0 +1,143 @@ +*DECK HSTGDM + SUBROUTINE HSTGDM(IPRINT, NGLO, NLOC, NCHA, NBUN , + > BUNLEN, ITYRED, CARRED) +* +*---------- +* +*Purpose: +* To read the editing level and general dimensioning parameters +* for the \dds{history} data structure. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau +* +*Parameters: input/output +* IPRINT print level. +* NGLO number of global parameters. +* NLOC number of local parameters. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* BUNLEN length (cm) of a bundle. +* ITYRED type of the last variable read. +* CARRED last character string read. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPRINT,NGLO,NLOC,NCHA,NBUN + REAL BUNLEN + INTEGER ITYRED + CHARACTER*12 CARRED +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='HSTGDM') +*---- +* INPUT VARIABLES +* Input data is of the form +* [ EDIT iprint ] +* [ DIMENSIONS +* [ GLOBAL nglo ] +* [ LOCAL nloc ] +* [ BUNDL nbun bunl ] +* [ CHANNEL ncha ] +*---- + INTEGER ITYPLU,INTLIR + CHARACTER CARLIR*12 + REAL REALIR + DOUBLE PRECISION DBLLIR +*---- +* Initialize output variables variables +*---- + ITYPLU= 0 + CARLIR=' ' + 100 CONTINUE + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + 101 CONTINUE + IF(ITYPLU .EQ. 10) GO TO 105 + IF(ITYPLU .NE. 3) CALL XABORT(NAMSBR// + >': Read error -- Character variable expected') + IF(CARLIR .EQ. ';') THEN + GO TO 105 + ELSE IF(CARLIR(1:4) .EQ. 'EDIT') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) THEN + IPRINT=1 + GO TO 101 + ENDIF + IPRINT=INTLIR + GO TO 100 + ELSE IF(CARLIR(1:4) .EQ. 'DIME') THEN + 110 CONTINUE + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 3) CALL XABORT(NAMSBR// + > ': Read error -- Dimension type expected') + IF(CARLIR(1:4) .EQ. 'GLOB') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Number of global parameters expected') + NGLO=INTLIR + GO TO 110 + ELSE IF(CARLIR(1:4) .EQ. 'LOCA') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Number of local parameters expected') + NLOC=INTLIR + GO TO 110 + ELSE IF(CARLIR(1:4) .EQ. 'BUND') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Number of bundles expected') + NBUN=INTLIR + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR// + > ': Bundles length (cm) expected') + IF(REALIR .GT. 0.0) BUNLEN=REALIR + GO TO 110 + ELSE IF(CARLIR(1:4) .EQ. 'CHAN') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Number of channels expected') + NCHA=INTLIR + GO TO 110 + ELSE + GO TO 105 + ENDIF + ENDIF + 105 CONTINUE + IF(NGLO .LT. 0) THEN + NGLO=0 + WRITE(IOUT,8000) NAMSBR,'nglo' + ENDIF + IF(NLOC .LT. 0) THEN + NLOC=0 + WRITE(IOUT,8000) NAMSBR,'nloc' + ENDIF + IF(NBUN .LT. 0) THEN + NBUN=0 + WRITE(IOUT,8000) NAMSBR,'nbun' + ENDIF + IF(NCHA .LT. 0) THEN + NCHA=0 + WRITE(IOUT,8000) NAMSBR,'ncha' + ENDIF + ITYRED=ITYPLU + CARRED=CARLIR +*---- +* Format +*---- + 8000 FORMAT(' ****** WARNING in ',A6,' ****** '/ + > ' Problem : ',A4,1X,' < 0'/ + > ' Solution : assume this parameter is not read'/ + > ' ******************************') + RETURN + END diff --git a/Donjon/src/HSTGET.f b/Donjon/src/HSTGET.f new file mode 100644 index 0000000..6a1238a --- /dev/null +++ b/Donjon/src/HSTGET.f @@ -0,0 +1,398 @@ +*DECK HSTGET + SUBROUTINE HSTGET(IPHST, IPRINT, MAXG, MAXL, NCHA, NBUN, + > ITYPRO, ITYRED, CARRED, IUPDC, IUPDB, + > NAMG, PARAMG, NAML, PARAML, IDCELL, IDFUEL) +* +*---------- +* +*Purpose: +* To read from the input file or send to CLE-2000 variables the +* local and burnup parameters associated with a fuel cell. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPHST address of the \dds{history} data structure. +* IPRINT print level. +* MAXG maximum number of global parameters. +* MAXL maximum number of local parameters. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* ITYPRO type of processing where: +* ITYPRO > 0 if history is in creation or update mode; +* ITYPRO < 0 if history is in read-only mode. +* ITYRED type of the last variable read. +* CARRED last character string read. +* +*Parameters: input/output +* NMAG global parameter names. +* PARAMG values of the global parameters. +* NMAL local parameter names. +* PARAML values of the local parameters. +* IDCELL cell identifier for each fuel bundle in each channel. +* IDFUEL fuel type identifier for each fuel bundle in each channel. +* +*Parameters: output +* IUPDC number of the channel to analyze. +* IUPDB number of the bundle to analyze. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST + INTEGER IPRINT,MAXG,MAXL,NCHA,NBUN,ITYPRO + INTEGER ITYRED,IUPDC,IUPDB + CHARACTER CARRED*12 + INTEGER NAMG(3,0:MAXG),NAML(3,0:MAXL) + REAL PARAMG(0:MAXG),PARAML(0:MAXL,2) + INTEGER IDCELL(NBUN,NCHA),IDFUEL(NBUN,NCHA) +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NTC=3,ILCMUP=1,ILCMDN=2, + > NAMSBR='HSTGET') +*---- +* INPUT/OUTPUT VARIABLES +* Input data is of the form +* [ GET (hstpar) ] [ PUT (hstpar) ] +* [ CELLID icha ibun [ idfuel ] +* [ GET (hstpar) ] +* [ PUT { BREFL (hsrbrn) (hstpar) +* AREFL (hsrbrn) (hstpar) | +* [ AREFL ] (hsrbrn) (hstpar) } ] ] +* +* HERE: +* (hstpar) = NAMPAR valpar +* where NAMPAR is the name of a local or global +* parameter and valpar its value. +* (hstbrn) = BURN period power +* where period is the burnup time step +* and power the burnup power density in kW/kg. +* For global parameter: +* GET = implies that (hstpar) is transfered to the +* HISTORY file, +* PUT = implies that (hstpar) is transfered to +* CLE-2000 variables. +* For local parameters: +* GET = implies that (hstpar) is transfered to the +* HISTORY file for the case before and +* after refueling. +* PUT = implies that (hstbrn) and (hstpar) +* are transfered to CLE-2000 variables. +* BREFL = Indicates that the information before +* refueling is considered. +* AREFL = Indicates that the information after +* refueling is considered. +* This is the default option is neither +* BREFL nor AREFL is defined. +*---- + INTEGER ITYPLU,INTLIR + CHARACTER CARLIR*12 + REAL REALIR + DOUBLE PRECISION DBLLIR + INTEGER ITYPUT,INTPUT + CHARACTER CARPUT*12 + REAL REAPUT + DOUBLE PRECISION DBLPUT +*---- +* LOCAL VARIABLES +*---- + INTEGER ICONTR,IGP,IFTN,ISREF,IUPDL,IUPDG,IUPDF + INTEGER ITC,INEXT,IB,IC,IPL,IP + INTEGER ICT,IOK + CHARACTER NAMP*12 + REAL TIMPOW(2,2) +*---- +* Initialize input vectors +*---- + PARAML(0:MAXL,:2)=0.0 + TIMPOW(:2,:2)=0.0 +*---- +* Initialize variables +* IUPDC -> channel number to process or update. +* IUPDB -> bundle number to process or update. +* ICONTR -> indicates processing of ITYRED and CARRED +* = 0 processing required. +* = 1 processing has been performed. +* IGP -> indicate if a GET or PUT command is in effect. +* =-1 PUT command in effect +* = 0 no GET or PUT command in effect +* = 1 GET command in effect +* IFTN = new fuel type +* ISREF -> indicate the REFUEL state +* is to be processed +* = 0 no processing +* = 1 processing before refuel +* = 2 processing after refuel +* IUPDL -> indicates local parameters update +* = 0 no update +* > 0 updated +* IUPDG -> indicates global parameters update +* = 0 no update +* > 0 updated +* IUPDF -> Fuel type update +* = 0 no update +* > 0 updated +*---- + IUPDC=0 + IUPDB=0 + ICONTR=0 + IGP =0 + IFTN =0 + ISREF =0 + IUPDL =0 + IUPDG =0 + IUPDF =0 + 100 CONTINUE + IF(ICONTR .EQ. 0) THEN + ITYPLU=ITYRED + CARLIR=CARRED + ICONTR=1 + ELSE + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + ENDIF + 101 CONTINUE + IF(ITYPLU .EQ. 10) GO TO 105 + IF(ITYPLU .NE. 3) CALL XABORT(NAMSBR// + >': Read error -- Character variable expected') + IF(CARLIR .EQ. ';') THEN + GO TO 105 + ELSE IF(CARLIR .EQ. 'CELLID') THEN + IGP=0 +*---- +* Channel number +*---- + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Read error -- integer value for channel number expected.') + IF(INTLIR .LT. 0 ) CALL XABORT(NAMSBR// + > ': Read error -- value for channel number must be > 0.') + IF(IUPDC .NE. 0) CALL XABORT(NAMSBR// + > ': Only one channel can be updated for each call to HST.') + IUPDC=INTLIR +*---- +* Bundle number +*---- + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Read error -- integer value for bundle number expected.') + IF(INTLIR .LT. 0 ) CALL XABORT(NAMSBR// + > ': Read error -- value for bundle number must be > 0') + IF(IUPDB .NE. 0) CALL XABORT(NAMSBR// + > ': Only one bundle can be updated for each call to HST.') + IUPDB=INTLIR +*---- +* Fuel type (optional) +*---- + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IFTN=-1 + IF(ITYPLU .EQ. 1) THEN + IFTN=INTLIR + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + ENDIF +*---- +* IF CELL IS NOT IDENTIFIED ASSOCIATE TO CELL NEXT +* CELL NUMBER AVAILABLE AND TO FUEL TYPE +* VALUE PROVIDED IN IFTN +*---- + IF(IDCELL(IUPDB,IUPDC) .LE. 0) THEN + DO 110 INEXT=1,NBUN*NCHA + DO 111 IB=1,NBUN + DO 112 IC=1,NCHA + IF(IDCELL(IB,IC) .EQ. INEXT) GO TO 115 + 112 CONTINUE + 111 CONTINUE + IDCELL(IUPDB,IUPDC)=INEXT + GO TO 116 + 115 CONTINUE + 110 CONTINUE + CALL XABORT(NAMSBR//': No cell id available') + 116 CONTINUE + IDFUEL(IUPDB,IUPDC)=ABS(IFTN) + ELSE +*---- +* CELL EXIST, READ IF POSSIBLE EXISTING LOCAL +* PARAMETERS VALUES +*---- + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) +*---- +* Get local parameters from cell before refueling +*---- + IOK=-1 + CALL HSTGSL(IPHST ,MAXL ,IOK , + > TIMPOW(1,1) ,PARAML(0,1)) + IF((IPRINT.GT.0).AND.(IOK.NE.0)) THEN + WRITE(IOUT,7000) NAMSBR + WRITE(IOUT,7010) IUPDC,IUPDB,'BEFORE' + ENDIF +*---- +* Get local parameters from cell after refueling +*---- + IOK=-2 + CALL HSTGSL(IPHST ,MAXL ,IOK , + > TIMPOW(1,2) ,PARAML(0,2)) + IF((IPRINT.GT.0).AND.(IOK.NE.0)) THEN + WRITE(IOUT,7000) NAMSBR + WRITE(IOUT,7010) IUPDC,IUPDB,'AFTER ' + ENDIF + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + GO TO 101 + ELSE IF(CARLIR .EQ. 'GET') THEN + IF(ITYPRO .LT. 0) CALL XABORT(NAMSBR// + >': Option GET not permitted for history in read only mode') + IGP=1 + ISREF=2 + ELSE IF(CARLIR .EQ. 'PUT') THEN + IGP=-1 + ISREF=2 + ELSE IF(CARLIR .EQ. 'BREFL') THEN + IF(IGP .NE. -1) CALL XABORT(NAMSBR// + >': Option BREFL permitted for PUT only') + ISREF=1 + ELSE IF(CARLIR .EQ. 'AREFL') THEN + IF(IGP .NE. -1) CALL XABORT(NAMSBR// + >': Option AREFL permitted for PUT only') + ISREF=2 + ELSE + IF(IGP .EQ. 0) CALL XABORT(NAMSBR// + > ': GET or PUT must be specified ') + IF(IUPDC*IUPDB .GT. 0) THEN +*---- +* CARLIR contains a local parameter +*---- + IF(CARLIR .EQ. 'BURN') THEN + IF(IGP .EQ. 1) CALL XABORT(NAMSBR// + >': Option GET not permitted for BURN keyword') + IF(ITYPRO .GT. 0) CALL XABORT(NAMSBR// + >': Option BURN permitted only for history in read only mode') + REAPUT=TIMPOW(1,ISREF) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for burnup period expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) +*---- +* The power density expected is in kW/kg. +*---- + REAPUT=TIMPOW(2,ISREF) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for burnup power expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) + ELSE +*---- +* Scan local parameters to see is CARLIR is one of them +*---- + IP=0 + DO 120 IPL=1,MAXL + WRITE(NAMP,'(3A4)') (NAML(ITC,IPL),ITC=1,NTC) + IF(NAMP .EQ. CARLIR) THEN + IP=IPL + GO TO 125 + ELSE IF(NAMP .EQ. ' ') THEN + IP=IPL + READ(CARLIR,'(3A4)') (NAML(ITC,IP),ITC=1,NTC) + GO TO 125 + ENDIF + 120 CONTINUE + CALL XABORT(NAMSBR//': Number of local parameters '// + > 'provided larger than number permitted.') + 125 CONTINUE + IF(IGP .EQ. -1) THEN + REAPUT=PARAML(IP,ISREF) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for local parameter expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) + ELSE IF(IGP .EQ. 1) THEN + IUPDL=IUPDL+1 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR// + > ': Real value for local parameter missing.') + PARAML(IP,ISREF)=REALIR + ENDIF + ENDIF + ELSE +*---- +* CARLIR contains a global parameter +*---- + IF(CARLIR .EQ. 'POWER') THEN + CALL XABORT(NAMSBR// + > ': POWER is a local not global parameter') + ELSE + IP=0 + DO 130 IPL=1,MAXG + WRITE(NAMP,'(3A4)') (NAMG(ITC,IPL),ITC=1,NTC) + IF(NAMP .EQ. CARLIR) THEN + IP=IPL + GO TO 135 + ELSE IF(NAMP .EQ. ' ') THEN + IP=IPL + READ(CARLIR,'(3A4)') (NAMG(ITC,IP),ITC=1,NTC) + GO TO 135 + ENDIF + 130 CONTINUE + CALL XABORT(NAMSBR//': Number of global parameters '// + > 'provided larger than number permitted.') + 135 CONTINUE + IF(IGP .EQ. -1) THEN + REAPUT=PARAMG(IP) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for global parameter expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) + ELSE IF(IGP .EQ. 1) THEN + IUPDG=IUPDG+1 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR// + > ': Real value for global parameter missing.') + PARAMG(IP)=REALIR + ENDIF + ENDIF + ENDIF + ENDIF + GO TO 100 + 105 CONTINUE +*---- +* Save global parameters if some are updated +*---- + IF(IUPDG .GT. 0) THEN + CALL LCMPUT(IPHST,'NAMEGLOBAL ',3*MAXG,3,NAMG(1,1)) + CALL LCMPUT(IPHST,'PARAMGLOBAL ',MAXG,2,PARAMG(1)) + ENDIF + IF(IUPDL .GT. 0) THEN + CALL LCMPUT(IPHST,'NAMELOCAL ',3*MAXL,3,NAML(1,1)) + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=2 + CALL HSTGSL(IPHST ,MAXL ,IOK , + > TIMPOW(1,2) ,PARAML(0,2)) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + RETURN +*---- +* Formats +* WARNING +*---- + 7000 FORMAT(' ***** WARNING IN ',A6,' *****') + 7010 FORMAT(' Local parameters for channel ',I5,' bundle ',I5, + > ' not available for ',A6,' state'/ + > ' Initialize to 0.0') + END diff --git a/Donjon/src/HSTGMA.f b/Donjon/src/HSTGMA.f new file mode 100644 index 0000000..c0c8488 --- /dev/null +++ b/Donjon/src/HSTGMA.f @@ -0,0 +1,126 @@ +*DECK HSTGMA + SUBROUTINE HSTGMA(IPMAP, NCHA, NBUN, DELTAT, POWER, + > BURNP, IREFUS, REFUT, NBFUEL) +* +*---------- +* +*Purpose: +* To read from the MAP data structure the power and +* burnup distribution for each cell as well as the refueling +* option for each channel. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau, E. Varin +* +*Parameters: input +* IPMAP address of the \dds{map} data structure. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* IPMAP pointer to the MAP data structure +* NCHA number of fuel channels. +* NBUN number of bundles per channels. +* +*Parameters: input/output +* DELTAT last character string read. +* POWER power for each fuel bundle in each channel. +* BURNP burnup for each fuel bundle in each channel. +* IREFUS refueling strategy for each channel. +* REFUT refueling time for each channel. +* NBFUEL number of fueled channels. +* DELTAT next time steps for burnup. +* POWER values of local powers. +* IREFUS fuels shift for each channel. +* A channel is refueled using a NBS bundle +* shift procedure if IREFUS(I)=NBS. +* In the case where NBS $>$ 0, +* bundles 1 to NBUN-NBS are displaced to position NBS+1 to +* NBUN while locations 1 to NBS are filled with new fuel. +* In the case where NBS $<$ 0, +* bundles -NBS+1 to NBUN are displaced to position 1 to +* NBUN+NBS while locations NBUN+NBS+1 to NBUN are filled +* with new fuel. +* REFUT channel refueling time. +* NBFUEL number of fueled channels +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCHA,NBUN + REAL DELTAT + REAL POWER(NCHA,NBUN),BURNP(NCHA,NBUN) + INTEGER IREFUS(NCHA) + REAL REFUT(NCHA) + INTEGER NBFUEL +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NTC=3,ILCMUP=1,ILCMDN=2, + > NAMSBR='HSTGMA') +*---- +* LOCAL VARIABLES +*---- + INTEGER ILCMLN,ILCMTY + INTEGER IC +*---- +* Read DEPL-TIME +*---- + CALL LCMLEN(IPMAP,'DEPL-TIME ',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + IF(ILCMLN .GT. 1) CALL XABORT(NAMSBR// + > ': Space to store next time step is too small') + CALL LCMGET(IPMAP,'DEPL-TIME ',DELTAT) + ENDIF +*---- +* Read bundle powers +*---- + CALL LCMLEN(IPMAP,'BUND-PW',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + IF(ILCMLN .GT. NCHA*NBUN) CALL XABORT(NAMSBR// + > ': Space to store power is too small') + CALL LCMGET(IPMAP,'BUND-PW',POWER) + ENDIF +*---- +* Read BURNUP IF DELTAT=0.0 +*---- + BURNP(:NCHA,:NBUN)=0.0 + IF(DELTAT.EQ.0.0) THEN + CALL LCMLEN(IPMAP,'BURN-INST',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + IF(ILCMLN .GT. NCHA*NBUN) CALL XABORT(NAMSBR// + > ': Space to store burnup is too small') + CALL LCMGET(IPMAP,'BURN-INST',BURNP) + ENDIF + ENDIF +*---- +* Read refueling scheme +*---- + CALL LCMLEN(IPMAP,'REF-SCHEME',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + IF(ILCMLN .GT. NCHA) CALL XABORT(NAMSBR// + > ': Space to store REF-SCHEME is too small') + CALL LCMGET(IPMAP,'REF-SCHEME',IREFUS) + ENDIF + CALL LCMLEN(IPMAP,'REF-CHAN',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0) THEN + IF(ILCMLN .GT. NCHA) CALL XABORT(NAMSBR// + > ': Space to store REF-CHAN is too small') + CALL LCMGET(IPMAP,'REF-CHAN',REFUT) + ENDIF +*---- +* Compute number of channels refueled +*---- + DO 100 IC=1,NCHA + IF(REFUT(IC) .GT. 0.0) NBFUEL=NBFUEL+1 + 100 CONTINUE + RETURN + END diff --git a/Donjon/src/HSTGSD.f b/Donjon/src/HSTGSD.f new file mode 100644 index 0000000..1008d58 --- /dev/null +++ b/Donjon/src/HSTGSD.f @@ -0,0 +1,100 @@ +*DECK HSTGSD + SUBROUTINE HSTGSD(IPHST, MAXI, IOK, DENI, FDEN ) +* +*---------- +* +*Purpose: +* To read from or write to to history file +* isotopic and fuel densities. +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPHST address of the \dds{history} data structure. +* MAXI maximum number of isotopes. +* +*Parameters: input/output +* IOK processing option where: +* --> on input, a negative value indicates +* that the information is to be extracted +* from the \dds{history} data structure and a +* positive value indicates that the information is to be +* stored on the \dds{history} data structure; +* --> on output, a value of 0 indicates that +* the required processing took place +* successfully while a negative value indicates +* a failure of the processing. +* DENI isotopic concentration. +* FDEN average fuel density and weight. +* IOK status of read. +* On input -> IOK< 0 means get densities +* densities +* On input -> IOK> 0 means save densities +* On output -> IOK= 0 success +* IOK=-1 error: density missing +* IOK=-2 error: involid processing option +* DENI initial and final isotopic concentration. +* FDEN initial fuel density and heavy element mass. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST + INTEGER MAXI,IOK + REAL DENI(0:MAXI) + REAL FDEN(2) +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='HSTGSD') +*---- +* LOCAL VARIABLES +*---- + INTEGER ILCMLN,ILCMTY +*---- +* Local parameters after refuel +*---- + IF(IOK .LT. 0) THEN + IOK=0 +*---- +* Get isotopes concentration +*---- + CALL LCMLEN(IPHST,'ISOTOPESDENS',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0 .OR. ILCMLN .GT. MAXI) THEN + IOK=-1 + ELSE + CALL LCMGET(IPHST,'ISOTOPESDENS',DENI(1)) + ENDIF +*---- +* Get fuel density +*---- + CALL LCMLEN(IPHST,'FUELDEN-INIT',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0 .OR. ILCMLN .GT. 2) THEN + IOK=-1 + ELSE + CALL LCMGET(IPHST,'FUELDEN-INIT',FDEN) + ENDIF + ELSE IF(IOK .GT. 0) THEN + IOK=0 +*---- +* Put isotopes concentration +*---- + CALL LCMPUT(IPHST,'ISOTOPESDENS',MAXI,2,DENI(1)) +*---- +* Put fuel density +*---- + CALL LCMPUT(IPHST,'FUELDEN-INIT',2,2,FDEN) + ELSE + IOK=-2 + ENDIF + RETURN + END diff --git a/Donjon/src/HSTGSL.f b/Donjon/src/HSTGSL.f new file mode 100644 index 0000000..be685b8 --- /dev/null +++ b/Donjon/src/HSTGSL.f @@ -0,0 +1,111 @@ +*DECK HSTGSL + SUBROUTINE HSTGSL(IPHST, MAXL, IOK, TIMPOW, PARAML) +* +*---------- +* +*Purpose: +* To read from or save to history file the local parameters +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPHST address of the \dds{history} data structure. +* MAXL maximum number of local parameters. +* +*Parameters: input/output +* IOK processing option where: +* --> on input, a negative value indicates that the +* information is to be extracted from the \dds{history} data +* structure and a positive value indicates that the information +* is to be stored on the \dds{history} data structure +* (-1 and 1 for before refueling and -2, 2 for after refueling); +* --> on output, a value of 0 indicates that the required +* processing took place successfully while a negative +* value indicates a failure of the processing. +* TIMPOW burnup time and power density. +* PARAML local parameters. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST + INTEGER MAXL,IOK + REAL PARAML(0:MAXL) + REAL TIMPOW(2) +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='HSTGSL') +*---- +* LOCAL VARIABLES +*---- + INTEGER ILCMLN,ILCMTY +*---- +* Local parameters after refuel +*---- + IF(IOK .EQ. -2) THEN +*---- +* Get local parameters after refuel +*---- + CALL LCMLEN(IPHST,'PARAMLOCALAR',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0 .OR. ILCMLN .GT. MAXL) THEN + IOK=-1 + ELSE + CALL LCMGET(IPHST,'PARAMLOCALAR',PARAML(1)) + IOK=0 + ENDIF + CALL LCMLEN(IPHST,'PARAMBURNTAR',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0 .OR. ILCMLN .GT. 2) THEN + IOK=-1 + ELSE + CALL LCMGET(IPHST,'PARAMBURNTAR',TIMPOW) + IOK=0 + ENDIF + ELSE IF(IOK .EQ. -1) THEN +*---- +* Get local parameters before refuel +*---- + PARAML(0)=0 + CALL LCMLEN(IPHST,'PARAMLOCALBR',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0 .OR. ILCMLN .GT. MAXL) THEN + IOK=-1 + ELSE + CALL LCMGET(IPHST,'PARAMLOCALBR',PARAML(1)) + IOK=0 + ENDIF + CALL LCMLEN(IPHST,'PARAMBURNTBR',ILCMLN,ILCMTY) + IF(ILCMLN .LE. 0 .OR. ILCMLN .GT. 2) THEN + IOK=-1 + ELSE + CALL LCMGET(IPHST,'PARAMBURNTBR',TIMPOW) + IOK=0 + ENDIF + ELSE IF(IOK .EQ. 1) THEN +*---- +* Save local parameters before refuel +*---- + CALL LCMPUT(IPHST,'PARAMLOCALBR',MAXL,2,PARAML(1)) + CALL LCMPUT(IPHST,'PARAMBURNTBR',2,2,TIMPOW) + IOK=0 + ELSE IF(IOK .EQ. 2) THEN +*---- +* Save local parameters after refuel +*---- + CALL LCMPUT(IPHST,'PARAMLOCALAR',MAXL,2,PARAML(1)) + CALL LCMPUT(IPHST,'PARAMBURNTAR',2,2,TIMPOW) + IOK=0 + ELSE + IOK=-2 + ENDIF + RETURN + END diff --git a/Donjon/src/HSTREF.f b/Donjon/src/HSTREF.f new file mode 100644 index 0000000..50c9b4f --- /dev/null +++ b/Donjon/src/HSTREF.f @@ -0,0 +1,283 @@ +*DECK HSTREF + SUBROUTINE HSTREF(IPHST, IPRINT, MAXL, NCHA, NBUN, MAXI, + > DELTAT, POWER, IREFUS, REFUT, IDCELL, IDFUEL, + > PARAML, DENI, ISHUFF) +* +*---------- +* +*Purpose: +* Refuel channel by performing fuel shuffling. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau, E. Varin +* +*Parameters: input +* IPHST address of the \dds{history} data structure. +* IPRINT print level. +* MAXL maximum number of local parameters. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* MAXI maximum number of isotopes. +* DELTAT last character string read. +* POWER burnup power for each fuel bundle in each channel. +* IREFUS refueling strategy for each channel. +* refueling strategy for each channel. +* A channel is refueled using a NBS bundle +* shift procedure if IREFUS(I)=NBS. +* In the case where NBS $>$ 0, +* bundles 1 to NBUN-NBS are displaced to position NBS+1 to +* NBUN while locations 1 to NBS are filled with new fuel. +* In the case where NBS $<$ 0, +* bundles -NBS+1 to NBUN are displaced to position 1 to +* NBUN+NBS while locations NBUN+NBS+1 to NBUN are filled +* with new fuel. +* REFUT refueling time for each channel. +* +*Parameters: input/output +* IDCELL cell identifier for each fuel bundle in each channel. +* IDFUEL fuel type identifier for each fuel bundle in each channel. +* +*Parameters: work +* PARAML local parameters. +* DENI isotopic concentrations. +* ISHUFF fuel shuffling index for a channel. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST + INTEGER IPRINT,MAXL,NCHA,NBUN,MAXI + REAL DELTAT + REAL POWER(NCHA,NBUN) + INTEGER IREFUS(NCHA) + REAL REFUT(NCHA) + INTEGER IDCELL(NBUN,NCHA),IDFUEL(NBUN,NCHA) + REAL PARAML(0:MAXL,2) + REAL DENI(0:MAXI) + INTEGER ISHUFF(NBUN) +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NTC=3,ILCMUP=1,ILCMDN=2, + > NAMSBR='HSTREF') +*---- +* LOCAL VARIABLES +*---- + INTEGER IC,IB,IBS,IBO,ICT,IFT,IOK + REAL FDEN(2) + REAL TIMREF,TIMPOW(2) + CHARACTER NAMP*12 +*---- +* Take local paremeters after fueling +* and store in local parameters before fueling +* for all fuel cells +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7000) NAMSBR + ENDIF + DO 100 IC=1,NCHA + TIMREF=REFUT(IC) + IBS=IREFUS(IC) + DO 110 IB=1,NBUN + ICT=IDCELL(IB,IC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) +*---- +* Get local parameters from cell IB after refueling +*---- + IOK=-2 + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + IF(IOK .NE. 0) PARAML(0:MAXL,1)=0.0 +*---- +* Save local parameters from cell IB before refueling +*---- + IOK=1 + TIMPOW(1)=TIMREF + TIMPOW(2)=POWER(IC,IB) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + IOK=2 + TIMPOW(1)=DELTAT-TIMREF + TIMPOW(2)=POWER(IC,IB) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + 110 CONTINUE +*---- +* Look for channel to refuel +* -> REFUT(IC) > 0.0 +* Refuel channel according to IREFUS(IC) bundle shift +* IREFUS(IC) < 0 -> push bundles starting at I=NBUN side +* IREFUS(IC) > 0 -> push bundles starting at I=1 side +* For displaced fuel channels: +* Change IDCELL to new cell identifier after displacement +* For refuel channels +* Use IDCELL for channels removed from core and allocate +* then to new fuel. +*---- + IF(TIMREF .GT. 0.0) THEN + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7001) IC,IBS + ENDIF +*---- +* Find ISHUFF(IB)=IBO +* IBO > 0 is the position of the bundle IB before refueling +* IBO < 0 is the free position availables for refueling +*---- + ISHUFF(:NBUN)=0 + IF(IBS .GT. 0) THEN +*---- +* push bundles starting at I=1 side +* with +IBS > 0 bundle shifts +* 1) Displaced bundles : position 1 -- NBUN-IBS +* : position IBS+1 -- NBUN +*---- + IBO=0 + DO 120 IB=IBS+1,NBUN + IBO=IBO+1 + ISHUFF(IB)=IBO + 120 CONTINUE +*---- +* 2) Inserted bundles : positions 1 -- IBS +*---- + IBO=NBUN-IBS + DO 121 IB=1,IBS + IBO=IBO+1 + ISHUFF(IB)=-IBO + 121 CONTINUE + ELSE IF(IBS .LT. 0) THEN +*---- +* push bundles starting at I=NBUN side +* with -IBS > 0 bundle shifts +* 1) Displaced bundles : position -IBS +1 -- NBUN +* : position 1 -- NBUN+IBS +*---- + IBO=-IBS + DO 130 IB=1,NBUN+IBS + IBO=IBO+1 + ISHUFF(IB)=IBO + 130 CONTINUE +*---- +* 2) Inserted bundles : positions NBUN+IBS+1 -- NBUN +*---- + IBO=0 + DO 131 IB=NBUN+IBS+1,NBUN + IBO=IBO+1 + ISHUFF(IB)=-IBO + 131 CONTINUE + ENDIF +*---- +* treat refueling +*---- + DO 140 IB=1,NBUN +*---- +* Get local parameters from cell IB before refueling +*---- + ICT=IDCELL(IB,IC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=-1 + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + CALL LCMSIX(IPHST,NAMP,ILCMDN) +* + IBO=ISHUFF(IB) + IF(IBO .GT. 0) THEN +*---- +* Scan Displaced bundles +* and save properties at old cell location +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7010) IBO,IB + ENDIF +*---- +* Save local parameters to cell IBO after refueling +*---- + ICT=IDCELL(IBO,IC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=2 + TIMPOW(1)=DELTAT-TIMREF + TIMPOW(2)=POWER(IC,IB) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + CALL LCMSIX(IPHST,NAMP,ILCMDN) +*---- +* Save in ISHUFF IDCELL for IBO +*---- + ELSEIF(IBO .LT. 0) THEN +*---- +* Scan inserted fuel +* and save properties at reused cell location +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7011) IB + ENDIF + IBO=-IBO +*---- +* Get initial density for fuel type +*---- + IFT=IDFUEL(IB,IC) + WRITE(NAMP,'(A4,I8.8)') 'FUEL',IFT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=-1 + CALL HSTGSD(IPHST ,MAXI ,IOK ,DENI ,FDEN ) + CALL LCMSIX(IPHST,NAMP,ILCMDN) +*---- +* Save local parameters before and after refueling +* from cell IBO before refueling +* Save fuel density for fuel type +*---- + ICT=IDCELL(IBO,IC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=1 + TIMPOW(1)=0.0 + TIMPOW(2)=POWER(IC,IB) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + IOK=2 + TIMPOW(1)=DELTAT-TIMREF + TIMPOW(2)=POWER(IC,IB) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + IOK=2 + CALL HSTGSD(IPHST ,MAXI ,IOK ,DENI ,FDEN ) + CALL LCMSIX(IPHST,NAMP,ILCMDN) +*---- +* Save in ISHUFF IDCELL for IBO +*---- + ENDIF + ISHUFF(IB)=ICT + 140 CONTINUE +*---- +* Redefine IDCELL for new spatial location +* of cells after refueling +* Here assume that bundles are replaced +* with fuels of the same type +*---- + DO 160 IB=1,NBUN + IDCELL(IB,IC)=ISHUFF(IB) + 160 CONTINUE + ENDIF + 100 CONTINUE +*---- +* Save IDCELL and IDFUEL since they were updated +*---- + CALL LCMPUT(IPHST,'CELLID ',NBUN*NCHA,1,IDCELL) + CALL LCMPUT(IPHST,'FUELID ',NBUN*NCHA,1,IDFUEL) +*---- +* Return +*---- + RETURN +*---- +* Format +*---- + 7000 FORMAT(' ***** OUTPUT FROM ',A6,' *****') + 7001 FORMAT(' Refueling channel ',I8, ' with ',I8,' bundle shifts') + 7010 FORMAT(10X,' Fuel bundle ',I8,' displaced to position ',I8) + 7011 FORMAT(10X,' Fresh fuel inserted at position ',I8) + END diff --git a/Donjon/src/HSTUBH.f b/Donjon/src/HSTUBH.f new file mode 100644 index 0000000..a7b7bad --- /dev/null +++ b/Donjon/src/HSTUBH.f @@ -0,0 +1,178 @@ +*DECK HSTUBH + SUBROUTINE HSTUBH(IPEVO, IPHST, IPRINT, MAXI, NBBTS, NCHA, + > NBUN, IUPDC, IUPDB, IDCELL, IDFUEL, DENI) +* +*----------------------------------------------------------------------- +* +*Purpose: +* To update the BURNUP data structure using the information +* provided on the HISTORY data structure. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPEVO address of the \dds{burnup} data structure. +* IPHST address of the \dds{history} data structure. +* IPRINT print level. +* MAXI maximum number of isotopes. +* NBBTS number of depletion steps. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* IUPDC number of the channel to analyze. +* IUPDB number of the bundle to analyze. +* IDCELL cell identifier for each fuel bundle in each channel. +* IDFUEL fuel type identifier for each fuel bundle in each channel. +* +*Parameters: output +* NAMIH name of isotopes on the \dds{history} +* or \dds{burnup} structure. +* MIXIH mixture number associated with the isotopes +* on the \dds{history} or \dds{burnup} structure. +* DENI isotopic concentrations of the isotopes +* on the \dds{history} or \dds{burnup} structure. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST,IPEVO + INTEGER IPRINT,MAXI,NBBTS + INTEGER NCHA,NBUN,IUPDC,IUPDB + INTEGER IDCELL(NBUN,NCHA),IDFUEL(NBUN,NCHA) + REAL DENI(0:MAXI) +*---- +* LOCAL PARAMETERS +* CDAY = conversion of days in 10^{8} seconds +*---- + INTEGER IOUT + INTEGER ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,ILCMUP=1,ILCMDN=2,NAMSBR='HSTUBH') + REAL CDAY + PARAMETER (CDAY=8.64E-4) +*---- +* LOCAL VARIABLES +*---- + INTEGER ILCMLN,ILCMTY + CHARACTER NAMTIM*12,NAMP*12 + INTEGER IFT,ICT + INTEGER ITS,ISO,IOK + REAL BITH(3) + REAL FDENC(2) + REAL FLXNOR,DELTA(2) + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXIH + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NAMIH + REAL, ALLOCATABLE, DIMENSION(:) :: DEPLT +*---- +* SCRATCH STORAGE ALLOCATION +* NAMIH name of isotopes on the \dds{history} structure. +* MIXIH mixture number associated with the isotopes +* on the \dds{history} structure. +* DEPLT time associated with each depletion step +* on the \dds{burnup} structure. +*---- + ALLOCATE(NAMIH(3,0:MAXI),MIXIH(0:MAXI),DEPLT(0:NBBTS)) +*---- +* Read HISTORY information for cell specified +* 1) Read fuel type information +*---- + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + IFT=IDFUEL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'FUEL',IFT + CALL LCMLEN(IPHST,NAMP,ILCMLN,ILCMTY) + IF(ILCMLN .EQ. 0) CALL XABORT(NAMSBR// + >':/ Fuel type absent -- BURNUP creation impossible') + CALL LCMSIX(IPHST,NAMP,ILCMUP) + CALL LCMLEN(IPHST,'ISOTOPESUSED',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0 .AND. ILCMLN .LT. 3*MAXI*4) THEN + CALL LCMGET(IPHST,'ISOTOPESUSED',NAMIH(1,1)) + CALL LCMGET(IPHST,'ISOTOPESMIX',MIXIH(1)) + ELSE + CALL XABORT(NAMSBR// + > ':/ Isotopes are absent -- BURNUP creation impossible') + ENDIF + CALL LCMSIX(IPHST,NAMP,ILCMDN) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6001) 'FUEL TYPE',IFT + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6010) + WRITE(IOUT,6011) + > (NAMIH(1,ISO),NAMIH(2,ISO),NAMIH(3,ISO),ISO=1,MAXI) + WRITE(IOUT,6020) + WRITE(IOUT,6021) + > (MIXIH(ISO),ISO=1,MAXI) + ENDIF + ENDIF +*---- +* 2) Real cell type information +*---- + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMLEN(IPHST,NAMP,ILCMLN,ILCMTY) + IF(ILCMLN .EQ. 0) CALL XABORT(NAMSBR// + >':/ Cell type absent -- BURNUP creation impossible') + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=-1 + CALL HSTGSD(IPHST ,MAXI ,IOK ,DENI ,FDENC ) + IF(IOK .NE. 0) CALL XABORT(NAMSBR// + >':/ Densities are absent -- BURNUP creation impossible') + CALL LCMGET(IPHST,'DEPL-PARAM ',BITH) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6001) 'CELL TYPE',ICT + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) + WRITE(IOUT,6110) (DENI(ISO),ISO=1,MAXI) + ENDIF + ENDIF +*---- +* Save isotopes names and mixtures on BURNUP +*---- + CALL LCMPUT(IPEVO,'ISOTOPESUSED',3*MAXI,3,NAMIH(1,1)) + CALL LCMPUT(IPEVO,'ISOTOPESMIX ',MAXI ,1,MIXIH(1)) + CALL LCMPUT(IPEVO,'FUELDEN-INIT',2 ,2,FDENC) +*---- +* Save current burnup information as initial time step +*---- + FLXNOR=0.0 + DELTA(1)=0.0 + DELTA(2)=0.0 + ITS=0 + DEPLT(ITS)=BITH(1)*CDAY + CALL LCMPUT(IPEVO,'DEPL-TIMES ',1 ,2,DEPLT(ITS)) + WRITE(NAMTIM,'(A8,I4.4)') 'DEPL-DAT',ITS+1 + CALL LCMSIX(IPEVO,NAMTIM,ILCMUP) + CALL LCMPUT(IPEVO,'ISOTOPESDENS',MAXI,2,DENI(1)) + CALL LCMPUT(IPEVO,'FLUX-NORM ', 1,2,FLXNOR) + CALL LCMPUT(IPEVO,'DELTA ', 2,2,DELTA) + CALL LCMPUT(IPEVO,'BURNUP-IRRAD', 2,2,BITH(2)) + CALL LCMSIX(IPEVO,NAMTIM,ILCMDN) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DEPLT,MIXIH,NAMIH) +*---- +* Return +*---- + RETURN +*---- +* FORMAT +*---- + 6000 FORMAT(' ****** OUTPUT FROM ',A6) + 6001 FORMAT(' Contents of ',A9,1X,I8) + 6010 FORMAT(' NAME OF ISOTOPES ') + 6011 FORMAT(10(3A4,2X)) + 6020 FORMAT(' MIXTURE OF ISOTOPES ') + 6021 FORMAT(10(I12,2X)) + 6100 FORMAT(' INITIAL DENSITIES') + 6110 FORMAT(1P,10E14.7) + END diff --git a/Donjon/src/HSTUHB.f b/Donjon/src/HSTUHB.f new file mode 100644 index 0000000..8eb1a62 --- /dev/null +++ b/Donjon/src/HSTUHB.f @@ -0,0 +1,327 @@ +*DECK HSTUHB + SUBROUTINE HSTUHB(IPHST, IPEVO, IPRINT, MAXI, NBBTS, NCHA, + > NBUN, IUPDC, IUPDB, IDCELL, IDFUEL, DENI, + > MAXL, PARAML) +* +*----------------------------------------------------------------------- +* +*Purpose: +* To update the HISTORY data structure using the information +* provided on the BURNUP data structure. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau, E. Varin +* +*Parameters: input +* IPHST address of the \dds{history} data structure. +* IPEVO address of the \dds{burnup} data structure. +* IPRINT print level. +* MAXI maximum number of isotopes. +* NBBTS number of depletion steps. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* IUPDC number of the channel to analyze. +* IUPDB number of the bundle to analyze. +* IDCELL cell identifier for each fuel bundle in each channel. +* IDFUEL fuel type identifier for each fuel bundle in each channel. +* IPHST pointer to the HISTORY data structure +* IPEVO pointer to the BURNUP data structure. +* IPRINT print level. +* MAXI maximum number of isotopes. +* NBBTS number of depletion steps. +* NCHA number of fuel channels. +* NBUN number of bundles per channels. +* IUPDC channel number to process or update. +* IUPDB bundle number to process or update. +* IDCELL list of cell identifiers. +* IDFUEL list of fuel type identifiers. +* MAXL maximum number of local parameters. +* +*Parameters: work +* PARAML local parameters. +* DENI isotopic concentrations of the isotopes +* on the \dds{burnup} or \dds{history} structure. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST,IPEVO + INTEGER IPRINT,MAXI,NBBTS,MAXL + INTEGER NCHA,NBUN,IUPDC,IUPDB + INTEGER IDCELL(NBUN,NCHA),IDFUEL(NBUN,NCHA) + REAL DENI(0:MAXI) + REAL PARAML(0:MAXL,2) +*---- +* LOCAL PARAMETERS +* CDAY = conversion of days in 10^{8} seconds +*---- + INTEGER IOUT + INTEGER ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,ILCMUP=1,ILCMDN=2,NAMSBR='HSTUHB') + REAL CDAY,TIMPOW(2) + PARAMETER (CDAY=8.64E-4) +*---- +* LOCAL VARIABLES +*---- + INTEGER ILCMLN,ILCMTY + CHARACTER NAMTIM*12,NAMP*12 + INTEGER IFT,ICT,INEWF,INEWC + INTEGER ITS,ISO,IOK + REAL BITH(3),BITB(3) + REAL FDENC(2),FDENF(2),FDENB(2) + REAL REVOL(5) + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXIH,MIXIB + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NAMIH,NAMIB + REAL, ALLOCATABLE, DIMENSION(:) :: DEPLT +*---- +* SCRATCH STORAGE ALLOCATION +* NAMIH name of isotopes on the \dds{history} structure. +* MIXIH mixture number associated with the isotopes +* on the \dds{history} structure. +* NAMIB name of isotopes on the \dds{burnup} structure. +* MIXIB mixture number associated with the isotopes +* on the \dds{burnup} structure. +* DEPLT time associated with each depletion step +* on the \dds{burnup} structure. +*---- + ALLOCATE(NAMIH(3,0:MAXI),MIXIH(0:MAXI),NAMIB(3,0:MAXI), + > MIXIB(0:MAXI),DEPLT(0:NBBTS)) +*---- +* Initialize test flags +* INEWF -> new fuel type flag +* = 0 fuel type does not exists/create it +* = 1 fuel exists but does not contain isotopes +* = 2 fuel type exists and contains isotopes +* INEWC -> new cell type flag +* = 0 cell type does not exists/create it +* = 1 cell type exists but isotopes densities missing +* = 2 cell type exists and contains isotope densities +*---- + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + INEWF=2 + INEWC=2 + DENI(0:MAXI)=0.0 + PARAML(0:MAXL,:2)=0.0 + BITH(:3)=0.0 + BITB(:3)=0.0 + FDENC(:2)=0.0 + FDENF(:2)=0.0 + FDENB(:2)=0.0 +*---- +* Read HISTORY information for cell specified +*---- + IF(IUPDC .GT. 0 .AND. IUPDB .GT. 0) THEN +*---- +* Read isotope names and mixtures on FUEL TYPE +* if available +*---- + IFT=IDFUEL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'FUEL',IFT + CALL LCMLEN(IPHST,NAMP,ILCMLN,ILCMTY) + IF(ILCMLN .EQ. 0) THEN + INEWF=0 + ELSE + CALL LCMSIX(IPHST,NAMP,ILCMUP) + CALL LCMLEN(IPHST,'ISOTOPESUSED',ILCMLN,ILCMTY) + IF(ILCMLN .GT. 0 .AND. ILCMLN .LT. 3*MAXI*4) THEN + CALL LCMGET(IPHST,'ISOTOPESUSED',NAMIH(1,1)) + CALL LCMGET(IPHST,'ISOTOPESMIX',MIXIH(1)) + CALL LCMGET(IPHST,'FUELDEN-INIT',FDENF) + ELSE + INEWF=1 + ENDIF + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6001) 'FUEL TYPE',IFT + IF(INEWF .EQ. 2) THEN + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6010) + WRITE(IOUT,6011) + > (NAMIH(1,ISO),NAMIH(2,ISO),NAMIH(3,ISO),ISO=1,MAXI) + WRITE(IOUT,6020) + WRITE(IOUT,6021) + > (MIXIH(ISO),ISO=1,MAXI) + ENDIF + ENDIF + ENDIF +*---- +* Read isotope densities on CELL TYPE +* if available +*---- + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMLEN(IPHST,NAMP,ILCMLN,ILCMTY) + IF(ILCMLN .EQ. 0) THEN + INEWC=0 + ELSE + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=-1 + CALL HSTGSD(IPHST ,MAXI ,IOK ,DENI ,FDENC ) + INEWC=1 + IF(IOK .EQ. 0) THEN + INEWC=2 + CALL LCMGET(IPHST,'DEPL-PARAM ',BITH) + ENDIF + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6001) 'CELL TYPE',ICT + IF(INEWF .EQ. 2) THEN + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) + WRITE(IOUT,6110) (DENI(ISO),ISO=1,MAXI) + ENDIF + ENDIF + ENDIF +*---- +* Read isotopes names and mixtures on BURNUP +*---- + CALL LCMGET(IPEVO,'ISOTOPESUSED',NAMIB(1,1)) + CALL LCMGET(IPEVO,'ISOTOPESMIX ',MIXIB(1)) + CALL LCMGET(IPEVO,'FUELDEN-INIT',FDENB) +*---- +* Test for coherence of isotopes names and mixture +* between HISTORY and BURNUP if fuel type contains +* isotopes description +*---- + IF(INEWF .EQ. 2) THEN + DO 100 ISO=1,MAXI + IF(NAMIH(ISO,1) .NE. NAMIB(ISO,1) .OR. + > NAMIH(ISO,2) .NE. NAMIB(ISO,2) .OR. + > NAMIH(ISO,3) .NE. NAMIB(ISO,3) .OR. + > MIXIH(ISO) .NE. MIXIB(ISO) ) THEN + CALL XABORT(NAMSBR// + > ': Isotopes on HISTORY and BURNUP not coherent') + ENDIF + 100 CONTINUE + IF(FDENF(1) .NE. FDENB(1) .OR. + > FDENF(2) .NE. FDENB(2) ) THEN + CALL XABORT(NAMSBR// + > ': Fuel DENSITY on HISTORY and BURNUP not coherent') + ENDIF + ENDIF +*---- +* Read calculation types on BURNUP +*---- + CALL LCMGET(IPEVO,'EVOLUTION-R ',REVOL) + DEPLT(0:NBBTS)=0.0 + CALL LCMGET(IPEVO,'DEPL-TIMES ',DEPLT(1)) +*---- +* Read initial burnup information (FOR FUEL TYPE) +* and save +*---- + ITS=1 + IF(INEWF .NE. 2 ) THEN + BITB(1)=DEPLT(ITS)/CDAY + IF(BITB(1) .EQ. 0.0) THEN + WRITE(NAMTIM,'(A8,I4.4)') 'DEPL-DAT',ITS + CALL LCMSIX(IPEVO,NAMTIM,ILCMUP) + CALL LCMGET(IPEVO,'ISOTOPESDENS',DENI(1)) + CALL LCMGET(IPEVO,'BURNUP-IRRAD',BITB(2)) + CALL LCMSIX(IPEVO,NAMTIM,ILCMDN) + ELSE + CALL XABORT(NAMSBR// + > ': Initial DENSITY on BURNUP required') + ENDIF +*---- +* Save isotopes names and mixtures for FUEL type +*---- + WRITE(NAMP,'(A4,I8.8)') 'FUEL',IFT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + CALL LCMPUT(IPHST,'ISOTOPESUSED',3*MAXI,3,NAMIB(1,1)) + CALL LCMPUT(IPHST,'ISOTOPESMIX',MAXI ,1,MIXIB(1)) + CALL LCMPUT(IPHST,'FUELDEN-INIT',2 ,2,FDENB) + CALL LCMPUT(IPHST,'ISOTOPESDENS',MAXI ,2,DENI(1)) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6010) + WRITE(IOUT,6011) + > (NAMIB(1,ISO),NAMIB(2,ISO),NAMIB(3,ISO),ISO=1,MAXI) + WRITE(IOUT,6020) + WRITE(IOUT,6021) + > (MIXIB(ISO),ISO=1,MAXI) + ENDIF + ELSE + BITB(1)=DEPLT(ITS)/CDAY + WRITE(NAMTIM,'(A8,I4.4)') 'DEPL-DAT',ITS + CALL LCMSIX(IPEVO,NAMTIM,ILCMUP) + CALL LCMGET(IPEVO,'BURNUP-IRRAD',BITB(2)) + CALL LCMSIX(IPEVO,NAMTIM,ILCMDN) +*---- +* Test if initial BURNUP coherent with old history +*---- + IF(INEWC .EQ. 2 ) THEN + IF(BITB(1) .NE. BITH(1) .OR. + > BITB(2) .NE. BITH(2) .OR. + > BITB(3) .NE. BITH(3) ) THEN + WRITE(IOUT,6200) BITH(1) + ENDIF + ENDIF + ENDIF + ITS=NBBTS + BITB(1)=DEPLT(ITS)/CDAY + WRITE(NAMTIM,'(A8,I4.4)') 'DEPL-DAT',ITS + CALL LCMSIX(IPEVO,NAMTIM,ILCMUP) + CALL LCMGET(IPEVO,'ISOTOPESDENS',DENI(1)) + CALL LCMGET(IPEVO,'BURNUP-IRRAD',BITB(2)) + CALL LCMSIX(IPEVO,NAMTIM,ILCMDN) +*---- +* Save power desnity and depletion time in History +* Modif EV 04/11/09 +*---- + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=-2 + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML(0,1)) + IF(IOK .NE. 0) PARAML(0:MAXL,1)=0.0 + IOK=2 + TIMPOW(1)= DEPLT(NBBTS)/CDAY + TIMPOW(2)= REVOL(5) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML(0,1)) +*---- +* Save last densities on BURNUP +*---- + IOK=2 + CALL HSTGSD(IPHST ,MAXI ,IOK ,DENI ,FDENB ) + CALL LCMPUT(IPHST,'DEPL-PARAM ',3,2,BITB) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6101) + WRITE(IOUT,6110) (DENI(ISO),ISO=1,MAXI) + ENDIF + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DEPLT,MIXIB,NAMIB,MIXIH,NAMIH) +*---- +* Return +*---- + RETURN +*---- +* FORMAT +*---- + 6000 FORMAT(' ****** OUTPUT FROM ',A6) + 6001 FORMAT(' Contents of ',A9,1X,I8) + 6010 FORMAT(' NAME OF ISOTOPES ') + 6011 FORMAT(10(3A4,2X)) + 6020 FORMAT(' MIXTURE OF ISOTOPES ') + 6021 FORMAT(10(I12,2X)) + 6100 FORMAT(' INITIAL DENSITIES') + 6101 FORMAT(' FINAL DENSITIES') + 6110 FORMAT(1P,10E14.7) + 6200 FORMAT(' Update cell densities with no chronological burnup'/ + + ' Old time ',F6.2,' days should be zero.'/ + + ' Possible errors or restart case') + END diff --git a/Donjon/src/HSTUHM.f b/Donjon/src/HSTUHM.f new file mode 100644 index 0000000..bf131bf --- /dev/null +++ b/Donjon/src/HSTUHM.f @@ -0,0 +1,191 @@ +*DECK HSTUHM + SUBROUTINE HSTUHM(IPHST, IPMAP, IPRINT, MAXL, NCHA, NBUN, + > MAXI, POWER, BURNP, IREFUS, REFUT, BUNLEN, + > IDCELL, IDFUEL, PARAML, DENI) +* +*---------- +* +*Purpose: +* Store bundle power and depletion time in History +* Refuel channel by performing fuel shuffling. +* +*Copyright: +* Copyright (C) 2004 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau, E. Varin +* +*Parameters: +* IPHST address of the \dds{history} data structure. +* IPMAP address of the \dds{map} data structure. +* IPRINT print level. +* MAXL maximum number of local parameters. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* MAXI maximum number of isotopes. +* NBFUEL number of fueled channels. +* DELTAT last character string read. +* POWER power for each fuel bundle in each channel. +* BURNP burnup for each fuel bundle in each channel. +* IREFUS refueling strategy for each channel. +* refueling strategy for each channel. +* A channel is refueled using a NBS bundle +* shift procedure if IREFUS(I)=NBS. +* In the case where NBS $>$ 0, +* bundles 1 to NBUN-NBS are displaced to position NBS+1 to +* NBUN while locations 1 to NBS are filled with new fuel. +* In the case where NBS $<$ 0, +* bundles -NBS+1 to NBUN are displaced to position 1 to +* NBUN+NBS while locations NBUN+NBS+1 to NBUN are filled +* with new fuel. +* REFUT refueling time for each channel. +* BUNLEN length (cm) of a bundle. +* +*Parameters: input/output +* IDCELL cell identifier for each fuel bundle in each channel. +* IDFUEL fuel type identifier for each fuel bundle in each channel. +* +*Parameters: work +* PARAML local parameters. +* DENI isotopic concentrations. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST,IPMAP + INTEGER IPRINT,MAXL,NCHA,NBUN,MAXI + INTEGER NBFUEL + REAL DELTAT, BUNLEN + REAL POWER(NCHA,NBUN),BURNP(NCHA,NBUN) + INTEGER IREFUS(NCHA) + REAL REFUT(NCHA) + INTEGER IDCELL(NBUN,NCHA),IDFUEL(NBUN,NCHA) + REAL PARAML(0:MAXL,2) + REAL DENI(0:MAXI) +*---- +* LOCAL PARAMETERS +*---- + TYPE(C_PTR) JPMAP,KPMAP + INTEGER IOUT,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NTC=3,ILCMUP=1,ILCMDN=2, + > NAMSBR='HSTUHM') +*---- +* LOCAL VARIABLES +*---- + INTEGER ILONG,ITYP + INTEGER IUPDC,IUPDB + INTEGER IOK,ICT,IFT + REAL FDEN(2),RWEIGHT,WEIGHT,TIME + REAL TIMPOW(2) + CHARACTER NAMP*12 + INTEGER, ALLOCATABLE, DIMENSION(:) :: ISHUFF +*---- +* SCRATCH STORAGE ALLOCATION +* ISHUFF fuel shuffling index for a channel. +*---- + ALLOCATE(ISHUFF(NBUN)) +* + NBFUEL=0 + PARAML(0:MAXL,:2)=0.0 + DELTAT = 0.0 + TIME=0.0 +*---- +* Get information in IPMAP +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7000) NAMSBR + ENDIF +*---- + CALL HSTGMA(IPMAP ,NCHA ,NBUN ,DELTAT, + > POWER ,BURNP,IREFUS ,REFUT ,NBFUEL) +*---- + DO 10 IUPDC=1,NCHA + DO 11 IUPDB=1,NBUN +* + IF(IDCELL(IUPDB,IUPDC) .LE. 0) THEN + IDCELL(IUPDB,IUPDC)= IUPDC + (IUPDB - 1)*NCHA + IDFUEL(IUPDB,IUPDC)=1 + ENDIF + IFT=IDFUEL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'FUEL',IFT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + CALL LCMSIX(IPHST,NAMP,ILCMDN) +*---- +* store power and time after refueling +* for all fuel cells +*---- + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) +*---- +* Get fuel density or weight +*---- + IOK=-1 + RWEIGHT= 1. + CALL HSTGSD(IPHST ,MAXI ,IOK ,DENI ,FDEN ) + IF(IOK.LT.0) THEN + JPMAP=LCMGID(IPMAP,'FUEL') + KPMAP=LCMGIL(JPMAP,1) + CALL LCMLEN(KPMAP,'WEIGHT',ILONG,ITYP) + IF (ILONG .EQ.0) + + CALL XABORT(NAMSBR//' FUEL WEIGHT MUST BE SPECIFIED IN MAP') + CALL LCMGET(KPMAP,'WEIGHT',WEIGHT) + RWEIGHT= 1./WEIGHT + ELSEIF(IOK.EQ.0) THEN + RWEIGHT=1000.0/(FDEN(2)*BUNLEN) + ENDIF + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7003) NAMP,POWER(IUPDC,IUPDB),BURNP(IUPDC,IUPDB), + + WEIGHT + ENDIF + POWER(IUPDC,IUPDB)=POWER(IUPDC,IUPDB)*RWEIGHT + IF(DELTAT.EQ.0.0) THEN + TIME = BURNP(IUPDC,IUPDB)/POWER(IUPDC,IUPDB) + ELSE + TIME = DELTAT + ENDIF +*---- +* Save local parameters from cell IB after refueling +*---- + IOK=-2 + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + IF(IOK .NE. 0) PARAML(0:MAXL,1)=0.0 +*----- + IOK=2 + TIMPOW(1)=TIME + TIMPOW(2)=POWER(IUPDC,IUPDB) + CALL HSTGSL(IPHST ,MAXL ,IOK ,TIMPOW,PARAML) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,7002) NAMP, POWER(IUPDC,IUPDB), TIME + ENDIF + 11 CONTINUE + 10 CONTINUE +** + IF(NBFUEL .GT. 0) THEN + CALL HSTREF(IPHST ,IPRINT,MAXL ,NCHA ,NBUN ,MAXI , + > DELTAT, POWER ,IREFUS,REFUT, + > IDCELL,IDFUEL,PARAML, DENI ,ISHUFF) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ISHUFF) +*---- +* Return +*---- + RETURN +*---- +* Format +*---- + 7000 FORMAT(' ***** OUTPUT FROM ',A6,' *****') + 7002 FORMAT(' Fuel cell ',A12, ' with ',F12.4,' kW/kg ', + > F10.2,' days ') + 7003 FORMAT(' Fuel cell ',A12, ' with ',F12.4,' kW/kg ',F12.3, + > ' kWd/kg ',F12.3,' kg ') + END diff --git a/Donjon/src/HSTUMH.f b/Donjon/src/HSTUMH.f new file mode 100644 index 0000000..e290034 --- /dev/null +++ b/Donjon/src/HSTUMH.f @@ -0,0 +1,95 @@ +*DECK HSTUMH + SUBROUTINE HSTUMH(IPMAP, IPHST, IPRINT, NCHA, NBUN, IDCELL, + > BURNUP ) +* +*----------------------------------------------------------------------- +* +*Purpose: +* To update the MAP data structure using the information +* provided on the HISTORY data structure. +* +*Copyright: +* Copyright (C) 2004 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin +* +*Parameters: input +* IPMAP address of the \dds{map} data structure. +* IPHST address of the \dds{history} data structure. +* IPRINT print level. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* IDCELL cell identifier for each fuel bundle in each channel. +* +*Parameters: work +* BURNUP burnup for each fuel bundle in each channel. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST,IPMAP + INTEGER IPRINT + INTEGER NCHA,NBUN + INTEGER IDCELL(NBUN,NCHA) + REAL BURNUP(NCHA,NBUN) +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT + INTEGER ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,ILCMUP=1,ILCMDN=2,NAMSBR='HSTUMH') +*---- +* LOCAL VARIABLES +*---- + CHARACTER NAMP*12 + INTEGER ILCMLN,ILCMTY + INTEGER IBT,ICT,ICCT + REAL BITH(3) +*---- +* Read isotope densities on CELL TYPE +* if available +*---- + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + CALL LCMGET(IPMAP,'BURN-DEB',BURNUP) + DO 10 ICT=1,NCHA + DO 20 IBT=1,NBUN + ICCT=IDCELL(IBT,ICT) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICCT + CALL LCMLEN(IPHST,NAMP,ILCMLN,ILCMTY) + IF(ILCMLN .EQ. 0) THEN + CALL XABORT(' HSTUMH: BAD CELL TYPE') + ELSE + CALL LCMSIX(IPHST,NAMP,ILCMUP) + CALL LCMGET(IPHST,'DEPL-PARAM ',BITH) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6001) 'CELL TYPE',ICCT + WRITE(IOUT,'(A6,1X,F8.3,2X,F8.3)') 'BURNUP', + > BITH(2),BURNUP(ICT,IBT) + ENDIF + BURNUP(ICT,IBT) = BITH(2) + 20 CONTINUE + 10 CONTINUE +*---- +* Store burnup record in MAP data structure +*---- + CALL LCMPUT(IPMAP,'BURN-DEB',NBUN*NCHA,2,BURNUP) +*---- +* Return +*---- + RETURN +*---- +* FORMAT +*---- + 6000 FORMAT(' ****** OUTPUT FROM ',A6) + 6001 FORMAT(' Contents of ',A9,1X,I8) + END diff --git a/Donjon/src/IDET.f b/Donjon/src/IDET.f new file mode 100644 index 0000000..b84679d --- /dev/null +++ b/Donjon/src/IDET.f @@ -0,0 +1,305 @@ +*DECK IDET + SUBROUTINE IDET(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Detector integrated response evaluation +* +*Copyright: +* Copyright (C) 2019 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The IDET: module specification is: +* IDETEC := IDET: [ IDETEC ] TRKNAM FLUNAM LIBNAM [ FMAP ] :: (descidet) ; +* where +* IDETEC : name of a \emph{idetect} data structure, (L\_INTDETEC signature) +* that will be created or updated by the IDET: module. +* TRKNAM : name of the read-only \emph{tracking} data structure +* (L\_TRACK signature) containing the finite-element tracking. +* FLUNAM : name of the read-only \emph{fluxunk data structure +* (L\_FLUX signature) containing the finite-element solution. +* LIBNAM : name of the read-only \emph{macrolib} data structure +* (L\_LIBRARY signature) that contains the interpolated microscopic +* cross sections. +* FMAP : name of the read-only \emph{fmap} data structure +* (L\_MAP signature) containing renumbered mixture indices. This object +* is optionnal. +* (descidet) : structure describing the input data to the IDET: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER MAXCO + PARAMETER (MAXNI=10,NSTATE=40) + INTEGER INDIC,NITMA,ISTATE(NSTATE) + DOUBLE PRECISION DFLOT + CHARACTER CMODUL*12,HSIGN*12,TEXT12*12,DETNAM*12,REANAM*12 + REAL FLOT + TYPE(C_PTR) IPIDET,IPTRK,IPFLU,IPLIB,IPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, DIMENSION(:), POINTER :: NINX,NINY,NINZ + INTEGER, DIMENSION(:), POINTER :: NINX_2,NINY_2,NINZ_2 + REAL, DIMENSION(:), ALLOCATABLE :: DETECT + REAL, DIMENSION(:,:), POINTER :: COORD1,COORD2,COORD3 + REAL, DIMENSION(:,:), POINTER :: COORD1_2,COORD2_2, + > COORD3_2 +*---- +* PARAMETER VALIDATION +*---- + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('IDET: LCM' + > //' object expected at LHS.') + IF(JENTRY(1).EQ.2) CALL XABORT('IDET: L_INTDETEC entry in create' + > //' or modification mode expected.') + IPIDET=KENTRY(1) + MAXCO=100 ! maximum number of detectors + IF(JENTRY(1).EQ.0) THEN + HSIGN='L_INTDETEC' + CALL LCMPTC(IPIDET,'SIGNATURE',12,HSIGN) + DETNAM='U235' + REANAM='NFTOT' + ALLOCATE(COORD1(MAXNI,MAXCO),COORD2(MAXNI,MAXCO), + > COORD3(MAXNI,MAXCO),NINX(MAXCO),NINY(MAXCO),NINZ(MAXCO)) + NDETC=0 + ELSE + CALL LCMGTC(IPIDET,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_INTDETEC') THEN + TEXT12=HENTRY(3) + CALL XABORT('IDET: signature of '//TEXT12//' IS '//HSIGN// + > '. L_INTDETEC expected.') + ENDIF + CALL LCMGET(IPIDET,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.MAXNI) CALL XABORT('IDET: invalid MAXNI.') + NDETC=ISTATE(2) + MAXCO=MAX(MAXCO,NDETC) + ALLOCATE(COORD1(MAXNI,MAXCO),COORD2(MAXNI,MAXCO), + > COORD3(MAXNI,MAXCO),NINX(MAXCO),NINY(MAXCO),NINZ(MAXCO)) + CALL LCMGET(IPIDET,'NINX',NINX) + CALL LCMGET(IPIDET,'NINY',NINY) + CALL LCMGET(IPIDET,'NINZ',NINZ) + CALL LCMGET(IPIDET,'COORD1',COORD1) + CALL LCMGET(IPIDET,'COORD2',COORD2) + CALL LCMGET(IPIDET,'COORD3',COORD3) + CALL LCMGTC(IPIDET,'DETNAM',12,DETNAM) + CALL LCMGTC(IPIDET,'REANAM',12,REANAM) + ENDIF + IPFLU=C_NULL_PTR + IPTRK=C_NULL_PTR + IPLIB=C_NULL_PTR + IPMAP=C_NULL_PTR + CMODUL=' ' + DO I=2,NENTRY + IF(IENTRY(I).GT.2) CALL XABORT('IDET: LCM object expected.') + IF(JENTRY(I).NE.2) CALL XABORT('IDET: LCM object in read-only ' + > //'MODE EXPECTED AT RHS.') + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_FLUX') THEN + IPFLU=KENTRY(I) + ELSEIF(HSIGN.EQ.'L_TRACK') THEN + IPTRK=KENTRY(I) + CALL LCMGTC(IPTRK,'TRACK-TYPE',12,CMODUL) + ELSEIF(HSIGN.EQ.'L_LIBRARY') THEN + IPLIB=KENTRY(I) + ELSEIF(HSIGN.EQ.'L_MAP') THEN + IPMAP=KENTRY(I) + ELSE + TEXT12=HENTRY(I) + CALL XABORT('IDET: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + > '. L_FLUX, L_TRACK or L_LIBRARY expected.') + ENDIF + ENDDO + IF(CMODUL.NE.'TRIVAC') CALL XABORT('IDET: TRIVAC tracking expect' + > //'ed.') +*---- +* READ INPUTS +*---- + IMPX=1 + ICORN=1 + 10 CALL REDGET(INDIC,NITMA,FLOT,TEXT12,DFLOT) + IF(INDIC.NE.3) CALL XABORT('IDET: character data expected.') + IF(TEXT12.EQ.'EDIT') THEN + CALL REDGET(INDIC,IMPX,FLOT,TEXT12,DFLOT) + IF(INDIC.NE.1) CALL XABORT('IDET: integer data expected.') + ELSE IF(TEXT12.EQ.'DETNAME') THEN + CALL REDGET(INDIC,NITMA,FLOT,DETNAM,DFLOT) + IF(INDIC.NE.3) CALL XABORT('IDET: character data expected(1).') + ELSE IF(TEXT12.EQ.'REANAME') THEN + CALL REDGET(INDIC,NITMA,FLOT,REANAM,DFLOT) + IF(INDIC.NE.3) CALL XABORT('IDET: character data expected(2).') + ELSE IF(TEXT12.EQ.'DETECTOR') THEN + 20 CALL REDGET(INDIC,NITMA,FLOT,TEXT12,DFLOT) + IF(INDIC.NE.3) CALL XABORT('IDET: character data expected.') + 30 IF(TEXT12.EQ.'POSITION') THEN +* Cartesian position of a single detector + NDETC=NDETC+1 + IF(NDETC.GT.MAXCO) THEN +* extend the allocated space to store detectors + MAXCO_2=MAXCO+100 + ALLOCATE(COORD1_2(MAXNI,MAXCO_2),COORD2_2(MAXNI,MAXCO_2), + > COORD3_2(MAXNI,MAXCO_2),NINX_2(MAXCO_2),NINY_2(MAXCO_2), + > NINZ_2(MAXCO_2)) + COORD1_2(:MAXNI,:MAXCO)=COORD1(:MAXNI,:MAXCO) + COORD2_2(:MAXNI,:MAXCO)=COORD2(:MAXNI,:MAXCO) + COORD3_2(:MAXNI,:MAXCO)=COORD3(:MAXNI,:MAXCO) + NINX_2(:MAXCO)=NINX(:MAXCO) + NINY_2(:MAXCO)=NINY(:MAXCO) + NINZ_2(:MAXCO)=NINZ(:MAXCO) + DEALLOCATE(NINZ,NINY,NINX,COORD3,COORD2,COORD1) + MAXCO=MAXCO_2 + COORD1=>COORD1_2 + COORD2=>COORD2_2 + COORD3=>COORD3_2 + NINX=>NINX_2 + NINY=>NINY_2 + NINZ=>NINZ_2 + ENDIF + NINX(NDETC)=1 + NINY(NDETC)=1 + NINZ(NDETC)=1 + CALL REDGET(INDIC,NITMA,FLOT,TEXT12,DFLOT) + IF(INDIC.EQ.2) THEN + COORD1(1,NDETC)=FLOT + ELSE IF((INDIC.EQ.3).AND.(TEXT12.EQ.'INTEG')) THEN + NINX(NDETC)=MAXNI + CALL REDGET(INDIC,NITMA,COO1,TEXT12,DFLOT) + IF(INDIC.NE.2) CALL XABORT('IDET: COORD1 data1 expected.') + CALL REDGET(INDIC,NITMA,COO2,TEXT12,DFLOT) + IF(INDIC.NE.2) CALL XABORT('IDET: COORD1 data2 expected.') + IF(COO2.LE.COO1) CALL XABORT('IDET: COORD1 data2<=data1.') + DELTA=(COO2-COO1)/REAL(MAXNI-1) + DO INX=1,MAXNI + COORD1(INX,NDETC)=COO1+REAL(INX-1)*DELTA + ENDDO + ELSE + CALL XABORT('IDET: COORD1 data or INTEG keyword expected.') + ENDIF + CALL REDGET(INDIC,NITMA,FLOT,TEXT12,DFLOT) + IF(INDIC.EQ.2) THEN + COORD2(1,NDETC)=FLOT + ELSE IF((INDIC.EQ.3).AND.(TEXT12.EQ.'INTEG')) THEN + NINY(NDETC)=MAXNI + CALL REDGET(INDIC,NITMA,COO1,TEXT12,DFLOT) + IF(INDIC.NE.2) CALL XABORT('IDET: COORD2 data1 expected.') + CALL REDGET(INDIC,NITMA,COO2,TEXT12,DFLOT) + IF(INDIC.NE.2) CALL XABORT('IDET: COORD2 data2 expected.') + IF(COO2.LE.COO1) CALL XABORT('IDET: COORD2 data2<=data1.') + DELTA=(COO2-COO1)/REAL(MAXNI-1) + DO INY=1,MAXNI + COORD2(INY,NDETC)=COO1+REAL(INY-1)*DELTA + ENDDO + ELSE + CALL XABORT('IDET: COORD2 data or INTEG keyword expected.') + ENDIF + CALL REDGET(INDIC,NITMA,FLOT,TEXT12,DFLOT) + IF(INDIC.EQ.2) THEN + COORD3(1,NDETC)=FLOT + GO TO 20 + ELSE IF(INDIC.EQ.3) THEN + IF(TEXT12.EQ.'INTEG') THEN + NINZ(NDETC)=MAXNI + CALL REDGET(INDIC,NITMA,COO1,TEXT12,DFLOT) + IF(INDIC.NE.2) CALL XABORT('IDET: COORD3 data1 expected.') + CALL REDGET(INDIC,NITMA,COO2,TEXT12,DFLOT) + IF(INDIC.NE.2) CALL XABORT('IDET: COORD3 data2 expected.') + IF(COO2.LE.COO1) CALL XABORT('IDET: COORD3 data2<=data1.') + DELTA=(COO2-COO1)/REAL(MAXNI-1) + DO INZ=1,MAXNI + COORD3(INZ,NDETC)=COO1+REAL(INZ-1)*DELTA + ENDDO + GO TO 20 + ELSE + COORD3(1,NDETC)=1.0 + GO TO 30 + ENDIF + ELSE + CALL XABORT('IDET: real or character data expected.') + ENDIF + ELSE IF(TEXT12.EQ.'ENDD') THEN + GO TO 10 + ELSE + CALL XABORT('IDET: POSITION, MIXTURE or ENDP keyword expec' + > //'ted.') + ENDIF + GO TO 20 + ELSE IF(TEXT12.EQ.'NOCCOR') THEN + ICORN=0 + ELSE IF(TEXT12.EQ.'CCOR') THEN + ICORN=1 + ELSE IF(TEXT12.EQ.';') THEN + GO TO 40 + ELSE + CALL XABORT('IDET: unknownn keyword-->'//TEXT12) + ENDIF + GO TO 10 +*---- +* PERFORM FLUX INTERPOLATION OVER DETECTOR LOCATIONS +*---- + 40 IF(NDETC.EQ.0) CALL XABORT('IDET: no detector defined.') + ALLOCATE(DETECT(NDETC)) + CALL IDET01(IPTRK,IPFLU,IPLIB,IPMAP,IMPX,NDETC,MAXNI,NINX,NINY, + > NINZ,COORD1,COORD2,COORD3,DETNAM,REANAM,ICORN,DETECT) +*---- +* PRINT DETECTOR RESPONSE +*---- + IF(IMPX.GT.0) THEN + WRITE(6,'(/25H DET: DETECTOR READINGS (,2A12,1H))') DETNAM, + > REANAM + WRITE(6,'(10X,8HDETECTOR,5X,7HREADING)') + DO I=1,NDETC + WRITE(6,'(8X,I10,1P,E16.5)') I,DETECT(I) + ENDDO + ENDIF +*---- +* SAVE DETECTOR INFORMATION ON LCM +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=MAXNI + ISTATE(2)=NDETC + CALL LCMPUT(IPIDET,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPIDET,'NINX',NDETC,1,NINX) + CALL LCMPUT(IPIDET,'NINY',NDETC,1,NINY) + CALL LCMPUT(IPIDET,'NINZ',NDETC,1,NINZ) + CALL LCMPUT(IPIDET,'COORD1',MAXNI*NDETC,2,COORD1) + CALL LCMPUT(IPIDET,'COORD2',MAXNI*NDETC,2,COORD2) + CALL LCMPUT(IPIDET,'COORD3',MAXNI*NDETC,2,COORD3) + CALL LCMPTC(IPIDET,'DETNAM',12,DETNAM) + CALL LCMPTC(IPIDET,'REANAM',12,DETNAM) + CALL LCMPUT(IPIDET,'RESPON',NDETC,2,DETECT) +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(DETECT,NINZ,NINY,NINX,COORD3,COORD2,COORD1) + RETURN + END diff --git a/Donjon/src/IDET01.f b/Donjon/src/IDET01.f new file mode 100644 index 0000000..6cb4e56 --- /dev/null +++ b/Donjon/src/IDET01.f @@ -0,0 +1,440 @@ +*DECK IDET01 + SUBROUTINE IDET01(IPTRK,IPFLU,IPLIB,IPMAP,IMPX,NDETC,MAXNI,NINX, + > NINY,NINZ,COORD1,COORD2,COORD3,DETNAM,REANAM,ICORN,DETECT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute detector integrated response on Cartesian geometry +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPTRK pointer to the tracking. +* IPFLU pointer to the finite-element flux. +* IPLIB pointer to the interpolated microlib. +* IPMAP pointer to the fuelmap. +* IMPX print parameter. +* NDETC number of detectors +* MAXNI first dimension of matrices NIN and COORD. +* NINX number of interpolation points per detector along x axis. +* NINY number of interpolation points per detector along y axis. +* NINZ number of interpolation points per detector along z axis. +* COORD1 interpolation points per detector along x axis. +* COORD2 interpolation points per detector along y axis. +* COORD3 interpolation points per detector along z axis. +* DETNAM character*12 alias name of the isotope used as detector. +* REANAM character*12 name of the nuclear reaction used as detector. +* ICORN flag to activate corner flux correction (0/1: ON/OFF). +* +*Parameters: output +* DETECT detector response. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPTRK,IPFLU,IPLIB,IPMAP + INTEGER IMPX,NDETC,MAXNI,NINX(MAXNI),NINY(MAXNI),NINZ(MAXNI),ICORN + REAL COORD1(MAXNI,NDETC),COORD2(MAXNI,NDETC),COORD3(MAXNI,NDETC), + > DETECT(NDETC) + CHARACTER DETNAM*12,REANAM*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE + PARAMETER (NSTATE=40) + INTEGER ISTATE(NSTATE) + LOGICAL L3D + CHARACTER HSMG*131,CMODUL*12 + TYPE(C_PTR) JPFLU,JPLIB,KPLIB,IPMAC,JPMAC,KPMAC +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, DIMENSION(:), ALLOCATABLE :: MAT,KFLX,KN,IMIX + INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: MIXT + REAL, DIMENSION(:), ALLOCATABLE :: XX,YY,ZZ,XXX,YYY,ZZZ,MXD,MYD, + > MZD,FLXD,GAR,TERPX,TERPY,TERPZ + REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: TFLUX,AFLUX,DFLUX,SIGF + CHARACTER(LEN=12), DIMENSION(:), ALLOCATABLE :: HNAMIS + TYPE(C_PTR), DIMENSION(:), ALLOCATABLE :: IPISO +*---- +* RECOVER GENERAL TRACKING INFORMATION +*---- + IF(.NOT.C_ASSOCIATED(IPTRK)) CALL XABORT('IDET01: IPTRK not set.') + CALL LCMGTC(IPTRK,'TRACK-TYPE',12,CMODUL) + CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE) + NREG=ISTATE(1) + NUN=ISTATE(2) + ITYPE=ISTATE(6) + NLF=0 + ICHX=0 + IDIM=1 + IF(ITYPE.EQ.5) THEN + IDIM=2 + ELSE IF(ITYPE.EQ.7) THEN + IDIM=3 + ELSE + CALL XABORT('IDET01: Cartesian geometry expected.') + ENDIF + IELEM=ISTATE(9) + L4=ISTATE(11) + ICHX=ISTATE(12) + NLF=ISTATE(30) + NXD=ISTATE(14) + NYD=ISTATE(15) + NZD=ISTATE(16) + LL4F=0 + LL4X=0 + LL4Y=0 + IF(CMODUL.EQ.'TRIVAC') THEN + LL4F=ISTATE(25) + LL4X=ISTATE(27) + LL4Y=ISTATE(28) + ENDIF + L3D=(NZD.GT.0) + IF(.NOT.L3D) CALL XABORT('IDET01: 3D geometry expected.') + NZD=MAX(1,NZD) + ALLOCATE(MAT(NREG),KFLX(NREG)) + CALL LCMGET(IPTRK,'MATCOD',MAT) + CALL LCMGET(IPTRK,'KEYFLX',KFLX) + ALLOCATE(MXD(NXD+1),MYD(NYD+1),MZD(NZD+1)) + ALLOCATE(XX(NREG),YY(NREG),ZZ(NREG)) + CALL LCMGET(IPTRK,'XX',XX) + CALL LCMGET(IPTRK,'YY',YY) + CALL LCMGET(IPTRK,'ZZ',ZZ) +*---- +* RECOVER FINITE-ELEMENT FLUX INFORMATION +*---- + IF(.NOT.C_ASSOCIATED(IPFLU)) CALL XABORT('IDET01: IPFLU not set.') + CALL LCMGET(IPFLU,'STATE-VECTOR',ISTATE) + NG=ISTATE(1) +*---- +* RECOVER RENUMBERED MIXTURE INDICES FROM FUELMAP +*---- + IF(C_ASSOCIATED(IPMAP)) THEN + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + IF(ISTATE(4).NE.NG) CALL XABORT('IDET01: invalid group nb(1).') + CALL LCMSIX(IPMAP,'GEOMAP',1) + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NEL=NXD*NYD*NZD + IF(ISTATE(3).NE.NXD) CALL XABORT('IDET01: invalid NXD.') + IF(ISTATE(4).NE.NYD) CALL XABORT('IDET01: invalid NYD.') + IF(ISTATE(5).NE.NZD) CALL XABORT('IDET01: invalid NZD.') + IF(ISTATE(6).NE.NEL) CALL XABORT('IDET01: invalid NEL.') + IF(NREG.NE.NEL) CALL XABORT('IDET01: invalid NREG.') + CALL LCMSIX(IPMAP,' ',2) + CALL LCMGET(IPMAP,'BMIX',MAT) + ENDIF +*---- +* RECOVER MICROLIB INFORMATION +*---- + IF(.NOT.C_ASSOCIATED(IPLIB)) CALL XABORT('IDET01: IPLIB not set.') + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + NBISO=ISTATE(2) + IF(ISTATE(3).NE.NG) CALL XABORT('IDET01: invalid group nb(2).') + NMIX=ISTATE(14) + ALLOCATE(IMIX(NBISO),HNAMIS(NBISO),IPISO(NBISO),GAR(NG)) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX) + CALL LCMGTC(IPLIB,'ISOTOPESUSED',12,NBISO,HNAMIS) + DO ISO=1,NBISO + IF(HNAMIS(ISO).EQ.DETNAM) GO TO 10 + ENDDO + DO ISO=1,NBISO + WRITE(6,'(5X,3H-->,A12)') HNAMIS(ISO) + ENDDO + WRITE(HSMG,'(48HIDET01: NO DETECTOR ISOTOPE FOUND IN MICROLIB WI, + > 8HTH NAME=,A12)') DETNAM + CALL XABORT(HSMG) + 10 CALL LIBIPS(IPLIB,NBISO,IPISO) + JPLIB=LCMGID(IPLIB,'ISOTOPESLIST') +*---- +* COMPUTE MESH FROM L_TRACK +*---- + ALLOCATE(XXX(NXD),YYY(NYD)) + XXX(:NXD)=0.0 + YYY(:NYD)=0.0 + IREG=0 + IF(L3D) THEN + ALLOCATE(ZZZ(NZD)) + ZZZ(:NZD)=0.0 + DO K=1,NZD + DO J=1,NYD + DO I=1,NXD + IREG=IREG+1 + IF(XX(IREG).NE.0.0) THEN + IF(XXX(I).EQ.0.0) THEN + XXX(I)=XX(IREG) + ELSE IF(ABS(XXX(I)-XX(IREG)).GT.1.0E-6) THEN + CALL XABORT('IDET01: inconsistent tracking in X') + ENDIF + ENDIF + IF(YY(IREG).NE.0.0) THEN + IF(YYY(J).EQ.0.0) THEN + YYY(J)=YY(IREG) + ELSE IF(ABS(YYY(J)-YY(IREG)).GT.1.0E-6) THEN + CALL XABORT('IDET01: inconsistent tracking in Y') + ENDIF + ENDIF + IF(ZZ(IREG).NE.0.0) THEN + IF(ZZZ(K).EQ.0.0) THEN + ZZZ(K)=ZZ(IREG) + ELSE IF(ABS(ZZZ(K)-ZZ(IREG)).GT.1.0E-6) THEN + CALL XABORT('IDET01: inconsistent tracking in Z') + ENDIF + ENDIF + ENDDO + ENDDO + ENDDO + ELSE + DO J=1,NYD + DO I=1,NXD + IREG=IREG+1 + IF(XX(IREG).NE.0.0) THEN + IF(XXX(I).EQ.0.0) THEN + XXX(I)=XX(IREG) + ELSE IF(ABS(XXX(I)-XX(IREG)).GT.1.0E-6) THEN + CALL XABORT('IDET01: inconsistent tracking in X') + ENDIF + ENDIF + IF(YY(IREG).NE.0.0) THEN + IF(YYY(J).EQ.0.0) THEN + YYY(J)=YY(IREG) + ELSE IF(ABS(YYY(J)-YY(IREG)).GT.1.0E-6) THEN + CALL XABORT('IDET01: inconsistent tracking in Y') + ENDIF + ENDIF + ENDDO + ENDDO + ENDIF + IF(IREG.NE.NREG) CALL XABORT('IDET01: invalid tracking') + MXD(1)=0.0 + MYD(1)=0.0 + MZD(1)=0.0 + DO I=1,NXD + MXD(I+1)=MXD(I)+XXX(I) + ENDDO + MYD(1)=0.0 + DO I=1,NYD + MYD(I+1)=MYD(I)+YYY(I) + ENDDO + MZD(1)=0.0 + IF(L3D) THEN + DO I=1,NZD + MZD(I+1)=MZD(I)+ZZZ(I) + ENDDO + DEALLOCATE(ZZZ) + ELSE + MZD(2)=0.0 + ENDIF + DEALLOCATE(YYY,XXX) +*---- +* PERFORM FLUX INTERPOLATION OVER DETECTOR LOCATIONS +*---- + IF(IMPX.GT.1) THEN + WRITE(6,'(/29H IDET01: DETECTOR INFORMATION)') + WRITE(6,'(5X,12HENERGY GROUP,1X,8HDETECTOR,2X,7HMIXTURE,5X, + 1 13HDETECTOR FLUX,3X,11HDONJON FLUX,5X,9HFLUX RATO,7X, + 2 11HDRAGON FLUX,5X,10HFISSION XS)') + ENDIF + ALLOCATE(FLXD(NUN)) + JPFLU=LCMGID(IPFLU,'FLUX') + DO I=1,NDETC + ININX=NINX(I) + ININY=NINY(I) + ININZ=NINZ(I) + ALLOCATE(TFLUX(ININX,ININY,ININZ,NG)) + DO IG=1,NG + CALL LCMGDL(JPFLU,IG,FLXD) + IF(ICHX.EQ.1) THEN +* Variational collocation method + CALL LCMLEN(IPTRK,'KN',MAXKN,ITYLCM) + MKN=MAXKN/(NXD*NYD*NZD) + ALLOCATE(KN(MAXKN)) + CALL LCMGET(IPTRK,'KN',KN) + CALL LCMSIX(IPTRK,'BIVCOL',1) + CALL LCMLEN(IPTRK,'T',LC,ITYLCM) + CALL LCMGET(IPTRK,'E',E) + CALL LCMSIX(IPTRK,' ',2) + CALL VALUE2(LC,MKN,NXD,NYD,NZD,L4,COORD1(1,I),COORD2(1,I), + 1 COORD3(1,I),MXD,MYD,MZD,FLXD,MAT,KN,ININX,ININY,ININZ,E, + 2 TFLUX(1,1,1,IG)) + DEALLOCATE(KN) + ELSE IF(ICHX.EQ.2) THEN +* Raviart-Thomas finite element method + CALL VALUE4(IELEM,NUN,NXD,NYD,NZD,COORD1(1,I),COORD2(1,I), + 1 COORD3(1,I),MXD,MYD,MZD,FLXD,MAT,KFLX,ININX,ININY,ININZ, + 2 TFLUX(1,1,1,IG)) + ELSE IF(ICHX.EQ.3) THEN +* Nodal collocation method (MCFD) + CALL VALUE1(IDIM,NXD,NYD,NZD,L4,COORD1(1,I),COORD2(1,I), + 1 COORD3(1,I),MXD,MYD,MZD,FLXD,MAT,IELEM,ININX,ININY,ININZ, + 2 TFLUX(1,1,1,IG)) + ELSE IF(ICHX.EQ.6) THEN +* Analytic nodal method (ANM) + IF(IMPX.GT.0) WRITE(6,100) ICORN + IPMAC=LCMGID(IPLIB,'MACROLIB') + JPMAC=LCMGID(IPMAC,'GROUP') + CALL LCMLEN(IPTRK,'KN',MAXKN,ITYLCM) + ALLOCATE(KN(MAXKN)) + CALL LCMGET(IPTRK,'KN',KN) + KPMAC=LCMGIL(JPMAC,IG) + CALL VALU5(KPMAC,NXD,NYD,NZD,LL4F,LL4X,LL4Y,NUN,NMIX, + 1 COORD1(1,I),COORD2(1,I),COORD3(1,I),MXD,MYD,MZD,FLXD,MAT, + 2 KFLX,KN,ININX,ININY,ININZ,ICORN,TFLUX(1,1,1,IG)) + DEALLOCATE(KN) + ELSE + CALL XABORT('IDET01: interpolation not implemented.') + ENDIF + ENDDO +*---- +* RECOVER AVERAGED FLUX FROM FINITE-ELEMENT CALCULATION +*---- + ALLOCATE(AFLUX(ININX,ININY,ININZ,NG),MIXT(ININX,ININY,ININZ)) + DO INX=1,ININX + NX=0 + DO IX=1,NXD + IF(COORD1(INX,I).LE.MXD(IX)) EXIT + NX=NX+1 + ENDDO + DO INY=1,ININY + NY=0 + DO IY=1,NYD + IF(COORD2(INY,I).LE.MXD(IY)) EXIT + NY=NY+1 + ENDDO + DO INZ=1,ININZ + NZ=0 + DO IZ=1,NZD + IF(COORD3(INZ,I).LE.MZD(IZ)) EXIT + NZ=NZ+1 + ENDDO + IF(NX*NY*NZ.EQ.0) THEN + WRITE(HSMG,'(38HIDET01: element not found for detector, + 1 I5,7h(1). x=,1p,e12.4,3H y=,e12.4,3H z=,e12.4)') I, + 2 COORD1(INX,I),COORD2(INY,I),COORD3(INZ,I) + CALL XABORT(HSMG) + ENDIF + IEL=(NZ-1)*NXD*NYD+(NY-1)*NXD+NX + IF(MAT(IEL).EQ.0) THEN + WRITE(HSMG,'(38HIDET01: element not found for detector, + 1 I5,7h(1). x=,1p,e12.4,3H y=,e12.4,3H z=,e12.4)') I, + 2 COORD1(INX,I),COORD2(INY,I),COORD3(INZ,I) + CALL XABORT(HSMG) + ENDIF + MIXT(INX,INY,INZ)=MAT(IEL) + IUN=KFLX(IEL) + IF(IUN.EQ.0) CALL XABORT('IDET01: flux not defined.') + DO IG=1,NG + CALL LCMGDL(JPFLU,IG,FLXD) + AFLUX(INX,INY,INZ,IG)=FLXD(IUN) + ENDDO + ENDDO + ENDDO + ENDDO +*---- +* RECOVER FLUX AND FISSION CROSS SECTION FROM MICROLIB +*---- + ALLOCATE(DFLUX(ININX,ININY,ININZ,NG),SIGF(ININX,ININY,ININZ,NG)) + DO INX=1,ININX + DO INY=1,ININY + DO INZ=1,ININZ + IBM=MIXT(INX,INY,INZ) + DFLUX(INX,INY,INZ,:NG)=0.0 + SIGF(INX,INY,INZ,:NG)=0.0 + DO ISO=1,NBISO + IF((HNAMIS(ISO).EQ.DETNAM).AND.(IMIX(ISO).EQ.IBM)) THEN + KPLIB=IPISO(ISO) ! set ISO-th isotope + CALL LCMLEN(KPLIB,REANAM,LENGT,ITYLCM) + IF(LENGT.NE.NG) THEN + CALL LCMLIB(KPLIB) + WRITE(HSMG,'(23HIDET01: unable to find ,A,6H for i, + > 7Hsotope ,A,11H in mixture,I6)') REANAM,DETNAM,IBM + CALL XABORT(HSMG) + ENDIF + CALL LCMGET(KPLIB,'NWT0',GAR) + DFLUX(INX,INY,INZ,:NG)=GAR(:NG) + CALL LCMGET(KPLIB,REANAM,GAR) + SIGF(INX,INY,INZ,:NG)=GAR(:NG) + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO +*---- +* PRINT DETECTOR-DEPENDENT VALUES +*---- + IF(IMPX.GT.1) THEN + DO IG=1,NG + DO INZ=1,ININZ + DO INY=1,ININY + DO INX=1,ININX + IBM=MIXT(INX,INY,INZ) + TFLUX_I=TFLUX(INX,INY,INZ,IG) + AFLUX_I=AFLUX(INX,INY,INZ,IG) + DFLUX_I=DFLUX(INX,INY,INZ,IG) + SIGF_I=SIGF(INX,INY,INZ,IG) + WRITE(6,'(8X,3I9,1P,5E16.5)') IG,I,IBM,TFLUX_I, + > AFLUX_I,TFLUX_I/AFLUX_I,DFLUX_I,SIGF_I + ENDDO + ENDDO + ENDDO + ENDDO + ENDIF +*---- +* COMPUTE DETECTOR RESPONSE +*---- + ALLOCATE(TERPX(ININX),TERPY(ININY),TERPZ(ININZ)) + IF(ININX.EQ.1) THEN + TERPX(1)=1.0 + ELSE + CALL ALTERI(.TRUE.,ININX,COORD1(1,I),COORD1(1,I), + > COORD1(ININX,I),TERPX) + ENDIF + IF(ININY.EQ.1) THEN + TERPY(1)=1.0 + ELSE + CALL ALTERI(.TRUE.,ININY,COORD2(1,I),COORD2(1,I), + > COORD2(ININY,I),TERPY) + ENDIF + IF(ININZ.EQ.1) THEN + TERPZ(1)=1.0 + ELSE + CALL ALTERI(.TRUE.,ININZ,COORD3(1,I),COORD3(1,I), + > COORD3(ININZ,I),TERPZ) + ENDIF +* integrate along axial direction + DETECT(I)=0.0 + DO IG=1,NG + ZNUM=0.0 + ZDEN=0.0 + DO INX=1,ININX + DO INY=1,ININY + DO INZ=1,ININZ + TRP=TERPX(INX)*TERPY(INY)*TERPZ(INZ) + ZNUM=ZNUM+TRP*TFLUX(INX,INY,INZ,IG)*SIGF(INX,INY,INZ,IG) + ZDEN=ZDEN+TRP + ENDDO + ENDDO + ENDDO + DETECT(I)=DETECT(I)+ZNUM/ZDEN + ENDDO + DEALLOCATE(TERPZ,TERPY,TERPX) + DEALLOCATE(SIGF,DFLUX,MIXT,AFLUX,TFLUX) + ENDDO +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(FLXD) + DEALLOCATE(GAR,IPISO,HNAMIS,IMIX) + DEALLOCATE(XX,YY,ZZ,KFLX,MAT) + RETURN + 100 FORMAT(/46H IDET01: CORNER FLUX CORRECTION (0/1: OFF/ON)=,I3) + END diff --git a/Donjon/src/LNSR.f b/Donjon/src/LNSR.f new file mode 100644 index 0000000..a72ddc4 --- /dev/null +++ b/Donjon/src/LNSR.f @@ -0,0 +1,523 @@ +*DECK LNSR + SUBROUTINE LNSR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* single iteration for the line optimization of the objective function. +* +*Copyright: +* Copyright (C) 2019 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The calling specifications are: +* OPTIM := LNSR: OPTIM :: (lnsr\_data) ; +* where +* OPTIM : name of the \emph{optimize} object (L\_OPTIMIZE signature) +* containing the optimization informations. Object OPTIM must appear on +* both LHS and RHS to be able to update the previous values. +* (lnsr\_data) : structure containing the data to the module LNSR. +* +*Reference: +* L. Armijo, "Minimization of functions having Lipschitz continuous +* first partial derivatives," Pacific journal of mathematics, Vol. 16, +* No. 1, 1-3, 1966. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40,MAXINT=30) + TYPE(C_PTR) IPGRAD + CHARACTER TEXT12*12,HSIGN*12 + INTEGER ISTATE(NSTATE),CNVTST,DNVTST,hist_nr + DOUBLE PRECISION OPTPRR(NSTATE) + REAL FLOTT + DOUBLE PRECISION DFLOTT,SR,DSAVE(3) + PARAMETER(XI=0.5D0,WIDTH=0.5D0) ! Armijo parameters +*---- +* ALLOCATABLE ARRAYS +*---- + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: XP,GP,V,Y,YGG,GGY, + 1 FF,UD,GAMMA + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: X,P,G,XMIN,XMAX + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: AA,GG,DFF,TDFF, + 1 SS,YY +*---- +* PARAMETER VALIDATION. +*---- + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('LNSR: LCM' + 1 //' OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.1) CALL XABORT('LNSR: OBJECT IN MODIFICATION MOD' + 1 //'E EXPECTED.') + IPGRAD=KENTRY(1) + CALL LCMGTC(IPGRAD,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_OPTIMIZE') THEN + TEXT12=HENTRY(1) + CALL XABORT('LNSR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_OPTIMIZE EXPECTED.') + ENDIF + CNVTST=-1 + ICONV =0 + DNVTST=-1 +*---- +* READ INPUT PARAMETERS +*---- + CALL LCMGET(IPGRAD,'STATE-VECTOR',ISTATE) + IF((ISTATE(2).NE.0).AND.(ISTATE(8).NE.4)) THEN + CALL XABORT('LNSR: CONSTRAINTS NOT IMPLEMENTED.') + ENDIF + NVAR =ISTATE(1) + NFUNC =ISTATE(2)+1 + IOPT =ISTATE(3) + ICONV =ISTATE(4) + IF((IOPT.NE.1).AND.(IOPT.NE.-1)) CALL XABORT('LNSR: IOPT not equ' + 1 //'al to 1 or -1') + IEXT =ISTATE(5) + IF(IEXT.EQ.0) IEXT=1 + IEDSTP=ISTATE(6) + IHESS =ISTATE(7) + IMETH =ISTATE(8) + ISTEP =ISTATE(10) + JCONV =ISTATE(11) + MAXEXT=ISTATE(12) + NSTART=ISTATE(13) + CALL LCMGET(IPGRAD,'OPT-PARAM-R',OPTPRR) + SR=OPTPRR(1) + EPS1=OPTPRR(2) + EPS2=OPTPRR(3) + EPS3=OPTPRR(4) + IPICK=0 + hist_nr=10 + IPRINT=1 + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.10) GO TO 20 + IF(INDIC.NE.3) CALL XABORT('LNSR: CHARACTER DATA EXPECTED(1).') + 15 IF(TEXT12.EQ.'EDIT') THEN + CALL REDGET(INDIC,IPRINT,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('LNSR: INTEGER DATA EXPECTED(1).') + ELSE IF(TEXT12.EQ.'MINIMIZE') THEN + IOPT=1 + ELSE IF(TEXT12.EQ.'MAXIMIZE') THEN + IOPT=-1 + ELSE IF(TEXT12.EQ.'OUT-STEP-LIM') THEN +* Set maximum step for line optimization. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + SR=FLOTT + ELSE IF(INDIC.EQ.4) THEN + SR=DFLOTT + ELSE + CALL XABORT('LNSR: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'INN-STEP-EPS') THEN +* Set the tolerence used for line optimization. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + EPS3=FLOTT + ELSE IF(INDIC.EQ.4) THEN + EPS3=DFLOTT + ELSE + CALL XABORT('LNSR: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'OUT-STEP-EPS') THEN +* Set the tolerence used for external iterations. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + EPS2=FLOTT + ELSE IF(INDIC.EQ.4) THEN + EPS2=DFLOTT + ELSE + CALL XABORT('LNSR: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'OUT-ITER-MAX') THEN + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('LNSR: INTEGER DATA EXPECTED(2).') + IF(MAXEXT.EQ.0) MAXEXT=NITMA + ELSE IF(TEXT12.EQ.'OUT-RESTART') THEN + CALL REDGET(INDIC,NSTART,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('LNSR: INTEGER DATA EXPECTED(3).') + ELSE IF(TEXT12.EQ.'SD') THEN + IHESS=0 + ELSE IF(TEXT12.EQ.'CG') THEN + IHESS=1 + ELSE IF(TEXT12.EQ.'BFGS') THEN + IHESS=2 + ELSE IF(TEXT12.EQ.'LBFGS') THEN + IHESS=3 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.1) THEN +* hist_nr: number of corrections stored in LBFGS method + hist_nr=NITMA + ELSE IF(INDIC.EQ.3) THEN + GO TO 15 + ELSE + CALL XABORT('LNSR: INTEGER OR CHARACTER VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'NEWT') THEN + IHESS=4 + ELSE IF(TEXT12.EQ.'INN-CONV-TST') THEN +* Internal convergence test + IPICK=1 + GO TO 20 + ELSE IF(TEXT12(:1).EQ.';') THEN + GO TO 20 + ELSE + CALL XABORT('LNSR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 10 +*---- +* RECOVER INFORMATION FROM OPTIM OBJECT +*---- + 20 ISTEP=ISTEP+1 + ALLOCATE(X(NVAR),P(NVAR),G(NVAR),XMIN(NVAR),XMAX(NVAR)) + IF(IMETH.EQ.4) THEN + ALLOCATE(FF(NFUNC)) + CALL LCMGET(IPGRAD,'FOBJ-CST-VAL',FF) + F=DOT_PRODUCT(FF(:NFUNC),FF(:NFUNC)) + DEALLOCATE(FF) + ELSE + CALL LCMGET(IPGRAD,'FOBJ-CST-VAL',F) + CALL LCMGET(IPGRAD,'GRADIENT',G) + ENDIF + CALL LCMGET(IPGRAD,'VAR-VALUE',X) + CALL LCMGET(IPGRAD,'VAR-VAL-MIN',XMIN) + CALL LCMGET(IPGRAD,'VAR-VAL-MAX',XMAX) + CALL LCMLEN(IPGRAD,'LNSR-INFO',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPGRAD,'LNSR-INFO',DSAVE) + SLOPE=DSAVE(1) + ALAM=DSAVE(2) + GNORM=DSAVE(3) + ELSE + SLOPE=0.0D0 + ALAM=0.0D0 + GNORM=0.0D0 + ENDIF +*---- +* SET THE DIRECTION AND INITIALIZATION OF THE LINE SEARCH +*---- + IF(ISTEP.EQ.1) THEN + IF(IPRINT.GT.0) WRITE(6,100) IEXT,F + IF(IHESS.EQ.0) THEN +* Steepest descent + P(:NVAR)=-G(:NVAR) + ELSE IF(IHESS.EQ.1) THEN + IF(IEXT.EQ.1) THEN +* Steepest descent + P(:NVAR)=-G(:NVAR) + GNORM=DOT_PRODUCT(G(:NVAR),G(:NVAR))/REAL(NVAR) + ELSE +* Conjugate gradient + GNORMP=GNORM + CALL LCMGET(IPGRAD,'DIRECTION',P) + GNORM=DOT_PRODUCT(G(:NVAR),G(:NVAR))/REAL(NVAR) + P(:NVAR)=-G(:NVAR)+(GNORM/GNORMP)*P(:NVAR) + ENDIF + ELSE IF(IHESS.EQ.2) THEN +* BFGS + IF(IEXT.EQ.1) THEN + ALLOCATE(GG(NVAR,NVAR)) + GG(:NVAR,:NVAR)=0.0D0 + DO I=1,NVAR + GG(I,I)=1.0D0 + ENDDO +* Steepest descent + P(:NVAR)=-G(:NVAR) + ELSE + ALLOCATE(V(NVAR),Y(NVAR),XP(NVAR),GP(NVAR)) + CALL LCMSIX(IPGRAD,'OLD-VALUE',1) + CALL LCMGET(IPGRAD,'VAR-VALUE',XP) + CALL LCMGET(IPGRAD,'GRADIENT',GP) + CALL LCMSIX(IPGRAD,' ',2) + V(:NVAR)=X(:NVAR)-XP(:NVAR) + Y(:NVAR)=G(:NVAR)-GP(:NVAR) + SVY=DOT_PRODUCT(V(:NVAR),Y(:NVAR)) + IF(SVY.EQ.0.0D0) CALL XABORT('LNSR: DIVIDE CHECK IN BFGS.') + DEALLOCATE(GP,XP) + ALLOCATE(GG(NVAR,NVAR),GGY(NVAR),YGG(NVAR),AA(NVAR,NVAR)) + CALL LCMGET(IPGRAD,'HESSIAN',GG) + SVYI=1.0D0/SVY + DO I=1,NVAR + TMP1=0.0D0 + TMP2=0.0D0 + DO J=1,NVAR + AA(J,I)=V(J)*V(I)*SVYI + TMP1=TMP1+GG(I,J)*Y(J) + TMP2=TMP2+Y(J)*GG(J,I) + ENDDO + GGY(I)=TMP1 + YGG(I)=TMP2 + ENDDO + B=1.0D0 + DO I=1,NVAR + B=B+Y(I)*GGY(I)*SVYI + ENDDO + AA(:NVAR,:NVAR)=AA(:NVAR,:NVAR)*B + DO J=1,NVAR + DO I=1,NVAR + AA(I,J)=AA(I,J)-(V(I)*YGG(J)+GGY(I)*V(J))*SVYI + ENDDO + ENDDO + GG(:NVAR,:NVAR)=GG(:NVAR,:NVAR)+AA(:NVAR,:NVAR) + P(:NVAR)= 0.0D0 + DO I=1,NVAR + P(:NVAR)=P(:NVAR)-GG(:NVAR,I)*G(I) + ENDDO + DEALLOCATE(AA,YGG,GGY,Y,V) + ENDIF + CALL LCMPUT(IPGRAD,'HESSIAN',NVAR*NVAR,4,GG) + DEALLOCATE(GG) + ELSE IF(IHESS.EQ.3) THEN +* Limited memory BFGS + ALLOCATE(SS(NVAR,hist_nr),YY(NVAR,hist_nr)) + P(:NVAR)=G(:NVAR) + IF(IEXT.EQ.1) THEN + SS(:NVAR,:hist_nr)=0.0D0 + YY(:NVAR,:hist_nr)=0.0D0 + ELSE +* quasi-Newton search + ALLOCATE(GAMMA(hist_nr),XP(NVAR),GP(NVAR)) + CALL LCMGET(IPGRAD,'LBFGS-S',SS) + CALL LCMGET(IPGRAD,'LBFGS-Y',YY) + CALL LCMSIX(IPGRAD,'OLD-VALUE',1) + CALL LCMGET(IPGRAD,'VAR-VALUE',XP) + CALL LCMGET(IPGRAD,'GRADIENT',GP) + CALL LCMSIX(IPGRAD,' ',2) + J=MOD(IEXT-1,hist_nr)+1 + SS(:NVAR,J)=X(:NVAR)-XP(:NVAR) + YY(:NVAR,J)=G(:NVAR)-GP(:NVAR) + SVY=DOT_PRODUCT(SS(:NVAR,J),YY(:NVAR,J)) + IF(SVY.EQ.0.0D0) CALL XABORT('LNSR: DIVIDE CHECK IN LBFGS.') + DEALLOCATE(GP,XP) + IBOUND=MIN(IEXT-1,hist_nr) + DO IB=IBOUND,1,-1 + J=MOD(IEXT+IB-IBOUND-1,hist_nr)+1 + TAU=DOT_PRODUCT(SS(:NVAR,J),YY(:NVAR,J)) + GAMMA(IB)=DOT_PRODUCT(SS(:NVAR,J),P(:NVAR))/TAU + P(:NVAR)=P(:NVAR)-GAMMA(IB)*YY(:NVAR,J) + ENDDO + DO IB=1,IBOUND + J=MOD(IEXT+IB-IBOUND-1,hist_nr)+1 + TAU=DOT_PRODUCT(SS(:NVAR,J),YY(:NVAR,J)) + BETA=DOT_PRODUCT(YY(:NVAR,J),P(:NVAR))/TAU + P(:NVAR)=P(:NVAR)+(GAMMA(IB)-BETA)*SS(:NVAR,J) + ENDDO + DEALLOCATE(GAMMA) + ENDIF + CALL LCMPUT(IPGRAD,'LBFGS-S',NVAR*hist_nr,4,SS) + CALL LCMPUT(IPGRAD,'LBFGS-Y',NVAR*hist_nr,4,YY) + DEALLOCATE(YY,SS) + P(:NVAR)=-P(:NVAR) + ELSE IF(IHESS.EQ.4) THEN +* Newton method for unconstrained optimization + ALLOCATE(FF(NFUNC),DFF(NVAR,NFUNC),TDFF(NFUNC,NVAR), + 1 UD(NVAR)) + CALL LCMGET(IPGRAD,'FOBJ-CST-VAL',FF) + CALL LCMGET(IPGRAD,'GRADIENT',DFF) + G(:NVAR)=2.0D0*MATMUL(DFF,FF) + TDFF=TRANSPOSE(DFF) + CALL ALST2F(NFUNC,NFUNC,NVAR,TDFF,UD) + CALL ALST2S(NFUNC,NFUNC,NVAR,TDFF,UD,FF,P) + P(:NVAR)=-P(:NVAR) + DEALLOCATE(UD,TDFF,DFF,FF) + ENDIF + GNORM=DOT_PRODUCT(G(:NVAR),G(:NVAR))/REAL(NVAR) + PABS=SQRT(DOT_PRODUCT(P(:NVAR),P(:NVAR))) + P(:NVAR)=P(:NVAR)*SR/PABS ! stepsize normalization + SLOPE=DOT_PRODUCT(G(:NVAR),P(:NVAR)) + ALAM=1.0D0 + IF(IOPT.EQ.-1) F=-F + FOLD=F + CALL LCMPUT(IPGRAD,'DIRECTION',NVAR,4,P) + CALL LCMSIX(IPGRAD,'OLD-VALUE',1) + CALL LCMPUT(IPGRAD,'VAR-VALUE',NVAR,4,X) + CALL LCMPUT(IPGRAD,'FOBJ-CST-VAL',1,4,FOLD) + CALL LCMSIX(IPGRAD,' ',2) + GO TO 30 + ELSE +* recover values at beginning of line search + CALL LCMGET(IPGRAD,'DIRECTION',P) + CALL LCMSIX(IPGRAD,'OLD-VALUE',1) + CALL LCMGET(IPGRAD,'VAR-VALUE',X) + CALL LCMGET(IPGRAD,'FOBJ-CST-VAL',FOLD) + IF(IOPT.EQ.-1) FOLD=-FOLD + CALL LCMSIX(IPGRAD,' ',2) + ENDIF +*---- +* SINGLE INNER ITERATION OF THE LINE OPTIMIZATION +*---- + IF(IOPT.EQ.-1) F=-F + IF(F.LE.FOLD+XI*ALAM*SLOPE) THEN +* Armijo condition + JCONV =1 + GO TO 40 + ELSE IF(ISTEP.GT.MAXINT) THEN + JCONV =2 + GO TO 40 + ENDIF + ALAM=ALAM*WIDTH + 30 X(:NVAR)=X(:NVAR)+ALAM*P(:NVAR) + DO I=1,NVAR + X(I)=MAX(XMIN(I),MIN(XMAX(I),X(I))) + ENDDO + CALL LCMPUT(IPGRAD,'VAR-VALUE',NVAR,4,X) + 40 DEALLOCATE(XMAX,XMIN,G,P,X) + IF(IPRINT.GT.0) WRITE(6,110) IEXT,ISTEP,ALAM,F,JCONV + IF(IPRINT.GT.2) THEN + ALLOCATE(X(NVAR),P(NVAR)) + CALL LCMGET(IPGRAD,'DIRECTION',P) + CALL LCMGET(IPGRAD,'VAR-VALUE',X) + WRITE(6,120) ' LINE SEARCH DIRECTION',(P(I),I=1,NVAR) + WRITE(6,120) 'OUTPUT DECISION VARIABLES',(X(I),I=1,NVAR) + DEALLOCATE(P,X) + ENDIF +*---- +* TEST FOR EXTERNAL ITERATION CONVERGENCE +*---- + IF(JCONV.GE.1) THEN + DNVTST=1 + TEST2=ABS(F-FOLD) + IF(GNORM.LT.0.01*EPS2) THEN + IF(IPRINT.GT.0) PRINT *,'>>> OUTER CONVERGED WRT GNORM' + CNVTST=1 + ICONV =1 + ELSE IF((TEST2.LT.EPS2).AND.(ISTEP.GT.1)) THEN + IF(IPRINT.GT.0) PRINT *,'>>> OUTER CONVERGED WRT F-FOLD' + CNVTST=1 + ICONV =1 + ELSE IF(IEXT.GE.MAXEXT) THEN + IF(IPRINT.GT.0) PRINT *,'>>> OUTER REACHES MAXIMUM ITERATION' + CNVTST=1 + ICONV =1 + ENDIF + IF(IPRINT.GT.0) WRITE(6,130) IEXT,ABS(ALAM),GNORM,TEST2,EPS2 +*---- +* RESTART CG OR BFGS HESSIAN MATRIX CALCULATION +*---- + IF((NSTART.NE.0).AND.(IEXT.GE.NSTART)) THEN + IEXT=0 + MAXEXT=MAXEXT-NSTART + ENDIF +*---- +* SAVE OLD GRADIENT +*---- + ALLOCATE(G(NVAR),P(NVAR)) + CALL LCMGET(IPGRAD,'GRADIENT',G) + CALL LCMGET(IPGRAD,'DIRECTION',P) + CALL LCMSIX(IPGRAD,'OLD-VALUE',1) + CALL LCMPUT(IPGRAD,'GRADIENT',NVAR,4,G) + CALL LCMSIX(IPGRAD,' ',2) + DEALLOCATE(P,G) + IEXT=IEXT+1 + ENDIF +*---- +* SAVE THE STATE VECTORS +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=NVAR + ISTATE(3)=IOPT + ISTATE(4)=ICONV + ISTATE(5)=IEXT + ISTATE(6)=IEDSTP + ISTATE(7)=IHESS + ISTATE(8)=IMETH + ISTATE(10)=ISTEP + ISTATE(11)=JCONV + ISTATE(12)=MAXEXT + ISTATE(13)=NSTART + IF(IPRINT.GT.0) WRITE(6,140) (ISTATE(I),I=1,13) + CALL LCMPUT(IPGRAD,'STATE-VECTOR',NSTATE,1,ISTATE) + OPTPRR(:NSTATE)=0.0D0 + OPTPRR(1)=SR + OPTPRR(2)=EPS1 + OPTPRR(3)=EPS2 + OPTPRR(4)=EPS3 + IF(IPRINT.GT.0) WRITE(6,150) (OPTPRR(I),I=1,4) + CALL LCMPUT(IPGRAD,'OPT-PARAM-R',NSTATE,4,OPTPRR) + DSAVE(1)=SLOPE + DSAVE(2)=ALAM + DSAVE(3)=GNORM + CALL LCMPUT(IPGRAD,'LNSR-INFO',3,4,DSAVE) + IF(IPRINT.GT.2) CALL LCMLIB(IPGRAD) +*---- +* RECOVER THE CONVERGENCE FLAGS AND SAVE IT IN A CLE-2000 VARIABLE +*---- + IF(IPICK.EQ.1) THEN + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.-5) CALL XABORT('LNSR: OUTPUT LOGICAL EXPECTED.') + INDIC=5 + CALL REDPUT(INDIC,DNVTST,FLOTT,TEXT12,DFLOTT) + 50 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('LNSR: CHARACTER DATA EXPECTED(2).') + IF(TEXT12.EQ.'OUT-CONV-TST') THEN + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.-5) CALL XABORT('LNSR: OUTPUT LOGICAL EXPECTED.') + INDIC=5 + CALL REDPUT(INDIC,CNVTST,FLOTT,TEXT12,DFLOTT) + GO TO 50 + ELSE IF (TEXT12.EQ.';') THEN + RETURN + ELSE + CALL XABORT('LNSR: ; CHARACTER EXPECTED.') + ENDIF + ENDIF + RETURN +* + 100 FORMAT(/14H LNSR: ##ITER=,I8,20H OBJECTIVE FUNCTION=,1P,E14.6) + 110 FORMAT(/21H LNSR: EXTERNAL ITER=,I5,18H LINE SEARCH ITER=,I4, + 1 7H ALPHA=,1P,E17.10,20H OBJECTIVE FUNCTION=,E17.10,6H CONV=,I2) + 120 FORMAT(/7H LNSR: ,A25,1H=,1P,8E12.4/(33X,8E12.4)) + 130 FORMAT(/26H LNSR: EXTERNAL ITERATION=,I4,12H ACCURACIES=,1P, + 1 3E12.4,6H EPS2=,E12.4) + 140 FORMAT(/8H OPTIONS/8H -------/ + 1 7H NVAR ,I8,32H (NUMBER OF CONTROL VARIABLES)/ + 2 7H NCST ,I8,26H (NUMBER OF CONSTRAINTS)/ + 3 7H IOPT ,I8,37H (=1/-1: MINIMIZATION/MAXIMIZATION)/ + 4 7H ICONV ,I8,43H (=0/1: EXTERNAL NOT CONVERGED/CONVERGED)/ + 5 7H IEXT ,I8,32H (INDEX OF EXTERNAL ITERATION)/ + 6 7H IEDSTP,I8,13H (NOT USED)/ + 7 7H IHESS ,I8,46H (=0/1/2/3/4: STEEPEST/CG/BFGS/LBFGS/NEWTON)/ + 8 7H ISEARC,I8,35H (=0/1/2: NO SEARCH/OPTEX/NEWTON)/ + 9 7H IMETH ,I8,13H (NOT USED)/ + 1 7H ISTEP ,I8,35H (INDEX OF LINE SEARCH ITERATION)/ + 2 7H JCONV ,I8,48H (=0/1/2: LINE SEARCH NOT CONVERGED/CONVERGED)/ + 3 7H MAXEXT,I8,42H (MAXIMUM NUMBER OF EXTERNAL ITERATIONS)/ + 4 7H NSTART,I8,37H (EXTERNAL ITERATION RESTART CYCLE)) + 150 FORMAT(/ + 1 12H REAL PARAM:,1P/12H -----------/ + 2 7H SR ,D12.4,33H (MAXIMUM LINE SEARCH STEPSIZE)/ + 3 7H EPS1 ,D12.4,13H (NOT USED)/ + 4 7H EPS2 ,D12.4,31H (EXTERNAL CONVERGENCE LIMIT)/ + 5 7H EPS3 ,D12.4,31H (INTERNAL CONVERGENCE LIMIT)) + END diff --git a/Donjon/src/LZC.f b/Donjon/src/LZC.f new file mode 100644 index 0000000..2fc9204 --- /dev/null +++ b/Donjon/src/LZC.f @@ -0,0 +1,133 @@ +*DECK LZC
+ SUBROUTINE LZC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Read specification for the liquid zone controllers; add the new data
+* to the existing device object.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* NENTRY number of data structures transfered to this module.
+* HENTRY name of the data structures.
+* IENTRY data structure type where:
+* IENTRY=1 for LCM memory object;
+* IENTRY=2 for XSM file;
+* IENTRY=3 for sequential binary file;
+* IENTRY=4 for sequential ASCII file.
+* JENTRY access permission for the data structure where:
+* JENTRY=0 for a data structure in creation mode;
+* JENTRY=1 for a data structure in modifications mode;
+* JENTRY=2 for a data structure in read-only mode.
+* KENTRY data structure pointer.
+*
+*Comments:
+* The LZC: module specification is:
+* DEVICE MATEX := LZC: [ DEVICE ] MATEX :: (desclzc) ;
+* where
+* DEVICE : name of the \emph{device} object.
+* Note, if the rod-type devices are not present in the reactor core, then
+* DEVICE object must appear only on the LHS (i.e. in create mode), it will
+* contain the information only with respect to the liquid zone controllers.
+* However, if the rod-type devices are present in the reactor core, then they
+* must be specified first (i.e. before the liquid controllers) using the DEVINI:
+* module. In the last case, the DEVICE object must also appear on the RHS
+* (i.e. in modification mode), it will contain the additional and separate
+* information with respect to the liquid zone controllers.
+* MATEX : name of the \emph{matex} object
+* that will be updated by the module. The lzc-devices material mixtures are
+* appended to the previous material index and the lzc-devices indices are
+* also modified, accordingly.
+* (desclzc) : structure describing the input data to the LZC: module.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ TYPE(C_PTR) KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40)
+ CHARACTER HSIGN*12,TEXT12*12
+ INTEGER ISTATE(NSTATE)
+ REAL LIMIT(6)
+ LOGICAL LNEW
+ TYPE(C_PTR) IPDEV,IPMTX
+ REAL, ALLOCATABLE, DIMENSION(:) :: XXX,YYY,ZZZ
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.NE.2)CALL XABORT('@LZC: TWO PARAMETERS EXPECTED')
+ TEXT12=HENTRY(1)
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@LZ'
+ 1 //'C: LCM OBJECT EXPECTED FOR L_DEVICE ('//TEXT12//').')
+ IF(JENTRY(1).EQ.1)THEN
+ CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_DEVICE')CALL XABORT('@LZC: MISSING L_DEV'
+ 1 //'ICE OBJECT.')
+ LNEW=.FALSE.
+ ELSEIF(JENTRY(1).EQ.0)THEN
+ HSIGN='L_DEVICE'
+ CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ LNEW=.TRUE.
+ ELSE
+ CALL XABORT('@LZC: ONLY CREATE OR MODIFICATION MODE EXPEC'
+ 1 //'TED FOR L_DEVICE OBJECT.')
+ ENDIF
+ IPDEV=KENTRY(1)
+ IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@LZ'
+ 1 //'C: LCM OBJECT EXPECTED FOR L_MATEX.')
+ CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_MATEX')CALL XABORT('@LZC: MISSING L_MATEX.')
+ IF(JENTRY(2).NE.1)CALL XABORT('@LZC: MODIFICATION MODE EX'
+ 1 //'PECTED FOR L_MATEX.')
+ IPMTX=KENTRY(2)
+*----
+* RECOVER INFORMATION
+*----
+ ISTATE(:NSTATE)=0
+ CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE)
+ IGEO=ISTATE(6)
+ IF(IGEO.NE.7)CALL XABORT('@LZC: ONLY'
+ 1 //' 3D-CARTESIAN GEOMETRY ALLOWED.')
+ NMIX=ISTATE(2)
+ NTOT=ISTATE(5)
+ LX=ISTATE(8)
+ LY=ISTATE(9)
+ LZ=ISTATE(10)
+* LIMITS ALONG X-AXIS
+ ALLOCATE(XXX(LX+1))
+ XXX(:LX+1)=0.0
+ CALL LCMGET(IPMTX,'MESHX',XXX)
+ LIMIT(1)=XXX(1)
+ LIMIT(2)=XXX(LX+1)
+ DEALLOCATE(XXX)
+* LIMITS ALONG Y-AXIS
+ ALLOCATE(YYY(LY+1))
+ YYY(:LY+1)=0.0
+ CALL LCMGET(IPMTX,'MESHY',YYY)
+ LIMIT(3)=YYY(1)
+ LIMIT(4)=YYY(LY+1)
+ DEALLOCATE(YYY)
+* LIMITS ALONG Z-AXIS
+ ALLOCATE(ZZZ(LZ+1))
+ ZZZ(:LZ+1)=0.0
+ CALL LCMGET(IPMTX,'MESHZ',ZZZ)
+ LIMIT(5)=ZZZ(1)
+ LIMIT(6)=ZZZ(LZ+1)
+ DEALLOCATE(ZZZ)
+* READ LZC INPUT DATA
+ CALL LZCDRV(IPDEV,IPMTX,IGEO,NMIX,NTOT,LIMIT,LNEW)
+ RETURN
+ END
diff --git a/Donjon/src/LZCDGD.f b/Donjon/src/LZCDGD.f new file mode 100644 index 0000000..be3f70e --- /dev/null +++ b/Donjon/src/LZCDGD.f @@ -0,0 +1,156 @@ +*DECK LZCDGD
+ SUBROUTINE LZCDGD(IPDEV,NLZC,LGRP,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Create the liquid-zone-controllers group directories on the device
+* data structure.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input
+* IPDEV pointer to device information.
+* NLZC total number of liquid zone controllers.
+* LGRP total number of lzc-groups.
+* IMPX printing index (=0 for no print).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPDEV
+ INTEGER NLZC,LGRP,IMPX
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ CHARACTER TEXT*12
+ INTEGER LZCID(NLZC)
+ DOUBLE PRECISION DFLOT
+ TYPE(C_PTR) JPDEV,KPDEV
+*----
+* CREATE GROUPS
+*----
+ JPDEV=LCMLID(IPDEV,'LZC_GROUP',LGRP)
+ IGRP=0
+ IF(IMPX.GT.0)WRITE(IOUT,1001)
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCDGD: KEYWORD GROUP-ID EXPECTED.')
+ IF(TEXT.NE.'GROUP-ID')CALL XABORT('@LZCDGD: KEYWORD GROUP-'
+ 1 //'ID EXPECTED.')
+ 10 IGRP=IGRP+1
+ CALL REDGET(ITYP,JGRP,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCDGD: INTEGER GROUP-ID NUMBER'
+ 1 //' EXPECTED.')
+ IF(JGRP.NE.IGRP)THEN
+ WRITE(IOUT,*)'@LZCDGD: READ GROUP-ID NUMBER #',JGRP
+ WRITE(IOUT,*)'@LZCDGD: EXPECTED GROUP-ID NUMBER #',IGRP
+ CALL XABORT('@LZCDGD: WRONG GROUP-ID NUMBER.')
+ ENDIF
+ IF(JGRP.GT.LGRP)THEN
+ WRITE(IOUT,*)'@LZCDGD: GIVEN TOTAL NUMBER OF GROUPS ',LGRP
+ WRITE(IOUT,*)'@LZCDGD: READ GROUP-ID NUMBER #',JGRP
+ CALL XABORT('@LZCDGD: WRONG GROUP-ID NUMBER.')
+ ENDIF
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCDGD: KEYWORD EXPECTED.')
+*----
+* OPTION ALL
+*----
+ IF(TEXT.EQ.'ALL')THEN
+ KPDEV=LCMDIL(JPDEV,IGRP)
+ DO 30 ID=1,NLZC
+ LZCID(ID)=ID
+ 30 CONTINUE
+ CALL LCMPUT(KPDEV,'GROUP-ID',1,1,IGRP)
+ CALL LCMPUT(KPDEV,'NUM-LZC',1,1,NLZC)
+ CALL LCMPUT(KPDEV,'LZC-ID',NLZC,1,LZCID)
+*
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCDGD: WRONG INPUT DATA.')
+ IF(TEXT.EQ.';')THEN
+ IF(IGRP.EQ.LGRP)THEN
+ NDG=NLZC
+ GOTO 100
+ ENDIF
+ WRITE(IOUT,*)'@LZCDGD: GIVEN TOTAL NUMBER OF GROUPS ',LGRP
+ WRITE(IOUT,*)'@LZCDGD: CREATED ONLY NUMBER OF GROUPS ',IGRP
+ CALL XABORT('@LZCDGD: WRONG NUMBER OF GROUPS.')
+ ELSEIF(TEXT.EQ.'GROUP-ID')THEN
+ IF(IMPX.GT.0)WRITE(IOUT,1000)IGRP,NLZC
+ GOTO 10
+ ELSE
+ CALL XABORT('@LZCDGD: WRONG KEYWORD '//TEXT)
+ ENDIF
+*----
+* OPTION LZC-ID
+*----
+ ELSEIF(TEXT.EQ.'LZC-ID')THEN
+ NDG=0
+ LZCID(:NLZC)=0
+ KPDEV=LCMDIL(JPDEV,IGRP)
+*
+ 50 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.EQ.3)THEN
+ IF(TEXT.EQ.';')THEN
+ IF(IGRP.EQ.LGRP)GOTO 100
+ WRITE(IOUT,*)'@LZCDGD: GIVEN TOTAL NUMBER OF GROUPS ',LGRP
+ WRITE(IOUT,*)'@LZCDGD: CREATED ONLY NUMBER OF GROUPS ',IGRP
+ CALL XABORT('@LZCDGD: WRONG NUMBER OF GROUPS.')
+ ELSEIF(TEXT.EQ.'GROUP-ID')THEN
+ IF(IMPX.GT.0)WRITE(IOUT,1000)IGRP,NDG
+ GOTO 10
+ ELSE
+ CALL XABORT('@LZCDGD: WRONG KEYWORD '//TEXT)
+ ENDIF
+*----
+* LZC-ID NUMBERS
+*----
+ ELSEIF(ITYP.EQ.1)THEN
+ ID=NITMA
+ IF((ID.GT.NLZC).OR.(ID.LE.0))THEN
+ WRITE(IOUT,*)'@LZCDGD: FOR THE GROUP #',IGRP
+ WRITE(IOUT,*)'@LZCDGD: READ LZC-ID #',ID
+ CALL XABORT('@LZCDGD: WRONG LZC-ID NUMBER.')
+ ENDIF
+ DO I=1,NLZC
+ IF(ID.EQ.LZCID(I))THEN
+ WRITE(IOUT,*)'@LZCDGD: FOR THE GROUP #',IGRP
+ WRITE(IOUT,*)'@LZCDGD: REPEATED LZC-ID #',ID
+ CALL XABORT('@LZCDGD: WRONG LZC-ID NUMBER.')
+ ENDIF
+ ENDDO
+*
+ NDG=NDG+1
+ IF(NDG.GT.NLZC)THEN
+ WRITE(IOUT,*)'@LZCDGD: FOR THE GROUP #',IGRP
+ WRITE(IOUT,*)'@LZCDGD: WRONG TOTAL NUMBER OF LZC ',NDG
+ CALL XABORT('@LZCDGD: INVALID INPUT OF LZC-DEVICES.')
+ ENDIF
+ LZCID(NDG)=ID
+ CALL LCMPUT(KPDEV,'GROUP-ID',1,1,IGRP)
+ CALL LCMPUT(KPDEV,'NUM-LZC',1,1,NDG)
+ CALL LCMPUT(KPDEV,'LZC-ID',NDG,1,LZCID)
+ ELSE
+ CALL XABORT('@LZCDGD: WRONG INPUT DATA.')
+ ENDIF
+ GOTO 50
+ ELSE
+ CALL XABORT('@LZCDGD: WRONG KEYWORD '//TEXT)
+ ENDIF
+ 100 IF(IMPX.GT.0)WRITE(IOUT,1000)IGRP,NDG
+ IF(IMPX.GT.0)WRITE(IOUT,1002)LGRP
+ RETURN
+*
+ 1000 FORMAT(/1X,'CREATED A GROUP #',I2.2,
+ 1 4X,'INCLUDES TOTAL NUMBER OF LZC:',1X,I2)
+ 1001 FORMAT(/1X,'** CREATING GROUPS FOR LZC-DEVICES **')
+ 1002 FORMAT(/1X,39('-')/1X,'TOTAL NUMBER OF GROUPS CREATED:',I2)
+ END
diff --git a/Donjon/src/LZCDRV.f b/Donjon/src/LZCDRV.f new file mode 100644 index 0000000..4f71429 --- /dev/null +++ b/Donjon/src/LZCDRV.f @@ -0,0 +1,161 @@ +*DECK LZCDRV
+ SUBROUTINE LZCDRV(IPDEV,IPMTX,IGEO,NMIX,NTOT,LIMIT,LNEW)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Read specifications for the liquid zone controllers from input file.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input/output
+* IPDEV pointer to device information.
+* IPMTX pointer to matex information.
+* IGEO index related to the reactor geometry.
+* NMIX old maximum number of material mixtures.
+* NTOT old total number of all mixtures.
+* LIMIT core limiting coordinates.
+* LNEW flag with respect to device object:
+* =.true. in create mode; =.false. in modification mode.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPDEV,IPMTX
+ INTEGER NMIX,NTOT
+ REAL LIMIT(6)
+ LOGICAL LNEW
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40,IOUT=6)
+ CHARACTER TEXT*12
+ INTEGER ISTATE(NSTATE)
+ DOUBLE PRECISION DFLOT
+ TYPE(C_PTR) JPDEV,KPDEV
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX,MAT
+*----
+* READ INPUT DATA
+*----
+ IMPX=1
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCDRV: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT.NE.'EDIT')GOTO 10
+* PRINTING INDEX
+ CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCDRV: INTEGER FOR EDIT EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCDRV: CHARACTER DATA EXPECTED(2).')
+ 10 IF(TEXT.NE.'NUM-LZC')CALL XABORT('@LZCDRV: KEYWORD NUM-LZC EXP'
+ 1 //'ECTED.')
+* TOTAL NUMBER OF LZC
+ CALL REDGET(ITYP,NLZC,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCDRV: INTEGER TOTAL NUMBER OF LZC'
+ 1 //' EXPECTED.')
+ IF(NLZC.LT.1)CALL XABORT('@LZCDRV: WRONG TOTAL NUMBER OF LZC <1')
+*
+ NTOT2=NTOT+NLZC*4
+ ALLOCATE(MIX(NTOT2),MAT(NTOT))
+ MIX(:NTOT2)=0
+ MAT(:NTOT)=0
+ CALL LCMGET(IPMTX,'MAT',MAT)
+ DO 20 I=1,NTOT
+ MIX(I)=MAT(I)
+ 20 CONTINUE
+ DEALLOCATE(MAT)
+*----
+* READ OPTION
+*----
+ IF(IMPX.GT.0)WRITE(IOUT,1000)NLZC
+ JPDEV=LCMLID(IPDEV,'DEV_LZC',NLZC)
+ K=0
+ 30 K=K+1
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.EQ.'LZC')THEN
+ CALL REDGET(ITYP,ID,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCDRV: INTEGER ID NUM'
+ 1 //'BER FOR THE CURRENT LZC EXPECTED.')
+ IF(ID.NE.K)THEN
+ WRITE(IOUT,*)'@LZCDRV: READ CURRENT LZC-ID #',ID
+ WRITE(IOUT,*)'@LZCDRV: EXPECTED LZC-ID #',K
+ CALL XABORT('@LZCDRV: WRONG INPUT OF ID NUMBER.')
+ ENDIF
+ IF(ID.GT.NLZC)THEN
+ WRITE(IOUT,*)'@LZCDRV: READ CURRENT LZC-ID #',ID
+ WRITE(IOUT,*)'@LZCDRV: GIVEN TOTAL NUMBER OF LZC:',NLZC
+ CALL XABORT('@LZCDRV: WRONG INPUT OF LZC-ID NUMBER. GRE'
+ 1 //'ATER THAN THE TOTAL NUMBER OF LZC.')
+ ENDIF
+ ELSEIF((TEXT.EQ.'CREATE').OR.(TEXT.EQ.';'))THEN
+ GOTO 40
+ ELSE
+ WRITE(IOUT,*)'@LZCDRV: INVALID KEYWORD ',TEXT
+ CALL XABORT('@LZCDRV: KEYWORD OR ; EXPECTED.')
+ ENDIF
+ IF(IMPX.GT.1)WRITE(IOUT,1001)ID
+ KPDEV=LCMDIL(JPDEV,ID)
+* READ INDIVIDUAL LZC DATA
+ CALL LZCGET(KPDEV,NTOT,NMIX,NTOT2,MIX,ID,LIMIT,IMPX)
+ GOTO 30
+ 40 IF(ID.NE.NLZC)THEN
+ WRITE(IOUT,*)'@LZCDRV: GIVEN TOTAL NUMBER OF LZC ',NLZC
+ WRITE(IOUT,*)'@LZCDRV: READ ONLY THE NUMBER OF LZC ',ID
+ CALL XABORT('@LZCDRV: WRONG INPUT OF LZC DEVICES.')
+ ENDIF
+ IF(IMPX.GT.0)WRITE(IOUT,1002)ID
+ IF(TEXT.EQ.';')GOTO 50
+ LGRP=0
+* TOTAL NUMBER OF LZC-GROUPS
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'LZC-GR')CALL XABORT('@LZCDRV: KEYWORD LZC-GR EX'
+ 1 //'PECTED.')
+ CALL REDGET(ITYP,LGRP,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCDRV: INTEGER NUMBER OF LZC-GR'
+ 1 //'OUPS EXPECTED.')
+ IF(LGRP.LT.1)CALL XABORT('@LZCDRV: WRONG NUMBER OF GROUPS <1')
+* CREATE LZC-GROUPS
+ CALL LZCDGD(IPDEV,NLZC,LGRP,IMPX)
+*----
+* STATE-VECTORS
+*----
+ 50 ISTATE(:NSTATE)=0
+ IF(LNEW)THEN
+ ISTATE(1)=IGEO
+ ISTATE(4)=NLZC
+ ISTATE(5)=LGRP
+ ELSE
+* UPDATE DEVICE
+ CALL LCMGET(IPDEV,'STATE-VECTOR',ISTATE)
+ ISTATE(4)=NLZC
+ ISTATE(5)=LGRP
+ ENDIF
+ CALL LCMPUT(IPDEV,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IMPX.GT.1)CALL LCMLIB(IPDEV)
+* UPDATE MATEX
+ ISTATE(:NSTATE)=0
+ CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE)
+ ISTATE(2)=NMIX+NLZC*4
+ ISTATE(5)=NTOT2
+ CALL LCMPUT(IPMTX,'STATE-VECTOR',NSTATE,1,ISTATE)
+ CALL LCMPUT(IPMTX,'MAT',NTOT2,1,MIX)
+ DEALLOCATE(MIX)
+ IF(IMPX.EQ.99)THEN
+* CHECK NEW COMPUTED VALUES
+ WRITE(IOUT,*)'OLD VALUES: NMIX=',NMIX,' NTOT=',NTOT
+ WRITE(IOUT,*)'NEW VALUES: NMIX=',ISTATE(2),' NTOT=',ISTATE(5)
+ ENDIF
+ IF(IMPX.GT.5)CALL LCMLIB(IPMTX)
+ RETURN
+*
+ 1000 FORMAT(/1X,'GIVEN TOTAL NUMBER OF LIQUID ZONE CONTROL',
+ 1 'LERS: ',I2//1X,'** READING INPUT DATA FOR LZC **')
+ 1001 FORMAT(/6X,'=>',2X,'LZC #',I2.2)
+ 1002 FORMAT(/1X,35('-')/1X,'READ TOTAL NUMBER OF LZC: ',I2)
+ END
diff --git a/Donjon/src/LZCGET.f b/Donjon/src/LZCGET.f new file mode 100644 index 0000000..bb421c6 --- /dev/null +++ b/Donjon/src/LZCGET.f @@ -0,0 +1,232 @@ +*DECK LZCGET
+ SUBROUTINE LZCGET(KPDEV,NTOT,NMIX,NTOT2,MIX,ID,LIMIT,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Read the specification for a given liquid zone controller.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input/output
+* KPDEV pointer to DEV_LZC directory for lzc information.
+* NTOT old total number of all mixtures.
+* NMIX old maximum number of material mixtures.
+* NTOT2 new total number of all mixtures.
+* MIX new mixture index of all mixtures.
+* ID current lzc identification number.
+* LIMIT core limiting coordinates.
+* IMPX printing index (=0 for no print).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) KPDEV
+ INTEGER NTOT,NMIX,NTOT2,MIX(NTOT2),ID,IMPX
+ REAL LIMIT(6)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ INTEGER EMIX(2),FMIX(2)
+ REAL MAXPOS(6),EMPTPOS(6),FULLPOS(6),LEVEL
+ DOUBLE PRECISION DFLOT
+ CHARACTER TEXT*12,AXIS
+*----
+* REACTOR CORE LIMITS
+*----
+ XMIN=LIMIT(1)
+ XMAX=LIMIT(2)
+ YMIN=LIMIT(3)
+ YMAX=LIMIT(4)
+ ZMIN=LIMIT(5)
+ ZMAX=LIMIT(6)
+*----
+* WHOLE LZC POSITION
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'MAXPOS')CALL XABORT('@LZCGET: KEYWORD MAXPOS EXP'
+ 1 //'ECTED.')
+ DO I=1,6
+ CALL REDGET(ITYP,NITMA,MAXPOS(I),TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR MAXPOS EXPECTED.')
+ ENDDO
+*----
+* CHECK LZC POSITION
+*----
+ IF(MAXPOS(2).LT.MAXPOS(1))CALL XABORT('@LZCGET: WRONG X '
+ 1 //'LZC COORDINATES: X- > X+')
+ IF(MAXPOS(1).LT.XMIN)CALL XABORT('@LZCGET: WRONG X- VALUE.')
+ IF(MAXPOS(2).GT.XMAX)CALL XABORT('@LZCGET: WRONG X+ VALUE.')
+*
+ IF(MAXPOS(4).LT.MAXPOS(3))CALL XABORT('@LZCGET: WRONG Y '
+ 1 //'LZC COORDINATES: Y- > Y+')
+ IF(MAXPOS(3).LT.YMIN)CALL XABORT('@LZCGET: WRONG Y- VALUE.')
+ IF(MAXPOS(4).GT.YMAX)CALL XABORT('@LZCGET: WRONG Y+ VALUE.')
+*
+ IF(MAXPOS(6).LT.MAXPOS(5))CALL XABORT('@LZCGET: WRONG Z '
+ 1 //'LZC COORDINATES: Z- > Z+')
+ IF(MAXPOS(5).LT.ZMIN)CALL XABORT('@LZCGET: WRONG Z- VALUE.')
+ IF(MAXPOS(6).GT.ZMAX)CALL XABORT('@LZCGET: WRONG Z+ VALUE.')
+*----
+* MAX-FULL COORDINATE
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'MAX-FULL')CALL XABORT('@LZCGET: KEYWORD MAX-FULL'
+ 1 //' EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FULMAX,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR MAX-FULL COORDIN'
+ 1 //'ATE EXPECTED.')
+*----
+* LZC FILLING AXIS
+*----
+ HEIGHT=0.
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'AXIS')CALL XABORT('@LZCGET: KEYWORD AXIS EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FLOT,AXIS,DFLOT)
+ IF(AXIS.NE.'X')THEN
+ IF(AXIS.NE.'Y')THEN
+ IF(AXIS.NE.'Z')THEN
+ CALL XABORT('@LZCGET: X, Y OR Z EXPECTED FOR AXIS.')
+ ELSE
+ IAXIS=3
+ IF(FULMAX.GT.MAXPOS(4))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: > Z+.')
+ IF(FULMAX.LT.MAXPOS(3))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: < Z-.')
+ HEIGHT=MAXPOS(6)-FULMAX
+ ENDIF
+ ELSE
+ IAXIS=2
+ IF(FULMAX.GT.MAXPOS(4))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: > Y+.')
+ IF(FULMAX.LT.MAXPOS(3))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: < Y-.')
+ HEIGHT=MAXPOS(4)-FULMAX
+ ENDIF
+ ELSE
+ IAXIS=1
+ IF(FULMAX.GT.MAXPOS(2))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: > X+.')
+ IF(FULMAX.LT.MAXPOS(1))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: < X-.')
+ HEIGHT=MAXPOS(2)-FULMAX
+ ENDIF
+ IF(HEIGHT.EQ.0.)CALL XABORT('@LZCGET: MAX-FULL WATER HEIGHT =0.')
+*----
+* LZC FILLING LEVEL
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'LEVEL')CALL XABORT('@LZCGET: KEYWORD LEVEL EXPECTED.')
+ CALL REDGET(ITYP,NITMA,LEVEL,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR FILLING LEVEL EX'
+ 1 //'PECTED.')
+ IF(LEVEL.GT.1.)CALL XABORT('@LZCGET: WRONG FILLING LEVEL: > 1.')
+ IF(LEVEL.LT.0.)CALL XABORT('@LZCGET: WRONG FILLING LEVEL: < 0.')
+*----
+* LZC FILLING RATE
+*----
+ RATE=0.
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT.NE.'RATE')GOTO 10
+ CALL REDGET(ITYP,NITMA,RATE,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR RATE EXPECTED.')
+ IF(RATE.LT.0.)CALL XABORT('@DEVSET: WRONG RATE VALUE < 0.')
+*----
+* LZC FILLING TIME
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(2).')
+ 10 TIME=0.
+ IF(TEXT.NE.'TIME')GOTO 20
+ CALL REDGET(ITYP,NITMA,TIME,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR TIME EXPECTED.')
+ IF(TIME.LT.0.)CALL XABORT('@DEVSET: WRONG TIME VALUE < 0.')
+*----
+* LZC MIXTURES
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(3).')
+* EMPTY PART
+ 20 IF(TEXT.NE.'EMPTY-MIX')CALL XABORT('@LZCGET: KEYWORD EMPTY-MI'
+ 1 //'X EXPECTED.')
+ DO I=1,2
+ CALL REDGET(ITYP,EMIX(I),FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCGET: INTEGER EMPTY-MIX NUMBER'
+ 1 //' EXPECTED.')
+ MIX(NTOT+(ID-1)*4+I)=EMIX(I)
+ EMIX(I)=NMIX+(ID-1)*4+I
+ ENDDO
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(4).')
+* FULL PART
+ IF(TEXT.NE.'FULL-MIX')CALL XABORT('@LZCGET: KEYWORD FULL-MIX '
+ 1 //'EXPECTED.')
+ DO I=1,2
+ CALL REDGET(ITYP,FMIX(I),FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCGET: INTEGER FULL-MIX NUMBER '
+ 1 //'EXPECTED.')
+ MIX(NTOT+(ID-1)*4+I+2)=FMIX(I)
+ FMIX(I)=NMIX+(ID-1)*4+I+2
+ ENDDO
+*----
+* CURRENT LZC POSITION
+*----
+ DELH=LEVEL*HEIGHT
+ DO I=1,6
+ EMPTPOS(I)=MAXPOS(I)
+ FULLPOS(I)=MAXPOS(I)
+ ENDDO
+ IF(IAXIS.EQ.1)THEN
+ FULLPOS(1)=MAXPOS(2)-DELH
+ EMPTPOS(2)=FULLPOS(1)
+ ELSEIF(IAXIS.EQ.2)THEN
+ FULLPOS(3)=MAXPOS(4)-DELH
+ EMPTPOS(4)=FULLPOS(3)
+ ELSEIF(IAXIS.EQ.3)THEN
+ FULLPOS(5)=MAXPOS(6)-DELH
+ EMPTPOS(6)=FULLPOS(5)
+ ENDIF
+*----
+* STORE LZC DATA
+*----
+ CALL LCMPUT(KPDEV,'LZC-ID',1,1,ID)
+ CALL LCMPUT(KPDEV,'MAX-POS',6,2,MAXPOS)
+ CALL LCMPUT(KPDEV,'AXIS',1,1,IAXIS)
+ CALL LCMPUT(KPDEV,'HEIGHT',1,2,HEIGHT)
+ CALL LCMPUT(KPDEV,'LEVEL',1,2,LEVEL)
+ CALL LCMPUT(KPDEV,'EMPTY-POS',6,2,EMPTPOS)
+ CALL LCMPUT(KPDEV,'FULL-POS',6,2,FULLPOS)
+ CALL LCMPUT(KPDEV,'EMPTY-MIX',2,1,EMIX)
+ CALL LCMPUT(KPDEV,'FULL-MIX',2,1,FMIX)
+ CALL LCMPUT(KPDEV,'RATE',1,2,RATE)
+ CALL LCMPUT(KPDEV,'TIME',1,2,TIME)
+*
+ IF(IMPX.GT.1)WRITE(IOUT,1000)MAXPOS(1),MAXPOS(3),MAXPOS(5),
+ 1 MAXPOS(2),MAXPOS(4),MAXPOS(6),HEIGHT,AXIS,LEVEL,EMPTPOS(1),
+ 2 EMPTPOS(3),EMPTPOS(5),EMPTPOS(2),EMPTPOS(4),EMPTPOS(6),
+ 3 FULLPOS(1),FULLPOS(3),FULLPOS(5),FULLPOS(2),FULLPOS(4),
+ 4 FULLPOS(6),RATE,TIME
+ RETURN
+*
+ 1000 FORMAT(/5X,'WHOLE POSITION :',
+ 1 4X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
+ 2 37X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
+ 3 /5X,'FIL-HEIGHT =',F9.4/
+ 4 /5X,'FIL-AXIS : ',A1,5X,'FIL-LEVEL =',F8.4/
+ 5 /5X,'EMPTY-PART POSITION :',
+ 6 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
+ 7 32X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
+ 8 /5X,'FULL-PART POSITION :',
+ 9 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
+ 1 32X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
+ 2 /5X,'FIL-RATE =',E11.4,5X,'FIL-TIME =',E11.4/)
+ END
diff --git a/Donjon/src/MACCRE.f b/Donjon/src/MACCRE.f new file mode 100644 index 0000000..40615f1 --- /dev/null +++ b/Donjon/src/MACCRE.f @@ -0,0 +1,206 @@ +*DECK MACCRE + SUBROUTINE MACCRE(IPOLD,IPNEW,NL,NW,NF,NGRP,NMXOLD,NMXNEW,NTOT, + 1 MIX,LMAP,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover nuclear properties from an initial macrolib and store them +* in a new one containing one mixture per region. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, E. Varin, D. Sekki +* +*Parameters: input +* IPOLD pointer to the initial macrolib. +* NL number of legendre orders (=1 for isotropic scattering). +* NW legendre order of NWT information (=0: NTOT0; =1: NTOT1). +* NF number of fissile isotopes. +* NGRP number of energy groups. +* NMXOLD number of material mixtures in the initial macrolib. +* NMXNEW number of material mixtures in the final macrolib. +* NTOT total number of all (material and virtual) mixtures. +* MIX index of all (material and virtual) mixtures. +* LMAP flag for the initial macrolib: +* =.true. if the fuel map macrolib. +* IMPX printing index (=0 for no print). +* +*Parameters: output +* IPNEW pointer to the final macrolib. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPOLD,IPNEW + INTEGER NL,NW,NF,NGRP,NMXOLD,NMXNEW,NTOT,MIX(NTOT) + LOGICAL LMAP +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + CHARACTER CM*2,NAME*12,FIRST*12 + TYPE(C_PTR) JPOLD,JPNEW,KPOLD,KPNEW + REAL, ALLOCATABLE, DIMENSION(:) ::SCAT,SCAT2,DATA,DATA2 +* + ALLOCATE(SCAT(NMXOLD*NL*NGRP*NGRP)) + ALLOCATE(SCAT2(NMXNEW*NL*NGRP*NGRP)) + SCAT(:NMXOLD*NL*NGRP*NGRP)=0.0 + SCAT2(:NMXNEW*NL*NGRP*NGRP)=0.0 +*---- +* RECOVER MACROLIB DATA +*---- + JPOLD=LCMGID(IPOLD,'GROUP') + JPNEW=LCMLID(IPNEW,'GROUP',NGRP) + DO 100 JGR=1,NGRP + KPOLD=LCMGIL(JPOLD,JGR) + KPNEW=LCMDIL(JPNEW,JGR) + IF(IMPX.GT.3)CALL LCMLIB(KPOLD) + IF(IMPX.GT.2)WRITE(IOUT,*)'** TREATING ENERGY GROUP #',JGR + NAME=' ' + CALL LCMNXT(KPOLD,NAME) + FIRST=NAME + 10 CALL LCMLEN(KPOLD,NAME,LENGT,ITYP) + IF((INDEX(NAME,'NTOT0').EQ.1).OR.(INDEX(NAME,'DIF').EQ.1).OR. + 1 (INDEX(NAME,'NFT').EQ.1).OR.(INDEX(NAME,'OVE').EQ.1).OR. + 2 (INDEX(NAME,'H-F').EQ.1).OR.(INDEX(NAME,'SIG').EQ.1))THEN +* RECOVER THESE PROPERTIES + IF(IMPX.GT.2)WRITE(IOUT,*)'PROPERTY NAME : ',NAME + IF(LENGT.EQ.NMXOLD)THEN + ALLOCATE(DATA(NMXOLD),DATA2(NMXNEW)) + DATA(:NMXOLD)=0.0 + DATA2(:NMXNEW)=0.0 + CALL LCMGET(KPOLD,NAME,DATA) + IF(LMAP)THEN +* RECOVER EXISTING DATA + CALL LCMLEN(KPNEW,NAME,LENGT2,ITYP2) + IF(LENGT2.NE.0)CALL LCMGET(KPNEW,NAME,DATA2) + ENDIF + ITOT=0 + DO 20 IBM=1,NTOT + IF(MIX(IBM).EQ.0)GOTO 20 + ITOT=ITOT+1 + IF(LMAP)THEN +* ONLY FUEL DATA WILL BE COPIED + IF(MIX(IBM).GT.0)GOTO 20 + J=-MIX(IBM) + ELSE +* FUEL DATA WILL NOT BE COPIED + IF(MIX(IBM).LT.0)GOTO 20 + J=MIX(IBM) + ENDIF +* COPY DATA + DATA2(ITOT)=DATA(J) + 20 CONTINUE +* STORE DATA + CALL LCMPUT(KPNEW,NAME,NMXNEW,ITYP,DATA2) + DEALLOCATE(DATA,DATA2) + ELSEIF(LENGT.EQ.-1)THEN + CALL XABORT('@MACCRE: '//NAME//' IS A DIRECTORY.') + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@MACCRE: INVALID INPUT MACROLIB(1).') + ENDIF + ELSE IF((INDEX(NAME,'NUS').EQ.1).OR.(INDEX(NAME,'CHI').EQ.1))THEN +* RECOVER FISSION-RELATED PROPERTIES + IF(IMPX.GT.2)WRITE(IOUT,*)'PROPERTY NAME : ',NAME + IF(LENGT.EQ.NMXOLD*NF)THEN + ALLOCATE(DATA(NMXOLD*NF),DATA2(NMXNEW*NF)) + DATA(:NMXOLD*NF)=0.0 + DATA2(:NMXNEW*NF)=0.0 + CALL LCMGET(KPOLD,NAME,DATA) + IF(LMAP)THEN +* RECOVER EXISTING DATA + CALL LCMLEN(KPNEW,NAME,LENGT2,ITYP2) + IF(LENGT2.NE.0)CALL LCMGET(KPNEW,NAME,DATA2) + ENDIF + ITOT=0 + DO 35 INF=1,NF + DO 30 IBM=1,NTOT + IF(MIX(IBM).EQ.0)GOTO 30 + ITOT=ITOT+1 + IF(LMAP)THEN +* ONLY FUEL DATA WILL BE COPIED + IF(MIX(IBM).GT.0)GOTO 30 + J=-MIX(IBM) + ELSE +* FUEL DATA WILL NOT BE COPIED + IF(MIX(IBM).LT.0)GOTO 30 + J=MIX(IBM) + ENDIF +* COPY DATA + J1=(INF-1)*NMXOLD+J + DATA2(ITOT)=DATA(J1) + 30 CONTINUE + 35 CONTINUE +* STORE DATA + CALL LCMPUT(KPNEW,NAME,NMXNEW*NF,ITYP,DATA2) + DEALLOCATE(DATA,DATA2) + ELSEIF(LENGT.EQ.-1)THEN + CALL XABORT('@MACCRE: '//NAME//' IS A DIRECTORY.') + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@MACCRE: INVALID INPUT MACROLIB(2).') + ENDIF + ENDIF + CALL LCMNXT(KPOLD,NAME) + IF(FIRST.EQ.NAME)GOTO 40 + GOTO 10 +* RECOVER SCAT,IJJ,NJJ,IPOS + 40 IF(IMPX.GT.2)WRITE(IOUT,*)'RECOVERING OF SCAT,IJJ,NJJ,IPOS' + DO IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMLEN(KPOLD,'SCAT'//CM,LENGT,ITYP) + IF(LENGT.EQ.0)THEN + EXIT + ELSEIF(LENGT.GT.NMXOLD*NL*NGRP*NGRP)THEN + CALL XABORT('@MACCRE: INVALID INPUT MACROLIB(3).') + ELSEIF(LENGT.GT.0)THEN + CALL MACSCA(KPOLD,KPNEW,SCAT,SCAT2,CM,JGR,IL,MIX,NMXNEW,NTOT, + 1 NMXOLD,NL,NGRP,LMAP) + ENDIF + ENDDO +* RECOVER NTOT1 information + IF(NW.GT.0) THEN + ALLOCATE(DATA(NMXOLD),DATA2(NMXNEW)) + DATA(:NMXOLD)=0.0 + DATA2(:NMXNEW)=0.0 + CALL LCMGET(KPOLD,'NTOT1',DATA) + IF(LMAP)THEN +* RECOVER EXISTING DATA + CALL LCMLEN(KPNEW,'NTOT0',LENGT1,ITYP1) + CALL LCMLEN(KPNEW,'NTOT1',LENGT2,ITYP2) + IF(LENGT2.NE.0) THEN + CALL LCMGET(KPNEW,'NTOT1',DATA2) + ELSE IF(LENGT1.NE.0) THEN + CALL LCMGET(KPNEW,'NTOT0',DATA2) + ENDIF + ENDIF + ITOT=0 + DO 50 IBM=1,NTOT + IF(MIX(IBM).EQ.0)GOTO 50 + ITOT=ITOT+1 + IF(LMAP)THEN +* ONLY FUEL DATA WILL BE COPIED + IF(MIX(IBM).GT.0)GOTO 50 + J=-MIX(IBM) + ELSE +* FUEL DATA WILL NOT BE COPIED + IF(MIX(IBM).LT.0)GOTO 50 + J=MIX(IBM) + ENDIF +* COPY DATA + DATA2(ITOT)=DATA(J) + 50 CONTINUE +* STORE DATA + CALL LCMPUT(KPNEW,'NTOT1',NMXNEW,ITYP,DATA2) + DEALLOCATE(DATA,DATA2) + ENDIF + IF(IMPX.GT.3)CALL LCMLIB(KPNEW) + 100 CONTINUE + DEALLOCATE(SCAT,SCAT2) + RETURN + END diff --git a/Donjon/src/MACINI.f b/Donjon/src/MACINI.f new file mode 100644 index 0000000..86037d0 --- /dev/null +++ b/Donjon/src/MACINI.f @@ -0,0 +1,260 @@ +*DECK MACINI + SUBROUTINE MACINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Construct a new macrolib that will contain one mixture number per +* material region; fuel-map macrolib is required. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, E. Varin, D. Sekki +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The MACINI: module specification is: +* MACRO2 MATEX := MACINI: MATEX MACRO [ MACFL ] :: [ EDIT iprint ] [ FUEL ] ; +* where +* MACRO2 : name of the extended \emph{macrolib} to be created by the module. +* MATEX : name of the \emph{matex} object containing an extended material +* index over the reactor geometry. MATEX must be specified in the +* modification mode; it will store the recovered h-factors per each fuel +* region. +* MACRO : name of a \emph{macrolib}, created using either MAC:, CRE:, NCR: +* or AFM: module, for the evolution-independent material properties +* (see structure (desccre1) or refer to the DRAGON user guide). +* MACFL : name of a fuel-map \emph{macrolib}, created using either CRE:, +* NCR: or AFM: module, for the interpolated fuel properties (see structure +* (desccre2) or refer to the DRAGON user guide). +* EDIT : keyword used to set iprint. +* iprint : integer index used to control the printing on screen: = 0 for +* no print; = 1 for minimum printing; larger values produce increasing +* amounts of output. The default value is iprint = 1. +* FUEL : keyword used to indicate that MACRO is a fuel-map \emph{macrolib} +* in case where only two RHS objects are defined. By default, MACRO contains +* evolution-independent cross sections. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER HSIGN*12,TEXT*12 + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION DFLOT + LOGICAL LMAP,LWD1,LWD2 + TYPE(C_PTR) IPMAC,IPMTX,IPMAC1,IPMAC2,JPMAC,KPMAC + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX + REAL, ALLOCATABLE, DIMENSION(:) :: HFAC,WDLA +*---- +* PARAMETER VALIDATION +*---- + IF((NENTRY.LE.2).OR.(NENTRY.GE.5)) + 1 CALL XABORT('@MACINI: 3 OR 4 PARAMETERS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@MACINI:' + 1 //' LCM OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.0)CALL XABORT('@MACINI: CREATE MODE EXPECTED' + 1 //' FOR L_MACROLIB AT LHS.') + IPMAC=KENTRY(1) +* L_MATEX + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@MACINI:' + 1 //' LCM OBJECT EXPECTED AT RHS.') + IF(JENTRY(2).NE.1)CALL XABORT('@MACINI: MODIFICATION MODE EX' + 1 //'PECTED FOR L_MATEX OBJECT.') + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MATEX')THEN + TEXT=HENTRY(2) + CALL XABORT('@MACINI: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_MATEX EXPECTED AT RHS.') + ENDIF + IPMTX=KENTRY(2) + DO IEN=3,NENTRY + IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@MACIN' + 1 //'I: LCM OBJECT EXPECTED AT RHS.') + IF(JENTRY(IEN).NE.2)CALL XABORT('@MACINI: READ-ONLY MODE EXPEC' + 1 //'TED FOR THE LCM OBJECTS AT RHS.') + ENDDO +* L_MACROLIB(1) + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MACROLIB')THEN + TEXT=HENTRY(3) + CALL XABORT('@MACINI: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. FIRST MACROLIB EXPECTED AT RHS.') + ENDIF + IPMAC1=KENTRY(3) +* L_MACROLIB(2) + IF(NENTRY.EQ.4) THEN + CALL LCMGTC(KENTRY(4),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MACROLIB')THEN + TEXT=HENTRY(4) + CALL XABORT('@MACINI: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. FUEL-MAP MACROLIB EXPECTED AT RHS.') + ENDIF + IPMAC2=KENTRY(4) + ELSE + IPMAC2=C_NULL_PTR + ENDIF +*---- +* RECOVER INFORMATION +*---- + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAC1,'STATE-VECTOR',ISTATE) +* MACROLIB(1)-INFO + NGRP=ISTATE(1) + NMIX1=ISTATE(2) + NL=ISTATE(3) + NF1=ISTATE(4) + NDEL1=ISTATE(7) + NDEL2=0 + LEAK=ISTATE(9) + NW1=ISTATE(10) +* MACROLIB(2)-INFO + NF2=1 + IF(NENTRY.EQ.4) THEN + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAC2,'STATE-VECTOR',ISTATE) + NMIX2=ISTATE(2) + NDEL2=ISTATE(7) + NL=MAX(ISTATE(3),NL) + NW2=ISTATE(10) + NF2=ISTATE(4) + IF((NF2.NE.NF1).AND.(NF1.GT.1)) THEN + WRITE(IOUT,*)'MACROLIB=',HENTRY(1),' NF=',NF1,' (0 EXPECTED)' + WRITE(IOUT,*)'MACROLIB=',HENTRY(2),' NF=',NF2 + CALL XABORT('@MACINI: INCONSISTENT NUMBER OF FISSILE ISOTOPE' + 1 //'S.') + ENDIF + IF(ISTATE(1).NE.NGRP)CALL XABORT('@MACINI: DIFFERENT NGRP' + 1 //' NUMBER IN TWO MACROLIB OBJECTS.') + IF(ISTATE(3).NE.NL)CALL XABORT('@MACINI: INCONSISTENT NL ' + 1 //'NUMBER IN TWO MACROLIB OBJECTS.') + IF(ISTATE(9).NE.LEAK)CALL XABORT('@MACINI: DIFFERENT LEAK' + 1 //' NUMBER IN TWO MACROLIB OBJECTS.') + ENDIF + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) +* MATEX-INFO + NMIX=ISTATE(2) + NTOT=ISTATE(5) + ALLOCATE(MIX(NTOT)) + MIX(:NTOT)=0 + CALL LCMGET(IPMTX,'MAT',MIX) + IMPX=1 + LMAP=.FALSE. + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.10)GOTO 20 + IF(ITYP.NE.3)CALL XABORT('@MACINI: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'EDIT')THEN +* READ PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@MACINI: INTEGER FOR EDIT EXPECTED.') + ELSE IF(TEXT.EQ.'FUEL')THEN +* ASSUME FUEL-MAP MACROLIB + IF(NENTRY.NE.3) CALL XABORT ('@MACINI: 3 PARAMETERS EXPECTED.') + LMAP=.TRUE. + ELSE IF(TEXT.EQ.';')THEN + GO TO 20 + ELSE + CALL XABORT('@MACINI: FINAL ; EXPECTED.') + ENDIF + GO TO 10 +*---- +* NEW MACROLIB CREATION +*---- + 20 IF(IMPX.GT.1)WRITE(IOUT,*)'NUMBER OF ENERGY GROUPS ',NGRP + IF(IMPX.GT.1)WRITE(IOUT,*)'TOTAL NUMBER OF MIXTURES ',NMIX +* DO NOT INCLUDE FUEL PROPERTIES + IF(IMPX.GT.0)WRITE(IOUT,*)'** TREATING FIRST MACROLIB **' + CALL MACCRE(IPMAC1,IPMAC,NL,NW1,NF1,NGRP,NMIX1,NMIX,NTOT,MIX,LMAP, + 1 IMPX) + IF(IMPX.GT.1)CALL LCMLIB(IPMAC) +* INCLUDE FUEL PROPERTIES + IF(NENTRY.EQ.4) THEN + LMAP=.TRUE. + IF(IMPX.GT.0)WRITE(IOUT,*)'** TREATING FUEL-MAP MACROLIB **' + CALL MACCRE(IPMAC2,IPMAC,NL,NW2,NF2,NGRP,NMIX2,NMIX,NTOT,MIX, + 1 LMAP,IMPX) + ENDIF + DEALLOCATE(MIX) +*---- +* RECOVER LAMBDA-D +*---- + CALL LCMLEN(IPMAC1,'LAMBDA-D',LENGTH,ITYLCM) + LWD1=(LENGTH.EQ.NDEL1).AND.(NDEL1.GT.0) + LWD2=.FALSE. + IF(NENTRY.EQ.4) THEN + CALL LCMLEN(IPMAC2,'LAMBDA-D',LENGTH,ITYLCM) + LWD2=(LENGTH.EQ.NDEL2).AND.(NDEL2.GT.0) + ENDIF + NDEL=0 + IF(LWD1) THEN + NDEL=NDEL1 + ALLOCATE(WDLA(NDEL)) + CALL LCMGET(IPMAC1,'LAMBDA-D',WDLA) + CALL LCMPUT(IPMAC,'LAMBDA-D',NDEL,2,WDLA) + DEALLOCATE(WDLA) + ELSE IF(LWD2) THEN + NDEL=NDEL2 + ALLOCATE(WDLA(NDEL)) + CALL LCMGET(IPMAC2,'LAMBDA-D',WDLA) + CALL LCMPUT(IPMAC,'LAMBDA-D',NDEL,2,WDLA) + DEALLOCATE(WDLA) + ENDIF +*---- +* STATE-VECTOR +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NMIX + ISTATE(3)=NL + IF(NENTRY.EQ.3) THEN + ISTATE(4)=NF1 + ELSE IF(NENTRY.EQ.4) THEN + ISTATE(4)=NF2 + ENDIF + ISTATE(7)=NDEL + ISTATE(9)=LEAK + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + HSIGN='L_MACROLIB' + CALL LCMPTC(IPMAC,'SIGNATURE',12,HSIGN) + IF(IMPX.GT.0)CALL LCMLIB(IPMAC) +*---- +* RECOVER H-FACTOR AND SAVE ON L_MATEX +*---- + ALLOCATE(HFAC(NMIX*NGRP)) + JPMAC=LCMGID(IPMAC,'GROUP') + DO JGR=1,NGRP + KPMAC=LCMGIL(JPMAC,JGR) + CALL LCMLEN(KPMAC,'H-FACTOR',LENGT,ITYP) + IF(LENGT.NE.NMIX)CALL XABORT('@MACINI: UNABLE TO FIND H' + 1 //'-FACTOR BLOCK DATA IN THE NEW MACROLIB.') + CALL LCMGET(KPMAC,'H-FACTOR',HFAC((JGR-1)*NMIX+1)) + ENDDO + CALL LCMPUT(IPMTX,'H-FACTOR',NMIX*NGRP,2,HFAC) + DEALLOCATE(HFAC) + RETURN + END diff --git a/Donjon/src/MACSCA.f b/Donjon/src/MACSCA.f new file mode 100644 index 0000000..619ad45 --- /dev/null +++ b/Donjon/src/MACSCA.f @@ -0,0 +1,169 @@ +*DECK MACSCA + SUBROUTINE MACSCA(KPOLD,KPNEW,SCAT,SCAT2,CM,JGR,IL,MIX,NMXNEW, + 1 NTOT,NMXOLD,NL,NGRP,LMAP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover scattering matrices and store them in a new macrolib for +* a given anistropic level and energy group. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, E. Varin, D. Sekki +* +*Parameters: input +* KPOLD pointer to group directory in the initial macrolib. +* NL number of legendre orders (=1 for isotropic scattering). +* NGRP number of energy groups. +* NMXOLD number of material mixtures in the initial macrolib. +* NMXNEW number of material mixtures in the final macrolib. +* MIX index of all (material and virtual) mixtures per region. +* NTOT total number of all (material and virtual) mixtures. +* SCAT scattering matrices in the initial macrolib. +* SCAT2 scattering matrices in the final macrolib. +* IL anisotropic level to be treated. +* JGR energy group to be treated. +* CM anisotropic level in I2.2 format. +* LMAP flag for the initial macrolib: +* =.true. if the fuel map macrolib. +* +*Parameters: output +* KPNEW pointer to group directory in the final macrolib. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) KPOLD,KPNEW + REAL SCAT(NMXOLD,NL,NGRP,NGRP),SCAT2(NMXNEW,NL,NGRP,NGRP) + INTEGER MIX(NTOT) + CHARACTER CM*2 + LOGICAL LMAP +*---- +* LOCAL VARIABLES +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IPOS,IPOS2 + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: IJJ,IJJ2,NJJ,NJJ2 + REAL, ALLOCATABLE, DIMENSION(:) :: WORK,WORK2 + CHARACTER HSMG*131 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IPOS(NMXOLD),IPOS2(NMXNEW),IJJ(NMXOLD,NL,NGRP), + 1 IJJ2(NMXNEW,NL,NGRP),NJJ(NMXOLD,NL,NGRP),NJJ2(NMXNEW,NL,NGRP)) + ALLOCATE(WORK(NMXOLD*NGRP),WORK2(NMXNEW*NGRP)) + WORK(:NMXOLD*NGRP)=0.0 + WORK2(:NMXNEW*NGRP)=0.0 +*---- +* RECOVER EXISTING DATA +*---- + CALL LCMLEN(KPNEW,'NJJS'//CM,ILENG,ITYP) + IF(LMAP.AND.(ILENG.GT.0))THEN + IF(ILENG.NE.NMXNEW)CALL XABORT('@MACSCA: INVALID MACROLIB(1).') + CALL LCMGET(KPNEW,'SCAT'//CM,WORK2(1)) + CALL LCMGET(KPNEW,'NJJS'//CM,NJJ2(1,IL,JGR)) + CALL LCMGET(KPNEW,'IJJS'//CM,IJJ2(1,IL,JGR)) + CALL LCMGET(KPNEW,'IPOS'//CM,IPOS2(1)) + DO 15 IBM=1,NMXNEW + IJJ0=IJJ2(IBM,IL,JGR) + IPOSDE=IPOS2(IBM) + DO 10 IGR=IJJ0,IJJ0-NJJ2(IBM,IL,JGR)+1,-1 + SCAT2(IBM,IL,IGR,JGR)=WORK2(IPOSDE) + IPOSDE=IPOSDE+1 + 10 CONTINUE + 15 CONTINUE + ENDIF +*---- +* RECOVER SCAT,IJJ,NJJ,IPOS +*---- + CALL LCMLEN(KPOLD,'NJJS'//CM,ILENG,ITYP) + IF(ILENG.EQ.0)CALL XABORT('@MACSCA: INVALID MACROLIB(2).') + CALL LCMGET(KPOLD,'SCAT'//CM,WORK(1)) + CALL LCMGET(KPOLD,'NJJS'//CM,NJJ(1,IL,JGR)) + CALL LCMGET(KPOLD,'IJJS'//CM,IJJ(1,IL,JGR)) + CALL LCMGET(KPOLD,'IPOS'//CM,IPOS(1)) + DO 25 IBM=1,NMXOLD + IJJ0=IJJ(IBM,IL,JGR) + IPOSDE=IPOS(IBM) + DO 20 IGR=IJJ0,IJJ0-NJJ(IBM,IL,JGR)+1,-1 + SCAT(IBM,IL,IGR,JGR)=WORK(IPOSDE) + IPOSDE=IPOSDE+1 + 20 CONTINUE + 25 CONTINUE +*---- +* NEW SCAT2 +*---- + ITOT=0 + DO 50 IBM=1,NTOT + IF(MIX(IBM).EQ.0)GOTO 50 + ITOT=ITOT+1 + IF(LMAP)THEN +* ONLY FUEL DATA WILL BE COPIED + IF(MIX(IBM).GT.0)GOTO 50 + J=-MIX(IBM) + IF(J.GT.NMXOLD) THEN + WRITE(HSMG,'(25HMACSCA: A MIXTURE INDEX (,I6,12H) IS GREATER, + > 36H THAN THE TOTAL NUMBER OF MIXTURES (,I6,14H) IN 2ND RHS M, + > 8HACROLIB.)') J,NMXOLD + CALL XABORT(HSMG) + ENDIF + ELSE +* FUEL DATA WILL NOT BE COPIED + IF(MIX(IBM).LT.0)GOTO 50 + J=MIX(IBM) + IF(J.GT.NMXOLD) THEN + WRITE(HSMG,'(25HMACSCA: A MIXTURE INDEX (,I6,12H) IS GREATER, + > 36H THAN THE TOTAL NUMBER OF MIXTURES (,I6,14H) IN 1ST RHS M, + > 8HACROLIB.)') J,NMXOLD + CALL XABORT(HSMG) + ENDIF + ENDIF +* COPY DATA + IJJ0=IJJ(J,IL,JGR) + DO 40 IGR=IJJ0,IJJ0-NJJ(J,IL,JGR)+1,-1 + SCAT2(ITOT,IL,IGR,JGR)=SCAT(J,IL,IGR,JGR) + 40 CONTINUE + 50 CONTINUE +*---- +* NEW IJJ2 AND NJJ2 +*---- + DO 70 IBM=1,NMXNEW + IGMIN=JGR + IGMAX=JGR + DO 60 IGR=NGRP,1,-1 + IF(SCAT2(IBM,IL,IGR,JGR).NE.0.)THEN + IGMIN=MIN(IGMIN,IGR) + IGMAX=MAX(IGMAX,IGR) + ENDIF + 60 CONTINUE + IJJ2(IBM,IL,JGR)=IGMAX + NJJ2(IBM,IL,JGR)=IGMAX-IGMIN+1 + 70 CONTINUE +*---- +* STORE SCAT2,IJJ2,NJJ2,IPOS2 +*---- + IPOSDE=0 + DO 85 IBM=1,NMXNEW + IPOS2(IBM)=IPOSDE+1 + DO 80 IGR=IJJ2(IBM,IL,JGR),IJJ2(IBM,IL,JGR)- + 1 NJJ2(IBM,IL,JGR)+1,-1 + IPOSDE=IPOSDE+1 + WORK2(IPOSDE)=SCAT2(IBM,IL,IGR,JGR) + 80 CONTINUE + 85 CONTINUE + CALL LCMPUT(KPNEW,'SCAT'//CM,IPOSDE,2,WORK2) + CALL LCMPUT(KPNEW,'IPOS'//CM,NMXNEW,1,IPOS2) + CALL LCMPUT(KPNEW,'NJJS'//CM,NMXNEW,1,NJJ2(1,IL,JGR)) + CALL LCMPUT(KPNEW,'IJJS'//CM,NMXNEW,1,IJJ2(1,IL,JGR)) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WORK2,WORK) + DEALLOCATE(NJJ2,NJJ,IJJ2,IJJ,IPOS2,IPOS) + RETURN + END diff --git a/Donjon/src/MCC.f b/Donjon/src/MCC.f new file mode 100644 index 0000000..61ae08c --- /dev/null +++ b/Donjon/src/MCC.f @@ -0,0 +1,273 @@ +*DECK MCC + SUBROUTINE MCC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Fuel map modification module. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal. +* +*Author(s): +* M. Cordiez +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The MCC: module specifications are: +* [FLMAP1] := MCC: FLMAP1 [FLMAP2] :: (descmcc1) ; +* where +* FLMAP1 : name of the \emph{MAP} object that will contain the updated +* fuel-lattice information. If FLMAP1 appears on both LHS and RHS, it will +* be updated; if it only appears on RHS, it will only be read to display +* its contents. +* FLMAP2 : name of the \emph{MAP} object that contains information to be +* recovered to update FLMAP1. If FLMAP2 exists, data to update FLMAP1 will +* be taken in it. If not, data to update FLMAP1 will be taken in FLMAP1. +* (descmcc1) : structure describing the main input data to the MCC: module. +* Note that this input data is mandatory and must be specified either if +* FLMAP1 is updated or only read. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + INTEGER ISTATE(NSTATE),NPARAM + INTEGER PTYPETCOOL,PTYPEDCOOL,VALSIZE + REAL TSAT + CHARACTER HSIGN*12,TEXT*40,REC1*40,REC2*40,PNAME*12 + DOUBLE PRECISION DFLOT + LOGICAL :: EXISTENCE=.FALSE.,EXISTENCE2=.FALSE. + LOGICAL :: PRESTCOOL=.FALSE.,PRESDCOOL=.FALSE. + TYPE(C_PTR) IPMAP,JPMAP,KPMAP,IPMAP2 + REAL, ALLOCATABLE, DIMENSION(:) :: VALTCOOL,VALDCOOL +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LT.1)CALL XABORT('@MCC: MINIMUM OF 1 OBJECT EXPECTED.') + IPMAP=KENTRY(1) + IF(NENTRY.EQ.2) IPMAP2=KENTRY(2) + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@MCC:' + > //' LCM OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.1)CALL XABORT('@MCC: FLMAP1 MUST BE IN' + > //' MODIFICATION MODE AND NOT IN CREATION MODE.') + CALL LCMGTC(IPMAP,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP')THEN + TEXT=HENTRY(2) + CALL XABORT('@MCC: SIGNATURE OF '//TEXT//' IS '//HSIGN// + > '. L_MAP EXPECTED.') + ENDIF + IF(NENTRY.EQ.2) THEN + IPMAP2=KENTRY(2) + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@MCC:' + > //' LCM OBJECT EXPECTED FOR FLMAP2.') + IF(JENTRY(2).NE.2)CALL XABORT('@MCC: FLMAP2 MUST BE IN READ-' + > //'ONLY MODE AND NOT IN CREATION MODE.') + CALL LCMGTC(IPMAP,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP')THEN + TEXT=HENTRY(2) + CALL XABORT('@MCC: SIGNATURE OF '//TEXT//' IS '//HSIGN// + > '. L_MAP EXPECTED.') + ENDIF + ENDIF +*---- +* RECOVER L_MAP STATE-VECTOR +*---- + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NPARAM=ISTATE(8) + IMPX=1 +*---- +* READ INPUT DATA +*---- + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@MCC: CHARACTER DATA EXPECTED.') +* Read printing index + IF(TEXT.EQ.'EDIT') THEN + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@MCC: INTEGER FOR EDIT EXPECTED.') +* Name of the record that is to be modified + ELSE IF(TEXT.EQ.'REC') THEN + CALL REDGET(ITYP,NITMA,FLOT,REC1,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@MCC: STRING PARAMETER EXPECTED ' + > //'FOR THE NAME OF THE RECORD THAT IS ' + > //'TO BE MODIFIED.') +* Checking of the record existence + JPMAP=LCMGID(IPMAP,'PARAM') + EXISTENCE=.FALSE. + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.REC1) THEN + EXISTENCE=.TRUE. + EXIT + ENDIF + ENDDO + IF(.NOT.EXISTENCE) CALL XABORT('@MCC: LOCAL PARAMETER: ' + > //REC1//' DOES NOT EXIST IN THE FUEL MAP.') +* + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) +********* +* Case of a uniform edition +********* + IF(TEXT.EQ.'UNI') THEN + CALL REDGET(ITYP,NITMA,VAL1,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@MCC: REAL VALUE EXPECTED FOR ' + > //'value1.') +* Fuel map modification: every value set to VAL1 + CALL MCCMOD(IMPX,IPMAP,NPARAM,NCH,NB,REC1,VAL1,0) + ELSEIF(TEXT.EQ.'ADD') THEN + CALL REDGET(ITYP,NITMA,VAL2,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@MCC: REAL VALUE EXPECTED FOR ' + > //'value2.') +* Fuel map modification: every value incremented of VAL2 + CALL MCCMOD(IMPX,IPMAP,NPARAM,NCH,NB,REC1,VAL2,1) +********* +* Case of a copy from a different directory or fuel map +********* +* Same fuel map + ELSEIF(TEXT.EQ.'SAME') THEN + CALL REDGET(ITYP,NITMA,FLOT,REC2,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@MCC: STRING PARAMETER EXPECTED ' + > //'FOR THE NAME OF THE RECORD rec2 ') + IF((REC1.EQ.REC2).AND.(IMPX.GT.0)) WRITE(6,'(A)') 'WARNING: ' + > //'rec1 AND rec2 ARE IDENTICAL! THIS CALL IS USELESS.' +* Checking of the record existence + JPMAP=LCMGID(IPMAP,'PARAM') + EXISTENCE2=.FALSE. + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.REC2) THEN + EXISTENCE2=.TRUE. + EXIT + ENDIF + ENDDO + IF(.NOT.EXISTENCE) CALL XABORT('@MCC: LOCAL PARAMETER: ' + > //REC1//' DOES NOT EXIST IN THE FUEL MAP.') + CALL MCCCPY(IMPX,IPMAP,IPMAP,NPARAM,NCH,NB,REC1,REC2) +* +* Different fuel map + ELSEIF(TEXT.EQ.'READ') THEN + CALL REDGET(ITYP,NITMA,FLOT,REC2,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@MCC: STRING PARAMETER EXPECTED ' + > //'FOR THE NAME OF THE RECORD rec2 ') +* Checking of the record existence + JPMAP=LCMGID(IPMAP2,'PARAM') + EXISTENCE2=.FALSE. + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.REC2) THEN + EXISTENCE2=.TRUE. + EXIT + ENDIF + ENDDO + IF(.NOT.EXISTENCE) CALL XABORT('@MCC: LOCAL PARAMETER: ' + > //REC1//' DOES NOT EXIST IN THE FUEL MAP.') + CALL MCCCPY(IMPX,IPMAP,IPMAP2,NPARAM,NCH,NB,REC1,REC2) + ELSE + CALL XABORT('@MCC: WRONG KEYWORD.') + ENDIF +********* +* Calculation of D-COOL from T-COOL +********* + ELSE IF(TEXT.EQ.'TTD') THEN + CALL REDGET(ITYP,NITMA,PINLET,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@MCC: REAL PARAMETER EXPECTED ' + > //'FOR THE CORE PRESSURE.') +* Checking of the existence of the T-COOL and D-COOL directories +* Recovery of T-COOL data + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.'T-COOL') THEN + PRESTCOOL=.TRUE. + CALL LCMGET(KPMAP,'P-TYPE',PTYPETCOOL) + IF(PTYPETCOOL.EQ.1) THEN + VALSIZE=1 + ALLOCATE(VALTCOOL(VALSIZE)) + CALL LCMGET(KPMAP,'P-VALUE',VALTCOOL) + ELSE + VALSIZE=NCH*NB + ALLOCATE(VALTCOOL(VALSIZE)) + CALL LCMGET(KPMAP,'P-VALUE',VALTCOOL) + ENDIF + ENDIF + IF(PNAME.EQ.'D-COOL') THEN + PRESDCOOL=.TRUE. + CALL LCMGET(KPMAP,'P-TYPE',PTYPEDCOOL) + IF(PTYPEDCOOL.EQ.1) THEN + VALSIZE=1 + ALLOCATE(VALDCOOL(VALSIZE)) + ELSE + VALSIZE=NCH*NB + ALLOCATE(VALDCOOL(VALSIZE)) + ENDIF + ENDIF + ENDDO + IF(.NOT.PRESTCOOL) CALL XABORT('@MCC: LOCAL PARAMETER:' + > //' T-COOL DOES NOT EXIST IN THE FUEL MAP AND' + > //' IS REQUIRED TO COMPUTE D-COOL.') + IF(.NOT.PRESDCOOL) CALL XABORT('@MCC: LOCAL PARAMETER:' + > //' D-COOL DOES NOT EXIST IN THE FUEL MAP.') + IF(PTYPETCOOL.NE.PTYPEDCOOL) CALL XABORT('@MCC: T-COOL AND' + > //' D-COOL HAVE DIFFERENT TYPES (ONE IS GLOBAL' + > //' AND THE OTHER IS LOCAL...).') +* Definition of the pressure table size (the same as T-COOL table) + DO IVAL=1,VALSIZE,1 + CALL THMSAT(PINLET,TSAT) + IF(VALTCOOL(IVAL).GT.TSAT) CALL XABORT('@MCC: WATER TEMPERA' + > //'TURE IS GREATER THAN SATURATION TEMPERATURE (COO' + > //'LANT IS BOILING).') + IF(VALTCOOL(IVAL).LT.273) CALL XABORT('@MCC: WATER TEMPERA' + > //'TURE IS LOWER THAN 273K (FROZEN) IN SOME REGIONS.') + CALL THMPT(PINLET,VALTCOOL(IVAL),VALDCOOL(IVAL),R1,R2,R3,R4) + VALDCOOL(IVAL)=VALDCOOL(IVAL)/1000 + ENDDO +* Replacement of the old D-COOL values by the new ones + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.'D-COOL') THEN + CALL LCMPUT(KPMAP,'P-VALUE',VALSIZE,2,VALDCOOL) + EXIT + ENDIF + ENDDO + IF(IMPX.GE.1) WRITE(6,'(1X,A/)') 'PARAMETER D-COOL HAS BEEN CO' + > //'MPUTED FROM T-COOL USING THE WATER TABLES.' +* + ELSE IF(TEXT.EQ.';') THEN + GO TO 20 + ELSE + CALL XABORT('@MCC: INVALID KEYWORD: '//TEXT//'.') + ENDIF + GO TO 10 +* + 20 RETURN + END diff --git a/Donjon/src/MCCCPY.f b/Donjon/src/MCCCPY.f new file mode 100644 index 0000000..92d7119 --- /dev/null +++ b/Donjon/src/MCCCPY.f @@ -0,0 +1,141 @@ +*DECK MCCCPY + SUBROUTINE MCCCPY(IMPX,IPMAP,IPMAP2,NPARAM,NCH,NB,REC1,REC2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modification of the data stored in the PARAM folder of a fuel map +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* M. Cordiez +* +*Parameters: input +* IMPX printing index (=0 for no print). +* IPMAP pointer of the fuel map 1 +* IPMAP2 pointer of the fuel map 2 +* NPARAM number of parameters in the PARAM folder +* NCH number of fuel channels +* NB number of fuel bundles per channel +* REC1 record to be updated +* REC2 record to be copied +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IMPX,NPARAM,NCH,NB + CHARACTER REC1*40,REC2*40 + TYPE(C_PTR) IPMAP,IPMAP2 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + INTEGER ISTATE2(NSTATE) + INTEGER VALSIZE,PTYPE + INTEGER PTYPE2,NPARAM2,NCH2,NB2,VALSIZE2 + CHARACTER PNAME*12,PNAME2*12 + REAL, ALLOCATABLE, DIMENSION(:) :: VALMOD,VALCOP + TYPE(C_PTR) JPMAP,KPMAP,JPMAP2,KPMAP2 +*---- +* RECOVER L_MAP 2 STATE-VECTOR +*---- + CALL LCMGET(IPMAP2,'STATE-VECTOR',ISTATE2) + NB2=ISTATE2(1) + NCH2=ISTATE2(2) + NPARAM2=ISTATE2(8) + IF(NB.NE.NB2) CALL XABORT('@MCCCCPY: THE NUMBER OF FUEL' + > //' BUNDLES PER CHANNEL IS DIFFERENT BETWEEN' + > //' FLMAP1 AND FLMAP2.') + IF(NCH.NE.NCH2) CALL XABORT('@MCCCCPY: THE NUMBER OF FUEL' + > //' CHANNELS IS DIFFERENT BETWEEN' + > //' FLMAP1 AND FLMAP2.') +*---- +* RECOVERY OF L_MAP PARAMETERS +*---- +* L_MAP1 (to be updated) + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + CALL LCMGET(KPMAP,'P-TYPE',PTYPE) + IF(PNAME.EQ.REC1) THEN + IF(IMPX.GE.3) CALL LCMLIB(KPMAP) + EXIT + ENDIF + ENDDO +* L_MAP2 (to be copied) + JPMAP2=LCMGID(IPMAP2,'PARAM') + DO IPAR=1,NPARAM2,1 + KPMAP2=LCMGIL(JPMAP2,IPAR) + CALL LCMGTC(KPMAP2,'P-NAME',12,PNAME2) + CALL LCMGET(KPMAP2,'P-TYPE',PTYPE2) + IF(PNAME2.EQ.REC2) THEN + IF(IMPX.GE.3) CALL LCMLIB(KPMAP2) + EXIT + ENDIF + ENDDO +* +* Checking of the type (local or global) of REC1 + IF(PTYPE.EQ.1) THEN + IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME,' IS GLOBAL' + VALSIZE=1 + ALLOCATE(VALMOD(VALSIZE)) + ELSE IF(PTYPE.EQ.2) THEN + IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME,' IS LOCAL' + VALSIZE=NCH*NB + ALLOCATE(VALMOD(VALSIZE)) + ELSE + CALL XABORT('@MCCCPY: '//PNAME//'IS NEITHER LOCAL NOR GLOBAL' + > //'AND THAT IS IMPOSSIBLE.') + ENDIF +* Checking of the type (local or global) of REC2 + IF((PTYPE2.NE.1).AND.(PTYPE2.NE.2)) THEN + CALL XABORT('@MCCCPY: '//PNAME2//'IS NEITHER LOCAL NOR GLOBAL' + > //'AND THAT IS IMPOSSIBLE.') + ENDIF + IF(PTYPE2.EQ.1) THEN + IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME2,' IS GLOBAL' + VALSIZE2=1 + ALLOCATE(VALCOP(VALSIZE2)) + CALL LCMGET(KPMAP2,'P-VALUE',VALCOP) + ELSE + IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME2,' IS LOCAL' + VALSIZE2=NCH2*NB2 + ALLOCATE(VALCOP(VALSIZE2)) + CALL LCMGET(KPMAP2,'P-VALUE',VALCOP) + ENDIF + IF(PTYPE.EQ.1.AND.PTYPE2.EQ.2) CALL XABORT('@MCCCPY: '//PNAME + > //'IS GLOBAL ON THE CORE AND '//PNAME2//'IS LOCAL.') + IF(PTYPE.EQ.2.AND.PTYPE2.EQ.1) CALL XABORT('@MCCCPY: '//PNAME + > //'IS LOCAL ON THE CORE AND '//PNAME2//'IS GLOBAL.') +* +* Modification of REC1 + + VALMOD(:)=VALCOP(:) + + CALL LCMPUT(KPMAP,'P-VALUE',VALSIZE,2,VALMOD) + + IF(IMPX.GT.0.AND.C_ASSOCIATED(IPMAP,IPMAP2)) THEN + WRITE(6,220) 'EVERY VALUE OF THE RECORD ',REC1,' HAS BEEN ' + > //'UPDATED WITH THE ONES FROM ',REC2,' (SAME ' + > //'FUEL MAP).' + ELSEIF(IMPX.GT.0.AND.C_ASSOCIATED(IPMAP,IPMAP2)) THEN + WRITE(6,220) 'EVERY VALUE OF THE RECORD ',REC1,' HAS BEEN ' + > //'UPDATED WITH THE ONES FROM ',REC2,' (FUEL ' + > //'MAP FLMAP2).' + ENDIF + +* Array deallocation + DEALLOCATE(VALMOD) + DEALLOCATE(VALCOP) + + RETURN + + 210 FORMAT(1X,A,A6,A/) + 220 FORMAT(1X,A,A6,A,A6,A/) + END diff --git a/Donjon/src/MCCMOD.f b/Donjon/src/MCCMOD.f new file mode 100644 index 0000000..c61c85b --- /dev/null +++ b/Donjon/src/MCCMOD.f @@ -0,0 +1,96 @@ +*DECK MCCMOD + SUBROUTINE MCCMOD(IMPX,IPMAP,NPARAM,NCH,NB,REC1,VAL,MODTYPE) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modification of the data stored in the PARAM folder of a fuel map +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* M. Cordiez +* +*Parameters: input +* IMPX printing index (=0 for no print). +* IPMAP pointer of the fuel map +* NPARAM number of parameters in the PARAM folder +* NCH number of fuel channels +* NB number of fuel bundles per channel +* REC1 record to be updated +* VAL uniform value (real) that is to be set to REC1 +* MODTYPE type of modification (0: new uniform value, 2: value added) +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IMPX,NPARAM,NCH,NB,MODTYPE + REAL VAL + CHARACTER REC1*40 + TYPE(C_PTR) IPMAP +*---- +* LOCAL VARIABLES +*---- + INTEGER VALSIZE,PTYPE + CHARACTER PNAME*12 + REAL, ALLOCATABLE, DIMENSION(:) :: VALMOD + TYPE(C_PTR) JPMAP,KPMAP +*---- +* RECOVERY OF L_MAP PARAMETERS +*---- + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + CALL LCMGET(KPMAP,'P-TYPE',PTYPE) + IF(PNAME.EQ.REC1) THEN + IF(IMPX.GE.3) CALL LCMLIB(KPMAP) + EXIT + ENDIF + ENDDO + +* Checking of the type (local or global) of REC1 + IF((PTYPE.NE.1).AND.(PTYPE.NE.2)) THEN + CALL XABORT('@MCCMOD: '//PNAME//'IS NEITHER LOCAL NOR GLOBAL' + > //'AND THAT IS IMPOSSIBLE.') + ENDIF + IF(PTYPE.EQ.1) THEN + IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME,' IS GLOBAL' + VALSIZE=1 + ALLOCATE(VALMOD(VALSIZE)) + ELSE + IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME,' IS LOCAL' + VALSIZE=NCH*NB + ALLOCATE(VALMOD(VALSIZE)) + ENDIF + +* Modification of REC1 + IF(MODTYPE.EQ.0) THEN + VALMOD=VAL + ELSE IF(MODTYPE.EQ.1) THEN + CALL LCMGET(KPMAP,'P-VALUE',VALMOD) + VALMOD=VALMOD+VAL + ENDIF + + CALL LCMPUT(KPMAP,'P-VALUE',VALSIZE,2,VALMOD) + + IF((MODTYPE.EQ.0).AND.(IMPX.GT.0)) THEN + WRITE(6,220) 'EVERY VALUE OF THE RECORD ',REC1,' HAS BEEN ' + > //'SET TO ',VAL,'.' + ELSE IF((MODTYPE.EQ.1).AND.(IMPX.GT.0)) THEN + WRITE(6,220) 'EVERY VALUE OF THE RECORD ',REC1,' HAS BEEN ' + > //'INCREASED OF ',VAL,'.' + ENDIF + +* Array deallocation + DEALLOCATE(VALMOD) + + RETURN + + 210 FORMAT(1X,A,A6,A/) + 220 FORMAT(1X,A,A6,A,F7.2,A/) + END diff --git a/Donjon/src/MCR.f b/Donjon/src/MCR.f new file mode 100644 index 0000000..52ec6c1 --- /dev/null +++ b/Donjon/src/MCR.f @@ -0,0 +1,564 @@ +*DECK MCR + SUBROUTINE MCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and interpolate Microlib or Macrolib information from one or +* many MPO database files. +* +*Copyright +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file; +* IENTRY=6 for HDF5 file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The MCR: calling specifications are: +* MLIB := MCR: [ { MLIB | MLIB2 } ] MPONAM1 [[ MPONAM2 ]] [ MAPFL ] +* :: (mcr\_data) ; \\ +* where +* MLIB : name of a \emph{microlib} (type L\_LIBRARY) or \emph{macrolib} +* (type L\_MACROLIB) containing the interpolated data. If this object also +* appears on the RHS of structure (MCR:, it is open in modification mode +* and updated. +* MLIB2 : name of an optional \emph{microlib} object whose content is copied +* on MLIB. +* MPONAM1 : name of the \emph{MPO file} data structure. +* MPONAM2 : name of an additional \emph{MPO file} data structure. This +* object is optional. +* MAPFL : name of the \emph{map} object containing fuel regions description, +* global parameter information (burnup, fuel/coolant temperatures, coolant +* density, etc). Keyword TABLE is expected in (mcr\_data). +* mcr\_data : input data structure containing interpolation information. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXR=12 + INTEGER, PARAMETER::NSTATE=40 + REAL B2, FLOTT + INTEGER ITYLCM, MAXISO, MAXNIS, NBISO, MY1, MY2, NB, NCAL, NCH, + > NCOMB, NDEPL, NDFI, NDFP, NFUEL, NGRP, NHEAVY, IBM, NISOS, NITMA, + > NLIGHT, NMIL, NMIX, NOTHER, NPARM, NPAR, NLOC, NREAC, NSTABL, + > NSURFD, NVTOT, NREA, NPRC, ADDRZI, ISO,ISOM,NISOM, IMPX, ILONG, + > IMPY, INDIC, ITER, ITEXT4, I, IACCS, ITH, J, NBESP, NALBP, ILUPS + CHARACTER TEXT4*4,TEXT12*12,HSMG*131,HSIGN*12,HEQUI*80,HMASL*80, + > NMDEPL(MAXR)*8,HEDIT*12,RECNAM*80 + LOGICAL LADFM,LMACRO,LCUBIC,LRES,LPURE + DOUBLE PRECISION DFLOTT + INTEGER ISTATE(NSTATE) + TYPE(C_PTR) IPMAP,IPMPO,IPLIB,IPLIB2 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXC,NISO,LISO,IADRY,ITNAM, + 1 ITZEA,MATNO,KPAX,INAM,IZAE,HREAC,IDR,KPAR,ITODO,ISOTOPE,DIMS_MPO, + 2 ADDRISO + REAL, ALLOCATABLE, DIMENSION(:) :: CONC,BPAX,RER,RRD,BPAR,YIELD + REAL, ALLOCATABLE, DIMENSION(:,:) :: TERP + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VTOT + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: DECAY + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: YLDS + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: NOMIS + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:,:) :: HISO + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: TEXT24 +* + SAVE NMDEPL + DATA NMDEPL/'DECAY ','NFTOT ','NG ','N2N ', + > 'N3N ','N4N ','NA ','NP ', + > 'N2A ','NNP ','ND ','NT '/ +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LE.1) CALL XABORT('MCR: MINIMUM OF 2 OBJECTS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('MCR: MACRO' + 1 //'LIB LCM OBJECT EXPECTED AT LHS.') + IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('MCR: MACRO' + 1 //'LIB IN CREATE OR MODIFICATION MODE EXPECTED.') + IACCS=JENTRY(1) + IPLIB=KENTRY(1) + IPLIB2=C_NULL_PTR + IPMAP=C_NULL_PTR + NGRP=0 + NMIX=0 + IF(IACCS.EQ.1) THEN + CALL LCMGTC(IPLIB,'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(3) + NMIX=ISTATE(1) + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ELSE + TEXT12=HENTRY(1) + CALL XABORT('MCR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_LIBRARY OR L_MACROLIB EXPECTED.') + ENDIF + ENDIF + DO 10 I=2,NENTRY + IF((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2).AND.(IENTRY(I).NE.6)) + 1 THEN + CALL XABORT('MCR: LCM OR HDF5 OBJECTS EXPECTED AT RHS.') + ENDIF + IF(JENTRY(I).NE.2) CALL XABORT('MCR:OBJECTS IN READ-ONLY MODE ' + 1 //'EXPECTED AT RHS.') + IF((IENTRY(I).EQ.1).OR.(IENTRY(I).EQ.2)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + IF(C_ASSOCIATED(IPLIB2)) CALL XABORT('MCR: ONLY ONE MICROL' + 1 //'IB EXPECTED AT RHS.') + IPLIB2=KENTRY(I) + GO TO 10 + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL XABORT('MCR: ANOTHER MACROLIB NOT EXPECTED AT RHS.') + ELSE IF(HSIGN.EQ.'L_MAP') THEN + IF(I.NE.NENTRY)CALL XABORT('MCR: FUEL-MAP EXPECTED TO BE T' + 1 //'HE LAST OBJECT.') + IF(NENTRY.LT.3)CALL XABORT('MCR: MISSING MPO FILE.') + IPMAP=KENTRY(NENTRY) + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NMIX=ISTATE(9) + ENDIF + ENDIF + 10 CONTINUE +*---- +* READ THE INPUT DATA +*---- + NVTOT=0 + LMACRO=.TRUE. + LCUBIC=.FALSE. + LRES=.FALSE. + LPURE=.FALSE. + B2=0.0 + ITER=-1 + IPMPO=C_NULL_PTR + HEQUI=' ' + HMASL=' ' + ILUPS=0 + LADFM=.TRUE. + IMPX=1 + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(1).') + 30 IF(TEXT12.EQ.'EDIT') THEN +* READ THE PRINT INDEX. + CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('MCR: INTEGER DATA EXPECTED(1).') + ELSE IF(TEXT12.EQ.'NMIX') THEN +* READ THE MAXIMUM NUMBER OF MATERIAL MIXTURES. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('MCR: INTEGER DATA EXPECTED(2).') + IF(NITMA.LT.NMIX) THEN + WRITE(HSMG,'(20HMCR: NMIX MUST BE >=,I8)') NMIX + CALL XABORT(HSMG) + ENDIF + NMIX=NITMA + ELSE IF(TEXT12.EQ.'MACRO') THEN + LMACRO=.TRUE. + ELSE IF(TEXT12.EQ.'MICRO') THEN + LMACRO=.FALSE. + ELSE IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + ELSE IF(TEXT12.EQ.'RES') THEN + IF((IACCS.EQ.0).AND.(.NOT.C_ASSOCIATED(IPLIB2))) THEN + CALL XABORT('MCR: RHS MICROLIB EXPECTED WITH RES OPTION.') + ENDIF + LRES=.TRUE. + ELSE IF(TEXT12.EQ.'PURE') THEN + LPURE=.TRUE. + ELSE IF(TEXT12.EQ.'UPS') THEN + ILUPS=1 + ELSE IF(TEXT12.EQ.'MDF') THEN + LADFM=.FALSE. + ELSE IF(TEXT12.EQ.'MPO') THEN + IF(NMIX.EQ.0) CALL XABORT('MCR: ZERO NUMBER OF MIXTURES.') + IF(C_ASSOCIATED(IPMAP)) THEN + WRITE(IOUT,'(/43H MCR: ***WARNING*** A FUEL MAP IS SET AT RH, + 1 26HS; KEYWORD TABLE EXPECTED.)') + ENDIF + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(2).') + CALL REDGET(INDIC,NITMA,FLOTT,HEDIT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(3).') + IF(HEDIT.EQ.'default') HEDIT='output_0' + ITH=0 + DO 50 I=2,NENTRY + IF(C_ASSOCIATED(KENTRY(I),IPLIB2)) GO TO 50 + IF(TEXT12.EQ.HENTRY(I)) THEN + IPMPO=KENTRY(I) + ITH=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('MCR: MPO '//TEXT12//' NOT FOUND.') + 60 WRITE(IOUT,320) HENTRY(ITH) + CALL MPOTOC(IPMPO,HEDIT,IMPX,NREA,NBISO,NMIL,NPAR,NLOC,MY1,MY2, + 1 NISOS,NCAL,NGRP,NSURFD,NALBP,NPRC) + ALLOCATE(MIXC(NMIX),NISO(NMIX),LISO(NMIX),HISO(NMIX,NBISO), + 1 ITODO(NMIX*NBISO)) + ALLOCATE(TERP(NCAL,NMIX),CONC(NMIX*NBISO)) +* + CALL MCRDRV(IPMPO,LCUBIC,NMIX,IMPX,NMIL,NCAL,NBISO,NPAR,HEDIT, + 1 ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC,ITODO) + GO TO 130 + ELSE IF(TEXT12.EQ.'TABLE') THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('MCR: MISSING FUEL-MA' + 1 //'P OBJECT.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + NGRP=ISTATE(4) + NFUEL=ISTATE(7) + NPARM=ISTATE(8) + IF(NCOMB.EQ.0) CALL XABORT('MCR: NUMBER OF COMBUSTION ZONES NO' + 1 //'T YET DEFINED IN THE FUEL MAP NCOMB=0.') + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(4).') + CALL REDGET(INDIC,NITMA,FLOTT,HEDIT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(5).') + IF(HEDIT.EQ.'default') HEDIT='output_0' + ITH=0 + DO 80 I=2,NENTRY + IF((C_ASSOCIATED(KENTRY(I),IPLIB2)).OR. + 1 (C_ASSOCIATED(KENTRY(I),IPMAP))) GO TO 80 + IF(TEXT12.EQ.HENTRY(I)) THEN + IPMPO=KENTRY(I) + ITH=I + GO TO 90 + ENDIF + 80 CONTINUE + CALL XABORT('MCR: MPO FILE '//TEXT12//' NOT FOUND.') + 90 WRITE(IOUT,320) HENTRY(ITH) + CALL MPOTOC(IPMPO,HEDIT,IMPX,NREA,NBISO,NMIL,NPAR,NLOC,MY1,MY2, + 1 NISOS,NCAL,NGRP,NSURFD,NALBP,NPRC) + IF(NPAR.EQ.0) CALL XABORT('MCR: NO PARAMETERS IN MPO FILE(2).') + ALLOCATE(MIXC(NMIX),NISO(NMIX),LISO(NMIX),HISO(NMIX,NBISO), + 1 ITODO(NMIX*NBISO)) + ALLOCATE(TERP(NCAL,NMIX),CONC(NMIX*NBISO)) +* + CALL MCRRGR(IPMPO,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,NBISO,NCH,NB, + 1 NFUEL,NPARM,NPAR,HEDIT,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO, + 2 CONC,ITODO) + GO TO 130 + ELSE IF(TEXT12.EQ.'EQUI') THEN + CALL REDGET(INDIC,NITMA,FLOTT,HEQUI,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(6).') + ELSE IF(TEXT12.EQ.'MASL') THEN + CALL REDGET(INDIC,NITMA,FLOTT,HMASL,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCR: CHARACTER DATA EXPECTED(7)') + ELSE IF(TEXT12.EQ.'LEAK') THEN + CALL REDGET(INDIC,NITMA,B2,TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('MCR: REAL DATA EXPECTED.') + ELSE IF(TEXT12.EQ.'CHAIN') THEN + IF(LMACRO) CALL XABORT('MCR: MICRO KEYWORD EXPECTED.') + CALL MPOTOC(IPMPO,HEDIT,0,NREA,NBISO,NMIL,NPAR,NLOC,MY1,MY2, + 1 NISOS,NCAL,NGRP,NSURFD,NALBP,NPRC) + IF(NBISO.EQ.0) CALL XABORT('MCR: NO PARTICULARIZED ISOTOPES.') + CALL LCMLEN(IPLIB,'VTOT_',ILONG,ITYLCM) + IF(ILONG.NE.NVTOT) CALL XABORT('MCR: INVALID LENGTH: VTOT(1).') + CALL LCMLEN(IPLIB,'YLDS_',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2*NVTOT) CALL XABORT('MCR: INVALID LENGTH: Y' + 1 //'LDS(1).') + CALL LCMLEN(IPLIB,'DECAYC_',ILONG,ITYLCM) + IF(ILONG.NE.NBISO*NVTOT) CALL XABORT('MCR: INVALID LENGTH: DEC' + 1 //'AYC(1)') + ALLOCATE(VTOT(NVTOT),YLDS(MY1,MY2,NVTOT),DECAY(NBISO,NVTOT), + 1 NOMIS(NBISO)) + CALL LCMGET(IPLIB,'VTOT_',VTOT) + CALL LCMGET(IPLIB,'YLDS_',YLDS) + CALL LCMGET(IPLIB,'DECAYC_',DECAY) + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ISOTOPE",ISOTOPE) + CALL hdf5_read_data(IPMPO,"contents/isotopes/ISOTOPENAME", + 1 TEXT24) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRISO",ADDRISO) + DO I=1,NBISO + NOMIS(I)=TEXT24(ISOTOPE(I)+1)(:8) + ENDDO + DEALLOCATE(TEXT24) + ALLOCATE(IADRY(NBISO)) + IADRY(:NBISO)=0 + DO IBM=1,NMIL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + 1 TRIM(HEDIT),0,IBM-1 + IF(hdf5_group_exists(IPMPO,TRIM(RECNAM)//"yields")) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZI",ADDRZI) + NISOM=ADDRISO(ADDRZI+2)-ADDRISO(ADDRZI+1) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/ADDRY", + 1 DIMS_MPO) + DO ISOM=1,NISOM + ISO=ADDRISO(ADDRZI+1)+ISOM + IADRY(ISO)=DIMS_MPO(ISOM) + ENDDO + DEALLOCATE(DIMS_MPO) + ENDIF + ENDDO + DEALLOCATE(ADDRISO) +* + NBESP=1 + ALLOCATE(ITNAM(3*NBISO),ITZEA(NBISO),MATNO(NBISO), + 1 KPAX((NBISO+MAXR)*NBISO),BPAX((NBISO+MAXR)*NBISO*NBESP)) + TEXT4=' ' + READ(TEXT4,'(A4)') ITEXT4 + ITNAM(:3*NBISO)=ITEXT4 + ITZEA(:NBISO)=0 + MATNO(:NBISO)=0 + KPAX(:(NBISO+MAXR)*NBISO)=0 + BPAX(:(NBISO+MAXR)*NBISO*NBESP)=0.0 + CALL SCREIR(NMDEPL,MY1,MY2,1,NBISO,NOMIS,IADRY,NVTOT,VTOT,YLDS, + 1 DECAY,ITNAM,ITZEA,KPAX,BPAX) + DEALLOCATE(IADRY,NOMIS,DECAY,YLDS,VTOT) + CALL LIBWET(MAXR,NBISO,NBESP,NSTATE,NMDEPL,ITNAM,ISTATE,MATNO, + 1 KPAX,BPAX) + NDEPL=ISTATE(1) + NDFI=ISTATE(2) + NDFP=ISTATE(3) + NHEAVY=ISTATE(4) + NLIGHT=ISTATE(5) + NOTHER=ISTATE(6) + NSTABL=ISTATE(7) + NREAC=ISTATE(8) + NPAR=ISTATE(9) + NBESP=MAX(1,ISTATE(10)) +*---- +* ALLOCATE DECAY CHAIN +*---- + NDEPL=MAX(NDEPL,1) + NDFI=MAX(NDFI,1) + NDFP=MAX(NDFP,1) + ALLOCATE(INAM(3*NDEPL),IZAE(NDEPL),IDR(NREAC*NDEPL), + 1 RER(NREAC*NDEPL),RRD(NDEPL),KPAR(NPAR*NDEPL),BPAR(NPAR*NDEPL), + 2 YIELD(NDFI*NDFP*NBESP)) +*---- +* SET DECAY CHAIN +*---- + CALL LIBWED(MAXR,NBISO,NBESP,NDEPL,NDFI,NDFP,NHEAVY,NLIGHT, + > NOTHER,NREAC,NPAR,ITNAM,ITZEA,MATNO,KPAX,BPAX, + > INAM,IZAE,IDR,RER,RRD,KPAR,BPAR,YIELD) +*---- +* RELEASE WORK VECTORS FOR WIMS-AECL, WIMS-NEA, DRAGLIB +* AND INPUT FILE +*---- + DEALLOCATE(BPAX,KPAX,MATNO,ITZEA,ITNAM) +*---- +* SELECT USED DEPLETION REACTION NAMES +*---- + ALLOCATE(HREAC(2*NREAC)) + DO 100 I=1,NREAC + READ(NMDEPL(I),'(2A4)') (HREAC(2*(I-1)+J),J=1,2) + 100 CONTINUE +*---- +* PRINT DECAY CHAIN IF REQUIRED +*---- + IMPY=IMPX+2 + CALL LIBEPR(IMPY,NDEPL,NBESP,NSTABL,NDFI,NDFP,NREAC,NPAR, + > INAM,HREAC,IDR,RER,RRD,KPAR,BPAR,YIELD,IZAE) +*---- +* SAVE CHAIN +*---- + CALL LCMSIX(IPLIB,'DEPL-CHAIN',1) + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + NDEPL=ISTATE(1) + CALL LCMPUT(IPLIB,'ISOTOPESDEPL',3*NDEPL,3,INAM) + CALL LCMPUT(IPLIB,'CHARGEWEIGHT',NDEPL,1,IZAE) + CALL LCMPUT(IPLIB,'DEPLETE-IDEN',2*NREAC,3,HREAC) + CALL LCMPUT(IPLIB,'DEPLETE-REAC',NREAC*NDEPL,1,IDR) + CALL LCMPUT(IPLIB,'DEPLETE-ENER',NREAC*NDEPL,2,RER) + CALL LCMPUT(IPLIB,'DEPLETE-DECA',NDEPL,2,RRD) + CALL LCMPUT(IPLIB,'PRODUCE-REAC',NPAR*NDEPL,1,KPAR) + CALL LCMPUT(IPLIB,'PRODUCE-RATE',NPAR*NDEPL,2,BPAR) + IF(NDFP.GT.0) CALL LCMPUT(IPLIB,'FISSIONYIELD',NDFI*NDFP*NBESP, + > 2,YIELD) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(11)=NDEPL + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* DEALLOCATE DECAY CHAIN ARRAYS +*---- + DEALLOCATE(YIELD,BPAR,KPAR,RRD,RER,IDR,IZAE,INAM) + ELSE IF(TEXT12.EQ.';') THEN + GO TO 200 + ELSE + CALL XABORT('MCR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* PERFORM MULTIPARAMETER INTERPOLATION +*---- + 130 CALL MPOTOC(IPMPO,HEDIT,0,NREA,NBISO,NMIL,NPAR,NLOC,MY1,MY2, + 1 NISOS,NCAL,NGRP,NSURFD,NALBP,NPRC) +*---- +* BUILD THE INTERPOLATED MACROLIB +*---- + IF(LMACRO.AND.(MAXNIS.EQ.0)) THEN +* build a macrolib + CALL MCRMAC(IPLIB,IPMPO,IACCS,NMIL,NMIX,NGRP,LADFM,IMPX,HEQUI, + 1 HMASL,NCAL,HEDIT,NSURFD,NALBP,ILUPS,MIXC,TERP,LPURE,B2) + ELSE +* build a microlib + IF(LMACRO)THEN + CALL LCMOP(IPLIB,'*TEMPORARY*',0,1,0) + IACCS=0 + ENDIF + IF(IACCS.EQ.0)THEN + MAXISO=NBISO*NMIX + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXISO=MAX(NBISO*NMIX,ISTATE(2)) + ENDIF + NVTOT=NVTOT+1 + ALLOCATE(VTOT(NVTOT),YLDS(MY1,MY2,NVTOT),DECAY(NBISO,NVTOT)) + IF(NVTOT.GT.1) THEN + CALL LCMLEN(IPLIB,'VTOT_',ILONG,ITYLCM) + IF(ILONG.NE.NVTOT-1) CALL XABORT('MCR: INVALID LENGTH: VTOT(' + 1 //'2).') + CALL LCMLEN(IPLIB,'YLDS_',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2*(NVTOT-1)) CALL XABORT('MCR: INVALID LEN' + 1 //'GTH: YLDS(2).') + CALL LCMGET(IPLIB,'VTOT_',VTOT) + IF(MY1*MY2.GT.0) CALL LCMGET(IPLIB,'YLDS_',YLDS) + IF(NBISO.GT.0) CALL LCMGET(IPLIB,'DECAYC_',DECAY) + ENDIF + CALL MCRLIB(MAXNIS,MAXISO,IPLIB,IPMPO,IACCS,NMIX,NGRP,LADFM, + 1 IMPX,HEQUI,HMASL,NCAL,HEDIT,ITER,MY1,MY2,NBISO,TERP,NISO,LISO, + 2 HISO,CONC,ITODO,MIXC,LRES,LPURE,ILUPS,B2,VTOT(NVTOT), + 3 YLDS(1,1,NVTOT),DECAY(1,NVTOT)) + CALL LCMPUT(IPLIB,'VTOT_',NVTOT,4,VTOT) + IF(MY1*MY2.GT.0) THEN + CALL LCMPUT(IPLIB,'YLDS_',MY1*MY2*NVTOT,4,YLDS) + ENDIF + IF(NBISO.GT.0) CALL LCMPUT(IPLIB,'DECAYC_',NBISO*NVTOT,4,DECAY) + DEALLOCATE(VTOT,DECAY,YLDS) + IF(LMACRO) THEN + CALL LCMVAL(IPLIB,' ') + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMEQU(IPLIB,KENTRY(1)) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMCL(IPLIB,2) + ENDIF + ENDIF + DEALLOCATE(LISO,NISO,HISO,ITODO,CONC,TERP,MIXC) +*---- +* PRINT THE STATE VECTOR +*---- + IF(IMPX.GT.0) THEN + IF(LMACRO) THEN + CALL LCMGET(KENTRY(1),'STATE-VECTOR',ISTATE) + WRITE(IOUT,290) IMPX,(ISTATE(I),I=1,7),ISTATE(9),ISTATE(12) + IF(IMPX.GT.3) CALL LCMLIB(KENTRY(1)) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,300) IMPX,(ISTATE(I),I=1,12) + WRITE(IOUT,310) (ISTATE(I),I=13,15),(ISTATE(I),I=17,24) + IF(IMPX.GT.3) CALL LCMLIB(IPLIB) + ENDIF + IF(.NOT.LADFM) WRITE(IOUT,'(31H FORCE USE OF MATRIX DISCONTINU, + 1 12HITY FACTORS.)') + ENDIF +*---- +* CONTINUE DATA PROCESSING +*---- + IF(ITER.EQ.0) THEN + GO TO 200 + ELSE IF(ITER.EQ.1) THEN + TEXT12='MPO' + GO TO 30 + ELSE IF(ITER.EQ.2) THEN + TEXT12='TABLE' + GO TO 30 + ELSE IF(ITER.EQ.3) THEN + TEXT12='CHAIN' + GO TO 30 + ENDIF +*---- +* LEAVE MCR: +*---- + 200 RETURN +* + 290 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NGROUP,I6,28H (NUMBER OF ENERGY GROUPS)/ + 3 7H NBMIX ,I6,39H (NUMBER OF MIXTURES IN THE MACROLIB)/ + 4 7H NANISO,I6,34H (MAXIMUM SCATTERING ANISOTROPY)/ + 5 7H NIFISS,I6,45H (MAXIMUM NUMBER OF FISSILE ISOTOPES IN A M, + 6 7HIXTURE)/ + 7 7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 8 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 9 43H=RECOVER FROM LIBRARY/4=LEAKAGE CORRECTION)/ + 1 7H NLG ,I6,39H (NUMBER OF DELAYED PRECURSOR GROUPS)/ + 2 7H ILEAK ,I6,40H (1=DIFF AVAILABLE; 2=DIFFX AVAILABLE)/ + 3 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 4 32H GAP INFO/4=MATRIX ADF GAP INFO)) + 300 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H MAXMIX,I6,31H (MAXIMUM NUMBER OF MIXTURES)/ + 3 7H NBISO ,I6,36H (NUMBER OF ISOTOPES OR MATERIALS)/ + 4 7H NGRP ,I6,28H (NUMBER OF ENERGY GROUPS)/ + 5 7H NL ,I6,30H (NUMBER OF LEGENDRE ORDERS)/ + 6 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 7 57H=RECOVER FROM LIBRARY/3=WIMS-D TYPE/4=LEAKAGE CORRECTION)/ + 8 7H IPROB ,I6,23H (0=DIRECT/1=ADJOINT)/ + 9 7H ITIME ,I6,28H (1=STEADY-STATE/2=PROMPT)/ + 1 7H NLIB ,I6,32H (NUMBER OF SETS OF LIBRARIES)/ + 2 7H NGF ,I6,48H (NUMBER OF FAST GROUP WITHOUT SELF-SHIELDING)/ + 3 7H IGRMAX,I6,41H (LAST GROUP INDEX WITH SELF-SHIELDING)/ + 4 7H NDEPL ,I6,33H (NUMBER OF DEPLETING ISOTOPES)/ + 5 7H NCOMB ,I6,33H (NUMBER OF DEPLETING MIXTURES)) + 310 FORMAT(7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 1 7H NBMIX ,I6,23H (NUMBER OF MIXTURES)/ + 2 7H NRES ,I6,40H (NUMBER OF SETS OF RESONANT MIXTURES)/ + 3 7H IPROC ,I6,48H (-1=SKIP LIBRARY PROCESSING/0=DILUTION INTERP, + 4 48HOLATION/1=USE PHYSICAL TABLES/2=BUILD A DRAGLIB/, + 5 55H3=COMPUTE CALENDF TABLES/4=COMPUTE SLOWING-DOWN TABLES)/ + 6 7H IMAC ,I6,45H (0=DO NOT/1=DO BUILD AN EMBEDDED MACROLIB)/ + 7 7H NDEL ,I6,31H (NUMBER OF PRECURSOR GROUPS)/ + 8 7H NFISS ,I6,31H (NUMBER OF FISSILE ISOTOPES)/ + 9 7H ISOADD,I6,37H (0=COMPLETE BURNUP CHAIN/1=DO NOT)/ + 1 7H MAXISM,I6,40H (MAX. NUMBER OF ISOTOPES PER MIXTURE)/ + 2 7H IPRECI,I6,34H (CALENDF ACCURACY FLAG:1/2/3/4)/ + 3 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 4 32H GAP INFO/4=MATRIX ADF GAP INFO)) + 320 FORMAT(/30H MCR: INTERPOLATING MPO FILE ',A12,2H'.) + END diff --git a/Donjon/src/MCRAGF.f b/Donjon/src/MCRAGF.f new file mode 100644 index 0000000..3c780f6 --- /dev/null +++ b/Donjon/src/MCRAGF.f @@ -0,0 +1,504 @@ +*DECK MCRAGF + SUBROUTINE MCRAGF(IPMAC,IPMPO,IACCS,NMIL,NMIX,NGRP,NALBP,LALBG, + 1 LADFM,IMPX,NCAL,TERP,MIXC,NSURFD,HEDIT,VOSAP,VOLMI2,IDF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the macrolib by scanning the NCAL elementary calculations and +* weighting them with TERP factors. ADF and physical albedos part. +* +*Copyright: +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAC address of the output macrolib LCM object. +* IPMPO address of 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. +* NALBP number of physical albedos per energy group. +* LALBG type of physical albedos (.true.: diagonal; .false.: GxG). +* LADFM type of discontinuity factors (.true.: diagonal; .false.: GxG). +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the MPO file. +* TERP interpolation factors. +* MIXC mixture index in the MPO file corresponding to each macrolib +* mixture. Equal to zero if a macrolib mixture is not updated. +* NSURFD number of discontinuity factors. +* HEDIT name of output group for a (multigroup mesh, output geometry) +* couple (generally equal to 'output_0'). +* VOSAP zone volumes in the MPO file. +* VOLMI2 mixture volumes in the macrolib. +* +*Parameters: output +* IDF type of discontinuity factors (DF) in the macrolib (=0: not +* used; =3: DF used; =4 matrix DF used). +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC,IPMPO + INTEGER IACCS,NMIL,NMIX,NGRP,NALBP,IMPX,NCAL,MIXC(NMIX),NSURFD,IDF + REAL TERP(NCAL,NMIX),VOSAP(NMIL),VOLMI2(NMIX) + LOGICAL LALBG,LADFM + CHARACTER(LEN=12) HEDIT +*---- +* LOCAL VARIABLES +*---- + REAL WEIGHT,FACTOR + CHARACTER RECNAM*80,HSMG*131 + INTEGER IKEFF,IKINF,I,IBM,IBMOLD,ICAL,IGR,JGR,ILONG,ITYLCM,IAL, + 1 RANK,NBYTE,TYPE,TYPE2,TYPE4,DIMSR(5),NSURFD_OLD,NITMA + LOGICAL LNEW + DOUBLE PRECISION DGAR1,DGAR2 +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,ZKINF,ZKEFF,VREAL + REAL, ALLOCATABLE, DIMENSION(:,:) :: GAR6,ALBP,AVGFL2,DISFAC,VFLUX + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ADF2,ALBP2,ALBP_ERM,SFLUX + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ADF2M,ALBP2_E + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(GAR4(NGRP*NGRP),GAR6(NGRP,2),ALBP2(NMIX,NALBP,NGRP), + 1 ALBP2_E(NMIX,NALBP,NGRP,NGRP),ZKINF(NMIX),ZKEFF(NMIX), + 2 HADF(NSURFD),ADF2(NMIX,NGRP,NSURFD),ADF2M(NMIX,NGRP,NGRP,NSURFD), + 3 AVGFL2(NMIX,NGRP)) +*---- +* MICROLIB INITIALIZATION +*---- + IKINF=0 + IKEFF=0 + IDF=0 + LNEW=.TRUE. + IF(NSURFD.GT.0) THEN + WRITE(RECNAM,'(8H/output/,A,32H/statept_0/zone_0/discontinuity/) + & ') TRIM(HEDIT) + LNEW=hdf5_group_exists(IPMPO,TRIM(RECNAM)) + IF(LNEW) THEN +* new specification + 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 + ELSE IF(TYPE4.NE.99) THEN + IDF=4 ! matrix discontinuity factor information + ELSE + CALL hdf5_list(IPMPO,TRIM(RECNAM)) + CALL XABORT('MCRAGF: UNABLE TO SET TYPE OF DF.') + ENDIF + ELSE +* old specification + IDF=3 ! discontinuity factor information + ENDIF + ADF2(:NMIX,:NGRP,:NSURFD)=0.0 + ADF2M(:NMIX,:NGRP,:NGRP,:NSURFD)=0.0 + ENDIF + AVGFL2(:NMIX,:NGRP)=0.0 + IF(NALBP.NE.0) ALBP2(:NMIX,:NALBP,:NGRP)=0.0 + ZKINF(:NMIX)=0.0 + ZKEFF(:NMIX)=0.0 + NSURFD_OLD=NSURFD + IF(IACCS.NE.0) THEN + ! Recover ADF, GFF and physical albedos previously computed + CALL LCMLEN(IPMAC,'VOLUME',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('MCRAGF: NO VOLUMES IN MACROLIB.') + CALL LCMGET(IPMAC,'VOLUME',VOLMI2) + IF(NALBP.GT.0) THEN + CALL LCMLEN(IPMAC,'ALBEDO',ILONG,ITYLCM) + IF(ILONG.EQ.NALBP*NGRP) THEN +* diagonal albedo matrix + ALLOCATE(ALBP(NALBP,NGRP)) + CALL LCMGET(IPMAC,'ALBEDO',ALBP) + DO IBM=1,NMIX ! mixtures in Macrolib + ALBP2(IBM,:NALBP,:NGRP)=ALBP(:NALBP,:NGRP) + ENDDO + DEALLOCATE(ALBP) + ELSE IF(ILONG.EQ.NALBP*NGRP*NGRP) THEN +* GxG albedo matrix + ALLOCATE(ALBP_ERM(NALBP,NGRP,NGRP)) + CALL LCMGET(IPMAC,'ALBEDO',ALBP_ERM) + DO IBM=1,NMIX ! mixtures in Macrolib + ALBP2_E(IBM,:NALBP,:NGRP,:NGRP)= + & ALBP_ERM(:NALBP,:NGRP,:NGRP) + ENDDO + DEALLOCATE(ALBP_ERM) + ENDIF + ENDIF + IF(NSURFD_OLD.GT.0) THEN + CALL LCMLEN(IPMAC,'ADF',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPMAC) + CALL XABORT('MCRAGF: UNABLE TO FIND DIRECTORY ADF.') + ENDIF + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGET(IPMAC,'NTYPE',NSURFD) + IF(NSURFD.GT.NSURFD_OLD) THEN + DEALLOCATE(ADF2M,ADF2,HADF) + ALLOCATE(HADF(NSURFD),ADF2(NMIX,NGRP,NSURFD), + & ADF2M(NMIX,NGRP,NGRP,NSURFD)) + ADF2(:NMIX,:NGRP,:NSURFD)=0.0 + ADF2M(:NMIX,:NGRP,:NGRP,:NSURFD)=0.0 + ENDIF + CALL LCMGTC(IPMAC,'HADF',8,NSURFD,HADF) + DO I=1,NSURFD + CALL LCMLEN(IPMAC,HADF(I),ILONG,ITYLCM) + IF(ILONG.EQ.NMIX*NGRP) THEN + CALL LCMGET(IPMAC,HADF(I),ADF2(1,1,I)) + ELSE IF(ILONG.EQ.NMIX*NGRP*NGRP) THEN + CALL LCMGET(IPMAC,HADF(I),ADF2M(1,1,1,I)) + ENDIF + ENDDO + CALL LCMGET(IPMAC,'AVG_FLUX',AVGFL2) + CALL LCMSIX(IPMAC,' ',2) + ENDIF + DO IBM=1,NMIX + IF(MIXC(IBM).NE.0) THEN + IF(NALBP.NE.0) THEN + IF(LALBG) THEN + ALBP2(IBM,:NALBP,:NGRP)=0.0 + ELSE + ALBP2_E(IBM,:NALBP,:NGRP,:NGRP)=0.0 + ENDIF + ENDIF + IF((NSURFD.GT.0).AND.(IDF.EQ.3)) THEN + ADF2(IBM,:NGRP,:NSURFD)=0.0 + ELSE IF((NSURFD.GT.0).AND.(IDF.EQ.4)) THEN + ADF2M(IBM,:NGRP,:NGRP,:NSURFD)=0.0 + ENDIF + AVGFL2(IBM,:NGRP)=0.0 + ZKINF(IBM)=0.0 + ZKEFF(IBM)=0.0 + ENDIF + ENDDO + ENDIF +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + DO 40 ICAL=1,NCAL + IF(NSURFD_OLD.GT.0) THEN + IF(LNEW) THEN + ALLOCATE(SFLUX(NMIL,NGRP**2,NSURFD_OLD),VFLUX(NMIL,NGRP)) + DO IBMOLD=1,NMIL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/) + & ') TRIM(HEDIT),ICAL-1,IBMOLD-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEFLUX",VREAL) + VFLUX(IBMOLD,:NGRP)=VREAL(:NGRP)/VOSAP(IBMOLD) + DEALLOCATE(VREAL) + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0, + & 15H/discontinuity/)') TRIM(HEDIT),ICAL-1,IBMOLD-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"NSURF",NITMA) + IF(NITMA.NE.NSURFD_OLD) THEN + WRITE(HSMG,'(32HMCRAGF: THE NUMBER OF SURFACES (,I5, + & 12H) IN MIXTURE,I5,31H IS DIFFERENT FROM THE NUMBER (,I5, + & 15H) IN MIXTURE 1.)') NITMA,IBMOLD,NSURFD_OLD + CALL XABORT(HSMG) + ENDIF + IF(IDF.EQ.3) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"DFACTOR",DISFAC) + DO I=1,NSURFD_OLD + SFLUX(IBMOLD,:NGRP,I)=DISFAC(I,:NGRP) + ENDDO + DEALLOCATE(DISFAC) + ELSE IF(IDF.EQ.4) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"DFACTORGxG", + & DISFAC) + DO I=1,NSURFD_OLD + SFLUX(IBMOLD,:NGRP**2,I)=DISFAC(I,:NGRP**2) + ENDDO + DEALLOCATE(DISFAC) + ENDIF + ENDDO + ELSE + ALLOCATE(SFLUX(NMIL,NGRP,NSURFD_OLD),VFLUX(NMIL,NGRP)) + CALL SPHMOL(IPMPO,ICAL,NMIL,NGRP,NSURFD_OLD,HEDIT,VOSAP, + & SFLUX,VFLUX) + ENDIF + DO IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) + IF(IBMOLD.GT.NMIL) CALL XABORT('MCRAGF: NMIL OVERFLOW.') + IF(IBMOLD.EQ.0) CYCLE + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) CYCLE + IF(IDF.EQ.3) THEN + DO I=1,NSURFD_OLD + WRITE(HADF(I),'(3HFD_,I5.5)') I + ADF2(IBM,:NGRP,I)=ADF2(IBM,:NGRP,I)+WEIGHT* + & SFLUX(IBMOLD,:NGRP,I)*VFLUX(IBMOLD,:NGRP) + ENDDO + ELSE IF(IDF.EQ.4) THEN + DO I=1,NSURFD_OLD + WRITE(HADF(I),'(3HFD_,I5.5)') I + DO JGR=1,NGRP + DO IGR=1,NGRP + ADF2M(IBM,IGR,JGR,I)=ADF2M(IBM,IGR,JGR,I)+WEIGHT* + & SFLUX(IBMOLD,(JGR-1)*NGRP+IGR,I)*VFLUX(IBMOLD,IGR) + ENDDO + ENDDO + ENDDO + ENDIF + AVGFL2(IBM,:NGRP)=AVGFL2(IBM,:NGRP)+WEIGHT*VFLUX(IBMOLD,:NGRP) + ENDDO + DEALLOCATE(VFLUX,SFLUX) + ENDIF +*---- +* PROCESS PHYSICAL ALBEDO INFORMATION +*---- + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/flux/)') + & TRIM(HEDIT),ICAL-1 + IF((NALBP.GT.0).AND.LALBG) THEN +* diagonal albedo matrix + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ALBEDO",ALBP) + DO 20 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 20 + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 20 + DO IGR=1,NGRP + DO IAL=1,NALBP + FACTOR=(1.0-ALBP(IAL,IGR))/(1.0+ALBP(IAL,IGR)) + ALBP2(IBM,IAL,IGR)=ALBP2(IBM,IAL,IGR)+WEIGHT*FACTOR + ENDDO + ENDDO + 20 CONTINUE + DEALLOCATE(ALBP) + ELSE IF(NALBP.GT.0) THEN +* GxG albedo matrix + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ALBEDOGxG",ALBP_ERM) + DO 25 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 25 + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 25 + DO IGR=1,NGRP + DO JGR=1,NGRP + DO IAL=1,NALBP + FACTOR=(1.0-ALBP_ERM(IAL,IGR,JGR))/(1.0+ + 1 ALBP_ERM(IAL,IGR,JGR)) + ALBP2_E(IBM,IAL,IGR,JGR)=ALBP2_E(IBM,IAL,IGR,JGR)+WEIGHT* + 1 FACTOR + ENDDO + ENDDO + ENDDO + 25 CONTINUE + DEALLOCATE(ALBP_ERM) + ENDIF +*---- +* PROCESS KINF AND KEFF +*---- + DO 30 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 30 + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 30 + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,8H/addons/)') + & TRIM(HEDIT),ICAL-1 + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"KINF",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + IKINF=1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"KINF",FACTOR) + ZKINF(IBM)=ZKINF(IBM)+WEIGHT*FACTOR + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"KEFF",RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + IKEFF=1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"KEFF",FACTOR) + ZKEFF(IBM)=ZKEFF(IBM)+WEIGHT*FACTOR + ENDIF + 30 CONTINUE + 40 CONTINUE +*---- +* SAVE ADF INFORMATION +*---- + IF((NSURFD.GT.0).AND.(IDF.EQ.3)) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'NTYPE',1,1,NSURFD) + CALL LCMPTC(IPMAC,'HADF',8,NSURFD,HADF) + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + DO IGR=1,NGRP + ADF2(IBM,IGR,:NSURFD)=ADF2(IBM,IGR,:NSURFD)/AVGFL2(IBM,IGR) + ENDDO + IF(NSURFD.GT.NSURFD_OLD) THEN + IF(NSURFD_OLD.GT.2) CALL XABORT('MCRAGF: INVALID NSURFD.') +* assign the same ADF to all sides. + DO I=2,NSURFD + ADF2(IBM,:NGRP,I)=ADF2(IBM,:NGRP,1) + ENDDO + ENDIF + ENDDO + IF(LADFM) THEN + DO I=1,NSURFD + CALL LCMPUT(IPMAC,HADF(I),NMIX*NGRP,2,ADF2(1,1,I)) + ENDDO + ELSE +* write non-matrix DF into a matrix DF + DO I=1,NSURFD + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + ADF2M(IBM,:NGRP,:NGRP,I)=0.0 + IF(IDF.EQ.3) THEN + DO IGR=1,NGRP + ADF2M(IBM,IGR,IGR,I)=ADF2(IBM,IGR,I) + ENDDO + ELSE IF(IDF.EQ.4) THEN + DO IGR=1,NGRP + ADF2M(IBM,IGR,IGR,I)=ADF2(IBM,IGR,I) + ENDDO + ENDIF + ENDDO + CALL LCMPUT(IPMAC,HADF(I),NMIX*NGRP*NGRP,2,ADF2M(1,1,1,I)) + ENDDO + IDF=4 + ENDIF + CALL LCMPUT(IPMAC,'AVG_FLUX',NMIX*NGRP,2,AVGFL2) + CALL LCMSIX(IPMAC,' ',2) + IF(IMPX.GT.1) THEN + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + WRITE(6,'(/40H MCRAGF: DISCONTINUITY FACTORS - MIXTURE,I5)') + 1 IBM + DO I=1,NSURFD + WRITE(6,'(1X,A,1H:,1P,(5X,10E12.4))') TRIM(HADF(I)), + 1 (ADF2(IBM,IGR,I)/AVGFL2(IBM,IGR),IGR=1,NGRP) + ENDDO + ENDDO + ENDIF + ELSE IF((NSURFD.GT.0).AND.(IDF.EQ.4)) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'NTYPE',1,1,NSURFD) + CALL LCMPTC(IPMAC,'HADF',8,NSURFD,HADF) + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + DO JGR=1,NGRP + DO IGR=1,NGRP + ADF2M(IBM,IGR,JGR,:NSURFD)=ADF2M(IBM,IGR,JGR,:NSURFD)/ + 1 AVGFL2(IBM,IGR) + ENDDO + ENDDO + IF(NSURFD.GT.NSURFD_OLD) THEN + IF(NSURFD_OLD.GT.2) CALL XABORT('MCRAGF: INVALID NSURFD.') +* assign the same matrix ADF to all sides. + DO I=2,NSURFD + ADF2M(IBM,:NGRP,:NGRP,I)=ADF2M(IBM,:NGRP,:NGRP,1) + ENDDO + ENDIF + ENDDO + DO I=1,NSURFD + CALL LCMPUT(IPMAC,HADF(I),NMIX*NGRP*NGRP,2,ADF2M(1,1,1,I)) + ENDDO + CALL LCMPUT(IPMAC,'AVG_FLUX',NMIX*NGRP,2,AVGFL2) + CALL LCMSIX(IPMAC,' ',2) + IF(IMPX.GT.1) THEN + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + WRITE(6,'(/44H MCRAGF: MATRIX DISCONTINUITY FACTORS - MIXT, + 1 3HURE,I5)') IBM + DO I=1,NSURFD + WRITE(6,'(1X,A,1H:,1P,(5X,10E12.4))') TRIM(HADF(I)), + 1 ((ADF2M(IBM,IGR,JGR,I),IGR=1,NGRP),JGR=1,NGRP) + ENDDO + ENDDO + ENDIF + ENDIF +*---- +* AVERAGE PHYSICAL ALBEDO INFORMATION +*---- + IF((NALBP.GT.0).AND.LALBG) THEN +* diagonal albedo matrix + ALLOCATE(ALBP(NALBP,NGRP)) + DO IGR=1,NGRP + DO IAL=1,NALBP + DGAR1=0.0D0 + DGAR2=0.0D0 + DO IBM=1,NMIX + IF(VOLMI2(IBM).EQ.0.0) CYCLE + DGAR1=DGAR1+ALBP2(IBM,IAL,IGR)*VOLMI2(IBM) + DGAR2=DGAR2+VOLMI2(IBM) + ENDDO + ALBP(IAL,IGR)=REAL((1.D0-DGAR1/DGAR2)/(1.D0+DGAR1/DGAR2)) + ENDDO + ENDDO + IF(LADFM) THEN + CALL LCMPUT(IPMAC,'ALBEDO',NALBP*NGRP,2,ALBP) + ELSE +* write non-matrix albedo into a matrix albedo + ALLOCATE(ALBP_ERM(NALBP,NGRP,NGRP)) + ALBP_ERM(:NALBP,:NGRP,:NGRP)=0.0 + DO IGR=1,NGRP + DO IAL=1,NALBP + ALBP_ERM(IAL,IGR,IGR)=ALBP(IAL,IGR) + ENDDO + ENDDO + CALL LCMPUT(IPMAC,'ALBEDO',NALBP*NGRP*NGRP,2,ALBP_ERM) + DEALLOCATE(ALBP_ERM) + ENDIF + DEALLOCATE(ALBP) + ELSE IF(NALBP.GT.0) THEN +* GxG albedo matrix + ALLOCATE(ALBP_ERM(NALBP,NGRP,NGRP)) + DO IGR=1,NGRP + DO JGR=1,NGRP + DO IAL=1,NALBP + DGAR1=0.0D0 + DGAR2=0.0D0 + DO IBM=1,NMIX + IF(VOLMI2(IBM).EQ.0.0) CYCLE + DGAR1=DGAR1+ALBP2_E(IBM,IAL,IGR,JGR)*VOLMI2(IBM) + DGAR2=DGAR2+VOLMI2(IBM) + ENDDO + ALBP_ERM(IAL,IGR,JGR)=REAL((1.D0-DGAR1/DGAR2)/(1.D0+ + 1 DGAR1/DGAR2)) + ENDDO + ENDDO + ENDDO + CALL LCMPUT(IPMAC,'ALBEDO',NALBP*NGRP*NGRP,2,ALBP_ERM) + DEALLOCATE(ALBP_ERM) + ENDIF +*---- +* AVERAGE KINF +*---- + IF(IKINF.EQ.1) THEN + DGAR1=0.0D0 + DGAR2=0.0D0 + DO IBM=1,NMIX + DGAR1=DGAR1+ZKINF(IBM)*VOLMI2(IBM) + DGAR2=DGAR2+VOLMI2(IBM) + ENDDO + FACTOR=REAL(DGAR1/DGAR2) + CALL LCMPUT(IPMAC,'K-INFINITY',1,2,FACTOR) + ENDIF +*---- +* AVERAGE KEFF +*---- + IF(IKEFF.EQ.1) THEN + DGAR1=0.0D0 + DGAR2=0.0D0 + DO IBM=1,NMIX + DGAR1=DGAR1+ZKEFF(IBM)*VOLMI2(IBM) + DGAR2=DGAR2+VOLMI2(IBM) + ENDDO + FACTOR=REAL(DGAR1/DGAR2) + CALL LCMPUT(IPMAC,'K-EFFECTIVE',1,2,FACTOR) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(AVGFL2,ADF2M,ADF2,HADF,ZKEFF,ZKINF,ALBP2_E,ALBP2, + 1 GAR6,GAR4) + RETURN + END diff --git a/Donjon/src/MCRCAL.f90 b/Donjon/src/MCRCAL.f90 new file mode 100644 index 0000000..ca0eb30 --- /dev/null +++ b/Donjon/src/MCRCAL.f90 @@ -0,0 +1,45 @@ +INTEGER FUNCTION MCRCAL(NPAR,NCAL,MUPLET,MUBASE) RESULT(ICAL) +! +!----------------------------------------------------------------------- +! +!Purpose: +! find the position of an elementary calculation in a MPO file. +! +!Copyright: +! Copyright (C) 2022 Ecole Polytechnique de Montreal +! +!Author(s): A. Hebert +! +!Parameters: input +! NPAR number of parameters. +! NCAL number of elementary calculations in the PMAXS file. +! MUPLET tuple used to identify an elementary calculation. +! +!Parameters: output +! ICAL position of the elementary calculation (=0 if does not exist; +! =-1 if more than one exists). +! +!----------------------------------------------------------------------- +! + IMPLICIT NONE + !---- + ! FUNCTION ARGUMENTS + !---- + INTEGER NPAR,NCAL,MUPLET(NPAR),MUBASE(NPAR,NCAL) + !---- + ! LOCAL VARIABLES + !---- + INTEGER I,J,NFIND + ! + ICAL=0 + NFIND=0 + DO I=1,NCAL + DO J=1,NPAR + IF(MUPLET(J).NE.MUBASE(J,I)) GO TO 10 + ENDDO + ICAL=I + NFIND=NFIND+1 + 10 CONTINUE + ENDDO + IF(NFIND.GT.1) ICAL=-1 +END FUNCTION MCRCAL diff --git a/Donjon/src/MCRDRV.f b/Donjon/src/MCRDRV.f new file mode 100644 index 0000000..d9c4c55 --- /dev/null +++ b/Donjon/src/MCRDRV.f @@ -0,0 +1,433 @@ +*DECK MCRDRV + SUBROUTINE MCRDRV(IPMPO,LCUBIC,NMIX,IMPX,NMIL,NCAL,NBISO,NPAR, + 1 HEDIT,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC,ITODO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for MPO file interpolation. Use user-defined +* global parameters. +* +*Copyright: +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMPO address of the MPO file. +* LCUBIC =.TRUE.: cubic Ceschino interpolation; =.FALSE: linear +* Lagrange interpolation. +* NMIX maximum number of material mixtures in the microlib. +* 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 isotopes in the MPO file. +* 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 + INTEGER NMIX,IMPX,NMIL,NCAL,NBISO,NPAR,ITER,MAXNIS,MIXC(NMIX), + 1 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::MAXLIN=132 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + REAL, PARAMETER::REPS=1.0E-4 + INTEGER I, J, IBM, IBMOLD, ICAL, INDIC, IPAR, ITYPE, JBM, NITMA + REAL SUM, FLOTT + CHARACTER TEXT72*72,HSMG*131,TEXT132*132,VALH(MAXPAR)*12, + 1 RECNAM*80,HCUBIC*12 + INTEGER VALI(MAXPAR) + INTEGER RANK,TYPE,NBYTE,DIMSR(5) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2) + LOGICAL LCUB2(MAXPAR) +*---- +* ALLOCATABLE ARRAYS +*---- + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LDELTA + INTEGER, ALLOCATABLE, DIMENSION(:) :: MUPLET,MUTYPE,NVALUE,VINTE + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MUBASE + REAL, ALLOCATABLE, DIMENSION(:) :: VREAL + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: PARFMT + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: VCHAR + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: PARTYP,PARKEY + CHARACTER(LEN=132), ALLOCATABLE, DIMENSION(:) :: TEXT132V1 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(MUPLET(NPAR),MUTYPE(NPAR),LDELTA(NMIX),MUBASE(NPAR,NCAL)) +*---- +* 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('MCRDRV: MAXLIN OVERFLOW.') + IF(NPAR.GT.MAXPAR) CALL XABORT('MCRDRV: MAXPAR OVERFLOW.') + 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 MCRDRV: MUPLET DATABASE/12H CALCULATION,5X, + 1 10HMUPLET....)') + ENDIF + IF(NPAR.GT.0) THEN + DO ICAL=1,NCAL + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0)') TRIM(HEDIT), + 1 ICAL-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"/PARAMVALUEORD", + 1 VINTE) + IF(SIZE(VINTE).NE.NPAR) THEN + WRITE(HSMG,'(41HMCRDRV: INCONSISTENT PARAMVALUEORD LENGTH, + 1 2H (,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 + ENDIF +*---- +* 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 + NISO(:NMIX)=0 + LISO(:NMIX)=.TRUE. + LDELTA(:NMIX)=.FALSE. + ITODO(:NMIX,:NBISO)=0 + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + 20 IF(TEXT72.EQ.'MIX') THEN + MUPLET(:NPAR)=0 + MUTYPE(:NPAR)=0 + VALI(:NPAR)=0 + VALR(:NPAR,1)=0.0 + VALR(:NPAR,2)=0.0 + DO 30 I=1,NPAR + VALH(I)=' ' + 30 CONTINUE + LCUB2(:NPAR)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('MCRDRV: INTEGER DATA EXPECTED.') + IF(IBM.GT.NMIX) THEN + WRITE(HSMG,'(27HMCRDRV: NMIX OVERFLOW (IBM=,I8,6H NMIX=,I8, + 1 2H).)') IBM,NMIX + CALL XABORT(HSMG) + ENDIF + IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT72.EQ.'FROM') THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('MCRDRV: INTEGER DATA EXPECTED.') + IF(IBMOLD.GT.NMIL) CALL XABORT('MCRDRV: MPO MIX OVERFLOW' + 1 //'(1).') + MIXC(IBM)=IBMOLD + GO TO 10 + ELSE IF(TEXT72.EQ.'USE') THEN + IF(IBM.GT.NMIL) CALL XABORT('MCRDRV: MPO MIX OVERFLOW(2).') + MIXC(IBM)=IBM + GO TO 10 + ENDIF + MIXC(IBM)=IBMOLD + GO TO 20 + ELSE IF(TEXT72.EQ.'MICRO') THEN + IF(IBM.EQ.0) CALL XABORT('MCRDRV: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT72.EQ.'ALL') THEN + LISO(IBM)=.TRUE. + ELSE IF(TEXT72.EQ.'ONLY') THEN + LISO(IBM)=.FALSE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + 40 IF(TEXT72.EQ.'ENDMIX') THEN + GO TO 20 + ELSE IF(TEXT72.EQ.'NOEV') THEN + IF(NISO(IBM).EQ.0) CALL XABORT('MCRDRV: MISPLACED NOEV.') + ITODO(IBM,NISO(IBM))=1 + ELSE + NISO(IBM)=NISO(IBM)+1 + IF(NISO(IBM).GT.NBISO) CALL XABORT('MCRDRV: NBISO OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISO(IBM)) + HISO(IBM,NISO(IBM))=TEXT72(:8) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.EQ.2) THEN + CONC(IBM,NISO(IBM))=FLOTT + ELSE IF((INDIC.EQ.3).AND.(TEXT72.EQ.'*')) THEN + CONC(IBM,NISO(IBM))=-99.99 + ELSE + CALL XABORT('MCRDRV: INVALID HISO DATA.') + ENDIF + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + GO TO 40 + ELSE IF((TEXT72.EQ.'SET').OR.(TEXT72.EQ.'DELTA')) THEN + IF(IBM.EQ.0) CALL XABORT('MCRDRV: MIX NOT SET (2).') + ITYPE=0 + IF(TEXT72.EQ.'SET') THEN + ITYPE=1 + ELSE IF(TEXT72.EQ.'DELTA') THEN + ITYPE=2 + LDELTA(IBM)=.TRUE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + IF((TEXT72.EQ.'LINEAR').OR.(TEXT72.EQ.'CUBIC')) THEN + HCUBIC=TEXT72(:12) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + ELSE + HCUBIC=' ' + ENDIF + IF(INDIC.NE.3) CALL XABORT('MCRDRV: CHARACTER DATA EXPECTED.') + IPAR=0 + DO 50 I=1,NPAR + IF(TEXT72.EQ.PARKEY(I)) THEN + IPAR=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('MCRDRV: PARAMETER '//TEXT72//' NOT FOUND.') + 60 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) + IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('MCRDRV: MAXVAL OVERFL' + 1 //'OW.') + 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,'(25HMCRDRV: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 TRIM(PARKEY(IPAR)) + CALL XABORT(HSMG) + ENDIF + IF(PARFMT(IPAR).EQ.'INTEGER') THEN + IF(ITYPE.NE.1) CALL XABORT('MCRDRV: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT72,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('MCRDRV: INTEGER DATA EXPECTED.') + CALL hdf5_read_data(IPMPO,RECNAM,VINTE) + DO 70 J=1,NVALUE(IPAR) + IF(VALI(IPAR).EQ.VINTE(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VINTE) + GO TO 10 + ENDIF + 70 CONTINUE + WRITE(HSMG,'(26HMCRDRV: INTEGER PARAMETER ,A,11H WITH VALUE, + 1 I5,32H NOT FOUND IN MPO FILE DATABASE.)') + 2 TRIM(PARKEY(IPAR)),VALI(IPAR) + CALL XABORT(HSMG) + ELSE IF(PARFMT(IPAR).EQ.'FLOAT') THEN + CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT72,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('MCRDRV: REAL DATA EXPECTED.') + VALR(IPAR,2)=VALR(IPAR,1) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + IF(INDIC.EQ.2) THEN + VALR(IPAR,2)=FLOTT + CALL REDGET(INDIC,NITMA,FLOTT,TEXT72,DFLOTT) + ENDIF + CALL hdf5_read_data(IPMPO,RECNAM,VREAL) + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) THEN + DO 80 J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN + MUPLET(IPAR)=J + IF(ITYPE.NE.1) MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VREAL) + GO TO 20 + ENDIF + 80 CONTINUE + ENDIF + IF(VALR(IPAR,1).LT.VREAL(1)) THEN + WRITE(HSMG,'(23HMCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (<,E12.4,1H))') + 2 TRIM(PARKEY(IPAR)),VALR(IPAR,1),VREAL(1) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,2).GT.VREAL(NVALUE(IPAR))) THEN + WRITE(HSMG,'(23HMCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (>,E12.4,1H))') + 2 TRIM(PARKEY(IPAR)),VALR(IPAR,1),VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,1).GT.VALR(IPAR,2)) THEN + WRITE(HSMG,'(23HMCRDRV: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,1H.)') TRIM(PARKEY(IPAR)), + 2 VALR(IPAR,1),VALR(IPAR,2) + CALL XABORT(HSMG) + ENDIF + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VREAL) + GO TO 20 + ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN + IF(ITYPE.NE.1) CALL XABORT('MCRDRV: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3) CALL XABORT('MCRDRV: STRING DATA EXPECTED.') + CALL hdf5_read_data(IPMPO,RECNAM,VCHAR) + DO 90 J=1,NVALUE(IPAR) + IF(VALH(IPAR).EQ.VCHAR(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + DEALLOCATE(NVALUE,VCHAR) + GO TO 10 + ENDIF + 90 CONTINUE + WRITE(HSMG,'(25HMCRDRV: STRING PARAMETER ,A,10H WITH VALU, + 1 2HE ,A12,32H NOT FOUND IN MPO FILE DATABASE.)') + 2 TRIM(PARKEY(IPAR)), VALH(IPAR) + CALL XABORT(HSMG) + ELSE + CALL XABORT('MCRDRV: INVALID FORMAT='//PARFMT(IPAR)) + ENDIF + ELSE IF(TEXT72.EQ.'ENDMIX') THEN +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(PARFMT(IPAR).EQ.'FLOAT')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H MCRDRV: GLOBAL PARAMETER:,A,7H ->CUBI, + 1 16HC INTERPOLATION.)') TRIM(PARKEY(IPAR)) + ELSE + WRITE(IOUT,'(26H MCRDRV: GLOBAL PARAMETER:,A,7H ->LINE, + 1 17HAR INTERPOLATION.)') TRIM(PARKEY(IPAR)) + ENDIF + ENDIF + ENDDO + ENDIF + IF(IBMOLD.GT.NMIL)CALL XABORT('MCRDRV: MPO MIX OVERFLOW(3).') + IF(IBM.GT.NMIX)CALL XABORT('MCRDRV: MIX OVERFLOW (MICROLIB).') + IF(NCAL.EQ.1) THEN + TERP(1,IBM)=1.0 + ELSE + CALL MCRTRP(IPMPO,LCUB2,IMPX,NPAR,NCAL,MUPLET,MUTYPE,PARTYP, + 1 VALR,0.0,MUBASE,TERP(1,IBM)) + ENDIF + IBM=0 + ELSE IF((TEXT72.EQ.'MPO').OR.(TEXT72.EQ.'TABLE').OR. + 1 (TEXT72.EQ.'CHAIN').OR.(TEXT72.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT72.EQ.';') ITER=0 + IF(TEXT72.EQ.'MPO') ITER=1 + IF(TEXT72.EQ.'TABLE') ITER=2 + IF(TEXT72.EQ.'CHAIN') ITER=3 + DO 150 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 150 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('MCRDRV: MAXNIS OVERFLOW.') + IF(LDELTA(IBM)) THEN + SUM=0.0 + ELSE + SUM=1.0 + ENDIF + DO 140 ICAL=1,NCAL + SUM=SUM-TERP(ICAL,IBM) + 140 CONTINUE + IF(ABS(SUM).GT.1.0E-4) THEN + WRITE(HSMG,'(43HMCRDRV: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 150 CONTINUE + GO TO 160 + ELSE + CALL XABORT('MCRDRV: '//TEXT72//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 10 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 160 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H MCRDRV: INTERPOLATION FACTORS)') + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) THEN + WRITE(IOUT,170) 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,LDELTA,MUTYPE,MUPLET) + RETURN + 170 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/MCRISO.f b/Donjon/src/MCRISO.f new file mode 100644 index 0000000..8d57fe9 --- /dev/null +++ b/Donjon/src/MCRISO.f @@ -0,0 +1,259 @@ +*DECK MCRISO + SUBROUTINE MCRISO(IPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS,SIGS, + > SS2D,TAUXFI,LXS,LAMB,CHIRS,BETAR,INVELS,INAME,LSTRD,LPURE,ILUPS, + > ITRANC,IFISS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store an isotopic data recovered from an MPO file into a Microlib. +* +*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 +* IPLIB address of the output microlib LCM object +* NREA number of reactions in the MPO file +* NGRP number of energy groups +* NL maximum Legendre order (NL=1 is for isotropic scattering) +* NPRC number of delayed neutron precursor groups +* NOMREA names of reactions in the MPO file +* NWT0 average flux +* XS cross sections per reaction +* SIGS scattering cross sections +* SS2D complete scattering matrix +* TAUXFI interpolated fission rate +* LXS existence flag of each reaction +* LAMB decay constants of the delayed neutron precursor groups +* CHIRS delayed neutron emission spectrums +* BETAR delayed neutron fractions +* INVELS group-average of the inverse neutron velocity +* INAME name of the isotope. +* LSTRD flag set to .true. if B2=0.0. +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* +*Parameters: output +* ITRANC transport correction flag +* IFISS fission flag +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB + INTEGER NREA,NGRP,NL,NPRC,INAME(2),ILUPS,ITRANC,IFISS + REAL NWT0(NGRP),XS(NGRP,NREA),SIGS(NGRP,NL),SS2D(NGRP,NGRP,NL), + > TAUXFI,LAMB(NPRC),CHIRS(NGRP,NPRC),BETAR(NPRC),INVELS(NGRP) + LOGICAL LXS(NREA),LSTRD,LPURE + CHARACTER NOMREA(NREA)*24 +*---- +* LOCAL VARIABLES +*---- + INTEGER I0, IGFROM, IGMAX, IGMIN, IGR, JGR, IGTO, ILEG, IPRC, + & IREA, NXSCMP, IL, IRENT0 + LOGICAL LDIFF,LHFACT,LZERO + REAL CONVEN,FF,CSCAT + CHARACTER TEXT12*12 + CHARACTER HCM(0:10)*2,NAMLEG*2 + INTEGER, ALLOCATABLE, DIMENSION(:) :: ITYPRO,NJJ,IJJ + REAL, ALLOCATABLE, DIMENSION(:) :: STRD,WRK,XSSCMP,EFACT + DATA HCM /'00','01','02','03','04','05','06','07','08','09','10'/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(STRD(NGRP),EFACT(NGRP)) +*---- +* UP-SCATTERING CORRECTION +*---- + IF(ILUPS.EQ.1) THEN + IRENT0=0 + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'Total') IRENT0=IREA + ENDDO + DO JGR=2,NGRP + DO IGR=1,JGR-1 ! IGR < JGR + FF=NWT0(JGR)/NWT0(IGR) + IF(IRENT0.GT.0) THEN + CSCAT=SS2D(IGR,JGR,1) + FF=NWT0(JGR)/NWT0(IGR) + XS(IGR,IRENT0)=XS(IGR,IRENT0)-CSCAT*FF + XS(JGR,IRENT0)=XS(JGR,IRENT0)-CSCAT + ENDIF + DO IL=1,NL + CSCAT=SS2D(IGR,JGR,IL) + SIGS(IGR,IL)=SIGS(IGR,IL)-CSCAT*FF + SIGS(JGR,IL)=SIGS(JGR,IL)-CSCAT + SS2D(JGR,IGR,IL)=SS2D(JGR,IGR,IL)-CSCAT*FF + SS2D(IGR,JGR,IL)=0.0 + ENDDO + ENDDO + ENDDO + ENDIF +*---- +* BUILD MICROLIB +*---- + WRITE(TEXT12,'(2A4)') (INAME(I0),I0=1,2) + CALL LCMPTC(IPLIB,'ALIAS',12,TEXT12) + CALL LCMPUT(IPLIB,'NWT0',NGRP,2,NWT0) + IF(NPRC.GT.0) THEN + CALL LCMPUT(IPLIB,'LAMBDA-D',NPRC,2,LAMB) + CALL LCMPUT(IPLIB,'OVERV',NGRP,2,INVELS) + ENDIF + ITRANC=0 + IFISS=0 + LDIFF=.FALSE. + LHFACT=.FALSE. + STRD(:NGRP)=0.0 + EFACT(:NGRP)=0.0 + CONVEN=1.0E6 ! convert MeV to eV + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + LZERO=.TRUE. + DO IGR=1,NGRP + LZERO=LZERO.AND.(XS(IGR,IREA).EQ.0.0) + ENDDO + IF(LZERO) CYCLE + IF(NOMREA(IREA).EQ.'Total') THEN + IF(LSTRD) THEN + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)+XS(IGR,IREA) + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'NTOT0',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'Nexess') THEN +* correct scattering XS with excess XS + DO IGR=1,NGRP + SIGS(IGR,1)=SIGS(IGR,1)+XS(IGR,IREA) + ENDDO + CALL LCMPUT(IPLIB,'N2N',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'Fission') THEN + CALL LCMPUT(IPLIB,'NFTOT',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'Absorption') THEN + CALL LCMPUT(IPLIB,'NG',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'FissionSpectrum') THEN + IF(.NOT.LPURE) THEN + DO IGR=1,NGRP + IF(XS(IGR,IREA).NE.0.0) THEN + XS(IGR,IREA)=XS(IGR,IREA)/TAUXFI + ENDIF + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'CHI',NGRP,2,XS(1,IREA)) + DO IPRC=1,NPRC + WRITE(TEXT12,'(A3,I2.2)') 'CHI',IPRC + CALL LCMPUT(IPLIB,TEXT12,NGRP,2,CHIRS(1,IPRC)) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'NuFission') THEN + IFISS=1 + CALL LCMPUT(IPLIB,'NUSIGF',NGRP,2,XS(1,IREA)) + IF(NPRC.GT.0) THEN + ALLOCATE(WRK(NGRP)) + DO IPRC=1,NPRC + DO IGR=1,NGRP + WRK(IGR)=XS(IGR,IREA)*BETAR(IPRC) + ENDDO + WRITE(TEXT12,'(A6,I2.2)') 'NUSIGF',IPRC + CALL LCMPUT(IPLIB,TEXT12,NGRP,2,WRK) + ENDDO + DEALLOCATE(WRK) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'CaptureEnergyCapture') THEN + LHFACT=.TRUE. + DO IGR=1,NGRP + EFACT(IGR)=EFACT(IGR)+XS(IGR,IREA)*CONVEN + ENDDO + ELSE IF(NOMREA(IREA).EQ.'FissionEnergyFission') THEN + LHFACT=.TRUE. + DO IGR=1,NGRP + EFACT(IGR)=EFACT(IGR)+XS(IGR,IREA)*CONVEN + ENDDO + ELSE IF(NOMREA(IREA).EQ.'Leakage') THEN + LDIFF=LSTRD + IF(.NOT.LSTRD) THEN + DO IGR=1,NGRP + LDIFF=LDIFF.OR.(XS(IGR,IREA).NE.0.0) + STRD(IGR)=XS(IGR,IREA) + ENDDO + ENDIF + ELSE IF(NOMREA(IREA).EQ.'Diffusion') THEN + CYCLE + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + CYCLE + ELSE + CALL LCMPUT(IPLIB,NOMREA(IREA),NGRP,2,XS(1,IREA)) + ENDIF + ENDDO + IF(LSTRD) THEN + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)-SIGS(IGR,2) + ENDDO + ENDIF + ELSE + DO IGR=1,NGRP + STRD(IGR)=1.0/(3.0*STRD(IGR)) + ENDDO + ENDIF + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + ITRANC=2 + CALL LCMPUT(IPLIB,'TRANC',NGRP,2,SIGS(1,2)) + ENDIF + IF(LDIFF.OR.LSTRD) CALL LCMPUT(IPLIB,'STRD',NGRP,2,STRD) + IF(LHFACT) CALL LCMPUT(IPLIB,'H-FACTOR',NGRP,2,EFACT) +*---- +* SAVE SCATTERING VECTORS AND MATRICES (DO NOT USE XDRLGS TO SAVE CPU +* TIME) +*---- + ALLOCATE(NJJ(NGRP),IJJ(NGRP),XSSCMP(NGRP*NGRP),ITYPRO(NL)) + DO ILEG=1,NL + IF(ILEG.LE.11) THEN + NAMLEG=HCM(ILEG-1) + ELSE + WRITE(NAMLEG,'(I2.2)') ILEG-1 + ENDIF + CALL LCMPUT(IPLIB,'SIGS'//NAMLEG,NGRP,2,SIGS(1,ILEG)) + NXSCMP=0 + DO IGTO=1,NGRP + IGMIN=IGTO + IGMAX=IGTO + DO IGFROM=1,NGRP + IF(SS2D(IGTO,IGFROM,ILEG).NE.0.0) THEN + IGMIN=MIN(IGMIN,IGFROM) + IGMAX=MAX(IGMAX,IGFROM) + ENDIF + ENDDO + IJJ(IGTO)=IGMAX + NJJ(IGTO)=IGMAX-IGMIN+1 + DO IGFROM=IGMAX,IGMIN,-1 + NXSCMP=NXSCMP+1 + XSSCMP(NXSCMP)=SS2D(IGTO,IGFROM,ILEG) + ENDDO + ENDDO + CALL LCMPUT(IPLIB,'NJJS'//NAMLEG,NGRP,1,NJJ) + CALL LCMPUT(IPLIB,'IJJS'//NAMLEG,NGRP,1,IJJ) + CALL LCMPUT(IPLIB,'SCAT'//NAMLEG,NXSCMP,2,XSSCMP) + ITYPRO(ILEG)=1 + ENDDO + CALL LCMPUT(IPLIB,'SCAT-SAVED',NL,1,ITYPRO) + DEALLOCATE(ITYPRO,XSSCMP,IJJ,NJJ) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(EFACT,STRD) + RETURN + END diff --git a/Donjon/src/MCRLIB.f b/Donjon/src/MCRLIB.f new file mode 100644 index 0000000..ab94d3f --- /dev/null +++ b/Donjon/src/MCRLIB.f @@ -0,0 +1,856 @@ +*DECK MCRLIB + SUBROUTINE MCRLIB(MAXNIS,MAXISO,IPLIB,IPMPO,IACCS,NMIX,NGRP,LADFM, + 1 IMPX,HEQUI,HMASL,NCAL,HEDIT,ITER,MY1,MY2,NBISO,TERP,NISO,LISO, + 2 HISO,CONC,ITODO,MIXC,LRES,LPURE,ILUPS,B2,VTOT,YLDS,DECAYC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the Microlib by scanning the NCAL elementary calculations in +* a MPO file and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2022 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* MAXISO maximum allocated space for output Microlib TOC information. +* IPLIB address of the output Microlib LCM object. +* IPMPO pointer to the MPO file. +* IACCS =0 Microlib is created; =1 ... is updated. +* NMIX maximum number of material mixtures in the Microlib. +* 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'). +* ITER completion flag (=0: compute the macrolib). +* MY1 number of fissile isotopes including macroscopic sets. +* MY2 number of fission fragment. +* NBISO number of particularized isotopes in the MPO file. +* 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 MPO file value is +* used. +* ITODO non-depletion mask (=1 to force a user-selected isotope to be +* non-depleting) +* MIXC mixture index in the MPO file corresponding to each Microlib +* mixture. Equal to zero if a Microlib mixture is not updated. +* LRES =.true. if the interpolation is done without updating isotopic +* densities +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* B2 buckling +* VTOT volume of updated core. +* YLDS fission yields. +* DECAYC radioactive decay constants. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,IPMPO + INTEGER MAXNIS,MAXISO,IACCS,NMIX,NGRP,IMPX,NCAL,ITER,MY1,MY2, + > NBISO,NISO(NMIX),ITODO(NMIX,MAXNIS),MIXC(NMIX),ILUPS + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + DOUBLE PRECISION VTOT,YLDS(MY1,MY2),DECAYC(NBISO) + LOGICAL LADFM,LISO(NMIX),LRES,LPURE + CHARACTER(LEN=80) HEQUI,HMASL + CHARACTER(LEN=12) HEDIT + CHARACTER(LEN=8) HISO(NMIX,NBISO) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXREA=50 + INTEGER, PARAMETER::NSTATE=40 + INTEGER, PARAMETER::MAXFRD=4 + TYPE(C_PTR) JPLIB,KPLIB + REAL FACT0, WEIGHT, DEN + INTEGER I, J, I0, IBM, IBMOLD, ICAL, IED2, IFISS, IGR, ILONG, IDF, + > IPRC, IREA, IREAB, IREAF, ISO, ITRANC, ITSTMP, ITYLCM, IY1, IY2, + > JSO, KSO, KSO1, LMY1, LSO, MAXMIX, NBISO2, NBISO2I, NBS1, NCALS, + > NED2, NL, NMIL, NPAR, NPRC, NREA, NSURFD, NISOF, NISOP, NISOS, + > RANK, NBYTE, TYPE, DIMSR(5), ILOC, NADDRXS, NLOC, NMGF, ID, ID_E, + > ID_G, NENERG, NGEOME, ADDRZI, ISOM, NISOM, IGRC, NALBP, NALBP2 + CHARACTER RECNAM*80,RECNA2*80,TEXT8*8,TEXT12*12,HSMG*131, + > HVECT2(MAXREA)*8,HRESID*8 + INTEGER ISTATE(NSTATE),INAME(2),IHRES(2) + REAL TMPDAY(3) + LOGICAL LUSER,LSTRD,LSPH,LMASL,LALBG +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMIX2,ISONA,ISOMI,ITOD2, + > ISTY1,ISTY2,IPIFI,IMICR,ITOD1,JJSO,IPYMIX,LOCAD,REACTION,ISOTOPE, + > ADDRISO,IGYELD,IADRY,DIMS_MPO + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: HUSE2,HNAM2,OUPUTID + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: ADDRXS + REAL, ALLOCATABLE, DIMENSION(:) :: DENS2,DENS3,VOL2,VOLMI2,SPH, + > ENER,VOSAP,CONCE,TAUXFI,NWT0,FLUXS,DENIS,GAR1,GAR2,LAMB,BETAR, + > INVELS,BETARB,INVELSB,DECAY2,RVALO + REAL, ALLOCATABLE, DIMENSION(:,:) :: DENS1,FACT,CHIRS,CHIRSB, + > TAUXGF + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XS,SIGS,DENS0,FLUX,YLDS2 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: SS2D + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: YLDSM + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LXS,MASK,MASKL + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HPYNAM + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: TEXT24,NOMREA, + > NOMISO + CHARACTER(LEN=80), ALLOCATABLE, DIMENSION(:) :: LOCTYP,LOCKEY +*---- +* RECOVER MPO FILE CHARACTERISTICS +*---- + I=0 + CALL MPOTOC(IPMPO,HEDIT,0,NREA,I0,NMIL,NPAR,NLOC,NISOF,NISOP, + > NISOS,NCALS,I,NSURFD,NALBP,NPRC) + IF(NBISO.NE.I0) CALL XABORT('MCRLIB: INVALID VALUE OF NBISO.') + IF(NGRP.NE.I) CALL XABORT('MCRLIB: INVALID VALUE OF NGRP.') + IF(NREA+2.GT.MAXREA) CALL XABORT('MCRLIB: MAXREA OVERFLOW') +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IMIX2(MAXISO),ITOD2(MAXISO),ISTY1(MAXISO),ISTY2(MAXISO), + > HUSE2(3,MAXISO),HNAM2(3,MAXISO)) + ALLOCATE(DENS2(MAXISO),DENS3(MAXISO),VOL2(MAXISO),VOLMI2(NMIX), + > FLUX(NMIX,NGRP,2),SPH(NGRP)) +*---- +* MICROLIB INITIALIZATION +*---- + VOLMI2(:NMIX)=0.0 + DENS2(:MAXISO)=0.0 + VOL2(:MAXISO)=0.0 + IMIX2(:MAXISO)=0 + ITOD2(:MAXISO)=0 + ISTY2(:MAXISO)=0 + IF(IACCS.EQ.0) THEN + IF(LRES) CALL XABORT('MCRLIB: RES OPTION IS INVALID.') + NBISO2=0 + NED2=0 + TEXT12='L_LIBRARY' + CALL LCMPTC(IPLIB,'SIGNATURE',12,TEXT12) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NMIX) CALL XABORT('MCRLIB: INVALID NUMBER OF ' + 1 //'MATERIAL MIXTURES IN THE MICROLIB.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('MCRLIB: INVALID NUMBER OF ' + 1 //'ENERGY GROUPS IN THE MICROLIB.') + NBISO2=ISTATE(2) + IF(NBISO2.GT.MAXISO) CALL XABORT('MCRLIB: MAXISO OVERFLOW(1).') + NED2=ISTATE(13) + IF(NED2.GT.MAXREA) CALL XABORT('MCRLIB: MAXREA OVERFLOW.') + CALL LCMLEN(IPLIB,'MIXTURESVOL',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPLIB,'MIXTURESVOL',VOLMI2) + ELSE + VOLMI2(:NMIX)=0.0 + ENDIF + CALL LCMGET(IPLIB,'ISOTOPESUSED',HUSE2) + CALL LCMGET(IPLIB,'ISOTOPERNAME',HNAM2) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS2) + CALL LCMGET(IPLIB,'ISOTOPESVOL',VOL2) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX2) + CALL LCMGET(IPLIB,'ISOTOPESTODO',ITOD2) + CALL LCMGET(IPLIB,'ISOTOPESTYPE',ISTY2) + IF(NED2.GT.0) CALL LCMGTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + 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. +*---- + 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)//"ADDRXS",ADDRXS) + NL=0 + DO I=1,NADDRXS + DO ISO=1,NBISO + 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 MCRLIB: number of legendre orders =,I4)') NL + 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 10 + ENDIF + ENDDO + ENDDO + CALL XABORT('MCRLIB: no ID found in /output/OUPUTID.') + 10 WRITE(RECNAM,'(23H/energymesh/energymesh_,I0)') ID_E + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"/ENERGY",ENER) + IF(SIZE(ENER,1)-1.NE.NGRP) CALL XABORT('MCRLIB: INVALID NGRP VAL' + > //'UE.') + DO IGR=1,NGRP+1 + ENER(IGR)=ENER(IGR)/1.0E-6 + ENDDO + WRITE(RECNAM,'(19H/geometry/geometry_,I0,1H/)') ID_G + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEVOLUME",VOSAP) + CALL LCMPUT(IPLIB,'ENERGY',NGRP+1,2,ENER) + DO IGR=1,NGRP + ENER(IGR)=LOG(ENER(IGR)/ENER(IGR+1)) + ENDDO + CALL LCMPUT(IPLIB,'DELTAU',NGRP,2,ENER) + DEALLOCATE(ENER) +*---- +* RECOVER INFORMATION ON REACTIONS AND ISOTOPE NAMES +*---- + IREAB=0 + IREAF=0 + 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) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRISO",ADDRISO) + NBISO=ADDRISO(SIZE(ADDRISO,1)) + IF(NBISO.EQ.0) CALL XABORT('MCRLIB: NO CROSS SECTIONS.') + ALLOCATE(NOMREA(NREA+2),NOMISO(NBISO)) + IF(NREA.GT.0) THEN + CALL hdf5_read_data(IPMPO,"/contents/reactions/REACTIONAME", + > TEXT24) + DO I=1,NREA + NOMREA(I)=TEXT24(REACTION(I)+1) + ENDDO + DEALLOCATE(TEXT24,REACTION) + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'Absorption') THEN + IREAB=IREA + EXIT + ENDIF + ENDDO + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'NuFission') THEN + IREAF=IREA + EXIT + ENDIF + ENDDO + ENDIF + NOMREA(NREA+1)='Total' + NOMREA(NREA+2)='Leakage' + NREA=NREA+2 + CALL hdf5_read_data(IPMPO,"/contents/isotopes/ISOTOPENAME",TEXT24) + DO I=1,NBISO + NOMISO(I)=TEXT24(ISOTOPE(I)+1) + ENDDO + DEALLOCATE(TEXT24,ADDRISO,ISOTOPE) + IF(IMPX.GT.1) THEN + WRITE(6,'(/24H MCRLIB: reaction names:)') + DO I=1,NREA + WRITE(6,'(5X,7HNOMREA(,I3,2H)=,A)') I,TRIM(NOMREA(I)) + ENDDO + WRITE(6,'(/23H MCRLIB: isotope names:)') + DO I=1,NBISO + WRITE(6,'(5X,7HNOMISO(,I3,2H)=,A)') I,TRIM(NOMISO(I)) + ENDDO + ENDIF +*---- +* LOOP OVER MPO MIXTURES TO COMPUTE DENS0(NMIL,NCAL,NBISO) +*---- + ALLOCATE(DENS0(NMIL,NCAL,NBISO)) + DENS0(:NMIL,:NCAL,:NBISO)=0.0 + DO 30 IBMOLD=1,NMIL + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF((TERP(ICAL,IBM).NE.0.0).AND.(MIXC(IBM).EQ.IBMOLD)) GO TO 15 + ENDDO + CYCLE + 15 WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + > TRIM(HEDIT),ICAL-1,IBMOLD-1 + IF(NBISO.GT.0) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"CONCENTRATION",CONCE) + DO 20 ISO=1,NBISO + DENS0(IBMOLD,ICAL,ISO)=CONCE(ISO) + 20 CONTINUE + DEALLOCATE(CONCE) + ENDIF + ENDDO + 30 CONTINUE +*---- +* LOOP OVER MICROLIB MIXTURES +*---- + YLDS(:MY1,:MY2)=0.0D0 + DECAYC(:NBISO)=0.0D0 + VTOT=0.0D0 + DO 40 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.NE.0) VTOT=VTOT+VOSAP(IBMOLD) + 40 CONTINUE + ALLOCATE(JJSO(NBISO),YLDSM(MY1,MY2),ITOD1(NBISO)) + ALLOCATE(TAUXFI(NBISO),NWT0(NGRP),SIGS(NGRP,NL,NBISO), + > SS2D(NGRP,NGRP,NL,NBISO),XS(NGRP,NREA,NBISO)) + ALLOCATE(LXS(NREA)) + ALLOCATE(CHIRS(NGRP,NPRC),BETAR(NPRC),INVELS(NGRP)) + CHIRS(:NGRP,:NPRC)=0.0 + BETAR(:NPRC)=0.0 + INVELS(:NGRP)=0.0 + ALLOCATE(BETARB(NPRC),INVELSB(NGRP)) + ALLOCATE(DENS1(NBISO,NCAL),FACT(NBISO,NCAL)) + JPLIB=LCMLID(IPLIB,'ISOTOPESLIST',NBISO*NMIX) +* + DO 180 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 180 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('MCRLIB: MAXNIS OVERFLOW.') + VOLMI2(IBM)=VOSAP(IBMOLD) +*---- +* RECOVER ITOD1(NBISO) INDICES. +*---- + ITOD1(:NBISO)=0 + DO 50 ISO=1,NBISO ! MPO file isotope + DO KSO=1,NISO(IBM) ! user-selected isotope + IF(NOMISO(ISO).EQ.HISO(IBM,KSO)) THEN + ITOD1(ISO)=ITODO(IBM,KSO) + GO TO 50 + ENDIF + ENDDO + 50 CONTINUE +*---- +* COMPUTE THE NUMBER DENSITIES OF EACH ELEMENTARY CALCULATION. +*---- + DENS1(:NBISO,:NCAL)=0.0 + DENS3(:NBISO)=0.0 + DO ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) CYCLE + DO ISO=1,NBISO + LUSER=.FALSE. + KSO1=0 + DO KSO=1,NISO(IBM) ! user-selected isotope + IF(NOMISO(ISO).EQ.HISO(IBM,KSO)) THEN + KSO1=KSO + LUSER=(CONC(IBM,KSO1).NE.-99.99) + GO TO 60 + ENDIF + ENDDO + 60 IF(LUSER) THEN + DENS1(ISO,ICAL)=CONC(IBM,KSO1) + CYCLE + ENDIF + IF(.NOT.LISO(IBM)) CYCLE + DENS1(ISO,ICAL)=DENS0(IBMOLD,ICAL,ISO) + ENDDO + DO ISO=1,NBISO + DENS3(ISO)=DENS3(ISO)+WEIGHT*DENS1(ISO,ICAL) + ENDDO + ENDDO + FACT(:NBISO,:NCAL)=1.0 + IF(.NOT.LPURE) THEN + DO ICAL=1,NCAL + IF(TERP(ICAL,IBM).EQ.0.0) CYCLE + DO ISO=1,NBISO + IF(DENS3(ISO).GT.DENS1(ISO,ICAL)*1.0E-9) THEN + FACT(ISO,ICAL)=DENS1(ISO,ICAL)/DENS3(ISO) + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* INITIALIZE WORKING ARRAYS. +*---- + TAUXFI(:NBISO)=0.0 + NWT0(:NGRP)=0.0 + SIGS(:NGRP,:NL,:NBISO)=0.0 + SS2D(:NGRP,:NGRP,:NL,:NBISO)=0.0 + XS(:NGRP,:NREA,:NBISO)=0.0 + LXS(:NREA)=.FALSE. + YLDSM(:MY1,:MY2)=0.0D0 +*---- +* MAIN LOOP OVER ELEMENTARY CALCULATIONS +*---- + TEXT12='*MAC*RES' + READ(TEXT12,'(2A4)') IHRES(1),IHRES(2) + LSTRD=.FALSE. + DO 80 ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 80 +*---- +* SELECT THE HDF5 GROUP CORRESPONDING TO ICAL AND IBMOLD +*---- + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + > TRIM(HEDIT),ICAL-1,IBMOLD-1 + NMGF=0 + IF(hdf5_group_exists(IPMPO,TRIM(RECNAM)//"yields")) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/NMGF",NMGF) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/YIELDGROUP", + > IGYELD) + ENDIF + ALLOCATE(TAUXGF(NMGF,NBISO)) +*---- +* RECOVER INFORMATION FROM caldir GROUP. +*---- + WRITE(RECNA2,'(A,9Hkinetics/)') TRIM(RECNAM) + CALL hdf5_info(IPMPO,TRIM(RECNA2)//"LAMBDA",RANK,TYPE,NBYTE,DIMSR) + NPRC=0 + IF(TYPE.NE.99) THEN + NPRC=DIMSR(1) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"LAMBDA",LAMB) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"CHIDA",CHIRSB) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"BETADA",BETARB) + CALL hdf5_read_data(IPMPO,TRIM(RECNA2)//"INVELA",INVELSB) + ENDIF +*---- +* RECOVER SPH FACTORS. +*---- + SPH(:NGRP)=1.0 + IF(HEQUI.NE.' ') 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.NGRP) THEN + CALL XABORT('MCRLIB: INVALID NUMBER OF COMPONENTS FOR ' + > //'SPH FACTORS') + ENDIF + DO IGR=1,NGRP + SPH(IGR)=RVALO(LOCAD(ILOC)+IGR-1) + ENDDO + ENDIF + ENDDO + DEALLOCATE(LOCAD,RVALO) + ENDIF +*---- +* RECOVER FLUXES. +*---- + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ZONEFLUX",FLUXS) + DO I=1,NGRP + NWT0(I)=NWT0(I)+WEIGHT*FLUXS(I)/SPH(I) + ENDDO +*---- +* RECOVER MICROSCOPIC CROSS SECTIONS. +*---- + DO ISO=1,NBISO + FACT0=FACT(ISO,ICAL) + DEN=DENS0(IBMOLD,ICAL,ISO) + CALL MCRSX2(IPMPO,HEDIT,RECNAM,NREA,NGRP,NMGF,NL,ISO,NOMREA, + 1 NOMISO(ISO),DEN,FACT0,WEIGHT,SPH,FLUXS,IREAB,IREAF,LPURE,IGYELD, + 2 LXS,XS(1,1,ISO),SIGS(1,1,ISO),SS2D(1,1,1,ISO),TAUXFI(ISO), + 3 TAUXGF(1,ISO)) + ENDDO + IF(NMGF.GT.0) DEALLOCATE(IGYELD) + DEALLOCATE(FLUXS) +* + IF(NPRC.GT.0) THEN + DO IGR=1,NGRP + INVELS(IGR)=INVELS(IGR)+SPH(IGR)*WEIGHT*INVELSB(IGR) + DO IPRC=1,NPRC + CHIRS(IGR,IPRC)=CHIRS(IGR,IPRC)+WEIGHT*CHIRSB(IGR,IPRC) + ENDDO + ENDDO + DO IPRC=1,NPRC + BETAR(IPRC)=BETAR(IPRC)+WEIGHT*BETARB(IPRC) + ENDDO + ENDIF +*---- +* COMPUTE DEPLETION CHAIN DATA +*---- + IF(NISOF*NISOP.GT.0) THEN + IF(NMGF.EQ.0) CALL XABORT('MCRLIB: INVALID NMGF.') + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + > TRIM(HEDIT),ICAL-1,IBMOLD-1 + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/NISF",I0) + IF(I0.NE.NISOF) CALL XABORT('MCRLIB: INVALID NISOF.') + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/NISP",I0) + IF(I0.NE.NISOP) CALL XABORT('MCRLIB: INVALID NISOP.') + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/YIELD",YLDS2) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/ADDRY", + > DIMS_MPO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZI",ADDRZI) + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRISO",ADDRISO) + NISOM=ADDRISO(ADDRZI+2)-ADDRISO(ADDRZI+1) + DO IY1=1,NISOF + ISO=0 + DO ISOM=1,NISOM + IF(DIMS_MPO(ISOM).EQ.IY1) THEN + ISO=ADDRISO(ADDRZI+1)+ISOM + EXIT + ENDIF + ENDDO + IF(ISO.EQ.0) CALL XABORT('MCRLIB: UNABLE TO FIND ISO.') + DEN=0.0 + DO IGRC=1,NMGF + DEN=DEN+TAUXGF(IGRC,ISO) + DO IY2=1,NISOP + YLDSM(IY1,IY2)=YLDSM(IY1,IY2)+WEIGHT*TAUXGF(IGRC,ISO)* + > YLDS2(IY1,IY2,IGRC) + YLDS(IY1,IY2)=YLDS(IY1,IY2)+WEIGHT*TAUXGF(IGRC,ISO)* + > YLDS2(IY1,IY2,IGRC)*VOLMI2(IBM)/VTOT + ENDDO + ENDDO + IF(DEN.EQ.0.0) CYCLE + DO IY2=1,NISOP + YLDSM(IY1,IY2)=YLDSM(IY1,IY2)/DEN + YLDS(IY1,IY2)=YLDS(IY1,IY2)/DEN + ENDDO + ENDDO + DEALLOCATE(ADDRISO,DIMS_MPO,YLDS2) + ENDIF + CALL hdf5_info(IPMPO,"/contents/isotopes/DECAYCONST",RANK,TYPE, + 1 NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + CALL hdf5_read_data(IPMPO,"/contents/isotopes/DECAYCONST", + > DECAY2) + DO ISO=1,NBISO + DECAYC(ISO)=DECAYC(ISO)+WEIGHT*DECAY2(ISO)*VOLMI2(IBM)/VTOT + ENDDO + DEALLOCATE(DECAY2) + ENDIF + DEALLOCATE(TAUXGF) + 80 CONTINUE ! end of loop over elementary calculations. +*---- +* IDENTIFY SPECIAL FLUX EDITS +*---- + DO 100 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 + DO 90 IED2=1,NED2 + IF(HVECT2(IED2).EQ.NOMREA(IREA)(:8)) GO TO 100 + IF(HVECT2(IED2).EQ.'NFTOT') GO TO 100 + 90 CONTINUE + NED2=NED2+1 + IF(NED2.GT.MAXREA) CALL XABORT('MCRLIB: MAXREA OVERFLOW.') + IF(NOMREA(IREA).EQ.'Fission') THEN + HVECT2(NED2)='NFTOT' + ELSE + HVECT2(NED2)=NOMREA(IREA)(:8) + ENDIF + 100 CONTINUE +*---- +* SET FLAG LSTRD +*---- + LSTRD=.TRUE. + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'Leakage') THEN + IF(LXS(IREA)) LSTRD=.FALSE. + EXIT + ENDIF + ENDDO +*---- +* SET IADRY FOR MIXTURE IBMOLD +*---- + ALLOCATE(IADRY(NBISO)) + IADRY(:NBISO)=0 + DO ICAL=NCAL,1,-1 + IF(TERP(ICAL,IBM).EQ.0.0) CYCLE + WRITE(RECNAM,'(8H/output/,A,9H/statept_,I0,6H/zone_,I0,1H/)') + 1 TRIM(HEDIT),ICAL-1,IBMOLD-1 + IF((hdf5_group_exists(IPMPO,TRIM(RECNAM)//"yields")).AND. + 1 (NISOP.GT.0)) THEN + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"yields/ADDRY", + 1 DIMS_MPO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZI",ADDRZI) + WRITE(RECNAM,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRISO",ADDRISO) + NISOM=ADDRISO(ADDRZI+2)-ADDRISO(ADDRZI+1) + DO ISOM=1,NISOM + ISO=ADDRISO(ADDRZI+1)+ISOM + IADRY(ISO)=DIMS_MPO(ISOM) + ENDDO + DEALLOCATE(ADDRISO,DIMS_MPO) + ENDIF + EXIT + ENDDO +*---- +* SAVE CROSS SECTIONS IN MICROLIB FOR MIXTURE IBM +*---- + ISTY1(:NBISO)=0 + JJSO(:NBISO)=0 + NBISO2I=NBISO2 + HRESID=' ' + DO ISO=1,NBISO + READ(NOMISO(ISO),'(2A4)') INAME(:2) + CALL SCRFND(MAXISO,NBISO2I,NBISO2,INAME,IBM,HRESID,HUSE2, + 1 HNAM2,IMIX2,JJSO(ISO)) + KPLIB=LCMDIL(JPLIB,JJSO(ISO)) ! step up isot JJSO(ISO) + CALL MCRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS(1,1,ISO), + 1 SIGS(1,1,ISO),SS2D(1,1,1,ISO),TAUXFI(ISO),LXS,LAMB,CHIRS, + 2 BETAR,INVELS,INAME,LSTRD,LPURE,ILUPS,ITRANC,IFISS) + IF(MY1*MY2.GT.0) CALL MCRNDF(IMPX,NBISO,ISO,IBM,NOMISO,KPLIB, + 1 MY1,MY2,YLDSM,IADRY,ISTY1(ISO)) + ENDDO + DEALLOCATE(IADRY) +*---- +* SET NUMBER DENSITIES AND VOLUMES IN OUTPUT MICROLIB +*---- + IF(LRES) THEN +* -- Number densities are left unchanged except if they are +* -- listed in HISO array. + DO 110 KSO=1,NISO(IBM) ! user-selected isotope + DO JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).NE.IBM) CYCLE + WRITE(TEXT8,'(2A4)') HUSE2(1,JSO),HUSE2(2,JSO) + IF(HISO(IBM,KSO).EQ.TEXT8) THEN + ITOD2(JSO)=ITODO(IBM,KSO) + IF(CONC(IBM,KSO).EQ.-99.99) THEN +* -- Only number densities of isotopes set with "MICR" and +* -- "*" keywords are interpolated + DENS2(JSO)=0.0 + DO ISO=1,NBISO ! MPO file isotope + IF(JJSO(ISO).EQ.JSO) DENS2(JSO)=DENS2(JSO)+DENS3(ISO) + ENDDO + ELSE IF(CONC(IBM,KSO).NE.-99.99) THEN +* -- Number densities of isotopes set with "MICR" and +* -- fixed value are forced to this value + DENS2(JSO)=CONC(IBM,KSO) + ENDIF + GO TO 110 + ENDIF + ENDDO + WRITE(HSMG,'(31HMCRLIB: UNABLE TO FIND ISOTOPE ,A8,6H IN MI, + 1 5HXTURE,I8,1H.)') HISO(IBM,KSO),IBM + CALL XABORT(HSMG) + 110 CONTINUE + ELSE +* -- Number densities are interpolated or not according to +* -- ALL/ONLY option + DO JSO=1,NBISO2 ! microlib isotope + WRITE(TEXT8,'(2A4)') HUSE2(1,JSO),HUSE2(2,JSO) + IF(IBM.EQ.IMIX2(JSO)) THEN + DO ISO=1,NBISO ! MPO file isotope + IF(NOMISO(ISO).EQ.TEXT8) THEN + DENS2(JSO)=0.0 + VOL2(JSO)=0.0 + CYCLE + ENDIF + ENDDO + ENDIF + ENDDO + DO 130 ISO=1,NBISO ! MPO file isotope + IF(.NOT.LISO(IBM)) THEN +* --ONLY option + DO KSO=1,NISO(IBM) ! user-selected isotope + IF(NOMISO(ISO).EQ.HISO(IBM,KSO)) GO TO 120 + ENDDO + GO TO 130 + ENDIF + 120 JSO=JJSO(ISO) + IF(JSO.GT.0) THEN + ITOD2(JSO)=ITOD1(ISO) + ISTY2(JSO)=ISTY1(ISO) + DENS2(JSO)=DENS2(JSO)+DENS3(ISO) + VOL2(JSO)=VOL2(JSO)+VOSAP(IBMOLD) + ENDIF + 130 CONTINUE + ENDIF +*---- +* SET PIFI INFORMATION +*---- + ALLOCATE(IMICR(NBISO)) + IMICR(:NBISO)=0 + NBS1=0 + DO 140 JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).EQ.IBM) THEN + NBS1=NBS1+1 + IF(NBS1.GT.NBISO) CALL XABORT('MCRLIB: NBISO OVERFLOW.') + IMICR(NBS1)=JSO + ENDIF + 140 CONTINUE + DO 170 ISO=1,NBS1 ! MPO file isotope + JSO=IMICR(ISO) + KPLIB=LCMDIL(JPLIB,JSO) ! step up isot JSO + CALL LCMLEN(KPLIB,'PYIELD',LMY1,ITYLCM) + IF(LMY1.GT.0) THEN + ALLOCATE(HPYNAM(LMY1),IPYMIX(LMY1),IPIFI(LMY1)) + IPIFI(:LMY1)=0 + CALL LCMGTC(KPLIB,'PYNAM',8,LMY1,HPYNAM) + CALL LCMGET(KPLIB,'PYMIX',IPYMIX) + DO 160 IY1=1,LMY1 + IF(HPYNAM(IY1).NE.' ') THEN + DO 150 KSO=1,NBS1 + LSO=IMICR(KSO) + WRITE(TEXT8,'(2A4)') HUSE2(:2,LSO) + IF((HPYNAM(IY1).EQ.TEXT8).AND.(IPYMIX(IY1).EQ.IMIX2(LSO))) + > THEN + IPIFI(IY1)=LSO + GO TO 160 + ENDIF + 150 CONTINUE + IF(IPIFI(IY1).EQ.0) THEN + WRITE(HSMG,'(40HMCRLIB: FAILURE TO FIND FISSILE ISOTOPE , + 1 A12,25H AMONG MICROLIB ISOTOPES.)') HPYNAM(IY1) + CALL XABORT(HSMG) + ENDIF + ENDIF + 160 CONTINUE + CALL LCMPUT(KPLIB,'PIFI',LMY1,1,IPIFI) + DEALLOCATE(IPIFI,IPYMIX,HPYNAM) + ENDIF + 170 CONTINUE + DEALLOCATE(IMICR) + 180 CONTINUE ! end of loop over microlib mixtures. +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(FACT,DENS1) + IF(NPRC.GT.0) DEALLOCATE(INVELSB,BETARB,CHIRSB,INVELS,BETAR, + > CHIRS,LAMB) + DEALLOCATE(LXS,XS,SS2D,SIGS,NWT0,TAUXFI) + DEALLOCATE(ITOD1,YLDSM) + DEALLOCATE(JJSO,DENS0,NOMISO) +*---- +* MICROLIB FINALIZATION +*---- + IF(.NOT.LRES) THEN + ISTATE(:NSTATE)=0 + ISTATE(1)=NMIX + ISTATE(2)=NBISO2 + ISTATE(3)=NGRP + ISTATE(4)=NL + ISTATE(5)=ITRANC + ISTATE(7)=1 + IF(ITER.EQ.3) ISTATE(12)=NMIX + ISTATE(13)=NED2 + ISTATE(14)=NMIX + ISTATE(18)=1 + ISTATE(19)=NPRC + ISTATE(20)=MY1 + ISTATE(22)=MAXISO/NMIX + IF(NBISO2.EQ.0) CALL XABORT('MCRLIB: NBISO2=0.') + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPLIB,'MIXTURESVOL',NMIX,2,VOLMI2) + CALL LCMPUT(IPLIB,'ISOTOPESUSED',3*NBISO2,3,HUSE2) + CALL LCMPUT(IPLIB,'ISOTOPERNAME',3*NBISO2,3,HNAM2) + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESMIX',NBISO2,1,IMIX2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + IF(NED2.GT.0) CALL LCMPTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMPUT(IPLIB,'ISOTOPESTODO',NBISO2,1,ITOD2) + CALL LCMPUT(IPLIB,'ISOTOPESTYPE',NBISO2,1,ISTY2) + ELSE IF(LRES.AND.(NBISO.GT.0)) THEN + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + ENDIF + IF(IMPX.GT.5) CALL LCMLIB(IPLIB) +*---- +* COMPUTE THE MACROSCOPIC X-SECTIONS +*---- + IF((ITER.NE.0).AND.(ITER.NE.3)) GO TO 280 + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + IF(MAXMIX.NE.NMIX) CALL XABORT('MCRLIB: INVALID NMIX.') + NBISO=ISTATE(2) + ALLOCATE(MASK(MAXMIX),MASKL(NGRP)) + ALLOCATE(ISONA(3*NBISO),ISOMI(NBISO),DENIS(NBISO)) + CALL LCMGET(IPLIB,'ISOTOPESUSED',ISONA) + CALL LCMGET(IPLIB,'ISOTOPESMIX',ISOMI) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENIS) + MASK(:MAXMIX)=.TRUE. + MASKL(:NGRP)=.TRUE. + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 + CALL LCMLEN(IPLIB,'MACROLIB',ILONG,ITYLCM) + IF(ILONG.NE.0) CALL LCMDEL(IPLIB,'MACROLIB') + CALL LIBMIX(IPLIB,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS,MASK,MASKL, + > ITSTMP,TMPDAY) + DEALLOCATE(MASKL,MASK) + DEALLOCATE(DENIS,ISOMI,ISONA) +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(IOUT,'(/31H MCRLIB: INCLUDE LEAKAGE IN THE, + > 14H MACROLIB (B2=,1P,E12.5,2H).)') B2 + CALL LCMSIX(IPLIB,'MACROLIB',1) + JPLIB=LCMGID(IPLIB,'GROUP') + ALLOCATE(GAR1(NMIX),GAR2(NMIX)) + DO 270 IGR=1,NGRP + KPLIB=LCMGIL(JPLIB,IGR) + CALL LCMGET(KPLIB,'NTOT0',GAR1) + CALL LCMGET(KPLIB,'DIFF',GAR2) + DO 260 IBM=1,NMIX + IF(MIXC(IBM).NE.0) GAR1(IBM)=GAR1(IBM)+B2*GAR2(IBM) + 260 CONTINUE + CALL LCMPUT(KPLIB,'NTOT0',NMIX,2,GAR1) + 270 CONTINUE + DEALLOCATE(GAR2,GAR1) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* PROCESS ADF and physical albedos (if required) +*---- + 280 LALBG=.TRUE. + IDF=0 + 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('MCRLIB: INVALID NALBP.') + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"ALBEDOGxG",RANK,TYPE,NBYTE, + & DIMSR) + IF(TYPE.NE.99) LALBG=.FALSE. + ENDIF + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL MCRAGF(IPLIB,IPMPO,IACCS,NMIL,NMIX,NGRP,NALBP,LALBG,LADFM, + 1 IMPX,NCAL,TERP,MIXC,NSURFD,HEDIT,VOSAP,VOLMI2,IDF) + IF(NSURFD.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(12)=IDF ! ADF information + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + ENDIF + CALL LCMSIX(IPLIB,' ',2) + IF(NSURFD.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(24)=IDF ! ADF information + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + ENDIF + IACCS=1 +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(VOSAP) + DEALLOCATE(SPH,FLUX,VOLMI2,VOL2,DENS3,DENS2) + DEALLOCATE(HNAM2,HUSE2,ISTY2,ISTY1,ITOD2,IMIX2) + RETURN + END 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 diff --git a/Donjon/src/MCRNDF.f b/Donjon/src/MCRNDF.f new file mode 100644 index 0000000..9676347 --- /dev/null +++ b/Donjon/src/MCRNDF.f @@ -0,0 +1,97 @@ +*DECK MCRNDF + SUBROUTINE MCRNDF(IMPX,NBISO,ISO,IBM,HNOMIS,IPLIB,MY1,MY2,YLDS, + 1 IADRY,ISTYP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store records PYNAM, PYMIX and PYIELD into a Microlib. +* +*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 +* IMPX print parameter (equal to zero for no print). +* NBISO number of particularized isotopes. +* ISO particularized isotope index. +* IBM material mixture. +* HNOMIS array containing the names of the particularized isotopes. +* IPLIB address of the output microlib LCM object. +* MY1 number of fissile isotopes including macroscopic sets. +* MY2 number of fission fragment. +* YLDS fission yields. +* IADRY index in YLDS (<0: fission product; >0: fissile isotope). +* +*Parameters: output +* ISTYP type of isotope ISO (=1: stable;=2: fissile; =3: fission +* product). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB + INTEGER IMPX,NBISO,ISO,IBM,MY1,MY2,ISTYP,IADRY(NBISO) + DOUBLE PRECISION YLDS(MY1,MY2) + CHARACTER(LEN=24) HNOMIS(NBISO) +*---- +* LOCAL VARIABLES +*---- + INTEGER I,IY1,IY2,JSO +*---- +* ALLOCATABLE AYYAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IPYMIX + REAL, ALLOCATABLE, DIMENSION(:) :: PYIELD + CHARACTER(LEN=24), ALLOCATABLE, DIMENSION(:) :: HPYNAM +* + IF(IADRY(ISO).GT.0) THEN +* ISO is a fissile isotope + ISTYP=2 + ELSE IF(IADRY(ISO).LT.0) THEN +* ISO is a fission product + ISTYP=3 + IY2=-IADRY(ISO) + IF(IY2.GT.MY2) CALL XABORT('MCRNDF: MY2 OVERFLOW.') + ALLOCATE(HPYNAM(MY1),IPYMIX(MY1),PYIELD(MY1)) + HPYNAM(:MY1)=' ' + IPYMIX(:MY1)=0 + PYIELD(:MY1)=0.0 + IF(IMPX.GT.2) THEN + WRITE(6,'(25H MCRNDF: fission product=,A24,9H mixture=,I8)') + 1 HNOMIS(ISO),IBM + ENDIF + DO JSO=1,NBISO + IF(IADRY(JSO).GT.0) THEN + IY1=IADRY(JSO) + IF(IY1.GT.MY1) CALL XABORT('MCRNDF: MY1 OVERFLOW.') + HPYNAM(IY1)=HNOMIS(JSO) + IPYMIX(IY1)=IBM + PYIELD(IY1)=REAL(YLDS(IY1,IY2)) + IF(IMPX.GT.2) THEN + WRITE(6,'(9X,16Hfissile isotope(,I4,2H)=,A24,9H mixture=, + 1 I8)') IY1,HPYNAM(IY1),IPYMIX(IY1) + ENDIF + ENDIF + ENDDO + CALL LCMPTC(IPLIB,'PYNAM',8,MY1,HPYNAM(:8)) + CALL LCMPUT(IPLIB,'PYMIX',MY1,1,IPYMIX) + CALL LCMPUT(IPLIB,'PYIELD',MY1,2,PYIELD) + IF(IMPX.GT.2) THEN + WRITE(6,'(3X,7HPYIELD=,1P,8E12.4/(8X,10E12.4))') (PYIELD(I), + 1 I=1,MY1) + ENDIF + DEALLOCATE(PYIELD,IPYMIX,HPYNAM) + ENDIF + RETURN + END 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 diff --git a/Donjon/src/MCRSX2.f b/Donjon/src/MCRSX2.f new file mode 100644 index 0000000..b0e9ba9 --- /dev/null +++ b/Donjon/src/MCRSX2.f @@ -0,0 +1,241 @@ +*DECK MCRSX2 + SUBROUTINE MCRSX2(IPMPO,HEDIT,RECNAM,NREA,NGRP,NMGF,NL,ISO, + 1 NOMREA,NOMISO,DEN,FACT,WEIGHT,SPH,FLUXS,IREAB,IREAF,LPURE, + 2 IGYELD,LXS,XS,SIGS,SS2D,TAUXFI,TAUXGF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the cross sections of an elementary calculation and single +* mixture in an MPO file and perform multiparameter interpolation. +* +*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. +* HEDIT name of output group for a (multigroup mesh, output geometry) +* couple (generally equal to 'output_0'). +* RECNAM character identification of calculation. +* NREA number of reactions in the MPO file. +* NGRP number of energy groups. +* NMGF number of macrogroups for the fission yields. +* NL maximum Legendre order (NL=1 is for isotropic scattering). +* ISO isotope index. +* NOMREA names of reactions in the MPO file. +* NOMISO name of isotope ISO. +* DEN number density of isotope. +* FACT number density ratio for the isotope. +* WEIGHT interpolation weight. +* SPH SPH factors. +* FLUXS averaged flux. +* IREAB position of 'Absorption' reaction in NOMREA array. +* IREAF position of 'NuFission' reaction in NOMREA array. +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* IGYELD yield macrogroup limits. +* +*Parameters: input/output +* LXS existence flag of each reaction. +* XS interpolated cross sections per reaction +* SIGS interpolated scattering cross sections +* SS2D interpolated scattering matrix +* TAUXFI interpolated fission rate +* TAUXGF interpolated fission rate in macrogroups +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMPO + CHARACTER(LEN=12) HEDIT + CHARACTER(LEN=80) RECNAM + INTEGER NREA,NGRP,NMGF,NL,ISO,IREAB,IREAF,IGYELD(NMGF) + REAL DEN,FACT,WEIGHT,SPH(NGRP),FLUXS(NGRP),SS2D(NGRP,NGRP,NL), + 1 SIGS(NGRP,NL),XS(NGRP,NREA),TAUXFI,TAUXGF(NMGF) + LOGICAL LXS(NREA),LPURE + CHARACTER NOMREA(NREA)*24,NOMISO*24 +*---- +* LOCAL VARIABLES +*---- + INTEGER IREA,IOF,IL,IGR,JGR,IGRC,IGRDEB,IGRFIN,ADDRZX,ADDRZI, + 1 IPROF,ISOM,JOFS,NISO,NL1,NL2,RANK,TYPE,NBYTE,DIMSR(5) + REAL FLOTT,TAUXF,ZIL,B2 + CHARACTER RECNAM2*80 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDATAP,FAG,ADR,ADDRISO + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: ADDRXS + REAL, ALLOCATABLE, DIMENSION(:) :: RDATAX,DIFF + REAL, ALLOCATABLE, DIMENSION(:,:) :: SIGSB,XSB + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: SS2DB +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(SIGSB(NGRP,NL),SS2DB(NGRP,NGRP,NL),XSB(NGRP,NREA), + 1 FAG(NGRP),ADR(NGRP)) +*---- +* FIND THE ISOTOPE INDEX IN ADDRXS +*---- + WRITE(RECNAM2,'(8H/output/,A,6H/info/)') TRIM(HEDIT) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM2)//"NISO",NISO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM2)//"ADDRXS",ADDRXS) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM2)//"ADDRISO",ADDRISO) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM2)//"TRANSPROFILE",IDATAP) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZI",ADDRZI) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"ADDRZX",ADDRZX) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"CROSSECTION",RDATAX) + ISOM=ISO-ADDRISO(ADDRZI+1) + IF((ISOM.LE.0).OR.(ISOM.GT.NISO)) CALL XABORT('MCRSX2: ADDRXS OV' + 1 //'ERFLOW.') + NL1=ADDRXS(NREA-1,ISOM,ADDRZX+1) + NL2=ADDRXS(NREA,ISOM,ADDRZX+1) + IF((NL1.GT.NL).OR.(NL2.GT.NL)) CALL XABORT('MCRSX2: NL OVERFLOW.') +*---- +* LOOP OVER REACTIONS +*---- + SIGSB(:NGRP,:NL)=0.0 + SS2DB(:NGRP,:NGRP,:NL)=0.0 + XSB(:NGRP,:NREA)=0.0 + DO IREA=1,NREA-2 + IOF=ADDRXS(IREA,ISOM,ADDRZX+1) + IF(IOF.LT.0) CYCLE + LXS(IREA)=.TRUE. + IF(NOMREA(IREA).EQ.'Diffusion') THEN + DO IL=1,NL1 + DO IGR=1,NGRP + FLOTT=RDATAX(IOF+(IL-1)*NGRP+IGR) + SIGSB(IGR,IL)=SIGSB(IGR,IL)+FLOTT + ENDDO + ENDDO + ELSE IF(NOMREA(IREA).EQ.'Scattering') THEN + IPROF=ADDRXS(NREA+1,ISOM,ADDRZX+1) + DO IGR=1,NGRP + FAG(IGR)=IDATAP(IPROF+IGR)+1 + ADR(IGR)=IDATAP(IPROF+NGRP+IGR) + ENDDO + ADR(NGRP+1)=IDATAP(IPROF+1+2*NGRP) + JOFS=0 + DO IL=1,NL2 + ZIL=REAL(2*IL-1) + DO IGR=1,NGRP + DO JGR=FAG(IGR),FAG(IGR)+(ADR(IGR+1)-ADR(IGR))-1 + IF(JGR.GT.NGRP) CALL XABORT('MCRSX2: SS2D OVERFLOW.') + FLOTT=RDATAX(IOF+JOFS+1)/ZIL + SS2DB(JGR,IGR,IL)=SS2DB(JGR,IGR,IL)+FLOTT ! JGR <-- IGR + JOFS=JOFS+1 + ENDDO + ENDDO + ENDDO + ELSE + XSB(:NGRP,IREA)=RDATAX(IOF+1:IOF+NGRP) + ENDIF + ENDDO ! end of loop over reactions + DEALLOCATE(IDATAP,RDATAX,ADDRISO,ADDRXS) + LXS(NREA-1)=.TRUE. +*---- +* RECOVER DIFFUSION COEFFICIENT INFORMATION +*---- + IF(NOMISO.EQ.'TotalResidual_mix') THEN + IF(hdf5_group_exists(IPMPO,TRIM(RECNAM)//"leakage")) THEN + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"leakage/DIFFCOEF",RANK, + 1 TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + LXS(NREA)=.TRUE. + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"leakage/DIFFCOEF", + 1 DIFF) + XSB(:NGRP,NREA)=DIFF(:NGRP)*DEN + DEALLOCATE(DIFF) + GO TO 10 + ENDIF + CALL hdf5_info(IPMPO,TRIM(RECNAM)//"leakage/DB2",RANK,TYPE, + 1 NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + LXS(NREA)=.TRUE. + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"leakage/BUCKLING", + 1 B2) + CALL hdf5_read_data(IPMPO,TRIM(RECNAM)//"leakage/DB2",DIFF) + DO IGR=1,NGRP + XSB(IGR,NREA)=DIFF(IGR)*DEN/B2 + ENDDO + DEALLOCATE(DIFF) + ENDIF + ENDIF + ENDIF +*---- +* COMPUTE FISSION RATE FOR AN ELEMENTARY CALCULATION +*---- + 10 TAUXF=0.0 + TAUXGF(:NMGF)=0.0 + IF(IREAF.GT.0) THEN + DO IGR=1,NGRP + TAUXF=TAUXF+XSB(IGR,IREAF)*FLUXS(IGR) + ENDDO + TAUXFI=TAUXFI+WEIGHT*FACT*TAUXF + IGRFIN=0 + DO IGRC=1,NMGF + IGRDEB=IGRFIN+1 + IGRFIN=IGYELD(IGRC) + DO IGR=IGRDEB,IGRFIN + TAUXGF(IGRC)=TAUXGF(IGRC)+XSB(IGR,IREAF)*FLUXS(IGR) + ENDDO + TAUXGF(:NMGF)=WEIGHT*FACT*TAUXGF(:NMGF) + ENDDO + ENDIF +*---- +* WEIGHT MICROSCOPIC CROSS SECTION DATA IN AN INTERPOLATED MICROLIB +*---- + DO IGR=1,NGRP + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + IF(NOMREA(IREA).EQ.'Total') THEN + XS(IGR,IREA)=XS(IGR,IREA)+FACT*SPH(IGR)*WEIGHT* + 1 (XSB(IGR,IREAB)+SIGSB(IGR,1)) + ELSE IF(LPURE.AND.NOMREA(IREA).EQ.'FissionSpectrum') THEN + XS(IGR,IREA)=XS(IGR,IREA)+WEIGHT*XSB(IGR,IREA) + ELSE IF(NOMREA(IREA).EQ.'FissionSpectrum') THEN + IF(IREAF.EQ.0) CALL XABORT('MCRSX2: IREAF=0.') + XS(IGR,IREA)=XS(IGR,IREA)+WEIGHT*FACT*TAUXF*XSB(IGR,IREA) + ELSE + XS(IGR,IREA)=XS(IGR,IREA)+FACT*SPH(IGR)*WEIGHT*XSB(IGR,IREA) + ENDIF + ENDDO + DO IL=1,NL + IF(MOD(IL,2).EQ.1) THEN + SIGS(IGR,IL)=SIGS(IGR,IL)+FACT*SPH(IGR)*WEIGHT*SIGSB(IGR,IL) + ELSE + DO JGR=1,NGRP + SIGS(IGR,IL)=SIGS(IGR,IL)+FACT*WEIGHT*SS2DB(JGR,IGR,IL) + 1 /SPH(JGR) + ENDDO + ENDIF + ENDDO + DO JGR=1,NGRP + DO IL=1,NL + IF(MOD(IL,2).EQ.1) THEN + SS2D(IGR,JGR,IL)=SS2D(IGR,JGR,IL)+FACT*SPH(JGR)*WEIGHT* + 1 SS2DB(IGR,JGR,IL) + ELSE + SS2D(IGR,JGR,IL)=SS2D(IGR,JGR,IL)+FACT*WEIGHT* + 1 SS2DB(IGR,JGR,IL)/SPH(IGR) + ENDIF + ENDDO + ENDDO + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ADR,FAG,XSB,SS2DB,SIGSB) + RETURN + END 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 diff --git a/Donjon/src/MOVCHK.f b/Donjon/src/MOVCHK.f new file mode 100644 index 0000000..cc7d274 --- /dev/null +++ b/Donjon/src/MOVCHK.f @@ -0,0 +1,137 @@ +*DECK MOVCHK + SUBROUTINE MOVCHK(IMPX,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute and set the new rod position and insertion level for the +* fading or moving rod. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki and A. Hebert +* +*Parameters: input +* IMPX printing index (=0 for no print). +* IMODE type of displacement: =1 for FADE; =2 for MOVE (DONJON3-type +* movement). +* NPART number of parts in the control rod. +* IAXIS axis of rod movement: =1 for X; =2 for Y; =3 for Z. +* ITOP rod insertion: = +1 from the top; = -1 from the bottom. +* DELH rod displacement along the IAXIS of movement if FADE; position +* of moving end in core if MOVE. +* LENG fully-inserted complete rod position. +* RODPOS fully inserted rod position. +* +*Parameters: output +* RODPOS new rod position. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IMPX,IMODE,NPART,IAXIS,ITOP + REAL DELH,RODPOS(6,NPART),LENG(2),LIMINF +* + PARAMETER(IOUT=6) +*---- +* X-AXIS MOVEMENT +*---- + IF(IMPX.GT.1) WRITE(IOUT,1000) DELH + SUP=DELH + DO 10 IPART=1,NPART + IF(IAXIS.EQ.1) THEN + IF((ITOP.EQ.1).AND.(IMODE.EQ.1)) THEN + RODPOS(1,IPART)=MAX(RODPOS(1,IPART),LENG(2)-DELH) + RODPOS(1,IPART)=MIN(RODPOS(1,IPART),RODPOS(2,IPART)) + ELSE IF((ITOP.EQ.-1).AND.(IMODE.EQ.1)) THEN + RODPOS(2,IPART)=MIN(RODPOS(2,IPART),LENG(1)+DELH) + RODPOS(2,IPART)=MAX(RODPOS(1,IPART),RODPOS(2,IPART)) + ELSE IF((ITOP.EQ.1).AND.(IMODE.EQ.2)) THEN + DELTA=RODPOS(2,IPART)-RODPOS(1,IPART) + RODPOS(1,IPART)=SUP + RODPOS(2,IPART)=SUP+DELTA + SUP=RODPOS(2,IPART) + ELSE IF((ITOP.EQ.-1).AND.(IMODE.EQ.2)) THEN + DELTA=RODPOS(2,IPART)-RODPOS(1,IPART) + RODPOS(2,IPART)=SUP + RODPOS(1,IPART)=SUP-DELTA + SUP=RODPOS(1,IPART) + ENDIF +*---- +* Y-AXIS MOVEMENT +*---- + ELSE IF(IAXIS.EQ.2) THEN + IF((ITOP.EQ.1).AND.(IMODE.EQ.1)) THEN + RODPOS(3,IPART)=MAX(RODPOS(3,IPART),LENG(2)-DELH) + RODPOS(3,IPART)=MIN(RODPOS(3,IPART),RODPOS(4,IPART)) + ELSE IF((ITOP.EQ.-1).AND.(IMODE.EQ.1)) THEN + RODPOS(4,IPART)=MIN(RODPOS(4,IPART),LENG(1)+DELH) + RODPOS(4,IPART)=MAX(RODPOS(3,IPART),RODPOS(4,IPART)) + ELSE IF((ITOP.EQ.1).AND.(IMODE.EQ.2)) THEN + DELTA=RODPOS(4,IPART)-RODPOS(3,IPART) + RODPOS(3,IPART)=SUP + RODPOS(4,IPART)=SUP+DELTA + SUP=RODPOS(4,IPART) + ELSE IF((ITOP.EQ.-1).AND.(IMODE.EQ.2)) THEN + DELTA=RODPOS(4,IPART)-RODPOS(3,IPART) + RODPOS(4,IPART)=SUP + RODPOS(3,IPART)=SUP-DELTA + SUP=RODPOS(3,IPART) + ENDIF +*---- +* Z-AXIS MOVEMENT +*---- + ELSE IF(IAXIS.EQ.3) THEN + IF((ITOP.EQ.1).AND.(IMODE.EQ.1)) THEN + RODPOS(5,IPART)=MAX(RODPOS(5,IPART),LENG(2)-DELH) + RODPOS(5,IPART)=MIN(RODPOS(5,IPART),RODPOS(6,IPART)) + ELSE IF((ITOP.EQ.-1).AND.(IMODE.EQ.1)) THEN + RODPOS(6,IPART)=MIN(RODPOS(6,IPART),LENG(1)+DELH) + RODPOS(6,IPART)=MAX(RODPOS(5,IPART),RODPOS(6,IPART)) + ELSE IF((ITOP.EQ.1).AND.(IMODE.EQ.2)) THEN + DELTA=RODPOS(6,IPART)-RODPOS(5,IPART) + RODPOS(5,IPART)=SUP + RODPOS(6,IPART)=SUP+DELTA + SUP=RODPOS(6,IPART) + ELSE IF((ITOP.EQ.-1).AND.(IMODE.EQ.2)) THEN + DELTA=RODPOS(6,IPART)-RODPOS(5,IPART) + RODPOS(6,IPART)=SUP + RODPOS(5,IPART)=SUP-DELTA + SUP=RODPOS(5,IPART) + ENDIF + ENDIF +*---- +* PRINT NEW POSITION +*---- + IF(IMPX.GT.1) THEN + WRITE(IOUT,1001) IPART,RODPOS(1,IPART),RODPOS(3,IPART), + 1 RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART), + 2 RODPOS(6,IPART) + ENDIF + 10 CONTINUE +*---- +* CONSISTENCY CHECK +*---- + LIMINF=0 + IF(IMODE.EQ.2) THEN + IF(ITOP.EQ.-1) THEN + LIMINF=DELH-(LENG(2)-LENG(1)) + ELSE IF(ITOP.EQ.1) THEN + LIMINF=DELH+(LENG(2)-LENG(1)) + ENDIF + IF(ABS(SUP-LIMINF).GT.1.E-3) CALL XABORT('@MOVCHK: WRONG LENG' + 1 //'TH OF ADJUSTER') + ENDIF + RETURN +* + 1000 FORMAT(/5X,'MOVCHK: MOVE A ROD BY',F10.4) + 1001 FORMAT( + 1 /5X,'MOVCHK: PART =',I5/ + 2 5X,'NEW ROD POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + END diff --git a/Donjon/src/MOVDEV.f b/Donjon/src/MOVDEV.f new file mode 100644 index 0000000..ba36253 --- /dev/null +++ b/Donjon/src/MOVDEV.f @@ -0,0 +1,145 @@ +*DECK MOVDEV + SUBROUTINE MOVDEV(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Simulate the time-dependent displacement of individual devices +* and/or of groups of devices in the reactor core. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The MOVDEV: module specification is: +* DEVICE := MOVDEV: DEVICE :: (descmove) ; +* where +* DEVICE : name of the \emph{device} object that will be modified by the +* module. The rods positions are updated according to the current time step +* of movement. +* (descmove) : structure describing the input data to the MOVDEV: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER TEXT*12,HSIGN*12 + INTEGER ISTATE(NSTATE),DGRP + DOUBLE PRECISION DFLOT +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.GT.1)CALL XABORT('@MOVDEV: ONE PARAMETER EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@MOV' + 1 //'DEV: LCM OBJECT EXPECTED AT LHS.') + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_DEVICE')THEN + TEXT=HENTRY(1) + CALL XABORT('@MOVDEV: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_DEVICE EXPECTED.') + ENDIF + IF(JENTRY(1).NE.1)CALL XABORT('@MOVDEV: MODIFICATION MODE EX' + 1 //'PECTED FOR L_DEVICE.') +* + CALL LCMGET(KENTRY(1),'STATE-VECTOR',ISTATE) + IGEO=ISTATE(1) + IF(IGEO.NE.7)CALL XABORT('@MOVDEV: ONLY 3D-CARTESIAN GEOMETR' + 1 //'Y ALLOWED.') + NDEV=ISTATE(2) + DGRP=ISTATE(3) + IMODE=ISTATE(6) + IF(IMODE.EQ.0)CALL XABORT('@MOVDEV: IMODE NOT SET.') +*---- +* RECOVER INFORMATION +*---- + IMPX=1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@MOVDEV: CHARACTER DATA EXPECTED.') + IF(TEXT.NE.'EDIT')GOTO 10 +* PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@MOVDEV: INTEGER FOR EDIT EXPECTED.') +* TIME STEP INCREMENT + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + 10 IF(TEXT.NE.'DELT')CALL XABORT('@MOVDEV: KEYWORD DELT EXPECTED.') + CALL REDGET(ITYP,NITMA,DELT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVDEV: REAL FOR DELT EXPECTED.') + IF(DELT.LE.0.)CALL XABORT('@MOVDEV: VALUE OF DELT SHOULD B' + 1 //'E POSITIVE.') + ND=0 + NG=0 + 20 ND=ND+1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'ROD')THEN +*---- +* ROD OPTION +*---- + CALL REDGET(ITYP,ID,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@MOVDEV: INTEGER ROD-ID NUMB' + 1 //'ER EXPECTED.') + IF((ID.GT.NDEV).OR.(ID.EQ.0))THEN + WRITE(IOUT,*)'@MOVDEV: READ CURRENT ROD-ID #',ID + CALL XABORT('@MOVDEV: WRONG ROD-ID NUMBER.') + ENDIF + IF(IMPX.GT.0)WRITE(IOUT,1000)ID + CALL MOVPOS(KENTRY(1),IMODE,ID,DELT,IMPX) + ELSEIF(TEXT.EQ.'GROUP')THEN +*---- +* GROUP OPTION +*---- + CALL REDGET(ITYP,IGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@MOVDEV: INTEGER GROUP-ID NUM' + 1 //'BER EXPECTED.') + IF((IGRP.GT.DGRP).OR.(IGRP.EQ.0))THEN + WRITE(IOUT,*)'@MOVDEV: READ CURRENT GROUP-ID #',IGRP + CALL XABORT('@MOVDEV: WRONG GROUP-ID NUMBER.') + ENDIF + IF(IMPX.GT.0)WRITE(IOUT,1001)IGRP + CALL MOVGRP(KENTRY(1),IMODE,IGRP,NDGR,DELT,IMPX) + ND=ND+NDGR-1 + NG=NG+1 +* + ELSEIF(TEXT.EQ.';')THEN + GOTO 30 + ELSE + WRITE(IOUT,*)'@MOVDEV: WRONG KEYWORD : ',TEXT + CALL XABORT('@MOVDEV: KEYWORD ROD OR GROUP EXPECTED.') + ENDIF + GOTO 20 + 30 IF(IMPX.GT.0)WRITE(IOUT,1002)NG,ND-1 + IF(IMPX.GT.4)CALL LCMLIB(KENTRY(1)) + RETURN +* + 1000 FORMAT(/5X,'MOVING ROD #',I3.3) + 1001 FORMAT(/5X,'MOVING GROUP #',I2.2) + 1002 FORMAT( + 1 /5X,'-------------------------------------'/ + 2 5X,'TOTAL NUMBER OF DISPLACED GROUPS : ',I2/ + 3 5X,'TOTAL NUMBER OF DISPLACED RODS : ',I3/) + END diff --git a/Donjon/src/MOVGRP.f b/Donjon/src/MOVGRP.f new file mode 100644 index 0000000..2722369 --- /dev/null +++ b/Donjon/src/MOVGRP.f @@ -0,0 +1,194 @@ +*DECK MOVGRP + SUBROUTINE MOVGRP(IPDEV,IMODE,IGRP,NDGR,DELT,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Move a group of rod-devices to a new position in the reactor core. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPDEV pointer to device information. +* IMODE type of displacement: =1 for FADE; =2 for MOVE (DONJON3-type +* movement). +* IGRP current group number. +* DELT time step increment. +* IMPX printing index (=0 for no print). +* +*Parameters: output +* NDGR number of rods in the current group. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDEV + INTEGER IMODE,IGRP,NDGR,IMPX + REAL DELT +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6,MAXPRT=10) + REAL MAXPOS(6,MAXPRT),RODPOS(6,MAXPRT),LENG(2),LVOLD,LVNEW, + 1 LIMIT(6) + CHARACTER TEXT*12 + DOUBLE PRECISION DFLOT + TYPE(C_PTR) JPDEV,KPDEV + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDEV +*---- +* READ MOVEMENT DIRECTION +*---- + MOVE=0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'INSR')THEN + MOVE=1 + ELSEIF(TEXT.EQ.'EXTR')THEN + MOVE=-1 + ELSE + CALL XABORT('@MOVGRP: KEYWORD INSR OR EXTR EXPECTED.') + ENDIF +*---- +* READ MOVEMENT OPTION +*---- + LVNEW=0. + IOPT=0 + DELHIN=0.0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'SPEED') THEN + CALL REDGET(ITYP,NITMA,SPEED,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVGRP: REAL FOR SPEED EXPECTED.') + IF(SPEED.LE.0.)CALL XABORT('@MOVGRP: SPEED VALUE MUST BE > 0.') + IOPT=1 + ELSEIF(TEXT.EQ.'DELH') THEN + CALL REDGET(ITYP,NITMA,DELHIN,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVGRP: REAL FOR DELH EXPECTED.') + IF(DELHIN.LE.0.)CALL XABORT('@MOVGRP: DELH VALUE MUST BE > 0.') + IOPT=2 + ELSEIF(TEXT.EQ.'LEVEL') THEN + CALL REDGET(ITYP,NITMA,LVNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVGRP: REAL FOR LEVEL EXPECTED.') + IF(LVNEW.GT.1.)CALL XABORT('@MOVGRP: WRONG LEVEL VALUE > 1.') + IF(LVNEW.LT.0.)CALL XABORT('@MOVGRP: WRONG LEVEL VALUE < 0.') + IOPT=3 + ELSE + WRITE(IOUT,*)'@MOVGRP: WRONG KEYWORD : ',TEXT + CALL XABORT('@MOVGRP: ROD MOVEMENT OPTION EXPECTED.') + ENDIF +*---- +* RECOVER GROUP INFORMATION +*---- + JPDEV=LCMGID(IPDEV,'ROD_GROUP') + KPDEV=LCMGIL(JPDEV,IGRP) +* GROUP DATA + CALL LCMGET(KPDEV,'NUM-ROD',NDGR) + ALLOCATE(IDEV(NDGR)) + IDEV(:NDGR)=0 + CALL LCMGET(KPDEV,'ROD-ID',IDEV) +*---- +* MOVE ROD-DEVICES +*---- + DO I=1,NDGR + ID=IDEV(I) +* ROD PARAMETERS + JPDEV=LCMGID(IPDEV,'DEV_ROD') + KPDEV=LCMGIL(JPDEV,ID) + CALL LCMGET(KPDEV,'ROD-PARTS',NPART) + IF(NPART.GT.MAXPRT) CALL XABORT('MOVGRP: MAXPRT OVERFLOW.') + CALL LCMGET(KPDEV,'MAX-POS',MAXPOS) + CALL LCMLEN(KPDEV,'ROD-POS',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('MOVGRP: UNDEFINED ROD POSITION.') + CALL LCMGET(KPDEV,'ROD-POS',RODPOS) + CALL LCMGET(KPDEV,'LENGTH',LENG) + CALL LCMGET(KPDEV,'LEVEL',LVOLD) + CALL LCMGET(KPDEV,'AXIS',IAXIS) + CALL LCMGET(KPDEV,'FROM',ITOP) +* PRINT OLD PARAMETERS + IF(IMPX.GT.1) WRITE(IOUT,1000) ID + IF(IMPX.GT.2) THEN + WRITE(IOUT,1001) LVOLD + DO 10 IPART=1,NPART + WRITE(IOUT,1002) IPART,RODPOS(1,IPART),RODPOS(3,IPART), + 1 RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART), + 2 RODPOS(6,IPART) + 10 CONTINUE + ENDIF +* UPDATE POSITION + IF(IMODE.EQ.1) THEN +* FADING ROD + DELH0=LVOLD*(LENG(2)-LENG(1)) + IF(IOPT.EQ.1)THEN + DELH=MIN(DELH0+MOVE*SPEED*DELT,LENG(2)-LENG(1)) + ELSE IF(IOPT.EQ.2)THEN + DELH=MIN(DELH0+MOVE*DELHIN,LENG(2)-LENG(1)) + ELSE IF(IOPT.EQ.3)THEN + DELH=LVNEW*(LENG(2)-LENG(1)) + ENDIF + LVNEW=DELH/(LENG(2)-LENG(1)) + ELSE IF(IMODE.EQ.2) THEN +* MOVING ROD + CALL LCMGET(IPDEV,'CORE-LIMITS',LIMIT) + IF(ITOP.EQ.-1) THEN + DELH0=LVOLD*(LENG(2)-LIMIT(1))+LIMIT(1) + IF(IOPT.EQ.1)THEN + DELH=DELH0+MOVE*SPEED*DELT + ELSE IF(IOPT.EQ.2)THEN + DELH=DELH0+MOVE*DELHIN + ELSE IF(IOPT.EQ.3)THEN + DELH=LVNEW*(LENG(2)-LIMIT(1))+LIMIT(1) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + LVNEW=(DELH-LIMIT(1))/(LENG(2)-LIMIT(1)) + ELSE IF(ITOP.EQ.1) THEN + DELH0=LIMIT(2)-LVOLD*(LIMIT(2)-LENG(1)) + IF(IOPT.EQ.1)THEN + DELH=DELH0-MOVE*SPEED*DELT + ELSE IF(IOPT.EQ.2)THEN + DELH=DELH0-MOVE*DELHIN + ELSE IF(IOPT.EQ.3)THEN + DELH=LIMIT(2)-LVNEW*(LIMIT(2)-LENG(1)) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + LVNEW=(LIMIT(2)-DELH)/(LIMIT(2)-LENG(1)) + ENDIF + IF(IMPX.GT.3) THEN + WRITE(IOUT,*) ' ADJ ',NXSEQ,' LEVEL ',LVNEW*100., + 1 '% OF INSERTION' + WRITE(IOUT,*) ' NEW POSITION (L_sup)= ',DELH + ENDIF + ENDIF + IF((LVNEW.LT.0.0).OR.(LVNEW.GT.1.0)) THEN + WRITE(IOUT,'(/25H @MOVGRP: MOVE FROM DELH=,F8.3,3H TO,F8.3)') + 1 DELH0,DELH + CALL XABORT('@MOVGRP: INVALID NEW VALUE OF LEVEL.') + ENDIF +* SET NEW POSITION + CALL LCMGET(KPDEV,'MAX-POS',RODPOS) + CALL MOVCHK(IMPX,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS) +* STORE NEW PARAMETERS + CALL LCMPUT(KPDEV,'ROD-POS',6,2,RODPOS) + CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW) +* PRINT UPDATED LEVEL + IF(IMPX.GT.1) WRITE(IOUT,1003) LVNEW +* PROCEED NEXT ROD + ENDDO + DEALLOCATE(IDEV) + RETURN +* + 1000 FORMAT(/5X,' MOVGRP: => MOVING ROD #',I3.3) + 1001 FORMAT( + 1 /5X,'MOVGRP:PREVIOUS INSERTION LEVEL =',F8.4) + 1002 FORMAT( + 1 /5X,'MOVGRP:PART =',I5/ + 2 5X,'PREVIOUS ROD POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1003 FORMAT( + 1 /5X,'MOVGRP:NEW INSERTION LEVEL =',F8.4) + END diff --git a/Donjon/src/MOVPOS.f b/Donjon/src/MOVPOS.f new file mode 100644 index 0000000..5c15d6d --- /dev/null +++ b/Donjon/src/MOVPOS.f @@ -0,0 +1,174 @@ +*DECK MOVPOS + SUBROUTINE MOVPOS(IPDEV,IMODE,ID,DELT,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read the movement option and displace an individual rod to a new +* position in the reactor core. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPDEV pointer to device information. +* IMODE type of displacement: =1 for FADE; =2 for MOVE (DONJON3-type +* movement). +* ID current rod identification number. +* DELT time step increment. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPDEV + INTEGER IMODE,ID,IMPX + REAL DELT +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6,MAXPRT=10) + REAL MAXPOS(6,MAXPRT),RODPOS(6,MAXPRT),LENG(2),LVOLD,LVNEW, + 1 LIMIT(6) + CHARACTER TEXT*12 + DOUBLE PRECISION DFLOT + TYPE(C_PTR) JPDEV,KPDEV +*---- +* RECOVER INFORMATION +*---- + JPDEV=LCMGID(IPDEV,'DEV_ROD') + KPDEV=LCMGIL(JPDEV,ID) +* ROD PARAMETERS + CALL LCMGET(KPDEV,'ROD-PARTS',NPART) + IF(NPART.GT.MAXPRT) CALL XABORT('MOVPOS: MAXPRT OVERFLOW.') + CALL LCMGET(KPDEV,'MAX-POS',MAXPOS) + CALL LCMLEN(KPDEV,'ROD-POS',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('MOVPOS: UNDEFINED ROD POSITION.') + CALL LCMGET(KPDEV,'ROD-POS',RODPOS) + CALL LCMGET(KPDEV,'LENGTH',LENG) + CALL LCMGET(KPDEV,'LEVEL',LVOLD) + CALL LCMGET(KPDEV,'AXIS',IAXIS) + CALL LCMGET(KPDEV,'FROM',ITOP) +*---- +* READ MOVEMENT DIRECTION +*---- + MOVE=0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'INSR')THEN + MOVE=1 + ELSEIF(TEXT.EQ.'EXTR')THEN + MOVE=-1 + ELSE + CALL XABORT('@MOVPOS: KEYWORD INSR OR EXTR EXPECTED.') + ENDIF +*---- +* READ MOVEMENT OPTION +*---- + LVNEW=0. + IOPT=0 + DELHIN=0.0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'SPEED') THEN + CALL REDGET(ITYP,NITMA,SPEED,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVPOS: REAL FOR SPEED EXPECTED.') + IF(SPEED.LE.0.)CALL XABORT('@MOVPOS: SPEED VALUE MUST BE > 0.') + IOPT=1 + ELSEIF(TEXT.EQ.'DELH') THEN + CALL REDGET(ITYP,NITMA,DELHIN,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVPOS: REAL FOR DELH EXPECTED.') + IF(DELHIN.LE.0.)CALL XABORT('@MOVPOS: DELH VALUE MUST BE > 0.') + IOPT=2 + ELSEIF(TEXT.EQ.'LEVEL') THEN + CALL REDGET(ITYP,NITMA,LVNEW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@MOVPOS: REAL FOR LEVEL EXPECTED.') + IF(LVNEW.GT.1.)CALL XABORT('@MOVPOS: WRONG LEVEL VALUE > 1.') + IF(LVNEW.LT.0.)CALL XABORT('@MOVPOS: WRONG LEVEL VALUE < 0.') + IOPT=3 + ELSE + WRITE(IOUT,*)'@MOVPOS: WRONG KEYWORD ',TEXT + CALL XABORT('@MOVPOS: ROD MOVEMENT OPTION EXPECTED.') + ENDIF +*---- +* NEW ROD POSITION +*---- + IF(IMODE.EQ.1) THEN + DELH0=LVOLD*(LENG(2)-LENG(1)) + IF(IOPT.EQ.1)THEN + DELH=MIN(DELH0+MOVE*SPEED*DELT,LENG(2)-LENG(1)) + ELSE IF(IOPT.EQ.2)THEN + DELH=MIN(DELH0+MOVE*DELHIN,LENG(2)-LENG(1)) + ELSE IF(IOPT.EQ.3)THEN + DELH=LVNEW*(LENG(2)-LENG(1)) + ENDIF + LVNEW=DELH/(LENG(2)-LENG(1)) + ELSE IF(IMODE.EQ.2) THEN + CALL LCMGET(IPDEV,'CORE-LIMITS',LIMIT) + IF(ITOP.EQ.-1) THEN + DELH0=LVOLD*(LENG(2)-LIMIT(1))+LIMIT(1) + IF(IOPT.EQ.1)THEN + DELH=DELH0+MOVE*SPEED*DELT + ELSE IF(IOPT.EQ.2)THEN + DELH=DELH0+MOVE*DELHIN + ELSE IF(IOPT.EQ.3)THEN + DELH=LVNEW*(LENG(2)-LIMIT(1))+LIMIT(1) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + LVNEW=(DELH-LIMIT(1))/(LENG(2)-LIMIT(1)) + ELSE IF(ITOP.EQ.1) THEN + DELH0=LIMIT(2)-LVOLD*(LIMIT(2)-LENG(1)) + IF(IOPT.EQ.1)THEN + DELH=DELH0-MOVE*SPEED*DELT + ELSE IF(IOPT.EQ.2)THEN + DELH=DELH0-MOVE*DELHIN + ELSE IF(IOPT.EQ.3)THEN + DELH=LIMIT(2)-LVNEW*(LIMIT(2)-LENG(1)) + ENDIF + DELH=MIN(LIMIT(2),MAX(LIMIT(1),DELH)) + LVNEW=(LIMIT(2)-DELH)/(LIMIT(2)-LENG(1)) + ENDIF + IF(IMPX.GT.3) THEN + WRITE(IOUT,*) ' ADJ ',NXSEQ,' LEVEL ',LVNEW*100., + 1 '% OF INSERTION' + WRITE(IOUT,*) ' NEW POSITION (L_sup)= ',DELH + ENDIF + ENDIF + IF((LVNEW.LT.0.0).OR.(LVNEW.GT.1.0)) THEN + WRITE(IOUT,'(/25H @MOVPOS: MOVE FROM DELH=,F8.3,3H TO,F8.3)') + 1 DELH0,DELH + CALL XABORT('@MOVPOS: INVALID NEW VALUE OF LEVEL.') + ENDIF +* PRINT OLD PARAMETERS + IF(IMPX.GT.2) THEN + WRITE(IOUT,1001) LVOLD + DO 10 IPART=1,NPART + WRITE(IOUT,1002) IPART,RODPOS(1,IPART),RODPOS(3,IPART), + 1 RODPOS(5,IPART),RODPOS(2,IPART),RODPOS(4,IPART), + 2 RODPOS(6,IPART) + 10 CONTINUE + ENDIF +* SET NEW POSITION + CALL LCMGET(KPDEV,'MAX-POS',RODPOS) + CALL MOVCHK(IMPX,IMODE,NPART,IAXIS,ITOP,DELH,LENG,RODPOS) +* STORE NEW PARAMETERS + CALL LCMPUT(KPDEV,'ROD-POS',6,2,RODPOS) + CALL LCMPUT(KPDEV,'LEVEL',1,2,LVNEW) +* PRINT UPDATED LEVEL + IF(IMPX.GT.1) WRITE(IOUT,1003) LVNEW + RETURN +* + 1001 FORMAT( + 1 /5X,'MOVPOS: PREVIOUS INSERTION LEVEL =',F8.4) + 1002 FORMAT( + 1 /5X,'MOVPOS: PART =',I5/ + 2 5X,'PREVIOUS ROD POSITION :'/ + 3 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/ + 4 5X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1003 FORMAT( + 1 /5X,'MOVPOS: NEW INSERTION LEVEL =',F8.4) + END diff --git a/Donjon/src/Makefile b/Donjon/src/Makefile new file mode 100644 index 0000000..f236c5e --- /dev/null +++ b/Donjon/src/Makefile @@ -0,0 +1,241 @@ +#--------------------------------------------------------------------------- +# +# Makefile for building the Donjon library and load module +# Author : A. Hebert (2018-5-10) +# +#--------------------------------------------------------------------------- +# +ARCH = $(shell uname -m) +ifneq (,$(filter $(ARCH),aarch64 arm64)) + nbit = +else + ifneq (,$(filter $(ARCH),i386 i686)) + nbit = -m32 + else + nbit = -m64 + endif +endif + +DIRNAME = $(shell uname -sm | sed 's/[ ]/_/') +OS = $(shell uname -s | cut -d"_" -f1) +opt = -O -g +PREPRO = cpp +ifeq ($(openmp),1) + COMP = -fopenmp + PREPRO = cpp -D_OPENMP +else + COMP = +endif + +ifeq ($(intel),1) + fcompiler = ifort + ccompiler = icc +else + ifeq ($(nvidia),1) + fcompiler = nvfortran + ccompiler = nvc + else + ifeq ($(llvm),1) + fcompiler = flang-new + ccompiler = clang + else + fcompiler = gfortran + ccompiler = gcc + endif + endif +endif + +ifeq ($(OS),AIX) + python_version_major := 2 +else + python_version_full := $(wordlist 2,4,$(subst ., ,$(shell python --version 2>&1))) + python_version_major := $(word 1,${python_version_full}) + ifneq ($(python_version_major),2) + python_version_major := 3 + endif +endif + +ifeq ($(OS),Darwin) + ifeq ($(openmp),1) + ccompiler = gcc-14 + endif + F90 = $(fcompiler) + C = $(ccompiler) + FLAGS = -DLinux -DUnix + CFLAGS = -Wall $(nbit) -fPIC + FFLAGS = $(nbit) -fPIC + FFLAG77 = $(nbit) -fPIC + LFLAGS = $(nbit) +else +ifeq ($(OS),Linux) + F90 = $(fcompiler) + C = $(ccompiler) + FLAGS = -DLinux -DUnix + CFLAGS = -Wall $(nbit) -fPIC + FFLAGS = $(nbit) -fPIC + FFLAG77 = $(nbit) -fPIC + LFLAGS = $(nbit) +else +ifeq ($(OS),CYGWIN) + F90 = $(fcompiler) + C = $(ccompiler) + FLAGS = -DLinux -DUnix + CFLAGS = -Wall $(nbit) -fPIC + FFLAGS = $(nbit) -fPIC + FFLAG77 = $(nbit) -fPIC + LFLAGS = $(nbit) +else +ifeq ($(OS),SunOS) + fcompiler = + MAKE = gmake + F90 = f90 + C = cc + PREPRO = /usr/lib/cpp + FLAGS = -DSunOS -DUnix + CFLAGS = $(nbit) + FFLAGS = $(nbit) -s -ftrap=%none + FFLAG77 = $(nbit) -s -ftrap=%none + LFLAGS = $(nbit) +else +ifeq ($(OS),AIX) + fcompiler = + opt = -O4 + MAKE = gmake + DIRNAME = AIX + F90 = xlf90 + C = cc + FLAGS = -DAIX -DUnix + CFLAGS = -qstrict + FFLAGS = -qstrict -qmaxmem=-1 -qsuffix=f=f90 + FFLAG77 = -qstrict -qmaxmem=-1 -qxlf77=leadzero -qfixed + LFLAGS = -qstrict -bmaxdata:0x80000000 -qipa +else + $(error $(OS) is not a valid OS) +endif +endif +endif +endif +endif +ifeq ($(fcompiler),gfortran) + ifneq (,$(filter $(ARCH),i386 i686 x86_64)) + summary = + else + summary = -ffpe-summary=none + endif + ifeq ($(OS),Darwin) + summary = -ffpe-summary=none + endif + FFLAGS += -Wall $(summary) + FFLAG77 += -Wall -frecord-marker=4 $(summary) +endif + +ifeq ($(intel),1) + FFLAGS = -fPIC + FFLAG77 = -fPIC + lib = ../lib/$(DIRNAME)_intel + libUtl = ../../Utilib/lib/$(DIRNAME)_intel + libGan = ../../Ganlib/lib/$(DIRNAME)_intel + libTri = ../../Trivac/lib/$(DIRNAME)_intel + libDra = ../../Dragon/lib/$(DIRNAME)_intel + bin = ../bin/$(DIRNAME)_intel + lib_module = ../lib/$(DIRNAME)_intel/modules + INCLUDE = -I../../Ganlib/lib/$(DIRNAME)_intel/modules/ -I../../Utilib/lib/$(DIRNAME)_intel/modules/ +else + ifeq ($(nvidia),1) + lib = ../lib/$(DIRNAME)_nvidia + libUtl = ../../Utilib/lib/$(DIRNAME)_nvidia + libGan = ../../Ganlib/lib/$(DIRNAME)_nvidia + libTri = ../../Trivac/lib/$(DIRNAME)_nvidia + libDra = ../../Dragon/lib/$(DIRNAME)_nvidia + bin = ../bin/$(DIRNAME)_nvidia + lib_module = ../lib/$(DIRNAME)_nvidia/modules + INCLUDE = -I../../Ganlib/lib/$(DIRNAME)_nvidia/modules/ -I../../Utilib/lib/$(DIRNAME)_nvidia/modules/ + else + ifeq ($(llvm),1) + lib = ../lib/$(DIRNAME)_llvm + libUtl = ../../Utilib/lib/$(DIRNAME)_llvm + libGan = ../../Ganlib/lib/$(DIRNAME)_llvm + libTri = ../../Trivac/lib/$(DIRNAME)_llvm + libDra = ../../Dragon/lib/$(DIRNAME)_llvm + bin = ../bin/$(DIRNAME)_llvm + lib_module = ../lib/$(DIRNAME)_llvm/modules + INCLUDE = -I../../Ganlib/lib/$(DIRNAME)_llvm/modules/ -I../../Utilib/lib/$(DIRNAME)_llvm/modules/ + FFLAGS += -mmlir -fdynamic-heap-array + LFLAGS += -lclang_rt.osx + else + lib = ../lib/$(DIRNAME) + libUtl = ../../Utilib/lib/$(DIRNAME) + libGan = ../../Ganlib/lib/$(DIRNAME) + libTri = ../../Trivac/lib/$(DIRNAME) + libDra = ../../Dragon/lib/$(DIRNAME) + bin = ../bin/$(DIRNAME) + lib_module = ../lib/$(DIRNAME)/modules + INCLUDE = -I../../Ganlib/lib/$(DIRNAME)/modules/ -I../../Utilib/lib/$(DIRNAME)/modules/ + endif + endif +endif + +ifeq ($(hdf5),1) + FLAGS += -DHDF5_LIB -I${HDF5_INC} + FFLAGS += -I${HDF5_INC} + LFLAGS += -L${HDF5_API} -lhdf5 +endif + +SRCC = $(shell ls *.c) +SRC77 = $(shell ls *.f) +SRCF77 = $(shell ls *.F) +ifeq ($(python_version_major),2) + SRC90 = $(shell python ../../script/make_depend.py *.f90) +else + SRC90 = $(shell python3 ../../script/make_depend_py3.py *.f90) +endif +OBJC = $(SRCC:.c=.o) +OBJ90 = $(SRC90:.f90=.o) +OBJ77 = $(SRC77:.f=.o) +OBJF77 = $(SRCF77:.F=.o) +all : sub-make Donjon +ifeq ($(openmp),1) + @echo 'Donjon: openmp is defined' +endif +ifeq ($(intel),1) + @echo 'Donjon: intel is defined' +endif +ifeq ($(nvidia),1) + @echo 'Donjon: nvidia is defined' +endif +ifeq ($(llvm),1) + @echo 'Donjon: llvm is defined' +endif +ifeq ($(hdf5),1) + @echo 'Donjon: hdf5 is defined' +endif +sub-make: + $(MAKE) openmp=$(openmp) intel=$(intel) nvidia=$(nvidia) llvm=$(llvm) hdf5=$(hdf5) -C ../../Dragon/src +%.o : %.c + $(C) $(CFLAGS) $(opt) $(COMP) -c $< -o $@ +%.o : %.f90 + $(F90) $(FFLAGS) $(opt) $(COMP) $(INCLUDE) -c $< -o $@ +%.o : %.f + @/bin/rm -f temp.f + $(F90) $(FFLAG77) $(opt) $(COMP) $(INCLUDE) -c $< -o $@ +%.o : %.F + $(PREPRO) -P -W -traditional $(FLAGS) $< temp.f + $(F90) $(FFLAG77) $(opt) $(COMP) $(INCLUDE) -c temp.f -o $@ + /bin/rm temp.f +$(lib_module)/: + mkdir -p $(lib_module)/ +$(lib)/: $(lib_module)/ + mkdir -p $(lib)/ +libDonjon.a: $(OBJC) $(OBJ90) $(OBJ77) $(OBJF77) $(lib)/ + ar r $@ $(OBJC) $(OBJ90) $(OBJ77) $(OBJF77) + cp $@ $(lib)/$@ + cp *.mod $(lib_module) +$(bin)/: + mkdir -p $(bin)/ +Donjon: libDonjon.a DONJON.o $(bin)/ sub-make + $(F90) $(opt) $(COMP) DONJON.o $(lib)/libDonjon.a $(libDra)/libDragon.a \ + $(libTri)/libTrivac.a $(libUtl)/libUtilib.a $(libGan)/libGanlib.a $(LFLAGS) -o Donjon + cp $@ $(bin)/$@ +clean: + $(MAKE) -C ../../Dragon/src clean + /bin/rm -f *.o *.mod *.a sub-make temp.* Donjon diff --git a/Donjon/src/NAP.f b/Donjon/src/NAP.f new file mode 100644 index 0000000..5f0c48b --- /dev/null +++ b/Donjon/src/NAP.f @@ -0,0 +1,206 @@ +*DECK NAP
+ SUBROUTINE NAP(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* - Construct an 'enriched' multicompo with additional information
+* needed by Pin Power Reconstruction.
+* - Performed the Pin Power Reconstruction
+* - Split geometry from homogeneous to heterogeneous assemblies
+* Note : this function is also called directly from the RESINI: module
+*
+*Copyright:
+* Copyright (C) 2014 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* R. Chambon
+*
+*Parameters: input
+* NENTRY number of data structures transfered to this module.
+* HENTRY name of the data structures.
+* IENTRY data structure type where:
+* IENTRY=1 for LCM memory object;
+* IENTRY=2 for XSM file;
+* IENTRY=3 for sequential binary file;
+* IENTRY=4 for sequential ASCII file.
+* JENTRY access permission for the data structure where:
+* JENTRY=0 for a data structure in creation mode;
+* JENTRY=1 for a data structure in modifications mode;
+* JENTRY=2 for a data structure in read-only mode.
+* KENTRY data structure pointer.
+*
+*Comments:
+* The NAP: calling specifications are:
+* Option 1:
+* COMPO := NAP: COMPO TRKNAM FLUNAM :: (descnap1) ;
+* Option 2:
+* MAP := NAP: MAP TRKNAM FLUNAM MATEX MACRES :: (descnap2) ;
+* Option 3:
+* GEONEW := NAP: GEOOLD COMPO :: (descnap3) ;
+* where
+* COMPO : name of the \emph{multicompo} data structure (L\_COMPO signature)
+* where the detailed subregion properties will be stored.
+* TRKNAM : name of the read-only \emph{tracking} data structure
+* (L\_TRACK signature) containing the tracking.
+* FLUNAM : name of the read-only \emph{fluxunk} data structure
+* (L\_FLUX signature) containing a transport solution.
+* MAP : name of the \emph{map} data structure (L\_MAP signature) containing
+* fuel regions description, global and local parameter information (burnup,
+* fuel/coolant temperatures, coolant density, etc). A previous call to the
+* FLPOW: module is highly recommended prior to the pin-power reconstruction
+* to normalize the flux and compute the assembly power. If not, the
+* pin-power reconstruction will be normalized using the whole core power
+* instead of a normalization for each assembly.
+* MATEX : name of the read-only \emph{matex} data structure
+* (L\_MATEX signature). The object corresponds to the heterogeneously
+* splited geometry.
+* MACRES : name of the read-only \emph{macrolib} data structure
+* (L\_MACROLIB signature) containing a cross section for the fuel. The
+* \emph{macrolib} data structure must have been created with a
+* \emph{multicompo} data structure with pin level properties (transport
+* flux, H-factor, infinite domain diffusion flux).
+* GEONEW : name of the created \emph{geometry} data structure
+* (L\_GEOM signature) containing the detailed core geometry definition at
+* heterogeneous assembly level.
+* GEOOLD : name of the read-only \emph{geometry} data structure
+* (L\_GEOM signature) containing the core geometry definition with
+* homogeneous assembly (only 1 mesh per assembly mandatory).
+* (descnap1) : structure containing the input data to this module to compute
+* additional properties for subregions
+* (descnap2) : structure containing the input data to this module to perform
+* pin power reconstruction
+* (descnap3) : structure containing the input data to this module to
+* automatically define the core geometry with heterogeneous assembly
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ TYPE(C_PTR) KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER IOUT,MAXPAR,MAXLIN,MAXVAL,NSTATE,MAXADD
+ REAL REPS
+ PARAMETER (REPS=1.0E-4,IOUT=6,MAXPAR=50,MAXLIN=50,MAXVAL=200,
+ 1 NSTATE=40,MAXADD=10)
+ TYPE(C_PTR) IPCPO,IPFLU,IPTRK,IPMAP,IPMTX,IPGNW,IPGOD,IPMPP,IPMAC
+ CHARACTER TEXT*12,HSIGN*12
+ INTEGER KCHAR(3)
+ INTEGER IEN,I
+ LOGICAL ldebug
+
+ IPMAP=C_NULL_PTR
+ IPMTX=C_NULL_PTR
+ IPGNW=C_NULL_PTR
+ IPGOD=C_NULL_PTR
+ IPCPO=C_NULL_PTR
+ IPMPP=C_NULL_PTR
+ IPMAC=C_NULL_PTR
+
+ ldebug=.false.
+ if(ldebug)write(6,*) 'NAP begin debug'
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.LE.2)CALL XABORT('@NAP: AT LEAST 3 PARAMETERS'
+ > //' EXPECTED.')
+
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@NAP'
+ 1 //': LCM OBJECT EXPECTED AT LHS.')
+* NAPGEO
+ if(ldebug)write(6,*) 'NAP begin NAPGEO'
+ IF(JENTRY(1).EQ.0) THEN
+ IPGNW=KENTRY(1)
+ DO IEN=2,3
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@NAP'
+ 1 //': LCM OBJECT EXPECTED AT RHS.')
+ CALL LCMGET(KENTRY(IEN),'SIGNATURE',KCHAR)
+ WRITE(HSIGN,'(3A4)') (KCHAR(I),I=1,3)
+ IF(HSIGN.EQ.'L_GEOM')THEN
+ IPGOD=KENTRY(IEN)
+ ELSEIF(HSIGN.EQ.'L_MULTICOMPO')THEN
+ IPCPO=KENTRY(IEN)
+ ELSE
+ CALL XABORT('@NAP: COMPO OR GEOM OBJECT EXPECTED.')
+ ENDIF
+ ENDDO
+ GOTO 3000
+ ENDIF
+* NAPCPO + NAPPPR
+ if(ldebug)write(6,*) 'NAP begin NAPCPO + NAPPPR'
+ CALL LCMGET(KENTRY(1),'SIGNATURE',KCHAR)
+ WRITE(HSIGN,'(3A4)') (KCHAR(I),I=1,3)
+ IF(HSIGN.EQ.'L_MULTICOMPO')THEN
+ IPCPO=KENTRY(1)
+ ELSEIF(HSIGN.EQ.'L_MAP')THEN
+ IPMAP=KENTRY(1)
+ ELSE
+ CALL XABORT('@NAP: L_MULTICOMPO or L_MAP EXPECTED.')
+ ENDIF
+ DO 5 IEN=2,3
+ IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@N'
+ 1 //'AP: LCM OBJECT EXPECTED AT RHS.')
+ IF(JENTRY(IEN).NE.2)CALL XABORT('@NAP: LCM OBJECT IN READ-ON'
+ 1 //'LY MODE EXPECTED AT RHS.')
+ CALL LCMGET(KENTRY(IEN),'SIGNATURE',KCHAR)
+ WRITE(HSIGN,'(3A4)') (KCHAR(I),I=1,3)
+ IF(HSIGN.EQ.'L_FLUX')THEN
+ IPFLU=KENTRY(IEN)
+ ELSEIF(HSIGN.EQ.'L_TRACK')THEN
+ IPTRK=KENTRY(IEN)
+ ELSE
+ CALL XABORT('@NAP: FLUX OR TRACKING OBJECT EXPECTED.')
+ ENDIF
+ 5 CONTINUE
+ IF(NENTRY.EQ.3) GOTO 1000
+* NAPPPR
+ if(ldebug)write(6,*) 'NAP begin NAPPPR'
+ DO 7 IEN=4,NENTRY
+ IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@N'
+ 1 //'AP: LCM OBJECT EXPECTED AT RHS.')
+ IF(JENTRY(IEN).NE.2)CALL XABORT('@NAP: LCM OBJECT IN READ-ON'
+ 1 //'LY MODE EXPECTED AT RHS.')
+ CALL LCMGET(KENTRY(IEN),'SIGNATURE',KCHAR)
+ WRITE(HSIGN,'(3A4)') (KCHAR(I),I=1,3)
+C IF(HSIGN.EQ.'L_MAP')THEN
+C IPMPP=KENTRY(IEN)
+C ELSEIF((HSIGN.EQ.'L_MATEX'))THEN
+ IF((HSIGN.EQ.'L_MATEX'))THEN
+ IPMTX=KENTRY(IEN)
+ ELSEIF((HSIGN.EQ.'L_MACROLIB'))THEN
+ IPMAC=KENTRY(IEN)
+ ELSE
+ TEXT=HENTRY(IEN)
+ CALL XABORT('@NAP: SIGNATURE OF '//TEXT//' IS '//HSIGN//
+ 1 '. L_MATEX or L_MACROLIB EXPECTED.')
+ ENDIF
+ 7 CONTINUE
+ GOTO 2000
+*----
+* enriched L_MULTICOMPO computation
+*----
+ 1000 CALL NAPCPO(IPCPO,IPTRK,IPFLU,NSTATE)
+ GOTO 9000
+*----
+* Pin Power Reconstruction
+*----
+ 2000 CALL NAPPPR(IPMAP,IPTRK,IPFLU,IPMTX,IPMAC,NSTATE)
+ GOTO 9000
+*----
+* Automatic geometry unfolding
+*----
+ 3000 CALL NAPGEO(IPGNW,IPGOD,IPCPO,NSTATE)
+ GOTO 9000
+*----
+* END
+*----
+*
+ 9000 RETURN
+ END
diff --git a/Donjon/src/NAPCPO.f b/Donjon/src/NAPCPO.f new file mode 100644 index 0000000..74efe96 --- /dev/null +++ b/Donjon/src/NAPCPO.f @@ -0,0 +1,602 @@ +*DECK NAPCPO
+ SUBROUTINE NAPCPO(IPCPO,IPTRK,IPFLU,NSTATE)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Construct an 'enriched' multicompo with additional information
+* needed by Pin Power Reconstruction.
+*
+*Copyright:
+* Copyright (C) 2014 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* R. Chambon
+*
+*Parameters: input/output
+* IPCPO LCM object address of Multicompo.
+* IPTRK LCM object address of Tracking.
+* IPFLU LCM object address of Flux.
+* NSTATE length of the state vector
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NSTATE
+ TYPE(C_PTR) IPCPO,IPTRK,IPFLU
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER NCRCAL,NGPT
+ INTEGER IOUT,MAXPAR,MAXLIN,MAXVAL,MAXADD,MAXIFX
+ REAL REPS
+ PARAMETER (REPS=1.0E-4,IOUT=6,MAXPAR=50,MAXLIN=50,MAXVAL=200,
+ 1 MAXADD=10,MAXIFX=5,NGPT=2)
+ CHARACTER PARKEY(MAXPAR)*12,PARFMT(MAXPAR)*8,RECNAM*12,
+ 1 COMMEN(MAXLIN)*80,PARKEL(MAXPAR)*12,VALH(MAXPAR)*12
+ TYPE(C_PTR) JPCPO,KPCPO,LPCPO,JPMIC,JPFLU
+ CHARACTER TEXT*12,HSMG*131,DIRHOM*12,VCHAR(MAXVAL)*12,HVECT*8
+ INTEGER ISTATE(NSTATE),NPAR,NLOC,IMPX,IEL,NFDI,FINF(MAXIFX)
+ INTEGER IPAR,IBMOLD,IFX
+ REAL FLOT
+ DOUBLE PRECISION DFLOT
+ INTEGER VALI(MAXPAR),NVALUE(MAXPAR),VINTE(MAXVAL),
+ 1 MUPLET(2*MAXPAR)
+ REAL VALR(2*MAXPAR,2),VREAL(MAXVAL),NVPO(2),PTR,PDF,PDF2
+ REAL ZGKSIX(NGPT),ZGKSIY(NGPT),WGKSIX(NGPT), WGKSIY(NGPT),
+ 1 FLUGP(NGPT,NGPT),FPD,DX,DY
+ INTEGER NGFF,NXP,NYP,ITYPGP,NMIXP,NMIL,NG,NCOMLI,MAXNVP,STYPP,
+ 1 NMCAL
+ INTEGER I,J,ICAL,INDIC,ITYLCM,IX,IY,LENGTH,NITMA,IREG,IREGP,IG,
+ 1 IMIXP,ID,JD,IGP,JGP,IP,JP,J1,ICHX,IDIM,LC,L4,MAXKN,MKN
+ INTEGER NREG,NUN,NXD,NYD,ITYPGD,NREGP
+ REAL E(25)
+ LOGICAL LNOINT,FLAG
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXP
+ REAL, ALLOCATABLE, DIMENSION(:) :: MXP,MYP,KN
+ REAL, ALLOCATABLE, DIMENSION(:) :: MXD,MYD,XX,YY
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: KEYFLX,MATCOD,IXPD,
+ 1 IYPD,JDEBAR,JARBVA
+ REAL, ALLOCATABLE, DIMENSION(:) :: FLXD
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: FLXP,FT,FXTD,FYTD
+ LOGICAL, ALLOCATABLE, DIMENSION(:) :: FLAGMX
+*
+ IMPX=0
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPCPO: character data expected.')
+ IF(TEXT.EQ.'EDIT') THEN
+ CALL REDGET(INDIC,IMPX,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPCPO: integer data expected.')
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPCPO: character data expected.')
+ ENDIF
+ IF(TEXT.NE.'PROJECTION') CALL XABORT('NAPCPO: ''PROJECTION'' '//
+ 1 'EXPECTED.')
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'STEP') CALL XABORT('NAPCPO: ''STEP'' '//
+ 1 'EXPECTED.')
+ CALL REDGET(INDIC,NITMA,FLOT,DIRHOM,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPCPO: character data expected.')
+ CALL LCMSIX(IPCPO,DIRHOM,1)
+*
+ IFX=1
+ LNOINT=.FALSE.
+ FINF(:MAXIFX)=-1
+*----
+* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE COMPO.
+*----
+ CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE)
+ NMIL=ISTATE(1)
+ NG=ISTATE(2)
+ NMCAL=ISTATE(4)
+ NPAR=ISTATE(5)
+ NLOC=ISTATE(6)
+ NCOMLI=ISTATE(10)
+ NGFF=ISTATE(14)
+ IF(NGFF.EQ.0) CALL XABORT('NAPCPO: NO GFF INFO IN MULTICOMPO.')
+ CALL LCMGTC(IPCPO,'COMMENT',80,NCOMLI,COMMEN)
+ IF(NPAR.GT.0)THEN
+ CALL LCMSIX(IPCPO,'GLOBAL',1)
+ CALL LCMGTC(IPCPO,'PARKEY',12,NPAR,PARKEY)
+ CALL LCMGTC(IPCPO,'PARFMT',8,NPAR,PARFMT)
+ CALL LCMGET(IPCPO,'NVALUE',NVALUE)
+ IF(IMPX.GT.10)THEN
+ DO IPAR=1,NPAR
+ WRITE(RECNAM,'(''pval'',I8.8)') IPAR
+ IF(PARFMT(IPAR).EQ.'INTEGER') THEN
+ CALL LCMGET(IPCPO,RECNAM,VINTE)
+ WRITE(IOUT,'(13H NAPCPO: KEY=,A,18H TABULATED POINTS=,
+ 1 1P,6I12/(43X,6I12))') PARKEY(IPAR),(VINTE(I),I=1,
+ 2 NVALUE(IPAR))
+ ELSE IF(PARFMT(IPAR).EQ.'REAL') THEN
+ CALL LCMGET(IPCPO,RECNAM,VREAL)
+ WRITE(IOUT,'(13H NAPCPO: KEY=,A,18H TABULATED POINTS=,
+ 1 1P,6E12.4/(43X,6E12.4))') PARKEY(IPAR),(VREAL(I),I=1,
+ 2 NVALUE(IPAR))
+ ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN
+ CALL LCMGTC(IPCPO,RECNAM,12,NVALUE(IPAR),VCHAR)
+ WRITE(IOUT,'(13H NAPCPO: KEY=,A,18H TABULATED POINTS=,
+ 1 1P,6A12/(43X,6A12))') PARKEY(IPAR),(VCHAR(I),I=1,
+ 2 NVALUE(IPAR))
+ ENDIF
+ ENDDO
+ ENDIF
+ CALL LCMSIX(IPCPO,' ',2)
+ ENDIF
+ IF(NLOC.GT.0)THEN
+ CALL LCMSIX(IPCPO,'LOCAL',1)
+ CALL LCMGTC(IPCPO,'PARKEY',12,NLOC,PARKEL)
+ CALL LCMSIX(IPCPO,' ',2)
+ JPCPO=LCMGID(IPCPO,'MIXTURES')
+ DO IBMOLD=1,NMIL
+ KPCPO=LCMGIL(JPCPO,IBMOLD)
+ LPCPO=LCMGID(KPCPO,'TREE')
+ CALL LCMGET(LPCPO,'NVALUE',NVALUE)
+ IF(IMPX.GT.10)THEN
+ WRITE(IOUT,'(17H NAPCPO: MIXTURE=,I6)') IBMOLD
+ DO IPAR=1,NLOC
+ WRITE(RECNAM,'(''pval'',I8.8)') IPAR
+ CALL LCMGET(LPCPO,RECNAM,VREAL)
+ WRITE(IOUT,'(13H NAPCPO: KEY=,A,18H TABULATED POINTS=,
+ 1 1P,6E12.4/(43X,6E12.4))') PARKEL(IPAR),(VREAL(I),I=1,
+ 2 NVALUE(IPAR))
+ ENDDO
+ ENDIF
+ ENDDO
+ ENDIF
+ IF(IMPX.GT.10)WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI)
+*----
+* READ (INTERP_DATA) AND SET VALI, VALR AND VALH PARAMETERS
+* CORRESPONDING TO THE INTERPOLATION POINT. FILL MUPLET FOR
+* PARAMETERS.
+*----
+ MUPLET(:NPAR+NLOC)=0
+ 1020 CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPCPO: character data expected.')
+ IF(TEXT.EQ.'SET') THEN
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPCPO: character data expected.')
+ DO 50 I=1,NPAR
+ IF(TEXT.EQ.PARKEY(I)) THEN
+ IPAR=I
+ GO TO 60
+ ENDIF
+ 50 CONTINUE
+ GO TO 100
+ 60 LPCPO=LCMGID(IPCPO,'GLOBAL')
+ CALL LCMGET(LPCPO,'NVALUE',NVALUE)
+ IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('NAPCPO: MAXVAL OVERFL'
+ 1 //'OW.')
+ WRITE(RECNAM,'(''pval'',I8.8)') IPAR
+ CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM)
+ IF(LENGTH.EQ.0) THEN
+ WRITE(HSMG,'(25HNAPCPO: GLOBAL PARAMETER ,A,9H NOT SET.)')
+ 1 PARKEY(IPAR)
+ CALL XABORT(HSMG)
+ ENDIF
+ IF(PARFMT(IPAR).EQ.'INTEGER') THEN
+ CALL REDGET(INDIC,VALI(IPAR),FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPCPO: integer data expected.')
+ CALL LCMGET(LPCPO,RECNAM,VINTE)
+ DO J=1,NVALUE(IPAR)
+ IF(VALI(IPAR).EQ.VINTE(J)) THEN
+ MUPLET(IPAR)=J
+* MUTYPE(IPAR)=ITYPGD
+ GO TO 1020
+ ENDIF
+ ENDDO
+ WRITE(HSMG,'(26HNAPCPO: INTEGER PARAMETER ,A,9H WITH VAL,
+ 1 2HUE,I5,29H NOT FOUND IN COMPO DATABASE.)') PARKEY(IPAR),
+ 2 VALI(IPAR)
+ CALL XABORT(HSMG)
+ ELSE IF(PARFMT(IPAR).EQ.'REAL') THEN
+ CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT,DFLOT)
+ IF(INDIC.NE.2) CALL XABORT('NAPCPO: real data expected.')
+ VALR(IPAR,2)=VALR(IPAR,1)
+! CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ CALL LCMGET(LPCPO,RECNAM,VREAL)
+ DO J=1,NVALUE(IPAR)
+ IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN
+ MUPLET(IPAR)=J
+* MUTYPE(IPAR)=ITYPGD
+ GO TO 1020
+ ENDIF
+ ENDDO
+ WRITE(HSMG,'(23HNAPCPO: REAL PARAMETER ,A,9H WITH VAL,
+ 1 2HUE,I5,29H NOT FOUND IN COMPO DATABASE.)') PARKEY(IPAR),
+ 2 VALR(IPAR,1)
+ CALL XABORT(HSMG)
+ ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN
+ CALL REDGET(INDIC,NITMA,FLOT,VALH(IPAR),DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPCPO: STRING DATA EXPECTED.')
+ CALL LCMGTC(LPCPO,RECNAM,12,NVALUE(IPAR),VCHAR)
+ DO J=1,NVALUE(IPAR)
+ IF(VALH(IPAR).EQ.VCHAR(J)) THEN
+ MUPLET(IPAR)=J
+* MUTYPE(IPAR)=ITYPGD
+ GO TO 1020
+ ENDIF
+ ENDDO
+ WRITE(HSMG,'(25HNAPCPO: STRING PARAMETER ,A,10H WITH VALU,
+ 1 2HE ,A12,29H NOT FOUND IN COMPO DATABASE.)') PARKEY(IPAR),
+ 2 VALH(IPAR)
+ CALL XABORT(HSMG)
+ ENDIF
+ 100 DO 110 I=1,NLOC
+ IF(TEXT.EQ.PARKEL(I)) THEN
+ IPAR=NPAR+I
+ GO TO 120
+ ENDIF
+ 110 CONTINUE
+ CALL XABORT('NAPCPO: PARAMETER '//TEXT//' NOT FOUND.')
+ 120 JPCPO=LCMGID(IPCPO,'MIXTURES')
+ IBMOLD=1
+ KPCPO=LCMGIL(JPCPO,IBMOLD)
+ LPCPO=LCMGID(KPCPO,'TREE')
+ CALL LCMGET(LPCPO,'NVALUE',NVALUE)
+ CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT,DFLOT)
+ IF(INDIC.NE.2) CALL XABORT('NAPCPO: real data expected.')
+ VALR(IPAR,2)=VALR(IPAR,1)
+ WRITE(RECNAM,'(''pval'',I8.8)') IPAR-NPAR
+ CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM)
+ IF(LENGTH.EQ.0) THEN
+ WRITE(HSMG,'(24HNAPCPO: LOCAL PARAMETER ,A,9H NOT SET.)')
+ 1 PARKEL(IPAR-NPAR)
+ CALL XABORT(HSMG)
+ ELSE IF(LENGTH.GT.MAXVAL) THEN
+ CALL XABORT('NAPCPO: MAXVAL OVERFLOW.')
+ ENDIF
+ CALL LCMGET(LPCPO,RECNAM,VREAL)
+ DO J=1,NVALUE(IPAR-NPAR)
+ IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN
+ MUPLET(IPAR)=J
+* MUTYPE(IPAR)=ITYPGD
+ GO TO 1020
+ ENDIF
+ ENDDO
+ WRITE(HSMG,'(26HNAPCPO: INTEGER PARAMETER ,A,9H WITH VAL,
+ 1 2HUE,I5,29H NOT FOUND IN COMPO DATABASE.)') PARKEY(IPAR),
+ 2 VALI(IPAR)
+ CALL XABORT(HSMG)
+ ELSEIF(TEXT.EQ.'IFX') THEN
+ CALL REDGET(INDIC,IFX,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPCPO: integer data expected.')
+ GO TO 1020
+ ELSEIF(TEXT.EQ.'NOINTP') THEN
+ LNOINT=.TRUE.
+ GO TO 1020
+ ELSEIF(TEXT.EQ.'INTERP') THEN
+ LNOINT=.FALSE.
+ GO TO 1020
+ ELSEIF(TEXT.EQ.';') THEN
+ GOTO 200
+ ENDIF
+ CALL XABORT('NAPCPO: '//TEXT//' is a wrong keyword')
+*
+ 200 CONTINUE
+ JPCPO=LCMGID(IPCPO,'MIXTURES')
+ IBMOLD=1
+ KPCPO=LCMGIL(JPCPO,IBMOLD)
+ LPCPO=LCMGID(KPCPO,'TREE')
+ CALL LCMGET(LPCPO,'NVP',NVPO)
+ CALL LCMLEN(LPCPO,'ARBVAL',MAXNVP,ITYLCM)
+ IF(NVPO(1).GT.MAXNVP) CALL XABORT('NAPCPO: NVP OVERFLOW.')
+ ALLOCATE(JDEBAR(MAXNVP+1),JARBVA(MAXNVP))
+ CALL LCMGET(LPCPO,'DEBARB',JDEBAR)
+ CALL LCMGET(LPCPO,'ARBVAL',JARBVA)
+ IF(IMPX.GE.20) THEN
+ WRITE(6,*) 'MUPLET: ',(MUPLET(I),I=1,NPAR+NLOC)
+ ENDIF
+ ICAL=NCRCAL(1,NVPO(1),NPAR+NLOC,JDEBAR,JARBVA,MUPLET)
+ IF(IMPX.GE.2) THEN
+ WRITE(6,*) 'Performing projection for calculation: ',ICAL
+ ENDIF
+*
+ LPCPO=LCMGID(KPCPO,'CALCULATIONS')
+ JPMIC=LCMGIL(LPCPO,ICAL)
+ CALL LCMGET(JPMIC,'STATE-VECTOR',ISTATE)
+ CALL LCMSIX(JPMIC,'MACROLIB ',1)
+ CALL LCMSIX(JPMIC,'GFF ',1)
+ CALL LCMSIX(JPMIC,'GFF-GEOM ',1)
+C get dimension in geometry from L_MULTICOMPO
+ CALL LCMGET(JPMIC,'STATE-VECTOR',ISTATE)
+ ITYPGP=ISTATE(1)
+ STYPP=ISTATE(11)
+ IF(ITYPGP.NE.5) CALL XABORT('NAPCPO: CAR2D geometry type '
+ 1 //'expected in L_MULTICOMPO.')
+ IF(STYPP.NE.0) CALL XABORT('NAPCPO: No split in geometry expected'
+ 1 //' in L_MULTICOMPO.')
+ NXP=ISTATE(3)
+ NYP=ISTATE(4)
+ NREGP=ISTATE(6)
+ NMIXP=ISTATE(7)
+ IF(NMIXP.NE.NGFF) CALL XABORT('NAPCPO: INVALID GFF-GEOM.')
+ ALLOCATE(MXP(NXP+1),MYP(NYP+1))
+ ALLOCATE(IXPD(NXP+1),IYPD(NYP+1))
+ ALLOCATE(MIXP(NREGP))
+ CALL LCMGET(JPMIC,'MESHX',MXP)
+ CALL LCMGET(JPMIC,'MESHY',MYP)
+ CALL LCMGET(JPMIC,'MIX',MIXP)
+ CALL LCMSIX(JPMIC,'GFF-GEOM ',2)
+ IXPD(:NXP+1)=0
+ IYPD(:NYP+1)=0
+C get dimension in geometry from L_TRACK
+ CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE)
+ NREG=ISTATE(1)
+ NUN=ISTATE(2)
+ ITYPGD=ISTATE(6)
+ IEL=ISTATE(9)
+ IF(ITYPGD.NE.5) CALL XABORT('NAPCPO: CAR2D geometry type expected'
+ 1 //' in L_TRACKING.')
+ IEL=ISTATE(9)
+ L4=ISTATE(11)
+ ICHX=ISTATE(12)
+ NXD=ISTATE(14)
+ NYD=ISTATE(15)
+ IDIM=2
+ IF(NREG.NE.NXD*NYD) CALL XABORT('NAPCPO: No Splitting allowed in '
+ 1 //'CAR2D geometry type from L_TRACK.')
+C compute X and Y mesh from L_TRACK
+ ALLOCATE(MXD(NXD+1),MYD(NYD+1))
+ ALLOCATE(XX(NREG),YY(NREG))
+ CALL LCMGET(IPTRK,'XX',XX)
+ CALL LCMGET(IPTRK,'YY',YY)
+ MXD(1)=MXP(1)
+ DO I=1,NXD
+ MXD(I+1)=MXD(I)+XX(I)
+ ENDDO
+ MYD(1)=MYP(1)
+ DO I=1,NYD
+ MYD(I+1)=MYD(I)+YY((I-1)*NXD+1)
+ ENDDO
+ if(IMPX.ge.10) then
+ WRITE(6,*) 'Respective mesh (Diffusion vs. Transport):'
+ WRITE(6,*) ' X direction :'
+ WRITE(6,*) 'MXD:',(MXD(I),I=1,NXD+1)
+ WRITE(6,*) 'MXP:',(MXP(I),I=1,NXP+1)
+ WRITE(6,*) ' Y direction :'
+ WRITE(6,*) 'MYD:',(MYD(I),I=1,NYD+1)
+ WRITE(6,*) 'MYP:',(MYP(I),I=1,NYP+1)
+ endif
+ IF((ABS(MXD(NXD+1)-MXP(NXP+1)).GE.1E-3).OR.
+ 1 (ABS(MXD(NXD+1)-MXP(NXP+1)).GE.1E-3)) CALL XABORT('NAPCPO: '
+ 2 //'Diffusion and transport geometries total size mismach')
+ ALLOCATE(FXTD(NXP,NXD),FYTD(NYP,NYD))
+ FXTD(:NXP,:NXD)=0.0
+ FYTD(:NYP,:NYD)=0.0
+ CALL NAPFTD(NXP,MXP,NXD,MXD,FXTD)
+ CALL NAPFTD(NYP,MYP,NYD,MYD,FYTD)
+ IF(LNOINT) THEN
+C verify that both meshes match
+ J1=1
+ DO I=2,NXD+1
+ FLAG=.TRUE.
+ DO J=J1,NXP+1
+ IF(MXP(J).LT.MXD(I)) THEN
+ IXPD(J)=I-1
+ ENDIF
+ IF(ABS(MXD(I)-MXP(J)).LE.ABS(1E-5*MXP(J))) THEN
+ FLAG=.FALSE.
+ IXPD(J)=I
+ J1=J+1
+ ENDIF
+ ENDDO
+ IF(FLAG) CALL XABORT('NAPCPO: a X mesh in L_TRACK does not '
+ 1 //'match the CAR2D geometry imbedded in L_MULTICOMPO.')
+ ENDDO
+ J1=1
+ DO I=2,NYD+1
+ FLAG=.TRUE.
+ DO J=J1,NYP+1
+ IF(MYP(J).LT.MYD(I)) THEN
+ IYPD(J)=I-1
+ ENDIF
+ IF(ABS(MYD(I)-MYP(J)).LE.ABS(1E-5*MYP(J))) THEN
+ FLAG=.FALSE.
+ IYPD(J)=I
+ J1=J+1
+ ENDIF
+ ENDDO
+ IF(FLAG) CALL XABORT('NAPCPO: a Y mesh in L_TRACK does not '
+ 1 //'match the CAR2D geometry imbedded in L_MULTICOMPO.')
+ ENDDO
+ ENDIF
+C project flux
+ ALLOCATE(KEYFLX(NREG),MATCOD(NREG))
+ CALL LCMGET(IPTRK,'KEYFLX',KEYFLX)
+ CALL LCMGET(IPTRK,'MATCOD',MATCOD)
+ ALLOCATE(FLXD(NUN),FLXP(NMIXP,NG))
+ ALLOCATE(FLAGMX(NMIXP))
+ JPFLU=LCMGID(IPFLU,'FLUX')
+ DO IG=1,NG
+ CALL LCMGDL(JPFLU,IG,FLXD)
+ DO IP=1,NXP
+ DO JP=1,NYP
+ IREGP=IP+(JP-1)*NXP
+ IF(IREGP.GT.NREGP) CALL XABORT('NAPCPO: NREGP OVERFLOW(1).')
+ IMIXP=MIXP(IREGP)
+ FLXP(IMIXP,IG)=0.0
+ IF(LNOINT) THEN
+* integrated projected flux FLXP
+ IREG=IXPD(IP)+(IYPD(JP)-1)*NXD
+ FLXP(IMIXP,IG)=FLXD(KEYFLX(IREG))
+ ELSE
+* interpolated projected flux FLXP
+ DO ID=1,NXD
+ DO JD=1,NYD
+ IF(FXTD(IP,ID)*FYTD(JP,JD).NE.0.0) THEN
+* -----
+ CALL ALGPT(NGPT,MAX(MXP(IP),MXD(ID)),MIN(MXP(IP+1),MXD(ID+1)),
+ 1 ZGKSIX,WGKSIX)
+ DX=MIN(MXP(IP+1),MXD(ID+1))-MAX(MXP(IP),MXD(ID))
+ CALL ALGPT(NGPT,MAX(MYP(JP),MYD(JD)),MIN(MYP(JP+1),MYD(JD+1)),
+ 1 ZGKSIY,WGKSIY)
+ DY=MIN(MYP(JP+1),MYD(JD+1))-MAX(MYP(JP),MYD(JD))
+ IF(IMPX.GE.5) THEN
+ WRITE(6,*) 'IP,JP:',IP,JP,FXTD(IP,ID),'ID,JD:',ID,JD,FYTD(JP,JD)
+ WRITE(6,*) 'Gauss point ZGWG:',(ZGKSIX(I),I=1,NGPT),
+ 1 (WGKSIX(I),I=1,NGPT),'DX',DX
+ WRITE(6,*) 'Gauss point ZGWG:',(ZGKSIY(I),I=1,NGPT),
+ 1 (WGKSIY(I),I=1,NGPT),'DY',DY
+ ENDIF
+ FPD=0.0
+* interpolate flux
+ IF(ICHX.EQ.1) THEN
+* Variational collocation method
+ CALL LCMLEN(IPTRK,'KN',MAXKN,ITYLCM)
+ MKN=MAXKN/(NXD*NYD)
+ ALLOCATE(KN(MAXKN))
+ CALL LCMGET(IPTRK,'KN',KN)
+ CALL LCMSIX(IPTRK,'BIVCOL',1)
+ CALL LCMLEN(IPTRK,'T',LC,ITYLCM)
+ CALL LCMGET(IPTRK,'E',E)
+ CALL LCMSIX(IPTRK,' ',2)
+ CALL VALU2B(LC,MKN,NXD,NYD,L4,ZGKSIX,ZGKSIY,MXD,MYD,FLXD,MATCOD,
+ 1 KN,NGPT,NGPT,E,FLUGP)
+ ELSE IF(ICHX.EQ.2) THEN
+* Raviart-Thomas finite element method
+ CALL VALU4B(IEL,NUN,NXD,NYD,ZGKSIX,ZGKSIY,MXD,MYD,FLXD,MATCOD,
+ 1 KEYFLX,NGPT,NGPT,FLUGP)
+ ELSE IF(ICHX.EQ.3) THEN
+* Nodal collocation method (MCFD)
+ CALL VALU1B(IDIM,NXD,NYD,L4,ZGKSIX,ZGKSIY,MXD,MYD,FLXD,MATCOD,
+ 1 IEL,NGPT,NGPT,FLUGP)
+ ELSE
+ CALL XABORT('NAPCPO: INTERPOLATION NOT IMPLEMENTED.')
+ ENDIF
+ IF(IMPX.GE.5) THEN
+ WRITE(6,*) 'Gauss flux values:'
+ do JGP=1,NGPT
+ WRITE(6,*) (FLUGP(IGP,JGP),IGP=1,NGPT)
+ ENDDO
+ ENDIF
+* integrate flux (gauss method)
+ DO IGP=1,NGPT
+ DO JGP=1,NGPT
+ FPD=FPD+FLUGP(IGP,JGP)*WGKSIX(IGP)*WGKSIY(JGP)
+ ENDDO
+ ENDDO
+* get average flux
+ FPD=FPD/DX/DY
+ FLXP(IMIXP,IG)=FLXP(IMIXP,IG)+FPD*FXTD(IP,ID)*FYTD(JP,JD)
+* -----
+ ENDIF
+ ENDDO
+ ENDDO
+ ENDIF
+ ENDDO
+ ENDDO
+ ENDDO
+C flux normalization
+C get data from transport calculations
+ ALLOCATE(FT(NMIXP,NG))
+ CALL LCMGET(JPMIC,'NWT0',FT)
+C group by group
+ DO IG=1,NG
+C compute average flux from transport calculations
+ PTR=0.0
+ IREGP=0
+ DO IY=1,NYP
+ DO IX=1,NXP
+ IREGP=IREGP+1
+ IF(IREGP.GT.NREGP) CALL XABORT('NAPCPO: NREGP OVERFLOW(2).')
+ IMIXP=MIXP(IREGP)
+ PTR=PTR+FT(IMIXP,IG)*(MXP(IX+1)-MXP(IX))*(MYP(IY+1)-MYP(IY))
+ ENDDO
+ ENDDO
+C compute average flux with projected diffusion flux
+ PDF=0.0
+ IREGP=0
+ DO IY=1,NYP
+ DO IX=1,NXP
+ IREGP=IREGP+1
+ IF(IREGP.GT.NREGP) CALL XABORT('NAPCPO: NREGP OVERFLOW(3).')
+ IMIXP=MIXP(IREGP)
+ PDF=PDF+FLXP(IMIXP,IG)*(MXP(IX+1)-MXP(IX))*(MYP(IY+1)-MYP(IY))
+ ENDDO
+ ENDDO
+C renormalize flux
+ DO IMIXP=1,NMIXP
+ FLXP(IMIXP,IG)=FLXP(IMIXP,IG)/PDF*PTR
+ ENDDO
+C
+ IF(IMPX.GT.5) THEN
+ PDF2=0.0
+ IREGP=0
+ DO IY=1,NYP
+ DO IX=1,NXP
+ IREGP=IREGP+1
+ IF(IREGP.GT.NREGP) CALL XABORT('NAPCPO: NREGP OVERFLOW(4).')
+ IMIXP=MIXP(IREGP)
+ PDF2=PDF2+FLXP(IMIXP,IG)
+ 1 *(MXP(IX+1)-MXP(IX))*(MYP(IY+1)-MYP(IY))
+ ENDDO
+ ENDDO
+ WRITE(6,*)'NAPCPO: transport power:',PTR
+ WRITE(6,*)'NAPCPO: diffusion power (before normalization):',PDF
+ WRITE(6,*)'NAPCPO: diffusion power (after normalization):',PDF2
+ IREGP=0
+ WRITE(6,*) 'NAPCPO: FLXP/FT: group #',IG
+ DO IY=1,NYP
+ WRITE(6,*) (FLXP(MIXP(IREGP+I),IG)
+ 1 /FT(MIXP(IREGP+I),IG),I=1,NXP)
+ IREGP=IREGP+NYP
+ ENDDO
+ ENDIF
+C verify that all mixtures have a projected flux
+ DO IMIXP=1,NMIXP
+ IF(FLXP(IMIXP,IG).EQ.0.0) THEN
+ WRITE(HSMG,'(42HNAPCPO: no projected flux for mixture and ,
+ 1 6Hgroup=,2I6,1H.)') IMIXP,IG
+ CALL XABORT(HSMG)
+ ENDIF
+ ENDDO
+C end DO IG=1,NG
+ ENDDO
+C save projected flux in L_MULTICOMPO for each original mixture
+ DO I=1,NMIL
+ JPCPO=LCMGID(IPCPO,'MIXTURES')
+ KPCPO=LCMGIL(JPCPO,I)
+ LPCPO=LCMGID(KPCPO,'CALCULATIONS')
+ JPMIC=LCMGIL(LPCPO,ICAL)
+ CALL LCMSIX(JPMIC,'MACROLIB ',1)
+ CALL LCMSIX(JPMIC,'GFF ',1)
+ CALL LCMLEN(JPMIC,'FINF_NUMBER ',NFDI,ITYLCM)
+ IF(NFDI+1.GT.MAXIFX) CALL XABORT('NAPCPO: MAXIFX OVERFLOW.')
+ IF(NFDI.GT.0) CALL LCMGET(JPMIC,'FINF_NUMBER ',FINF)
+ FINF(NFDI+1)=IFX
+ WRITE(HVECT,500) IFX
+ CALL LCMPUT(JPMIC,'FINF_NUMBER ',NFDI+1,1,FINF)
+ IF(IMPX.GE.10) THEN
+ WRITE(6,'(17H NAPCPO: MIXTURE=,I5,8H RECORD ,A8,1H=)') I,HVECT
+ DO IG=1,NG
+ WRITE(6,'(7H GROUP=,I5/(1X,1P,12E13.4))') IG,
+ 1 (FLXP(IMIXP,IG),IMIXP=1,NMIXP)
+ ENDDO
+ ENDIF
+ CALL LCMPUT(JPMIC,HVECT,NMIXP*NG,2,FLXP)
+ CALL LCMSIX(JPMIC,'GFF ',2)
+ CALL LCMSIX(JPMIC,'*MAC*RES ',2)
+ ENDDO
+ DEALLOCATE(FT)
+ DEALLOCATE(FLAGMX)
+ DEALLOCATE(FLXD,FLXP)
+ DEALLOCATE(FXTD,FYTD)
+ DEALLOCATE(KEYFLX,MATCOD)
+ DEALLOCATE(MXD,MYD)
+ DEALLOCATE(XX,YY)
+ DEALLOCATE(MIXP)
+ DEALLOCATE(MXP,MYP)
+ DEALLOCATE(IXPD,IYPD)
+ DEALLOCATE(JDEBAR,JARBVA)
+ RETURN
+*
+ 500 FORMAT(5HFINF_,I3.3)
+ END
diff --git a/Donjon/src/NAPFTD.f b/Donjon/src/NAPFTD.f new file mode 100644 index 0000000..a1058a7 --- /dev/null +++ b/Donjon/src/NAPFTD.f @@ -0,0 +1,58 @@ +*DECK NAPFTD
+ SUBROUTINE NAPFTD(NXP,MXP,NXD,MXD,FXTD)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Perform a projection of second geometry on first one to compute
+* fraction of region of the first geometry occupied by the second
+* geometry regions
+*
+*Copyright:
+* Copyright (C) 2014 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* R. Chambon
+*
+*Parameters: input/output
+* for core with heterogeneous mixture
+* NXP number of region along X direction for first geometry
+* MXP mesh of region along X direction for first geometry
+* NXD number of region along X direction for second geometry
+* MXD mesh of region along X direction for second geometry
+* FXTD fraction of region along X direction
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NXP,NXD
+ REAL MXP(NXP),MXD(NXD),FXTD(NXP,NXD)
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER IP,ID
+ REAL DXP
+
+ DO IP=1,NXP
+ DXP=MXP(IP+1)-MXP(IP)
+ DO ID=1,NXD
+ IF((MXD(ID).LE.MXP(IP)).AND.(MXD(ID+1).GE.MXP(IP+1))) THEN
+ FXTD(IP,ID)=1.0
+ ELSEIF ((MXD(ID).LE.MXP(IP)).AND.(MXD(ID+1).GT.MXP(IP))) THEN
+ FXTD(IP,ID)=(MXD(ID+1)-MXP(IP))/DXP
+ ELSEIF ((MXD(ID).GE.MXP(IP)).AND.
+ 1 (MXD(ID+1).LE.MXP(IP+1))) THEN
+ FXTD(IP,ID)=(MXD(ID+1)-MXD(ID))/DXP
+ ELSEIF ((MXD(ID).LT.MXP(IP+1)).AND.
+ 1 (MXD(ID+1).GE.MXP(IP+1))) THEN
+ FXTD(IP,ID)=(MXP(IP+1)-MXD(ID))/DXP
+ ENDIF
+ ENDDO
+ ENDDO
+
+ RETURN
+ END
diff --git a/Donjon/src/NAPGEO.f b/Donjon/src/NAPGEO.f new file mode 100644 index 0000000..da231e6 --- /dev/null +++ b/Donjon/src/NAPGEO.f @@ -0,0 +1,487 @@ +*DECK NAPGEO
+ SUBROUTINE NAPGEO(IPGNW,IPGOD,IPCPO,NSTATE)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Split geometry from homogeneous to heterogeneous assemblies
+*
+*Copyright:
+* Copyright (C) 2014 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* R. Chambon
+*
+*Parameters: input/output
+* IPGNW LCM object address of heterogeneous assembly Geometry.
+* IPGOD LCM object address of homogeneous assembly Geometry.
+* IPCPO LCM object address of Multicompo.
+* NSTATE length of the state vector
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NSTATE
+ TYPE(C_PTR) IPGNW,IPGOD,IPCPO
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER IOUT,MAXLIN
+ REAL REPS
+ PARAMETER (REPS=1.0E-4,IOUT=6,MAXLIN=50)
+ TYPE(C_PTR) JPGEO,KPGEO,JPCPO,KPCPO
+ INTEGER INDIC,NITMA,LENGTH
+ CHARACTER TEXT*12
+ REAL FLOT
+ DOUBLE PRECISION DFLOT
+ INTEGER ISTATE(NSTATE),IMPX,NCODE(6),ICODE(6),ITYPGP,STYPP,
+ 1 KCHAR(3)
+ REAL ZCODE(6)
+ INTEGER NXP,NYP,NREGP,NMIXP,NCOMLI,NXD,NYD,NZD,NREGD,NMIXD,NXF,
+ 1 NYF,NZF,NREGF,NMIXF,NXA,NYA,NMIXA,NXPTMP,NYPTMP,NMIXD2,NASS
+ CHARACTER DIRHET*12,COMMEN(MAXLIN)*80,HMSG*131
+ INTEGER I,J,K,L,IP,JP,JF,IFBEG,JFBEG,LMIX,IASS,IZ,IZT,JM,JN,IM
+ LOGICAL LSPX,LSPY,LSPZ,LPOS,LMGEO
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXA,NBAX,AZONE,IBAX
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MIXP
+ INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: MIXD,MIXF
+ REAL, ALLOCATABLE, DIMENSION(:) :: MXP,MYP,MXD,MYD,MZD,MXF,
+ 1 MYF
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: SXP,SYP,SXD,SYD,SZD,
+ 1 SXF,SYF,AXD,AYD
+
+ IMPX=0
+ LSPX=.FALSE.
+ LSPY=.FALSE.
+ LSPZ=.FALSE.
+ LMGEO=.FALSE.
+C Read mandatory inputs
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPGEO: character data expected.')
+ IF(TEXT.EQ.'EDIT') THEN
+ CALL REDGET(INDIC,IMPX,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPGEO: integer data expected.')
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPGEO: character data expected.')
+ ENDIF
+ IF(TEXT.NE.'DIRGEO') CALL XABORT('NAPGEO: ''DIRGEO'' '//
+ 1 'expected.')
+ CALL REDGET(INDIC,NITMA,FLOT,DIRHET,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPGEO: character data expected.')
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.EQ.'MACGEO') THEN
+ LMGEO=.TRUE.
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ ENDIF
+ IF(TEXT.NE.'MIXASS') THEN
+ CALL XABORT('NAPGEO: ''MIXASS'' expected.')
+ ENDIF
+ CALL REDGET(INDIC,NMIXA,FLOT,DIRHET,DFLOT)
+ IF(INDIC.NE.1)CALL XABORT('@NAPGEO: integer data expected.')
+ ALLOCATE(MIXA(NMIXA*2))
+ DO I=1,NMIXA
+ CALL REDGET(INDIC,MIXA(I),FLOT,DIRHET,DFLOT)
+ IF(INDIC.NE.1)CALL XABORT('@NAPGEO: integer data expected.')
+ ENDDO
+ CALL LCMSIX(IPCPO,DIRHET,1)
+
+*----
+* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE COMPO.
+*----
+ CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE)
+ NCOMLI=ISTATE(10)
+ CALL LCMGTC(IPCPO,'COMMENT',80,NCOMLI,COMMEN)
+ IF(IMPX.GT.10)WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI)
+* Get Geometry from calculation #1
+* for pin by pin geometries
+ IF(LMGEO) THEN
+ JPCPO=LCMGID(IPCPO,'MIXTURES')
+ KPCPO=LCMGIL(JPCPO,1)
+ JPGEO=LCMGID(KPCPO,'CALCULATIONS')
+ KPGEO=LCMGIL(JPGEO,1)
+ CALL LCMSIX(KPGEO,'MACROLIB ',1)
+ CALL LCMSIX(KPGEO,'GFF ',1)
+ CALL LCMSIX(KPGEO,'GFF-GEOM ',1)
+ ELSE
+* for heterogeneous geometries
+ JPGEO=LCMGID(IPCPO,'GEOMETRIES')
+ KPGEO=LCMGIL(JPGEO,1)
+ ENDIF
+C get dimension in geometry from L_MULTICOMPO
+ if(impx.ge.100)write(6,*) 'debug: get ISTATE multicompo Geometry'
+ CALL LCMGET(KPGEO,'STATE-VECTOR',ISTATE)
+ ITYPGP=ISTATE(1)
+ STYPP=ISTATE(11)
+ IF(ITYPGP.NE.5) CALL XABORT('NAPGEO: CAR2D geometry type '
+ 1 //'expected in L_MULTICOMPO.')
+ IF(STYPP.NE.0) CALL XABORT('NAPGEO: No split in geometry '
+ 1 //'expected in L_MULTICOMPO.')
+ NXP=ISTATE(3)
+ NYP=ISTATE(4)
+ NREGP=ISTATE(6)
+ NMIXP=ISTATE(7)
+ ALLOCATE(MXP(NXP+1),MYP(NYP+1))
+ ALLOCATE(SXP(NXP),SYP(NYP))
+ ALLOCATE(MIXP(NXP,NYP))
+ CALL LCMGET(KPGEO,'MESHX',MXP)
+ CALL LCMGET(KPGEO,'MESHY',MYP)
+ CALL LCMGET(KPGEO,'MIX',MIXP)
+ SXP(:NXP)=1
+ SYP(:NYP)=1
+C get dimension in homogeneous assembly core Geometry
+ if(impx.ge.100)write(6,*) 'debug: ISTATE homog. ass. core Geom.'
+ CALL LCMGET(IPGOD,'SIGNATURE',KCHAR)
+ CALL LCMGET(IPGOD,'STATE-VECTOR',ISTATE)
+ ITYPGP=ISTATE(1)
+ NXD=ISTATE(3)
+ NYD=ISTATE(4)
+ NZD=ISTATE(5)
+ NREGD=ISTATE(6)
+ NMIXD=ISTATE(7)
+ NMIXD2=NMIXD
+ ALLOCATE(MXD(NXD+1),MYD(NYD+1))
+ ALLOCATE(MZD(NZD+1))
+ ALLOCATE(SXD(NXD),SYD(NYD))
+ ALLOCATE(SZD(NZD))
+ ALLOCATE(AXD(NXD),AYD(NYD))
+ ALLOCATE(MIXD(NXD,NYD,NZD))
+ CALL LCMGET(IPGOD,'MESHX',MXD)
+ CALL LCMGET(IPGOD,'MESHY',MYD)
+ CALL LCMGET(IPGOD,'MESHZ',MZD)
+ CALL LCMGET(IPGOD,'MIX',MIXD)
+ AXD(:NXD)=0
+ AYD(:NYD)=0
+ CALL LCMLEN(IPGOD,'SPLITX',LENGTH,INDIC)
+ IF(LENGTH.NE.0) THEN
+ CALL LCMGET(IPGOD,'SPLITX',SXD)
+ LSPX=.TRUE.
+ ELSE
+ SXD(:NXD)=1
+ ENDIF
+ CALL LCMLEN(IPGOD,'SPLITY',LENGTH,INDIC)
+ IF(LENGTH.NE.0) THEN
+ CALL LCMGET(IPGOD,'SPLITY',SYD)
+ LSPY=.TRUE.
+ ELSE
+ SYD(:NYD)=1
+ ENDIF
+ CALL LCMLEN(IPGOD,'SPLITZ',LENGTH,INDIC)
+ IF(LENGTH.NE.0) THEN
+ CALL LCMGET(IPGOD,'SPLITZ',SZD)
+ LSPZ=.TRUE.
+ ELSE
+ SZD(:NZD)=1
+ ENDIF
+ CALL LCMGET(IPGOD,'NCODE',NCODE)
+ CALL LCMGET(IPGOD,'ZCODE',ZCODE)
+ CALL LCMGET(IPGOD,'ICODE',ICODE)
+C get assembly mixture in homogeneous core geometry
+ if(impx.ge.100)write(6,*) 'debug: get assembly mixture'
+ DO 40 K=1,NZD
+ DO 30 J=1,NYD
+ DO 20 I=1,NXD
+ DO 10 L=1,NMIXA
+ IF(MIXA(L).EQ.MIXD(I,J,K)) THEN
+ AXD(I)=1
+ AYD(J)=1
+ GOTO 20
+ ENDIF
+ 10 CONTINUE
+ 20 CONTINUE
+ 30 CONTINUE
+ 40 CONTINUE
+ if(impx.ge.5) then
+ write(6,*) 'Original mesh corresponding to assemblies'
+ write(6,*) 'X direction: AXD(1 : NXD)=',(AXD(I),I=1,NXD)
+ write(6,*) 'Y direction: AYD(1 : NYD)=',(AYD(I),I=1,NYD)
+ endif
+C specify splitting in heterogeneous assembly geometry
+ 50 CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('@NAPGEO: character data expected 1.')
+ IF(TEXT.EQ.'SPLITX-ASS') THEN
+ DO I=1,NXP
+ CALL REDGET(INDIC,SXP(I),FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) THEN
+ WRITE(HMSG,*) '@NAPGEO: integer number expected'
+ 1 //' for SPLITX-ASS: ',I,'out of ',NXP
+ CALL XABORT(HMSG)
+ ENDIF
+ ENDDO
+ LSPX=.TRUE.
+ GOTO 50
+ ELSEIF(TEXT.EQ.'SPLITY-ASS') THEN
+ DO I=1,NYP
+ CALL REDGET(INDIC,SYP(I),FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) THEN
+ WRITE(HMSG,*) '@NAPGEO: integer number expected'
+ 1 //' for SPLITY-ASS: ',I,'out of ',NYP
+ CALL XABORT(HMSG)
+ ENDIF
+ ENDDO
+ LSPY=.TRUE.
+ GOTO 50
+C read final ';'
+ ELSEIF(TEXT.EQ.'MAX-MIX-GEO') THEN
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('@NAPGEO: integer data expected.')
+ NMIXD2=MAX(NMIXD,NITMA)
+ GOTO 50
+C read final ';'
+ ELSEIF(TEXT.EQ.';') THEN
+ if(impx.ge.5) then
+ write(6,*) 'Splitting within assemblies:'
+ write(6,*) 'SXP',(SXP(I),I=1,NXP)
+ write(6,*) 'SYP',(SYP(I),I=1,NYP)
+ endif
+ GOTO 60
+ ELSE
+ CALL XABORT('@NAPGEO: '//TEXT//' WRONG KEYWORD')
+ ENDIF
+C compute new dimension
+C get number of x and y original mesh to split
+ 60 NXA=0
+ DO I=1,NXD
+ NXA=NXA+AXD(I)
+ ENDDO
+ NYA=0
+ DO I=1,NYD
+ NYA=NYA+AYD(I)
+ ENDDO
+C compute new dimension
+ NXF=NXD+NXA*(NXP-1)
+ NYF=NYD+NYA*(NYP-1)
+ NZF=NZD
+ NREGF=NXF*NYF*NZF
+C allocate new geometry dimensions
+ ALLOCATE(MXF(NXF+1),MYF(NYF+1))
+ ALLOCATE(MIXF(NXF,NYF,NZF))
+ ALLOCATE(SXF(NXF),SYF(NYF))
+C Compute new x/y mesh and new x/y split
+ if(impx.ge.100)write(6,*) 'debug: Compute new x/y mesh and split'
+ J=1
+ MXF(J)=MXD(1)
+ DO I=2,NXD+1
+ IF(AXD(I-1).EQ.0) THEN
+ J=J+1
+ MXF(J)=MXD(I)
+ SXF(J-1)=SXD(I-1)
+ ELSE
+ DO K=2,NXP+1
+ J=J+1
+ MXF(J)=MXD(I-1)+MXP(K)-MXP(1)
+ SXF(J-1)=SXP(K-1)
+ ENDDO
+ ENDIF
+ ENDDO
+ J=1
+ MYF(J)=MYD(1)
+ DO I=2,NYD+1
+ IF(AYD(I-1).EQ.0) THEN
+ J=J+1
+ MYF(J)=MYD(I)
+ SYF(J-1)=SYD(I-1)
+ ELSE
+ DO K=2,NYP+1
+ J=J+1
+ MYF(J)=MYD(I-1)+MYP(K)-MYP(1)
+ SYF(J-1)=SYP(K-1)
+ ENDDO
+ ENDIF
+ ENDDO
+ IF(MXF(NXF+1).NE.MXD(NXD+1)) CALL XABORT('@NAPGEO: OLD and NEW'
+ 1 //' X MESH do not match.')
+ IF(MYF(NYF+1).NE.MYD(NYD+1)) CALL XABORT('@NAPGEO: OLD and NEW'
+ 1 //' Y MESH do not match.')
+C Compute new mixture
+ if(impx.ge.100)write(6,*) 'debug: Compute new mixture'
+ NMIXF=NMIXD2+NMIXA*NMIXP
+ MIXF(:NXF,:NYF,:NZF)=-1
+ DO 100 L=1,NMIXA
+ MIXA(L+NMIXA)=NMIXD2+(L-1)*NMIXP+1
+ 100 CONTINUE
+ DO 240 K=1,NZD
+ JFBEG=0
+ DO 230 J=1,NYD
+ IFBEG=0
+ DO 220 I=1,NXD
+ LMIX=0
+ DO 110 L=1,NMIXA
+ IF(MIXA(L).EQ.MIXD(I,J,K)) THEN
+ LMIX=L
+ ENDIF
+ 110 CONTINUE
+ IF((AXD(I).EQ.1).AND.(AYD(J).EQ.1).AND.(LMIX.NE.0)) THEN
+ DO 130 JP=1,NYP
+ JF=JFBEG+JP
+ DO 120 IP=1,NXP
+ MIXF(IFBEG+IP,JF,K)=MIXA(LMIX+NMIXA)-1+MIXP(IP,JP)
+ 120 CONTINUE
+ 130 CONTINUE
+ IFBEG=IFBEG+NXP
+ ELSE
+ NXPTMP=1
+ IF(AXD(I).EQ.1) NXPTMP=NXP
+ NYPTMP=1
+ IF(AYD(J).EQ.1) NYPTMP=NYP
+ DO 150 JP=1,NYPTMP
+ JF=JFBEG+JP
+ DO 140 IP=1,NXPTMP
+ MIXF(IFBEG+IP,JF,K)=MIXD(I,J,K)
+ 140 CONTINUE
+ 150 CONTINUE
+ IFBEG=IFBEG+NXPTMP
+ ENDIF
+ 220 CONTINUE
+ NYPTMP=1
+ IF(AYD(J).EQ.1) NYPTMP=NYP
+ JFBEG=JFBEG+NYPTMP
+ 230 CONTINUE
+ 240 CONTINUE
+
+C Compute A-ZONE
+ if(impx.ge.100)write(6,*) 'debug: Compute A-ZONE'
+ IASS=0
+ ALLOCATE(NBAX(NYD))
+ ALLOCATE(IBAX(NYD))
+ DO 340 J=1,NYD
+ NBAX(J)=0
+ IBAX(J)=0
+ DO 330 I=1,NXD
+ DO 320 K=1,NZD
+ DO 310 L=1,NMIXA
+ IF(MIXA(L).EQ.MIXD(I,J,K)) THEN
+ IASS=IASS+1
+ NBAX(J)=NBAX(J)+1
+ IF(IBAX(J).EQ.0) IBAX(J)=I
+ GOTO 330
+ ENDIF
+ 310 CONTINUE
+ 320 CONTINUE
+ 330 CONTINUE
+ 340 CONTINUE
+ NASS=IASS
+*
+ ALLOCATE(AZONE(NASS*NXP*NYP))
+ IZ=0
+ IASS=0
+ DO 370 J=1,NYD
+ DO 360 I=1,NBAX(J)
+ IASS=IASS+1
+ DO 365 JP=1,NYP
+ DO 355 IP=1,NXP
+ IZT=IZ+(JP-1)*NXP*NBAX(J)+(I-1)*NXP+IP
+ AZONE(IZT)=IASS
+ 355 CONTINUE
+ 365 CONTINUE
+ 360 CONTINUE
+ IZ=IZ+NBAX(J)*NXP*NYP
+ 370 CONTINUE
+*
+ if(impx.ge.5)then
+ write(6,*) 'New mixtures:'
+ do K=1,NZF
+ write(6,*) 'plane #',K
+ do J=1,NYF
+ write(6,*) (MIXF(I,J,K),I=1,NXF)
+ enddo
+ enddo
+
+ write(6,*) 'Assembly zones:'
+ IZ=0
+ do J=1,NYD
+ do K=1,NYP
+ write(6,*) (AZONE(I),I=IZ+(K-1)*NBAX(J)*NXP+1,
+ 1 IZ+K*NBAX(J)*NXP)
+ enddo
+ IZ=IZ+NBAX(J)*NXP*NYP
+ enddo
+ endif
+C Verify new mixture
+ DO K=1,NZF
+ DO J=1,NYF
+ DO I=1,NXF
+ IF(MIXF(I,J,K).EQ.-1) CALL XABORT('@NAPGEO: new '
+ 1 //'geometry mixture not assigned')
+ ENDDO
+ ENDDO
+ ENDDO
+
+ DEALLOCATE(MXD,MYD)
+ DEALLOCATE(SXD,SYD)
+ DEALLOCATE(MIXD)
+
+ DEALLOCATE(MXP,MYP)
+ DEALLOCATE(SXP,SYP)
+ DEALLOCATE(MIXP)
+C Compute relative position of assembly in original geometry
+ if(impx.ge.100)write(6,*) 'debug: Compute relative position'
+ JM=0
+ JN=0
+ LPOS=.TRUE.
+ DO J=1,NYD
+ IF(NBAX(J).NE.0) THEN
+ JN=JN+1
+ IF(LPOS) THEN
+ JM=J
+ LPOS=.FALSE.
+ ENDIF
+ ENDIF
+ ENDDO
+
+ IM=10000000
+ DO J=JM,JM+JN-1
+ IM=MIN(IBAX(J),IM)
+ ENDDO
+ DO J=1,NYD
+ IBAX(J)=IBAX(J)-IM+1
+ ENDDO
+
+C Save heterogeneous core geometry
+ if(impx.ge.100)write(6,*) 'debug: Save heter. core geometry'
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=ITYPGP
+ ISTATE(3)=NXF
+ ISTATE(4)=NYF
+ ISTATE(5)=NZF
+ ISTATE(6)=NREGF
+ ISTATE(7)=NMIXF
+* ISTATE(39)=NMIXA
+* ISTATE(40)=NMIXP
+ IF(LSPX .OR. LSPY .OR. LSPZ) ISTATE(11)=1
+ CALL LCMPUT(IPGNW,'STATE-VECTOR',NSTATE,1,ISTATE)
+ CALL LCMPUT(IPGNW,'MESHX',NXF+1,2,MXF)
+ CALL LCMPUT(IPGNW,'MESHY',NYF+1,2,MYF)
+ CALL LCMPUT(IPGNW,'MESHZ',NZF+1,2,MZD)
+ IF(LSPX) CALL LCMPUT(IPGNW,'SPLITX',NXF,1,SXF)
+ IF(LSPY) CALL LCMPUT(IPGNW,'SPLITY',NYF,1,SYF)
+ IF(LSPZ) CALL LCMPUT(IPGNW,'SPLITZ',NZF,1,SZD)
+ CALL LCMPUT(IPGNW,'MIX',NREGF,1,MIXF)
+ CALL LCMPUT(IPGNW,'NCODE',6,1,NCODE)
+ CALL LCMPUT(IPGNW,'ICODE',6,1,ICODE)
+ CALL LCMPUT(IPGNW,'ZCODE',6,2,ZCODE)
+ CALL LCMPUT(IPGNW,'MIX-ASBLY',2*NMIXA,1,MIXA)
+ CALL LCMPUT(IPGNW,'SIGNATURE',3,3,KCHAR)
+ CALL LCMPUT(IPGNW,'A-ZONE',NASS*NXP*NYP,1,AZONE)
+ CALL LCMPUT(IPGNW,'A-NX',JN,1,NBAX(JM))
+ CALL LCMPUT(IPGNW,'A-IBX',JN,1,IBAX(JM))
+ CALL LCMPUT(IPGNW,'A-NMIXP',1,1,NMIXP)
+!
+ if(impx.ge.100)write(6,*) 'debug: beging deallacate'
+
+ DEALLOCATE(IBAX)
+ DEALLOCATE(NBAX)
+ DEALLOCATE(AZONE)
+ DEALLOCATE(MXF,MYF)
+ DEALLOCATE(MZD)
+ DEALLOCATE(SXF,SYF)
+ DEALLOCATE(SZD)
+ DEALLOCATE(MIXF)
+ DEALLOCATE(MIXA)
+
+
+ RETURN
+ END
diff --git a/Donjon/src/NAPPPR.f b/Donjon/src/NAPPPR.f new file mode 100644 index 0000000..d1f891c --- /dev/null +++ b/Donjon/src/NAPPPR.f @@ -0,0 +1,866 @@ +*DECK NAPPPR
+ SUBROUTINE NAPPPR(IPMAP,IPTRK,IPFLU,IPMTX,IPMAC,NSTATE)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Perform the Pin Power Reconstruction for core with
+* heterogeneous mixture
+*
+*Copyright:
+* Copyright (C) 2014 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* R. Chambon (EPM) and R. Nguyen Van Ho (URANUS)
+*
+*Parameters: input/output
+* IPMAP LCM object address of Map.
+* IPTRK LCM object address of Tracking.
+* IPFLU LCM object address of Flux.
+* IPMTX LCM object address of Matex.
+* IPMAC LCM object address of Macrolib of the fuel.
+* NSTATE length of the state vector
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NSTATE
+ TYPE(C_PTR) IPMAP,IPTRK,IPFLU,IPMTX,IPMAC
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER IOUT,NGPT
+ REAL REPS
+ PARAMETER (REPS=1.0E-4,IOUT=6,NGPT=2)
+ TYPE(C_PTR) JPFLU,JPMAP,KPMAP
+ INTEGER INDIC,NITMA,LENGTH,NBPIN
+ CHARACTER TEXT*12
+ REAL FLOT
+ DOUBLE PRECISION DFLOT
+ INTEGER ISTATE(NSTATE),IMPX,IMETH
+ INTEGER NXP,NYP,NXD,NYD,NZD,NAX,NAY,
+ 1 NASS,NCOMB,NG,NASS2,NREG,NXM,NYM,NZM,
+ 2 NXT,NYT,NZT,NXDA,NYDA,NZDA,NCH,NZASS,NPIN,IFX,
+ 3 NUN,IEL,NMIX,NAMIX,NGFF
+ CHARACTER LABEL*8
+ CHARACTER TFDINF*12
+ INTEGER I,J,K,IP,JP,I1,I2,J1,J2,K1,K2,IASS,ICH,IG,IM,JM,ID,JD,KM,
+ 1 IAX,JAX,IGP,JGP,KGP,IMIX,IPIN,ICHX,IDIM,LC,L4,MAXKN,MKN,ITYLCM,
+ 2 ITYPE
+ REAL POW,FACT,POWTOT,POWASS,DX,DY,DZ,FPD,FQ,PMAX,
+ 1 HOTPINPOW,PINPOW,FXY,VTOT
+ REAL ZGKSIX(NGPT),ZGKSIY(NGPT),ZGKSIZ(NGPT),WGKSIX(NGPT),
+ 1 WGKSIY(NGPT),WGKSIZ(NGPT),X(NGPT),Y(NGPT),Z(NGPT),
+ 2 FLUGP(NGPT,NGPT,NGPT)
+ REAL E(25)
+ LOGICAL LSPX,LSPY,LSPZ,LCH,LPOW,LNOINT,LDEBUG
+*----
+* ALLOCATABLE ARRAYS
+*----
+ CHARACTER*4, ALLOCATABLE, DIMENSION(:) :: NAMX,NAMY
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NBAX,IBAX,BMIXP,AZONE,
+ 1 ACOMB,KN
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: CODEA
+ INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: KEYFLX,BMIX,MAT
+ REAL, ALLOCATABLE, DIMENSION(:) :: MXP,MYP,MXD,MYD,MZD,MXM,
+ 1 MYM,MZM,MXDA,MYDA,MZDA,FLXD,VOLM,FXYZ,PLINMAXZ,FXYASS,
+ 2 FACTASS,PWASS,PWASS2
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: FXTD,FYTD,BUNDPW
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: HFA,HFM,FDINFM,
+ 1 FTINFM,AXPOW,VPIN
+ REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: FLXDA,VOL
+ REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: FLXP,HF,FDINF,FTINF
+*
+ IMPX=0
+ FACT=1.0
+ LSPX=.FALSE.
+ LSPY=.FALSE.
+ LSPZ=.FALSE.
+ LPOW=.FALSE.
+ LNOINT=.FALSE.
+ NZASS=0
+ NPIN=0
+ NBPIN=0
+ IFX=0
+ POW=1.0
+ FQ=0.0
+ FXY=0.0
+ HOTPINPOW=0.0
+ PINPOW=0.0
+ PMAX=0.0
+ VTOT=0.0
+ LDEBUG=.false.
+* Read mandatory keywords
+ if(LDEBUG)write(6,*) 'NAPPPR begin debug'
+* [EDIT] PPR
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPPPR: character data expected.')
+ IF(TEXT.EQ.'EDIT') THEN
+ CALL REDGET(INDIC,IMPX,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPPPR: inteGEr data expected.')
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPPPR: character data expected.')
+ ENDIF
+ IF(TEXT.NE.'PPR') CALL XABORT('NAPPPR: ''PPR'' keyword '//
+ 1 'expected.')
+!* NPIN
+! CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+! IF(INDIC.NE.3) CALL XABORT('NAPPPR: character data expected.')
+! IF(TEXT.NE.'NPIN') CALL XABORT('NAPPPR: ''NPIN'' keyword '//
+! 1 'expected.')
+! CALL REDGET(INDIC,NPIN,FLOT,TEXT,DFLOT)
+! IF(INDIC.NE.1) CALL XABORT('NAPPPR: NPIN inteGEr expected.')
+! NXP=NPIN
+! NYP=NPIN
+* NZASS
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPPPR: character data expected.')
+ IF(TEXT.NE.'NZASS') CALL XABORT('NAPPPR: ''NZASS'' keyword '//
+ 1 'expected.')
+ CALL REDGET(INDIC,NZASS,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPPPR: NZASS inteGEr expected.')
+C* SPIN + SGAP
+C CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+C IF(INDIC.NE.3) CALL XABORT('NAPPPR: character data expected.')
+C IF(TEXT.NE.'DIM') CALL XABORT('NAPPPR: ''NZASS'' keyword '//
+C 1 'expected.')
+C CALL REDGET(INDIC,NITMA,SPIN,TEXT,DFLOT)
+C IF(INDIC.NE.2) CALL XABORT('NAPPPR: SPIN real expected.')
+C CALL REDGET(INDIC,NITMA,SGAP,TEXT,DFLOT)
+C IF(INDIC.NE.2) CALL XABORT('NAPPPR: SGAP real expected.')
+C
+* GEt core GEometry description in matex
+ IF(IMPX.GE.100)WRITE(6,*) 'debug:GEt matex info'
+ CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE)
+ NG=ISTATE(1)
+ NXD=ISTATE(8)
+ NYD=ISTATE(9)
+ NZD=ISTATE(10)
+ ALLOCATE(MXD(NXD+1),MYD(NYD+1),MZD(NZD+1))
+ CALL LCMGET(IPMTX,'MESHX',MXD)
+ CALL LCMGET(IPMTX,'MESHY',MYD)
+ CALL LCMGET(IPMTX,'MESHZ',MZD)
+* GEt KEYFLX
+ IF(IMPX.GE.100)WRITE(6,*) 'debug:GEt track info'
+ CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE)
+ NREG=ISTATE(1)
+ NUN=ISTATE(2)
+ ITYPE=ISTATE(6)
+ IEL=ISTATE(9)
+ L4=ISTATE(11)
+ ICHX=ISTATE(12)
+ NXT=ISTATE(14)
+ NYT=ISTATE(15)
+ NZT=ISTATE(16)
+ IDIM=1
+ IF((ITYPE.EQ.5).OR.(ITYPE.EQ.6).OR.(ITYPE.EQ.8)) IDIM=2
+ IF((ITYPE.EQ.7).OR.(ITYPE.EQ.9)) IDIM=3
+ IF((NXD.NE.NXT).OR.(NYD.NE.NYT).OR.(NZD.NE.NZT)) CALL XABORT
+ 1 ('NAPPPR: dimension do not match between MATEX and TRACKING')
+ ALLOCATE(KEYFLX(NXT,NYT,NZT),MAT(NXT,NYT,NZT))
+ CALL LCMGET(IPTRK,'KEYFLX',KEYFLX)
+ CALL LCMGET(IPTRK,'MATCOD',MAT)
+ ALLOCATE(FLXD(NUN))
+* GEt assembly GEometry in map
+ IF(IMPX.GE.100)WRITE(6,*) 'debug:GEt map info'
+ CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE)
+ NCH=ISTATE(2)
+ NASS=ISTATE(14)
+ NAX=ISTATE(15)
+ NAY=ISTATE(16)
+ ALLOCATE(AZONE(NCH))
+ ALLOCATE(NAMX(NAX),NAMY(NAY))
+ CALL LCMGET(IPMAP,'A-ZONE',AZONE)
+ CALL LCMGTC(IPMAP,'AXNAME',4,NAX,NAMX)
+ CALL LCMGTC(IPMAP,'AYNAME',4,NAY,NAMY)
+ CALL LCMSIX(IPMAP,'GEOMAP',1)
+ CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE)
+ NXM=ISTATE(3)
+ NYM=ISTATE(4)
+ NZM=ISTATE(5)
+ ALLOCATE(MXM(NXM+1),MYM(NYM+1),MZM(NZM+1))
+ ALLOCATE(NBAX(NAY),IBAX(NAY))
+ ALLOCATE(BMIX(NXM,NYM,NZM))
+ CALL LCMGET(IPMAP,'MESHX',MXM)
+ CALL LCMGET(IPMAP,'MESHY',MYM)
+ CALL LCMGET(IPMAP,'MESHZ',MZM)
+ CALL LCMLEN(IPMAP,'A-NX',LENGTH,INDIC)
+ IF(LENGTH.NE.NAY) CALL XABORT('NAPPPR: Number of assembly along'
+ 1 //'Y direction do not match between MAP and embedded GEometry')
+ CALL LCMGET(IPMAP,'A-NX',NBAX)
+ CALL LCMGET(IPMAP,'A-IBX',IBAX)
+ CALL LCMSIX(IPMAP,'GEOMAP',2)
+ CALL LCMGET(IPMAP,'BMIX',BMIX)
+C* GEt data in pin by pin assembly GEometry
+C IF(IMPX.GE.100)WRITE(6,*) 'debug:GEt map pinBypin info'
+C CALL LCMGET(IPMPP,'STATE-VECTOR',ISTATE)
+C NCHP=ISTATE(2)
+C NASSP=ISTATE(14)
+C* total number of fuel bundles = tot. nb. of .XS
+C NXS=ISTATE(9)
+C IF(NASS.NE.NASSP)CALL XABORT('NAPPPR: number of assembly do not '
+C 1 //'match between unfolded GEometries')
+C ALLOCATE(AZONEP(NCHP))
+C CALL LCMGET(IPMPP,'A-ZONE',AZONEP)
+C CALL LCMSIX(IPMPP,'GEOMAP',1)
+C CALL LCMGET(IPMPP,'STATE-VECTOR',ISTATE)
+C NXMP=ISTATE(3)
+C NYMP=ISTATE(4)
+C NZMP=ISTATE(5)
+C CALL LCMSIX(IPMPP,'GEOMAP',2)
+C ALLOCATE(BMIXP(NXMP,NYMP,NZMP))
+C CALL LCMGET(IPMPP,'BMIX',BMIXP)
+ IF(IMPX.GE.5) THEN
+ WRITE(6,*) 'MATEX dimension (het):',NXD,NYD,NZD
+ WRITE(6,*) 'TRACKING dimension(het):',NXT,NYT,NZT
+ WRITE(6,*) 'MAP dimension (het):',NXM,NYM,NZM
+ ENDIF
+* Read remaining input file
+ NCOMB=0
+ ALLOCATE(ACOMB(NASS))
+ IF(IMPX.GE.100)WRITE(6,*) 'debug: beg read input'
+ IMETH=0
+ 5 CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.EQ.'METH') THEN
+ CALL REDGET(INDIC,NITMA,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.3) CALL XABORT('NAPPPR: character data expected.')
+ IF(TEXT.EQ.'GPPR') THEN
+ IMETH=1
+ CALL REDGET(INDIC,IFX,FLOT,TEXT,DFLOT)
+ IF(INDIC.NE.1) CALL XABORT('NAPPPR: inteGEr data expected.')
+ WRITE(TFDINF,500) IFX
+ ELSE
+ CALL XABORT('NAPPPR: '//TEXT//' is a wrong method keyword.')
+ ENDIF
+ GOTO 5
+ ELSEIF(TEXT.EQ.'POWER') THEN
+ LPOW=.TRUE.
+ CALL REDGET(INDIC,NITMA,POW,TEXT,DFLOT)
+ IF(INDIC.NE.2) CALL XABORT('NAPPPR: POWER real expected.')
+ GOTO 5
+ ELSEIF(TEXT.EQ.';') THEN
+ GOTO 50
+ ELSE
+ CALL XABORT('NAPPPR: '//TEXT//' is a wrong keyword.')
+ ENDIF
+*-----------------------------
+ 50 CONTINUE
+ IF(IMPX.GE.100)WRITE(6,*) 'debug: computation begin'
+* Compute mesh X and Y for a pin-by-pin assembly
+ CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE)
+ NMIX=ISTATE(2)
+ NAMIX=NMIX/NASS/NZASS
+ IF(IMPX.GE.1) WRITE(6,*) 'Number of Mix per assembly per plane'//
+ 1 ' NAMIX = ',NAMIX
+ NGFF=ISTATE(16)
+ IF(NGFF.EQ.0) CALL XABORT('NAPPPR: NGFF.NE.0 expected.')
+ CALL LCMSIX(IPMAC,'GFF',1)
+ CALL LCMSIX(IPMAC,'GFF-GEOM',1)
+ CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE)
+ NXP=ISTATE(3)
+ NYP=ISTATE(4)
+ NPIN=NXP
+ ALLOCATE(MXP(NXP+1),MYP(NYP+1))
+ CALL LCMGET(IPMAC,'MESHX',MXP)
+ CALL LCMGET(IPMAC,'MESHY',MYP)
+ DO I=2,NXP+1
+ MXP(I)=MXP(I)-MXP(1)
+ ENDDO
+ MXP(1)=0.0
+ DO I=2,NYP+1
+ MYP(I)=MYP(I)-MYP(1)
+ ENDDO
+ MYP(1)=0.0
+ CALL LCMSIX(IPMAC,'GFF-GEOM',2)
+ CALL LCMSIX(IPMAC,'GFF',2)
+* Compute IX-,IX+,IY-,IY+,IZ-,IZ+ for each assembly in core GEometry
+ IF(IMPX.GE.100) WRITE(6,*) 'debug PPR:IX-,IX+,IY-,IY+,IZ-,IZ+'
+ ALLOCATE(CODEA(NASS,6))
+ CODEA(:NASS,:6)=0
+ ICH=0
+ I1=0
+ I2=0
+ NASS2=0
+ DO IASS=1,NASS
+ CODEA(IASS,1)=NXD+1
+ CODEA(IASS,2)=0
+ CODEA(IASS,3)=NYD+1
+ CODEA(IASS,4)=0
+ CODEA(IASS,5)=NZD+1
+ CODEA(IASS,6)=0
+ ENDDO
+ DO 150 JM=1,NYM
+ DO 130 IM=1,NXM
+ LCH=.TRUE.
+ IASS=0
+ DO 100 KM=1,NZM
+ IF(BMIX(IM,JM,KM).NE.0) THEN
+ IF(LCH) THEN
+ ICH=ICH+1
+ LCH=.FALSE.
+ IASS=AZONE(ICH)
+ NASS2=MAX(NASS2,IASS)
+ DO I=1,NXD+1
+ IF(MXD(I).EQ.MXM(IM)) I1=I
+ IF(MXD(I).EQ.MXM(IM+1)) I2=I
+ ENDDO
+ CODEA(IASS,1)=MIN(I1,CODEA(IASS,1))
+ CODEA(IASS,2)=MAX(I2,CODEA(IASS,2))
+ DO I=1,NYD+1
+ IF(MYD(I).EQ.MYM(JM)) I1=I
+ IF(MYD(I).EQ.MYM(JM+1)) I2=I
+ ENDDO
+ CODEA(IASS,3)=MIN(I1,CODEA(IASS,3))
+ CODEA(IASS,4)=MAX(I2,CODEA(IASS,4))
+ DO I=1,NZD+1
+ IF(MZD(I).EQ.MZM(KM)) I1=I
+ IF(MZD(I).EQ.MZM(KM+1)) I2=I
+ ENDDO
+ CODEA(IASS,5)=MIN(I1,CODEA(IASS,5))
+ CODEA(IASS,6)=MAX(I2,CODEA(IASS,6))
+ ELSE
+ DO I=2,NZD+1
+ IF(MZD(I).EQ.MZM(KM+1)) I2=I
+ ENDDO
+ CODEA(IASS,6)=MAX(I2,CODEA(IASS,6))
+ ENDIF
+ ENDIF
+ 100 CONTINUE
+ 130 CONTINUE
+ 150 CONTINUE
+ IF(IMPX.GE.10) THEN
+ WRITE(6,*) 'Position of the assemblies in the core'
+ WRITE(6,*) 'IX-,IX+,IY-,IY+,IZ-,IZ+'
+ do iass=1,nass
+ WRITE(6,*) 'Assembly #',iass,':',(CODEA(iass,i),i=1,6)
+ ENDDO
+ ENDIF
+ IF(NASS2.NE.NASS)CALL XABORT('NAPPPR: number of assembly do not'
+ 1 //' match: NASS2.NE.NASS')
+* For all assembly perform PPR
+ ALLOCATE(FLXP(NXP,NYP,NZASS,NG,NASS))
+ ALLOCATE(AXPOW(NXP,NYP,NASS))
+ ALLOCATE(VPIN(NXP,NYP,NASS))
+ ALLOCATE(FXYASS(NASS))
+ ALLOCATE(FACTASS(NASS))
+ ALLOCATE(PWASS(NASS),PWASS2(NASS))
+ ALLOCATE(BUNDPW(NASS,NZASS))
+ IF(.NOT.LPOW) THEN
+ CALL LCMGET(IPMAP,'BUND-PW',BUNDPW)
+ ENDIF
+ DO IASS=1,NASS
+ PWASS(IASS)=0.0
+ DO IP=1,NXP
+ DO JP=1,NYP
+ AXPOW(IP,JP,IASS)=0.0
+ VPIN(IP,JP,IASS)=0.0
+ ENDDO
+ ENDDO
+ FXYASS(IASS)=0.0
+ IF(.NOT.LPOW) THEN
+ DO K=1,NZASS
+ PWASS(IASS)=PWASS(IASS)+BUNDPW(IASS,K)
+ ENDDO
+ ENDIF
+ ENDDO
+ DO IASS=1,NASS
+* GEt flux at core GEometry level for assembly only
+ I1=CODEA(IASS,1)
+ I2=CODEA(IASS,2)
+ J1=CODEA(IASS,3)
+ J2=CODEA(IASS,4)
+ K1=CODEA(IASS,5)
+ K2=CODEA(IASS,6)
+ NXDA=I2-I1
+ NYDA=J2-J1
+ NZDA=K2-K1
+ ALLOCATE(FLXDA(NXDA,NYDA,NZDA,NG))
+ FLXDA(:NXDA,:NYDA,:NZDA,:NG)=0.0
+ IF(NZDA.NE.NZASS) CALL XABORT('NAPPPR: incoherent number of mesh'
+ 1 //' in Z direction for an assembly: NZDA.NE.NZASS')
+ JPFLU=LCMGID(IPFLU,'FLUX')
+ IF((LNOINT).OR.(IMPX.GE.0)) THEN
+
+ DO IG=1,NG
+ CALL LCMGDL(JPFLU,IG,FLXD)
+ DO I=I1,I2-1
+ DO J=J1,J2-1
+ DO K=K1,K2-1
+ FLXDA(I-I1+1,J-J1+1,K-K1+1,IG)=FLXD(KEYFLX(I,J,K))
+ ENDDO
+C end K
+ ENDDO
+C end J
+ ENDDO
+C end I
+ ENDDO
+C end IG
+ ENDIF
+ ALLOCATE(MXDA(NXDA+1),MYDA(NYDA+1),MZDA(NZDA+1))
+ DO I=I1,I2
+ MXDA(I-I1+1)=MXD(I)-MXD(I1)+MXP(1)
+ ENDDO
+ IF(ABS(MXDA(NXDA+1)-MXDA(1)-MXP(NXP+1)+MXP(1)).GT.0.0001) THEN
+ WRITE(6,*) 'Assembly Transport and Core meshX do not match:'//
+ 1 'Transport=',MXP(NXP+1)-MXP(1),'Core=',MXDA(NXDA+1)-MXDA(1)
+ CALL XABORT('Sizes do not match')
+ ENDIF
+ DO J=J1,J2
+ MYDA(J-J1+1)=MYD(J)-MYD(J1)+MYP(1)
+ ENDDO
+ IF(ABS(MYDA(NYDA+1)-MYDA(1)-MYP(NYP+1)+MYP(1)).GT.0.0001) THEN
+ WRITE(6,*) 'Assembly Transport and Core meshY do not match:'//
+ 1 'Transport=',MYP(NYP+1)-MYP(1),'Core=',MYDA(NYDA+1)-MYDA(1)
+ CALL XABORT('Sizes do not match')
+ ENDIF
+ DO K=K1,K2
+ MZDA(K-K1+1)=MZD(K)
+ ENDDO
+ IF(IMPX.GE.10) THEN
+ WRITE(6,*) 'Coarse Flux and mesh at assembly level'
+ WRITE(6,*) 'Mesh X:',(MXDA(I),I=1,NXDA+1)
+ WRITE(6,*) 'Mesh Y:',(MYDA(I),I=1,NYDA+1)
+ WRITE(6,*) 'Mesh Z:',(MZDA(I),I=1,NZDA+1)
+ WRITE(6,*) 'Flux:'
+ DO IG=1,NG
+ WRITE(6,*) 'Group #',IG
+ DO K=1,NZDA
+ WRITE(6,*) 'Plan #',K
+ DO J=1,NYDA
+ WRITE(6,*) (FLXDA(I,J,K,IG),I=1,NXDA)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDIF
+* project flux at assembly level
+ ALLOCATE(FXTD(NXP,NXDA),FYTD(NYP,NYDA))
+ FXTD(:NXP,:NXDA)=0.0
+ FYTD(:NYP,:NYDA)=0.0
+* compute fraction of the transport volumes occupied by diffusion volumes
+ CALL NAPFTD(NXP,MXP,NXDA,MXDA,FXTD)
+ CALL NAPFTD(NYP,MYP,NYDA,MYDA,FYTD)
+! DO IP=1,NXP
+! DXP=MXP(IP+1)-MXP(IP)
+! DO ID=1,NXDA
+! IF((MXDA(ID).LE.MXP(IP)).AND.(MXDA(ID+1).GE.MXP(IP+1))) THEN
+! FXTD(IP,ID)=1.0
+! ELSEIF ((MXDA(ID).LE.MXP(IP)).AND.(MXDA(ID+1).GT.MXP(IP))) THEN
+! FXTD(IP,ID)=(MXDA(ID+1)-MXP(IP))/DXP
+! ELSEIF ((MXDA(ID).GE.MXP(IP)).AND.
+! 1 (MXDA(ID+1).LE.MXP(IP+1))) THEN
+! FXTD(IP,ID)=(MXDA(ID+1)-MXDA(ID))/DXP
+! ELSEIF ((MXDA(ID).LT.MXP(IP+1)).AND.
+! 1 (MXDA(ID+1).GE.MXP(IP+1))) THEN
+! FXTD(IP,ID)=(MXP(IP+1)-MXDA(ID))/DXP
+! ENDIF
+! ENDDO
+! ENDDO
+*
+! DO IP=1,NYP
+! DYP=MYP(IP+1)-MYP(IP)
+! DO ID=1,NYDA
+! IF((MYDA(ID).LE.MYP(IP)).AND.(MYDA(ID+1).GE.MYP(IP+1))) THEN
+! FYTD(IP,ID)=1.0
+! ELSEIF ((MYDA(ID).LE.MYP(IP)).AND.(MYDA(ID+1).GT.MYP(IP))) THEN
+! FYTD(IP,ID)=(MYDA(ID+1)-MYP(IP))/DYP
+! ELSEIF ((MYDA(ID).GE.MYP(IP)).AND.
+! 1 (MYDA(ID+1).LE.MYP(IP+1))) THEN
+! FYTD(IP,ID)=(MYDA(ID+1)-MYDA(ID))/DYP
+! ELSEIF ((MYDA(ID).LT.MYP(IP+1)).AND.
+! 1 (MYDA(ID+1).GE.MYP(IP+1))) THEN
+! FYTD(IP,ID)=(MYP(IP+1)-MYDA(ID))/DYP
+! ENDIF
+! ENDDO
+! ENDDO
+! adds up all fluxes
+ if(LDEBUG)write(6,*)'NXP,NYP',NXP,NYP
+ DO IG=1,NG
+ IF(.NOT.LNOINT) CALL LCMGDL(JPFLU,IG,FLXD)
+ DO K=1,NZASS
+ DO IP=1,NXP
+ DO JP=1,NYP
+ FLXP(IP,JP,K,IG,IASS)=0.0
+ DO ID=1,NXDA
+ DO JD=1,NYDA
+ IF(LNOINT) THEN
+* No interpolation: use averaGE flux
+ FLXP(IP,JP,K,IG,IASS)=FLXP(IP,JP,K,IG,IASS)
+ 1 +FLXDA(ID,JD,K,IG)*FXTD(IP,ID)*FYTD(JP,JD)
+* Interpolate flux with polynomial representation
+* (only if pin and macro region have a non-nul intersection)
+ ELSEIF(FXTD(IP,ID)*FYTD(JP,JD).NE.0.0) THEN
+* indent removed
+* compute gauss points and weights
+ CALL ALGPT(NGPT,MAX(MXP(IP),MXDA(ID)),MIN(MXP(IP+1),MXDA(ID+1)),
+ 1 ZGKSIX,WGKSIX)
+ DX=MIN(MXP(IP+1),MXDA(ID+1))-MAX(MXP(IP),MXDA(ID))
+ CALL ALGPT(NGPT,MAX(MYP(JP),MYDA(JD)),MIN(MYP(JP+1),MYDA(JD+1)),
+ 1 ZGKSIY,WGKSIY)
+ DY=MIN(MYP(JP+1),MYDA(JD+1))-MAX(MYP(JP),MYDA(JD))
+ CALL ALGPT(NGPT,MZDA(K),MZDA(K+1),ZGKSIZ,WGKSIZ)
+ DZ=MZDA(K+1)-MZDA(K)
+ IF(IMPX.GE.10) then
+ WRITE(6,*) 'IP,JP:',IP,JP,FXTD(IP,ID),'ID,JD:',ID,JD,FYTD(JP,JD)
+ WRITE(6,*) 'Gauss point ZGWG:',(ZGKSIX(I),I=1,NGPT),
+ 1 (WGKSIX(I),I=1,NGPT),'DX',DX
+ WRITE(6,*) 'Gauss point ZGWG:',(ZGKSIY(I),I=1,NGPT),
+ 1 (WGKSIY(I),I=1,NGPT),'DY',DY
+ WRITE(6,*) 'Gauss point ZGWG:',(ZGKSIZ(I),I=1,NGPT),
+ 1 (WGKSIZ(I),I=1,NGPT),'DZ',DZ
+ ENDIF
+
+* interpolate flux
+ FPD=0.0
+ DO IGP=1,NGPT
+ X(IGP)=MXD(I1)-MXP(1)+ZGKSIX(IGP)
+ ENDDO
+ DO JGP=1,NGPT
+ Y(JGP)=MYD(J1)-MYP(1)+ZGKSIY(JGP)
+ ENDDO
+ DO KGP=1,NGPT
+ Z(KGP)=ZGKSIZ(KGP)
+ ENDDO
+ IF(IMPX.GE.10) then
+ WRITE(6,*) 'Gauss point X:',(X(I),I=1,NGPT)
+ WRITE(6,*) 'Gauss point Y:',(Y(I),I=1,NGPT)
+ WRITE(6,*) 'Gauss point Z:',(Z(I),I=1,NGPT)
+ ENDIF
+ IF(ICHX.EQ.1) THEN
+* Variational collocation method
+ CALL LCMLEN(IPTRK,'KN',MAXKN,ITYLCM)
+ MKN=MAXKN/(NXD*NYD*NZD)
+ ALLOCATE(KN(MAXKN))
+ CALL LCMGET(IPTRK,'KN',KN)
+ CALL LCMSIX(IPTRK,'BIVCOL',1)
+ CALL LCMLEN(IPTRK,'T',LC,ITYLCM)
+ CALL LCMGET(IPTRK,'E',E)
+ CALL LCMSIX(IPTRK,' ',2)
+ CALL VALUE2(LC,MKN,NXD,NYD,NZD,L4,X,Y,Z,MXD,MYD,MZD,
+ 1 FLXD,MAT,KN,NGPT,NGPT,NGPT,E,FLUGP)
+ DEALLOCATE(KN)
+ ELSE IF(ICHX.EQ.2) THEN
+* Raviart-Thomas finite element method
+ CALL VALUE4(IEL,NUN,NXD,NYD,NZD,X,Y,Z,MXD,MYD,MZD,
+ 1 FLXD,MAT,KEYFLX,NGPT,NGPT,NGPT,FLUGP)
+ ELSE IF(ICHX.EQ.3) THEN
+* Nodal collocation method (MCFD)
+ CALL VALUE1(IDIM,NXD,NYD,NZD,L4,X,Y,Z,MXD,MYD,MZD,
+ 1 FLXD,MAT,IEL,NGPT,NGPT,NGPT,FLUGP)
+ ELSE
+ CALL XABORT('NAPPPR: INTERPOLATION NOT IMPLEMENTED.')
+ ENDIF
+ IF(IMPX.GE.10) then
+ WRITE(6,*) 'Gauss flux values:'
+ DO KGP=1,NGPT
+ WRITE(6,*) 'KGP=:',KGP
+ DO JGP=1,NGPT
+ WRITE(6,*) (FLUGP(IGP,JGP,KGP),IGP=1,NGPT)
+ ENDDO
+ ENDDO
+ ENDIF
+* integrate flux (gauss method)
+ DO IGP=1,NGPT
+ DO JGP=1,NGPT
+ DO KGP=1,NGPT
+ FPD=FPD+FLUGP(IGP,JGP,KGP)*WGKSIX(IGP)*WGKSIY(JGP)*WGKSIZ(KGP)
+ ENDDO
+ ENDDO
+ ENDDO
+* GEt averaGE flux
+ FPD=FPD/DX/DY/DZ
+ if(LDEBUG)write(6,*)'FLXP,FPD,FXTD,FYTD',FLXP(IP,JP,K,IG,IASS),
+ 1 FPD,FXTD(IP,ID),FYTD(JP,JD)
+
+ FLXP(IP,JP,K,IG,IASS)=FLXP(IP,JP,K,IG,IASS)
+ 1 +FPD*FXTD(IP,ID)*FYTD(JP,JD)
+ if(LDEBUG)write(6,*)'FLXP after',FLXP(IP,JP,K,IG,IASS)
+* indent back
+ ENDIF
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+*
+ DEALLOCATE(FXTD,FYTD)
+ DEALLOCATE(MXDA,MYDA,MZDA)
+ DEALLOCATE(FLXDA)
+ IF(IMPX.GE.100)WRITE(6,*) 'debug PPR:projection flux for one '
+ 1 //'assem end'
+! end of DO IASS=1,NASS
+ ENDDO
+ IF(IMPX.GE.100)WRITE(6,*) 'debug PPR:projection flux for all '
+ 1 //'assem end'
+* GPPR
+ IF(IMETH.EQ.1) THEN
+ IF(IMPX.GE.100)WRITE(6,*) 'debug PPR:',TFDINF
+* GEt Volume, phi^t,inf_p and phi^d,inf_m,p from macrolib of fuel
+* Note: if homoGEneous (normal PPR), m=1
+ ALLOCATE(VOLM(NGFF),HFM(NMIX,NGFF,NG),
+ 1 FTINFM(NMIX,NGFF,NG),FDINFM(NMIX,NGFF,NG))
+ ALLOCATE(VOL(NPIN,NPIN,NZASS,NASS))
+ ALLOCATE(HF(NPIN,NPIN,NZASS,NG,NASS))
+ ALLOCATE(FTINF(NPIN,NPIN,NZASS,NG,NASS))
+ ALLOCATE(FDINF(NPIN,NPIN,NZASS,NG,NASS))
+ ALLOCATE(BMIXP(NPIN*NPIN))
+ VOL(:NPIN,:NPIN,:NZASS,:NASS)=0.0
+ HF(:NPIN,:NPIN,:NZASS,:NG,:NASS)=0.0
+ FTINF(:NPIN,:NPIN,:NZASS,:NG,:NASS)=0.0
+ FDINF(:NPIN,:NPIN,:NZASS,:NG,:NASS)=0.0
+
+ if(LDEBUG) call LCMLIB(IPMAC)
+ CALL LCMSIX(IPMAC,'GFF',1)
+ if(LDEBUG) call LCMLIB(IPMAC)
+ CALL LCMGET(IPMAC,'VOLUME',VOLM)
+ CALL LCMGET(IPMAC,'H-FACTOR',HFM)
+ CALL LCMGET(IPMAC,'NWT0',FTINFM)
+ CALL LCMGET(IPMAC,TFDINF,FDINFM)
+ CALL LCMSIX(IPMAC,'GFF-GEOM',1)
+ CALL LCMGET(IPMAC,'MIX',BMIXP)
+ CALL LCMSIX(IPMAC,'GFF-GEOM',2)
+ CALL LCMSIX(IPMAC,'GFF',2)
+
+ DO IG=1,NG
+
+ DO IASS=1,NASS
+ K1=CODEA(IASS,5)
+ DO K=1,NZASS
+! NAMIX = 1 for homogeneous assembly
+! > 1 for heterogeneous assembly
+! Note that all values of HFM are identical
+! for all the mix in a specific assembly
+ IMIX=(IASS-1+(K-1)*NASS)*NAMIX+1
+ DO J=1,NPIN
+ DO I=1,NPIN
+ IPIN=I+(J-1)*NPIN
+ HF(I,J,K,IG,IASS)=HFM(IMIX,BMIXP(IPIN),IG)
+ FTINF(I,J,K,IG,IASS)=FTINFM(IMIX,BMIXP(IPIN),IG)
+ FDINF(I,J,K,IG,IASS)=FDINFM(IMIX,BMIXP(IPIN),IG)
+ VOL(I,J,K,IASS)=(MXP(I+1)-MXP(I))*(MYP(J+1)-MYP(J))
+ 3 *(MZM(K1+K)-MZM(K1+K-1))
+ ENDDO
+ ENDDO
+ ENDDO
+! end of DO IASS=1,NASS
+ ENDDO
+! end of DO IG=1,NG
+ ENDDO
+ IF(IMPX.GE.6) then
+ DO iass=1,nass
+ WRITE(6,*) 'XS for assembly #',IASS
+ DO k=1,nzass
+ WRITE(6,*) 'Plane #',K
+ DO ig=1,ng
+ WRITE(6,*) 'group #',ig
+ WRITE(6,*) 'HF #'
+ DO j=1,npin
+ WRITE(6,*) (HF(I,J,K,ig,iass),I=1,NPIN)
+ ENDDO
+ WRITE(6,*) 'FTINF #'
+ DO j=1,npin
+ WRITE(6,*) (FTINF(I,J,K,ig,iass),I=1,NPIN)
+ ENDDO
+ WRITE(6,*) 'FLXP #'
+ DO j=1,npin
+ WRITE(6,*) (FLXP(I,J,K,ig,iass),I=1,NPIN)
+ ENDDO
+ WRITE(6,*) 'FDINF #'
+ DO j=1,npin
+ WRITE(6,*) (FDINF(I,J,K,ig,iass),I=1,NPIN)
+ ENDDO
+! end of do ig=1,ng
+ ENDDO
+ WRITE(6,*) 'VOL #'
+ DO j=1,npin
+ WRITE(6,*) (VOL(I,J,K,iass),I=1,NPIN)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDIF
+* Print and save reaction rates
+ IF(IMPX.GE.100)WRITE(6,*) 'debug: Print and save reaction rates'
+ POWTOT=0.0
+ DO IASS=1,NASS
+ PWASS2(IASS)=0.0
+ K1=CODEA(IASS,5)
+ DO K=1,NZASS
+ DO J=1,NPIN
+ DO I=1,NPIN
+ VTOT=VTOT+VOL(I,J,K,IASS)
+ DO IG=1,NG
+ POWTOT=POWTOT+HF(I,J,K,IG,IASS)*FTINF(I,J,K,IG,IASS)
+ 1 *FLXP(I,J,K,IG,IASS)/FDINF(I,J,K,IG,IASS)
+ 2 *VOL(I,J,K,IASS)
+ PWASS2(IASS)=PWASS2(IASS)
+ 1 +HF(I,J,K,IG,IASS)*FTINF(I,J,K,IG,IASS)
+ 1 *FLXP(I,J,K,IG,IASS)/FDINF(I,J,K,IG,IASS)
+ 2 *VOL(I,J,K,IASS)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ IF(IMPX.GE.2) WRITE(6,*) 'POWTOT:',POWTOT
+ IF(LPOW) THEN
+ DO IASS=1,NASS
+ FACTASS(IASS)=POW/POWTOT
+ ENDDO
+ ELSE
+ DO IASS=1,NASS
+ FACTASS(IASS)=PWASS(IASS)/PWASS2(IASS)
+ ENDDO
+ ENDIF
+ IF(IMPX.GE.2) WRITE(6,*) 'FACTASS:',(FACTASS(I),I=1,NASS)
+ ALLOCATE(HFA(NPIN,NPIN,NZASS))
+ ALLOCATE(FXYZ(NZASS))
+ ALLOCATE(PLINMAXZ(NZASS))
+ DO K=1,NZASS
+ FXYZ(K)=0.0
+ PLINMAXZ(K)=0.0
+ ENDDO
+ JPMAP=LCMLID(IPMAP,'ASSEMBLY',NASS)
+ IAX=0
+ JAX=1
+ DO IASS=1,NASS
+ K1=CODEA(IASS,5)
+ IAX=IAX+1
+ IF(IAX.GT.NBAX(JAX)) THEN
+ IAX=1
+ JAX=JAX+1
+ ENDIF
+ WRITE(LABEL,'(A4,A4)') NAMY(JAX),NAMX(IBAX(JAX)+IAX-1)
+ IF(IMPX.GE.5) THEN
+ WRITE(6,*) 'Reaction rates for assembly #',IASS,' Label:',
+ 1 LABEL
+ ENDIF
+ DO K=1,NZASS
+ IF(IMPX.GE.5) WRITE(6,*) 'Plane #',K
+ DO J=1,NPIN
+ DO I=1,NPIN
+ HFA(I,J,K)=0.0
+ DO IG=1,NG
+ HFA(I,J,K)=HFA(I,J,K)+HF(I,J,K,IG,IASS)*FTINF(I,J,K,IG,IASS)
+ 1 *FLXP(I,J,K,IG,IASS)/FDINF(I,J,K,IG,IASS)
+ 2 *FACTASS(IASS)
+ 2 *VOL(I,J,K,IASS)
+ IF((PLINMAXZ(K)*(MZM(K1+K)-MZM(K1+K-1))).LT.HFA(I,J,K)) THEN
+ PLINMAXZ(K)=HFA(I,J,K)/(MZM(K1+K)-MZM(K1+K-1))
+ ENDIF
+! end of DO IG=1,NG
+ ENDDO
+! end of I=1,NPIN
+ ENDDO
+ IF(IMPX.GE.5) WRITE(6,*) (HFA(I,J,K),I=1,NPIN)
+! end of J=1,NPIN
+ ENDDO
+! end of DO K=1,NZASS
+ ENDDO
+*
+ KPMAP=LCMDIL(JPMAP,IASS)
+ CALL LCMPTC(KPMAP,'LABEL',8,LABEL)
+ CALL LCMPUT(KPMAP,'PIN-POWER',NPIN*NPIN*NZASS,2,HFA)
+ CALL LCMPUT(KPMAP,'FLUX',NPIN*NPIN*NZASS*NG,2,
+ 1 FLXP(1,1,1,1,IASS))
+ POWASS=0.0
+ DO I=1,NPIN
+ DO J=1,NPIN
+ DO K=1,NZASS
+ POWASS=POWASS+HFA(I,J,K)!power of the assembly iass
+ VPIN(I,J,IASS)=VPIN(I,J,IASS)+VOL(I,J,K,IASS)
+ !pin volume
+ ENDDO
+ ENDDO
+ ENDDO
+ DO I=1,NPIN
+ DO J=1,NPIN
+ DO K=1,NZASS
+ AXPOW(I,J,IASS)=HFA(I,J,K)
+ 2 +AXPOW(I,J,IASS)
+ !AXPOW:axially integrated pin power per pin
+ !normalized to the pin mean power
+ IF(PMAX.LT.HFA(I,J,K)) THEN
+ PMAX=HFA(I,J,K)!maximal 3D local power
+ ENDIF
+ ENDDO
+ AXPOW(I,J,IASS)=AXPOW(I,J,IASS)/(POWASS/NPIN/NPIN)
+ ENDDO
+ ENDDO
+*
+ IF(IMPX.GE.2) WRITE(6,*) 'Power of assembly #',IASS,":",POWASS
+ DO I=1,NPIN
+ DO J=1,NPIN
+ IF(IMPX.GE.2) THEN
+ WRITE(6,*) 'AXPOW for assembly #',IASS
+ NBPIN=NBPIN+1
+ WRITE(6,*) 'ASS:',IASS,'PIN #',NBPIN,":",AXPOW(I,J,IASS)
+ ENDIF
+ PINPOW=AXPOW(I,J,IASS)*VPIN(I,J,IASS)
+ IF(HOTPINPOW.LT.PINPOW) THEN
+ HOTPINPOW=PINPOW
+ !power of the hot pin normalized to the pin mean power
+ ENDIF
+ IF(FXYASS(IASS).LT.AXPOW(I,J,IASS)) THEN
+ FXYASS(IASS)=AXPOW(I,J,IASS)
+ ENDIF
+ ENDDO
+ ENDDO
+ NBPIN=0
+*
+ IF(IMPX.GE.1) THEN
+ WRITE(6,*) 'Fxy for assembly #',IASS,":",FXYASS(IASS)
+ ENDIF
+ CALL LCMPUT(KPMAP,'ASS-POWER',1,2,POWASS)
+! end of DO IASS=1,NASS
+ ENDDO
+! end of IF(IMETH.EQ.1) THEN
+ ENDIF
+*
+ FQ=PMAX
+ FXY=HOTPINPOW
+*
+ IF(IMPX.GE.0) THEN
+ WRITE(6,*) 'FQ=',FQ
+ WRITE(6,*) 'FXY=',FXY
+ DO K=1,NZASS
+ FXYZ(K)=PLINMAXZ(K)
+ IF(IMPX.GE.0) WRITE(6,*) 'Plane #',K,'---> FXYZ(Z)=',FXYZ(K)
+ ENDDO
+ ENDIF
+ CALL LCMPUT(IPMAP,'FQ',1,2,FQ)
+ CALL LCMPUT(IPMAP,'FXY',1,2,FXY)
+ CALL LCMPUT(IPMAP,'FXYZ',NZASS,2,FXYZ)
+ CALL LCMPUT(IPMAP,'FXYASS',IASS,2,FXYASS)
+ CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE)
+ ISTATE(17)=NZASS
+ CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE)
+!
+ IF(IMPX.GE.100)WRITE(6,*) 'debug: beging deallacate'
+
+ DEALLOCATE(FLXP,FLXD)
+ DEALLOCATE(MXP,MYP)
+
+ DEALLOCATE(CODEA)
+ IF(IMETH.EQ.1) THEN
+ DEALLOCATE(VOLM,HFM,FTINFM,FDINFM)
+ DEALLOCATE(VOL,HF,FTINF,FDINF,AXPOW,FXYASS)
+ DEALLOCATE(HFA,FXYZ,PLINMAXZ,VPIN)
+ DEALLOCATE(FACTASS,PWASS,PWASS2)
+ DEALLOCATE(BUNDPW)
+ ENDIF
+ DEALLOCATE(ACOMB)
+ DEALLOCATE(AZONE)
+ DEALLOCATE(NAMX,NAMY)
+ DEALLOCATE(BMIX,BMIXP)
+ DEALLOCATE(MXM,MYM,MZM)
+ DEALLOCATE(NBAX,IBAX)
+ DEALLOCATE(KEYFLX,MAT)
+ DEALLOCATE(MXD,MYD,MZD)
+
+ RETURN
+ 500 FORMAT(5HFINF_,I3.3,4H )
+ END
diff --git a/Donjon/src/NCR.f b/Donjon/src/NCR.f new file mode 100644 index 0000000..389e70b --- /dev/null +++ b/Donjon/src/NCR.f @@ -0,0 +1,410 @@ +*DECK NCR + SUBROUTINE NCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and interpolate microlib and macrolib information from one +* or many multicompo database objects. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert and R. Chambon +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The NCR: calling specifications are: +* MLIB := NCR: [ { MLIB | MLIB2 } ] CPONAM1 [[ CPONAM2 ]] [ MAPFL ] +* :: (ncr\_data) ; +* where +* MLIB : name of a \emph{microlib} (type L\_LIBRARY) or \emph{macrolib} +* (type L\_MACROLIB) containing the interpolated data. If this object also +* appears on the RHS of structure (NCR:, it is open in modification mode +* and updated. +* MLIB2 : name of an optional \emph{microlib} object whose content is copied +* on MLIB. +* CPONAM1 : name of the \emph{multicompo} data structure (L\_MULTICOMPO +* signature). +* CPONAM2 : name of an additional \emph{multicompo} data structure +* (L\_MULTICOMPO signature). This object is optional. +* MAPFL : name of the \emph{map} object containing fuel regions description, +* global and local parameter information (burnup, fuel/coolant temperatures, +* coolant density, etc). Keyword TABLE is expected in (ncr\_data). +* ncr\_data : input data structure containing interpolation information. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXISD=200 + INTEGER, PARAMETER::NSTATE=40 + REAL B2, FLOTT + INTEGER I, I0, IACCS, ILENG, IMPX, INDIC, ITER, ITH, ITYLCM, ITYP, + & MAXFEL, MAXISO, MAXNIS, NB, NCAL, NCH, NCOMB, NFUEL, NGFF, NALBP, + & IDF, NGRP, NITMA, NMIL, NMIX, NPARM + CHARACTER TEXT12*12,HSMG*131,HSIGN*12,NAMDIR*12 + LOGICAL LMACRO,LCUBIC,LXS,LRES,LPURE + DOUBLE PRECISION DFLOTT + INTEGER ISTATE(NSTATE) + TYPE(C_PTR) IPLIB,IPLIB2,IPMAP,IPCPO,JPCPO + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXC,NISO + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: HISO + REAL, ALLOCATABLE, DIMENSION(:,:) :: TERP,CONC + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LISO +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LE.1) CALL XABORT('NCR: MINIMUM OF 2 OBJECTS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('NCR: MICRO' + 1 //'LIB LCM OBJECT EXPECTED AT LHS.') + IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('NCR: MICRO' + 1 //'LIB IN CREATE OR MODIFICATION MODE EXPECTED.') + IACCS=JENTRY(1) + IPLIB=KENTRY(1) + IPLIB2=C_NULL_PTR + IPMAP=C_NULL_PTR + NGRP=0 + NMIX=0 + IF(IACCS.EQ.1) THEN + CALL LCMGTC(IPLIB,'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(3) + NMIX=ISTATE(1) + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ELSE + TEXT12=HENTRY(1) + CALL XABORT('NCR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_LIBRARY OR L_MACROLIB EXPECTED.') + ENDIF + ENDIF + DO 10 I=2,NENTRY + IF((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2)) CALL XABORT('NCR: ' + 1 //'LCM OBJECTS EXPECTED AT RHS.') + IF(JENTRY(I).NE.2) CALL XABORT('NCR: LCM OBJECTS IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + IF(C_ASSOCIATED(IPLIB2)) CALL XABORT('NCR: ONLY ONE MICROLIB' + 1 //' EXPECTED AT RHS.') + IPLIB2=KENTRY(I) + GO TO 10 + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL XABORT('NCR: ANOTHER MACROLIB NOT EXPECTED AT RHS.') + ELSE IF(HSIGN.EQ.'L_MAP') THEN + IF(I.NE.NENTRY) CALL XABORT('NCR: FUEL-MAP EXPECTED TO BE TH' + 1 //'E LAST OBJECT.') + IF(NENTRY.LT.3) CALL XABORT('NCR: MISSING MULTICOMPO OBJECT.') + IPMAP=KENTRY(NENTRY) + CALL LCMLEN(IPMAP,'FLMIX',NMIX,ITYP) + ELSE IF(HSIGN.NE.'L_MULTICOMPO') THEN + TEXT12=HENTRY(I) + CALL XABORT('NCR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_MULTICOMPO EXPECTED.') + ENDIF + 10 CONTINUE +*---- +* READ THE INPUT DATA +*---- + LMACRO=.FALSE. + LXS=.FALSE. + LCUBIC=.FALSE. + LRES=.FALSE. + LPURE=.FALSE. + B2=0.0 + MAXFEL=0 + ITER=-1 + IPCPO=C_NULL_PTR + IMPX=1 + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCR: CHARACTER DATA EXPECTED(1).') + 30 IF(TEXT12.EQ.'EDIT') THEN +* READ THE PRINT INDEX. + CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('NCR: INTEGER DATA EXPECTED(1).') + ELSE IF(TEXT12.EQ.'NMIX') THEN +* READ THE MAXIMUM NUMBER OF MATERIAL MIXTURES. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('NCR: INTEGER DATA EXPECTED(2).') + IF(NITMA.LT.NMIX) THEN + WRITE(HSMG,'(20HNCR: NMIX MUST BE >=,I8)') NMIX + CALL XABORT(HSMG) + ENDIF + NMIX=NITMA + ELSE IF(TEXT12.EQ.'MACRO') THEN + IF(LMACRO) CALL XABORT('NCR: ONLY ONE MACRO KEYWORD EXPECTED.') + LMACRO=.TRUE. + ELSE IF(TEXT12.EQ.'MICRO') THEN + LMACRO=.FALSE. + ELSE IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + ELSE IF(TEXT12.EQ.'ALLX') THEN + LXS=.TRUE. + CALL REDGET(INDIC,MAXFEL,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('NCR: INTEGER DATA EXPECTED(3).') + ELSE IF(TEXT12.EQ.'RES') THEN + IF((IACCS.EQ.0).AND.(.NOT.C_ASSOCIATED(IPLIB2))) THEN + CALL XABORT('NCR: RHS MICROLIB EXPECTED WITH RES OPTION.') + ENDIF + LRES=.TRUE. + ELSE IF(TEXT12.EQ.'PURE') THEN + LPURE=.TRUE. + ELSE IF(TEXT12.EQ.'COMPO') THEN + IF(NMIX.EQ.0) CALL XABORT('NCR: ZERO NUMBER OF MIXTURES.') + IF(C_ASSOCIATED(IPMAP)) THEN + WRITE(IOUT,'(/43H NCR: ***WARNING*** A FUEL MAP IS SET AT RH, + 1 26HS; KEYWORD TABLE EXPECTED.)') + ENDIF + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCR: CHARACTER DATA EXPECTED(2).') + CALL REDGET(INDIC,NITMA,FLOTT,NAMDIR,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCR: CHARACTER DATA EXPECTED(3).') + I0=0 + DO 50 I=2,NENTRY + IF(C_ASSOCIATED(KENTRY(I),IPLIB2)) GO TO 50 + IF(TEXT12.EQ.HENTRY(I)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,TEXT12) + IF(TEXT12.EQ.'L_MULTICOMPO') THEN + IPCPO=KENTRY(I) + ELSE + CALL XABORT('NCR: WRONG SIGNATURE ('//TEXT12//').') + ENDIF + ITH=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('NCR: MULTICOMPO '//TEXT12//' NOT FOUND.') + 60 IF(IMPX.GT.0) WRITE(IOUT,320) HENTRY(I),NAMDIR + CALL LCMLEN(IPCPO,NAMDIR,ILENG,ITYLCM) + IF((ILENG.EQ.0).OR.(ITYLCM.NE.0)) THEN + CALL LCMLIB(IPCPO) + CALL XABORT('NCR: NO '//NAMDIR//' DIRECTORY TO STEP.') + ENDIF + JPCPO=LCMGID(IPCPO,NAMDIR) + CALL LCMGET(JPCPO,'STATE-VECTOR',ISTATE) + IF(NGRP.EQ.0) THEN + NGRP=ISTATE(2) + ELSE IF(NGRP.NE.ISTATE(2)) THEN + WRITE(HSMG,'(9H NCR: THE,I4,29H-TH MULTICOMPO HAS AN INVALID, + 1 25H NUMBER OF ENERGY GROUPS.)') ITH + CALL XABORT(HSMG) + ENDIF + IF(ISTATE(12).NE.2006) CALL XABORT('NCR: 2006 MULTICOMPO SPECI' + 1 //'F EXPECTED.') + NMIL=ISTATE(1) + NCAL=ISTATE(3) + NGFF=ISTATE(14) + NALBP=ISTATE(15) + IDF=ISTATE(16) + IF(NGFF.EQ.-1) CALL XABORT('NCR: GFF INFO MISSING.') + IF(NALBP.EQ.-1) CALL XABORT('NCR: PHYSICAL ALBEDO MISSING.') + IF(IDF.EQ.-1) CALL XABORT('NCR: SURF-CURRENT INFO MISSING.') + ALLOCATE(MIXC(NMIX),TERP(NCAL,NMIX),NISO(NMIX),LISO(NMIX), + 1 HISO(2,NMIX,MAXISD),CONC(NMIX,MAXISD)) +* + CALL NCRDRV(JPCPO,LCUBIC,NMIX,IMPX,NMIL,NCAL,ITER,MAXNIS,MIXC, + 1 TERP,NISO,LISO,HISO,CONC) + GO TO 100 + ELSE IF(TEXT12.EQ.'TABLE') THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('NCR: MISSING FUEL-MA' + 1 //'P OBJECT.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + NGRP=ISTATE(4) + NFUEL=ISTATE(7) + NPARM=ISTATE(8) + IF(NCOMB.EQ.0)CALL XABORT('NCR: NUMBER OF COMBUSTION ZONES NO' + 1 //'T YET DEFINED IN THE FUEL MAP NCOMB=0.') + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCR: CHARACTER DATA EXPECTED(2).') + CALL REDGET(INDIC,NITMA,FLOTT,NAMDIR,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCR: CHARACTER DATA EXPECTED(3).') + I0=0 + DO 80 I=2,NENTRY + IF((C_ASSOCIATED(KENTRY(I),IPLIB2)).OR. + 1 (C_ASSOCIATED(KENTRY(I),IPMAP))) GO TO 80 + IF(TEXT12.EQ.HENTRY(I)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,TEXT12) + IF(TEXT12.EQ.'L_MULTICOMPO') THEN + IPCPO=KENTRY(I) + ELSE + CALL XABORT('NCR: WRONG SIGNATURE ('//TEXT12//').') + ENDIF + ITH=I + GO TO 90 + ENDIF + 80 CONTINUE + CALL XABORT('NCR: MULTICOMPO '//TEXT12//' NOT FOUND.') + 90 IF(IMPX.GT.0) WRITE(IOUT,320) HENTRY(I),NAMDIR + CALL LCMLEN(IPCPO,NAMDIR,ILENG,ITYLCM) + IF((ILENG.EQ.0).OR.(ITYLCM.NE.0)) THEN + CALL LCMLIB(IPCPO) + CALL XABORT('NCR: NO '//NAMDIR//' DIRECTORY TO STEP.') + ENDIF + JPCPO=LCMGID(IPCPO,NAMDIR) + ISTATE(:NSTATE)=0 + CALL LCMGET(JPCPO,'STATE-VECTOR',ISTATE) + IF(ISTATE(12).NE.2006) CALL XABORT('NCR: 2006 MULTICOMPO SPECI' + 1 //'F EXPECTED.') + IF(NGRP.NE.ISTATE(2)) THEN + WRITE(HSMG,'(9H NCR: THE,I4,29H-TH MULTICOMPO HAS AN INVALID, + 1 25H NUMBER OF ENERGY GROUPS.)') ITH + CALL XABORT(HSMG) + ENDIF + NMIL=ISTATE(1) + NCAL=ISTATE(3) + NGFF=ISTATE(14) + NALBP=ISTATE(15) + IDF=ISTATE(16) + IF(NGFF.EQ.-1) CALL XABORT('NCR: GFF INFO MISSING.') + IF(NALBP.EQ.-1) CALL XABORT('NCR: PHYSICAL ALBEDO MISSING.') + ALLOCATE(MIXC(NMIX),TERP(NCAL,NMIX),NISO(NMIX),LISO(NMIX), + 1 HISO(2,NMIX,MAXISD),CONC(NMIX,MAXISD)) +* + CALL NCRRGR(JPCPO,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,NCH, + 1 NB,NFUEL,NPARM,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC) + GO TO 100 + ELSE IF(TEXT12.EQ.'LEAK') THEN + CALL REDGET(INDIC,NITMA,B2,TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('NCR: REAL DATA EXPECTED.') + ELSE + CALL XABORT('NCR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* BUILD THE INTERPOLATED MACROLIB OR MICROLIB +*---- + 100 IF(LMACRO) THEN +* build a macrolib + CALL NCRMAC(MAXNIS,IPLIB,JPCPO,IACCS,NMIL,NMIX,NGRP,NGFF,NALBP, + 1 IDF,IMPX,NCAL,TERP,NISO,LISO,HISO,CONC,MIXC,LRES,LPURE,B2) + IF(IMPX.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,290) IMPX,(ISTATE(I),I=1,9),ISTATE(12),ISTATE(16) + ENDIF + ELSE +* build a microlib + IF(IACCS.EQ.0)THEN + MAXISO=MAXISD*NMIX + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXISO=MAX(MAXISD*NMIX,ISTATE(2)) + ENDIF + CALL NCRLIB(MAXNIS,MAXISO,MAXFEL,IPLIB,JPCPO,IACCS,NMIL,NMIX, + 1 NGRP,NGFF,NALBP,IDF,IMPX,NCAL,TERP,NISO,LISO,HISO,CONC,MIXC, + 2 LXS,LRES,LPURE,B2) + IF(IMPX.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,300) IMPX,(ISTATE(I),I=1,12) + WRITE(IOUT,310) (ISTATE(I),I=13,15),(ISTATE(I),I=17,24) + ENDIF + ENDIF +* + DEALLOCATE(CONC,HISO,LISO,NISO,TERP,MIXC) +*---- +* CONTINUE DATA PROCESSING +*---- + IF(ITER.EQ.0) THEN + GO TO 200 + ELSE IF(ITER.EQ.1) THEN + TEXT12='COMPO' + GO TO 30 + ELSE IF(ITER.EQ.2) THEN + TEXT12='TABLE' + GO TO 30 + ENDIF +*---- +* LEAVE NCR: +*---- + 200 IF(IMPX.GT.2) CALL LCMLIB(IPLIB) + RETURN +* + 290 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NGROUP,I6,28H (NUMBER OF ENERGY GROUPS)/ + 3 7H NBMIX ,I6,39H (NUMBER OF MIXTURES IN THE MACROLIB)/ + 4 7H NANISO,I6,34H (MAXIMUM SCATTERING ANISOTROPY)/ + 5 7H NIFISS,I6,47H (MAXIMUM NUMBER OF FISSILE ISOTOPES IN A MIX, + 6 5HTURE)/ + 7 7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 8 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 9 43H=RECOVER FROM LIBRARY/4=LEAKAGE CORRECTION)/ + 1 7H NLG ,I6,39H (NUMBER OF DELAYED PRECURSOR GROUPS)/ + 2 7H NALBP ,I6,31H (0: NO PHYSICAL ALBEDO INFO)/ + 3 7H ILEAK ,I6,40H (1=DIFF AVAILABLE; 2=DIFFX AVAILABLE)/ + 4 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 5 10H GAP INFO)/ + 6 7H NGFF ,I6,39H (0: NO GENERALIZED FORM FACTOR INFO)) + 300 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H MAXMIX,I6,31H (MAXIMUM NUMBER OF MIXTURES)/ + 3 7H NBISO ,I6,36H (NUMBER OF ISOTOPES OR MATERIALS)/ + 4 7H NGRP ,I6,28H (NUMBER OF ENERGY GROUPS)/ + 5 7H NL ,I6,30H (NUMBER OF LEGENDRE ORDERS)/ + 6 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 7 57H=RECOVER FROM LIBRARY/3=WIMS-D TYPE/4=LEAKAGE CORRECTION)/ + 8 7H IPROB ,I6,23H (0=DIRECT/1=ADJOINT)/ + 9 7H ITIME ,I6,28H (1=STEADY-STATE/2=PROMPT)/ + 1 7H NLIB ,I6,32H (NUMBER OF SETS OF LIBRARIES)/ + 2 7H NGF ,I6,48H (NUMBER OF FAST GROUP WITHOUT SELF-SHIELDING)/ + 3 7H IGRMAX,I6,41H (LAST GROUP INDEX WITH SELF-SHIELDING)/ + 4 7H NDEPL ,I6,33H (NUMBER OF DEPLETING ISOTOPES)/ + 5 7H NCOMB ,I6,33H (NUMBER OF DEPLETING MIXTURES)) + 310 FORMAT(7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 1 7H NBMIX ,I6,23H (NUMBER OF MIXTURES)/ + 2 7H NRES ,I6,40H (NUMBER OF SETS OF RESONANT MIXTURES)/ + 3 7H IPROC ,I6,48H (-1=SKIP LIBRARY PROCESSING/0=DILUTION INTERP, + 4 48HOLATION/1=USE PHYSICAL TABLES/2=BUILD A DRAGLIB/, + 5 55H3=COMPUTE CALENDF TABLES/4=COMPUTE SLOWING-DOWN TABLES)/ + 6 7H IMAC ,I6,45H (0=DO NOT/1=DO BUILD AN EMBEDDED MACROLIB)/ + 7 7H NDEL ,I6,31H (NUMBER OF PRECURSOR GROUPS)/ + 8 7H NFISS ,I6,31H (NUMBER OF FISSILE ISOTOPES)/ + 9 7H ISOADD,I6,37H (0=COMPLETE BURNUP CHAIN/1=DO NOT)/ + 1 7H MAXISM,I6,40H (MAX. NUMBER OF ISOTOPES PER MIXTURE)/ + 2 7H IPRECI,I6,34H (CALENDF ACCURACY FLAG:1/2/3/4)/ + 3 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 4 10H GAP INFO)) + 320 FORMAT(/32H NCR: INTERPOLATING MULTICOMPO ',A12,13H' FROM DIRECT, + 1 5HORY ',A12,2H'.) + END diff --git a/Donjon/src/NCRAGF.f b/Donjon/src/NCRAGF.f new file mode 100644 index 0000000..b21f935 --- /dev/null +++ b/Donjon/src/NCRAGF.f @@ -0,0 +1,532 @@ +*DECK NCRAGF + SUBROUTINE NCRAGF(IPMAC,IPCPO,IACCS,NMIL,NMIX,NGRP,NGFF,NALBP, + 1 IMPX,NCAL,TERP,MIXC,IDF,NTYPE,NFINF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the macrolib by scanning the NCAL elementary calculations and +* weighting them with TERP factors. ADF, GFF and physical albedos part. +* +*Copyright: +* Copyright (C) 2015 Ecole Polytechnique de Montreal +* +*Author(s): +* R. Chambon, A. Hebert +* +*Parameters: input +* IPMAC address of the output macrolib LCM object. +* IPCPO address of the multicompo object. +* IACCS =0 macrolib is created; =1 ... is updated. +* NMIL number of material mixtures in the multicompo. +* NMIX maximum number of material mixtures in the macrolib. +* NGRP number of energy groups. +* NGFF number of group form factors per energy group. +* NALBP number of physical albedos per energy group. +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the multicompo. +* TERP interpolation factors. +* MIXC mixture index in the multicompo corresponding to each macrolib +* mixture. Equal to zero if a macrolib mixture is not updated. +* IDF ADF type, 0 = none, 1 = Albedo, 2 = FD_B/FD_C/..., 3 = ADF. +* NTYPE number of ADF. +* NFINF number of 'enriched' flux (for pin power reconstruction in +* NAP:). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC,IPCPO + INTEGER IACCS,NMIL,NMIX,NGRP,NGFF,NALBP,IMPX,NCAL,MIXC(NMIX),IDF, + 1 NTYPE,NFINF + REAL TERP(NCAL,NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXIFX=5 + INTEGER, PARAMETER::NSTATE=40 + INTEGER FINF(MAXIFX),NITMA + REAL WEIGHT,FACTOR,ZZZ + CHARACTER FINFN*8,HSMG*131 + TYPE(C_PTR) JPCPO,KPCPO,LPCPO,MPCPO + INTEGER IKEFF,IKINF,I,IBM,IBMOLD,ICAL,IGR,JGR,IGFF,ILONG,ITYLCM, + 1 ITYPE,ITYP2,JTYPE,IAL,NTYPE2 + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION GAR1,GAR2 +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,VOL,ZKINF,ZKEFF + REAL, ALLOCATABLE, DIMENSION(:,:) :: GAR6,ALBP + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAR5,ADF2,ALBP2 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: GFF,ADF2M + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF,HADF2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(GAR4(NGRP*NGRP),GAR6(NGRP,2),GFF(NMIX,NGFF,NGRP,2+NFINF), + 1 GAR5(NGFF,NGRP,2+MAXIFX),ALBP(NALBP,NGRP),ALBP2(NMIX,NALBP,NGRP), + 2 ZKINF(NMIX),ZKEFF(NMIX),HADF(NTYPE),ADF2(NMIX,NGRP,NTYPE), + 3 ADF2M(NMIX,NGRP,NGRP,NTYPE)) +*---- +* OVERALL MULTICOMPO MIXTURE LOOP +*---- + IKINF=0 + IKEFF=0 + JPCPO=LCMGID(IPCPO,'MIXTURES') + IF(NALBP.NE.0) ALBP2(:NMIX,:NALBP,:NGRP)=0.0 + ZKINF(:NMIX)=0.0 + ZKEFF(:NMIX)=0.0 + DO 500 IBMOLD=1,NMIL + IF(IMPX.GT.0) WRITE(IOUT,'(/33H NCRAGF: PROCESS MULTICOMPO MIXTU, + 1 2HRE,I5)') IBMOLD + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'CALCULATIONS') +*---- +* READ EXISTING MACROLIB INFORMATION +*---- + MPCPO=LCMGIL(LPCPO,1) + CALL LCMGET(MPCPO,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.1) CALL XABORT('NCRAGF: THE NUMBER OF MIXTURE SH' + 1 //'OULD ALWAYS BE EQUAL TO 1 IN A MULTICOMPO MICROLIB BRANCH.') + IF(IACCS.EQ.0) THEN !IACCS + IF((IDF.NE.0).OR.(NGFF.NE.0)) CALL LCMSIX(MPCPO,'MACROLIB',1) + IF(IDF.NE.0) THEN + !copy ADF names from multicompo + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMLEN(MPCPO,'ADF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('NCRAGF: MISSING ADF DIRECTORY I' + 1 //'N MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,'ADF',1) + CALL LCMEQU(MPCPO,IPMAC) + IF(IDF.EQ.1) THEN + CALL LCMLEN(IPMAC,'ALBS00',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMDEL(IPMAC,'ALBS00') + ADF2(:NMIX,:NGRP,:NTYPE)=0.0 + ELSE IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN + CALL LCMGET(MPCPO,'NTYPE',NITMA) + IF(NITMA.NE.NTYPE) CALL XABORT('NCRAGF: INVALID NTYPE(1).') + IF(NTYPE.GT.0) THEN + CALL LCMGTC(MPCPO,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMLEN(IPMAC,HADF(ITYPE),ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMDEL(IPMAC,HADF(ITYPE)) + ENDDO + ENDIF + ADF2(:NMIX,:NGRP,:NTYPE)=0.0 + ELSE IF(IDF.EQ.4) THEN + CALL LCMGET(MPCPO,'NTYPE',NITMA) + IF(NITMA.NE.NTYPE) CALL XABORT('NCRAGF: INVALID NTYPE(2).') + IF(NTYPE.GT.0) THEN + CALL LCMGTC(MPCPO,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMLEN(IPMAC,HADF(ITYPE),ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMDEL(IPMAC,HADF(ITYPE)) + ENDDO + ENDIF + ADF2M(:NMIX,:NGRP,:NGRP,:NTYPE)=0.0 + ENDIF + CALL LCMSIX(MPCPO,' ',2) + CALL LCMSIX(IPMAC,' ',2) + ENDIF + IF(NGFF.NE.0) THEN + !copy GFF geom and FINF names from multicompo + CALL LCMSIX(IPMAC,'GFF',1) + CALL LCMLEN(MPCPO,'GFF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('NCRAGF: MISSING GFF DIRECTORY I' + 1 //'N MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,'GFF',1) + CALL LCMEQU(MPCPO,IPMAC) + IF(NFINF.GT.0) THEN + CALL LCMGET(IPMAC,'FINF_NUMBER ',FINF) + DO I=1,NFINF + WRITE(FINFN,'(5HFINF_,I3.3)') FINF(I) + CALL LCMLEN(IPMAC,FINFN,ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMDEL(IPMAC,FINFN) + ENDDO + ENDIF + CALL LCMSIX(MPCPO,' ',2) + CALL LCMSIX(IPMAC,' ',2) + GFF(:NMIX,:NGFF,:NGRP,:2+NFINF)=0.0 + ENDIF + IF((IDF.NE.0).OR.(NGFF.NE.0)) CALL LCMSIX(MPCPO,' ',2) + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + ISTATE(8)=NALBP + ISTATE(12)=IDF + ISTATE(16)=NGFF + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + IACCS=1 + ELSE !IACCS +* Recover ADF, GFF and physical albedos previously computed + IF(NGFF.NE.0) THEN + CALL LCMSIX(IPMAC,'GFF',1) + CALL LCMGET(IPMAC,'NWT0',GFF(1,1,1,1)) + CALL LCMGET(IPMAC,'H-FACTOR',GFF(1,1,1,2)) + IF(NFINF.GT.0) THEN + CALL LCMGET(IPMAC,'FINF_NUMBER ',FINF) + DO I=1,NFINF + WRITE(FINFN,'(5HFINF_,I3.3)') FINF(I) + CALL LCMGET(IPMAC,FINFN,GFF(1,1,1,2+I)) + ENDDO + ENDIF + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) GFF(IBM,:NGFF,:NGRP,:NFINF+2)=0.0 + ENDDO + CALL LCMSIX(IPMAC,' ',2) + ENDIF + IF(IDF.NE.0) THEN + CALL LCMSIX(IPMAC,'ADF',1) + IF(IDF.EQ.1) THEN + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) ADF2(IBM,:NGRP,1)=0.0 + ENDDO + ELSE IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN + CALL LCMGTC(IPMAC,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMGET(IPMAC,HADF(ITYPE),ADF2(1,1,ITYPE)) + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) ADF2(IBM,:NGRP,ITYPE)=0.0 + ENDDO + ENDDO + ELSE IF(IDF.EQ.4) THEN + CALL LCMGTC(IPMAC,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMGET(IPMAC,HADF(ITYPE),ADF2M(1,1,1,ITYPE)) + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) ADF2M(IBM,:NGRP,:NGRP,ITYPE)=0.0 + ENDDO + ENDDO + ENDIF + CALL LCMSIX(IPMAC,' ',2) + ENDIF + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) THEN + IF(NALBP.NE.0) ALBP2(IBM,:NALBP,:NGRP)=0.0 + ZKINF(IBM)=0.0 + ZKEFF(IBM)=0.0 + ENDIF + ENDDO + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + ISTATE(8)=NALBP + ISTATE(12)=IDF + ISTATE(16)=NGFF + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) +* + ENDIF !IACCS +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + DO 210 ICAL=1,NCAL + MPCPO=LCMGIL(LPCPO,ICAL) + DO 200 IBM=1,NMIX + WEIGHT=TERP(ICAL,IBM) + IF((MIXC(IBM).NE.IBMOLD).OR.(WEIGHT.EQ.0.0)) GO TO 200 +*---- +* PERFORM INTERPOLATION +*---- +*---- +* PROCESS GROUP FORM FACTOR (GFF) INFORMATION +*---- + IF(NGFF.NE.0) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'GFF',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(MPCPO,'GFF',1) + CALL LCMLEN(MPCPO,'NWT0',ILONG,ITYLCM) + IF(ILONG.GT.NGFF*NGRP*(2+MAXIFX)) THEN + CALL LCMLIB(MPCPO) + WRITE(6,'(6H NGFF=,I6,6H NGRP=,I6,11H LEN(NWT0)=,I6)') + > NGFF,NGRP,ILONG + CALL XABORT('NCRAGF: MAXIFX OVERFLOW.') + ENDIF + CALL LCMGET(MPCPO,'NWT0',GAR5(1,1,1)) + CALL LCMGET(MPCPO,'H-FACTOR',GAR5(1,1,2)) + CALL LCMLEN(MPCPO,'FINF_NUMBER ',NFINF,ITYLCM) + IF(NFINF.GT.0) THEN + CALL LCMGET(MPCPO,'FINF_NUMBER ',FINF) + DO I=1,NFINF + WRITE(FINFN,'(5HFINF_,I3.3)') FINF(I) + CALL LCMGET(MPCPO,FINFN,GAR5(1,1,2+I)) + ENDDO + ENDIF + DO IGFF=1,NGFF + DO IGR=1,NGRP + GFF(IBM,IGFF,IGR,1)=GFF(IBM,IGFF,IGR,1) + 1 +WEIGHT*GAR5(IGFF,IGR,1) + GFF(IBM,IGFF,IGR,2)=GFF(IBM,IGFF,IGR,2) + 1 +WEIGHT*GAR5(IGFF,IGR,2) + DO I=1,NFINF + GFF(IBM,IGFF,IGR,2+I)=GFF(IBM,IGFF,IGR,2+I) + 1 +WEIGHT*GAR5(IGFF,IGR,2+I) + ENDDO + ENDDO + ENDDO + CALL LCMSIX(MPCPO,' ',2) + ENDIF + CALL LCMSIX(MPCPO,' ',2) + ENDIF +*---- +* PROCESS ADF INFORMATION +*---- + IF(IDF.NE.0) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'ADF',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(MPCPO,'ADF',1) + IF(IDF.EQ.1) THEN + GAR6(:NGRP,:2)=0.0 + CALL LCMGET(MPCPO,'ALBS00',GAR6) + DO IGR=1,NGRP + ADF2(IBM,IGR,:2)=ADF2(IBM,IGR,:2)+WEIGHT*GAR6(IGR,:2) + ENDDO + ELSE IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN + CALL LCMGET(MPCPO,'NTYPE',NTYPE2) + ALLOCATE(HADF2(NTYPE2)) + CALL LCMGTC(MPCPO,'HADF',8,NTYPE2,HADF2) + IF(NTYPE2.EQ.1) THEN +* assign the same ADF to all sides. + CALL LCMLEN(MPCPO,HADF2(1),ILONG,ITYLCM) + IF(ILONG.NE.NGRP) CALL XABORT('NCRAGF: INVALID ADF LENGT' + 1 //'H(1).') + CALL LCMGET(MPCPO,HADF2(1),GAR4) + DO ITYPE=1,NTYPE + DO IGR=1,NGRP + ADF2(IBM,IGR,ITYPE)=ADF2(IBM,IGR,ITYPE)+WEIGHT* + 1 GAR4(IGR) + ENDDO + ENDDO + ELSE + IF(NTYPE2.GT.NTYPE) CALL XABORT('NCRAGF: NTYPE OVERFLOW.') + DO ITYP2=1,NTYPE2 + ITYPE=0 + DO JTYPE=1,NTYPE + IF(HADF2(ITYP2).EQ.HADF(JTYPE)) THEN + ITYPE=JTYPE + GO TO 180 + ENDIF + ENDDO + WRITE(HSMG,'(18HNCRAGF: ADF NAMED ,A,11H NOT FOUND.)') + 1 TRIM(HADF2(ITYP2)) + CALL XABORT(HSMG) + 180 CALL LCMLEN(MPCPO,HADF2(ITYP2),ILONG,ITYLCM) + IF(ILONG.NE.NGRP) CALL XABORT('NCRAGF: INVALID ADF LEN' + 1 //'GTH(2).') + CALL LCMGET(MPCPO,HADF2(ITYP2),GAR4) + DO IGR=1,NGRP + ADF2(IBM,IGR,ITYPE)=ADF2(IBM,IGR,ITYPE)+WEIGHT* + 1 GAR4(IGR) + ENDDO + ENDDO + ENDIF + DEALLOCATE(HADF2) + ELSE IF(IDF.EQ.4) THEN + CALL LCMGET(MPCPO,'NTYPE',NTYPE2) + ALLOCATE(HADF2(NTYPE2)) + CALL LCMGTC(MPCPO,'HADF',8,NTYPE2,HADF2) + IF(NTYPE2.EQ.1) THEN +* assign the same MADF to all sides. + CALL LCMLEN(MPCPO,HADF2(1),ILONG,ITYLCM) + IF(ILONG.NE.NGRP*NGRP) CALL XABORT('NCRAGF: INVALID ADFM' + 1 //'LENGTH(1).') + CALL LCMGET(MPCPO,HADF2(1),GAR4) + DO ITYPE=1,NTYPE + DO JGR=1,NGRP + DO IGR=1,NGRP + ADF2M(IBM,IGR,JGR,ITYPE)=ADF2M(IBM,IGR,JGR,ITYPE)+ + 1 WEIGHT*GAR4((JGR-1)*NGRP+IGR) + ENDDO + ENDDO + ENDDO + ELSE + IF(NTYPE2.GT.NTYPE) CALL XABORT('NCRAGF: NTYPE OVERFLOW.') + DO ITYP2=1,NTYPE2 + ITYPE=0 + DO JTYPE=1,NTYPE + IF(HADF2(ITYP2).EQ.HADF(JTYPE)) THEN + ITYPE=JTYPE + GO TO 190 + ENDIF + ENDDO + WRITE(HSMG,'(19HNCRAGF: ADFM NAMED ,A,11H NOT FOUND.)') + 1 TRIM(HADF2(ITYP2)) + CALL XABORT(HSMG) + CALL LCMLEN(MPCPO,HADF2(ITYP2),ILONG,ITYLCM) + 190 IF(ILONG.NE.NGRP*NGRP) CALL XABORT('NCRAGF: INVALID AD' + 1 //'FM LENGTH(2).') + CALL LCMGET(MPCPO,HADF2(ITYP2),GAR4) + DO JGR=1,NGRP + DO IGR=1,NGRP + ADF2M(IBM,IGR,JGR,ITYPE)=ADF2M(IBM,IGR,JGR,ITYPE)+ + 1 WEIGHT*GAR4((JGR-1)*NGRP+IGR) + ENDDO + ENDDO + ENDDO + ENDIF + DEALLOCATE(HADF2) + ENDIF + CALL LCMSIX(MPCPO,' ',2) + ENDIF + CALL LCMSIX(MPCPO,' ',2) + ENDIF +*---- +* PROCESS PHYSICAL ALBEDO INFORMATION +*---- + IF(NALBP.NE.0) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMGET(MPCPO,'ALBEDO',ALBP) + DO IGR=1,NGRP + DO IAL=1,NALBP + FACTOR=(1.0-ALBP(IAL,IGR))/(1.0+ALBP(IAL,IGR)) + ALBP2(IBM,IAL,IGR)=ALBP2(IBM,IAL,IGR)+WEIGHT*FACTOR + ENDDO + ENDDO + CALL LCMSIX(MPCPO,' ',2) + ENDIF +*---- +* PROCESS KINF +*---- + CALL LCMLEN(MPCPO,'K-INFINITY',IKINF,ITYLCM) + IF(IKINF.EQ.1) THEN + CALL LCMGET(MPCPO,'K-INFINITY',ZZZ) + ZKINF(IBM)=ZKINF(IBM)+WEIGHT*ZZZ + ENDIF +*---- +* PROCESS KEFF +*---- + CALL LCMLEN(MPCPO,'K-EFFECTIVE',IKEFF,ITYLCM) + IF(IKEFF.EQ.1) THEN + CALL LCMGET(MPCPO,'K-EFFECTIVE',ZZZ) + ZKEFF(IBM)=ZKEFF(IBM)+WEIGHT*ZZZ + ENDIF + 200 CONTINUE + 210 CONTINUE +*---- +* WRITE INTERPOLATED MACROLIB INFORMATION +*---- + IF(IDF.EQ.1) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'ALBS00',NMIX*NGRP*2,2,ADF2(1,1,1)) + CALL LCMSIX(IPMAC,' ',2) + ELSE IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGTC(IPMAC,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMPUT(IPMAC,HADF(ITYPE),NMIX*NGRP,2, + 1 ADF2(1,1,ITYPE)) + ENDDO + CALL LCMSIX(IPMAC,' ',2) + IF(IMPX.GT.1) THEN + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + WRITE(6,'(/40H NCRAGF: DISCONTINUITY FACTORS - MIXTURE,I5)') + 1 IBM + DO ITYPE=1,NTYPE + WRITE(6,'(1X,A,1H:,1P,(5X,10E12.4))') TRIM(HADF(ITYPE)), + 1 (ADF2(IBM,IGR,ITYPE),IGR=1,NGRP) + ENDDO + ENDDO + ENDIF + ELSE IF(IDF.EQ.4) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGTC(IPMAC,'HADF',8,NTYPE,HADF) + DO ITYPE=1,NTYPE + CALL LCMPUT(IPMAC,HADF(ITYPE),NMIX*NGRP*NGRP,2, + 1 ADF2M(1,1,1,ITYPE)) + ENDDO + CALL LCMSIX(IPMAC,' ',2) + IF(IMPX.GT.1) THEN + DO IBM=1,NMIX + IF(MIXC(IBM).EQ.0) CYCLE + WRITE(6,'(/40H NCRAGF: DISCONTINUITY FACTORS - MIXTURE,I5)') + 1 IBM + DO ITYPE=1,NTYPE + WRITE(6,'(1X,A,1H:,1P,(5X,10E12.4))') TRIM(HADF(ITYPE)), + 1 ((ADF2M(IBM,IGR,JGR,ITYPE),IGR=1,NGRP),JGR=1,NGRP) + ENDDO + ENDDO + ENDIF + ENDIF + IF(NGFF.NE.0) THEN + CALL LCMSIX(IPMAC,'GFF',1) + CALL LCMPUT(IPMAC,'NWT0',NMIX*NGFF*NGRP,2,GFF(1,1,1,1)) + CALL LCMPUT(IPMAC,'H-FACTOR',NMIX*NGFF*NGRP,2,GFF(1,1,1,2)) + IF(NFINF.GT.0) THEN + CALL LCMGET(IPMAC,'FINF_NUMBER ',FINF) + DO I=1,NFINF + WRITE(FINFN,'(5HFINF_,I3.3)') FINF(I) + CALL LCMPUT(IPMAC,FINFN,NMIX*NGFF*NGRP,2,GFF(1,1,1,2+I)) + ENDDO + ENDIF + CALL LCMSIX(IPMAC,' ',2) + ENDIF + IACCS=1 +*---- +* END OF OVERALL MULTICOMPO MIXTURE LOOP +*---- + IF(IMPX.GT.0) WRITE(IOUT,'(/33H NCRAGF: PROCESS MULTICOMPO MIXTU, + 1 6HRE-OUT,I5)') IBMOLD + 500 CONTINUE +*---- +* AVERAGE PHYSICAL ALBEDO INFORMATION +*---- + IF(NALBP.NE.0) THEN + ALLOCATE(VOL(NMIX)) + CALL LCMGET(IPMAC,'VOLUME',VOL) + DO IGR=1,NGRP + DO IAL=1,NALBP + GAR1=0.0D0 + GAR2=0.0D0 + DO IBM=1,NMIX + GAR1=GAR1+ALBP2(IBM,IAL,IGR)*VOL(IBM) + GAR2=GAR2+VOL(IBM) + ENDDO + ALBP(IAL,IGR)=REAL((1.0D0-GAR1/GAR2)/(1.0D0+GAR1/GAR2)) + ENDDO + ENDDO + DEALLOCATE(VOL) + CALL LCMPUT(IPMAC,'ALBEDO',NALBP*NGRP,2,ALBP(1,1)) + ENDIF +*---- +* AVERAGE KINF +*---- + IF(IKINF.EQ.1) THEN + ALLOCATE(VOL(NMIX)) + CALL LCMGET(IPMAC,'VOLUME',VOL) + GAR1=0.0D0 + GAR2=0.0D0 + DO IBM=1,NMIX + GAR1=GAR1+ZKINF(IBM)*VOL(IBM) + GAR2=GAR2+VOL(IBM) + ENDDO + ZZZ=REAL(GAR1/GAR2) + DEALLOCATE(VOL) + CALL LCMPUT(IPMAC,'K-INFINITY',1,2,ZZZ) + ENDIF +*---- +* AVERAGE KEFF +*---- + IF(IKEFF.EQ.1) THEN + ALLOCATE(VOL(NMIX)) + CALL LCMGET(IPMAC,'VOLUME',VOL) + GAR1=0.0D0 + GAR2=0.0D0 + DO IBM=1,NMIX + GAR1=GAR1+ZKEFF(IBM)*VOL(IBM) + GAR2=GAR2+VOL(IBM) + ENDDO + ZZZ=REAL(GAR1/GAR2) + DEALLOCATE(VOL) + CALL LCMPUT(IPMAC,'K-EFFECTIVE',1,2,ZZZ) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ADF2M,ADF2,HADF,ZKEFF,ZKINF,ALBP2,ALBP,GAR5,GFF,GAR6, + 1 GAR4) + RETURN + END diff --git a/Donjon/src/NCRCAL.f90 b/Donjon/src/NCRCAL.f90 new file mode 100644 index 0000000..a080b73 --- /dev/null +++ b/Donjon/src/NCRCAL.f90 @@ -0,0 +1,62 @@ +RECURSIVE INTEGER FUNCTION NCRCAL(II,NVP,NPTOT,DEBARB,ARBVAL,MUPLET) RESULT(ICAL) +! +!----------------------------------------------------------------------- +! +!Purpose: +! find the position of an elementary calculation in the multicompo, Apex +! file or in the Saphyb. +! +!Copyright: +! Copyright (C) 2012 Ecole Polytechnique de Montreal +! +!Author(s): +! A. Hebert +! +!Parameters: input +! II position in DEBARB. Must be set to 1 in the first call. +! NVP number of nodes in the parameter tree. +! NPTOT number of parameters. +! DEBARB tree information +! ARBVAL tree information +! MUPLET tuple used to identify an elementary calculation. +! +!Parameters: output +! ICAL position of the elementary calculation (=0 if does not exist; +! =-1 if more than one exists). +! +!----------------------------------------------------------------------- +! + IMPLICIT NONE + !---- + ! SUBROUTINE ARGUMENTS + !---- + INTEGER IKEEP, I, JICAL, NBOK + INTEGER II,NVP,NPTOT,DEBARB(NVP+1),ARBVAL(NVP),MUPLET(NPTOT) + ! + IF(NPTOT==0) THEN + ICAL=DEBARB(II+1) + RETURN + ENDIF + NBOK=0 + IKEEP=0 + DO I=DEBARB(II),DEBARB(II+1)-1 + IF((MUPLET(1)==0).OR.(MUPLET(1)==ARBVAL(I))) THEN + JICAL=NCRCAL(I,NVP,NPTOT-1,DEBARB,ARBVAL,MUPLET(2)) + IF(JICAL > 0) THEN + IKEEP=JICAL + NBOK=NBOK+1 + ELSE IF(JICAL==-1) THEN + NBOK=2 + ENDIF + ENDIF + ENDDO + IF(NBOK > 1) THEN + ! Many elementary calculation exist for this tuple. + ICAL=-1 + ELSE IF(NBOK==0) THEN + ! No elementary calculation exists for this tuple. + ICAL=0 + ELSE + ICAL=IKEEP + ENDIF +END FUNCTION NCRCAL diff --git a/Donjon/src/NCRDRV.f b/Donjon/src/NCRDRV.f new file mode 100644 index 0000000..c7203b8 --- /dev/null +++ b/Donjon/src/NCRDRV.f @@ -0,0 +1,482 @@ +*DECK NCRDRV + SUBROUTINE NCRDRV(IPCPO,LCUBIC,NMIX,IMPX,NMIL,NCAL,ITER,MAXNIS, + 1 MIXC,TERP,NISO,LISO,HISO,CONC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for multicompo interpolation. Use user-defined +* global and local parameters. +* +*Copyright: +* Copyright (C) 2006 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert and R. Chambon +* +*Parameters: input +* IPCPO address of the multicompo object. +* LCUBIC =.TRUE.: cubic Ceschino interpolation; =.FALSE: linear +* Lagrange interpolation. +* NMIX maximum number of material mixtures in the microlib. +* IMPX print parameter (equal to zero for no print). +* NMIL number of material mixtures in the multicompo. +* NCAL number of elementary calculations in the multicompo. +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another multicompo; +* =2 use another L_MAP + multicompo). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the multicompo 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 multicompo value +* is used. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXISD=200 + TYPE(C_PTR) IPCPO + INTEGER NMIX,IMPX,NMIL,NCAL,ITER,MAXNIS,MIXC(NMIX), + 1 NISO(NMIX),HISO(2,NMIX,MAXISD) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXISD) + LOGICAL LCUBIC,LISO(NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXLIN=50 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + INTEGER, PARAMETER::NSTATE=40 + REAL, PARAMETER::REPS=1.0E-4 + REAL FLOTT, SUM + INTEGER I0, IBMOLD, IBM, ICAL, INDIC, IPAR, ITYLCM, ITYPE, I, + & JBM, J, LENGTH, NCOMLI, NITMA, NLOC, NPAR + CHARACTER TEXT12*12,PARKEY(MAXPAR)*12,PARFMT(MAXPAR)*8, + 1 PARKEL(MAXPAR)*12,HSMG*131,COMMEN(MAXLIN)*80,VALH(MAXPAR)*12, + 2 RECNAM*12,VCHAR(MAXVAL)*12,HCUBIC*12 + INTEGER ISTATE(NSTATE),VALI(MAXPAR),NVALUE(MAXPAR),VINTE(MAXVAL), + 1 MUPLET(2*MAXPAR),MUTYPE(2*MAXPAR) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2),VREAL(MAXVAL) + LOGICAL LCUB2(MAXPAR) + TYPE(C_PTR) JPCPO,KPCPO,LPCPO + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LDELTA +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(LDELTA(NMIX)) +*---- +* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE MULTICOMPO. +*---- + CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE) + NPAR=ISTATE(5) + NLOC=ISTATE(6) + NCOMLI=ISTATE(10) + CALL LCMGTC(IPCPO,'COMMENT',80,NCOMLI,COMMEN) + IF(NPAR.GT.0) THEN + CALL LCMSIX(IPCPO,'GLOBAL',1) + CALL LCMGTC(IPCPO,'PARKEY',12,NPAR,PARKEY) + CALL LCMGTC(IPCPO,'PARFMT',8,NPAR,PARFMT) + CALL LCMGET(IPCPO,'NVALUE',NVALUE) + IF(IMPX.GT.0)THEN + DO IPAR=1,NPAR + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + IF(PARFMT(IPAR).EQ.'INTEGER') THEN + CALL LCMGET(IPCPO,RECNAM,VINTE) + WRITE(IOUT,'(13H NCRDRV: KEY=,A,18H TABULATED POINTS=, + 1 1P,6I12/(43X,6I12))') PARKEY(IPAR),(VINTE(I),I=1, + 2 NVALUE(IPAR)) + ELSE IF(PARFMT(IPAR).EQ.'REAL') THEN + CALL LCMGET(IPCPO,RECNAM,VREAL) + WRITE(IOUT,'(13H NCRDRV: KEY=,A,18H TABULATED POINTS=, + 1 1P,6E12.4/(43X,6E12.4))') PARKEY(IPAR),(VREAL(I),I=1, + 2 NVALUE(IPAR)) + ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN + CALL LCMGTC(IPCPO,RECNAM,12,NVALUE(IPAR),VCHAR) + WRITE(IOUT,'(13H NCRDRV: KEY=,A,18H TABULATED POINTS=, + 1 1P,6A12/(43X,6A12))') PARKEY(IPAR),(VCHAR(I),I=1, + 2 NVALUE(IPAR)) + ENDIF + ENDDO + ENDIF + CALL LCMSIX(IPCPO,' ',2) + ENDIF + IF(NLOC.GT.0) THEN + CALL LCMSIX(IPCPO,'LOCAL',1) + CALL LCMGTC(IPCPO,'PARKEY',12,NLOC,PARKEL) + CALL LCMSIX(IPCPO,' ',2) + JPCPO=LCMGID(IPCPO,'MIXTURES') + DO IBMOLD=1,NMIL + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + IF(IMPX.GT.0)THEN + WRITE(IOUT,'(17H NCRDRV: MIXTURE=,I6)') IBMOLD + DO IPAR=1,NLOC + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + CALL LCMGET(LPCPO,RECNAM,VREAL) + WRITE(IOUT,'(13H NCRDRV: KEY=,A,18H TABULATED POINTS=, + 1 1P,6E12.4/(43X,6E12.4))') PARKEL(IPAR),(VREAL(I),I=1, + 2 NVALUE(IPAR)) + ENDDO + ENDIF + ENDDO + ENDIF + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(43H NCRDRV: NUMBER OF CALCULATIONS IN MULTICOM, + 1 3HPO=,I5)') NCAL + WRITE(IOUT,'(43H NCRDRV: NUMBER OF MATERIAL MIXTURES IN MUL, + 1 8HTICOMPO=,I5)') NMIL + WRITE(IOUT,'(43H NCRDRV: NUMBER OF MATERIAL MIXTURES IN MIC, + 1 6HROLIB=,I6)') NMIX + WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI) + ENDIF + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 +*---- +* 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 + NISO(:NMIX)=0 + LISO(:NMIX)=.TRUE. + LDELTA(:NMIX)=.FALSE. + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: CHARACTER DATA EXPECTED.') + 20 IF(TEXT12.EQ.'MIX') THEN + MUPLET(:NPAR+NLOC)=0 + MUTYPE(:NPAR+NLOC)=0 + VALI(:NPAR)=0 + VALR(:NPAR+NLOC,1)=0.0 + VALR(:NPAR+NLOC,2)=0.0 + DO 30 I=1,NPAR + VALH(I)=' ' + 30 CONTINUE + LCUB2(:NPAR+NLOC)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('NCRDRV: INTEGER DATA EXPECTED.') + IF(IBM.GT.NMIX) CALL XABORT('NCRDRV: NMIX OVERFLOW.') + IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'FROM') THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('NCRDRV: INTEGER DATA EXPECTED.') + IF(IBMOLD.GT.NMIL) CALL XABORT('NCRDRV: MPO MIX OVERFLOW' + 1 //'(1).') + MIXC(IBM)=IBMOLD + GO TO 10 + ELSE IF(TEXT12.EQ.'USE') THEN + IF(IBM.GT.NMIL) CALL XABORT('NCRDRV: MPO MIX OVERFLOW(2).') + MIXC(IBM)=IBM + GO TO 10 + ENDIF + MIXC(IBM)=IBMOLD + GO TO 20 + ELSE IF(TEXT12.EQ.'MICRO') THEN + IF(IBM.EQ.0) CALL XABORT('NCRDRV: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'ALL') THEN + LISO(IBM)=.TRUE. + ELSE IF(TEXT12.EQ.'ONLY') THEN + LISO(IBM)=.FALSE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: CHARACTER DATA EXPECTED.') + 40 IF(TEXT12.EQ.'ENDMIX') THEN + GO TO 20 + ELSE + NISO(IBM)=NISO(IBM)+1 + IF(NISO(IBM).GT.MAXISD) CALL XABORT('NCRDRV: MAXISD OVERFL' + 1 //'OW.') + MAXNIS=MAX(MAXNIS,NISO(IBM)) + READ(TEXT12,'(2A4)') (HISO(I0,IBM,NISO(IBM)),I0=1,2) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + CONC(IBM,NISO(IBM))=FLOTT + ELSE IF((INDIC.EQ.3).AND.(TEXT12.EQ.'*')) THEN + CONC(IBM,NISO(IBM))=-99.99 + ELSE + CALL XABORT('NCRDRV: INVALID HISO DATA.') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: CHARACTER DATA EXPECTE' + 1 //'D.') + GO TO 40 + ENDIF + ELSE IF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA')) THEN + IF(IBM.EQ.0) CALL XABORT('NCRDRV: MIX NOT SET (2).') + ITYPE=0 + IF(TEXT12.EQ.'SET') THEN + ITYPE=1 + ELSE IF(TEXT12.EQ.'DELTA') THEN + ITYPE=2 + LDELTA(IBM)=.TRUE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: CHARACTER DATA EXPECTED.') + 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('NCRDRV: CHARACTER DATA EXPECTED.') + DO 50 I=1,NPAR + IF(TEXT12.EQ.PARKEY(I)) THEN + IPAR=I + GO TO 60 + ENDIF + 50 CONTINUE + GO TO 100 + 60 IF(HCUBIC.EQ.'LINEAR') THEN + LCUB2(IPAR)=.FALSE. + ELSE IF(HCUBIC.EQ.'CUBIC') THEN + LCUB2(IPAR)=.TRUE. + ENDIF + LPCPO=LCMGID(IPCPO,'GLOBAL') + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('NCRDRV: MAXVAL OVERFL' + 1 //'OW.') + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0) THEN + WRITE(HSMG,'(25HNCRDRV: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 PARKEY(IPAR) + CALL XABORT(HSMG) + ENDIF + IF(PARFMT(IPAR).EQ.'INTEGER') THEN + IF(ITYPE.NE.1) CALL XABORT('NCRDRV: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('NCRDRV: INTEGER DATA EXPECTED.') + CALL LCMGET(LPCPO,RECNAM,VINTE) + DO 70 J=1,NVALUE(IPAR) + IF(VALI(IPAR).EQ.VINTE(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GO TO 10 + ENDIF + 70 CONTINUE + WRITE(HSMG,'(26HNCRDRV: INTEGER PARAMETER ,A,11H WITH VALUE, + 1 I5,34H NOT FOUND IN MULTICOMPO DATABASE.)') PARKEY(IPAR), + 2 VALI(IPAR) + CALL XABORT(HSMG) + ELSE IF(PARFMT(IPAR).EQ.'REAL') THEN + CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('NCRDRV: REAL DATA EXPECTED.') + VALR(IPAR,2)=VALR(IPAR,1) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + VALR(IPAR,2)=FLOTT + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + CALL LCMGET(LPCPO,RECNAM,VREAL) + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) THEN + DO 80 J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN + MUPLET(IPAR)=J + IF(ITYPE.NE.1) MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 20 + ENDIF + 80 CONTINUE + ENDIF + IF(VALR(IPAR,1).LT.VREAL(1)) THEN + WRITE(HSMG,'(23HNCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (<,E12.4,1H))') + 2 PARKEY(IPAR),VALR(IPAR,1),VREAL(1) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,2).GT.VREAL(NVALUE(IPAR))) THEN + WRITE(HSMG,'(23HNCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (>,E12.4,1H))') + 2 PARKEY(IPAR),VALR(IPAR,1),VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,1).GT.VALR(IPAR,2)) THEN + WRITE(HSMG,'(23HNCRDRV: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,1H.)') PARKEY(IPAR), + 2 VALR(IPAR,1),VALR(IPAR,2) + CALL XABORT(HSMG) + ENDIF + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 20 + ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN + IF(ITYPE.NE.1) CALL XABORT('NCRDRV: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3) CALL XABORT('NCRDRV: STRING DATA EXPECTED.') + CALL LCMGTC(LPCPO,RECNAM,12,NVALUE(IPAR),VCHAR) + DO 90 J=1,NVALUE(IPAR) + IF(VALH(IPAR).EQ.VCHAR(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GO TO 10 + ENDIF + 90 CONTINUE + WRITE(HSMG,'(25HNCRDRV: STRING PARAMETER ,A,12H WITH VALUE , + 1 A12,34H NOT FOUND IN MULTICOMPO DATABASE.)') PARKEY(IPAR), + 2 VALH(IPAR) + CALL XABORT(HSMG) + ENDIF + 100 DO 110 I=1,NLOC + IF(TEXT12.EQ.PARKEL(I)) THEN + IPAR=NPAR+I + GO TO 120 + ENDIF + 110 CONTINUE + CALL XABORT('NCRDRV: PARAMETER '//TEXT12//' NOT FOUND.') + 120 LCUB2(IPAR)=LCUBIC + JPCPO=LCMGID(IPCPO,'MIXTURES') + IBMOLD=MIXC(IBM) + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('NCRDRV: REAL DATA EXPECTED.') + VALR(IPAR,2)=VALR(IPAR,1) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + VALR(IPAR,2)=FLOTT + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + WRITE(RECNAM,'(''pval'',I8.8)') IPAR-NPAR + CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0) THEN + WRITE(HSMG,'(24HNCRDRV: LOCAL PARAMETER ,A,9H NOT SET.)') + 1 PARKEL(IPAR-NPAR) + CALL XABORT(HSMG) + ELSE IF(LENGTH.GT.MAXVAL) THEN + CALL XABORT('NCRDRV: MAXVAL OVERFLOW.') + ENDIF + CALL LCMGET(LPCPO,RECNAM,VREAL) + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) THEN + DO 130 J=1,NVALUE(IPAR-NPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN + MUPLET(IPAR)=J + IF(ITYPE.NE.1) MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 20 + ENDIF + 130 CONTINUE + ENDIF + IF(VALR(IPAR,1).LT.VREAL(1)) THEN + WRITE(HSMG,'(23HNCRDRV: REAL PARAMETER ,A,11H WITH VALUE, + 1 1P,E12.4,25H IS OUTSIDE THE DOMAIN (<,E12.4,1H))') + 2 PARKEL(IPAR-NPAR),VALR(IPAR,1),VREAL(1) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,2).GT.VREAL(NVALUE(IPAR-NPAR))) THEN + WRITE(HSMG,'(23HNCRDRV: REAL PARAMETER ,A,11H WITH VALUE, + 1 1P,E12.4,25H IS OUTSIDE THE DOMAIN (>,E12.4,1H))') + 2 PARKEL(IPAR-NPAR),VALR(IPAR,2),VREAL(NVALUE(IPAR-NPAR)) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,1).GT.VALR(IPAR,2)) THEN + WRITE(HSMG,'(23HNCRDRV: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,1H.)') PARKEL(IPAR-NPAR), + 2 VALR(IPAR,1),VALR(IPAR,2) + CALL XABORT(HSMG) + ENDIF + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 20 + ELSE IF(TEXT12.EQ.'ENDMIX') THEN +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(PARFMT(IPAR).EQ.'REAL')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H NCRDRV: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H NCRDRV: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') PARKEY(IPAR) + ENDIF + ENDIF + ENDDO + DO IPAR=1,NLOC + IF(LCUB2(NPAR+IPAR)) THEN + WRITE(IOUT,'(25H NCRDRV: LOCAL PARAMETER:,A12,8H ->CUBIC, + 1 14HINTERPOLATION.)') PARKEL(IPAR) + ELSE + WRITE(IOUT,'(25H NCRDRV: LOCAL PARAMETER:,A12,8H ->LINEA, + 1 16HR INTERPOLATION.)') PARKEL(IPAR) + ENDIF + ENDDO + ENDIF + IF(IBMOLD.GT.NMIL) CALL XABORT('NCRDRV: MPO MIX OVERFLOW(3).') + IF(IBM.GT.NMIX) CALL XABORT('NCRDRV: MIX OVERFLOW (MICROLIB).') + IF(NCAL.EQ.1) THEN + TERP(1,IBM)=1.0 + ELSE + CALL NCRTRP(IPCPO,LCUB2,IMPX,IBMOLD,NPAR,NLOC,NCAL,MUPLET, + 1 MUTYPE,VALR,0.0,TERP(1,IBM)) + ENDIF + IBM=0 + ELSE IF((TEXT12.EQ.'COMPO').OR.(TEXT12.EQ.'TABLE').OR. + 1 (TEXT12.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT12.EQ.';') ITER=0 + IF(TEXT12.EQ.'COMPO') ITER=1 + IF(TEXT12.EQ.'TABLE') ITER=2 + DO 150 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 150 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('NCRDRV: MAXNIS OVERFLOW.') + IF(LDELTA(IBM)) THEN + SUM=0.0 + ELSE + SUM=1.0 + ENDIF + DO 140 ICAL=1,NCAL + SUM=SUM-TERP(ICAL,IBM) + 140 CONTINUE + IF(ABS(SUM).GT.1.0E-4) THEN + WRITE(HSMG,'(43HNCRDRV: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 150 CONTINUE + GO TO 160 + ELSE + CALL XABORT('NCRDRV: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 10 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 160 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H NCRDRV: INTERPOLATION FACTORS)') + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) THEN + WRITE(IOUT,170) ICAL,(TERP(ICAL,JBM),JBM=1,NMIX) + EXIT + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(LDELTA) + RETURN + 170 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/NCRISO.f b/Donjon/src/NCRISO.f new file mode 100644 index 0000000..bce4633 --- /dev/null +++ b/Donjon/src/NCRISO.f @@ -0,0 +1,338 @@ +*DECK NCRISO + SUBROUTINE NCRISO(IPLIB,LPCPO,NBISO1,IMICR,HNAME,JSO,IBM,NCAL, + 1 NGRP,NL,NW,NED,HVECT,NDEL,NBESP,NDFI,IMPX,FACT,TERP,LPURE) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover nuclear data from a single isotopic directory. +* +*Copyright: +* Copyright (C) 2006 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPLIB address of the microlib LCM object. +* LPCPO address of the 'CALCULATIONS' tree in the multidimensional +* multicompo object. +* NBISO1 number of multicompo isotopes. +* IMICR index of microlib isotope corresponding to each multicompo +* isotope in mixture IBM. +* HNAME character*12 name of the multicompo isotope been processed. +* JSO index of the multicompo isotope been processed. +* IBM mixture index. +* NCAL number of elementary calculations in the multicompo object. +* NGRP number of energy groups. +* NL number of Legendre orders. +* NW type of weighting for P1 cross section info (=0 P0; =1 P1). +* NED number of extra vector edits. +* HVECT character names of the extra vector edits. +* NDEL number of delayed precursor groups. +* NBESP number of energy-dependent fission spectra. +* NDFI number of fissile isotopes. +* IMPX print parameter (equal to zero for no print). +* FACT number density factors. +* TERP interpolation weights. +* LPURE flag set to .true. to avoid non-linear interpolation effects. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,LPCPO + INTEGER NBISO1,IMICR(NBISO1),JSO,IBM,NCAL,NGRP,NL,NW,NED,NDEL, + 1 NBESP,NDFI,IMPX + REAL FACT(NCAL),TERP(NCAL) + CHARACTER HNAME*12,HVECT(NED)*(*) + LOGICAL LPURE +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + REAL AWR, DECAY, EMEVF, EMEVG, FACT0, TAUXFI, TAUXF, WEIGHT + INTEGER ICAL, IDEL, ISP, IED, IFI, IG1, IG2, IG, ILENG, IL, + & ITYLCM, J, LENGTH, IW, MAXH, IOF, IOF2H + LOGICAL LAWR,LMEVF,LMEVG,LDECA,LWD,LYIELD,LPIFI + CHARACTER CM*2,TEXT12*12 + TYPE(C_PTR) MPCPO,NPCPO,OPCPO + INTEGER, ALLOCATABLE, DIMENSION(:) :: JPIF1,JPIF2,ITYPR + REAL, ALLOCATABLE, DIMENSION(:) :: YIEL1,PYIE1,YIEL2,PYIE2,WDLA + REAL, ALLOCATABLE, DIMENSION(:,:) :: GAR1,GAR2 + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: WSCA1,WSCA2 + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HMAKE +*---- +* SCRATCH STORAGE ALLOCATION +*---- + MAXH=9+3*NW+NL+NED+2*NDEL+NBESP + ALLOCATE(JPIF1(NDFI),JPIF2(NDFI),ITYPR(NL)) + ALLOCATE(GAR1(NGRP,MAXH),YIEL1(NGRP+1),PYIE1(NDFI), + 1 WSCA1(NGRP,NGRP,NL),GAR2(NGRP,MAXH),YIEL2(NGRP+1),PYIE2(NDFI), + 2 WSCA2(NGRP,NGRP,NL),WDLA(NDEL)) + ALLOCATE(HMAKE(MAXH+NL)) +*---- +* RECOVER GENERIC ISOTOPIC DATA FROM THE MULTICOMPO +*---- + LAWR=.FALSE. + LMEVF=.FALSE. + LMEVG=.FALSE. + LDECA=.FALSE. + LYIELD=.FALSE. + LPIFI=.FALSE. + LWD=.FALSE. + DO 10 ICAL=1,NCAL + MPCPO=LCMGIL(LPCPO,ICAL) + CALL LCMLEN(MPCPO,'ISOTOPESLIST',LENGTH,ITYLCM) + IF(LENGTH.EQ.0) GO TO 10 + NPCPO=LCMGID(MPCPO,'ISOTOPESLIST') + CALL LCMLEL(NPCPO,JSO,ILENG,ITYLCM) + IF(ILENG.EQ.0) GO TO 10 + OPCPO=LCMGIL(NPCPO,JSO) + CALL LCMGTC(OPCPO,'ALIAS',12,TEXT12) + IF(TEXT12(:8).NE.HNAME(:8)) GO TO 10 + CALL LCMLEN(OPCPO,'AWR',LENGTH,ITYLCM) + IF(LENGTH.EQ.1) CALL LCMGET(OPCPO,'AWR',AWR) + LAWR=(LENGTH.EQ.1) + CALL LCMLEN(OPCPO,'MEVF',LENGTH,ITYLCM) + IF(LENGTH.EQ.1) CALL LCMGET(OPCPO,'MEVF',EMEVF) + LMEVF=(LENGTH.EQ.1) + CALL LCMLEN(OPCPO,'MEVG',LENGTH,ITYLCM) + IF(LENGTH.EQ.1) CALL LCMGET(OPCPO,'MEVG',EMEVG) + LMEVG=(LENGTH.EQ.1) + CALL LCMLEN(OPCPO,'DECAY',LENGTH,ITYLCM) + IF(LENGTH.EQ.1) CALL LCMGET(OPCPO,'DECAY',DECAY) + LDECA=(LENGTH.EQ.1) + CALL LCMLEN(OPCPO,'LAMBDA-D',LENGTH,ITYLCM) + LWD=(LENGTH.EQ.NDEL).AND.(NDEL.GT.0) + IF(LWD) CALL LCMGET(OPCPO,'LAMBDA-D',WDLA) + GO TO 15 + 10 CONTINUE + WRITE(6,170) IBM,HNAME + CALL XABORT('NCRISO: UNABLE TO FIND AN ISOTOPE DIRECTORY.') +*---- +* LOOP OVER ELEMENTARY CALCULATIONS +*---- + 15 DO J=1,MAXH+NL + HMAKE(J)=' ' + ENDDO + GAR2(:NGRP,:MAXH)=0.0 + WSCA2(:NGRP,:NGRP,:NL)=0.0 + YIEL2(:NGRP+1)=0.0 + PYIE2(:NDFI)=0.0 + JPIF2(:NDFI)=0 + TAUXFI=0.0 + DO 120 ICAL=1,NCAL + WEIGHT=TERP(ICAL) + IF(WEIGHT.EQ.0.0) GO TO 120 + FACT0=FACT(ICAL) + MPCPO=LCMGIL(LPCPO,ICAL) + IF(IMPX.GT.4) THEN + WRITE(IOUT,'(39H NCRISO: MULTICOMPO ACCESS FOR ISOTOPE ,A, + 1 16H AND CALCULATION,I5,1H.)') HNAME,ICAL + IF(IMPX.GT.50) CALL LCMLIB(MPCPO) + ENDIF + NPCPO=LCMGID(MPCPO,'ISOTOPESLIST') + CALL LCMLEL(NPCPO,JSO,ILENG,ITYLCM) + IF(ILENG.EQ.0) GO TO 120 + OPCPO=LCMGIL(NPCPO,JSO) +*---- +* RECOVER CALCULATION-SPECIFIC ISOTOPIC DATA FROM THE MULTICOMPO +*---- + DO IW=1,MIN(NW+1,10) + WRITE(TEXT12,'(3HNWT,I1)') IW-1 + CALL LCMLEN(OPCPO,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,TEXT12,GAR1(1,IW)) + HMAKE(IW)=TEXT12 + ENDIF + WRITE(TEXT12,'(4HNWAT,I1)') IW-1 + CALL LCMLEN(OPCPO,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,TEXT12,GAR1(1,1+NW+IW)) + HMAKE(1+NW+IW)=TEXT12 + ENDIF + WRITE(TEXT12,'(4HNTOT,I1)') IW-1 + CALL LCMLEN(OPCPO,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,TEXT12,GAR1(1,2+2*NW+IW)) + HMAKE(2+2*NW+IW)=TEXT12 + ENDIF + ENDDO + CALL XDRLGS(OPCPO,-1,IMPX,0,NL-1,1,NGRP,GAR1(1,4+3*NW),WSCA1, + 1 ITYPR) + DO IL=0,NL-1 + IF(ITYPR(IL+1).NE.0) THEN + WRITE (CM,'(I2.2)') IL + HMAKE(4+3*NW+IL)='SIGS'//CM + ENDIF + ENDDO + CALL LCMLEN(OPCPO,'NUSIGF',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,'NUSIGF',GAR1(1,4+3*NW+NL)) + HMAKE(4+3*NW+NL)='NUSIGF' + CALL LCMGET(OPCPO,'CHI',GAR1(1,5+3*NW+NL)) + HMAKE(5+3*NW+NL)='CHI' + ENDIF + IF(NDEL.GT.0) THEN + WRITE(TEXT12,'(6HNUSIGF,I2.2)') NDEL + CALL LCMLEN(OPCPO,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + DO IDEL=1,NDEL + WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL + CALL LCMGET(OPCPO,TEXT12,GAR1(1,5+3*NW+NL+IDEL)) + HMAKE(5+3*NW+NL+IDEL)=TEXT12 + ENDDO + ENDIF + WRITE(TEXT12,'(3HCHI,I2.2)') NDEL + CALL LCMLEN(OPCPO,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + DO IDEL=1,NDEL + WRITE(TEXT12,'(3HCHI,I2.2)') IDEL + CALL LCMGET(OPCPO,TEXT12,GAR1(1,5+3*NW+NL+NDEL+IDEL)) + HMAKE(5+3*NW+NL+NDEL+IDEL)=TEXT12 + ENDDO + ENDIF + ENDIF + IOF2H=9+NED+NL+3*NW+2*NDEL + DO ISP=1,NBESP + WRITE(TEXT12,'(5HCHI--,I2.2)') ISP + CALL LCMLEN(OPCPO,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,TEXT12,GAR1(1,IOF2H+ISP)) + HMAKE(IOF2H+ISP)=TEXT12 + ENDIF + ENDDO + CALL LCMLEN(OPCPO,'H-FACTOR',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,'H-FACTOR',GAR1(1,6+3*NW+NL+2*NDEL)) + HMAKE(6+3*NW+NL+2*NDEL)='H-FACTOR' + ENDIF + CALL LCMLEN(OPCPO,'OVERV',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,'OVERV',GAR1(1,7+3*NW+NL+2*NDEL)) + HMAKE(7+3*NW+NL+2*NDEL)='OVERV' + ENDIF + CALL LCMLEN(OPCPO,'TRANC',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,'TRANC',GAR1(1,8+3*NW+NL+2*NDEL)) + HMAKE(8+3*NW+NL+2*NDEL)='TRANC' + ENDIF + DO IED=1,NED + CALL LCMLEN(OPCPO,HVECT(IED),LENGTH,ITYLCM) + IF((LENGTH.GT.0).AND.(HVECT(IED).NE.'TRANC')) THEN + CALL LCMGET(OPCPO,HVECT(IED),GAR1(1,8+3*NW+NL+2*NDEL+IED)) + HMAKE(8+3*NW+NL+2*NDEL+IED)=HVECT(IED) + ENDIF + ENDDO + CALL LCMLEN(OPCPO,'STRD',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(OPCPO,'STRD',GAR1(1,9+3*NW+NL+NED+2*NDEL)) + HMAKE(9+3*NW+NL+NED+2*NDEL)='STRD' + ENDIF +*---- +* RECOVER FISSION YIELD DATA +*---- + CALL LCMLEN(OPCPO,'YIELD',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP+1) THEN + CALL LCMGET(OPCPO,'YIELD',YIEL1) + LYIELD=.TRUE. + DO IG=1,NGRP+1 + YIEL2(IG)=YIEL2(IG)+WEIGHT*YIEL1(IG) + ENDDO + ENDIF + CALL LCMLEN(OPCPO,'PYIELD',LENGTH,ITYLCM) + IF((LENGTH.GT.0).AND.(LENGTH.EQ.NDFI)) THEN + CALL LCMGET(OPCPO,'PIFI',JPIF1) + CALL LCMGET(OPCPO,'PYIELD',PYIE1) + LPIFI=.TRUE. + DO IFI=1,NDFI + IF(JPIF1(IFI).GT.0) JPIF2(IFI)=IMICR(JPIF1(IFI)) + PYIE2(IFI)=PYIE2(IFI)+WEIGHT*PYIE1(IFI) + ENDDO + ENDIF +*---- +* COMPUTE FISSION RATE FOR A SINGLE ELEMENTARY CALCULATION +*---- + TAUXF=0.0 + IF(HMAKE(4+3*NW+NL).EQ.'NUSIGF') THEN + DO IG=1,NGRP + TAUXF=TAUXF+GAR1(IG,4+3*NW+NL)*GAR1(IG,1) + ENDDO + TAUXFI=TAUXFI+FACT0*WEIGHT*TAUXF + ENDIF +*---- +* ADD CONTRIBUTIONS FROM A SINGLE ELEMENTARY CALCULATION +*---- + DO J=1,MAXH + IF((HMAKE(J).NE.' ').AND.(HMAKE(J)(:4).NE.'SIGS')) THEN + DO IG=1,NGRP + IF((HMAKE(J)(:2).EQ.'NW').OR.(HMAKE(J).EQ.'OVERV')) THEN + GAR2(IG,J)=GAR2(IG,J)+WEIGHT*GAR1(IG,J) + ELSE IF((HMAKE(J)(:3).EQ.'CHI').AND.(.NOT.LPURE)) THEN + GAR2(IG,J)=GAR2(IG,J)+FACT0*WEIGHT*TAUXF*GAR1(IG,J) + ELSE + GAR2(IG,J)=GAR2(IG,J)+FACT0*WEIGHT*GAR1(IG,J) + ENDIF + ENDDO + ENDIF + ENDDO + DO IL=1,NL + IOF=3+3*NW+IL + ITYPR(IL)=0 + IF(HMAKE(MAXH+IL).NE.' ') ITYPR(IL)=1 + DO IG2=1,NGRP + GAR2(IG2,IOF)=GAR2(IG2,IOF)+FACT0*WEIGHT*GAR1(IG2,IOF) + DO IG1=1,NGRP + WSCA2(IG1,IG2,IL)=WSCA2(IG1,IG2,IL)+FACT0*WEIGHT* + 1 WSCA1(IG1,IG2,IL) + ENDDO + ENDDO + ENDDO + 120 CONTINUE +*---- +* NORMALIZE FISSION SPECTRA +*---- + IF(.NOT.LPURE) THEN + DO J=1,MAXH + IF(HMAKE(J)(:3).EQ.'CHI') THEN + DO IG=1,NGRP + IF(GAR2(IG,J).NE.0.0) GAR2(IG,J)=GAR2(IG,J)/TAUXFI + ENDDO + ENDIF + ENDDO + ENDIF +*---- +* SAVE ISOTOPIC DATA IN THE MICROLIB +*---- + CALL LCMPTC(IPLIB,'ALIAS',12,HNAME) + IF(LAWR) CALL LCMPUT(IPLIB,'AWR',1,2,AWR) + IF(LMEVF) CALL LCMPUT(IPLIB,'MEVF',1,2,EMEVF) + IF(LMEVG) CALL LCMPUT(IPLIB,'MEVG',1,2,EMEVG) + IF(LDECA) CALL LCMPUT(IPLIB,'DECAY',1,2,DECAY) + IF(LYIELD) CALL LCMPUT(IPLIB,'YIELD',NGRP+1,2,YIEL2) + IF(LPIFI) THEN + CALL LCMPUT(IPLIB,'PYIELD',NDFI,2,PYIE2) + CALL LCMPUT(IPLIB,'PIFI',NDFI,1,JPIF2) + ENDIF + IF(LWD) CALL LCMPUT(IPLIB,'LAMBDA-D',NDEL,2,WDLA) + DO J=1,MAXH + IF((HMAKE(J).NE.' ').AND.(HMAKE(J)(:4).NE.'SIGS')) THEN + CALL LCMPUT(IPLIB,HMAKE(J),NGRP,2,GAR2(1,J)) + ENDIF + ENDDO + CALL XDRLGS(IPLIB,1,IMPX,0,NL-1,1,NGRP,GAR2(1,4+3*NW),WSCA2,ITYPR) + IF(IMPX.GT.50) CALL LCMLIB(IPLIB) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(HMAKE) + DEALLOCATE(WDLA,WSCA2,PYIE2,YIEL2,GAR2,WSCA1,PYIE1,YIEL1,GAR1) + DEALLOCATE(ITYPR,JPIF2,JPIF1) + RETURN +* + 170 FORMAT(17H NCRISO: MIXTURE=,I5,10H ISOTOPE=',A12,2H'.) + END diff --git a/Donjon/src/NCRLIB.f b/Donjon/src/NCRLIB.f new file mode 100644 index 0000000..f207ed5 --- /dev/null +++ b/Donjon/src/NCRLIB.f @@ -0,0 +1,575 @@ +*DECK NCRLIB + SUBROUTINE NCRLIB(MAXNIS,MAXISO,MAXFEL,IPLIB,IPCPO,IACCS,NMIL, + 1 NMIX,NGRP,NGFF,NALBP,IDF,IMPX,NCAL,TERP,NISO,LISO,HISO,CONC, + 2 MIXC,LXS,LRES,LPURE,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the microlib by scanning the NCAL elementary calculations and +* weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2006 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* MAXISO maximum allocated space for output microlib TOC information. +* MAXFEL number of fuel rings used for the micro-depletion. +* IPLIB address of the output microlib LCM object. +* IPCPO address of the multicompo object. +* IACCS =0 microlib is created; =1 ... is updated. +* NMIL number of material mixtures in the multicompo. +* NMIX maximum number of material mixtures in the microlib. +* NGRP number of energy groups. +* NGFF number of group form factors per energy group. +* NALBP number of physical albedos per energy group. +* IDF ADF type, 0 = none, 1 = Albedo, 2 = FD_B/FD_C/..., 3 = ADF. +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the multicompo. +* 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 multicompo value +* is used. +* MIXC mixture index in the multicompo corresponding to each microlib +* mixture. Equal to zero if a microlib mixture is not updated. +* LXS =.true. if keyword 'ALLX' is specified +* LRES =.true. if the interpolation is done without updating isotopic +* densities +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* B2 buckling +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,IPCPO + INTEGER MAXNIS,MAXISO,MAXFEL,IACCS,NMIL,NMIX,NGRP,NGFF,NALBP, + 1 IDF,IMPX,NCAL,NISO(NMIX),HISO(2,NMIX,MAXNIS),MIXC(NMIX) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + LOGICAL LISO(NMIX),LXS,LRES,LPURE +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXED=50 + INTEGER, PARAMETER::NSTATE=40 + INTEGER I0, IACCOLD, IBMOLD, IBM, ICAL, IED1, IED2, IGR, ILONG, + & ISO, ITRANC, ITYLCM, I, JSO1, JSO, J, KSO1, KSO, NBISO1, NBISO2, + & NBISOT2, NBISOT, NBRG, NCOMB2, NCOMB, NDEL, NBESP, NDEPL, NDFI, + & NED1, NED2, NFINF, NL, NW, NTYPE + REAL WEIGHT + CHARACTER TEXT12*12,HNAME*12,HSMG*131,HVECT1(MAXED)*8, + 1 HVECT2(MAXED)*8,CHAR1*4,CHAR2*4,HHISO*8 + INTEGER ISTATE(NSTATE) + LOGICAL LUSER + TYPE(C_PTR) JPCPO,KPCPO,LPCPO,MPCPO,JPLIB,KPLIB +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: ITYP1,ITOD1,IMIX2,ITYP2, + 1 ITOD2,MILVO,IMICR + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: HUSE1,HNAM1,HUSE2,HNAM2 + REAL, ALLOCATABLE, DIMENSION(:) :: TEMP1,VOL1,DENS2,TEMP2,VOL2, + 1 DENS3,TEMP3,VOL3,ENER,DELT,VOLMI2,GAR1,GAR2 + REAL, ALLOCATABLE, DIMENSION(:,:) :: FACT,DENS1 + TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPLIST + INTEGER NBISS + CHARACTER ISTMPN*12 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(HUSE1(3,MAXISO),HNAM1(3,MAXISO),ITYP1(MAXISO), + 1 ITOD1(MAXISO),IMIX2(MAXISO),ITYP2(MAXISO),ITOD2(MAXISO), + 2 HUSE2(3,MAXISO),HNAM2(3,MAXISO),MILVO(NMIX)) + ALLOCATE(TEMP1(MAXISO),VOL1(MAXISO),DENS2(MAXISO),TEMP2(MAXISO), + 1 VOL2(MAXISO),ENER(NGRP+1),DELT(NGRP),VOLMI2(NMIX),IPLIST(MAXISO)) + IACCOLD=IACCS ! for ADF and GFF +*---- +* MICROLIB INITIALIZATION +*---- + ITRANC=0 + VOLMI2(:NMIX)=0.0 + DENS2(:MAXISO)=0.0 + VOL2(:MAXISO)=0.0 + TEMP2(:MAXISO)=0.0 + IMIX2(:MAXISO)=0 + ITYP2(:MAXISO)=0 + ITOD2(:MAXISO)=0 + IPLIST(:MAXISO)=C_NULL_PTR + IF(IACCS.EQ.0) THEN + IF(LRES) CALL XABORT('NCRLIB: RES OPTION IS INVALID.') + NBISO2=0 + NCOMB2=0 + NED2=0 + TEXT12='L_LIBRARY' + CALL LCMPTC(IPLIB,'SIGNATURE',12,TEXT12) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NMIX) CALL XABORT('NCRLIB: INVALID NUMBER OF ' + 1 //'MATERIAL MIXTURES IN THE MICROLIB.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('NCRLIB: INVALID NUMBER OF ' + 1 //'ENERGY GROUPS IN THE MICROLIB.') + NBISO2=ISTATE(2) + NCOMB2=ISTATE(12) + IF(NBISO2.GT.MAXISO) CALL XABORT('NCRLIB: MAXISO OVERFLOW(1).') + NED2=ISTATE(13) + IF(NED2.GT.MAXED) CALL XABORT('NCRLIB: MAXED OVERFLOW.') + CALL LCMLEN(IPLIB,'MIXTURESVOL',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPLIB,'MIXTURESVOL',VOLMI2) + ELSE + VOLMI2(:NMIX)=0.0 + ENDIF + CALL LCMGET(IPLIB,'ISOTOPESUSED',HUSE2) + CALL LCMGET(IPLIB,'ISOTOPERNAME',HNAM2) + CALL LCMGET(IPLIB,'ISOTOPESTYPE',ITYP2) + CALL LCMGET(IPLIB,'ISOTOPESTODO',ITOD2) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS2) + CALL LCMGET(IPLIB,'ISOTOPESVOL',VOL2) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX2) + CALL LCMGET(IPLIB,'ISOTOPESTEMP',TEMP2) + IF(NED2.GT.0) CALL LCMGTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMGET(IPLIB,'ENERGY',ENER) + CALL LCMGET(IPLIB,'DELTAU',DELT) + ENDIF +*---- +* RECOVER NDEPL +*---- + NDEPL=0 + CALL LCMLEN(IPCPO,'DEPL-CHAIN',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(IPCPO,'DEPL-CHAIN',1) + CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE) + NDEPL=ISTATE(1) + CALL LCMSIX(IPCPO,' ',2) + ENDIF +*---- +* LOOP OVER MICROLIB MIXTURES +*---- + ALLOCATE(DENS3(MAXISO),TEMP3(MAXISO),VOL3(MAXISO)) + MILVO(:NMIX)=0 + NCOMB=0 + JPCPO=LCMGID(IPCPO,'MIXTURES') + NBISS=0 + DO 190 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 190 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('NCRLIB: MAXNIS OVERFLOW.') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'CALCULATIONS') +*---- +* FIND THE VALUE OF NBISO1 IN MIXTURE IBM +*---- + DO ICAL=1,NCAL + IF(TERP(ICAL,IBM).EQ.0.0) CYCLE + MPCPO=LCMGIL(LPCPO,ICAL) + CALL LCMGET(MPCPO,'STATE-VECTOR',ISTATE) + NBISO1=ISTATE(2) + CALL LCMGET(MPCPO,'ISOTOPESUSED',HUSE1) + CALL LCMGET(MPCPO,'ISOTOPERNAME',HNAM1) + EXIT + ENDDO + ALLOCATE(FACT(NCAL,NBISO1),DENS1(NBISO1,NCAL)) +*---- +* LOOP OVER ELEMENTARY CALCULATIONS +*---- + JSO1=0 + DENS3(:NBISO1)=0.0 + VOL3(:NBISO1)=0.0 + TEMP3(:NBISO1)=0.0 + DO 50 ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 50 + MPCPO=LCMGIL(LPCPO,ICAL) + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(38H NCRLIB: MULTICOMPO ACCESS FOR MIXTURE,I8, + 1 5H (<==,I4,17H) AND CALCULATION,I8,9H. WEIGHT=,1P,E12.4)') + 2 IBM,IBMOLD,ICAL,WEIGHT + IF(IMPX.GT.50) CALL LCMLIB(MPCPO) + ENDIF + CALL LCMGET(MPCPO,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.1) CALL XABORT('NCRLIB: INVALID NUMBER OF MATERI' + 1 //'AL MIXTURES IN THE MULTICOMPO.') + IF(ISTATE(2).NE.NBISO1) CALL XABORT('NCRLIB: INVALID NBISO1.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('NCRLIB: INVALID NUMBER OF ENE' + 1 //'RGY GROUPS IN THE MULTICOMPO.') + NL=ISTATE(4) + ITRANC=ISTATE(5) + NDEPL=MAX(ISTATE(11),NDEPL) + NED1=ISTATE(13) + NBESP=ISTATE(16) + NDEL=ISTATE(19) + NDFI=ISTATE(20) + NW=ISTATE(25) + IF(NED1.GT.MAXED) CALL XABORT('NCRLIB: MAXED OVERFLOW.') + CALL LCMLEN(MPCPO,'MIXTURESVOL',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(MPCPO,'MIXTURESVOL',VOLMI2(IBM)) + CALL LCMGET(MPCPO,'ISOTOPESDENS',DENS1(1,ICAL)) + CALL LCMGET(MPCPO,'ISOTOPESTYPE',ITYP1) + CALL LCMGET(MPCPO,'ISOTOPESTODO',ITOD1) + CALL LCMGET(MPCPO,'ISOTOPESVOL',VOL1) + CALL LCMGET(MPCPO,'ISOTOPESTEMP',TEMP1) + IF(NED1.GT.0) CALL LCMGTC(MPCPO,'ADDXSNAME-P0',8,NED1,HVECT1) + CALL LCMGET(MPCPO,'ENERGY',ENER) + CALL LCMGET(MPCPO,'DELTAU',DELT) + DO 30 IED1=1,NED1 + DO 20 IED2=1,NED2 + IF(HVECT1(IED1).EQ.HVECT2(IED2)) GO TO 30 + 20 CONTINUE + NED2=NED2+1 + IF(NED2.GT.MAXED) CALL XABORT('NCRLIB: MAXED OVERFLOW.') + HVECT2(NED2)=HVECT1(IED1) + 30 CONTINUE + DO 49 ISO=1,NBISO1 ! multicompo isotope + WRITE(TEXT12,'(2A4)') (HUSE1(I,ISO),I=1,2) + IF(LXS) THEN + WRITE(CHAR1,'(A4)') HUSE1(3,ISO) + READ(CHAR1,'(I4)') NBRG + NBISOT=NBRG+MAXFEL*(IBM-1) + IF(NBISOT.GT.9999) CALL XABORT('NCRLIB: NBISOT OVERFLOW.') + WRITE(TEXT12,'(2A4,I4.4)') (HUSE1(I,ISO),I=1,2),NBISOT + ENDIF + KSO1=0 + DO 40 KSO=1,NISO(IBM) ! user-selected isotope + WRITE(HHISO,'(2A4)') (HISO(I0,IBM,KSO),I0=1,2) + IF(TEXT12(:8).EQ.HHISO) THEN + KSO1=KSO + GO TO 45 + ENDIF + 40 CONTINUE + 45 LUSER=.FALSE. + IF(KSO1.GT.0) LUSER=(CONC(IBM,KSO1).NE.-99.99) + IF(LUSER) DENS1(ISO,ICAL)=CONC(IBM,KSO1) + DENS3(ISO)=DENS3(ISO)+WEIGHT*DENS1(ISO,ICAL) + VOL3(ISO)=VOL3(ISO)+WEIGHT*VOL1(ISO) + TEMP3(ISO)=TEMP3(ISO)+WEIGHT*TEMP1(ISO) + 49 CONTINUE + 50 CONTINUE + FACT(:NCAL,:NBISO1)=1.0 + IF(.NOT.LPURE) THEN + DO ICAL=1,NCAL + IF(TERP(ICAL,IBM).EQ.0.0) CYCLE + DO ISO=1,NBISO1 ! multicompo isotope + IF(DENS3(ISO).GT.DENS1(ISO,ICAL)*1.0E-9) THEN + FACT(ICAL,ISO)=DENS1(ISO,ICAL)/DENS3(ISO) + ENDIF + ENDDO + ENDDO + ENDIF + DEALLOCATE(DENS1) +*---- +* SET NUMBER DENSITIES AND VOLUMES IN OUTPUT MICROLIB +*---- + IF(LRES) THEN +* -- Number densities are left unchanged except if they are +* -- listed in HISO array. + DO 60 KSO=1,NISO(IBM) ! user-selected isotope + DO JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).NE.IBM) CYCLE + IF((HISO(1,IBM,KSO).EQ.HUSE2(1,JSO)).AND. + 1 (HISO(2,IBM,KSO).EQ.HUSE2(2,JSO))) THEN + IF(CONC(IBM,KSO).EQ.-99.99) THEN +* -- Only number densities of isotopes set with "MICR" and +* -- "*" keywords are interpolated + DENS2(JSO)=0.0 + DO ISO=1,NBISO1 ! multicompo isotope + JSO1=0 + IF((HUSE1(1,ISO).EQ.HUSE2(1,JSO)).AND. + 1 (HUSE1(2,ISO).EQ.HUSE2(2,JSO))) THEN + IF(ITYP1(ISO).NE.ITYP2(JSO)) THEN + WRITE(HSMG,500) 'ITYP',ISO,ITYP1(ISO),ITYP2(JSO) + CALL XABORT(HSMG) + ENDIF + IF(LXS) THEN + WRITE(CHAR1,'(A4)') HUSE1(3,ISO) + WRITE(CHAR2,'(A4)') HUSE2(3,JSO) + READ(CHAR2,'(I4.4)') NBISOT2 + NBISOT2=NBISOT2-MAXFEL*(IBM-1) + WRITE(CHAR2,'(I4.4)') NBISOT2 + IF(CHAR1.EQ.CHAR2) THEN + JSO1=JSO + GO TO 55 + ENDIF + ELSE + JSO1=JSO + GO TO 55 + ENDIF + 55 IF(JSO1.EQ.0) CALL XABORT('NCRLIB: JSO1=0') + DENS2(JSO1)=DENS2(JSO1)+DENS3(ISO) + TEMP2(JSO1)=TEMP3(ISO) + ENDIF + ENDDO + ELSE IF(CONC(IBM,KSO).NE.-99.99) THEN +* -- Number densities of isotopes set with "MICR" and +* -- fixed value are forced to this value + DENS2(JSO)=CONC(IBM,KSO) + ENDIF + GO TO 60 + ENDIF + ENDDO + WRITE(HSMG,'(31HNCRLIB: UNABLE TO FIND ISOTOPE ,2A4,6H IN MI, + 1 5HXTURE,I8,1H.)') HISO(1,IBM,KSO),HISO(2,IBM,KSO),IBM + CALL XABORT(HSMG) + 60 CONTINUE + ELSE +* -- Number densities are interpolated or not according to +* -- ALL/ONLY option + DO JSO=1,NBISO2 ! microlib isotope + IF(IBM.EQ.IMIX2(JSO)) THEN + DO ISO=1,NBISO1 ! multicompo isotope + IF((HUSE1(1,ISO).EQ.HUSE2(1,JSO)).AND. + 1 (HUSE1(2,ISO).EQ.HUSE2(2,JSO))) THEN + DENS2(JSO)=0.0 + VOL2(JSO)=0.0 + CYCLE + ENDIF + ENDDO + ENDIF + ENDDO + DO 110 ISO=1,NBISO1 ! multicompo isotope + WRITE(TEXT12,'(2A4)') (HUSE1(I,ISO),I=1,2) + IF(LXS) THEN + WRITE(CHAR1,'(A4)') HUSE1(3,ISO) + READ(CHAR1,'(I4)') NBRG + NBISOT=NBRG+MAXFEL*(IBM-1) + IF(NBISOT.GT.9999) CALL XABORT('NCRLIB: NBISOT OVERFLOW.') + WRITE(TEXT12,'(2A4,I4.4)') (HUSE1(I,ISO),I=1,2),NBISOT + ENDIF + IF(.NOT.LISO(IBM)) THEN +* --ONLY option + DO KSO=1,NISO(IBM) ! user-selected isotope + WRITE(HHISO,'(2A4)') (HISO(I0,IBM,KSO),I0=1,2) + IF(TEXT12(:8).EQ.HHISO) GO TO 65 + ENDDO + GO TO 110 + ENDIF + 65 DO 70 JSO=1,NBISO2 ! microlib isotope + JSO1=0 + IF((HUSE1(1,ISO).EQ.HUSE2(1,JSO)).AND.(HUSE1(2,ISO).EQ. + 1 HUSE2(2,JSO)).AND.(IMIX2(JSO).EQ.IBM)) THEN + IF(ITYP1(ISO).NE.ITYP2(JSO)) THEN + WRITE(HSMG,500) 'ITYP',ISO,ITYP1(ISO),ITYP2(JSO) + CALL XABORT(HSMG) + ENDIF + IF(LXS) THEN + WRITE(CHAR1,'(A4)') HUSE1(3,ISO) + WRITE(CHAR2,'(A4)') HUSE2(3,JSO) + READ(CHAR2,'(I4.4)') NBISOT2 + NBISOT2=NBISOT2-MAXFEL*(IBM-1) + WRITE(CHAR2,'(I4.4)') NBISOT2 + IF(CHAR1.EQ.CHAR2) THEN + JSO1=JSO + GO TO 100 + ENDIF + ELSE + JSO1=JSO + GO TO 100 + ENDIF + ENDIF + 70 CONTINUE + NBISO2=NBISO2+1 + IF(NBISO2.GT.MAXISO) THEN + WRITE(IOUT,'(/16H NCRLIB: NBISO2=,I6,8H MAXISO=,I6)') NBISO2, + 1 MAXISO + CALL XABORT('NCRLIB: MAXISO OVERFLOW(2).') + ENDIF + READ(TEXT12,'(3A4)') (HUSE2(I0,NBISO2),I0=1,3) + DO 80 I0=1,3 + HNAM2(I0,NBISO2)=HNAM1(I0,ISO) + 80 CONTINUE + IMIX2(NBISO2)=IBM + ITYP2(NBISO2)=ITYP1(ISO) + ITOD2(NBISO2)=ITOD1(ISO) + IF(ITYP2(NBISO2).EQ.1) ITOD2(NBISO2)=1 + JSO1=NBISO2 + IF(ITOD2(NBISO2).NE.1) THEN + DO 90 J=1,NCOMB + IF(IBM.EQ.MILVO(J)) GO TO 100 + 90 CONTINUE + NCOMB=NCOMB+1 + IF(NCOMB.GT.NMIX) CALL XABORT('NCRLIB: MILVO OVERFLOW.') + MILVO(NCOMB)=IBM + ENDIF + 100 DENS2(JSO1)=DENS2(JSO1)+DENS3(ISO) + VOL2(JSO1)=VOL2(JSO1)+VOL3(ISO) + TEMP2(JSO1)=TEMP3(ISO) + 110 CONTINUE + ENDIF +*---- +* SELECT MICROLIB ISOTOPES CORRESPONDING TO MULTICOMPO ISOTOPES +*---- + ALLOCATE(IMICR(NBISO1)) + IMICR(:NBISO1)=0 + DO 130 ISO=1,NBISO2 ! microlib isotope + IF(IMIX2(ISO).NE.IBM) GO TO 130 + DO 120 JSO=1,NBISO1 ! multicompo isotope + IF((HUSE1(1,JSO).EQ.HUSE2(1,ISO)).AND.(HUSE1(2,JSO).EQ. + 1 HUSE2(2,ISO))) THEN + IF(LXS) THEN + WRITE(CHAR1,'(A4)') HUSE1(3,JSO) + WRITE(CHAR2,'(A4)') HUSE2(3,ISO) + READ(CHAR1,'(I4.4)') NBRG + NBISOT=NBRG+MAXFEL*(IBM-1) + READ(CHAR2,'(I4.4)') NBISOT2 + IF(NBISOT.EQ.NBISOT2) THEN + IMICR(JSO)=ISO + GO TO 130 + ENDIF + ELSE + IMICR(JSO)=ISO + GO TO 130 + ENDIF + ENDIF + 120 CONTINUE + WRITE(TEXT12,'(3A4)') (HUSE2(I0,ISO),I0=1,3) + CALL XABORT('NCRLIB: UNABLE TO FIND '//TEXT12//'.') + 130 CONTINUE +*---- +* PROCESS ISOTOPE DIRECTORIES FOR MICROLIB MIXTURE IBM +*---- + DO 180 JSO=1,NBISO1 ! multicompo isotope + ISO=IMICR(JSO) ! microlib isotope + IF(ISO.EQ.0) GO TO 180 + NBISS=NBISS+1 + WRITE(HNAME,'(3A4)') (HUSE1(I0,JSO),I0=1,3) + WRITE(ISTMPN,'(A4,I6.6,A2)') '*ISO',NBISS,' *' + CALL LCMOP(KPLIB,ISTMPN,0,1,0) + IPLIST(ISO)=KPLIB ! set isot ISO + CALL NCRISO(KPLIB,LPCPO,NBISO1,IMICR,HNAME,JSO,IBMOLD,NCAL,NGRP, + 1 NL,NW,NED2,HVECT2,NDEL,NBESP,NDFI,IMPX,FACT(1,JSO),TERP(1,IBM), + 2 LPURE) + 180 CONTINUE + DEALLOCATE(IMICR,FACT) + 190 CONTINUE + DEALLOCATE(VOL3,TEMP3,DENS3) + DEALLOCATE(VOL1,TEMP1,MILVO,ITOD1,ITYP1,HNAM1,HUSE1) +*---- +* CREATE ISOTOPE LIST DIRECTORY IN MICROLIB +*---- + JPLIB=LCMLID(IPLIB,'ISOTOPESLIST',NBISO2) + DO 195 ISO=1,NBISO2 ! microlib isotope + IF(C_ASSOCIATED(IPLIST(ISO))) THEN + KPLIB=LCMDIL(JPLIB,ISO) ! step up isot ISO + CALL LCMEQU(IPLIST(ISO),KPLIB) + CALL LCMCL(IPLIST(ISO),2) + ENDIF + 195 CONTINUE + DEALLOCATE(IPLIST) +*---- +* MICROLIB FINALIZATION +*---- + IF(.NOT.LRES) THEN + ISTATE(:NSTATE)=0 + ISTATE(1)=NMIX + ISTATE(2)=NBISO2 + ISTATE(3)=NGRP + ISTATE(4)=NL + ISTATE(5)=ITRANC + ISTATE(7)=1 + ISTATE(11)=NDEPL + ISTATE(12)=NCOMB+NCOMB2 + ISTATE(13)=NED2 + ISTATE(14)=NMIX + ISTATE(18)=1 + ISTATE(19)=NDEL + ISTATE(20)=NDFI + ISTATE(22)=MAXISO/NMIX + IF(NBISO2.EQ.0) CALL XABORT('NCRLIB: NBISO2=0.') + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPLIB,'MIXTURESVOL',NMIX,2,VOLMI2) + CALL LCMPUT(IPLIB,'ISOTOPESUSED',3*NBISO2,3,HUSE2) + CALL LCMPUT(IPLIB,'ISOTOPERNAME',3*NBISO2,3,HNAM2) + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESMIX',NBISO2,1,IMIX2) + CALL LCMPUT(IPLIB,'ISOTOPESTYPE',NBISO2,1,ITYP2) + CALL LCMPUT(IPLIB,'ISOTOPESTODO',NBISO2,1,ITOD2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + CALL LCMPUT(IPLIB,'ISOTOPESTEMP',NBISO2,2,TEMP2) + IF(NED2.GT.0) CALL LCMPTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMPUT(IPLIB,'ENERGY',NGRP+1,2,ENER) + CALL LCMPUT(IPLIB,'DELTAU',NGRP,2,DELT) + ELSE + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + CALL LCMPUT(IPLIB,'ISOTOPESTEMP',NBISO2,2,TEMP2) + ENDIF + IF(IMPX.GT.5) CALL LCMLIB(IPLIB) + IACCS=1 + DEALLOCATE(VOLMI2,DELT,ENER,VOL2,TEMP2,DENS2,HNAM2,HUSE2,ITOD2, + 1 ITYP2,IMIX2) +*---- +* BUILD EMBEDDED MACROLIB +*---- + CALL SPHEMB(IPLIB,IPCPO,NGRP,NMIX,MIXC,IMPX) +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(6,'(/34H NCRLIB: INCLUDE LEAKAGE IN THE MA, + 1 11HCROLIB (B2=,1P,E12.5,2H).)') B2 + CALL LCMSIX(IPLIB,'MACROLIB',1) + JPLIB=LCMGID(IPLIB,'GROUP') + ALLOCATE(GAR1(NMIX),GAR2(NMIX)) + DO 210 IGR=1,NGRP + KPLIB=LCMGIL(JPLIB,IGR) + CALL LCMGET(KPLIB,'NTOT0',GAR1) + CALL LCMGET(KPLIB,'DIFF',GAR2) + DO 200 IBM=1,NMIX + IF(MIXC(IBM).NE.0) GAR1(IBM)=GAR1(IBM)+B2*GAR2(IBM) + 200 CONTINUE + CALL LCMPUT(KPLIB,'NTOT0',NMIX,2,GAR1) + 210 CONTINUE + DEALLOCATE(GAR2,GAR1) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* PROCESS ADF, GFF and physical albedos (if required) +*---- + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,1) + LPCPO=LCMGID(KPCPO,'CALCULATIONS') + MPCPO=LCMGIL(LPCPO,1) + CALL LCMGET(MPCPO,'STATE-VECTOR',ISTATE) + IDF=ISTATE(24) + NTYPE=0 + IF(IDF.EQ.1) THEN + NTYPE=2 + ELSE IF(IDF.GE.2) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'ADF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('NCRLIB: MISSING ADF DIRECTORY I' + 1 //'N MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,'ADF',1) + CALL LCMGET(MPCPO,'NTYPE',NTYPE) + CALL LCMSIX(MPCPO,' ',2) + CALL LCMSIX(MPCPO,' ',2) + ENDIF + IF(NGFF.GT.0) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'GFF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('NCRLIB: MISSING GFF DIRECTORY I' + 1 //'N MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,'GFF',1) + CALL LCMLEN(MPCPO,'FINF_NUMBER ',NFINF,ITYLCM) + CALL LCMSIX(MPCPO,' ',2) + CALL LCMSIX(MPCPO,' ',2) + ENDIF + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL NCRAGF(IPLIB,IPCPO,IACCOLD,NMIL,NMIX,NGRP,NGFF,NALBP,IMPX, + 1 NCAL,TERP,MIXC,IDF,NTYPE,NFINF) + CALL LCMSIX(IPLIB,' ',2) + RETURN +* + 500 FORMAT(8HNCRLIB: ,A,1H(,I4,2H)=,2I5) + END diff --git a/Donjon/src/NCRMAC.f b/Donjon/src/NCRMAC.f new file mode 100644 index 0000000..6a7aa21 --- /dev/null +++ b/Donjon/src/NCRMAC.f @@ -0,0 +1,618 @@ +*DECK NCRMAC + SUBROUTINE NCRMAC(MAXNIS,IPMAC,IPCPO,IACCS,NMIL,NMIX,NGRP,NGFF, + 1 NALBP,IDF,IMPX,NCAL,TERP,NISO,LISO,HISO,CONC,MIXC,LRES,LPURE, + 2 B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the macrolib by scanning the NCAL elementary calculations and +* weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* IPMAC address of the output macrolib LCM object. +* IPCPO address of the multicompo object. +* IACCS =0 macrolib is created; =1 ... is updated. +* NMIL number of material mixtures in the multicompo. +* NMIX maximum number of material mixtures in the macrolib. +* NGRP number of energy groups. +* NGFF number of group form factors per energy group. +* NALBP number of physical albedos per energy group. +* IDF ADF type, 0 = none, 1 = Albedo, 2 = FD_B/FD_C/..., 3 = ADF. +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the multicompo. +* 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 multicompo value +* is used. +* MIXC mixture index in the multicompo corresponding to each macrolib +* mixture. Equal to zero if a macrolib mixture is not updated. +* LRES =.true. if the interpolation is done without updating isotopic +* densities +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* B2 buckling +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC,IPCPO + INTEGER MAXNIS,IACCS,NMIL,NMIX,NGRP,NGFF,NALBP,IDF,IMPX,NCAL, + 1 NISO(NMIX),HISO(2,NMIX,MAXNIS),MIXC(NMIX) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + LOGICAL LISO(NMIX),LRES,LPURE +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXED=30 + INTEGER, PARAMETER::MAX1D=40 + INTEGER, PARAMETER::MAX2D=20 + INTEGER, PARAMETER::MAXIFX=5 + INTEGER, PARAMETER::MAXNFI=50 + INTEGER, PARAMETER::MAXNL=6 + INTEGER, PARAMETER::NSTATE=40 + REAL FLOTVA, VOLMIX, WEIGHT + INTEGER I0, I1D, I2D, IBMOLD, IBM, ICAL, IDEL, IED, IGMAX, IGMIN, + & ILONG, IL, IPOSDE, ISOT, ISO, ITRAN, ITSTMP, ITYLCM, IGR, I, JGR, + & KSO1, KSO, MAXMIX, N1D, N2D, NBISO, NDEL, NED, NF, NL, IW, NW, + & NTYPE + INTEGER ISTATE(NSTATE),NFINF,IACCOLD + REAL TMPDAY(3) + LOGICAL LUSER,LMAKE1(MAX1D),LMAKE2(MAX2D),LFAST + CHARACTER TEXT8*8,TEXT12*12,HHISO*8,CM*2,HMAK1(MAX1D)*12, + 1 HMAK2(MAX2D)*12,HVECT(MAXED)*8 + TYPE(C_PTR) JPCPO,KPCPO,LPCPO,MPCPO,NPCPO,OPCPO,IPTMP,JPTMP,KPTMP, + 1 JPMAC,KPMAC +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,ISOMI + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,XVOLM,WORK1,WORK2,ENERGY, + 1 WDLA + REAL, ALLOCATABLE, DIMENSION(:,:) :: FLUX + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAR1 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: GAR2,GAR3 + LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASKL,LWT + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HNAMIS + INTEGER, POINTER, DIMENSION(:) :: ISONA + REAL, POINTER, DIMENSION(:) :: DENIS,FLOT,NWT + TYPE(C_PTR) ISONA_PTR,DENIS_PTR,FLOT_PTR,NWT_PTR +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IJJ(NMIX),NJJ(NMIX),IPOS(NMIX)) + ALLOCATE(GAR1(NMIX,NGRP,MAX1D),GAR2(NMIX,MAXNFI,NGRP,MAX2D), + 1 GAR3(NMIX,NGRP,NGRP,MAXNL),GAR4(NMIX*NGRP)) + IACCOLD=IACCS ! for ADF and GFF +*---- +* OVERALL MULTICOMPO MIXTURE LOOP +*---- + NTYPE=0 + NFINF=0 + JPCPO=LCMGID(IPCPO,'MIXTURES') + DO 500 IBMOLD=1,NMIL + IF(IMPX.GT.0) WRITE(IOUT,'(/33H NCRMAC: PROCESS MULTICOMPO MIXTU, + 1 2HRE,I5)') IBMOLD + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'CALCULATIONS') +*---- +* MACROLIB INITIALIZATION +*---- + IF(IACCS.EQ.0) THEN + MPCPO=LCMGIL(LPCPO,1) + CALL LCMGET(MPCPO,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.1) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF MIXTURES(1).') + ELSE IF(ISTATE(3).NE.NGRP) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF ENERGY GROUPS(1).') + ENDIF + NBISO=ISTATE(2) + NL=ISTATE(4) + NF=0 + ITRAN=ISTATE(5) + NED=ISTATE(13) + NDEL=ISTATE(19) + IDF=ISTATE(24) + NW=ISTATE(25) + IF(NED.GT.MAXED) CALL XABORT('NCRMAC: MAXED OVERFLOW(1).') + ALLOCATE(ENERGY(NGRP+1)) + IF(NED.GT.0) CALL LCMGTC(MPCPO,'ADDXSNAME-P0',8,NED,HVECT) + CALL LCMGET(MPCPO,'ENERGY',ENERGY) + TEXT12='L_MACROLIB' + CALL LCMPTC(IPMAC,'SIGNATURE',12,TEXT12) + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NMIX + ISTATE(3)=NL + ISTATE(5)=NED + ISTATE(6)=ITRAN + ISTATE(7)=NDEL + ISTATE(8)=NALBP + ISTATE(10)=NW + ISTATE(12)=IDF + ISTATE(16)=NGFF + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPMAC,'ENERGY',NGRP+1,2,ENERGY) + IF(NED.GT.0) CALL LCMPTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + DEALLOCATE(ENERGY) + IF(NBISO.GT.0) THEN + ALLOCATE(HNAMIS(NBISO)) + CALL LCMGTC(MPCPO,'ISOTOPESUSED',12,NBISO,HNAMIS) + NPCPO=LCMGID(MPCPO,'ISOTOPESLIST') + DO ISO=1,NBISO + OPCPO=LCMGIL(NPCPO,ISO) + CALL LCMLEN(OPCPO,'LAMBDA-D',ILONG,ITYLCM) + IF((ILONG.EQ.NDEL).AND.(NDEL.GT.0)) THEN + ALLOCATE(WDLA(NDEL)) + CALL LCMGET(OPCPO,'LAMBDA-D',WDLA) + CALL LCMPUT(IPMAC,'LAMBDA-D',NDEL,2,WDLA) + DEALLOCATE(WDLA) + IF(HNAMIS(ISO).EQ.'U235') GO TO 10 + IF(HNAMIS(ISO).EQ.'*MAC*RES') GO TO 10 + ENDIF + ENDDO + 10 DEALLOCATE(HNAMIS) + ENDIF + IF(IDF.EQ.1) THEN + NTYPE=2 + ELSE IF(IDF.GE.2) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'ADF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('NCRMAC: MISSING ADF DIRECTORY I' + 1 //'N MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,'ADF',1) + CALL LCMGET(MPCPO,'NTYPE',NTYPE) + CALL LCMSIX(MPCPO,' ',2) + CALL LCMSIX(MPCPO,' ',2) + ENDIF + IF(NGFF.NE.0) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'GFF',ILONG,ITYLCM) + IF(ILONG.EQ.0) CALL XABORT('NCRMAC: MISSING GFF DIRECTORY I' + 1 //'N MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,'GFF',1) + CALL LCMLEN(MPCPO,'FINF_NUMBER ',NFINF,ITYLCM) + CALL LCMSIX(MPCPO,' ',2) + CALL LCMSIX(MPCPO,' ',2) + ENDIF + IF(NALBP.NE.0) THEN + CALL LCMSIX(MPCPO,'MACROLIB',1) + CALL LCMLEN(MPCPO,'ALBEDO',ILONG,ITYLCM) + IF(ILONG.NE.NALBP*NGRP) CALL XABORT('NCRMAC: MISSING PHYSIC' + 1 //'AL ALBEDO INFO IN MULTICOMPO OBJECT.') + CALL LCMSIX(MPCPO,' ',2) + ENDIF + ELSE + CALL LCMGTC(IPMAC,'SIGNATURE',12,TEXT12) + IF(TEXT12.NE.'L_MACROLIB') THEN + CALL XABORT('NCRMAC: SIGNATURE IS '//TEXT12//'. L_MACROLIB E' + 1 //'XPECTED.') + ENDIF + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF ENERGY GROUPS(2).') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF MIXTURES(2).') + ENDIF + NL=ISTATE(3) + NF=ISTATE(4) + NED=ISTATE(5) + NDEL=ISTATE(7) + NALBP=ISTATE(8) + NW=ISTATE(10) + IDF=ISTATE(12) + NGFF=ISTATE(16) + IF(NED.GT.MAXED) CALL XABORT('NCRMAC: MAXED OVERFLOW(2).') + IF(NED.GT.0) CALL LCMGTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + IF(IDF.EQ.1) THEN + NTYPE=2 + ELSE IF((IDF.GE.2).AND.(IACCOLD.NE.0)) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGET(IPMAC,'NTYPE',NTYPE) + CALL LCMSIX(IPMAC,' ',2) + ENDIF + IF((NGFF.NE.0).AND.(IACCOLD.NE.0)) THEN + CALL LCMSIX(IPMAC,'GFF',1) + CALL LCMLEN(IPMAC,'FINF_NUMBER ',NFINF,ITYLCM) + IF(NFINF.GT.MAXIFX) CALL XABORT('NCRMAC: MAXIFX OVERFLOW.') + CALL LCMSIX(IPMAC,' ',2) + ENDIF + ENDIF + N1D=8+2*NW+NED+NL + N2D=2*(NDEL+1) + IF(NL.GT.MAXNL) CALL XABORT('NCRMAC: MAXNL OVERFLOW.') + IF(N1D.GT.MAX1D) CALL XABORT('NCRMAC: MAX1D OVERFLOW.') + IF(N2D.GT.MAX2D) CALL XABORT('NCRMAC: MAX2D OVERFLOW.') + LMAKE1(:N1D)=.FALSE. + LMAKE2(:N2D)=.FALSE. + GAR1(:NMIX,:NGRP,:N1D)=0.0 + GAR2(:NMIX,:MAXNFI,:NGRP,:N2D)=0.0 + GAR3(:NMIX,:NGRP,:NGRP,:NL)=0.0 +*---- +* SET HMAK1 AND HMAK2 +*---- + HMAK1(:N1D)=' ' + DO 15 IW=1,MIN(NW+1,10) + IF(IW.EQ.1) THEN + TEXT12='FLUX-INTG' + ELSE + WRITE(TEXT12,'(11HFLUX-INTG-P,I1)') IW-1 + ENDIF + HMAK1(IW)=TEXT12 + WRITE(TEXT12,'(4HNTOT,I1)') IW-1 + HMAK1(1+NW+IW)=TEXT12 + 15 CONTINUE + HMAK1(3+2*NW)='OVERV' + HMAK1(4+2*NW)='DIFF' + HMAK1(5+2*NW)='DIFFX' + HMAK1(6+2*NW)='DIFFY' + HMAK1(7+2*NW)='DIFFZ' + HMAK1(8+2*NW)='H-FACTOR' + DO 20 IED=1,NED + HMAK1(8+2*NW+IED)=HVECT(IED) + 20 CONTINUE + DO 30 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+2*NW+NED+IL)='SIGS'//CM + 30 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 40 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 + 40 CONTINUE +*---- +* READ EXISTING MACROLIB INFORMATION +*---- + ALLOCATE(XVOLM(NMIX)) + XVOLM(:NMIX)=0.0 + IF(IACCS.NE.0) THEN ! IACCS + CALL LCMGET(IPMAC,'VOLUME',XVOLM) + JPMAC=LCMGID(IPMAC,'GROUP') + DO 81 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + DO 60 I1D=1,N1D + CALL LCMLEN(KPMAC,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE1(I1D)=.TRUE. + CALL LCMGET(KPMAC,HMAK1(I1D),GAR1(1,IGR,I1D)) + DO 50 IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=0.0 + 50 CONTINUE + ENDIF + 60 CONTINUE + DO 65 I2D=1,N2D + CALL LCMLEN(KPMAC,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE2(I2D)=.TRUE. + CALL LCMGET(KPMAC,HMAK2(I2D),GAR2(1,1,IGR,I2D)) + DO 64 I=1,NF + DO 63 IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) GAR2(IBM,I,IGR,I2D)=0.0 + 63 CONTINUE + 64 CONTINUE + ENDIF + 65 CONTINUE + DO 80 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 75 IBM=1,NMIX + IPOSDE=IPOS(IBM) + DO 70 JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR4(IPOSDE) + IF(MIXC(IBM).EQ.IBMOLD) GAR3(IBM,JGR,IGR,IL)=0.0 + IPOSDE=IPOSDE+1 + 70 CONTINUE + 75 CONTINUE + ENDIF + 80 CONTINUE + 81 CONTINUE + ENDIF ! IACCS +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + LFAST=.TRUE. + DO 85 IBM=1,NMIX + LFAST=LFAST.AND.((MIXC(IBM).NE.IBMOLD).OR.(NISO(IBM).EQ.0)) + 85 CONTINUE + DO 210 ICAL=1,NCAL + MPCPO=LCMGIL(LPCPO,ICAL) + IPTMP=C_NULL_PTR + DO 200 IBM=1,NMIX + WEIGHT=TERP(ICAL,IBM) + IF((MIXC(IBM).NE.IBMOLD).OR.(WEIGHT.EQ.0.0)) GO TO 200 +*---- +* PRODUCE AN ELEMENTARY MACROLIB (IF IPTMP=C_NULL_PTR) +*---- + IF(.NOT.C_ASSOCIATED(IPTMP)) THEN + ALLOCATE(FLUX(NGRP,NW+1),LWT(NW+1)) + CALL LCMOP(IPTMP,'*ELEMENTARY*',0,1,0) + CALL LCMEQU(MPCPO,IPTMP) + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(38H NCRMAC: MULTICOMPO ACCESS FOR MIXTURE,I8, + 1 5H AND ,11HCALCULATION,I8,9H. WEIGHT=,1P,E12.4)') IBM,ICAL, + 2 WEIGHT + IF(IMPX.GT.50) CALL LCMLIB(IPTMP) + ENDIF + CALL LCMLEN(IPTMP,'MACROLIB',ILONG,ITYLCM) + IF(ILONG.NE.0) CALL LCMDEL(IPTMP,'MACROLIB') + CALL LCMGET(IPTMP,'STATE-VECTOR',ISTATE) + NBISO=ISTATE(2) + IF(ISTATE(1).NE.1) CALL XABORT('NCRMAC: INVALID NUMBER OF MATE' + 1 //'RIAL MIXTURES IN THE MULTICOMPO.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('NCRMAC: INVALID NUMBER OF E' + 1 //'NERGY GROUPS IN THE MULTICOMPO.') + ALLOCATE(MASKL(NGRP)) + MASKL(:NGRP)=.TRUE. + CALL LCMGPD(IPTMP,'ISOTOPESUSED',ISONA_PTR) + CALL LCMGPD(IPTMP,'ISOTOPESDENS',DENIS_PTR) + CALL C_F_POINTER(ISONA_PTR,ISONA,(/ NBISO /)) + CALL C_F_POINTER(DENIS_PTR,DENIS,(/ NBISO /)) + IF(.NOT.LRES) THEN + DO 110 ISO=1,NBISO + WRITE(TEXT8,'(2A4)') (ISONA(3*(ISO-1)+I0),I0=1,2) + KSO1=0 + DO 90 KSO=1,NISO(IBM) ! user-selected isotope + WRITE(HHISO,'(2A4)') (HISO(I0,IBM,KSO),I0=1,2) + IF(TEXT8.EQ.HHISO) THEN + KSO1=KSO + GO TO 100 + ENDIF + 90 CONTINUE + IF(.NOT.LISO(IBM)) THEN + DENIS(ISO)=0.0 + GO TO 110 + ENDIF + 100 LUSER=.FALSE. + IF(KSO1.GT.0) LUSER=(CONC(IBM,KSO1).NE.-99.99) + IF(LUSER) DENIS(ISO)=CONC(IBM,KSO1) + 110 CONTINUE + ENDIF + MAXMIX=1 + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 + ALLOCATE(ISOMI(NBISO)) + ISOMI(:NBISO)=1 + CALL LIBMIX(IPTMP,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS, + 1 .TRUE.,MASKL,ITSTMP,TMPDAY) + CALL LCMPPD(IPTMP,'ISOTOPESDENS',NBISO,2,DENIS_PTR) + DEALLOCATE(ISOMI,MASKL) +*---- +* RECOVER THE INTEGRATED FLUX +*---- + CALL LCMLEN(IPTMP,'MIXTURESVOL',ILONG,ITYLCM) + IF(ILONG.EQ.0) GO TO 165 + CALL LCMGET(IPTMP,'MIXTURESVOL',VOLMIX) + XVOLM(IBM)=VOLMIX + LWT(:NW+1)=.FALSE. + FLUX(:NGRP,:(NW+1))=0.0 + DO 150 ISOT=1,NBISO + WRITE(TEXT12,'(3A4)') (ISONA(3*(ISOT-1)+I0),I0=1,3) + CALL LCMLEN(IPTMP,TEXT12,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(IPTMP,TEXT12,1) + DO 140 IW=1,MIN(NW+1,10) + WRITE(TEXT12,'(3HNWT,I1)') IW-1 + CALL LCMLEN(IPTMP,TEXT12,ILONG,ITYLCM) + IF(ILONG.EQ.NGRP) THEN + LWT(IW)=.TRUE. + CALL LCMGPD(IPTMP,TEXT12,NWT_PTR) + CALL C_F_POINTER(NWT_PTR,NWT,(/ NGRP /)) + DO 130 IGR=1,NGRP + FLUX(IGR,IW)=NWT(IGR)*VOLMIX + 130 CONTINUE + ENDIF + 140 CONTINUE + CALL LCMSIX(IPTMP,' ',2) + ENDIF + 150 CONTINUE + CALL LCMSIX(IPTMP,'MACROLIB',1) + JPTMP=LCMGID(IPTMP,'GROUP') + DO 161 IGR=1,NGRP + KPTMP=LCMGIL(JPTMP,IGR) + DO 160 IW=1,MIN(NW+1,10) + IF(LWT(IW)) THEN + IF(IW.EQ.1) THEN + TEXT12='FLUX-INTG' + ELSE + WRITE(TEXT12,'(11HFLUX-INTG-P,I1)') IW-1 + ENDIF + CALL LCMPUT(KPTMP,TEXT12,1,2,FLUX(IGR,IW)) + ENDIF + 160 CONTINUE + 161 CONTINUE + CALL LCMSIX(IPTMP,' ',2) + DEALLOCATE(LWT,FLUX) + ENDIF +*---- +* PERFORM INTERPOLATION +*---- + 165 CALL LCMSIX(IPTMP,'MACROLIB',1) + CALL LCMGET(IPTMP,'STATE-VECTOR',ISTATE) + IF(NF.EQ.0) NF=ISTATE(4) + IF(NF.GT.MAXNFI) CALL XABORT('NCRMAC: MAXNFI OVERFLOW.') + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.1)THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF MIXTURES(3).') + ELSE IF(ISTATE(3).GT.NL) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF LEGENDRE ORDERS(3).') + ELSE IF((ISTATE(4).NE.0).AND.(ISTATE(4).NE.NF)) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF FISSILE ISOTOPES(3).') + ELSE IF((ISTATE(5).NE.NED).AND.(ISTATE(5).GT.0)) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF EDIT REACTIONS(3).') + ELSE IF((ISTATE(7).NE.NDEL).AND.(ISTATE(7).GT.0)) THEN + CALL XABORT('NCRMAC: INVALID NUMBER OF PRECURSOR GROUPS(3).') + ENDIF + JPTMP=LCMGID(IPTMP,'GROUP') + DO 195 IGR=1,NGRP + KPTMP=LCMGIL(JPTMP,IGR) + DO 170 I1D=1,N1D + CALL LCMLEN(KPTMP,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + IF(ILONG.NE.1) CALL XABORT('NCRMAC: FLOTVA OVERFLOW.') + LMAKE1(I1D)=.TRUE. + CALL LCMGET(KPTMP,HMAK1(I1D),FLOTVA) + IF((.NOT.LPURE).AND.(I1D.GE.4+2*NW).AND.(I1D.LE.7+2*NW)) THEN + FLOTVA=1.0/FLOTVA + ENDIF + GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)+WEIGHT*FLOTVA + ENDIF + 170 CONTINUE + IF(ISTATE(4).GT.0) THEN + DO 175 I2D=1,N2D + CALL LCMLEN(KPTMP,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + IF(ILONG.NE.NF) CALL XABORT('NCRMAC: FLOT OVERFLOW.') + LMAKE2(I2D)=.TRUE. + CALL LCMGPD(KPTMP,HMAK2(I2D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + DO 174 I=1,NF + GAR2(IBM,I,IGR,I2D)=GAR2(IBM,I,IGR,I2D)+WEIGHT*FLOT(I) + 174 CONTINUE + ENDIF + 175 CONTINUE + ENDIF + DO 190 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + ILONG=1 + IF(IL.GT.1) CALL LCMLEN(KPTMP,'SCAT'//CM,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(KPTMP,'SCAT'//CM,GAR4) + CALL LCMGET(KPTMP,'NJJS'//CM,NJJ) + CALL LCMGET(KPTMP,'IJJS'//CM,IJJ) + CALL LCMGET(KPTMP,'IPOS'//CM,IPOS) + IPOSDE=IPOS(1) + DO 180 JGR=IJJ(1),IJJ(1)-NJJ(1)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR3(IBM,JGR,IGR,IL)+WEIGHT*GAR4(IPOSDE) + IPOSDE=IPOSDE+1 + 180 CONTINUE + ENDIF + 190 CONTINUE + 195 CONTINUE + CALL LCMSIX(IPTMP,' ',2) + IF(.NOT.LFAST) CALL LCMCL(IPTMP,2) + 200 CONTINUE + IF(C_ASSOCIATED(IPTMP)) CALL LCMCL(IPTMP,2) + 210 CONTINUE +*---- +* WRITE INTERPOLATED MACROLIB INFORMATION +*---- + CALL LCMPUT(IPMAC,'VOLUME',NMIX,2,XVOLM) + DEALLOCATE(XVOLM) + JPMAC=LCMLID(IPMAC,'GROUP',NGRP) + DO 365 IGR=1,NGRP + KPMAC=LCMDIL(JPMAC,IGR) + DO 320 I1D=1,N1D + IF(LMAKE1(I1D)) THEN + IF((.NOT.LPURE).AND.(I1D.GE.4+2*NW).AND.(I1D.LE.7+2*NW)) THEN + DO 310 IBM=1,NMIX + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=1./GAR1(IBM,IGR,I1D) + 310 CONTINUE + ENDIF + CALL LCMPUT(KPMAC,HMAK1(I1D),NMIX,2,GAR1(1,IGR,I1D)) + ENDIF + 320 CONTINUE + DO 325 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 + 325 CONTINUE + DO 360 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IPOSDE=0 + DO 350 IBM=1,NMIX + IPOS(IBM)=IPOSDE+1 + IGMIN=IGR + IGMAX=IGR + DO 330 JGR=1,NGRP + IF(GAR3(IBM,JGR,IGR,IL).NE.0.0) THEN + IGMIN=MIN(IGMIN,JGR) + IGMAX=MAX(IGMAX,JGR) + ENDIF + 330 CONTINUE + IJJ(IBM)=IGMAX + NJJ(IBM)=IGMAX-IGMIN+1 + DO 340 JGR=IGMAX,IGMIN,-1 + IPOSDE=IPOSDE+1 + GAR4(IPOSDE)=GAR3(IBM,JGR,IGR,IL) + 340 CONTINUE + 350 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 + 360 CONTINUE + 365 CONTINUE + IACCS=1 +*---- +* UPDATE STATE-VECTOR +*---- + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + ISTATE(4)=MAX(ISTATE(4),NF) + IF(LMAKE1(4+2*NW)) ISTATE(9)=1 + IF(LMAKE1(5+2*NW)) ISTATE(9)=2 + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* END OF OVERALL MULTICOMPO MIXTURE LOOP +*---- + 500 CONTINUE +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(6,'(/34H NCRMAC: INCLUDE LEAKAGE IN THE MA, + 1 11HCROLIB (B2=,1P,E12.5,2H).)') B2 + JPMAC=LCMGID(IPMAC,'GROUP') + ALLOCATE(WORK1(NMIX),WORK2(NMIX)) + DO 520 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + CALL LCMGET(KPMAC,'NTOT0',WORK1) + CALL LCMGET(KPMAC,'DIFF',WORK2) + DO 510 IBM=1,NMIX + IF(MIXC(IBM).NE.0) WORK1(IBM)=WORK1(IBM)+B2*WORK2(IBM) + 510 CONTINUE + CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,WORK1) + 520 CONTINUE + DEALLOCATE(WORK2,WORK1) + ENDIF +*---- +* PROCESS ADF, GFF and physical albedos (if required) +*---- + CALL NCRAGF(IPMAC,IPCPO,IACCOLD,NMIL,NMIX,NGRP,NGFF,NALBP,IMPX, + 1 NCAL,TERP,MIXC,IDF,NTYPE,NFINF) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(GAR4,GAR3,GAR2,GAR1) + DEALLOCATE(IPOS,NJJ,IJJ) + RETURN + END diff --git a/Donjon/src/NCRMAP.f b/Donjon/src/NCRMAP.f new file mode 100644 index 0000000..3ad7bb6 --- /dev/null +++ b/Donjon/src/NCRMAP.f @@ -0,0 +1,174 @@ +*DECK NCRMAP + SUBROUTINE NCRMAP(IPMAP,NPARM,HPARM,NCH,NB,IBTYP,HNAVAL,IMPX, + 1 BURN0,BURN1,WPAR,LPARM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* recover global parameter values from the fuel-map object. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki, R. Chambon +* +*Parameters: input +* IPMAP pointer to the fuel-map information. +* NPARM number of expected global parameters to be recovered from +* the fuel-map (burnup not included). +* HPARM names of these global parameters. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* IBTYP type of burnup interpolation: +* =0 not provided; =1 time-average; =2 instantaneous; +* =3 derivative with respect to a single exit burnup. +* HNAVAL identification name corresponding to the basic naval- +* coordinate position of a neighbour assembly. +* IMPX printing index (=0 for no print). +* +*Parameters: output +* BURN0 contains either low burnup integration limits or +* instantaneous burnups per fuel bundle. +* BURN1 upper burnup integration limits per fuel bundle. +* WPAR values of the other global parameters in each bundle. +* LPARM existence flag for each expected global parameters. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NPARM,NCH,NB,IBTYP,IMPX + REAL BURN0(NCH,NB),BURN1(NCH,NB),WPAR(NCH,NB,NPARM) + LOGICAL LPARM(NPARM+1) + CHARACTER HPARM(NPARM+1)*(*),HNAVAL*4 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::NSTATE=40 + INTEGER ISTATE(NSTATE) + INTEGER IB, ICH, IICH, ILONG, ITYLCM, ITYPEP, JPARM + REAL VARTMP + CHARACTER HSMG*131 + TYPE(C_PTR) JPMAP,KPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:,:) :: BURNB + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: HSZONE +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(BURNB(NCH,NB)) +*---- +* TIME-AVERAGE BURNUP +*---- + BURN0(:NCH,:NB)=0.0 + BURN1(:NCH,:NB)=0.0 + WPAR(:NCH,:NB,:NPARM)=0.0 + LPARM(:NPARM+1)=.FALSE. + IF(IBTYP.EQ.0) THEN + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + IBTYP=ISTATE(5) + ENDIF + IF((IBTYP.EQ.0).AND.(HNAVAL.NE.' '))THEN +* USE THE BURNUP OF A NEIGHBOUR ASSEMBLY + IF(ISTATE(13).EQ.0)CALL XABORT('@NCRMAP: MISSING' + 1 //' S-ZONE VALUES IN FUEL MAP.') + ALLOCATE(HSZONE(NCH)) + CALL LCMGTC(IPMAP,'S-ZONE',4,NCH,HSZONE) + IICH=0 + DO ICH=1,NCH + IF(HSZONE(ICH).EQ.HNAVAL) THEN + IICH=ICH + GO TO 20 + ENDIF + ENDDO + WRITE(HSMG,'(24H@NCRMAP: UNABLE TO FIND ,A,16H IN RECORD S-ZON, + 1 2HE.)') HNAVAL + CALL XABORT(HSMG) + 20 DEALLOCATE(HSZONE) + CALL LCMLEN(IPMAP,'BURN-INST',ILONG,ITYLCM) + IF(ILONG.EQ.0)CALL XABORT('@NCRMAP: MISSING' + 1 //' BURN-INST VALUES IN FUEL MAP.') + CALL LCMGET(IPMAP,'BURN-INST',BURNB) + DO ICH=1,NCH + DO IB=1,NB + BURN0(ICH,IB)=BURNB(IICH,IB) + ENDDO + ENDDO + ELSE IF((IBTYP.EQ.1).OR.(IBTYP.EQ.3))THEN +* LOW BURNUP LIMITS + CALL LCMLEN(IPMAP,'BURN-BEG',ILONG,ITYLCM) + IF(ILONG.EQ.0)CALL XABORT('@NCRMAP: MISSING' + 1 //' BURN0 VALUES IN FUEL MAP.') + CALL LCMGET(IPMAP,'BURN-BEG',BURN0) +* UPPER BURNUP LIMITS + CALL LCMLEN(IPMAP,'BURN-END',ILONG,ITYLCM) + IF(ILONG.EQ.0)CALL XABORT('@NCRMAP: MISSING' + 1 //' BURN1 VALUES IN FUEL MAP.') + CALL LCMGET(IPMAP,'BURN-END',BURN1) + IF(IMPX.GT.0)WRITE(IOUT,1000) + LPARM(NPARM+1)=.TRUE. +*---- +* INSTANTANEOUS BURNUP +*---- + ELSEIF(IBTYP.EQ.2)THEN + CALL LCMLEN(IPMAP,'BURN-INST',ILONG,ITYLCM) + IF(ILONG.EQ.0)CALL XABORT('@NCRMAP: MISSING' + 1 //' BURN-INST VALUES IN FUEL MAP.') + CALL LCMGET(IPMAP,'BURN-INST',BURNB) + DO ICH=1,NCH + DO IB=1,NB + BURN0(ICH,IB)=BURNB(ICH,IB) + BURN1(ICH,IB)=BURNB(ICH,IB) + ENDDO + ENDDO + IF(IMPX.GT.0)WRITE(IOUT,1001) + LPARM(NPARM+1)=.TRUE. + ELSEIF(IBTYP.NE.0)THEN + CALL XABORT('@NCRMAP: INVALID BURNUP INTERPOLATION OPTION ' + 1 //'IBTYP IN FUEL MAP.') + ENDIF +*---- +* RECOVER OTHER PARAMETERS +*---- + IF(NPARM.GT.0) THEN + JPMAP=LCMGID(IPMAP,'PARAM') + DO 30 JPARM=1,NPARM + KPMAP=LCMGIL(JPMAP,JPARM) + CALL LCMGTC(KPMAP,'PARKEY',12,HPARM(JPARM)) + CALL LCMGET(KPMAP,'P-TYPE',ITYPEP) + LPARM(JPARM)=.TRUE. +* Global parameter + IF(ITYPEP.EQ.1) THEN + CALL LCMLEN(KPMAP,'P-VALUE',ILONG,ITYLCM) + IF(ILONG.NE.1) THEN + WRITE(HSMG,'(37H@NCRMAP: P-VALUE LENGTH OF PARAMETER ,A, + 1 12H IS EQUAL TO,I6,13H (MUST BE 1).)') HPARM(JPARM),ILONG + CALL XABORT(HSMG) + ENDIF + CALL LCMGET(KPMAP,'P-VALUE',VARTMP) + WPAR(:NCH,:NB,JPARM)=VARTMP +* Local parameter + ELSEIF (ITYPEP.EQ.2) THEN + CALL LCMGET(KPMAP,'P-VALUE',WPAR(1,1,JPARM)) + ENDIF + 30 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(BURNB) + RETURN +* + 1000 FORMAT(/1X,'** PERFORMING THE TIME-AVERAGE', + 1 1X,'INTEGRATION OVER THE FUEL LATTICE **'/) + 1001 FORMAT(/1X,'** PERFORMING THE INSTANTANEOU', + 1'S INTERPOLATION OVER THE FUEL LATTICE **'/) + END diff --git a/Donjon/src/NCRRGR.f b/Donjon/src/NCRRGR.f new file mode 100644 index 0000000..cea9f45 --- /dev/null +++ b/Donjon/src/NCRRGR.f @@ -0,0 +1,1027 @@ +*DECK NCRRGR + SUBROUTINE NCRRGR(IPCPO,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,NCH,NB, + 1 NFUEL,NPARM,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for multicompo interpolation. Use global and +* local parameters from a fuel-map object and optional user-defined +* values. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert, D. Sekki, R. Chambon +* +*Parameters: input +* IPCPO address of the multicompo object. +* 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 printing index (=0 for no print). +* NMIL number of material mixtures in the multicompo. +* NCAL number of elementary calculations in the multicompo. +* 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 +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another multicompo; +* =2 use another L_MAP + multicompo). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the multicompo 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 multicompo value +* is used. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXISD=200 + TYPE(C_PTR) IPCPO,IPMAP + INTEGER NMIX,IMPX,NMIL,NCAL,NFUEL,NCH,NB,ITER,MAXNIS, + 1 MIXC(NMIX),NPARM,HISO(2,NMIX,MAXISD),NISO(NMIX) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXISD) + LOGICAL LCUBIC,LISO(NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXADD=10 + INTEGER, PARAMETER::MAXLIN=50 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + INTEGER, PARAMETER::NSTATE=40 + REAL, PARAMETER::REPS=1.0E-4 + REAL BURN0, BURN1, FLOTT, SUM, VALR1, VALR2, VARVAL + INTEGER I0, IBMB, IBME, IBMOLD, IBM, IBTYP, IB, ICAL, ICH, IFUEL, + & ILONG, IMIX, IMPY, INDIC, IPARTM, IPAR, ISO, ITYLCM, ITYPE, ITYP, + & IVARTY, I, JBM, JB, JCAL, JPARM, JPAR, J, LENGTH, NCOMLI, NISOMI, + & NITMA, NLOC, NMIXA, NPARMP, NPAR, NTOT, N + CHARACTER TEXT12*12,PARKEY(MAXPAR)*12,PARFMT(MAXPAR)*8, + 1 PARKEL(MAXPAR)*12,HSMG*131,COMMEN(MAXLIN)*80,VALH(MAXPAR)*12, + 2 RECNAM*12,VCHAR(MAXVAL)*12,PARNAM*12,HCUBIC*12,HNAVAL*12 + INTEGER ISTATE(NSTATE),VALI(MAXPAR),NVALUE(MAXPAR),VINTE(MAXVAL), + 1 MUPLET(2*MAXPAR),MUTYPE(2*MAXPAR),MAPLET(2*MAXPAR,MAXADD), + 2 MATYPE(2*MAXPAR,MAXADD),IDLTA(2*MAXPAR,MAXADD),NDLTA(2*MAXPAR), + 3 IDLTA1,MUPLT2(2*MAXPAR),MUTYP2(2*MAXPAR),HISOMI(2,MAXISD) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2),VREAL(MAXVAL),VALRA(2*MAXPAR,2,MAXADD), + 1 CONCMI(MAXISD) + 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(2*MAXPAR),LTST,LISOMI,LASBLY + TYPE(C_PTR) JPMAP,KPMAP,JPCPO,KPCPO,LPCPO + INTEGER, ALLOCATABLE, DIMENSION(:) :: FMIX,ZONEC,MIXA + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ZONEDP + REAL, ALLOCATABLE, DIMENSION(:) :: BRN0,BRN1,VARC,TERPA + REAL, ALLOCATABLE, DIMENSION(:,:) :: WPAR + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LPARM,LDELTA + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HPAR +*---- +* 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(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)) +*---- +* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE MULTICOMPO. +*---- + CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE) + NPAR=ISTATE(5) + NLOC=ISTATE(6) + NCOMLI=ISTATE(10) +* ASBLY : + LASBLY=.FALSE. + CALL LCMGTC(IPCPO,'COMMENT',80,NCOMLI,COMMEN) + IF(NPAR.GT.0)THEN + CALL LCMSIX(IPCPO,'GLOBAL',1) + CALL LCMGTC(IPCPO,'PARKEY',12,NPAR,PARKEY) + CALL LCMGTC(IPCPO,'PARFMT',8,NPAR,PARFMT) + CALL LCMGET(IPCPO,'NVALUE',NVALUE) + IF(IMPX.GT.0)THEN + DO IPAR=1,NPAR + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + IF(PARFMT(IPAR).EQ.'INTEGER') THEN + CALL LCMGET(IPCPO,RECNAM,VINTE) + WRITE(IOUT,'(13H NCRRGR: KEY=,A,18H TABULATED POINTS=, + 1 1P,6I12/(43X,6I12))') PARKEY(IPAR),(VINTE(I),I=1, + 2 NVALUE(IPAR)) + ELSE IF(PARFMT(IPAR).EQ.'REAL') THEN + CALL LCMGET(IPCPO,RECNAM,VREAL) + WRITE(IOUT,'(13H NCRRGR: KEY=,A,18H TABULATED POINTS=, + 1 1P,6E12.4/(43X,6E12.4))') PARKEY(IPAR),(VREAL(I),I=1, + 2 NVALUE(IPAR)) + ELSE IF(PARFMT(IPAR).EQ.'STRING') THEN + CALL LCMGTC(IPCPO,RECNAM,12,NVALUE(IPAR),VCHAR) + WRITE(IOUT,'(13H NCRRGR: KEY=,A,18H TABULATED POINTS=, + 1 1P,6A12/(43X,6A12))') PARKEY(IPAR),(VCHAR(I),I=1, + 2 NVALUE(IPAR)) + ENDIF + ENDDO + ENDIF + CALL LCMSIX(IPCPO,' ',2) + ENDIF + IF(NLOC.GT.0)THEN + CALL LCMSIX(IPCPO,'LOCAL',1) + CALL LCMGTC(IPCPO,'PARKEY',12,NLOC,PARKEL) + CALL LCMSIX(IPCPO,' ',2) + JPCPO=LCMGID(IPCPO,'MIXTURES') + DO IBMOLD=1,NMIL + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + IF(IMPX.GT.0)THEN + WRITE(IOUT,'(17H NCRRGR: MIXTURE=,I6)') IBMOLD + DO IPAR=1,NLOC + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + CALL LCMGET(LPCPO,RECNAM,VREAL) + WRITE(IOUT,'(13H NCRRGR: KEY=,A,18H TABULATED POINTS=, + 1 1P,6E12.4/(43X,6E12.4))') PARKEL(IPAR),(VREAL(I),I=1, + 2 NVALUE(IPAR)) + ENDDO + ENDIF + ENDDO + ENDIF + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(43H NCRRGR: NUMBER OF CALCULATIONS IN MULTICOM, + 1 3HPO=,I5)') NCAL + WRITE(IOUT,'(43H NCRRGR: NUMBER OF MATERIAL MIXTURES IN MUL, + 1 8HTICOMPO=,I5)') NMIL + WRITE(IOUT,'(43H NCRRGR: NUMBER OF MATERIAL MIXTURES IN FUE, + 1 6HL MAP=,I6)') NMIX + WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI) + ENDIF + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 +*---- +* READ (INTERP_DATA) AND SET VALI, VALR AND VALH PARAMETERS +* CORRESPONDING TO THE INTERPOLATION POINT. FILL MUPLET FOR +* PARAMETERS SET WITHOUT INTERPOLATION. +*---- + IBM=0 + IBMB=0 + IBME=0 + MAXNIS=0 + NISOMI=0 + LISOMI=.TRUE. + LDELT1=.FALSE. + LADD1=.FALSE. + NISO(:NMIX)=0 + LISO(:NMIX)=.TRUE. + LDELTA(:NMIX)=.FALSE. + 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 MULTICOMPO. +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: 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('NCRRGR: CHARACTER DATA EXPECTED(2).') + 30 IF(TEXT12.EQ.'MIX')THEN + NISOMI=0 + LISOMI=.TRUE. + IVARTY=0 + IBTYP=0 + HNAVAL=' ' + MUPLET(:NPAR+NLOC)=0 + MUTYPE(:NPAR+NLOC)=0 + VALI(:NPAR)=0 + VALR(:NPAR+NLOC,1)=0.0 + VALR(:NPAR+NLOC,2)=0.0 + DO 35 I=1,MAXADD + MAPLET(:NPAR+NLOC,I)=0 + MATYPE(:NPAR+NLOC,I)=0 + VALRA(:NPAR+NLOC,1,I)=0.0 + VALRA(:NPAR+NLOC,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+NLOC)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('NCRRGR: 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,*)'NCRRGR: UNABLE TO FIND FUEL MIXTURE ',IBM + CALL XABORT('NCRRGR: WRONG MIXTURE NUMBER.') + 50 IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: CHARACTER DATA EXPECTED(3).') + IF(TEXT12.EQ.'FROM')THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('NCRRGR: INTEGER DATA EXPECTED.') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') + ELSE IF(TEXT12.EQ.'USE') THEN + IBMOLD=IBM + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') +* ASBLY: automatically assembly-wise unfolded geometry + ELSE IF(TEXT12.EQ.'ASBLY') THEN + IF(LASBLY) DEALLOCATE(MIXA) + IBMOLD=1 + LASBLY=.TRUE. + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMGET(JPMAP,'STATE-VECTOR',ISTATE) + CALL LCMLEN(JPMAP,'MIX-ASBLY',NITMA,INDIC) + IF(NITMA.EQ.0)CALL XABORT('NCRRGR: No assembly defined') + NMIXA=NITMA/2 +* NMIXA=ISTATE(39) + ALLOCATE(MIXA(2*NMIXA)) + CALL LCMGET(JPMAP,'MIX-ASBLY',MIXA) + DO I=1,NMIXA + IF(IBM.EQ.MIXA(I)) THEN + IBMB=MIXA(I+NMIXA) + IBME=IBMB+NMIL-1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') + GOTO 30 + ENDIF + ENDDO + CALL XABORT('NCRRGR: WRONG ASSEMBLY MIXTURE.') + ENDIF +* ASBLY: automatically assembly-wise unfolded geometry + IBMB=IBM + IBME=IBM + GOTO 30 + ELSEIF(TEXT12.EQ.'MICRO')THEN + IF(IBM.EQ.0) CALL XABORT('NCRRGR: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: CHARACTER DATA EXPECTED(4).') + 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('NCRRGR: CHARACTER DATA EXPECTED(5).') + 60 IF(TEXT12.EQ.'ENDMIX')THEN + GOTO 30 + ELSE + NISOMI=NISOMI+1 + IF(NISOMI.GT.MAXISD) CALL XABORT('NCRRGR: MAXISD OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISOMI) + READ(TEXT12,'(2A4)') (HISOMI(I0,NISOMI),I0=1,2) + 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('NCRRGR: INVALID HISO DATA.') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: CHARACTER DATA EXPECTED.') + GOTO 60 + ENDIF + ELSEIF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA').OR. + 1 (TEXT12.EQ.'ADD'))THEN + IF(IBM.EQ.0) CALL XABORT('NCRRGR: MIX NOT SET (2).') + ITYPE=0 + LSET1=.FALSE. + LDELT1=.FALSE. + LADD1=.FALSE. + 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+NLOC + 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('NCRRGR: CHARACTER DATA EXPECTED(7).') + 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('NCRRGR: CHARACTER DATA EXPECTED(8).') +* check if parameter is global + IPAR=-99 + DO I=1,NPAR + IF(TEXT12.EQ.PARKEY(I))THEN + IPAR=I + LPCPO=LCMGID(IPCPO,'GLOBAL') + IPARTM=IPAR + PARNAM=TEXT12 + GOTO 70 + ENDIF + ENDDO +* check if parameter is local + DO I=1,NLOC + IF(TEXT12.EQ.PARKEL(I))THEN + IPAR=NPAR+I + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + IPARTM=IPAR-NPAR + PARNAM=TEXT12 + GOTO 70 + ENDIF + ENDDO + WRITE(HSMG,'(18HNCRRGR: 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 + WRITE(RECNAM,'(''pval'',I8.8)') IPARTM + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + IF(NVALUE(IPARTM).GT.MAXVAL)CALL XABORT('NCRRGR: MAXVAL OVERFL' + 1 //'OW.') + CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0)THEN + WRITE(HSMG,'(25HNCRRGR: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 PARNAM + CALL XABORT(HSMG) + ENDIF + IF((IPAR.GT.NPAR).OR. + 1 ((IPAR.LE.NPAR).AND.(PARFMT(IPAR).EQ.'REAL')))THEN + VALR1=VREAL(1) + VALR2=VREAL(NVALUE(IPAR)) + CALL LCMGET(LPCPO,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('NCRRGR: 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('NCRRGR: 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('NCRRGR: 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('NCRRGR: 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(IPARTM) + 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,'(23HNCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(1))') PARNAM,VALR1 + WRITE(6,*)'Domain:',VREAL(1),' <-> ',VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSEIF(VALR2.GT.VREAL(NVALUE(IPARTM)))THEN +* OUTSIDE OF THE DOMAIN (2) + WRITE(HSMG,'(23HNCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(2))') PARNAM,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,'(23HNCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(1))') PARNAM, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF + IF((LADD1).AND.(TEXT12.EQ.'REF'))THEN + 120 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 + DO I=1,NLOC + IF(TEXT12.EQ.PARKEL(I))THEN + IPAR=NPAR+I + GOTO 130 + ENDIF + ENDDO + CALL XABORT('NCRRGR: 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 + IF(IPAR.LE.NPAR)THEN + LPCPO=LCMGID(IPCPO,'GLOBAL') + IPARTM=IPAR + ELSE + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + IPARTM=IPAR-NPAR + ENDIF + WRITE(RECNAM,'(''pval'',I8.8)') IPARTM + CALL LCMGET(LPCPO,RECNAM,VREAL) + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=1 + DO J=1,NVALUE(IPARTM) + 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('NCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 120 + 140 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ELSE IF((LDELT1).AND.(TEXT12.EQ.'REF'))THEN + 150 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 + DO I=1,NLOC + IF(TEXT12.EQ.PARKEL(I))THEN + IPAR=NPAR+I + GOTO 160 + ENDIF + ENDDO + CALL XABORT('NCRRGR: 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 + IF(IPAR.LE.NPAR)THEN + LPCPO=LCMGID(IPCPO,'GLOBAL') + IPARTM=IPAR + ELSE + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + IPARTM=IPAR-NPAR + ENDIF + WRITE(RECNAM,'(''pval'',I8.8)') IPARTM + CALL LCMGET(LPCPO,RECNAM,VREAL) + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=1 + DO J=1,NVALUE(IPARTM) + 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('NCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 150 + 170 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + GOTO 30 + ELSEIF(PARFMT(IPAR).EQ.'INTEGER')THEN + IF(ITYPE.NE.1)CALL XABORT('NCRRGR: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('NCRRGR: INTEGER DATA EXPECTED.') + CALL LCMGET(LPCPO,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,'(26HNCRRGR: INTEGER PARAMETER ,A,9H WITH VAL, + 1 2HUE,I5,34H NOT FOUND IN MULTICOMPO DATABASE.)') + 2 PARKEY(IPAR), VALI(IPAR) + CALL XABORT(HSMG) + ELSEIF(PARFMT(IPAR).EQ.'STRING')THEN + IF(ITYPE.NE.1)CALL XABORT('NCRRGR: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3)CALL XABORT('NCRRGR: STRING DATA EXPECTED.') + CALL LCMGTC(LPCPO,RECNAM,12,NVALUE(IPAR),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,'(25HNCRRGR: STRING PARAMETER ,A,10H WITH VALU, + 1 1HE,A12,34H NOT FOUND IN MULTICOMPO DATABASE.)') + 2 PARKEY(IPAR), VALH(IPAR) + CALL XABORT(HSMG) + ENDIF + ELSEIF(TEXT12.EQ.'TIMAV-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('NCRRGR: MIX NOT SET (3).') + IBTYP=1 + ELSEIF(TEXT12.EQ.'INST-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('NCRRGR: MIX NOT SET (4).') + IBTYP=2 + ELSEIF(TEXT12.EQ.'AVG-EX-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('NCRRGR: MIX NOT SET (5).') + IBTYP=3 + CALL REDGET(INDIC,IVARTY,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('NCRRGR: 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.'REAL')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H NCRRGR: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H NCRRGR: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') PARKEY(IPAR) + ENDIF + ENDIF + ENDDO + DO IPAR=1,NLOC + IF(LCUB2(NPAR+IPAR)) THEN + WRITE(IOUT,'(25H NCRRGR: LOCAL PARAMETER:,A12,8H ->CUBIC, + 1 14HINTERPOLATION.)') PARKEL(IPAR) + ELSE + WRITE(IOUT,'(25H NCRRGR: LOCAL PARAMETER:,A12,8H ->LINEA, + 1 16HR INTERPOLATION.)') PARKEL(IPAR) + 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('NCRRGR: 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('NCRRGR: 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=-99 + 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 + DO I=1,NLOC + IF(HPAR(JPARM).EQ.PARKEL(I))THEN + IPAR=NPAR+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 281 JB=1,NB + DO 280 ICH=1,NCH + IB=(JB-1)*NCH+ICH + IF(FMIX(IB).EQ.0) GO TO 280 + NTOT=NTOT+1 +* ASBLY: loop on multicompo mixtures + DO 285 IBM=IBMB,IBME + IF(LASBLY) IBMOLD=IBM-IBMB+1 +* ASBLY: end + IPAR=-99 + IF(FMIX(IB).EQ.IBM)THEN + IF(NTOT.GT.NMIX) CALL XABORT('NCRRGR: NMIX OVERFLOW.') + DO 260 JPARM=1,NPARMP + IF(.NOT.LPARM(JPARM))GOTO 260 +* check if parameter is global + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + LPCPO=LCMGID(IPCPO,'GLOBAL') + IPARTM=IPAR + PARNAM=HPAR(JPARM) + GOTO 190 + ENDIF + ENDDO +* check if parameter is local + DO I=1,NLOC + IF(HPAR(JPARM).EQ.PARKEL(I))THEN + IPAR=NPAR+I + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + IPARTM=IPAR-NPAR + PARNAM=HPAR(JPARM) + GOTO 190 + ENDIF + ENDDO + WRITE(HSMG,'(18HNCRRGR: PARAMETER ,A,14H NOT FOUND(4).)') + 1 HPAR(JPARM) + CALL XABORT(HSMG) + 190 CONTINUE + WRITE(RECNAM,'(''pval'',I8.8)') IPARTM + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + IF(NVALUE(IPARTM).GT.MAXVAL)CALL XABORT('NCRRGR: MAXVAL OVERFL' + 1 //'OW.') + CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0)THEN + WRITE(HSMG,'(25HNCRRGR: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 PARNAM + 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 + LPCPO=LCMGID(IPCPO,'GLOBAL') + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + IF(NVALUE(IPARTM).GT.MAXVAL) CALL XABORT('NCRRGR: MAXVAL OVE' + 1 //'RFLOW.') + WRITE(RECNAM,'(''pval'',I8.8)') IPARTM + CALL LCMLEN(LPCPO,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0)THEN + WRITE(HSMG,'(25HNCRRGR: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 PARNAM + CALL XABORT(HSMG) + ENDIF + IF(LENGTH.GT.MAXVAL) CALL XABORT('NCRRGR: MAXVAL OVERFLOW.') + CALL LCMGET(LPCPO,RECNAM,VREAL) + IF(ITYPE.EQ.1)THEN + IF(VALR1.EQ.VALR2)THEN + DO J=1,NVALUE(IPARTM) + 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,'(23HNCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(3).)') PARNAM,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,'(23HNCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(4).)') PARNAM,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,'(23HNCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(2))') PARNAM, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + 260 CONTINUE + MIXC(NTOT)=IBMOLD + IF(IBMOLD.GT.NMIL) + 1 CALL XABORT('NCRRGR: MIX OVERFLOW (COMPO).') + IF(IMPY.GT.2) WRITE(6,'(32H NCRRGR: 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(1,NTOT,ISO)=HISOMI(1,ISO) + HISO(2,NTOT,ISO)=HISOMI(2,ISO) + CONC(NTOT,ISO)=CONCMI(ISO) + ENDDO + DO JPAR=1,NPAR+NLOC + MUPLT2(JPAR)=MUPLET(JPAR) + ENDDO + IF(IBTYP.EQ.3)THEN + IF(ZONEDP(ICH,JB).NE.0) THEN + CALL NCRTRP(IPCPO,LCUB2,IMPY,IBMOLD,NPAR,NLOC,NCAL, + 1 MUPLT2,MUTYPE,VALR(1,1),VARVAL,TERP(1,NTOT)) + ELSE + TERP(:NCAL,NTOT)=0.0 + ENDIF + ELSE + CALL NCRTRP(IPCPO,LCUB2,IMPY,IBMOLD,NPAR,NLOC,NCAL, + 1 MUPLT2,MUTYPE,VALR(1,1),VARVAL,TERP(1,NTOT)) + ENDIF +* DELTA-ADD + DO 270 IPAR=1,NPAR+NLOC + IF(LADD(IPAR))THEN + DO N=1,NDLTA(IPAR) + IDLTA1=IDLTA(IPAR,N) + DO JPAR=1,NPAR+NLOC + MUPLT2(JPAR)=MAPLET(JPAR,IDLTA1) + MUTYP2(JPAR)=MATYPE(JPAR,IDLTA1) + ENDDO + DO JPAR=1,NPAR+NLOC + 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 NCRTRP(IPCPO,LCUB2,IMPY,IBMOLD,NPAR,NLOC,NCAL, + 1 MUPLT2,MUTYP2,VALRA(1,1,IDLTA1),VARVAL,TERPA(1)) + DO 275 JCAL=1,NCAL + TERP(JCAL,NTOT)=TERP(JCAL,NTOT)+TERPA(JCAL) + 275 CONTINUE + DEALLOCATE(TERPA) + ENDDO + ENDIF + 270 CONTINUE + ENDIF +* ASBLY: next mixture + 285 CONTINUE +* ASBLY: end + 280 CONTINUE + 281 CONTINUE + IF(NTOT.GT.NMIX) CALL XABORT('NCRRGR: ALGORITHM FAILURE.') + IBM=0 + IBMB=0 + IBME=0 + ELSEIF((TEXT12.EQ.'COMPO').OR.(TEXT12.EQ.'TABLE').OR. + 1 (TEXT12.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT12.EQ.';') ITER=0 + IF(TEXT12.EQ.'COMPO') ITER=1 + IF(TEXT12.EQ.'TABLE') ITER=2 + DO 300 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 300 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('NCRRGR: 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,'(43HNCRRGR: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 300 CONTINUE +*---- +* EXIT MAIN LOOP OF THE SUBROUTINE +*---- + GO TO 310 + ELSE + CALL XABORT('NCRRGR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GOTO 20 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 310 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H NCRRGR: 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 +*---- + DEALLOCATE(HPAR,LDELTA,WPAR,BRN1,BRN0,ZONEC,ZONEDP,FMIX,LPARM) + IF(LASBLY) DEALLOCATE(MIXA) + RETURN + 320 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/NCRTRP.f b/Donjon/src/NCRTRP.f new file mode 100644 index 0000000..9b5203d --- /dev/null +++ b/Donjon/src/NCRTRP.f @@ -0,0 +1,223 @@ +*DECK NCRTRP + SUBROUTINE NCRTRP(IPCPO,LCUB2,IMPX,IBMOLD,NPAR,NLOC,NCAL,MUPLET, + 1 MUTYPE,VALR,VARVAL,TERP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the TERP interpolation/derivation/integration factors using +* table-of-content information of the multicompo for mixture IBMOLD. +* +*Copyright: +* Copyright (C) 2006 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert, R. Chambon +* +*Parameters: input +* IPCPO address of the multidimensional multicompo object. +* LCUB2 interpolation type for each parameter (=.TRUE.: cubic Ceschino +* interpolation; =.FALSE: linear Lagrange interpolation). +* IMPX print parameter (equal to zero for no print). +* IBMOLD material mixture index in the multicompo. +* NPAR number of global parameters. +* NLOC number of local parameters. +* NCAL number of elementary calculations in the multicompo. +* MUPLET tuple used to identify an elementary calculation. +* MUTYPE type of interpolation (=1: interpolation; =2: delta-sigma). +* VALR real values of the interpolated point. +* VARVAL exit burnup used if MUTYPE(IPAR(ID))=3. +* +*Parameters: output +* TERP interpolation factors. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXPAR=50 + TYPE(C_PTR) IPCPO + INTEGER IMPX,IBMOLD,NPAR,NLOC,NCAL,MUPLET(NPAR+NLOC), + 1 MUTYPE(NPAR+NLOC) + REAL VALR(2*MAXPAR,2),VARVAL,TERP(NCAL) + LOGICAL LCUB2(NPAR+NLOC) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXDIM=10 + INTEGER, PARAMETER::MAXVAL=200 + INTEGER IPAR(MAXDIM),NVALUE(MAXPAR),NVAL(MAXDIM),IDDIV(MAXDIM), + 1 NVPO(2) + REAL VREAL(MAXVAL),T1D(MAXVAL,MAXDIM),WORK(MAXVAL) + REAL BURN0, BURN1, DENOM, TERTMP + INTEGER ICAL, IDTMP, IDTOT, ID, ILONG, ITYLCM, I, JD, MAXNVP, + & NDELTA, NDIM, NID, NTOT, NCRCAL + CHARACTER HSMG*131,RECNAM*12,PARKEY(MAXPAR)*12 + LOGICAL LCUBIC,LSINGL + TYPE(C_PTR) JPCPO,KPCPO,LPCPO +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: JDEBAR,JARBVA + REAL, ALLOCATABLE, DIMENSION(:) :: TERPA +*---- +* RECOVER TREE INFORMATION +*---- + JPCPO=LCMGID(IPCPO,'GLOBAL') + CALL LCMGTC(JPCPO,'PARKEY',12,NPAR,PARKEY) + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + CALL LCMGET(LPCPO,'NVP',NVPO) + CALL LCMLEN(LPCPO,'ARBVAL',MAXNVP,ITYLCM) + IF(NVPO(1).GT.MAXNVP) CALL XABORT('NCRTRP: NVP OVERFLOW.') + ALLOCATE(JDEBAR(MAXNVP+1),JARBVA(MAXNVP)) + CALL LCMGET(LPCPO,'DEBARB',JDEBAR) + CALL LCMGET(LPCPO,'ARBVAL',JARBVA) +*---- +* COMPUTE TERP FACTORS +*---- + TERP(:NCAL)=0.0 + IPAR(:MAXDIM)=0 + NDIM=0 + NDELTA=0 + DO 10 I=1,NPAR+NLOC + IF(MUPLET(I).EQ.-1) THEN + NDIM=NDIM+1 + IF(MUTYPE(I).NE.1) NDELTA=NDELTA+1 + IF(NDIM.GT.MAXDIM) THEN + WRITE(HSMG,'(7HNCRTRP:,I4,29H-DIMENSIONAL INTERPOLATION NO, + 1 14HT IMPLEMENTED.)') NDIM + CALL XABORT(HSMG) + ENDIF + IPAR(NDIM)=I + ENDIF + 10 CONTINUE + IF(IMPX.GT.2) THEN + WRITE(IOUT,'(16H NCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(8H NCRTRP:,I4,31H-DIMENSIONAL INTERPOLATION IN C, + 1 12HOMPO MIXTURE,I5,1H.)') NDIM,IBMOLD + ENDIF + IF(NDIM.EQ.0) THEN + ICAL=NCRCAL(1,NVPO(1),NPAR+NLOC,JDEBAR,JARBVA,MUPLET) + IF(ICAL.GT.NCAL) CALL XABORT('NCRTRP: 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 + LPCPO=LCMGID(IPCPO,'GLOBAL') + WRITE(RECNAM,'(''pval'',I8.8)') IPAR(ID) + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + NID=NVALUE(IPAR(ID)) + ELSE + JPCPO=LCMGID(IPCPO,'MIXTURES') + KPCPO=LCMGIL(JPCPO,IBMOLD) + LPCPO=LCMGID(KPCPO,'TREE') + WRITE(RECNAM,'(''pval'',I8.8)') IPAR(ID)-NPAR + CALL LCMGET(LPCPO,'NVALUE',NVALUE) + NID=NVALUE(IPAR(ID)-NPAR) + ENDIF + NTOT=NTOT*NID + DO 15 IDTMP=1,NDIM-ID + IDDIV(IDTMP)=IDDIV(IDTMP)*NID + 15 CONTINUE + CALL LCMLEN(LPCPO,RECNAM,ILONG,ITYLCM) + IF(ILONG.GT.MAXVAL) CALL XABORT('NCRTRP: MAXVAL OVERFLOW.') + CALL LCMGET(LPCPO,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('@NCRTRP: 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('@NCRTRP: INVALID BURNUP' + 1 //' LIMITS(2).') + IF(PARKEY(IPAR(ID)).NE.'BURN') THEN + CALL XABORT('@NCRTRP: BURN EXPECTED.') + ENDIF + 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('NCRTRP: INVALID OPTION.') + ENDIF + 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 + ICAL=NCRCAL(1,NVPO(1),NPAR+NLOC,JDEBAR,JARBVA,MUPLET) + IF(ICAL.GT.NCAL) CALL XABORT('NCRTRP: 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,'(35H NCRTRP: TERP PARAMETERS IN MIXTURE,I4,1H:/(1X, + 1 1P,10E12.4))') IBMOLD,(TERP(I),I=1,NCAL) + ENDIF + DEALLOCATE(JARBVA,JDEBAR) + RETURN +*---- +* MISSING ELEMENTARY CALCULATION EXCEPTION. +*---- + 200 WRITE(IOUT,'(16H NCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR+NLOC) + CALL XABORT('NCRTRP: MISSING ELEMENTARY CALCULATION.') + 210 WRITE(IOUT,'(16H NCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR+NLOC) + CALL XABORT('NCRTRP: DEGENERATE ELEMENTARY CALCULATION.') + END diff --git a/Donjon/src/NEWMAC.f b/Donjon/src/NEWMAC.f new file mode 100644 index 0000000..613fa1b --- /dev/null +++ b/Donjon/src/NEWMAC.f @@ -0,0 +1,189 @@ +*DECK NEWMAC + SUBROUTINE NEWMAC(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Create a new macrolib which includes the devices properties. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The NEWMAC: module specification is: +* MACRO3 MATEX := NEWMAC: MATEX MACRO2 DEVICE +* :: [ EDIT iprint ] [ XFAC xfac ] ; +* where +* MACRO3 : name of the \emph{macrolib} to be created by the module. It will +* contain the updated properties of each material region with respect to +* the current position of each device. +* MATEX : name of the \emph{matex} object, containing the complete reactor +* material index including devices. MATEX must be specified in the +* modification mode; it will store the updated h-factors, computed per +* each fuel region with respect to the devices positions. +* MACRO2 : name of the read-only extended \emph{macrolib}, previously created +* by the MACINI: module. +* DEVICE : name of the read-only \emph{device} object containing the devices +* information and parameters. +* EDIT : keyword used to set iprint. +* iprint : integer index used to control the printing on screen: = 0 +* for no print; = 1 for minimum printing; larger values produce increasing +* amounts of output. The default value is iprint = 1. +* XFAC : keyword used to specify the number of cells on which incremental +* cross sections were computed in the supercell code. +* xfac : corrective factor for delta sigmas (real number). For DRAGON +* code, xfac is generally set to 2.0 and, for MULTICELL code, set to 1.0. +* The default value is 2.0. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + CHARACTER HSIGN*12,TEXT*12,HSMG*131 + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION DFLOT + TYPE(C_PTR) IPMAC,IPMTX,IPMAC2,IPDEV,JPMAC,KPMAC + REAL, ALLOCATABLE, DIMENSION(:) :: HFAC +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.NE.4)CALL XABORT('@NEWMAC: 4 PARAMETERS EXPECTED') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@NEWMA' + 1 //'C: LCM OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.0)CALL XABORT('@NEWMAC: CREATE MODE EXPECTED' + 1 //' FOR L_MACROLIB AT LHS.') + IPMAC=KENTRY(1) +* L_MATEX + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@NEWMA' + 1 //'C: LCM OBJECT EXPECTED AT RHS.') + IF(JENTRY(2).NE.1)CALL XABORT('@NEWMAC: MODIFICATION MODE EX' + 1 //'PECTED FOR L_MATEX OBJECT.') + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MATEX')THEN + TEXT=HENTRY(2) + CALL XABORT('@NEWMAC: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_MATEX EXPECTED AT RHS.') + ENDIF + IPMTX=KENTRY(2) + DO IEN=3,NENTRY + IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@N' + 1 //'EWMAC: LCM OBJECT EXPECTED AT RHS.') + IF(JENTRY(IEN).NE.2)CALL XABORT('@NEWMAC: READ-ONLY MODE EXP' + 1 //'ECTED FOR THE LCM OBJECTS AT RHS.') + ENDDO +* L_MACROLIB + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MACROLIB')THEN + TEXT=HENTRY(3) + CALL XABORT('@NEWMAC: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_MACROLIB EXPECTED AT RHS.') + ENDIF + IPMAC2=KENTRY(3) +* L_DEVICE + CALL LCMGTC(KENTRY(4),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_DEVICE')THEN + TEXT=HENTRY(4) + CALL XABORT('@NEWMAC: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_DEVICE EXPECTED AT RHS.') + ENDIF + IPDEV=KENTRY(4) +*---- +* RECOVER STATE-VECTOR INFORMATION +*---- + ISTATE(:NSTATE)=0 +* MACROLIB-INFO + CALL LCMGET(IPMAC2,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + NL=ISTATE(3) + NDEL=ISTATE(7) + LEAK=ISTATE(9) + ISTATE(:NSTATE)=0 +* MATEX-INFO + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) + IF(NMIX.NE.ISTATE(2)) THEN + WRITE(HSMG,'(45H@NEWMAC: FOUND DIFFERENT NUMBER OF MIXTURES I, + 1 12HN MACROLIB (,I8,13H) AND MATEX (,I8,2H).)') NMIX,ISTATE(2) + CALL XABORT(HSMG) + ENDIF + NEL=ISTATE(7) + LX=ISTATE(8) + LY=ISTATE(9) + LZ=ISTATE(10) +*---- +* READ INPUT DATA +*---- + IMPX=1 + XFAC=2.0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.10) GO TO 20 + IF(ITYP.NE.3)CALL XABORT('@NEWMAC: CHARACTER DATA EXPECTED(1)') + IF(TEXT.EQ.'EDIT') THEN +* READ PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@NEWMAC: INTEGER FOR EDIT EXPECTED') + ELSE IF (TEXT.EQ.'XFAC') THEN +* SET CORRECTIVE FACTOR FOR DELTA SIGMAS + CALL REDGET(ITYP,NITMA,XFAC,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@NEWMAC: REAL DATA EXPECTED') + ELSE IF(TEXT.EQ.';') THEN + GO TO 20 + ELSE + CALL XABORT('@NEWMAC: INVALID KEYWORD '//TEXT) + ENDIF + GO TO 10 +*---- +* CREATE NEW MACROLIB +*---- + 20 IF(IMPX.GT.4)THEN + CALL LCMLIB(IPMAC2) + CALL LCMLIB(IPMTX) + CALL LCMLIB(IPDEV) + ENDIF + CALL LCMEQU(IPMAC2,IPMAC) + IF(IMPX.GT.2)CALL LCMLIB(IPMAC) + CALL NEWMDV(IPMTX,IPMAC,IPMAC2,IPDEV,NMIX,NGRP,NL,NDEL,LEAK, + 1 NEL,LX,LY,LZ,XFAC,IMPX) +*---- +* RECOVER H-FACTOR +*---- + ALLOCATE(HFAC(NMIX*NGRP)) + JPMAC=LCMGID(IPMAC,'GROUP') + DO JGR=1,NGRP + KPMAC=LCMGIL(JPMAC,JGR) + CALL LCMLEN(KPMAC,'H-FACTOR',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@NEWMAC: UNABLE TO FIND H-F' + 1 //'ACTOR BLOCK DATA IN THE NEW MACROLIB.') + CALL LCMGET(KPMAC,'H-FACTOR',HFAC((JGR-1)*NMIX+1)) + ENDDO + CALL LCMPUT(IPMTX,'H-FACTOR',NMIX*NGRP,2,HFAC) + DEALLOCATE(HFAC) + IF(IMPX.GT.0) CALL LCMLIB(IPMAC) + RETURN + END diff --git a/Donjon/src/NEWMDV.f b/Donjon/src/NEWMDV.f new file mode 100644 index 0000000..0dfd906 --- /dev/null +++ b/Donjon/src/NEWMDV.f @@ -0,0 +1,172 @@ +*DECK NEWMDV + SUBROUTINE NEWMDV(IPMTX,IPMAC,IPMAC2,IPDEV,NMIX,NGRP,NL,NDEL,LEAK, + 1 NEL,LX,LY,LZ,XFAC,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Update the material properties and store them in a new macrolib. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPMTX pointer to matex information. +* IPMAC pointer to create mode macrolib. +* IPMAC2 pointer to read-only mode macrolib. +* IPDEV pointer to device information. +* NMIX maximum number of material mixtures. +* NGRP number of energy groups. +* NL number of legendre orders (=1 for isotropic scattering). +* NDEL number of precursor groups for delayed neutron. +* LEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic). +* NEL total number of elements. +* LX number of elements along x-axis. +* LY number of elements along y-axis. +* LZ number of elements along z-axis. +* XFAC corrective factor for delta sigmas. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMTX,IPMAC,IPMAC2,IPDEV + INTEGER NMIX,NGRP,NL,NDEL,LEAK,NEL,LX,LY,LZ + REAL XFAC +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6,EPSI=1.0E-4,MAXPRT=10) + INTEGER INDX(NEL),ISTATE(NSTATE),DMIX(2,MAXPRT),INAME(3) + REAL MESHX(LX+1),MESHY(LY+1),MESHZ(LZ+1),DPOS(6,MAXPRT),LEVEL + CHARACTER RNAME*12 + TYPE(C_PTR) JPDEV,KPDEV +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ + REAL, ALLOCATABLE, DIMENSION(:) :: TOT0,TOT1,ZNUS,CHI,SIGF,DIFX, + 1 DIFY,DIFZ,HFAC,SCAT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IJJ(NMIX*NGRP*NL),NJJ(NMIX*NGRP*NL),TOT0(NMIX*NGRP), + 1 TOT1(NMIX*NGRP),ZNUS(NMIX*NGRP*(NDEL+1)),CHI(NMIX*NGRP*(NDEL+1)), + 2 SIGF(NMIX*NGRP),DIFX(NMIX*NGRP),DIFY(NMIX*NGRP),DIFZ(NMIX*NGRP), + 3 HFAC(NMIX*NGRP),SCAT(NMIX*NL*NGRP*NGRP)) +*---- +* RECOVER EXISTING PROPERTIES +*---- + CALL NEWMGT(IPMAC2,NMIX,NGRP,NL,NDEL,LEAK,TOT0,TOT1,ZNUS,CHI,SIGF, + 1 DIFX,DIFY,DIFZ,HFAC,IJJ,NJJ,SCAT) +*---- +* RECOVER MATEX INFORMATION +*---- + MESHX(:LX+1)=0.0 + MESHY(:LY+1)=0.0 + MESHZ(:LZ+1)=0.0 + CALL LCMGET(IPMTX,'MESHX',MESHX) + CALL LCMGET(IPMTX,'MESHY',MESHY) + CALL LCMGET(IPMTX,'MESHZ',MESHZ) + INDX(:NEL)=0 + CALL LCMGET(IPMTX,'INDEX',INDX) + CALL LCMGET(IPDEV,'STATE-VECTOR',ISTATE) + IF(ISTATE(2).EQ.0)GOTO 30 +*---- +* UPDATE ROD PROPERTIES +*---- + ITOT=0 + NROD=ISTATE(2) + JPDEV=LCMGID(IPDEV,'DEV_ROD') + IF(IMPX.GT.0)WRITE(IOUT,1000) + DO 20 ID=1,NROD + KPDEV=LCMGIL(JPDEV,ID) + IF(IMPX.GT.5)CALL LCMLIB(KPDEV) + CALL LCMGET(KPDEV,'LEVEL',LEVEL) + IF(LEVEL.LT.EPSI)GOTO 20 + CALL LCMGET(KPDEV,'ROD-NAME',INAME) + WRITE(RNAME,'(3A4)') (INAME(I),I=1,3) + CALL LCMGET(KPDEV,'ROD-PARTS',NPART) + IF(NPART.GT.MAXPRT) CALL XABORT('NEWMDV: MAXPRT OVERFLOW.') + CALL LCMGET(KPDEV,'ROD-POS',DPOS) + CALL LCMGET(KPDEV,'ROD-MIX',DMIX) + DO 10 IPART=1,NPART + IF(IMPX.GT.2)WRITE(IOUT,1001)ID,IPART,RNAME,LEVEL,DPOS(1,IPART) + CALL NEWMVF(INDX,DPOS(1,IPART),DMIX(1,IPART),NGRP,NL,NDEL,LEAK, + 1 NEL,NMIX,LX,LY,LZ,MESHX,MESHY,MESHZ,TOT0,TOT1,ZNUS,CHI,SIGF,DIFX, + 2 DIFY,DIFZ,HFAC,SCAT,XFAC,IMPX) + IF(IMPX.GT.2)WRITE(IOUT,1002) + 10 CONTINUE + ITOT=ITOT+1 + 20 CONTINUE + IF(IMPX.GT.0)WRITE(IOUT,1003)ITOT + 30 IF(ISTATE(4).EQ.0)GOTO 50 +*---- +* UPDATE LZC PROPERTIES +*---- + ITOT=0 + NLZC=ISTATE(4) + JPDEV=LCMGID(IPDEV,'DEV_LZC') + IF(IMPX.GT.0)WRITE(IOUT,1004) + DO 40 ID=1,NLZC + KPDEV=LCMGIL(JPDEV,ID) + IF(IMPX.GT.2)WRITE(IOUT,1005)ID + IF(IMPX.GT.5)CALL LCMLIB(KPDEV) +* EMPTY-PART + CALL LCMGET(KPDEV,'EMPTY-POS',DPOS) + CALL LCMGET(KPDEV,'EMPTY-MIX',DMIX) + IF(IMPX.GT.2)WRITE(IOUT,1006)DPOS + CALL NEWMVF(INDX,DPOS(1,1),DMIX(1,1),NGRP,NL,NDEL,LEAK,NEL,NMIX, + 1 LX,LY,LZ,MESHX,MESHY,MESHZ,TOT0,TOT1,ZNUS,CHI,SIGF,DIFX,DIFY, + 2 DIFZ,HFAC,SCAT,XFAC,IMPX) +* FULL-PART + CALL LCMGET(KPDEV,'FULL-POS',DPOS) + CALL LCMGET(KPDEV,'FULL-MIX',DMIX) + IF(IMPX.GT.2)WRITE(IOUT,1007)DPOS + CALL NEWMVF(INDX,DPOS(1,1),DMIX(1,1),NGRP,NL,NDEL,LEAK,NEL,NMIX, + 1 LX,LY,LZ,MESHX,MESHY,MESHZ,TOT0,TOT1,ZNUS,CHI,SIGF,DIFX,DIFY, + 2 DIFZ,HFAC,SCAT,XFAC,IMPX) + IF(IMPX.GT.2)WRITE(IOUT,1002) + ITOT=ITOT+1 + 40 CONTINUE + IF(IMPX.GT.0)WRITE(IOUT,1008)ITOT +*---- +* STORE NEW PROPERTIES +*---- + 50 CALL NEWMPT(IPMAC,NMIX,NGRP,NL,NDEL,LEAK,TOT0,TOT1,ZNUS,CHI,SIGF, + 1 DIFX,DIFY,DIFZ,HFAC,IJJ,NJJ,SCAT) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(NJJ,IJJ,SCAT,HFAC,DIFZ,DIFY,DIFX,SIGF,CHI,ZNUS,TOT1, + 1 TOT0) + RETURN +* + 1000 FORMAT(/1X,'**',1X,'UPDATING PROPERTIES', + 1 1X,'FOR ALL INSERTED RODS',1X,'**'/) + 1001 FORMAT( + 1 /5X,'=>',2X,'ROD-ID #',I3.3,' PART:',I4,5X,'ROD-NAME:',1X,A + 2 /1X,'ROD INSERTION LEVEL =',F8.4 + 3 /1X,'CURRENT ROD POSITION :' + 4 /1X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4 + 5 /1X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1002 FORMAT(/1X,38('-')/) + 1003 FORMAT(/1X,'TOTAL NUMBER OF TREATED RODS:',I3/) +* + 1004 FORMAT(/1X,'**',1X,'UPDATING PROPERTIES', + 1 1X,'FOR ALL LZC-DEVICES',1X,'**'/) + 1005 FORMAT(/5X,'=>',2X,'LZC-ID #',I2.2) + 1006 FORMAT(/1X,'EMPTY-PART POSITION :' + 1 /1X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4 + 2 /1X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1007 FORMAT(/1X,'FULL-PART POSITION :' + 1 /1X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4 + 2 /1X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4) + 1008 FORMAT(/1X,'TOTAL NUMBER OF TREATED LZC:',I2/) + END diff --git a/Donjon/src/NEWMGT.f b/Donjon/src/NEWMGT.f new file mode 100644 index 0000000..0578daf --- /dev/null +++ b/Donjon/src/NEWMGT.f @@ -0,0 +1,200 @@ +*DECK NEWMGT + SUBROUTINE NEWMGT(IPMAC,NMIX,NGRP,NL,NDEL,LEAK,NTOT0,NTOT1,ZNUS, + 1 CHI,ZSIGF,DIFFX,DIFFY,DIFFZ,HFAC,IJJ,NJJ,SCAT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the existing macrolib data and store them in memory. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPMAC pointer to the macrolib information. +* NMIX maximum number of material mixtures. +* NGRP number of energy groups. +* NL number of legendre orders (=1 for isotropic scattering). +* NDEL number of precursor groups for delayed neutron. +* +*Parameters: output +* NTOT0 flux-weighted total macroscopic x-sections. +* NTOT1 current-weighted total macroscopic x-sections. +* ZNUS nu*fission macroscopic x-sections. +* CHI fission spectra. +* ZSIGF fission macroscopic x-sections. +* DIFFX x-directed diffusion coefficients. +* DIFFY y-directed diffusion coefficients. +* DIFFZ z-directed diffusion coefficients. +* HFAC h-factors (kappa*fission macroscopic x-sections). +* IJJ highest energy number for which the scattering +* component to group g does not vanish. +* NJJ number of energy groups for which the scattering +* component does not vanish. +* SCAT scattering macroscopic x-sections. +* LEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC + INTEGER NMIX,NGRP,NL,NDEL,LEAK,IJJ(NMIX,NL,NGRP),NJJ(NMIX,NL,NGRP) + REAL NTOT0(NMIX,NGRP),NTOT1(NMIX,NGRP),ZSIGF(NMIX,NGRP), + 1 DIFFX(NMIX,NGRP),DIFFY(NMIX,NGRP),DIFFZ(NMIX,NGRP), + 2 ZNUS(NMIX,NGRP,NDEL+1),CHI(NMIX,NGRP,NDEL+1),HFAC(NMIX,NGRP), + 3 SCAT(NMIX,NL,NGRP,NGRP) +*---- +* LOCAL VARIABLES +*---- + CHARACTER CM*2,TEXT12*12 + PARAMETER(IOUT=6) + TYPE(C_PTR) JPMAC,KPMAC + REAL, ALLOCATABLE, DIMENSION(:) :: WORK +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(WORK(NMIX*NGRP)) +* + WORK(:NMIX*NGRP)=0.0 + NTOT0(:NMIX,:NGRP)=0.0 + NTOT1(:NMIX,:NGRP)=0.0 + ZSIGF(:NMIX,:NGRP)=0.0 + DIFFX(:NMIX,:NGRP)=0.0 + DIFFY(:NMIX,:NGRP)=0.0 + DIFFZ(:NMIX,:NGRP)=0.0 + ZNUS(:NMIX,:NGRP,:NDEL+1)=0.0 + CHI(:NMIX,:NGRP,:NDEL+1)=0.0 + HFAC(:NMIX,:NGRP)=0.0 + SCAT(:NMIX,:NL,:NGRP,:NGRP)=0.0 + DO 12 IGR=1,NGRP + DO 11 IBM=1,NMIX + DO 10 IL=1,NL + IJJ(IBM,IL,IGR)=IGR + NJJ(IBM,IL,IGR)=1 + 10 CONTINUE + 11 CONTINUE + 12 CONTINUE +*---- +* RECOVER THE EXISTING MACROLIB DATA +*---- + JPMAC=LCMGID(IPMAC,'GROUP') + DO 70 JGR=1,NGRP + KPMAC=LCMGIL(JPMAC,JGR) +* NTOT0 + CALL LCMLEN(KPMAC,'NTOT0',LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,'NTOT0',NTOT0(1,JGR)) + ELSEIF(LENGT.EQ.0)THEN + CALL XABORT('@NEWMGT: MISSING NTOT0 DATA IN MACROLIB.') + ELSE + CALL XABORT('@NEWMGT: INVALID NTOT0 DATA IN MACROLIB.') + ENDIF +* NTOT1 + CALL LCMLEN(KPMAC,'NTOT1',LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,'NTOT1',NTOT1(1,JGR)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID NTOT1 DATA IN MACROLIB.') + ENDIF +* NUSIGF + CALL LCMLEN(KPMAC,'NUSIGF',LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,'NUSIGF',ZNUS(1,JGR,1)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID NUSIGF DATA IN MACROLIB.') + ENDIF + DO IDEL=1,NDEL + WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL + CALL LCMLEN(KPMAC,TEXT12,LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,TEXT12,ZNUS(1,JGR,IDEL+1)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID '//TEXT12//' DATA IN MACROLIB.') + ENDIF + ENDDO +* CHI + CALL LCMLEN(KPMAC,'CHI',LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,'CHI',CHI(1,JGR,1)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID CHI DATA IN MACROLIB.') + ENDIF + DO IDEL=1,NDEL + WRITE(TEXT12,'(3HCHI,I2.2)') IDEL + CALL LCMLEN(KPMAC,TEXT12,LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,TEXT12,CHI(1,JGR,IDEL+1)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID '//TEXT12//' DATA IN MACROLIB.') + ENDIF + ENDDO +* NFTOT + CALL LCMLEN(KPMAC,'NFTOT',LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,'NFTOT',ZSIGF(1,JGR)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID NFTOT DATA IN MACROLIB.') + ENDIF +* DIFF + CALL LCMLEN(KPMAC,'DIFF',LENGT,ITYLCM) + IF(LENGT.EQ.0)GOTO 20 + IF(LENGT.NE.NMIX)CALL XABORT('@NEWMGT: INVALID DIFF DATA.') + CALL LCMGET(KPMAC,'DIFF',DIFFX(1,JGR)) + LEAK=1 + GOTO 30 +* DIFFX + 20 CALL LCMLEN(KPMAC,'DIFFX',LENGT,ITYLCM) + IF(LENGT.EQ.0)GO TO 30 + IF(LENGT.NE.NMIX)CALL XABORT('@NEWMGT: INVALID DIFFX DATA.') + CALL LCMGET(KPMAC,'DIFFX',DIFFX(1,JGR)) +* DIFFY + CALL LCMLEN(KPMAC,'DIFFY',LENGT,ITYLCM) + IF(LENGT.NE.NMIX)CALL XABORT('@NEWMGT: INVALID DIFFY DATA.') + CALL LCMGET(KPMAC,'DIFFY',DIFFY(1,JGR)) +* DIFFZ + CALL LCMLEN(KPMAC,'DIFFZ',LENGT,ITYLCM) + IF(LENGT.NE.NMIX)CALL XABORT('@NEWMGT: INVALID DIFFZ DATA.') + CALL LCMGET(KPMAC,'DIFFZ',DIFFZ(1,JGR)) + LEAK=2 +* H-FACTOR + 30 CALL LCMLEN(KPMAC,'H-FACTOR',LENGT,ITYLCM) + IF(LENGT.EQ.NMIX)THEN + CALL LCMGET(KPMAC,'H-FACTOR',HFAC(1,JGR)) + ELSEIF(LENGT.NE.0)THEN + CALL XABORT('@NEWMGT: INVALID H-FACTOR DATA IN MACROLIB.') + ENDIF +* SCAT,NJJ,IJJ + DO IL=1,NL + WRITE (CM,'(I2.2)') IL-1 + CALL LCMLEN(KPMAC,'SCAT'//CM,LENGT,ITYLCM) + IF(LENGT.GT.NMIX*NL*NGRP*NGRP)THEN + CALL XABORT('@NEWMGT: INVALID INPUT MACROLIB(1).') + ELSEIF(LENGT.GT.0)THEN + CALL LCMGET(KPMAC,'SCAT'//CM,WORK) + CALL LCMGET(KPMAC,'NJJS'//CM,NJJ(1,IL,JGR)) + CALL LCMGET(KPMAC,'IJJS'//CM,IJJ(1,IL,JGR)) + IPOSDE=0 + DO 65 IBM=1,NMIX + IJJ0=IJJ(IBM,IL,JGR) + DO 60 IGR=IJJ0,IJJ0-NJJ(IBM,IL,JGR)+1,-1 + IPOSDE=IPOSDE+1 + SCAT(IBM,IL,IGR,JGR)=WORK(IPOSDE) + 60 CONTINUE + 65 CONTINUE + ELSE + CALL XABORT('@NEWMGT: OLD FORMAT OF THE MACROLIB.') + ENDIF + ENDDO + 70 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WORK) + RETURN + END diff --git a/Donjon/src/NEWMPT.f b/Donjon/src/NEWMPT.f new file mode 100644 index 0000000..fe286f2 --- /dev/null +++ b/Donjon/src/NEWMPT.f @@ -0,0 +1,138 @@ +*DECK NEWMPT
+ SUBROUTINE NEWMPT(IPMAC,NMIX,NGRP,NL,NDEL,LEAK,NTOT0,NTOT1,ZNUS,
+ 1 CHI,ZSIGF,DIFFX,DIFFY,DIFFZ,HFAC,IJJ,NJJ,SCAT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Store modified nuclear properties in a new macrolib.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input/output
+* IPMAC pointer to create mode macrolib.
+* NMIX maximum number of material mixtures.
+* NGRP number of energy groups.
+* NL number of legendre orders (=1 for isotropic scattering).
+* NDEL number of precursor groups for delayed neutron.
+* LEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic).
+* NTOT0 flux-weighted total macroscopic x-sections.
+* NTOT1 current-weighted total macroscopic x-sections.
+* ZNUS nu*fission macroscopic x-sections.
+* CHI fission spectra.
+* ZSIGF fission macroscopic x-sections.
+* DIFFX x-directed diffusion coefficients.
+* DIFFY y-directed diffusion coefficients.
+* DIFFZ z-directed diffusion coefficients.
+* HFAC h-factors (kappa*fission macroscopic x-sections).
+* IJJ highest energy number for which the scattering
+* component to group g does not vanish.
+* NJJ number of energy groups for which the scattering
+* component does not vanish.
+* SCAT scattering macroscopic x-sections.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAC
+ INTEGER NMIX,NGRP,NL,NDEL,LEAK,IJJ(NMIX,NL,NGRP),NJJ(NMIX,NL,NGRP)
+ REAL NTOT0(NMIX,NGRP),NTOT1(NMIX,NGRP),ZSIGF(NMIX,NGRP),
+ 1 DIFFX(NMIX,NGRP),DIFFY(NMIX,NGRP),DIFFZ(NMIX,NGRP),
+ 2 ZNUS(NMIX,NGRP,NDEL+1),CHI(NMIX,NGRP,NDEL+1),HFAC(NMIX,NGRP),
+ 3 SCAT(NMIX,NL,NGRP,NGRP)
+*----
+* LOCAL VARIABLES
+*----
+ CHARACTER CM*2,TEXT12*12
+ TYPE(C_PTR) JPMAC,KPMAC
+ REAL, ALLOCATABLE, DIMENSION(:) :: WORK
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(WORK(NMIX*NGRP))
+*----
+* STORE PROPERTIES
+*----
+ JPMAC=LCMGID(IPMAC,'GROUP')
+ DO 30 JGR=1,NGRP
+ KPMAC=LCMGIL(JPMAC,JGR)
+* NTOT0
+ CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,NTOT0(1,JGR))
+* NTOT1
+ CALL LCMLEN(KPMAC,'NTOT1',LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,'NTOT1',NMIX,2,NTOT1(1,JGR))
+* NUSIGF
+ CALL LCMLEN(KPMAC,'NUSIGF',LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,'NUSIGF',NMIX,2,ZNUS(1,JGR,1))
+ DO IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL
+ CALL LCMLEN(KPMAC,TEXT12,LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,TEXT12,NMIX,2,ZNUS(1,JGR,IDEL+1))
+ ENDDO
+* CHI
+ CALL LCMLEN(KPMAC,'CHI',LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,'CHI',NMIX,2,CHI(1,JGR,1))
+ DO IDEL=1,NDEL
+ WRITE(TEXT12,'(3HCHI,I2.2)') IDEL
+ CALL LCMLEN(KPMAC,TEXT12,LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,TEXT12,NMIX,2,CHI(1,JGR,IDEL+1))
+ ENDDO
+* NFTOT
+ CALL LCMLEN(KPMAC,'NFTOT',LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,'NFTOT',NMIX,2,ZSIGF(1,JGR))
+ IF(LEAK.EQ.1)THEN
+* DIFF
+ CALL LCMPUT(KPMAC,'DIFF',NMIX,2,DIFFX(1,JGR))
+ ELSEIF(LEAK.EQ.2)THEN
+* DIFFX,DIFFY,DIFFZ
+ CALL LCMPUT(KPMAC,'DIFFX',NMIX,2,DIFFX(1,JGR))
+ CALL LCMPUT(KPMAC,'DIFFY',NMIX,2,DIFFY(1,JGR))
+ CALL LCMPUT(KPMAC,'DIFFZ',NMIX,2,DIFFZ(1,JGR))
+ ENDIF
+* H-FACTOR
+ CALL LCMLEN(KPMAC,'H-FACTOR',LENGT,ITYP)
+ IF(LENGT.EQ.NMIX)
+ 1 CALL LCMPUT(KPMAC,'H-FACTOR',NMIX,2,HFAC(1,JGR))
+ DO IL=1,NL
+ WRITE (CM,'(I2.2)') IL-1
+ CALL LCMLEN(KPMAC,'SCAT'//CM,LENGT,ITYP)
+ IF(LENGT.NE.0)THEN
+ IPOSDE=0
+ DO 20 IBM=1,NMIX
+ DO IGR=IJJ(IBM,IL,JGR),IJJ(IBM,IL,JGR)-
+ 1 NJJ(IBM,IL,JGR)+1,-1
+ IPOSDE=IPOSDE+1
+ WORK(IPOSDE)=SCAT(IBM,IL,IGR,JGR)
+ ENDDO
+ HFAC(IBM,JGR)=0.
+ DO 10 IGR=1,NGRP
+ HFAC(IBM,JGR)=HFAC(IBM,JGR)+SCAT(IBM,IL,JGR,IGR)
+ 10 CONTINUE
+ 20 CONTINUE
+ CALL LCMPUT(KPMAC,'SCAT'//CM,IPOSDE,2,WORK)
+ CALL LCMPUT(KPMAC,'NJJS'//CM,NMIX,1,NJJ(1,IL,JGR))
+ CALL LCMPUT(KPMAC,'IJJS'//CM,NMIX,1,IJJ(1,IL,JGR))
+ CALL LCMPUT(KPMAC,'SIGW'//CM,NMIX,2,SCAT(1,IL,JGR,JGR))
+ CALL LCMPUT(KPMAC,'SIGS'//CM,NMIX,2,HFAC(1,JGR))
+ ENDIF
+ ENDDO
+ 30 CONTINUE
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(WORK)
+ RETURN
+ END
diff --git a/Donjon/src/NEWMVF.f b/Donjon/src/NEWMVF.f new file mode 100644 index 0000000..8d21653 --- /dev/null +++ b/Donjon/src/NEWMVF.f @@ -0,0 +1,190 @@ +*DECK NEWMVF + SUBROUTINE NEWMVF(INDX,DPOS,DMIX,NGRP,NL,NDEL,LEAK,NEL,NMIX,LX, + 1 LY,LZ,MESHX,MESHY,MESHZ,NTOT0,NTOT1,ZNUS,CHI,ZSIGF,DIFFX,DIFFY, + 2 DIFFZ,HFAC,SCAT,XFAC,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover material regions affected by the device insertion. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, D. Sekki +* +*Parameters: input/output +* INDX index number of each material volume (=0 for virtual regions). +* DPOS device position in cm in the core. +* DMIX device mixtures for insertion and extraction. +* NGRP number of energy groups. +* NL number of legendre orders (=1 for isotropic scattering). +* NDEL number of precursor groups for delayed neutron. +* LEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic). +* NEL total number of elements. +* NMIX maximum number of material mixtures. +* LX number of elements along x-axis. +* LY number of elements along y-axis. +* LZ number of elements along z-axis. +* MESHX mesh coordinates along x-axis. +* MESHY mesh coordinates along y-axis. +* MESHZ mesh coordinates along z-axis. +* NTOT0 flux-weighted total macroscopic x-sections. +* NTOT1 current-weighted total macroscopic x-sections. +* ZNUS nu*fission macroscopic x-sections. +* CHI fission spectra. +* ZSIGF fission macroscopic x-sections. +* DIFFX x-directed diffusion coefficients. +* DIFFY y-directed diffusion coefficients. +* DIFFZ z-directed diffusion coefficients. +* HFAC h-factors (kappa*fission macroscopic x-sections). +* SCAT scattering macroscopic x-sections. +* XFAC corrective factor for delta sigmas. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NGRP,NL,NDEL,LEAK,NEL,NMIX,INDX(NEL),DMIX(2),LX,LY,LZ,IMPX + REAL MESHX(LX+1),MESHY(LY+1),MESHZ(LZ+1),DIFFX(NMIX,NGRP), + 1 ZSIGF(NMIX,NGRP),NTOT1(NMIX,NGRP),ZNUS(NMIX,NGRP,NDEL+1), + 2 CHI(NMIX,NGRP,NDEL+1),DPOS(6),NTOT0(NMIX,NGRP),HFAC(NMIX,NGRP), + 3 SCAT(NMIX,NL,NGRP,NGRP),DIFFY(NMIX,NGRP),DIFFZ(NMIX,NGRP),XFAC + PARAMETER(IOUT=6,EPSI=1.0E-4) +*---- +* RECOVER REGIONS WHERE DEVICE IS INSERTED +*---- + IF(IMPX.GT.4)WRITE(IOUT,*)'RECOVER REGIONS AFFECTED BY DEVICE' +* INSERTED COORDINATES + DX1=DPOS(1) + DX2=DPOS(2) + DY1=DPOS(3) + DY2=DPOS(4) + DZ1=DPOS(5) + DZ2=DPOS(6) + IF(DX1.LT.MESHX(1)) DX1=MESHX(1) + IF(DX2.LT.MESHX(1)) DX2=MESHX(1) + IF(DX2.GT.MESHX(LX+1)) DX2=MESHX(LX+1) + IF(DX1.GT.MESHX(LX+1)) DX1=MESHX(LX+1) + IF(ABS(DX1-DX2).LT.EPSI) RETURN + IF(DY1.LT.MESHY(1)) DY1=MESHY(1) + IF(DY2.LT.MESHY(1)) DY2=MESHY(1) + IF(DY2.GT.MESHY(LY+1)) DY2=MESHY(LY+1) + IF(DY1.GT.MESHY(LY+1)) DY1=MESHY(LY+1) + IF(ABS(DY1-DY2).LT.EPSI) RETURN + IF(DZ1.LT.MESHZ(1)) DZ1=MESHZ(1) + IF(DZ2.LT.MESHZ(1)) DZ2=MESHZ(1) + IF(DZ2.GT.MESHZ(LZ+1)) DZ2=MESHZ(LZ+1) + IF(DZ1.GT.MESHZ(LZ+1)) DZ1=MESHZ(LZ+1) + IF(ABS(DZ1-DZ2).LT.EPSI) RETURN + I1=0 + I2=0 +* CHECK X-AXIS + DO I=1,LX + IF(ABS(DX1-MESHX(I)).LT.EPSI) DX1=MESHX(I) + IF(ABS(DX2-MESHX(I)).LT.EPSI) DX2=MESHX(I) + IF(ABS(DX1-MESHX(I+1)).LT.EPSI) DX1=MESHX(I+1) + IF(ABS(DX2-MESHX(I+1)).LT.EPSI) DX2=MESHX(I+1) + IF((DX1.GE.MESHX(I)).AND.(DX1.LT.MESHX(I+1)))I1=I + IF((DX2.GT.MESHX(I)).AND.(DX2.LE.MESHX(I+1)))THEN + I2=I + GOTO 10 + ENDIF + ENDDO + 10 IF(IMPX.GT.4)WRITE(IOUT,*)' I1=',I1,', I2=',I2 + IF((I1.EQ.0).OR.(I2.EQ.0))CALL XABORT('@NEWMVF: WR' + 1 //'ONG NUMBER OF AFFECTED REGIONS ALONG X-AXIS.') + J1=0 + J2=0 +* CHECK Y-AXIS + DO J=1,LY + IF(ABS(DY1-MESHY(J)).LT.EPSI) DY1=MESHY(J) + IF(ABS(DY2-MESHY(J)).LT.EPSI) DY2=MESHY(J) + IF(ABS(DY1-MESHY(J+1)).LT.EPSI) DY1=MESHY(J+1) + IF(ABS(DY2-MESHY(J+1)).LT.EPSI) DY2=MESHY(J+1) + IF((DY1.GE.MESHY(J)).AND.(DY1.LT.MESHY(J+1)))J1=J + IF((DY2.GT.MESHY(J)).AND.(DY2.LE.MESHY(J+1)))THEN + J2=J + GOTO 20 + ENDIF + ENDDO + 20 IF(IMPX.GT.4)WRITE(IOUT,*)' J1=',J1,', J2=',J2 + IF((J1.EQ.0).OR.(J2.EQ.0))CALL XABORT('@NEWMVF: WR' + 1 //'ONG NUMBER OF AFFECTED REGIONS ALONG Y-AXIS.') + K1=0 + K2=0 +* CHECK Z-AXIS + DO K=1,LZ + IF(ABS(DZ1-MESHZ(K)).LT.EPSI) DZ1=MESHZ(K) + IF(ABS(DZ2-MESHZ(K)).LT.EPSI) DZ2=MESHZ(K) + IF(ABS(DZ1-MESHZ(K+1)).LT.EPSI) DZ1=MESHZ(K+1) + IF(ABS(DZ2-MESHZ(K+1)).LT.EPSI) DZ2=MESHZ(K+1) + IF((DZ1.GE.MESHZ(K)).AND.(DZ1.LT.MESHZ(K+1)))K1=K + IF((DZ2.GT.MESHZ(K)).AND.(DZ2.LE.MESHZ(K+1)))THEN + K2=K + GOTO 30 + ENDIF + ENDDO + 30 IF(IMPX.GT.4)WRITE(IOUT,*)' K1=',K1,', K2=',K2 + IF((K1.EQ.0).OR.(K2.EQ.0))CALL XABORT('@NEWMVF: WR' + 1 //'ONG NUMBER OF AFFECTED REGIONS ALONG Z-AXIS.') +*---- +* COMPUTE OCCUPIED VOLUME FRACTION +*---- + DO 42 K=K1,K2 + DO 41 J=J1,J2 + DO 40 I=I1,I2 + IEL=(K-1)*LX*LY+(J-1)*LX+I + IBM=INDX(IEL) + IF(IMPX.GT.4)WRITE(IOUT,*)'AFFECTED ELEM #',IEL,' MIX #',IBM + IF(IBM.NE.0)THEN + FX=0. +* FRACTION ALONG X-AXIS + IF((DX1.GE.MESHX(I)).AND.(DX2.GT.MESHX(I+1)))THEN + FX=(MESHX(I+1)-DX1)/(MESHX(I+1)-MESHX(I)) + ELSEIF((DX1.GE.MESHX(I)).AND.(DX2.LE.MESHX(I+1)))THEN + FX=(DX2-DX1)/(MESHX(I+1)-MESHX(I)) + ELSEIF((DX1.LT.MESHX(I)).AND.(DX2.GT.MESHX(I+1)))THEN + FX=1. + ELSEIF((DX1.LT.MESHX(I)).AND.(DX2.LE.MESHX(I+1)))THEN + FX=(DX2-MESHX(I))/(MESHX(I+1)-MESHX(I)) + ENDIF + FY=0. +* FRACTION ALONG Y-AXIS + IF((DY1.GE.MESHY(J)).AND.(DY2.GT.MESHY(J+1)))THEN + FY=(MESHY(J+1)-DY1)/(MESHY(J+1)-MESHY(J)) + ELSEIF((DY1.GE.MESHY(J)).AND.(DY2.LE.MESHY(J+1)))THEN + FY=(DY2-DY1)/(MESHY(J+1)-MESHY(J)) + ELSEIF((DY1.LT.MESHY(J)).AND.(DY2.GT.MESHY(J+1)))THEN + FY=1. + ELSEIF((DY1.LT.MESHY(J)).AND.(DY2.LE.MESHY(J+1)))THEN + FY=(DY2-MESHY(J))/(MESHY(J+1)-MESHY(J)) + ENDIF + FZ=0. +* FRACTION ALONG Z-AXIS + IF((DZ1.GE.MESHZ(K)).AND.(DZ2.GT.MESHZ(K+1)))THEN + FZ=(MESHZ(K+1)-DZ1)/(MESHZ(K+1)-MESHZ(K)) + ELSEIF((DZ1.GE.MESHZ(K)).AND.(DZ2.LE.MESHZ(K+1)))THEN + FZ=(DZ2-DZ1)/(MESHZ(K+1)-MESHZ(K)) + ELSEIF((DZ1.LT.MESHZ(K)).AND.(DZ2.GT.MESHZ(K+1)))THEN + FZ=1. + ELSEIF((DZ1.LT.MESHZ(K)).AND.(DZ2.LE.MESHZ(K+1)))THEN + FZ=(DZ2-MESHZ(K))/(MESHZ(K+1)-MESHZ(K)) + ENDIF +* VOLUME FRACTION + VF=FX*FY*FZ + IF((IMPX.GT.4).AND.(VF.GT.EPSI)) + 1 WRITE(IOUT,*)'INSERTED DEVICE VOLUME FRACTION ',VF +* UPDATE PROPERTIES + IF(VF.GT.EPSI) + 1 CALL NEWMXS(NTOT0,NTOT1,ZNUS,CHI,ZSIGF,DIFFX,DIFFY,DIFFZ,HFAC, + 2 SCAT,IBM,DMIX(1),DMIX(2),NGRP,NMIX,NL,NDEL,LEAK,VF,XFAC,IMPX) + ENDIF + 40 CONTINUE + 41 CONTINUE + 42 CONTINUE + RETURN + END diff --git a/Donjon/src/NEWMXS.f b/Donjon/src/NEWMXS.f new file mode 100644 index 0000000..cf54fb4 --- /dev/null +++ b/Donjon/src/NEWMXS.f @@ -0,0 +1,214 @@ +*DECK NEWMXS + SUBROUTINE NEWMXS(NTOT0,NTOT1,ZNUS,CHI,ZSIGF,DIFFX,DIFFY,DIFFZ, + 1 HFAC,SCAT,IBM,IBM1,IBM2,NGRP,NMIX,NL,NDEL,LEAK,VF,XFAC,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute nuclear properties perturbed by the device insertion. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input/output +* NTOT0 flux-weighted total macroscopic x-sections. +* NTOT1 current-weighted total macroscopic x-sections. +* ZNUS nu*fission macroscopic x-sections. +* CHI fission spectra. +* ZSIGF fission macroscopic x-sections. +* DIFFX x-directed diffusion coefficients. +* DIFFY y-directed diffusion coefficients. +* DIFFZ z-directed diffusion coefficients. +* HFAC h-factors (kappa*fission macroscopic x-sections). +* SCAT scattering macroscopic x-sections. +* IBM mixture index for physical region. +* IBM1 device mixture index for inserted device. +* IBM2 device mixture index for extracted device. +* NGRP number of energy groups. +* NMIX maximum number of material mixtures. +* NL number of legendre orders (=1 for isotropic scattering). +* NDEL number of precursor groups for delayed neutron. +* LEAK diffusion coefficient flag (=1: isotropic; =2: anisotropic). +* VF volume fraction occupied by the device. +* XFAC corrective factor for delta sigmas. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IBM,IBM1,IBM2,NGRP,NL,NDEL,LEAK,NMIX,IMPX + REAL NTOT0(NMIX,NGRP),NTOT1(NMIX,NGRP),ZNUS(NMIX,NGRP,NDEL+1), + 1 CHI(NMIX,NGRP,NDEL+1),ZSIGF(NMIX,NGRP),DIFFX(NMIX,NGRP), + 2 HFAC(NMIX,NGRP),VF,SCAT(NMIX,NL,NGRP,NGRP),DIFFY(NMIX,NGRP), + 3 DIFFZ(NMIX,NGRP),XFAC + PARAMETER(IOUT=6,EPSI=1.0E-4) +*---- +* UPDATE PROPERTIES +*---- + IF(IMPX.GT.4)WRITE(IOUT,*)' UPDATING PROPERTIES' + DO 70 JGR=1,NGRP + IF(IMPX.GT.4)WRITE(IOUT,*)' ' + IF(IMPX.GT.4)WRITE(IOUT,*)' PROCESSING ENERGY GROUP # ',JGR +*---- +* NTOT0 +*---- + IF(IMPX.GT.4)WRITE(IOUT,*)' NTOT0 BEFORE : ',NTOT0(IBM,JGR) + DELT=NTOT0(IBM1,JGR)-NTOT0(IBM2,JGR) + NTOT0(IBM,JGR)=NTOT0(IBM,JGR)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' NTOT0 AFTER : ',NTOT0(IBM,JGR) +*---- +* NTOT1 +*---- + IF(NTOT1(IBM,JGR).EQ.0.)GOTO 10 + IF(IMPX.GT.4)WRITE(IOUT,*)' NTOT1 BEFORE : ',NTOT1(IBM,JGR) + DELT=NTOT1(IBM1,JGR)-NTOT1(IBM2,JGR) + NTOT1(IBM,JGR)=NTOT1(IBM,JGR)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' NTOT1 AFTER : ',NTOT1(IBM,JGR) +*---- +* NUSIGF +*---- + 10 IF(ZNUS(IBM,JGR,1).EQ.0.)GOTO 15 + IF(IMPX.GT.4)WRITE(IOUT,*)' NUSIGF BEFORE : ',ZNUS(IBM,JGR,1) + DELT=ZNUS(IBM1,JGR,1)-ZNUS(IBM2,JGR,1) + ZNUS(IBM,JGR,1)=ZNUS(IBM,JGR,1)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' NUSIGF AFTER : ',ZNUS(IBM,JGR,1) + DO IDEL=1,NDEL + IF(IMPX.GT.4)WRITE(IOUT,*)' NUSIGF',IDEL,' BEFORE : ', + > ZNUS(IBM,JGR,IDEL+1) + DELT=ZNUS(IBM1,JGR,IDEL+1)-ZNUS(IBM2,JGR,IDEL+1) + ZNUS(IBM,JGR,IDEL+1)=ZNUS(IBM,JGR,IDEL+1)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' NUSIGF',IDEL,' AFTER : ', + > ZNUS(IBM,JGR,IDEL+1) + ENDDO +*---- +* CHI +*---- + 15 IF(CHI(IBM,JGR,1).EQ.0.)GOTO 20 + IF(IMPX.GT.4)WRITE(IOUT,*)' CHI BEFORE : ',CHI(IBM,JGR,1) + DELT=CHI(IBM1,JGR,1)-CHI(IBM2,JGR,1) + CHI(IBM,JGR,1)=CHI(IBM,JGR,1)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' CHI AFTER : ',CHI(IBM,JGR,1) + DO IDEL=1,NDEL + IF(IMPX.GT.4)WRITE(IOUT,*)' CHI',IDEL,' BEFORE : ', + > CHI(IBM,JGR,IDEL+1) + DELT=CHI(IBM1,JGR,IDEL+1)-CHI(IBM2,JGR,IDEL+1) + CHI(IBM,JGR,IDEL+1)=CHI(IBM,JGR,IDEL+1)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' CHI',IDEL,' AFTER : ', + > CHI(IBM,JGR,IDEL+1) + ENDDO +*---- +* NFTOT +*---- + 20 IF(ZSIGF(IBM,JGR).EQ.0.)GOTO 30 + IF(IMPX.GT.4)WRITE(IOUT,*)' NFTOT BEFORE : ',ZSIGF(IBM,JGR) + DELT=ZSIGF(IBM1,JGR)-ZSIGF(IBM2,JGR) + ZSIGF(IBM,JGR)=ZSIGF(IBM,JGR)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' NFTOT AFTER : ',ZSIGF(IBM,JGR) +*---- +* HFAC +*---- + 30 IF(HFAC(IBM,JGR).EQ.0.)GOTO 40 + IF(IMPX.GT.4)WRITE(IOUT,*)' H-FACTOR BEFORE : ',HFAC(IBM,JGR) + DELT=HFAC(IBM1,JGR)-HFAC(IBM2,JGR) + HFAC(IBM,JGR)=HFAC(IBM,JGR)+XFAC*VF*DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' H-FACTOR AFTER : ',HFAC(IBM,JGR) +*---- +* DIFFX +*---- + 40 IF(DIFFX(IBM,JGR).LT.EPSI)GOTO 50 + IF(IMPX.GT.4)WRITE(IOUT,*)' DIFFX BEFORE : ',DIFFX(IBM,JGR) + IF(DIFFX(IBM1,JGR).LT.EPSI)THEN + DEL1=0. + ELSE + DEL1=1./DIFFX(IBM1,JGR) + ENDIF + IF(DIFFX(IBM2,JGR).LT.EPSI)THEN + DEL2=0. + ELSE + DEL2=1./DIFFX(IBM2,JGR) + ENDIF + DELT=DEL1-DEL2 + DIFFX(IBM,JGR)=1./DIFFX(IBM,JGR)+XFAC*VF*DELT + DIFFX(IBM,JGR)=1./DIFFX(IBM,JGR) + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DIFFX AFTER : ',DIFFX(IBM,JGR) +*---- +* DIFFY +*---- + 50 IF(LEAK.NE.2)GOTO 70 + IF(DIFFY(IBM,JGR).LT.EPSI)GOTO 60 + IF(IMPX.GT.4)WRITE(IOUT,*)' DIFFY BEFORE : ',DIFFY(IBM,JGR) + IF(DIFFY(IBM1,JGR).LT.EPSI)THEN + DEL1=0. + ELSE + DEL1=1./DIFFY(IBM1,JGR) + ENDIF + IF(DIFFY(IBM2,JGR).LT.EPSI)THEN + DEL2=0. + ELSE + DEL2=1./DIFFY(IBM2,JGR) + ENDIF + DELT=DEL1-DEL2 + DIFFY(IBM,JGR)=1./DIFFY(IBM,JGR)+XFAC*VF*DELT + DIFFY(IBM,JGR)=1./DIFFY(IBM,JGR) + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DIFFY AFTER : ',DIFFY(IBM,JGR) +*---- +* DIFFZ +*---- + 60 IF(DIFFZ(IBM,JGR).LT.EPSI)GOTO 70 + IF(IMPX.GT.4)WRITE(IOUT,*)' DIFFZ BEFORE : ',DIFFZ(IBM,JGR) + IF(DIFFZ(IBM1,JGR).LT.EPSI)THEN + DEL1=0. + ELSE + DEL1=1./DIFFZ(IBM1,JGR) + ENDIF + IF(DIFFZ(IBM2,JGR).LT.EPSI)THEN + DEL2=0. + ELSE + DEL2=1./DIFFZ(IBM2,JGR) + ENDIF + DELT=DEL1-DEL2 + DIFFZ(IBM,JGR)=1./DIFFZ(IBM,JGR)+XFAC*VF*DELT + DIFFZ(IBM,JGR)=1./DIFFZ(IBM,JGR) + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' DIFFZ AFTER : ',DIFFZ(IBM,JGR) + 70 CONTINUE +*---- +* SCAT +*---- + DO 82 IL=1,NL + DO 81 IGR=1,NGRP + DO 80 JGR=1,NGRP + DELT=SCAT(IBM1,IL,IGR,JGR)-SCAT(IBM2,IL,IGR,JGR) + IF((SCAT(IBM,IL,IGR,JGR).NE.0.0).AND.(DELT.NE.0.0)) THEN + IF(IMPX.GT.4)WRITE(IOUT,*)' PROCESSING ENERGY GROUP # ',JGR, + > '<-',IGR + IF(IMPX.GT.4)WRITE(IOUT,*)' SCAT',IL,' BEFORE : ', + > SCAT(IBM,IL,IGR,JGR) + ENDIF + SCAT(IBM,IL,IGR,JGR)=SCAT(IBM,IL,IGR,JGR)+XFAC*VF*DELT + IF(DELT.NE.0.0) THEN + IF(IMPX.GT.4)WRITE(IOUT,*)' DELTA-SIGMA : ',DELT + IF(IMPX.GT.4)WRITE(IOUT,*)' SCAT',IL,' AFTER : ', + > SCAT(IBM,IL,IGR,JGR) + ENDIF + 80 CONTINUE + 81 CONTINUE + 82 CONTINUE + IF(IMPX.GT.4)WRITE(IOUT,*)' ALL PROPERTIES UPDATED.' + RETURN + END diff --git a/Donjon/src/PCR.f b/Donjon/src/PCR.f new file mode 100644 index 0000000..d048e4e --- /dev/null +++ b/Donjon/src/PCR.f @@ -0,0 +1,463 @@ +*DECK PCR + SUBROUTINE PCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and interpolate Microlib or Macrolib information from one or +* many PMAXS files. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The PCR: calling specifications are: +* MLIB := PCR: [ { MLIB | MLIB2 } ] PMAX1 [[ PMAX2 ]] [ MAPFL ] :: (PCR\_data) ; +* where +* MLIB : name of a \emph{microlib (type L\_LIBRARY) or \emph{macrolib} (type +* L\_MACROLIB) containing the interpolated data. If this object also +* appears on the RHS of structure (PCR:, it is open in modification mode +* and updated. +* MLIB2 : name of an optional \emph{microlib} object whose content is copied +* on MLIB. +* PMAX1 : name of the PMAXS file. +* PMAX2 : name of an additional PMAXS file. This file is optional. +* MAPFL : name of the \emph{map} object containing fuel regions description, +* parameter information (burnup, fuel/coolant temperatures, coolant +* density, etc). Keyword TABLE is expected in (PCR\_data). +* PCR\_data : input data structure containing interpolation information. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE PCRDATA + USE PCREAD +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,MXPMAXS=10,MAXISD=200,IOUT=6,MAXR=12) + INTEGER ISTATE(NSTATE),XS_F_NUM,IFPMAXS(MXPMAXS) + LOGICAL LMACRO,LCUBIC + DOUBLE PRECISION DFLOTT + TYPE(C_PTR) IPMAP,IPLIB,IPLIB2 + CHARACTER HSIGN*12,TEXT4*4,TEXT12*12,HSMG*131,NMDEPL(MAXR)*8 + CHARACTER(LEN=12) :: HFPMAXS(MXPMAXS) +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NISO,ITNAM,ITZEA,MATNO, + 1 KPAX,INAM,IZAE,HREAC,IDR,KPAR + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: HISO + REAL, ALLOCATABLE, DIMENSION(:) :: BPAX,RER,RRD,BPAR,YIELD + REAL, ALLOCATABLE, DIMENSION(:,:) :: TERP,CONC + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LMIXC + TYPE(XSBLOCK_ITEM), ALLOCATABLE, DIMENSION(:) :: XS_CALC +* + SAVE NMDEPL + DATA NMDEPL/'DECAY ','NFTOT ','NG ','N2N ', + > 'N3N ','N4N ','NA ','NP ', + > 'N2A ','NNP ','ND ','NT '/ +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LE.1) CALL XABORT('PCR: MINIMUM OF 2 OBJECTS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('PCR: MACRO' + 1 //'LIB LCM OBJECT EXPECTED AT LHS.') + IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('PCR: MACRO' + 1 //'LIB IN CREATE OR MODIFICATION MODE EXPECTED.') + IACCS=JENTRY(1) + IPLIB=KENTRY(1) + IPLIB2=C_NULL_PTR + IPMAP=C_NULL_PTR + IFPMAXS(:)=0 ! PMAXS file unit + NGRP=0 + NMIX=0 + XS_F_NUM=0 + IF(IACCS.EQ.1) THEN + CALL LCMGTC(IPLIB,'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(3) + NMIX=ISTATE(1) + ELSE IF(HSIGN.NE.'L_MACROLIB') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ELSE + TEXT12=HENTRY(1) + CALL XABORT('PCR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_LIBRARY OR L_MACROLIB EXPECTED.') + ENDIF + ENDIF + DO 10 I=2,NENTRY + IF(IENTRY(I).EQ.3) CALL XABORT('PCR: LCM OBJECTS OR ASCII FILE' + 1 //'S EXPECTED AT RHS.') + IF(JENTRY(I).NE.2) CALL XABORT('PCR: LCM OBJECTS IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') + IF(IENTRY(I).EQ.4) THEN + XS_F_NUM=XS_F_NUM+1 + IF(XS_F_NUM.GT.MXPMAXS) CALL XABORT('PCR: MXPMAXS OVERFLOW.') + IFPMAXS(XS_F_NUM)=FILUNIT(KENTRY(I)) + HFPMAXS(XS_F_NUM)=HENTRY(I) + ELSE + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + IF(C_ASSOCIATED(IPLIB2)) CALL XABORT('PCR: ONLY ONE MICROL' + 1 //'IB EXPECTED AT RHS.') + IPLIB2=KENTRY(I) + GO TO 10 + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL XABORT('PCR: ANOTHER MACROLIB NOT EXPECTED AT RHS.') + ELSE IF(HSIGN.EQ.'L_MAP') THEN + IF(I.NE.NENTRY)CALL XABORT('PCR: FUEL-MAP EXPECTED TO BE T' + 1 //'HE LAST OBJECT.') + IF(NENTRY.LT.3)CALL XABORT('PCR: MISSING SAPHYB OBJECT.') + IPMAP=KENTRY(NENTRY) + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NMIX=ISTATE(9) + ELSE + CALL XABORT('PCR: INVALID SIGNATURE='//HSIGN//'.') + ENDIF + ENDIF + 10 CONTINUE +*---- +* ALLOCATE PMAXS INFORMATION +*---- + IF(XS_F_NUM.EQ.0) CALL XABORT('PCR: PMAXS FILE NOT DEFINED.') + ALLOCATE(Bran_info(XS_F_NUM)) + ALLOCATE(PMAXS(XS_F_NUM)) + KREAD=-1 + DO I=1,XS_F_NUM + PMAX=>PMAXS(I) + Bran_info(I)%NOT_assigned=.true. + CALL read_PMAXS_file(I,KREAD,IFPMAXS(I)) + KREAD=0 + ENDDO + NCAL=0 + DO IBRA=1,NBRA + IBSET=PMAX%BRANCH(IBRA,1)%IBSET + NBURN=PMAX%Bset(IBSET)%NBURN + NCAL=NCAL+NBURN + ENDDO +*---- +* READ THE INPUT DATA +*---- + LMACRO=.TRUE. + LCUBIC=.FALSE. + B2=0.0 + IMPX=1 + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCR: CHARACTER DATA EXPECTED(1).') + 30 IF(TEXT12.EQ.'EDIT') THEN +* READ THE PRINT INDEX. + CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('PCR: INTEGER DATA EXPECTED(1).') + ELSE IF(TEXT12.EQ.'NMIX') THEN +* READ THE MAXIMUM NUMBER OF MATERIAL MIXTURES. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('PCR: INTEGER DATA EXPECTED(2).') + IF(NITMA.LT.NMIX) THEN + WRITE(HSMG,'(20HPCR: NMIX MUST BE >=,I8)') NMIX + CALL XABORT(HSMG) + ENDIF + NMIX=NITMA + ELSE IF(TEXT12.EQ.'MACRO') THEN + LMACRO=.TRUE. + ELSE IF(TEXT12.EQ.'MICRO') THEN + LMACRO=.FALSE. + ELSE IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + ELSE IF(TEXT12.EQ.'PMAXS') THEN + IF(NMIX.EQ.0) CALL XABORT('PCR: ZERO NUMBER OF MIXTURES.') + IF(C_ASSOCIATED(IPMAP)) THEN + WRITE(IOUT,'(/43H PCR: ***WARNING*** A FUEL MAP IS SET AT RH, + 1 26HS; KEYWORD TABLE EXPECTED.)') + ENDIF + NGRP=NGROUP + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCR: CHARACTER DATA EXPECTED(2).') + I0=0 + DO 60 I=1,XS_F_NUM + IF(TEXT12.EQ.HFPMAXS(I)) THEN + PMAX=>PMAXS(I) + ITH=I + GO TO 70 + ENDIF + 60 CONTINUE + CALL XABORT('PCR: PMAXS FILE '//TEXT12//' NOT FOUND.') + 70 IF(IMPX.GT.0) WRITE(IOUT,320) TEXT12 + ALLOCATE(TERP(NCAL,NMIX),NISO(NMIX),HISO(2,NMIX,MAXISD), + 1 CONC(NMIX,MAXISD),LMIXC(NMIX),XS_CALC(NCAL)) +* + CALL PCRDRV(LCUBIC,NMIX,IMPX,NCAL,ITER,MAXNIS,TERP,NISO,HISO, + 1 CONC,LMIXC,XS_CALC) + GO TO 100 + ELSE IF(TEXT12.EQ.'TABLE') THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('PCR: MISSING FUEL-MA' + 1 //'P OBJECT.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + NGRP=ISTATE(4) + NFUEL=ISTATE(7) + NPARM=ISTATE(8) + IF(NCOMB.EQ.0)CALL XABORT('PCR: NUMBER OF COMBUSTION ZONES NO' + 1 //'T YET DEFINED IN THE FUEL MAP NCOMB=0.') + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCR: CHARACTER DATA EXPECTED(3).') + I0=0 + DO 80 I=1,XS_F_NUM + IF(TEXT12.EQ.HFPMAXS(I)) THEN + PMAX=>PMAXS(I) + ITH=I + GO TO 90 + ENDIF + 80 CONTINUE + CALL XABORT('PCR: PMAXS FILE '//TEXT12//' NOT FOUND.') + 90 IF(IMPX.GT.0) WRITE(IOUT,320) TEXT12 + IF(NGRP.NE.NGROUP) THEN + WRITE(HSMG,'(9H PCR: THE,I4,29H-TH PMAXS FILE HAS AN INVALID, + 1 25H NUMBER OF ENERGY GROUPS.)') ITH + CALL XABORT(HSMG) + ENDIF + ALLOCATE(TERP(NCAL,NMIX),NISO(NMIX),HISO(2,NMIX,MAXISD), + 1 CONC(NMIX,MAXISD),LMIXC(NMIX),XS_CALC(NCAL)) +* + CALL PCRRGR(IPMAP,LCUBIC,NMIX,IMPX,NCAL,NCH,NB,NFUEL,NPARM, + 1 ITER,MAXNIS,TERP,NISO,HISO,CONC,LMIXC,XS_CALC) + GO TO 100 + ELSE IF(TEXT12.EQ.'LEAK') THEN + CALL REDGET(INDIC,NITMA,B2,TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('PCR: REAL DATA EXPECTED.') + ELSE IF(TEXT12.EQ.'CHAIN') THEN + IF(LMACRO) CALL XABORT('PCR: MICRO KEYWORD EXPECTED.') + CALL REDGET(INDIC,MD2,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('PCR: INTEGER DATA EXPECTED.') +* + NBESP=1 + ALLOCATE(ITNAM(3*MD2),ITZEA(MD2),MATNO(MD2), + 1 KPAX((MD2+MAXR)*MD2),BPAX((MD2+MAXR)*MD2*NBESP)) + TEXT4=' ' + READ(TEXT4,'(A4)') ITEXT4 + ITNAM(:3*MD2)=ITEXT4 + ITZEA(:MD2)=0 + MATNO(:MD2)=0 + KPAX(:(MD2+MAXR)*MD2)=0 + BPAX(:(MD2+MAXR)*MD2*NBESP)=0.0 + CALL PCREIR(NMDEPL,MD2,NEL,ITNAM,ITZEA,KPAX,BPAX) + CALL LIBWET(MAXR,MD2,NBESP,NSTATE,NMDEPL,ITNAM,ISTATE,MATNO, + 1 KPAX,BPAX) + NDEPL=ISTATE(1) + NDFI=ISTATE(2) + NDFP=ISTATE(3) + NHEAVY=ISTATE(4) + NLIGHT=ISTATE(5) + NOTHER=ISTATE(6) + NSTABL=ISTATE(7) + NREAC=ISTATE(8) + NPAR=ISTATE(9) + NBESP=MAX(1,ISTATE(10)) +*---- +* ALLOCATE DECAY CHAIN +*---- + NDEPL=MAX(NDEPL,1) + NDFI=MAX(NDFI,1) + NDFP=MAX(NDFP,1) + ALLOCATE(INAM(3*NDEPL),IZAE(NDEPL),IDR(NREAC*NDEPL), + 1 RER(NREAC*NDEPL),RRD(NDEPL),KPAR(NPAR*NDEPL),BPAR(NPAR*NDEPL), + 2 YIELD(NDFI*NDFP*NBESP)) +*---- +* SET DECAY CHAIN +*---- + CALL LIBWED(MAXR,MD2,NBESP,NDEPL,NDFI,NDFP,NHEAVY,NLIGHT,NOTHER, + > NREAC,NPAR,ITNAM,ITZEA,MATNO,KPAX,BPAX,INAM,IZAE, + > IDR,RER,RRD,KPAR,BPAR,YIELD) +*---- +* RELEASE WORK VECTORS FOR WIMS-AECL, WIMS-NEA, DRAGLIB +* AND INPUT FILE +*---- + DEALLOCATE(BPAX,KPAX,MATNO,ITZEA,ITNAM) +*---- +* SELECT USED DEPLETION REACTION NAMES +*---- + ALLOCATE(HREAC(2*NREAC)) + DO 95 I=1,NREAC + READ(NMDEPL(I),'(2A4)') (HREAC(2*(I-1)+J),J=1,2) + 95 CONTINUE +*---- +* PRINT DECAY CHAIN IF REQUIRED +*---- + IMPY=IMPX+2 + CALL LIBEPR(IMPY,NBESP,NDEPL,NSTABL,NDFI,NDFP,NREAC,NPAR,INAM, + > HREAC,IDR,RER,RRD,KPAR,BPAR,YIELD,IZAE) +*---- +* SAVE CHAIN +*---- + CALL LCMSIX(IPLIB,'DEPL-CHAIN',1) + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + NDEPL=ISTATE(1) + CALL LCMPUT(IPLIB,'ISOTOPESDEPL',3*NDEPL,3,INAM) + CALL LCMPUT(IPLIB,'CHARGEWEIGHT',NDEPL,1,IZAE) + CALL LCMPUT(IPLIB,'DEPLETE-IDEN',2*NREAC,3,HREAC) + CALL LCMPUT(IPLIB,'DEPLETE-REAC',NREAC*NDEPL,1,IDR) + CALL LCMPUT(IPLIB,'DEPLETE-ENER',NREAC*NDEPL,2,RER) + CALL LCMPUT(IPLIB,'DEPLETE-DECA',NDEPL,2,RRD) + CALL LCMPUT(IPLIB,'PRODUCE-REAC',NPAR*NDEPL,1,KPAR) + CALL LCMPUT(IPLIB,'PRODUCE-RATE',NPAR*NDEPL,2,BPAR) + IF(NDFP.GT.0) CALL LCMPUT(IPLIB,'FISSIONYIELD',NDFI*NDFP*NBESP, + > 2,YIELD) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(11)=NDEPL + ISTATE(12)=NMIX + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* DEALLOCATE DECAY CHAIN ARRAYS +*---- + DEALLOCATE(YIELD,BPAR,KPAR,RRD,RER,IDR,IZAE,INAM) + IF(IMPX.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,300) IMPX,(ISTATE(I),I=1,12) + WRITE(IOUT,310) (ISTATE(I),I=13,15),(ISTATE(I),I=17,24) + ENDIF + ELSE IF(TEXT12.EQ.';') THEN + GO TO 200 + ELSE + CALL XABORT('PCR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* BUILD THE INTERPOLATED MACROLIB OR MICROLIB +*---- + 100 IF(LMACRO) THEN +* build a macrolib + CALL PCRMAC(MAXNIS,IPLIB,IACCS,NMIX,NGRP,NGFF,IMPX,NCAL,TERP, + 1 NISO,HISO,CONC,LMIXC,XS_CALC,B2) + IF(IMPX.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,290) IMPX,(ISTATE(I),I=1,9),ISTATE(12),ISTATE(16) + ENDIF + ELSE +* build a microlib + IF(IACCS.EQ.0)THEN + MAXISO=MAXISD*NMIX + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXISO=MAX(MAXISD*NMIX,ISTATE(2)) + ENDIF + CALL PCRMIC(MAXNIS,MAXISO,IPLIB,IACCS,NMIX,NGRP,IMPX,NCAL,TERP, + 1 NISO,HISO,CONC,LMIXC,XS_CALC,B2) + IF(IMPX.GT.0) THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,300) IMPX,(ISTATE(I),I=1,12) + WRITE(IOUT,310) (ISTATE(I),I=13,15),(ISTATE(I),I=17,24) + ENDIF + ENDIF +* + DEALLOCATE(XS_CALC,LMIXC,CONC,HISO,NISO,TERP) +*---- +* CONTINUE DATA PROCESSING +*---- + IF(ITER.EQ.0) THEN + GO TO 200 + ELSE IF(ITER.EQ.1) THEN + TEXT12='PMAXS' + GO TO 30 + ELSE IF(ITER.EQ.2) THEN + TEXT12='TABLE' + GO TO 30 + ELSE IF(ITER.EQ.3) THEN + TEXT12='CHAIN' + GO TO 30 + ENDIF +*---- +* DEALLOCATE PMAXS INFORMATION +*---- + 200 IF(IMPX.GT.2) CALL LCMLIB(IPLIB) + DO I=1,XS_F_NUM + PMAX=>PMAXS(I) + CALL Clear_PMAXS_file(I) + ENDDO + DEALLOCATE(PMAXS,Bran_info) + RETURN +* + 290 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NGROUP,I6,28H (NUMBER OF ENERGY GROUPS)/ + 3 7H NBMIX ,I6,39H (NUMBER OF MIXTURES IN THE MACROLIB)/ + 4 7H NANISO,I6,34H (MAXIMUM SCATTERING ANISOTROPY)/ + 5 7H NIFISS,I6,45H (MAXIMUM NUMBER OF FISSILE ISOTOPES IN A M, + 6 7HIXTURE)/ + 7 7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 8 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 9 43H=RECOVER FROM LIBRARY/4=LEAKAGE CORRECTION)/ + 1 7H NLG ,I6,39H (NUMBER OF DELAYED PRECURSOR GROUPS)/ + 2 7H NALBP ,I6,31H (NUMBER OF PHYSICAL ALBEDOS)/ + 3 7H ILEAK ,I6,40H (1=DIFF AVAILABLE; 2=DIFFX AVAILABLE)/ + 4 7H IDF ,I6,33H (0=NO ADF INFO/2=ADF GAP INFO)/ + 5 7H NGFF ,I6,39H (0: NO GENERALIZED FORM FACTOR INFO)) + 300 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H MAXMIX,I6,31H (MAXIMUM NUMBER OF MIXTURES)/ + 3 7H NBISO ,I6,36H (NUMBER OF ISOTOPES OR MATERIALS)/ + 4 7H NGRP ,I6,28H (NUMBER OF ENERGY GROUPS)/ + 5 7H NL ,I6,30H (NUMBER OF LEGENDRE ORDERS)/ + 6 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 7 57H=RECOVER FROM LIBRARY/3=WIMS-D TYPE/4=LEAKAGE CORRECTION)/ + 8 7H IPROB ,I6,23H (0=DIRECT/1=ADJOINT)/ + 9 7H ITIME ,I6,28H (1=STEADY-STATE/2=PROMPT)/ + 1 7H NLIB ,I6,32H (NUMBER OF SETS OF LIBRARIES)/ + 2 7H NGF ,I6,48H (NUMBER OF FAST GROUP WITHOUT SELF-SHIELDING)/ + 3 7H IGRMAX,I6,41H (LAST GROUP INDEX WITH SELF-SHIELDING)/ + 4 7H NDEPL ,I6,33H (NUMBER OF DEPLETING ISOTOPES)/ + 5 7H NCOMB ,I6,33H (NUMBER OF DEPLETING MIXTURES)) + 310 FORMAT(7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 1 7H NBMIX ,I6,23H (NUMBER OF MIXTURES)/ + 2 7H NRES ,I6,40H (NUMBER OF SETS OF RESONANT MIXTURES)/ + 3 7H IPROC ,I6,48H (-1=SKIP LIBRARY PROCESSING/0=DILUTION INTERP, + 4 48HOLATION/1=USE PHYSICAL TABLES/2=BUILD A DRAGLIB/, + 5 55H3=COMPUTE CALENDF TABLES/4=COMPUTE SLOWING-DOWN TABLES)/ + 6 7H IMAC ,I6,45H (0=DO NOT/1=DO BUILD AN EMBEDDED MACROLIB)/ + 7 7H NDEL ,I6,31H (NUMBER OF PRECURSOR GROUPS)/ + 8 7H NFISS ,I6,31H (NUMBER OF FISSILE ISOTOPES)/ + 9 7H ISOADD,I6,37H (0=COMPLETE BURNUP CHAIN/1=DO NOT)/ + 1 7H MAXISM,I6,40H (MAX. NUMBER OF ISOTOPES PER MIXTURE)/ + 2 7H IPRECI,I6,34H (CALENDF ACCURACY FLAG:1/2/3/4)/ + 3 7H IDF ,I6,33H (0=NO ADF INFO/2=ADF GAP INFO)) + 320 FORMAT(/32H PCR: INTERPOLATING PMAXS FILE ',A12,2H'.) + END diff --git a/Donjon/src/PCRDATA.f90 b/Donjon/src/PCRDATA.f90 new file mode 100644 index 0000000..d153429 --- /dev/null +++ b/Donjon/src/PCRDATA.f90 @@ -0,0 +1,276 @@ +MODULE PCRDATA +! +!----------------------------------------------------------------------- +! +!Purpose: +! Fortran module containing PMAXS file information. +! +!Copyright: +! Copyright (C) 2019 Ecole Polytechnique de Montreal +! +!Author(s): A. Hebert +! +!----------------------------------------------------------------------- +! + IMPLICIT NONE + INTEGER(4), PARAMETER :: Nallvar=12 + REAL(8) :: state_value(Nallvar) + + CHARACTER(2) :: all_var_nam(Nallvar) + DATA all_var_nam/'CR','DC','PC','TF','TC','IC','DM','PM','TM','IM','DN','BN'/ + INTEGER(4), PARAMETER :: svCR=1,svDC=2,svPC=3,svTF=4,svTC=5 + INTEGER(4), PARAMETER :: svIC=6,svDM=7,svPM=8,svTM=9,svIM=10 + INTEGER(4), PARAMETER :: svDN=11,svBN=12 + + REAL(8) :: Sref(Nallvar) + DATA Sref/0.0, 0.71, 600.0, 28.3, 580.0, 0.0, 0.71, 600.0, 580.0, 0.0, 0.0, 0.0 / + + LOGICAL :: validname + LOGICAL :: lHST(Nallvar), lSTT(Nallvar) + + CHARACTER(12) :: formng + CHARACTER(3) :: TIVname(4) + + INTEGER(4), PARAMETER :: xtr=1,xab=2,xnf=3,xkf=4,xxe=5,xsm=6,xfi=7 + INTEGER(4), PARAMETER :: xdcl=1,xdwr=2,xdbp=3,xdcr=4,xchi=1,BBET=1 + INTEGER(4) :: xchd,xinv, EBET,BLAM,ELAM,BDHB,EDHB,BDHL,EDHL + INTEGER(4) :: xlpk,xj1i,xj1s,xj1c + INTEGER(4) :: NXST,NLPF,iLPF,iXSTI + INTEGER(4) :: iTIV(4),ilpk,ij1c,iread_xs + + INTEGER(4) :: NGR,NDL,NDC,NAD,NCD + INTEGER(4) :: NGROUP,NDLAY,NDCAY,NADF,NZDF,NCDF,iups,Nset,NTDF + INTEGER(4) :: NHST,NBRA,NBCR,NBset,NRODS,NCOL,NROW,NPART,NROWA,NCOLA,NXSB + INTEGER(4) :: MHST,MBRA,MBCR,MBset,MRODS,MCOLA + INTEGER(4) :: N_Bran_struct,Nstat_var,ktf + INTEGER(4), DIMENSION(:), POINTER :: var_ind,NBR + REAL(8) :: iHMD,Dsat,ARWatR,ARByPa,ARConR,PITCH,XBE,YBE,minw,maxw,maxws,minws + REAL(8), DIMENSION(:,:), POINTER :: state + + LOGICAL :: ladf,lxes,lded,lj1f,lchi,lchd,linv,ldet,lyld,lcdf,lgff,lbet,lamb,ldec,lzdf + LOGICAL :: tcdf,tgff + LOGICAL :: padf,pxes,pded,pj1f,pchi,pchd,pvel,pdet,pyld,pcdf,pgff,pbet,pamb,pdec,pzdf + LOGICAL :: lcrp,lppm,lxesm,derivatives, outrange + + CHARACTER(80),DIMENSION(6) :: hcomment + + TYPE Branches_info + INTEGER(4) :: Nstat_var, ktf, NBRA + INTEGER(4), DIMENSION(:), POINTER :: var_ind !(Nstat_var) + INTEGER(4), DIMENSION(:), POINTER :: NBR !(Nstat_var) + Character(2), DIMENSION(:), POINTER :: state_nam !(NBRA) + REAL(8), DIMENSION(:,:), POINTER :: state !(Nstat_var,NBRA) + logical :: NOT_assigned + Character(2), DIMENSION(:), POINTER :: var_nam !(Nstat_var) + END TYPE Branches_info + + TYPE XSBLOCK_TYPE + REAL(8), DIMENSION(:,:), POINTER ::sig !(NGROUP,NXST) +! 1 2 3 4 5 6 7 +! xtr,xab,xnf,xkf,xfi,xxe,xsm + REAL(8), DIMENSION(:,:), POINTER ::sct,adf,cdf,gff,zdf + REAL(8), DIMENSION(:), POINTER ::LPF,det + REAL(8) :: kinf,B2,kinfB,kinfL +! Average assembly flux + REAL(8), DIMENSION(:), POINTER :: flux +! Axial surface flux, (g,bottom->top) + REAL(8), DIMENSION(:,:), POINTER :: zflx +! Radial surface flux, (g,W-S-E-N) if cart, if hex(g,NW-W-SW-SE-E-NE) + REAL(8), DIMENSION(:,:), POINTER :: rflx +! Axial current in, (g,bottom->top,i-o-n) + REAL(8), DIMENSION(:,:,:), POINTER :: zcur +! Radial surface flux, (g,W-S-E-N,i-o-n) if cart, if hex(g,NW-W-SW-SE-E-NE) + REAL(8), DIMENSION(:,:,:), POINTER :: rcur +! Groupwise yields + REAL(8), DIMENSION(:), POINTER :: yldI, yldXe, yldPm +! Xe, Sm, I, Pm Number Densities + REAL(8) :: NDXE,NDSM,NDI,NDPM + END TYPE XSBLOCK_TYPE + + TYPE BRANCH_WISE_TYPE + INTEGER(4) :: iBset + TYPE(XSBLOCK_TYPE),dimension(:),pointer:: XS(:) !(NBURN) + END TYPE BRANCH_WISE_TYPE + + TYPE PMAXS_WISE_TYPE + logical derivatives + INTEGER(4) :: NCOL,NRODS,NROW,NPART,NROWA,NCOLA + INTEGER(4) :: NHST,NBset + REAL(8), DIMENSION(:,:), POINTER :: history !(Nstat_var,NHST) + REAL(8), DIMENSION(:), POINTER :: invdiff !(NHST) + INTEGER(4), DIMENSION(:), POINTER :: base !(NHST) + REAL(8):: iHMD,Dsat,ARWatR,ARByPa,ARConR,PITCH,XBE,YBE + + TYPE(BRANCH_WISE_TYPE), DIMENSION(:,:), POINTER :: branch !(NBRA,NHST) + TYPE(HIST_TIV_TYPE), DIMENSION(:), POINTER :: TIVB !(NHST) + TYPE(Burnup_info),DIMENSION(:), POINTER :: Bset !(NBset) + END TYPE PMAXS_WISE_TYPE + + TYPE HIST_TIV_TYPE + INTEGER(4) :: iBset + TYPE(TH_INDEP_VAR),dimension(:),pointer:: TIV(:) !(NBURN) + END TYPE HIST_TIV_TYPE + + TYPE Burnup_info + INTEGER(4) :: NBURN + REAL(8),DIMENSION(:), POINTER :: burns !(NBURN) + end type Burnup_info + + TYPE TH_INDEP_VAR + REAL(8), DIMENSION(:,:),POINTER :: sig !(NGROUP,xinv) +! xchi,xchd,xinv, + REAL(8), DIMENSION(:),POINTER :: kinp !bet,lam,dhb,dhl + REAL(8) :: YLD(3) !YID,YXE,YPM + REAL(8) :: NDXE,NDSM,NDI,NDPM + REAL(8) :: POWER + REAL(8) :: DAYS + REAL(8) :: BURNUP + END TYPE TH_INDEP_VAR + + TYPE XSBLOCK_ITEM + INTEGER :: IBURN ! burnup step -- added by EPM + REAL(8) :: DELTA ! delta local variable -- added by EPM + TYPE(XSBLOCK_TYPE), POINTER :: XS + TYPE(TH_INDEP_VAR), POINTER :: TIV + END TYPE XSBLOCK_ITEM + + TYPE(PMAXS_WISE_TYPE),DIMENSION(:), POINTER :: PMAXS !(XS_F_NUM) + TYPE(PMAXS_WISE_TYPE),pointer:: PMAX + TYPE(Branches_info), DIMENSION(:), target,allocatable ::Bran_info + TYPE(Branches_info), POINTER ::bran_i + TYPE(XSBLOCK_TYPE), target,allocatable :: XSCR(:) + TYPE(XSBLOCK_TYPE), target :: XSND + TYPE(XSBLOCK_TYPE), pointer:: XS + TYPE(TH_INDEP_VAR), pointer:: TIV + +contains + +!--------------------------------------------------------------------- + SUBROUTINE AllocateXSBlock +!--------------------------------------------------------------------- + IMPLICIT NONE + + INTEGER(4) :: ireg + + IF (NADF .GT. 4) THEN + ireg = NADF + ELSE + ireg = 4 + END IF + + allocate(XS%sig(NGROUP,NXST)) + allocate(XS%sct(NGROUP,NGROUP)) + allocate(XS%flux(NGROUP)) + allocate(XS%rflx(NGROUP,ireg)) + allocate(XS%zflx(NGROUP,2)) + allocate(XS%rcur(NGROUP,ireg,3)) + allocate(XS%zcur(NGROUP,2,3)) + IF (lyld) THEN + allocate(XS%yldI(NGROUP)) + allocate(XS%yldXe(NGROUP)) + allocate(XS%yldPm(NGROUP)) + ELSE + allocate(XS%yldI(1)) + allocate(XS%yldXe(1)) + allocate(XS%yldPm(1)) + END IF + if(ladf)then + allocate(XS%adf(NGROUP,NADF)) + else + allocate(XS%adf(1,1)) + endif + if(lzdf)then + allocate(XS%ZDF(NGROUP,NZDF)) + NTDF = NADF + NZDF + else + allocate(XS%ZDF(1,1)) + NTDF = NADF + endif + if(NLPF .GT. 0)then + allocate(XS%LPF(NLPF)) + else + allocate(XS%LPF(1)) + endif + if(ldet)then + allocate(XS%det(NGROUP)) + else + allocate(XS%det(1)) + endif + if(lcdf)then + allocate(XS%cdf(NGROUP,NCDF)) + else + allocate(XS%cdf(1,1)) + endif + if(lgff.and.NRODS .GT. 0)then + allocate(XS%gff(NGROUP,NRODS)) + else + allocate(XS%gff(1,1)) + endif + + CALL Default_XS + END SUBROUTINE AllocateXSBlock + +!--------------------------------------------------------------------- + SUBROUTINE DeallocateXSBlock +!--------------------------------------------------------------------- + deallocate(XS%sig) + deallocate(XS%sct) + deallocate(XS%adf) + deallocate(XS%zdf) + deallocate(XS%cdf) + deallocate(XS%LPF) + deallocate(XS%det) + deallocate(XS%gff) + deallocate(XS%flux) + deallocate(XS%rflx) + deallocate(XS%zflx) + deallocate(XS%rcur) + deallocate(XS%zcur) + END SUBROUTINE DeallocateXSBlock + +!--------------------------------------------------------------------- + SUBROUTINE Clear_XS +!--------------------------------------------------------------------- + XS%sig=0 + XS%sct=0 + XS%adf=0 + XS%zdf=0 + XS%cdf=0 + XS%LPF=0 + XS%det=0 + XS%gff=0 + XS%flux=0 + XS%yldI=0 + XS%yldXe=0 + XS%yldPm=0 + XS%rflx=0 + XS%zflx=0 + XS%rcur=0 + XS%zcur=0 + END SUBROUTINE Clear_XS + +!--------------------------------------------------------------------- + SUBROUTINE Default_XS +!--------------------------------------------------------------------- + CALL Clear_XS + + XS%kinf = 0.0 + XS%kinfB = 1.0 + XS%kinfL = 1.0 + XS%B2 = 0.0 + + XS%ndxe = 0.0 + XS%ndsm = 0.0 + XS%ndi = 0.0 + XS%ndpm = 0.0 + + XS%adf = 1.0 + XS%zdf = 1.0 + XS%cdf = 1.0 + XS%gff = 1.0 + + XS%yldi = 0.0 + XS%yldxe = 0.0 + XS%yldpm = 0.0 + END SUBROUTINE Default_XS +END MODULE PCRDATA diff --git a/Donjon/src/PCRDRV.f b/Donjon/src/PCRDRV.f new file mode 100644 index 0000000..70468e2 --- /dev/null +++ b/Donjon/src/PCRDRV.f @@ -0,0 +1,402 @@ +*DECK PCRDRV + SUBROUTINE PCRDRV(LCUBIC,NMIX,IMPX,NCAL,ITER,MAXNIS,TERP,NISO, + 1 HISO,CONC,LMIXC,XS_CALC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for PMAXS file interpolation. Use user-defined +* global and local parameters. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* LCUBIC =.TRUE.: cubic Ceschino interpolation; =.FALSE: linear +* Lagrange interpolation. +* NMIX maximum number of material mixtures in the microlib. +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the PMAXS file. +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another PMAXS file; +* =2 use another L_MAP + PMAXS file). +* MAXNIS maximum value of NISO(I) in user data. +* TERP interpolation factors. +* NISO number of user-selected isotopes. +* HISO name of the user-selected isotopes. +* CONC user-defined number density of the user-selected isotopes. +* LMIXC flag set to .true. for fuel-map mixtures to process. +* XS_CALC pointers towards PMAXS elementary calculations. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE PCRDATA + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXISD=200 + INTEGER NMIX,IMPX,NCAL,ITER,MAXNIS,NISO(NMIX),HISO(2,NMIX,MAXISD) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXISD) + LOGICAL LCUBIC,LMIXC(NMIX) + TYPE(XSBLOCK_ITEM) XS_CALC(NCAL) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXLIN=50 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + REAL, PARAMETER::REPS=1.0E-4 + REAL FLOTT, SUM + INTEGER I0, IBM, ICAL, INDIC, IPAR, ITYPE, I, JBM, J, NCOMLI, + & NITMA, NPAR, IBRA, IBSET, II, IND, INDELT, NBURN, NNV + CHARACTER TEXT12*12,PARKEY(MAXPAR)*12,HSMG*131,COMMEN(MAXLIN)*80, + 1 RECNAM*12,HCUBIC*12 + INTEGER NVALUE(MAXPAR),MUPLET(MAXPAR),MUTYPE(MAXPAR) + DOUBLE PRECISION DFLOTT + REAL VALR(MAXPAR,2),VREAL(MAXVAL,MAXPAR) + LOGICAL LCUB2(MAXPAR) +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MUBASE + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LDELTA +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(LDELTA(NMIX)) +*---- +* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE PMAXS FILE. THE I-TH +* PMAXS FILE INFORMATION CORRESPONDS TO POINTERS bran_i and PMAX. +*---- + NPAR=bran_i%Nstat_var + NVALUE(:NPAR)=0 + DO IPAR=1,bran_i%Nstat_var + PARKEY(IPAR)=bran_i%var_nam(IPAR) + ENDDO + IF(PMAX%NBset.GT.0) THEN + NPAR=NPAR+1 + PARKEY(NPAR)='B' + NVALUE(NPAR)=PMAX%Bset(1)%NBURN + NNV=NVALUE(NPAR) + VREAL(:NNV,NPAR)=REAL(PMAX%Bset(1)%burns(:NNV)) + ENDIF + IF(NPAR.GT.MAXPAR) CALL XABORT('PCRDRV: MAXPAR OVERFLOW.') + IF(NHST.NE.1) CALL XABORT('PCRDRV: MULTIPLE HISTORY CASE NOT IMP' + 1 //'LEMENTED.') + NCOMLI=6 + COMMEN(:6)=hcomment(:6) + DO IBRA=1,NBRA + DO IPAR=1,bran_i%Nstat_var + FLOTT=REAL(bran_i%state(IPAR,IBRA)) + IF(NVALUE(IPAR).EQ.0) THEN + NVALUE(IPAR)=1 + VREAL(1,IPAR)=FLOTT + ELSE + DO I=1,NVALUE(IPAR) + IF(FLOTT.EQ.VREAL(I,IPAR)) THEN + GO TO 10 + ELSE IF(FLOTT.LT.VREAL(I,IPAR)) THEN + DO J=NVALUE(IPAR),I,-1 + VREAL(J+1,IPAR)=VREAL(J,IPAR) + ENDDO + VREAL(I,IPAR)=FLOTT + NVALUE(IPAR)=NVALUE(IPAR)+1 + GO TO 10 + ENDIF + ENDDO + IF(FLOTT.GT.VREAL(NVALUE(IPAR),IPAR)) THEN + NVALUE(IPAR)=NVALUE(IPAR)+1 + VREAL(NVALUE(IPAR),IPAR)=FLOTT + ENDIF + ENDIF + 10 CONTINUE + ENDDO + ENDDO + IF((IMPX.GT.0).AND.(bran_i%Nstat_var.GT.0))THEN + DO IPAR=1,NPAR + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + WRITE(IOUT,'(13H PCRDRV: KEY=,A,18H TABULATED POINTS=, + 1 1P,6E12.4/(43X,6E12.4))') PARKEY(IPAR),(VREAL(I,IPAR),I=1, + 2 NVALUE(IPAR)) + ENDDO + ENDIF +*---- +* PRINT PMAXS FILE AND FUELMAP STATISTICS +*---- + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(43H PCRDRV: NUMBER OF CALCULATIONS IN PMAXS FI, + 1 3HLE=,I6)') NCAL + WRITE(IOUT,'(43H PCRDRV: NUMBER OF MATERIAL MIXTURES IN FUE, + 1 6HL MAP=,I6)') NMIX + WRITE(IOUT,'(43H PCRDRV: NUMBER OF LOCAL VARIABLES INCLUDIN, + 1 9HG BURNUP=,I6)') NPAR + WRITE(IOUT,'(28H PCRDRV: PMAXS FILE COMMENTS,60(1H-))') + WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI) + WRITE(IOUT,'(9H PCRDRV: ,79(1H-))') + ENDIF +*---- +* SCAN THE PMAXS FILE INFORMATION TO RECOVER THE MUPLET DATABASE +*---- + IF(IMPX.GT.5) THEN + WRITE(IOUT,'(24H PCRDRV: MUPLET DATABASE/12H CALCULATION,4X, + 1 6HMUPLET)') + WRITE(IOUT,'(16X,20A4)') PARKEY(:NPAR) + ENDIF + ALLOCATE(MUBASE(NPAR,NCAL)) + ICAL=0 + DO IBRA=1,NBRA + INDELT=0 + DO IPAR=1,NPAR + IF(bran_i%state_nam(IBRA).EQ.PARKEY(IPAR)) THEN + INDELT=IPAR + CYCLE + ENDIF + ENDDO + IBSET=PMAX%BRANCH(IBRA,1)%IBSET + NBURN=PMAX%Bset(IBSET)%NBURN + DO IPAR=1,bran_i%Nstat_var + FLOTT=REAL(bran_i%state(IPAR,IBRA)) + IND=0 + DO I=1,NVALUE(IPAR) + IF(FLOTT.EQ.VREAL(I,IPAR)) THEN + IND=I + EXIT + ENDIF + ENDDO + IF(IND.EQ.0) THEN + CALL XABORT('PCRDRV: MUPLET ALGORITHM FAILURE.') + ELSE + MUPLET(IPAR)=IND + ENDIF + ENDDO + IF((NBURN.EQ.PMAX%Bset(1)%NBURN).OR.(NBURN.EQ.1)) THEN + DO I=1,NBURN + MUPLET(bran_i%Nstat_var+1)=I + II=ICAL+I + MUBASE(:bran_i%Nstat_var+1,II)=MUPLET(:bran_i%Nstat_var+1) + XS_CALC(ICAL+I)%IBURN=I + XS_CALC(ICAL+I)%XS=>PMAX%BRANCH(IBRA,1)%XS(I) + XS_CALC(ICAL+I)%TIV=>PMAX%TIVB(1)%TIV(I) + IF(INDELT.GT.0) THEN + XS_CALC(ICAL+I)%DELTA=bran_i%state(INDELT,IBRA)- + 1 bran_i%state(INDELT,1) + ELSE + XS_CALC(ICAL+I)%DELTA=0.0 + ENDIF + ENDDO + ELSE + CALL XABORT('PCRDRV: INVALID VALUE OF NBURN.') + ENDIF + IF(IMPX.GT.5) THEN + DO I=ICAL+1,ICAL+NBURN + WRITE(IOUT,'(I8,2X,A2,2X,20I4/(14X,20I4))') I, + 1 bran_i%state_nam(IBRA),MUBASE(:NPAR,I) + ENDDO + ENDIF + ICAL=ICAL+NBURN + ENDDO !IBRA + IF(ICAL.NE.NCAL) CALL XABORT('PCRDRV: MUPLET ALGORITHM FAILURE.') +*---- +* READ (INTERP_DATA) AND SET VALR PARAMETERS CORRESPONDING TO THE +* INTERPOLATION POINT. FILL MUPLET FOR PARAMETERS SET WITHOUT +* INTERPOLATION. +*---- + NISO(:NMIX)=0 + TERP(:NCAL,:NMIX)=0.0 + LMIXC(:NMIX)=.FALSE. +*---- +* READ (INTERP_DATA) AND SET VALR PARAMETERS CORRESPONDING TO THE +* INTERPOLATION POINT. FILL MUPLET FOR PARAMETERS SET WITHOUT +* INTERPOLATION. +*---- + IBM=0 + MAXNIS=0 + NISO(:NMIX)=0 + LDELTA(:NMIX)=.FALSE. + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCRDRV: CHARACTER DATA EXPECTED.') + 30 IF(TEXT12.EQ.'MIX') THEN + MUPLET(:NPAR)=0 + MUTYPE(:NPAR)=0 + VALR(:NPAR,1)=0.0 + VALR(:NPAR,2)=0.0 + LCUB2(:NPAR)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('PCRDRV: INTEGER DATA EXPECTED.') + IF(IBM.GT.NMIX) CALL XABORT('PCRDRV: NMIX OVERFLOW.') + LMIXC(IBM)=.TRUE. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCRDRV: CHARACTER DATA EXPECTED.') + GO TO 30 + ELSE IF(TEXT12.EQ.'MICRO') THEN + IF(IBM.EQ.0) CALL XABORT('PCRDRV: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCRDRV: CHARACTER DATA EXPECTED.') + 50 IF(TEXT12.EQ.'ENDMIX') THEN + GO TO 30 + ELSE + NISO(IBM)=NISO(IBM)+1 + IF(NISO(IBM).GT.MAXISD) CALL XABORT('PCRDRV: MAXISD OVERFL' + 1 //'OW.') + MAXNIS=MAX(MAXNIS,NISO(IBM)) + READ(TEXT12,'(2A4)') (HISO(I0,IBM,NISO(IBM)),I0=1,2) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + CONC(IBM,NISO(IBM))=FLOTT + ELSE + CALL XABORT('PCRDRV: INVALID HISO DATA.') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCRDRV: CHARACTER DATA EXPECTE' + 1 //'D.') + GO TO 50 + ENDIF + ELSE IF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA')) THEN + IF(IBM.EQ.0) CALL XABORT('PCRDRV: MIX NOT SET (2).') + ITYPE=0 + IF(TEXT12.EQ.'SET') THEN + ITYPE=1 + ELSE IF(TEXT12.EQ.'DELTA') THEN + ITYPE=2 + LDELTA(IBM)=.TRUE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('PCRDRV: CHARACTER DATA EXPECTED.') + 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('PCRDRV: CHARACTER DATA EXPECTED.') + DO 60 I=1,NPAR + IF(TEXT12.EQ.PARKEY(I)) THEN + IPAR=I + GO TO 70 + ENDIF + 60 CONTINUE + CALL XABORT('PCRDRV: PARAMETER '//TEXT12//' NOT FOUND.') + 70 IF(HCUBIC.EQ.'LINEAR') THEN + LCUB2(IPAR)=.FALSE. + ELSE IF(HCUBIC.EQ.'CUBIC') THEN + LCUB2(IPAR)=.TRUE. + ENDIF + CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('PCRDRV: REAL DATA EXPECTED.') + VALR(IPAR,2)=VALR(IPAR,1) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + VALR(IPAR,2)=FLOTT + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) THEN + DO 80 J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J,IPAR)).LE.REPS* + 1 ABS(VREAL(J,IPAR)))THEN + MUPLET(IPAR)=J + IF(ITYPE.NE.1) MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 30 + ENDIF + 80 CONTINUE + ENDIF + IF(VALR(IPAR,1).LT.VREAL(1,IPAR)) THEN + WRITE(HSMG,'(23HPCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (<,E12.4,1H))') + 2 PARKEY(IPAR),VALR(IPAR,1),VREAL(1,IPAR) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,2).GT.VREAL(NVALUE(IPAR),IPAR)) THEN + WRITE(HSMG,'(23HPCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (>,E12.4,1H))') + 2 PARKEY(IPAR),VALR(IPAR,1),VREAL(NVALUE(IPAR),IPAR) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,1).GT.VALR(IPAR,2)) THEN + WRITE(HSMG,'(23HPCRDRV: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,1H.)') PARKEY(IPAR), + 2 VALR(IPAR,1),VALR(IPAR,2) + CALL XABORT(HSMG) + ENDIF + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 30 + ELSE IF(TEXT12.EQ.'ENDMIX') THEN +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H PCRDRV: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H PCRDRV: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') PARKEY(IPAR) + ENDIF + ENDDO + ENDIF + IF(IBM.GT.NMIX) CALL XABORT('PCRDRV: MIX OVERFLOW (MICROLIB).') + IF(NCAL.EQ.1) THEN + TERP(1,IBM)=1.0 + ELSE + CALL PCRTRP(LCUB2,IMPX,NPAR,NCAL,NVALUE,MUPLET,MUTYPE,VALR, + 1 0.0,MUBASE,VREAL,TERP(1,IBM)) + ENDIF + IBM=0 + ELSE IF((TEXT12.EQ.'PMAXS').OR.(TEXT12.EQ.'TABLE').OR. + 1 (TEXT12.EQ.';')) THEN +*---- +* CHECK TERP FACTORS AND RETURN +*---- + IF(TEXT12.EQ.';') ITER=0 + IF(TEXT12.EQ.'PMAXS') ITER=1 + IF(TEXT12.EQ.'TABLE') ITER=2 + DO 150 IBM=1,NMIX + IF(.NOT.LMIXC(IBM)) GO TO 150 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('PCRDRV: MAXNIS OVERFLOW.') + IF(LDELTA(IBM)) THEN + SUM=0.0 + ELSE + SUM=1.0 + ENDIF + DO 140 ICAL=1,NCAL + SUM=SUM-TERP(ICAL,IBM) + 140 CONTINUE + IF(ABS(SUM).GT.1.0E-4) THEN + WRITE(HSMG,'(43HPCRDRV: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 150 CONTINUE + GO TO 160 + ELSE + CALL XABORT('PCRDRV: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 160 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H PCRDRV: INTERPOLATION FACTORS)') + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) THEN + WRITE(IOUT,170) ICAL,(TERP(ICAL,JBM),JBM=1,NMIX) + EXIT + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(MUBASE,LDELTA) + RETURN + 170 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/PCREAD.f90 b/Donjon/src/PCREAD.f90 new file mode 100644 index 0000000..db378d0 --- /dev/null +++ b/Donjon/src/PCREAD.f90 @@ -0,0 +1,909 @@ +MODULE PCREAD +! +!----------------------------------------------------------------------- +! +!Purpose: +! Fortran support module for PMAXS reading. +! +!Copyright: +! Copyright (C) 2019 Ecole Polytechnique de Montreal +! +!Author(s): A. Hebert +! +!----------------------------------------------------------------------- +! + use PCRDATA + + IMPLICIT NONE + + TYPE(PMAXS_WISE_TYPE),target :: PMAXO + CHARACTER(80), ALLOCATABLE ::PMAXS_F_name(:) + INTEGER(4), ALLOCATABLE ::Bran_struct(:) + + INTEGER(4) :: ntbase1,nhinc + TYPE(BRANCH_WISE_TYPE), DIMENSION(:,:), POINTER :: incbase !(ntbase1,nhinc) + INTEGER(4), DIMENSION(:), allocatable :: bset + + INTEGER(4) :: n_hist_type, hist_type(Nallvar) + +CONTAINS + +!--------------------------------------------------------------------- + SUBROUTINE AllocateBranch(Bran) +!--------------------------------------------------------------------- +! + IMPLICIT NONE + + TYPE(BRANCH_WISE_TYPE),target :: Bran + INTEGER(4) :: k,NBURN + NBURN=PMAX%Bset(Bran%ibset)%NBURN + allocate(Bran%XS(NBURN)) + do k=1,NBURN + XS=>Bran%XS(k) + call AllocateXSBlock + enddo + END SUBROUTINE AllocateBranch + +!--------------------------------------------------------------------- + SUBROUTINE ClearBranch(Bran) +!--------------------------------------------------------------------- +! + IMPLICIT NONE + + TYPE(BRANCH_WISE_TYPE),target :: Bran + INTEGER(4) :: k,NBURN + + NBURN=PMAX%Bset(bran%ibset)%NBURN + do k=1,NBURN + XS=>bran%XS(k) + CALL Clear_XS + enddo + deallocate(Bran%XS) + END SUBROUTINE ClearBranch + +!--------------------------------------------------------------------- + SUBROUTINE AllocateTIVB(TIVB) +!--------------------------------------------------------------------- +! + IMPLICIT NONE + + TYPE(HIST_TIV_TYPE),target :: TIVB + INTEGER(4) :: k,NBURN + + NBURN=PMAX%Bset(TIVB%ibset)%NBURN + allocate(TIVB%TIV(NBURN)) + do k=1,NBURN + TIV=>TIVB%TIV(k) + if(xinv .GT. 0)then + allocate(TIV%sig(NGROUP,xinv)) + else + allocate(TIV%sig(1,1)) + endif + if(EDHL .GT. 0)then + allocate(TIV%kinp(EDHL)) + else + allocate(TIV%kinp(1)) + endif + TIV%sig=0 + TIV%kinp=0 + TIV%yld=0 + TIV%power=0.0 + TIV%days=0.0 + TIV%burnup=0.0 + TIV%ndxe=0.0 + TIV%ndsm=0.0 + TIV%ndi =0.0 + enddo + END SUBROUTINE AllocateTIVB + +!--------------------------------------------------------------------- + SUBROUTINE ClearTIVB(TIVB) +!--------------------------------------------------------------------- +! + IMPLICIT NONE + + TYPE(HIST_TIV_TYPE),target :: TIVB + INTEGER(4) :: k,NBURN + + NBURN=PMAX%Bset(TIVB%ibset)%NBURN + do k=1,NBURN + TIV=>TIVB%TIV(k) + !deallocate(TIVB%TIV(k)%sig) ! commented for flang + deallocate(TIVB%TIV(k)%kinp) + enddo + deallocate(TIVB%TIV) + END SUBROUTINE ClearTIVB + +!--------------------------------------------------------------------- + SUBROUTINE read_TIV(PMAXS_unit) +!--------------------------------------------------------------------- + IMPLICIT NONE + REAL, ALLOCATABLE, DIMENSION(:,:) :: TIVtemp + INTEGER(4) :: PMAXS_unit + INTEGER(4) i,j,k !,m + REAL(8) dump +99 format(8E12.5) + +!1) fission spectrum inverse velocity and detector xs + if(iXSTI .GT. 0)then + allocate(TIVtemp(NGROUP,4)) + read(PMAXS_unit,99)((TIVtemp(i,j),i=1,NGROUP),j=1,iXSTI) + do j=1,iXSTI + k=iTIV(j) + if(k .GT. 0)then + do i=1,NGROUP + TIV%sig(i,k)=TIVtemp(i,j) + enddo + endif + enddo + deallocate(TIVtemp) + endif +!2) yiled + if(pyld)then + if(lyld)then + read(PMAXS_unit,99)TIV%YLD(:) + else + read(PMAXS_unit,99) + endif + endif + +!cdf + IF(tcdf)THEN + READ(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,NCD) + ENDIF +! gff + if(tgff.and.NRODS .GT. 0)then + read(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,NRODS) + endif + +!3) BETA of Delayed neutron data + if(pbet)then + if(lbet)then + read(PMAXS_unit,99)TIV%kinp(BBET:EBET) + else + read(PMAXS_unit,99)(dump,i=1,NDLAY) + endif + endif +!4)lambda of Delayed neutron data + if(pamb)then + if(lamb)then + read(PMAXS_unit,99)TIV%kinp(BLAM:ELAM) + else + read(PMAXS_unit,99)(dump,i=1,NDLAY) + endif + endif +!5) Decay heat data + if(pdec)then + if(ldec)then + read(PMAXS_unit,99)TIV%kinp(BDHB:EDHB) + read(PMAXS_unit,99)TIV%kinp(BDHL:EDHL) + else + read(PMAXS_unit,99)(dump,i=1,NDCAY) + read(PMAXS_unit,99)(dump,i=1,NDCAY) + endif + endif + return + END SUBROUTINE read_TIV + +!--------------------------------------------------------------------- + SUBROUTINE read_XS_Block(PMAXS_unit) +!--------------------------------------------------------------------- + IMPLICIT NONE + INTEGER(4) :: PMAXS_unit + REAL(8) LPFtemp(8) + REAL(8) dump + INTEGER(4) i,j !,k + read(PMAXS_unit,99)((XS%sig(i,j),i=1,NGROUP),j=1,4) + + if(pxes)then + if(pdet)then + if(lxes)then + if(ldet)then + read(PMAXS_unit,99)((XS%sig(i,j),i=1,NGROUP),j=5,7),XS%det + else + read(PMAXS_unit,99)((XS%sig(i,j),i=1,NGROUP),j=5,7),(dump,i=1,NGROUP) + endif + else + if(ldet)then + read(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,3),XS%det + else + read(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,4) + endif + endif + else + if(lxes)then + read(PMAXS_unit,99)((XS%sig(i,j),i=1,NGROUP),j=5,7) + XS%sig(1,5) = XS%sig(1,5) * 1E24 + XS%sig(2,5) = XS%sig(2,5) * 1E24 + XS%sig(1,6) = XS%sig(1,6) * 1E24 + XS%sig(2,6) = XS%sig(2,6) * 1E24 + else + read(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,3) + endif + endif + else + if(pdet)then + if(ldet)then + read(PMAXS_unit,99)XS%det + else + read(PMAXS_unit,99)(dump,i=1,NGROUP) + endif + endif + endif +! sct (scattering cross sections) + read(PMAXS_unit,99)XS%sct +! adf + IF(padf)THEN + IF(ladf)THEN + READ(PMAXS_unit,99)((XS%adf(i,j),i=1,NGROUP),j=1,NAD) + if(NAD .LT. NADF)then + if(NAD .EQ. 1)then + do i=1,NGROUP + XS%adf(i,:)=XS%adf(i,1) + enddo + elseif(NAD .EQ. 2)then + if(NADF .EQ. 3) then + call XABORT('read_XS_Block: Error - Please Use Same NADF In All PMAXS Files') + elseif(NADF .EQ. 4)then + do i=1,NGROUP + XS%adf(i,3)=XS%adf(i,2) + XS%adf(i,4)=XS%adf(i,1) + enddo + else + do i=1,NGROUP + XS%adf(i,3)=XS%adf(i,1) + XS%adf(i,4)=XS%adf(i,2) + XS%adf(i,5)=XS%adf(i,1) + XS%adf(i,6)=XS%adf(i,2) + enddo + endif + else + do i=1,NGROUP + XS%adf(i,4)=XS%adf(i,1) + XS%adf(i,5)=XS%adf(i,2) + XS%adf(i,6)=XS%adf(i,3) + enddo + endif + endif + ELSE + READ(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,NAD) + ENDIF + ENDIF +! lpf + 99 format(8e12.5) + if(iLPF .GT. 0)then + read(PMAXS_unit,99)(LPFtemp(j),j=1,iLPF) + if(pded.and.lded)XS%LPF(1:4)=LPFtemp(1:4) + if(pj1f.and.lj1f)XS%LPF(xlpk:xj1c)=LPFtemp(ilpk:ij1c) + endif +! cdf + IF(pcdf)THEN + IF(lcdf)THEN + READ(PMAXS_unit,99)((XS%cdf(i,j),i=1,NGROUP),j=1,NCD) + if(NCD .LT. NCDF)then + if(NCD .EQ. 1)then + do i=1,NGROUP + XS%cdf(i,:)=XS%cdf(i,1) + enddo + elseif(NCD .EQ. 2)then + if(NCDF .EQ. 5)then + do i=1,NGROUP + XS%cdf(i,5)=XS%cdf(i,2) + XS%cdf(i,4)=XS%cdf(i,2) + XS%cdf(i,3)=XS%cdf(i,1) + XS%cdf(i,2)=XS%cdf(i,1) + enddo + elseif(NCDF .EQ. 6)then + do i=1,NGROUP + XS%cdf(i,3)=XS%cdf(i,1) + XS%cdf(i,4)=XS%cdf(i,2) + XS%cdf(i,5)=XS%cdf(i,1) + XS%cdf(i,6)=XS%cdf(i,2) + enddo + elseif(NCDF .EQ. 8)then + do i=1,NGROUP + XS%cdf(i,8)=XS%cdf(i,2) + XS%cdf(i,7)=XS%cdf(i,2) + XS%cdf(i,6)=XS%cdf(i,2) + XS%cdf(i,5)=XS%cdf(i,2) + XS%cdf(i,4)=XS%cdf(i,1) + XS%cdf(i,3)=XS%cdf(i,1) + XS%cdf(i,2)=XS%cdf(i,1) + enddo + else + call XABORT('read_XS_Block: Error - Please Use Same NCDF In All PMAXS Files') + endif + elseif(NCD .EQ. 3)then + if(NCDF .EQ. 4)then + do i=1,NGROUP + XS%cdf(i,4)=XS%cdf(i,2) + enddo + elseif(NCDF .EQ. 5)then + do i=1,NGROUP + XS%cdf(i,4)=XS%adf(i,1) + XS%cdf(i,5)=XS%adf(i,2) + enddo + elseif(NCDF .EQ. 6)then + do i=1,NGROUP + XS%cdf(i,4)=XS%cdf(i,1) + XS%cdf(i,5)=XS%cdf(i,2) + XS%cdf(i,6)=XS%cdf(i,3) + enddo + elseif(NCDF .EQ. 8)then + do i=1,NGROUP + XS%cdf(i,4)=XS%cdf(i,2) + XS%cdf(i,5)=XS%adf(i,1) + XS%cdf(i,6)=XS%adf(i,2) + XS%cdf(i,7)=XS%adf(i,2) + XS%cdf(i,8)=XS%adf(i,1) + enddo + endif + elseif(NCD .EQ. 4)then + if(NCDF .EQ. 8)then + do i=1,NGROUP + XS%cdf(i,5)=XS%adf(i,1) + XS%cdf(i,6)=XS%adf(i,2) + XS%cdf(i,7)=XS%adf(i,3) + XS%cdf(i,8)=XS%adf(i,4) + enddo + else + call XABORT('read_XS_Block: Error - Please Use Same NCDF In All PMAXS Files') + endif + elseif(NCD .EQ. 5)then + do i=1,NGROUP + XS%cdf(i,8)=XS%cdf(i,4) + XS%cdf(i,7)=XS%cdf(i,5) + XS%cdf(i,6)=XS%cdf(i,5) + XS%cdf(i,5)=XS%cdf(i,4) + XS%cdf(i,4)=XS%cdf(i,2) + enddo + else + call XABORT('read_XS_Block: Please use same NCDF in all PMAXS files') + endif + endif + ELSE + READ(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,NCD) + ENDIF + ENDIF +! gff + if(pgff.and.NRODS .GT. 0)then + if(lgff)then + read(PMAXS_unit,99)XS%gff + else + read(PMAXS_unit,99)((dump,i=1,NGROUP),j=1,NRODS) + endif + endif + return + END SUBROUTINE read_XS_Block + +!--------------------------------------------------------------------- + SUBROUTINE det_var_position +!--------------------------------------------------------------------- +! determine variable position in input PMAXS file + + IMPLICIT NONE + + INTEGER(4) i !, i_pri,i_adf,i_lpf +! XS block +! LPF + if(pded)then + i=4 + else + i=0 + endif + if(pj1f)then + ilpk=i+1 + ij1c=i+4 + iLPF=ij1c + else + iLPF=i + endif + +! TIV block + if(pchi)then + i=1 + iTIV(i)=xchi + else + i=0 + endif + if(pchd)then + i=i+1 + iTIV(i)=xchd + endif + if(pvel)then + i=i+1 + iTIV(i)=xinv + endif + iXSTI=i + END SUBROUTINE det_var_position + +!--------------------------------------------------------------------- + SUBROUTINE set_var_position +!--------------------------------------------------------------------- +! set variable position in memory and output PMAXS + + IMPLICIT NONE + INTEGER(4) :: i + formng='(1P008E12.5)' + if(NGROUP .GT. 4)then + write(formng(4:6),'(I3.3)')NGROUP + elseif(NGROUP .EQ. 3)then + formng='(1P006E12.5)' + endif + + if(NADF .EQ. 0)ladf=.false. + if(NCDF .EQ. 0)lcdf=.false. + if(NRODS .EQ. 0)lgff=.false. + +! ded + if(lded)then + i=4 + else + i=0 + endif + if(lj1f)then + xlpk=i+1 + xj1i=i+2 + xj1s=i+3 + xj1c=i+4 + NLPF=xj1c + else + NLPF=i + endif + +! TIV block + if(lchi)then + i=1 + TIVname(i)='Chi' + else + i=0 + endif + if(lchd)then + i=i+1 + TIVname(i)='Chd' + endif + xchd=i + if(linv)then + i=i+1 + TIVname(i)='inV' + endif + xinv=i + +! beta and lambda + EBET=NDLAY + BLAM=EBET+1 + ELAM=EBET+NDLAY +! decay heat + BDHB=ELAM+1 + EDHB=ELAM+NDCAY + BDHL=EDHB+1 + EDHL=EDHB+NDCAY + +! format + formng='(1P008E12.5)' + if(NGROUP .GT. 4)then + write(formng(4:6),'(I3.3)')NGROUP + elseif(NGROUP .EQ. 3)then + formng='(1P006E12.5)' + endif + END SUBROUTINE set_var_position + +!--------------------------------------------------------------------- + SUBROUTINE read_PMAXS_file(iPMAX,kread,PMAXS_unit) +!--------------------------------------------------------------------- + use PCRDATA + + IMPLICIT NONE + + INTEGER(4) :: iPMAX,kread,PMAXS_unit + INTEGER(4) :: itemp,i_s + CHARACTER(8) :: tit + CHARACTER(80) :: oneline + + read(PMAXS_unit,'(A80)',end=101)oneline + if(oneline(1:8).NE.'GLOBAL_V') call XABORT('dep_read_pmaxs_file: GLOBAL_V expected.') +!1) global variables + if(oneline(64:64).eq.' ')then + read(oneline,*)tit,NHST,NGR,NDL,NDC,NAD,NCD,NRODS,NCOLA, & + padf,pxes,pded,pj1f,pchi,pchd,pvel,pdet,pyld,pcdf,pgff,pbet,pamb,pdec + derivatives=.true. + pzdf = .FALSE. + else if(oneline(66:66).eq.' ')then + read(oneline,*)tit,NHST,NGR,NDL,NDC,NAD,NCD,NRODS,NCOLA, & + padf,pxes,pded,pj1f,pchi,pchd,pvel,pdet,pyld,pcdf,pgff,pbet,pamb,pdec,derivatives + pzdf = .FALSE. + else + read(oneline,*)tit,NHST,NGR,NDL,NDC,NAD,NCD,NRODS,NCOLA, & + padf,pxes,pded,pj1f,pchi,pchd,pvel,pdet,pyld,pcdf,pgff,pbet,pamb,pdec,pzdf,derivatives + endif + if(kread.LE.0)THEN + if(kread .EQ. -1)THEN + NGROUP=NGR + NDLAY =NDL + NDCAY =NDC + NADF =NAD + NCDF =NCD + MHST =NHST + MRODS =NRODS + MCOLA =NCOLA + if(MCOLA .LT. NROWA)MCOLA=NROWA + MBset=1 + MBRA=1 + MBCR=0 + else + if(NGROUP.NE.NGR) then + call XABORT('read_PMAXS_file: Error - NGROUP must be the same in all PMAXS files') + endif + if( NDLAY.NE.NDL)THEN + if(NDLAY .EQ. 0)THEN + NDLAY=NDL + ELSEif(NDL .GT. 0 .AND. pbet .AND. pamb)THEN + call XABORT('read_PMAXS_file: Error - NDLAY must be the same in all PMAXS files') + ENDIF + endif + if( NDCAY.NE.NDC)THEN + if(NDCAY .EQ. 0)THEN + NDCAY=NDC + elseif(NDC .GT. 0 .AND. pdec)THEN + call XABORT('read_PMAXS_file: Error - NDCAY must be same in all PMAXS files') + endif + endif + if( NADF .LT. NAD)NADF=NAD + if( NCDF .LT. NCD)NCDF=NCD + if( MHST .LT. NHST ) MHST =NHST + if( MRODS .LT. NRODS) MRODS =NRODS + if( MCOLA .LT. NCOLA) MCOLA =NCOLA + if( MCOLA .LT. NROWA) MCOLA =NROWA + endif + endif + call set_var_position + + read(PMAXS_unit,'(A80)') hcomment(1) + read(PMAXS_unit,'(A80)') hcomment(2) + read(PMAXS_unit,'(A80)') hcomment(3) + lxes=.false. + NXST=4 + if(INDEX(hcomment(3),"xe,sm" ) /= 0) THEN + lxes=.true. + NXST=7 + endif + if(INDEX(hcomment(3),"det" ) /= 0) THEN + lxes=.true. + NXST=8 + endif + tcdf=.false. + tgff=.false. + if(pcdf)then + if(INDEX(hcomment(3),"CDF" ) /= 0) THEN + tcdf=.true. + pcdf=.false. + ENDIF + endif + if(pgff)then + if(INDEX(hcomment(3),"GFF" ) /= 0) THEN + tgff=.true. + pgff=.false. + ENDIF + endif + read(PMAXS_unit,'(A80)') hcomment(4) + read(PMAXS_unit,'(A80)') hcomment(5) + read(PMAXS_unit,'(A80)') hcomment(6) + + call read_pmax_head(iPMAX, PMAXS_unit) +!4) XS Set identification + do + read(PMAXS_unit,*,end=101)tit + if(tit .EQ. 'XS_SET')exit + enddo + + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,itemp,i_s,itemp,itemp,NCOLA,NROWA,NPART,PITCH,XBE,YBE,iHMD,Dsat,ARWatR,ARByPa,ARConR + + CALL test_pinpower + + call AllocatePMAXS + call DEP_read_main(PMAXS_unit) + return + 101 call XABORT('read_PMAXS_file: Error - Reached The End Of PMAXS File') + END SUBROUTINE read_PMAXS_file + +!--------------------------------------------------------------------- + SUBROUTINE test_pinpower +!--------------------------------------------------------------------- + IMPLICIT NONE + + computed_part: SELECT CASE (NPART) + CASE (0) + NCOL=NCOLA + NROW=NROWA + NRODS=NCOL*NROW + CASE (1) + NCOL=NCOLA + NROW=NROWA + if(NCOL.ne.NROW) THEN + call XABORT('test_pinpower: Error - Assembly Must Be Square For NPART=1') + END IF + NRODS=NCOL*(NCOL+1)/2 + CASE (2) + NCOL=(NCOLA+1)/2 + NROW=(NROWA+1)/2 + NRODS=NCOL*NROW + CASE (3) + NCOL=(NCOLA+1)/2 + NROW=(NROWA+1)/2 + if(NCOL.ne.NROW) THEN + call XABORT('test_pinpower: Error - Assembly Must Be Square For NPART=3') + END IF + NRODS=NCOL*(NCOL+1)/2 + END SELECT computed_part + END SUBROUTINE test_pinpower + +!--------------------------------------------------------------------- + SUBROUTINE read_pmax_head(iPMAX, PMAXS_unit) +!--------------------------------------------------------------------- + use PCRDATA + IMPLICIT NONE + INTEGER(4) :: iPMAX, PMAXS_unit + INTEGER(4) :: i,ibra,itemp,inb,j + CHARACTER(8) :: tit + + if(NDL .EQ. 0)then + pbet=.false. + pamb=.false. + endif + if(NDC .EQ. 0)pdec=.false. + if(NAD .EQ. 0)padf=.false. + if(NCD .EQ. 0)pcdf=.false. + if(NRODS .EQ. 0)pgff=.false. + + call det_var_position + + bran_i=>Bran_info(iPMAX) + if(bran_i%NOT_assigned)then + bran_i%NOT_assigned=.false. +!2) States data + do + read(PMAXS_unit,*,end=101)tit + if(tit .EQ. 'STA_VAR') then + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,Nstat_var + bran_i%Nstat_var=Nstat_var + allocate(bran_i%var_ind(Nstat_var),bran_i%var_nam(Nstat_var)) + var_ind=>bran_i%var_ind + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,Nstat_var,bran_i%var_nam(1:Nstat_var) + ktf=0 + inb=1 + do i=1,Nstat_var + validname=.false. + do j=inb,Nallvar + if(bran_i%var_nam(i).eq.all_var_nam(j))then + validname=.true. + var_ind(i)=j + inb=j+1 + exit + endif + enddo + if(validname)then + if(inb .EQ. 5)ktf=i + else + call XABORT('read_pmax_head: Error - State Variable Name Invalid') + endif + enddo + exit + endif + if(tit .EQ. 'BRANCHES'.or.tit .EQ. 'BURNUPS'.or.tit .EQ. 'XS_SET') then + backspace(PMAXS_unit) + Nstat_var=5 + bran_i%Nstat_var=Nstat_var + allocate(bran_i%var_ind(Nstat_var),bran_i%var_nam(Nstat_var)) + var_ind=>bran_i%var_ind + ktf=4 + do i=1,Nstat_var + var_ind(i)=i + bran_i%var_nam(i)=all_var_nam(i) + enddo + exit + endif + enddo + +!2) States data + allocate(bran_i%NBR(Nstat_var)) + NBR=>bran_i%NBR + NBRA=1 + do + read(PMAXS_unit,*,end=101)tit + if(tit .EQ. 'BRANCHES') then + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,itemp,NBR + do i=1,Nstat_var + NBRA=NBRA+NBR(i) + enddo + allocate(bran_i%state(Nstat_var,NBRA),bran_i%state_nam(NBRA)) + if(NBRA .GT. 1)then + state=>bran_i%state + if(ktf .GT. 0)then + do ibra=1,NBRA + read(PMAXS_unit,*,end=101)bran_i%state_nam(ibra),itemp,state(:,ibra) + state(ktf,ibra)=dsqrt(state(ktf,ibra)) + enddo + else + do ibra=1,NBRA + read(PMAXS_unit,*,end=101)bran_i%state_nam(ibra),itemp,state(:,ibra) + enddo + endif + else + bran_i%state=0 + endif + exit + endif + if(tit .EQ. 'BURNUPS'.or.tit .EQ. 'XS_SET') then + backspace(PMAXS_unit) + allocate(bran_i%state(Nstat_var,NBRA)) + bran_i%state=0 + NBR=0 + exit + endif + enddo + bran_i%NBRA=NBRA + bran_i%ktf=ktf + if(MBRA .LT. NBRA)MBRA=NBRA + if(var_ind(1) .EQ. 1)then + if(MBCR .LT. NBR(1))MBCR=NBR(1) + endif + else + Nstat_var=bran_i%Nstat_var + NBRA=bran_i%NBRA + ktf=bran_i%ktf + endif + +!3) Burnup information + do + read(PMAXS_unit,*,end=101)tit + if(tit .EQ. 'BURNUPS') then + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,PMAX%NBset + if(MBset .LT. PMAX%NBset)MBset=PMAX%NBset + allocate(PMAX%Bset(PMAX%NBset)) + do i=1,PMAX%NBset + read(PMAXS_unit,*)itemp,itemp + allocate(PMAX%Bset(i)%burns(itemp)) + backspace(PMAXS_unit) + read(PMAXS_unit,*)itemp,PMAX%Bset(i)%NBURN,PMAX%Bset(i)%burns + enddo + exit + endif + if(tit .EQ. 'XS_SET') then + backspace(PMAXS_unit) + PMAX%NBset=1 + allocate(PMAX%Bset(PMAX%NBset)) + allocate(PMAX%Bset(1)%burns(1)) + PMAX%Bset(1)%NBURN=1 + PMAX%Bset(1)%burns(1)=0 + exit + endif + enddo + return + 101 call XABORT('read_pmax_head: Error - Reached The End Of PMAXS File') + STOP + END SUBROUTINE read_pmax_head + +!--------------------------------------------------------------------- + SUBROUTINE DEP_read_main(PMAXS_unit) +!--------------------------------------------------------------------- + use PCRDATA + IMPLICIT NONE + INTEGER(4) :: PMAXS_unit + INTEGER(4) :: i,ihst,ibra,itemp,iBset,NBURN + CHARACTER(4) :: tit4 + CHARACTER(8) :: tit +! History case wise data + do ihst=1,NHST +!6) History case identification + do + read(PMAXS_unit,*,end=101)tit + if(tit .EQ. 'HST_CASE')then + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,PMAX%history(:,ihst) + PMAX%TIVB(ihst)%ibset=1 + exit + endif + if(tit .EQ. 'HISTORYC')then + backspace(PMAXS_unit) + read(PMAXS_unit,*)tit,PMAX%TIVB(ihst)%ibset,PMAX%history(:,ihst) + exit + endif + enddo + if(ktf .GT. 0)PMAX%history(ktf,ihst)=sqrt(PMAX%history(ktf,ihst)) + call AllocateTIVB(PMAX%TIVB(ihst)) + NBURN=PMAX%Bset(PMAX%TIVB(ihst)%ibset)%NBURN + do i=1,NBURN + TIV=>PMAX%TIVB(ihst)%TIV(i) + call read_TIV(PMAXS_unit) + enddo +!branch wise data +!7) State identification Always + do ibra=1,NBRA + read(PMAXS_unit,'(A4,2I4)')tit4,itemp,iBset + PMAX%branch(ibra,ihst)%iBset=iBset + NBURN=PMAX%bset(iBset)%NBURN + call read_branches(NBURN,PMAXS_unit,PMAX%branch(ibra,ihst)) + enddo !ibra + enddo !ihst + return + 101 call XABORT('DEP_read_main: Error - Reached The End Of PMAXS File') + END SUBROUTINE DEP_read_main + +!------------------------------------------------------------------ + SUBROUTINE read_branches(NBURN,PMAXS_unit,bran) +!------------------------------------------------------------------ + TYPE(BRANCH_WISE_TYPE) :: bran + INTEGER(4) :: NBURN,PMAXS_unit,iburn + call AllocateBranch(bran) + do iburn=1,NBURN + XS=>bran%XS(iburn) + call read_XS_Block(PMAXS_unit) + enddo + END SUBROUTINE read_branches + +!--------------------------------------------------------------------- + SUBROUTINE AllocatePMAXS +!--------------------------------------------------------------------- +! + PMAX%NCOL=NCOL + PMAX%NRODS=NRODS + PMAX%NHST=NHST + PMAX%NROW=NROW + PMAX%NPART=NROW + PMAX%NROWA=NROWA + PMAX%NCOLA=NCOLA + PMAX%iHMD=iHMD + PMAX%Dsat=Dsat + PMAX%ARWatR=ARWatR + PMAX%ARByPa=ARByPa + PMAX%ARConR=ARConR + PMAX%PITCH=PITCH + PMAX%XBE=XBE + PMAX%YBE=YBE + PMAX%derivatives=derivatives + allocate(PMAX%TIVB(NHST)) + allocate(PMAX%branch(NBRA,NHST)) + allocate(PMAX%history(Nstat_var,NHST)) + allocate(PMAX%base(NHST)) + allocate(PMAX%invdiff(NHST)) + END SUBROUTINE AllocatePMAXS + +!--------------------------------------------------------------------- + SUBROUTINE Clear_PMAXS_file(iPMAX) +!--------------------------------------------------------------------- + use PCRDATA + IMPLICIT NONE + INTEGER(4) :: iPMAX, i, ihst, ibra + bran_i=>Bran_info(iPMAX) + if(Nstat_var > 0) then + deallocate(bran_i%var_ind,bran_i%var_nam,bran_i%NBR) + if(NBRA.GT.0) deallocate(bran_i%state,bran_i%state_nam) + endif + do ihst=1,NHST + print *,'Clear_PMAX_file: call ClearTIVB ihst=',ihst + call ClearTIVB(PMAX%TIVB(ihst)) + do ibra=1,NBRA + call ClearBranch(PMAX%branch(ibra,ihst)) + enddo !ibra + enddo + if(PMAX%NBset > 0) then + do i=1,PMAX%NBset + deallocate(PMAX%Bset(i)%burns) + enddo + deallocate(PMAX%Bset) + endif + if(NHST > 0) then + deallocate(PMAX%TIVB) + if(NBRA.GT.0) deallocate(PMAX%branch) + if(Nstat_var > 0) deallocate(PMAX%history) + deallocate(PMAX%base) + deallocate(PMAX%invdiff) + endif + return + END SUBROUTINE Clear_PMAXS_file +END MODULE PCREAD diff --git a/Donjon/src/PCREIR.f b/Donjon/src/PCREIR.f new file mode 100644 index 0000000..514ae20 --- /dev/null +++ b/Donjon/src/PCREIR.f @@ -0,0 +1,211 @@ +*DECK PCREIR + SUBROUTINE PCREIR(NMDEPL,MD2,NEL,ITNAM,ITZEA,KPAX,BPAX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read depletion data on input file. Based on LIBEIR.f routine in +* DRAGON. +* +*Copyright: +* Copyright (C) 2020 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 +* NMDEPL names of reactions: +* NMDEPL(1)='DECAY'; NMDEPL(2)='NFTOT'; +* NMDEPL(3)='NG' ; NMDEPL(4)='N2N'; +* etc +* MD2 dimension of arrays ITNAM, ITZEA, KPAX and BPAX +* +*Parameters: output +* NEL number of particularized isotopes including macro +* ITNAM reactive isotope names in chain +* ITZEA 6-digit nuclide identifier +* atomic number z*10000 (digits) + mass number a*10 + +* energy state (0 = ground state, 1 = first state, etc.) +* KPAX complete reaction type matrix +* BPAX complete branching ratio matrix +* +*----------------------------------------------------------------------- +* +*---- +* INPUT FORMAT +*---- +* CHAIN +* [[ hnamson [ izea ] +* [ [[ { DECAY constant | +* reaction [energy] } ]] ] +* [ { STABLE | +* FROM [[ { DECAY | reaction } +* [[ yield hnampar ]] ]] } ] +* ]] +* ENDCHAIN +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXR=12 + INTEGER MD2,NEL,ITNAM(3,MD2),ITZEA(MD2),KPAX(MD2+MAXR,MD2) + CHARACTER NMDEPL(MAXR)*8 + REAL BPAX(MD2+MAXR,MD2) +*---- +* INPUT FILE PARAMETERS +*---- + CHARACTER TEXT12*12 + INTEGER KNADPL(2) + DOUBLE PRECISION DBLINP +*---- +* INTERNAL PARAMETERS +* KFISSP : FISSION PRODUCT FLAG = 2 (POSITION OF NFTOT IN NMDEPL) +*---- + INTEGER KFISSP + PARAMETER (KFISSP=2) + INTEGER INDIC,NITMA,IEL,JEL,IDEPL,INTG,IREAC,ISOT,JREL,JDEPL + REAL FLOTT,RRAT +* + NEL=0 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DBLINP) + 105 IF(INDIC.NE.3) CALL XABORT('PCREIR: CHARACTER DATA EXPECTED') +*---- +* EXIT IF ENDCHAIN READ +*---- + IF(TEXT12.EQ.'ENDCHAIN') GO TO 190 +*---- +* ISOTOPE NAME READ +* IF NAME ALREADY EXISTS SELECT ISOTOPE NUMBER +* IF NAME NOT DEFINED ADD TO ISOTOPE LIST +*---- + IDEPL=0 + READ(TEXT12,'(2A4)') KNADPL(1),KNADPL(2) + DO 110 JEL=1,NEL + IF(KNADPL(1).EQ.ITNAM(1,JEL).AND. + > KNADPL(2).EQ.ITNAM(2,JEL)) THEN + IDEPL=JEL + GO TO 115 + ENDIF + 110 CONTINUE + NEL=NEL+1 + IF(NEL.GT.MD2) CALL XABORT('PCREIR: MD2 OVERFLOW(1).') + IDEPL=NEL + ITNAM(1,NEL)=KNADPL(1) + ITNAM(2,NEL)=KNADPL(2) +*---- +* READ IZEA +*---- + 115 CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) + IF(INDIC.EQ.1) THEN + ITZEA(IDEPL)=INTG + CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) + ELSE + ITZEA(IDEPL)=0 + ENDIF +*---- +* LOOP OVER ALL PARAMETERS ASSOCIATED WITH SON ISOTOPES +*---- + 120 IF(INDIC.NE.3) CALL XABORT('PCREIR: REACTION TYPE EXPECTED FOR' + > //' ISOTOPE '//TEXT12) +*---- +* IF KEYWORD IS 'FROM' READ LIST OF PARENT NUCLIDES +*---- + IF(TEXT12.EQ.'FROM') THEN +*---- +* LOOP OVER ALL PARAMETERS ASSOCIATED WITH PARENT ISOTOPES +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DBLINP) + 130 IF(INDIC.NE.3) CALL XABORT('PCREIR: REACTION TYPE EXPECTED.') + DO 140 IREAC=1,MAXR + RRAT=1.0 +*---- +* TEST IF KEYWORD IS A REACTION +*---- + IF(TEXT12.EQ.NMDEPL(IREAC)) THEN +*---- +* READ LIST OF YIELD AND PARENT ISOTOPES +*---- + JDEPL=0 + DO 150 JEL=1,MD2 +*---- +* IF YIELD ABSENT GO TO TEST FOR NEW REACTION TYPE +*---- + CALL REDGET(INDIC,ISOT,RRAT,TEXT12,DBLINP) + IF(INDIC.NE.2) GO TO 130 + CALL REDGET(INDIC,ISOT,FLOTT,TEXT12,DBLINP) + IF(INDIC.NE.3) + > CALL XABORT('PCREIR: ISOTOPE NAME hnampar MISSING') +*---- +* ISOTOPE NAME READ +* IF NAME ALREADY EXISTS SELECT ISOTOPE NUMBER +* IF NAME NOT DEFINED ADD TO ISOTOPE LIST +*---- + READ(TEXT12,'(2A4)') KNADPL(1),KNADPL(2) + DO 160 JREL=1,MD2 + IF(KNADPL(1).EQ.ITNAM(1,JREL).AND. + > KNADPL(2).EQ.ITNAM(2,JREL)) THEN + JDEPL=JREL + GO TO 165 + ENDIF + 160 CONTINUE + NEL=NEL+1 + IF(NEL.GT.MD2) CALL XABORT('PCREIR: MD2 OVERFLOW(2).') + JDEPL=NEL + ITNAM(1,NEL)=KNADPL(1) + ITNAM(2,NEL)=KNADPL(2) + 165 KPAX(IDEPL,JDEPL)=IREAC + BPAX(IDEPL,JDEPL)=RRAT + 150 CONTINUE + CALL XABORT('PCREIR: TO MANY PARENT ISOTOPES') + ENDIF + 140 CONTINUE + ELSE IF(TEXT12.EQ.'STABLE') THEN + DO 141 IREAC=1,MAXR + IF(KPAX(MD2+IREAC,IDEPL).NE.0) KPAX(MD2+IREAC,IDEPL)=-9999 + 141 CONTINUE + DO 142 IEL=1,MD2 + KPAX(IDEPL,IEL)=0 + 142 CONTINUE + CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) +*---- +* READ NEXT KEYWORD FOR THIS ISOTOPE +*---- + ELSE + DO 170 IREAC=1,MAXR + RRAT=0.0 + IF(TEXT12.EQ.NMDEPL(IREAC)) THEN + CALL REDGET(INDIC,ISOT,RRAT,TEXT12,DBLINP) + IF(INDIC.EQ.1) THEN + CALL XABORT('PCREIR: INVALID INTEGER') + ELSE IF(INDIC.EQ.2) THEN + CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) + ENDIF + KPAX(MD2+IREAC,IDEPL)=1 + BPAX(MD2+IREAC,IDEPL)=RRAT +*---- +* READ NEXT KEYWORD FOR THIS ISOTOPE +*---- + GO TO 120 + ENDIF + 170 CONTINUE + ENDIF + GO TO 105 +*---- +* FIND FISSION PRODUCTS +*---- + 190 DO 200 IEL=1,MD2 + DO 210 JEL=1,MD2 + IF(KPAX(JEL,IEL).EQ.KFISSP) KPAX(MD2+KFISSP,JEL)=-1 + 210 CONTINUE + 200 CONTINUE + IF(NEL.NE.MD2) CALL XABORT('PCREIR: INVALID VALUE OF MD2.') +*---- +* RETURN FROM PCREIR +*---- + RETURN + END diff --git a/Donjon/src/PCRISO.f b/Donjon/src/PCRISO.f new file mode 100644 index 0000000..26803e3 --- /dev/null +++ b/Donjon/src/PCRISO.f @@ -0,0 +1,239 @@ +*DECK PCRISO + SUBROUTINE PCRISO(IPLIB,KPTMP,HNAME,JSO,NCAL,NGRP,NL,NED,HVECT, + 1 NDEL,IMPX,TERP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover nuclear data from a single isotopic directory. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPLIB address of the microlib LCM object. +* KPTMP address of the 'CALCULATIONS' list. +* HNAME character*12 name of the PMAXS isotope been processed. +* JSO index of the PMAXS isotope been processed. +* NCAL number of elementary calculations in the PMAXS file. +* NGRP number of energy groups. +* NL number of Legendre orders. +* NED number of extra vector edits. +* HVECT character names of the extra vector edits. +* NDEL number of delayed precursor groups. +* IMPX print parameter (equal to zero for no print). +* TERP interpolation weights. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,KPTMP + INTEGER JSO,NCAL,NGRP,NL,NED,NDEL,IMPX + REAL TERP(NCAL) + CHARACTER HNAME*12,HVECT(NED)*(*) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + REAL TAUXFI, TAUXF, WEIGHT + INTEGER ICAL, IDEL, IED, IG1, IG2, IG, ILENG, IL, ITYLCM, J, + & LENGTH, MAXH + LOGICAL LWD + CHARACTER CM*2,HMAKE(100)*12,TEXT12*12 + TYPE(C_PTR) LPTMP,MPTMP,NPTMP + INTEGER, ALLOCATABLE, DIMENSION(:) :: ITYPR + REAL, ALLOCATABLE, DIMENSION(:) :: WDLA + REAL, ALLOCATABLE, DIMENSION(:,:) :: GAR1,GAR2 + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: WSCA1,WSCA2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ITYPR(NL)) + ALLOCATE(GAR1(NGRP,10+NL+NED+2*NDEL),WSCA1(NGRP,NGRP,NL), + 1 GAR2(NGRP,10+NL+NED+2*NDEL),WSCA2(NGRP,NGRP,NL),WDLA(NDEL)) +*---- +* RECOVER GENERIC ISOTOPIC DATA FROM THE PMAXS FILE +*---- + LWD=.FALSE. + DO 10 ICAL=1,NCAL + WEIGHT=TERP(ICAL) + IF(WEIGHT.EQ.0.0) GO TO 10 + LPTMP=LCMGIL(KPTMP,ICAL) + CALL LCMLEN(LPTMP,'ISOTOPESLIST',LENGTH,ITYLCM) + IF(LENGTH.EQ.0) GO TO 10 + MPTMP=LCMGID(LPTMP,'ISOTOPESLIST') + CALL LCMLEL(MPTMP,JSO,ILENG,ITYLCM) + IF(ILENG.EQ.0) GO TO 10 + NPTMP=LCMGIL(MPTMP,JSO) + CALL LCMGTC(NPTMP,'ALIAS',12,TEXT12) + IF(TEXT12(:8).NE.HNAME(:8)) GO TO 10 + CALL LCMLEN(NPTMP,'LAMBDA-D',LENGTH,ITYLCM) + LWD=(LENGTH.EQ.NDEL).AND.(NDEL.GT.0) + IF(LWD) CALL LCMGET(NPTMP,'LAMBDA-D',WDLA) + GO TO 15 + 10 CONTINUE + CALL XABORT('PCRISO: UNABLE TO FIND A DIRECTORY FOR ISOTOPE '// + 1 HNAME//'.') +*---- +* LOOP OVER ELEMENTARY CALCULATIONS +*---- + 15 MAXH=10+NL+NED+2*NDEL + IF(MAXH+NL.GT.100) CALL XABORT('PCRISO: STATIC STORAGE EXCEEDED') + DO J=1,MAXH+NL + HMAKE(J)=' ' + ENDDO + GAR2(:NGRP,:MAXH)=0.0 + WSCA2(:NGRP,:NGRP,:NL)=0.0 + TAUXFI=0.0 + DO 120 ICAL=1,NCAL + WEIGHT=TERP(ICAL) + IF(WEIGHT.EQ.0.0) GO TO 120 + LPTMP=LCMGIL(KPTMP,ICAL) + IF(IMPX.GT.4) THEN + WRITE(IOUT,'(34H PCRISO: PMAXS ACCESS FOR ISOTOPE ,A,6H AND C, + 1 10HALCULATION,I5,1H.)') HNAME,ICAL + IF(IMPX.GT.50) CALL LCMLIB(LPTMP) + ENDIF + MPTMP=LCMGID(LPTMP,'ISOTOPESLIST') + CALL LCMLEL(MPTMP,JSO,ILENG,ITYLCM) + IF(ILENG.EQ.0) GO TO 120 + NPTMP=LCMGIL(MPTMP,JSO) +*---- +* RECOVER CALCULATION-SPECIFIC ISOTOPIC DATA FROM THE PMAXS FILE +*---- + CALL LCMLEN(NPTMP,'NWT0',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'NWT0',GAR1(1,1)) + HMAKE(1)='NWT0' + ENDIF + CALL LCMLEN(NPTMP,'NWT1',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'NWT1',GAR1(1,2)) + HMAKE(2)='NWT1' + ENDIF + CALL XDRLGS(NPTMP,-1,IMPX,0,NL-1,1,NGRP,GAR1(1,3),WSCA1,ITYPR) + DO IL=0,NL-1 + IF(ITYPR(IL+1).NE.0) THEN + WRITE (CM,'(I2.2)') IL + HMAKE(3+IL)='SIGS'//CM + ENDIF + ENDDO + CALL LCMGET(NPTMP,'NTOT0',GAR1(1,3+NL)) + HMAKE(3+NL)='NTOT0' + CALL LCMLEN(NPTMP,'NTOT1',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'NTOT1',GAR1(1,4+NL)) + HMAKE(4+NL)='NTOT1' + ENDIF + CALL LCMLEN(NPTMP,'NUSIGF',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'NUSIGF',GAR1(1,5+NL)) + HMAKE(5+NL)='NUSIGF' + CALL LCMGET(NPTMP,'CHI',GAR1(1,MAXH-NDEL-1)) + HMAKE(MAXH-NDEL-1)='CHI' + ENDIF + IF(NDEL.GT.0) THEN + WRITE(TEXT12,'(6HNUSIGF,I2.2)') NDEL + CALL LCMLEN(NPTMP,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + DO IDEL=1,NDEL + WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL + CALL LCMGET(NPTMP,TEXT12,GAR1(1,MAXH-2*NDEL-2+IDEL)) + HMAKE(MAXH-2*NDEL-2+IDEL)=TEXT12 + ENDDO + ENDIF + WRITE(TEXT12,'(3HCHI,I2.2)') NDEL + CALL LCMLEN(NPTMP,TEXT12,LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + DO IDEL=1,NDEL + WRITE(TEXT12,'(3HCHI,I2.2)') IDEL + CALL LCMGET(NPTMP,TEXT12,GAR1(1,MAXH-NDEL-1+IDEL)) + HMAKE(MAXH-NDEL-1+IDEL)=TEXT12 + ENDDO + ENDIF + ENDIF + CALL LCMLEN(NPTMP,'H-FACTOR',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'H-FACTOR',GAR1(1,MAXH-2*NDEL-4)) + HMAKE(MAXH-2*NDEL-4)='H-FACTOR' + ENDIF + CALL LCMLEN(NPTMP,'OVERV',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'OVERV',GAR1(1,MAXH-2*NDEL-3)) + HMAKE(MAXH-2*NDEL-3)='OVERV' + ENDIF + CALL LCMLEN(NPTMP,'TRANC',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'TRANC',GAR1(1,MAXH-2*NDEL-2)) + HMAKE(MAXH-2*NDEL-2)='TRANC' + ENDIF + DO IED=1,NED + CALL LCMLEN(NPTMP,HVECT(IED),LENGTH,ITYLCM) + IF((LENGTH.GT.0).AND.(HVECT(IED).NE.'TRANC')) THEN + CALL LCMGET(NPTMP,HVECT(IED),GAR1(1,5+NL+IED)) + HMAKE(5+NL+IED)=HVECT(IED) + ENDIF + ENDDO + CALL LCMLEN(NPTMP,'STRD',LENGTH,ITYLCM) + IF(LENGTH.EQ.NGRP) THEN + CALL LCMGET(NPTMP,'STRD',GAR1(1,MAXH)) + HMAKE(MAXH)='STRD' + ENDIF +*---- +* COMPUTE FISSION RATE FOR A SINGLE ELEMENTARY CALCULATION +*---- + TAUXF=0.0 + IF(HMAKE(5+NL).EQ.'NUSIGF') THEN + DO IG=1,NGRP + TAUXF=TAUXF+GAR1(IG,5+NL)*GAR1(IG,1) + ENDDO + TAUXFI=TAUXFI+WEIGHT*TAUXF + ENDIF +*---- +* ADD CONTRIBUTIONS FROM A SINGLE ELEMENTARY CALCULATION +*---- + DO J=1,MAXH + IF((HMAKE(J).NE.' ').AND.(HMAKE(J)(:4).NE.'SIGS')) THEN + DO IG=1,NGRP + GAR2(IG,J)=GAR2(IG,J)+WEIGHT*GAR1(IG,J) + ENDDO + ENDIF + ENDDO + DO IL=1,NL + ITYPR(IL)=0 + IF(HMAKE(MAXH+IL).NE.' ') ITYPR(IL)=1 + DO IG2=1,NGRP + GAR2(IG2,2+IL)=GAR2(IG2,2+IL)+WEIGHT*GAR1(IG2,2+IL) + DO IG1=1,NGRP + WSCA2(IG1,IG2,IL)=WSCA2(IG1,IG2,IL)+WEIGHT* + 1 WSCA1(IG1,IG2,IL) + ENDDO + ENDDO + ENDDO + 120 CONTINUE +*---- +* SAVE ISOTOPIC DATA IN THE MICROLIB +*---- + CALL LCMPTC(IPLIB,'ALIAS',12,HNAME) + IF(LWD) CALL LCMPUT(IPLIB,'LAMBDA-D',NDEL,2,WDLA) + DO J=1,MAXH + IF((HMAKE(J).NE.' ').AND.(HMAKE(J)(:4).NE.'SIGS')) THEN + CALL LCMPUT(IPLIB,HMAKE(J),NGRP,2,GAR2(1,J)) + ENDIF + ENDDO + CALL XDRLGS(IPLIB,1,IMPX,0,NL-1,1,NGRP,GAR2(1,3),WSCA2,ITYPR) + IF(IMPX.GT.50) CALL LCMLIB(IPLIB) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WDLA,WSCA2,GAR2,WSCA1,GAR1) + DEALLOCATE(ITYPR) + RETURN + END diff --git a/Donjon/src/PCRMAC.f b/Donjon/src/PCRMAC.f new file mode 100644 index 0000000..06cf5af --- /dev/null +++ b/Donjon/src/PCRMAC.f @@ -0,0 +1,451 @@ +*DECK PCRMAC + SUBROUTINE PCRMAC(MAXNIS,IPMAC,IACCS,NMIX,NGRP,NGFF,IMPX,NCAL, + 1 TERP,NISO,HISO,CONC,LMIXC,XS_CALC,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the macrolib by scanning the NCAL elementary calculations and +* weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* IPMAC address of the output macrolib LCM object. +* IACCS =0 macrolib is created; =1 ... is updated. +* NMIX maximum number of material mixtures in the macrolib. +* NGRP number of energy groups. +* NGFF number of group form factors per energy group. +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the PMAXS file. +* TERP interpolation factors. +* NISO number of user-selected isotopes. +* HISO name of the user-selected isotopes. +* CONC user-defined number density of the user-selected isotopes. +* LMIXC flag set to .true. for fuel-map mixtures to process. +* XS_CALC pointers towards PMAXS elementary calculations. +* B2 buckling +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE PCRDATA + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC + INTEGER MAXNIS,IACCS,NMIX,NGRP,NGFF,IMPX,NCAL,NISO(NMIX), + 1 HISO(2,NMIX,MAXNIS) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + LOGICAL LMIXC(NMIX) + TYPE(XSBLOCK_ITEM) XS_CALC(NCAL) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXED=30 + INTEGER, PARAMETER::MAX1D=40 + INTEGER, PARAMETER::MAX2D=20 + INTEGER, PARAMETER::MAXIFX=5 + INTEGER, PARAMETER::MAXNFI=50 + INTEGER, PARAMETER::MAXNL=6 + INTEGER, PARAMETER::MAXRES=MAX1D-10 + INTEGER, PARAMETER::NSTATE=40 + REAL FLOTVA, WEIGHT + INTEGER I0, I1D, I2D, IBM, ICAL, IDEL, IDF, IED, IGMAX, IGMIN, + & IGR, ILONG, IL, IPOSDE, ISO, ITRAN, ITSTMP, ITYLCM, I, JGR, + & KSO1, KSO, MAXMIX, N1D, N2D, NBISO, NDEL, NED,NF, NL, NTYPE + INTEGER ISTATE(NSTATE),NFINF,IACCOLD + REAL TMPDAY(3) + LOGICAL LMAKE1(MAX1D),LMAKE2(MAX2D),LFAST + CHARACTER TEXT8*8,TEXT12*12,HHISO*8,CM*2,HMAK1(MAX1D)*12, + 1 HMAK2(MAX2D)*12,HVECT(MAXED)*8 + TYPE(C_PTR) IPTMP,JPTMP,KPTMP,JPMAC,KPMAC +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,ISOMI + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,XVOLM,WORK1,WORK2 + REAL, ALLOCATABLE, DIMENSION(:,:) :: FLUX + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAR1 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: GAR2,GAR3 + LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASKL + INTEGER, POINTER, DIMENSION(:) :: ISONA + REAL, POINTER, DIMENSION(:) :: DENIS,FLOT + TYPE(C_PTR) ISONA_PTR,DENIS_PTR,FLOT_PTR + DATA HMAK1 / 'FLUX-INTG','NTOT0','OVERV','DIFF','DIFFX','DIFFY', + 1 'DIFFZ','FLUX-INTG-P1','NTOT1','H-FACTOR',MAXRES*' '/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IJJ(NMIX),NJJ(NMIX),IPOS(NMIX)) + ALLOCATE(FLUX(NGRP,2),GAR1(NMIX,NGRP,MAX1D), + 1 GAR2(NMIX,MAXNFI,NGRP,MAX2D),GAR3(NMIX,NGRP,NGRP,MAXNL), + 2 GAR4(NMIX*NGRP)) +* + IACCOLD=IACCS ! for ADF and GFF + NTYPE=0 + NFINF=0 +*---- +* MACROLIB INITIALIZATION +*---- + IF(IACCS.EQ.0) THEN +* PMAXS values: + NL=1 + NF=0 + ITRAN=0 + NDEL=NDLAY +* IDF=NTDF +* NGFF=NRODS + IDF=0 + NGFF=0 + NED=1 + HVECT(1)='H-FACTOR' + IF(NXST.GE.7) THEN + NED=2 + HVECT(2)='NFTOT' + ENDIF + IF(NXST.EQ.8) THEN + NED=3 + HVECT(3)='DETEC' + ENDIF + TEXT12='L_MACROLIB' + CALL LCMPTC(IPMAC,'SIGNATURE',12,TEXT12) + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NMIX + ISTATE(3)=NL + ISTATE(5)=NED + ISTATE(6)=ITRAN + ISTATE(7)=NDEL + ISTATE(12)=IDF + ISTATE(16)=NGFF + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + ELSE + CALL LCMGTC(IPMAC,'SIGNATURE',12,TEXT12) + IF(TEXT12.NE.'L_MACROLIB') THEN + CALL XABORT('PCRMAC: SIGNATURE IS '//TEXT12//'. L_MACROLIB E' + 1 //'XPECTED.') + ENDIF + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF ENERGY GROUPS(2).') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF MIXTURES(2).') + ENDIF + NL=ISTATE(3) + NF=ISTATE(4) + NED=ISTATE(5) + NDEL=ISTATE(7) + IDF=ISTATE(12) + NGFF=ISTATE(16) + IF(NED.GT.MAXED) CALL XABORT('PCRMAC: MAXED OVERFLOW(2).') + IF(NED.GT.0) CALL LCMGTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + IF(IDF.EQ.1) THEN + NTYPE=1 + ELSE IF((IDF.EQ.3).AND.(IACCOLD.NE.0)) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGET(IPMAC,'NTYPE',NTYPE) + CALL LCMSIX(IPMAC,' ',2) + ENDIF + IF((NGFF.NE.0).AND.(IACCOLD.NE.0)) THEN + CALL LCMSIX(IPMAC,'GFF',1) + CALL LCMLEN(IPMAC,'FINF_NUMBER ',NFINF,ITYLCM) + IF(NFINF.GT.MAXIFX) CALL XABORT('PCRMAC: MAXIFX OVERFLOW.') + CALL LCMSIX(IPMAC,' ',2) + ENDIF + ENDIF + N1D=10+NED+NL + N2D=2*(NDEL+1) + IF(NL.GT.MAXNL) CALL XABORT('PCRMAC: MAXNL OVERFLOW.') + IF(N1D.GT.MAX1D) CALL XABORT('PCRMAC: MAX1D OVERFLOW.') + IF(N2D.GT.MAX2D) CALL XABORT('PCRMAC: MAX2D OVERFLOW.') + LMAKE1(:N1D)=.FALSE. + LMAKE2(:N2D)=.FALSE. + GAR1(:NMIX,:NGRP,:N1D)=0.0 + GAR2(:NMIX,:MAXNFI,:NGRP,:N2D)=0.0 + GAR3(:NMIX,:NGRP,:NGRP,:NL)=0.0 + DO 20 IED=1,NED + HMAK1(10+IED)=HVECT(IED) + 20 CONTINUE + DO 30 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(10+NED+IL)='SIGS'//CM + 30 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 40 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 + 40 CONTINUE +*---- +* READ EXISTING MACROLIB INFORMATION +*---- + ALLOCATE(XVOLM(NMIX)) + XVOLM(:NMIX)=0.0 + IF(IACCS.NE.0) THEN ! IACCS + CALL LCMGET(IPMAC,'VOLUME',XVOLM) + JPMAC=LCMGID(IPMAC,'GROUP') + DO 80 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + DO 60 I1D=1,N1D + CALL LCMLEN(KPMAC,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE1(I1D)=.TRUE. + CALL LCMGET(KPMAC,HMAK1(I1D),GAR1(1,IGR,I1D)) + DO 50 IBM=1,NMIX + IF(LMIXC(IBM)) GAR1(IBM,IGR,I1D)=0.0 + 50 CONTINUE + ENDIF + 60 CONTINUE + DO 65 I2D=1,N2D + CALL LCMLEN(KPMAC,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE2(I2D)=.TRUE. + CALL LCMGET(KPMAC,HMAK2(I2D),GAR2(1,1,IGR,I2D)) + DO 64 I=1,NF + DO 63 IBM=1,NMIX + IF(LMIXC(IBM)) GAR2(IBM,I,IGR,I2D)=0.0 + 63 CONTINUE + 64 CONTINUE + ENDIF + 65 CONTINUE + DO 75 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 71 IBM=1,NMIX + IPOSDE=IPOS(IBM) + DO 70 JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR4(IPOSDE) + IF(LMIXC(IBM)) GAR3(IBM,JGR,IGR,IL)=0.0 + IPOSDE=IPOSDE+1 + 70 CONTINUE + 71 CONTINUE + ENDIF + 75 CONTINUE + 80 CONTINUE + ENDIF ! IACCS +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + LFAST=.TRUE. + DO 85 IBM=1,NMIX + LFAST=LFAST.AND.((.NOT.LMIXC(IBM)).OR.(NISO(IBM).EQ.0)) + 85 CONTINUE + DO 210 ICAL=1,NCAL + IPTMP=C_NULL_PTR + DO 200 IBM=1,NMIX + WEIGHT=TERP(ICAL,IBM) + IF((.NOT.LMIXC(IBM)).OR.(WEIGHT.EQ.0.0)) GO TO 200 +*---- +* PRODUCE AN ELEMENTARY MACROLIB (IF IPTMP=C_NULL_PTR) +*---- + IF(.NOT.C_ASSOCIATED(IPTMP)) THEN + CALL LCMOP(IPTMP,'*ELEMENTARY*',0,1,0) + CALL PCRONE(IMPX,ICAL,IPTMP,NCAL,NGRP,XS_CALC) + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(33H PCRMAC: PMAXS ACCESS FOR MIXTURE,I8,5H AND , + 1 11HCALCULATION,I8,9H. WEIGHT=,1P,E12.4)') IBM,ICAL,WEIGHT + IF(IMPX.GT.50) CALL LCMLIB(IPTMP) + ENDIF + CALL LCMGET(IPTMP,'STATE-VECTOR',ISTATE) + NBISO=ISTATE(2) + IF(ISTATE(1).NE.1) CALL XABORT('PCRMAC: INVALID NUMBER OF MATE' + 1 //'RIAL MIXTURES IN THE PMAXS FILE.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('PCRMAC: INVALID NUMBER OF E' + 1 //'NERGY GROUPS IN THE PMAXS FILE.') + ALLOCATE(MASKL(NGRP)) + MASKL(:NGRP)=.TRUE. + CALL LCMGPD(IPTMP,'ISOTOPESUSED',ISONA_PTR) + CALL LCMGPD(IPTMP,'ISOTOPESDENS',DENIS_PTR) + CALL C_F_POINTER(ISONA_PTR,ISONA,(/ NBISO /)) + CALL C_F_POINTER(DENIS_PTR,DENIS,(/ NBISO /)) + DO 110 ISO=1,NBISO + WRITE(TEXT8,'(2A4)') (ISONA(3*(ISO-1)+I0),I0=1,2) + KSO1=0 + DO 90 KSO=1,NISO(IBM) ! user-selected isotope + WRITE(HHISO,'(2A4)') (HISO(I0,IBM,KSO),I0=1,2) + IF(TEXT8.EQ.HHISO) THEN + KSO1=KSO + GO TO 100 + ENDIF + 90 CONTINUE + 100 IF(KSO1.GT.0) DENIS(ISO)=CONC(IBM,KSO1) + 110 CONTINUE + MAXMIX=1 + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 + ALLOCATE(ISOMI(NBISO)) + ISOMI(:NBISO)=1 + CALL LIBMIX(IPTMP,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS, + 1 .TRUE.,MASKL,ITSTMP,TMPDAY) + CALL LCMPPD(IPTMP,'ISOTOPESDENS',NBISO,2,DENIS_PTR) + DEALLOCATE(ISOMI,MASKL) + ENDIF +*---- +* PERFORM INTERPOLATION +*---- + CALL LCMSIX(IPTMP,'MACROLIB',1) + CALL LCMGET(IPTMP,'STATE-VECTOR',ISTATE) + IF(NF.EQ.0) NF=ISTATE(4) + IF(NF.GT.MAXNFI) CALL XABORT('PCRMAC: MAXNFI OVERFLOW.') + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.1)THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF MIXTURES(3).') + ELSE IF(ISTATE(3).NE.NL) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF LEGENDRE ORDERS(3).') + ELSE IF((ISTATE(4).NE.0).AND.(ISTATE(4).NE.NF)) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF FISSILE ISOTOPES(3).') + ELSE IF((ISTATE(5).NE.NED).AND.(ISTATE(5).GT.0)) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF EDIT REACTIONS(3).') + ELSE IF((ISTATE(7).NE.NDEL).AND.(ISTATE(7).GT.0)) THEN + CALL XABORT('PCRMAC: INVALID NUMBER OF PRECURSOR GROUPS(3).') + ENDIF + JPTMP=LCMGID(IPTMP,'GROUP') + DO 195 IGR=1,NGRP + KPTMP=LCMGIL(JPTMP,IGR) + DO 170 I1D=1,N1D + CALL LCMLEN(KPTMP,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + IF(ILONG.NE.1) CALL XABORT('PCRMAC: FLOTVA OVERFLOW.') + LMAKE1(I1D)=.TRUE. + CALL LCMGET(KPTMP,HMAK1(I1D),FLOTVA) + GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)+WEIGHT*FLOTVA + ENDIF + 170 CONTINUE + IF(ISTATE(4).GT.0) THEN + DO 175 I2D=1,N2D + CALL LCMLEN(KPTMP,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + IF(ILONG.NE.NF) CALL XABORT('PCRMAC: FLOT OVERFLOW.') + LMAKE2(I2D)=.TRUE. + CALL LCMGPD(KPTMP,HMAK2(I2D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + DO 174 I=1,NF + GAR2(IBM,I,IGR,I2D)=GAR2(IBM,I,IGR,I2D)+WEIGHT*FLOT(I) + 174 CONTINUE + ENDIF + 175 CONTINUE + ENDIF + DO 190 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + ILONG=1 + IF(IL.GT.1) CALL LCMLEN(KPTMP,'SCAT'//CM,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMGET(KPTMP,'SCAT'//CM,GAR4) + CALL LCMGET(KPTMP,'NJJS'//CM,NJJ) + CALL LCMGET(KPTMP,'IJJS'//CM,IJJ) + CALL LCMGET(KPTMP,'IPOS'//CM,IPOS) + IPOSDE=IPOS(1) + DO 180 JGR=IJJ(1),IJJ(1)-NJJ(1)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR3(IBM,JGR,IGR,IL)+WEIGHT*GAR4(IPOSDE) + IPOSDE=IPOSDE+1 + 180 CONTINUE + ENDIF + 190 CONTINUE + 195 CONTINUE + CALL LCMSIX(IPTMP,' ',2) + IF(.NOT.LFAST) CALL LCMCL(IPTMP,2) + 200 CONTINUE + IF(C_ASSOCIATED(IPTMP)) CALL LCMCL(IPTMP,2) + 210 CONTINUE +*---- +* WRITE INTERPOLATED MACROLIB INFORMATION +*---- + CALL LCMPUT(IPMAC,'VOLUME',NMIX,2,XVOLM) + DEALLOCATE(XVOLM) + JPMAC=LCMLID(IPMAC,'GROUP',NGRP) + DO 370 IGR=1,NGRP + KPMAC=LCMDIL(JPMAC,IGR) + DO 320 I1D=1,N1D + IF(LMAKE1(I1D)) THEN + CALL LCMPUT(KPMAC,HMAK1(I1D),NMIX,2,GAR1(1,IGR,I1D)) + ENDIF + 320 CONTINUE + DO 325 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 + 325 CONTINUE + DO 360 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IPOSDE=0 + DO 350 IBM=1,NMIX + IPOS(IBM)=IPOSDE+1 + IGMIN=IGR + IGMAX=IGR + DO 330 JGR=1,NGRP + IF(GAR3(IBM,JGR,IGR,IL).NE.0.0) THEN + IGMIN=MIN(IGMIN,JGR) + IGMAX=MAX(IGMAX,JGR) + ENDIF + 330 CONTINUE + IJJ(IBM)=IGMAX + NJJ(IBM)=IGMAX-IGMIN+1 + DO 340 JGR=IGMAX,IGMIN,-1 + IPOSDE=IPOSDE+1 + GAR4(IPOSDE)=GAR3(IBM,JGR,IGR,IL) + 340 CONTINUE + 350 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 + 360 CONTINUE + 370 CONTINUE + IACCS=1 +*---- +* UPDATE STATE-VECTOR +*---- + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + ISTATE(4)=MAX(ISTATE(4),NF) + IF(LMAKE1(4)) ISTATE(9)=1 + IF(LMAKE1(5)) ISTATE(9)=2 + 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(6,'(/34H PCRMAC: INCLUDE LEAKAGE IN THE MA, + 1 11HCROLIB (B2=,1P,E12.5,2H).)') B2 + JPMAC=LCMGID(IPMAC,'GROUP') + ALLOCATE(WORK1(NMIX),WORK2(NMIX)) + DO 520 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + CALL LCMGET(KPMAC,'NTOT0',WORK1) + CALL LCMGET(KPMAC,'DIFF',WORK2) + DO 510 IBM=1,NMIX + IF(LMIXC(IBM)) WORK1(IBM)=WORK1(IBM)+B2*WORK2(IBM) + 510 CONTINUE + CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,WORK1) + 520 CONTINUE + DEALLOCATE(WORK2,WORK1) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(GAR4,GAR3,GAR2,GAR1,FLUX) + DEALLOCATE(IPOS,NJJ,IJJ) + RETURN + END diff --git a/Donjon/src/PCRMIC.f b/Donjon/src/PCRMIC.f new file mode 100644 index 0000000..9219e44 --- /dev/null +++ b/Donjon/src/PCRMIC.f @@ -0,0 +1,335 @@ +*DECK PCRMIC + SUBROUTINE PCRMIC(MAXNIS,MAXISO,IPLIB,IACCS,NMIX,NGRP,IMPX, + 1 NCAL,TERP,NISO,HISO,CONC,LMIXC,XS_CALC,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the microlib by scanning the NCAL elementary calculations from +* PMAXS file and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* MAXISO maximum allocated space for output microlib TOC information. +* IPLIB address of the output microlib LCM object. +* IACCS =0 microlib is created; =1 ... is updated. +* NMIX maximum number of material mixtures in the microlib. +* NGRP number of energy groups. +* IMPX print parameter (equal to zero for no print). +* NCAL number of elementary calculations in the PMAXS file. +* TERP interpolation factors. +* NISO number of user-selected isotopes. +* HISO name of the user-selected isotopes. +* CONC user-defined number density of the user-selected isotopes. +* LMIXC flag set to .true. for fuel-map mixtures to process. +* XS_CALC pointers towards PMAXS elementary calculations. +* B2 buckling +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE PCRDATA + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB + INTEGER MAXNIS,MAXISO,IACCS,NMIX,NGRP,IMPX,NCAL,NISO(NMIX), + 1 HISO(2,NMIX,MAXNIS) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + LOGICAL LMIXC(NMIX) + TYPE(XSBLOCK_ITEM) XS_CALC(NCAL) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXED=50 + INTEGER, PARAMETER::NSTATE=40 + INTEGER I0, IBM, ICAL, IED1, IED2, IGR, ISO, ITRANC, KSO1, I, + & JSO, KSO, NBISO1, NBISO2, NCOMB2, NCOMB, NDEL, NDEPL, NED1, + & NED2, NL, ITSTMP, MAXMIX, NBISO + REAL WEIGHT,TMPDAY(3) + CHARACTER TEXT12*12,HNAME*12,HVECT1(MAXED)*8,HHISO*8,TEXT8*8, + & HVECT2(MAXED)*8 + INTEGER ISTATE(NSTATE) + TYPE(C_PTR) IPTMP,JPTMP,KPTMP,JPLIB,KPLIB +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMIX2,ITOD2,ISTY2,MILVO, + & IMICR + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: HUSE1,HUSE2,HNAM2 + REAL, ALLOCATABLE, DIMENSION(:) :: DENS2,ENER,GAR1,GAR2 + LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASKL + INTEGER, POINTER, DIMENSION(:) :: ISONA,ISOMI + REAL, POINTER, DIMENSION(:) :: DENIS + TYPE(C_PTR) ISONA_PTR,ISOMI_PTR,DENIS_PTR + TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPLIST +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(HUSE1(3,MAXISO),IMIX2(MAXISO),ITOD2(MAXISO), + & ISTY2(MAXISO),HUSE2(3,MAXISO),HNAM2(3,MAXISO),MILVO(NMIX), + & IPLIST(MAXISO)) + ALLOCATE(DENS2(MAXISO),ENER(NGRP+1)) +*---- +* MICROLIB INITIALIZATION +*---- + ITRANC=0 + DENS2(:MAXISO)=0.0 + IMIX2(:MAXISO)=0 + ITOD2(:MAXISO)=0 + ISTY2(:MAXISO)=3 + IPLIST(:MAXISO)=C_NULL_PTR + IF(IACCS.EQ.0) THEN + NBISO2=0 + NCOMB2=0 + NED2=0 + TEXT12='L_LIBRARY' + CALL LCMPTC(IPLIB,'SIGNATURE',12,TEXT12) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NMIX) CALL XABORT('PCRMIC: INVALID NUMBER OF ' + 1 //'MATERIAL MIXTURES IN THE MICROLIB.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('PCRMIC: INVALID NUMBER OF ' + 1 //'ENERGY GROUPS IN THE MICROLIB.') + NBISO2=ISTATE(2) + NCOMB2=ISTATE(12) + IF(NBISO2.GT.MAXISO) CALL XABORT('PCRMIC: MAXISO OVERFLOW(1).') + NED2=ISTATE(13) + IF(NED2.GT.MAXED) CALL XABORT('PCRMIC: MAXED OVERFLOW.') + CALL LCMGET(IPLIB,'ISOTOPESUSED',HUSE2) + CALL LCMGET(IPLIB,'ISOTOPERNAME',HNAM2) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS2) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX2) + CALL LCMGET(IPLIB,'ISOTOPESTODO',ITOD2) + CALL LCMGET(IPLIB,'ISOTOPESTYPE',ISTY2) + IF(NED2.GT.0) CALL LCMGTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMGET(IPLIB,'ENERGY',ENER) + ENDIF +*---- +* LOOP OVER MICROLIB MIXTURES +*---- + MILVO(:NMIX)=0 + NCOMB=0 + DO 190 IBM=1,NMIX + IF(.NOT.LMIXC(IBM)) GO TO 190 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('PCRMIC: MAXNIS OVERFLOW.') +*---- +* FIND THE VALUE OF NBISO1 AND HUSE1 IN MIXTURE IBM +*---- + NBISO1=1 + TEXT12='*MAC*RES' + READ(TEXT12,'(3A4)') (HUSE1(I,1),I=1,3) + IF(NXST.GT.4) THEN + NBISO1=3 + TEXT12='Xe135' + READ(TEXT12,'(3A4)') (HUSE1(I,2),I=1,3) + TEXT12='Sm149' + READ(TEXT12,'(3A4)') (HUSE1(I,3),I=1,3) + ENDIF +*---- +* LOOP OVER ELEMENTARY CALCULATIONS +*---- + CALL LCMOP(IPTMP,'*CALCULATIONS*',0,1,0) + JPTMP=LCMLID(IPTMP,'CALCULATIONS',NCAL) + DO 70 ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 70 + KPTMP=LCMDIL(JPTMP,ICAL) + CALL PCRONE(IMPX,ICAL,KPTMP,NCAL,NGRP,XS_CALC) + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(33H PCRMIC: PMAXS ACCESS FOR MIXTURE,I8,6H AND C, + 1 10HALCULATION,I8,9H. WEIGHT=,1P,E12.4)') IBM,ICAL,WEIGHT + IF(IMPX.GT.50) CALL LCMLIB(KPTMP) + ENDIF + CALL LCMGET(KPTMP,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.1) CALL XABORT('PCRMIC: INVALID NUMBER OF MATERI' + 1 //'AL MIXTURES IN THE PMAXS FILE.') + IF(ISTATE(2).NE.NBISO1) CALL XABORT('PCRMIC: INVALID NBISO1.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('PCRMIC: INVALID NUMBER OF ENE' + 1 //'RGY GROUPS IN THE COMPO.') + NL=ISTATE(4) + ITRANC=ISTATE(5) + NDEPL=0 + NED1=ISTATE(13) + NDEL=ISTATE(19) + IF(NED1.GT.MAXED) CALL XABORT('PCRMIC: MAXED OVERFLOW.') + IF(NED1.GT.0) CALL LCMGTC(KPTMP,'ADDXSNAME-P0',8,NED1,HVECT1) + CALL LCMGET(KPTMP,'ENERGY',ENER) + DO 30 IED1=1,NED1 + DO 20 IED2=1,NED2 + IF(HVECT1(IED1).EQ.HVECT2(IED2)) GO TO 30 + 20 CONTINUE + NED2=NED2+1 + HVECT2(NED2)=HVECT1(IED1) + 30 CONTINUE + CALL LCMGPD(KPTMP,'ISOTOPESUSED',ISONA_PTR) + CALL LCMGPD(KPTMP,'ISOTOPESDENS',DENIS_PTR) + CALL C_F_POINTER(ISONA_PTR,ISONA,(/ NBISO1 /)) + CALL C_F_POINTER(DENIS_PTR,DENIS,(/ NBISO1 /)) + DO 60 ISO=1,NBISO1 + WRITE(TEXT8,'(2A4)') (ISONA(3*(ISO-1)+I0),I0=1,2) + IF(TEXT8.EQ.'*MAC*RES') THEN + DENIS(ISO)=1.0 + ELSE + KSO1=0 + DO 40 KSO=1,NISO(IBM) ! user-selected isotope + WRITE(HHISO,'(2A4)') (HISO(I0,IBM,KSO),I0=1,2) + IF(TEXT8.EQ.HHISO) THEN + KSO1=KSO + GO TO 50 + ENDIF + 40 CONTINUE + 50 IF(KSO1.GT.0) DENIS(ISO)=CONC(IBM,KSO1) + ENDIF + 60 CONTINUE + CALL LCMPPD(KPTMP,'ISOTOPESDENS',NBISO1,2,DENIS_PTR) + 70 CONTINUE +*---- +* SELECT MICROLIB ISOTOPES CORRESPONDING TO PMAXS ISOTOPES +*---- + DO 90 ISO=1,NBISO1 ! PMAXS isotope + WRITE(TEXT12,'(2A4)') (HUSE1(I,ISO),I=1,2) + NBISO2=NBISO2+1 + IF(NBISO2.GT.MAXISO) THEN + WRITE(IOUT,'(/16H PCRMIC: NBISO2=,I6,8H MAXISO=,I6)') NBISO2, + 1 MAXISO + CALL XABORT('PCRMIC: MAXISO OVERFLOW(2).') + ENDIF + READ(TEXT12,'(3A4)') (HUSE2(I0,NBISO2),I0=1,3) + DO 80 I0=1,3 + HNAM2(I0,NBISO2)=HUSE1(I0,ISO) + 80 CONTINUE + IMIX2(NBISO2)=IBM + DENS2(NBISO2)=DENIS(ISO) + 90 CONTINUE + ALLOCATE(IMICR(NBISO1)) + IMICR(:NBISO1)=0 + DO 130 ISO=1,NBISO2 ! microlib isotope + IF(IMIX2(ISO).NE.IBM) GO TO 130 + DO 120 JSO=1,NBISO1 ! PMAXS isotope + IF((HUSE1(1,JSO).EQ.HUSE2(1,ISO)).AND.(HUSE1(2,JSO).EQ. + 1 HUSE2(2,ISO))) THEN + IMICR(JSO)=ISO + GO TO 130 + ENDIF + 120 CONTINUE + WRITE(TEXT12,'(3A4)') (HUSE2(I0,ISO),I0=1,3) + CALL XABORT('PCRMIC: UNABLE TO FIND '//TEXT12//'.') + 130 CONTINUE +*---- +* PROCESS ISOTOPE DIRECTORIES FOR MICROLIB MIXTURE IBM +*---- + DO 180 JSO=1,NBISO1 ! PMAXS isotope + ISO=IMICR(JSO) ! microlib isotope + IF(ISO.EQ.0) GO TO 180 + WRITE(HNAME,'(3A4)') (HUSE1(I0,JSO),I0=1,3) + CALL LCMOP(KPLIB,'*ISOTOPE*',0,1,0) + IPLIST(ISO)=KPLIB ! set isot ISO + CALL PCRISO(KPLIB,JPTMP,HNAME,JSO,NCAL,NGRP,NL,NED2,HVECT2,NDEL, + 1 IMPX,TERP(1,IBM)) + 180 CONTINUE + DEALLOCATE(IMICR) + CALL LCMCL(IPTMP,2) + 190 CONTINUE +*---- +* END OF LOOP OVER MICROLIB MIXTURES +*---- +*---- +* CREATE ISOTOPE LIST DIRECTORY IN MICROLIB +*---- + JPLIB=LCMLID(IPLIB,'ISOTOPESLIST',NBISO2) + DO 195 ISO=1,NBISO2 ! microlib isotope + IF(C_ASSOCIATED(IPLIST(ISO))) THEN + KPLIB=LCMDIL(JPLIB,ISO) ! step up isot ISO + CALL LCMEQU(IPLIST(ISO),KPLIB) + CALL LCMCL(IPLIST(ISO),2) + IPLIST(ISO)=C_NULL_PTR + ENDIF + 195 CONTINUE +*---- +* MICROLIB FINALIZATION +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=NMIX + ISTATE(2)=NBISO2 + ISTATE(3)=NGRP + ISTATE(4)=NL + ISTATE(5)=ITRANC + ISTATE(7)=1 + ISTATE(11)=NDEPL + ISTATE(12)=NCOMB+NCOMB2 + ISTATE(13)=NED2 + ISTATE(14)=NMIX + ISTATE(18)=1 + ISTATE(19)=NDEL + ISTATE(22)=MAXISO/NMIX + IF(NBISO2.EQ.0) CALL XABORT('PCRMIC: NBISO2=0.') + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPLIB,'ISOTOPESUSED',3*NBISO2,3,HUSE2) + CALL LCMPUT(IPLIB,'ISOTOPERNAME',3*NBISO2,3,HNAM2) + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESMIX',NBISO2,1,IMIX2) + IF(NED2.GT.0) CALL LCMPTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMPUT(IPLIB,'ISOTOPESTODO',NBISO2,1,ITOD2) + CALL LCMPUT(IPLIB,'ISOTOPESTYPE',NBISO2,1,ISTY2) + CALL LCMPUT(IPLIB,'ENERGY',NGRP+1,2,ENER) + IF(IMPX.GT.5) CALL LCMLIB(IPLIB) + IACCS=1 +*---- +* BUILD EMBEDDED MACROLIB +*---- + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + IF(MAXMIX.NE.NMIX) CALL XABORT('PCRMIC: INVALID NMIX.') + NBISO=ISTATE(2) + ALLOCATE(MASKL(NGRP)) + CALL LCMGPD(IPLIB,'ISOTOPESUSED',ISONA_PTR) + CALL LCMGPD(IPLIB,'ISOTOPESMIX',ISOMI_PTR) + CALL LCMGPD(IPLIB,'ISOTOPESDENS',DENIS_PTR) + CALL C_F_POINTER(ISONA_PTR,ISONA,(/ NBISO /)) + CALL C_F_POINTER(ISOMI_PTR,ISOMI,(/ NBISO /)) + CALL C_F_POINTER(DENIS_PTR,DENIS,(/ NBISO /)) + MASKL(:NGRP)=.TRUE. + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 + CALL LIBMIX(IPLIB,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS,LMIXC,MASKL, + 1 ITSTMP,TMPDAY) + DEALLOCATE(MASKL) +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(6,'(/34H PCRMIC: INCLUDE LEAKAGE IN THE MA, + 1 11HCROLIB (B2=,1P,E12.5,2H).)') B2 + CALL LCMSIX(IPLIB,'MACROLIB',1) + JPLIB=LCMGID(IPLIB,'GROUP') + ALLOCATE(GAR1(NMIX),GAR2(NMIX)) + DO 210 IGR=1,NGRP + KPLIB=LCMGIL(JPLIB,IGR) + CALL LCMGET(KPLIB,'NTOT0',GAR1) + CALL LCMGET(KPLIB,'DIFF',GAR2) + DO 200 IBM=1,NMIX + IF(LMIXC(IBM)) GAR1(IBM)=GAR1(IBM)+B2*GAR2(IBM) + 200 CONTINUE + CALL LCMPUT(KPLIB,'NTOT0',NMIX,2,GAR1) + 210 CONTINUE + DEALLOCATE(GAR2,GAR1) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ENER,DENS2) + DEALLOCATE(IPLIST,MILVO,HNAM2,HUSE2,ISTY2,ITOD2,IMIX2,HUSE1) + RETURN + END diff --git a/Donjon/src/PCRONE.f b/Donjon/src/PCRONE.f new file mode 100644 index 0000000..bb8aee2 --- /dev/null +++ b/Donjon/src/PCRONE.f @@ -0,0 +1,346 @@ +*DECK PCRONE + SUBROUTINE PCRONE(IMPX,ICAL,IPMIC,NCAL,NGRP,XS_CALC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Copy an elementary calculation of the PMAXS file into a microlib. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert and D. Calic +* +*Parameters: input +* IMPX print parameter. +* ICAL index of the elementary calculation. +* IPMIC address of the microlib. +* NCAL number of elementary calculations in the PMAXS file. +* NGRP number of energy groups. +* XS_CALC pointers towards PMAXS elementary calculations. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE PCRDATA +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IMPX,ICAL,NCAL,NGRP + TYPE(C_PTR) IPMIC + TYPE(XSBLOCK_ITEM),TARGET :: XS_CALC(NCAL) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMIC,KPMIC + INTEGER NSTATE + PARAMETER(NSTATE=40) + INTEGER ISTATE(NSTATE),ITYPR(1) + REAL DENS(3) + DOUBLE PRECISION DELTA + LOGICAL LEX + CHARACTER(LEN=8) :: HVECT(3) + CHARACTER(LEN=12) :: HNAME,HISONA(3) + CHARACTER(LEN=131) :: HSMG + TYPE(XSBLOCK_TYPE),POINTER :: XSONE,XSREF + TYPE(TH_INDEP_VAR),POINTER :: TIVONE +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: SIG1,GAR,ENERGY + REAL, ALLOCATABLE, DIMENSION(:,:) :: SIG2 +*---- +* SET SIGNATURE AND STATE VECTOR +*---- + INQUIRE(FILE='PCRONE.txt',EXIST=LEX) + IF(LEX) THEN + NUNIT=KDROPN('PCRONE.txt',1,3,0) + ELSE + NUNIT=KDROPN('PCRONE.txt',0,3,0) + ENDIF + IF(NUNIT.LE.0) THEN + WRITE(HSMG,'(28HPCRONE: KDROPN FAILURE (IER=,I5,2H).)') NUNIT + CALL XABORT(HSMG) + ENDIF + + NED=1 + HVECT(1)='H-FACTOR' + IF(NXST.GE.7) THEN + NED=2 + HVECT(2)='NFTOT' + ENDIF + IF(NXST.EQ.8) THEN + NED=3 + HVECT(3)='DETEC' + ENDIF + NBISO=1 ! number of isotopes + IF(NXST.GT.4) NBISO=3 ! include Xe and Sm + HNAME='L_LIBRARY' + CALL LCMPTC(IPMIC,'SIGNATURE',12,HNAME) + ISTATE(:)=0 + ISTATE(1)=1 + ISTATE(2)=NBISO + ISTATE(3)=NGRP + ISTATE(4)=1 ! isotropic scattering + ISTATE(13)=NED ! number of additional edits + ISTATE(19)=NDLAY ! number of delayed neutron groups + CALL LCMPUT(IPMIC,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPTC(IPMIC,'ADDXSNAME-P0',8,NED,HVECT) + JPMIC=LCMLID(IPMIC,'ISOTOPESLIST',NBISO) +* + ALLOCATE(SIG1(NGRP),SIG2(NGRP,NGRP)) + XSONE=>XS_CALC(ICAL)%XS + XSREF=>XS_CALC(XS_CALC(ICAL)%IBURN)%XS + WRITE(NUNIT,*)XS_CALC(ICAL)%IBURN + TIVONE=>XS_CALC(ICAL)%TIV + KPMIC=LCMDIL(JPMIC,1) ! step up isot 1 + HISONA(1)='*MAC*RES' + DENS(1)=1.0 + CALL LCMPTC(KPMIC,'ALIAS',12,HISONA(1)) +*---- +* PROCESS VECTORIAL CROSS SECTIONS +*---- +* 1 2 3 4 5 6 7 +* xtr,xab,xnf,xkf,xfi,xxe,xsm +*---- +* RUN ELEMENTARY CALC IN CASE THE PMAXS FILE IS GIVEN AS DERIVATIVES +*---- + IF(derivatives) THEN + DELTA=XS_CALC(ICAL)%DELTA + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,1)+DELTA*XSONE%sig(IG,1)) + ENDDO + CALL LCMPUT(KPMIC,'STRD',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,2)+SUM(XSREF%sct(IG,:))+DELTA* + 1 XSONE%sig(IG,2)+SUM(XSONE%sct(IG,:))) + ENDDO + CALL LCMPUT(KPMIC,'NTOT0',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,3)+DELTA*XSONE%sig(IG,3)) + WRITE(NUNIT,*)SIG1(IG) + ENDDO + CALL LCMPUT(KPMIC,'NUSIGF',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,4)+DELTA*XSONE%sig(IG,4)) + ENDDO + CALL LCMPUT(KPMIC,'H-FACTOR',NGRP,2,SIG1) + IF(NXST.GT.4) THEN + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,7)+DELTA*XSONE%sig(IG,7)) + ENDDO + CALL LCMPUT(KPMIC,'NFTOT',NGRP,2,SIG1) + SIG1(:NGRP)=0.0 + SIG1(1)=1.0 + CALL LCMPUT(KPMIC,'CHI',NGRP,2,SIG1) + ENDIF + IF(NXST.EQ.8) THEN + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,8)+DELTA*XSONE%sig(IG,8)) + ENDDO + CALL LCMPUT(KPMIC,'DETEC',NGRP,2,SIG1) + ENDIF + IF(lamb) THEN + ALLOCATE(GAR(ELAM-BLAM+1)) + GAR(:ELAM-BLAM+1)=REAL(TIVONE%kinp(BLAM:ELAM)) + CALL LCMPUT(KPMIC,'LAMBDA',ELAM-BLAM+1,2,GAR) + DEALLOCATE(GAR) + ENDIF + DO j=1,iXSTI + k=iTIV(j) + IF(k.GT.0) THEN + DO IG=1,NGRP + SIG1(IG)=REAL(TIVONE%sig(IG,k)) + ENDDO + IF(j.EQ.1) THEN + CALL LCMPUT(KPMIC,'CHI',NGRP,2,SIG1) + ELSE IF(j.EQ.2) THEN + CALL LCMPUT(KPMIC,'CHID',NGRP,2,SIG1) + ELSE IF(j.EQ.3) THEN + CALL LCMPUT(KPMIC,'INVEL',NGRP,2,SIG1) + ENDIF + ENDIF + ENDDO +*---- +* PROCESS SCATTERING INFORMATION (JG --> IG) +*---- + DO IG=1,NGRP + SIG1(IG)=REAL(SUM(XSREF%sct(IG,:))+DELTA*SUM(XSONE%sct(IG,:))) + DO JG=1,NGRP + SIG2(IG,JG)=REAL(XSREF%sct(JG,IG)+DELTA*XSONE%sct(JG,IG)) + ENDDO + ENDDO + ITYPR(1)=1 + CALL XDRLGS(KPMIC,1,IMPX,0,0,1,NGRP,SIG1,SIG2,ITYPR) + IF(IMPX.GT.5) CALL LCMLIB(KPMIC) +*---- +* PROCESS Xe and Sm +*---- + IF(NXST.GT.4) THEN + KPMIC=LCMDIL(JPMIC,2) ! step up isot 2 + HISONA(2)='Xe135' + DENS(2)=0.0 + CALL LCMPTC(KPMIC,'ALIAS',12,HISONA(2)) + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,5)+DELTA*XSONE%sig(IG,5)) + ENDDO + CALL LCMPUT(KPMIC,'NTOT0',NGRP,2,SIG1) + CALL LCMPUT(KPMIC,'STRD',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=0.0 + DO JG=1,NGRP + SIG2(IG,JG)=0.0 + ENDDO + ENDDO + ITYPR(1)=1 + CALL XDRLGS(KPMIC,1,IMPX,0,0,1,NGRP,SIG1,SIG2,ITYPR) + KPMIC=LCMDIL(JPMIC,3) ! step up isot 3 + HISONA(3)='Sm149' + DENS(3)=0.0 + CALL LCMPTC(KPMIC,'ALIAS',12,HISONA(3)) + DO IG=1,NGRP + SIG1(IG)=REAL(XSREF%sig(IG,6)+DELTA*XSONE%sig(IG,6)) + ENDDO + CALL LCMPUT(KPMIC,'NTOT0',NGRP,2,SIG1) + CALL LCMPUT(KPMIC,'STRD',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=0.0 + DO JG=1,NGRP + SIG2(IG,JG)=0.0 + ENDDO + ENDDO + ITYPR(1)=1 + CALL XDRLGS(KPMIC,1,IMPX,0,0,1,NGRP,SIG1,SIG2,ITYPR) + ENDIF + CALL LCMPTC(IPMIC,'ISOTOPESUSED',12,NBISO,HISONA) + CALL LCMPUT(IPMIC,'ISOTOPESDENS',NBISO,2,DENS) + DEALLOCATE(SIG2,SIG1) + ELSE +*---- +* RUN ELEMENTARY CALC IN CASE THE PMAXS FILE IS GIVEN AS RAW CROSS +* SECTIONS +*---- + DELTA=XS_CALC(ICAL)%DELTA + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,1)) + ENDDO + CALL LCMPUT(KPMIC,'STRD',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,2)+SUM(XSONE%sct(IG,:))) + ENDDO + CALL LCMPUT(KPMIC,'NTOT0',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,3)) + WRITE(NUNIT,*)XSONE%sig(IG,3) + ENDDO + CALL LCMPUT(KPMIC,'NUSIGF',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,4)) + ENDDO + CALL LCMPUT(KPMIC,'H-FACTOR',NGRP,2,SIG1) + IF(NXST.GT.4) THEN + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,7)) + ENDDO + CALL LCMPUT(KPMIC,'NFTOT',NGRP,2,SIG1) + SIG1(:NGRP)=0.0 + SIG1(1)=1.0 + CALL LCMPUT(KPMIC,'CHI',NGRP,2,SIG1) + ENDIF + IF(NXST.EQ.8) THEN + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,8)) + ENDDO + CALL LCMPUT(KPMIC,'DETEC',NGRP,2,SIG1) + ENDIF + IF(lamb) THEN + ALLOCATE(GAR(ELAM-BLAM+1)) + GAR(:ELAM-BLAM+1)=REAL(TIVONE%kinp(BLAM:ELAM)) + CALL LCMPUT(KPMIC,'LAMBDA',ELAM-BLAM+1,2,GAR) + DEALLOCATE(GAR) + ENDIF + DO j=1,iXSTI + k=iTIV(j) + IF(k.GT.0) THEN + DO IG=1,NGRP + SIG1(IG)=REAL(TIVONE%sig(IG,k)) + ENDDO + IF(j.EQ.1) THEN + CALL LCMPUT(KPMIC,'CHI',NGRP,2,SIG1) + ELSE IF(j.EQ.2) THEN + CALL LCMPUT(KPMIC,'CHID',NGRP,2,SIG1) + ELSE IF(j.EQ.3) THEN + CALL LCMPUT(KPMIC,'INVEL',NGRP,2,SIG1) + ENDIF + ENDIF + ENDDO +*---- +* PROCESS SCATTERING INFORMATION +*---- + DO IG=1,NGRP + SIG1(IG)=REAL(SUM(XSONE%sct(IG,:))) + DO JG=1,NGRP + SIG2(IG,JG)=REAL(XSONE%sct(JG,IG)) ! JG --> IG + ENDDO + ENDDO + ITYPR(1)=1 + CALL XDRLGS(KPMIC,1,IMPX,0,0,1,NGRP,SIG1,SIG2,ITYPR) + IF(IMPX.GT.5) CALL LCMLIB(KPMIC) +*---- +* PROCESS Xe and Sm +*---- + IF(NXST.GT.4) THEN + KPMIC=LCMDIL(JPMIC,2) ! step up isot 2 + HISONA(2)='Xe135' + DENS(2)=0.0 + CALL LCMPTC(KPMIC,'ALIAS',12,HISONA(2)) + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,5)) + ENDDO + CALL LCMPUT(KPMIC,'NTOT0',NGRP,2,SIG1) + CALL LCMPUT(KPMIC,'STRD',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=0.0 + DO JG=1,NGRP + SIG2(IG,JG)=0.0 + ENDDO + ENDDO + ITYPR(1)=1 + CALL XDRLGS(KPMIC,1,IMPX,0,0,1,NGRP,SIG1,SIG2,ITYPR) + KPMIC=LCMDIL(JPMIC,3) ! step up isot 3 + HISONA(3)='Sm149' + DENS(3)=0.0 + CALL LCMPTC(KPMIC,'ALIAS',12,HISONA(3)) + DO IG=1,NGRP + SIG1(IG)=REAL(XSONE%sig(IG,6)) + ENDDO + CALL LCMPUT(KPMIC,'NTOT0',NGRP,2,SIG1) + CALL LCMPUT(KPMIC,'STRD',NGRP,2,SIG1) + DO IG=1,NGRP + SIG1(IG)=0.0 + DO JG=1,NGRP + SIG2(IG,JG)=0.0 + ENDDO + ENDDO + ITYPR(1)=1 + CALL XDRLGS(KPMIC,1,IMPX,0,0,1,NGRP,SIG1,SIG2,ITYPR) + ENDIF + CALL LCMPTC(IPMIC,'ISOTOPESUSED',12,NBISO,HISONA) + CALL LCMPUT(IPMIC,'ISOTOPESDENS',NBISO,2,DENS) + DEALLOCATE(SIG2,SIG1) + ENDIF + CLOSE(NUNIT) +*---- +* SET ENERGY MESH +*---- + ALLOCATE(ENERGY(NGRP+1)) + IF(NGRP.EQ.2) THEN + ENERGY(:)=(/ 1.964E7, 6.25E-1, 1.1E-4 /) + ELSE + CALL XABORT('PCRONE: UNKNOWN ENERGY MESH') + ENDIF + CALL LCMPUT(IPMIC,'ENERGY',NGRP+1,2,ENERGY) + DEALLOCATE(ENERGY) + RETURN + END diff --git a/Donjon/src/PCRRGR.f b/Donjon/src/PCRRGR.f new file mode 100644 index 0000000..85dfecb --- /dev/null +++ b/Donjon/src/PCRRGR.f @@ -0,0 +1,860 @@ +*DECK PCRRGR + SUBROUTINE PCRRGR(IPMAP,LCUBIC,NMIX,IMPX,NCAL,NCH,NB,NFUEL, + 1 NPARM,ITER,MAXNIS,TERP,NISO,HISO,CONC,LMIXC,XS_CALC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for PMAXS file interpolation. Use global and +* local parameters from a fuel-map object and optional user-defined +* values. +* +*Copyright: +* Copyright (C) 2019 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* 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 printing index (=0 for no print). +* NCAL number of elementary calculations in the PMAXS 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 +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another PMAXS file; +* =2 use another L_MAP + PMAXS file). +* MAXNIS maximum value of NISO(I) in user data. +* TERP interpolation factors. +* NISO number of user-selected isotopes. +* HISO name of the user-selected isotopes. +* CONC user-defined number density of the user-selected isotopes. +* LMIXC flag set to .true. for fuel-map mixtures to process. +* XS_CALC pointers towards PMAXS elementary calculations. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE PCRDATA + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXISD=400 + TYPE(C_PTR) IPMAP + INTEGER NMIX,IMPX,NCAL,NFUEL,NCH,NB,ITER,MAXNIS,NPARM, + 1 HISO(2,NMIX,MAXISD),NISO(NMIX) + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXISD) + LOGICAL LCUBIC,LMIXC(NMIX) + TYPE(XSBLOCK_ITEM) XS_CALC(NCAL) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXADD=10 + INTEGER, PARAMETER::MAXLIN=50 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + REAL, PARAMETER::REPS=1.0E-4 + REAL BURN0, BURN1, FLOTT, SUM, VALR1, VALR2, VARVAL + INTEGER I0, IBM, IBTYP, IB, ICAL, ICH, IFUEL, ILONG, IMIX, + & IMPY, INDIC, IPAR, ISO, ITYPE, ITYP, IVARTY, I, JBM, JB, + & JCAL, JPARM, JPAR, J, NCOMLI, NISOMI, NITMA, NPARMP, NPAR, + & NTOT, N, IBRA, IBSET, NBURN, IND, II, INDELT, NNV + CHARACTER TEXT12*12,PARKEY(MAXPAR)*12,HSMG*131,RECNAM*12, + 1 COMMEN(MAXLIN)*80,PARNAM*12,HCUBIC*12,HNAVAL*12 + INTEGER NVALUE(MAXPAR),MUPLET(MAXPAR),MUTYPE(MAXPAR), + 1 MAPLET(MAXPAR,MAXADD),MATYPE(MAXPAR,MAXADD),IDLTA(MAXPAR,MAXADD), + 2 NDLTA(MAXPAR),IDLTA1,MUPLT2(MAXPAR),MUTYP2(MAXPAR), + 3 HISOMI(2,MAXISD) + DOUBLE PRECISION DFLOTT + REAL VALR(MAXPAR,2),VREAL(MAXVAL,MAXPAR),CONCMI(MAXISD), + 1 VALRA(MAXPAR,2,MAXADD) + LOGICAL LDELT(MAXPAR),LDELT1,LSET(MAXPAR),LADD(MAXPAR), + 1 LSET1,LADD1,LDMAP(MAXPAR,2),LAMAP(MAXPAR,2,MAXADD), + 2 LCUB2(MAXPAR),LTST + TYPE(C_PTR) JPMAP,KPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: FMIX,ZONEC + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ZONEDP,MUBASE + REAL, ALLOCATABLE, DIMENSION(:) :: BRN0,BRN1,VARC,TERPA + REAL, ALLOCATABLE, DIMENSION(:,:) :: WPAR + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LPARM,LDELTA + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HPAR +*---- +* 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(LPARM(NPARM+1),FMIX(NCH*NB),ZONEDP(NCH,NB), + 1 ZONEC(NCH),BRN0(NCH*NB),BRN1(NCH*NB),WPAR(NCH*NB,NPARM), + 2 LDELTA(NMIX),HPAR(NPARM+1)) +*---- +* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE PMAXS FILE. THE I-TH +* PMAXS FILE INFORMATION CORRESPONDS TO POINTERS bran_i and PMAX. +*---- + NPAR=bran_i%Nstat_var + NVALUE(:NPAR)=0 + DO IPAR=1,bran_i%Nstat_var + PARKEY(IPAR)=bran_i%var_nam(IPAR) + ENDDO + IF(PMAX%NBset.GT.0) THEN + NPAR=NPAR+1 + PARKEY(NPAR)='B' + NVALUE(NPAR)=PMAX%Bset(1)%NBURN + NNV=NVALUE(NPAR) + VREAL(:NNV,NPAR)=REAL(PMAX%Bset(1)%burns(:NNV)) + VREAL(:NNV,NPAR)=REAL(PMAX%Bset(1)%burns(:NNV))*1000.0 + ENDIF + IF(NPAR.GT.MAXPAR) CALL XABORT('PCRRGR: MAXPAR OVERFLOW.') + IF(NHST.NE.1) CALL XABORT('PCRRGR: MULTIPLE HISTORY CASE NOT IMP' + 1 //'LEMENTED.') + NCOMLI=6 + COMMEN(:6)=hcomment(:6) + DO IBRA=1,NBRA + DO IPAR=1,bran_i%Nstat_var + FLOTT=REAL(bran_i%state(IPAR,IBRA)) + IF(PARKEY(IPAR).EQ.'TF') FLOTT=(FLOTT**2)-273.15 + IF(NVALUE(IPAR).EQ.0) THEN + NVALUE(IPAR)=1 + VREAL(1,IPAR)=FLOTT + ELSE + DO I=1,NVALUE(IPAR) + IF(FLOTT.EQ.VREAL(I,IPAR)) THEN + GO TO 10 + ELSE IF(FLOTT.LT.VREAL(I,IPAR)) THEN + DO J=NVALUE(IPAR),I,-1 + VREAL(J+1,IPAR)=VREAL(J,IPAR) + ENDDO + VREAL(I,IPAR)=FLOTT + NVALUE(IPAR)=NVALUE(IPAR)+1 + GO TO 10 + ENDIF + ENDDO + IF(FLOTT.GT.VREAL(NVALUE(IPAR),IPAR)) THEN + NVALUE(IPAR)=NVALUE(IPAR)+1 + VREAL(NVALUE(IPAR),IPAR)=FLOTT + ENDIF + ENDIF + 10 CONTINUE + ENDDO + ENDDO + IF((IMPX.GT.0).AND.(bran_i%Nstat_var.GT.0))THEN + DO IPAR=1,NPAR + WRITE(RECNAM,'(''pval'',I8.8)') IPAR + WRITE(IOUT,'(13H PCRRGR: KEY=,A,18H TABULATED POINTS=, + 1 1P,6E12.4/(43X,6E12.4))') PARKEY(IPAR),(VREAL(I,IPAR),I=1, + 2 NVALUE(IPAR)) + ENDDO + ENDIF +*---- +* PRINT PMAXS FILE AND FUELMAP STATISTICS +*---- + IF(IMPX.GT.0) THEN + WRITE(IOUT,'(43H PCRRGR: NUMBER OF CALCULATIONS IN PMAXS FI, + 1 3HLE=,I6)') NCAL + WRITE(IOUT,'(43H PCRRGR: NUMBER OF MATERIAL MIXTURES IN FUE, + 1 6HL MAP=,I6)') NMIX + WRITE(IOUT,'(43H PCRRGR: NUMBER OF LOCAL VARIABLES INCLUDIN, + 1 9HG BURNUP=,I6)') NPAR + WRITE(IOUT,'(28H PCRRGR: PMAXS FILE COMMENTS,60(1H-))') + WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI) + WRITE(IOUT,'(9H PCRRGR: ,79(1H-))') + ENDIF +*---- +* SCAN THE PMAXS FILE INFORMATION TO RECOVER THE MUPLET DATABASE +*---- + IF(IMPX.GT.5) THEN + WRITE(IOUT,'(24H PCRRGR: MUPLET DATABASE/12H CALCULATION,4X, + 1 6HMUPLET)') + WRITE(IOUT,'(16X,20A4)') PARKEY(:NPAR) + ENDIF + ALLOCATE(MUBASE(NPAR,NCAL)) + ICAL=0 + DO IBRA=1,NBRA + INDELT=0 + DO IPAR=1,NPAR + IF(bran_i%state_nam(IBRA).EQ.PARKEY(IPAR)) THEN + INDELT=IPAR + CYCLE + ENDIF + ENDDO + IBSET=PMAX%BRANCH(IBRA,1)%IBSET + NBURN=PMAX%Bset(IBSET)%NBURN + DO IPAR=1,bran_i%Nstat_var + FLOTT=REAL(bran_i%state(IPAR,IBRA)) + IF(PARKEY(IPAR).EQ.'TF') FLOTT=(FLOTT**2)-273.15 + IND=0 + DO I=1,NVALUE(IPAR) + IF(FLOTT.EQ.VREAL(I,IPAR)) THEN + IND=I + EXIT + ENDIF + ENDDO + IF(IND.EQ.0) THEN + CALL XABORT('PCRRGR: MUPLET ALGORITHM FAILURE.') + ELSE + MUPLET(IPAR)=IND + ENDIF + ENDDO + IF((NBURN.EQ.PMAX%Bset(1)%NBURN).OR.(NBURN.EQ.1)) THEN + DO I=1,NBURN + MUPLET(bran_i%Nstat_var+1)=I + II=ICAL+I + MUBASE(:bran_i%Nstat_var+1,II)=MUPLET(:bran_i%Nstat_var+1) + XS_CALC(ICAL+I)%IBURN=I + XS_CALC(ICAL+I)%XS=>PMAX%BRANCH(IBRA,1)%XS(I) + XS_CALC(ICAL+I)%TIV=>PMAX%TIVB(1)%TIV(I) + IF(INDELT.GT.0) THEN + XS_CALC(ICAL+I)%DELTA=bran_i%state(INDELT,IBRA)- + 1 bran_i%state(INDELT,1) + ELSE + XS_CALC(ICAL+I)%DELTA=0.0 + ENDIF + ENDDO + ELSE + CALL XABORT('PCRRGR: INVALID VALUE OF NBURN.') + ENDIF + IF(IMPX.GT.5) THEN + DO I=ICAL+1,ICAL+NBURN + WRITE(IOUT,'(I8,2X,A2,2X,20I4/(14X,20I4))') I, + 1 bran_i%state_nam(IBRA),MUBASE(:NPAR,I) + ENDDO + ENDIF + ICAL=ICAL+NBURN + ENDDO !IBRA + IF(ICAL.NE.NCAL) CALL XABORT('PCRRGR: MUPLET ALGORITHM FAILURE.') +*---- +* READ (INTERP_DATA) AND SET VALR PARAMETERS CORRESPONDING TO THE +* INTERPOLATION POINT. FILL MUPLET FOR PARAMETERS SET WITHOUT +* INTERPOLATION. +*---- + IBM=0 + MAXNIS=0 + NISOMI=0 + LDELT1=.FALSE. + LADD1=.FALSE. + NISO(:NMIX)=0 + LDELTA(:NMIX)=.FALSE. + IDLTA1=0 + DO I=1,MAXPAR + LSET(I)=.FALSE. + LDELT(I)=.FALSE. + LADD(I)=.FALSE. + LDMAP(I,:2)=.FALSE. + LAMAP(I,:2,:MAXADD)=.FALSE. + NDLTA(I)=0 + ENDDO + TERP(:NCAL,:NMIX)=0.0 + LMIXC(:NMIX)=.FALSE. +*---- +* ADD THE PARKEY NAME OF THE BURNUP FOR THIS PMAX FILE. +*---- + NPARMP=NPARM+1 + HPAR(NPARMP)='B' +*---- +* MAIN LOOP OF THE SUBROUTINE (UNTIL THE END) +*---- + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('PCRRGR: CHARACTER DATA EXPECTED(2).') + 30 IF(TEXT12.EQ.'MIX')THEN + NISOMI=0 + IVARTY=0 + IBTYP=0 + HNAVAL=' ' + MUPLET(:NPAR)=0 + MUTYPE(: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,MAXPAR + LSET(I)=.FALSE. + LDELT(I)=.FALSE. + LADD(I)=.FALSE. + LDMAP(I,:2)=.FALSE. + LAMAP(I,:2,:MAXADD)=.FALSE. + ENDDO + LCUB2(:NPAR)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('PCRRGR: 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,*)'PCRRGR: UNABLE TO FIND FUEL MIXTURE ',IBM + CALL XABORT('PCRRGR: WRONG MIXTURE NUMBER.') + 50 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('PCRRGR: CHARACTER DATA EXPECTED(3).') + GOTO 30 + ELSEIF(TEXT12.EQ.'MICRO')THEN + IF(IBM.EQ.0) CALL XABORT('PCRRGR: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('PCRRGR: CHARACTER DATA EXPECTED(5).') + 60 IF(TEXT12.EQ.'ENDMIX')THEN + GOTO 30 + ELSE + NISOMI=NISOMI+1 + IF(NISOMI.GT.MAXISD) CALL XABORT('PCRRGR: MAXISD OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISOMI) + READ(TEXT12,'(2A4)') (HISOMI(I0,NISOMI),I0=1,2) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2)THEN + CONCMI(NISOMI)=FLOTT + ELSE + CALL XABORT('PCRRGR: INVALID HISO DATA.') + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('PCRRGR: CHARACTER DATA EXPECTED.') + GOTO 60 + ENDIF + ELSEIF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA').OR. + 1 (TEXT12.EQ.'ADD'))THEN + IF(IBM.EQ.0) CALL XABORT('PCRRGR: MIX NOT SET (2).') + ITYPE=0 + LSET1=.FALSE. + LDELT1=.FALSE. + LADD1=.FALSE. + 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('PCRRGR: CHARACTER DATA EXPECTED(7).') + 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('PCRRGR: CHARACTER DATA EXPECTED(8).') + IPAR=-99 + DO I=1,NPAR + IF(TEXT12.EQ.PARKEY(I))THEN + IPAR=I + PARNAM=TEXT12 + GOTO 70 + ENDIF + ENDDO + WRITE(HSMG,'(18HPCRRGR: 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 + IF((IPAR.GT.NPAR).OR.(IPAR.LE.NPAR))THEN + 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('PCRRGR: 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('PCRRGR: 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('PCRRGR: 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('PCRRGR: 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,IPAR)).LE.REPS* + 1 ABS(VREAL(J,IPAR)))THEN + MUPLET(IPAR)=J + GOTO 30 + ENDIF + ENDDO + ENDIF +*---- +* ERRORS HANDLING +*---- + IF(VALR1.LT.VREAL(1,IPAR))THEN +* OUTSIDE OF THE DOMAIN (1) + WRITE(HSMG,'(23HPCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(1))') PARNAM,VALR1 + WRITE(6,*)'Domain:',VREAL(1,IPAR),' <-> ', + 1 VREAL(NVALUE(IPAR),IPAR) + CALL XABORT(HSMG) + ELSEIF(VALR2.GT.VREAL(NVALUE(IPAR),IPAR))THEN +* OUTSIDE OF THE DOMAIN (2) + WRITE(HSMG,'(23HPCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(2))') PARNAM,VALR2 + WRITE(6,*)'Domain:',VREAL(1,IPAR),' <-> ', + 1 VREAL(NVALUE(IPAR),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,'(23HPCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(1))') PARNAM, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF + IF((LADD1).AND.(TEXT12.EQ.'REF'))THEN + 120 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('PCRRGR: 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 + MAPLET(IPAR,IDLTA1)=-1 + MATYPE(IPAR,IDLTA1)=1 + DO J=1,NVALUE(IPAR) + IF(ABS(VALRA(IPAR,1,IDLTA1)-VREAL(J,IPAR)).LE. + 1 REPS*ABS(VREAL(J,IPAR)))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('PCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 120 + 140 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ELSE IF((LDELT1).AND.(TEXT12.EQ.'REF'))THEN + 150 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('PCRRGR: 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 + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=1 + DO J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J,IPAR)).LE.REPS* + 1 ABS(VREAL(J,IPAR)))THEN + MUPLET(IPAR)=J + GOTO 150 + ENDIF + ENDDO + ELSEIF(TEXT12.EQ.'SAMEASREF')THEN + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=-1 + ELSE + CALL XABORT('PCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 150 + 170 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + GOTO 30 + ENDIF + ELSEIF(TEXT12.EQ.'TIMAV-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('PCRRGR: MIX NOT SET (3).') + IBTYP=1 + ELSEIF(TEXT12.EQ.'INST-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('PCRRGR: MIX NOT SET (4).') + IBTYP=2 + ELSEIF(TEXT12.EQ.'AVG-EX-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('PCRRGR: MIX NOT SET (5).') + IBTYP=3 + CALL REDGET(INDIC,IVARTY,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('PCRRGR: INTEGER DATA EXPECTED.') + ELSEIF(TEXT12.EQ.'ENDMIX')THEN +*---- +* RECOVER FUEL-MAP INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H PCRRGR: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H PCRRGR: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') PARKEY(IPAR) + 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('PCRRGR: 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('PCRRGR: 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=-99 + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + IF(LSET(IPAR)) THEN + WRITE(6,*) 'L_MAP values overwritten by the SET option' + 1 // ' 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 + IPAR=-99 + IF(FMIX(IB).EQ.IBM)THEN + IF(NTOT.GT.NMIX) CALL XABORT('PCRRGR: NMIX OVERFLOW.') + DO 260 JPARM=1,NPARMP + IF(.NOT.LPARM(JPARM))GOTO 260 + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + PARNAM=HPAR(JPARM) + GOTO 190 + ENDIF + ENDDO + WRITE(HSMG,'(18HPCRRGR: PARAMETER ,A,14H NOT FOUND(4).)') + 1 HPAR(JPARM) + CALL XABORT(HSMG) + 190 CONTINUE + 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 + IF(ITYPE.EQ.1)THEN + IF(VALR1.EQ.VALR2)THEN + DO J=1,NVALUE(IPAR) + IF(ABS(VALR1-VREAL(J,IPAR)).LE.REPS*ABS(VREAL(J,IPAR)))THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GOTO 260 + ENDIF + ENDDO + ENDIF + ENDIF +*---- +* ERRORS HANDLING +*---- + IF(VALR1.LT.VREAL(1,IPAR))THEN +* OUTSIDE OF THE DOMAIN (1) + WRITE(HSMG,'(23HPCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(3).)') PARNAM,VALR1 + WRITE(6,*)'Domain:',VREAL(1,IPAR),' <-> ', + 1 VREAL(NVALUE(IPAR),IPAR) + CALL XABORT(HSMG) + ELSEIF(VALR2.GT.VREAL(NVALUE(IPAR),IPAR))THEN +* OUTSIDE OF THE DOMAIN (2) + WRITE(HSMG,'(23HPCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(4).)') PARNAM,VALR2 + WRITE(6,*)'Domain:',VREAL(1,IPAR),' <-> ', + 1 VREAL(NVALUE(IPAR),IPAR) + CALL XABORT(HSMG) + ELSEIF((ITYPE.EQ.1).AND.(VALR1.GT.VALR2))THEN +* VALR1 > VALR2 + WRITE(HSMG,'(23HPCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(2))') PARNAM, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + 260 CONTINUE + LMIXC(NTOT)=.TRUE. + IF(IMPY.GT.2) WRITE(6,'(32H PCRRGR: COMPUTE TERP FACTORS IN, + 1 17H FUEL-MAP MIXTURE,I5,1H.)') NTOT + NISO(NTOT)=NISOMI + LDELTA(NTOT)=LDELT1 + DO ISO=1,NISOMI + HISO(1,NTOT,ISO)=HISOMI(1,ISO) + HISO(2,NTOT,ISO)=HISOMI(2,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 PCRTRP(LCUB2,IMPY,NPAR,NCAL,NVALUE,MUPLT2, + 1 MUTYPE,VALR(1,1),VARVAL,MUBASE,VREAL, + 2 TERP(1,NTOT)) + ELSE + TERP(:NCAL,NTOT)=0.0 + ENDIF + ELSE + CALL PCRTRP(LCUB2,IMPY,NPAR,NCAL,NVALUE,MUPLT2, + 1 MUTYPE,VALR(1,1),VARVAL,MUBASE,VREAL, + 2 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 PCRTRP(LCUB2,IMPY,NPAR,NCAL,NVALUE,MUPLT2, + 1 MUTYP2,VALRA(1,1,IDLTA1),VARVAL,MUBASE,VREAL, + 2 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.GT.NMIX) CALL XABORT('PCRRGR: ALGORITHM FAILURE.') + IBM=0 + ELSEIF((TEXT12.EQ.'PMAXS').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.'PMAXS') ITER=1 + IF(TEXT12.EQ.'TABLE') ITER=2 + IF(TEXT12.EQ.'CHAIN') ITER=3 + DO 300 IBM=1,NMIX + IF(.NOT.LMIXC(IBM)) GO TO 300 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('PCRRGR: 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,'(43HPCRRGR: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 300 CONTINUE +*---- +* EXIT MAIN LOOP OF THE SUBROUTINE +*---- + GO TO 310 + ELSE + CALL XABORT('PCRRGR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GOTO 20 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 310 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H PCRRGR: 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 +*---- + DEALLOCATE(MUBASE) + DEALLOCATE(HPAR,LDELTA,WPAR,BRN1,BRN0,ZONEC,ZONEDP,FMIX,LPARM) + RETURN + 320 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/PCRTRP.f b/Donjon/src/PCRTRP.f new file mode 100644 index 0000000..a19ba85 --- /dev/null +++ b/Donjon/src/PCRTRP.f @@ -0,0 +1,189 @@ +*DECK PCRTRP + SUBROUTINE PCRTRP(LCUB2,IMPX,NPAR,NCAL,NVALUE,MUPLET,MUTYPE,VALR, + 1 VARVAL,MUBASE,VREAL,TERP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the TERP interpolation/derivation/integration factors using +* table-of-content information of the PMAXS file. +* +*Copyright: +* Copyright (C) 2018 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* 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 parameters. +* NCAL number of elementary calculations in the PMAXS file. +* NVALUE number of tabulation values for each parameter. +* MUPLET tuple used to identify an elementary calculation. +* MUTYPE type of interpolation (=1: interpolation; =2: delta-sigma). +* VALR real values of the interpolated point. +* VARVAL exit burnup used if MUTYPE(IPAR(ID))=3. +* MUBASE muplet database. +* VREAL local parameter values at tabulation points. +* +*Parameters: output +* TERP interpolation factors. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXVAL=200 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER IMPX,NPAR,NCAL,NVALUE(NPAR),MUPLET(NPAR),MUTYPE(NPAR), + 1 MUBASE(NPAR,NCAL) + REAL VALR(MAXPAR,2),VARVAL,VREAL(MAXVAL,MAXPAR),TERP(NCAL) + LOGICAL LCUB2(NPAR) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXDIM=10 + INTEGER IPAR(MAXDIM),NVAL(MAXDIM),IDDIV(MAXDIM) + REAL T1D(MAXVAL,MAXDIM),WORK(MAXVAL) + REAL BURN0, BURN1, DENOM, TERTMP + INTEGER ICAL, IDTMP, IDTOT, ID, I, JD, NDELTA, NDIM, NID, NTOT, + 1 IIPAR, MCRCAL + CHARACTER HSMG*131,RECNAM*12 + LOGICAL LCUBIC,LSINGL +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: TERPA +*---- +* 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,'(7HPCRTRP:,I4,29H-DIMENSIONAL INTERPOLATION NO, + 1 14HT IMPLEMENTED.)') NDIM + CALL XABORT(HSMG) + ENDIF + IPAR(NDIM)=I + ENDIF + 10 CONTINUE + IF(IMPX.GT.2) THEN + WRITE(IOUT,'(16H PCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(8H PCRTRP:,I4,27H-DIMENSIONAL INTERPOLATION.)') + 1 NDIM + ENDIF + IF(NDIM.EQ.0) THEN + ICAL=MCRCAL(NPAR,NCAL,MUPLET,MUBASE) + IF(ICAL.GT.NCAL) CALL XABORT('PCRTRP: 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 + IIPAR=IPAR(ID) + NID=NVALUE(IIPAR) + NTOT=NTOT*NID + DO 15 IDTMP=1,NDIM-ID + IDDIV(IDTMP)=IDDIV(IDTMP)*NID + 15 CONTINUE + BURN0=VALR(IIPAR,1) + BURN1=VALR(IIPAR,2) + LSINGL=(BURN0.EQ.BURN1) + LCUBIC=LCUB2(IIPAR) + IF((MUTYPE(IIPAR).EQ.1).AND.LSINGL) THEN + CALL ALTERP(LCUBIC,NID,VREAL(1,IIPAR),BURN0,.FALSE., + 1 T1D(1,ID)) + ELSE IF(MUTYPE(IIPAR).EQ.1) THEN + IF(BURN0.GE.BURN1) CALL XABORT('@PCRTRP: INVALID BURNUP' + 1 //' LIMITS(1).') + CALL ALTERI(LCUBIC,NID,VREAL(1,IIPAR),BURN0,BURN1,T1D(1,ID)) + DO 20 I=1,NID + T1D(I,ID)=T1D(I,ID)/(BURN1-BURN0) + 20 CONTINUE + ELSE IF((MUTYPE(IIPAR).EQ.2).AND.(.NOT.LSINGL)) THEN + CALL ALTERP(LCUBIC,NID,VREAL(1,IIPAR),BURN0,.FALSE.,WORK(1)) + CALL ALTERP(LCUBIC,NID,VREAL(1,IIPAR),BURN1,.FALSE.,T1D(1,ID)) + DO 30 I=1,NID + T1D(I,ID)=T1D(I,ID)-WORK(I) + 30 CONTINUE + ELSE IF((MUTYPE(IIPAR).EQ.2).AND.(LSINGL)) THEN + T1D(:NID,ID)=0.0 + ELSE IF(MUTYPE(IIPAR).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('@PCRTRP: INVALID BURNUP' + 1 //' LIMITS(2).') + IF(RECNAM.NE.'BURN') CALL XABORT('@PCRTRP: BURN EXPECTED.') + ALLOCATE(TERPA(NID)) + CALL ALTERI(LCUBIC,NID,VREAL(1,IIPAR),BURN0,BURN1,TERPA(1)) + DO 40 I=1,NID + T1D(I,ID)=-TERPA(I) + 40 CONTINUE + CALL ALTERP(LCUBIC,NID,VREAL(1,IIPAR),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(1,IIPAR),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('PCRTRP: INVALID OPTION.') + ENDIF + 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 + ICAL=MCRCAL(NPAR,NCAL,MUPLET,MUBASE) + IF(ICAL.GT.NCAL) CALL XABORT('PCRTRP: 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 PCRTRP: TERP PARAMETERS:/(1X,1P,10E12.4))') + 1 (TERP(I),I=1,NCAL) + ENDIF + RETURN +*---- +* MISSING ELEMENTARY CALCULATION EXCEPTION. +*---- + 200 WRITE(IOUT,'(16H PCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + CALL XABORT('PCRTRP: MISSING ELEMENTARY CALCULATION.') + 210 WRITE(IOUT,'(16H PCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + CALL XABORT('PCRTRP: DEGENERATE ELEMENTARY CALCULATION.') + END diff --git a/Donjon/src/PKIDRV.f b/Donjon/src/PKIDRV.f new file mode 100644 index 0000000..fc3dcad --- /dev/null +++ b/Donjon/src/PKIDRV.f @@ -0,0 +1,182 @@ +*DECK PKIDRV + SUBROUTINE PKIDRV(IPMAP,NALPHA,NGROUP,LAMBDA,EPSILON,BETAI, + 1 LAMBDAI,DT,PARAMI,PARAMB,T,Y) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solution of the point kinetic equations using the Runge-Kutta method. +* +*Copyright: +* Copyright (C) 2017 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 +* IPMAP pointer to the point kinetic directory +* NALPHA number of feedback parameters +* NGROUP number of delayed precursor groups +* LAMBDA prompt neutron generation time +* EPSILON Runge-Kutta epsilon +* BETAI delayed neutron fraction vector +* LAMBDAI delayed neutron time constant vector +* DT stage duration (double precision value) +* PARAMI initial values of the global parameters corresponding to +* RHO=0 +* PARAMB values of global parameters at beginning of stage +* T time at beggining of stage (double precision value) +* Y solution of the point kinetic equations at beginning of stage +* +*Parameters: ouput +* PARAMB values of global parameters at end of stage +* T time at end of stage +* Y solution of the point kinetic equations at end of stage +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* Subroutine arguments +*---- + TYPE(C_PTR) IPMAP + INTEGER NALPHA,NGROUP + REAL LAMBDA,EPSILON,BETAI(NGROUP),LAMBDAI(NGROUP),PARAMI(NALPHA), + 1 PARAMB(NALPHA) + DOUBLE PRECISION DT,T,Y(NGROUP+1) +*---- +* Local variables +*---- + PARAMETER(NRKMIN=100,NRKMAX=100000) + DOUBLE PRECISION DH,DPP,P0,T1,BETA,MAXI,RHO(3) + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: YSAV,YSUM,Y1,Y2, + 1 Y3,Y4 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: A +*---- +* Scratch storage allocation +*---- + ALLOCATE(YSAV(NGROUP+1),YSUM(NGROUP+1),Y1(NGROUP+1),Y2(NGROUP+1), + 1 Y3(NGROUP+1),Y4(NGROUP+1),A(NGROUP+1,NGROUP+1)) +*---- +* Runge-Kutta and calcul parameters initialisation +*---- + DPP=1.D0 + NRK=NRKMIN + P0=-1.D0 +*---- +* Set the Runge-Kutta evolution matrix +*---- + BETA=0.D0 + DO I=1,NGROUP + BETA=BETA+BETAI(I) + ENDDO + A(:NGROUP+1,:NGROUP+1)=0.0D0 + DO I=2,NGROUP+1 + A(I,1)=BETAI(I-1)/LAMBDA + ENDDO + DO I=2,NGROUP+1 + A(1,I)=LAMBDAI(I-1) + ENDDO + DO I=2,NGROUP+1 + A(I,I)=-LAMBDAI(I-1) + ENDDO +*---- +* Runge-Kutta convergence loop +*---- + RHO(:3)=0.0D0 + DO WHILE ((DPP.GE.EPSILON).AND.(NRK.LE.NRKMAX)) +* time and time-step initialisation + DH=DT/REAL(NRK) + T1=T +* +* save of the working vector + DO I=1,NGROUP+1 + YSAV(I)=Y(I) + ENDDO +* +* Runge-Kutta iteration loop + DO I=1,NRK +* total reactivity calculation with feedback + IF(NALPHA.GT.0) CALL PKIRHO(IPMAP,NALPHA,T,DH,PARAMI,PARAMB, + 1 RHO) +* +* Runge-Kutta procedure + A(1,1)=(RHO(1)-BETA)/LAMBDA + DO J=1,NGROUP+1 + Y1(J)=0.0D0 + DO K=1,NGROUP+1 + Y1(J)=Y1(J)+A(J,K)*Y(K) + ENDDO + ENDDO + DO J=1,NGROUP+1 + YSUM(J)=Y(J)+(DH/6.D0)*Y1(J) + Y1(J)=Y(J)+DH/2.D0*Y1(J) + ENDDO + A(1,1)=(RHO(2)-BETA)/LAMBDA + DO J=1,NGROUP+1 + Y2(J)=0.0D0 + DO K=1,NGROUP+1 + Y2(J)=Y2(J)+A(J,K)*Y1(K) + ENDDO + ENDDO + DO J=1,NGROUP+1 + YSUM(J)=YSUM(J)+(DH/3.D0)*Y2(J) + Y2(J)=Y(J)+DH/2.D0*Y2(J) + ENDDO + A(1,1)=(RHO(2)-BETA)/LAMBDA + DO J=1,NGROUP+1 + Y3(J)=0.0D0 + DO K=1,NGROUP+1 + Y3(J)=Y3(J)+A(J,K)*Y2(K) + ENDDO + ENDDO + DO J=1,NGROUP+1 + YSUM(J)=YSUM(J)+(DH/3.D0)*Y3(J) + Y3(J)=Y(J)+DH*Y3(J) + ENDDO + A(1,1)=(RHO(3)-BETA)/LAMBDA + DO J=1,NGROUP+1 + Y4(J)=0.0D0 + DO K=1,NGROUP+1 + Y4(J)=Y4(J)+A(J,K)*Y3(K) + ENDDO + ENDDO + DO J=1,NGROUP+1 + YSUM(J)=YSUM(J)+(DH/6.D0)*Y4(J) + Y(J)=YSUM(J) + ENDDO + T=T+DH +* +* convergence test initialisation + MAXI=0.D0 + DO J=1,NGROUP+1 + MAXI=MAX(ABS(Y(J)),MAXI) + ENDDO + IF(MAXI.GT.1.0D30) GOTO 100 + ENDDO +* +* convergence test + 100 IF(P0.NE.-1.D0) DPP=ABS(Y(1)-P0)/ABS(P0) + P0=Y(1) +* +* reinitialisation of the number of Runge-Kutta time-steps + NRK=2*NRK +* +* reinitialisation of the working vector if not converged + IF((DPP.GE.EPSILON).AND.(NRK.LE.NRKMAX)) THEN + DO I=1,NGROUP+1 + Y(I)=YSAV(I) + ENDDO + T=T1 + ENDIF + ENDDO +*---- +* Scratch storage deallocation +*---- + DEALLOCATE(A,Y4,Y3,Y2,Y1,YSUM,YSAV) + RETURN + END diff --git a/Donjon/src/PKINI.f b/Donjon/src/PKINI.f new file mode 100644 index 0000000..48fac0a --- /dev/null +++ b/Donjon/src/PKINI.f @@ -0,0 +1,417 @@ +*DECK PKINI + SUBROUTINE PKINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Collect input information for the point kinetic module. +* +*Copyright: +* Copyright (C) 2017 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The PKINI: module specification is: +* MAPFL := PKINI: MAPFL :: (descpkini) ; +* where +* MAPFL : name of the \emph{map} object containing fuel regions description +* and global parameter informations. +* (descpkini) : structure describing the input data to the PKINI: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40,MAXALP=10,MAXTIM=2) + INTEGER ISTATE(NSTATE) + TYPE(C_PTR) IPMAP,JPMAP,KPMAP,JPPAR,KPPAR + REAL LAMBDA,TIMES(MAXTIM) + DOUBLE PRECISION DFLOT + LOGICAL LCUBIC + CHARACTER TEXT12*12,HSIGN*12,HPNAME*12,HSMG*131,HPARAM(MAXALP)*12 +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: BETAI,LAMBDAI,X,Y,PARAMI,FPOWER + REAL, ALLOCATABLE, DIMENSION(:,:) :: VAL + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: YINIT +*---- +* RECOVER THE FUELMAP +*---- + IF(NENTRY.NE.1) CALL XABORT('PKINI: ONE PARAMETER EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('PKINI:' + 1 //' LCM OBJECT EXPECTED.') + IF(JENTRY(1).NE.1) CALL XABORT('PKINI: SECOND ENTRY IN MODIFICATI' + 1 //'ON MODE EXPECTED.') + IPMAP=KENTRY(1) + CALL LCMGTC(IPMAP,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP') THEN + TEXT12=HENTRY(1) + CALL XABORT('PKINI: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_MAP EXPECTED.') + ENDIF + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NPARM=ISTATE(8) + IF(NPARM.GT.0) JPPAR=LCMGID(IPMAP,'PARAM') + IF(NCH.NE.1) CALL XABORT('PKINI: ONE CHANNEL EXPECTED.') + CALL LCMSIX(IPMAP,'P-KINETIC',1) +*---- +* READ INPUT DATA +*---- + IMPX=1 + NGROUP=0 + NALPHA=0 + NPTIME=0 + EPSILON=1.0E-2 + POW0=0.0 + LAMBDA=0.0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'EDIT') THEN +* READ PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.1)CALL XABORT('PKINI: INTEGER FOR EDIT EXPECTED.') + ELSE IF(TEXT12.EQ.'POWER') THEN +* Initial power (MW) + CALL REDGET(ITYP,NITMA,POW0,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR P0 EXPECTED.') + ELSE IF(TEXT12.EQ.'LAMBDA') THEN +* Prompt neutron generation time (s) + CALL REDGET(ITYP,NITMA,LAMBDA,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR LAMBDA EXPECTED.') + CALL LCMPUT(IPMAP,'LAMBDA',1,2,LAMBDA) + ELSE IF(TEXT12.EQ.'EPSILON') THEN +* Rugge-Kutta EPSILON + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR EPSILON EXPECTED.') + CALL LCMPUT(IPMAP,'EPSILON',1,2,FLOT) + ELSE IF(TEXT12.EQ.'TIME') THEN +* Set initial time and stage length (s) + CALL REDGET(ITYP,NITMA,T,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR T EXPECTED.') + CALL REDGET(ITYP,NITMA,DT,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR DT EXPECTED.') + CALL LCMPUT(IPMAP,'T-VALUE_INIT',1,2,T) + IF(IMPX.GT.0) WRITE(6,100) T,DT + ELSE IF(TEXT12.EQ.'NGROUP') THEN +* Read printing index + CALL REDGET(ITYP,NGROUP,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.1)CALL XABORT('PKINI: INTEGER FOR NGROUP EXPECTED.') + ELSE IF(TEXT12.EQ.'BETAI') THEN +* Delayed neutron fraction + IF(NGROUP.EQ.0)CALL XABORT('PKINI: NGROUP NOT DEFINED.') + ALLOCATE(BETAI(NGROUP)) + DO IG=1,NGROUP + CALL REDGET(ITYP,NITMA,BETAI(IG),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR BETAI EXPECTED.') + ENDDO + CALL LCMPUT(IPMAP,'BETAI',NGROUP,2,BETAI) + ELSE IF(TEXT12.EQ.'LAMBDAI') THEN +* Delayed neutron time constant + IF(NGROUP.EQ.0)CALL XABORT('PKINI: NGROUP NOT DEFINED.') + ALLOCATE(LAMBDAI(NGROUP)) + DO IG=1,NGROUP + CALL REDGET(ITYP,NITMA,LAMBDAI(IG),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR LAMBDAI EXPECTED.') + ENDDO + CALL LCMPUT(IPMAP,'LAMBDAI',NGROUP,2,LAMBDAI) + ELSE IF(TEXT12.EQ.'ALPHA') THEN + IF(NPARM.EQ.0)CALL XABORT('PKINI: NPARM NOT DEFINED.') + JPMAP=LCMLID(IPMAP,'ALPHA',MAXALP) + 20 CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'ENDA') GO TO 10 + NALPHA=NALPHA+1 + IF(NALPHA.GT.MAXALP) CALL XABORT('PKINI: MAXALP OVERFLOW.') + DO IPAR=1,NPARM + KPPAR=LCMGIL(JPPAR,IPAR) + CALL LCMGTC(KPPAR,'P-NAME',12,HPNAME) + IF(HPNAME.EQ.TEXT12) GO TO 25 + ENDDO + WRITE(HSMG,'(24HPKINI: GLOBAL PARAMETER ,A,16H IS NOT DEFINED , + 1 15HIN THE FUELMAP.)') TEXT12 + CALL XABORT(HSMG) + 25 KPMAP=LCMDIL(JPMAP,NALPHA) + CALL LCMPTC(KPMAP,'P-NAME',12,TEXT12) + HPARAM(NALPHA)=TEXT12 + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'DIRECT') THEN + ITYPE=1 + ELSE IF(TEXT12.EQ.'DERIV') THEN + ITYPE=2 + ELSE IF(TEXT12.EQ.'SQDERIV') THEN + ITYPE=3 + ELSE + CALL XABORT('PKINI: DIRECT OR DERIV EXPECTED.') + ENDIF + CALL REDGET(ITYP,NXY,FLOT,TEXT12,DFLOT) + LCUBIC=.FALSE. + IF(ITYP.EQ.3) THEN + IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + ELSE + CALL XABORT('PKINI: LINEAR OR CUBIC EXPECTED.') + ENDIF + CALL REDGET(ITYP,NXY,FLOT,TEXT12,DFLOT) + ENDIF + IF(ITYP.NE.1)CALL XABORT('PKINI: INTEGER FOR NXY EXPECTED(1).') + ALLOCATE(X(NXY),Y(NXY)) + DO I=1,NXY + CALL REDGET(ITYP,NITMA,X(I),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR X EXPECTED(1).') + CALL REDGET(ITYP,NITMA,Y(I),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR Y EXPECTED(1).') + ENDDO + CALL LCMPUT(KPMAP,'ALPHA-LAW-P',NXY,2,X) + CALL LCMPUT(KPMAP,'ALPHA-LAW-R',NXY,2,Y) + CALL LCMPUT(KPMAP,'ALPHA-LAW-T',1,1,ITYPE) + CALL LCMPUT(KPMAP,'ALPHA-LAW-I',1,5,LCUBIC) + DEALLOCATE(Y,X) + GO TO 20 + ELSE IF(TEXT12.EQ.'PTIME') THEN + IF(NALPHA.EQ.0)CALL XABORT('PKINI: NO FEEDBACK PARAMETERS.') + JPMAP=LCMGID(IPMAP,'ALPHA') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + 30 IF(TEXT12.EQ.'ENDP') GO TO 10 + NPTIME=NPTIME+1 + IALP=0 + DO IAL=1,NALPHA + IALP=IAL + IF(TEXT12.EQ.HPARAM(IAL)) GO TO 40 + ENDDO + WRITE(HSMG,'(24HPKINI: GLOBAL PARAMETER ,A,16H IS NOT A FEEDBA, + 1 13HCK PARAMETER.)') TEXT12 + CALL XABORT(HSMG) + 40 KPMAP=LCMDIL(JPMAP,IALP) + LCUBIC=.FALSE. + 50 CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.EQ.1) THEN + NXY=NITMA + ALLOCATE(X(NXY),Y(NXY)) + DO I=1,NXY + CALL REDGET(ITYP,NITMA,X(I),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR X EXPECTED(2).') + CALL REDGET(ITYP,NITMA,Y(I),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINI: REAL FOR Y EXPECTED(2).') + ENDDO + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + ELSE IF(ITYP.EQ.3) THEN + IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + GO TO 50 + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + GO TO 50 + ELSE IF(TEXT12.EQ.'T-DELT') THEN + GO TO 60 + ELSE + CALL XABORT('PKINI: LINEAR, CUBIC OR T-DELT EXPECTED.') + ENDIF + 60 CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.EQ.1) THEN + NXY=NITMA + CALL REDGET(ITYP,NITMA,T1,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(1).') + ELSE IF (ITYP.EQ.2) THEN + NXY=1001 + T1=FLOT + ELSE + CALL XABORT('PKINI: INTEGER OR REAL DATA EXPECTED.') + ENDIF + ALLOCATE(X(NXY),Y(NXY)) + CALL REDGET(ITYP,NITMA,T2,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(2).') + IF(T2.LE.T1) CALL XABORT('PKINI: T2 > T1 EXPECTED.') + DELT=(T2-T1)/REAL(NXY-1) + TT=T1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + IF(TEXT12.NE.'P-VALV') CALL XABORT('PKINI: P-VALV EXPECTED.') + CALL REDGET(ITYP,NITMA,GAMMA,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(3).') + CALL REDGET(ITYP,NITMA,PINIT,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(4).') + CALL REDGET(ITYP,NITMA,PFINAL,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(5).') + CALL REDGET(ITYP,NITMA,TB1,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(6).') + IF(TB1.LT.T1) CALL XABORT('PKINI: INVALID VALUE OF TB1.') + CALL REDGET(ITYP,NITMA,B1,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(7).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + TB2=T2 + PFINA2=PFINAL + IF(TEXT12.EQ.'RESET') THEN + CALL REDGET(ITYP,NITMA,PFINA2,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(8).') + IF(PFINA2.GT.PFINAL) CALL XABORT('PKINI: INVALID VALUE OF' + > //' PFINA2.') + CALL REDGET(ITYP,NITMA,TB2,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(9).') + IF(TB2.LE.TB1) CALL XABORT('PKINI: INVALID VALUE OF TB2.') + CALL REDGET(ITYP,NITMA,B2,TEXT12,DFLOT) + IF(ITYP.NE.2) CALL XABORT('PKINI: REAL DATA EXPECTED(10).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINI: CHARACTER DATA EXPECTED.') + ENDIF +* + ALPHA=2.0*GAMMA/(GAMMA-1.0) + YGAR=PINIT + DO I=1,NXY + X(I)=TT + IF(TT.LE.TB1) THEN + Y(I)=PINIT + ELSE IF(TT.LE.TB2) THEN + Y(I)=MAX(PINIT/((B1*(TT-TB1)+1.0))**ALPHA,PFINAL) + YGAR=Y(I) + ELSE + Y(I)=MAX(YGAR/((B2*(TT-TB2)+1.0))**ALPHA,PFINA2) + ENDIF + TT=TT+DELT + ENDDO + ELSE + CALL XABORT('PKINI: INTEGER OR CHARACTER DATA EXPECTED.') + ENDIF + CALL LCMPUT(KPMAP,'TIME-LAW-T',NXY,2,X) + CALL LCMPUT(KPMAP,'TIME-LAW-P',NXY,2,Y) + CALL LCMPUT(KPMAP,'TIME-LAW-I',1,5,LCUBIC) + DEALLOCATE(Y,X) + GO TO 30 + ELSE IF(TEXT12.EQ.';') THEN + GO TO 70 + ELSE + CALL XABORT('PKINI: INVALID KEYWORD: '//TEXT12//'.') + ENDIF + GO TO 10 +*---- +* RECOVER THE INITIAL GLOBAL PARAMETER VALUES +*---- + 70 ALLOCATE(PARAMI(NALPHA)) + IF(IMPX.GT.0) WRITE(6,110) + DO IAL=1,NALPHA + DO IPAR=1,NPARM + KPPAR=LCMGIL(JPPAR,IPAR) + CALL LCMGTC(KPPAR,'P-NAME',12,HPNAME) + IF(HPNAME.EQ.HPARAM(IAL)) GO TO 80 + ENDDO + CALL XABORT('PKINI: GLOBAL PARAMETER NOT FOUND.') + 80 CALL LCMLEN(KPPAR,'P-VALUE',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + WRITE(HSMG,'(33HPKINI: VALUE OF GLOBAL PARAMETER ,A,6H IS NO, + 1 20H SET IN THE FUELMAP.)') HPNAME + CALL XABORT(HSMG) + ENDIF + CALL LCMGET(KPPAR,'P-VALUE',PARAMI(IAL)) + IF(IMPX.GT.0) WRITE(6,120) IAL,HPNAME,PARAMI(IAL) + ENDDO + CALL LCMPUT(IPMAP,'P-VALUE-INIT',NALPHA,2,PARAMI) + CALL LCMPTC(IPMAP,'P-NAME',12,NALPHA,HPARAM) +*---- +* SET INITIAL SOLUTION OF POINT KINETIC EQUATIONS +*---- + IF(POW0.EQ.0.0) CALL XABORT('PKINI: INITIAL POWER NOT DEFINED.') + IF(NGROUP.EQ.0) CALL XABORT('PKINI: NGROUP NOT DEFINED.') + ALLOCATE(YINIT(NGROUP+1)) + YINIT(1)=POW0 + DO I=2,NGROUP+1 + YINIT(I)=POW0*BETAI(I-1)/(LAMBDAI(I-1)*LAMBDA) + ENDDO +*---- +* SAVE INITIAL CONDITIONS +*---- + ISTAGE=1 + TIMES(:MAXTIM)=-1.0E30 + TIMES(1)=T + TEXT12='PKIN-DAT0001' + IF(IMPX.GT.0) WRITE(6,130) T,TEXT12 + CALL LCMSIX(IPMAP,TEXT12,1) + CALL LCMPUT(IPMAP,'P-VALUE',NALPHA,2,PARAMI) + CALL LCMPUT(IPMAP,'Y-VALUE',NGROUP+1,4,YINIT) + CALL LCMPUT(IPMAP,'T-VALUE',1,2,T) + CALL LCMPUT(IPMAP,'DT-VALUE',1,2,DT) + CALL LCMPUT(IPMAP,'I-VALUE',1,1,ISTAGE) + CALL LCMSIX(IPMAP,' ',2) + DEALLOCATE(PARAMI,YINIT,LAMBDAI,BETAI) + CALL LCMPUT(IPMAP,'PKIN-TIMES',MAXTIM,2,TIMES) +*---- +* CREATE STATE VECTOR AND SAVE POWER INFORMATION +*---- + ISTATE(:NSTATE)=0 + ISTATE(1)=ISTAGE + ISTATE(2)=NGROUP + ISTATE(3)=NALPHA + ISTATE(4)=NPTIME + CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(IMPX.GT.0) WRITE(6,140) ISTATE(2:4) + IF(IMPX.GT.1) CALL LCMLIB(IPMAP) + CALL LCMSIX(IPMAP,' ',2) + IF(IMPX.GT.0) WRITE(6,150) POW0 + CALL LCMPUT(IPMAP,'REACTOR-PW',1,2,POW0) + CALL LCMLEN(IPMAP,'BUND-PW',ILONG,ITYLCM) + CALL LCMLEN(IPMAP,'AXIAL-FPW',JLONG,ITYLCM) + IF((ILONG.EQ.NCH*NB).AND.(JLONG.EQ.NB)) THEN + ALLOCATE(VAL(NCH,NB),FPOWER(ILONG)) + CALL LCMGET(IPMAP,'AXIAL-FPW',FPOWER) + DSUM=0.0 + DO IB=1,NB + DSUM=DSUM+FPOWER(IB) + ENDDO + DO ICH=1,NCH + DO IB=1,NB + VAL(ICH,IB)=FPOWER(IB)*POW0*1.0E3/(DSUM*REAL(NCH)) + ENDDO + ENDDO + CALL LCMPUT(IPMAP,'BUND-PW',NCH*NB,2,VAL) + DEALLOCATE(FPOWER,VAL) + ENDIF + RETURN +* + 100 FORMAT(/34H PKINI: DEFINE INITIAL STAGE TIME=,1P,E12.4,2H S, + 1 10H DURATION=,E12.4,2H S) + 110 FORMAT(43H PKINI: GLOBAL PARAMETER -- INITIAL VALUES:) + 120 FORMAT(1X,I8,A14,3H = ,1P,E12.4) + 130 FORMAT(/40H PKINI: SAVE INFORMATION RELATED TO TIME,1P,E12.4, + 1 27H S IN LCM DIRECTORY NAMED ',A12,2H'.) + 140 FORMAT(/ + 1 14H STATE VECTOR:/ + 2 7H NGROUP,I9,39H (NUMBER OF DELAYED PRECURSOR GROUPS)/ + 3 7H NALPHA,I9,34H (NUMBER OF FEEDBACK PARAMETERS)/ + 4 7H NPTIME,I9,40H (NUMBER OF TIME-DEPENDENT PARAMETERS)) + 150 FORMAT(/22H PKINI: INITIAL POWER=,1P,E12.4,3H MW) + END diff --git a/Donjon/src/PKINS.f b/Donjon/src/PKINS.f new file mode 100644 index 0000000..97e4088 --- /dev/null +++ b/Donjon/src/PKINS.f @@ -0,0 +1,371 @@ +*DECK PKINS + SUBROUTINE PKINS(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solve the point kinetic equations and apply global feedback. +* +*Copyright: +* Copyright (C) 2017 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 +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The PKINS: module specification is: +* [ MAPFL := ] PKINS: MAPFL :: (descpkins) ; +* where +* MAPFL : name of the \emph{map} object containing fuel regions description +* and global parameter informations. This object is declared in read-only +* mode if and only if keyword PICKR is set. +* (descpkins) : structure describing the input data to the PKINS: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40,MAXTIM=2) + INTEGER ISTATE(NSTATE) + TYPE(C_PTR) IPMAP,JPMAP,JPPAR,KPPAR + REAL LAMBDA,TIMES(MAXTIM) + DOUBLE PRECISION DFLOT,DT_D,T_D,DH,RHO(3) + CHARACTER TEXT12*12,HSIGN*12,HPNAME*12,HSMG*131 +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: BETAI,LAMBDAI,PARAMI,PARAMB, + 1 FPOWER + REAL, ALLOCATABLE, DIMENSION(:,:) :: VAL + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: Y + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HPARAM +*---- +* RECOVER THE FUELMAP +*---- + IF(NENTRY.NE.1) CALL XABORT('PKINS: ONE PARAMETER EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('PKINS:' + 1 //' LCM OBJECT EXPECTED.') + IF(JENTRY(1).EQ.0) CALL XABORT('PKINS: SECOND ENTRY IN READ-ONLY' + 1 //' OR MODIFICATION MODE EXPECTED.') + IPMAP=KENTRY(1) + CALL LCMGTC(IPMAP,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP') THEN + TEXT12=HENTRY(1) + CALL XABORT('PKINS: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_MAP EXPECTED.') + ENDIF + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NPARM=ISTATE(8) + IF(NPARM.GT.0) JPPAR=LCMGID(IPMAP,'PARAM') + IF(NCH.NE.1) CALL XABORT('PKINS: ONE CHANNEL EXPECTED.') + JPMAP=LCMGID(IPMAP,'P-KINETIC') + CALL LCMGET(JPMAP,'STATE-VECTOR',ISTATE) + NGROUP=ISTATE(2) + NALPHA=ISTATE(3) + ALLOCATE(HPARAM(NALPHA),PARAMI(NALPHA),PARAMB(NALPHA),Y(NGROUP+1)) +*---- +* READ INPUT DATA +*---- + IMPX=1 + T=0.0 + DT=0.0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('PKINS: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'EDIT') THEN +* READ PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.1)CALL XABORT('PKINS: INTEGER FOR EDIT EXPECTED.') + ELSE IF(TEXT12.EQ.'TIME') THEN +* Set initial time and stage length (s) + CALL REDGET(ITYP,NITMA,T,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINS: REAL FOR T EXPECTED.') + CALL REDGET(ITYP,NITMA,DT,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINS: REAL FOR DT EXPECTED.') + IF(IMPX.GT.0) WRITE(6,100) T,DT + ELSE IF(TEXT12.EQ.'Y-INIT') THEN +* Read solution of point kinetic equations at beginning-of-stage + IF(DT.EQ.0.0) CALL XABORT('PKINS: DT NOT SET.') + DO I=1,NGROUP+1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,Y(I)) + IF(ITYP.NE.4)CALL XABORT('PKINS: DOUBLE FOR Y EXPECTED.') + ENDDO + CALL LCMGET(JPMAP,'PKIN-TIMES',TIMES) + ITIM=0 + DO I=1,MAXTIM + IF(ABS(TIMES(I)-T).LE.1.0E-4*DT) ITIM=I + ENDDO + IF(ITIM.EQ.0) THEN +* unable to find initial contitions + WRITE(HSMG,'(44HPKINS: UNABLE TO FIND BEGINNING-OF-STAGE CON, + 1 13HTITIONS AT T=,1P E12.4,6H S(1).)') T + CALL XABORT(HSMG) + ENDIF + WRITE(TEXT12,'(8HPKIN-DAT,I4.4)') ITIM + IF(IMPX.GT.0) WRITE(6,160) T,TEXT12 + CALL LCMSIX(JPMAP,TEXT12,1) + CALL LCMPUT(JPMAP,'Y-VALUE',NGROUP+1,4,Y) + CALL LCMSIX(JPMAP,' ',2) + ELSE IF(TEXT12.EQ.'POWER') THEN +* Read power (MW) + IF(DT.EQ.0.0) CALL XABORT('PKINS: DT NOT SET.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('PKINS: REAL FOR POW EXPECTED.') + CALL LCMGET(JPMAP,'Y-VALUE',Y) + Y(1)=DFLOT + CALL LCMGET(JPMAP,'PKIN-TIMES',TIMES) + ITIM=0 + DO I=1,MAXTIM + IF(ABS(TIMES(I)-T).LE.1.0E-4*DT) ITIM=I + ENDDO + IF(ITIM.EQ.0) THEN +* unable to find initial contitions + WRITE(HSMG,'(44HPKINS: UNABLE TO FIND BEGINNING-OF-STAGE CON, + 1 13HTITIONS AT T=,1P E12.4,6H S(2).)') T + CALL XABORT(HSMG) + ENDIF + WRITE(TEXT12,'(8HPKIN-DAT,I4.4)') ITIM + IF(IMPX.GT.0) WRITE(6,160) T,TEXT12 + CALL LCMSIX(JPMAP,TEXT12,1) + CALL LCMPUT(JPMAP,'Y-VALUE',NGROUP+1,4,Y) + CALL LCMSIX(JPMAP,' ',2) + ELSE IF(TEXT12.EQ.';') THEN + IPICK=0 + GO TO 20 + ELSE IF(TEXT12.EQ.'PICK') THEN + IPICK=1 + GO TO 20 + ELSE IF(TEXT12.EQ.'PICKR') THEN + IPICK=2 + GO TO 20 + ELSE + CALL XABORT('PKINS: INVALID KEYWORD: '//TEXT12//'.') + ENDIF + GO TO 10 +*---- +* RECOVER THE GLOBAL PARAMETER VALUES AT THE BEGINNING OF TIME STAGE +*---- + 20 IF(IMPX.GT.0) WRITE(6,110) + CALL LCMGTC(JPMAP,'P-NAME',12,NALPHA,HPARAM) + DO IAL=1,NALPHA + DO IPAR=1,NPARM + KPPAR=LCMGIL(JPPAR,IPAR) + CALL LCMGTC(KPPAR,'P-NAME',12,HPNAME) + IF(HPNAME.EQ.HPARAM(IAL)) GO TO 30 + ENDDO + CALL XABORT('PKINS: GLOBAL PARAMETER NOT FOUND.') + 30 CALL LCMLEN(KPPAR,'P-VALUE',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + WRITE(HSMG,'(33HPKINS: VALUE OF GLOBAL PARAMETER ,A,6H IS NO, + 1 20H SET IN THE FUELMAP.)') HPNAME + CALL XABORT(HSMG) + ENDIF + CALL LCMGET(KPPAR,'P-TYPE',ITYPE) + IF(ITYPE.EQ.1) THEN + CALL LCMGET(KPPAR,'P-VALUE',PARAMB(IAL)) + ELSE IF(ITYPE.EQ.2) THEN + ALLOCATE(VAL(NCH,NB),FPOWER(NB)) + CALL LCMGET(KPPAR,'P-VALUE',VAL) + CALL LCMLEN(IPMAP,'AXIAL-FPW',JLONG,ITYLCM) + IF((ILONG.NE.NCH*NB).OR.(JLONG.NE.NB)) CALL XABORT('PKINS: U' + 1 //'NABLE TO FIND RECORD AXIAL-FPW IN THE FUELMAP.') + CALL LCMGET(IPMAP,'AXIAL-FPW',FPOWER) + DD1=0.0 + DD2=0.0 + DO ICH=1,NCH + DO IB=1,NB + DD1=DD1+VAL(ICH,IB)*FPOWER(IB)**2 + DD2=DD2+FPOWER(IB)**2 + ENDDO + ENDDO + PARAMB(IAL)=DD1/DD2 + DEALLOCATE(FPOWER,VAL) + ENDIF + IF(IMPX.GT.0) WRITE(6,120) IAL,HPNAME,PARAMB(IAL) + ENDDO +*---- +* COMPUTE THE REACTIVITY AT TIME T +*---- + RHO(1)=0.0D0 + IF((DT.EQ.0.0).AND.(NALPHA.GT.0)) THEN + CALL LCMGET(JPMAP,'P-VALUE-INIT',PARAMI) + DH=0.0D0 + T_D=T + CALL PKIRHO(JPMAP,NALPHA,T_D,DH,PARAMI,PARAMB,RHO) + ENDIF +*---- +* SOLVE THE POINT KINETIC EQUATIONS +*---- + IF(DT.GT.0.0) THEN + ALLOCATE(BETAI(NGROUP),LAMBDAI(NGROUP)) + CALL LCMGET(JPMAP,'LAMBDA',LAMBDA) + CALL LCMGET(JPMAP,'EPSILON',EPSILON) + CALL LCMGET(JPMAP,'BETAI',BETAI) + CALL LCMGET(JPMAP,'LAMBDAI',LAMBDAI) + CALL LCMGET(JPMAP,'P-VALUE-INIT',PARAMI) +* + CALL LCMGET(JPMAP,'PKIN-TIMES',TIMES) + ITIM=0 + DO I=1,MAXTIM + IF(ABS(TIMES(I)-T).LE.1.0E-4*DT) ITIM=I + ENDDO + IF(ITIM.EQ.0) THEN +* unable to find initial contitions + WRITE(HSMG,'(44HPKINS: UNABLE TO FIND BEGINNING-OF-STAGE CON, + 1 13HTITIONS AT T=,1P E12.4,6H S(3).)') T + CALL XABORT(HSMG) + ENDIF + WRITE(TEXT12,'(8HPKIN-DAT,I4.4)') ITIM + IF(IMPX.GT.0) WRITE(6,130) T,TEXT12 + CALL LCMSIX(JPMAP,TEXT12,1) + CALL LCMGET(JPMAP,'T-VALUE',TT) + IF(ABS(T-TT).GT.1.0E-4*DT) CALL XABORT('PKINS: INVALID TIME ' + 1 //'RECORD.') + CALL LCMGET(JPMAP,'Y-VALUE',Y) + CALL LCMGET(JPMAP,'I-VALUE',ISTAGE) + CALL LCMSIX(JPMAP,' ',2) + IF(IMPX.GT.0) WRITE(6,140) ISTAGE + IF(IMPX.GT.0) WRITE(6,150) T,T+DT,Y(1) + ISTAGE=ISTAGE+1 + DT_D=DT + T_D=T + CALL PKIDRV(JPMAP,NALPHA,NGROUP,LAMBDA,EPSILON,BETAI,LAMBDAI, + 1 DT_D,PARAMI,PARAMB,T_D,Y) + T=REAL(T_D) + ITIM=0 + DO I=1,MAXTIM + IF(ABS(TIMES(I)-T).LE.1.0E-4*DT) ITIM=I + ENDDO + IF(ITIM.EQ.0) THEN +* add end-of-stage info in a new slot + ITIM=MOD(ISTAGE-1,MAXTIM)+1 + TIMES(ITIM)=T + ENDIF + WRITE(TEXT12,'(8HPKIN-DAT,I4.4)') ITIM + IF(IMPX.GT.0) WRITE(6,160) T,TEXT12 + CALL LCMSIX(JPMAP,TEXT12,1) + CALL LCMPUT(JPMAP,'Y-VALUE',NGROUP+1,4,Y) + CALL LCMPUT(JPMAP,'T-VALUE',1,2,T) + CALL LCMPUT(JPMAP,'DT-VALUE',1,2,DT) + CALL LCMPUT(JPMAP,'I-VALUE',1,1,ISTAGE) + CALL LCMSIX(JPMAP,' ',2) + CALL LCMPUT(JPMAP,'PKIN-TIMES',MAXTIM,2,TIMES) + IF(IMPX.GT.0) WRITE(6,170) ISTAGE,T,Y(1) + DEALLOCATE(LAMBDAI,BETAI) + POW=REAL(Y(1)) +*---- +* SAVE THE GLOBAL PARAMETER VALUES AT THE END OF TIME STAGE +*---- + IF(IMPX.GT.0) WRITE(6,180) + DO IAL=1,NALPHA + DO IPAR=1,NPARM + KPPAR=LCMGIL(JPPAR,IPAR) + CALL LCMGTC(KPPAR,'P-NAME',12,HPNAME) + IF(HPNAME.EQ.HPARAM(IAL)) GO TO 40 + ENDDO + CALL XABORT('PKINS: GLOBAL PARAMETER NOT FOUND.') + 40 CALL LCMPUT(KPPAR,'P-VALUE',1,2,PARAMB(IAL)) + ITYPE=1 + CALL LCMPUT(KPPAR,'P-TYPE',1,1,ITYPE) + IF(IMPX.GT.0) WRITE(6,120) IAL,HPNAME,PARAMB(IAL) + ENDDO + ENDIF + DEALLOCATE(PARAMB,PARAMI,HPARAM) +*---- +* RECOVER THE FINAL POWER AND SAVE IT IN A CLE-2000 VARIABLE +*---- + IF(IPICK.EQ.1) THEN + IF(DT.EQ.0.0) CALL XABORT('PKINS: DT>0 EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.-2) CALL XABORT('PKINS: OUTPUT REAL EXPECTED(1).') + ITYP=2 + FLOT=REAL(Y(1)) + CALL REDPUT(ITYP,NITMA,FLOT,TEXT12,DFLOT) + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF((ITYP.NE.3).OR.(TEXT12.NE.';')) THEN + CALL XABORT('PKINS: ; CHARACTER EXPECTED(1).') + ENDIF + ELSE IF(IPICK.EQ.2) THEN + IF(DT.NE.0.0) CALL XABORT('PKINS: DT=0 EXPECTED.') + IF(JENTRY(1).NE.2) CALL XABORT('PKINS: SECOND ENTRY IN READ-O' + 1 //'NLY MODE EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.-2) CALL XABORT('PKINS: OUTPUT REAL EXPECTED(2).') + ITYP=2 + FLOT=REAL(RHO(1)) + CALL REDPUT(ITYP,NITMA,FLOT,TEXT12,DFLOT) + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF((ITYP.NE.3).OR.(TEXT12.NE.';')) THEN + CALL XABORT('PKINS: ; CHARACTER EXPECTED(2).') + ENDIF + ENDIF + DEALLOCATE(Y) +*---- +* UPDATE STATE VECTOR AND SAVE POWER +*---- + IF(DT.GT.0.0) THEN + ISTATE(1)=ISTAGE + CALL LCMPUT(JPMAP,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPMAP,'REACTOR-PW',1,2,POW) + CALL LCMLEN(IPMAP,'BUND-PW',ILONG,ITYLCM) + CALL LCMLEN(IPMAP,'AXIAL-FPW',JLONG,ITYLCM) + IF((ILONG.EQ.NCH*NB).AND.(JLONG.EQ.NB)) THEN + ALLOCATE(VAL(NCH,NB),FPOWER(ILONG)) + CALL LCMGET(IPMAP,'AXIAL-FPW',FPOWER) + DSUM=0.0 + DO IB=1,NB + DSUM=DSUM+FPOWER(IB) + ENDDO + DO ICH=1,NCH + DO IB=1,NB + VAL(ICH,IB)=FPOWER(IB)*POW*1.0E3/(DSUM*REAL(NCH)) + ENDDO + ENDDO + CALL LCMPUT(IPMAP,'BUND-PW',NCH*NB,2,VAL) + DEALLOCATE(FPOWER,VAL) + ENDIF + ENDIF + RETURN +* + 100 FORMAT(/36H PKINS: REDEFINE INITIAL STAGE TIME=,1P,E12.4,2H S, + 1 15H WITH DURATION=,E12.4,2H S) + 110 FORMAT(54H PKINS: GLOBAL PARAMETER -- BEGINNING-OF-STAGE VALUES:) + 120 FORMAT(1X,I8,A14,3H = ,1P,E12.4) + 130 FORMAT(/43H PKINS: RECOVER INFORMATION RELATED TO TIME,1P,E12.4, + 1 29H S FROM LCM DIRECTORY NAMED ',A12,2H'.) + 140 FORMAT(1X,18(1H*)/8H * STAGE,I9,2H */1X,18(1H*)) + 150 FORMAT(/27H PKINS: INITIAL STAGE TIME=,1P,E12.4,14H S FINAL TIME=, + 1 E12.4,17H S INITIAL POWER=,E12.4,3H MW) + 160 FORMAT(/40H PKINS: SAVE INFORMATION RELATED TO TIME,1P,E12.4, + 1 27H S IN LCM DIRECTORY NAMED ',A12,2H'.) + 170 FORMAT(/16H PKINS: ##STAGE=,I8,12H FINAL TIME=,1P,E12.4, + 1 15H S FINAL POWER=,E12.4,3H MW) + 180 FORMAT(48H PKINS: GLOBAL PARAMETER -- END-OF-STAGE VALUES:) + END diff --git a/Donjon/src/PKIRHO.f b/Donjon/src/PKIRHO.f new file mode 100644 index 0000000..ad560a5 --- /dev/null +++ b/Donjon/src/PKIRHO.f @@ -0,0 +1,156 @@ +*DECK PKIRHO + SUBROUTINE PKIRHO(IPMAP,NALPHA,T,H,PARAMI,PARAMB,RHO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the reactivity during a Runge-Kutta time step taking into +* account feedback effects. +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal +* This library is free software; you can redIribute 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 +* IPMAP pointer to the point kinetic directory +* NALPHA number of feedback parameters +* T time at beggining of step +* H time-step duration +* PARAMI initial values of the global parameters corresponding to +* RHO=0 +* PARAMB values of global parameters at beginning of stage +* +*Parameters: ouput +* PARAMB values of global parameters at end of Runge-Kutta time step +* RHO reactivity during Runge-Kutta time step +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* Subroutine arguments +*---- + TYPE(C_PTR) IPMAP + INTEGER NALPHA + REAL PARAMI(NALPHA),PARAMB(NALPHA) + DOUBLE PRECISION T,H,RHO(3) +*---- +* Local variables +*---- + TYPE(C_PTR) JPPAR,KPPAR + TYPE(C_PTR) X_PTR,Y_PTR + DOUBLE PRECISION TS(3),DSUM + LOGICAL LCUBIC +*---- +* Allocatable arrays +*---- + REAL, POINTER, DIMENSION(:) :: X,Y + REAL, ALLOCATABLE, DIMENSION(:) :: TERP,GAR + REAL, ALLOCATABLE, DIMENSION(:,:) :: PARAM +*---- +* Compute the values of the global parameters during the time step +*---- + TS(1)=T + TS(2)=T+H/2.0D0 + TS(3)=T+H + ALLOCATE(PARAM(3,NALPHA)) + DO IAL=1,NALPHA + PARAM(:3,IAL)=PARAMB(IAL) + ENDDO + JPPAR=LCMGID(IPMAP,'ALPHA') + DO IAL=1,NALPHA + KPPAR=LCMGIL(JPPAR,IAL) + CALL LCMLEN(KPPAR,'TIME-LAW-T',NXY,ITYLCM) + IF(NXY.NE.0) THEN + ALLOCATE(TERP(NXY)) + CALL LCMGPD(KPPAR,'TIME-LAW-T',X_PTR) + CALL C_F_POINTER(X_PTR,X,(/ NXY /)) + CALL LCMGPD(KPPAR,'TIME-LAW-P',Y_PTR) + CALL C_F_POINTER(Y_PTR,Y,(/ NXY /)) + CALL LCMGET(KPPAR,'TIME-LAW-I',LCUBIC) + DO I=1,3 + CALL ALTERP(LCUBIC,NXY,X,REAL(TS(I)),.FALSE.,TERP) + DSUM=0.0D0 + DO J=1,NXY + DSUM=DSUM+TERP(J)*Y(J) + ENDDO + PARAM(I,IAL)=REAL(DSUM) + ENDDO + PARAMB(IAL)=PARAM(3,IAL) + DEALLOCATE(TERP) + ENDIF + ENDDO +*---- +* Compute the reactivity +*---- + RHO(:3)=0.0D0 + JPPAR=LCMGID(IPMAP,'ALPHA') + DO IAL=1,NALPHA + KPPAR=LCMGIL(JPPAR,IAL) + CALL LCMLEN(KPPAR,'ALPHA-LAW-P',NXY,ITYLCM) + IF(NXY.NE.0) THEN + ALLOCATE(TERP(NXY),GAR(NXY)) + CALL LCMGPD(KPPAR,'ALPHA-LAW-P',X_PTR) + CALL C_F_POINTER(X_PTR,X,(/ NXY /)) + CALL LCMGPD(KPPAR,'ALPHA-LAW-R',Y_PTR) + CALL C_F_POINTER(Y_PTR,Y,(/ NXY /)) + CALL LCMGET(KPPAR,'ALPHA-LAW-T',ITYPE) + CALL LCMGET(KPPAR,'ALPHA-LAW-I',LCUBIC) + DO I=1,3 + IF(ITYPE.EQ.1) THEN + CALL ALTERP(LCUBIC,NXY,X,PARAM(I,IAL),.FALSE.,TERP) + CALL ALTERP(LCUBIC,NXY,X,PARAMI(IAL),.FALSE.,GAR) + DSUM=0.0D0 + DO J=1,NXY + DSUM=DSUM+(TERP(J)-GAR(J))*Y(J) + ENDDO + ELSE IF((ITYPE.EQ.2).AND.(PARAMI(IAL).LT.PARAM(I,IAL))) THEN + CALL ALTERI(LCUBIC,NXY,X,PARAMI(IAL),PARAM(I,IAL),TERP) + DSUM=0.0D0 + DO J=1,NXY + DSUM=DSUM+TERP(J)*Y(J) + ENDDO + ELSE IF((ITYPE.EQ.2).AND.(PARAMI(IAL).GT.PARAM(I,IAL))) THEN + CALL ALTERI(LCUBIC,NXY,X,PARAM(I,IAL),PARAMI(IAL),TERP) + DSUM=0.0D0 + DO J=1,NXY + DSUM=DSUM-TERP(J)*Y(J) + ENDDO + ELSE IF(ITYPE.EQ.3) THEN + DO J=1,NXY + GAR(J)=SQRT(X(J)) + ENDDO + GAR1=SQRT(PARAMI(IAL)) + GAR2=SQRT(PARAM(I,IAL)) + IF(GAR1.LT.GAR2) THEN + CALL ALTERI(LCUBIC,NXY,GAR,GAR1,GAR2,TERP) + DSUM=0.0D0 + DO J=1,NXY + DSUM=DSUM+TERP(J)*Y(J) + ENDDO + ELSE IF(GAR2.LT.GAR1) THEN + CALL ALTERI(LCUBIC,NXY,GAR,GAR2,GAR1,TERP) + DSUM=0.0D0 + DO J=1,NXY + DSUM=DSUM-TERP(J)*Y(J) + ENDDO + ELSE + CYCLE + ENDIF + ELSE + CYCLE + ENDIF + RHO(I)=RHO(I)+DSUM + ENDDO + DEALLOCATE(GAR,TERP) + ENDIF + ENDDO + DEALLOCATE(PARAM) + RETURN + END diff --git a/Donjon/src/PLDRV.f b/Donjon/src/PLDRV.f new file mode 100644 index 0000000..7b75d2a --- /dev/null +++ b/Donjon/src/PLDRV.f @@ -0,0 +1,190 @@ +*DECK PLDRV + SUBROUTINE PLDRV(IPOPT,N0,NCST,M0,MINMAX,IMTHD,FCOST,XOBJ,PDG, + > GRAD,INEGAL,CONTR,DINF,DSUP,XDROIT,EPSIM,IMPR,IERR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Prepares the different matrices for the resolution of a linear +* optimisation problem with a quadratic constraint. The different +* available methods are the MAP technique, the lemke, the augmented- +* Lagrangian and the penalty function. +* PLDRV = Linear Programmation DRiVer for options +* +*Copyright: +* Copyright (C) 2002 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 and R. Chambon +* +*Parameters: input +* IPOPT pointer to the L_OPTIMIZE object. +* N0 number of control variables. +* NCST number of constraints. +* M0 number of constraints plus the number of lower/upper bounds +* intercepting the quadratic constraint. +* MINMAX type of optimization (=-1: minimize; =1: maximize). +* IMTHD type of solution (=1: SIMPLEX/LEMKE; =2: LEMKE/LEMKE; +* =3: MAP; =4: Augmented Lagragian; =5: External penalty +* funnction). +* FCOST objective function. +* XOBJ control variables. +* PDG weights assigned to control variables in the quadratic +* constraint. +* GRAD linearized gradients (GRAD(:,1) are control variable costs +* and GRAD(:,2:NCST+1) are linear constraint coefficients). +* INEGAL constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* CONTR constraint right hand sides. +* DINF lower bounds of control variables. +* DSUP upper bounds of control variables. +* XDROIT quadratic constraint radius squared. +* EPSIM tolerence used for inner linear LEMKE or SIMPLEX calculation. +* IMPR print flag. +* +*Parameters: ouput +* IERR return code (=0: normal completion). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPOPT + INTEGER N0,NCST,M0,MINMAX,IMTHD,INEGAL(NCST),IMPR,IERR + DOUBLE PRECISION FCOST,XOBJ(N0),PDG(N0),GRAD(N0,NCST+1), + > CONTR(NCST),DINF(N0),DSUP(N0),XDROIT,EPSIM +*---- +* LOCAL VARIABLES +*---- + INTEGER ME,MI,I,J,NPM + DOUBLE PRECISION XX + CHARACTER CLNAME*6 + INTEGER, ALLOCATABLE, DIMENSION(:) :: INPLUS + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: BPLUS,GF + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: APLUS +*---- +* DATA STATEMENTS +*---- + DATA CLNAME /'PLDRV'/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(INPLUS(M0+1)) + ALLOCATE(BPLUS(M0+2),GF(N0),APLUS(M0+2,(M0+1)+N0)) +*---- +* SET COSTS OF CONTROL VARIABLES +*---- + DO 10 I=1,N0 + GF(I)=GRAD(I,1)*REAL(MINMAX) + 10 CONTINUE +*---- +* ORGANIZE TABLES APLUS AND BPLUS FOR EQUALITY CONSTRAINTS +*---- + ME=0 + DO 30 I=1,NCST + IF(INEGAL(I).EQ.0) THEN + ME = ME + 1 + DO 20 J=1,N0 + APLUS(ME,J) = GRAD(J,I+1) + 20 CONTINUE + BPLUS(ME) = CONTR(I) + INPLUS(ME) = 0 + ENDIF + 30 CONTINUE +*---- +* ORGANIZE TABLES APLUS AND BPLUS FOR INEQUALITY CONSTRAINTS +*---- + MI=0 + DO 50 I=1,NCST + IF(INEGAL(I).NE.0) THEN + MI = MI + 1 + DO 40 J=1,N0 + APLUS(ME+MI,J) = GRAD(J,I+1) + 40 CONTINUE + BPLUS(ME+MI) = CONTR(I) + INPLUS(ME+MI) = INEGAL(I) + ENDIF + 50 CONTINUE +*---- +* ORGANIZE TABLES APLUS AND BPLUS FOR CONTROL-VARIABLE BOUNDS +*---- + DO 80 I=1,N0 + XX = SQRT(XDROIT/PDG(I)) + IF(DINF(I).GT.-XX) THEN + MI = MI + 1 + DO 60 J=1,N0 + APLUS(ME+MI,J) = 0.0D0 + 60 CONTINUE + APLUS(ME+MI,I) = 1.0D0 + BPLUS(ME+MI) = DINF(I) + INPLUS(ME+MI) = -1 + ENDIF + IF(DSUP(I).LT.XX) THEN + MI = MI + 1 + DO 70 J=1,N0 + APLUS(ME+MI,J) = 0.0D0 + 70 CONTINUE + APLUS(ME+MI,I) = 1.0D0 + BPLUS(ME+MI) = DSUP(I) + INPLUS(ME+MI) = 1 + ENDIF + 80 CONTINUE +* + DO 90 J=1,N0 + APLUS(M0+1,J) = 0.0D0 + 90 CONTINUE + BPLUS(M0+1) = 0.0D0 + INPLUS(M0+1) = 0 +* + IF(M0.NE.ME+MI) THEN + WRITE (6,1000) M0,ME,MI + CALL XABORT('PLDRV: M0 AND ME+MI ARE NOT THE SAME') + ENDIF +*---- +* PRINT THE QUASILINEAR PROBLEM +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(GF,APLUS,INPLUS,BPLUS,PDG,DINF,DSUP,N0,M0, + > CLNAME) + ENDIF +*---- +* LEMKE METHOD +*---- + NPM=(M0+1)+N0 + IF(IMTHD.LE.2) THEN + CALL PLMAP2(N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,GF,FCOST,XOBJ, + 1 IMTHD,EPSIM,IMPR,IERR) +*---- +* MAP +*---- + ELSE IF(IMTHD.EQ.3) THEN + CALL PLMAP1(N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,GF,FCOST, + 1 XOBJ,IMTHD,IMPR,IERR) +*---- +* AUGMENTED LAGRANGIAN +*---- + ELSE IF(IMTHD.EQ.4) THEN + CALL PLLA(IPOPT,N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT, + 1 FCOST,GF,XOBJ,IMPR,EPSIM,NCST,GRAD,CONTR,INEGAL,IERR) +*---- +* EXTERNAL PENALTY METHOD +*---- + ELSE IF(IMTHD.EQ.5) THEN + CALL PLPNLT(IPOPT,N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT, + 1 FCOST,GF,XOBJ,IMPR,EPSIM,NCST,GRAD,CONTR,INEGAL,IERR) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(APLUS,GF,BPLUS) + DEALLOCATE(INPLUS) + RETURN +* +1000 FORMAT(/' PLDRV: INCONSISTENCY BETWEEN M0 AND ME+MI ',3I5) + END diff --git a/Donjon/src/PLLA.f b/Donjon/src/PLLA.f new file mode 100644 index 0000000..da3b884 --- /dev/null +++ b/Donjon/src/PLLA.f @@ -0,0 +1,240 @@ +*DECK PLLA + SUBROUTINE PLLA(IPOPT,N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,FCOST, + > GF,XOBJ,IMPR,EPSIM,NCST,GRAD,CONTR,INEGAL,IERR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solves the quasi-linear problem using the augmented Lagrangian. +* PLLA = Linear Programmation Augmented Lagrangian +* +*Copyright: +* Copyright (C) 2002 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): R. Chambon +* +*Parameters: input/ouput +* IPOPT pointer to the L_OPTIMIZE object. +* N0 number of control variables. +* M0 number of constraints. +* APLUS coefficient matrix for the linear constraints. +* PDG weights assigned to control variables in the quadratic +* constraint. +* BPLUS right hand sides corresponding to the coefficient matrix. +* INPLUS constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* XDROIT quadratic constraint radius squared. +* FCOST costs of control variables. +* GF objective function. +* XOBJ control variables. +* IMPR print flag. +* EPSIM tolerence used for inner linear SIMPLEX calculation. +* NCST number of constraints. +* GRAD linearized gradients (GRAD(:,1) are control variable costs +* and GRAD(:,2:NCST+1) are linear constraint coefficients). +* CONTR constraint right hand sides. +* INEGAL constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* +*Parameters: ouput +* IERR return code (=0: normal completion). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPOPT + INTEGER N0,M0,INPLUS(M0+1),IMPR,NCST,INEGAL(NCST),IERR + DOUBLE PRECISION PDG(N0),BPLUS(M0+2),XDROIT,XOBJ(N0),EPSIM, + > GRAD(N0,NCST+1),CONTR(NCST),APLUS(M0+2,M0+N0+1),GF(N0),FCOST +*---- +* LOCAL VARIABLES +*---- + INTEGER ITERMX,LENGT,ITYP,I,J,K,ITER,NPM,M0B + PARAMETER (ITERMX=10) + LOGICAL LCST(NCST),LCST2(NCST),LTST + DOUBLE PRECISION LACOST,NORM,CRIT,LA0E + INTEGER, ALLOCATABLE, DIMENSION(:) :: INPL2 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: LAFAC,CSTWGT,B2, + > CONTR2,LAGF + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: APLUS2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(INPL2(M0-NCST+1)) + ALLOCATE(LAFAC(NCST),CSTWGT(NCST),B2(M0-NCST+2),CONTR2(NCST)) + ALLOCATE(LAGF(N0),APLUS2(M0-NCST+1,N0+M0-NCST)) +*---- +* STEP 0: INITIALIZATION +* NPM: SIZE OF THE LINEARIZED SYSTEM. +* M0B: NUMBER OF LINEARIZED CONSTRAINTS FOR THE LA ALGORITHM. +* CORRESPONDS TO THE NUMBER OF POSSIBLY ACTIVE BOUNDS. +*---- + NPM=(M0+1)+N0 + M0B=M0-NCST + IF(NCST.GT.0) THEN + CALL LCMLEN(IPOPT,'F-LA-MULT',LENGT,ITYP) + IF(LENGT.EQ.0) THEN + CALL XABORT('PLLA: LAGRANGIAN FACTORS NON INITIALIZED') + ELSEIF(LENGT.EQ.NCST) THEN + CALL LCMGET(IPOPT,'F-LA-MULT',LAFAC) + ELSE + CALL XABORT('PLLA: WRONG NUMBER OF LA COEFFICIENTS') + ENDIF + CALL LCMLEN(IPOPT,'CST-WEIGHT',LENGT,ITYP) + IF(LENGT.EQ.0) THEN + CALL XABORT('PLLA: CONSTRAINTS PENALTIES NON INITIALIZED') + ELSEIF(LENGT.EQ.NCST) THEN + CALL LCMGET(IPOPT,'CST-WEIGHT',CSTWGT) + ELSE + CALL XABORT('PLLA: WRONG NUMBER OF CONSTRAINT WEIGHTS') + ENDIF + DO 10 J=1,NCST + CONTR2(J)=-CONTR(J) + 10 CONTINUE + LCST2(:NCST)=.TRUE. + LCST(:NCST)=.TRUE. + ENDIF + XOBJ(:N0)=0.0D0 +*---- +* INTERNAL ITERATIONS FOR THE LINEAR PROBLEM +*---- + ITER=0 + 99 ITER=ITER+1 + LTST=.TRUE. +*---- +* STEP 1: LA FUNCTION EVALUATION +*---- + DO 110 J=1,NCST + IF(INEGAL(J).NE.0) THEN + CRIT=CONTR2(J) + DO 100 I=1,N0 + CRIT=CRIT+GRAD(I,J+1)*XOBJ(I) + 100 CONTINUE + CRIT=CSTWGT(J)*INEGAL(J)*CRIT+LAFAC(J) + LCST(J)=(CRIT.LE.0.0) + ENDIF + 110 CONTINUE + + DO 150 I=1,N0 + LAGF(I)=GF(I) + DO 140 J=1,NCST + IF(INEGAL(J).EQ.0) THEN + LAGF(I)=LAGF(I)+GRAD(I,J+1)*(LAFAC(J)+CSTWGT(J)*CONTR2(J)) + ELSEIF(.NOT.LCST(J)) THEN + LAGF(I)=LAGF(I)+INEGAL(J)*GRAD(I,J+1) + 1 *(CSTWGT(J)*INEGAL(J)*CONTR2(J)+2*LAFAC(J)) + ENDIF + 140 CONTINUE + 150 CONTINUE + + LACOST=FCOST + DO 160 J=1,NCST + IF(INEGAL(J).EQ.0) THEN + LACOST=LACOST+(LAFAC(J)+CSTWGT(J)/2.0*CONTR2(J))*CONTR2(J) + ELSEIF(.NOT.LCST(J)) THEN + LACOST=LACOST+INEGAL(J)*CONTR2(J)*2.0*LAFAC(J) + 1 +CSTWGT(J)/2.0*CONTR2(J)**2 + ELSE + LACOST=LACOST-3.0*LAFAC(J)**2/2.0/CSTWGT(J) + ENDIF + 160 CONTINUE + IF(ITER.EQ.1) LA0E=LACOST + IF(IMPR.GE.3) THEN + WRITE(6,*) 'GF',(GF(I),I=1,N0) + WRITE(6,*) 'LAGF',(LAGF(I),I=1,N0) + WRITE(6,*) 'PDG',(PDG(I),I=1,N0) + WRITE(6,*) 'LACOST',LACOST,'M0B',M0B,'XDROIT',XDROIT + ENDIF +*---- +* STEP 2: SOLUTION +* k,l +* compute DX +* case 1 +* If there is no constraints for the LA problem (M0B=0), +* then the solution is obvious: on the hypersphere(radius XDROIT) +* in the direction LAGF +*---- + IF(M0B.EQ.0) THEN +* + NORM=0.0 + DO 200 I=1,N0 + NORM=NORM+LAGF(I)**2/PDG(I) + 200 CONTINUE + NORM=NORM**0.5 +* + IF(NORM.EQ.0.0) THEN + XOBJ(:N0)=0.0D0 + ELSE + DO 210 I=1,N0 + XOBJ(I)=-XDROIT**0.5*LAGF(I)/PDG(I)/NORM + 210 CONTINUE + ENDIF +*---- +* CASE 2 +* SOLUTION WITH THE LEMKE METHOD +*---- + ELSE +* + DO 260 K=1,M0B + DO 250 I=1,N0 + APLUS2(K,I)=APLUS(NCST+K,I) + 250 CONTINUE + B2(K)=BPLUS(NCST+K) + INPL2(K)=INPLUS(NCST+K) + 260 CONTINUE + DO 270 I=1,N0 + APLUS2(M0B+1,I) = 0.0D0 + 270 CONTINUE + BPLUS(M0B+1) = 0.0 + INPL2(M0B+1) = 0 +* + CALL PLMAP2(N0,M0B,APLUS2,PDG,B2,INPL2,XDROIT,LAGF,LACOST,XOBJ,2, + > EPSIM,IMPR,IERR) +* + ENDIF + DO 410 J=1,NCST + IF(INEGAL(J).NE.0) THEN + CRIT=CONTR2(J) + DO 400 I=1,N0 + CRIT=CRIT+GRAD(I,J+1)*XOBJ(I) + 400 CONTINUE + CRIT=CSTWGT(J)*INEGAL(J)*CRIT+LAFAC(J) + LCST2(J)=(CRIT.LE.0.0) + ENDIF + 410 CONTINUE + + IF((IMPR.GE.2).AND.(NCST.GT.0)) THEN + WRITE(6,*) (LCST(J),J=1,NCST) + WRITE(6,*) (LCST2(J),J=1,NCST) + ENDIF + DO 420 J=1,NCST + LTST=LTST.AND.(LCST(J).EQV.LCST2(J)) + 420 CONTINUE + + IF((.NOT.LTST) .AND.(ITER.LE.ITERMX)) GO TO 99 +*---- +* k,l +* STEP 3: SAVE L +* a +*---- + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + CALL LCMPUT(IPOPT,'F-LA-EVAL',1,4,LA0E) + IF(IMPR.GE.1) WRITE(6,*) 'LAGF',(LAGF(I),I=1,N0) + CALL LCMPUT(IPOPT,'DF-LA-PENAL',N0,4,LAGF) + CALL LCMSIX(IPOPT,' ',0) +* + IF(IMPR.GE.1) WRITE(6,*) 'Dvar',(XOBJ(I),I=1,N0) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(APLUS2,LAGF) + DEALLOCATE(CONTR2,B2,CSTWGT,LAFAC) + DEALLOCATE(INPL2) + RETURN + END diff --git a/Donjon/src/PLMAP1.f b/Donjon/src/PLMAP1.f new file mode 100644 index 0000000..3f4d677 --- /dev/null +++ b/Donjon/src/PLMAP1.f @@ -0,0 +1,341 @@ +*DECK PLMAP1 + SUBROUTINE PLMAP1(N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,COUT,OBJ, + > XOBJ,IMTHD,IMPR,IERR,BINF,BSUP,SCALE,PX,RX,DELTA,BGAR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solves a linear optimization problem with quadratic constraint using +* the method of approximation programming (MAP). +* PLMAP1 = Linear Programmation MAP1 +* +*Reference: +* R.E. Griffith and R.A. Stewart, 'A non-linear programming technique +* for the optimization of continuous processing systems', Management +* Science, Vol. 7, NO. 4, 379 (1961). +* +*Copyright: +* Copyright (C) 2002 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 and R. Chambon +* +*Parameters: input +* N0 number of control variables. +* M0 number of constraints. +* APLUS coefficient matrix for the linear constraints. +* PDG weights assigned to control variables in the quadratic +* constraint. +* BPLUS right hand sides corresponding to the coefficient matrix. +* INPLUS constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* XDROIT quadratic constraint radius squared. +* COUT costs of control variables. +* OBJ objective function. +* XOBJ control variables. +* IMTHD type of solution (=1: SIMPLEX/LEMKE; =3: MAP). +* IMPR print flag. +* +*Parameters: ouput +* IERR return code (=0: normal completion). +* +*Parameters: scratch +* BINF +* BSUP +* SCALE +* PX +* RX +* DELTA +* BGAR +* +*----------------------------------------------------------------------- +* + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER N0,M0,INPLUS(M0+1),IMTHD,IMPR,IERR + DOUBLE PRECISION PDG(N0),BPLUS(M0+2),XDROIT,XOBJ(N0),BINF(N0), + > BSUP(N0),SCALE(N0),PX(N0),RX(N0),DELTA(N0),BGAR(M0+1), + > APLUS(M0+2,N0),COUT(N0),OBJ +*---- +* LOCAL VARIABLES +*---- + DOUBLE PRECISION DELF,X,DUMY,ZMAX,XVAL,SCAL,DELX,TEMP,ERR, + > CONT,EPSIR,EPS,EPSS + INTEGER ITER,ITMAX,I,J,M + CHARACTER CLNAME*6 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: ZMAXC,BGAR0 +*---- +* DATA STATEMENTS +*---- + DATA CLNAME /'PLMAP'/ +* + EPS = 0.0001D0 + EPSIR =EPS + ITMAX = 100 +*---- +* CONTROL-VARIABLE SCALING +*---- + DO 10 J=1,N0 + SCAL = SQRT(XDROIT/PDG(J)) + SCALE(J) = SCAL + COUT(J) = COUT(J)*SCAL +* + PDG(J) = 1.0D0 + BINF(J) = 0.0D0 + BSUP(J) = 0.0D0 +* + DO 20 I=1,M0 + APLUS(I,J) = APLUS(I,J)*SCAL + 20 CONTINUE +* + 10 CONTINUE +*---- +* PRINT TABLES AFTER SCALING OF CONTROL VARIABLES +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(COUT,APLUS,INPLUS,BPLUS,PDG,BINF,BSUP, + > N0,M0,CLNAME//' AFTER SCALING OF CONTROL VARIABLES') + ENDIF +* + XDROIT=1.0D0 +*---- +* CONSTRAINT SCALING +*---- + ALLOCATE(ZMAXC(M0)) + DO 30 I=1,M0 + ZMAX = ABS(BPLUS(I)) +* + DO 40 J=1,N0 + ZMAX = MAX(ZMAX,ABS(APLUS(I,J))) + 40 CONTINUE + BGAR(I) = BPLUS(I)/ZMAX +* + DO 42 J=1,N0 + APLUS(I,J) = APLUS(I,J)/ZMAX + 42 CONTINUE + ZMAXC(I) = ZMAX + 30 CONTINUE +*---- +* COST SCALING +*---- + ZMAX = 0.0D0 + DO 45 J=1,N0 + ZMAX = MAX(ZMAX,ABS(COUT(J))) + 45 CONTINUE + DO 50 J=1,N0 + COUT(J) = COUT(J)/ZMAX + 50 CONTINUE +*---- +* PRINT TABLES AFTER SCALING OF COSTS AND CONSTRAINTS +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(COUT,APLUS,INPLUS,BGAR,PDG,BINF,BSUP,N0,M0, + > CLNAME//' AFTER SCALING OF COSTS AND CONSTRAINTS') + ENDIF + ALLOCATE(BGAR0(M0)) + DO 52 I=1,M0 + BGAR0(I) = BGAR(I) + 52 CONTINUE +*---- +* INITIAL ESTIMATES +*---- + DELX = SQRT(XDROIT) + EPSS = EPS*DELX +* + DO 55 I=1,N0 + DELTA(I) = DELX/10.0 + RX(I) = 0.0 + 55 CONTINUE + TEMP = DELX/SQRT(REAL(N0))/10 +*---- +* MAP ITERATIONS +*---- + ITER = 0 + 60 ITER = ITER + 1 + CONT = 0.0 + DO 70 I=1,M0+1 + BGAR(I) = BGAR0(I) + 70 CONTINUE +*---- +* CONTROL VARIABLE BOUNDS +*---- + DO 90 I=1,N0 + IF(ITER.EQ.1) THEN +! XOBJ(I) = EPSIR*10.0 + XOBJ(I) = 0.0 + BINF(I) = -TEMP + BSUP(I) = TEMP + ELSE + BINF(I) = -DELTA(I) + BSUP(I) = DELTA(I) + ENDIF +*---- +* LINEARIZATION OF THE QUADRATIC CONSTRAINT +*---- + CONT = CONT + XOBJ(I)**2 + APLUS(M0+1,I) = 2.0*XOBJ(I) + DO 95 J=1,M0 + BGAR(J) = BGAR(J) - APLUS(J,I)*XOBJ(I) + 95 CONTINUE + 90 CONTINUE +* + INPLUS(M0+1) = 1 + BGAR(M0+1) = XDROIT - CONT + M = M0 + 1 +*---- +* REORGANIZE TABLES FOR SIMPLEX +*---- + DO 120 I=1,M + DUMY = 0.0D0 +* + DO 100 J=1,N0 + DUMY = DUMY + APLUS(I,J)*BINF(J) + 100 CONTINUE +* + BGAR(I) = BGAR(I) - DUMY + IF(BGAR(I).GE.0.0) GOTO 120 +* + DO 110 J=1,N0 + APLUS(I,J) = -APLUS(I,J) + 110 CONTINUE +* + BGAR(I) = -BGAR(I) + BGAR0(I)= -BGAR0(I) + BPLUS(I) = -BPLUS(I) + INPLUS(I) = -INPLUS(I) +* + 120 CONTINUE +* + DO 130 J=1,N0 + BSUP(J) = BSUP(J) - BINF(J) + BINF(J) = 0.0 + 130 CONTINUE +*---- +* PRINT SIMPLEX TABLES +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(COUT,APLUS,INPLUS,BGAR ,XOBJ ,BINF ,BSUP,N0,M0, + > CLNAME//' AFTER REORGANIZATION FOR SIMPLEX') + ENDIF +*---- +* SOLUTION OF A LINEAR PROGRAMMING PROBLEM USING THE SIMPLEX +*---- + CALL PLSPLX(N0,M,M0+2,1,COUT,APLUS,BGAR,INPLUS,BINF,BSUP,PX, + > DELF,EPSS,IMTHD,IMPR,IERR) +* + DO 140 I=1,N0 + IF(ITER.EQ.1) THEN + PX(I) = PX(I) - TEMP + ELSE + PX(I) = PX(I) - DELTA(I) + ENDIF + 140 CONTINUE +*---- +* SOLUTION OF CURRENT ITERATION +*---- + IF(IMPR.GE.2) THEN + IF(((ITER.GE.1).AND.(IMPR.LE.2)).OR.(IMPR.GE.3)) THEN + WRITE (6,1000) + ENDIF + WRITE (6,2000) ITER,DELF,(PX(I),I=1,N0) + ENDIF +*---- +* DEGENERESCENCE OR EPS TOO SMALL +*---- + IF(IERR.EQ.1) THEN + WRITE(6,3000) ITER + IERR = 3 + RETURN +*---- +* NO SOLUTION IF ITER=1 +*---- + ELSE IF(IERR.EQ.2) THEN + IF(IMPR.GE.1) WRITE(6,4000) ITER + IF(ITER.GE.ITMAX) RETURN + ENDIF +* + ERR = 0.0 + DO 160 I=1,N0 +* + IF((RX(I)*PX(I).LT.0.0).AND.(IERR.EQ.0)) THEN + DELTA(I) = DELTA(I)*0.5 + ENDIF +* + RX(I) = PX(I) + XOBJ(I) = XOBJ(I) + PX(I) + ERR = ERR + PX(I)**2 + 160 CONTINUE +* + ERR = SQRT(ERR) + EPSS = EPS*DELX/10.0 +* + IF(IMPR.GE.1) THEN + WRITE(6,2000) ITER,DELF,(XOBJ(I),I=1,N0) + WRITE(6,2000) ITER,0.0,(DELTA(I),I=1,N0) + ENDIF +* + IF(ERR.LE.EPSS) THEN + IERR = 0 + GOTO 170 + ENDIF +* + IF(ITER.GE.ITMAX) THEN + IERR = 5 + WRITE (6,5000) ITER + RETURN + ENDIF + GO TO 60 +*---- +* RESCALE BACK AND PRINT THE SOLUTION +*---- + 170 DO 175 J=1,N0 + SCAL = SCALE(J) + COUT(J) = COUT(J)*ZMAX/SCAL + XOBJ(J) = XOBJ(J)*SCAL + PDG(J) = XDROIT/SCAL**2 +* + DO 177 I=1,M0 + APLUS(I,J) = APLUS(I,J)/SCAL + 177 CONTINUE + 175 CONTINUE +* + X = 0.0D0 + OBJ = 0.0D0 + DO 180 J=1,N0 + X = X + PDG(J)*XOBJ(J)*XOBJ(J) + OBJ = OBJ + XOBJ(J)*COUT(J) + 180 CONTINUE +* + IF(IMPR.GE.1) THEN + WRITE (6,6000) OBJ,X,(XOBJ(J),J=1,N0) + IF(M0.GT.0) WRITE (6,7000) +* + DO 190 I=1,M0 + XVAL = BPLUS(I) + DO 185 J=1,N0 + XVAL = XVAL - APLUS(I,J)*XOBJ(J)*ZMAXC(I)/SCALE(J) + 185 CONTINUE + WRITE (6,8000) I,XVAL + 190 CONTINUE + ENDIF + DEALLOCATE(ZMAXC,BGAR0) + RETURN +* +1000 FORMAT(/,5X,'ITERATION',8X,'DELF',5X,'CONTROL VARIABLES') +2000 FORMAT(5X,I6,5X,8E12.4,/,(28X,5E12.4)) +3000 FORMAT(5X,I6,5X,'DEGENERESCENCE OR EPS TOO SMALL') +4000 FORMAT(5X,I6,5X,'NO SOLUTION') +5000 FORMAT(5X,I6,5X,'MAXIMUM ITERATION REACHED') +6000 FORMAT(//,5X,'FINAL SOLUTION (MAP1-SIMPLEX) ', + > /,5X,'------------------------', + > /,5X,'OBJECTIVE FUNCTION : ',1P,E12.5, + > /,5X,'QUADRATIC CONSTRAINT : ',1P,E12.5, + > /,5X,'CONTROL VARIABLES : ',/,(10X,10E12.4)) +7000 FORMAT(//,5X,'CONSTRAINT DEVIATIONS : ',/) +8000 FORMAT(2X,I3,'...',2X,1P,D12.4) + END diff --git a/Donjon/src/PLMAP2.f b/Donjon/src/PLMAP2.f new file mode 100644 index 0000000..f1c4ddf --- /dev/null +++ b/Donjon/src/PLMAP2.f @@ -0,0 +1,292 @@ +*DECK PLMAP2 + SUBROUTINE PLMAP2(N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,COUT,OBJ, + > XOBJ,IMTHD,EPSIM,IMPR,IERR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solves a linear optimization problem with quadratic constraints using +* the method of LEMKE. +* PLMAP2 = Linear Programmation MAP2 +* +*Reference: +* J. A. Ferland, 'A linear programming problem with an additional +* quadratic constraint solved by parametric linear complementarity', +* Publication number 497, Departement d'informatique et de recherche +* operationnelle, Universite de Montreal, January 1984. +* +*Copyright: +* Copyright (C) 2002 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 and R. Chambon +* +*Parameters: input +* N0 number of control variables. +* M0 number of constraints. +* APLUS coefficient matrix for the linear constraints. +* PDG weights assigned to control variables in the quadratic +* constraint. +* BPLUS right hand sides corresponding to the coefficient matrix. +* INPLUS constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* XDROIT quadratic constraint radius squared. +* COUT costs of control variables. +* OBJ objective function. +* XOBJ control variables. +* IMTHD type of solution (=1: SIMPLEX/LEMKE; =2: LEMKE/LEMKE). +* EPSIM tolerence used for inner linear SIMPLEX calculation. +* IMPR print flag. +* +*Parameters: ouput +* IERR return code (=0: normal completion). +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER N0,M0,INPLUS(M0+1),IMTHD,IMPR,IERR + DOUBLE PRECISION PDG(N0),BPLUS(M0+2),XDROIT,XOBJ(N0),EPSIM, + > APLUS(M0+2,(M0+1)+N0),COUT(N0),OBJ +*---- +* LOCAL VARIABLES +*---- + CHARACTER CLNAME*6 + DOUBLE PRECISION X,ZMAX,XVAL,SCAL,EPS,FACTOR + INTEGER I,J,M0NEW + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: BINF,BSUP,SCALE +*---- +* DATA STATEMENTS +*---- + DATA CLNAME /'PLMAP2'/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(BINF(N0),BSUP(N0),SCALE(N0)) +* + EPS=EPSIM +*---- +* CONTROL-VARIABLE SCALING +*---- + FACTOR=MAX(XDROIT,EPSIM) + DO 10 J=1,N0 + SCAL = SQRT(FACTOR/PDG(J)) + SCALE(J) = SCAL + COUT(J) = COUT(J)*SCAL +* + PDG(J) = 1.0 + BINF(J) = 0.0 + BSUP(J) = 0.0 +* + DO 20 I=1,M0 + APLUS(I,J) = APLUS(I,J)*SCAL + 20 CONTINUE +* + 10 CONTINUE +*---- +* PRINT TABLES AFTER SCALING OF CONTROL VARIABLES +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(COUT,APLUS,INPLUS,BPLUS,PDG,BINF,BSUP, + > N0,M0,CLNAME//' AFTER SCALING OF VARIABLES') + ENDIF +* + XDROIT = XDROIT/FACTOR +*---- +* CONSTRAINT SCALING +*---- + DO 30 I=1,M0 + ZMAX = ABS(BPLUS(I)) +* + DO 40 J=1,N0 + ZMAX = MAX(ZMAX,ABS(APLUS(I,J))) + 40 CONTINUE + BPLUS(I) = BPLUS(I)/ZMAX +* + DO 42 J=1,N0 + APLUS(I,J) = APLUS(I,J)/ZMAX + 42 CONTINUE + 30 CONTINUE +*---- +* COST SCALING +*---- + ZMAX = 0.0D0 + DO 45 J=1,N0 + ZMAX = MAX(ZMAX,ABS(COUT(J))) + 45 CONTINUE +* + DO 50 J=1,N0 + COUT(J) = COUT(J)/ZMAX + 50 CONTINUE +*---- +* STEP 1 +*---- + M0NEW = M0 + 1 + DO 55 I=1,N0 + BINF(I) = -SQRT(XDROIT) + BSUP(I) = SQRT(XDROIT) + APLUS(M0NEW,I) = 0.0D0 + 55 CONTINUE + BPLUS(M0NEW) = 0.0D0 +*---- +* PRINT TABLES AFTER SCALING OF COSTS AND CONSTRAINTS +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(COUT,APLUS,INPLUS,BPLUS,PDG,BINF,BSUP,N0,M0, + > CLNAME//' AFTER SCALING OF COSTS AND CONSTRAINTS') + ENDIF +* + IF(IMTHD.EQ.1) THEN +*---- +* SOLUTION OF A LINEAR OPTIMIZATION PROBLEM USING THE SIMPLEX METHOD +*---- + CALL PLSPLX(N0,M0,M0+2,1,COUT,APLUS,BPLUS,INPLUS,BINF,BSUP, + > XOBJ,OBJ,EPS,IMTHD,IMPR,IERR) +* + DO 70 I=1,M0 + IF(INPLUS(I).EQ.-1) THEN + DO 60 J=1,N0 + APLUS(I,J) = -APLUS(I,J) + 60 CONTINUE + BPLUS(I) = -BPLUS(I) + INPLUS(I) = 1 + ELSE IF(INPLUS(I).EQ.0) THEN + DO 65 J=1,N0 + APLUS(M0NEW,J) = APLUS(M0NEW,J) - APLUS(I,J) + 65 CONTINUE + BPLUS(M0NEW) = BPLUS(M0NEW) - BPLUS(I) + ENDIF + 70 CONTINUE + ELSE +*---- +* SOLUTION OF A LINEAR OPTIMIZATION PROBLEM USING THE LINEAR LEMKE +* METHOD +*---- + DO 90 I=1,M0 + IF(INPLUS(I).EQ.-1) THEN + DO 75 J=1,N0 + APLUS(I,J) = -APLUS(I,J) + 75 CONTINUE + BPLUS(I) = -BPLUS(I) + INPLUS(I) = 1 + ELSE IF(INPLUS(I).EQ.0) THEN + DO 80 J=1,N0 + APLUS(M0NEW,J) = APLUS(M0NEW,J) - APLUS(I,J) + 80 CONTINUE + BPLUS(M0NEW) = BPLUS(M0NEW) - BPLUS(I) + ENDIF + 90 CONTINUE + CALL PLLINR(N0,M0NEW,M0+2,COUT,APLUS,BPLUS,BINF,BSUP,XOBJ,OBJ, + > EPS,IMPR,IERR) + ENDIF +* + IF(IERR.GE.1) THEN + WRITE (6,6000) IERR + GO TO 500 + ENDIF +* + X = 0.0D0 + DO 100 J=1,N0 + X = X + PDG(J)*XOBJ(J)*XOBJ(J) + 100 CONTINUE + IF(IMPR.GE.2) THEN + IF(IMTHD.EQ.1) THEN + WRITE (6,1000) OBJ,X,(XOBJ(I),I=1,N0) + ELSE IF(IMTHD.EQ.2) THEN + WRITE (6,1500) OBJ,X,(XOBJ(I),I=1,N0) + ENDIF + ENDIF +* + IF(IMPR.GE.5) THEN + WRITE(6,*) 'AFTER LINEAR OPTIMIZATION' + WRITE(6,*) 'XOBJ ',(XOBJ(J),J=1,N0) + WRITE(6,*) 'PDG ',(PDG(J),J=1,N0) + WRITE(6,*) 'OBJ ',OBJ + WRITE(6,*) 'X ',X + WRITE(6,*) 'XDROIT ',XDROIT + ENDIF +*---- +* SOLUTION OF A LINEAR OPTIMIZATION PROBLEM WITH A QUADRATIC CONSTRAINT +* USING THE GENERAL LEMKE METHOD +*---- + IF(X.GT.XDROIT) THEN + DO J=1,N0 + APLUS(M0NEW+1,J) = COUT(J) + ENDDO + BPLUS(M0NEW+1) = OBJ +* + CALL PLQUAD(N0,M0NEW,M0+2,APLUS,BPLUS,PDG,XDROIT,COUT,XOBJ,EPS, + > IMPR,IERR) +* + IF(IERR.GE.1) THEN + WRITE(6,2000) IERR + IERR = IERR + 10 + GO TO 500 + ENDIF + ENDIF +*---- +* RESCALE BACK AND PRINT THE SOLUTION +*---- + DO 170 J=1,N0 + SCAL = SCALE(J) + COUT(J) = COUT(J)*ZMAX/SCAL + XOBJ(J) = XOBJ(J)*SCAL + PDG(J) = FACTOR/SCAL**2 +* + DO 175 I=1,M0 + APLUS(I,J) = APLUS(I,J)/SCAL + 175 CONTINUE + 170 CONTINUE +*---- +* COMPUTE THE NEW OPTIMAL POINT +*---- + X = 0.0D0 + OBJ = 0.0D0 + DO 180 J=1,N0 + X = X + PDG(J)*XOBJ(J)*XOBJ(J) + OBJ = OBJ + XOBJ(J)*COUT(J) + 180 CONTINUE +* + IF(IMPR.GE.1) THEN + WRITE (6,3000) OBJ,X,(XOBJ(J),J=1,N0) + WRITE (6,4000) +* + DO 190 I=1,M0 + XVAL = BPLUS(I) + DO 185 J=1,N0 + XVAL = XVAL - APLUS(I,J)*XOBJ(J) + 185 CONTINUE + WRITE (6,5000) I,XVAL + 190 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 500 DEALLOCATE(SCALE,BSUP,BINF) + RETURN +* +1000 FORMAT(//,5X,'SOLUTION WITHOUT QUADRATIC CONSTRAINT (SIMPLEX) :', + > /,5X,'------------------------------------------------', + > /,5X,'OBJECTIVE FUNCTION : ',1P,E12.5, + > /,5X,'QUADRATIC CONSTRAINT : ',1P,E12.5, + > /,5X,'CONTROL VARIABLES : ',/,(10X,10E12.4)) +1500 FORMAT(//,5X,'SOLUTION WITHOUT QUADRATIC CONSTRAINT (LINR) :', + > /,5X,'---------------------------------------------', + > /,5X,'OBJECTIVE FUNCTION : ',1P,E12.5, + > /,5X,'QUADRATIC CONSTRAINT : ',1P,E12.5, + > /,5X,'CONTROL VARIABLES : ',/,(10X,10E12.4)) +2000 FORMAT(//,5X,'PLMAP2: ECHEC DU MODULE QUADR IERR = ',I2) +3000 FORMAT(//,5X,'FINAL SOLUTION :', + > /,5X,'---------------------', + > /,5X,'OBJECTIVE FUNCTION : ',1P,E12.5, + > /,5X,'QUADRATIC CONSTRAINT : ',1P,E12.5, + > /,5X,'CONTROL VARIABLES : ',/,(10X,10E12.4)) +4000 FORMAT(//,5X,'CONSTRAINT DEVIATIONS :',/) +5000 FORMAT(2X,I3,'...',2X,1P,E12.4) +6000 FORMAT(//,5X,'PLMAP2: FAILURE OF LINEAR ALGORITHM (IERR=',I5,')') + END diff --git a/Donjon/src/PLNTAB.f b/Donjon/src/PLNTAB.f new file mode 100644 index 0000000..1e8a476 --- /dev/null +++ b/Donjon/src/PLNTAB.f @@ -0,0 +1,90 @@ +*DECK PLNTAB
+ SUBROUTINE PLNTAB(GF,APLUS,INPLUS,BPLUS,XITK,XINF,XSUP,NDEC,M0,
+ > SRCNAM)
+*----------------------------------------------------------------------*
+* *
+*Purpose:
+* Print the arrays of the linear optimization problem.
+*
+*Copyright:
+* Copyright (C) 2002 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):
+* R. Chambon
+*
+*Parameters: input
+* GF costs of control variables.
+* APLUS coefficient matrix for the linear constraints.
+* INPLUS constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.).
+* BPLUS right hand sides corresponding to the coefficient matrix.
+* XITK weights assigned to control variables in the quadratic
+* constraint.
+* XINF lower bounds of control variables.
+* XSUP upper bounds of control variables.
+* NDEC number of control variables.
+* M0 number of constraints plus the number of lower/upper bounds
+* intercepting the quadratic constraint.
+* SRCNAM character text to print.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT DOUBLE PRECISION (A-H,O-Z)
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER M0
+ DOUBLE PRECISION BPLUS(M0+2),XITK(NDEC),XINF(NDEC),XSUP(NDEC),
+ > GF(NDEC),APLUS(M0+2,NDEC)
+ INTEGER INPLUS(M0+1)
+ CHARACTER*(*) SRCNAM
+*----
+* LOCAL VARIABLES
+*----
+ CHARACTER*2 CTYPES(-1:1)
+ CHARACTER*80 FMT
+*
+ DATA CTYPES / '>=',' =','<=' /
+*
+ WRITE(6,1000) SRCNAM
+*
+ IF (NDEC.GT.8) THEN
+ RETURN
+ ELSE
+ FMT = '(1P,XXE13.5,5X,A3,5X,1P,E13.5)'
+ NVAL = NDEC
+ ENDIF
+*
+ IDX = INDEX(FMT,'X')
+ WRITE(FMT(IDX:IDX+1),'(I2.2)') NVAL
+*----
+* PRINT CONTROL-VARIABLE COSTS
+*----
+ WRITE(6,2000) (I,I=1,NDEC)
+ WRITE(6,3000) (GF(I),I=1,NDEC)
+*----
+* PRINT COEFFICIENT MATRIX
+*----
+ IF(M0.GT.0) THEN
+ WRITE(6,4000)
+ DO 10 J=1,M0
+ WRITE(6,FMT) (APLUS(J,I),I=1,NDEC),CTYPES(INPLUS(J)),BPLUS(J)
+ 10 CONTINUE
+ ENDIF
+*
+ WRITE(6,5000) (XINF(I),I=1,NDEC)
+ WRITE(6,6000) (XSUP(I),I=1,NDEC)
+ WRITE(6,7000) (XITK(I),I=1,NDEC)
+ RETURN
+*
+1000 FORMAT(//,5X,'PRINT LINEARIZED OPTIMIZATION PROBLEM IN ',A,/)
+2000 FORMAT( /,5X,'COST(NDEC)',//,(10(5X,I3,5X)),//)
+3000 FORMAT((1P,10E13.5))
+4000 FORMAT( /,5X,'APLUS(M0,NDEC)',35X,'INPLUS(M0)',35X,'BPLUS(M0)',/)
+5000 FORMAT( /,5X,'XINF(NDEC) ',//,(1P,10E13.5))
+6000 FORMAT( /,5X,'XSUP(NDEC) ',//,(1P,10E13.5))
+7000 FORMAT( /,5X,'WEIGHT(NDEC)',//,(1P,10E13.5))
+ END
diff --git a/Donjon/src/PLPNLT.f b/Donjon/src/PLPNLT.f new file mode 100644 index 0000000..e399fd5 --- /dev/null +++ b/Donjon/src/PLPNLT.f @@ -0,0 +1,228 @@ +*DECK PLPNLT + SUBROUTINE PLPNLT(IPOPT,N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT, + > FCOST,GF,XOBJ,IMPR,EPSIM,NCST,GRAD,CONTR,INEGAL,IERR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solves the quasi-linear problem using the external penalty function. +* PLPNLT = Linear Programmation external PeNaLTy function +* +*Copyright: +* Copyright (C) 2002 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): +* R. Chambon +* +*Parameters: input/ouput +* IPOPT pointer to the L_OPTIMIZE object. +* N0 number of control variables. +* M0 number of constraints. +* APLUS coefficient matrix for the linear constraints. +* PDG weights assigned to control variables in the quadratic +* constraint. +* BPLUS right hand sides corresponding to the coefficient matrix. +* INPLUS constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* XDROIT quadratic constraint radius squared. +* FCOST costs of control variables. +* GF objective function. +* XOBJ control variables. +* IMPR print flag. +* EPSIM tolerence used for inner linear SIMPLEX calculation. +* NCST number of constraints. +* GRAD linearized gradients (GRAD(:,1) are control variable costs +* and GRAD(:,2:NCST+1) are linear constraint coefficients). +* CONTR constraint right hand sides. +* INEGAL constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* +*Parameters: ouput +* IERR return code (=0: normal completion). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPOPT + INTEGER N0,M0,INPLUS(M0+1),IMPR,NCST,INEGAL(NCST),IERR + DOUBLE PRECISION PDG(N0),BPLUS(M0+2),XDROIT,XOBJ(N0),EPSIM, + > GRAD(N0,NCST+1),CONTR(NCST),APLUS(M0+2,M0+N0+1),GF(N0),FCOST +*---- +* LOCAL VARIABLES +*---- + INTEGER ITERMX + PARAMETER (ITERMX=10) + INTEGER LENGT,ITYP,I,J,K,ITER + LOGICAL LCST(NCST),LCST2(NCST),LTST + DOUBLE PRECISION NORM,CRIT,LA0E,LACOST + INTEGER, ALLOCATABLE, DIMENSION(:) :: INPL2 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: CSTWGT,B2,CONTR2, + > LAGF + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: APLUS2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(INPL2(M0-NCST+1)) + ALLOCATE(CSTWGT(NCST),B2(M0-NCST+2),CONTR2(NCST)) + ALLOCATE(LAGF(N0),APLUS2(M0-NCST+1,N0+M0-NCST)) +*---- +* STEP 0: INITIALIZATION +* NPM: SIZE OF THE LINEARIZED SYSTEM. +* M0B: NUMBER OF LINEARIZED CONSTRAINTS FOR THE LA ALGORITHM. +* CORRESPONDS TO THE NUMBER OF POSSIBLY ACTIVE BOUNDS. +* NPMB: SIZE OF THE LINEARIZED SYSTEM FOR THE LA ALGORITHM. +*---- + NPM=(M0+1)+N0 + M0B=M0-NCST + NPMB=N0+M0B + IF(NCST.GT.0) THEN + CALL LCMLEN(IPOPT,'CST-WEIGHT',LENGT,ITYP) + IF(LENGT.EQ.0) THEN + CALL XABORT('PLPNLT: CONSTRAINTS PENALTIES NON INITIALIZED') + ELSEIF(LENGT.EQ.NCST) THEN + CALL LCMGET(IPOPT,'CST-WEIGHT',CSTWGT) + ELSE + CALL XABORT('PLPNLT: WRONG NUMBER OF CONSTRAINT WEIGHTS') + ENDIF + DO 10 J=1,NCST + CONTR2(J)=-CONTR(J) + 10 CONTINUE + LCST2(:NCST)=.TRUE. + LCST(:NCST)=.TRUE. + ENDIF + XOBJ(:N0)=0.0D0 +*---- +* INTERNAL ITERATIONS FOR THE LINEAR PROBLEM +*---- + ITER=0 + 99 ITER=ITER+1 + LTST=.TRUE. +*---- +* STEP 1: PENALTY FUNCTION EVALUATION +*---- + DO 110 J=1,NCST + IF(INEGAL(J).NE.0) THEN + CRIT=CONTR2(J) + DO 100 I=1,N0 + CRIT=CRIT+GRAD(I,J+1)*XOBJ(I) + 100 CONTINUE + CRIT=INEGAL(J)*CRIT + LCST(J)=(CRIT.LE.0.0) + ENDIF + 110 CONTINUE + + DO 150 I=1,N0 + LAGF(I)=GF(I) + DO 140 J=1,NCST + IF(INEGAL(J).EQ.0) THEN + LAGF(I)=LAGF(I)+GRAD(I,J+1)*CSTWGT(J)*CONTR2(J) + ELSEIF(.NOT.LCST(J)) THEN + LAGF(I)=LAGF(I)+GRAD(I,J+1)*CSTWGT(J)*CONTR2(J) + ENDIF + 140 CONTINUE + 150 CONTINUE + + LACOST=FCOST + DO 160 J=1,NCST + IF(INEGAL(J).EQ.0) THEN + LACOST=LACOST+CSTWGT(J)/2.0*CONTR2(J)**2 + ELSEIF(.NOT.LCST(J)) THEN + LACOST=LACOST+CSTWGT(J)/2.0*CONTR2(J)**2 + ENDIF + 160 CONTINUE + IF(ITER.EQ.1) LA0E=LACOST + IF(IMPR.GE.3) THEN + WRITE(6,*) 'GF',(GF(I),I=1,N0) + WRITE(6,*) 'LAGF',(LAGF(I),I=1,N0) + WRITE(6,*) 'PDG',(PDG(I),I=1,N0) + WRITE(6,*) 'LACOST',LACOST,'M0B',M0B,'XDROIT',XDROIT + ENDIF +*---- +* STEP 2: SOLUTION +* case 1 +* If there is no constraints for the LA problem (M0B=0), +* then the solution is obvious: on the hypersphere(radius XDROIT) +* in the direction LAGF +*---- + IF(M0B.EQ.0) THEN + NORM=0.0 + DO 200 I=1,N0 + NORM=NORM+LAGF(I)**2/PDG(I) + 200 CONTINUE + NORM=NORM**0.5 +* + IF(NORM.EQ.0.0) THEN + XOBJ(:N0)=0.0D0 + ELSE + DO 210 I=1,N0 + XOBJ(I)=-XDROIT**0.5*LAGF(I)/PDG(I)/NORM + 210 CONTINUE + ENDIF +*---- +* CASE 2 +* SOLUTION WITH THE LEMKE METHOD +*---- + ELSE +* + DO 260 K=1,M0B + DO 250 I=1,N0 + APLUS2(K,I)=APLUS(NCST+K,I) + 250 CONTINUE + B2(K)=BPLUS(NCST+K) + INPL2(K)=INPLUS(NCST+K) + 260 CONTINUE + DO 270 I=1,N0 + APLUS2(M0B+1,I) = 0.0D0 + 270 CONTINUE + BPLUS(M0B+1) = 0.0 + INPL2(M0B+1) = 0 +* + CALL PLMAP2(N0,M0B,APLUS2,PDG,B2,INPL2,XDROIT,LAGF,LACOST,XOBJ,2, + > EPSIM,IMPR,IERR) +* + ENDIF + DO 410 J=1,NCST + IF(INEGAL(J).NE.0) THEN + CRIT=CONTR2(J) + DO 400 I=1,N0 + CRIT=CRIT+GRAD(I,J+1)*XOBJ(I) + 400 CONTINUE + CRIT=INEGAL(J)*CRIT + LCST2(J)=(CRIT.LE.0.0) + ENDIF + 410 CONTINUE + + IF((IMPR.GE.2).AND.(NCST.GT.0)) THEN + WRITE(6,*) (LCST(J),J=1,NCST) + WRITE(6,*) (LCST2(J),J=1,NCST) + ENDIF + DO 420 J=1,NCST + LTST=LTST.AND.(LCST(J).EQV.LCST2(J)) + 420 CONTINUE + + IF((.NOT.LTST) .AND.(ITER.LE.ITERMX)) GO TO 99 +*---- +* k,l +* STEP 3: SAVE P +*---- + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + CALL LCMPUT(IPOPT,'F-PENAL-EVAL',1,4,LA0E) + IF(IMPR.GE.1) WRITE(6,*) 'LAGF',(LAGF(I),I=1,N0) + CALL LCMPUT(IPOPT,'DF-LA-PENAL',N0,4,LAGF) + CALL LCMSIX(IPOPT,' ',0) +* + IF(IMPR.GE.1) WRITE(6,*) 'Dvar',(XOBJ(I),I=1,N0) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(APLUS2,LAGF) + DEALLOCATE(CONTR2,B2,CSTWGT) + DEALLOCATE(INPL2) + RETURN + END diff --git a/Donjon/src/PLQ.f b/Donjon/src/PLQ.f new file mode 100644 index 0000000..91b1392 --- /dev/null +++ b/Donjon/src/PLQ.f @@ -0,0 +1,628 @@ +*DECK PLQ + SUBROUTINE PLQ(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solves a linear optimization problem with a quadratic constraint. +* PLQ = Quasi Linear Programmation (aka Optex method) +* +*Copyright: +* Copyright (C) 2002 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): +* R. Chambon +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The calling specifications are: +* OPTIM := PLQ: OPTIM :: (plq\_data) ; +* where +* OPTIM : name of the \emph{optimize} object (L\_OPTIMIZE signature) +* containing the optimization informations. Object OPTIM must appear on +* both LHS and RHS to be able to update the previous values. +* (plq\_data) : structure containing the data to the module PLQ:. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE + PARAMETER (NSTATE=40) + INTEGER NITMA,ITYP,ITYP1,ICONV,ICST,IEDSTP,LENGT1,LENGT2,ITYLCM, + 1 ISTEP,IVAR + REAL FLOTT,ECOSTR + CHARACTER TEXT12*12,HSIGN*12,TEXT16*16 + INTEGER OPTPRI(NSTATE) + DOUBLE PRECISION OPTPRR(NSTATE) + TYPE(C_PTR) IPOPT + INTEGER I,NVAR,NCST,LENGT,IPRINT,NSTPEX,IMTHD,M0,MINMAX,CNVTST, + 1 IERR + DOUBLE PRECISION DFLOTT,XDROIT,XS,XXS,EPS1,EPS4,EPSIM,ECOST, + 1 DELTA,SR,NORM,EPSEXT,COST,CQUAD,OBJNEW,OBJOLD, + 2 DERR,NORX,ERRX,DDX + LOGICAL LSAVE,LNORM2,LWAR,LBACK +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: INEGAL + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARVAL,VARWGT, + > FCSTV,GRAD,ODX,ODF,DX,CONTR,VALMAX,VALMIN,DINF,DSUP,VARVL2, + > GRAD0,VARV0,WEIGH,DERIV0,CSTV0 +*---- +* CHECK THE VALIDITY OF OBJECTS +*---- + IF(NENTRY.NE.1) CALL XABORT('PLQ:ONE OBJECT EXPECTED.') + IF(JENTRY(1).NE.1) CALL XABORT('PLQ: OBJECT IN MODIFICATION ' + 1 //'MODE ONLY') + IPOPT=KENTRY(1) + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('PLQ:' + 1 //' LCM OBJECT EXPECTED') + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_OPTIMIZE') THEN + TEXT12=HENTRY(1) + CALL XABORT('PLQ: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_OPTIMIZE EXPECTED.') + ENDIF +*---- +* RECOVER STATE VECTOR INFORMATION +*---- + CALL LCMGET(IPOPT,'STATE-VECTOR',OPTPRI) + NVAR =OPTPRI(1) + NCST =OPTPRI(2) + MINMAX=OPTPRI(3) + ICONV =OPTPRI(4) + IF((MINMAX.NE.1).AND.(MINMAX.NE.-1)) CALL XABORT('PLQ: ' + 1 //'MINMAX not equal to 1 or -1') + NSTPEX=OPTPRI(5)+1 + IEDSTP=OPTPRI(6) + IMTHD =OPTPRI(9) + ISTEP= OPTPRI(10) + CALL LCMGET(IPOPT,'OPT-PARAM-R',OPTPRR) + SR =OPTPRR(1) + EPS1 =OPTPRR(2) + EPSEXT=OPTPRR(3) + EPSIM =OPTPRR(4) + EPS4 =OPTPRR(5) + ECOST =OPTPRR(6) +*---- +* SET CONTROL-VARIABLE VALUES +*---- + ALLOCATE(VARVAL(NVAR)) + CALL LCMLEN(IPOPT,'VAR-VALUE',LENGT,ITYP) + IF(LENGT.NE.NVAR) CALL XABORT('PLQ: WRONG NUMBER OF VARIABLE') +*---- +* SET CONTROL-VARIABLE WEIGHTS +*---- + ALLOCATE(VARWGT(NVAR)) + CALL LCMLEN(IPOPT,'VAR-WEIGHT',LENGT,ITYP) + IF(LENGT.EQ.0) THEN + VARWGT(:NVAR)=1.0D0 + ELSE IF(LENGT.EQ.NVAR) THEN + CALL LCMGET(IPOPT,'VAR-WEIGHT',VARWGT) + ELSE + CALL XABORT('PQL: NVAR - LENGT ARE NOT THE SAME') + ENDIF +*---- +* MEMORY ALLOCATION +*---- + ALLOCATE(FCSTV(NCST+1),GRAD(NVAR*(NCST+1)),ODX(NVAR),ODF(NVAR)) +*---- +* SET SYSTEM CHARACTERISTICS (THE OBJECTIVE FUNCTION IS THE FIRST ONE) +*---- + CALL LCMLEN(IPOPT,'FOBJ-CST-VAL',LENGT,ITYP) + IF(LENGT.EQ.0) CALL XABORT('PLQ: OBJECTIVE FUNCTION AND CONSTRA' + 1 //'INTS NOT YET EVALUATED') + CALL LCMGET(IPOPT,'FOBJ-CST-VAL',FCSTV) + COST=FCSTV(1) +*---- +* READ USER INPUT: +*---- + IPRINT=0 + LWAR=.FALSE. + 20 CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) +* Edition level + 30 IF(ITYP.NE.3) CALL XABORT('PLQ: CHARACTER DATA EXPECTED(1)') + IF(TEXT12.EQ.'EDIT') THEN + CALL REDGET(ITYP,IPRINT,FLOTT,TEXT12,DFLOTT) + IF(ITYP.NE.1) CALL XABORT('PLQ: *IPRINT* MUST BE INTEGER') + ELSE IF(TEXT12.EQ.'MINIMIZE') THEN + MINMAX=1 + ELSE IF(TEXT12.EQ.'MAXIMIZE') THEN + MINMAX=-1 + ELSE IF(TEXT12.EQ.'METHOD') THEN + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYP.NE.3) CALL XABORT('PLQ: CHARACTER DATA EXPECTED(2)') + IF(TEXT12.EQ.'SIMPLEX') THEN + IMTHD=1 + ELSE IF(TEXT12.EQ.'LEMKE') THEN + IMTHD=2 + ELSE IF(TEXT12.EQ.'MAP') THEN + IMTHD=3 + ELSE IF(TEXT12.EQ.'AUG-LAGRANG') THEN + IMTHD=4 + ELSE IF(TEXT12.EQ.'PENAL-METH') THEN + IMTHD=5 + ELSE + CALL XABORT('PLQ: WRONG METHOD KEYWORD') + ENDIF + ELSE IF(TEXT12.EQ.'OUT-STEP-LIM') THEN + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYP.EQ.2) THEN + SR=FLOTT + ELSE IF(ITYP.EQ.4) THEN + SR=DFLOTT + ELSE + CALL XABORT('PLQ: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'INN-STEP-EPS') THEN +* Set the tolerence used for inner linear LEMKE or SIMPLEX +* calculation. + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYP.EQ.2) THEN + EPSIM=FLOTT + ELSE IF(ITYP.EQ.4) THEN + EPSIM=DFLOTT + ELSE + CALL XABORT('PLQ: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'OUT-STEP-EPS') THEN +* Set the tolerence used for external iterations. + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYP.EQ.2) THEN + EPSEXT=FLOTT + ELSE IF(ITYP.EQ.4) THEN + EPSEXT=DFLOTT + ELSE + CALL XABORT('PLQ: REAL OR DOUBLE PRECISION VALUE EXPECTED.') + ENDIF + ELSE IF(TEXT12.EQ.'CST-QUAD-EPS') THEN + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYP.NE.2) CALL XABORT('PLQ: REAL DATA EXPECTED.') + EPS4=FLOTT + ELSE IF(TEXT12.EQ.'STEP-REDUCT') THEN + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYP.NE.3) CALL XABORT('PLQ: CHARACTER DATA EXPECTED(3).') + IF(TEXT12.EQ.'HALF') THEN + IEDSTP=1 + ELSE IF(TEXT12.EQ.'PARABOLIC') THEN + IEDSTP=2 + ELSE + CALL XABORT('PLQ: WRONG STEP REDUCTION KEYWORD.') + ENDIF + ELSE IF(TEXT12.EQ.'WARNING-ONLY')THEN +* Warning Only for failure of recovery of a valid point + LWAR=.TRUE. + ELSE IF(TEXT12.EQ.'CALCUL-DX')THEN +* Calculation of next point + GO TO 100 + ELSE IF(TEXT12.EQ.'COST-EXTRAP')THEN +* Cost extrapolation + GO TO 200 + ELSE IF(TEXT12.EQ.'OUT-CONV-TST') THEN +* Convergence test + GO TO 300 + ELSE IF( TEXT12.EQ.';' )THEN +* End of this subroutine + GO TO 1000 + ELSE + CALL XABORT('PLQ: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* TEST FOR IMPROVEMENT FOR THE OBJECTIVE FUNCTION +*---- + 100 LBACK=.FALSE. + CALL LCMLEN(IPOPT,'OLD-VALUE',LENGT,ITYP) + IF((JENTRY(1).EQ.1).AND.(LENGT.NE.0)) THEN + ALLOCATE(CSTV0(NCST+1)) + OBJNEW=FCSTV(1) + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + CALL LCMLEN(IPOPT,'FOBJ-CST-VAL',LENGT1,ITYP) + CALL LCMLEN(IPOPT,'VAR-VALUE',LENGT2,ITYP) + IF(LENGT1.EQ.0) THEN + CALL XABORT('PLQ: MISSING OLD OBJECTIVE FUNCTION VALUE') + ELSE IF(LENGT1.NE.NCST+1) THEN + CALL XABORT('PLQ: WRONG NUMBER OF CONSTRAINTS') + ELSE IF(LENGT2.EQ.0) THEN + CALL XABORT('PLQ: MISSING CONTROL VARIABLES RECORD') + ELSE IF(LENGT2.NE.NVAR) THEN + CALL XABORT('PLQ: WRONG NUMBER OF CONTROL VARIABLES') + ENDIF + CALL LCMGET(IPOPT,'FOBJ-CST-VAL',CSTV0) + OBJOLD=CSTV0(1) + IF(OBJNEW.GE.OBJOLD) THEN + LBACK=.TRUE. + IF(IPRINT.GT.1) WRITE(6,4005) OBJOLD,OBJNEW + ENDIF + DEALLOCATE(CSTV0) + CALL LCMSIX(IPOPT,' ',2) + ENDIF +*---- +* RECOVER OBJECTIVE FUNCTION AND GRADIENTS FROM PRECEDING ITERATION +*---- + IF(LBACK) THEN + ISTEP=0 + CALL LCMGET(IPOPT,'VAR-VALUE',VARVAL) + IF(IPRINT.GT.1) THEN + WRITE(6,4001) 'REJECTED CONTROL VARIABLES:', + 1 (VARVAL(IVAR),IVAR=1,NVAR) + ENDIF + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + ALLOCATE(CSTV0(NCST+1),VARV0(NVAR),DERIV0(NVAR*(NCST+1)), + 1 WEIGH(NVAR)) + CALL LCMGET(IPOPT,'FOBJ-CST-VAL',CSTV0) + CALL LCMGET(IPOPT,'VAR-VALUE',VARV0) + CALL LCMGET(IPOPT,'GRADIENT',DERIV0) + CALL LCMSIX(IPOPT,' ',2) + CALL LCMPUT(IPOPT,'FOBJ-CST-VAL',NCST+1,4,CSTV0) + CALL LCMPUT(IPOPT,'VAR-VALUE',NVAR,4,VARV0) + CALL LCMPUT(IPOPT,'GRADIENT',NVAR*(NCST+1),4,DERIV0) + IF(IEDSTP.LE.1) THEN + SR=SR*0.5 + ELSE IF(IEDSTP.EQ.2) THEN + CALL LCMLEN(IPOPT,'VAR-WEIGHT',LENGT,ITYLCM) + IF(LENGT.EQ.NVAR) THEN + CALL LCMGET(IPOPT,'VAR-WEIGHT',WEIGH) + ELSE + WEIGH(:NVAR)=1.0D0 + ENDIF + NORX=0.0D0 + DERR=0.0D0 + DO 110 I=1,NVAR + DDX=VARVAL(I)-VARV0(I) + NORX=NORX+WEIGH(I)*DDX**2 + DERR=DERR+SQRT(WEIGH(I))*DDX*DERIV0(I) + 110 CONTINUE + NORX=NORX**0.5 + DERR=DERR/NORX + ERRX=ABS(0.5*DERR*NORX*NORX/(DERR*NORX-(OBJNEW-OBJOLD))) + SR=MAX(MIN(SR,ERRX),SR/20.0) + DEALLOCATE(WEIGH) + ENDIF + IF(IPRINT.GT.1) WRITE(6,'(/31H PLQ: REDUCES QUADRATIC CONSTRA, + 1 13HINT RADIUS TO,1P,E11.4,8H IEDSTP=,I4)') SR,IEDSTP + IF(SR.LE.EPS4) THEN + WRITE(6,4006) + ICONV=1 + ENDIF + DEALLOCATE(DERIV0,VARV0,CSTV0) +*---- +* USES NEW GRADIENTS FROM MODULE GRAD: +*---- + ELSE +* count the number of iterations without step back + ISTEP=ISTEP+1 + IF(ISTEP.GT.10) THEN + SR=2.0*SR + ISTEP=5 + IF(IPRINT.GT.1) WRITE(6,'(/29H PLQ: INCREASES QUADRATIC CON, + 1 17HSTRAINT RADIUS TO,1P,E11.4)') SR + ENDIF + CALL LCMGET(IPOPT,'VAR-VALUE',VARVAL) + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + CALL LCMPUT(IPOPT,'VAR-VALUE2',NVAR,4,VARVAL) + CALL LCMSIX(IPOPT,' ',2) + ENDIF +*---- +* SET GRADIENTS +*---- + CALL LCMGET(IPOPT,'GRADIENT',GRAD) +*---- +* PRINT INFORMATION +*---- + IF(IPRINT.GT.0) THEN + WRITE(6,'(/47H PLQ: INFORMATION AT QUADRATIC CONSTRAINT ITERA, + 1 4HTION,I5)') NSTPEX + WRITE(6,3999) NSTPEX,FCSTV(1) + WRITE(6,4000) 'QUADRATIC CONSTRAINT RADIUS:',SR + IF(NCST.GT.0) WRITE(6,4001) 'CONSTRAINTS:',(FCSTV(ICST), + 1 ICST=2,NCST+1) + CALL LCMLEN(IPOPT,'VAR-VALUE',LENGT1,ITYLCM) + IF(LENGT1.GT.0) THEN + CALL LCMGET(IPOPT,'VAR-VALUE',VARVAL) + WRITE(6,4001) 'CONTROL VARIABLES:',(VARVAL(IVAR),IVAR=1,NVAR) + ENDIF + IF(IPRINT.GT.1) THEN + ALLOCATE(DERIV0(NVAR*(NCST+1))) + CALL LCMGET(IPOPT,'GRADIENT',DERIV0) + WRITE(6,'(/29H GRADIENTS-------------------)') + WRITE(6,4001) 'OBJECTIVE FUNCTION:',(DERIV0(IVAR),IVAR=1,NVAR) + IF(IPRINT.GT.2) THEN + DO 120 ICST=1,NCST + WRITE(TEXT16,'(10HCONSTRAINT,I4,1H:)') ICST + WRITE(6,4001) TEXT16,(DERIV0(ICST*NVAR+IVAR),IVAR=1,NVAR) + 120 CONTINUE + ENDIF + DEALLOCATE(DERIV0) + ENDIF + IF(LBACK) WRITE(6,'(28H *** STEP BACK ITERATION ***)') + ENDIF +*---- +* NEXT STEP CALCULATION +*---- + CALL LCMGET(IPOPT,'VAR-VALUE',VARVAL) + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + IF(TEXT12.EQ.'NO-STORE-OLD') THEN + LSAVE=.TRUE. + CALL REDGET(ITYP,NITMA,FLOTT,TEXT12,DFLOTT) + ELSE + LSAVE=.FALSE. + ENDIF + ITYP1=ITYP + ALLOCATE(DX(NVAR)) + IF(NCST.GT.0) THEN +* INEQUAL + ALLOCATE(INEGAL(NCST)) + CALL LCMLEN(IPOPT,'CST-TYPE',LENGT,ITYP) + IF(LENGT.NE.NCST) CALL XABORT('PLQ: NCST - LENGT NOT EQUAL') + CALL LCMGET(IPOPT,'CST-TYPE',INEGAL) +* +* CONTR + ALLOCATE(CONTR(NCST)) + CALL LCMLEN(IPOPT,'CST-OBJ',LENGT,ITYP) + IF(LENGT.NE.NCST) CALL XABORT('PLQ: NCST - LENGT NOT EQUAL') + CALL LCMGET(IPOPT,'CST-OBJ',CONTR) + DO 130 I=1,NCST + CONTR(I) = CONTR(I)-FCSTV(I+1) + 130 CONTINUE + ENDIF +* +* DINF AND DSUP + CALL LCMLEN(IPOPT,'VAR-VAL-MAX',LENGT,ITYP) + IF(LENGT.EQ.0) CALL XABORT('PLQ: NO MAXIMUM VALUE DEFINED') + ALLOCATE(VALMAX(NVAR),VALMIN(NVAR)) + CALL LCMGET(IPOPT,'VAR-VAL-MAX',VALMAX) + CALL LCMLEN(IPOPT,'VAR-VAL-MIN',LENGT,ITYP) + IF(LENGT.EQ.0) CALL XABORT('PLQ: NO MAXIMUM VALUE DEFINED') + CALL LCMGET(IPOPT,'VAR-VAL-MIN',VALMIN) + ALLOCATE(DINF(NVAR),DSUP(NVAR)) + DO 140 I=1,NVAR + DINF(I) = VALMIN(I) - VARVAL(I) + DSUP(I) = VALMAX(I) - VARVAL(I) + 140 CONTINUE + DEALLOCATE(VALMAX,VALMIN) +* + M0 = NCST + XDROIT = SR**2 + IF(IPRINT.GE.1) WRITE(6,4002) XDROIT,(VARWGT(I),I=1,NVAR) +*---- +* FIND ACTIVE CONSTRAINTS FOR XK(I) LIMITS +*---- + DO 150 I=1,NVAR + XS = SQRT(XDROIT/VARWGT(I)) + XXS=-XS + IF(DINF(I).GT.XXS) THEN + M0 = M0 + 1 + ENDIF + IF(DSUP(I).LT.XS) THEN + M0 = M0 + 1 + ENDIF + 150 CONTINUE +*---- +* SOLUTION OF A LINEAR OPTIMIZATION PROBLEM WITH A QUADRATIC CONSTRAINT +*---- + IERR=0 + CALL PLDRV(IPOPT,NVAR,NCST,M0,MINMAX,IMTHD,COST,DX,VARWGT,GRAD, + > INEGAL,CONTR,DINF,DSUP,XDROIT,EPSIM,IPRINT,IERR) +*---- +* STEP-BACK IN CASE OF FAILURE +*---- + IF(IERR.GE.1) THEN + OPTPRI(14)=OPTPRI(14)+1 + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + CALL LCMLEN(IPOPT,'VAR-VALUE2',LENGT,ITYP) + IF(LENGT.EQ.0) THEN + IF(LWAR) THEN + WRITE(6,*) 'WARNING: UNABLE TO RECOVER A VALID POINT' + 1 //' WITH SUCCESSFUL "PLQ" RESOLUTION' + ELSE + CALL LCMLIB(IPOPT) + CALL XABORT('PLQ: UNABLE TO RECOVER A VALID POINT WITH ' + 1 //'SUCCESSFUL "PLQ" RESOLUTION') + ENDIF + ELSE + ALLOCATE(VARVL2(NVAR)) + CALL LCMGET(IPOPT,'VAR-VALUE2',VARVL2) + DO 160 I=1,NVAR + DX(I)=(VARVL2(I)-VARVAL(I))/2.0 + 160 CONTINUE + DEALLOCATE(VARVL2) + ENDIF + CALL LCMSIX(IPOPT,' ',2) + IF(IPRINT.GE.1) WRITE(6,*) 'IERR>0' + IF(IPRINT.GE.1) WRITE(6,*) 'DX=',(DX(I),I=1,NVAR) + ELSE + OPTPRI(14)=0 + ENDIF +* + DO 170 I=1,NVAR + ODX(I)=DX(I) + ODF(I)=GRAD(I) + 170 CONTINUE + DEALLOCATE(DX) + IF(NCST.GT.0) DEALLOCATE(INEGAL) + DEALLOCATE(DINF,DSUP) + IF(NCST.GT.0) DEALLOCATE(CONTR) +*---- +* BACKUP VALUES OF THE PRECEDING ITERATION +*---- + IF(.NOT.LSAVE) THEN + CALL LCMSIX(IPOPT,'OLD-VALUE',1) + CALL LCMPUT(IPOPT,'VAR-VALUE',NVAR,4,VARVAL) + CALL LCMPUT(IPOPT,'FOBJ-CST-VAL',NCST+1,4,FCSTV) + CALL LCMPUT(IPOPT,'GRADIENT',NVAR*(NCST+1),4,GRAD) + CALL LCMSIX(IPOPT,' ',2) + ENDIF +*---- +* BACKUP VALUES OF THE NEW ITERATION +*---- + DO 180 I=1,NVAR + VARVAL(I)=VARVAL(I)+ODX(I) + 180 CONTINUE + CALL LCMPUT(IPOPT,'VAR-VALUE',NVAR,4,VARVAL) + ITYP=ITYP1 +*---- +* EXTRAPOLATE OBJECTIVE FUNCTION +*---- + ECOST=COST + DO 190 I=1,NVAR + ECOST=ECOST+ODX(I)*ODF(I) + 190 CONTINUE +*---- +* REINITIALIZE GRADIENTS FOR THE NEXT ITERATION +*---- + ALLOCATE(GRAD0(NVAR*(NCST+1))) + GRAD0(:NVAR*(NCST+1))=0.0D0 + CALL LCMPUT(IPOPT,'GRADIENT',NVAR*(NCST+1),4,GRAD0) + DEALLOCATE(GRAD0) + GO TO 30 +*---- +* OUTPUT THE EXTRAPOLATED OBJECTIVE FUNCTION +*---- + 200 ECOSTR=REAL(ECOST) + CALL REDGET(ITYP,NITMA,ECOSTR,TEXT12,DFLOTT) + IF(ITYP.NE.-2) CALL XABORT('PLQ: OUTPUT REAL EXPECTED') + ITYP=2 + CALL REDPUT(ITYP,NITMA,ECOSTR,TEXT12,DFLOTT) + GO TO 20 +*---- +* TEST CONVERGENCE +*---- + 300 LNORM2=.TRUE. + CALL REDGET(ITYP,CNVTST,FLOTT,TEXT12,DFLOTT) + IF((ITYP.EQ.3).AND.(TEXT12.EQ.'NORM-INF')) THEN + LNORM2=.FALSE. + CALL REDGET(ITYP,CNVTST,FLOTT,TEXT12,DFLOTT) + ENDIF + IF(ITYP.NE.-5) CALL XABORT('PLQ: OUTPUT LOGICAL EXPECTED') + DELTA=ABS((ECOST-COST)/COST) + NORM=0.0 + CQUAD=0.0 + IF(LNORM2) THEN + DO 350 I=1,NVAR + NORM=NORM+VARWGT(I)*VARVAL(I)*VARVAL(I) + CQUAD=CQUAD+VARWGT(I)*ODX(I)*ODX(I) + 350 CONTINUE + IF(NORM.NE.0.0) THEN + CQUAD=SQRT(CQUAD/NORM) + ELSE + CQUAD=0.0 + ENDIF + ELSE + DO 360 I=1,NVAR + NORM=MAX(NORM,ABS(VARWGT(I)**0.5*VARVAL(I))) + CQUAD=MAX(CQUAD,ABS(VARWGT(I)**0.5*ODX(I))) + 360 CONTINUE + IF(NORM.NE.0.0) THEN + CQUAD=CQUAD/NORM + ELSE + CQUAD=0.0 + ENDIF + ENDIF + IF(EPSEXT.EQ.0.0) EPSEXT = 0.001D0 + IF(((DELTA.LT.EPSEXT).AND.(CQUAD.LE.EPSEXT)) .OR. + 1 (CQUAD.LE.(EPSEXT/10.0))) THEN + CNVTST=1 + ICONV =1 + ELSE + CNVTST=-1 + ICONV =0 + ENDIF + IF(IPRINT.GE.1) THEN + WRITE(6,*) 'It= convergence?', DELTA,CQUAD,EPSEXT + IF(IPRINT.GT.2) THEN + WRITE(6,*) 'DX',(ODX(I),I=1,NVAR) + WRITE(6,*) 'X',(VARVAL(I),I=1,NVAR) + ENDIF + ENDIF + ITYP=5 + CALL REDPUT(ITYP,CNVTST,FLOTT,TEXT12,DFLOTT) + GO TO 20 +*---- +* END +*---- + 1000 DEALLOCATE(VARWGT,FCSTV,GRAD,ODX,ODF,VARVAL) +*---- +* SAVE THE STATE VECTORS +*---- + OPTPRI(:NSTATE)=0 + OPTPRI(1)=NVAR + OPTPRI(2)=NCST + OPTPRI(3)=MINMAX + OPTPRI(4)=ICONV + OPTPRI(5)=NSTPEX + OPTPRI(6)=IEDSTP + OPTPRI(7)=0 + OPTPRI(8)=1 + OPTPRI(9)=IMTHD + OPTPRI(10)=ISTEP + IF(IPRINT.GT.0) WRITE(6,4003) (OPTPRI(I),I=1,10) + CALL LCMPUT(IPOPT,'STATE-VECTOR',NSTATE,1,OPTPRI) + OPTPRR(:NSTATE)=0.0D0 + OPTPRR(1)=SR + OPTPRR(2)=EPS1 + OPTPRR(3)=EPSEXT + OPTPRR(4)=EPSIM + OPTPRR(5)=EPS4 + OPTPRR(6)=ECOST + IF(IPRINT.GT.0) WRITE(6,4004) (OPTPRR(I),I=1,6) + CALL LCMPUT(IPOPT,'OPT-PARAM-R',NSTATE,4,OPTPRR) + IF(IPRINT.GT.1) CALL LCMLIB(IPOPT) + RETURN +* + 3999 FORMAT(/13H PLQ: ##ITER=,I8,20H OBJECTIVE FUNCTION=,1P,E14.6) + 4000 FORMAT(1X,A28,1P,E14.6) + 4001 FORMAT(1X,A28,1P,8E12.4/(29X,8E12.4)) + 4002 FORMAT(//,5X,'SR**2 (XDROIT) = ',1P,D13.5, + > /,5X,'FPOIDS = ',/,(11X,1P,8D13.5)) + 4003 FORMAT(/8H OPTIONS/8H -------/ + 1 7H NVAR ,I8,32H (NUMBER OF CONTROL VARIABLES)/ + 2 7H NCST ,I8,26H (NUMBER OF CONSTRAINTS)/ + 3 7H MINMAX,I8,37H (=1/-1: MINIMIZATION/MAXIMIZATION)/ + 4 7H ICONV ,I8,43H (=0/1: EXTERNAL NOT CONVERGED/CONVERGED)/ + 5 7H NSTPEX,I8,44H (ITERATION INDEX OF QUADRATIC CONSTRAINT)/ + 6 7H IEDSTP,I8,43H (=1/2: HALF REDUCTION/PARABOLIC FORMULA)/ + 7 7H IHESS ,I8,29H (=0/1/2: STEEPEST/CG/BFGS)/ + 8 7H ISEARC,I8,35H (=0/1/2: NO SEARCH/OPTEX/NEWTON)/ + 9 7H IMTHD ,I8,42H (=1/2/3: SIMPLEX-LEMKE/LEMKE-LEMKE/MAP)/ + 1 7H ISTEP ,I8,43H (NUMBER OF ITERATIONS WITHOUT STEP-BACK)) + 4004 FORMAT(/ + 1 12H REAL PARAM:,1P/12H -----------/ + 2 7H SR ,D12.4,39H (RADIUS OF THE QUADRATIC CONSTRAINT)/ + 3 7H EPS1 ,D12.4,13H (NOT USED)/ + 4 7H EPSEXT,D12.4,31H (EXTERNAL CONVERGENCE LIMIT)/ + 5 7H EPSIM ,D12.4,31H (INTERNAL CONVERGENCE LIMIT)/ + 6 7H EPS4 ,D12.4,43H (QUADRATIC CONSTRAINT CONVERGENCE LIMIT)/ + 7 7H ECOST ,D12.4,17H (UPDATED COST)) + 4005 FORMAT(/38H PLQ: OBJECTIVE FUNCTION INCREASE FROM,1P,E12.4, + 1 3H TO,E12.4/35H RETURN BACK TO PREVIOUS ITERATION.) + 4006 FORMAT(/1X,'PLQ: THE QUADRATIC CONSTRAINT RADIUS CANNOT BE FUR', + 1 'THER REDUCED') + END diff --git a/Donjon/src/PLQUAD.f b/Donjon/src/PLQUAD.f new file mode 100644 index 0000000..230325a --- /dev/null +++ b/Donjon/src/PLQUAD.f @@ -0,0 +1,391 @@ +*DECK PLQUAD + SUBROUTINE PLQUAD(N0,M1,MAXM,APLUS,BPLUS,PDG,XDROIT,COUT,XOBJ, + > EPS,IMPR,IERR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Minimize a linear problem with a quadratic constraint using a +* parametric complementarity principle. +* PLQUAD = Linear Programmation with QUADratic constraint +* +*Copyright: +* Copyright (C) 2002 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 and T. Falcon +* +*Parameters: input +* N0 number of control variables. +* M1 number of constraints. +* MAXM first dimension of matrix APLUS. +* APLUS coefficient matrix for the linear constraints. +* BPLUS right hand sides corresponding to the coefficient matrix. +* PDG weights assigned to control variables in the quadratic +* constraint. +* XDROIT quadratic constraint radius squared. +* COUT costs of control variables. +* EPS tolerence used for pivoting. +* IMPR print flag. +* +*Parameters: ouput +* XOBJ control variables. +* IERR return code (=0: normal completion). +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER N0,M1,MAXM,IERR,IMPR + DOUBLE PRECISION BPLUS(M1+1),PDG(N0),XOBJ(N0),EPS,XDROIT, + > APLUS(MAXM,N0),COUT(N0) +*---- +* LOCAL VARIABLES +*---- + CHARACTER*4 ROW(7) + DOUBLE PRECISION PVAL,POLY0,POLY1,POLY2,XVALIR,X,OBJ,DISCRI, + > XROOT1,XROOT2,XVAL,XTAUU,XVALL,XVALC,OBJLIN + INTEGER N,NP1,NP2,NP3,I,J,K,IS,JS,IROWIS,IR,IROWR,JR,IKIT,II + DOUBLE PRECISION XTAU,XTAUL,UI,XMIN,XVALU +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IROW,ICOL + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: U,V,WRK + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: P +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IROW(M1+1),ICOL(M1+2)) + ALLOCATE(U(M1+1),V(M1+1)) + ALLOCATE(P(M1+1,M1+4),WRK(N0)) +* + N = M1 + 1 + NP1 = N + 1 + NP2 = N + 2 + NP3 = N + 3 +*---- +* STEP 2: SET-UP AND SOLVE THE PARAMETRIC COMPLEMENTARITY PROBLEM. +*---- + DO I=1,N + DO J=1,N0 + WRK(J) = APLUS(I,J)/PDG(J) + ENDDO + DO K=1,N + PVAL = 0.0D0 + DO J=1,N0 + PVAL = PVAL + WRK(J)*APLUS(K,J) + ENDDO + P(I,K) = PVAL + ENDDO + ENDDO +* + DO I=1,N + IROW(I) = I + ICOL(I) = -I + P(I,NP1) = 1.0D0 + P(I,NP2) = 0.0D0 + P(I,NP3) = BPLUS(I) + ENDDO +* + ICOL(NP1) = -NP1 + P(N,NP2) = 1.0D0 +* + CALL PLLEMK(N,NP3,EPS,IMPR,P,IROW,ICOL,IERR) +* + IF (IERR.GE.1) THEN + WRITE(6,1000) IERR + GO TO 500 + ENDIF +* + XTAU = 0.0 + XTAUL = 0.0 + OBJLIN = BPLUS(N) +*---- +* COMPUTE VECTOR T=(NU,PI)=U+XTAU*V +*---- + 110 POLY0 = 0.0D0 + POLY1 = 0.0D0 + POLY2 = 0.0D0 +* + DO 120 I=1,N + IR = -IROW(I) + IF (IR.GT.0) THEN + U(IR) = P(I,NP3) + V(IR) = P(I,NP2) + POLY0 = POLY0 - P(I,NP3)*BPLUS(IR) + POLY1 = POLY1 - P(I,NP2)*BPLUS(IR) + ELSE + U(-IR) = 0.0 + V(-IR) = 0.0 + ENDIF + IF (IR.EQ.N) THEN + POLY1 = POLY1 - P(I,NP3) + POLY2 = (-P(I,NP2)) + ENDIF + 120 CONTINUE +* + IF (IMPR.GE.3) THEN + DO 121 I=1,N0 + XOBJ(I) = 0.0 + 121 CONTINUE +* + DO 123 I=1,N + UI = U(I) + XTAUL*V(I) + IF (UI.EQ.0.0) GO TO 123 + DO 122 J=1,N0 + XOBJ(J) = XOBJ(J) - UI*APLUS(I,J)/PDG(J) + 122 CONTINUE + 123 CONTINUE +* + X = 0.0D0 + OBJ = 0.0D0 + DO 126 J=1,N0 + X = X + PDG(J)*XOBJ(J)*XOBJ(J) + OBJ = OBJ + XOBJ(J)*COUT(J) + 126 CONTINUE + WRITE(6,2000) OBJ,POLY0,X,POLY1,XTAUL,POLY2,(XOBJ(J),J=1,N0) + ENDIF + IF ((XTAU.EQ.0.0).AND.(POLY0.LE.XDROIT)) GO TO 230 +*---- +* STEP 3 +*---- + DO 130 I=1,N + IF(P(I,NP2).LT.-EPS) GO TO 140 + 130 CONTINUE + GO TO 215 +*---- +* STEP 4 +*---- + 140 XTAUU = 1.0E+25 +* + IR = 0 + DO 150 K=I,N + IF(P(K,NP2).GE.-EPS) GO TO 150 + XVAL = -P(K,NP3)/P(K,NP2) + IF(XVAL.GT.XTAUU) GO TO 150 + XTAUU = XVAL + IR = K + 150 CONTINUE +* + XVALU = (POLY2*XTAUU + POLY1)*XTAUU + POLY0 +*---- +* STEP 5 +*---- + IF(XVALU.LE.XDROIT) GO TO 215 + IROWR = IABS(IROW(IR)) + JR=0 + DO 160 K=1,NP1 + IF(IABS(ICOL(K)).EQ.IROWR) THEN + JR=K + GO TO 170 + ENDIF + 160 CONTINUE + IERR = 5 + GO TO 500 +* + 170 XTAUL = XTAUU + XVALL = XVALU + IF(P(IR,JR).LE.EPS) GO TO 180 + CALL PLPIVT(N,NP3,IR,JR,P,IROW,ICOL) + GO TO 110 +* + 180 XMIN=1.0E+25 +* + XVALIR = P(IR,NP3)/P(IR,NP2) +* + DO 190 I=1,N + IF(P(I,JR).GE.-EPS) GO TO 190 + XVAL = -1.0D0/P(I,JR)*(P(I,NP3) - P(I,NP2)*XVALIR) + IF(XVAL.GE.XMIN) GO TO 190 + XMIN = XVAL + IS = I + 190 CONTINUE +* + IF (XMIN.EQ.1.0E+25) THEN + IERR = 6 + GO TO 500 + ENDIF +* + IROWIS=IABS(IROW(IS)) + DO 200 JS=1,N + IF(IABS(ICOL(JS)).EQ.IROWIS) GO TO 210 + 200 CONTINUE +* + 210 CALL PLPIVT(N,NP3,IR,JS,P,IROW,ICOL) + CALL PLPIVT(N,NP3,IS,JR,P,IROW,ICOL) + GO TO 110 +*---- +* STEP 6 +*---- + 215 IKIT = 0 +* + 216 XTAU = (XTAUL + XTAUU)/2.0 + IKIT = IKIT + 1 + IF (IKIT.GT.50) GOTO 217 + XVALC = ((POLY2*XTAU + POLY1)*XTAU + POLY0)/XDROIT + IF (IMPR.GE.3) THEN + WRITE(6,5000) XTAUL,XTAUU,XTAU,POLY0,POLY1,POLY2,XDROIT,XVALC + ENDIF + IF (XVALC.GT.1.0) GO TO 220 + IF (XVALC.GE.0.99999) GO TO 230 + XTAUU = XTAU + GO TO 216 + 220 XTAUL = XTAU + GO TO 216 +*---- +* STEP 6 +*---- + 217 XTAU = (XTAUL + XTAUU)/2.0 + XVALC = ((POLY2*XTAU + POLY1)*XTAU + POLY0)/XDROIT + IF (IMPR.GE.3) THEN + WRITE(6,5000) XTAUL,XTAUU,XTAU,POLY0,POLY1,POLY2,XDROIT,XVALC + ENDIF +* + IF (POLY0.EQ.0.0) THEN + IF (POLY1.EQ.0.0) THEN + IF (POLY2.EQ.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ELSE + IF (POLY2.LT.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + XTAU = SQRT(XDROIT/POLY2) + ENDIF + ELSE IF (POLY2.EQ.0.0) THEN + XTAU = XDROIT/POLY1 + ELSE + DISCRI = POLY1*POLY1 + 4.*POLY2*XDROIT + IF (DISCRI.LT.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + XROOT1 = -POLY1 + SQRT(DISCRI) + XROOT2 = -POLY1 - SQRT(DISCRI) + XTAU = MAX(XROOT1,XROOT2) + IF (XTAU.LE.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + XTAU = XTAU/(2.*POLY2) + ENDIF + ELSE IF (POLY1.EQ.0.0) THEN + IF (POLY2.EQ.0.0) THEN + IF ((POLY0.LT.(XDROIT-EPS)).OR.(POLY0.GT.XDROIT+EPS)) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + ELSE + DISCRI = XDROIT-POLY0 + IF (DISCRI.LT.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + XTAU = SQRT(DISCRI/POLY2) + ENDIF + ELSE IF (POLY2.EQ.0.0) THEN + XTAU = (XDROIT-POLY0)/POLY1 + ELSE + DISCRI = POLY1*POLY1 - 4.*POLY2*(POLY0-XDROIT) + IF (DISCRI.LT.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + XROOT1 = -POLY1 + SQRT(DISCRI) + XROOT2 = -POLY1 - SQRT(DISCRI) + XTAU = MAX(XROOT1,XROOT2) + IF (XTAU.LE.0.0) THEN + WRITE(6,6000) POLY0,POLY1,POLY2,XDROIT + IERR = 7 + GO TO 500 + ENDIF + XTAU = XTAU/(2.*POLY2) + ENDIF +* + IF (IMPR.GE.3) THEN + WRITE(6,5000) XTAUL,XTAUU,XTAU,POLY0,POLY1,POLY2,XDROIT,XVALC + ENDIF +* + IF (ABS(XTAU).GT.XTAUU) THEN + XTAU = XTAUU + ENDIF +*---- +* END OF THE ALGORITHM. COMPUTE THE CONTROL VARIABLES. +*---- + 230 XVALC=(POLY2*XTAU+POLY1)*XTAU+POLY0 +* + IF ((IMPR.GE.3).AND.(XVALC.NE.1.0)) THEN + WRITE(6,5000) XTAUL,XTAUU,XTAU,POLY0,POLY1,POLY2,XDROIT,XVALC + ENDIF +* + IF (IMPR.GE.2) THEN + WRITE(6,3000) XTAU,XVALC + DO 255 I=1,N,7 + II = MIN0(I+6,N) + DO 250 J=I,II + IF (IROW(J).LT.0) THEN + WRITE (ROW(J-I+1),'(1HX,I3.3)') (-IROW(J)) + ELSE + WRITE (ROW(J-I+1),'(1HY,I3.3)') IROW(J) + ENDIF +* + 250 CONTINUE + WRITE(6,4000) (ROW(J-I+1),P(J,NP3)+XTAU*P(J,NP2),J=I,II) + 255 CONTINUE + ENDIF + IERR = 0 +* + XOBJ(:N0)=0.0D0 + DO 280 I=1,N + UI = U(I) + XTAU*V(I) + IF (UI.EQ.0.0) GO TO 280 + DO 270 J=1,N0 + XOBJ(J) = XOBJ(J) - UI*APLUS(I,J)/PDG(J) + 270 CONTINUE + 280 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 500 DEALLOCATE(WRK,P) + DEALLOCATE(V,U) + DEALLOCATE(ICOL,IROW) + RETURN +* + 1000 FORMAT(//,5X,'PLQUAD: FAILURE OF THE PARAMETRIC LINEAR COMPLEME', + > 'NTARITY SOLUTION (IERR=',I5,').') + 2000 FORMAT(//,5X,'SOLUTION AFTER PIVOTING : ', + > /,5X,'OBJECTIVE FUNCTION = ',1P,E12.5, + > /,5X,'POLY0 = ',1P,E12.5, + > /,5X,'QUADRATIC CONSTRAINT = ',1P,E12.5, + > /,5X,'POLY1 = ',1P,E12.5, + > /,5X,'XTAU PARAMETER = ',1P,E12.5, + > /,5X,'POLY2 = ',1P,E12.5, + > /,5X,'CONTROL VARIABLES = ',/,(5X,1P,10E12.4)) + 3000 FORMAT(//,5X,'SOLUTION OF THE PARAMETRIC LINEAR COMPLEMENTARITY', + > ' PROBLEM :','*** X: KUHN-TUCKER MULTIPLIERS ;', + > 5X,'*** Y: SLACK VARIABLES ',/, + > /,5X,'TAU = ',1P,E12.5, + > /,5X,'QUADRATIC CONSTRAINT = ',1P,E12.5,/) + 4000 FORMAT(7(1X,A4,'=',E12.5),/) + 5000 FORMAT( 8X,'XTAUL',7X,'XTAUU',7X,'XTAU ',7X, + > 'POLY0',7X,'POLY1',7X,'POLY2',7X, + > 'XDROIT',6X,'XVALC',/, + > 5X,1P,8E12.5) + 6000 FORMAT( 8X,'POLY0',7X,'POLY1',7X,'POLY2',7X, + > 'XDROIT'/5X,1P,4E12.5) + END diff --git a/Donjon/src/RESBRN.f b/Donjon/src/RESBRN.f new file mode 100644 index 0000000..aaedbe1 --- /dev/null +++ b/Donjon/src/RESBRN.f @@ -0,0 +1,201 @@ +*DECK RESBRN + SUBROUTINE RESBRN(IPMAP,NCH,NB,NCOMB,NX,NY,NZ,LRSCH,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Initialize the axial shape and compute the first burnup limits per +* bundle for every channel (used for the time-average model). +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* D. Sekki, I. Trancart +* +*Parameters: input +* IPMAP pointer to fuel-map information. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NCOMB number of combustion zones. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* LRSCH flag for the refuelling scheme of channels: +* =.true. it was read from the input file; +* =.false. otherwise. +* IMPX printing index (=0 for no print). +* +*---------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCH,NB,NCOMB,NX,NY,NZ,IMPX + LOGICAL LRSCH +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER IVECT(NCOMB,NB),NSCH(NCH),IZONE(NCH),MIX(NX*NY*NZ), + 1 NAMX(NX),NAMY(NY),RSCH(NX,NY),AGLIM,CHR(NB) + REAL BVAL(NCOMB),DELT(NB),B0(NB),B1(NB),SHAP(NCH,NB), + 1 BURN0(NCH,NB),BURN1(NCH,NB) + CHARACTER TEXT*12,CHANY*2,FORM1*14,FORM2*14,SHU*3 + LOGICAL LAXSH +*---- +* RECOVER INFORMATION +*---- + CALL LCMLEN(IPMAP,'REF-SCHEME',LENG1,ITYP) + CALL LCMLEN(IPMAP,'BURN-AVG',LENG2,ITYP) + IF((LENG1.EQ.0).OR.(LENG2.EQ.0))GOTO 100 + CALL LCMLEN(IPMAP,'AX-SHAPE',LENG3,ITYP) + IF(LENG3.EQ.0) THEN +* INITIAL FLAT AXIAL-SHAPE + IF(IMPX.GT.0)WRITE(IOUT,1000) + SHAP(:NCH,:NB)=1.0/NB + CALL LCMPUT(IPMAP,'AX-SHAPE',NCH*NB,2,SHAP) + ELSE + CALL LCMGET(IPMAP,'AX-SHAPE',SHAP) + ENDIF + CALL LCMGET(IPMAP,'REF-VECTOR',IVECT) + CALL LCMGET(IPMAP,'REF-SCHEME',NSCH) + CALL LCMGET(IPMAP,'BURN-AVG',BVAL) + CALL LCMGET(IPMAP,'B-ZONE',IZONE) + CALL LCMGET(IPMAP,'BMIX',MIX) + BURN0(:NCH,:NB)=0.0 + BURN1(:NCH,:NB)=0.0 + LAXSH=.FALSE. + IF(IMPX.GT.2)WRITE(IOUT,1004) +*---- +* COMPUTE FIRST BURNUP LIMITS +*---- + ICH=0 + DO 70 IEL=1,NX*NY + IF(MIX(IEL).EQ.0) GOTO 70 + ICH=ICH+1 + IBSH=ABS(NSCH(ICH)) + SHU=' NO' + DO IB=1,NB + DELT(IB)=IBSH*BVAL(IZONE(ICH))*SHAP(ICH,IB) + B0(IB)=0. + B1(IB)=0. +* Axial Shuffling detection + IF(IVECT(IZONE(ICH),IB).GT.IB)THEN + LAXSH=.TRUE. + SHU='YES' + ENDIF + ENDDO +* Burnup attribution with axial Shuffling + IF(LAXSH)THEN + AGLIM=INT(NB/IBSH)+1 + CHR(:NB)=AGLIM +* Two loops on bundle cycles (IA) and number of bundles (IB) + DO 45 IA=0,AGLIM-1 + DO 40 IB=1,NB +* Index ordering + IF (NSCH(ICH).LT.0) THEN + KK=NB-IB+1 + KV=NB-IVECT(IZONE(ICH),IB)+1 + ELSE + KK=IB + KV=IVECT(IZONE(ICH),IB) + ENDIF +* New fuel + IF(IVECT(IZONE(ICH),IB).EQ.0)THEN + CHR(IB)=0 + B0(KK)=0. + B1(KK)=DELT(KK) + ELSE +* Compute new burnup if previous bundle cycle done + IF(CHR(IVECT(IZONE(ICH),IB)).EQ.(IA-1))THEN + CHR(IB)=IA + B0(KK)=B1(KV) + B1(KK)=DELT(KK)+B1(KV) + ENDIF + ENDIF + 40 CONTINUE + 45 CONTINUE +* Burnup attribution without axial Shuffling +* One loop on number of bundles (IB) + ELSE +* NEGATIVE DIRECTION + IF(NSCH(ICH).LT.0)THEN + DO 50 IB=1,NB + KK=NB-IB+1 + KA=NB-IVECT(IZONE(ICH),IB)+1 + IF(IVECT(IZONE(ICH),IB).LE.0)THEN + B0(KK)=0. + ELSE + B0(KK)=B1(KA) + ENDIF + B1(KK)=B0(KK)+DELT(KK) + 50 CONTINUE +* POSITIVE DIRECTION + ELSE + DO 60 IB=1,NB + IF(IVECT(IZONE(ICH),IB).LE.0)THEN + B0(IB)=0. + ELSE + B0(IB)=B1(IVECT(IZONE(ICH),IB)) + ENDIF + B1(IB)=B0(IB)+DELT(IB) + 60 CONTINUE + ENDIF + ENDIF + DO IB=1,NB + BURN0(ICH,IB)=B0(IB) + BURN1(ICH,IB)=B1(IB) + ENDDO + IF(IMPX.GE.3) THEN +* CHECK BURNUP LIMITS + WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH + WRITE(IOUT,1001)TEXT,NSCH(ICH),IZONE(ICH),SHU + WRITE(IOUT,1002)'B0',(B0(IB),IB=1,NB) + WRITE(IOUT,1002)'B1',(B1(IB),IB=1,NB) + ENDIF +* Reset shuffling for next channel + LAXSH=.FALSE. + 70 CONTINUE + CALL LCMPUT(IPMAP,'BURN-BEG',NB*NCH,2,BURN0) + CALL LCMPUT(IPMAP,'BURN-END',NB*NCH,2,BURN1) + IF((.NOT.LRSCH).OR.(IMPX.LT.2))GOTO 100 +*---- +* PRINT CHANNELS REFUELLING SCHEMES +*---- + WRITE(FORM1,'(A4,I2,A8)')'(A4,',NX,'(A3,1X))' + WRITE(FORM2,'(A4,I2,A8)')'(A2,',NX,'(I3,1X))' + CALL LCMGET(IPMAP,'XNAME',NAMX) + CALL LCMGET(IPMAP,'YNAME',NAMY) + RSCH(:NX,:NY)=0 + WRITE(IOUT,1003) + IEL=0 + ICH=0 + DO 85 J=1,NY + DO 80 I=1,NX + IEL=IEL+1 + IF(MIX(IEL).EQ.0) GOTO 80 + ICH=ICH+1 + RSCH(I,J)=NSCH(ICH) + 80 CONTINUE + 85 CONTINUE + WRITE(IOUT,FORM1)' ',(NAMX(I),I=1,NX) + WRITE(IOUT,*)' ' + DO 90 J=1,NY + WRITE(CHANY,'(A2)') (NAMY(J)) + IF(INDEX(CHANY,'-').EQ.1) GOTO 90 + WRITE(IOUT,FORM2)CHANY,(RSCH(I,J),I=1,NX) + 90 CONTINUE + 100 RETURN +* + 1000 FORMAT(/1X,'INITIALIZING THE FLAT AXIAL POWER-SHAPE'/ + 1 1X,'COMPUTING THE FIRST BURNUP LIMITS PER EACH CHANNEL'/) + 1001 FORMAT(/10X, + 1 A12,10X,'REFUELLING SCHEME:',I3,10X,'ZONE-INDEX:',I3,10X, + 2 'SHUFFLING: ',A3) + 1002 FORMAT(A3,12(F8.1,1X)) + 1003 FORMAT(//20X,'** CHANNELS REFUELLING SCHEMES **'/) + 1004 FORMAT(/20X,'** FIRST BURNUP LIMITS PER EACH CHANNEL **'/) + END diff --git a/Donjon/src/RESCEL.f b/Donjon/src/RESCEL.f new file mode 100644 index 0000000..90f14c1 --- /dev/null +++ b/Donjon/src/RESCEL.f @@ -0,0 +1,82 @@ +*DECK RESCEL + SUBROUTINE RESCEL(IPMAP,NCH,NK,ALCH) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute fuel bundle burnups from the age pattern ALCH between +* begin-of-cyle burnups BINI and end-of-cycle burnups BFIN +* +*Copyright: +* Copyright (C) 2002 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): +* routine partly recovered from OPTEX-4 (coef3e) +* +*Parameters: input +* IPMAP address of the MAP linked list or xsm file +* NCH number of channels +* NK number of bundles per channel +* ALCH integer representing channel age. +* +*Parameters: output +* IPMAP address of the MAP linked list or xsm file +* +*Reference: +* J. Tajmouati, "Optimisation de la gestion du combustible enrichi d'un +* reacteur CANDU avec prise en compte des parametres locaux", These +* Ph. D., Ecole Polytechnique de Montreal (1993). Voir Eq. (4.7). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCH,NK,ALCH(NCH) + REAL, ALLOCATABLE, DIMENSION(:) :: F + REAL, ALLOCATABLE, DIMENSION(:,:) :: WINT,BINI,BFIN +*---- +* LOCAL VARIABLES +*---- + INTEGER I,J,ILONG,ITYP +*---- +* SCRATCH STORAGE ALLOCATION +* BINI initial burnup map +* BFIN final burnup map +* WINT instantaneous burnup +* F age values in real +*---- + ALLOCATE(WINT(NCH,NK),BINI(NCH,NK),BFIN(NCH,NK),F(NCH)) +* +* RECOVER FUEL BURNUPS + CALL LCMLEN(IPMAP,'BURN-BEG',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + CALL XABORT('SHIFTB: INITIAL BURNUP REQUIRED') + ENDIF + CALL LCMGET(IPMAP,'BURN-BEG',BINI) + CALL LCMLEN(IPMAP,'BURN-END',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + CALL XABORT('SHIFTB: FINAL BURNUP REQUIRED') + ENDIF + CALL LCMGET(IPMAP,'BURN-END',BFIN) +* + DO 10 I=1,NCH + F(I) = (FLOAT(ALCH(I)) - 0.5) / FLOAT(NCH) + IF( ALCH(I).EQ.0 ) F(I) = 0.0 + DO 11 J=1,NK + WINT(I,J) = BINI(I,J) + F(I) * (BFIN(I,J) - BINI(I,J)) + 11 CONTINUE + 10 CONTINUE + CALL LCMPUT(IPMAP,'BURN-INST',NCH*NK,2,WINT) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(F,BFIN,BINI,WINT) + RETURN + END diff --git a/Donjon/src/RESDRV.f b/Donjon/src/RESDRV.f new file mode 100644 index 0000000..38b12a5 --- /dev/null +++ b/Donjon/src/RESDRV.f @@ -0,0 +1,374 @@ +*DECK RESDRV + SUBROUTINE RESDRV(IPMAP,IPMTX,NFUEL,LX,LY,LZ,IMPX,IGEO,NCH,NB, + 1 NTOT,NCOMB,NSIMS,NASB,NAX,NAY,NIS,IPCPO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read and validate the fuel-map specification from the input file. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki and V. Descotes +* +*Update(s): +* R. Chambon (may 2014) +* +*Parameters: input +* IPMAP pointer to fuel-map information. +* IPMTX pointer to matex information. +* NFUEL number of fuel types. +* LX number of elements along x-axis in geometry. +* LY number of elements along y-axis in geometry. +* LZ number of elements along z-axis in geometry. +* IMPX printing index (=0 for no print). +* IGEO type of geometry (CAR3D=7 or HEXZ=9) +* +*Parameters: output +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NTOT total number of fuel bundles. +* NCOMB number of combustion zones. +* NSIMS assembly layout in SIM: module +* NASB total number of assembly +* NAX number of assembly along x-direction +* NAY number of assembly along y-direction +* NIS number of particularized isotopes +* IPCPO pointer to multicompo information +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPMTX,IPCPO + INTEGER NFUEL,LX,LY,LZ,IMPX,IGEO,NCH,NB,NTOT,NCOMB,NSIMS,NASB,NAX, + 1 NAY,NIS +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT*12,TEXT4*4,TEXT8*8 + LOGICAL LGEOM,LXNAME,LYNAME,LASBL,LCPO,LNAP + DOUBLE PRECISION DFLOT + REAL WEIGHT +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: INX,INY,IZONE,IFMIX, + 1 IASBL,IANX,IANY,NBAX,IBAX + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: INH + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HFOLLO +* + IMPX=0 + LGEOM=.TRUE. + LASBL=.FALSE. + LCPO=.FALSE. + IF(C_ASSOCIATED(IPCPO)) LCPO=.TRUE. + NCH=0 + NB=0 + NCOMB=0 + NSIMS=0 + NASB=0 + NAX=0 + NAY=0 + NIS=0 +*---- +* TYPE OF GEOMETRY +*---- + LXNAME=.TRUE. + LYNAME=.TRUE. + IF (IGEO.EQ.7) THEN + LXNAME=.TRUE. + LYNAME=.TRUE. + ELSEIF (IGEO.EQ.9) THEN + LXNAME=.FALSE. + LYNAME=.FALSE. + ELSE + CALL XABORT('@RESDRV: ONLY 3D-CARTESIAN OR 3D HEXAGONAL' + 1 //' GEOMETRY EXPECTED') + ENDIF + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA EXPECTED.') + IF(IMPX.GE.100) WRITE(6,*)'@RESDRV: Reading Keyword=',TEXT + IF(TEXT.EQ.'EDIT')THEN +*---- +* PRINTING INDEX +*---- + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER DATA EXPECTED(1).') + IMPX=MAX(0,NITMA) + IF(IMPX.GT.4)CALL LCMLIB(IPMTX) + ELSE IF(TEXT.EQ.'WEIGHT') THEN +*---- +* FUEL WEIGHT +*---- + CALL REDGET(ITYP,NB,WEIGHT,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@RESDRV : REAL DATA EXPECTED(1).') + IF(WEIGHT.EQ.0.0 ) CALL XABORT('@RESDRV: INVALID' + + //'VALUE FOR FUEL WEIGHT') + CALL LCMPUT(IPMAP,'FUEL-WEIGHT',1,2,WEIGHT) + ELSE IF(TEXT.EQ.':::') THEN +*---- +* FUEL-MAP GEOMETRY +*---- + LGEOM=.FALSE. + LNAP=.FALSE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA EXPECTED(5).') + IF(TEXT.EQ.'SPLIT-NAP:') THEN + LNAP=.TRUE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA ' + 1 //'EXPECTED(6).') + ENDIF + IF(TEXT.NE.'GEO:') CALL XABORT('@RESDRV: EMBEDDED GEO: MODULE ' + 1 //'EXPECTED.') +*---- +* CHECK GEOMETRY +*---- + CALL RESGEO(IPMAP,IPMTX,LX,LY,LZ,NFUEL,IMPX,IGEO,NX,NY,NZ,NCH, + 1 NB,NTOT,LNAP,IPCPO) + ELSEIF(TEXT.EQ.'NXNAME') THEN +*---- +* CHANNEL X-NAMES +*---- + IF(IGEO.NE.7) CALL XABORT('RESDRV: CARTESIAN GEOM EXPECTED.') + LXNAME=.FALSE. + ALLOCATE(INX(NX)) + DO I=1,NX + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA FOR NXNAME' + 1 //' EXPECTED.') + READ(TEXT4,'(A4)') INX(I) + ENDDO + CALL LCMPUT(IPMAP,'XNAME',NX,3,INX) + DEALLOCATE(INX) + ELSE IF(TEXT.EQ.'NYNAME') THEN +*---- +* CHANNEL Y-NAMES +*---- + IF(IGEO.NE.7) CALL XABORT('RESDRV: CARTESIAN GEOM EXPECTED.') + LYNAME=.FALSE. + ALLOCATE(INY(NY)) + DO I=1,NY + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA FOR NYNAME' + 1 //' EXPECTED.') + READ(TEXT4,'(A4)') INY(I) + ENDDO + CALL LCMPUT(IPMAP,'YNAME',NY,3,INY) + DEALLOCATE(INY) + ELSE IF(TEXT.EQ.'NHNAME') THEN +*---- +* CHANNEL H-NAMES +*---- + IF(IGEO.NE.9) CALL XABORT('RESDRV: HEXAGONAL GEOM EXPECTED.') + ALLOCATE(INH(2,NX)) + DO I=1,NX + CALL REDGET(ITYP,NITMA,FLOT,TEXT8,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA FOR NHNAME' + 1 //' EXPECTED.') + READ(TEXT8,'(2A4)') INH(1,I),INH(2,I) + ENDDO + CALL LCMPUT(IPMAP,'HNAME',2*NX,3,INH) + DEALLOCATE(INH) + ELSE IF(TEXT.EQ.'SIM') THEN +*---- +* DATA FOR SIM: MODULE +*---- + IF(NCH.EQ.0)CALL XABORT('@RESDRV: NO FUEL CHANNELS DEFINED') + ALLOCATE(IZONE(NCH)) + IZONE(:NCH)=0 + CALL REDGET(ITYP,LX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER EXPECTED') + IF((LX.LE.0).OR.(LX.GE.31))CALL XABORT('@RESDRV: 0<LX<31') + CALL REDGET(ITYP,LY,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER EXPECTED') + IF((LY.LE.0).OR.(LY.GE.31))CALL XABORT('@RESDRV: 0<LY<31') + NSIMS=100*LX+LY + DO 20 ICH=1,NCH + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER EXPECTED') + READ(TEXT4,'(A3)') IZONE(ICH) + READ(TEXT4,'(1X,I2,1X)') IND + IF((IND.LE.0).OR.(IND.GT.LY))CALL XABORT('@RESDRV: 0<IND<=LY') + 20 CONTINUE + CALL LCMPUT(IPMAP,'S-ZONE',NCH,3,IZONE) + DEALLOCATE(IZONE) + CALL LCMLEN(IPMAP,'FLMIX',ILONG,ITYLCM) + IF(ILONG.EQ.0)CALL XABORT('@RESDRV: MUST DEFINE ::: GEO: BEFOR' + > //'E SIM.') + ALLOCATE(IFMIX(NCH*NB)) + CALL LCMGET(IPMAP,'FLMIX',IFMIX) + CALL LCMPUT(IPMAP,'FLMIX-INI',NCH*NB,1,IFMIX) + DEALLOCATE(IFMIX) + ELSE IF(TEXT.EQ.'ASSEMBLY') THEN +*---- +* DATA FOR NAP: MODULE +*---- + LASBL=.TRUE. + IF(NCH.EQ.0)CALL XABORT('@RESDRV: NO FUEL CHANNELS DEFINED') + CALL REDGET(ITYP,NASB,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER EXPECTED') + CALL REDGET(ITYP,NAX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER EXPECTED') + CALL REDGET(ITYP,NAY,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER EXPECTED') +* A-ZONE + ALLOCATE(IASBL(NCH)) + IASBL(:NCH)=0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'A-ZONE')CALL XABORT('@RESDRV: KEYWORD A-ZONE' + 1 //' EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) +* automatic definition + IF((ITYP.EQ.3).AND.(TEXT.EQ.'ASBLY')) THEN + CALL LCMSIX(IPMAP,'GEOMAP',1) + CALL LCMLEN(IPMAP,'A-ZONE',LENGTH,ITYP) + IF(NCH.NE.LENGTH) THEN + WRITE(6,'(22H @RESDRV: len(A-ZONE)=,I6,5H NCH=,I6)') LENGTH, + 1 NCH + CALL XABORT('@RESDRV: number of ASSEMBLY automaticaly gene' + 1 //'rated is not equal to NCH') + ENDIF + CALL LCMGET(IPMAP,'A-ZONE',IASBL) + CALL LCMSIX(IPMAP,'GEOMAP',0) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) +* manual definition + ELSEIF(ITYP.EQ.1) THEN + DO 30 ICH=1,NCH + IF(NITMA.LT.1)CALL XABORT('@RESDRV: INVALID ASSEMBLY' + 1 //'-ZONE INDEX < 1') + IF(NITMA.GT.NASB)CALL XABORT('@RESDRV: INVALID ASSEMBLY' + 1 //'-ZONE INDEX > NASB') + IASBL(ICH)=NITMA + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + 30 CONTINUE + IF((ITYP.NE.3).AND.(TEXT.NE.'A-NX')) CALL XABORT('@RESDRV:' + 1 //'number of ASSEMBLY per row required: A-NX keyword') + ALLOCATE(NBAX(NAY)) + ALLOCATE(IBAX(NAY)) + DO I=1,NAY + CALL REDGET(ITYP,NBAX(I),FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@RESDRV: NAY ' + 1 //'integers required after A-NX CARD') + ENDDO + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF((ITYP.NE.3).AND.(TEXT.NE.'A-IBX')) CALL XABORT('@RESDRV:' + 1 //'first column of ASSEMBLY per row required: A-IBX ' + 2 //'keyword') + DO I=1,NAY + CALL REDGET(ITYP,IBAX(I),FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@RESDRV: NAY ' + 1 //'integers required after A-IBX CARD') + ENDDO + CALL LCMSIX(IPMAP,'GEOMAP',1) + CALL LCMPUT(IPMAP,'A-NX',NAY,1,NBAX) + CALL LCMPUT(IPMAP,'A-IBX',NAY,1,IBAX) + CALL LCMSIX(IPMAP,'GEOMAP',0) + DEALLOCATE(NBAX,IBAX) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + ELSE + CALL XABORT('@RESDRV: INTEGER ASSEMBLY-ZONE INDEX or ' + 1 //'ASBLY keyword EXPECTED.') + ENDIF + CALL LCMPUT(IPMAP,'A-ZONE',NCH,1,IASBL) + DEALLOCATE(IASBL) +* AXNAME + IF(TEXT.NE.'AXNAME')CALL XABORT('@RESDRV: KEYWORD AXNAME' + 1 //' EXPECTED.') + ALLOCATE(IANX(NAX)) + DO I=1,NAX + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA FOR AXNAME' + 1 //' EXPECTED.') + READ(TEXT4,'(A4)') IANX(I) + ENDDO + CALL LCMPUT(IPMAP,'AXNAME',NAY,3,IANX) + DEALLOCATE(IANX) +* AYNAME + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'AYNAME')CALL XABORT('@RESDRV: KEYWORD AYNAME' + 1 //' EXPECTED.') + ALLOCATE(IANY(NAY)) + DO I=1,NAY + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESDRV: CHARACTER DATA FOR AYNAME' + 1 //' EXPECTED.') + READ(TEXT4,'(A4)') IANY(I) + ENDDO + CALL LCMPUT(IPMAP,'AYNAME',NAY,3,IANY) + DEALLOCATE(IANY) + ELSE IF(TEXT.EQ.'FOLLOW') THEN + CALL REDGET(ITYP,NIS,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@RESDRV: INTEGER EXPECTED') + ALLOCATE(HFOLLO(NIS)) + DO 40 ICH=1,NIS + CALL REDGET(ITYP,NITMA,FLOT,HFOLLO(ICH),DFLOT) + IF(ITYP.NE.3) CALL XABORT('@RESDRV: CHARACTER EXPECTED') + 40 CONTINUE + CALL LCMPTC(IPMAP,'HFOLLOW',8,NIS,HFOLLO) + DEALLOCATE(HFOLLO) + ELSE IF(TEXT.EQ.'NCOMB') THEN +*---- +* NUMBER OF COMBUSTION ZONES +*---- + IF(NCH.EQ.0) CALL XABORT('@RESDRV: NO FUEL CHANNELS DEFINED') + ALLOCATE(IZONE(NCH)) + IZONE(:NCH)=0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF((ITYP.EQ.3).AND.(TEXT.EQ.'ALL'))THEN + NCOMB=NCH + DO 50 ICH=1,NCH + IZONE(ICH)=ICH + 50 CONTINUE + ELSEIF((ITYP.EQ.3).AND.(TEXT.EQ.'ASBLY'))THEN + IF(.NOT.LASBL) CALL XABORT('@RESDRV: NO ASSEMBLY DEFINED') + NCOMB=NASB + ALLOCATE(IASBL(NCH)) + CALL LCMGET(IPMAP,'A-ZONE',IASBL) + DO 60 ICH=1,NCH + IZONE(ICH)=IASBL(ICH) + 60 CONTINUE + DEALLOCATE(IASBL) + ELSEIF(ITYP.EQ.1)THEN + IF(NITMA.LT.1)CALL XABORT('@RESDRV: INVALID NCOMB < 1') + IF(NITMA.GT.NCH)CALL XABORT('@RESDRV: INVALID NCOMB > NCH') + NCOMB=NITMA +*---- +* COMBUSTION-ZONE INDICES +*---- + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'B-ZONE')CALL XABORT('@RESDRV: KEYWORD B-ZONE' + 1 //' EXPECTED.') + DO 70 ICH=1,NCH + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESDRV: INTEGER COMBUSTION' + 1 //'-ZONE INDEX EXPECTED.') + IF(NITMA.LT.1)CALL XABORT('@RESDRV: INVALID COMBUSTION' + 1 //'-ZONE INDEX < 1') + IF(NITMA.GT.NCOMB)CALL XABORT('@RESDRV: INVALID COMBUSTION' + 1 //'-ZONE INDEX > NCOMB') + IZONE(ICH)=NITMA + 70 CONTINUE + ELSE + CALL XABORT('@RESDRV: INVALID INPUT FOR NCOMB.') + ENDIF + CALL LCMPUT(IPMAP,'B-ZONE',NCH,1,IZONE) + DEALLOCATE(IZONE) + GO TO 80 + ELSE + CALL XABORT('@RESDRV: INVALID KEYWORD ('//TEXT//').') + ENDIF + GO TO 10 +* + 80 IF(NCH.EQ.0) CALL XABORT('@RESDRV: NO FUEL CHANNELS DEFINED.') + IF(NB.EQ.0) CALL XABORT('@RESDRV: NO FUEL BUNDLES DEFINED.') + IF(LGEOM) CALL XABORT('@RESDRV: OPERATOR ::: EXPECTED.') + IF(LXNAME) CALL XABORT('@RESDRV: KEYWORD NXNAME EXPECTED.') + IF(LYNAME) CALL XABORT('@RESDRV: KEYWORD NYNAME EXPECTED.') + RETURN + END diff --git a/Donjon/src/RESGEO.f b/Donjon/src/RESGEO.f new file mode 100644 index 0000000..0c168f7 --- /dev/null +++ b/Donjon/src/RESGEO.f @@ -0,0 +1,304 @@ +*DECK RESGEO + SUBROUTINE RESGEO(IPMAP,IPMTX,LX,LY,LZ,NFUEL,IMPX,IGEO,NX,NY,NZ, + 1 NCH,NB,NTOT,LNAP,IPCPO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Create and check the fuel-map geometry. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, D. Sekki and V. Descotes +* +*Update(s): +* R. Chambon 2014 +* +*Parameters: input +* IPMAP pointer to fuel-map information. +* IPMTX pointer to matex information. +* LX number of elements along x-axis in geometry. +* LY number of elements along y-axis in geometry. +* LZ number of elements along z-axis in geometry. +* NFUEL number of fuel types. +* IMPX printing index (=0 for no print). +* IGEO type of geometry (=7 or =9) +* +*Parameters: output +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NTOT total number of fuel bundles. +* LNAP Flag to call NAP: module to unfold geometry at assembly level +* IPCPO pointer to multicompo information +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPMTX,IPCPO,IPGNW + INTEGER LX,LY,LZ,NFUEL,IGEO,NX,NY,NZ,NCH,NB,NTOT + LOGICAL LNAP +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6,EPSI=1.0E-4) + INTEGER ISTATE(NSTATE),JENT(1),IENT(1),JENT2(3),IENT2(3),NCODE(6), + 1 ICODE(6) + TYPE(C_PTR) KENT(1),KENT2(3) + REAL GEOXX(LX+1),GEOYY(LY+1),GEOZZ(LZ+1),GEOSI,GMAPSI,ZCODE(6) + CHARACTER HENT(1)*12,HENT2(3)*12,TEXT*12 + DOUBLE PRECISION DFLOT +*---- +* ALLOCATABLE STATEMENTS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: ISPLX,ISPLY,ISPLZ,MAT + REAL, ALLOCATABLE, DIMENSION(:) :: GMAPX,GMAPY,GMAPZ +*---- +* FUEL-MAP GEOMETRY +*---- + IF(IMPX.GT.1)WRITE(IOUT,*)'** CREATING FUEL-MAP GEOMETRY **' + CALL LCMSIX(IPMAP,'GEOMAP',1) + NENT=1 + JENT(1)=0 + HENT(1)='GEOMAP' + IENT(1)=1 + KENT(1)=IPMAP + CALL GEOD(NENT,HENT,IENT,JENT,KENT) + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) +* + IF(LNAP) THEN +*---- +* FUEL-MAP GEOMETRY UNFOLDING WITH NAP: +*---- + IF(.NOT.C_ASSOCIATED(IPCPO)) THEN + CALL XABORT('RESGEO: COMPO LCM OBJECT MISSING AT RHS.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESGEO: CHARACTER DATA EXPECTED.') + IF(TEXT.NE.':::') CALL XABORT('@RESGEO: ::: keyword EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESGEO: CHARACTER DATA EXPECTED.') + IF(TEXT.NE.'NAP:') CALL XABORT('@RESGEO: NAP: keyword ' + 1 //'EXPECTED.') + CALL LCMOP(IPGNW,'GEONEW',0,1,0) + CALL LCMSIX(IPMAP,' ',0) + CALL LCMSIX(IPMAP,'GEOMAP',1) + NENT2=3 + JENT2(1)=0 + JENT2(2)=2 + JENT2(3)=2 + HENT2(1)='GEONEW' + HENT2(1)='GEOOLD' + HENT2(1)='COMPO' + IENT2(1)=1 + IENT2(2)=1 + IENT2(3)=1 + KENT2(1)=IPGNW + KENT2(2)=IPMAP + KENT2(3)=IPCPO + CALL NAP(NENT2,HENT2,IENT2,JENT2,KENT2) + CALL LCMSIX(IPMAP,' ',0) + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) + CALL LCMDEL(IPMAP,'GEOMAP') + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) + CALL LCMSIX(IPMAP,'GEOMAP',1) + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) + CALL LCMEQU(IPGNW,IPMAP) + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) + CALL LCMCL(IPGNW,1) + ENDIF +**** + CALL LCMSIX(IPMAP,' ',0) + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) + CALL LCMSIX(IPMAP,'GEOMAP',1) + IF(IMPX.GT.3)CALL LCMLIB(IPMAP) +**** + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.IGEO) CALL XABORT('@RESGEO: THE GEOMETRY ' + 1 // 'IN FUEL-MAP MUST HAVE THE SAME TYPE AS IN THE MATEX-OBJECT') + IGEO=ISTATE(1) + NX=ISTATE(3) + NY=ISTATE(4) + NZ=ISTATE(5) +*---- +* READ FUEL-MAP GEOMETRY AND PERFORM MESH-SPLITTING +*---- + IMPX0=MAX(0,IMPX-1) + NX2=NX + NY2=NY + IF(IGEO.GE.8) NY2=1 + NZ2=NZ + ALLOCATE(ISPLX(NX2),ISPLY(NY2),ISPLZ(NZ2)) + ISPLTL=0 + ISPLTH=0 + IHEX=0 + CALL LCMLEN(IPMAP,'SPLITL',ILEN,ITYLCM) + IF(ILEN.GT.0) CALL LCMGET(IPMAP,'SPLITL',ISPLTL) + CALL LCMLEN(IPMAP,'SPLITH',ILEN,ITYLCM) + IF(ILEN.GT.0) CALL LCMGET(IPMAP,'SPLITH',ISPLTH) + IF(IGEO.LT.8) THEN + CALL LCMLEN(IPMAP,'SPLITX',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPMAP,'SPLITX',ISPLX) + NX2=0 + DO IOLD=1,NX + NX2=NX2+ISPLX(IOLD) + ENDDO + ENDIF + CALL LCMLEN(IPMAP,'SPLITY',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPMAP,'SPLITY',ISPLY) + NY2=0 + DO IOLD=1,NY + NY2=NY2+ISPLY(IOLD) + ENDDO + ENDIF + ELSEIF((ISPLTH.NE.0).AND.((IGEO.EQ.8).OR.(IGEO.EQ.9))) THEN + NX2=NX*6*(ISPLTH**2) + CALL LCMGET(IPMAP,'IHEX',IHEX) + ELSEIF((ISPLTL.NE.0).AND.((IGEO.EQ.8).OR.(IGEO.EQ.9))) THEN + NX2=NX*3*(ISPLTL**2) + CALL LCMGET(IPMAP,'IHEX',IHEX) + ENDIF + CALL LCMLEN(IPMAP,'SPLITZ',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPMAP,'SPLITZ',ISPLZ) + NZ2=0 + DO IOLD=1,NZ + NZ2=NZ2+ISPLZ(IOLD) + ENDDO + ENDIF + MAXPTS=NX2*NY2*NZ2 + MAXX=NX2 + IF(IHEX.EQ.1) THEN + MAXPTS=12*MAXPTS + MAXX=12*MAXX + ELSE IF((IHEX.EQ.2).OR.(IHEX.EQ.3)) THEN + MAXPTS=6*MAXPTS + MAXX=6*MAXX + ELSE IF(IHEX.EQ.4) THEN + MAXPTS=4*MAXPTS + MAXX=4*MAXX + ELSE IF(IHEX.EQ.5) THEN + MAXPTS=3*MAXPTS + MAXX=3*MAXX + ELSE IF((IHEX.GE.6).AND.(IHEX.LE.8)) THEN + MAXPTS=2*MAXPTS + MAXX=2*MAXX + ENDIF + ALLOCATE(MAT(MAXPTS),GMAPX(MAXX+1),GMAPY(NY2+1),GMAPZ(NZ2+1)) + CALL READ3D(MAXX,NY2,NZ2,MAXPTS,IPMAP,IHEX,IR,ILK,SIDE,GMAPX, + 1 GMAPY,GMAPZ,IMPX0,NX2,NY2,NZ2,MAT,NEL,NCODE,ICODE,ZCODE,ISPLX, + 2 ISPLY,ISPLZ,ISPLH,ISPLL) + IF((NEL.NE.NX2*NY2*NZ2).AND.(IHEX.EQ.0))CALL XABORT('@RESGEO: WR' + 1 // 'ONG GEOMETRY.') + IF((NEL.NE.NX2*NZ2).AND.(IHEX.NE.0))CALL XABORT('@RESGEO: WRONG ' + 1 // 'HEXAGONAL GEOMETRY, WRONG NUMBER OF ELEMENTS.') + DEALLOCATE(MAT,ISPLZ,ISPLY,ISPLX) + IF(IMPX.GT.2)WRITE(IOUT,*)'CHECKING FUEL-MAP GEOMETRY' + IF((IGEO.NE.7).AND.(IGEO.NE.9))CALL XABORT('@RESGEO: ONLY ' + 1 //'3D-CARTESIAN OR 3D-HEXAGONAL GEOMETRY ALLOWED.') + IF(IHEX.EQ.0) THEN + IF((LX.LT.NX).OR.(LY.LT.NY).OR.(LZ.LT.NZ)) THEN + WRITE(IOUT,*) 'Geometry LX=',LX,', LY=',LY,' and LZ=',LZ, + 1 ' must be greater or equal to map ', + 2 'NX=',NX,' NY=',NY,' and NZ=',NZ + CALL XABORT('@RESGEO: WRONG GEOMETRY DEFINITION.') + ENDIF + ELSE + IF((LX.LT.NX).OR.(LZ.LT.NZ)) THEN + WRITE(IOUT,*) 'Geometry LX=',LX,' and LZ=',LZ, + 1 ' must be greater or equal to map ', + 2 'NX=',NX,' and NZ=',NZ + CALL XABORT('@RESGEO: WRONG GEOMETRY DEFINITION.') + ENDIF + ENDIF + IF(NZ.LT.NB)THEN + WRITE(IOUT,*)'@RESGEO: FOUND NZ=',NZ,' LESS THAN NB=',NB + CALL XABORT('@RESGEO: WRONG FUEL-MAP GEOMETRY DEFINITION.') + ENDIF +*---- +* CHECK MESHX OR SIDE +*---- + IF(IGEO.EQ.7) THEN + GEOXX(:LX+1)=0.0 + CALL LCMGET(IPMTX,'MESHX',GEOXX) + DO 10 IMP=1,NX+1 + DO IGM=1,LX+1 + IF(ABS(GMAPX(IMP)-GEOXX(IGM)).LT.EPSI)THEN + GEOXX(IGM)=GMAPX(IMP) + GOTO 10 + ENDIF + ENDDO + WRITE(IOUT,*)'@RESGEO: MESHX IN L_MAP ',GMAPX(IMP) + CALL XABORT('@RESGEO: UNABLE TO FIND THIS MESHX IN L_GEOM.') + 10 CONTINUE + CALL LCMPUT(IPMTX,'MESHX',LX+1,2,GEOXX) + ELSE IF(IGEO.EQ.9) THEN + ISPLTL=0 + NY=1 + CALL LCMGET(IPMAP,'SIDE',GMAPSI) + CALL LCMLEN(IPMAP,'SPLITL',ILONG,ITYLCM) + IF(ILONG.GT.0) CALL LCMGET(IPMAP,'SPLITL',ISPLTL) + IF(ISPLTL.EQ.0) ISPLTL=1 + GMAPSI=GMAPSI/REAL(ISPLTL) + CALL LCMGET(IPMTX,'SIDE',GEOSI) + IF(ABS(GMAPSI-GEOSI).LT.EPSI)THEN + GEOSI=GMAPSI + GOTO 20 + ENDIF + WRITE(IOUT,*)'@RESGEO: SIDE IN L_MAP ',GMAPSI, GEOSI + CALL XABORT('@RESGEO: UNABLE TO FIND THIS SIDE IN L_GEOM.') + 20 CONTINUE + CALL LCMPUT(IPMTX,'SIDE',1,2,GEOSI) + ENDIF +*---- +* CHECK MESHY (ONLY IF 3D-CARTESIAN GEOMETRY) +*---- + IF(IGEO.EQ.7) THEN + GEOYY(:LY+1)=0.0 + CALL LCMGET(IPMTX,'MESHY',GEOYY) + DO 30 IMP=1,NY+1 + DO IGM=1,LY+1 + IF(ABS(GMAPY(IMP)-GEOYY(IGM)).LT.EPSI)THEN + GEOYY(IGM)=GMAPY(IMP) + GOTO 30 + ENDIF + ENDDO + WRITE(IOUT,*)'@RESGEO: MESHY IN FUEL MAP ',GMAPY(IMP) + CALL XABORT('@RESGEO: UNABLE TO FIND THIS MESHY IN L_GEOM.') + 30 CONTINUE + CALL LCMPUT(IPMTX,'MESHY',LY+1,2,GEOYY) + ENDIF +*---- +* CHECK MESHZ +*---- + GEOZZ(:LZ+1)=0.0 + CALL LCMGET(IPMTX,'MESHZ',GEOZZ) + DO 50 IMP=1,NZ+1 + DO IGM=1,LZ+1 + IF(ABS(GMAPZ(IMP)-GEOZZ(IGM)).LT.EPSI)THEN + GEOZZ(IGM)=GMAPZ(IMP) + GOTO 50 + ENDIF + ENDDO + WRITE(IOUT,*)'@RESGEO: MESHZ IN FUEL MAP ',GMAPZ(IMP) + CALL XABORT('@RESGEO: UNABLE TO FIND THIS MESHZ IN L_GEOM.') + 50 CONTINUE + CALL LCMPUT(IPMTX,'MESHZ',LZ+1,2,GEOZZ) + DEALLOCATE(GMAPZ,GMAPY,GMAPX) +*---- +* CHECK FUEL MIXTURES +*---- + CALL RESPFM(IPMAP,IPMTX,NX,NY,NZ,LX,LY,LZ,NFUEL,IMPX,IGEO,NCH,NB, + 1 NTOT) + RETURN + END diff --git a/Donjon/src/RESHID.f b/Donjon/src/RESHID.f new file mode 100644 index 0000000..81ed496 --- /dev/null +++ b/Donjon/src/RESHID.f @@ -0,0 +1,144 @@ +*DECK RESHID + SUBROUTINE RESHID(IPMAP,IPMTX,NX,NZ,LX,LZ,MIX,NFUEL,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Update material index, it will store the negative fuel mixtures. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* V. Descotes +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* IPMTX pointer to matex information. +* NX number of elements along x-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* LX number of elements along x-axis in geometry. +* LZ number of elements along z-axis in geometry. +* MIX renumbered index over the fuel-map geometry. +* NFUEL number of fuel types. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPMTX + INTEGER NX,NZ,LX,LZ,MIX(NX*NZ),NFUEL,IMPX +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER ISPLTY(1),NCODE(6) + REAL MTXSIDE,MAPSIDE + TYPE(C_PTR) JPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMAT,ISPLTX,ISPLTZ,INDX, + 1 FTOT,DPP,MX + REAL, ALLOCATABLE, DIMENSION(:) :: MAPZZ,GEOZZ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ISPLTX(LX),ISPLTZ(LZ),INDX(LX*LZ),FTOT(NFUEL)) + ALLOCATE(MAPZZ(NZ+1),GEOZZ(LZ+1)) +*---- +* RECOVER GEOMETRY AND FUELMAP INFORMATION +*---- + CALL LCMGET(IPMTX,'SIDE',MTXSIDE) + CALL LCMGET(IPMTX,'MESHZ',GEOZZ) + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMGET(JPMAP,'IHEX',IHEX) + CALL LCMGET(JPMAP,'SIDE',MAPSIDE) + CALL LCMGET(JPMAP,'MESHZ',MAPZZ) + ISPLTL=0 + CALL LCMLEN(JPMAP,'SPLITL',ILONG,ITYLCM) + IF(ILONG.NE.0) CALL LCMGET(JPMAP,'SPLITL',ISPLTL) +*---- +* UNFOLD GEOMETRY IF HEXAGONAL IN LOZENGES +*---- + IF((ISPLTL.GT.0).AND.(IHEX.NE.9)) THEN + MAXPTS=LX*LZ + ALLOCATE(DPP(MAXPTS),MX(NX*NZ)) + DO 10 I=1,NX*NZ + MX(I)=MIX(I) + 10 CONTINUE + NXOLD=NX + CALL BIVALL(MAXPTS,IHEX,NXOLD,NX,DPP) + DO 30 KZ=1,NZ + DO 20 KX=1,NX + KEL=DPP(KX)+(KZ-1)*NXOLD + INDX(KX+(KZ-1)*NX)=MX(KEL) + 20 CONTINUE + 30 CONTINUE + DEALLOCATE(DPP,MX) + IHEX=9 + ELSE + INDX(:NX*NZ)=MIX(:NX*NZ) + ENDIF +*---- +* FUELMAP INFORMATION SPLITTING +*---- + NY=1 + ITYPE=9 + ISPLTX(:NX)=1 + ISPLTY(:NY)=1 + IZ=1 + DO KM=1,NZ + ISPLTZ(KM)=0 + DO JZ=IZ,LZ + IF(GEOZZ(JZ+1).LE.MAPZZ(KM+1)) THEN + ISPLTZ(KM)=ISPLTZ(KM)+1 + ELSE + IZ=JZ + EXIT + ENDIF + ENDDO + ENDDO + MAXPTS=LX*LZ + LX1=LX + LY1=1 + LZ1=LZ + CALL SPLIT0 (MAXPTS,ITYPE,NCODE,NX,NY,NZ,ISPLTX,ISPLTY,ISPLTZ, + 1 0,ISPLTL,NMBLK,LX1,LY1,LZ1,MAPSIDE,XXX,YYY,ZZZ,INDX,.FALSE., + 2 IMPX) + IF(ISPLTL.GT.0) MAPSIDE=MAPSIDE/REAL(ISPLTL) + IF(ABS(MAPSIDE-MTXSIDE).GT.1.0E-6) CALL XABORT('RESHID: INVALID ' + 1 //'SIDE.') +* CHECK TOTAL NUMBER + ITOT=0 + DO 40 IEL=1,LX*LZ + IF(INDX(IEL).NE.0)ITOT=ITOT+1 + 40 CONTINUE + NTOT=0 + CALL LCMGET(IPMTX,'FTOT',FTOT) + DO 50 IFUEL=1,NFUEL + NTOT=NTOT+FTOT(IFUEL) + 50 CONTINUE + IF(ITOT.NE.NTOT) THEN + WRITE(IOUT,'(/15H @RESHID: ITOT=,I8,6H NTOT=,I8)') ITOT,NTOT + CALL XABORT('@RESHID: FOUND DIFFERENT TOTAL NUMBER OF FUEL MI' + 1 //'XTURES IN FUEL-MAP AND MATEX.') + ENDIF +* STORE NEGATIVE FUEL MIXTURES + CALL LCMLEN(IPMTX,'MAT',LENGT,ITYP) + ALLOCATE(IMAT(LENGT)) + IMAT(:LENGT)=0 + CALL LCMGET(IPMTX,'MAT',IMAT) + DO 60 IEL=1,LX*LZ + IF(INDX(IEL).NE.0)IMAT(IEL)=-INDX(IEL) + 60 CONTINUE + CALL LCMPUT(IPMTX,'MAT',LENGT,1,IMAT) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(IMAT,GEOZZ,MAPZZ,FTOT,INDX,ISPLTZ,ISPLTX) + RETURN + END diff --git a/Donjon/src/RESIND.f b/Donjon/src/RESIND.f new file mode 100644 index 0000000..d869637 --- /dev/null +++ b/Donjon/src/RESIND.f @@ -0,0 +1,128 @@ +*DECK RESIND + SUBROUTINE RESIND(IPMAP,IPMTX,NX,NY,NZ,LX,LY,LZ,MIX,NFUEL,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Update material index, it will store the negative fuel mixtures. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* E. Varin, D. Sekki +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* IPMTX pointer to matex information. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* LX number of elements along x-axis in geometry. +* LY number of elements along y-axis in geometry. +* LZ number of elements along z-axis in geometry. +* MIX renumbered index over the fuel-map geometry. +* NFUEL number of fuel types. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPMTX + INTEGER NX,NY,NZ,LX,LY,LZ,MIX(NX*NY*NZ),NFUEL,IMPX +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER INDX(LX*LY*LZ),FTOT(NFUEL) + REAL MAPXX(NX+1),MAPYY(NY+1),MAPZZ(NZ+1), + 1 GEOXX(LX+1),GEOYY(LY+1),GEOZZ(LZ+1) + TYPE(C_PTR) JPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMAT +*---- +* UPDATE MATERIAL INDEX +*---- + CALL LCMGET(IPMTX,'MESHX',GEOXX) + CALL LCMGET(IPMTX,'MESHY',GEOYY) + CALL LCMGET(IPMTX,'MESHZ',GEOZZ) + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMGET(JPMAP,'MESHX',MAPXX) + CALL LCMGET(JPMAP,'MESHY',MAPYY) + CALL LCMGET(JPMAP,'MESHZ',MAPZZ) + INDX(:LX*LY*LZ)=0 + IF(IMPX.GT.2)WRITE(IOUT,*)'UPDATING MATERIAL INDEX' + I1=0 + I2=0 + J1=0 + J2=0 + K1=0 + K2=0 + DO 52 KM=1,NZ + DO 51 JM=1,NY + DO 50 IM=1,NX + DO IG=1,LX + IF(MAPXX(IM).EQ.GEOXX(IG)) I1=IG + IF(MAPXX(IM+1).EQ.GEOXX(IG+1))THEN + I2=IG + GOTO 10 + ENDIF + ENDDO + 10 DO JG=1,LY + IF(MAPYY(JM).EQ.GEOYY(JG)) J1=JG + IF(MAPYY(JM+1).EQ.GEOYY(JG+1))THEN + J2=JG + GOTO 20 + ENDIF + ENDDO + 20 DO KG=1,LZ + IF(MAPZZ(KM).EQ.GEOZZ(KG)) K1=KG + IF(MAPZZ(KM+1).EQ.GEOZZ(KG+1))THEN + K2=KG + GOTO 30 + ENDIF + ENDDO + 30 IELM=(KM-1)*NX*NY+(JM-1)*NX +IM + DO 42 KG=K1,K2 + DO 41 JG=J1,J2 + DO 40 IG=I1,I2 + IELG=(KG-1)*LX*LY+(JG-1)*LX+IG + INDX(IELG)=MIX(IELM) + 40 CONTINUE + 41 CONTINUE + 42 CONTINUE + 50 CONTINUE + 51 CONTINUE + 52 CONTINUE +* CHECK TOTAL NUMBER + ITOT=0 + DO 60 IEL=1,LX*LY*LZ + IF(INDX(IEL).NE.0)ITOT=ITOT+1 + 60 CONTINUE + NTOT=0 + CALL LCMGET(IPMTX,'FTOT',FTOT) + DO 70 IFUEL=1,NFUEL + NTOT=NTOT+FTOT(IFUEL) + 70 CONTINUE + IF(ITOT.NE.NTOT) THEN + WRITE(IOUT,'(/15H @RESIND: ITOT=,I8,6H NTOT=,I8)') ITOT,NTOT + CALL XABORT('@RESIND: FOUND DIFFERENT TOTAL NUMBER OF FUEL MI' + 1 //'XTURES IN FUEL-MAP AND MATEX.') + ENDIF +* STORE NEGATIVE FUEL MIXTURES + CALL LCMLEN(IPMTX,'MAT',LENGT,ITYP) + ALLOCATE(IMAT(LENGT)) + IMAT(:LENGT)=0 + CALL LCMGET(IPMTX,'MAT',IMAT) + DO 100 IEL=1,LX*LY*LZ + IF(INDX(IEL).NE.0)IMAT(IEL)=-INDX(IEL) + 100 CONTINUE + CALL LCMPUT(IPMTX,'MAT',LENGT,1,IMAT) + DEALLOCATE(IMAT) + RETURN + END diff --git a/Donjon/src/RESINI.f b/Donjon/src/RESINI.f new file mode 100644 index 0000000..9c76f3c --- /dev/null +++ b/Donjon/src/RESINI.f @@ -0,0 +1,200 @@ +*DECK RESINI + SUBROUTINE RESINI(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Construct or modify a fuel-map object. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki and V. Descotes +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The RESINI: module specifications are: +* Option 1 +* FLMAP MATEX := RESINI: MATEX [COMPO] :: (descresini1) ; +* Option 2 +* FLMAP := RESINI: FLMAP [FLMAP2] :: (descresini2) ; +* where +* FLMAP : name of the \emph{resini} object that will contain the fuel-lattice +* information. If FLMAP appears on both LHS and RHS, it will be updated; +* otherwise, it is created. +* +* MATEX : name of the \emph{matex} object specified in the modification mode. +* MATEX is required only when FLMAP is created. +* COMPO : name of the \emph{multicompo} data structure (L\_COMPO signature) +* where the detailed subregion geometry at assembly level is stored. +* FLMAP2 : name of the \emph{resini} object that contains the fuel-lattice +* information to recover from. +* (descresini1) : structure describing the main input data to +* the RESINI: module. Note that this input data is mandatory and +* must be specified only when FLMAP is created. +* (descresini2) : structure describing the input data for global and local +* parameters. This data is permitted to be modified in the subsequent calls +* to the RESINI: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER TEXT*12,HSIGN*12,HSIGN2*12 + INTEGER ISTATE(NSTATE),IGST(NSTATE) + LOGICAL LNEW,LCPO,LMAP2 + TYPE(C_PTR) IPMTX,IPMAP,JPMAP,IPCPO,IPMP2 +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.GT.3)CALL XABORT('@RESINI: 2 or 3 PARAMETERS ALLOWED.') + LCPO=.FALSE. + IPCPO=C_NULL_PTR + IPMP2=C_NULL_PTR + IF(IENTRY(1).GT.2) CALL XABORT('@RESINI: INVALID FIRST PARAMETER' + 1 //' TYPE.') + LNEW=.TRUE. + LMAP2=.FALSE. + HSIGN2=' ' + IF(NENTRY.GE.2) CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN2) + IF((NENTRY.EQ.1).OR.(HSIGN2.EQ.'L_MAP'))THEN + IF(JENTRY(1).NE.1) CALL XABORT('@RESINI: OBJECT IN MODIFICATIO' + 1 //'N MODE EXPECTED.') + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP')THEN + TEXT=HENTRY(1) + CALL XABORT('@RESINI: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_MAP EXPECTED.') + ENDIF + IF(JENTRY(1).NE.1)CALL XABORT('@RESINI: MODIFICATION MODE EX' + 1 //'PECTED FOR THE FUEL-MAP OBJECT.') + LNEW=.FALSE. + IF(HSIGN2.EQ.'L_MAP') THEN + LMAP2=.TRUE. + IPMP2=KENTRY(2) + ENDIF + ELSE + IF(HSIGN2.NE.'L_MATEX')THEN + TEXT=HENTRY(2) + CALL XABORT('@RESINI: SIGNATURE OF '//TEXT//' IS '//HSIGN2// + 1 '. L_MATEX EXPECTED.') + ENDIF + IF(JENTRY(2).NE.1)CALL XABORT('@RESINI: MODIFICATION MODE EX' + 1 //'PECTED FOR THE MATEX OBJECT.') + HSIGN='L_MAP' + CALL LCMPTC(KENTRY(1),'SIGNATURE',12,HSIGN) + IPMTX=KENTRY(2) + IF(NENTRY.EQ.3) THEN + LCPO=.TRUE. + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MULTICOMPO')THEN + TEXT=HENTRY(3) + CALL XABORT('@RESINI: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_MULTICOMPO EXPECTED.') + ENDIF + IPCPO=KENTRY(3) + ENDIF + ENDIF + IPMAP=KENTRY(1) +*---- +* RECOVER INFORMATION +*---- + IMPX=1 + ISTATE(:NSTATE)=0 + IF(LNEW)THEN + NPARM=0 + CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE) + IGEO=ISTATE(6) + IF((IGEO.NE.7).AND.(IGEO.NE.9))CALL XABORT('@RESINI: ONLY' + 1 //' 3D-CARTESIAN OR 3D-HEXAGONAL GEOMETRY ALLOWED.') + NGRP=ISTATE(1) + NFUEL=ISTATE(4) + LX=ISTATE(8) + LY=ISTATE(9) + LZ=ISTATE(10) +* MAIN INPUT + CALL RESDRV(IPMAP,IPMTX,NFUEL,LX,LY,LZ,IMPX,IGEO,NCH,NB,NTOT, + 1 NCOMB,NSIMS,NASB,NAX,NAY,NIS,IPCPO) + ISTATE(:NSTATE)=0 + ISTATE(1)=NB + ISTATE(2)=NCH + ISTATE(3)=NCOMB + ISTATE(4)=NGRP + ISTATE(12)=IGEO + ISTATE(7)=NFUEL + ISTATE(8)=NPARM + ISTATE(9)=NTOT + ISTATE(13)=NSIMS + ISTATE(14)=NASB + ISTATE(15)=NAX + ISTATE(16)=NAY + ISTATE(18)=NIS + ELSE + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + IGEO=ISTATE(12) + NFUEL=ISTATE(7) + NPARM=ISTATE(8) + NTOT=ISTATE(9) + NSIMS=ISTATE(13) + NASB=ISTATE(14) + NAX=ISTATE(15) + NAY=ISTATE(16) + NIS=ISTATE(18) + ENDIF + IGST(:NSTATE)=0 + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMGET(JPMAP,'STATE-VECTOR',IGST) + NX=IGST(3) + NY=IGST(4) + NZ=IGST(5) + IF(IGEO.EQ.9) NY=1 +* INPUT OF PARAMETERS + CALL RESPAR(IPMAP,NCH,NB,NFUEL,NCOMB,NPARM,NX,NY,NZ,NSTATE, + 1 ISTATE,IMPX,NASB,LMAP2,IPMP2) + CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(IMPX.GT.0)WRITE(IOUT,100) IMPX,(ISTATE(I),I=1,9),ISTATE(12), + 1 ISTATE(13),ISTATE(18) + IF(IMPX.GT.5)CALL LCMLIB(IPMAP) + RETURN +* + 100 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NB ,I6,39H (NUMBER OF FUEL BUNDLES PER CHANNEL)/ + 3 7H NCH ,I6,28H (NUMBER OF FUEL CHANNELS)/ + 4 7H NCOMB ,I6,31H (NUMBER OF COMBUSTION ZONES)/ + 5 7H NGRP ,I6,28H (NUMBER OF ENERGY GROUPS)/ + 6 7H INTER ,I6,26H (TYPE OF INTERPOLATION)/ + 7 7H ISHIFT,I6,28H (NUMBER OF BUNDLE SHIFTS)/ + 8 7H NFUEL ,I6,25H (NUMBER OF FUEL TYPES)/ + 9 7H NPARM ,I6,25H (NUMBER OF PARAMETERS)/ + 1 7H NTOT ,I6,33H (TOTAL NUMBER OF FUEL BUNDLES)/ + 2 7H IGEO ,I6,28H (7=CARTESIAN/9=HEXAGONAL)/ + 3 7H NSIMS ,I6,35H (ASSEMBLY LAYOUT IN SIM: MODULE)/ + 4 7H NIS ,I6,38H (NUMBER OF PARTICULARIZED ISOTOPES)) + END diff --git a/Donjon/src/RESPAR.f b/Donjon/src/RESPAR.f new file mode 100644 index 0000000..e2abcdb --- /dev/null +++ b/Donjon/src/RESPAR.f @@ -0,0 +1,772 @@ +*DECK RESPAR + SUBROUTINE RESPAR(IPMAP,NCH,NB,NFUEL,NCOMB,NPARM,NX,NY,NZ,NSTATE, + 1 ISTATE,IMPX,NASB,LMAP2,IPMP2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read and store the data related to global and local parameters. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki, R. Chambon, M. Guyot, V. Descotes, B. Toueg +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NFUEL number of fuel types. +* NCOMB number of combustion zones. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* NSTATE maximum number of state-vector records. +* IMPX printing index (=0 for no print). +* NASB total number of assembly +* LMAP2 flag to set if second fuel-map information is used to +* recover burnup information +* IPMP2 pointer to the second fuel-map information. +* +*Parameters: output +* ISTATE updated state-vector. +* NPARM total number of recorded parameters. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPMP2 + INTEGER NCH,NB,NFUEL,NCOMB,NPARM,NX,NY,NZ,NSTATE,ISTATE(NSTATE), + 1 IMPX + LOGICAL LMAP2 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER INAME(3),IZONE(NCH),IVECT(NCOMB,NB),NSCH(NCH), + 1 IBSH(NCOMB),IPAT(NCOMB),SHPAT(NCOMB),SHDIR(NCOMB),MIX(NX*NY*NZ), + 2 FMIX(NCH,NB),IAZ(NCH),ISTAT2(NSTATE),SHREF,DIRREF(NCOMB) + REAL VALUE(NCH,NB),POWER(NCH,NB),FPOWER(NB) + CHARACTER CVALUE(NCH,NB)*12 + DOUBLE PRECISION DFLOT + CHARACTER TEXT*12,TEXT12*12,PNAME*12,KEYN*12,PNAME2*12 + LOGICAL LRSCH,LBURN + TYPE(C_PTR) JPMAP,KPMAP,ZPMAP,JPMP2,KPMP2 +*---- +* ALLOCATABLE STATEMENTS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: ALCH,NUM,IND,VPAT + REAL, ALLOCATABLE, DIMENSION(:) :: DENSMOD,BRN,BASS,VAL2,ZZ,VB +*---- +* READ INPUT DATA +*---- + LRSCH=.FALSE. + LBURN=.FALSE. + PTOT=0.0 + CALL LCMGET(IPMAP,'FLMIX',FMIX) + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACT' + 1 //'ER DATA EXPECTED ('//TEXT12//').') + IF(TEXT12.EQ.';')THEN + GOTO 500 +* PRINTING INDEX + ELSEIF(TEXT12.EQ.'EDIT')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESPAR: INTEGER DA' + 1 //'TA FOR EDIT EXPECTED.') + IMPX=MAX(0,NITMA) +*---- +* ADD NEW PARAMETER +*---- + ELSEIF(TEXT12.EQ.'ADD-PARAM')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'PNAME')CALL XABORT('@RESPAR: KEY' + 1 //'WORD PNAME EXPECTED.') +* READ PARAMETER NAME + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACTER' + 1 //' DATA FOR PARAMETER NAME EXPECTED.') + IF(IMPX.GT.0)WRITE(IOUT,1000)TEXT + IF(NPARM.GT.0)THEN + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGET(KPMAP,'P-NAME',INAME) + WRITE(PNAME,'(3A4)') (INAME(I),I=1,3) + IF(PNAME.EQ.TEXT)CALL XABORT('@RESPAR: THE ' + 1 //'PARAMETER '//TEXT//' ALREADY EXISTS.') + ENDDO + ENDIF + NPARM=NPARM+1 + JPMAP=LCMLID(IPMAP,'PARAM',NPARM) + KPMAP=LCMDIL(JPMAP,NPARM) + READ(TEXT,'(3A4)') (INAME(I),I=1,3) + CALL LCMPUT(KPMAP,'P-NAME',3,3,INAME) +* READ PARKEY NAME + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'PARKEY')CALL XABORT('@RESPAR: KEY' + 1 //'WORD PARKEY EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACTER' + 1 //' DATA FOR PARKEY NAME EXPECTED.') + READ(TEXT,'(3A4)') (INAME(I),I=1,3) + CALL LCMPUT(KPMAP,'PARKEY',3,3,INAME) +* READ PARAMETER TYPE + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'GLOBAL')THEN + IPTYP=1 + ELSEIF(TEXT.EQ.'LOCAL')THEN + IPTYP=2 + ELSE + CALL XABORT('@RESPAR: INVALID KEYWORD '//TEXT) + ENDIF + CALL LCMPUT(KPMAP,'P-TYPE',1,1,IPTYP) + ISTATE(8)=NPARM +*---- +* SET PARAMETER VALUES +*---- + ELSEIF(TEXT12.EQ.'SET-PARAM')THEN + IF(NPARM.EQ.0)CALL XABORT('@RESPAR: PARAM' + 1 //'ETER NOT YET DEFINED NPARM=0') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACT' + 1 //'ER DATA FOR PARAMETER NAME EXPECTED.') +* RECOVER PARAMETER + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGET(KPMAP,'P-NAME',INAME) + WRITE(PNAME,'(3A4)') (INAME(I),I=1,3) + IF(PNAME.EQ.TEXT)THEN + CALL LCMGET(KPMAP,'P-TYPE',IPTYP) + GOTO 30 + ENDIF + ENDDO + CALL XABORT('@RESPAR: UNABLE TO FIND PARAME' + 1 //'TER WITH PNAME '//TEXT) + 20 IF(IMPX.GT.0)WRITE(IOUT,1001)TEXT + 30 IF(IPTYP.EQ.1)THEN +* GLOBAL PARAMETER + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF((ITYP.EQ.3).AND.(TEXT.EQ.'OLDMAP')) THEN + IPTYP=11 + GOTO 20 + ENDIF + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL' + 1 //' DATA or OLDMAP keyword FOR VALUE EXPECTED.') + CALL LCMPUT(KPMAP,'P-VALUE',1,2,FLOT) + ELSE +* LOCAL PARAMETER + VALUE(:NCH,:NB)=0.0 + IF(IPTYP.NE.11) CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.EQ.'SAME')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + DO ICH=1,NCH + DO IB=1,NB + IF(FMIX(ICH,IB).NE.0) THEN + IF(ITYP.EQ.2)VALUE(ICH,IB)=FLOT + IF(ITYP.EQ.3)CVALUE(ICH,IB)=TEXT + ENDIF + ENDDO + ENDDO +* + ELSEIF(TEXT.EQ.'CHAN')THEN + DO ICH=1,NCH + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL' + 1 //' DATA FOR VALUE EXPECTED.') + DO 40 IB=1,NB + IF(FMIX(ICH,IB).NE.0) VALUE(ICH,IB)=FLOT + 40 CONTINUE + ENDDO +* + ELSEIF(TEXT.EQ.'BUND')THEN + DO 55 IB=1,NB + DO 50 ICH=1,NCH + IF(FMIX(ICH,IB).EQ.0) GO TO 50 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.2)VALUE(ICH,IB)=FLOT + IF(ITYP.EQ.3)CVALUE(ICH,IB)=TEXT + 50 CONTINUE + 55 CONTINUE + ELSEIF(TEXT.EQ.'TIMES')THEN +! try to find the parameters called DMOD + CALL REDGET(ITYP,NITMA,FLOT,KEYN,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACTER' + 1 //' DATA FOR VALUE EXPECTED.') + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARM + ZPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGET(ZPMAP,'P-NAME',INAME) + WRITE(PNAME,'(3A4)') (INAME(I),I=1,3) + IF(PNAME.EQ.KEYN)THEN + CALL LCMGET(ZPMAP,'P-TYPE',IPTYP) + GOTO 60 + ENDIF + ENDDO + CALL XABORT('@RESPAR: UNABLE TO FIND PARAME' + 1 //'TER WITH PNAME '//KEYN) + 60 CONTINUE + ALLOCATE(DENSMOD(NCH*NB)) + CALL LCMGET(ZPMAP,'P-VALUE',DENSMOD) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3.OR.TEXT.NE.'SAME')CALL XABORT('@RESPAR:' + 1 //' KEYWORD SAME EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@RESPAR: REAL DATA EXPECTED.') + DO IB=1,NB + DO ICH=1,NCH + IF(FMIX(ICH,IB).NE.0) THEN + VALUE(ICH,IB)=FLOT*DENSMOD(ICH+(IB-1)*NCH) + ENDIF + ENDDO + ENDDO + DEALLOCATE(DENSMOD) +* R. Chambon - begin + ELSEIF(TEXT.EQ.'OLDMAP')THEN + IF(.NOT.LMAP2) CALL XABORT('@RESPAR: SECOND' + 1 //' L_MAP EXPECTED.') + CALL LCMGET(IPMP2,'STATE-VECTOR',ISTAT2) + NPARM2=ISTAT2(8) + JPMP2=LCMGID(IPMP2,'PARAM') + DO IPAR=1,NPARM2 + KPMP2=LCMGIL(JPMP2,IPAR) + CALL LCMGET(KPMP2,'P-NAME',INAME) + WRITE(PNAME2,'(3A4)') (INAME(I),I=1,3) + IF(PNAME.EQ.PNAME2)THEN + GOTO 70 + ENDIF + ENDDO + CALL XABORT('@RESPAR: UNABLE TO FIND PARAME' + 1 //'TER WITH PNAME in second L_MAP '//TEXT) + 70 CALL LCMLEN(KPMP2,'P-VALUE',NITMA,INDIC) + IF(NITMA.EQ.0) CALL XABORT('@RESPAR: Record BURN-INST in ' + 1 //'SECOND L_MAP EXPECTED.') + ALLOCATE(VAL2(NITMA)) + CALL LCMGET(KPMP2,'P-VALUE',VAL2) +* global parameter + IF(NITMA.EQ.1) THEN + VALUE(1,1)=VAL2(1) +* recovered from previous calculation with the same geometry +* but not the same initialization part +* example: homogeneous calculation followed by a pin power +* reconstruction + ELSEIF(NITMA.EQ.NCH*NB) THEN + DO ICH=1,NCH + DO IB=1,NB + I=ICH+(IB-1)*NCH + VALUE(ICH,IB)=VAL2(I) + ENDDO + ENDDO +* recovered from previous calculation with a different geometry +* the second geometry must correspond to the assembly geometry +* of the new geometry +* examples: homogeneous calculation followed by a heterogeneous +* calculation +* homogeneous calculation followed by a pin power +* calculation + ELSEIF(NITMA.EQ.NASB*NB) THEN + CALL LCMGET(IPMAP,'A-ZONE',IAZ) + DO ICH=1,NCH + DO IB=1,NB + VALUE(ICH,IB)=VAL2(IAZ(ICH)+(IB-1)*NCH) + ENDDO + ENDDO + ENDIF + DEALLOCATE(VAL2) +* R. Chambon - End + ELSEIF(TEXT.EQ.'LEVEL')THEN +* move a control rod over each channel + ITOP=1 + 75 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACTER DATA H+, H-,' + 1 //'SAME OR CHAN EXPECTED.') + IF(TEXT.EQ.'H+')THEN +* PWR-type moving rod + ITOP=1 + GO TO 75 + ELSEIF(TEXT.EQ.'H-')THEN +* BWR-type moving rod + ITOP=-1 + GO TO 75 + ELSEIF(TEXT.EQ.'SAME') THEN + CALL REDGET(ITYP,NITMA,ZLEVEL,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@RESPAR: REAL DATA EXPECTED.') + ENDIF + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMGET(JPMAP,'STATE-VECTOR',ISTAT2) + NX=ISTAT2(3) + NY=ISTAT2(4) + NZ=ISTAT2(5) + NEL=ISTAT2(6) + IF((ISTAT2(1).EQ.9).AND.(NY.EQ.0)) NY=1 + ALLOCATE(ZZ(NZ+1),NUM(NEL),IND(NZ),VB(NB)) + CALL LCMGET(JPMAP,'MESHZ',ZZ) + CALL LCMGET(IPMAP,'BMIX',NUM) + ICH=0 + DO 105 IY=1,NY + DO 100 IX=1,NX + IEL=(IY-1)*NX+IX + DO 80 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).NE.0) GO TO 90 + 80 CONTINUE + GO TO 100 + 90 ICH=ICH+1 + IF(TEXT.EQ.'CHAN') THEN + CALL REDGET(ITYP,NITMA,ZLEVEL,TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@RESPAR: REAL DATA EXPECTED.') + ENDIF + IF((ZLEVEL.LT.0.0).OR.(ZLEVEL.GT.1.0)) THEN + CALL XABORT('@RESPAR: 0<=LEVEL<=1 EXPECTED.') + ENDIF + IB=0 + DO IZ=1,NZ + IND(IZ)=0 + IF(NUM((IZ-1)*NX*NY+IEL).EQ.0) CYCLE + IB=IB+1 + IND(IZ)=IB + ENDDO + IF(IB.NE.NB) CALL XABORT('@RESPAR: INVALID NUMBER OF BUNDL' + 1 //'ES.') + CALL RESROD(NB,NZ,ZZ,IND,ZLEVEL,ITOP,VB) + DO IB=1,NB + IF(FMIX(ICH,IB).NE.0) VALUE(ICH,IB)=VB(IB) + ENDDO + 100 CONTINUE + 105 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@RESPAR: INVALID NUMBER OF CHA' + 1 //'NNELS.') + DEALLOCATE(VB,IND,NUM,ZZ) + ELSE + CALL XABORT('@RESPAR: INVALID KEYWORD '//TEXT) + ENDIF + IF(ITYP.EQ.2)CALL LCMPUT(KPMAP,'P-VALUE',NCH*NB,2,VALUE) + IF(ITYP.EQ.3)CALL LCMPTC(KPMAP,'P-VALUE',12,NCH*NB,CVALUE) + IF(ITYP.EQ.11)CALL LCMPUT(KPMAP,'P-VALUE',1,2,VALUE(1,1)) + ENDIF +*---- +* CHANNEL REFUELLING SCHEMES +*---- + ELSEIF(TEXT12.EQ.'REF-SHIFT')THEN + IF(IMPX.GT.0)WRITE(IOUT,1002) +* BUNDLE-SHIFT NUMBERS, BIDIRECTIONAL + IBSH(:NCOMB)=0 + DIRREF(:NCOMB)=-1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1)THEN + IF(NITMA.LE.0.OR.NITMA.GT.NB)CALL XABORT('@RESPAR:' + 1 //' BUNDLE-SHIFT MUST BE POSITIVE AND NON-ZERO NUMBER' + 1 //' AND MAX EQUAL TO NUMBER OF FUEL BUNDLES PER CHANNEL') + DO 110 ICZ=1,NCOMB + IBSH(ICZ)=NITMA + 110 CONTINUE + ELSEIF((ITYP.EQ.3).AND.(TEXT.EQ.'COMB'))THEN + DO ICZ=1,NCOMB + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESPAR: INTEGER BUNDLE' + 1 //'-SHIFT NUMBER PER COMBUSTION-ZONE EXPECTED.') + IF(NITMA.LE.0.OR.NITMA.GT.NB)CALL XABORT('@RESPAR:' + 1 //' BUNDLE-SHIFT MUST BE POSITIVE AND NON-ZERO NUMBER.' + 1 //' AND MAX EQUAL TO NUMBER OF FUEL BUNDLES PER CHANNEL') + IBSH(ICZ)=NITMA + ENDDO +* I. Trancart begin + ELSEIF((ITYP.EQ.3).AND.(TEXT.EQ.'SHUFF'))THEN + IPAT(:NCOMB)=0 + MPAT=0 + DO ICZ=1,NCOMB + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESPAR: INTEGER SHUFFLING' + 1 //' PATTERN INDEX PER COMBUSTION-ZONE EXPECTED.') + IF(NITMA.LE.0.OR.NITMA.GT.NCOMB)CALL XABORT('@RESPAR:' + 1 //' SHUFFLING PATTERN INDEX MUST BE POSITIVE AND NON-ZERO ' + 1 //'NUMBER AND MAX EQUAL TO NUMBER OF COMBUSTION ZONES.') + IPAT(ICZ)=NITMA + IF(NITMA.GT.MPAT)THEN + MPAT=NITMA + ENDIF + ENDDO + IF(IMPX.GT.0)WRITE(IOUT,1010)MPAT + ALLOCATE(VPAT(MPAT*NB)) + SHPAT(:MPAT)=0 + SHDIR(:MPAT)=0 + DO ICP=1,MPAT + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACTER PATTERN' + 1 //' EXPECTED ('//TEXT12//'). NOT ENOUGH PATTERN ADDED ' + 2 //' OR MISSING BUNDLES ON PREVIOUS PATTERN.') + IF(TEXT12.NE.'PATTERN')CALL XABORT('@RESPAR: KEYWORD PAT' + 1 //'TERN EXPECTED ('//TEXT12//').') + SHREF=0 + DO IREF=1,NB + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RESPAR: INTEGER DATA ' + 1 //' EXPECTED FOR SHUFFLING.') + IF(NITMA.LT.0.OR.NITMA.GT.NB)CALL XABORT('@RESPAR: ' + 1 //' WRONG REFUELLING POSITION FOR BUNDLE SHUFFLING. ') + VPAT((ICP-1)*NB+IREF)=NITMA + IF(NITMA.EQ.0)THEN + SHREF=SHREF+1 + ENDIF + ENDDO + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: CHARACTER DATA ' + 1 //' EXPECTED FOR COOLANT FLOW.') + IF(TEXT12.EQ.'UNIDIR')THEN + SHDIR(ICP)=1 + IF(IMPX.GT.1)WRITE(IOUT,1009) + ELSEIF(TEXT12.EQ.'BIDIR')THEN + SHDIR(ICP)=-1 + ELSE + CALL XABORT('@RESPAR: UNIDIR OR BIDIR INFORMATION' + 1 //' EXPECTED FOR COOLANT FLOW.') + ENDIF + SHPAT(ICP)=SHREF + ENDDO + IVECT(:NCOMB,:NB)=0 + IBSH(:NCOMB)=0 + DO IB=1,NB + DO ICZ=1,NCOMB + IVECT(ICZ,IB)=VPAT((IPAT(ICZ)-1)*NB+IB) + IBSH(ICZ)=SHPAT(IPAT(ICZ)) + DIRREF(ICZ)=SHDIR(IPAT(ICZ)) + ENDDO + ENDDO + DEALLOCATE(VPAT) + GO TO 125 +* I. Trancart end + ELSE + CALL XABORT('@RESPAR: INVALID INPUT FOR REF-SHIFT.') + ENDIF +* REFUELLING VECTOR + IVECT(:NCOMB,:NB)=0 + DO 120 ICZ=1,NCOMB + ISHIFT=IBSH(ICZ) + IF(ISHIFT.EQ.NB)GOTO 120 + NREF=NB-ISHIFT + DO IREF=1,NREF + IPOS=ISHIFT+IREF + IVECT(ICZ,IPOS)=IREF + ENDDO + 120 CONTINUE + 125 CALL LCMPUT(IPMAP,'REF-SHIFT',NCOMB,1,IBSH) + CALL LCMPUT(IPMAP,'REF-VECTOR',NCOMB*NB,1,IVECT) +* CHANNEL REFUELLING SCHEMES + CALL LCMGET(IPMAP,'B-ZONE',IZONE) + CALL LCMGET(IPMAP,'BMIX',MIX) + NSCH(:NCH)=0 + IEL=0 + ICH=0 + DO 135 IY=1,NY + DO 130 IX=1,NX + IEL=IEL+1 + IF(MIX(IEL).EQ.0)GOTO 130 + ICH=ICH+1 + ISHIFT=IBSH(IZONE(ICH)) + NSCH(ICH)=((DIRREF(IZONE(ICH)))**(IEL+IY-1))*ISHIFT + 130 CONTINUE + 135 CONTINUE + CALL LCMPUT(IPMAP,'REF-SCHEME',NCH,1,NSCH) + LRSCH=.TRUE. +*---- +* BURNUP INTERPOLATION TYPE +*---- + ELSEIF(TEXT12.EQ.'BTYPE')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: BURN' + 1 //'UP INTERPOLATION OPTION EXPECTED.') + IBTYP=0 + IF(TEXT.EQ.'TIMAV-BURN')THEN + IBTYP=1 + ELSEIF(TEXT.EQ.'INST-BURN')THEN + IBTYP=2 + ELSE + CALL XABORT('@RESPAR: INVALID INPUT FOR BTYPE.') + ENDIF + ISTATE(5)=IBTYP +*---- +* AVERAGE EXIT BURNUPS +*---- + ELSEIF(TEXT12.EQ.'TIMAV-BVAL')THEN + IF(IMPX.GT.0)WRITE(IOUT,1003) + ALLOCATE(BRN(NCOMB)) + BRN(:NCOMB)=0.0 + DO ICZ=1,NCOMB + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR BURNUP VALUE EXPECTED(1).') + IF(FLOT.LE.0.)CALL XABORT('@RESPAR: INVALID' + 1 //' DATA FOR AVERAGE BURNUP VALUE =0.') + BRN(ICZ)=FLOT + ENDDO + CALL LCMPUT(IPMAP,'BURN-AVG',NCOMB,2,BRN) + DEALLOCATE(BRN) + LBURN=.TRUE. +*---- +* INSTANTANEOUS BURNUPS +*---- + ELSEIF(TEXT12.EQ.'INST-BVAL')THEN + IF(IMPX.GT.0)WRITE(IOUT,1004) + VALUE(:NCH,:NB)=0.0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: KEYWORD' + 1 //' SAME|CHAN|BUND EXPECTED (1).') + IF(TEXT.EQ.'BUND')THEN + DO IB=1,NB + DO ICH=1,NCH + IF(FMIX(ICH,IB).NE.0) THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR BURNUP VALUE EXPECTED(2).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR BURNUP VALUE <0.') + VALUE(ICH,IB)=FLOT + ENDIF + ENDDO + ENDDO + ELSEIF(TEXT.EQ.'CHAN')THEN + DO ICH=1,NCH + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR BURNUP VALUE EXPECTED(2).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR BURNUP VALUE <0.') + DO IB=1,NB + IF(FMIX(ICH,IB).NE.0) VALUE(ICH,IB)=FLOT + ENDDO + ENDDO + ELSEIF(TEXT.EQ.'ASBL')THEN + IF(NASB.EQ.0)CALL XABORT('@RESPAR: ASSEMBLY' + 1 //' NOT DEFINED.') + ALLOCATE(BASS(NASB)) + DO IASS=1,NASB + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR BURNUP VALUE EXPECTED(2).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR BURNUP VALUE <0.') + BASS(IASS)=FLOT + ENDDO + CALL LCMGET(IPMAP,'A-ZONE',IAZ) + DO ICH=1,NCH + DO IB=1,NB + VALUE(ICH,IB)=BASS(IAZ(ICH)) + ENDDO + ENDDO + DEALLOCATE(BASS) + ELSEIF(TEXT.EQ.'SAME')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR BURNUP VALUE EXPECTED(2).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR BURNUP VALUE <0.') + DO ICH=1,NCH + DO IB=1,NB + IF(FMIX(ICH,IB).NE.0) VALUE(ICH,IB)=FLOT + ENDDO + ENDDO +* R. Chambon - begin + ELSEIF(TEXT.EQ.'OLDMAP')THEN + IF(.NOT.LMAP2) CALL XABORT('@RESPAR: SECOND' + 1 //' L_MAP EXPECTED.') + CALL LCMLEN(IPMP2,'BURN-INST',NITMA,INDIC) + IF(NITMA.EQ.0) CALL XABORT('@RESPAR: Record BURN-INST in ' + 1 //'SECOND L_MAP EXPECTED.') + ALLOCATE(VAL2(NITMA)) + CALL LCMGET(IPMP2,'BURN-INST',VAL2) +* recovered from previous calculation with the same geometry but +* not the same initialization part +* example: homogeneous calculation followed by a pin power +* reconstruction + IF(NITMA.EQ.NCH*NB) THEN + DO ICH=1,NCH + DO IB=1,NB + I=ICH+(IB-1)*NCH + VALUE(ICH,IB)=VAL2(I) + ENDDO + ENDDO +* recovered from previous calculation with a different geometry +* the second geometry must correspond to the assembly geometry +* of the new geometry +* examples: homogeneous calculation followed by a heterogeneous +* calculation +* homogeneous calculation followed by a pin power +* calculation + ELSEIF(NITMA.EQ.NASB*NB) THEN + CALL LCMGET(IPMAP,'A-ZONE',IAZ) + DO ICH=1,NCH + DO IB=1,NB + VALUE(ICH,IB)=VAL2(IAZ(ICH)+(IB-1)*NCH) + ENDDO + ENDDO + ENDIF + DEALLOCATE(VAL2) +* R. Chambon - End + ELSEIF(TEXT.EQ.'SMOOTH')THEN +* EACH 'BURN-INST' WILL HAVE THE SAME BURNUP AS THEIR FIRST INDEX IN 'FLMIX' + CALL LCMGET(IPMAP,'BURN-INST',VALUE) + DO ICH=1,NCH + DO IB=1,NB + JBKEEP=0 + DO JCH=1,NCH + DO JB=1,NB +* FIRST INDEX OF FMIX(ICH,IB) IS AT JCH,JB + JBKEEP=JB + IF(FMIX(ICH,IB).EQ.FMIX(JCH,JB)) GOTO 140 + ENDDO + ENDDO + CALL XABORT('@RESPAR: ASSERTION ERROR (NO FIRST INDEX)') + 140 VALUE(ICH,IB)=VALUE(JCH,JBKEEP) + ENDDO + ENDDO + ELSE + CALL XABORT('@RESPAR: KEYWORD' + 1 //' SAME|CHAN|BUND|ASBL|OLDMAP|SMOOTH EXPECTED (2).') + ENDIF + CALL LCMPUT(IPMAP,'BURN-INST',NCH*NB,2,VALUE) +*---- +* BUNDLE POWERS IN KW +*---- + ELSEIF(TEXT12.EQ.'BUNDLE-POW')THEN + IF(IMPX.GT.0)WRITE(IOUT,1006) + POWER(:NCH,:NB)=0.0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: KEYWORD' + 1 //' BUND|CHAN|SAME EXPECTED (3).') + IF(TEXT.EQ.'BUND')THEN + DO IB=1,NB + DO ICH=1,NCH + IF(FMIX(ICH,IB).NE.0) THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR POWER VALUE EXPECTED(1).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR POWER VALUE <0.') + POWER(ICH,IB)=FLOT + ENDIF + ENDDO + ENDDO + ELSEIF(TEXT.EQ.'CHAN')THEN + DO ICH=1,NCH + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR POWER VALUE EXPECTED(2).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR POWER VALUE <0.') + DO IB=1,NB + IF(FMIX(ICH,IB).NE.0) POWER(ICH,IB)=FLOT + ENDDO + ENDDO + ELSEIF(TEXT.EQ.'SAME')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR BURNUP VALUE EXPECTED(2).') + IF(FLOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR POWER VALUE <0.') + DO ICH=1,NCH + DO IB=1,NB + IF(FMIX(ICH,IB).NE.0) POWER(ICH,IB)=FLOT + ENDDO + ENDDO + ELSE + CALL XABORT('@RESPAR: KEYWORD SAME|CHAN|BUND EXPECTED (4).') + ENDIF + CALL LCMPUT(IPMAP,'BUND-PW',NCH*NB,2,POWER) + PTOT=0.0 + DO ICH=1,NCH + DO IB=1,NB + PTOT=PTOT+POWER(ICH,IB) + ENDDO + ENDDO + PTOT=PTOT/1.0E3 + CALL LCMPUT(IPMAP,'REACTOR-PW',1,2,PTOT) +*---- +* AXIAL POWERS FORM FACTORS +*---- + ELSEIF(TEXT12.EQ.'AXIAL-PFORM')THEN + IF(IMPX.GT.0)WRITE(IOUT,1007) + IF(PTOT.EQ.0.0)CALL XABORT('@RESPAR: FULL REACTOR POWER NOT S' + 1 //'ET.') + FPOWER(:NB)=0.0 + DO IB=1,NB + CALL REDGET(ITYP,NITMA,FPOWER(IB),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA FOR POWERS FOR' + 1 //'M FACTORS VALUE EXPECTED.') + IF(FPOWER(IB).LT.0.)CALL XABORT('@RESPAR: INVALID DATA FOR ' + 1 //'POWERS FORM FACTORS VALUE <0.') + ENDDO + CALL LCMPUT(IPMAP,'AXIAL-FPW',NB,2,FPOWER) + DSUM=0.0 + DO IB=1,NB + DSUM=DSUM+FPOWER(IB) + ENDDO + DO ICH=1,NCH + DO IB=1,NB + POWER(ICH,IB)=FPOWER(IB)*PTOT*1.0E3/(DSUM*REAL(NCH)) + ENDDO + ENDDO + CALL LCMPUT(IPMAP,'BUND-PW',NCH*NB,2,POWER) +*---- +* FULL REACTOR POWER IN MW +*---- + ELSEIF(TEXT12.EQ.'REACTOR-POW')THEN + IF(IMPX.GT.0)WRITE(IOUT,1008) + CALL REDGET(ITYP,NITMA,PTOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL DATA' + 1 //' FOR FULL REACTOR POWER VALUE EXPECTED.') + IF(PTOT.LT.0.)CALL XABORT('@RESPAR: INVALID DA' + 1 //'TA FOR FULL REACTOR POWER VALUE <0.') + CALL LCMPUT(IPMAP,'REACTOR-PW',1,2,PTOT) +*---- +* FUEL-TYPE DATA +*---- + ELSEIF(TEXT12.EQ.'FUEL')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RESPAR: KEYWO' + 1 //'RD FOR FUEL-TYPE PARAMETER EXPECTED.') + IF((TEXT.NE.'WEIGHT').AND.(TEXT.NE.'ENRICH').AND. + 1 (TEXT.NE.'POISON'))CALL XABORT('@RESPAR: INVAL' + 2 //'ID INPUT FOR FUEL.') + IF(IMPX.GT.0)WRITE(IOUT,1005)TEXT + JPMAP=LCMLID(IPMAP,'FUEL',NFUEL) + DO IFUEL=1,NFUEL + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RESPAR: REAL' + 1 //' DATA PER EACH FUEL-TYPE EXPECTED.') + KPMAP=LCMDIL(JPMAP,IFUEL) + CALL LCMPUT(KPMAP,TEXT,1,2,FLOT) + IF(IMPX.GT.0)CALL LCMLIB(KPMAP) + ENDDO + ELSEIF(TEXT12.EQ.'CELL')THEN + ALLOCATE(ALCH(NCH)) + DO 150 I=1,NCH + CALL REDGET(INDIC,ALCH(I),FLOTT,TEXT12,DFLOT) + IF(INDIC.NE.1) CALL XABORT('@RESPAR: INTEGER DATA EXPECTED.') + 150 CONTINUE + CALL RESCEL(IPMAP,NCH,NB,ALCH) + DEALLOCATE(ALCH) + ISTATE(5)=2 + ELSE + CALL XABORT('@RESPAR: WRONG KEYWORD '//TEXT12) + ENDIF + GOTO 10 + 500 IF(LRSCH.OR.LBURN)CALL RESBRN(IPMAP,NCH,NB,NCOMB, + 1 NX,NY,NZ,LRSCH,IMPX) + RETURN +* + 1000 FORMAT(/1X,'INPUT OF NEW PARAMETER: ',A12) + 1001 FORMAT(/1X,'READING VALUES FOR PARAMETER: ',A12) + 1002 FORMAT(/1X,'READING INPUT FOR REF-SHIFT') + 1003 FORMAT(/1X,'READING AVERAGE EXIT BURNUPS') + 1004 FORMAT(/1X,'READING INSTANTANEOUS BURNUPS') + 1005 FORMAT(/1X,'READING DATA FOR FUEL-TYPE PARAMETER: ',A12) + 1006 FORMAT(/1X,'READING BUNDLE POWERS IN KW') + 1007 FORMAT(/1X,'READING BUNDLE POWERS FORM FACTORS') + 1008 FORMAT(/1X,'READING FULL REACTOR POWER IN MW') + 1009 FORMAT(/5X,'UNIDIRECTIONAL REFUELLING FOR PATTERN: ',I3) + 1010 FORMAT(/5X,'READING SHUFFLING PATTERNS: ',I3) + END diff --git a/Donjon/src/RESPFM.f b/Donjon/src/RESPFM.f new file mode 100644 index 0000000..17b48a4 --- /dev/null +++ b/Donjon/src/RESPFM.f @@ -0,0 +1,168 @@ +*DECK RESPFM + SUBROUTINE RESPFM(IPMAP,IPMTX,NX,NY,NZ,LX,LY,LZ,NFUEL,IMPX,IGEO, + > NCH,NB,NTOT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* recover, check and store the fuel mixtures. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* IPMTX pointer to matex information. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* LX number of elements along x-axis in geometry. +* LY number of elements along y-axis in geometry. +* LZ number of elements along z-axis in geometry. +* NFUEL number of fuel types. +* IMPX printing index (=0 for no print). +* IGEO type of geometry (=7 or =9) +* +*Parameters: output +* NCH number of fuel channels. +* NB number of fuel bundles per channel. +* NTOT total number of fuel bundles. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPMTX + INTEGER NX,NY,NZ,LX,LY,LZ,NFUEL,IMPX,IGEO,NCH,NB,NTOT + TYPE(C_PTR) JPMAP,KPMAP +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX,FMIX,FTOT,IFLMIX +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(MIX(NX*NY*NZ),FMIX(NFUEL),FTOT(NFUEL)) +*---- +* COMPUTE NUMBER OF FUEL CHANNELS AND NUMBER OF FUEL BUNDLES +*---- + IF(IMPX.GT.2) WRITE(IOUT,*)'SETTING FUEL-MAP MIXTURES' + IF((IGEO.NE.7).AND.(IGEO.NE.9))THEN + CALL XABORT('@RESPFM: WRONG TYPE OF GEOMETRY, 3D-CARTESIAN OR ' + > //'3D-HEXAGONAL GEOMETRY EXPECTED') + ENDIF + MIX(:NX*NY*NZ)=0 + CALL LCMGET(IPMAP,'MIX',MIX) + NB=0 + DO IZ=1,NZ + DO I=1,NX*NY + IEL=(IZ-1)*NX*NY+I + IF(MIX(IEL).NE.0) GOTO 10 + ENDDO + CYCLE + 10 NB=NB+1 + ENDDO + NCH=0 + DO I=1,NX*NY + DO IZ=1,NZ + IEL=(IZ-1)*NX*NY+I + IF(MIX(IEL).NE.0) GOTO 20 + ENDDO + CYCLE + 20 NCH=NCH+1 + ENDDO + IF(IMPX.GT.0) WRITE(6,100) NCH,NB + ALLOCATE(IFLMIX(NCH*NB)) +*---- +* COMPUTE FLMIX AND FTOT +*---- + FMIX(:NFUEL)=0 + CALL LCMGET(IPMTX,'FMIX',FMIX) + FTOT(:NFUEL)=0 + IFLMIX(:NCH*NB)=0 + NTOT=0 + IB=0 + DO 50 IZ=1,NZ + DO I=1,NX*NY + IEL=(IZ-1)*NX*NY+I + IF(MIX(IEL).NE.0) GOTO 30 + ENDDO + GO TO 50 + 30 IB=IB+1 + IF(IB.GT.NB) CALL XABORT('@RESPFM: NB OVERFLOW.') + ICH=0 + DO 40 I=1,NX*NY + DO K=1,NZ + IF(MIX((K-1)*NX*NY+I).NE.0) GOTO 35 + ENDDO + GO TO 40 + 35 IEL=(IZ-1)*NX*NY+I + ICH=ICH+1 + IF(ICH.GT.NCH) CALL XABORT('@RESPFM: NCH OVERFLOW.') + IFLMIX((IB-1)*NCH+ICH)=MIX(IEL) + IF(MIX(IEL).EQ.0) GO TO 40 + DO IFUEL=1,NFUEL + IF(MIX(IEL).EQ.FMIX(IFUEL))THEN + FTOT(IFUEL)=FTOT(IFUEL)+1 + NTOT=NTOT+1 + IF(NTOT.GT.NCH*NB)THEN + WRITE(IOUT,*)'@RESPFM: TOTAL NUMBER OF BUNDLES =',NCH*NB + WRITE(IOUT,*)'@RESPFM: READ TOTAL FUEL MIXTURES ',NTOT + CALL XABORT('@RESPFM: WRONG FUEL-MAP DEFINITION.') + ENDIF + GOTO 40 + ENDIF + ENDDO + WRITE(IOUT,*)'@RESPFM: READ FUEL MIXTURE NUMBER ',MIX(IEL) + CALL XABORT('@RESPFM: WRONG FUEL MIXTURE NUMBER.') + 40 CONTINUE + 50 CONTINUE + IF(IMPX.GT.0) WRITE(6,110) NTOT +*---- +* STORE FUEL MIXTURES +*---- + IF(IMPX.GT.2) WRITE(IOUT,*)'STORING FUEL MIXTURES' +* FUEL DIRECTORIES + CALL LCMSIX(IPMAP,' ',0) + JPMAP=LCMLID(IPMAP,'FUEL',NFUEL) + DO IFUEL=1,NFUEL + KPMAP=LCMDIL(JPMAP,IFUEL) + CALL LCMPUT(KPMAP,'MIX',1,1,FMIX(IFUEL)) + CALL LCMPUT(KPMAP,'TOT',1,1,FTOT(IFUEL)) + ENDDO + CALL LCMPUT(IPMAP,'FLMIX',NCH*NB,1,IFLMIX) + DEALLOCATE(IFLMIX) +* RENUMBERING + NMIX=0 + DO IEL=1,NX*NY*NZ + IF(MIX(IEL).NE.0)THEN + NMIX=NMIX+1 + MIX(IEL)=NMIX + ENDIF + ENDDO + CALL LCMPUT(IPMAP,'BMIX',NX*NY*NZ,1,MIX) +* UPDATE MATERIAL INDEX + IF(IGEO.EQ.7)THEN + CALL RESIND(IPMAP,IPMTX,NX,NY,NZ,LX,LY,LZ,MIX,NFUEL,IMPX) + ELSE IF(IGEO.EQ.9)THEN + CALL RESHID(IPMAP,IPMTX,NX,NZ,LX,LZ,MIX,NFUEL,IMPX) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(FTOT,FMIX,MIX) + RETURN +* + 100 FORMAT(/33H RESPFM: NUMBER OF FUEL CHANNELS=,I5/9X,10HNUMBER OF , + > 25HFUEL BUNDLES PER CHANNEL=,I5) + 110 FORMAT(9X,29HTOTAL NUMBER OF FUEL BUNDLES=,I8) + END diff --git a/Donjon/src/RESROD.f b/Donjon/src/RESROD.f new file mode 100644 index 0000000..aac2edb --- /dev/null +++ b/Donjon/src/RESROD.f @@ -0,0 +1,80 @@ +*DECK RESROD + SUBROUTINE RESROD(NB,NZ,ZZ,IND,ZLEVEL,ITOP,VB) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Move a control rod over a fuel channel. +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input +* NB number of fuel bundles per channel. +* NZ number of axial meshes. +* ZZ axial meshes. +* IND bundle index of each axial mesh. +* ZLEVEL insertion parameter of the control rod in the channel (set +* between 0.0 and 1.0). +* ITOP direction flag for the rod (=1: from top; =-1: from bottom). +* +*Parameters: output +* VB insertion parameter corresponding to each bundle. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NB,NZ,IND(NZ),ITOP + REAL ZZ(NZ+1),ZLEVEL,VB(NB) +* + ZMIN=ZZ(NZ+1) + ZMAX=ZZ(1) + DO IZ=1,NZ + IF(IND(IZ).EQ.0) CYCLE + ZMIN=MIN(ZZ(IZ),ZMIN) + ZMAX=MAX(ZZ(IZ+1),ZMAX) + ENDDO + IF(ITOP.EQ.1) THEN + VB(:NB)=0.0 + ZPOS=ZMAX-ZLEVEL*(ZMAX-ZMIN) + DO IB=1,NB + ZBMIN=ZZ(NZ+1) + ZBMAX=ZZ(1) + DO IZ=1,NZ + IF(IND(IZ).EQ.IB) THEN + ZBMIN=MIN(ZZ(IZ),ZBMIN) + ZBMAX=MAX(ZZ(IZ+1),ZBMAX) + ENDIF + ENDDO + IF((ZPOS.GE.ZBMIN).AND.(ZPOS.LE.ZBMAX)) THEN + VB(IB)=1.0-(ZPOS-ZBMIN)/(ZBMAX-ZBMIN) + VB(IB+1:NB)=1.0 + EXIT + ENDIF + ENDDO + ELSEIF(ITOP.EQ.-1) THEN + VB(:NB)=1.0 + ZPOS=ZMIN+ZLEVEL*(ZMAX-ZMIN) + DO IB=1,NB + ZBMIN=ZZ(NZ+1) + ZBMAX=ZZ(1) + DO IZ=1,NZ + IF(IND(IZ).EQ.IB) THEN + ZBMIN=MIN(ZZ(IZ),ZBMIN) + ZBMAX=MAX(ZZ(IZ+1),ZBMAX) + ENDIF + ENDDO + IF((ZPOS.GE.ZBMIN).AND.(ZPOS.LE.ZBMAX)) THEN + VB(IB)=(ZPOS-ZBMIN)/(ZBMAX-ZBMIN) + VB(IB+1:NB)=0.0 + EXIT + ENDIF + ENDDO + ENDIF + RETURN + END diff --git a/Donjon/src/ROD.f b/Donjon/src/ROD.f new file mode 100644 index 0000000..7270f5c --- /dev/null +++ b/Donjon/src/ROD.f @@ -0,0 +1,223 @@ +*DECK ROD + SUBROUTINE ROD(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Control rod management module based on SAPHYB or MULTICOMPO +* interpolation. +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Tixier +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The ROD: module specifications are: +* FLMAP := ROD: FLMAP :: (descrod1) ; +* where +* FLMAP :name of the \emph{MAP} object that will contain the 3-D rod file. +* The FLMAP has to be modified for the module and must appear on both LHS +* and RHS. +* (descrod1) : structure describing the main input data to the ROD: module. +* Note that this input data is mandatory and must be specified. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + INTEGER ISTATE(NSTATE),NPARAM,NREB + INTEGER MAXMIX,NGRP,RODSIZE,NASS,RODINFO,NCALL + REAL INI,INSS,INSM + LOGICAL :: EXISTENCE=.FALSE. + CHARACTER HSIGN*12,TEXT*40,PAR1*12,PNAME*12 + DOUBLE PRECISION DFLOT + TYPE(C_PTR) IPMAP,JPMAP,KPMAP,MPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: INTROD,HMIX,RMIX + CHARACTER(LEN=3), ALLOCATABLE, DIMENSION(:) :: RNAME + INTEGER, ALLOCATABLE, DIMENSION(:) :: INS,NUMMIX +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.NE.1)CALL XABORT('@ROD: 1 OBJECT EXPECTED.') + IPMAP=KENTRY(1) + IF(IENTRY(1).NE.1)CALL XABORT('@ROD:' + > //' LCM OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.1)CALL XABORT('@ROD: FLMAP MUST BE IN' + > //' MODIFICATION MODE AND NOT IN CREATION MODE.') + CALL LCMGTC(IPMAP,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP')THEN + TEXT=HENTRY(1) + CALL XABORT('@ROD: SIGNATURE OF '//TEXT//' IS '//HSIGN// + > '. L_MAP EXPECTED.') + ENDIF +*---- +* RECOVER L_MAP STATE-VECTOR +*---- + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NPARAM=ISTATE(8) +*---- +* READ INPUT DATA +*---- + NCALL=0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@ROD: CHARACTER DATA EXPECTED.') +* Read printing index + IF(TEXT.EQ.'EDIT') THEN + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@ROD: INTEGER FOR EDIT EXPECTED.') +* Name of the parameter record that is to be created + ELSE IF(TEXT.EQ.'PARA') THEN + NCALL=1 + CALL REDGET(ITYP,NITMA,FLOT,PAR1,DFLOT) + IF(ITYP.NE.3) CALL XABORT('@ROD: CHARACTER' + 1 //' DATA FOR PARAMETER NAME EXPECTED.') +* Checking of the record existence + IF(NPARAM.GT.0) JPMAP=LCMGID(IPMAP,'PARAM') + EXISTENCE=.FALSE. + DO IPAR=1,NPARAM,1 + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.PAR1) THEN + EXISTENCE=.TRUE. + EXIT + ENDIF + ENDDO + IF(.NOT.EXISTENCE) THEN +* If PARAM doesn't exist, it is created + NPARAM=NPARAM+1 + JPMAP=LCMLID(IPMAP,'PARAM',NPARAM) + KPMAP=LCMDIL(JPMAP,NPARAM) + CALL LCMPTC(KPMAP,'P-NAME',12,PAR1) + CALL LCMPTC(KPMAP,'PARKEY',12,PAR1) + IPTYP=2 + CALL LCMPUT(KPMAP,'P-TYPE',1,1,IPTYP) + RODINFO=4 + MPMAP=LCMDID(IPMAP,'ROD-INFO') + CALL REDGET(ITYP,NITMA,INI,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@ROD: REAL DATA FOR' + 1 //' STEP EXPECTED.') + CALL LCMPUT(MPMAP,'ROD-INIT',1,2,INI) + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) +* Check if LINS is defined + IF(TEXT.NE.'LINS')CALL XABORT('@ROD: KEYWORD' + 1 //' LINS EXPECTED.') + CALL REDGET(ITYP,NITMA,INSM,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@ROD: REAL DATA FOR' + 1 //' LINS EXPECTED.') + IF(INSM.LT.0)CALL XABORT('@ROD: LINS MUST BE POSITIVE.') + CALL LCMPUT(MPMAP,'INS-MAX',1,2,INSM) +* Check if STEP is defined + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'STEP')CALL XABORT('@ROD: KEYWORD' + 1 //' STEP EXPECTED.') + CALL REDGET(ITYP,NITMA,INSS,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@ROD: REAL DATA FOR' + 1 //' STEP EXPECTED.') + IF(INSS.LT.0.0)CALL XABORT('@ROD: STEP MUST BE POSITIVE.') + CALL LCMPUT(MPMAP,'STEP-CM',1,2,INSS) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) +* Check if NRFB is defined + IF(TEXT.NE.'NRFB')CALL XABORT('@ROD: KEYWORD ' + 1 //'NRFB EXPECTED.') + CALL REDGET(ITYP,NREB,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@ROD: INTEGER DATA FOR' + 1 //' NRFB EXPECTED.') + IF(NREB.LT.0)CALL XABORT('@ROD: NRFB MUST BE POSITIVE.') + CALL LCMPUT(MPMAP,'REFL-BOTTOM',1,1,NREB) +* Definition of rod groups + ELSE IF(TEXT.EQ.'RGRP') THEN + JPMAP=LCMGID(IPMAP,'PARAM') + KPMAP=LCMGIL(JPMAP,NPARAM) + IF(NCALL.EQ.1) THEN +* Creation of records with the number of rod groups and the maximum of +* rod zones + CALL REDGET(ITYP,NGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@ROD: INTEGER' + 1 //' DATA FOR GROUP NUMBER EXPECTED.') + CALL LCMPUT(MPMAP,'NB-GROUP',1,1,NGRP) + CALL REDGET(ITYP,MAXMIX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@ROD: INTEGER' + 1 //' DATA FOR MAXIMUM MIX NUMBER EXPECTED.') + CALL LCMPUT(MPMAP,'MAX-MIX',1,1,MAXMIX) + ALLOCATE(RNAME(NGRP),INS(NGRP),NUMMIX(NGRP)) + ALLOCATE(HMIX(NGRP*MAXMIX),RMIX(NGRP*MAXMIX)) + RODSIZE=NCH*NB + ALLOCATE(INTROD(RODSIZE)) + HMIX(:NGRP*MAXMIX)=0.0 + RMIX(:NGRP*MAXMIX)=-999.0 + INS(:NGRP)=-1 + CALL RODTYP(IPMAP,NGRP,MAXMIX,RNAME,INS,HMIX,RMIX,NUMMIX) + ELSE +* Recovering rod parameters in order to modify only groups defined +* in the second call of the module. + MPMAP=LCMGID(IPMAP,'ROD-INFO') + CALL LCMGET(MPMAP,'NB-GROUP',NGRP) + CALL LCMGET(MPMAP,'MAX-MIX',MAXMIX) + ALLOCATE(RNAME(NGRP),INS(NGRP),NUMMIX(NGRP)) + ALLOCATE(HMIX(NGRP*MAXMIX),RMIX(NGRP*MAXMIX)) + RODSIZE=NCH*NB + ALLOCATE(INTROD(RODSIZE)) +* Store rod insertion modification in the fuel map + CALL RODMOV(IPMAP,NGRP,RNAME,INS) + INTROD(:RODSIZE)=INI + CALL RODMOD(IPMAP,NGRP,MAXMIX,NCH,NB,RNAME,INS,INSS,HMIX, + > RMIX,NREB,RODSIZE,INTROD,INI,NUMMIX,NCALL) + ENDIF +* Definition of the rod map + ELSE IF(TEXT.EQ.'RMAP') THEN + INTROD(:RODSIZE)=INI + CALL REDGET(ITYP,NASS,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) CALL XABORT('@ROD: INTEGER' + 1 //' DATA FOR ASSEMBLY NUMBER EXPECTED.') + IF(NASS.NE.NCH) CALL XABORT('@ROD: NUMBER OF ASSEMBLIES' + 1 //' MUST BE EQUAL TO NCH.') + CALL RODMOD(IPMAP,NGRP,MAXMIX,NCH,NB,RNAME,INS,INSS,HMIX, + > RMIX,NREB,RODSIZE,INTROD,INI,NUMMIX,NCALL) + ELSE IF(TEXT.EQ.';') THEN +*---- +* SAVE ROD INSERTION INFORMATION ON LCM OBJECT L_MAP +*---- + CALL LCMPUT(KPMAP,'P-VALUE',RODSIZE,2,INTROD) + ISTATE(8)=NPARAM + CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE) + DEALLOCATE(RNAME,INS,HMIX,RMIX,INTROD) + GO TO 20 + ELSE + CALL XABORT('@ROD: INVALID KEYWORD: '//TEXT//'.') + ENDIF + GO TO 10 +* + 20 IF(IMPX.GT.2) CALL LCMLIB(IPMAP) + RETURN + END diff --git a/Donjon/src/RODMOD.f b/Donjon/src/RODMOD.f new file mode 100644 index 0000000..25cd8e9 --- /dev/null +++ b/Donjon/src/RODMOD.f @@ -0,0 +1,182 @@ +*DECK RODMOD + SUBROUTINE RODMOD(IPMAP,NGRP,MAXMIX,NCH,NB,RNAME,INS,INSS, + > HMIX,RMIX,NREB,RODSIZE,INTROD,INI,NUMMIX,NCALL) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modification of the rod data stored in the PARAM folder of a fuel map +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Tixier +* +*Parameters: input +* IPMAP pointer to the fuel map +* NGRP number of rod groups +* MAXMIX maximum number of rod mix +* NCH number of fuel channels +* NB number of fuel bundles per channel +* RNAME name of rod group +* INS rod insertion for each rod group +* INSS rod insertion step (in cm) +* HMIX height of rod mix (if more than 2 rod mix are defined) +* RMIX number associated to rod mix +* NREB number of bottom-reflective meshes +* RODSIZE total number of meshes for the fuel zone (=NCH*NB) +* INTROD final value of data stored in the PARAM folder after +* calculation +* INI initial value of data stored in the PARAM folder (no rod +* inserted) +* NUMMIX number of rod mix for each rod group +* NCALL number to distinguish first or other calls to the ROD: +* module +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NGRP,MAXMIX,NREB,NCH,NB,RODSIZE,NUMMIX(NGRP) + INTEGER INSM,NCALL + REAL HMIX(NGRP*MAXMIX),RMIX(NGRP*MAXMIX),INTROD(RODSIZE),INS(NGRP) + REAL INI,INSS + CHARACTER(LEN=3) RNAME(NGRP),RASS(NCH) + TYPE(C_PTR) IPMAP +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT*3 + INTEGER I,J,K,L,M + REAL FLOT,F1,F2,ICM,HMB,HMT,ZMI1,ZMI2 + DOUBLE PRECISION DFLOT + TYPE(C_PTR) JPMAP,MPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: GEOZZ + +* Recover axial meshing + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMLEN(JPMAP,'MESHZ',ILONG,ITYLCM) + ALLOCATE(GEOZZ(ILONG)) + CALL LCMGET(JPMAP,'MESHZ',GEOZZ) + +* Recover rod parameters + MPMAP=LCMGID(IPMAP,'ROD-INFO') + CALL LCMGET(MPMAP,'ROD-INIT',INI) + CALL LCMGET(MPMAP,'INS-MAX',INSM) + CALL LCMGET(MPMAP,'STEP-CM',INSS) + CALL LCMGET(MPMAP,'REFL-BOTTOM',NREB) + CALL LCMGTC(MPMAP,'ROD-NAME',3,NGRP,RNAME) + CALL LCMGET(MPMAP,'ROD-INSERT',INS) + CALL LCMGET(MPMAP,'ROD-RIN',RMIX) + CALL LCMGET(MPMAP,'ROD-NBZONE',NUMMIX) + CALL LCMGET(MPMAP,'ROD-HEIGHT',HMIX) + IF(NB+NREB+1.GT.ILONG) CALL XABORT('RODMOD: GEOZZ OVERFLOW.') + + IF(NCALL.EQ.1) THEN +* If it is the first call to the ROD: module, the rod map is stored in +* the fuel map + N=1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RODMOD: CHARACTER DATA EXPECTED.') + DO WHILE(N.LE.NCH) + RASS(N)=TEXT + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + N=N+1 + END DO + CALL LCMPTC(MPMAP,'ROD-MAP',3,NCH,RASS) + ENDIF +* Recover rod map + CALL LCMGTC(MPMAP,'ROD-MAP',3,NCH,RASS) + I=1 + DO WHILE(I.LE.NCH) + K=NB + DO WHILE(K.GE.1) + IF((RASS(I).EQ.'|').OR.(RASS(I).EQ.'-').OR.(RASS(I).EQ.'-|-' + > )) THEN +* If no control rod is defined + INTROD((K-1)*NCH+I)=INI + GO TO 10 + ELSE +* Recover control rod information + J=1 + DO WHILE(J.LE.NGRP) + IF(RASS(I).EQ.RNAME(J)) THEN + EXIT + ELSE + J=J+1 + ENDIF + END DO + M=NUMMIX(J) + DO WHILE(M.GE.1) + IF(M.EQ.1) THEN + ICM=INS(J)*INSS + ELSE + ICM=INS(J)*INSS-HMIX(J+(M-2)*NGRP) + ENDIF +* Mesh size calculations + HMB=GEOZZ(NB+NREB+1)-GEOZZ(K+NREB) + HMT=GEOZZ(NB+NREB+1)-GEOZZ(K+NREB+1) + IF(ICM.LT.0.0) THEN + M=M-1 + ELSE + ZMI1=HMB-ICM + IF(ZMI1.LE.0.0) THEN + INTROD((K-1)*NCH+I)=RMIX(J+(M-1)*NGRP) + EXIT + ELSE + ZMI2=HMT-ICM + IF(ZMI2.GE.0.0) THEN + IF(M.EQ.1) THEN + INTROD((K-1)*NCH+I)=INI + GO TO 10 + ELSE + M=M-1 + ENDIF + ELSE +* Calculation of the proportion of control rod for the mesh considered + F1=HMB-ICM + F2=GEOZZ(K+NREB+1)-GEOZZ(K+NREB)-F1 + IF(M.EQ.1) THEN + INTROD((K-1)*NCH+I)=(F2*RMIX(J+(M-1)*NGRP) + > +F1*INI)/(F1+F2) + GO TO 10 + ELSE + IF(M.GE.3) THEN +* It is not possible to have two interfaces in one mesh + IF(((INS(J)*INSS-HMIX(J+(M-3)*NGRP)).GE.HMT).AND. + > ((INS(J)*INSS-HMIX(J+(M-3)*NGRP)).LE.HMB)) + > CALL XABORT('@RODMOD: IT IS NOT POSSIBLE TO HAVE' + 1 //' A MESH WITH MORE THAN TWO INTERFACES. HMIX HAS TO BE' + 1 //' BIGGER') + ENDIF +* If two mixtures fill one mesh, we have to compute a fraction of +* insertion for each rod mixture + INTROD((K-1)*NCH+I)=(F2*RMIX(J+(M-1)*NGRP)+ + > F1*RMIX(J+(M-2)*NGRP))/(F1+F2) + EXIT + ENDIF + ENDIF + ENDIF + ENDIF + END DO + ENDIF + K=K-1 + END DO + 10 L=K-1 +* If a control rod does not fill one mesh entirely, the meshes located +* at the bottom of this mesh do not contain control rod + DO WHILE(L.GE.1) + INTROD((L-1)*NCH+I)=INI + L=L-1 + END DO + I=I+1 + END DO + DEALLOCATE(GEOZZ) + RETURN + END diff --git a/Donjon/src/RODMOV.f b/Donjon/src/RODMOV.f new file mode 100644 index 0000000..52a6df2 --- /dev/null +++ b/Donjon/src/RODMOV.f @@ -0,0 +1,72 @@ +*DECK RODMOV + SUBROUTINE RODMOV(IPMAP,NGRP,RNAME,INS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Modify rod insertion (second call) +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Tixier +* +*Parameters: input +* IPMAP pointer to the fuel map +* NGRP number of rod groups +* RNAME name of rod group +* INS rod insertion for each rod group +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NGRP + REAL INS(NGRP) + CHARACTER(LEN=3) RNAME(NGRP) +*---- +* LOCAL VARIABLES +*---- + INTEGER I,J,NRMV + REAL FLOT + REAL INS2(NGRP) + CHARACTER(LEN=3) RNAME2(NGRP) + TYPE(C_PTR) MPMAP + CHARACTER TEXT*3 + DOUBLE PRECISION DFLOT +* + MPMAP=LCMGID(IPMAP,'ROD-INFO') + CALL LCMGTC(MPMAP,'ROD-NAME',3,NGRP,RNAME) + CALL LCMGET(MPMAP,'ROD-INSERT',INS) + CALL REDGET(ITYP,NRMV,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@RODMOV: INTEGER' + 1 //' DATA FOR GROUP NUMBER EXPECTED.') + J=1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RODMOV: CHARACTER DATA EXPECTED.') + DO WHILE(J.LE.NGRP) + RNAME2(J)=TEXT + I=1 + DO WHILE (I.LE.NRMV) + RNAME2(I)=TEXT + IF(RNAME2(I).EQ.RNAME(J)) THEN + CALL REDGET(ITYP,NITMA,INS2(J),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RODMOV: REAL DA' + 1 //'TA FOR INS EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RODMOV: CHARACTER DATA EXPECTED.') + GO TO 10 + ELSE + I=I+1 + ENDIF + END DO + INS2(J)=INS(J) + 10 J=J+1 + END DO + CALL LCMPUT(MPMAP,'ROD-INSERT',NGRP,2,INS2) + RETURN + END diff --git a/Donjon/src/RODTYP.f b/Donjon/src/RODTYP.f new file mode 100644 index 0000000..bf49277 --- /dev/null +++ b/Donjon/src/RODTYP.f @@ -0,0 +1,83 @@ +*DECK RODTYP + SUBROUTINE RODTYP(IPMAP,NGRP,MAXMIX,RNAME,INS,HMIX,RMIX,NUMMIX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store rod parameters in the fuelmap +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Tixier +* +*Parameters: input +* IPMAP pointer to the fuel map +* NGRP number of rod groups +* MAXMIX maximum number of rod mix +* RNAME name of rod group +* INS rod insertion for each rod group +* HMIX height of rod mix (if more than 2 rod mix are defined) +* RMIX number associated to rod mix +* NUMMIX number of rod mix for each rod group +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NGRP,MAXMIX,NUMMIX(NGRP) + REAL HMIX(NGRP*MAXMIX),RMIX(NGRP*MAXMIX),INS(NGRP) + CHARACTER(LEN=3) RNAME(NGRP) +*---- +* LOCAL VARIABLES +*---- + INTEGER I,J,INSM + REAL FLOT + TYPE(C_PTR) MPMAP + CHARACTER TEXT*3 + DOUBLE PRECISION DFLOT +* + MPMAP=LCMGID(IPMAP,'ROD-INFO') + CALL LCMGET(MPMAP,'INS-MAX',INSM) + I=1 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@RODTYP: CHARACTER DATA EXPECTED.') + DO WHILE (I.LE.NGRP) + J=1 + RNAME(I)=TEXT + CALL REDGET(ITYP,NITMA,INS(I),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RODTYP: REAL DA' + 1 //'TA FOR INS EXPECTED.') + IF(INS(I).GT.INSM)CALL XABORT('@RODTYP: ROD INSERTION IS ' + 1 //'LARGER THAN MAXIMUM INSERTION.') + IF(INS(I).LT.0)CALL XABORT('@RODTYP: ROD INSERTION MUST BE ' + 1 //'POSITIVE.') + CALL REDGET(ITYP,NITMA,RMIX(I+(J-1)*NGRP),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RODTYP: REAL DA' + 1 //'TA FOR MIX EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + DO WHILE (ITYP.NE.3) + HMIX(I+(J-1)*NGRP)=FLOT + IF((J.GE.2).AND.(HMIX(I+(J-2)*NGRP).GT.HMIX(I+(J-1)*NGRP))) + > CALL XABORT('@RODTYP: THE LENGTH OF THE TOP MATERIAL MUST' + 1 //'BE HIGHER THAN THE BOTTOM MATERIAL.') + J=J+1 + CALL REDGET(ITYP,NITMA,RMIX(I+(J-1)*NGRP),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@RODTYP: REAL DATA FOR MIX ' + 1 //'EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + END DO + NUMMIX(I)=J + I=I+1 + END DO + CALL LCMPTC(MPMAP,'ROD-NAME',3,NGRP,RNAME) + CALL LCMPUT(MPMAP,'ROD-INSERT',NGRP,2,INS) + CALL LCMPUT(MPMAP,'ROD-RIN',MAXMIX*NGRP,2,RMIX) + CALL LCMPUT(MPMAP,'ROD-NBZONE',NGRP,1,NUMMIX) + CALL LCMPUT(MPMAP,'ROD-HEIGHT',MAXMIX*NGRP,2,HMIX) + RETURN + END diff --git a/Donjon/src/SCR.f b/Donjon/src/SCR.f new file mode 100644 index 0000000..c827954 --- /dev/null +++ b/Donjon/src/SCR.f @@ -0,0 +1,592 @@ +*DECK SCR + SUBROUTINE SCR(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and interpolate Microlib or Macrolib information from one or +* many Saphyb database objects. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The SCR: calling specifications are: +* MLIB := SCR: [ { MLIB | MLIB2 } ] SAPNAM1 [[ SAPNAM2 ]] [ MAPFL ] +* :: (scr\_data) ; \\ +* where +* MLIB : name of a \emph{microlib} (type L\_LIBRARY) or \emph{macrolib} +* (type L\_MACROLIB) containing the interpolated data. If this object also +* appears on the RHS of structure (SCR:, it is open in modification mode +* and updated. +* MLIB2 : name of an optional \emph{microlib} object whose content is copied +* on MLIB. +* SAPNAM1 : name of the \emph{saphyb} data structure (L\_SAPHYB signature). +* SAPNAM2 : name of an additional \emph{saphyb} data structure (L\_SAPHYB +* signature). This object is optional. +* MAPFL : name of the \emph{map} object containing fuel regions description, +* global parameter information (burnup, fuel/coolant temperatures, coolant +* density, etc). Keyword TABLE is expected in (scr\_data). +* scr\_data : input data structure containing interpolation information. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXR=12 + INTEGER, PARAMETER::NSTATE=40 + REAL B2, FLOTT + INTEGER ITYLCM, MAXISO, MAXNIS, MD1, MD2, MY1, MY2, NB, NCAL, + & NCH, NCOMB, NDEPL, NDFI, NDFP, NFUEL, NGRP, NHEAVY, NBISO, NISY, + & NITMA, NLIGHT, NMAC, NMIL, NMIX, NOTHER, NPARM, NPAR, NREAC, + & NSTABL, NSURFD, NVTOT, NBESP, ILUPS + INTEGER IMPX, ILONG, IMPY, INDIC, ITER, ITEXT4 + INTEGER I, IACCS, ITH, J + CHARACTER TEXT4*4,TEXT12*12,HSMG*131,HSIGN*12,HEQUI*4, + 1 HMASL*4,NMDEPL(MAXR)*8 + LOGICAL LMACRO,LCUBIC,LRES,LPURE + DOUBLE PRECISION DFLOTT + INTEGER ISTATE(NSTATE),DIMSAP(50) + TYPE(C_PTR) IPMAP,IPSAP,IPLIB,IPLIB2,IPMEM +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIXC,NISO,LISO,HISO,IADRY, + 1 ITNAM,ITZEA,MATNO,KPAX,INAM,IZAE,HREAC,IDR,KPAR,ITODO + REAL, ALLOCATABLE, DIMENSION(:) :: CONC,BPAX,RER,RRD,BPAR,YIELD + REAL, ALLOCATABLE, DIMENSION(:,:) :: TERP + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VTOT + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: YLDS,DECAY + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: NOMIS +* + SAVE NMDEPL + DATA NMDEPL/'DECAY ','NFTOT ','NG ','N2N ', + > 'N3N ','N4N ','NA ','NP ', + > 'N2A ','NNP ','ND ','NT '/ +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LE.1) CALL XABORT('SCR: MINIMUM OF 2 OBJECTS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('SCR: MACRO' + 1 //'LIB LCM OBJECT EXPECTED AT LHS.') + IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('SCR: MACRO' + 1 //'LIB IN CREATE OR MODIFICATION MODE EXPECTED.') + IACCS=JENTRY(1) + IPLIB=KENTRY(1) + IPLIB2=C_NULL_PTR + IPMAP=C_NULL_PTR + NGRP=0 + NMIX=0 + IF(IACCS.EQ.1) THEN + CALL LCMGTC(IPLIB,'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(3) + NMIX=ISTATE(1) + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + ELSE + TEXT12=HENTRY(1) + CALL XABORT('SCR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_LIBRARY OR L_MACROLIB EXPECTED.') + ENDIF + ENDIF + DO 10 I=2,NENTRY + IF((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2)) CALL XABORT('SCR: ' + 1 //'LCM OBJECTS EXPECTED AT RHS.') + IF(JENTRY(I).NE.2) CALL XABORT('SCR: LCM OBJECTS IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_LIBRARY') THEN + IF(C_ASSOCIATED(IPLIB2)) CALL XABORT('SCR: ONLY ONE MICROLIB' + 1 //' EXPECTED AT RHS.') + IPLIB2=KENTRY(I) + GO TO 10 + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + CALL XABORT('SCR: ANOTHER MACROLIB NOT EXPECTED AT RHS.') + ELSE IF(HSIGN.EQ.'L_MAP') THEN + IF(I.NE.NENTRY)CALL XABORT('SCR: FUEL-MAP EXPECTED TO BE THE ' + 1 //'LAST OBJECT.') + IF(NENTRY.LT.3)CALL XABORT('SCR: MISSING SAPHYB OBJECT.') + IPMAP=KENTRY(NENTRY) + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NMIX=ISTATE(9) + ELSE IF(HSIGN.NE.'L_SAPHYB') THEN + TEXT12=HENTRY(I) + CALL XABORT('SCR: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_SAPHYB EXPECTED.') + ENDIF + 10 CONTINUE +*---- +* READ THE INPUT DATA +*---- + NVTOT=0 + LMACRO=.TRUE. + LCUBIC=.FALSE. + LRES=.FALSE. + LPURE=.FALSE. + B2=0.0 + ITER=-1 + IPSAP=C_NULL_PTR + HEQUI=' ' + HMASL=' ' + ILUPS=0 + IMPX=1 + 20 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCR: CHARACTER DATA EXPECTED(1).') + 30 IF(TEXT12.EQ.'EDIT') THEN +* READ THE PRINT INDEX. + CALL REDGET(INDIC,IMPX,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('SCR: INTEGER DATA EXPECTED(1).') + ELSE IF(TEXT12.EQ.'NMIX') THEN +* READ THE MAXIMUM NUMBER OF MATERIAL MIXTURES. + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('SCR: INTEGER DATA EXPECTED(2).') + IF(NITMA.LT.NMIX) THEN + WRITE(HSMG,'(20HSCR: NMIX MUST BE >=,I8)') NMIX + CALL XABORT(HSMG) + ENDIF + NMIX=NITMA + ELSE IF(TEXT12.EQ.'MACRO') THEN + LMACRO=.TRUE. + ELSE IF(TEXT12.EQ.'MICRO') THEN + LMACRO=.FALSE. + ELSE IF(TEXT12.EQ.'LINEAR') THEN + LCUBIC=.FALSE. + ELSE IF(TEXT12.EQ.'CUBIC') THEN + LCUBIC=.TRUE. + ELSE IF(TEXT12.EQ.'RES') THEN + IF((IACCS.EQ.0).AND.(.NOT.C_ASSOCIATED(IPLIB2))) THEN + CALL XABORT('SCR: RHS MICROLIB EXPECTED WITH RES OPTION.') + ENDIF + LRES=.TRUE. + ELSE IF(TEXT12.EQ.'PURE') THEN + LPURE=.TRUE. + ELSE IF(TEXT12.EQ.'UPS') THEN + ILUPS=1 + ELSE IF(TEXT12.EQ.'SAPHYB') THEN + IF(NMIX.EQ.0) CALL XABORT('SCR: ZERO NUMBER OF MIXTURES.') + IF(C_ASSOCIATED(IPMAP)) THEN + WRITE(IOUT,'(/43H SCR: ***WARNING*** A FUEL MAP IS SET AT RH, + 1 26HS; KEYWORD TABLE EXPECTED.)') + ENDIF + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCR: CHARACTER DATA EXPECTED(2).') + ITH=0 + DO 50 I=2,NENTRY + IF(C_ASSOCIATED(KENTRY(I),IPLIB2)) GO TO 50 + IF(TEXT12.EQ.HENTRY(I)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,TEXT12) + IF(TEXT12.EQ.'L_SAPHYB') THEN + IPSAP=KENTRY(I) + ELSE + CALL XABORT('SCR: WRONG SIGNATURE ('//TEXT12//').') + ENDIF + ITH=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('SCR: SAPHYB '//TEXT12//' NOT FOUND.') + 60 IF(IMPX.GT.0) THEN + WRITE(IOUT,320) HENTRY(ITH) + CALL SCRTOC(IPSAP) + ENDIF + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + IF(NGRP.EQ.0) THEN + NGRP=DIMSAP(20) + ELSE IF(NGRP.NE.DIMSAP(20)) THEN + WRITE(HSMG,'(9H SCR: THE,I4,27H-TH SAPHYB HAS AN INVALID N, + 1 24HUMBER OF ENERGY GROUPS (,I4,3H VS,I5,1H.)') ITH,NGRP, + 2 DIMSAP(20) + CALL XABORT(HSMG) + ENDIF + NMIL=DIMSAP(7) + NCAL=DIMSAP(19) + MY1=DIMSAP(6)+DIMSAP(14) + MY2=DIMSAP(15) + MD1=DIMSAP(3) + MD2=DIMSAP(5)+DIMSAP(6) + ALLOCATE(MIXC(NMIX),NISO(NMIX),LISO(NMIX),HISO(2*NMIX*MD2), + 1 ITODO(NMIX*MD2)) + ALLOCATE(TERP(NCAL,NMIX),CONC(NMIX*MD2)) +* + CALL SCRDRV(IPSAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2,ITER,MAXNIS, + 1 MIXC,TERP,NISO,LISO,HISO,CONC,ITODO) + GO TO 130 + ELSE IF(TEXT12.EQ.'TABLE') THEN + IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('SCR: MISSING FUEL-MA' + 1 //'P OBJECT.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + NGRP=ISTATE(4) + NFUEL=ISTATE(7) + NPARM=ISTATE(8) + IF(NCOMB.EQ.0) CALL XABORT('SCR: NUMBER OF COMBUSTION ZONES NO' + 1 //'T YET DEFINED IN THE FUEL MAP NCOMB=0.') + IF((IACCS.EQ.0).AND.(C_ASSOCIATED(IPLIB2))) THEN + CALL LCMEQU(IPLIB2,IPLIB) + IACCS=1 + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCR: CHARACTER DATA EXPECTED(2).') + ITH=0 + DO 80 I=2,NENTRY + IF((C_ASSOCIATED(KENTRY(I),IPLIB2)).OR. + 1 (C_ASSOCIATED(KENTRY(I),IPMAP))) GO TO 80 + IF(TEXT12.EQ.HENTRY(I)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,TEXT12) + IF(TEXT12.EQ.'L_SAPHYB') THEN + IPSAP=KENTRY(I) + ELSE + CALL XABORT('SCR: WRONG SIGNATURE ('//TEXT12//').') + ENDIF + ITH=I + GO TO 90 + ENDIF + 80 CONTINUE + CALL XABORT('SCR: SAPHYB '//TEXT12//' NOT FOUND.') + 90 IF(IMPX.GT.0) THEN + WRITE(IOUT,320) HENTRY(ITH) + CALL SCRTOC(IPSAP) + ENDIF + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + IF(NGRP.NE.DIMSAP(20)) THEN + WRITE(HSMG,'(9H SCR: THE,I4,27H-TH SAPHYB HAS AN INVALID N, + 1 24HUMBER OF ENERGY GROUPS (,I4,3H VS,I5,2H).)') ITH,NGRP, + 2 DIMSAP(20) + CALL XABORT(HSMG) + ENDIF + NMIL=DIMSAP(7) + NCAL=DIMSAP(19) + MY1=DIMSAP(6)+DIMSAP(14) + MY2=DIMSAP(15) + MD1=DIMSAP(3) + MD2=DIMSAP(5)+DIMSAP(6) + ALLOCATE(MIXC(NMIX),NISO(NMIX),LISO(NMIX),HISO(2*NMIX*MD2), + 1 ITODO(NMIX*MD2)) + ALLOCATE(TERP(NCAL,NMIX),CONC(NMIX*MD2)) +* + CALL SCRRGR(IPSAP,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2,NCH,NB, + 1 NFUEL,NPARM,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC,ITODO) + GO TO 130 + ELSE IF(TEXT12.EQ.'EQUI') THEN + CALL REDGET(INDIC,NITMA,FLOTT,HEQUI,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCR: CHARACTER DATA EXPECTED') + ELSE IF(TEXT12.EQ.'MASL') THEN + CALL REDGET(INDIC,NITMA,FLOTT,HMASL,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCR: CHARACTER DATA EXPECTED') + ELSE IF(TEXT12.EQ.'LEAK') THEN + CALL REDGET(INDIC,NITMA,B2,TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('SCR: REAL DATA EXPECTED.') + ELSE IF(TEXT12.EQ.'CHAIN') THEN + IF(LMACRO) CALL XABORT('SCR: MICRO KEYWORD EXPECTED.') + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + NBISO=DIMSAP(5) ! number of particularized isotopes + NMAC=DIMSAP(6) ! number of macroscopic sets + IF(NBISO.EQ.0) CALL XABORT('SCR: NO PARTICULARIZED ISOTOPES.') + IF(NMAC.EQ.0) CALL XABORT('SCR: NO MACROSCOPIC SETS.') + MY1=DIMSAP(6)+DIMSAP(14) + MY2=DIMSAP(15) + MD1=DIMSAP(3) + MD2=DIMSAP(5)+DIMSAP(6) + CALL LCMLEN(IPLIB,'VTOT_',ILONG,ITYLCM) + IF(ILONG.NE.NVTOT) CALL XABORT('SCR: INVALID LENGTH: VTOT(1).') + CALL LCMLEN(IPLIB,'YLDS_',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2*NVTOT) CALL XABORT('SCR: INVALID LENGTH: Y' + 1 //'LDS(1).') + CALL LCMLEN(IPLIB,'DECAYC_',ILONG,ITYLCM) + IF(ILONG.NE.MD1*MD2*NVTOT) CALL XABORT('SCR: INVALID LENGTH: D' + 1 //'ECAYC(1)') + ALLOCATE(VTOT(NVTOT),YLDS(MY1,MY2,NVTOT),DECAY(MD1,MD2,NVTOT), + 1 NOMIS(NBISO+NMAC)) + CALL LCMGET(IPLIB,'VTOT_',VTOT) + CALL LCMGET(IPLIB,'YLDS_',YLDS) + CALL LCMGET(IPLIB,'DECAYC_',DECAY) + CALL LCMSIX(IPSAP,'contenu',1) + CALL LCMGTC(IPSAP,'NOMISO',8,NBISO,NOMIS) + CALL LCMGTC(IPSAP,'NOMMAC',8,NMAC,NOMIS(NBISO+1:NBISO+NMAC)) + CALL LCMSIX(IPSAP,' ',2) + WRITE(TEXT12,'(4Hcalc,I8)') 1 + CALL LCMSIX(IPSAP,TEXT12,1) ! step up to calc + CALL LCMSIX(IPSAP,'info',1) + CALL LCMGET(IPSAP,'NISY',NISY) + ALLOCATE(IADRY(NISY)) + CALL LCMGET(IPSAP,'ADRY',IADRY) + CALL LCMSIX(IPSAP,' ',2) + CALL LCMSIX(IPSAP,' ',2) +* + NBESP=1 + ALLOCATE(ITNAM(3*MD2),ITZEA(MD2),MATNO(MD2), + 1 KPAX((MD2+MAXR)*MD2),BPAX((MD2+MAXR)*MD2*NBESP)) + TEXT4=' ' + READ(TEXT4,'(A4)') ITEXT4 + ITNAM(:3*MD2)=ITEXT4 + ITZEA(:MD2)=0 + MATNO(:MD2)=0 + KPAX(:(MD2+MAXR)*MD2)=0 + BPAX(:(MD2+MAXR)*MD2*NBESP)=0.0 + CALL SCREIR(NMDEPL,MY1,MY2,MD1,MD2,NOMIS,IADRY,NVTOT,VTOT, + 1 YLDS,DECAY,ITNAM,ITZEA,KPAX,BPAX) + DEALLOCATE(IADRY,NOMIS,DECAY,YLDS,VTOT) + CALL LIBWET(MAXR,MD2,NBESP,NSTATE,NMDEPL,ITNAM,ISTATE,MATNO, + 1 KPAX,BPAX) + NDEPL=ISTATE(1) + NDFI=ISTATE(2) + NDFP=ISTATE(3) + NHEAVY=ISTATE(4) + NLIGHT=ISTATE(5) + NOTHER=ISTATE(6) + NSTABL=ISTATE(7) + NREAC=ISTATE(8) + NPAR=ISTATE(9) + NBESP=MAX(1,ISTATE(10)) +*---- +* ALLOCATE DECAY CHAIN +*---- + NDEPL=MAX(NDEPL,1) + NDFI=MAX(NDFI,1) + NDFP=MAX(NDFP,1) + ALLOCATE(INAM(3*NDEPL),IZAE(NDEPL),IDR(NREAC*NDEPL), + 1 RER(NREAC*NDEPL),RRD(NDEPL),KPAR(NPAR*NDEPL),BPAR(NPAR*NDEPL), + 2 YIELD(NDFI*NDFP*NBESP)) +*---- +* SET DECAY CHAIN +*---- + CALL LIBWED(MAXR,MD2,NBESP,NDEPL,NDFI,NDFP,NHEAVY,NLIGHT,NOTHER, + > NREAC,NPAR,ITNAM,ITZEA,MATNO,KPAX,BPAX,INAM,IZAE, + > IDR,RER,RRD,KPAR,BPAR,YIELD) +*---- +* RELEASE WORK VECTORS FOR WIMS-AECL, WIMS-NEA, DRAGLIB +* AND INPUT FILE +*---- + DEALLOCATE(BPAX,KPAX,MATNO,ITZEA,ITNAM) +*---- +* SELECT USED DEPLETION REACTION NAMES +*---- + ALLOCATE(HREAC(2*NREAC)) + DO 100 I=1,NREAC + READ(NMDEPL(I),'(2A4)') (HREAC(2*(I-1)+J),J=1,2) + 100 CONTINUE +*---- +* PRINT DECAY CHAIN IF REQUIRED +*---- + IMPY=IMPX+2 + CALL LIBEPR(IMPY,NBESP,NDEPL,NSTABL,NDFI,NDFP,NREAC,NPAR,INAM, + > HREAC,IDR,RER,RRD,KPAR,BPAR,YIELD,IZAE) +*---- +* SAVE CHAIN +*---- + CALL LCMSIX(IPLIB,'DEPL-CHAIN',1) + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + NDEPL=ISTATE(1) + CALL LCMPUT(IPLIB,'ISOTOPESDEPL',3*NDEPL,3,INAM) + CALL LCMPUT(IPLIB,'CHARGEWEIGHT',NDEPL,1,IZAE) + CALL LCMPUT(IPLIB,'DEPLETE-IDEN',2*NREAC,3,HREAC) + CALL LCMPUT(IPLIB,'DEPLETE-REAC',NREAC*NDEPL,1,IDR) + CALL LCMPUT(IPLIB,'DEPLETE-ENER',NREAC*NDEPL,2,RER) + CALL LCMPUT(IPLIB,'DEPLETE-DECA',NDEPL,2,RRD) + CALL LCMPUT(IPLIB,'PRODUCE-REAC',NPAR*NDEPL,1,KPAR) + CALL LCMPUT(IPLIB,'PRODUCE-RATE',NPAR*NDEPL,2,BPAR) + IF(NDFP.GT.0) CALL LCMPUT(IPLIB,'FISSIONYIELD',NDFI*NDFP*NBESP, + > 2,YIELD) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(11)=NDEPL + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* DEALLOCATE DECAY CHAIN ARRAYS +*---- + DEALLOCATE(YIELD,BPAR,KPAR,RRD,RER,IDR,IZAE,INAM) + ELSE IF(TEXT12.EQ.';') THEN + GO TO 200 + ELSE + CALL XABORT('SCR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 20 +*---- +* COPY THE SAPHYB INTO MEMORY IN ORDER TO SAVE INTERPOLATION TIME +*---- + 130 CALL SCRMEM(IPSAP,IPMEM,NCAL,NMIL,NMIX,TERP,MIXC) + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + MD2=DIMSAP(5)+DIMSAP(6) +*---- +* FIND THE NUMBER OF DISCONTINUITY FACTORS +*---- + NSURFD=0 + CALL LCMSIX(IPSAP,'geom',1) + CALL LCMLEN(IPSAP,'outgeom',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(IPSAP,'outgeom',1) + CALL LCMLEN(IPSAP,'SURF',NSURFD,ITYLCM) + CALL LCMSIX(IPSAP,' ',2) + ENDIF + CALL LCMSIX(IPSAP,' ',2) +*---- +* BUILD THE INTERPOLATED MACROLIB +*---- + IF(LMACRO.AND.(MAXNIS.EQ.0)) THEN +* build a macrolib + CALL SCRSAP(IPLIB,IPMEM,IACCS,NMIL,NMIX,NGRP,IMPX,HEQUI,HMASL, + 1 NCAL,NSURFD,ILUPS,MIXC,TERP,LPURE,B2) + ELSE +* build a microlib + IF(LMACRO)THEN + CALL LCMOP(IPLIB,'*TEMPORARY*',0,1,0) + IACCS=0 + ENDIF + IF(IACCS.EQ.0)THEN + MAXISO=MD2*NMIX + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXISO=MAX(MD2*NMIX,ISTATE(2)) + ENDIF + NVTOT=NVTOT+1 + ALLOCATE(VTOT(NVTOT),YLDS(MY1,MY2,NVTOT),DECAY(MD1,MD2,NVTOT)) + IF(NVTOT.GT.1) THEN + CALL LCMLEN(IPLIB,'VTOT_',ILONG,ITYLCM) + IF(ILONG.NE.NVTOT-1) CALL XABORT('SCR: INVALID LENGTH: VTOT(' + 1 //'2).') + CALL LCMLEN(IPLIB,'YLDS_',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2*(NVTOT-1)) CALL XABORT('SCR: INVALID LEN' + 1 //'GTH: YLDS(2).') + CALL LCMGET(IPLIB,'VTOT_',VTOT) + IF(MY1*MY2.GT.0) CALL LCMGET(IPLIB,'YLDS_',YLDS) + IF(MD1*MD2.GT.0) CALL LCMGET(IPLIB,'DECAYC_',DECAY) + ENDIF + CALL SCRLIB(MAXNIS,MAXISO,IPLIB,IPMEM,IACCS,NMIX,NGRP,IMPX, + 1 HEQUI,HMASL,NCAL,ITER,MY1,MY2,MD1,MD2,TERP,NISO,LISO,HISO, + 2 CONC,ITODO,MIXC,LRES,LPURE,ILUPS,B2,VTOT(NVTOT),YLDS(1,1,NVTOT), + 3 DECAY(1,1,NVTOT)) + CALL LCMPUT(IPLIB,'VTOT_',NVTOT,4,VTOT) + IF(MY1*MY2.GT.0) THEN + CALL LCMPUT(IPLIB,'YLDS_',MY1*MY2*NVTOT,4,YLDS) + ENDIF + IF(MD1*MD2.GT.0) THEN + CALL LCMPUT(IPLIB,'DECAYC_',MD1*MD2*NVTOT,4,DECAY) + ENDIF + DEALLOCATE(VTOT,DECAY,YLDS) + IF(LMACRO) THEN + CALL LCMVAL(IPLIB,' ') + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMEQU(IPLIB,KENTRY(1)) + CALL LCMSIX(IPLIB,' ',2) + CALL LCMCL(IPLIB,2) + ENDIF + ENDIF + CALL LCMCL(IPMEM,2) + DEALLOCATE(LISO,NISO,HISO,ITODO,CONC,TERP,MIXC) +*---- +* PRINT THE STATE VECTOR +*---- + IF(IMPX.GT.0) THEN + IF(LMACRO) THEN + CALL LCMGET(KENTRY(1),'STATE-VECTOR',ISTATE) + WRITE(IOUT,290) IMPX,(ISTATE(I),I=1,7),ISTATE(9),ISTATE(12) + IF(IMPX.GT.3) CALL LCMLIB(KENTRY(1)) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + WRITE(IOUT,300) IMPX,(ISTATE(I),I=1,12) + WRITE(IOUT,310) (ISTATE(I),I=13,15),(ISTATE(I),I=17,24) + IF(IMPX.GT.3) CALL LCMLIB(IPLIB) + ENDIF + ENDIF +*---- +* CONTINUE DATA PROCESSING +*---- + IF(ITER.EQ.0) THEN + GO TO 200 + ELSE IF(ITER.EQ.1) THEN + TEXT12='SAPHYB' + GO TO 30 + ELSE IF(ITER.EQ.2) THEN + TEXT12='TABLE' + GO TO 30 + ELSE IF(ITER.EQ.3) THEN + TEXT12='CHAIN' + GO TO 30 + ENDIF +*---- +* LEAVE SCR: +*---- + 200 RETURN +* + 290 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NGROUP,I6,28H (NUMBER OF ENERGY GROUPS)/ + 3 7H NBMIX ,I6,39H (NUMBER OF MIXTURES IN THE MACROLIB)/ + 4 7H NANISO,I6,34H (MAXIMUM SCATTERING ANISOTROPY)/ + 5 7H NIFISS,I6,45H (MAXIMUM NUMBER OF FISSILE ISOTOPES IN A M, + 6 7HIXTURE)/ + 7 7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 8 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 9 43H=RECOVER FROM LIBRARY/4=LEAKAGE CORRECTION)/ + 1 7H NLG ,I6,39H (NUMBER OF DELAYED PRECURSOR GROUPS)/ + 2 7H ILEAK ,I6,40H (1=DIFF AVAILABLE; 2=DIFFX AVAILABLE)/ + 3 7H IDF ,I6,34H (0=NO ADF INFO/2=FLUX GAP INFO)) + 300 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I6,30H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H MAXMIX,I6,31H (MAXIMUM NUMBER OF MIXTURES)/ + 3 7H NBISO ,I6,36H (NUMBER OF ISOTOPES OR MATERIALS)/ + 4 7H NGRP ,I6,28H (NUMBER OF ENERGY GROUPS)/ + 5 7H NL ,I6,30H (NUMBER OF LEGENDRE ORDERS)/ + 6 7H ITRANC,I6,45H (0=NO TRANSPORT CORRECTION/1=APOLLO TYPE/2, + 7 57H=RECOVER FROM LIBRARY/3=WIMS-D TYPE/4=LEAKAGE CORRECTION)/ + 8 7H IPROB ,I6,23H (0=DIRECT/1=ADJOINT)/ + 9 7H ITIME ,I6,28H (1=STEADY-STATE/2=PROMPT)/ + 1 7H NLIB ,I6,32H (NUMBER OF SETS OF LIBRARIES)/ + 2 7H NGF ,I6,48H (NUMBER OF FAST GROUP WITHOUT SELF-SHIELDING)/ + 3 7H IGRMAX,I6,41H (LAST GROUP INDEX WITH SELF-SHIELDING)/ + 4 7H NDEPL ,I6,33H (NUMBER OF DEPLETING ISOTOPES)/ + 5 7H NCOMB ,I6,33H (NUMBER OF DEPLETING MIXTURES)) + 310 FORMAT(7H NEDMAC,I6,34H (NUMBER OF CROSS SECTION EDITS)/ + 1 7H NBMIX ,I6,23H (NUMBER OF MIXTURES)/ + 2 7H NRES ,I6,40H (NUMBER OF SETS OF RESONANT MIXTURES)/ + 3 7H IPROC ,I6,48H (-1=SKIP LIBRARY PROCESSING/0=DILUTION INTERP, + 4 48HOLATION/1=USE PHYSICAL TABLES/2=BUILD A DRAGLIB/, + 5 55H3=COMPUTE CALENDF TABLES/4=COMPUTE SLOWING-DOWN TABLES)/ + 6 7H IMAC ,I6,45H (0=DO NOT/1=DO BUILD AN EMBEDDED MACROLIB)/ + 7 7H NDEL ,I6,31H (NUMBER OF PRECURSOR GROUPS)/ + 8 7H NFISS ,I6,31H (NUMBER OF FISSILE ISOTOPES)/ + 9 7H ISOADD,I6,37H (0=COMPLETE BURNUP CHAIN/1=DO NOT)/ + 1 7H MAXISM,I6,40H (MAX. NUMBER OF ISOTOPES PER MIXTURE)/ + 2 7H IPRECI,I6,34H (CALENDF ACCURACY FLAG:1/2/3/4)/ + 3 7H IDF ,I6,47H (0=NO INFO/1=ALBS INFO/2=FLUX GAP INFO/3=ADF, + 4 10H GAP INFO)) + 320 FORMAT(/28H SCR: INTERPOLATING SAPHYB ',A12,2H'.) + END diff --git a/Donjon/src/SCRDRV.f b/Donjon/src/SCRDRV.f new file mode 100644 index 0000000..44c35be --- /dev/null +++ b/Donjon/src/SCRDRV.f @@ -0,0 +1,377 @@ +*DECK SCRDRV + SUBROUTINE SCRDRV(IPSAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2,ITER, + 1 MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC,ITODO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for Saphyb interpolation. Use user-defined +* global parameters. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPSAP address of the Saphyb object. +* LCUBIC =.TRUE.: cubic Ceschino interpolation; =.FALSE: linear +* Lagrange interpolation. +* NMIX maximum number of material mixtures in the microlib. +* IMPX print parameter (equal to zero for no print). +* NMIL number of material mixtures in the Saphyb. +* NCAL number of elementary calculations in the Saphyb. +* MD2 number of particularized and macro isotopes in the Saphyb. +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another Saphyb; +* =2 use another L_MAP + Saphyb). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the Saphyb 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 + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP + INTEGER NMIX,IMPX,NMIL,NCAL,MD2,ITER,MAXNIS,MIXC(NMIX), + 1 HISO(2,NMIX,MD2),NISO(NMIX),ITODO(NMIX,MD2) + REAL TERP(NCAL,NMIX),CONC(NMIX,MD2) + LOGICAL LCUBIC,LISO(NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXLIN=50 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + REAL, PARAMETER::REPS=1.0E-4 + INTEGER I, I0, IBM, IBMOLD, ICAL, INDIC, IPAR, ITYLCM, ITYPE, J + &, JBM, LENGTH, NCOMLI, NITMA, NPAR, NVP + REAL SUM, FLOTT + CHARACTER TEXT12*12,PARKEY(MAXPAR)*4,PARFMT(MAXPAR)*8,HSMG*131, + 1 COMMEN(MAXLIN)*80,VALH(MAXPAR)*12,VCHAR(MAXVAL)*12,RECNAM*12, + 2 HCUBIC*12 + INTEGER DIMSAP(50),VALI(MAXPAR),NVALUE(MAXPAR),VINTE(MAXVAL), + 1 MUPLET(2*MAXPAR),MUTYPE(2*MAXPAR) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2),VREAL(MAXVAL) + LOGICAL LCUB2(MAXPAR) + TYPE(C_PTR) LPSAP + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LDELTA +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(LDELTA(NMIX)) +*---- +* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE SAPHYB. +*---- + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + NCOMLI=DIMSAP(1) + NPAR=DIMSAP(8) + NVP=DIMSAP(17) + IF(NCOMLI.GT.MAXLIN) CALL XABORT('SCRDRV: MAXLIN OVERFLOW.') + IF(NPAR.GT.MAXPAR) CALL XABORT('SCRDRV: MAXPAR OVERFLOW.') + CALL LCMGTC(IPSAP,'COMMEN',80,NCOMLI,COMMEN) + IF(NPAR.GT.0) THEN + CALL LCMSIX(IPSAP,'paramdescrip',1) + CALL LCMGTC(IPSAP,'PARKEY',4,NPAR,PARKEY) + CALL LCMGTC(IPSAP,'PARFMT',8,NPAR,PARFMT) + CALL LCMSIX(IPSAP,' ',2) + ENDIF + IF(IMPX.GT.0) WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI) + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 +*---- +* 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 + NISO(:NMIX)=0 + LISO(:NMIX)=.TRUE. + LDELTA(:NMIX)=.FALSE. + ITODO(:NMIX,:MD2)=0 + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: CHARACTER DATA EXPECTED.') + 20 IF(TEXT12.EQ.'MIX') THEN + MUPLET(:NPAR)=0 + MUTYPE(:NPAR)=0 + VALI(:NPAR)=0 + VALR(:NPAR,1)=0.0 + VALR(:NPAR,2)=0.0 + DO 30 I=1,NPAR + VALH(I)=' ' + 30 CONTINUE + LCUB2(:NPAR)=LCUBIC + CALL REDGET(INDIC,IBM,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('SCRDRV: INTEGER DATA EXPECTED.') + IF(IBM.GT.NMIX) THEN + WRITE(HSMG,'(27HSCRDRV: NMIX OVERFLOW (IBM=,I8,6H NMIX=,I8, + 1 2H).)') IBM,NMIX + CALL XABORT(HSMG) + ENDIF + IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'FROM') THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('SCRDRV: INTEGER DATA EXPECTED.') + IF(IBMOLD.GT.NMIL) CALL XABORT('SCRDRV: SAPHYB MIX OVERFLOW' + 1 //'(1).') + MIXC(IBM)=IBMOLD + GO TO 10 + ELSE IF(TEXT12.EQ.'USE') THEN + IF(IBM.GT.NMIL) CALL XABORT('SCRDRV: SAPHYB MIX OVERFLOW' + 1 //'(2).') + MIXC(IBM)=IBM + GO TO 10 + ENDIF + MIXC(IBM)=IBMOLD + GO TO 20 + ELSE IF(TEXT12.EQ.'MICRO') THEN + IF(IBM.EQ.0) CALL XABORT('SCRDRV: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: CHARACTER DATA EXPECTED.') + IF(TEXT12.EQ.'ALL') THEN + LISO(IBM)=.TRUE. + ELSE IF(TEXT12.EQ.'ONLY') THEN + LISO(IBM)=.FALSE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: CHARACTER DATA EXPECTED.') + 40 IF(TEXT12.EQ.'ENDMIX') THEN + GO TO 20 + ELSE IF(TEXT12.EQ.'NOEV') THEN + IF(NISO(IBM).EQ.0) CALL XABORT('SCRDRV: MISPLACED NOEV.') + ITODO(IBM,NISO(IBM))=1 + ELSE + NISO(IBM)=NISO(IBM)+1 + IF(NISO(IBM).GT.MD2) CALL XABORT('SCRDRV: MD2 OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISO(IBM)) + READ(TEXT12,'(2A4)') (HISO(I0,IBM,NISO(IBM)),I0=1,2) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + CONC(IBM,NISO(IBM))=FLOTT + ELSE IF((INDIC.EQ.3).AND.(TEXT12.EQ.'*')) THEN + CONC(IBM,NISO(IBM))=-99.99 + ELSE + CALL XABORT('SCRDRV: INVALID HISO DATA.') + ENDIF + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: CHARACTER DATA EXPECTED.') + GO TO 40 + ELSE IF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA')) THEN + IF(IBM.EQ.0) CALL XABORT('SCRDRV: MIX NOT SET (2).') + ITYPE=0 + IF(TEXT12.EQ.'SET') THEN + ITYPE=1 + ELSE IF(TEXT12.EQ.'DELTA') THEN + ITYPE=2 + LDELTA(IBM)=.TRUE. + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: CHARACTER DATA EXPECTED.') + 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('SCRDRV: CHARACTER DATA EXPECTED.') + DO 50 I=1,NPAR + IF(TEXT12.EQ.PARKEY(I)) THEN + IPAR=I + GO TO 60 + ENDIF + 50 CONTINUE + CALL XABORT('SCRDRV: PARAMETER '//TEXT12//' NOT FOUND.') + 60 IF(HCUBIC.EQ.'LINEAR') THEN + LCUB2(IPAR)=.FALSE. + ELSE IF(HCUBIC.EQ.'CUBIC') THEN + LCUB2(IPAR)=.TRUE. + ENDIF + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('SCRDRV: MAXVAL OVERFL' + 1 //'OW.') + WRITE(RECNAM,'(''pval'',I8)') IPAR + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMLEN(LPSAP,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0) THEN + WRITE(HSMG,'(25HSCRDRV: GLOBAL PARAMETER ,A,9H NOT SET.)') + 1 PARKEY(IPAR) + CALL XABORT(HSMG) + ENDIF + IF(PARFMT(IPAR).EQ.'ENTIER') THEN + IF(ITYPE.NE.1) CALL XABORT('SCRDRV: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('SCRDRV: INTEGER DATA EXPECTED.') + CALL LCMGET(LPSAP,RECNAM,VINTE) + DO 70 J=1,NVALUE(IPAR) + IF(VALI(IPAR).EQ.VINTE(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GO TO 10 + ENDIF + 70 CONTINUE + WRITE(HSMG,'(26HSCRDRV: INTEGER PARAMETER ,A,9H WITH VAL, + 1 2HUE,I5,30H NOT FOUND IN SAPHYB DATABASE.)') PARKEY(IPAR), + 2 VALI(IPAR) + CALL XABORT(HSMG) + ELSE IF(PARFMT(IPAR).EQ.'FLOTTANT') THEN + CALL REDGET(INDIC,NITMA,VALR(IPAR,1),TEXT12,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('SCRDRV: REAL DATA EXPECTED.') + VALR(IPAR,2)=VALR(IPAR,1) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.EQ.2) THEN + VALR(IPAR,2)=FLOTT + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + CALL LCMGET(LPSAP,RECNAM,VREAL) + IF(VALR(IPAR,1).EQ.VALR(IPAR,2)) THEN + DO 80 J=1,NVALUE(IPAR) + IF(ABS(VALR(IPAR,1)-VREAL(J)).LE.REPS*ABS(VREAL(J))) THEN + MUPLET(IPAR)=J + IF(ITYPE.NE.1) MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 20 + ENDIF + 80 CONTINUE + ENDIF + IF(VALR(IPAR,1).LT.VREAL(1)) THEN + WRITE(HSMG,'(23HSCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (<,E12.4,1H))') + 2 PARKEY(IPAR),VALR(IPAR,1),VREAL(1) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,2).GT.VREAL(NVALUE(IPAR))) THEN + WRITE(HSMG,'(23HSCRDRV: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,25H IS OUTSIDE THE DOMAIN (>,E12.4,1H))') + 2 PARKEY(IPAR),VALR(IPAR,1),VREAL(NVALUE(IPAR)) + CALL XABORT(HSMG) + ELSE IF(VALR(IPAR,1).GT.VALR(IPAR,2)) THEN + WRITE(HSMG,'(23HSCRDRV: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,1H.)') PARKEY(IPAR), + 2 VALR(IPAR,1),VALR(IPAR,2) + CALL XABORT(HSMG) + ENDIF + MUPLET(IPAR)=-1 + MUTYPE(IPAR)=ITYPE + GO TO 20 + ELSE IF(PARFMT(IPAR).EQ.'CHAINE') THEN + IF(ITYPE.NE.1) CALL XABORT('SCRDRV: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3) CALL XABORT('SCRDRV: STRING DATA EXPECTED.') + CALL LCMGTC(LPSAP,RECNAM,12,NVALUE(IPAR),VCHAR) + DO 90 J=1,NVALUE(IPAR) + IF(VALH(IPAR).EQ.VCHAR(J)) THEN + MUPLET(IPAR)=J + MUTYPE(IPAR)=ITYPE + GO TO 10 + ENDIF + 90 CONTINUE + WRITE(HSMG,'(25HSCRDRV: STRING PARAMETER ,A,10H WITH VALU, + 1 2HE ,A12,30H NOT FOUND IN SAPHYB DATABASE.)') PARKEY(IPAR), + 2 VALH(IPAR) + CALL XABORT(HSMG) + ELSE + CALL XABORT('SCRDRV: INVALID FORMAT='//PARFMT(IPAR)) + ENDIF + ELSE IF(TEXT12.EQ.'ENDMIX') THEN +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + IF(IMPX.GT.0) THEN + DO IPAR=1,NPAR + IF(PARFMT(IPAR).EQ.'FLOTTANT')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H SCRDRV: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H SCRDRV: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') PARKEY(IPAR) + ENDIF + ENDIF + ENDDO + ENDIF + IF(IBMOLD.GT.NMIL)CALL XABORT('SCRDRV: SAPHYB MIX OVERFLOW' + 1 //'(3).') + IF(IBM.GT.NMIX)CALL XABORT('SCRDRV: MIX OVERFLOW (MICROLIB).') + IF(NCAL.EQ.1) THEN + TERP(1,IBM)=1.0 + ELSE + CALL SCRTRP(IPSAP,LCUB2,IMPX,NVP,NPAR,NCAL,MUPLET,MUTYPE, + 1 VALR,0.0,TERP(1,IBM)) + ENDIF + IBM=0 + ELSE IF((TEXT12.EQ.'SAPHYB').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.'SAPHYB') ITER=1 + IF(TEXT12.EQ.'TABLE') ITER=2 + IF(TEXT12.EQ.'CHAIN') ITER=3 + DO 150 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 150 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('SCRDRV: MAXNIS OVERFLOW.') + IF(LDELTA(IBM)) THEN + SUM=0.0 + ELSE + SUM=1.0 + ENDIF + DO 140 ICAL=1,NCAL + SUM=SUM-TERP(ICAL,IBM) + 140 CONTINUE + IF(ABS(SUM).GT.1.0E-4) THEN + WRITE(HSMG,'(43HSCRDRV: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 150 CONTINUE + GO TO 160 + ELSE + CALL XABORT('SCRDRV: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GO TO 10 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 160 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H SCRDRV: INTERPOLATION FACTORS)') + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) THEN + WRITE(IOUT,170) ICAL,(TERP(ICAL,JBM),JBM=1,NMIX) + EXIT + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(LDELTA) + RETURN + 170 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/SCREIR.f b/Donjon/src/SCREIR.f new file mode 100644 index 0000000..d70a423 --- /dev/null +++ b/Donjon/src/SCREIR.f @@ -0,0 +1,267 @@ +*DECK SCREIR + SUBROUTINE SCREIR(NMDEPL,MY1,MY2,MD1,NEL,NOMIS,ADRY,NVTOT,VTOT, + > YLDS,DECAY,ITNAM,ITZEA,KPAX,BPAX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read depletion data on input file. Based on LIBEIR.f routine in +* DRAGON. +* +*Copyright: +* Copyright (C) 2014 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 +* NMDEPL names of reactions: +* NMDEPL(1)='DECAY'; NMDEPL(2)='NFTOT'; +* NMDEPL(3)='NG' ; NMDEPL(4)='N2N'; +* etc +* MY1 first dimension of matrix YLDS +* MY2 number of particularized fission products +* MD1 number of types of radioactive decay reactions +* NEL number of particularized isotopes including macro +* NOMIS names of isotopes in chain +* ADRY indices of fissile isotopes (positive values) and fission +* products (negative values) in array YLDS +* NVTOT number of Saphyb calls +* VTOT volume of updated core per Saphyb call +* YLDS fission yields +* DECAY radioactive decay constants +* +*Parameters: output +* ITNAM reactive isotope names in chain +* ITZEA 6-digit nuclide identifier +* atomic number z*10000 (digits) + mass number a*10 + +* energy state (0 = ground state, 1 = first state, etc.) +* KPAX complete reaction type matrix +* BPAX complete branching ratio matrix +* +*----------------------------------------------------------------------- +* +*---- +* INPUT FORMAT +*---- +* CHAIN +* [[ hnamson [ izea ] +* [ [[ reaction [energy] ]] ] +* [ { STABLE | +* FROM [[ { DECAY | reaction } +* [[ yield hnampar ]] ]] } ] +* ]] +* ENDCHAIN +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXR=12 + INTEGER MY1,MY2,MD1,NEL,ADRY(NEL),NVTOT,ITNAM(3,NEL), + > ITZEA(NEL),KPAX(NEL+MAXR,NEL) + CHARACTER NMDEPL(MAXR)*8,NOMIS(NEL)*8 + REAL BPAX(NEL+MAXR,NEL) + DOUBLE PRECISION VTOT(NVTOT),YLDS(MY1,MY2,NVTOT), + > DECAY(MD1,NEL,NVTOT) +*---- +* INPUT FILE PARAMETERS +*---- + CHARACTER TEXT12*12 + INTEGER KNADPL(2) + DOUBLE PRECISION DBLINP +*---- +* INTERNAL PARAMETERS +* KFISSP : FISSION PRODUCT FLAG = 2 (POSITION OF NFTOT IN NMDEPL) +*---- + INTEGER KFISSP + PARAMETER (KFISSP=2) + CHARACTER HSMG*131 + INTEGER INDIC,NITMA,I0,IEL,JEL,IDEPL,INTG,IREAC,ISOT,JREL,JDEPL, + > IY1,IY2,IV + REAL FLOTT,RRAT + DOUBLE PRECISION ZN,ZD +*---- +* READ LIST OF ISOTOPES AND PROPERTIES +*---- + DO 70 IY1=1,MY1 + IEL=0 + DO I0=1,NEL + IF(ADRY(I0).EQ.IY1) THEN +* IEL is a fissile isotope + IEL=I0 + ENDIF + ENDDO + IF(IEL.EQ.0) GO TO 70 + DO 60 IY2=1,MY2 + JEL=0 + DO I0=1,NEL + IF(-ADRY(I0).EQ.IY2) THEN +* JEL is a fission fragment + JEL=I0 + ENDIF + ENDDO + IF(JEL.EQ.0) GO TO 60 + KPAX(JEL,IEL)=KFISSP + ZN=0.0D0 + ZD=0.0D0 + DO IV=1,NVTOT + ZN=ZN+YLDS(IY1,IY2,IV)*VTOT(IV) + ZD=ZD+VTOT(IV) + ENDDO + BPAX(JEL,IEL)=REAL(ZN/ZD) + 60 CONTINUE + 70 CONTINUE + DO 100 IEL=1,NEL + TEXT12=' ' + TEXT12(:8)=NOMIS(IEL) + READ(TEXT12,'(3A4)') (ITNAM(I0,IEL),I0=1,3) + KPAX(NEL+1,IEL)=1 + BPAX(NEL+1,IEL)=0.0 + DO 80 I0=1,MD1 + ZN=0.0D0 + ZD=0.0D0 + DO IV=1,NVTOT + ZN=ZN+DECAY(I0,IEL,IV)*VTOT(IV) + ZD=ZD+VTOT(IV) + ENDDO + BPAX(NEL+1,IEL)=BPAX(NEL+1,IEL)+REAL(ZN/ZD)*1.0E8 + 80 CONTINUE + 100 CONTINUE + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DBLINP) + 105 IF(INDIC.NE.3) CALL XABORT('SCREIR: CHARACTER DATA EXPECTED') +*---- +* EXIT IF ENDCHAIN READ +*---- + IF(TEXT12.EQ.'ENDCHAIN') GO TO 190 +*---- +* ISOTOPE NAME READ +* IF NAME ALREADY EXISTS SELECT ISOTOPE NUMBER +* IF NAME NOT DEFINED ADD TO ISOTOPE LIST +*---- + IDEPL=0 + READ(TEXT12,'(2A4)') KNADPL(1),KNADPL(2) + DO 110 JEL=1,NEL + IF(KNADPL(1).EQ.ITNAM(1,JEL).AND. + > KNADPL(2).EQ.ITNAM(2,JEL)) THEN + IDEPL=JEL + GO TO 115 + ENDIF + 110 CONTINUE + WRITE(HSMG,'(16HSCREIR: ISOTOPE ,2A4,24H IS MISSING AMONG PARTIC, + > 35HULARIZED ISOTOPES OF THE SAPHYB(1).)') KNADPL(1),KNADPL(2) + CALL XABORT(HSMG) +*---- +* READ IZEA +*---- + 115 CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) + IF(INDIC.EQ.1) THEN + ITZEA(IDEPL)=INTG + CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) + ELSE + ITZEA(IDEPL)=0 + ENDIF +*---- +* LOOP OVER ALL PARAMETERS ASSOCIATED WITH SON ISOTOPES +*---- + 120 IF(INDIC.NE.3) CALL XABORT('SCREIR: REACTION TYPE EXPECTED FOR' + > //' ISOTOPE '//TEXT12) +*---- +* IF KEYWORD IS 'FROM' READ LIST OF PARENT NUCLIDES +*---- + IF(TEXT12.EQ.'FROM') THEN +*---- +* LOOP OVER ALL PARAMETERS ASSOCIATED WITH PARENT ISOTOPES +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DBLINP) + 130 IF(INDIC.NE.3) CALL XABORT('SCREIR: REACTION TYPE EXPECTED.') + DO 140 IREAC=1,MAXR + RRAT=1.0 +*---- +* TEST IF KEYWORD IS A REACTION +*---- + IF(TEXT12.EQ.NMDEPL(IREAC)) THEN +*---- +* READ LIST OF YIELD AND PARENT ISOTOPES +*---- + JDEPL=0 + DO 150 JEL=1,NEL +*---- +* IF YIELD ABSENT GO TO TEST FOR NEW REACTION TYPE +*---- + CALL REDGET(INDIC,ISOT,RRAT,TEXT12,DBLINP) + IF(INDIC.NE.2) GO TO 130 + CALL REDGET(INDIC,ISOT,FLOTT,TEXT12,DBLINP) + IF(INDIC.NE.3) + > CALL XABORT('SCREIR: ISOTOPE NAME hnampar MISSING') +*---- +* ISOTOPE NAME READ +* IF NAME ALREADY EXISTS SELECT ISOTOPE NUMBER +* IF NAME NOT DEFINED ADD TO ISOTOPE LIST +*---- + READ(TEXT12,'(2A4)') KNADPL(1),KNADPL(2) + DO 160 JREL=1,NEL + IF(KNADPL(1).EQ.ITNAM(1,JREL).AND. + > KNADPL(2).EQ.ITNAM(2,JREL)) THEN + JDEPL=JREL + GO TO 165 + ENDIF + 160 CONTINUE + WRITE(HSMG,'(16HSCREIR: ISOTOPE ,2A4,16H IS MISSING AMON, + > 43HG PARTICULARIZED ISOTOPES OF THE SAPHYB(2).)') + > KNADPL(1),KNADPL(2) + CALL XABORT(HSMG) + 165 KPAX(IDEPL,JDEPL)=IREAC + BPAX(IDEPL,JDEPL)=RRAT + 150 CONTINUE + CALL XABORT('SCREIR: TO MANY PARENT ISOTOPES') + ENDIF + 140 CONTINUE + ELSE IF(TEXT12.EQ.'STABLE') THEN + DO 141 IREAC=1,MAXR + IF(KPAX(NEL+IREAC,IDEPL).NE.0) KPAX(NEL+IREAC,IDEPL)=-9999 + 141 CONTINUE + DO 142 IEL=1,NEL + KPAX(IDEPL,IEL)=0 + 142 CONTINUE + CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) +*---- +* READ NEXT KEYWORD FOR THIS ISOTOPE +*---- + ELSE + DO 170 IREAC=1,MAXR + RRAT=0.0 + IF(TEXT12.EQ.NMDEPL(IREAC)) THEN + CALL REDGET(INDIC,ISOT,RRAT,TEXT12,DBLINP) + IF(INDIC.EQ.1) THEN + CALL XABORT('SCREIR: INVALID INTEGER') + ELSE IF(INDIC.EQ.2) THEN + CALL REDGET(INDIC,INTG,FLOTT,TEXT12,DBLINP) + ENDIF + KPAX(NEL+IREAC,IDEPL)=1 + BPAX(NEL+IREAC,IDEPL)=RRAT +*---- +* READ NEXT KEYWORD FOR THIS ISOTOPE +*---- + GO TO 120 + ENDIF + 170 CONTINUE + ENDIF + GO TO 105 +*---- +* FIND FISSION PRODUCTS +*---- + 190 DO 200 IEL=1,NEL + DO 210 JEL=1,NEL + IF(KPAX(JEL,IEL).EQ.KFISSP) KPAX(NEL+KFISSP,JEL)=-1 + 210 CONTINUE + 200 CONTINUE +*---- +* RETURN FROM SCREIR +*---- + RETURN + END diff --git a/Donjon/src/SCRFND.f b/Donjon/src/SCRFND.f new file mode 100644 index 0000000..2837fd3 --- /dev/null +++ b/Donjon/src/SCRFND.f @@ -0,0 +1,86 @@ +*DECK SCRFND + SUBROUTINE SCRFND(MAXISO,NBISOI,NBISO,INAME,IBM,HRESID,HUSE,HNAME, + > IMIX,JSO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Find the isotope index of an isotope in the microlib. +* +*Copyright: +* Copyright (C) 2017 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 +* MAXISO maximum number of isotopes in the microlib. +* NBISOI initial number of isotopes in the microlib. +* NBISO exact number of isotopes in the microlib. +* INAME name of an isotope. +* IBM mixture in which the isotope is present. +* HRESID character*8 name of the residual isotope in the Saphyb. +* HUSE alias names of microlib isotopes. +* HNAME reference name of microlib isotopes. +* IMIX full-core mixture belonging to each isotope. +* +*Parameters: output +* NBISO exact number of isotopes in the microlib. +* HUSE names of microlib isotopes. +* HNAME reference name of microlib isotopes. +* IMIX full-core mixture belonging to each isotope. +* JSO position of isotope INAME in isotope list. +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER MAXISO,NBISOI,NBISO,INAME(2),IBM,HUSE(3,MAXISO), + > HNAME(3,MAXISO),IMIX(MAXISO),JSO + CHARACTER HRESID*8 +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT4*4,TEXT8*8 + INTEGER IBLANK, I0, ISO, ISAVE + INTEGER IHRES(2) + SAVE IBLANK,IHRES,ISAVE + DATA TEXT4,TEXT8/' ','*MAC*RES'/ + DATA ISAVE/0/ +* + IF(ISAVE.EQ.0) THEN + READ(TEXT4,'(A4)') IBLANK + READ(TEXT8,'(2A4)') IHRES(1),IHRES(2) + ISAVE=1 + ENDIF +* + JSO=0 + DO ISO=1,NBISOI + IF(IMIX(ISO).NE.IBM) CYCLE + IF((INAME(1).EQ.HUSE(1,ISO)).AND.(INAME(2).EQ.HUSE(2,ISO))) THEN + JSO=ISO + RETURN + ENDIF + ENDDO + NBISO=NBISO+1 + IF(NBISO.GT.MAXISO) CALL XABORT('SCRFND: MAXISO OVERFLOW.') + JSO=NBISO + HUSE(1,JSO)=INAME(1) + HUSE(2,JSO)=INAME(2) + HUSE(3,JSO)=IBLANK + IF((INAME(1).EQ.IHRES(1)).AND.(INAME(2).EQ.IHRES(2))) THEN + READ(HRESID,'(2A4)') (HNAME(I0,JSO),I0=1,2) + ELSE + HNAME(1,JSO)=INAME(1) + HNAME(2,JSO)=INAME(2) + ENDIF + HNAME(3,JSO)=IBLANK + IMIX(JSO)=IBM + RETURN + END diff --git a/Donjon/src/SCRISO.f b/Donjon/src/SCRISO.f new file mode 100644 index 0000000..dc381e8 --- /dev/null +++ b/Donjon/src/SCRISO.f @@ -0,0 +1,269 @@ +*DECK SCRISO + SUBROUTINE SCRISO(IPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS,SIGS, + > SS2D,TAUXFI,LXS,LAMB,CHIRS,BETAR,INVELS,INAME,LSTRD,LPURE,ILUPS, + > ITRANC,IFISS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store an isotopic data recovered from a Saphyb into a Microlib. +* +*Copyright: +* Copyright (C) 2012 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 +* IPLIB address of the output microlib LCM object +* NREA number of reactions in the Saphyb object +* NGRP number of energy groups +* NL maximum Legendre order (NL=1 is for isotropic scattering) +* NPRC number of delayed neutron precursor groups +* NOMREA names of reactions in the Saphyb +* NWT0 average flux +* XS cross sections per reaction +* SIGS scattering cross sections +* SS2D complete scattering matrix +* TAUXFI interpolated fission rate +* LXS existence flag of each reaction +* LAMB decay constants of the delayed neutron precursor groups +* CHIRS delayed neutron emission spectrums +* BETAR delayed neutron fractions +* INVELS group-average of the inverse neutron velocity +* INAME name of the isotope. +* LSTRD flag set to .true. if B2=0.0. +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* +*Parameters: output +* ITRANC transport correction flag +* IFISS fission flag +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB + INTEGER NREA,NGRP,NL,NPRC,INAME(2),ILUPS,ITRANC,IFISS + REAL NWT0(NGRP),XS(NGRP,NREA),SIGS(NGRP,NL),SS2D(NGRP,NGRP,NL), + > TAUXFI,LAMB(NPRC),CHIRS(NGRP,NPRC),BETAR(NPRC),INVELS(NGRP) + LOGICAL LXS(NREA),LSTRD,LPURE + CHARACTER NOMREA(NREA)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER I0, IGFROM, IGMAX, IGMIN, IGR, JGR, IGTO, ILEG, IPRC, + & IREA, NXSCMP, IL, IRENT0,IRENT1 + REAL FF,CSCAT + LOGICAL LDIFF,LZERO + CHARACTER TEXT12*12 + CHARACTER HCM(0:10)*2,NAMLEG*2 + INTEGER, ALLOCATABLE, DIMENSION(:) :: ITYPRO,NJJ,IJJ + REAL, ALLOCATABLE, DIMENSION(:) :: STRD,WRK,XSSCMP + DATA HCM /'00','01','02','03','04','05','06','07','08','09','10'/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(STRD(NGRP)) +*---- +* UP-SCATTERING CORRECTION +*---- + IF(ILUPS.EQ.1) THEN + IRENT0=0 + IRENT1=0 + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'TOTALE') IRENT0=IREA + IF(NOMREA(IREA).EQ.'TOTALE P1') IRENT1=IREA + ENDDO + IF(IRENT0.EQ.0) CALL XABORT('SCRISO: MISSING NTOT0.') + DO JGR=2,NGRP + DO IGR=1,JGR-1 ! IGR < JGR + CSCAT=SS2D(IGR,JGR,1) + FF=NWT0(JGR)/NWT0(IGR) + XS(IGR,IRENT0)=XS(IGR,IRENT0)-CSCAT*FF + XS(JGR,IRENT0)=XS(JGR,IRENT0)-CSCAT + IF((IRENT1.GT.0).AND.(NL.GT.1)) THEN + CSCAT=SS2D(IGR,JGR,2) + XS(IGR,IRENT1)=XS(IGR,IRENT1)-CSCAT*FF + XS(JGR,IRENT1)=XS(JGR,IRENT1)-CSCAT + ENDIF + DO IL=1,NL + CSCAT=SS2D(IGR,JGR,IL) + SIGS(IGR,IL)=SIGS(IGR,IL)-CSCAT*FF + SIGS(JGR,IL)=SIGS(JGR,IL)-CSCAT + SS2D(JGR,IGR,IL)=SS2D(JGR,IGR,IL)-CSCAT*FF + SS2D(IGR,JGR,IL)=0.0 + ENDDO + ENDDO + ENDDO + ENDIF +*---- +* BUILD MICROLIB +*---- + WRITE(TEXT12,'(2A4)') (INAME(I0),I0=1,2) + CALL LCMPTC(IPLIB,'ALIAS',12,TEXT12) + CALL LCMPUT(IPLIB,'NWT0',NGRP,2,NWT0) + IF(NPRC.GT.0) THEN + CALL LCMPUT(IPLIB,'LAMBDA-D',NPRC,2,LAMB) + CALL LCMPUT(IPLIB,'OVERV',NGRP,2,INVELS) + ENDIF + ITRANC=0 + IFISS=0 + LDIFF=.FALSE. + STRD(:NGRP)=0.0 + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + LZERO=.TRUE. + DO IGR=1,NGRP + LZERO=LZERO.AND.(XS(IGR,IREA).EQ.0.0) + ENDDO + IF(LZERO) CYCLE + IF(NOMREA(IREA).EQ.'TOTALE') THEN + IF(LSTRD) THEN + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)+XS(IGR,IREA) + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'NTOT0',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'TOTALE P1') THEN + CALL LCMPUT(IPLIB,'NTOT1',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'EXCESS') THEN +* correct scattering XS with excess XS + DO IGR=1,NGRP + SIGS(IGR,1)=SIGS(IGR,1)+XS(IGR,IREA) + ENDDO + CALL LCMPUT(IPLIB,'N2N',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'FISSION') THEN + CALL LCMPUT(IPLIB,'NFTOT',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'ABSORPTION') THEN + CALL LCMPUT(IPLIB,'NG',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'SPECTRE') THEN + IF(.NOT.LPURE) THEN + DO IGR=1,NGRP + IF(XS(IGR,IREA).NE.0.0) THEN + XS(IGR,IREA)=XS(IGR,IREA)/TAUXFI + ENDIF + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'CHI',NGRP,2,XS(1,IREA)) + DO IPRC=1,NPRC + WRITE(TEXT12,'(A3,I2.2)') 'CHI',IPRC + CALL LCMPUT(IPLIB,TEXT12,NGRP,2,CHIRS(1,IPRC)) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'NU*FISSION') THEN + IFISS=1 + CALL LCMPUT(IPLIB,'NUSIGF',NGRP,2,XS(1,IREA)) + IF(NPRC.GT.0) THEN + ALLOCATE(WRK(NGRP)) + DO IPRC=1,NPRC + DO IGR=1,NGRP + WRK(IGR)=XS(IGR,IREA)*BETAR(IPRC) + ENDDO + WRITE(TEXT12,'(A6,I2.2)') 'NUSIGF',IPRC + CALL LCMPUT(IPLIB,TEXT12,NGRP,2,WRK) + ENDDO + DEALLOCATE(WRK) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'ENERGIE') THEN + ALLOCATE(WRK(NGRP)) + DO IGR=1,NGRP + WRK(IGR)=XS(IGR,IREA)*1.0E6 ! convert MeV to eV + ENDDO + CALL LCMPUT(IPLIB,'H-FACTOR',NGRP,2,WRK) + DEALLOCATE(WRK) + ELSE IF(NOMREA(IREA).EQ.'SELF') THEN + CALL LCMPUT(IPLIB,'SIGW00',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'TRANSP-CORR') THEN + ITRANC=2 + IF(LSTRD) THEN + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)-XS(IGR,IREA) + ENDDO + ENDIF + CALL LCMPUT(IPLIB,'TRANC',NGRP,2,XS(1,IREA)) + ELSE IF(NOMREA(IREA).EQ.'FUITES') THEN + LDIFF=LSTRD + IF(.NOT.LSTRD) THEN + DO IGR=1,NGRP + LDIFF=LDIFF.OR.(XS(IGR,IREA).NE.0.0) + STRD(IGR)=XS(IGR,IREA) + ENDDO + ENDIF + ELSE IF(NOMREA(IREA).EQ.'DIFFUSION') THEN + CYCLE + ELSE IF(NOMREA(IREA).EQ.'TRANSFERT') THEN + CYCLE + ELSE + CALL LCMPUT(IPLIB,NOMREA(IREA),NGRP,2,XS(1,IREA)) + ENDIF + ENDDO + IF(LSTRD) THEN + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + DO IGR=1,NGRP + STRD(IGR)=STRD(IGR)-SIGS(IGR,2) + ENDDO + ENDIF + ELSE + DO IGR=1,NGRP + STRD(IGR)=1.0/(3.0*STRD(IGR)) + ENDDO + ENDIF + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + ITRANC=2 + CALL LCMPUT(IPLIB,'TRANC',NGRP,2,SIGS(1,2)) + ENDIF + IF(LDIFF.OR.LSTRD) CALL LCMPUT(IPLIB,'STRD',NGRP,2,STRD) +*---- +* SAVE SCATTERING VECTORS AND MATRICES (DO NOT USE XDRLGS TO SAVE CPU +* TIME) +*---- + ALLOCATE(NJJ(NGRP),IJJ(NGRP),XSSCMP(NGRP*NGRP),ITYPRO(NL)) + DO ILEG=1,NL + IF(ILEG.LE.11) THEN + NAMLEG=HCM(ILEG-1) + ELSE + WRITE(NAMLEG,'(I2.2)') ILEG-1 + ENDIF + CALL LCMPUT(IPLIB,'SIGS'//NAMLEG,NGRP,2,SIGS(1,ILEG)) + NXSCMP=0 + DO IGTO=1,NGRP + IGMIN=IGTO + IGMAX=IGTO + DO IGFROM=1,NGRP + IF(SS2D(IGTO,IGFROM,ILEG).NE.0.0) THEN + IGMIN=MIN(IGMIN,IGFROM) + IGMAX=MAX(IGMAX,IGFROM) + ENDIF + ENDDO + IJJ(IGTO)=IGMAX + NJJ(IGTO)=IGMAX-IGMIN+1 + DO IGFROM=IGMAX,IGMIN,-1 + NXSCMP=NXSCMP+1 + XSSCMP(NXSCMP)=SS2D(IGTO,IGFROM,ILEG) + ENDDO + ENDDO + CALL LCMPUT(IPLIB,'NJJS'//NAMLEG,NGRP,1,NJJ) + CALL LCMPUT(IPLIB,'IJJS'//NAMLEG,NGRP,1,IJJ) + CALL LCMPUT(IPLIB,'SCAT'//NAMLEG,NXSCMP,2,XSSCMP) + ITYPRO(ILEG)=1 + ENDDO + CALL LCMPUT(IPLIB,'SCAT-SAVED',NL,1,ITYPRO) + DEALLOCATE(ITYPRO,XSSCMP,IJJ,NJJ) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(STRD) + RETURN + END diff --git a/Donjon/src/SCRLIB.f b/Donjon/src/SCRLIB.f new file mode 100644 index 0000000..5b98de3 --- /dev/null +++ b/Donjon/src/SCRLIB.f @@ -0,0 +1,1052 @@ +*DECK SCRLIB + SUBROUTINE SCRLIB(MAXNIS,MAXISO,IPLIB,IPMEM,IACCS,NMIX,NGRP,IMPX, + 1 HEQUI,HMASL,NCAL,ITER,MY1,MY2,MD1,MD2,TERP,NISO,LISO,HISO,CONC, + 2 ITODO,MIXC,LRES,LPURE,ILUPS,B2,VTOT,YLDS,DECAYC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the Microlib by scanning the NCAL elementary calculations in +* a Saphyb and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* MAXNIS maximum value of NISO(I) in user data. +* MAXISO maximum allocated space for output Microlib TOC information. +* IPLIB address of the output Microlib LCM object. +* IPMEM pointer to the memory-resident Saphyb object. +* IACCS =0 Microlib is created; =1 ... is updated. +* NMIX maximum number of material mixtures in the Microlib. +* NGRP number of energy groups. +* 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 Saphyb. +* ITER completion flag (=0: compute the macrolib). +* MY1 number of fissile isotopes including macroscopic sets. +* MY2 number of fission fragment. +* MD1 number of types of radioactive decay reactions. +* MD2 number of particularized isotopes including macro. +* 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 Saphyb value is +* used. +* ITODO non-depletion mask (=1 to force a user-selected isotope to be +* non-depleting) +* MIXC mixture index in the Saphyb corresponding to each Microlib +* mixture. Equal to zero if a Microlib mixture is not updated. +* LRES =.true. if the interpolation is done without updating isotopic +* densities +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* B2 buckling +* VTOT volume of updated core. +* YLDS fission yields. +* DECAYC radioactive decay constants. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,IPMEM + INTEGER MAXNIS,MAXISO,IACCS,NMIX,NGRP,IMPX,NCAL,ITER,MY1,MY2,MD1, + 1 MD2,NISO(NMIX),HISO(2,NMIX,MAXNIS),ITODO(NMIX,MAXNIS),MIXC(NMIX), + 2 ILUPS + REAL TERP(NCAL,NMIX),CONC(NMIX,MAXNIS),B2 + DOUBLE PRECISION VTOT,YLDS(MY1,MY2),DECAYC(MD1,MD2) + LOGICAL LISO(NMIX),LRES,LPURE + CHARACTER HEQUI*4,HMASL*4 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXLOC=10 + INTEGER, PARAMETER::MAXDIV=3 + INTEGER, PARAMETER::MAXMAC=2 + INTEGER, PARAMETER::MAXREA=50 + INTEGER, PARAMETER::NSTATE=40 + TYPE(C_PTR) JPLIB,KPLIB,JPMEM,KPMEM,LPMEM,MPMEM + REAL B2SAP, FACT0, WEIGHT + INTEGER I, I0, IAD, IBM, IBMOLD, ICAL, ID1, IED2, IFISS, IGR, + & ILENG, ILOC, ILONG, IMAC, IOF, IPRC, IREA, IREAF, IRES, IS2, + & ISO, ISOKEP, ITRANC, ITSTMP, ITYLCM, IY1, IY2, JSIGS, JSO, + & JSS2D, JXS, KSO, KSO1, LMY1, LSO, MAXMIX, NADRX, NBISO, NBISO1, + & NBISO2, NBISO2I, NBS1, NCALS, NDATAP, NDATAX, NED2, NISF, NISOP, + & NISOT2, NISOTS, NISP, NL, NLAM, NLOC, NMAC, NMIL, NPARL, NPR, + & NPRC, NREA, NSURFD, NVDIV + CHARACTER TEXT12*12,HSMG*131,HVECT2(MAXREA)*8,NOMREA(MAXREA)*12, + 1 LOCTYP(MAXLOC)*4,LOCKEY(MAXLOC)*4,IDVAL(MAXDIV)*4,HHISO*8, + 2 NOMMAC(MAXMAC)*8,HRESID*8,HNISO*12 + INTEGER ISTATE(NSTATE),DIMSAP(50),INAME(2),IHRES(2) + REAL VALDIV(MAXDIV),TMPDAY(3) + LOGICAL LUSER,LSPH,LMASL,LSTRD +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMIX2,ITOTM,IRESM,IADRX, + 1 ISOTS,LOCAD,ISADRX,LENGDX,LENGDP,IDATA,ISONA,ISOMI,ITOD2,ISTY1, + 2 ISTY2,IPIFI,IMICR,ITOD1,JJSO,IPYMIX + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: INOMIS,HUSE2,HNAM2,IPYNAM + REAL, ALLOCATABLE, DIMENSION(:) :: DENS2,DENS3,VOL2,VOLMI2,SPH, + 1 ENER,XVOLM,CONCE,TAUXFI,NWT0,SIGS,SS2D,XS,RVALO,FLUXS,RDATA, + 2 SIGSB,SS2DB,XSB,DENIS,GAR1,GAR2,LAMB,CHIRS,BETAR,INVELS,CHIRSB, + 3 BETARB,INVELSB,SURF,FMASL + REAL, ALLOCATABLE, DIMENSION(:,:) :: DENS1,FACT,YLDS2,DECAY2, + 1 SURFLX + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: DENS0,FLUX,ADF2 + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: YLDSM + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LXS,MASK,MASKL + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF +*---- +* RECOVER THE NUMBER OF DISCONTINUITY FACTORS +*---- + NSURFD=0 + CALL LCMSIX(IPMEM,'geom',1) + CALL LCMLEN(IPMEM,'outgeom',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(IPMEM,'outgeom',1) + CALL LCMLEN(IPMEM,'SURF',NSURFD,ITYLCM) + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(42H SCRLIB: number of discontinuity factors =, + 1 I4/)') NSURFD + ENDIF + CALL LCMSIX(IPMEM,' ',2) + ENDIF + CALL LCMSIX(IPMEM,' ',2) +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IMIX2(MAXISO),ITOD2(MAXISO),ISTY1(MAXISO),ISTY2(MAXISO), + 1 HUSE2(3,MAXISO),HNAM2(3,MAXISO)) + ALLOCATE(DENS2(MAXISO),DENS3(MAXISO),VOL2(MAXISO),VOLMI2(NMIX), + 1 FLUX(NMIX,NGRP,2),SPH(NGRP),FMASL(NMIX)) + ALLOCATE(HADF(NSURFD),ADF2(NMIX,NGRP,NSURFD)) +*---- +* MICROLIB INITIALIZATION +*---- + VOLMI2(:NMIX)=0.0 + DENS2(:MAXISO)=0.0 + VOL2(:MAXISO)=0.0 + IMIX2(:MAXISO)=0 + ITOD2(:MAXISO)=0 + ISTY2(:MAXISO)=0 + IF(IACCS.EQ.0) THEN + IF(LRES) CALL XABORT('SCRLIB: RES OPTION IS INVALID.') + NBISO2=0 + NED2=0 + TEXT12='L_LIBRARY' + CALL LCMPTC(IPLIB,'SIGNATURE',12,TEXT12) + ELSE + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NMIX) CALL XABORT('SCRLIB: INVALID NUMBER OF ' + 1 //'MATERIAL MIXTURES IN THE MICROLIB.') + IF(ISTATE(3).NE.NGRP) CALL XABORT('SCRLIB: INVALID NUMBER OF ' + 1 //'ENERGY GROUPS IN THE MICROLIB.') + NBISO2=ISTATE(2) + IF(NBISO2.GT.MAXISO) CALL XABORT('SCRLIB: MAXISO OVERFLOW(1).') + NED2=ISTATE(13) + IF(NED2.GT.MAXREA) CALL XABORT('SCRLIB: MAXREA OVERFLOW(1).') + CALL LCMLEN(IPLIB,'MIXTURESVOL',ILONG,ITYLCM) + IF(ILONG.GT.0) THEN + CALL LCMGET(IPLIB,'MIXTURESVOL',VOLMI2) + ELSE + VOLMI2(:NMIX)=0.0 + ENDIF + CALL LCMGET(IPLIB,'ISOTOPESUSED',HUSE2) + CALL LCMGET(IPLIB,'ISOTOPERNAME',HNAM2) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS2) + CALL LCMGET(IPLIB,'ISOTOPESVOL',VOL2) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX2) + CALL LCMGET(IPLIB,'ISOTOPESTODO',ITOD2) + CALL LCMGET(IPLIB,'ISOTOPESTYPE',ISTY2) + IF(NED2.GT.0) CALL LCMGTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + IF(NSURFD.GT.0) THEN + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMLEN(IPLIB,'ADF',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPLIB) + CALL XABORT('SCRLIB: UNABLE TO FIND DIRECTORY ADF.') + ENDIF + CALL LCMSIX(IPLIB,'ADF',1) + CALL LCMGTC(IPLIB,'HADF',8,NSURFD,HADF) + DO I=1,NSURFD + CALL LCMGET(IPLIB,HADF(I),ADF2(1,1,I)) + ENDDO + CALL LCMSIX(IPLIB,' ',2) + CALL LCMSIX(IPLIB,' ',2) + ENDIF + ENDIF +*---- +* RECOVER SAPHYB CHARACTERISTICS +*---- + CALL LCMLEN(IPMEM,'DIMSAP',ILENG,ITYLCM) + IF(ILENG.EQ.0) CALL XABORT('SCRLIB: INVALID SAPHYB.') + CALL LCMGET(IPMEM,'DIMSAP',DIMSAP) + IF(NGRP.NE.DIMSAP(20)) THEN + CALL XABORT('SCRLIB: INVALID VALUE OF NGRP.') + ENDIF + NLAM=DIMSAP(3) ! number of radioactive decay reactions + NREA=DIMSAP(4) ! number of neutron-induced reactions + NISOP=DIMSAP(5) ! number of particularized isotopes + NMAC=DIMSAP(6) ! number of macroscopic sets + NMIL=DIMSAP(7) ! number of mixtures in the Saphyb + NPARL=DIMSAP(11) ! number of local variables + NADRX=DIMSAP(18) ! number of address sets + NCALS=DIMSAP(19) ! number of elementary calculations in the Saphyb + NPRC=DIMSAP(31) ! number of delayed neutron precursor groups + NISOTS=DIMSAP(32) ! maximum number of isotopes in output tables + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(30H SCRLIB: number of reactions =,I3)') NREA + WRITE(IOUT,'(46H SCRLIB: number of radioactive decay reactions, + 1 2H =,I3)') NLAM + WRITE(IOUT,'(46H SCRLIB: number of neutron-induced reactions =, + 1 I3)') NREA + WRITE(IOUT,'(44H SCRLIB: number of particularized isotopes =, + 1 I4)') NISOP + WRITE(IOUT,'(37H SCRLIB: number of macroscopic sets =,I2)') NMAC + WRITE(IOUT,'(29H SCRLIB: number of mixtures =,I5)') NMIL + WRITE(IOUT,'(36H SCRLIB: number of local variables =,I4)') NPARL + WRITE(IOUT,'(33H SCRLIB: number of address sets =,I4)') NADRX + WRITE(IOUT,'(33H SCRLIB: number of calculations =,I7)') NCALS + WRITE(IOUT,'(34H SCRLIB: number of energy groups =,I4)') NGRP + WRITE(IOUT,'(37H SCRLIB: number of precursor groups =,I4)') NPRC + WRITE(IOUT,'(46H SCRLIB: maximum number of isotopes in output , + 1 8Htables =,I4)') NISOTS + ENDIF + IF(NREA.GT.MAXREA) CALL XABORT('SCRLIB: MAXREA OVERFLOW(2)') + IF(NMAC.GT.MAXMAC) CALL XABORT('SCRLIB: MAXMAC OVERFLOW') +*---- +* RECOVER INFORMATION FROM constphysiq DIRECTORY. +*---- + ALLOCATE(ENER(NGRP+1)) + CALL LCMSIX(IPMEM,'constphysiq',1) + CALL LCMGET(IPMEM,'ENRGS',ENER) + CALL LCMSIX(IPMEM,' ',2) + DO IGR=1,NGRP+1 + ENER(IGR)=ENER(IGR)/1.0E-6 + ENDDO + CALL LCMPUT(IPLIB,'ENERGY',NGRP+1,2,ENER) + DO IGR=1,NGRP + ENER(IGR)=LOG(ENER(IGR)/ENER(IGR+1)) + ENDDO + CALL LCMPUT(IPLIB,'DELTAU',NGRP,2,ENER) + DEALLOCATE(ENER) +*---- +* RECOVER INFORMATION FROM contenu DIRECTORY. +*---- + ALLOCATE(ITOTM(NMIL),IRESM(NMIL)) + CALL LCMSIX(IPMEM,'contenu',1) + IREAF=0 + IF(NREA.GT.0) THEN + CALL LCMGTC(IPMEM,'NOMREA',12,NREA,NOMREA) + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(29H SCRLIB: Available reactions:/(1X,10A13))') + 1 (NOMREA(I),I=1,NREA) + ENDIF + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'NU*FISSION') THEN + IREAF=IREA + EXIT + ENDIF + ENDDO + ENDIF + CALL LCMGET(IPMEM,'TOTMAC',ITOTM) + CALL LCMGET(IPMEM,'RESMAC',IRESM) + ALLOCATE(INOMIS(2,NISOP+NMAC),JJSO(NISOP+NMAC)) + NBISO1=NISOP + IF(NISOP.GT.0) CALL LCMGET(IPMEM,'NOMISO',INOMIS) + IF(NMAC.GT.0) THEN + CALL LCMLEN(IPMEM,'NOMMAC',ILONG,ITYLCM) + IF(ILONG.GT.2*MAXMAC) CALL XABORT('SCRLIB: MAXMAC OVERFLOW') + CALL LCMGTC(IPMEM,'NOMMAC',8,NMAC,NOMMAC) + HHISO='*MAC*RES' + NBISO1=NBISO1+1 + READ(HHISO,'(2A4)') (INOMIS(I0,NBISO1),I0=1,2) + ENDIF + CALL LCMSIX(IPMEM,' ',2) + IF(NBISO1.EQ.0) CALL XABORT('SCRLIB: NO CROSS SECTIONS FOUND.') + IF(NBISO1.GT.MAXISO) CALL XABORT('SCRLIB: MAXISO OVERFLOW(2).') +*---- +* RECOVER INFORMATION FROM adresses DIRECTORY. +*---- + NL=0 + IF(NADRX.GT.0) THEN + ALLOCATE(IADRX((NREA+2)*(NISOP+NMAC)*NADRX)) + CALL LCMSIX(IPMEM,'adresses',1) + CALL LCMGET(IPMEM,'ADRX',IADRX) + CALL LCMSIX(IPMEM,' ',2) + DO IAD=1,NADRX + DO ISO=1,NISOP+NMAC + IOF=(NREA+2)*(NISOP+NMAC)*(IAD-1)+(NREA+2)*(ISO-1)+NREA+1 + NL=MAX(NL,IADRX(IOF)) + IOF=(NREA+2)*(NISOP+NMAC)*(IAD-1)+(NREA+2)*(ISO-1)+NREA+2 + NL=MAX(NL,IADRX(IOF)) + ENDDO + ENDDO + ENDIF + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(36H SCRLIB: number of Legendre orders =,I4)') NL + ENDIF +*---- +* RECOVER INFORMATION FROM geom DIRECTORY. +*---- + CALL LCMSIX(IPMEM,'geom',1) + ALLOCATE(XVOLM(NMIL)) + CALL LCMGET(IPMEM,'XVOLMT',XVOLM) + ALLOCATE(SURFLX(NSURFD,NGRP),SURF(NSURFD)) + IF(NSURFD.GT.0) THEN + CALL LCMSIX(IPMEM,'outgeom',1) + CALL LCMGET(IPMEM,'SURF',SURF) + CALL LCMSIX(IPMEM,' ',2) + ENDIF + CALL LCMSIX(IPMEM,' ',2) +*---- +* LOOP OVER SAPHYB MIXTURES TO COMPUTE DENS0(NMIL,NCAL,NBISO1) +*---- + JPMEM=LCMGID(IPMEM,'calc') + ALLOCATE(DENS0(NMIL,NCAL,NBISO1)) + IF(NISOTS.GT.0) ALLOCATE(ISOTS(NISOTS*2)) + DENS0(:NMIL,:NCAL,:NBISO1)=0.0 + ALLOCATE(CONCE(NISOTS)) + DO 30 IBMOLD=1,NMIL + DO ICAL=1,NCAL + DO IBM=1,NMIX + IF((TERP(ICAL,IBM).NE.0.0).AND.(MIXC(IBM).EQ.IBMOLD)) GO TO 10 + ENDDO + CYCLE + 10 KPMEM=LCMGIL(JPMEM,ICAL) + CALL LCMSIX(KPMEM,'info',1) + CALL LCMGET(KPMEM,'NISOTS',NISOT2) + IF(NISOT2.GT.NISOTS) CALL XABORT('SCRLIB: NISOTS OVERFLOW.') + IF(NISOT2.GT.0) CALL LCMGET(KPMEM,'ISOTS',ISOTS) + CALL LCMSIX(KPMEM,' ',2) + LPMEM=LCMGID(KPMEM,'mili') + MPMEM=LCMGIL(LPMEM,IBMOLD) + IF(NISOT2.GT.0) THEN + CALL LCMGET(MPMEM,'CONCES',CONCE) + DO ISO=1,NISOP + INAME(1)=INOMIS(1,ISO) + INAME(2)=INOMIS(2,ISO) + DO IS2=1,NISOT2 + ISOKEP=IS2 + IF(INAME(1).NE.ISOTS(2*(IS2-1)+1)) CYCLE + IF(INAME(2).NE.ISOTS(2*(IS2-1)+2)) CYCLE + GO TO 20 + ENDDO + CYCLE + 20 DENS0(IBMOLD,ICAL,ISO)=CONCE(ISOKEP) + ENDDO + ENDIF + ENDDO + 30 CONTINUE + DEALLOCATE(CONCE) +*---- +* LOOP OVER MICROLIB MIXTURES +*---- + YLDS(:MY1,:MY2)=0.0D0 + DECAYC(:MD1,:MD2)=0.0D0 + VTOT=0.0D0 + DO 40 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.NE.0) VTOT=VTOT+XVOLM(IBMOLD) + 40 CONTINUE + ALLOCATE(YLDSM(MY1,MY2)) + ALLOCATE(ISADRX(NMIL),LENGDX(NMIL),LENGDP(NMIL),ITOD1(NBISO1)) + ALLOCATE(TAUXFI(NISOP+NMAC),NWT0(NGRP),SIGS(NGRP*NL*(NISOP+NMAC)), + 1 SS2D(NGRP*NGRP*NL*(NISOP+NMAC)),XS(NGRP*NREA*(NISOP+NMAC))) + ALLOCATE(LXS(NREA)) + ALLOCATE(LAMB(NPRC),CHIRS(NGRP*NPRC),BETAR(NPRC),INVELS(NGRP)) + LAMB(:NPRC)=0.0 + CHIRS(:NGRP*NPRC)=0.0 + BETAR(:NPRC)=0.0 + INVELS(:NGRP)=0.0 + FMASL(:NMIX)=0.0 + ALLOCATE(CHIRSB(NGRP*NPRC),BETARB(NPRC),INVELSB(NGRP)) + ALLOCATE(DENS1(NBISO1,NCAL),FACT(NBISO1,NCAL)) + JPLIB=LCMLID(IPLIB,'ISOTOPESLIST',(NISOP+NMAC)*NMIX) +* + DO 180 IBM=1,NMIX + IBMOLD=MIXC(IBM) + IF(IBMOLD.EQ.0) GO TO 180 + IF(NISO(IBM).GT.MAXNIS) CALL XABORT('SCRLIB: MAXNIS OVERFLOW.') + VOLMI2(IBM)=XVOLM(IBMOLD) + IMAC=ITOTM(IBMOLD) + IRES=IRESM(IBMOLD) +*---- +* RECOVER ITOD1(NBISO1) INDICES. +*---- + ITOD1(:NBISO1)=0 + DO 50 ISO=1,NBISO1 ! Saphyb isotope + INAME(1)=INOMIS(1,ISO) + INAME(2)=INOMIS(2,ISO) + DO KSO=1,NISO(IBM) ! user-selected isotope + IF((INAME(1).EQ.HISO(1,IBM,KSO)).AND. + 1 (INAME(2).EQ.HISO(2,IBM,KSO))) THEN + ITOD1(ISO)=ITODO(IBM,KSO) + GO TO 50 + ENDIF + ENDDO + 50 CONTINUE +*---- +* COMPUTE THE NUMBER DENSITIES OF EACH ELEMENTARY CALCULATION. +*---- + DENS1(:NBISO1,:NCAL)=0.0 + DENS3(:NBISO1)=0.0 + DO ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) CYCLE + DO ISO=1,NISOP + LUSER=.FALSE. + INAME(1)=INOMIS(1,ISO) + INAME(2)=INOMIS(2,ISO) + KSO1=0 + DO KSO=1,NISO(IBM) ! user-selected isotope + IF((INAME(1).EQ.HISO(1,IBM,KSO)).AND. + 1 (INAME(2).EQ.HISO(2,IBM,KSO))) THEN + KSO1=KSO + LUSER=(CONC(IBM,KSO1).NE.-99.99) + GO TO 60 + ENDIF + ENDDO + 60 IF(LUSER) THEN + DENS1(ISO,ICAL)=CONC(IBM,KSO1) + CYCLE + ENDIF + IF(.NOT.LISO(IBM)) CYCLE + DENS1(ISO,ICAL)=DENS0(IBMOLD,ICAL,ISO) + ENDDO + IF(NMAC.GT.0) DENS1(NISOP+1,ICAL)=1.0 + DO ISO=1,NBISO1 + DENS3(ISO)=DENS3(ISO)+WEIGHT*DENS1(ISO,ICAL) + ENDDO + ENDDO + FACT(:NBISO1,:NCAL)=1.0 + IF(.NOT.LPURE) THEN + DO ICAL=1,NCAL + IF(TERP(ICAL,IBM).EQ.0.0) CYCLE + DO ISO=1,NBISO1 + IF(DENS3(ISO).GT.DENS1(ISO,ICAL)*1.0E-9) THEN + FACT(ISO,ICAL)=DENS1(ISO,ICAL)/DENS3(ISO) + ENDIF + ENDDO + ENDDO + ENDIF +*---- +* INITIALIZE WORKING ARRAYS. +*---- + TAUXFI(:NBISO1)=0.0 + NWT0(:NGRP)=0.0 + SIGS(:NGRP*NL*NBISO1)=0.0 + SS2D(:NGRP*NGRP*NL*NBISO1)=0.0 + XS(:NGRP*NREA*NBISO1)=0.0 + LXS(:NREA)=.FALSE. + YLDSM(:MY1,:MY2)=0.0D0 +*---- +* MAIN LOOP OVER ELEMENTARY CALCULATIONS +*---- + TEXT12='*MAC*RES' + READ(TEXT12,'(2A4)') IHRES(1),IHRES(2) + LSTRD=.FALSE. + B2SAP=B2 + DO 80 ICAL=1,NCAL + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 80 +*---- +* RECOVER INFORMATION FROM caldir DIRECTORY. +*---- + KPMEM=LCMGIL(JPMEM,ICAL) + IF(NPRC.GT.0) THEN + CHIRSB(:NGRP*NPRC)=0.0 + BETARB(:NPRC)=0.0 + INVELSB(:NGRP)=0.0 + ENDIF + CALL LCMSIX(KPMEM,'info',1) + LSPH=.FALSE. + LMASL=.FALSE. + IF(NPARL.GT.0) THEN + CALL LCMGET(KPMEM,'NLOC',NLOC) + IF(NLOC.GT.MAXLOC) CALL XABORT('SCRLIB: MAXLOC OVERFLOW') + CALL LCMGTC(KPMEM,'LOCTYP',4,NLOC,LOCTYP) + CALL LCMGTC(KPMEM,'LOCKEY',4,NLOC,LOCKEY) + ALLOCATE(LOCAD(NLOC+1)) + CALL LCMGET(KPMEM,'LOCADR',LOCAD) + DO ILOC=1,NLOC + LSPH=LSPH.OR.((LOCTYP(ILOC).EQ.'EQUI').AND. + 1 (LOCKEY(ILOC).EQ.HEQUI)) + LMASL=LMASL.OR.((LOCTYP(ILOC).EQ.'MASL').AND. + 1 (LOCKEY(ILOC).EQ.HMASL)) + ENDDO + ENDIF + IF((HEQUI.NE.' ').AND.(.NOT.LSPH)) THEN + WRITE(HSMG,'(46HSCRLIB: UNABLE TO FIND A LOCAL PARAMETER SET O, + 1 25HF TYPE EQUI WITH KEYWORD ,A4,1H.)') HEQUI + CALL XABORT(HSMG) + ELSE IF((HMASL.NE.' ').AND.(.NOT.LMASL)) THEN + WRITE(HSMG,'(46HSCRLIB: UNABLE TO FIND A LOCAL PARAMETER SET O, + 1 25HF TYPE MASL WITH KEYWORD ,A4,1H.)') HMASL + CALL XABORT(HSMG) + ENDIF + CALL LCMGET(KPMEM,'ISADRX',ISADRX) + CALL LCMGET(KPMEM,'LENGDX',LENGDX) + CALL LCMGET(KPMEM,'LENGDP',LENGDP) + CALL LCMGET(KPMEM,'NISF',NISF) + IF(NISF+NMAC.NE.MY1) CALL XABORT('SCRLIB: MY1 ERROR') + CALL LCMGET(KPMEM,'NISP',NISP) + IF(NISP.NE.MY2) CALL XABORT('SCRLIB: MY2 ERROR') + CALL LCMGET(KPMEM,'NISOTS',NISOT2) + IF(NISOT2.GT.NISOTS) CALL XABORT('SCRLIB: NISOTS OVERFLOW.') + IF(NISOT2.GT.0) CALL LCMGET(KPMEM,'ISOTS',ISOTS) + CALL LCMSIX(KPMEM,' ',2) + CALL LCMSIX(KPMEM,'divers',1) + CALL LCMLEN(KPMEM,'NVDIV',ILENG,ITYLCM) + IF(ILENG.EQ.0) THEN + NVDIV=0 + ELSE + CALL LCMGET(KPMEM,'NVDIV',NVDIV) + ENDIF + IF(NVDIV.GT.0) THEN + IF(NVDIV.GT.MAXDIV) CALL XABORT('SCRLIB: MAXDIV OVERFLOW.') + CALL LCMGTC(KPMEM,'IDVAL',4,NVDIV,IDVAL) + CALL LCMGET(KPMEM,'VALDIV',VALDIV) + DO I=1,NVDIV + IF(IMPX.GT.3) THEN + WRITE(IOUT,'(9H SCRLIB: ,I3,2X,A,1H=,1P,E13.5)') I,IDVAL(I), + 1 VALDIV(I) + ENDIF + IF(IDVAL(I).EQ.'B2') B2SAP=VALDIV(I) + ENDDO + ENDIF +* + CALL LCMLEN(KPMEM,'NPR',ILONG,ITYLCM) + IF((NPRC.GT.0).AND.(ILONG.EQ.1)) THEN + CALL LCMGET(KPMEM,'NPR',NPR) + IF(NPR.NE.NPRC) CALL XABORT('SCRLIB: NPR INCONSISTENCY(1).') + CALL LCMGET(KPMEM,'LAMBRS',LAMB) + CALL LCMGET(KPMEM,'CHIRS',CHIRSB) + CALL LCMGET(KPMEM,'BETARS',BETARB) + CALL LCMGET(KPMEM,'INVELS',INVELSB) + ENDIF + CALL LCMSIX(KPMEM,' ',2) +*---- +* SELECT SAPHYB MIXTURE IBMOLD. +*---- + IF(NADRX.EQ.0) CALL XABORT('SCRLIB: NO ADDRESS SETS AVAILABLE.') + LPMEM=LCMGID(KPMEM,'mili') + MPMEM=LCMGIL(LPMEM,IBMOLD) + SPH(:NGRP)=1.0 + IF(LSPH) THEN + ALLOCATE(RVALO(LOCAD(NLOC+1)-1)) + CALL LCMGET(MPMEM,'RVALOC',RVALO) + DO ILOC=1,NLOC + IF((LOCTYP(ILOC).EQ.'EQUI').AND.(LOCKEY(ILOC).EQ.HEQUI)) THEN + IF(LOCAD(ILOC+1)-LOCAD(ILOC).NE.NGRP) THEN + CALL XABORT('SCRLIB: INVALID NUMBER OF COMPONENTS FOR ' + 1 //'SPH FACTORS') + ENDIF + DO IGR=1,NGRP + SPH(IGR)=RVALO(LOCAD(ILOC)+IGR-1) + ENDDO + ENDIF + ENDDO + DEALLOCATE(RVALO) + ENDIF + IF(LMASL) THEN + ALLOCATE(RVALO(LOCAD(NLOC+1)-1)) + CALL LCMGET(MPMEM,'RVALOC',RVALO) + DO ILOC=1,NLOC + IF((LOCTYP(ILOC).EQ.'MASL').AND.(LOCKEY(ILOC).EQ.HMASL)) + 1 THEN + IF(LOCAD(ILOC+1)-LOCAD(ILOC).NE.1) THEN + CALL XABORT('SCRLIB: INVALID NUMBER OF COMPONENTS FOR ' + 1 //'MASL') + ENDIF + FMASL(IBM)=FMASL(IBM)+WEIGHT*RVALO(LOCAD(ILOC)) + ENDIF + ENDDO + DEALLOCATE(RVALO) + ENDIF + IF(NPARL.GT.0) DEALLOCATE(LOCAD) + IAD=ISADRX(IBMOLD) + NDATAX=LENGDX(IBMOLD) + NDATAP=LENGDP(IBMOLD) + ALLOCATE(FLUXS(NGRP),RDATA(NDATAX),IDATA(NDATAP)) + CALL LCMGET(MPMEM,'FLUXS',FLUXS) + CALL LCMGET(MPMEM,'RDATAX',RDATA) + CALL LCMGET(MPMEM,'IDATAP',IDATA) + DO I=1,NGRP + FLUXS(I)=FLUXS(I)/XVOLM(IBMOLD) + NWT0(I)=NWT0(I)+WEIGHT*FLUXS(I)/SPH(I) + ENDDO + ALLOCATE(SIGSB(NGRP*NL),SS2DB(NGRP*NGRP*NL),XSB(NGRP*NREA)) + IF(NISOP.NE.0) THEN + DO ISO=1,NISOP + FACT0=FACT(ISO,ICAL) + JXS=(ISO-1)*NGRP*NREA + JSIGS=(ISO-1)*NGRP*NL + JSS2D=(ISO-1)*NGRP*NGRP*NL + CALL SPHSXS(NREA,NISOP+NMAC,NADRX,NGRP,NL,NDATAX,NDATAP, + 1 ISO,IAD,IADRX,RDATA,IDATA,NOMREA,SIGSB,SS2DB,XSB,LXS) + CALL SCRSXS(NGRP,NL,NREA,IREAF,NOMREA,LXS,B2SAP,FACT0, + 1 WEIGHT,SPH,FLUXS,XSB,SIGSB,SS2DB,LPURE,XS(JXS+1), + 2 SIGS(JSIGS+1),SS2D(JSS2D+1),TAUXFI(ISO)) + ENDDO + IF(IRES.NE.0) THEN + FACT0=1.0 + JXS=NISOP*NGRP*NREA + JSIGS=NISOP*NGRP*NL + JSS2D=NISOP*NGRP*NGRP*NL + CALL SPHSXS(NREA,NISOP+NMAC,NADRX,NGRP,NL,NDATAX,NDATAP, + 1 NISOP+IRES,IAD,IADRX,RDATA,IDATA,NOMREA,SIGSB,SS2DB,XSB,LXS) + CALL SCRSXS(NGRP,NL,NREA,IREAF,NOMREA,LXS,B2SAP,FACT0, + 1 WEIGHT,SPH,FLUXS,XSB,SIGSB,SS2DB,LPURE,XS(JXS+1), + 2 SIGS(JSIGS+1),SS2D(JSS2D+1),TAUXFI(NISOP+1)) + ENDIF + ELSE IF(IMAC.NE.0) THEN + FACT0=1.0 + JXS=NISOP*NGRP*NREA + JSIGS=NISOP*NGRP*NL + JSS2D=NISOP*NGRP*NGRP*NL + CALL SPHSXS(NREA,NISOP+NMAC,NADRX,NGRP,NL,NDATAX,NDATAP, + 1 NISOP+IMAC,IAD,IADRX,RDATA,IDATA,NOMREA,SIGSB,SS2DB,XSB,LXS) + CALL SCRSXS(NGRP,NL,NREA,IREAF,NOMREA,LXS,B2SAP,FACT0,WEIGHT, + 1 SPH,FLUXS,XSB,SIGSB,SS2DB,LPURE,XS(JXS+1),SIGS(JSIGS+1), + 2 SS2D(JSS2D+1),TAUXFI(NISOP+1)) + ELSE + CALL XABORT('SCRLIB: NO MACROSCOPIC SET.') + ENDIF + DEALLOCATE(XSB,SS2DB,SIGSB,IDATA,RDATA,FLUXS) +* + CALL LCMLEN(MPMEM,'cinetique',ILONG,ITYLCM) + IF((NPRC.GT.0).AND.(ILONG.NE.0)) THEN + CALL LCMSIX(MPMEM,'cinetique',1) + CALL LCMGET(MPMEM,'NPR',NPR) + IF(NPR.NE.NPRC) CALL XABORT('SCRLIB: NPR INCONSISTENCY(2).') + CALL LCMGET(MPMEM,'LAMBRS',LAMB) + CALL LCMGET(MPMEM,'CHIRS',CHIRSB) + CALL LCMGET(MPMEM,'BETARS',BETARB) + CALL LCMGET(MPMEM,'INVELS',INVELSB) + CALL LCMSIX(MPMEM,' ',2) + ENDIF + IF(NPRC.GT.0) THEN + DO IGR=1,NGRP + INVELS(IGR)=INVELS(IGR)+SPH(IGR)*WEIGHT*INVELSB(IGR) + DO IPRC=1,NPRC + IOF=(IPRC-1)*NGRP+IGR + CHIRS(IOF)=CHIRS(IOF)+WEIGHT*CHIRSB(IOF) + ENDDO + ENDDO + DO IPRC=1,NPRC + BETAR(IPRC)=BETAR(IPRC)+WEIGHT*BETARB(IPRC) + ENDDO + ENDIF +*---- +* COMPUTE DEPLETION CHAIN DATA +*---- + IF(MY1*MY2.GT.0) THEN + CALL LCMLEN(MPMEM,'YLDS',ILONG,ITYLCM) + IF(ILONG.NE.MY1*MY2) CALL XABORT('SCRLIB: BAD YLDS.') + ALLOCATE(YLDS2(MY1,MY2)) + CALL LCMGET(MPMEM,'YLDS',YLDS2) + DO IY1=1,MY1 + DO IY2=1,MY2 + YLDSM(IY1,IY2)=YLDSM(IY1,IY2)+WEIGHT*YLDS2(IY1,IY2) + YLDS(IY1,IY2)=YLDS(IY1,IY2)+WEIGHT*YLDS2(IY1,IY2)* + > VOLMI2(IBM)/VTOT + ENDDO + ENDDO + DEALLOCATE(YLDS2) + ENDIF + IF((MD1*MD2.GT.0).AND.(NISOT2.GT.0)) THEN + CALL LCMLEN(MPMEM,'DECAYC',ILONG,ITYLCM) + IF(ILONG.NE.NLAM*NISOT2) CALL XABORT('SCRLIB: BAD DECAYC.') + ALLOCATE(DECAY2(NLAM,NISOT2)) + CALL LCMGET(MPMEM,'DECAYC',DECAY2) + DO ISO=1,NISOP + INAME(1)=INOMIS(1,ISO) + INAME(2)=INOMIS(2,ISO) + DO IS2=1,NISOT2 + ISOKEP=IS2 + IF(INAME(1).NE.ISOTS(2*(IS2-1)+1)) CYCLE + IF(INAME(2).NE.ISOTS(2*(IS2-1)+2)) CYCLE + GO TO 70 + ENDDO + CYCLE + 70 DO ID1=1,NLAM + DECAYC(ID1,ISO)=DECAYC(ID1,ISO)+WEIGHT*DECAY2(ID1,ISOKEP)* + > VOLMI2(IBM)/VTOT + ENDDO + ENDDO + DEALLOCATE(DECAY2) + ENDIF + 80 CONTINUE ! end of loop over elementary calculations. +*---- +* IDENTIFY SPECIAL FLUX EDITS +*---- + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + IF(NOMREA(IREA).EQ.'TOTALE') CYCLE + IF(NOMREA(IREA).EQ.'TOTALE P1') CYCLE + IF(NOMREA(IREA).EQ.'EXCESS') CYCLE + IF(NOMREA(IREA).EQ.'SPECTRE') CYCLE + IF(NOMREA(IREA).EQ.'NU*FISSION') CYCLE + IF(NOMREA(IREA).EQ.'ENERGIE') CYCLE + IF(NOMREA(IREA).EQ.'SELF') CYCLE + IF(NOMREA(IREA).EQ.'TRANSP-CORR') CYCLE + IF(NOMREA(IREA).EQ.'FUITES') CYCLE + IF(NOMREA(IREA).EQ.'DIFFUSION') CYCLE + IF(NOMREA(IREA).EQ.'TRANSFERT') CYCLE + DO 90 IED2=1,NED2 + IF(HVECT2(IED2).EQ.NOMREA(IREA)(:8)) GO TO 100 + IF(HVECT2(IED2).EQ.'NFTOT') GO TO 100 + 90 CONTINUE + NED2=NED2+1 + IF(NED2.GT.MAXREA) CALL XABORT('SCRLIB: MAXREA OVERFLOW(3).') + IF(NOMREA(IREA).EQ.'FISSION') THEN + HVECT2(NED2)='NFTOT' + ELSE + HVECT2(NED2)=NOMREA(IREA)(:8) + ENDIF + 100 CONTINUE + ENDDO +*---- +* SET FLAG LSTRD +*---- + LSTRD=.TRUE. + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'FUITES') THEN + IF(LXS(IREA).AND.(B2SAP.NE.0.0)) LSTRD=.FALSE. + EXIT + ENDIF + ENDDO +*---- +* SAVE CROSS SECTIONS IN MICROLIB FOR MIXTURE IBM +*---- + ISTY1(:NBISO1)=0 + JJSO(:NBISO1)=0 + NBISO2I=NBISO2 + IF(NISOP.NE.0) THEN + HRESID=' ' + DO ISO=1,NISOP + JXS=(ISO-1)*NGRP*NREA + JSIGS=(ISO-1)*NGRP*NL + JSS2D=(ISO-1)*NGRP*NGRP*NL + INAME(1)=INOMIS(1,ISO) + INAME(2)=INOMIS(2,ISO) + CALL SCRFND(MAXISO,NBISO2I,NBISO2,INAME,IBM,HRESID,HUSE2, + 1 HNAM2,IMIX2,JJSO(ISO)) + KPLIB=LCMDIL(JPLIB,JJSO(ISO)) ! step up isot JJSO(ISO) + CALL SCRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS(JXS+1), + 1 SIGS(JSIGS+1),SS2D(JSS2D+1),TAUXFI(ISO),LXS,LAMB,CHIRS,BETAR, + 2 INVELS,INAME,LSTRD,LPURE,ILUPS,ITRANC,IFISS) + IF(MY1*MY2.GT.0) CALL SCRNDF(IMPX,NISOP+NMAC,ISO,IBM,INOMIS, + 1 IPMEM,KPLIB,NCAL,TERP(1,IBM),MY1,MY2,YLDSM,ISTY1(ISO)) + ENDDO + IF(IRES.NE.0) THEN + HRESID=NOMMAC(IRES) + JXS=NISOP*NGRP*NREA + JSIGS=NISOP*NGRP*NL + JSS2D=NISOP*NGRP*NGRP*NL + CALL SCRFND(MAXISO,NBISO2I,NBISO2,IHRES,IBM,HRESID,HUSE2, + 1 HNAM2,IMIX2,JJSO(NISOP+1)) + KPLIB=LCMDIL(JPLIB,JJSO(NISOP+1)) ! step up isot JJSO(NISOP+1) + CALL SCRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS(JXS+1), + 1 SIGS(JSIGS+1),SS2D(JSS2D+1),TAUXFI(NISOP+1),LXS,LAMB,CHIRS, + 2 BETAR,INVELS,IHRES,LSTRD,LPURE,ILUPS,ITRANC,IFISS) + IF(MY1*MY2.GT.0) CALL SCRNDF(IMPX,NISOP+NMAC,NISOP+IRES, + 1 IBM,INOMIS,IPMEM,KPLIB,NCAL,TERP(1,IBM),MY1,MY2,YLDSM, + 2 ISTY1(NISOP+IRES)) + ENDIF + ELSE IF(IMAC.NE.0) THEN + HRESID=NOMMAC(IMAC) + JXS=NISOP*NGRP*NREA + JSIGS=NISOP*NGRP*NL + JSS2D=NISOP*NGRP*NGRP*NL + CALL SCRFND(MAXISO,NBISO2I,NBISO2,IHRES,IBM,HRESID,HUSE2,HNAM2, + 1 IMIX2,JJSO(1)) + KPLIB=LCMDIL(JPLIB,JJSO(1)) ! step up isot JJSO(1) + CALL SCRISO(KPLIB,NREA,NGRP,NL,NPRC,NOMREA,NWT0,XS(JXS+1), + 1 SIGS(JSIGS+1),SS2D(JSS2D+1),TAUXFI(NISOP+1),LXS,LAMB,CHIRS, + 2 BETAR,INVELS,IHRES,LSTRD,LPURE,ILUPS,ITRANC,IFISS) + ENDIF +*---- +* SET NUMBER DENSITIES AND VOLUMES IN OUTPUT MICROLIB +*---- + IF(LRES) THEN +* -- Number densities are left unchanged except if they are +* -- listed in HISO array. + DO 110 KSO=1,NISO(IBM) ! user-selected isotope + DO JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).NE.IBM) CYCLE + IF((HISO(1,IBM,KSO).EQ.HUSE2(1,JSO)).AND. + 1 (HISO(2,IBM,KSO).EQ.HUSE2(2,JSO))) THEN + ITOD2(JSO)=ITODO(IBM,KSO) + IF(CONC(IBM,KSO).EQ.-99.99) THEN +* -- Only number densities of isotopes set with "MICR" and +* -- "*" keywords are interpolated + DENS2(JSO)=0.0 + DO ISO=1,NBISO1 ! Saphyb isotope + IF(JJSO(ISO).EQ.JSO) DENS2(JSO)=DENS2(JSO)+DENS3(ISO) + ENDDO + ELSE IF(CONC(IBM,KSO).NE.-99.99) THEN +* -- Number densities of isotopes set with "MICR" and +* -- fixed value are forced to this value + DENS2(JSO)=CONC(IBM,KSO) + ENDIF + GO TO 110 + ENDIF + ENDDO + WRITE(HSMG,'(31HSCRLIB: UNABLE TO FIND ISOTOPE ,2A4,6H IN MI, + 1 5HXTURE,I8,1H.)') HISO(1,IBM,KSO),HISO(2,IBM,KSO),IBM + CALL XABORT(HSMG) + 110 CONTINUE + ELSE +* -- Number densities are interpolated or not according to +* -- ALL/ONLY option + DO JSO=1,NBISO2 ! microlib isotope + IF(IBM.EQ.IMIX2(JSO)) THEN + DO ISO=1,NBISO1 ! Saphyb isotope + IF((INOMIS(1,ISO).EQ.HUSE2(1,JSO)).AND. + 1 (INOMIS(2,ISO).EQ.HUSE2(2,JSO))) THEN + DENS2(JSO)=0.0 + VOL2(JSO)=0.0 + CYCLE + ENDIF + ENDDO + ENDIF + ENDDO + DO 130 ISO=1,NBISO1 ! Saphyb isotope + INAME(1)=INOMIS(1,ISO) + INAME(2)=INOMIS(2,ISO) + IF(.NOT.LISO(IBM)) THEN +* --ONLY option + DO KSO=1,NISO(IBM) ! user-selected isotope + IF((INAME(1).EQ.HISO(1,IBM,KSO)).AND. + 1 (INAME(2).EQ.HISO(2,IBM,KSO))) GO TO 120 + ENDDO + GO TO 130 + ENDIF + 120 JSO=JJSO(ISO) + IF(JSO.GT.0) THEN + ITOD2(JSO)=ITOD1(ISO) + ISTY2(JSO)=ISTY1(ISO) + DENS2(JSO)=DENS2(JSO)+DENS3(ISO) + VOL2(JSO)=VOL2(JSO)+XVOLM(IBMOLD) + ENDIF + 130 CONTINUE + ENDIF +*---- +* SET PIFI INFORMATION +*---- + ALLOCATE(IMICR(NBISO1)) + IMICR(:NBISO1)=0 + NBS1=0 + DO 140 JSO=1,NBISO2 ! microlib isotope + IF(IMIX2(JSO).EQ.IBM) THEN + NBS1=NBS1+1 + IF(NBS1.GT.NBISO1) CALL XABORT('SCRLIB: NBISO1 OVERFLOW.') + IMICR(NBS1)=JSO + ENDIF + 140 CONTINUE + DO 170 ISO=1,NBS1 ! Saphyb isotope + JSO=IMICR(ISO) + KPLIB=LCMDIL(JPLIB,JSO) ! step up isot JSO + CALL LCMLEN(KPLIB,'PYIELD',LMY1,ITYLCM) + IF(LMY1.GT.0) THEN + ALLOCATE(IPYNAM(2,LMY1),IPYMIX(LMY1),IPIFI(LMY1)) + IPIFI(:LMY1)=0 + CALL LCMGET(KPLIB,'PYNAM',IPYNAM) + CALL LCMGET(KPLIB,'PYMIX',IPYMIX) + DO 160 IY1=1,LMY1 + INAME(1)=IPYNAM(1,IY1) + INAME(2)=IPYNAM(2,IY1) + WRITE(HNISO,'(2A4)') (INAME(I0),I0=1,2) + IF(HNISO.NE.' ') THEN + DO 150 KSO=1,NBS1 + LSO=IMICR(KSO) + IF((INAME(1).EQ.HUSE2(1,LSO)).AND.(INAME(2).EQ.HUSE2(2,LSO)) + 1 .AND.(IPYMIX(IY1).EQ.IMIX2(LSO))) THEN + IPIFI(IY1)=LSO + GO TO 160 + ENDIF + 150 CONTINUE + IF(IPIFI(IY1).EQ.0) THEN + WRITE(HSMG,'(40HSCRLIB: FAILURE TO FIND FISSILE ISOTOPE , + 1 A12,25H AMONG MICROLIB ISOTOPES.)') HNISO + CALL XABORT(HSMG) + ENDIF + ENDIF + 160 CONTINUE + CALL LCMPUT(KPLIB,'PIFI',LMY1,1,IPIFI) + DEALLOCATE(IPIFI,IPYMIX,IPYNAM) + ENDIF + 170 CONTINUE + DEALLOCATE(IMICR) + 180 CONTINUE ! end of loop over microlib mixtures. +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(FACT,DENS1) + DEALLOCATE(INVELSB,BETARB,CHIRSB) + DEALLOCATE(INVELS,BETAR,CHIRS,LAMB) + DEALLOCATE(LXS) + DEALLOCATE(XS,SS2D,SIGS,NWT0,TAUXFI) + DEALLOCATE(ITOD1,LENGDP,LENGDX,ISADRX) + DEALLOCATE(YLDSM) + IF(NISOTS.GT.0) DEALLOCATE(ISOTS) + IF(NADRX.GT.0) DEALLOCATE(IADRX) + DEALLOCATE(DENS0,XVOLM,JJSO,INOMIS,IRESM,ITOTM) +*---- +* MICROLIB FINALIZATION +*---- + IF(.NOT.LRES) THEN + ISTATE(:NSTATE)=0 + ISTATE(1)=NMIX + ISTATE(2)=NBISO2 + ISTATE(3)=NGRP + ISTATE(4)=NL + ISTATE(5)=ITRANC + ISTATE(7)=1 + IF(ITER.EQ.3) ISTATE(12)=NMIX + ISTATE(13)=NED2 + ISTATE(14)=NMIX + ISTATE(18)=1 + ISTATE(19)=NPRC + ISTATE(20)=MY1 + ISTATE(22)=MAXISO/NMIX + IF(NSURFD.GT.0) ISTATE(24)=2 ! ADF information + IF(NBISO2.EQ.0) CALL XABORT('SCRLIB: NBISO2=0.') + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPLIB,'MIXTURESVOL',NMIX,2,VOLMI2) + CALL LCMPUT(IPLIB,'ISOTOPESUSED',3*NBISO2,3,HUSE2) + CALL LCMPUT(IPLIB,'ISOTOPERNAME',3*NBISO2,3,HNAM2) + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESMIX',NBISO2,1,IMIX2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + IF(NED2.GT.0) CALL LCMPTC(IPLIB,'ADDXSNAME-P0',8,NED2,HVECT2) + CALL LCMPUT(IPLIB,'ISOTOPESTODO',NBISO2,1,ITOD2) + CALL LCMPUT(IPLIB,'ISOTOPESTYPE',NBISO2,1,ISTY2) + ELSE IF(LRES.AND.(NISOP.GT.0)) THEN + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO2,2,DENS2) + CALL LCMPUT(IPLIB,'ISOTOPESVOL',NBISO2,2,VOL2) + ENDIF + IF(IMPX.GT.5) CALL LCMLIB(IPLIB) + IACCS=1 +*---- +* COMPUTE THE MACROSCOPIC X-SECTIONS +*---- + IF((ITER.NE.0).AND.(ITER.NE.3)) GO TO 280 + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + IF(MAXMIX.NE.NMIX) CALL XABORT('SCRLIB: INVALID NMIX.') + NBISO=ISTATE(2) + ALLOCATE(MASK(MAXMIX),MASKL(NGRP)) + ALLOCATE(ISONA(3*NBISO),ISOMI(NBISO),DENIS(NBISO)) + CALL LCMGET(IPLIB,'ISOTOPESUSED',ISONA) + CALL LCMGET(IPLIB,'ISOTOPESMIX',ISOMI) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENIS) + MASK(:MAXMIX)=.TRUE. + MASKL(:NGRP)=.TRUE. + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 + CALL LCMLEN(IPLIB,'MACROLIB',ILONG,ITYLCM) + IF(ILONG.NE.0) CALL LCMDEL(IPLIB,'MACROLIB') + CALL LIBMIX(IPLIB,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS,MASK,MASKL, + 1 ITSTMP,TMPDAY) + DEALLOCATE(MASKL,MASK) + DEALLOCATE(DENIS,ISOMI,ISONA) + IF(NSURFD.GT.0) THEN + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + ISTATE(12)=2 + CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* SAVE MASL INFORMATION +*---- + IF(HMASL.NE.' ') THEN + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMPUT(IPLIB,'MASL',NMIX,2,FMASL) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(B2.NE.0.0) THEN + IF(IMPX.GT.0) WRITE(IOUT,'(/31H SCRLIB: INCLUDE LEAKAGE IN THE, + 1 14H MACROLIB (B2=,1P,E12.5,2H).)') B2 + CALL LCMSIX(IPLIB,'MACROLIB',1) + JPLIB=LCMGID(IPLIB,'GROUP') + ALLOCATE(GAR1(NMIX),GAR2(NMIX)) + DO 270 IGR=1,NGRP + KPLIB=LCMGIL(JPLIB,IGR) + CALL LCMGET(KPLIB,'NTOT0',GAR1) + CALL LCMGET(KPLIB,'DIFF',GAR2) + DO 260 IBM=1,NMIX + IF(MIXC(IBM).NE.0) GAR1(IBM)=GAR1(IBM)+B2*GAR2(IBM) + 260 CONTINUE + CALL LCMPUT(KPLIB,'NTOT0',NMIX,2,GAR1) + 270 CONTINUE + DEALLOCATE(GAR2,GAR1) + CALL LCMSIX(IPLIB,' ',2) + ENDIF +*---- +* PROCESS ADF INFORMATION +*---- + 280 IF(NSURFD.GT.0) THEN + DO 285 IBM=1,NMIX ! mixtures in Macrolib + IF(MIXC(IBM).NE.0) ADF2(IBM,:NGRP,:NSURFD)=0.0 + 285 CONTINUE + DO 300 ICAL=1,NCAL + DO 290 IBM=1,NMIX ! mixtures in Macrolib + IF(MIXC(IBM).EQ.0) GO TO 290 + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 290 + KPMEM=LCMGIL(JPMEM,ICAL) + CALL LCMSIX(KPMEM,'outflx',1) + CALL LCMGET(KPMEM,'SURFLX',SURFLX) + CALL LCMSIX(KPMEM,' ',2) + CALL LCMSIX(KPMEM,' ',2) + DO I=1,NSURFD + WRITE(HADF(I),'(3HFD_,I5.5)') I + DO IGR=1,NGRP + ADF2(IBM,IGR,I)=ADF2(IBM,IGR,I)+WEIGHT*SURFLX(I,IGR)/SURF(I) + ENDDO + ENDDO + 290 CONTINUE + 300 CONTINUE + CALL LCMSIX(IPLIB,'MACROLIB',1) + CALL LCMSIX(IPLIB,'ADF',1) + CALL LCMPUT(IPLIB,'NTYPE',1,1,NSURFD) + CALL LCMPTC(IPLIB,'HADF',8,NSURFD,HADF) + DO I=1,NSURFD + CALL LCMPUT(IPLIB,HADF(I),NMIX*NGRP,2,ADF2(1,1,I)) + ENDDO + CALL LCMSIX(IPLIB,' ',2) + CALL LCMSIX(IPLIB,' ',2) + DEALLOCATE(ADF2,HADF) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(SURFLX,SURF) + DEALLOCATE(ADF2,HADF) + DEALLOCATE(FMASL,SPH,FLUX,VOLMI2,VOL2,DENS3,DENS2) + DEALLOCATE(HNAM2,HUSE2,ISTY2,ISTY1,ITOD2,IMIX2) + RETURN + END diff --git a/Donjon/src/SCRMEM.f b/Donjon/src/SCRMEM.f new file mode 100644 index 0000000..5f5f38f --- /dev/null +++ b/Donjon/src/SCRMEM.f @@ -0,0 +1,95 @@ +*DECK SCRMEM + SUBROUTINE SCRMEM(IPSAP,IPMEM,NCAL,NMIL,NMIX,TERP,MIXC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Copy a Saphyb into memory taking care to keep only required +* calculations and mixtures. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPSAP address of the Saphyb object. +* IPMEM address of the simplified Saphyb in memory created by SCRMEM. +* NCAL number of elementary calculations in the Saphyb. +* NMIL number of material mixtures in the Saphyb +* NMIX maximum number of material mixtures in the microlib. +* TERP interpolation factors. +* MIXC mixture index in the Saphyb corresponding to each microlib +* mixture. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP,IPMEM + INTEGER NCAL,NMIL,NMIX,MIXC(NMIX) + REAL TERP(NCAL,NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER DIMSAP(50) + INTEGER IBM, IBMOLD, ICAL, ILONG, ITYLCM + CHARACTER SIGN*12,TEXT12*12 + TYPE(C_PTR) JPSAP,KPSAP,JPMEM1,JPMEM2,KPMEM1,KPMEM2 +* + CALL LCMOP(IPMEM,'*tempSaphyb*',0,1,0) + CALL LCMGTC(IPSAP,'SIGNATURE',12,SIGN) + CALL LCMPTC(IPMEM,'SIGNATURE',12,SIGN) + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + CALL LCMPUT(IPMEM,'DIMSAP',50,1,DIMSAP) + JPSAP=LCMGID(IPSAP,'constphysiq') + JPMEM1=LCMDID(IPMEM,'constphysiq') + CALL LCMEQU(JPSAP,JPMEM1) + JPSAP=LCMGID(IPSAP,'contenu') + JPMEM1=LCMDID(IPMEM,'contenu') + CALL LCMEQU(JPSAP,JPMEM1) + JPSAP=LCMGID(IPSAP,'adresses') + JPMEM1=LCMDID(IPMEM,'adresses') + CALL LCMEQU(JPSAP,JPMEM1) + JPSAP=LCMGID(IPSAP,'geom') + JPMEM1=LCMDID(IPMEM,'geom') + CALL LCMEQU(JPSAP,JPMEM1) + JPMEM1=LCMLID(IPMEM,'calc',NCAL) + DO 30 ICAL=1,NCAL + DO IBM=1,NMIX + IF(TERP(ICAL,IBM).NE.0.0) GO TO 10 + ENDDO + GO TO 30 + 10 WRITE(TEXT12,'(4Hcalc,I8)') ICAL + JPSAP=LCMGID(IPSAP,TEXT12) + JPMEM2=LCMDIL(JPMEM1,ICAL) + KPSAP=LCMGID(JPSAP,'info') + KPMEM1=LCMDID(JPMEM2,'info') + CALL LCMEQU(KPSAP,KPMEM1) + KPSAP=LCMGID(JPSAP,'divers') + KPMEM1=LCMDID(JPMEM2,'divers') + CALL LCMEQU(KPSAP,KPMEM1) + CALL LCMLEN(JPSAP,'outflx',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + KPSAP=LCMGID(JPSAP,'outflx') + KPMEM1=LCMDID(JPMEM2,'outflx') + CALL LCMEQU(KPSAP,KPMEM1) + ENDIF + KPMEM1=LCMLID(JPMEM2,'mili',NMIL) + DO IBMOLD=1,NMIL + DO IBM=1,NMIX + IF((TERP(ICAL,IBM).NE.0.).AND.(MIXC(IBM).EQ.IBMOLD)) GO TO 20 + ENDDO + CYCLE + 20 WRITE(TEXT12,'(4Hmili,I8)') IBMOLD + KPSAP=LCMGID(JPSAP,TEXT12) + KPMEM2=LCMDIL(KPMEM1,IBMOLD) + CALL LCMEQU(KPSAP,KPMEM2) + ENDDO + 30 CONTINUE + RETURN + END diff --git a/Donjon/src/SCRNDF.f b/Donjon/src/SCRNDF.f new file mode 100644 index 0000000..643d4de --- /dev/null +++ b/Donjon/src/SCRNDF.f @@ -0,0 +1,115 @@ +*DECK SCRNDF + SUBROUTINE SCRNDF(IMPX,NBISO1,ISO,IBM,INOMIS,IPMEM,IPLIB,NCAL, + 1 TERP,MY1,MY2,YLDS,ISTYP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Store records PYNAM, PYMIX and PYIELD into a Microlib. +* +*Copyright: +* Copyright (C) 2015 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 +* IMPX print parameter (equal to zero for no print). +* NBISO1 number of particularized isotopes. +* ISO particularized isotope index. +* IBM material mixture. +* INOMIS array containing the names of the particularized isotopes. +* IPMEM pointer to the memory-resident Saphyb object. +* IPLIB address of the output microlib LCM object. +* NCAL number of elementary calculations in the Saphyb. +* TERP interpolation factors. +* MY1 number of fissile isotopes including macroscopic sets. +* MY2 number of fission fragment. +* YLDS fission yields. +* +*Parameters: output +* ISTYP type of isotope ISO (=2: fissile; =3: fission product). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMEM,IPLIB + INTEGER IMPX,NBISO1,ISO,IBM,INOMIS(2,NBISO1),NCAL,MY1,MY2,ISTYP + REAL TERP(NCAL) + DOUBLE PRECISION YLDS(MY1,MY2) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMEM,KPMEM + INTEGER I, I0, ICAL, IY1, IY2, JSO, NISY +*---- +* ALLOCATABLE AYYAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: ADRY,IPYMIX + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IPYNAM + REAL, ALLOCATABLE, DIMENSION(:) :: PYIELD +* + JPMEM=LCMGID(IPMEM,'calc') + ISTYP=0 + DO 10 ICAL=NCAL,1,-1 + IF(TERP(ICAL).EQ.0.0) GO TO 10 + KPMEM=LCMGIL(JPMEM,ICAL) + CALL LCMSIX(KPMEM,'info',1) + CALL LCMGET(KPMEM,'NISY',NISY) + IF(ISO.GT.NISY) CALL XABORT('SCRNDF: NISY OVERFLOW.') + ALLOCATE(ADRY(NISY)) + CALL LCMGET(KPMEM,'ADRY',ADRY) + CALL LCMSIX(KPMEM,' ',2) + IF(ADRY(ISO).GT.0) THEN +* ISO is a fissile isotope + ISTYP=2 + ELSE IF(ADRY(ISO).LT.0) THEN +* ISO is a fission product + ISTYP=3 + IY2=-ADRY(ISO) + IF(IY2.GT.MY2) CALL XABORT('SCRNDF: MY2 OVERFLOW.') + ALLOCATE(IPYNAM(2,MY1),IPYMIX(MY1),PYIELD(MY1)) + IPYNAM(:2,:MY1)=0 + IPYMIX(:MY1)=0 + PYIELD(:MY1)=0.0 + IF(IMPX.GT.2) THEN + WRITE(6,'(25H SCRNDF: fission product=,2A4,9H mixture=,I8)') + 1 (INOMIS(I0,ISO),I0=1,2),IBM + ENDIF + DO JSO=1,NISY + IF(ADRY(JSO).GT.0) THEN + IY1=ADRY(JSO) + IF(IY1.GT.MY1) CALL XABORT('SCRNDF: MY1 OVERFLOW.') + IPYNAM(1,IY1)=INOMIS(1,JSO) + IPYNAM(2,IY1)=INOMIS(2,JSO) + IPYMIX(IY1)=IBM + PYIELD(IY1)=REAL(YLDS(IY1,IY2)) + IF(IMPX.GT.2) THEN + WRITE(6,'(9X,16Hfissile isotope(,I4,2H)=,2A4,9H mixture=, + 1 I8)') IY1,(IPYNAM(I0,IY1),I0=1,2),IPYMIX(IY1) + ENDIF + ENDIF + ENDDO + CALL LCMPUT(IPLIB,'PYNAM',2*MY1,3,IPYNAM) + CALL LCMPUT(IPLIB,'PYMIX',MY1,1,IPYMIX) + CALL LCMPUT(IPLIB,'PYIELD',MY1,2,PYIELD) + IF(IMPX.GT.2) THEN + WRITE(6,'(3X,7HPYIELD=,1P,8E12.4/(8X,10E12.4))') (PYIELD(I), + 1 I=1,MY1) + ENDIF + DEALLOCATE(PYIELD,IPYMIX,IPYNAM) + ENDIF + DEALLOCATE(ADRY) + RETURN + 10 CONTINUE + CALL XABORT('SCRNDF: UNABLE TO FIND A CALCULATION DIRECTORY.') + RETURN + END diff --git a/Donjon/src/SCRRGR.f b/Donjon/src/SCRRGR.f new file mode 100644 index 0000000..522f157 --- /dev/null +++ b/Donjon/src/SCRRGR.f @@ -0,0 +1,882 @@ +*DECK SCRRGR + SUBROUTINE SCRRGR(IPSAP,IPMAP,LCUBIC,NMIX,IMPX,NMIL,NCAL,MD2, + 1 NCH,NB,NFUEL,NPARM,ITER,MAXNIS,MIXC,TERP,NISO,LISO,HISO,CONC, + 2 ITODO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute TERP factors for Saphyb interpolation. Use global parameters +* from a fuel-map object and optional user-defined values. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPSAP address of the Saphyb object. +* 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 printing index (=0 for no print). +* NMIL number of material mixtures in the Saphyb. +* NCAL number of elementary calculations in the Saphyb. +* MD2 number of particularized and macro isotopes in the Saphyb. +* 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 +* +*Parameters: output +* ITER completion flag (=0: all over; =1: use another Saphyb; +* =2 use another L_MAP + Saphyb). +* MAXNIS maximum value of NISO(I) in user data. +* MIXC mixture index in the Saphyb 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 + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP,IPMAP + INTEGER NMIX,IMPX,NMIL,NCAL,MD2,NFUEL,NCH,NB,ITER,MAXNIS, + 1 MIXC(NMIX),NPARM,HISO(2,NMIX,MD2),NISO(NMIX), + 2 ITODO(NMIX,MD2) + REAL TERP(NCAL,NMIX),CONC(NMIX,MD2) + LOGICAL LCUBIC,LISO(NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXADD=10 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXLIN=50 + INTEGER, PARAMETER::MAXVAL=200 + REAL, PARAMETER::REPS=1.0E-4 + INTEGER I0, IBMOLD, IBM, IBTYP, IB, ICAL, ICH, IFUEL, ILONG, IMIX, + & IMPY, INDIC, IPAR, ISO, ITYLCM, ITYPE, ITYP, IVARTY, I, JBM, JB, + & JCAL, JPARM, JPAR, J, LENGTH, NCOMLI, NISOMI, NITMA, NPARMP, + & NPAR, NTOT, NVP, N + REAL BURN0, BURN1, FLOTT, SUM, VALR1, VALR2, VARVAL + CHARACTER TEXT12*12,PARKEY(MAXPAR)*4,PARTYP(MAXPAR)*4, + 1 PARFMT(MAXPAR)*8,HSMG*131,COMMEN(MAXLIN)*80,VALH(MAXPAR)*12, + 2 VCHAR(MAXVAL)*12,RECNAM*12,PARNAM*12,HCUBIC*12,HNAVAL*12 + INTEGER DIMSAP(50),VALI(MAXPAR),NVALUE(MAXPAR),VINTE(MAXVAL), + 1 MUPLET(2*MAXPAR),MUTYPE(2*MAXPAR),MAPLET(2*MAXPAR,MAXADD), + 2 MATYPE(2*MAXPAR,MAXADD),IDLTA(2*MAXPAR,MAXADD),NDLTA(2*MAXPAR), + 3 IDLTA1,MUPLT2(2*MAXPAR),MUTYP2(2*MAXPAR),HISOMI(2,MD2) + DOUBLE PRECISION DFLOTT + REAL VALR(2*MAXPAR,2),VREAL(MAXVAL),VALRA(2*MAXPAR,2,MAXADD), + 1 CONCMI(MD2) + 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,LPSAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: FMIX,ZONEC + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ZONEDP + REAL, ALLOCATABLE, DIMENSION(:) :: BRN0,BRN1,VARC,TERPA + REAL, ALLOCATABLE, DIMENSION(:,:) :: WPAR + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LPARM,LDELTA + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HPAR +*---- +* 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(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)) +*---- +* RECOVER TABLE-OF-CONTENT INFORMATION FOR THE SAPHYB. +*---- + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + NCOMLI=DIMSAP(1) + NPAR=DIMSAP(8) + NVP=DIMSAP(17) + IF(NCOMLI.GT.MAXLIN) CALL XABORT('SCRRGR: MAXLIN OVERFLOW.') + IF(NPAR.GT.MAXPAR) CALL XABORT('SCRRGR: MAXPAR OVERFLOW.') + CALL LCMGTC(IPSAP,'COMMEN',80,NCOMLI,COMMEN) + IF(NPAR.GT.0)THEN + CALL LCMSIX(IPSAP,'paramdescrip',1) + CALL LCMGTC(IPSAP,'PARKEY',4,NPAR,PARKEY) + CALL LCMGTC(IPSAP,'PARTYP',4,NPAR,PARTYP) + CALL LCMGTC(IPSAP,'PARFMT',8,NPAR,PARFMT) + CALL LCMSIX(IPSAP,' ',2) + ENDIF + IF(IMPX.GT.0)WRITE(IOUT,'(1X,A)') (COMMEN(I),I=1,NCOMLI) + TERP(:NCAL,:NMIX)=0.0 + MIXC(:NMIX)=0 +*---- +* 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,:MD2)=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 SAPHYB. +*---- + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: 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(:4) + 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('SCRRGR: CHARACTER DATA EXPECTED(2).') + 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('SCRRGR: 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,*)'SCRRGR: UNABLE TO FIND FUEL MIXTURE ',IBM + CALL XABORT('SCRRGR: WRONG MIXTURE NUMBER.') + 50 IBMOLD=1 + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: CHARACTER DATA EXPECTED(3).') + IF(TEXT12.EQ.'FROM')THEN + CALL REDGET(INDIC,IBMOLD,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('SCRRGR: INTEGER DATA EXPECTED.') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') + ELSE IF(TEXT12.EQ.'USE') THEN + IBMOLD=IBM + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: CHARACTER DATA EXPECTE' + 1 //'D.') + ENDIF + GOTO 30 + ELSEIF(TEXT12.EQ.'MICRO')THEN + IF(IBM.EQ.0) CALL XABORT('SCRRGR: MIX NOT SET (1).') + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: CHARACTER DATA EXPECTED(4).') + 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('SCRRGR: CHARACTER DATA EXPECTED(5).') + 60 IF(TEXT12.EQ.'ENDMIX')THEN + GOTO 30 + ELSE IF(TEXT12.EQ.'NOEV') THEN + IF(NISOMI.EQ.0) CALL XABORT('SCRRGR: MISPLACED NOEV.') + ITODO(IBM,NISOMI)=1 + ELSE + NISOMI=NISOMI+1 + IF(NISOMI.GT.MD2) CALL XABORT('SCRRGR: MD2 OVERFLOW.') + MAXNIS=MAX(MAXNIS,NISOMI) + READ(TEXT12,'(2A4)') (HISOMI(I0,NISOMI),I0=1,2) + 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('SCRRGR: INVALID HISO DATA.') + ENDIF + ENDIF + CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: CHARACTER DATA EXPECTED.') + GOTO 60 + ELSEIF((TEXT12.EQ.'SET').OR.(TEXT12.EQ.'DELTA').OR. + 1 (TEXT12.EQ.'ADD'))THEN + IF(IBM.EQ.0) CALL XABORT('SCRRGR: 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('SCRRGR: CHARACTER DATA EXPECTED(7).') + 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('SCRRGR: CHARACTER DATA EXPECTED(8).') + DO I=1,NPAR + IF(TEXT12.EQ.PARKEY(I))THEN + IPAR=I + PARNAM=TEXT12 + GOTO 70 + ENDIF + ENDDO + WRITE(HSMG,'(18HSCRRGR: 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 + WRITE(RECNAM,'(''pval'',I8)') IPAR + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + IF(NVALUE(IPAR).GT.MAXVAL)CALL XABORT('SCRRGR: MAXVAL OVERFLOW') + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMLEN(LPSAP,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0)THEN + CALL LCMLIB(LPSAP) + WRITE(HSMG,'(25HSCRRGR: GLOBAL PARAMETER ,A,12H NOT SET(2).)') + 1 PARNAM + CALL XABORT(HSMG) + ENDIF + IF((IPAR.GT.NPAR).OR. + 1 ((IPAR.LE.NPAR).AND.(PARFMT(IPAR).EQ.'FLOTTANT')))THEN + CALL LCMGET(LPSAP,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('SCRRGR: 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('SCRRGR: 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('SCRRGR: 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('SCRRGR: 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,'(23HSCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(1))') PARNAM,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,'(23HSCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN.(2))') PARNAM,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,'(23HSCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(1))') PARNAM, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF + IF((LADD1).AND.(TEXT12.EQ.'REF'))THEN + 120 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('SCRRGR: 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,'(''pval'',I8)') IPAR + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMGET(LPSAP,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('SCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 120 + 140 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ELSE IF((LDELT1).AND.(TEXT12.EQ.'REF'))THEN + 150 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('SCRRGR: 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,'(''pval'',I8)') IPAR + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMGET(LPSAP,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('SCRRGR: REAL or "SAMEASREF" expected') + ENDIF + GOTO 150 + 170 CALL REDGET(INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + ENDIF + GOTO 30 + ELSEIF(PARFMT(IPAR).EQ.'ENTIER')THEN + IF(ITYPE.NE.1)CALL XABORT('SCRRGR: SET MANDATORY WITH INT' + 1 //'EGER PARAMETERS.') + CALL REDGET(INDIC,VALI(IPAR),FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('SCRRGR: INTEGER DATA EXPECTED.') + CALL LCMGET(LPSAP,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,'(26HSCRRGR: INTEGER PARAMETER ,A,9H WITH VAL, + 1 2HUE,I5,30H NOT FOUND IN SAPHYB DATABASE.)') PARKEY(IPAR), + 2 VALI(IPAR) + CALL XABORT(HSMG) + ELSEIF(PARFMT(IPAR).EQ.'CHAINE')THEN + IF(ITYPE.NE.1)CALL XABORT('SCRRGR: SET MANDATORY WITH STR' + 1 //'ING PARAMETERS.') + CALL REDGET(INDIC,NITMA,FLOTT,VALH(IPAR),DFLOTT) + IF(INDIC.NE.3)CALL XABORT('SCRRGR: STRING DATA EXPECTED.') + CALL LCMGTC(LPSAP,RECNAM,12,NVALUE(IPAR),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,'(25HSCRRGR: STRING PARAMETER ,A,10H WITH VALU, + 1 1HE,A12,30H NOT FOUND IN SAPHYB DATABASE.)') PARKEY(IPAR), + 2 VALH(IPAR) + CALL XABORT(HSMG) + ELSE + CALL XABORT('SCRRGR: INVALID FORMAT='//PARFMT(IPAR)) + ENDIF + ELSEIF(TEXT12.EQ.'TIMAV-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('SCRRGR: MIX NOT SET (3).') + IBTYP=1 + ELSEIF(TEXT12.EQ.'INST-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('SCRRGR: MIX NOT SET (4).') + IBTYP=2 + ELSEIF(TEXT12.EQ.'AVG-EX-BURN')THEN + IF(IBM.EQ.0) CALL XABORT('SCRRGR: MIX NOT SET (5).') + IBTYP=3 + CALL REDGET(INDIC,IVARTY,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.1)CALL XABORT('SCRRGR: 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.'FLOTTANT')THEN + IF(LCUB2(IPAR)) THEN + WRITE(IOUT,'(26H SCRRGR: GLOBAL PARAMETER:,A12,5H ->CU, + 1 18HBIC INTERPOLATION.)') PARKEY(IPAR) + ELSE + WRITE(IOUT,'(26H SCRRGR: GLOBAL PARAMETER:,A12,5H ->LI, + 1 19HNEAR INTERPOLATION.)') 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('SCRRGR: 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('SCRRGR: 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 186 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. + GO TO 186 + 185 IF(PARTYP(IPAR).EQ.'TEMP') THEN +* CONVERT FUEL MAP TEMPERATURES TO CELSIUS + DO I=1,NCH*NB + WPAR(I,JPARM)=WPAR(I,JPARM)-273.16 + ENDDO + ENDIF + 186 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('SCRRGR: NMIX OVERFLOW.') + DO 260 JPARM=1,NPARMP + IF(.NOT.LPARM(JPARM))GOTO 260 + DO I=1,NPAR + IF(HPAR(JPARM).EQ.PARKEY(I))THEN + IPAR=I + PARNAM=HPAR(JPARM) + GOTO 190 + ENDIF + ENDDO + WRITE(HSMG,'(18HSCRRGR: PARAMETER ,A,14H NOT FOUND(4).)') + 1 HPAR(JPARM) + CALL XABORT(HSMG) + 190 CONTINUE + WRITE(RECNAM,'(''pval'',I8)') IPAR + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + IF(NVALUE(IPAR).GT.MAXVAL)CALL XABORT('SCRRGR: MAXVAL OVERFLOW') + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMLEN(LPSAP,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0)THEN + WRITE(HSMG,'(25HSCRRGR: GLOBAL PARAMETER ,A,12H NOT SET(3).)') + 1 PARNAM + 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 + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('SCRRGR: MAXVAL OVERF' + 1 //'LOW.') + WRITE(RECNAM,'(''pval'',I8)') IPAR + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMLEN(LPSAP,RECNAM,LENGTH,ITYLCM) + IF(LENGTH.EQ.0)THEN + WRITE(HSMG,'(25HSCRRGR: GLOBAL PARAMETER ,A,12H NOT SET(1).)') + 1 PARNAM + CALL XABORT(HSMG) + ENDIF + IF(LENGTH.GT.MAXVAL) CALL XABORT('SCRRGR: MAXVAL OVERFLOW.') + CALL LCMGET(LPSAP,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,'(23HSCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(3).)') PARNAM,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,'(23HSCRRGR: REAL PARAMETER ,A,10H WITH VALU, + 1 1HE,1P,E12.4,26H IS OUTSIDE THE DOMAIN(4).)') PARNAM,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,'(23HSCRRGR: REAL PARAMETER ,A,9H IS DEFIN, + 1 7HED WITH,1P,E12.4,2H >,E12.4,4H.(2))') PARNAM, + 2 VALR1,VALR2 + CALL XABORT(HSMG) + ENDIF +*---- +* COMPUTE THE TERP FACTORS USING TABLE-OF-CONTENT INFORMATION. +*---- + 260 CONTINUE + MIXC(NTOT)=IBMOLD + IF(IBMOLD.GT.NMIL) + 1 CALL XABORT('SCRRGR: MIX OVERFLOW (SAPHYB).') + IF(IMPY.GT.2) WRITE(6,'(32H SCRRGR: 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(1,NTOT,ISO)=HISOMI(1,ISO) + HISO(2,NTOT,ISO)=HISOMI(2,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 SCRTRP(IPSAP,LCUB2,IMPY,NVP,NPAR,NCAL,MUPLT2, + 1 MUTYPE,VALR(1,1),VARVAL,TERP(1,NTOT)) + ELSE + TERP(:NCAL,NTOT)=0.0 + ENDIF + ELSE + CALL SCRTRP(IPSAP,LCUB2,IMPY,NVP,NPAR,NCAL,MUPLT2,MUTYPE, + 1 VALR(1,1),VARVAL,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 SCRTRP(IPSAP,LCUB2,IMPY,NVP,NPAR,NCAL,MUPLT2, + 1 MUTYP2,VALRA(1,1,IDLTA1),VARVAL,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('SCRRGR: ALGORITHM FAILURE.') + IBM=0 + ELSEIF((TEXT12.EQ.'SAPHYB').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.'SAPHYB') 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('SCRRGR: 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,'(43HSCRRGR: INVALID INTERPOLATION FACTORS IN MI, + 1 5HXTURE,I4,1H.)') IBM + CALL XABORT(HSMG) + ENDIF + 300 CONTINUE +*---- +* EXIT MAIN LOOP OF THE SUBROUTINE +*---- + GO TO 310 + ELSE + CALL XABORT('SCRRGR: '//TEXT12//' IS AN INVALID KEYWORD.') + ENDIF + GOTO 20 +*---- +* PRINT INTERPOLATION (TERP) FACTORS +*---- + 310 IF(IMPX.GT.2) THEN + WRITE(IOUT,'(/30H SCRRGR: 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 +*---- + DEALLOCATE(HPAR,LDELTA,WPAR,BRN1,BRN0,ZONEC,ZONEDP,FMIX,LPARM) + RETURN +* + 320 FORMAT(6H CALC=,I8,6H TERP=,1P,8E13.5/(20X,8E13.5)) + END diff --git a/Donjon/src/SCRSAP.f b/Donjon/src/SCRSAP.f new file mode 100644 index 0000000..b51a4ab --- /dev/null +++ b/Donjon/src/SCRSAP.f @@ -0,0 +1,534 @@ +*DECK SCRSAP + SUBROUTINE SCRSAP(IPMAC,IPMEM,IACCS,NMIL,NMIX,NGRP,IMPX,HEQUI, + 1 HMASL,NCAL,NSURFD,ILUPS,MIXC,TERP,LPURE,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Build the Macrolib by scanning the NCAL elementary calculations of +* a Saphyb and weighting them with TERP factors. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAC address of the output Macrolib LCM object. +* IPMEM pointer to the memory-resident Saphyb. +* IACCS =0 macrolib is created; =1 ... is updated. +* NMIL number of material mixtures in the Saphyb. +* NMIX maximum number of material mixtures in the Macrolib. +* NGRP number of energy groups. +* 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 Saphyb. +* NSURFD number of discontinuity factors. +* ILUPS up-scattering removing flag (=1 to remove up-scattering from +* output cross-sections). +* MIXC mixture index in the Saphyb 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 + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC,IPMEM + INTEGER IACCS,NMIL,NMIX,NGRP,IMPX,NCAL,NSURFD,ILUPS,MIXC(NMIX) + REAL TERP(NCAL,NMIX),B2 + CHARACTER HEQUI*4,HMASL*4 + LOGICAL LPURE +*---- +* 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=5 + INTEGER, PARAMETER::NSTATE=40 + INTEGER, PARAMETER::MAXRES=MAX1D-8 + REAL FLOTVA, WEIGHT, FKEFF, B2R + INTEGER I, I1D, I2D, IBM, IBMOLD, ICAL, IDEL, IDF, IED, IGMAX, + & IGMIN, IGR, IKEFF, IL, ILONG, IMC, IOF, IPOSDE, ITRANC, ITYLCM, + & ITYPE, JGR, LENGTH, N1D, N2D, NDEL, NED, NEDTMP, NF, NFTMP, NL, + & NLTMP, NTYPE, NALBP + TYPE(C_PTR) JPMAC,KPMAC,IPTMP,JPTMP,KPTMP + INTEGER ISTATE(NSTATE),DIMSAP(50) + LOGICAL LMAKE1(MAX1D),LMAKE2(MAX2D),LWD + CHARACTER TEXT8*8,TEXT12*12,CM*2,HMAK1(MAX1D)*12,HMAK2(MAX2D)*12, + 1 HVECT(MAXED)*8 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,IJJB,NJJB,IPOSB + REAL, ALLOCATABLE, DIMENSION(:) :: GAR4,GAR4B,WORK1,WORK2,XVOLM, + 1 ENERG,VOSAP,WDLA,FMASL,FMASLB + REAL, ALLOCATABLE, DIMENSION(:,:) :: SPH + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAR1,ADF2 + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: GAR2,GAR3 + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF + 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 ADF2(NMIX,NGRP,NSURFD),FMASL(NMIX),FMASLB(NMIX)) + ALLOCATE(HADF(NSURFD)) +*---- +* MACROLIB INITIALIZATION +*---- + CALL LCMGET(IPMEM,'DIMSAP',DIMSAP) + IF(DIMSAP(7).NE.NMIL) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF MIXTURES(1).') + ELSE IF(DIMSAP(19).NE.NCAL) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF CALCULATIONS(1).') + ELSE IF(DIMSAP(20).NE.NGRP) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF ENERGY GROUPS(1).') + ENDIF + 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 + FMASL(:NMIX)=0.0 + IF(NSURFD.GT.0) ADF2(:NMIX,:NGRP,:NSURFD)=0.0 + ALLOCATE(XVOLM(NMIX),ENERG(NGRP+1)) + XVOLM(:NMIX)=0.0 + ENERG(:NGRP+1)=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('SCRSAP: 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('SCRSAP: INVALID NUMBER OF ENERGY GROUPS(2).') + ELSE IF(ISTATE(2).NE.NMIX) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF MIXTURES(2).') + ENDIF + NL=ISTATE(3) + NF=ISTATE(4) + IF(NF.GT.MAXNFI) CALL XABORT('SCRSAP: MAXNFI OVERFLOW(1).') + NED=ISTATE(5) + ITRANC=ISTATE(6) + NDEL=ISTATE(7) + IDF=ISTATE(12) + IF(NED.GT.MAXED) CALL XABORT('SCRSAP: 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('SCRSAP: MAXNL OVERFLOW(1).') + IF(N1D.GT.MAX1D) CALL XABORT('SCRSAP: MAX1D OVERFLOW(1).') + IF(N2D.GT.MAX2D) CALL XABORT('SCRSAP: MAX2D OVERFLOW(1).') + DO 20 IED=1,NED + HMAK1(8+IED)=HVECT(IED) + 20 CONTINUE + DO 30 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+NED+IL)='SIGS'//CM + 30 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 40 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 + 40 CONTINUE + CALL LCMGET(IPMAC,'STATE-VECTOR',ISTATE) + CALL LCMGET(IPMAC,'VOLUME',XVOLM) + JPMAC=LCMGID(IPMAC,'GROUP') + DO 105 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + DO 60 I1D=1,N1D + CALL LCMLEN(KPMAC,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE1(I1D)=.TRUE. + CALL LCMGET(KPMAC,HMAK1(I1D),GAR1(1,IGR,I1D)) + DO 55 IBM=1,NMIX + DO 50 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=0.0 + 50 CONTINUE + 55 CONTINUE + ENDIF + 60 CONTINUE + DO 80 I2D=1,N2D + CALL LCMLEN(KPMAC,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE2(I2D)=.TRUE. + CALL LCMGET(KPMAC,HMAK2(I2D),GAR2(1,1,IGR,I2D)) + DO 72 I=1,NF + DO 71 IBM=1,NMIX + DO 70 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR2(IBM,I,IGR,I2D)=0.0 + 70 CONTINUE + 71 CONTINUE + 72 CONTINUE + ENDIF + 80 CONTINUE + DO 100 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 95 IBM=1,NMIX + IPOSDE=IPOS(IBM) + DO 90 JGR=IJJ(IBM),IJJ(IBM)-NJJ(IBM)+1,-1 + GAR3(IBM,JGR,IGR,IL)=GAR4(IPOSDE) + DO 85 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR3(IBM,JGR,IGR,IL)=0.0 + 85 CONTINUE + IPOSDE=IPOSDE+1 + 90 CONTINUE + 95 CONTINUE + ENDIF + 100 CONTINUE + 105 CONTINUE + IF(IDF.EQ.2) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMGTC(IPMAC,'HADF',8,NSURFD,HADF) + DO ITYPE=1,NSURFD + CALL LCMGET(IPMAC,HADF(ITYPE),ADF2(1,1,ITYPE)) + ENDDO + CALL LCMSIX(IPMAC,' ',2) + ENDIF + ENDIF +*---- +* OVERALL ELEMENTARY CALCULATION LOOP +*---- + DO 210 ICAL=1,NCAL + DO 110 IBM=1,NMIX ! mixtures in Macrolib + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.NE.0.0) GO TO 120 + 110 CONTINUE + GO TO 210 +*---- +* PRODUCE AN ELEMENTARY MACROLIB (IF IPTMP=0) +*---- + 120 CALL LCMOP(IPTMP,'*ELEMENTARY*',0,1,0) + ALLOCATE(SPH(NMIL,NGRP)) + B2R=B2 + CALL SCRSPH(IPMEM,IPTMP,ICAL,IMPX,HEQUI,HMASL,NMIL,NGRP,ILUPS, + 1 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('SCRMAC: MAXNL OVERFLOW(2).') + IF(NFTMP.GT.MAXNFI) CALL XABORT('SCRMAC: MAXNFI OVERFLOW(2).') + IF(NEDTMP.GT.MAXED) CALL XABORT('SCRMAC: MAXED OVERFLOW(2).') + IF(IACCS.EQ.0) THEN + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.NMIL) THEN + CALL XABORT('SCRSAP: 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('SCRSAP: MAX1D OVERFLOW(2).') + IF(N2D.GT.MAX2D) CALL XABORT('SCRSAP: MAX2D OVERFLOW(2).') + DO 130 IED=1,NED + HMAK1(8+IED)=HVECT(IED) + 130 CONTINUE + DO 140 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + HMAK1(8+NED+IL)='SIGS'//CM + 140 CONTINUE + HMAK2(1)='NUSIGF' + HMAK2(2)='CHI' + DO 150 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 + 150 CONTINUE + ELSE + IF(NLTMP.GT.NL) CALL XABORT('SCRMAC: NL OVERFLOW.') + ITRANC=MAX(ITRANC,ISTATE(6)) + IF(ISTATE(1).NE.NGRP) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF ENERGY GROUPS(3).') + ELSE IF(ISTATE(2).NE.NMIL)THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF MIXTURES(3).') + ELSE IF(ISTATE(5).NE.NED) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF EDIT REACTIONS(3).') + ELSE IF((NFTMP.NE.0).AND.(NFTMP.NE.NF)) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF FISSILE ISOTOPES(3).') + ELSE IF(ISTATE(7).NE.NDEL) THEN + CALL XABORT('SCRSAP: INVALID NUMBER OF PRECURSOR GROUPS(3).') + ELSE IF(ISTATE(12).NE.IDF) THEN + CALL XABORT('SCRSAP: INVALID TYPE OF ADF DIRECTORY.') + ENDIF + ENDIF +*---- +* SPH CORRECTION OF MACROLIB INFORMATION +*---- + IMC=1 ! SPH correction for SPN macro-calculation + NALBP=0 ! no albedo correction + CALL SPHCMA(IPTMP,IMPX,IMC,NMIL,NGRP,NFTMP,NEDTMP,NALBP,SPH) + DEALLOCATE(SPH) +*---- +* RECOVER KEFF, VOLUMES, ENERGY GROUPS, EDIT NAMES, AND LAMBDA-D. +*---- + CALL LCMLEN(IPTMP,'K-EFFECTIVE',IKEFF,ITYLCM) + IF(IKEFF.EQ.1) CALL LCMGET(IPTMP,'K-EFFECTIVE',FKEFF) + CALL LCMLEN(IPTMP,'VOLUME',ILONG,ITYLCM) + IF(ILONG.EQ.NMIL) THEN + ALLOCATE(VOSAP(NMIL)) + CALL LCMGET(IPTMP,'VOLUME',VOSAP) + DO 160 IBM=1,NMIX ! mixtures in Macrolib + IBMOLD=MIXC(IBM) ! mixture in Saphyb + IF(IBMOLD.NE.0) XVOLM(IBM)=VOSAP(IBMOLD) + 160 CONTINUE + DEALLOCATE(VOSAP) + 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 +*---- +* RECOVER MASL INFORMATION +*---- + IF(HMASL.NE.' ') CALL LCMGET(IPTMP,'MASL',FMASLB) +*---- +* PERFORM INTERPOLATION +*---- + JPTMP=LCMGID(IPTMP,'GROUP') + DO 200 IBM=1,NMIX ! mixtures in Macrolib + WEIGHT=TERP(ICAL,IBM) + IF(WEIGHT.EQ.0.0) GO TO 200 + IBMOLD=MIXC(IBM) ! mixture in Saphyb + IF(IBMOLD.EQ.0) GO TO 200 + IF(HMASL.NE.' ') FMASL(IBM)=FMASL(IBM)+WEIGHT*FMASLB(IBMOLD) +* + DO 195 IGR=1,NGRP + KPTMP=LCMGIL(JPTMP,IGR) + DO 170 I1D=1,N1D + CALL LCMLEN(KPTMP,HMAK1(I1D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE1(I1D)=.TRUE. + CALL LCMGPD(KPTMP,HMAK1(I1D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + FLOTVA=FLOT(IBMOLD) + IF((.NOT.LPURE).AND.(I1D.EQ.4)) FLOTVA=1.0/FLOTVA + GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)+WEIGHT*FLOTVA + ENDIF + 170 CONTINUE + IF(ISTATE(4).GT.0) THEN + DO 175 I2D=1,N2D + CALL LCMLEN(KPTMP,HMAK2(I2D),ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + LMAKE2(I2D)=.TRUE. + CALL LCMGPD(KPTMP,HMAK2(I2D),FLOT_PTR) + CALL C_F_POINTER(FLOT_PTR,FLOT,(/ ILONG /)) + DO 174 I=1,NF + IOF=(IBMOLD-1)*NF+I + GAR2(IBM,I,IGR,I2D)=GAR2(IBM,I,IGR,I2D)+WEIGHT*FLOT(IOF) + 174 CONTINUE + ENDIF + 175 CONTINUE + ENDIF + DO 190 IL=1,NLTMP + WRITE(CM,'(I2.2)') IL-1 + ILONG=1 + IF(IL.GT.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 180 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 + 180 CONTINUE + ENDIF + 190 CONTINUE + 195 CONTINUE +*---- +* PROCESS ADF INFORMATION +*---- + IF(IDF.EQ.2) THEN + CALL LCMSIX(IPTMP,'ADF',1) + CALL LCMGET(IPTMP,'NTYPE',NTYPE) + IF(NTYPE.NE.NSURFD) CALL XABORT('SCRSAP: INVALID NTYPE VALUE.') + CALL LCMGTC(IPTMP,'HADF',8,NSURFD,HADF) + DO ITYPE=1,NSURFD + CALL LCMGET(IPTMP,HADF(ITYPE),GAR4) + DO IGR=1,NGRP + ADF2(IBM,IGR,ITYPE)=ADF2(IBM,IGR,ITYPE)+WEIGHT*GAR4(IGR) + ENDDO + ENDDO + CALL LCMSIX(IPTMP,' ',2) + ENDIF + 200 CONTINUE + CALL LCMCL(IPTMP,2) + 210 CONTINUE +*---- +* WRITE INTERPOLATED MACROLIB INFORMATION +*---- + IF(IKEFF.EQ.1) CALL LCMPUT(IPMAC,'K-EFFECTIVE',1,2,FKEFF) + CALL LCMPUT(IPMAC,'VOLUME',NMIX,2,XVOLM) + CALL LCMPUT(IPMAC,'ENERGY',NGRP+1,2,ENERG) + IF(HMASL.NE.' ') CALL LCMPUT(IPMAC,'MASL',NMIX,2,FMASL) + DEALLOCATE(ENERG,XVOLM) + IF(NED.GT.0) CALL LCMPTC(IPMAC,'ADDXSNAME-P0',8,NED,HVECT) + JPMAC=LCMLID(IPMAC,'GROUP',NGRP) + DO 365 IGR=1,NGRP + KPMAC=LCMDIL(JPMAC,IGR) + DO 320 I1D=1,N1D + IF(LMAKE1(I1D)) THEN + IF((.NOT.LPURE).AND.(I1D.EQ.4)) THEN + DO 311 IBM=1,NMIX + DO 310 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=1./GAR1(IBM,IGR,I1D) + 310 CONTINUE + 311 CONTINUE + ELSE IF(I1D.EQ.7) THEN + DO 316 IBM=1,NMIX + DO 315 IBMOLD=1,NMIL + IF(MIXC(IBM).EQ.IBMOLD) GAR1(IBM,IGR,I1D)=GAR1(IBM,IGR,I1D)* + 1 1.0E6 ! convert MeV to eV + 315 CONTINUE + 316 CONTINUE + ENDIF + CALL LCMPUT(KPMAC,HMAK1(I1D),NMIX,2,GAR1(1,IGR,I1D)) + ENDIF + 320 CONTINUE + DO 325 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 + 325 CONTINUE + DO 360 IL=1,NL + WRITE(CM,'(I2.2)') IL-1 + IPOSDE=0 + DO 350 IBM=1,NMIX + IPOS(IBM)=IPOSDE+1 + IGMIN=IGR + IGMAX=IGR + DO 330 JGR=1,NGRP + IF(GAR3(IBM,JGR,IGR,IL).NE.0.0) THEN + IGMIN=MIN(IGMIN,JGR) + IGMAX=MAX(IGMAX,JGR) + ENDIF + 330 CONTINUE + IJJ(IBM)=IGMAX + NJJ(IBM)=IGMAX-IGMIN+1 + DO 340 JGR=IGMAX,IGMIN,-1 + IPOSDE=IPOSDE+1 + GAR4(IPOSDE)=GAR3(IBM,JGR,IGR,IL) + 340 CONTINUE + 350 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 + 360 CONTINUE + 365 CONTINUE + IF(IDF.EQ.2) THEN + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'NTYPE',1,1,NSURFD) + CALL LCMPTC(IPMAC,'HADF',8,NSURFD,HADF) + DO ITYPE=1,NSURFD + CALL LCMPUT(IPMAC,HADF(ITYPE),NMIX*NGRP,2,ADF2(1,1,ITYPE)) + ENDDO + CALL LCMSIX(IPMAC,' ',2) + ENDIF + 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 SCRSAP: INCLUDE LEAKAGE IN THE, + 1 14H MACROLIB (B2=,1P,E12.5,2H).)') B2 + JPMAC=LCMGID(IPMAC,'GROUP') + ALLOCATE(WORK1(NMIX),WORK2(NMIX)) + DO 520 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + CALL LCMGET(KPMAC,'NTOT0',WORK1) + CALL LCMGET(KPMAC,'DIFF',WORK2) + DO 510 IBM=1,NMIX + IF(MIXC(IBM).NE.0) WORK1(IBM)=WORK1(IBM)+B2*WORK2(IBM) + 510 CONTINUE + CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,WORK1) + 520 CONTINUE + DEALLOCATE(WORK2,WORK1) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(HADF) + DEALLOCATE(FMASLB,FMASL,ADF2,GAR4B,GAR4,GAR3,GAR2,GAR1) + DEALLOCATE(IPOSB,NJJB,IJJB,IPOS,NJJ,IJJ) + RETURN + END diff --git a/Donjon/src/SCRSPH.f b/Donjon/src/SCRSPH.f new file mode 100644 index 0000000..e99385a --- /dev/null +++ b/Donjon/src/SCRSPH.f @@ -0,0 +1,728 @@ +*DECK SCRSPH + SUBROUTINE SCRSPH(IPMEM,IPMAC,ICAL,IMPX,HEQUI,HMASL,NMIL,NGROUP, + > ILUPS,SPH,B2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Extract a Macrolib corresponding to an elementary calculation in a +* memory-resident Saphyb. +* +*Copyright: +* Copyright (C) 2011 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 +* IPMEM pointer to the memory-resident Saphyb object. +* 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. +* NGROUP number of energy groups in the elementary calculation. +* 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 Saphyb. +* B2 buckling recovered from the Saphyb. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMEM,IPMAC + INTEGER ICAL,IMPX,NMIL,NGROUP,ILUPS + REAL SPH(NMIL,NGROUP),B2 + CHARACTER HEQUI*4,HMASL*4 +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXDIV=3 + INTEGER, PARAMETER::MAXLOC=10 + INTEGER, PARAMETER::MAXREA=25 + INTEGER, PARAMETER::MAXMAC=2 + INTEGER, PARAMETER::NSTATE=40 + REAL DEN,FF,CSCAT + INTEGER I, J, IR, I0, IAD, IBM, IDF, IFISS, IGMAX, IGMIN, IGR, IL, + & ILENG, ILOC, ILONG, IMAC, INDX, IPOSDE, IPRC, IREA, IRES, IS2, + & ISO, ISOKEP, ITRANC, ITYLCM, JGR, NADRX, NCALS, NDATAP, NDATAX, + & NED, NISO, NISOTS, NL, NW, NLOC, NMAC, NPARL, NPR, NPRC, NREA, + & NSURFD, NVDIV, IRENT0, IRENT1 + INTEGER ISTATE(NSTATE),DIMSAP(50) + REAL VALDIV(MAXDIV) + LOGICAL LSTRD,LDIFF,LSPH,LMASL + CHARACTER TEXT12*12,HSMG*131,NOMREA(MAXREA)*12,CM*2, + 1 IDVAL(MAXDIV)*4,LOCTYP(MAXLOC)*4,LOCKEY(MAXLOC)*4,TEXT8*8, + 2 TEXT9*8 + TYPE(C_PTR) JPMAC,KPMAC,JPMEM,KPMEM,LPMEM,MPMEM +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: LOCAD,ISADRX,LENGDX,LENGDP, + 1 IDATA,IHEDI,TOTM,RESM,ISOTS,NOMISO,IPOS,NJJM,IJJM + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: IADRX + REAL, ALLOCATABLE, DIMENSION(:) :: ENER,XVOLM,FLUXS,RDATA,STR,WRK, + 1 SCAT,GAR,RVALO,CONCES,LAMB,SURF,FMASL + REAL, ALLOCATABLE, DIMENSION(:,:) :: NWT0,XSB,SIGS0,SIGSB,SURFLX, + 1 WORK,BETAR,INVELS + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XS,SIGS,SS2DB,CHIRS + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: SS2D + LOGICAL, ALLOCATABLE, DIMENSION(:) :: LXS + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF + CHARACTER(LEN=20), ALLOCATABLE, DIMENSION(:) :: NOMMIL +*---- +* SCRATCH STORAGE ALLOCATION +* SIGS0 P0 scattering cross sections. +*---- + ALLOCATE(IPOS(NMIL),NJJM(NMIL),IJJM(NMIL),NOMMIL(NMIL)) + ALLOCATE(SIGS0(NMIL,NGROUP),FMASL(NMIL)) + FMASL(:NMIL)=0.0 +*---- +* RECOVER SAPHYB CHARACTERISTICS +*---- + CALL LCMLEN(IPMEM,'DIMSAP',ILENG,ITYLCM) + IF(ILENG.EQ.0) CALL XABORT('SCRSPH: INVALID SAPHYB.') + CALL LCMGET(IPMEM,'DIMSAP',DIMSAP) + IF(NMIL.NE.DIMSAP(7)) THEN + CALL XABORT('SCRSPH: INVALID VALUE OF NMIL.') + ELSE IF(NGROUP.NE.DIMSAP(20)) THEN + CALL XABORT('SCRSPH: INVALID VALUE OF NGROUP.') + ENDIF + NREA=DIMSAP(4) ! number of reactions + NISO=DIMSAP(5) ! number of particularized isotopes + NMAC=DIMSAP(6) ! number of macroscopic sets + NPARL=DIMSAP(11) ! number of local variables + NADRX=DIMSAP(18) ! number of address sets + NCALS=DIMSAP(19) ! number of elementary calculations in the Saphyb + NPRC=DIMSAP(31) ! number of delayed neutron precursor groups + NISOTS=DIMSAP(32) ! number of isotopes in edition tables + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(30H SCRSPH: number of reactions =,I3)') NREA + WRITE(IOUT,'(44H SCRSPH: number of particularized isotopes =, + 1 I4)') NISO + WRITE(IOUT,'(37H SCRSPH: number of macroscopic sets =,I2)') NMAC + WRITE(IOUT,'(29H SCRSPH: number of mixtures =,I5)') NMIL + WRITE(IOUT,'(36H SCRSPH: number of local variables =,I4)') NPARL + WRITE(IOUT,'(33H SCRSPH: number of address sets =,I4)') NADRX + WRITE(IOUT,'(33H SCRSPH: number of calculations =,I5)') NCALS + WRITE(IOUT,'(34H SCRSPH: number of energy groups =,I4)') NGROUP + WRITE(IOUT,'(37H SCRSPH: number of precursor groups =,I4)') NPRC + WRITE(IOUT,'(46H SCRSPH: number of isotopes in output tables =, + 1 I4)') NISOTS + ENDIF + IF(NREA.GT.MAXREA) CALL XABORT('SCRSPH: MAXREA OVERFLOW') + IF(NMAC.GT.MAXMAC) CALL XABORT('SCRSPH: MAXMAC OVERFLOW') + INDX=NISO+NMAC + IF(INDX.EQ.0) CALL XABORT('SCRSPH: NO CROSS SECTIONS FOUND.') +*---- +* RECOVER INFORMATION FROM constphysiq DIRECTORY. +*---- + ALLOCATE(ENER(NGROUP+1)) + CALL LCMSIX(IPMEM,'constphysiq',1) + CALL LCMGET(IPMEM,'ENRGS',ENER) + CALL LCMSIX(IPMEM,' ',2) + DO IGR=1,NGROUP+1 + ENER(IGR)=ENER(IGR)/1.0E-6 + ENDDO + CALL LCMPUT(IPMAC,'ENERGY',NGROUP+1,2,ENER) + DEALLOCATE(ENER) +*---- +* RECOVER INFORMATION FROM contenu DIRECTORY. +*---- + ALLOCATE(TOTM(NMIL),RESM(NMIL)) + CALL LCMSIX(IPMEM,'contenu',1) + IF(NREA.GT.0) THEN + CALL LCMGTC(IPMEM,'NOMREA',12,NREA,NOMREA) + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(29H SCRSPH: Available reactions:/(1X,10A13))') + 1 (NOMREA(I),I=1,NREA) + ENDIF + ENDIF + CALL LCMGET(IPMEM,'TOTMAC',TOTM) + CALL LCMGET(IPMEM,'RESMAC',RESM) + IF(NISO.GT.0) THEN + ALLOCATE(NOMISO(NISO*2)) + CALL LCMGET(IPMEM,'NOMISO',NOMISO) + ENDIF + CALL LCMSIX(IPMEM,' ',2) +*---- +* RECOVER INFORMATION FROM adresses DIRECTORY. +*---- + NL=0 + IF(NADRX.GT.0) THEN + ALLOCATE(IADRX((NREA+2),(NISO+NMAC),NADRX)) + CALL LCMSIX(IPMEM,'adresses',1) + CALL LCMGET(IPMEM,'ADRX',IADRX) + CALL LCMSIX(IPMEM,' ',2) + DO IAD=1,NADRX + DO ISO=1,NISO+NMAC + NL=MAX(NL,IADRX(NREA+1,ISO,IAD)) + NL=MAX(NL,IADRX(NREA+2,ISO,IAD)) + ENDDO + ENDDO + ENDIF + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(36H SCRSPH: number of legendre orders =,I4)') NL + ENDIF +*---- +* RECOVER INFORMATION FROM geom DIRECTORY. +*---- + NSURFD=0 + CALL LCMSIX(IPMEM,'geom',1) + ALLOCATE(XVOLM(NMIL)) + CALL LCMGET(IPMEM,'XVOLMT',XVOLM) + CALL LCMGTC(IPMEM,'NOMMIL',20,NMIL,NOMMIL) + CALL LCMLEN(IPMEM,'outgeom',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(IPMEM,'outgeom',1) + CALL LCMLEN(IPMEM,'SURF',NSURFD,ITYLCM) + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(42H SCRSPH: number of discontinuity factors =, + 1 I4/)') NSURFD + ENDIF + CALL LCMSIX(IPMEM,' ',2) + ENDIF + ALLOCATE(SURFLX(NSURFD,NGROUP),SURF(NSURFD)) + IF(NSURFD.GT.0) THEN + CALL LCMSIX(IPMEM,'outgeom',1) + CALL LCMGET(IPMEM,'SURF',SURF) + CALL LCMSIX(IPMEM,' ',2) + ENDIF + CALL LCMSIX(IPMEM,' ',2) +*---- +* RECOVER INFORMATION FROM caldir DIRECTORY. +*---- + JPMEM=LCMGID(IPMEM,'calc') + KPMEM=LCMGIL(JPMEM,ICAL) + CALL LCMSIX(KPMEM,'info',1) + LSPH=.FALSE. + LMASL=.FALSE. + IF(NPARL.GT.0) THEN + CALL LCMGET(KPMEM,'NLOC',NLOC) + IF(NLOC.GT.MAXLOC) CALL XABORT('SCRSPH: MAXLOC OVERFLOW') + CALL LCMGTC(KPMEM,'LOCTYP',4,NLOC,LOCTYP) + CALL LCMGTC(KPMEM,'LOCKEY',4,NLOC,LOCKEY) + ALLOCATE(LOCAD(NLOC+1)) + CALL LCMGET(KPMEM,'LOCADR',LOCAD) + DO ILOC=1,NLOC + LSPH=LSPH.OR.((LOCTYP(ILOC).EQ.'EQUI').AND. + 1 (LOCKEY(ILOC).EQ.HEQUI)) + LMASL=LMASL.OR.((LOCTYP(ILOC).EQ.'MASL').AND. + 1 (LOCKEY(ILOC).EQ.HMASL)) + ENDDO + ENDIF + IF((HEQUI.NE.' ').AND.(.NOT.LSPH)) THEN + WRITE(HSMG,'(46HSCRSPH: UNABLE TO FIND A LOCAL PARAMETER SET O, + 1 25HF TYPE EQUI WITH KEYWORD ,A4,1H.)') HEQUI + CALL XABORT(HSMG) + ELSE IF((HMASL.NE.' ').AND.(.NOT.LMASL)) THEN + WRITE(HSMG,'(46HSCRSPH: UNABLE TO FIND A LOCAL PARAMETER SET O, + 1 25HF TYPE MASL WITH KEYWORD ,A4,1H.)') HMASL + CALL XABORT(HSMG) + ENDIF + ALLOCATE(ISADRX(NMIL),LENGDX(NMIL),LENGDP(NMIL)) + CALL LCMGET(KPMEM,'ISADRX',ISADRX) + CALL LCMGET(KPMEM,'LENGDX',LENGDX) + CALL LCMGET(KPMEM,'LENGDP',LENGDP) + IF(NISOTS.GT.0) THEN + ALLOCATE(ISOTS(NISOTS*2)) + CALL LCMGET(KPMEM,'ISOTS',ISOTS) + ENDIF + CALL LCMSIX(KPMEM,' ',2) + CALL LCMSIX(KPMEM,'divers',1) + CALL LCMLEN(KPMEM,'NVDIV',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + NVDIV=0 + ELSE + CALL LCMGET(KPMEM,'NVDIV',NVDIV) + ENDIF + LSTRD=(B2.EQ.0.0) + IF(NVDIV.GT.0) THEN + IF(NVDIV.GT.MAXDIV) CALL XABORT('SCRSPH: MAXDIV OVERFLOW.') + CALL LCMGTC(KPMEM,'IDVAL',4,NVDIV,IDVAL) + CALL LCMGET(KPMEM,'VALDIV',VALDIV) + DO I=1,NVDIV + IF(IMPX.GT.1) THEN + WRITE(IOUT,'(9H SCRSPH: ,I3,2X,A,1H=,1P,E13.5)') I,IDVAL(I), + 1 VALDIV(I) + ENDIF + IF(IDVAL(I).EQ.'KEFF') THEN + CALL LCMPUT(IPMAC,'K-EFFECTIVE',1,2,VALDIV(I)) + ELSE IF(IDVAL(I).EQ.'KINF') THEN + CALL LCMPUT(IPMAC,'K-INFINITY',1,2,VALDIV(I)) + ELSE IF(IDVAL(I).EQ.'B2') THEN + B2=VALDIV(I) + LSTRD=(B2.EQ.0.0) + CALL LCMPUT(IPMAC,'B2 B1HOM',1,2,VALDIV(I)) + ENDIF + ENDDO + ENDIF + CALL LCMSIX(KPMEM,' ',2) +*---- +* ALLOCATE MACROLIB WORKING ARRAYS. +*---- + ALLOCATE(LXS(NREA),NWT0(NMIL,NGROUP),SIGS(NMIL,NGROUP,NL), + 1 SS2D(NMIL,NGROUP,NGROUP,NL),XS(NMIL,NGROUP,NREA)) + NWT0(: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. +*---- +* ALLOCATE DELAYED NEUTRON WORKING ARRAYS. +*---- + ALLOCATE(LAMB(NPRC),CHIRS(NGROUP,NPRC,NMIL),BETAR(NPRC,NMIL), + 1 INVELS(NGROUP,NMIL)) + LAMB(:NPRC)=0.0 + CHIRS(:NGROUP,:NPRC,:NMIL)=0.0 + BETAR(:NPRC,:NMIL)=0.0 + INVELS(:NGROUP,:NMIL)=0.0 + CALL LCMSIX(KPMEM,'divers',1) + CALL LCMLEN(KPMEM,'NPR',ILONG,ITYLCM) + IF((NPRC.GT.0).AND.(ILONG.EQ.1)) THEN + CALL LCMGET(KPMEM,'NPR',NPR) + IF(NPR.NE.NPRC) CALL XABORT('SCRSPH: NPR INCONSISTENCY(1).') + CALL LCMGET(KPMEM,'LAMBRS',LAMB) + DO IBM=1,NMIL + CALL LCMGET(IPMEM,'CHIRS',CHIRS(1,1,IBM)) + CALL LCMGET(IPMEM,'BETARS',BETAR(1,IBM)) + CALL LCMGET(IPMEM,'INVELS',INVELS(1,IBM)) + ENDDO + ENDIF + CALL LCMSIX(KPMEM,' ',2) +*---- +* LOOP OVER SAPHYB MIXTURES. +*---- + IF(NADRX.EQ.0) CALL XABORT('SCRSPH: NO ADDRESS SETS AVAILABLE.') + LPMEM=LCMGID(KPMEM,'mili') + DO IBM=1,NMIL + CALL LCMLEL(LPMEM,IBM,ILONG,ITYLCM) + IF(ILONG.EQ.0) CYCLE + MPMEM=LCMGIL(LPMEM,IBM) + IMAC=TOTM(IBM) + IRES=RESM(IBM) + IAD=ISADRX(IBM) + NDATAX=LENGDX(IBM) + NDATAP=LENGDP(IBM) + ALLOCATE(FLUXS(NGROUP),RDATA(NDATAX),IDATA(NDATAP)) + CALL LCMGET(MPMEM,'FLUXS',FLUXS) + CALL LCMGET(MPMEM,'RDATAX',RDATA) + CALL LCMGET(MPMEM,'IDATAP',IDATA) + DO I=1,NGROUP + NWT0(IBM,I)=NWT0(IBM,I)+FLUXS(I) + ENDDO + ALLOCATE(SIGSB(NGROUP,NL),SS2DB(NGROUP,NGROUP,NL), + 1 XSB(NGROUP,NREA)) + IF(IMAC.NE.0) THEN + CALL SPHSXS(NREA,INDX,NADRX,NGROUP,NL,NDATAX,NDATAP, + 1 NISO+IMAC,IAD,IADRX,RDATA,IDATA,NOMREA,SIGSB,SS2DB,XSB, + 2 LXS) + DO IL=1,NL + DO I=1,NGROUP + SIGS(IBM,I,IL)=SIGS(IBM,I,IL)+SIGSB(I,IL) + ENDDO + ENDDO + DO IL=1,NL + DO J=1,NGROUP + DO I=1,NGROUP + SS2D(IBM,I,J,IL)=SS2D(IBM,I,J,IL)+SS2DB(I,J,IL) + ENDDO + ENDDO + ENDDO + DO IR=1,NREA + DO I=1,NGROUP + XS(IBM,I,IR)=XS(IBM,I,IR)+XSB(I,IR) + ENDDO + ENDDO + ELSE IF(NISO.NE.0) THEN + IF(NISOTS.EQ.0) CALL XABORT('SCRSPH: MISSING CONCES INFO.') + ALLOCATE(CONCES(NISOTS)) + CALL LCMGET(MPMEM,'CONCES',CONCES) + DO ISO=1,NISO + WRITE(TEXT8,'(2A4)') (NOMISO(2*(ISO-1)+I0),I0=1,2) + ISOKEP=0 + DO IS2=1,NISOTS + ISOKEP=IS2 + WRITE(TEXT9,'(2A4)') (ISOTS(2*(IS2-1)+I0),I0=1,2) + IF(TEXT9.EQ.TEXT8) GO TO 10 + ENDDO + CYCLE + 10 DEN=CONCES(ISOKEP) + IF(DEN.NE.0.0) THEN + CALL SPHSXS(NREA,INDX,NADRX,NGROUP,NL,NDATAX,NDATAP,ISO, + 1 IAD,IADRX,RDATA,IDATA,NOMREA,SIGSB,SS2DB,XSB,LXS) + DO IL=1,NL + DO I=1,NGROUP + SIGS(IBM,I,IL)=SIGS(IBM,I,IL)+DEN*SIGSB(I,IL) + ENDDO + ENDDO + DO IL=1,NL + DO J=1,NGROUP + DO I=1,NGROUP + SS2D(IBM,I,J,IL)=SS2D(IBM,I,J,IL)+DEN*SS2DB(I,J,IL) + ENDDO + ENDDO + ENDDO + DO IR=1,NREA + DO I=1,NGROUP + XS(IBM,I,IR)=XS(IBM,I,IR)+DEN*XSB(I,IR) + ENDDO + ENDDO + ENDIF + ENDDO + DEALLOCATE(CONCES) + IF(IRES.NE.0) THEN + CALL SPHSXS(NREA,INDX,NADRX,NGROUP,NL,NDATAX,NDATAP, + 1 NISO+IRES,IAD,IADRX,RDATA,IDATA,NOMREA,SIGSB,SS2DB,XSB, + 2 LXS) + DO IL=1,NL + DO I=1,NGROUP + SIGS(IBM,I,IL)=SIGS(IBM,I,IL)+SIGSB(I,IL) + ENDDO + ENDDO + DO IL=1,NL + DO J=1,NGROUP + DO I=1,NGROUP + SS2D(IBM,I,J,IL)=SS2D(IBM,I,J,IL)+SS2DB(I,J,IL) + ENDDO + ENDDO + ENDDO + DO IR=1,NREA + DO I=1,NGROUP + XS(IBM,I,IR)=XS(IBM,I,IR)+XSB(I,IR) + ENDDO + ENDDO + ENDIF + ELSE + CALL XABORT('SCRSPH: NO MACROSCOPIC SET.') + ENDIF + DEALLOCATE(XSB,SS2DB,SIGSB,IDATA,RDATA,FLUXS) +* +* UP-SCATTERING CORRECTION OF THE MACROLIB. + IF(ILUPS.EQ.1) THEN + IRENT0=0 + IRENT1=0 + DO IREA=1,NREA + IF(NOMREA(IREA).EQ.'TOTALE') IRENT0=IREA + IF(NOMREA(IREA).EQ.'TOTALE P1') IRENT1=IREA + ENDDO + IF(IRENT0.EQ.0) CALL XABORT('SCRSPH: MISSING NTOT0.') + 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 + XS(IBM,IGR,IRENT0)=XS(IBM,IGR,IRENT0)-CSCAT*FF + XS(IBM,JGR,IRENT0)=XS(IBM,JGR,IRENT0)-CSCAT + IF((IRENT1.GT.0).AND.(NL.GT.1)) THEN + CSCAT=SS2D(IBM,IGR,JGR,2) + XS(IBM,IGR,IRENT1)=XS(IBM,IGR,IRENT1)-CSCAT*FF + XS(IBM,JGR,IRENT1)=XS(IBM,JGR,IRENT1)-CSCAT + ENDIF + 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 + ALLOCATE(RVALO(LOCAD(NLOC+1)-1)) + CALL LCMGET(MPMEM,'RVALOC',RVALO) + DO ILOC=1,NLOC + IF((LOCTYP(ILOC).EQ.'EQUI').AND.(LOCKEY(ILOC).EQ.HEQUI)) + 1 THEN + IF(LOCAD(ILOC+1)-LOCAD(ILOC).NE.NGROUP) THEN + CALL XABORT('SCRSPH: INVALID NUMBER OF COMPONENTS FOR ' + 1 //'SPH FACTORS') + ENDIF + DO IGR=1,NGROUP + SPH(IBM,IGR)=RVALO(LOCAD(ILOC)+IGR-1) + ENDDO + ENDIF + ENDDO + DEALLOCATE(RVALO) + ELSE + SPH(IBM,:NGROUP)=1.0 + ENDIF + IF(LMASL) THEN + ALLOCATE(RVALO(LOCAD(NLOC+1)-1)) + CALL LCMGET(MPMEM,'RVALOC',RVALO) + DO ILOC=1,NLOC + IF((LOCTYP(ILOC).EQ.'MASL').AND.(LOCKEY(ILOC).EQ.HMASL)) + 1 THEN + IF(LOCAD(ILOC+1)-LOCAD(ILOC).NE.1) THEN + CALL XABORT('SCRSPH: INVALID NUMBER OF COMPONENTS FOR ' + 1 //'MASL') + ENDIF + FMASL(IBM)=RVALO(LOCAD(ILOC)) + ENDIF + ENDDO + DEALLOCATE(RVALO) + ENDIF +* + CALL LCMLEN(MPMEM,'cinetique',ILONG,ITYLCM) + IF((NPRC.GT.0).AND.(ILONG.NE.0)) THEN + CALL LCMSIX(MPMEM,'cinetique',1) + CALL LCMGET(MPMEM,'NPR',NPR) + IF(NPR.NE.NPRC) CALL XABORT('SCRSPH: NPR INCONSISTENCY(2).') + CALL LCMGET(MPMEM,'LAMBRS',LAMB) + CALL LCMGET(MPMEM,'CHIRS',CHIRS(1,1,IBM)) + CALL LCMGET(MPMEM,'BETARS',BETAR(1,IBM)) + CALL LCMGET(MPMEM,'INVELS',INVELS(1,IBM)) + CALL LCMSIX(MPMEM,' ',2) + ENDIF +* END OF LOOP OVER SAPHYB MIXTURES + ENDDO + IF(NPARL.GT.0) DEALLOCATE(LOCAD) +*---- +* RECOVER DISCONTINUITY FACTOR INFORMATION +*---- + IDF=0 + IF(NSURFD.GT.0) THEN + IDF=2 + CALL LCMSIX(KPMEM,'outflx',1) + CALL LCMGET(KPMEM,'SURFLX',SURFLX) + CALL LCMSIX(KPMEM,' ',2) + CALL LCMSIX(IPMAC,'ADF',1) + CALL LCMPUT(IPMAC,'NTYPE',1,1,NSURFD) + ALLOCATE(HADF(NSURFD),WORK(NMIL,NGROUP)) + DO I=1,NSURFD + WRITE(HADF(I),'(3HFD_,I5.5)') I + DO IGR=1,NGROUP + WORK(:,IGR)=SURFLX(I,IGR)/SURF(I) + ENDDO + CALL LCMPUT(IPMAC,HADF(I),NMIL*NGROUP,2,WORK) + ENDDO + CALL LCMPTC(IPMAC,'HADF',8,NSURFD,HADF) + DEALLOCATE(WORK,HADF) + CALL LCMSIX(IPMAC,' ',2) + ENDIF + DEALLOCATE(SURFLX,SURF) +*---- +* IDENTIFY SPECIAL FLUX EDITS +*---- + ALLOCATE(IHEDI(2*NREA)) + NED=0 + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + IF(NOMREA(IREA).EQ.'TOTALE') CYCLE + IF(NOMREA(IREA).EQ.'TOTALE P1') CYCLE + IF(NOMREA(IREA).EQ.'EXCESS') CYCLE + IF(NOMREA(IREA).EQ.'FISSION') CYCLE + IF(NOMREA(IREA).EQ.'SPECTRE') CYCLE + IF(NOMREA(IREA).EQ.'NU*FISSION') CYCLE + IF(NOMREA(IREA)(:7).EQ.'ENERGIE') CYCLE + IF(NOMREA(IREA).EQ.'SELF') CYCLE + IF(NOMREA(IREA).EQ.'TRANSP-CORR') CYCLE + IF(NOMREA(IREA).EQ.'FUITES') CYCLE + IF(NOMREA(IREA).EQ.'DIFFUSION') CYCLE + IF(NOMREA(IREA).EQ.'TRANSFERT') CYCLE + NED=NED+1 + READ(NOMREA(IREA),'(2A4)') IHEDI(2*NED-1),IHEDI(2*NED) + ENDDO +*---- +* STORE MACROLIB. +*---- + CALL LCMPUT(IPMAC,'VOLUME',NMIL,2,XVOLM) + IF(LMASL) CALL LCMPUT(IPMAC,'MASL',NMIL,2,FMASL) + IF(NPRC.GT.0) CALL LCMPUT(IPMAC,'LAMBDA-D',NPRC,2,LAMB) + IFISS=0 + ITRANC=0 + LDIFF=.FALSE. + NW=0 + ALLOCATE(STR(NMIL),WRK(NMIL)) + SIGS0(:NMIL,:NGROUP)=0.0 + JPMAC=LCMLID(IPMAC,'GROUP',NGROUP) + DO IGR=1,NGROUP + STR(:NMIL)=0.0 + KPMAC=LCMDIL(JPMAC,IGR) + CALL LCMPUT(KPMAC,'FLUX-INTG',NMIL,2,NWT0(1,IGR)) + IF(NPRC.GT.0) THEN + DO IBM=1,NMIL + WRK(IBM)=INVELS(IGR,IBM) + ENDDO + CALL LCMPUT(KPMAC,'OVERV',NMIL,2,WRK) + ENDIF + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + IF(NOMREA(IREA).EQ.'TOTALE') THEN + IF(LSTRD) THEN + DO IBM=1,NMIL + STR(IBM)=STR(IBM)+XS(IBM,IGR,IREA) + ENDDO + ENDIF + CALL LCMPUT(KPMAC,'NTOT0',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'TOTALE P1') THEN + NW=1 + CALL LCMPUT(KPMAC,'NTOT1',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'EXCESS') THEN +* correct scattering XS with excess XS + DO IBM=1,NMIL + SIGS0(IBM,IGR)=SIGS0(IBM,IGR)+XS(IBM,IGR,IREA) + ENDDO + 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.'SPECTRE') THEN + CALL LCMPUT(KPMAC,'CHI',NMIL,2,XS(1,IGR,IREA)) + DO IPRC=1,NPRC + DO IBM=1,NMIL + WRK(IBM)=CHIRS(IGR,IPRC,IBM) + ENDDO + WRITE(TEXT12,'(A3,I2.2)') 'CHI',IPRC + CALL LCMPUT(KPMAC,TEXT12,NMIL,2,WRK) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'NU*FISSION') THEN + IFISS=1 + CALL LCMPUT(KPMAC,'NUSIGF',NMIL,2,XS(1,IGR,IREA)) + DO IPRC=1,NPRC + DO IBM=1,NMIL + WRK(IBM)=XS(IBM,IGR,IREA)*BETAR(IPRC,IBM) + ENDDO + WRITE(TEXT12,'(A6,I2.2)') 'NUSIGF',IPRC + CALL LCMPUT(KPMAC,TEXT12,NMIL,2,WRK) + ENDDO + ELSE IF(NOMREA(IREA).EQ.'ENERGIE') THEN + CALL LCMPUT(KPMAC,'H-FACTOR',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'SELF') THEN + CALL LCMPUT(KPMAC,'SIGW00',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'TRANSP-CORR') THEN + ITRANC=2 + IF(LSTRD) THEN + DO IBM=1,NMIL + STR(IBM)=STR(IBM)-XS(IBM,IGR,IREA) + ENDDO + ENDIF + CALL LCMPUT(KPMAC,'TRANC',NMIL,2,XS(1,IGR,IREA)) + ELSE IF(NOMREA(IREA).EQ.'FUITES') THEN + LDIFF=LSTRD + IF(.NOT.LSTRD) THEN + DO IBM=1,NMIL + LDIFF=LDIFF.OR.(XS(IBM,IGR,IREA).NE.0.0) + STR(IBM)=XS(IBM,IGR,IREA)/B2 + ENDDO + ENDIF + 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) + ENDDO + ELSE + CALL LCMPUT(KPMAC,'SIGS'//CM,NMIL,2,SIGS(1,IGR,IL)) + ENDIF + ENDDO + ELSE IF(NOMREA(IREA).EQ.'TRANSFERT') 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) + 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 + IF(LSTRD) THEN + IF((ITRANC.EQ.0).AND.(NL.GT.1)) THEN +* Apollo-type transport correction + DO IBM=1,NMIL + STR(IBM)=STR(IBM)-SIGS(IBM,IGR,2) + ENDDO + ENDIF + DO IBM=1,NMIL + STR(IBM)=1.0/(3.0*STR(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,STR) + ENDDO + DEALLOCATE(WRK,STR) +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(INVELS,BETAR,CHIRS,LAMB,LXS,XS,SS2D,SIGS,NWT0,LENGDP, + 1 LENGDX,ISADRX,XVOLM) + IF(NISOTS.GT.0) DEALLOCATE(ISOTS) + IF(NADRX.GT.0) DEALLOCATE(IADRX) + IF(NISO.GT.0) DEALLOCATE(NOMISO) + DEALLOCATE(RESM,TOTM) +*---- +* SAVE SCATTERING P0 INFO +*---- + DO IGR=1,NGROUP + KPMAC=LCMDIL(JPMAC,IGR) + CALL LCMPUT(KPMAC,'SIGS00',NMIL,2,SIGS0(1,IGR)) + ENDDO +*---- +* WRITE STATE VECTOR +*---- + 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(7)=NPRC + IF(LDIFF) ISTATE(9)=1 + ISTATE(10)=NW + ISTATE(12)=IDF + CALL LCMPUT(IPMAC,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(NED.GT.0) CALL LCMPUT(IPMAC,'ADDXSNAME-P0',2*NED,3,IHEDI) + DEALLOCATE(IHEDI) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(FMASL,SIGS0) + DEALLOCATE(NOMMIL,IJJM,NJJM,IPOS) + RETURN + END diff --git a/Donjon/src/SCRSXS.f b/Donjon/src/SCRSXS.f new file mode 100644 index 0000000..ec98050 --- /dev/null +++ b/Donjon/src/SCRSXS.f @@ -0,0 +1,114 @@ +*DECK SCRSXS + SUBROUTINE SCRSXS(NGRP,NL,NREA,IREAF,NOMREA,LXS,B2SAP,FACT0, + 1 WEIGHT,SPH,FLUXS,XSB,SIGSB,SS2DB,LPURE,XS,SIGS,SS2D,TAUXFI) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Weight microscopic cross section data in an interpolated microlib. +* +*Copyright: +* Copyright (C) 2017 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 +* NGRP number of energy groups +* NL maximum Legendre order (NL=1 is for isotropic scattering) +* NREA number of reactions in the Saphyb object +* IREAF position of 'NU*FISSION' reaction in NOMREA array +* NOMREA names of reactions in the Saphyb object +* LXS existence flag of each reaction +* B2SAP buckling as recovered from the Saphyb object +* FACT0 number density ratio for the isotope +* WEIGHT interpolation weight +* SPH SPH factors +* FLUXS averaged flux +* XSB cross sections per reaction for a unique calculation +* SIGSB scattering cross sections for a unique calculation +* SS2DB scattering matrix for a unique calculation +* LPURE =.true. if the interpolation is a pure linear interpolation +* with TERP factors. +* +*Parameters: input/output +* XS interpolated cross sections per reaction +* SIGS interpolated scattering cross sections +* SS2D interpolated scattering matrix +* TAUXFI interpolated fission rate +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NGRP,NL,NREA,IREAF + INTEGER I, IGR, IL, IREA, IRF, J, JGR + REAL TAUXF, XSECT + REAL B2SAP,FACT0,WEIGHT,SPH(NGRP),FLUXS(NGRP),XSB(NGRP*NREA), + 1 SIGSB(NGRP*NL),SS2DB(NL*NGRP*NGRP),XS(NGRP*NREA),SIGS(NGRP*NL), + 2 SS2D(NGRP*NGRP*NL),TAUXFI + CHARACTER NOMREA(NREA)*12 + LOGICAL LXS(NREA),LPURE +*---- +* COMPUTE FISSION RATE FOR AN ELEMENTARY CALCULATION +*---- + TAUXF=0.0 + IF(.NOT.LPURE.AND.(IREAF.GT.0)) THEN + DO IGR=1,NGRP + IRF=(IREAF-1)*NGRP+IGR + TAUXF=TAUXF+XSB(IRF)*FLUXS(IGR) + ENDDO + TAUXFI=TAUXFI+WEIGHT*FACT0*TAUXF + ENDIF +*---- +* MICROLIB INTERPOLATION +*---- + DO IGR=1,NGRP + DO IREA=1,NREA + IF(.NOT.LXS(IREA)) CYCLE + I=(IREA-1)*NGRP+IGR + IF(LPURE.AND.NOMREA(IREA).EQ.'SPECTRE') THEN + XS(I)=XS(I)+WEIGHT*XSB(I) + ELSE IF(NOMREA(IREA).EQ.'SPECTRE') THEN + XS(I)=XS(I)+WEIGHT*FACT0*TAUXF*XSB(I) + ELSE IF(NOMREA(IREA).EQ.'FUITES') THEN + IF(B2SAP.NE.0.0) THEN + XSECT=XSB(I)/B2SAP + XS(I)=XS(I)+SPH(IGR)*FACT0*WEIGHT*XSECT + ENDIF + ELSE IF(NOMREA(IREA).EQ.'TOTALE P1') THEN + XS(I)=XS(I)+FACT0*WEIGHT*XSB(I)/SPH(IGR) + ELSE + XS(I)=XS(I)+FACT0*SPH(IGR)*WEIGHT*XSB(I) + ENDIF + ENDDO + DO IL=1,NL + I=(IL-1)*NGRP+IGR + IF(MOD(IL,2).EQ.1) THEN + SIGS(I)=SIGS(I)+FACT0*SPH(IGR)*WEIGHT*SIGSB(I) + ELSE + DO JGR=1,NGRP + J=(IL-1)*NGRP*NGRP+(IGR-1)*NGRP+JGR + SIGS(I)=SIGS(I)+FACT0*WEIGHT*SS2DB(J)/SPH(JGR) + ENDDO + ENDIF + ENDDO + DO JGR=1,NGRP + DO IL=1,NL + I=(IL-1)*NGRP*NGRP+(JGR-1)*NGRP+IGR + IF(MOD(IL,2).EQ.1) THEN + SS2D(I)=SS2D(I)+FACT0*SPH(JGR)*WEIGHT*SS2DB(I) + ELSE + SS2D(I)=SS2D(I)+FACT0*WEIGHT*SS2DB(I)/SPH(IGR) + ENDIF + ENDDO + ENDDO + ENDDO + RETURN + END diff --git a/Donjon/src/SCRTOC.f b/Donjon/src/SCRTOC.f new file mode 100644 index 0000000..f1cca53 --- /dev/null +++ b/Donjon/src/SCRTOC.f @@ -0,0 +1,167 @@ +*DECK SCRTOC + SUBROUTINE SCRTOC(IPSAP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Print the table of content of a Saphyb. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPSAP address of the multidimensional Saphyb object. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXLAM=20 + INTEGER, PARAMETER::MAXPAR=50 + INTEGER, PARAMETER::MAXVAL=200 + INTEGER I, ILENG,ILONG, IPAR, ITYLCM, + & NADRX, NCALS, NGROUP, NISO, NISOTS, NLAM, NMAC, NMIL, NPAR, + & NPARL, NPRC, NREA, NSURFD + INTEGER DIMSAP(50),NVALUE(MAXPAR),VINTE(MAXVAL) + REAL VREAL(MAXVAL) + CHARACTER PARKEY(MAXPAR)*4,PARTYP(MAXPAR)*4,PARFMT(MAXPAR)*8, + 1 VCHAR(MAXVAL)*12,RECNAM*12,NAMLAM(MAXLAM)*8 + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: TEXT8 + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: TEXT12 +*---- +* DIMSAP INFORMATION +*---- + CALL LCMLEN(IPSAP,'DIMSAP',ILENG,ITYLCM) + IF(ILENG.EQ.0) CALL XABORT('SCRTOC: INVALID SAPHYB.') + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + NLAM=DIMSAP(3) ! number of radioactive decay reactions + NREA=DIMSAP(4) ! number of neutron-induced reactions + NISO=DIMSAP(5) ! number of particularized isotopes + NMAC=DIMSAP(6) ! number of macroscopic sets + NMIL=DIMSAP(7) ! number of mixtures + NPAR=DIMSAP(8) ! number of global parameters + NPARL=DIMSAP(11) ! number of local variables + NADRX=DIMSAP(18) ! number of address sets + NCALS=DIMSAP(19) ! number of elementary calculations in the Saphyb + NGROUP=DIMSAP(20) ! number of energy groups + NPRC=DIMSAP(31) ! number of delayed neutron precursor groups + NISOTS=DIMSAP(32) ! maximum number of isotopes in output tables + WRITE(IOUT,'(/38H SCRTOC: table of content information:)') + WRITE(IOUT,'(42H number of radioactive decay reactions =,I3)') + 1 NLAM + WRITE(IOUT,'(40H number of neutron-induced reactions =,I3)') + 1 NREA + WRITE(IOUT,'(38H number of particularized isotopes =,I4)') NISO + WRITE(IOUT,'(31H number of macroscopic sets =,I2)') NMAC + WRITE(IOUT,'(23H number of mixtures =,I5)') NMIL + WRITE(IOUT,'(32H number of global parameters =,I4)') NPAR + WRITE(IOUT,'(30H number of local variables =,I4)') NPARL + WRITE(IOUT,'(27H number of address sets =,I4)') NADRX + WRITE(IOUT,'(27H number of calculations =,I7)') NCALS + WRITE(IOUT,'(28H number of energy groups =,I4)') NGROUP + WRITE(IOUT,'(31H number of precursor groups =,I4)') NPRC + WRITE(IOUT,'(48H maximum number of isotopes in output tables =, + 1 I4/)') NISOTS + IF(NLAM.GT.0) THEN + CALL LCMSIX(IPSAP,'constphysiq',1) + IF(NLAM.GT.MAXLAM) CALL XABORT('SCRTOC: MAXLAM OVERFLOW') + CALL LCMGTC(IPSAP,'NOMLAM',8,NLAM,NAMLAM) + WRITE(IOUT,'(40H names of radioactive decay reactions:/ + 1 (5X,5A10))') (NAMLAM(I),I=1,NLAM) + CALL LCMSIX(IPSAP,' ',2) + ENDIF + CALL LCMSIX(IPSAP,'contenu',1) + IF(NREA.GT.0) THEN + ALLOCATE(TEXT12(NREA)) + CALL LCMGTC(IPSAP,'NOMREA',12,NREA,TEXT12) + WRITE(IOUT,'(38H names of neutron-induced reactions:/ + 1 (5X,A12,2X,A12,2X,A12,2X,A12,2X,A12))') (TEXT12(I),I=1,NREA) + DEALLOCATE(TEXT12) + ENDIF + IF(NISO.GT.0) THEN + ALLOCATE(TEXT8(NISO)) + CALL LCMGTC(IPSAP,'NOMISO',8,NISO,TEXT8) + WRITE(IOUT,'(36H names of particularized isotopes:/ + 1 (5X,A8,2X,A8,2X,A8,2X,A8,2X,A8))') (TEXT8(I),I=1,NISO) + DEALLOCATE(TEXT8) + ENDIF + IF(NMAC.GT.0) THEN + ALLOCATE(TEXT8(NMAC)) + CALL LCMGTC(IPSAP,'NOMMAC',8,NMAC,TEXT8) + WRITE(IOUT,'(29H names of macroscopic sets:/ + 1 (5X,A8,2X,A8,2X,A8,2X,A8,2X,A8))') (TEXT8(I),I=1,NMAC) + DEALLOCATE(TEXT8) + ENDIF + CALL LCMSIX(IPSAP,' ',2) + CALL LCMSIX(IPSAP,'geom',1) + CALL LCMLEN(IPSAP,'outgeom',ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + CALL LCMSIX(IPSAP,'outgeom',1) + CALL LCMLEN(IPSAP,'SURF',NSURFD,ITYLCM) + WRITE(IOUT,'(36H number of discontinuity factors =,I4/)') + 1 NSURFD + CALL LCMSIX(IPSAP,' ',2) + ENDIF + CALL LCMSIX(IPSAP,' ',2) +*---- +* GLOBAL PARAMETERS INFORMATION +*---- + IF(NPAR.GT.MAXPAR) CALL XABORT('SCRTOC: MAXPAR OVERFLOW') + CALL LCMSIX(IPSAP,'paramdescrip',1) + CALL LCMGET(IPSAP,'NVALUE',NVALUE) + CALL LCMGTC(IPSAP,'PARKEY',4,NPAR,PARKEY) + CALL LCMGTC(IPSAP,'PARTYP',4,NPAR,PARTYP) + CALL LCMGTC(IPSAP,'PARFMT',8,NPAR,PARFMT) + CALL LCMSIX(IPSAP,' ',2) + CALL LCMSIX(IPSAP,'paramvaleurs',1) + DO IPAR=1,NPAR + WRITE(IOUT,'(25H SCRTOC: global parameter,A5,8H of type,A5, + 1 1H:)') PARKEY(IPAR),PARTYP(IPAR) + IF(NVALUE(IPAR).GT.MAXVAL) CALL XABORT('SCRTOC: MAXVAL OVERF' + 1 //'LOW') + WRITE(RECNAM,'(''pval'',I8)') IPAR + IF(PARFMT(IPAR).EQ.'ENTIER') THEN + CALL LCMGET(IPSAP,RECNAM,VINTE) + WRITE(IOUT,'(20H TABULATED POINTS=,1P,6I12/(20X,6I12))') + 1 (VINTE(I),I=1,NVALUE(IPAR)) + ELSE IF(PARFMT(IPAR).EQ.'FLOTTANT') THEN + CALL LCMGET(IPSAP,RECNAM,VREAL) + WRITE(IOUT,'(20H TABULATED POINTS=,1P,6E12.4/(20X, + 1 6E12.4))') (VREAL(I),I=1,NVALUE(IPAR)) + ELSE IF(PARFMT(IPAR).EQ.'CHAINE') THEN + CALL LCMGTC(IPSAP,RECNAM,12,NVALUE(IPAR),VCHAR) + WRITE(IOUT,'(20H TABULATED POINTS=,2X,6A12/(22X,6A12))') + 1 (VCHAR(I),I=1,NVALUE(IPAR)) + ENDIF + ENDDO + CALL LCMSIX(IPSAP,' ',2) +*---- +* LOCAL VARIABLES INFORMATION +*---- + IF(NPARL.GT.0) THEN + IF(NPARL.GT.MAXPAR) CALL XABORT('SCRTOC: MAXPAR OVERFLOW') + CALL LCMSIX(IPSAP,'varlocdescri',1) + CALL LCMGTC(IPSAP,'PARKEY',4,NPARL,PARKEY) + CALL LCMGTC(IPSAP,'PARTYP',4,NPARL,PARTYP) + CALL LCMGTC(IPSAP,'PARFMT',8,NPARL,PARFMT) + DO IPAR=1,NPARL + WRITE(IOUT,'(23H SCRTOC: local variable,A5,8H of type,A5, + 1 11H and format,A9,1H:)') PARKEY(IPAR),PARTYP(IPAR), + 2 PARFMT(IPAR) + ENDDO + CALL LCMSIX(IPSAP,' ',2) + ENDIF + WRITE(IOUT,'(/)') + RETURN + END diff --git a/Donjon/src/SCRTRP.f b/Donjon/src/SCRTRP.f new file mode 100644 index 0000000..53ef90d --- /dev/null +++ b/Donjon/src/SCRTRP.f @@ -0,0 +1,214 @@ +*DECK SCRTRP + SUBROUTINE SCRTRP(IPSAP,LCUB2,IMPX,NVP,NPAR,NCAL,MUPLET,MUTYPE, + 1 VALR,VARVAL,TERP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the TERP interpolation/derivation/integration factors using +* table-of-content information of the Saphyb. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPSAP address of the multidimensional Saphyb object. +* LCUB2 interpolation type for each parameter (=.TRUE.: cubic Ceschino +* interpolation; =.FALSE: linear Lagrange interpolation). +* IMPX print parameter (equal to zero for no print). +* NVP number of nodes in the global parameter tree. +* NPAR number of global parameters. +* NCAL number of elementary calculations in the Saphyb. +* MUPLET tuple used to identify an elementary calculation. +* MUTYPE type of interpolation (=1: interpolation; =2: delta-sigma). +* VALR real values of the interpolated point. +* VARVAL exit burnup used if MUTYPE(IPAR(ID))=3. +* +*Parameters: output +* TERP interpolation factors. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER, PARAMETER::MAXPAR=50 + TYPE(C_PTR) IPSAP + INTEGER IMPX,NVP,NPAR,NCAL,MUPLET(NPAR),MUTYPE(NPAR) + REAL VALR(2*MAXPAR,2),VARVAL,TERP(NCAL) + LOGICAL LCUB2(NPAR) +*---- +* LOCAL VARIABLES +*---- + INTEGER, PARAMETER::IOUT=6 + INTEGER, PARAMETER::MAXDIM=10 + INTEGER, PARAMETER::MAXVAL=200 + INTEGER IPAR(MAXDIM),NVALUE(MAXPAR),NVAL(MAXDIM),IDDIV(MAXDIM) + REAL BURN0, BURN1, DENOM, TERTMP + INTEGER I, ICAL, ID, IDTMP, IDTOT, ILONG, ITYLCM, JD, + & MAXNVP, NDELTA, NDIM, NID, NTOT, NCRCAL + REAL VREAL(MAXVAL),T1D(MAXVAL,MAXDIM),WORK(MAXVAL) + CHARACTER HSMG*131,RECNAM*12,PARKEY(MAXPAR)*4 + LOGICAL LCUBIC,LSINGL + TYPE(C_PTR) LPSAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: JDEBAR,JARBVA + REAL, ALLOCATABLE, DIMENSION(:) :: TERPA +*---- +* RECOVER TREE INFORMATION +*---- + LPSAP=LCMGID(IPSAP,'paramarbre') + CALL LCMLEN(LPSAP,'ARBVAL',MAXNVP,ITYLCM) + IF(NVP.GT.MAXNVP) CALL XABORT('SCRTRP: NVP OVERFLOW.') + ALLOCATE(JDEBAR(MAXNVP+1),JARBVA(MAXNVP)) + CALL LCMGET(LPSAP,'DEBARB',JDEBAR) + CALL LCMGET(LPSAP,'ARBVAL',JARBVA) + LPSAP=LCMGID(IPSAP,'paramdescrip') + CALL LCMGET(LPSAP,'NVALUE',NVALUE) + CALL LCMGTC(LPSAP,'PARKEY',4,NPAR,PARKEY) +*---- +* 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,'(7HSCRTRP:,I4,29H-DIMENSIONAL INTERPOLATION NO, + 1 14HT IMPLEMENTED.)') NDIM + CALL XABORT(HSMG) + ENDIF + IPAR(NDIM)=I + ENDIF + 10 CONTINUE + IF(IMPX.GT.2) THEN + WRITE(IOUT,'(16H SCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(8H SCRTRP:,I4,27H-DIMENSIONAL INTERPOLATION.)') + 1 NDIM + ENDIF + IF(NDIM.EQ.0) THEN + ICAL=NCRCAL(1,MAXNVP,NPAR,JDEBAR,JARBVA,MUPLET) + IF(ICAL.GT.NCAL) CALL XABORT('SCRTRP: 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,'(''pval'',I8)') IPAR(ID) + NID=NVALUE(IPAR(ID)) + ELSE + CALL XABORT('SCRTRP: PARAMETER INDEX OVERFLOW.') + ENDIF + NTOT=NTOT*NID + DO 15 IDTMP=1,NDIM-ID + IDDIV(IDTMP)=IDDIV(IDTMP)*NID + 15 CONTINUE + LPSAP=LCMGID(IPSAP,'paramvaleurs') + CALL LCMLEN(LPSAP,RECNAM,ILONG,ITYLCM) + IF(ILONG.GT.MAXVAL) CALL XABORT('SCRTRP: MAXVAL OVERFLOW.') + CALL LCMGET(LPSAP,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('@SCRTRP: 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('@SCRTRP: INVALID BURNUP' + 1 //' LIMITS(2).') + IF(PARKEY(IPAR(ID)).NE.'BURN') THEN + CALL XABORT('@SCRTRP: BURN EXPECTED.') + ENDIF + 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('SCRTRP: INVALID OPTION.') + ENDIF + NVAL(ID)=NID + 70 CONTINUE + LPSAP=LCMGID(IPSAP,'paramarbre') + +* 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 + ICAL=NCRCAL(1,MAXNVP,NPAR,JDEBAR,JARBVA,MUPLET) + IF(ICAL.GT.NCAL) CALL XABORT('SCRTRP: 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 SCRTRP: TERP PARAMETERS:/(1X,1P,10E12.4))') + 1 (TERP(I),I=1,NCAL) + ENDIF + DEALLOCATE(JARBVA,JDEBAR) + RETURN +*---- +* MISSING ELEMENTARY CALCULATION EXCEPTION. +*---- + 200 WRITE(IOUT,'(16H SCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + CALL XABORT('SCRTRP: MISSING ELEMENTARY CALCULATION.') + 210 WRITE(IOUT,'(16H SCRTRP: MUPLET=,10I4/(16X,10I4))') + 1 (MUPLET(I),I=1,NPAR) + WRITE(IOUT,'(9X,7HNVALUE=,10I4/(16X,10I4))') (NVALUE(I),I=1,NPAR) + CALL XABORT('SCRTRP: DEGENERATE ELEMENTARY CALCULATION.') + END diff --git a/Donjon/src/SIM.f b/Donjon/src/SIM.f new file mode 100644 index 0000000..4bb5e4d --- /dev/null +++ b/Donjon/src/SIM.f @@ -0,0 +1,817 @@ +*DECK SIM + SUBROUTINE SIM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* PWR fuelling simulator according to the time-linear model. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert, V. Salino +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The SIM: module specification is: +* FMAP [ MLIB ] := SIM: FMAP [ MLIB ] [ POWER ] :: (descsim) ; +* where +* FMAP : name of a \emph{fmap} object, that will be updated by the SIM: +* module. The FMAP object must contain the instantaneous burnups for each +* assembly subdivision, a basic naval-coordinate assembly layout and the +* weight of each assembly subdivision. +* MLIB : name of a \emph{microlib} (type L\_LIBRARY) containing +* particularized isotope data. If this object also appears on the RHS, it +* is open in modification mode and updated. Number densities of isotopes +* present in list HISOT. +* POWER : name of a \emph{power} object containing the channel and powers of +* the assembly subdivisions, previously computed by the FLPOW: module. The +* channel and powers of the assembly subdivisions are used by the SIM: +* module to compute the new burn-up of each assembly subdivision. If the +* powersof the assembly subdivisions are previously specified with the +* module RESINI:, you can burn your core without a POWER object. +* (descsim) : structure describing the input data to the SIM: module. +* ------------------------------------------------------------------------------ +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6,MAXIAS=30,MAXHHX=30) + TYPE(C_PTR) IPMAP,IPPOW,JPMAP,KPMAP,LPMAP,MPMAP,IPLIB + CHARACTER TEXT*12,HSIGN*12,TEXT4*4,HCYCL*12,HOLD*12,HHX(MAXHHX)*1, + > TEXT4B*4,TEXT1*1,TEXT1B*1,HSMG*131,PNAME*12,ASMB1(MAXIAS)*4, + > HC1*12,HC2*12 + INTEGER IMPX,IHY(MAXHHX),ISTATE(NSTATE),SIMIND + DOUBLE PRECISION DFLOT +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IFMIX,NAME,ONAME,OFMIX, + > INFMIX,LL + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: HZONE + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:,:) :: CYCLE,CYCLE2 + CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HFOLLO + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HCHCLV + REAL, ALLOCATABLE, DIMENSION(:) :: RFCHAN,BURNUP,OBURNU,FORM, + > BUNDPOW,BURNINST,PERTMP + REAL, ALLOCATABLE, DIMENSION(:,:) :: RFOLLO,OFOLLO +*---- +* PARAMETER VALIDATION +*---- + IPMAP=C_NULL_PTR + IPPOW=C_NULL_PTR + IPLIB=C_NULL_PTR + MLIB=-1 + DO IEN=1,NENTRY + IF(IENTRY(IEN).GT.2) THEN + WRITE(HSMG,'(12H@SIM: ENTRY ,A12,19H IS NOT OF LCM TYPE)') + > HENTRY(IEN) + CALL XABORT(HSMG) + ENDIF + CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_MAP') THEN + IPMAP=KENTRY(IEN) + IF(JENTRY(IEN).NE.1) CALL XABORT('@SIM: MODIFICATION MODE ' + > //'FOR L_MAP EXPECTED') + ELSEIF(HSIGN.EQ.'L_LIBRARY') THEN + IPLIB=KENTRY(IEN) + MLIB=JENTRY(IEN) + IF(MLIB.EQ.0) CALL XABORT('@SIM: READ-ONLY OR MODIFICATION ' + > //'MODE FOR L_LIBRARY EXPECTED') + ELSEIF(HSIGN.EQ.'L_POWER') THEN + IPPOW=KENTRY(IEN) + IF(JENTRY(IEN).NE.2) CALL XABORT('@SIM: READ-ONLY MODE FOR' + > //' L_POWER EXPECTED') + ELSE + CALL XABORT('@SIM: UNKNOWN SIGNATURE ('//HSIGN//')') + ENDIF + ENDDO + IF(.NOT.C_ASSOCIATED(IPMAP)) THEN + CALL XABORT('@SIM: NO FUEL MAP OBJECT FOUND.') + ENDIF +*---- +* RECOVER INFORMATION +*---- + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + IMOD=ISTATE(5) + NF=ISTATE(7) + NPARM=ISTATE(8) + NSIMS=ISTATE(13) + NIS=ISTATE(18) + NCYCLE=ISTATE(19) + LX=NSIMS/100 + LY=MOD(NSIMS,100) + IF(NF.EQ.0)CALL XABORT('@SIM: NO FUEL IN MAP OBJECT.') + IF(NIS.GT.0) THEN + ALLOCATE(HFOLLO(NIS)) + CALL LCMGTC(IPMAP,'HFOLLOW',8,NIS,HFOLLO) + ENDIF + NTOT=NCH*NB +*---- +* ONLY TIME INSTANTANEOUS CALCULATIONS IN SIM: +*---- + IF(IMOD.NE.2)CALL XABORT('@SIM: INST-BURN OPTION SHOULD BE ' + + //'USED IN RESINI.') +*---- +* READ INPUT DATA +*---- + IMPX=0 + TTIME=0.0 + ALLOCATE(RFCHAN(NCH)) + RFCHAN(:NCH)=0.0 + TIME=0.0 + BURNSTEP=0.0 + HCYCL=' ' + JNDCY=0 +* READ KEYWORD + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(1).') + IF(TEXT.EQ.'EDIT')THEN +* PRINTING INDEX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@SIM: INTEGER DATA EXPECTED(1).') + IMPX=MAX(0,NITMA) + IF(IMPX.GT.0) WRITE(6,190) NB,NCH,LX,LY + ELSEIF(TEXT.EQ.'CYCLE')THEN + CALL REDGET(ITYP,NITMA,FLOT,HCYCL,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(2).') + IF(NSIMS.EQ.0)CALL XABORT('@SIM: SIM DATA NOT DEFINED IN RESIN' + > //'I: MODULE.') + ALLOCATE(HZONE(NCH),IFMIX(NTOT),NAME(3*NCH),ONAME(3*NCH), + > OFMIX(NTOT)) + ALLOCATE(FORM(NB),BURNUP(NTOT),OBURNU(NTOT),RFOLLO(NTOT,NIS), + > OFOLLO(NTOT,NIS),LL(LY)) + BURNUP(:NTOT)=-999.0 + RFOLLO(:NTOT,:NIS)=0.0 + OFOLLO(:NTOT,:NIS)=0.0 + CALL LCMGTC(IPMAP,'S-ZONE',4,NCH,HZONE) + TEXT4=HZONE(1) + READ(TEXT4,'(A1,I2)') TEXT1,INTG2 + L=0 + LL(:LY)=0 + DO K=1,NCH + TEXT4=HZONE(K) + READ(TEXT4,'(A1,I2)') TEXT1B,INTG2B + IF(TEXT1B.EQ.TEXT1) THEN + L=L+1 + IF(L.GT.LY)CALL XABORT('@SIM: INCOHERENCE IN BASIC ASSEMB' + > //'LY LAYOUT GIVEN IN RESINI: (1).') + IF(L.GT.MAXHHX)CALL XABORT('@SIM: MAXHHX OVERFLOW(1).') + IHY(L)=INTG2B + ENDIF + ENDDO + JMAX=0 + DO K=1,NCH + TEXT4=HZONE(K) + READ(TEXT4,'(A1,I2)') TEXT1B,INTG2B + DO J=1,L + IF(INTG2B.EQ.IHY(J)) THEN + LL(J)=LL(J)+1 + IF(LL(J).EQ.LX) JMAX=J + IF(LL(J).GT.LX)CALL XABORT('@SIM: INCOHERENCE IN BASIC ' + > //'ASSEMBLY LAYOUT GIVEN IN RESINI: (2).') + ENDIF + ENDDO + ENDDO + IF(JMAX.EQ.0)CALL XABORT('@SIM: INCOHERENCE IN BASIC ASSEMBLY' + > //' LAYOUT GIVEN IN RESINI: (3).') + L=0 + DO K=1,NCH + TEXT4=HZONE(K) + READ(TEXT4,'(A1,I2)') TEXT1B,INTG2B + IF(INTG2B.EQ.IHY(JMAX)) THEN + L=L+1 + IF(L.GT.MAXHHX)CALL XABORT('@SIM: MAXHHX OVERFLOW(2).') + HHX(L)=TEXT1B + ENDIF + ENDDO + DEALLOCATE(LL) + HOLD=' ' + INDCY=-1 + BURNCY=-999.0 + 30 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(3).') + 40 IF(TEXT.EQ.'FROM') THEN + CALL REDGET(ITYP,NITMA,FLOT,HOLD,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(4).') + GO TO 30 + ELSE IF(TEXT.EQ.'BURN') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + INDCY=NITMA + ELSE IF(ITYP.EQ.2) THEN + BURNCY=FLOT + ELSE + CALL XABORT('@SIM: INTEGER OR REAL DATA EXPECTED.') + ENDIF + GO TO 30 + ELSE IF((TEXT.EQ.'MAP').OR.(TEXT.EQ.'QMAP')) THEN + CALL LCMLEN(IPMAP,HCYCL,ILONG,ITYLCM) + IF(ILONG.NE.0) THEN + WRITE(HSMG,'(12H@SIM: CYCLE ,A12,8H EXISTS.)') HCYCL + CALL XABORT(HSMG) + ENDIF + ALLOCATE(HCHCLV(NCYCLE+1)) + IF(NCYCLE.GT.0) CALL LCMGTC(IPMAP,'CYCLE-NAMES',12,NCYCLE, + > HCHCLV) + HCHCLV(NCYCLE+1)=HCYCL + NCYCLE=NCYCLE+1 + CALL LCMPTC(IPMAP,'CYCLE-NAMES',12,NCYCLE,HCHCLV) + DEALLOCATE(HCHCLV) + ALLOCATE(CYCLE(LX,LY)) + IF(TEXT.EQ.'MAP') THEN + DO 45 I=1,LX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(5).') + 45 CONTINUE + DO 51 J=1,LY + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@SIM: INTEGER DATA EXPECTED(2).') + DO 50 I=1,LX + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.EQ.1) THEN + IF(NITMA.LE.0) CALL XABORT('@SIM: FUEL INDEX .LE.0.') + IF(NITMA.GT.999) CALL XABORT('@SIM: FUEL INDEX .GT.999.') + WRITE(CYCLE(I,J),'(I3.3,1H@)') NITMA + ELSE IF(ITYP.EQ.3) THEN + CYCLE(I,J)=TEXT4 + ELSE + CALL XABORT('@SIM: INTEGER/CHARACTER DATA EXPECTED(1).') + ENDIF + WRITE(TEXT4B,'(A1,I2.2)') HHX(I),IHY(J) + 50 CONTINUE + 51 CONTINUE + ELSE IF(TEXT.EQ.'QMAP') THEN + LXMIN=LX/2+1 + LYMIN=LY/2+1 + DO 55 I=LXMIN,LX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(7).') + 55 CONTINUE + DO 61 J=LYMIN,LY + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@SIM: INTEGER DATA EXPECTED(3).') + DO 60 I=LXMIN,LX + CALL REDGET(ITYP,NITMA,FLOT,TEXT4,DFLOT) + IF(ITYP.EQ.1) THEN + IF(NITMA.LE.0) CALL XABORT('@SIM: FUEL INDEX .LE.0.') + IF(NITMA.GT.999) CALL XABORT('@SIM: FUEL INDEX .GT.999.') + WRITE(CYCLE(I,J),'(I3.3,1H@)') NITMA + ELSE IF(ITYP.EQ.3) THEN + CYCLE(I,J)=TEXT4 + ELSE + CALL XABORT('@SIM: INTEGER/CHARACTER DATA EXPECTED(2).') + ENDIF + WRITE(TEXT4B,'(A1,I2.2)') HHX(I),IHY(J) + 60 CONTINUE + 61 CONTINUE + CALL SIMQMP(LX,LY,LXMIN,LYMIN,HHX,IHY,CYCLE) + ENDIF + IF(IMPX.GE.2) THEN + ALLOCATE(CYCLE2(LX,LY)) + DO I=1,LX + DO J=1,LY + CYCLE2(I,J)=CYCLE(I,J) + IF(CYCLE2(I,J).EQ.'|')CYCLE2(I,J)=' |' + IF(CYCLE2(I,J).EQ.'-')CYCLE2(I,J)=' -' + ENDDO + ENDDO + WRITE (6,'(25H SIM: RELOADING PATTERN :)') + WRITE (6,'(2X,32A4)') (HHX(I),I=1,LX) + DO J=1,LY + WRITE (6,'(I3,1X,32(A3,1X))') IHY(J),(CYCLE2(I,J),I=1,LX) + ENDDO + DEALLOCATE(CYCLE2) + ENDIF + OBURNU(:NTOT)=-999.0 + IF(HOLD.NE.' ') THEN + JNDCY=SIMIND(IPMAP,IMPX,HOLD,INDCY,BURNCY) + JPMAP=LCMGID(IPMAP,HOLD) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMGET(KPMAP,'NAME',ONAME) + CALL LCMGET(KPMAP,'BURN-INST',OBURNU) + CALL LCMGET(KPMAP,'FLMIX',OFMIX) + IF((MLIB.EQ.1).AND.(NIS.GT.0)) THEN +* KPMAP(HOLD) --> IPLIB + CALL SIMLIB(IMPX,1,KPMAP,IPLIB,NTOT,NIS,OFMIX,HFOLLO, + > OFOLLO) + ENDIF + ENDIF + ALLOCATE(INFMIX(NTOT)) + CALL LCMGET(IPMAP,'FLMIX-INI',INFMIX) + IF(IMPX.GT.0) WRITE(6,210) HCYCL,'SIMPOS' + CALL SIMPOS(LX,LY,NCH,NB,HCYCL,HOLD,HHX,IHY,HZONE,INFMIX, + > NIS,CYCLE,NAME,BURNUP,IFMIX,RFOLLO,ONAME,OBURNU,OFMIX,OFOLLO) + DEALLOCATE(INFMIX) + JNDCY=1 + JPMAP=LCMLID(IPMAP,HCYCL,1) + KPMAP=LCMDIL(JPMAP,JNDCY) + CALL LCMPTC(KPMAP,'ALIAS',12,HCYCL) + CALL LCMPTC(KPMAP,'CYCLE',4,LX*LY,CYCLE) + CALL LCMPUT(KPMAP,'NAME',3*NCH,3,NAME) + CALL LCMPUT(KPMAP,'BURN-INST',NTOT,2,BURNUP) + CALL LCMPUT(KPMAP,'FLMIX',NTOT,1,IFMIX) + IF(NIS.GT.0) CALL LCMPUT(KPMAP,'FOLLOW',NTOT*NIS,2,RFOLLO) + IF((MLIB.EQ.1).AND.(NIS.GT.0)) THEN +* KPMAP(HCYCL) --> IPLIB + CALL SIMLIB(IMPX,1,KPMAP,IPLIB,NTOT,NIS,IFMIX,HFOLLO,RFOLLO) + ENDIF + DEALLOCATE(CYCLE) + GO TO 30 + ELSE IF(TEXT.EQ.'SPEC') THEN + JNDCY=1 + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMGET(KPMAP,'NAME',NAME) + CALL LCMGET(KPMAP,'BURN-INST',BURNUP) + CALL LCMGET(KPMAP,'FLMIX',IFMIX) + IASMB1=0 + INDCY=-1 + BURNCY=-999.0 + 70 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(9).') + 80 IF(TEXT.EQ.'ENDCYCLE') THEN + GO TO 120 + ELSE IF((TEXT.EQ.'DIST-AX').OR.(TEXT.EQ.'BURN-STEP')) THEN + JNDCY=1 + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMPUT(KPMAP,'NAME',3*NCH,3,NAME) + CALL LCMPUT(KPMAP,'BURN-INST',NTOT,2,BURNUP) + CALL LCMPUT(KPMAP,'FLMIX',NTOT,1,IFMIX) + GO TO 40 + ELSE IF(TEXT.EQ.'SET') THEN + BURN=-999.0 + IFUEL=0 + IF(IASMB1.EQ.0) CALL XABORT('@SIM: ASMB1 NOT SET.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(10).') + IF(TEXT.EQ.'AVGB') THEN + CALL REDGET(ITYP,NITMA,BURN,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@SIM: REAL DATA EXPECTED(3).') + ELSE IF(TEXT.EQ.'FUEL') THEN + CALL REDGET(ITYP,IFUEL,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@SIM: INTEGER DATA EXPECTED(4)') + ELSE + CALL XABORT('@SIM: AVGB OR FUEL KEYWORD EXPECTED') + ENDIF + IF(IMPX.GT.0) WRITE(6,210) HCYCL,'SIMSET' + CALL SIMSET(NCH,NB,HCYCL,IASMB1,ASMB1,BURN,IFUEL,HZONE, + > NAME,BURNUP,IFMIX) + IASMB1=0 + ELSE IF(TEXT.EQ.'FROM') THEN + IF(IASMB1.EQ.0) CALL XABORT('@SIM: ASMB1 NOT SET.') + CALL REDGET(ITYP,NITMA,FLOT,HOLD,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(11).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(12).') + IF(TEXT.NE.'AT')CALL XABORT('@SIM: AT KEYWORD EXPECTED') + CALL REDGET(ITYP,NITMA,FLOT,TEXT4B,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(13).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(14).') + IF(TEXT.EQ.'BURN') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + INDCY=NITMA + ELSE IF(ITYP.EQ.2) THEN + BURNCY=FLOT + ELSE + CALL XABORT('@SIM: INTEGER OR REAL DATA EXPECTED.') + ENDIF + ELSE + JNDCY=SIMIND(IPMAP,IMPX,HOLD,INDCY,BURNCY) + JPMAP=LCMGID(IPMAP,HOLD) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMGET(KPMAP,'NAME',ONAME) + CALL LCMGET(KPMAP,'BURN-INST',OBURNU) + CALL LCMGET(KPMAP,'FLMIX',OFMIX) + IF((MLIB.EQ.1).AND.(NIS.GT.0)) THEN +* KPMAP(HOLD) --> IPLIB + CALL SIMLIB(IMPX,1,KPMAP,IPLIB,NTOT,NIS,OFMIX,HFOLLO, + > OFOLLO) + ENDIF + IF(IMPX.GT.0) WRITE(6,210) HCYCL,'SIMCPY' + CALL SIMCPY(NCH,NB,HCYCL,IASMB1,ASMB1,TEXT4B,HZONE,NIS, + > NAME,BURNUP,IFMIX,RFOLLO,ONAME,OBURNU,OFMIX,OFOLLO) + IASMB1=0 + JNDCY=1 + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + IF(NIS.GT.0) CALL LCMPUT(KPMAP,'FOLLOW',NTOT*NIS,2,RFOLLO) + IF((MLIB.EQ.1).AND.(NIS.GT.0)) THEN +* KPMAP(HCYCL) --> IPLIB + CALL SIMLIB(IMPX,1,KPMAP,IPLIB,NTOT,NIS,IFMIX,HFOLLO, + > RFOLLO) + ENDIF + GO TO 80 + ENDIF + ELSE + IASMB1=IASMB1+1 + IF(IASMB1.GT.MAXIAS) CALL XABORT('@SIM: MAXIAS OVERFLOW.') + ASMB1(IASMB1)=TEXT(:4) + ENDIF + GO TO 70 + ELSE IF(TEXT.EQ.'DIST-AX') THEN + IF(HCYCL.EQ.' ') CALL XABORT('@SIM: HCNEW NOT DEFINED.') + JNDCY=1 + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMGET(KPMAP,'BURN-INST',BURNUP) + IASMB1=0 + INDCY=-1 + BURNCY=-999.0 + 90 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(15).') + 100 IF(TEXT.EQ.'ENDCYCLE') THEN + GO TO 120 + ELSE IF((TEXT.EQ.'SPEC').OR.(TEXT.EQ.'BURN-STEP')) THEN + JNDCY=1 + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMPUT(KPMAP,'BURN-INST',NTOT,2,BURNUP) + GO TO 40 + ELSE IF(TEXT.EQ.'SET') THEN + DO IB=1,NB + CALL REDGET(ITYP,NITMA,FORM(IB),TEXT,DFLOT) + IF(ITYP.NE.2) CALL XABORT('@SIM: REAL AXN EXPECTED.') + ENDDO + IF(IMPX.GT.0) WRITE(6,210) HCYCL,'SIMDIS' + CALL SIMDIS(.TRUE.,NCH,NB,HCYCL,IASMB1,ASMB1,FORM,TEXT4B, + > HZONE,BURNUP,BURNUP) + IASMB1=0 + ELSE IF(TEXT.EQ.'FROM') THEN + IF(IASMB1.EQ.0) CALL XABORT('@SIM: ASMB1 NOT SET.') + CALL REDGET(ITYP,NITMA,FLOT,HOLD,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(16).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(17).') + IF(TEXT.NE.'AT')CALL XABORT('@SIM: AT KEYWORD EXPECTED') + CALL REDGET(ITYP,NITMA,FLOT,TEXT4B,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(18).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(19).') + IF(TEXT.EQ.'BURN') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + INDCY=NITMA + ELSE IF(ITYP.EQ.2) THEN + BURNCY=FLOT + ELSE + CALL XABORT('@SIM: INTEGER OR REAL DATA EXPECTED.') + ENDIF + ELSE + JNDCY=SIMIND(IPMAP,IMPX,HOLD,INDCY,BURNCY) + JPMAP=LCMGID(IPMAP,HOLD) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMGET(KPMAP,'BURN-INST',OBURNU) + IF(IMPX.GT.0) WRITE(6,210) HCYCL,'SIMDIS' + CALL SIMDIS(.FALSE.,NCH,NB,HCYCL,IASMB1,ASMB1,FORM,TEXT4B, + > HZONE,BURNUP,OBURNU) + JNDCY=1 + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + IASMB1=0 + GO TO 100 + ENDIF + ELSE + IASMB1=IASMB1+1 + IF(IASMB1.GT.MAXIAS) CALL XABORT('@SIM: MAXIAS OVERFLOW.') + ASMB1(IASMB1)=TEXT(:4) + ENDIF + GO TO 90 + ELSEIF(TEXT.EQ.'ENDCYCLE')THEN + GO TO 120 + ELSEIF(TEXT.EQ.'TIME')THEN +* TIME VALUE + IF(TIME.NE.0.0)CALL XABORT('@SIM: TIME ALREADY SPECIFIED(1).') + IF(BURNSTEP.NE.0.0)CALL XABORT('@SIM: BURNSTEP ALREADY // + > //SPECIFIED(1).') + CALL REDGET(ITYP,NITMA,TIME,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@SIM: REAL DATA EXPECTED(1).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(20).') + IF(TIME.LT.0.)CALL XABORT('@SIM: EXPECTING REAL>0 (1).') + IF(TEXT.EQ.'DAY')THEN + TIME=TIME + ELSEIF(TEXT.EQ.'HOUR')THEN + TIME=TIME/24. + ELSEIF(TEXT.EQ.'MINUTE')THEN + TIME=TIME/(24.*60.) + ELSEIF(TEXT.EQ.'SECOND')THEN + TIME=TIME/(24.*60.*60.) + ELSE + CALL XABORT('@SIM: EXPECTING DAY|HOUR|MINUTE|SECOND.') + ENDIF + GOTO 130 + ELSEIF(TEXT.EQ.'BURN-STEP')THEN +* BURN-STEP + IF(TIME.NE.0.)CALL XABORT('@SIM: TIME ALREADY SPECIFIED(2).') + IF(BURNSTEP.NE.0.)CALL XABORT('@SIM: BURNSTEP ALREADY ' + > //'SPECIFIED(2).') + CALL REDGET(ITYP,NITMA,BURNSTEP,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@SIM: REAL DATA EXPECTED(2).') + IF(BURNSTEP.LE.0.)CALL XABORT('@SIM: EXPECTING REAL>0 (2).') + GO TO 130 + ELSE IF(TEXT.EQ.'SET-FOLLOW') THEN +* Reset the number densities of particularized isotopes + IF(IMPX.GT.0) WRITE(6,210) HCYCL,'SET-FOLLOW' + IF(HCYCL.EQ.' ') CALL XABORT('@SIM: HCNEW NOT DEFINED.') + INDCY=-1 + BURNCY=-999.0 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(21).') + IF(TEXT.EQ.'BURN') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + INDCY=NITMA + ELSE IF(ITYP.EQ.2) THEN + BURNCY=FLOT + ELSE + CALL XABORT('@SIM: INTEGER OR REAL DATA EXPECTED.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED' + > //'(22).') + ENDIF + JNDCY=SIMIND(IPMAP,IMPX,HCYCL,INDCY,BURNCY) + JPMAP=LCMGID(IPMAP,HCYCL) + KPMAP=LCMGIL(JPMAP,JNDCY) + CALL LCMGET(KPMAP,'NAME',NAME) + CALL LCMGET(KPMAP,'BURN-INST',BURNUP) + CALL LCMGET(KPMAP,'FLMIX',IFMIX) + IF(C_ASSOCIATED(IPPOW)) THEN + ALLOCATE(BUNDPOW(NTOT)) + CALL LCMGET(IPPOW,'POWER-BUND',BUNDPOW) + CALL LCMPUT(KPMAP,'POWER-BUND',NTOT,2,BUNDPOW) + DEALLOCATE(BUNDPOW) + ENDIF + GO TO 40 + ELSE + CALL XABORT('@SIM: WRONG KEYWORD: '//TEXT//' (1).') + ENDIF + ELSE IF(TEXT.EQ.'COMPARE') THEN +* Compare two fields of values + IF(HCYCL.NE.' ') CALL XABORT('@SIM: HCNEW STILL ACTIVE.') + INDCY1=-1 + BURNCY1=-999.0 + INDCY2=-1 + BURNCY2=-999.0 + IMODE=0 + CALL REDGET(ITYP,NITMA,FLOT,HC1,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(23).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(24).') + IF(TEXT.EQ.'BURN') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + INDCY1=NITMA + ELSE IF(ITYP.EQ.2) THEN + BURNCY1=FLOT + ELSE + CALL XABORT('@SIM: INTEGER OR REAL DATA EXPECTED.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,HC2,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(25).') + ELSE + HC2=TEXT + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(26).') + IF(TEXT.EQ.'BURN') THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + INDCY2=NITMA + ELSE IF(ITYP.EQ.2) THEN + BURNCY2=FLOT + ELSE + CALL XABORT('@SIM: INTEGER OR REAL DATA EXPECTED.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(27).') + ENDIF + IF(TEXT.EQ.'DIST-BURN') THEN + IMODE=1 + ELSE IF(TEXT.EQ.'DIST-POWR') THEN + IMODE=2 + ELSE + CALL XABORT('@SIM: DIST-BURN OR DIST-POWR KEYWORD EXPECTED.') + ENDIF + CALL SIMCOM(IPMAP,IMPX,IMODE,NCH,NB,HC1,HC2,INDCY1,INDCY2, + > BURNCY1,BURNCY2,ERROR) + CALL REDGET(ITYP,NITMA,ERROR,TEXT,DFLOT) + IF(ITYP.NE.-2) CALL XABORT('SIM: OUTPUT REAL EXPECTED') + ITYP=2 + CALL REDPUT(ITYP,NITMA,ERROR,TEXT,DFLOT) + ELSE IF(TEXT.EQ.'SET-PARAM') THEN +* Reset a global parameter + IF(HCYCL.NE.' ') CALL XABORT('@SIM: HCNEW STILL ACTIVE.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(28).') + CALL REDGET(ITYP,NITMA,VALUE,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@SIM: REAL VALUE EXPECTED FOR' + > //' pvalue.') + JPMAP=LCMGID(IPMAP,'PARAM') + DO IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + CALL LCMGET(KPMAP,'P-TYPE',ITYPE) + IF(PNAME.EQ.TEXT) THEN + IF(ITYPE.EQ.1) THEN + CALL LCMPUT(KPMAP,'P-VALUE',1,2,VALUE) + IF(IMPX.GT.0) WRITE(6,200) PNAME,VALUE + ELSE + ALLOCATE(PERTMP(NTOT)) + PERTMP(:NTOT)=VALUE + CALL LCMPUT(KPMAP,'P-VALUE',NTOT,2,PERTMP) + IF(IMPX.GT.0) WRITE(6,201) PNAME,VALUE + DEALLOCATE(PERTMP) + ENDIF + GO TO 10 + ENDIF + ENDDO + CALL XABORT('@SIM: GLOBAL OR LOCAL PARAMETER NAME NOT FOUND: ' + > //TEXT) + ELSEIF(TEXT.EQ.';')THEN + GO TO 140 + ELSE +* KEYWORD DOES NOT MATCH + CALL XABORT('@SIM: WRONG KEYWORD: '//TEXT//' (2).') + ENDIF + GO TO 10 +*---- +* COMPUTE THE AVERAGE BURNUP +*---- + 120 IF(HCYCL.EQ.' ') CALL XABORT('@SIM: HCNEW NOT DEFINED.') + BURNAVG=0.0 + DO ICH=1,NCH + DO IB=1,NB + IOF=(IB-1)*NCH+ICH + IF(IFMIX(IOF).EQ.0) CYCLE + IF(BURNUP(IOF).EQ.-999.0) THEN + WRITE(HSMG,'(30HSIM: BURNUP NOT SET IN CHANNEL,I4, + > 11H AND BUNDLE,I4,1H.)') ICH,IB + CALL XABORT(HSMG) + ENDIF + BURNAVG=BURNAVG+BURNUP(IOF) + ENDDO + ENDDO + BURNAVG=BURNAVG/REAL(NTOT) +*---- +* SAVE INFORMATION IN DIRECTORY HCYCL AFTER REFUELLING +*---- + IF(JNDCY.EQ.0) CALL XABORT('@SIM: JNDCY NOT DEFINED.') + IF(IMPX.GT.0) WRITE(6,220) JNDCY,HCYCL,BURNAVG + CALL LCMPTC(KPMAP,'ALIAS',12,HCYCL) + CALL LCMPUT(KPMAP,'NAME',3*NCH,3,NAME) + CALL LCMPUT(KPMAP,'BURNAVG',1,2,BURNAVG) + CALL LCMPUT(KPMAP,'BURN-INST',NTOT,2,BURNUP) + CALL LCMPUT(KPMAP,'FLMIX',NTOT,1,IFMIX) + IF(NPARM.GT.0) THEN + LPMAP=LCMGID(IPMAP,'PARAM') + MPMAP=LCMLID(KPMAP,'PARAM',NPARM) + CALL LCMEQU(LPMAP,MPMAP) + ENDIF + IF((MLIB.GE.1).AND.(NIS.GT.0)) THEN +* IPLIB --> KPMAP(HCYCL) + CALL SIMLIB(IMPX,2,KPMAP,IPLIB,NTOT,NIS,IFMIX,HFOLLO,RFOLLO) + ENDIF +*---- +* SAVE THE INFORMATION IN THE FUELMAP AFTER REFUELLING. +*---- + CALL LCMPUT(IPMAP,'BURN-INST',NTOT,2,BURNUP) + CALL LCMPUT(IPMAP,'FLMIX',NTOT,1,IFMIX) + DEALLOCATE(OFOLLO,RFOLLO,OBURNU,BURNUP,FORM) + DEALLOCATE(OFMIX,ONAME,NAME,IFMIX,HZONE) + HCYCL=' ' + GO TO 10 +*---- +* PERFORM CALCULATION +*---- + 130 IF(HCYCL.EQ.' ') CALL XABORT('@SIM: HCNEW NOT DEFINED.') + ALLOCATE(BUNDPOW(NTOT)) + IF(.NOT.C_ASSOCIATED(IPPOW)) THEN + CALL LCMLEN(IPMAP,'BUND-PW',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@SIM: MISSING BUND-PW DATA IN ' + > //'L_MAP OBJECT.') + CALL LCMGET(IPMAP,'BUND-PW',BUNDPOW) + ELSE + CALL LCMLEN(IPPOW,'POWER-CHAN',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@SIM: MISSING POWER-CHAN DATA I' + > //'N L_POWER OBJECT.') + CALL LCMGET(IPPOW,'POWER-BUND',BUNDPOW) + CALL LCMGET(IPPOW,'K-EFFECTIVE',FKEFF) + ENDIF + TTIME=TTIME+TIME + ALLOCATE(BURNINST(NTOT)) + IF(IMPX.GE.8) THEN + CALL SIMOUT(IPMAP,IMPX,BURNINST,HZONE,NCH,NB,LX,LY,HHX,IHY, + > 'BEGIN') + ENDIF + CALL TINSTB(IPMAP,TIME,BURNSTEP,NCH,NB,NF,BUNDPOW,BURNAVG, + > BURNINST,IMPX) +*---- +* SAVE LOCAL PARAMETERS FOR HISTORICAL FOLLOW-UP +*---- + CALL LCMLEN(IPMAP,HCYCL,ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + WRITE(HSMG,'(24HSIM: MISSING CYCLE NAME=,A12)') HCYCL + CALL XABORT(HSMG) + ENDIF + IF(IMPX.GT.0) WRITE(6,220) ILONG+1,HCYCL,BURNAVG + JPMAP=LCMLID(IPMAP,HCYCL,ILONG+1) + KPMAP=LCMGIL(JPMAP,1) + CALL LCMGET(KPMAP,'NAME',NAME) + CALL LCMGET(KPMAP,'FLMIX',IFMIX) + KPMAP=LCMDIL(JPMAP,ILONG+1) + CALL LCMPTC(KPMAP,'ALIAS',12,HCYCL) + CALL LCMPUT(KPMAP,'TIME',1,2,TTIME) + CALL LCMPUT(KPMAP,'BURNAVG',1,2,BURNAVG) + CALL LCMPUT(KPMAP,'BURN-INST',NTOT,2,BURNINST) + CALL LCMPUT(KPMAP,'POWER-BUND',NTOT,2,BUNDPOW) + CALL LCMPUT(KPMAP,'NAME',3*NCH,3,NAME) + CALL LCMPUT(KPMAP,'FLMIX',NTOT,1,IFMIX) + CALL LCMPUT(IPMAP,'BURN-INST',NTOT,2,BURNINST) + IF(C_ASSOCIATED(IPPOW)) CALL LCMPUT(KPMAP,'K-EFFECTIVE',1,2,FKEFF) + IF(NPARM.GT.0) THEN + LPMAP=LCMGID(IPMAP,'PARAM') + MPMAP=LCMLID(KPMAP,'PARAM',NPARM) + CALL LCMEQU(LPMAP,MPMAP) + ENDIF + IF((MLIB.GE.1).AND.(NIS.GT.0)) THEN +* IPLIB --> KPMAP(HCYCL) + CALL SIMLIB(IMPX,2,KPMAP,IPLIB,NTOT,NIS,IFMIX,HFOLLO,RFOLLO) + ENDIF + CALL SIMOUT(IPMAP,IMPX,BURNINST,HZONE,NCH,NB,LX,LY,HHX,IHY, + > 'END ') + DEALLOCATE(BUNDPOW,BURNINST) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@SIM: CHARACTER DATA EXPECTED(29).') + IF(TEXT.NE.'ENDCYCLE')CALL XABORT('@SIM: ENDCYCLE KEYWORD EXPECT' + > //'ED.') + DEALLOCATE(OFOLLO,RFOLLO,OBURNU,BURNUP,FORM) + DEALLOCATE(OFMIX,ONAME,NAME,IFMIX,HZONE) + HCYCL=' ' + GOTO 10 +* + 140 IF(HCYCL.NE.' ') CALL XABORT('@SIM: HCNEW STILL ACTIVE.') + CALL LCMSIX(IPMAP,' ',0) + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + ISTATE(19)=NCYCLE + CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPMAP,'DEPL-TIME',1,2,TTIME) + CALL LCMPUT(IPMAP,'REF-CHAN',NCH,2,RFCHAN) + DEALLOCATE(RFCHAN) + IF(NIS.GT.0) DEALLOCATE(HFOLLO) + RETURN +* + 190 FORMAT(/38H SIM: NUMBER OF ASSEMBLY SUBDIVISIONS=,I4/ + 1 6X,25HNUMBER OF FUEL CHANNELS =,I4/ + 2 6X,34HNUMBER OF ASSEMBLIES ALONG X AXIS=,I3/ + 3 6X,34HNUMBER OF ASSEMBLIES ALONG Y AXIS=,I3/) + 200 FORMAT(/' SET GLOBAL PARAMETER ',A,' TO =',1P,E14.6) + 201 FORMAT(/' SET LOCAL PARAMETER (UNIFORM) ',A,' TO =',1P,E14.6) + 210 FORMAT(/20H SIM: PROCESS CYCLE ,A12,16H WITH PROCEDURE ,A,1H.) + 220 FORMAT(/36H SIM: STORE INFORMATION IN LIST ITEM,I3,10H OF CYCLE , + > A12,10H AT BURNUP,1P,E14.6,8H MW-D/T./) + END diff --git a/Donjon/src/SIMCOM.f b/Donjon/src/SIMCOM.f new file mode 100644 index 0000000..6da5f9a --- /dev/null +++ b/Donjon/src/SIMCOM.f @@ -0,0 +1,119 @@ +*DECK SIMCOM + SUBROUTINE SIMCOM(IPMAP,IMPX,IMODE,NCH,NB,HC1,HC2,INDCY1,INDCY2, + 1 BURNCY1,BURNCY2,ERROR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compare two fields of values, corresponding to two cycles. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAP fuel map +* IMPX print parameter +* IMODE type of field (1: burnup distribution; 2: power distribution) +* NCH number of assemblies or number of quart-of-assemblies. +* NB number of axial burnup subdivisions in an assembly. +* HC1 first cycle list directory in IPMAP +* HC2 first cycle list directory in IPMAP +* INDCY1 integer index in directory HCY1. INDCY1=-1 if undefined at +* input. +* INDCY2 integer index in directory HCY2. INDCY2=-1 if undefined at +* input. +* BURNCY1 average burnup in directory HCY1. BURNCY1=-999.0 if undefined +* at input. +* BURNCY2 average burnup in directory HCY2. BURNCY2=-999.0 if undefined +* at input. +* +*Parameters: output +* ERROR discrepancy between the two distributions +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER IMPX,IMODE,NCH,NB,INDCY1,INDCY2 + REAL BURNCY1,BURNCY2,ERROR + CHARACTER HC1*12,HC2*12 +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMAP,KPMAP + INTEGER SIMIND + REAL, ALLOCATABLE, DIMENSION(:,:) :: DIST1,DIST2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(DIST1(NCH,NB),DIST2(NCH,NB)) +*---- +* RECOVER INFORMATION FROM THE FIRST CYCLE +*---- + JNDCY=SIMIND(IPMAP,IMPX,HC1,INDCY1,BURNCY1) + JPMAP=LCMGID(IPMAP,HC1) + KPMAP=LCMGIL(JPMAP,JNDCY) + IF(IMODE.EQ.1) THEN + CALL LCMGET(KPMAP,'BURN-INST',DIST1) + ELSE IF(IMODE.EQ.2) THEN + CALL LCMGET(KPMAP,'POWER-BUND',DIST1) + ENDIF +*---- +* RECOVER INFORMATION FROM THE SECOND CYCLE +*---- + JNDCY=SIMIND(IPMAP,IMPX,HC2,INDCY2,BURNCY2) + JPMAP=LCMGID(IPMAP,HC2) + KPMAP=LCMGIL(JPMAP,JNDCY) + IF(IMODE.EQ.1) THEN + CALL LCMGET(KPMAP,'BURN-INST',DIST2) + ELSE IF(IMODE.EQ.2) THEN + CALL LCMGET(KPMAP,'POWER-BUND',DIST2) + ENDIF +*---- +* COMPUTE DISCREPANCY +*---- + ERROR=0.0 + ICHMAX=0 + IBMAX=0 + IF(IMODE.EQ.1) THEN + DO ICH=1,NCH + DO IB=1,NB + FLOT=ABS(DIST1(ICH,IB)-DIST2(ICH,IB)) + IF(FLOT.GE.ERROR) THEN + ERROR=FLOT + ICHMAX=ICH + IBMAX=IB + ENDIF + ENDDO + ENDDO + IF(IMPX.GT.1) WRITE(6,100) ERROR,ICHMAX,IBMAX + ELSE IF(IMODE.EQ.2) THEN + DO ICH=1,NCH + DO IB=1,NB + FLOT=ABS(DIST1(ICH,IB)-DIST2(ICH,IB))/ABS(DIST2(ICH,IB)) + IF(FLOT.GE.ERROR) THEN + ERROR=FLOT + ICHMAX=ICH + IBMAX=IB + ENDIF + ENDDO + ENDDO + IF(IMPX.GT.1) WRITE(6,110) ERROR,ICHMAX,IBMAX + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DIST2,DIST1) + RETURN +* + 100 FORMAT(/49H SIM: MAXIMUM DISCREPANCY ON BURNUP DISTRIBUTION=,1P, + > E11.4,18H MW-D/T IN CHANNEL,I4,22H AND AXIAL SUBDIVISION,I4,1H./) + 110 FORMAT(/51H SIM: MAXIMUM RELATIVE ERROR ON POWER DISTRIBUTION=,1P, + > E11.4,18H MW-D/T IN CHANNEL,I4,22H AND AXIAL SUBDIVISION,I4,1H./) + END diff --git a/Donjon/src/SIMCPY.f b/Donjon/src/SIMCPY.f new file mode 100644 index 0000000..2522d32 --- /dev/null +++ b/Donjon/src/SIMCPY.f @@ -0,0 +1,102 @@ +*DECK SIMCPY + SUBROUTINE SIMCPY(NCH,NB,HCYC,NASMB1,ASMB1,ASMB1B,ZONE,NIS,NAME, + > BURNUP,FMIX,RFOLLO,ONAME,OBURNU,OFMIX,OFOLLO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the burnup of an assembly in another cycle. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input/output +* NCH number of assemblies or number of quart-of-assemblies. +* NB number of axial burnup subdivisions in an assembly. +* HCYC name of cycle. +* NASMB1 number of assemblies to set. +* ASMB1 group of assembly names, as defined in the fuel map, to set +* at specific burnup. +* ASMB1B assembly name, as defined in the fuel map, to which we +* want to copy burnup. +* ZONE default assembly or quart-of-assembly names as defined in +* the fuel map. +* NIS number of particularized isotopes. +* NAME names of each assembly or of each quart-of assembly during +* a refuelling cycle. All quart-of-assembly belonging to the +* same assembly have the same name. +* BURNUP burnups during a refuelling cycle. A value of -999.0 means +* a non-initialized value. +* FMIX assembly mixtures after refuelling. +* RFOLLO number densities of the particularized isotopes after +* refuelling. +* ONAME names of each assembly or of each quart-of assembly during +* a previous refuelling cycle. +* OBURNU burnups at the end of a previous refuelling cycle. +* OFMIX assembly types in a previous refuelling cycle. +* OFOLLO number densities of the particularized isotopes at the end +* of a previous refuelling cycle. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NCH,NB,NASMB1,NIS,FMIX(NCH,NB),OFMIX(NCH,NB) + CHARACTER HCYC*12,ASMB1(NASMB1)*4,ASMB1B*4,ZONE(NCH)*4, + > NAME(NCH)*12,ONAME(NCH)*12 + REAL BURNUP(NCH,NB),RFOLLO(NCH,NB,NIS),OBURNU(NCH,NB), + > OFOLLO(NCH,NB,NIS) +*---- +* LOCAL VARIABLES +*---- + CHARACTER HSMG*131 + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: ZONE2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ZONE2(NCH)) +* + DO IASMB1=1,NASMB1 + DO 10 ICH=1,NCH + ZONE2(ICH)=ZONE(ICH) + 10 CONTINUE + DO ICH=1,NCH + IF(ZONE(ICH).EQ.ASMB1(IASMB1)) THEN + IOLD=0 + DO ICH2=1,NCH + IF(ZONE2(ICH2).EQ.ASMB1B) THEN + IOLD=ICH2 + ZONE2(ICH2)=' ' + GO TO 20 + ENDIF + ENDDO + WRITE(HSMG,'(33H@SIMCPY: UNABLE TO FIND ASSEMBLY ,A4, + > 25HIN THE FUEL MAP AT CYCLE ,A12,1H.)') ASMB1B,HCYC + CALL XABORT(HSMG) + 20 DO IB=1,NB + IF(BURNUP(ICH,IB).NE.-999.0) THEN + WRITE(HSMG,'(38H@SIMCPY: BURNUP ALREADY DEFINED IN CHA, + > 4HNNEL,I4,10HAND BUNDLE,I4,10H AT CYCLE ,A12,1H.)') + > ICH,IB,HCYC + ENDIF + BURNUP(ICH,IB)=OBURNU(IOLD,IB) + FMIX(ICH,IB)=OFMIX(ICH,IB) + DO ISO=1,NIS + RFOLLO(ICH,IB,ISO)=OFOLLO(IOLD,IB,ISO) + ENDDO + ENDDO + NAME(ICH)=ONAME(IOLD) + CYCLE + ENDIF + ENDDO + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ZONE2) + RETURN + END diff --git a/Donjon/src/SIMDIS.f b/Donjon/src/SIMDIS.f new file mode 100644 index 0000000..8357b60 --- /dev/null +++ b/Donjon/src/SIMDIS.f @@ -0,0 +1,103 @@ +*DECK SIMDIS + SUBROUTINE SIMDIS(LSET,NCH,NB,HCYC,NASMB1,ASMB1,FORM,ASMB1B,ZONE, + > BURNUP,OBURNU) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Axial normalization of the burnup distribution using information from +* another cycle. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input/output +* LSET type of normalization (=.true.: use FORM info; =.false: use +* an existing assembly). +* NCH number of assemblies or number of quart-of-assemblies. +* NB number of axial burnup subdivisions in an assembly. +* HCYC name of cycle. +* NASMB1 number of assemblies to set. +* ASMB1 group of assembly names, as defined in the fuel map, to set +* at specific burnup. +* FORM axial form factor used if LSET=.true. +* ASMB1B assembly name, as defined in the fuel map, to which we +* want to use the burnup distribution if LSET=.false. +* ZONE default assembly or quart-of-assembly names as defined in +* the fuel map. +* BURNUP burnups during a refuelling cycle. +* OBURNU burnups during a previous refuelling cycle. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + LOGICAL LSET + INTEGER NCH,NB,NASMB1 + CHARACTER HCYC*12,ASMB1(NASMB1)*4,ASMB1B*4,ZONE(NCH)*4 + REAL FORM(NB),BURNUP(NCH,NB),OBURNU(NCH,NB) +*---- +* LOCAL VARIABLES +*---- + CHARACTER HSMG*131 + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: ZONE2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ZONE2(NCH)) +* + ZNUM=0.0 + ZDEN=0.0 + DO IASMB1=1,NASMB1 + DO 10 ICH=1,NCH + ZONE2(ICH)=ZONE(ICH) + 10 CONTINUE + DO ICH=1,NCH + IF(ZONE(ICH).EQ.ASMB1(IASMB1)) THEN + IF(LSET) THEN + ZNUM=0.0 + ZDEN=0.0 + DO IB=1,NB + ZNUM=ZNUM+BURNUP(ICH,IB) + ZDEN=ZDEN+FORM(IB) + ENDDO + DO IB=1,NB + BURNUP(ICH,IB)=FORM(IB)*ZNUM/ZDEN + ENDDO + ELSE + IOLD=0 + DO ICH2=1,NCH + IF(ZONE2(ICH2).EQ.ASMB1B) THEN + IOLD=ICH2 + ZONE2(ICH2)=' ' + GO TO 20 + ENDIF + ENDDO + WRITE(HSMG,'(33H@SIMDIS: UNABLE TO FIND ASSEMBLY ,A4, + > 25HIN THE FUEL MAP AT CYCLE ,A12,1H.)') ASMB1(IASMB1), + > HCYC + CALL XABORT(HSMG) + 20 ZNUM=0.0 + ZDEN=0.0 + DO IB=1,NB + ZNUM=ZNUM+BURNUP(ICH,IB) + ZDEN=ZDEN+OBURNU(IOLD,IB) + ENDDO + DO IB=1,NB + BURNUP(ICH,IB)=OBURNU(IOLD,IB)*ZNUM/ZDEN + ENDDO + ENDIF + CYCLE + ENDIF + ENDDO + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ZONE2) + RETURN + END diff --git a/Donjon/src/SIMIND.f b/Donjon/src/SIMIND.f new file mode 100644 index 0000000..070bb4c --- /dev/null +++ b/Donjon/src/SIMIND.f @@ -0,0 +1,95 @@ +*DECK SIMIND + INTEGER FUNCTION SIMIND(IPMAP,IMPX,HCYCLE,INDCY,BURNCY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Return the list index of an existing fuel cycle. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAP fuel map object +* IMPX print parameter +* HCYCLE cycle list directory in IPMAP +* INDCY integer index in directory HCYCLE. INDCY=-1 if undefined at +* input. +* BURNCY average burnup in directory HCYCLE. BURNCY=-999.0 if undefined +* at input. +* +*Parameters: output +* SIMIND list index in HCYCLE +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER IMPX,INDCY + CHARACTER HCYCLE*12,HSMG*131 + REAL BURNCY +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMAP,KPMAP +* + SIMIND=0 + CALL LCMLEN(IPMAP,HCYCLE,ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPMAP) + WRITE(HSMG,'(24H@SIMIND: NO CYCLE NAMED ,A12,1H.)') HCYCLE + CALL XABORT(HSMG) + ENDIF + IF(INDCY.NE.-1) THEN + IF(INDCY.GT.ILONG) CALL XABORT('@SIMIND: INDCY.GT.ILONG') + IF(BURNCY.NE.-999.0) CALL XABORT('@SIMIND: BURNCY.NE.-999.0') + SIMIND=INDCY + IF(IMPX.GT.0) THEN + JPMAP=LCMGID(IPMAP,HCYCLE) + KPMAP=LCMGIL(JPMAP,INDCY) + CALL LCMGET(KPMAP,'BURNAVG',BURNAVG) + WRITE(6,100) INDCY,HCYCLE,BURNAVG + ENDIF + RETURN + ELSE IF((INDCY.EQ.-1).AND.(BURNCY.EQ.-999.0)) THEN + SIMIND=ILONG + IF(IMPX.GT.0) THEN + JPMAP=LCMGID(IPMAP,HCYCLE) + KPMAP=LCMGIL(JPMAP,ILONG) + CALL LCMGET(KPMAP,'BURNAVG',BURNAVG) + WRITE(6,100) ILONG,HCYCLE,BURNAVG + ENDIF + RETURN + ENDIF +* + DELTA=1.0E10 + BURNK=0.0 + JPMAP=LCMGID(IPMAP,HCYCLE) + DO I=1,ILONG + KPMAP=LCMGIL(JPMAP,I) + CALL LCMLEN(KPMAP,'BURNAVG',ILONG,ITYLCM) + IF(ILONG.EQ.0) CYCLE + CALL LCMGET(KPMAP,'BURNAVG',BURNAVG) + IF(ABS(BURNAVG-BURNCY).LT.DELTA) THEN + SIMIND=I + DELTA=ABS(BURNAVG-BURNCY) + BURNK=BURNAVG + ENDIF + ENDDO + IF(DELTA.GT.2.0) THEN + WRITE(HSMG,'(47H@SIMIND: UNABLE TO FIND AN EXISTING AVERAGE BUR, + > 12HNUP EQUAL TO,1P,E12.4,10H IN CYCLE ,A12,1H.)') BURNCY,HCYCLE + CALL XABORT(HSMG) + ENDIF + IF(IMPX.GT.0) WRITE(6,100) SIMIND,HCYCLE,BURNK + RETURN +* + 100 FORMAT(/40H SIMIND: RECOVER LIST INDEX IN LIST ITEM,I3,7H OF CYC, + > 3HLE ,A12,10H AT BURNUP,1P,E12.4,8H MW-D/T./) + END diff --git a/Donjon/src/SIMLIB.f b/Donjon/src/SIMLIB.f new file mode 100644 index 0000000..1cda07e --- /dev/null +++ b/Donjon/src/SIMLIB.f @@ -0,0 +1,112 @@ +*DECK SIMLIB + SUBROUTINE SIMLIB(IMPX,MODE,KPMAP,IPLIB,NTOT,NIS,IFMIX,HFOLLO, + > RFOLLO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Put/get number densities of particularized isotopes in the microlib +* +*Copyright: +* Copyright (C) 2017 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IMPX print parameter. +* MODE transfert mode (=1: get from KPMAP; =2: put to KPMAP). +* KPMAP HCYCLE subdirectory in the fuelmap. +* IPLIB pointer to the microlib. +* NTOT number of fuel bundles. +* NIS number of particularized isotopes. +* IFMIX fuel mixture assigned to each fuel bundle. +* HFOLLO character*8 names of the particularized isotopes. +* +*Parameters: input/output +* RFOLLO number densities of the particularized isotopes. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) KPMAP,IPLIB + INTEGER IMPX,MODE,NIS,NTOT,IFMIX(NTOT) + REAL RFOLLO(NTOT,NIS) + CHARACTER*8 HFOLLO(NIS) +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + INTEGER ISTATE(NSTATE) + CHARACTER*12 HCYCL +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMIX,IVB + REAL, ALLOCATABLE, DIMENSION(:) :: DENS + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HUSE +* + IF(.NOT.C_ASSOCIATED(IPLIB)) THEN + CALL XABORT('SIMLIB: MICROLIB LCM OBJECT MISSING AT RHS.') + ENDIF + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + NBMIX=ISTATE(1) + NBISO=ISTATE(2) + IF(NTOT.GT.NBMIX) CALL XABORT('SIMLIB: NBMIX OVERFLOW.') + ALLOCATE(HUSE(NBISO),DENS(NBISO),IMIX(NBISO),IVB(NBMIX)) + CALL LCMGTC(IPLIB,'ISOTOPESUSED',12,NBISO,HUSE) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS) + IVB(:NBMIX)=0 + IBM=0 + DO ITOT=1,NTOT + IF(IFMIX(ITOT).EQ.0) CYCLE + IBM=IBM+1 + IVB(IBM)=ITOT + ENDDO + CALL LCMGTC(KPMAP,'ALIAS',12,HCYCL) + IF(MODE.EQ.1) THEN +* recover number densities from KCYCLE directory + IF(IMPX.GE.0) WRITE(6,'(/34H SIMLIB: recover number densities , + > 5Hfrom ,A,11H directory.)') HCYCL + CALL LCMGET(KPMAP,'FOLLOW',RFOLLO) + DO ISO=1,NBISO + IBM=IMIX(ISO) + ITOT=IVB(IBM) + IF(ITOT.EQ.0) CALL XABORT('SIMLIB: MISSING FUEL BUNDLE(1).') + DO JSO=1,NIS + IF(HUSE(ISO)(:8).EQ.HFOLLO(JSO)) THEN + DENS(ISO)=RFOLLO(ITOT,JSO) + GO TO 10 + ENDIF + ENDDO + 10 CONTINUE + ENDDO + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO,2,DENS) + ELSE IF(MODE.EQ.2) THEN +* put number densities in KCYCLE directory + IF(IMPX.GE.0) WRITE(6,'(/33H SIMLIB: put number densities in , + > A,11H directory.)') HCYCL + RFOLLO(:NTOT,:NIS)=0.0 + DO ISO=1,NBISO + IBM=IMIX(ISO) + ITOT=IVB(IBM) + IF(ITOT.EQ.0) CALL XABORT('SIMLIB: MISSING FUEL BUNDLE(2).') + DO JSO=1,NIS + IF(HUSE(ISO)(:8).EQ.HFOLLO(JSO)) THEN + RFOLLO(ITOT,JSO)=DENS(ISO) + GO TO 20 + ENDIF + ENDDO + 20 CONTINUE + ENDDO + CALL LCMPUT(KPMAP,'FOLLOW',NTOT*NIS,2,RFOLLO) + ELSE + CALL XABORT('SIMLIB: INVALID VALUE OF MODE.') + ENDIF + DEALLOCATE(IVB,IMIX,DENS,HUSE) + RETURN + END diff --git a/Donjon/src/SIMOUT.f b/Donjon/src/SIMOUT.f new file mode 100644 index 0000000..abff32b --- /dev/null +++ b/Donjon/src/SIMOUT.f @@ -0,0 +1,155 @@ +*DECK SIMOUT + SUBROUTINE SIMOUT(IPMAP,IMPX,BURNINS,IZONE,NCH,NB,LX,LY,HHX,IHY, + > STATE) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Print burnup distribution (3D), radial averages or axial averages +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* V. Salino +* +*Parameters: input +* IPMAP fuel map object. +* IMPX print parameter. +* BURNINS instantaneous burnups. +* IZONE default assembly or quart-of-assembly names as defined in +* the fuel map. +* NCH number of assemblies or number of quart-of-assemblies. +* NB number of axial burnup subdivisions in an assembly. +* LX number of assemblies along the X axis. +* LY number of assemblies along the Y axis. +* LXMIN coordinates on X axis of the first assembly. +* LYMIN coordinates on Y axis of the first assembly. +* HHX naval battle indices along X axis. +* IHY naval battle indices along Y axis. +* STATE flag indicating whether it is a beginning-of-stage print +* or a end-of-stage print. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER IMPX,IHY(LY),NCH,NB,LX,LY + CHARACTER HHX(LX)*1,IZONE(NCH)*4,STATE*5 + REAL BURNINS(NCH,NB) +*---- +* LOCAL VARIABLES +*---- + INTEGER INTG2,INTG2B + REAL MEANR + CHARACTER TEXT4*4,TEXT1*1,TEXT1B*1 +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: MEAN +* + IF(STATE.EQ.'BEGIN')THEN + CALL LCMGET(IPMAP,'BURN-INST',BURNINS) + ENDIF +*---- +* RADIALLY-AVERAGED BURNUP MAP +*---- + IF((STATE.EQ.'BEGIN'.AND.IMPX.GE.8).OR. + > (STATE.EQ.'END '.AND.IMPX.GE.3)) THEN + IF(STATE.EQ.'BEGIN')THEN + WRITE(6,100) + ELSE + WRITE(6,105) + ENDIF + WRITE(6,110) (HHX(I),I=1,LX) + ICH=1 + DO I=1,LY + TEXT4=IZONE(ICH) + READ(TEXT4,'(A1,I2)') TEXT1,INTG2 + NFULL=0 + DO J=1,LX+1 + NFULL=J + IF(ICH.EQ.(NCH+1))GO TO 10 + TEXT4=IZONE(ICH) + READ(TEXT4,'(A1,I2)') TEXT1B,INTG2B + IF(INTG2.NE.INTG2B)GO TO 10 + ICH=ICH+1 + ENDDO + CALL XABORT('@SIMOUT: INCOHERENCE IN BASIC ASSEMBLY ' + > //'LAYOUT GIVEN IN RESINI:.') + 10 CONTINUE + NFULL=NFULL-1 + NEMPTY=(LX-NFULL)/2 + ALLOCATE(MEAN(NFULL)) + MEAN(:NFULL)=0.0 + DO K=1,NFULL + DO IB=1,NB + MEAN(K)=MEAN(K)+BURNINS(ICH-1-NFULL+K,IB)/NB + ENDDO + ENDDO + WRITE(6,115,ADVANCE='NO') IHY(I) + DO K=1,NEMPTY + WRITE(6,120,ADVANCE='NO') + ENDDO + WRITE(6,125) (NINT(MEAN(K)),K=1,NFULL) + DEALLOCATE(MEAN) + ENDDO + ENDIF +*---- +* AXIALLY-AVERAGED BURNUP MAP +*---- + IF((STATE.EQ.'BEGIN'.AND.IMPX.GE.9).OR. + > (STATE.EQ.'END '.AND.IMPX.GE.4))THEN + IF(STATE.EQ.'BEGIN')THEN + WRITE(6,130) + ELSE + WRITE(6,135) + ENDIF + DO IB=1,NB + MEANR=0.0 + DO ICH=1,NCH + MEANR=MEANR+BURNINS(ICH,IB)/NCH + ENDDO + WRITE(6,140) NINT(MEANR) + ENDDO + ENDIF +*---- +* PER-ASSEMBLY 3D BURNUP MAP +*---- + IF((STATE.EQ.'BEGIN'.AND.IMPX.GE.10).OR. + > (STATE.EQ.'END '.AND.IMPX.GE.5))THEN + IF(STATE.EQ.'BEGIN')THEN + WRITE(6,150) + ELSE + WRITE(6,155) + ENDIF + DO ICH=1,NCH + WRITE(6,160) IZONE(ICH) + WRITE(6,170) (BURNINS(ICH,IB),IB=1,NB) + ENDDO + ENDIF +* + IF(STATE.EQ.'BEGIN') BURNINS(:NCH,:NB)=0.0 + RETURN +* + 100 FORMAT(' SIM: BEGINNING-OF-STAGE BURNUP MAP (MW*D/TONNE), ', + > 'RADIAL VIEW :') + 105 FORMAT(' SIM: END-OF-STAGE BURNUP MAP (MW*D/TONNE), ', + > 'RADIAL VIEW :') + 110 FORMAT(1X,20(5X,1A1)) + 115 FORMAT(1X,I2) + 120 FORMAT(6X) + 125 FORMAT(21I6) + 130 FORMAT(/,' SIM: BEGINNING-OF-STAGE BURNUP MAP (MW*D/TONNE), ', + > 'AXIAL VIEW :') + 135 FORMAT(/,' SIM: END-OF-STAGE BURNUP MAP (MW*D/TONNE), ', + > 'AXIAL VIEW :') + 140 FORMAT(1X,I5.1) + 150 FORMAT(/,' SIM: BEGINNING-OF-STAGE 3D BURNUP MAP (MW*D/TONNE) :') + 155 FORMAT(/,' SIM: END-OF-STAGE 3D BURNUP MAP (MW*D/TONNE) :') + 160 FORMAT(' Assembly ',A) + 170 FORMAT(3X,16(1X,F7.1)) + END diff --git a/Donjon/src/SIMPOS.f b/Donjon/src/SIMPOS.f new file mode 100644 index 0000000..b01d1f0 --- /dev/null +++ b/Donjon/src/SIMPOS.f @@ -0,0 +1,149 @@ +*DECK SIMPOS + SUBROUTINE SIMPOS(LX,LY,NCH,NB,HCYC,HOLD,HHX,IHY,ZONE,INFMIX, + > NIS,CYCLE,NAME,BURNUP,FMIX,RFOLLO,ONAME,OBURNU,OFMIX,OFOLLO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Set the correspondance between assembly indices during refuelling. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input/output +* LX number of assemblies along the X axis. +* LY number of assemblies along the Y axis. +* NCH number of assemblies or number of quart-of-assemblies. +* NB number of axial burnup subdivisions in an assembly. +* HCYC name of cycle. +* HOLD name of previous cycle. +* HHX naval battle indices along X axis. +* IHY naval battle indices along Y axis. +* ZONE default assembly or quart-of-assembly names as defined in +* the fuel map. +* INFMIX assembly types as defined in the fuel map. +* NIS number of particularized isotopes. +* CYCLE shuffling matrix for refuelling as provided by the plant +* operator. The name "|" is reserved for empty locations. +* NAME names of each assembly or of each quart-of assembly during +* a refuelling cycle. All quart-of-assembly belonging to the +* same assembly have the same name. +* BURNUP burnups during a refuelling cycle. A value of -999.0 means +* a non-initialized value. +* FMIX assembly mixtures after refuelling. +* RFOLLO number densities of the particularized isotopes after +* refuelling. +* ONAME names of each assembly or of each quart-of assembly during +* a previous refuelling cycle. +* OBURNU burnups during a previous refuelling cycle. +* OFMIX assembly types in a previous refuelling cycle. +* OFOLLO number densities of the particularized isotopes at the end +* of a previous refuelling cycle. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER LX,LY,NCH,NB,IHY(LY),INFMIX(NCH,NB),NIS,FMIX(NCH,NB), + > OFMIX(NCH,NB) + CHARACTER HCYC*12,HOLD*12,HHX(LX)*1,ZONE(NCH)*4,CYCLE(LX,LY)*4, + > NAME(NCH)*12,ONAME(NCH)*12 + REAL BURNUP(NCH,NB),RFOLLO(NCH,NB,NIS),OBURNU(NCH,NB), + > OFOLLO(NCH,NB,NIS) +*---- +* LOCAL VARIABLES +*---- + CHARACTER TEXT4*4,TEXT1*1,HSMG*131 + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: ZONE2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ZONE2(NCH)) +* + MAXINF=0 + DO 10 ICH=1,NCH + MAXINF=MAX(MAXINF,MAXVAL(INFMIX(ICH,:NB))) + ZONE2(ICH)=ZONE(ICH) + 10 CONTINUE + DO ICH=1,NCH + TEXT4=ZONE(ICH) + READ(TEXT4,'(A1,I2)') TEXT1,INTG2 + INDX=0 + DO IX=1,LX + IF(TEXT1.EQ.HHX(IX)) INDX=IX + ENDDO + IF(INDX.EQ.0) CALL XABORT('@SIMPOS: UNABLE TO FIND INDX.') + INDY=0 + DO IY=1,LY + IF(INTG2.EQ.IHY(IY)) INDY=IY + ENDDO + IF(INDY.EQ.0) CALL XABORT('@SIMPOS: UNABLE TO FIND INDY.') + TEXT4=CYCLE(INDX,INDY) + IF((TEXT4.EQ.'|').OR.(TEXT4.EQ.'-').OR.(TEXT4.EQ.'-|-')) THEN + WRITE(HSMG,'(16H@SIMPOS: CHANNEL,I4,21H REFERS TO LOCATION (, + > I4,1H,,I4,37H) WHICH IS OUTSIDE THE CORE AT CYCLE ,A12,1H.)') + > ICH,INDX,INDY,HCYC + CALL XABORT(HSMG) + ELSE IF(TEXT4.EQ.'SPC') THEN + DO IB=1,NB + BURNUP(ICH,IB)=-999.0 + FMIX(ICH,IB)=INFMIX(ICH,IB) + DO ISO=1,NIS + RFOLLO(ICH,IB,ISO)=0.0 + ENDDO + ENDDO + WRITE(NAME(ICH),'(A3,1H/,A8)') TEXT4(:3),HCYC(:8) + ELSE IF(TEXT4.EQ.'NEW') THEN + DO IB=1,NB + BURNUP(ICH,IB)=0.0 + FMIX(ICH,IB)=INFMIX(ICH,IB) + DO ISO=1,NIS + RFOLLO(ICH,IB,ISO)=0.0 + ENDDO + ENDDO + WRITE(NAME(ICH),'(A3,1H/,A8)') TEXT4(:3),HCYC(:8) + ELSE IF(TEXT4(4:).EQ.'@') THEN + READ(TEXT4,'(I3,1X)') NITMA + IF(NITMA.GT.MAXINF) CALL XABORT('@SIMPOS: MAXINF OVERFLOW.') + DO IB=1,NB + BURNUP(ICH,IB)=0.0 + FMIX(ICH,IB)=INFMIX(ICH,IB) + IF(INFMIX(ICH,IB).NE.0) FMIX(ICH,IB)=NITMA + DO ISO=1,NIS + RFOLLO(ICH,IB,ISO)=0.0 + ENDDO + ENDDO + WRITE(NAME(ICH),'(A3,1H/,A8)') 'NEW',HCYC(:8) + ELSE + IF(HOLD.EQ.' ') CALL XABORT('@SIMPOS: NO PREVIOUS CYCLE.') + IOLD=0 + DO ICH2=1,NCH + IF(ZONE2(ICH2).EQ.TEXT4) THEN + IOLD=ICH2 + ZONE2(ICH2)=' ' + GO TO 20 + ENDIF + ENDDO + WRITE(HSMG,'(33H@SIMPOS: UNABLE TO FIND ASSEMBLY ,A4, + > 25HIN THE FUEL MAP AT CYCLE ,A12,1H.)') TEXT4,HCYC + CALL XABORT(HSMG) + 20 DO IB=1,NB + BURNUP(ICH,IB)=OBURNU(IOLD,IB) + FMIX(ICH,IB)=OFMIX(IOLD,IB) + DO ISO=1,NIS + RFOLLO(ICH,IB,ISO)=OFOLLO(IOLD,IB,ISO) + ENDDO + ENDDO + NAME(ICH)=ONAME(IOLD) + ENDIF + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(ZONE2) + RETURN + END diff --git a/Donjon/src/SIMQMP.f b/Donjon/src/SIMQMP.f new file mode 100644 index 0000000..9143a89 --- /dev/null +++ b/Donjon/src/SIMQMP.f @@ -0,0 +1,135 @@ +*DECK SIMQMP + SUBROUTINE SIMQMP(LX,LY,LXMIN,LYMIN,HHX,IHY,CYCLE) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Unfold the quarter shuffling map to full shuffling map, using +* rotations around the center. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* V. Salino +* +*Parameters: input +* LX number of assemblies along the X axis. +* LY number of assemblies along the Y axis. +* LXMIN coordinates on X axis of the first assembly. +* LYMIN coordinates on Y axis of the first assembly. +* HHX naval battle indices along X axis. +* IHY naval battle indices along Y axis. +* +*Parameters: input/output +* CYCLE shuffling matrix for refuelling given as a quarter map, +* and returned as a full reconstructed matrix +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER LX,LY,LXMIN,LYMIN,IHY(LY) + CHARACTER HHX(LX)*1,CYCLE(LX,LY)*4 +*---- +* LOCAL VARIABLES +* ROTMAT counter-clockwise rotation matrices, with an Y-axis directed +* downward. +* ROTMAT(x,x,1) < 90 degrees rotation matrix +* ROTMAT(x,x,2) < 180 degrees rotation matrix +* ROTMAT(x,x,3) < 270 degrees rotation matrix +*---- + INTEGER INTG2,XPOS,YPOS,Q + REAL XCENTER,YCENTER,ROTX(3),ROTY(3),IROT(3),JROT(3), + > ROTMAT(2,2,3) + CHARACTER TEXT4*4,TEXT1*1,RECONS(3)*4 +* + DATA ROTMAT(1,1,1), ROTMAT(1,2,1)/+0.0, +1.0/ + DATA ROTMAT(2,1,1), ROTMAT(2,2,1)/-1.0, +0.0/ +* + DATA ROTMAT(1,1,2), ROTMAT(1,2,2)/-1.0, +0.0/ + DATA ROTMAT(2,1,2), ROTMAT(2,2,2)/+0.0, -1.0/ +* + DATA ROTMAT(1,1,3), ROTMAT(1,2,3)/+0.0, -1.0/ + DATA ROTMAT(2,1,3), ROTMAT(2,2,3)/+1.0, +0.0/ +* + IF(LX.NE.LY) CALL XABORT('@SIMQMP: QMAP KEYWORD IS NOT + > COMPATIBLE WITH A NON-SQUARE REFUELLING SCHEME.') + XCENTER=(REAL(LX)+1)/2 + YCENTER=(REAL(LY)+1)/2 + DO J=LYMIN,LY + DO I=LXMIN,LX +* Excluding potential central assembly from reconstruction + IF(.NOT.(MOD(LX,2).EQ.1.AND.I.EQ.LXMIN.AND.J.EQ.LYMIN)) THEN + TEXT4=CYCLE(I,J) + DO Q=1,3 + IF((TEXT4.NE.'NEW').AND.(TEXT4.NE.'|').AND.(TEXT4.NE.'-') + > .AND.(TEXT4.NE.'-|-').AND.(TEXT4.NE.'SPC').AND. + > (TEXT4(4:).NE.'@')) THEN + READ(TEXT4,'(A1,I2)') TEXT1,INTG2 + XPOS=0 + DO K=1,LX + IF(HHX(K).EQ.TEXT1) THEN + IF(XPOS.NE.0)CALL XABORT('@SIMQMP: X-AXIS HAS ' + > //'MULTIPLE TIMES THE SAME COORDINATES. CHECK ' + > //'YOUR RESINI: CALL.') + XPOS=K + ENDIF + ENDDO + IF(XPOS.EQ.0) CALL XABORT('@SIMQMP: UNABLE TO FIND XPO' + > //'S(1).') + YPOS=0 + DO K=1,LY + IF(IHY(K).EQ.INTG2) THEN + IF(YPOS.NE.0)CALL XABORT('@SIMQMP: Y-AXIS HAS ' + > //'MULTIPLE TIMES THE SAME COORDINATES. CHECK ' + > //'YOUR RESINI: CALL.') + YPOS=K + ENDIF + ENDDO + IF(YPOS.EQ.0) CALL XABORT('@SIMQMP: UNABLE TO FIND YPO' + > //'S(2).') +* Reconstruction of an element of the matrix + ROTX(Q)=ROTMAT(1,1,Q)*(REAL(XPOS)-XCENTER) + > +ROTMAT(1,2,Q)*(REAL(YPOS)-YCENTER)+XCENTER + ROTY(Q)=ROTMAT(2,1,Q)*(REAL(XPOS)-XCENTER) + > +ROTMAT(2,2,Q)*(REAL(YPOS)-YCENTER)+YCENTER + WRITE(RECONS(Q),'(A1,I2.2)') HHX(INT(ROTX(Q))), + > IHY(INT(ROTY(Q))) + ELSE + RECONS(Q)=TEXT4 + ENDIF +* Coordinates of the assembly to be filled with +* reconstructed information + IROT(Q)=ROTMAT(1,1,Q)*(REAL(I)-XCENTER) + > +ROTMAT(1,2,Q)*(REAL(J)-YCENTER)+XCENTER + JROT(Q)=ROTMAT(2,1,Q)*(REAL(I)-XCENTER) + > +ROTMAT(2,2,Q)*(REAL(J)-YCENTER)+YCENTER + ENDDO +* + IF((J.EQ.LYMIN).AND.(MOD(LX,2).EQ.1)) THEN + IF(RECONS(3).NE.CYCLE(INT(IROT(3)),INT(JROT(3)))) THEN + WRITE(6,10) + WRITE(6,20) HHX(I),IHY(J),CYCLE(I,J),RECONS(3), + > HHX(INT(IROT(3))),IHY(INT(JROT(3))), + > CYCLE(INT(IROT(3)),INT(JROT(3))) + CALL XABORT('@SIMQMP: CHECK FOR AN ERROR IN THE QUARTE' + > //'R-MAP RELOADING PATTERN OR SWITCH TO MAP KEYWORD.') + ENDIF + ENDIF +* + DO Q=1,3 + CYCLE(INT(IROT(Q)),INT(JROT(Q)))=RECONS(Q) + ENDDO + ENDIF + ENDDO + ENDDO + RETURN +* + 10 FORMAT('@SIMQMP: INCONSISTENCY IN REDUNDANT DATA. THE ', + > 'QUARTER-MAP RELOADING PATTERN IS NOT QUARTER-SYMETRIC.') + 20 FORMAT('CONTENT OF ',A1,I2.2,' (',A4,') IS SUPPOSED TO LEAD TO "' + > ,A4,'" IN ',A1,I2.2,', BUT "',A4,'" HAS BEEN SPECIFIED ', + > 'INSTEAD.') + END diff --git a/Donjon/src/SIMSET.f b/Donjon/src/SIMSET.f new file mode 100644 index 0000000..2ed6bec --- /dev/null +++ b/Donjon/src/SIMSET.f @@ -0,0 +1,69 @@ +*DECK SIMSET + SUBROUTINE SIMSET(NCH,NB,HCYC,NASMB1,ASMB1,BURN,IFUEL,ZONE,NAME, + > BURNUP,FMIX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Set the burnup and fuel type of a group of assemblies at positions +* ASMB1. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input/output +* NCH number of assemblies or number of quart-of-assemblies. +* NB number of axial burnup subdivisions in an assembly. +* HCYC name of cycle. +* NASMB1 number of assemblies to set. +* ASMB1 group of assembly names, as defined in the fuel map, to set +* at specific burnup or fuel type. +* BURN burnup in MW-day/tonne. Burnup must be set if .ne.-999.0. +* IFUEL fuel type. Fuel type must be set if .ne.0. +* ZONE default assembly or quart-of-assembly names as defined in +* the fuel map. +* NAME names of each assembly or of each quart-of assembly during +* a refuelling cycle. All quart-of-assembly belonging to the +* same assembly have the same name. +* BURNUP burnups during a refuelling cycle. A value of -999.0 means +* a non-initialized value. +* FMIX assembly types after refuelling. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NCH,NB,NASMB1,FMIX(NCH,NB) + CHARACTER HCYC*12,ZONE(NCH)*4,ASMB1(NASMB1)*4,NAME(NCH)*12 + REAL BURN,BURNUP(NCH,NB) +*---- +* LOCAL VARIABLES +*---- + CHARACTER HSMG*131 +* + DO IASMB1=1,NASMB1 + DO ICH=1,NCH + IF(ASMB1(IASMB1).EQ.ZONE(ICH)) THEN + DO IB=1,NB + IF(BURN.NE.-999.0) THEN + IF(BURNUP(ICH,IB).NE.-999.0) THEN + WRITE(HSMG,'(36H@SIMSET: BURNUP ALREADY DEFINED IN C, + > 6HHANNEL,I4,10HAND BUNDLE,I4,10H AT CYCLE ,A12,1H.)') + > ICH,IB,HCYC + ENDIF + BURNUP(ICH,IB)=BURN + ENDIF + IF(IFUEL.NE.0) THEN + FMIX(ICH,IB)=IFUEL + ENDIF + ENDDO + NAME(ICH)=ASMB1(IASMB1)(:3)//HCYC(:9) + ENDIF + ENDDO + ENDDO + RETURN + END diff --git a/Donjon/src/T16CPO.f b/Donjon/src/T16CPO.f new file mode 100644 index 0000000..58fedc5 --- /dev/null +++ b/Donjon/src/T16CPO.f @@ -0,0 +1,320 @@ +*DECK T16CPO + SUBROUTINE T16CPO(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*---- +* +*Purpose: +* Transfer a WIMS-AECL 3.1 tape16 file to a Donjon/Dragon CPO data +* structure. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The T16CPO: module specifications are: +* DONCPO := T16CPO: [ DONCPO ] WIMS16 :: (desct16cpo) ; +* where +* DONCPO : name of data structure where the output COP is +* stored. This can be a new data structure or an old +* data structure that will be updated. +* (desct16cpo] : input specifications for the execution +* of the T16CPO: module. +* +*---- +* + USE GANLIB + IMPLICIT NONE + INTEGER NENTRY + CHARACTER HENTRY(NENTRY)*12 + INTEGER IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) +*---- +* MEMORY ALLOCATION +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IFGCND,IFGMTR,IFGEDI, + > NAMMIX,MIXRCI,MIXPER,MIXREG + REAL, ALLOCATABLE, DIMENSION(:) :: ENET16,ENECPO,VELMTR, + > PARRCI,PARPER +*---- +* READ VARIABLES +*---- + CHARACTER TEXT12*12 + INTEGER ITYPE,NITMA + REAL FLOTT + DOUBLE PRECISION DFLOTT +*---- +* LOCAL VARIABLES +*---- + INTEGER IFT16,IOUT,NSTATE,MXGRP,MNLOCP,MNCPLP,MNPERT + CHARACTER NAMSBR*6,NAMVER*12,NAMDAT*12,NAMMOD*12 + PARAMETER (IOUT=6,NSTATE=40,MXGRP=89,MNLOCP=11, + > MNCPLP=1,MNPERT=10,NAMSBR='T16CPO', + > NAMVER='VERSION 2.0 ',NAMDAT='2012/07/09 ', + > NAMMOD='T16CPO: ') + CHARACTER TEXT4*4,HSIGN*12,TITLE*72,SUBTIT*240 + INTEGER ISTATE(NSTATE), + > MAXMIX,MNBURN, + > ITEXT4,ITCPO,NCMIXS, + > IPRINT,ILIST,IMIXT,NMIXT,NEL,NG,NGMTR, + > NMATZ,MTRMSH,NZONE,NGREAC, + > NRCELA,NRREGI,NGCOND,NGCCPO,IGC,ILASTG + TYPE(C_PTR) IPCPO +*---- +* DATA +*---- + CHARACTER NALOCP(MNLOCP+MNCPLP)*4 + INTEGER IDLCPL(2,MNLOCP+MNCPLP) + SAVE NALOCP,IDLCPL + DATA NALOCP /'FT ','MT ','MD ','MP ', + > 'MB ','CT ','CD ','CP ', + > 'RT ','RD ','RP ','MTMD'/ + DATA IDLCPL / 1, 0, 2, 0, 3, 0, 4, 0, + > 5, 0, 6, 0, 7, 0, 8, 0, + > 9, 0, 10, 0, 11, 0, 2, 3/ +*---- +* PRINT CREDITS +*---- + WRITE(IOUT,6900) NAMMOD + WRITE(IOUT,6910) +*---- +* SET TITLE +*---- + TEXT4=' ' + READ(TEXT4,'(A4)') ITEXT4 + TITLE=' ' + TITLE(1:6)=NAMSBR + TITLE(9:20)=NAMVER + TITLE(21:32)=NAMDAT +*---- +* ALLOCATE MEMORY FOR ENERGY +*---- + ALLOCATE(IFGCND(MXGRP),IFGMTR(MXGRP),IFGEDI(MXGRP)) + ALLOCATE(ENET16(MXGRP+1),ENECPO(MXGRP+1),VELMTR(MXGRP)) +*---- +* NUMBER OF DATA STRUCTURES +*---- + IF(NENTRY .LT. 2) THEN + CALL XABORT(NAMSBR// + > ': AT LEAST TWO DATA STRUCTURES EXPECTED.') + ENDIF +*---- +* FIRST DATA STRUCTURE IS CPO +*---- + IF(IENTRY(1) .NE. 1 .AND. IENTRY(1) .NE. 2 ) THEN + CALL XABORT(NAMSBR// + > ': LINKED LIST OR XSM FILE EXPECTED FOR CPO.') + ENDIF + IPCPO=KENTRY(1) + ITCPO=0 + IF(JENTRY(1) .EQ. 0) THEN +*---- +* New CPO +*---- + HSIGN='L_COMPO' + CALL LCMPTC(IPCPO,'SIGNATURE',12,HSIGN) + ISTATE(:NSTATE)=0 + ISTATE(3)=1 + ISTATE(4)=2 + ISTATE(6)=1 + ISTATE(7)=MNLOCP+MNCPLP + ISTATE(8)=MNLOCP + ISTATE(9)=72 + ELSE IF(JENTRY(1) .EQ. 1) THEN +*---- +* Update CPO +*---- + CALL LCMGTC(IPCPO,'SIGNATURE',12,HSIGN) + IF(HSIGN .NE. 'L_COMPO') THEN + CALL XABORT(NAMSBR//': SIGNATURE OF '//HENTRY(1)// + > ' IS '//HSIGN//'. L_COMPO EXPECTED.') + ENDIF + CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE) + IF(ISTATE(3) .NE. 1) CALL XABORT(NAMSBR// + > ': INVALID NUMBER OF ISOTOPES ON UPDATE CPO') + IF(ISTATE(4) .NE. 2) CALL XABORT(NAMSBR// + > ': INVALID SCATTERING ANISOTROPY ON UPDATE CPO') + IF(ISTATE(5) .LE. 1) CALL XABORT(NAMSBR// + > ': INVALID NUMBER OF BURNUP STEP ON UPDATE CPO') + IF(ISTATE(6) .NE. 1) CALL XABORT(NAMSBR// + > ': UPDATE CPO DOES NOT MATCH TAPE16 FORMAT') + IF(ISTATE(7) .NE. MNLOCP+MNCPLP) CALL XABORT(NAMSBR// + > ': INVALID NUMBER OF PERTURBATION TYPES ON UPDATE CPO') + IF(ISTATE(8) .NE. MNLOCP) CALL XABORT(NAMSBR// + > ': INVALID NUMBER OF LOCAL PARAMETERS ON UPDATE CPO') + IF(ISTATE(9) .NE. 72 ) CALL XABORT(NAMSBR// + > ': INVALID LENGTH OF SUBTITLE ON UPDATE CPO') + ITCPO=1 + IF(ISTATE(2) .GT. 0) THEN + CALL LCMGET(IPCPO,'T16CPOENERGY',ENECPO) + ENDIF + ELSE +*---- +* Read-only CPO +*---- + CALL XABORT(NAMSBR//': READONLY MODE FOR '//HENTRY(1)// + > ' IS ILLEGAL.') + ENDIF + NCMIXS=ISTATE(1) + NGCCPO=ISTATE(2) +*---- +* SECOND DATA STRUCTURE IS TAPE16 FILE +*---- + IF(IENTRY(2) .NE. 3) THEN + CALL XABORT(NAMSBR// + > ': SEQUENTIAL BINARY FILE EXPECTED FOR TAPE16.') + ENDIF + IF(JENTRY(2) .NE. 2) THEN + CALL XABORT(NAMSBR//': READONLY MODE FOR '//HENTRY(2)// + > ' IS REQUIRED.') + ENDIF + IFT16=FILUNIT(KENTRY(2)) +*---- +* INITIALIZE DEFAULT INPUT OPTIONS +* AND READ DATA UNTIL KEYWORD MIX IS REACHED +*---- + IPRINT=1 + ILIST=0 + IMIXT=0 + NMIXT=1 + NGCOND=0 + 100 CONTINUE + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE.NE.3) CALL XABORT(NAMSBR// + > ' KEYWORD EXPECTED') + IF(TEXT12.EQ.';') THEN + GO TO 105 + ELSE IF(TEXT12.EQ.'EDIT') THEN + CALL REDGET(ITYPE,IPRINT,FLOTT,TEXT12,DFLOTT) + IF(ITYPE.NE.1) CALL XABORT(NAMSBR// + > ': EDIT LEVEL EXPECTED') + ELSE IF(TEXT12.EQ.'NMIX') THEN + CALL REDGET(ITYPE,NMIXT,FLOTT,TEXT12,DFLOTT) + IF(ITYPE.NE.1) CALL XABORT(NAMSBR// + > ': NUMBER OF MIXTURE EXPECTED') + ELSE IF(TEXT12.EQ.'CONDG') THEN + CALL REDGET(ITYPE,NGCOND,FLOTT,TEXT12,DFLOTT) + IF(ITYPE.NE.1) CALL XABORT(NAMSBR// + > ': NUMBER OF CONDENSATION GROUP EXPECTED') + ILASTG=0 + DO 101 IGC=1,NGCOND + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE.NE.1) CALL XABORT(NAMSBR// + > ': GROUP NUMBER REQUIRED') + IF( NITMA .GT. MXGRP .OR. NITMA .LT. ILASTG) THEN + CALL XABORT(NAMSBR// + > ': INVALID GROUP SEQUENCE PROVIDED') + ENDIF + IFGCND(IGC)=NITMA + 101 CONTINUE + ELSE IF(TEXT12.EQ.'LIST') THEN + ILIST=1 + ELSE IF(TEXT12.EQ.'MIX') THEN + IMIXT=1 + GO TO 105 + ENDIF + GO TO 100 +105 CONTINUE + IF(ILIST .EQ. 1) THEN + CALL T16LST(IFT16) + ENDIF +*---- +* SCAN T16 FOR DIMENSIONING DATA +*---- + CALL T16DIM(IFT16 ,IPRINT,MXGRP ,SUBTIT,NEL ,NG , + > NGMTR ,NMATZ ,MTRMSH,NZONE ,NGREAC,NRCELA, + > NRREGI,IFGMTR,IFGEDI) +*---- +* ANALYZE CONDENSED GROUP STRUCTURE +*---- + CALL T16ENE(IPRINT,MXGRP ,NG ,NGCOND,NGMTR ,NGREAC, + > NGCCPO,IFGCND,IFGMTR,IFGEDI,ENECPO,ENET16, + > VELMTR) + MNBURN=ISTATE(5) +*---- +* DEFINE DIMENSIONS ADEQUATELY, ALLOCATE MEMORY AND +* INITIALIZE +*---- + MAXMIX=NCMIXS+NMIXT + ALLOCATE(NAMMIX(2*MAXMIX),MIXRCI((2+MNLOCP+MNCPLP)*MAXMIX), + > MIXPER(MNPERT*(MNLOCP+MNCPLP)*MAXMIX),MIXREG(MAXMIX)) + ALLOCATE(PARRCI(MNLOCP*MAXMIX), + > PARPER(MNPERT*2*(MNLOCP+MNCPLP)*MAXMIX)) + NAMMIX(:2*MAXMIX)=ITEXT4 + MIXRCI(:(2+MNLOCP+MNCPLP)*MAXMIX)=0 + MIXPER(:MNPERT*(MNLOCP+MNCPLP)*MAXMIX)=0 + MIXREG(:MAXMIX)=0 + PARRCI(:MNLOCP*MAXMIX)=0.0 + PARPER(:MNPERT*2*(MNLOCP+MNCPLP)*MAXMIX)=0.0 +*---- +* INITIALIZE DEFAULT VALUES FOR ABOVE MIXTURE PARAMETERS +* VECTORS +*---- + IF(ITCPO .EQ. 1) THEN + CALL T16MPI(IPCPO ,IPRINT,MAXMIX,MNLOCP,MNCPLP,MNPERT, + > NALOCP,IDLCPL,NCMIXS,NGCCPO,ENECPO,NAMMIX, + > MIXRCI,PARRCI,PARPER) + ENDIF +*---- +* MODIFIFY VALUES FOR ABOVE VECTORS AS SPECIFIED ON INPUT FILE +*---- + IF(IMIXT .EQ. 1) THEN + CALL T16GET(MAXMIX,MNLOCP,MNCPLP,MNPERT,NALOCP,IDLCPL, + > NCMIXS,MNBURN,NAMMIX,MIXRCI,PARRCI,MIXPER, + > PARPER,MIXREG) +*---- +* SAVE MODIFIED VALUES FOR ABOVE MIXTURE PARAMETERS +* VECTORS +*---- + CALL T16MPS(IPCPO ,IPRINT,MAXMIX,MNLOCP,MNCPLP,MNPERT, + > NALOCP,IDLCPL,NCMIXS,NGCCPO,TITLE ,SUBTIT , + > ENECPO,NAMMIX,MIXRCI,PARRCI,PARPER) + ENDIF + DEALLOCATE(PARPER,PARRCI) +*---- +* SAVE UPDATED STATE-VECTOR +*---- + ISTATE(1)=NCMIXS + ISTATE(2)=NGCCPO + ISTATE(5)=MNBURN + CALL LCMPUT(IPCPO,'T16CPOENERGY',NGCCPO+1,2,ENECPO) + CALL LCMPUT(IPCPO,'STATE-VECTOR',NSTATE,1,ISTATE) +*---- +* CALL MAIN T16 CROSS SECTION DRIVER +*---- + CALL T16DRV(IPCPO ,IFT16 ,IPRINT,MNLOCP,MNCPLP,MNPERT, + > NALOCP,NCMIXS,NGCCPO,MNBURN,NG ,NGMTR , + > NMATZ ,MTRMSH,NZONE ,IFGMTR,VELMTR,NAMMIX, + > MIXRCI,MIXPER,MIXREG) +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(MIXREG,MIXPER,MIXRCI,NAMMIX) + DEALLOCATE(VELMTR,ENECPO,ENET16) + DEALLOCATE(IFGEDI,IFGMTR,IFGCND) + WRITE(IOUT,6901) NAMMOD + RETURN +*---- +* PRINT FORMAT +*---- + 6900 FORMAT('->@BEGIN MODULE : ',A12) + 6901 FORMAT('->@END MODULE : ',A12) + 6910 FORMAT('->@DESCRIPTION : CONVERT WIMS-TAPE16 TO DRAGON-CPO'/ + > '->@CREDITS : G. MARLEAU'/ + > '->@COPYRIGHTS : ECOLE POLYTECHNIQUE DE MONTREAL'/ + > ' ATOMIC ENERGY OF CANADA LIMITED') + + END diff --git a/Donjon/src/T16DIM.f b/Donjon/src/T16DIM.f new file mode 100644 index 0000000..f206b5e --- /dev/null +++ b/Donjon/src/T16DIM.f @@ -0,0 +1,326 @@ +*DECK T16DIM + SUBROUTINE T16DIM(IFT16 ,IPRINT,MXGRP ,SUBTIT,NEL ,NG , + > NGMTR ,NMATZ ,MTRMSH,NZONE ,NGREAC,NRCELA, + > NRREGI,IFGMTR,IFGEDI) +* +*---- +* +*Purpose: +* Scan WIMS-AECL tape16 file for general dimensioning information. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* IPRINT print level where: +* =0 for no print; >= 1 print record to read; +* >= 10 print all record read. +* MXGRP maximum number or groups. +* +*Parameters: output +* SUBTIT subtitle. +* NEL number of isotopes on X-S library. +* NG number of groups on X-S library. +* NGMTR number of main transport groups. +* NMATZ number of mixtures. +* MTRMSH number of main transport mesh points. +* NZONE number of zones. +* NGREAC number of edit groups. +* NRCELA number of CELLAV sets of records. +* NRREGI number of REGION sets of records. +* IFGMTR fewgroups for main transport. +* IFGEDI fewgroups for edit. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16,IPRINT,MXGRP,NEL,NG, + > NGMTR,NMATZ,MTRMSH,NZONE, + > NGREAC,NRCELA,NRREGI + INTEGER IFGMTR(MXGRP),IFGEDI(MXGRP) + CHARACTER SUBTIT*240 +*---- +* T16 KEYS +*---- + CHARACTER CWVER*80,CLIBN*16,CASETL*128, + > TKEY1*10,TKEY2*10,RKEY1*10,RKEY2*10, + > WLEAK*10, WDIFF*10,WEDIT*10,BLANK*2 + INTEGER NKEY,IOPT,NBE,NID,NJD,IR,JR + REAL RID +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT,NFPR,NREGON,NM + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='T16DIM') +*---- +* READ GENERAL TAPE16 INFORMATION +*---- + IOPT=0 + NKEY=1 + SUBTIT=' ' + REWIND(IFT16) +*---- +* 1) WIMS-AECL VERSION +*---- + TKEY1='PROCESSING' + TKEY2='PROCESSING' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,CWVER + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF + SUBTIT(1:80)=CWVER +*---- +* 2) LIBRARY NAME +*---- + TKEY1='PROCESSING' + TKEY2='NDASTITLE ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE, CLIBN + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF + SUBTIT(81:104)=' ------ '//CLIBN +*---- +* 3) CASE TITLE +*---- + TKEY1='TITLE ' + TKEY2='CARD ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,CASETL + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF + SUBTIT(105:240)=' ------ '//CASETL +*---- +* 4) WIMS CONSTANTS +*---- + TKEY1='WIMS ' + TKEY2='CONSTANTS ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,NEL,NG,(NID,IR=1,8),NGMTR, + > (NID,IR=1,6),NMATZ,NM + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF +*---- +* 5) MAIN TRANSPORT GROUPS +*---- + TKEY1='MTR ' + TKEY2='FEWGROUPS ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,(IFGMTR(IR),IR=1,NGMTR) + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF +*---- +* 6) DIMENSION OF TRANSPORT MESH +* PRESENT ONLY IF MTRFLX KEY ACTIVATED +*---- + TKEY1='MTRFLX ' + TKEY2='FLUX ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,NID,MTRMSH + ELSE + REWIND(IFT16) + MTRMSH=0 + IF(IPRINT .GE. 10) + > WRITE(IOUT,8000) NAMSBR,TKEY1,TKEY2,'MTRMSH',MTRMSH + ENDIF +*---- +* 7) NUMBER OF FUEL PIN RINGS +* PRESENT ONLY FOR BURNUP CASES WITH CLUSTER GEOMETRY +*---- +*----- A.ZH. THIS RECORD CAN HAVE A DIFFERENT INTERPRETATION----- + TKEY1='CELLAV ' + TKEY2='PINBURNUP ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE + NFPR=(NBE-1)/3 + ELSE + REWIND(IFT16) + NFPR=0 + IF(IPRINT .GE. 10) + > WRITE(IOUT,8000) NAMSBR,TKEY1,TKEY2,'NFPR ',NFPR + ENDIF +*---- +* 8) NUMBER OF ZONES +*---- + REWIND(IFT16) + TKEY1='REGION ' + TKEY2='DESCRIPTON' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,NZONE + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF +*---- +* 9) NUMBER OF EDIT REGIONS +*---- + TKEY1='REGION ' + TKEY2='DIMENSIONS' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,NREGON + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1//','// + > TKEY2//' NOT FOUND ON TAPE16') + ENDIF +*---- +* 10) NUMBER OF EDIT GROUPS +* PRESENT ONLY IF REACTION KEY ACTIVATED +*---- + TKEY1='REACTION ' + TKEY2='FLUX ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,WLEAK,WDIFF,WEDIT,BLANK, + > (NID,IR=1,2),NGREAC, + > ((RID,IR=1,NZONE),JR=1,NG), + > (IFGEDI(IR),IR=1,NGREAC) + ELSE + NGREAC=0 + IF(IPRINT .GE. 10) + > WRITE(IOUT,8000) NAMSBR,TKEY1,TKEY2,'NGREAC',NGREAC + ENDIF +*---- +* FIND THE NUMBER OF SETS OF CELLAV RECORDS +* BASED ON THE PRESENCE OF CELLAV,NGROUP KEYS +* ALSO TEST FOR NGMTR CONSISTENCY +*---- + REWIND(IFT16) + NRCELA=0 + TKEY1='CELLAV ' + TKEY2='NGROUPS ' + 100 CONTINUE + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .EQ. 1) THEN + NRCELA=NRCELA+1 + READ(IFT16) RKEY1,RKEY2,NBE,NID + IF(NID .NE. NGMTR) THEN + WRITE(IOUT,9000) NAMSBR,NGMTR,NRCELA,NID + CALL XABORT(NAMSBR//': INVALID CELLAV STRUCTURE') + ENDIF + GO TO 100 + ELSE IF(NBE .EQ. -1) THEN + GO TO 105 + ELSE + WRITE(IOUT,9001) NAMSBR,1,NBE + CALL XABORT(NAMSBR//': INVALID CELLAV STRUCTURE') + ENDIF + 105 CONTINUE +*---- +* FIND THE NUMBER OF SETS OF REGION RECORD NRREGI +* BASED ON THE PRESENCE OF REGION,DESCRIPTON KEYS +* ALSO TEST FOR NZONE, NGMTR AND NREGON CONSISTENCY +*---- + REWIND(IFT16) + NRREGI=0 + TKEY1='REGION ' + TKEY2='DESCRIPTON' + 110 CONTINUE + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + NRREGI=NRREGI+1 + READ(IFT16) RKEY1,RKEY2,NBE,NID + IF(NID .NE. NZONE ) THEN + WRITE(IOUT,9010) NAMSBR,NZONE,NRREGI,NID + CALL XABORT(NAMSBR//': INVALID REGION STRUCTURE') + ENDIF + READ(IFT16) RKEY1,RKEY2,NBE,NID,NJD + IF(NID .NE. NREGON ) THEN + WRITE(IOUT,9010) NAMSBR,NREGON,NRREGI,NID + CALL XABORT(NAMSBR//': INVALID REGION STRUCTURE') + ENDIF + IF(NJD .NE. NGMTR ) THEN + WRITE(IOUT,9010) NAMSBR,NGMTR,NRREGI,NJD + CALL XABORT(NAMSBR//': INVALID REGION STRUCTURE') + ENDIF + GO TO 110 + ELSE + GO TO 115 + ENDIF + 115 CONTINUE +*---- +* PROCESS PRINT LEVEL +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR, + > SUBTIT(113:240),SUBTIT(1:80),SUBTIT(89:104) + WRITE(IOUT,6010) NEL,NG,NGMTR,NMATZ,NM,MTRMSH, + > NFPR,NZONE,NREGON,NGREAC,NRCELA,NRREGI + WRITE(IOUT,6001) + ENDIF + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),' OUTPUT FROM ',A6,1X,5('*')/ + > 6X,'CONTENTS OF TAPE16 FILE :'/A128/ + > 6X,'WIMS-AECL VERSION = ',A80/ + > 6X,'LIBRARY VERSION = ',A16) + 6001 FORMAT(1X,30('*')) + 6010 FORMAT(6X,'DIMENSIONING DATA '/ + > 6X,'NEL : NB. ISOTOPES = ',I10/ + > 6X,'NG : NB. GROUPS = ',I10/ + > 6X,'NGMTR : NB. MAIN TRANSPORT GROUP = ',I10/ + > 6X,'NMATZ : NB. MIXTURES = ',I10/ + > 6X,'NM : NB. BURNABLE MATERIALS = ',I10/ + > 6X,'MTRMSH : NB. TRANSPORT MESH POINTS= ',I10/ + > 6X,'NFPR : NB. FUEL PIN RINGS = ',I10/ + > 6X,'NZONE : NB. ZONES = ',I10/ + > 6X,'NREGON : NB. EDIT REGIONS = ',I10/ + > 6X,'NGREAC : NB. EDIT GROUPS = ',I10/ + > 6X,'NRCELA : NB. CELLAV RECORDS = ',I10/ + > 6X,'NRREGI : NB. REGION RECORDS = ',I10) +*---- +* WARNING FORMAT +*---- + 8000 FORMAT(1X,A6,1X,6('*'),' WARNING ',6('*')/ + > 8X,'RECORD WITH KEYS ',2(A10,2X),'NOT FOUND'/ + > 8X,'USE DEFAULT VALUE FOR ',A6,' = ',I10/ + > 8X,21('*')) +*---- +* ABORT FORMAT +*---- + 9000 FORMAT(1X,A6,1X,7('*'),' ERROR ',7('*')/ + > 8X,6X,' NUMBER OF MAIN TRANSPORT GROUP ',I10/ + > 8X,I6,' CELLAV NGROUPS RECORD GIVES ',I10/ + > 8X,21('*')) + 9001 FORMAT(1X,A6,1X,7('*'),' ERROR ',7('*')/ + > 8X,' NB ELEMENT ALLOWED ON CELLAV NGROUPS ',I10/ + > 8X,' NB ELEMENT READ ON CELLAV NGROUPS ',I10/ + > 8X,21('*')) + 9010 FORMAT(1X,A6,1X,7('*'),' ERROR ',7('*')/ + > 8X,6X,' NUMBER OF ZONES ',I10/ + > 8X,I6,' REGION RECORD ',I10,' GIVES ',I10/ + > 8X,21('*')) + END diff --git a/Donjon/src/T16DRV.f b/Donjon/src/T16DRV.f new file mode 100644 index 0000000..c9ff36f --- /dev/null +++ b/Donjon/src/T16DRV.f @@ -0,0 +1,230 @@ +*DECK T16DRV + SUBROUTINE T16DRV(IPCPO ,IFT16 ,IPRINT,MNLOCP,MNCPLP,MNPERT, + > NALOCP,NCMIXS,NGCCPO,MNBURN,NG ,NGMTR , + > NMATZ ,MTRMSH,NZONE ,IFGMTR,VELMTR,NAMMIX, + > MIXRCI,MIXPER,MIXREG) +* +*---- +* +*Purpose: +* Main driver for the transfer of cross sections from tape16 to CPO. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPCPO pointer to CPO data structure. +* IFT16 tape16 file unit. +* IPRINT print level where: +* =0 for no print; >= 1 print processing option. +* MNLOCP maximum number of local parameters. +* MNCPLP maximum number of coupled parameters. +* MNPERT maximum number of perturbations per local parameter. +* NALOCP local parameter names allowed. +* NCMIXS number of current mixtures. +* NGCCPO number of edit groups. +* MNBURN maximum number or burnup steps. +* NG number of groups on X-S library. +* NGMTR number of main transport groups. +* NMATZ number of mixtures. +* MTRMSH number of main transport mesh points. +* NZONE number of zones. +* IFGMTR fewgroups for main transport. +* VELMTR velocity for main transport. +* NAMMIX names of mixtures. +* MIXRCI reference information for mixtures where: +* =0 no information for mixture; +* >0 information not updated; +* <0 information to be updated. +* MIXPER perturbation information for mixtures. +* =0 no information for mixture; +* >0 information not updated; +* <0 information to be updated. +* MIXREG mixture update identifier where: +* =0 do not update; +* =-1 update using CELLAV information; +* > 0 update using specified region number. +* +*---- +* + USE GANLIB + IMPLICIT NONE + TYPE(C_PTR) IPCPO + INTEGER IFT16,IPRINT,MNLOCP,MNCPLP,MNPERT, + > NCMIXS,NGCCPO,MNBURN,NG,NGMTR,NMATZ, + > MTRMSH,NZONE + CHARACTER NALOCP(MNLOCP+MNCPLP)*4 + INTEGER IFGMTR(NGCCPO),NAMMIX(2,NCMIXS), + > MIXRCI(2+MNLOCP+MNCPLP,NCMIXS), + > MIXPER(MNPERT,MNLOCP+MNCPLP,NCMIXS), + > MIXREG(NCMIXS) + REAL VELMTR(NGMTR) +*---- +* MEMORY ALLOCATION +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: BURNUP,WNKB + INTEGER, ALLOCATABLE, DIMENSION(:) :: KMSPEC,MATMSH,IDRXSM + REAL, ALLOCATABLE, DIMENSION(:) :: VQLE,FLXINT,FLXDIS, + > OVERV,RECXSV,RECXSM, + > RECTMP,RECSCA,ZONVOL,ZONRAD +*---- +* T16 PARAMETERS +*---- + INTEGER MAXKEY + PARAMETER (MAXKEY=2) + CHARACTER TKEY1(MAXKEY)*10,TKEY2(MAXKEY)*10, + > RKEY1*10,RKEY2*10 + INTEGER NKEY,IOPT,NBE,IR,ZONNUM +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT,ILCMUP,ILCMDN,NVXSR,NMXSR + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,ILCMUP=1,ILCMDN=2,NVXSR=20,NMXSR=2, + > NAMSBR='T16DRV') + CHARACTER NAMDIR*12 + INTEGER IMIX,ILOCP,NBPERP,IPER,NBURN,IBURN,NPERTN, + > INEXTR,ITYXS(NVXSR+NMXSR),IMIREG, + > MMXM + REAL VOLUME,B2CRI(3),BRNIRR(3),EFJ +*---- +* DATA +*---- + CHARACTER NAMDXS(NVXSR+NMXSR)*12 + SAVE NAMDXS + DATA NAMDXS + > /'TOTAL ','TRANC ','NUSIGF ','NFTOT ', + > 'CHI ','NU ','NG ','NHEAT ', + > 'N2N ','N3N ','N4N ','NP ', + > 'NA ','GOLD ','ABS ','NWT0 ', + > 'STRD ','STRD X ','STRD Y ','STRD Z ', + > 'SIGS 0 ','SIGS 1 '/ +*---- +* ALLOCATE MEMORY +*---- + MMXM=MAX(NZONE,MTRMSH) + NPERTN=MNLOCP+MNCPLP + ALLOCATE(BURNUP(MNBURN),WNKB(MNBURN)) + ALLOCATE(KMSPEC(NMATZ),MATMSH(MMXM),IDRXSM(NGCCPO*2)) + ALLOCATE(VQLE(MMXM),FLXINT(NGCCPO),FLXDIS(NGCCPO), + > OVERV(NGCCPO),RECXSV(NGCCPO*(NVXSR+NMXSR)), + > RECXSM(NGCCPO*NGCCPO*NMXSR),RECTMP(4*NGMTR), + > RECSCA(NGMTR*NGMTR)) + ALLOCATE(ZONVOL(NZONE),ZONRAD(NZONE)) +*---- +* FIND MATERIAL SPECTRUM +* REQUIRED FOR FLUX DISADVANTAGE FACTOR +*---- + IOPT=1 + TKEY1(1)='MATERIAL ' + TKEY2(1)='SPECTRUM ' + NKEY=1 + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NMATZ ) THEN + WRITE(6,'(128A1)') 'PLEASE RE-RUN WIMS-AECL BECAUSE '// + > 'T16CPO UTILITY NEEDS A RECORD: '//TKEY1(1)//TKEY1(2) + CALL XABORT(NAMSBR// + > ': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + ELSE + READ(IFT16) RKEY1,RKEY2,NBE,(KMSPEC(IR),IR=1,NMATZ) + ENDIF +*---- +* SCAN OVER MIXTURES +*---- + DO IMIX=1,NCMIXS +*---- +* MIXTURE TO UPDATE +*---- + BRNIRR(:3)=0.0 + IMIREG=MIXREG(IMIX) + WRITE(NAMDIR,'(A4,A2,A6)') + > NAMMIX(1,IMIX),NAMMIX(2,IMIX),'RC ' + NBURN=ABS(MIXRCI(2,IMIX)) + IF(MIXRCI(2,IMIX) .LT. 0) THEN + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + INEXTR=MIXRCI(1,IMIX) + DO IBURN=1,NBURN +*---- +* BURNUP STEP TO UPDATE +*---- + CALL T16REC(IFT16 ,IPRINT,INEXTR) + CALL T16FLX(IFT16 ,IPRINT,NGCCPO,NG ,NGMTR ,NMATZ , + > MMXM ,MTRMSH,NZONE ,IFGMTR,VELMTR,IMIREG, + > VOLUME,B2CRI ,FLXINT,FLXDIS,OVERV ,KMSPEC, + > MATMSH,VQLE ,ZONNUM, ZONRAD,ZONVOL) + IF(IMIREG .GT. 0) THEN + CALL T16REC(IFT16 ,IPRINT,INEXTR) + CALL T16RRE(IFT16 ,IPRINT,NGCCPO,NGMTR ,IFGMTR,NVXSR , + > NMXSR ,IMIREG,VELMTR,B2CRI ,BRNIRR,FLXINT, + > OVERV ,RECXSV,RECXSM,RECTMP,RECSCA) + ELSE + CALL T16REC(IFT16 ,IPRINT,INEXTR) + CALL T16RCA(IFT16 ,IPRINT,NGCCPO,NGMTR ,IFGMTR,NVXSR , + > NMXSR ,B2CRI ,BRNIRR,NZONE ,RECXSV,RECXSM, + > RECTMP,RECSCA,ZONVOL) + ENDIF + BURNUP(IBURN)=BRNIRR(1) + WNKB(IBURN)=BRNIRR(2) + EFJ=BRNIRR(3) + CALL T16WDS(IPCPO ,NGCCPO,NVXSR ,NMXSR ,IBURN ,EFJ , + > NAMDXS,ITYXS ,FLXINT,FLXDIS,OVERV ,RECXSV, + > IDRXSM,RECXSM,RECSCA) + INEXTR=INEXTR+1 + ENDDO + CALL LCMPUT(IPCPO ,'BURNUP ',NBURN,2,BURNUP) + CALL LCMPUT(IPCPO ,'N/KB ',NBURN,2,WNKB) + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) + ENDIF +*---- +* PERTURBATIONS TO UPDATE +*---- + DO ILOCP=1,NPERTN + NBPERP=ABS(MIXRCI(2+ILOCP,IMIX)) + IF(MIXRCI(2+ILOCP,IMIX) .LT. 0) THEN + DO IPER=1,NBPERP + INEXTR=MIXPER(IPER,ILOCP,IMIX) + WRITE(NAMDIR,'(A4,A2,A4,I2)') + > NAMMIX(1,IMIX),NAMMIX(2,IMIX),NALOCP(ILOCP),IPER + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + DO IBURN=1,NBURN + CALL T16REC(IFT16 ,IPRINT,INEXTR) + CALL T16FLX(IFT16 ,IPRINT,NGCCPO,NG ,NGMTR ,NMATZ , + > MMXM ,MTRMSH,NZONE ,IFGMTR,VELMTR,IMIREG, + > VOLUME,B2CRI ,FLXINT,FLXDIS,OVERV ,KMSPEC, + > MATMSH,VQLE ,ZONNUM, ZONRAD,ZONVOL) + IF(IMIREG .GT. 0) THEN + CALL T16REC(IFT16 ,IPRINT,INEXTR) + CALL T16RRE(IFT16 ,IPRINT,NGCCPO,NGMTR ,IFGMTR,NVXSR , + > NMXSR ,IMIREG,VELMTR,B2CRI ,BRNIRR,FLXINT, + > OVERV,RECXSV,RECXSM,RECTMP,RECSCA) + ELSE + CALL T16REC(IFT16 ,IPRINT,INEXTR) + CALL T16RCA(IFT16 ,IPRINT,NGCCPO,NGMTR ,IFGMTR,NVXSR , + > NMXSR ,B2CRI ,BRNIRR,NZONE ,RECXSV,RECXSM, + > RECTMP,RECSCA,ZONVOL) + ENDIF + BURNUP(IBURN)=BRNIRR(1) + WNKB(IBURN)=BRNIRR(2) + EFJ=BRNIRR(3) + CALL T16WDS(IPCPO ,NGCCPO,NVXSR ,NMXSR ,IBURN ,EFJ , + > NAMDXS,ITYXS ,FLXINT,FLXDIS,OVERV ,RECXSV, + > IDRXSM,RECXSM,RECSCA) + INEXTR=INEXTR+1 + ENDDO + CALL LCMPUT(IPCPO ,'BURNUP ',NBURN,2,BURNUP) + CALL LCMPUT(IPCPO ,'N/KB ',NBURN,2,WNKB) + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) + ENDDO + ENDIF + ENDDO + ENDDO +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(ZONRAD,ZONVOL) + DEALLOCATE(RECSCA,RECTMP,RECXSM,RECXSV,OVERV,FLXDIS,FLXINT,VQLE) + DEALLOCATE(IDRXSM,MATMSH,KMSPEC) + DEALLOCATE(WNKB,BURNUP) + RETURN + END diff --git a/Donjon/src/T16ENE.f b/Donjon/src/T16ENE.f new file mode 100644 index 0000000..b505bf1 --- /dev/null +++ b/Donjon/src/T16ENE.f @@ -0,0 +1,322 @@ +*DECK T16ENE + SUBROUTINE T16ENE(IPRINT,MXGRP ,NG ,NGCOND,NGMTR ,NGREAC, + > NGCCPO,IFGCND,IFGMTR,IFGEDI,ENECPO,ENET16, + > VELMTR) +* +*---- +* +*Purpose: +* Generate and analyse energy structure. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPRINT print level. +* MXGRP maximum number of groups. +* NG number of groups in library. +* NGCOND number of condensed groups. +* NGMTR numbre of main transport groups. +* NGREAC numbre of edit groups. +* +*Parameters: input/output +* NGCCPO numbre of edit groups. +* IFGCND reference/exit condensation few groups. +* IFGMTR reference/exit main transport few groups. +* IFGEDI reference/exit edit few groups. +* ENECPO final energy group structure for CPO. +* +*Parameters: output +* ENET16 energy group structure for tape16. +* VELMTR velocity for main transport. +* +*---- +* + IMPLICIT NONE + INTEGER IPRINT,MXGRP,NG,NGCOND,NGMTR,NGREAC,NGCCPO + INTEGER IFGCND(MXGRP),IFGMTR(MXGRP), + > IFGEDI(MXGRP) + REAL ENECPO(MXGRP+1),ENET16(MXGRP+1), + > VELMTR(MXGRP) +*---- +* LOCAL VARIABLES +* FOR AVERAGED NEUTRON VELOCITY +* V=SQRT(2*ENER/M)=SQRT(2/M)*SQRT(ENER) +* SQFMAS=SQRT(2/M) IN CM/S/SQRT(EV) FOR V IN CM/S AND E IN EV +* =SQRT(2*1.602189E-19(J/EV)* 1.0E4(CM2/M2) /1.67495E-27 (KG)) +* =1383155.30602 CM/S/SQRT(EV) +*---- + INTEGER IOUT,MGELIB,MGWLIB + CHARACTER NAMSBR*6 + REAL SQFMAS,PRECIS + PARAMETER (IOUT=6,MGELIB=89,MGWLIB=69, + > NAMSBR='T16ENE',SQFMAS=1383155.30602, + > PRECIS=1.0E-5) + INTEGER IGR,IGC,IGD,IGF + REAL EAVG + INTEGER, ALLOCATABLE, DIMENSION(:) :: IFGCPO + REAL, ALLOCATABLE, DIMENSION(:) :: VELEDI,VELT16 +*---- +* DATA +*---- + REAL ENEELB(MGELIB+1),ENEWLB(MGWLIB+1) + SAVE ENEELB,ENEWLB + DATA ENEELB + >/1.0000E+7,7.7880E+6,6.0653E+6,4.7237E+6,3.6788E+6,2.8650E+6, + > 2.2313E+6,1.7377E+6,1.3534E+6,1.0540E+6,8.2085E+5,6.3928E+5, + > 4.9787E+5,3.8774E+5,3.0197E+5,2.3518E+5,1.8316E+5,1.4264E+5, + > 1.1109E+5,8.6517E+4,6.7379E+4,4.0868E+4,2.4788E+4,1.5034E+4, + > 9.1188E+3,5.5308E+3,3.3546E+3,2.0347E+3,1.2341E+3,7.4852E+2, + > 4.5400E+2,2.7536E+2,1.6702E+2,1.3007E+2,1.0130E+2,7.8893E+1, + > 6.1442E+1,4.7851E+1,3.7267E+1,2.9023E+1,2.2603E+1,1.7603E+1, + > 1.3710E+1,1.0677E+1,8.3153E+0,6.4760E+0,5.0435E+0,4.0000E+0, + > 3.3000E+0,2.6000E+0,2.1000E+0,1.5000E+0,1.3000E+0,1.1500E+0, + > 1.1230E+0,1.0970E+0,1.0710E+0,1.0450E+0,1.0200E+0,9.9600E-1, + > 9.7200E-1,9.5000E-1,9.1000E-1,8.5000E-1,7.8000E-1,6.2500E-1, + > 5.0000E-1,4.0000E-1,3.5000E-1,3.2000E-1,3.0000E-1,2.8000E-1, + > 2.5000E-1,2.2000E-1,1.8000E-1,1.4000E-1,1.0000E-1,8.0000E-2, + > 6.7000E-2,5.8000E-2,5.0000E-2,4.2000E-2,3.5000E-2,3.0000E-2, + > 2.5000E-2,2.0000E-2,1.5000E-2,1.0000E-2,5.0000E-3,2.0000E-4/ + DATA ENEWLB + >/1.0000E+7,6.0655E+6,3.6790E+6,2.2310E+6,1.3530E+6,8.2100E+5, + > 5.0000E+5,3.0250E+5,1.8300E+5,1.1100E+5,6.7340E+4,4.0850E+4, + > 2.4780E+4,1.5030E+4,9.1180E+3,5.5300E+3,3.5191E+3,2.2394E+3, + > 1.4251E+3,9.0690E+2,3.6726E+2,1.4873E+2,7.5501E+1,4.8052E+1, + > 2.7700E+1,1.5968E+1,9.8770E+0,4.0000E+0,3.3000E+0,2.6000E+0, + > 2.1000E+0,1.5000E+0,1.3000E+0,1.1500E+0,1.1230E+0,1.0970E+0, + > 1.0710E+0,1.0450E+0,1.0200E+0,9.9600E-1,9.7200E-1,9.5000E-1, + > 9.1000E-1,8.5000E-1,7.8000E-1,6.2500E-1,5.0000E-1,4.0000E-1, + > 3.5000E-1,3.2000E-1,3.0000E-1,2.8000E-1,2.5000E-1,2.2000E-1, + > 1.8000E-1,1.4000E-1,1.0000E-1,8.0000E-2,6.7000E-2,5.8000E-2, + > 5.0000E-2,4.2000E-2,3.5000E-2,3.0000E-2,2.5000E-2,2.0000E-2, + > 1.5000E-2,1.0000E-2,5.0000E-3,1.0000E-5/ +*---- +* STORE ORIGINAL GROUP STRUCTURE IN ENET16 +*---- + ALLOCATE(IFGCPO(MXGRP),VELEDI(MXGRP),VELT16(MXGRP)) + IF(NG .EQ. MGELIB) THEN + ENET16(1)=ENEELB(1) + DO IGR=2,MGELIB+1 + ENET16(IGR)=ENEELB(IGR) + EAVG=SQRT(ENET16(IGR)*ENET16(IGR-1)) + VELT16(IGR-1)=SQFMAS*SQRT(EAVG) + ENDDO + ELSE IF(NG .EQ. MGWLIB) THEN + ENET16(1)=ENEWLB(1) + DO IGR=2,MGWLIB+1 + ENET16(IGR)=ENEWLB(IGR) + EAVG=SQRT(ENET16(IGR)*ENET16(IGR-1)) + VELT16(IGR-1)=SQFMAS*SQRT(EAVG) + ENDDO + ELSE + CALL XABORT(NAMSBR// + > ': INVALID TAPE16 GROUP STRUCTURE') + ENDIF + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR + WRITE(IOUT,6010) NG,NGMTR,NGREAC,NGCOND,NGCCPO + WRITE(IOUT,6030) (ENET16(IGC),IGC=1,NG+1) + WRITE(IOUT,6040) (VELT16(IGC),IGC=1,NG) + ENDIF +*---- +* COMPUTE AVERAGED NEUTRON GROUP VELOCITY +* AVERAGED NEUTRON ENERGY ENER=SQRT(E(G+1)*E(G)) +* V=SQRT(2*ENER/M)=SQRT(2/M)*SQRT(ENER) +* =SQFMAS*SQRT(ENER) +*---- + IF(NGMTR .GT. 0) THEN + IGF=1 + DO IGR=1,NGMTR + IGD=IGF + IGF=IFGMTR(IGR)+1 + EAVG=SQRT(ENET16(IGD)*ENET16(IGF)) + VELMTR(IGR)=SQFMAS*SQRT(EAVG) + ENDDO + ENDIF + IF(IPRINT .GE. 10 .AND. NGMTR .GT. 0) THEN + WRITE(IOUT,6020) (IFGMTR(IGC),IGC=1,NGMTR) + WRITE(IOUT,6031) ENET16(1), + > (ENET16(IFGMTR(IGC)+1),IGC=1,NGMTR) + WRITE(IOUT,6041) (VELMTR(IGC),IGC=1,NGMTR) + ENDIF + IF(NGREAC .GT. 0) THEN + IGF=1 + DO IGR=1,NGREAC + IGD=IGF + IGF=IFGEDI(IGR)+1 + EAVG=SQRT(ENET16(IGD)*ENET16(IGF)) + VELEDI(IGR)=SQFMAS*SQRT(EAVG) + ENDDO +*---- +* TEST IF CONDENSATION STRUCTURE PROVIDED BY IFGEDI +* COMPATIBLE WITH IFGMTR +*---- + IF(NGMTR .GT. 0) THEN + DO IGC=1,NGREAC + DO IGR=IGC,NGMTR + IF(IFGEDI(IGC) .EQ. IFGMTR(IGR)) THEN + GO TO 105 + ENDIF + ENDDO + CALL XABORT(NAMSBR// + > ': IFGEDI AND IFGMTR NOT COMPATIBLE') + 105 CONTINUE + ENDDO + ENDIF + ENDIF + IF(IPRINT .GE. 10 .AND. NGREAC .GT. 0) THEN + WRITE(IOUT,6021) (IFGEDI(IGC),IGC=1,NGREAC) + WRITE(IOUT,6032) ENET16(1), + > (ENET16(IFGEDI(IGC)+1),IGC=1,NGREAC) + WRITE(IOUT,6042) (VELEDI(IGC),IGC=1,NGREAC) + ENDIF +*---- +* IF NGCCPO > 0 FIND IFGCPO FROM ENECPO +*---- + IF(NGCCPO .GT. 0) THEN + IF(ABS(ENECPO(1)-ENET16(1)) .GT. PRECIS ) CALL XABORT(NAMSBR// + > ': ENECPO(1) SHOULD BE IDENTICAL TO ENET16(1)') + DO IGC=2,NGCCPO+1 + DO IGR=IGC,NG+1 + IF(ABS(ENECPO(IGC)-ENET16(IGR)) .LT. PRECIS ) THEN + IFGCPO(IGC-1)=IGR-1 + GO TO 115 + ENDIF + ENDDO + 115 CONTINUE + ENDDO + IF(NGCOND .GT. 0) THEN +*---- +* IF NGCOND > 0 +* IFGCPO AND IFGCND NUST BE IDENTICAL +*---- + IF(NGCCPO .NE. NGCOND) CALL XABORT(NAMSBR// + > ': NGCCPO AND NGCOND MUST BE IDENTICAL') + DO IGC=1,NGCCPO + IF(IFGCPO(IGC) .NE. IFGCND(IGC)) + > CALL XABORT(NAMSBR// + > ': IFGCPO AND IFGCND MUST BE IDENTICAL') + ENDDO + ENDIF + ELSE +*---- +* IF NGCCPO =0 +*---- + IF(NGCOND .GT. 0) THEN +*---- +* IF NGCOND > 0 +* IFGCPO = IFGCND +*---- + NGCCPO=NGCOND + ENECPO(1)=ENET16(1) + DO IGC=1,NGCCPO + IFGCPO(IGC)=IFGCND(IGC) + ENECPO(IGC+1)=ENET16(IFGCPO(IGC)+1) + ENDDO + ELSE IF(NGREAC .GT. 0) THEN +*---- +* IF NGCOND = 0 +* AND NGREAC > 0 +* IFGCPO = IFGEDI +*---- + NGCCPO=NGREAC + ENECPO(1)=ENET16(1) + DO IGC=1,NGCCPO + IFGCPO(IGC)=IFGEDI(IGC) + ENECPO(IGC+1)=ENET16(IFGCPO(IGC)+1) + ENDDO + ELSE +*---- +* IF NGCOND = 0 +* AND NGREAC = 0 +* IFGCPO = IFGMTR +*---- + NGCCPO=NGMTR + ENECPO(1)=ENET16(1) + DO IGC=1,NGCCPO + IFGCPO(IGC)=IFGMTR(IGC) + ENECPO(IGC+1)=ENET16(IFGCPO(IGC)+1) + ENDDO + ENDIF + ENDIF + IF(NGREAC .GT. 0) THEN +*---- +* IF NGREAC > 0 +* TEST IF CONDENSATION STRUCTURE PROVIDED BY IFGEDI +* COMPATIBLE WITH IFGCPO AND IFGMTR +* ENDIF +*---- + + DO IGC=1,NGCCPO + DO IGR=IGC,NGREAC + IF(IFGCPO(IGC) .EQ. IFGEDI(IGR)) THEN + IFGEDI(IGC)=IGR + GO TO 135 + ENDIF + ENDDO + CALL XABORT(NAMSBR// + > ': IFGCPO AND IFGEDI NOT COMPATIBLE') + 135 CONTINUE + ENDDO + ENDIF +*---- +* NGMTR > 0 +* TEST IF CONDENSATION STRUCTURE PROVIDED BY IFGMTR +* COMPATIBLE WITH IFGCPO +* ENDIF +*---- + DO IGC=1,NGCCPO + DO IGR=IGC,NGMTR + IF(IFGCPO(IGC) .EQ. IFGMTR(IGR)) THEN + IFGMTR(IGC)=IGR + GO TO 155 + ENDIF + ENDDO + CALL XABORT(NAMSBR// + > ': IFGCPO AND IFGMTR NOT COMPATIBLE') + 155 CONTINUE + ENDDO + IF(IPRINT .GE.10) THEN + IF(NGCOND .GT. 0) + > WRITE(IOUT,6022) (IFGCND(IGC),IGC=1,NGCOND) + IF(NGCCPO .GT. 0) THEN + WRITE(IOUT,6023) (IFGCPO(IGC),IGC=1,NGCCPO) + WRITE(IOUT,6033) (ENECPO(IGC),IGC=1,NGCCPO+1) + ENDIF + WRITE(IOUT,6001) + ENDIF + DEALLOCATE(VELT16,VELEDI,IFGCPO) + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),' OUTPUT FROM ',A6,1X,5('*')) + 6001 FORMAT(1X,30('*')) + 6010 FORMAT(6X,'NUMBER OF LIBRARY GROUPS = ',I10/ + > 6X,'NUMBER OF MAIN TRANSPORT GROUPS = ',I10/ + > 6X,'NUMBER OF EDITING GROUPS = ',I10/ + > 6X,'NUMBER OF CONDENSATION GROUPS = ',I10/ + > 6X,'NUMBER OF CPO GROUPS = ',I10) + 6020 FORMAT(6X,'MAIN TRANSPORT FEW GROUPS IDENTIFIER '/ + >10(2X,I6)) + 6021 FORMAT(6X,'EDIT FEW GROUPS IDENTIFIER '/ + >10(2X,I6)) + 6022 FORMAT(6X,'CONDENSATION FEW GROUPS IDENTIFIER '/ + >10(2X,I6)) + 6023 FORMAT(6X,'CPO FEW GROUPS IDENTIFIER '/ + >10(2X,I6)) + 6030 FORMAT(6X,'INITIAL ENERGY STRUCTURE (EV)'/ + >1P,10(2X,E10.3)) + 6031 FORMAT(6X,'ENERGY STRUCTURE IN MAIN GROUPS (EV)'/ + >1P,10(2X,E10.3)) + 6032 FORMAT(6X,'ENERGY STRUCTURE IN EDIT GROUPS (EV)'/ + >1P,10(2X,E10.3)) + 6033 FORMAT(6X,'FINAL ENERGY STRUCTURE (EV)'/ + >1P,10(2X,E10.3)) + 6040 FORMAT(6X,'AVERAGE VELOCITY IN INITIAL GROUPS (CM/S)'/ + >1P,10(2X,E10.3)) + 6041 FORMAT(6X,'AVERAGE VELOCITY IN MAIN GROUPS (CM/S)'/ + >1P,10(2X,E10.3)) + 6042 FORMAT(6X,'AVERAGE VELOCITY IN EDIT GROUPS (CM/S)'/ + >1P,10(2X,E10.3)) + END diff --git a/Donjon/src/T16FLX.f b/Donjon/src/T16FLX.f new file mode 100644 index 0000000..233db49 --- /dev/null +++ b/Donjon/src/T16FLX.f @@ -0,0 +1,331 @@ +*DECK T16FLX + SUBROUTINE T16FLX(IFT16 ,IPRINT,NGCCPO,NG ,NGMTR ,NMATZ , + > MMXM ,MTRMSH,NZONE ,IFGMTR,VELMTR,IMIREG, + > VOLUME,B2CRI ,FLXINT,FLXDIS,OVERV ,KMSPEC, + > MATMSH,VQLE ,ZONNUM, ZONRAD,ZONVOL) +* +*---- +* +*Purpose: +* Read main transport flux and compute integrated flux, +* flux disadvantage factor and 1/V cross sections. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* IPRINT print level where: +* =0 for no print; >= 1 print processing option. +* NGCCPO number of edit groups. +* NG number of groups on X-S library. +* NGMTR number of main transport groups. +* NMATZ number of mixtures. +* MMXM maximum number of zones and main transport meshes. +* MTRMSH number of main transport mesh points. +* NZONE number of zones. +* IFGMTR fewgroups for main transport. +* VELMTR velocity for main transport. +* IMIREG mixture update identifier where +* =0 do not update; +* =-1 update using CELLAV information; +* > 0 update using specified region number. +* +*Parameters: output +* VOLUME total volume. +* B2CRI critical bucklings. +* FLXINT volume integrated fluxes. +* FLXDIS flux disadvantage factor. +* OVERV 1/V cross sections. +* KMSPEC material types. +* MATMSH material in each mesh. +* VQLE volume of each mesh. +* ZONNUM zone number. +* ZONRAD zone radius. +* ZONVOL zone volume. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16,IPRINT,NGCCPO,NG, + > NGMTR,NMATZ,MMXM,MTRMSH,NZONE,IMIREG + INTEGER IFGMTR(NGCCPO), + > KMSPEC(NMATZ),MATMSH(MMXM) + REAL VELMTR(NGMTR),VOLUME,B2CRI(3), + > FLXINT(NGCCPO),FLXDIS(NGCCPO), + > OVERV(NGCCPO),VQLE(MMXM) + INTEGER ZONNUM + REAL ZONVOL(NZONE), ZONRAD(NZONE) +*---- +* MEMORY ALLOCATION +*---- + REAL, ALLOCATABLE, DIMENSION(:,:) :: PHI +*---- +* T16 PARAMETERS +*---- + INTEGER MAXKEY + PARAMETER (MAXKEY=3) + CHARACTER TKEY1(MAXKEY)*10,TKEY2(MAXKEY)*10, + > RKEY1*10,RKEY2*10 + INTEGER NKEY,IOPT,NBE,NID,IR + REAL RID +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='T16FLX') + INTEGER IGR,IGC,IGD,IGF,IMIX,ITRFL,IBUCK + REAL B2INI(3) + INTEGER IZ + REAL CELLV +*---- +* SET END RECORDS FOR THIS SEARCH +*---- + ALLOCATE(PHI(NG,MMXM)) + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + IOPT=0 + FLXINT(:NGCCPO)=0.0 + FLXDIS(:NGCCPO)=0.0 + OVERV(:NGCCPO)=0.0 +*---- +* CELL VOLUME PER UNIT LENGTH +*---- + REWIND(IFT16) + TKEY1(1)='REGION ' + TKEY2(1)='DESCRIPTON' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .GT. 0) THEN + READ(IFT16) RKEY1,RKEY2,NBE,ZONNUM, + > (ZONRAD(IZ),IZ=1,NZONE),(ZONVOL(IZ), IZ=1, NZONE) + ELSE + CALL XABORT(NAMSBR//': KEYS '//TKEY1(1)//','// + > TKEY2(1)//' NOT FOUND ON TAPE16') + ENDIF + CELLV=0.0 + DO IZ=1, ZONNUM + CELLV=CELLV+ZONVOL(IZ) + END DO +*---- +* MTRFLX RECORDS +*---- + REWIND(IFT16) + NKEY=2 + TKEY1(2)='REGION ' + TKEY2(2)='DESCRIPTON' + TKEY1(1)='MTRFLX ' + TKEY2(1)='FLUX ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + ITRFL=0 + IF(NBE .GT. 0 ) THEN + ITRFL=1 + ELSE IF( NBE .LT. -1 ) THEN + READ(IFT16) RKEY1,RKEY2,NBE + IF(IMIREG .GT. 0) THEN +*---- +* Update mixture if IMIREG>0 +*---- + TKEY1(2)='CELLAV ' + TKEY2(2)='NGROUPS ' + TKEY1(1)='REGION ' + TKEY2(1)='FLUX ' + DO IR=1,IMIREG-1 + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .LE. 0 ) CALL XABORT(NAMSBR// + > ': REGION FLUX NOT AVAILABLE') + READ(IFT16) RKEY1,RKEY2 + ENDDO + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .GT. 0 ) ITRFL=2 + ELSE IF(IMIREG .LT. 0) THEN +*---- +* Update mixture using CELLAV information if IMIREG<0 +*---- + TKEY1(2)='CELLAV ' + TKEY2(2)='K ' + TKEY1(1)='CELLAV ' + TKEY2(1)='FLUX ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .GT. 0 ) ITRFL=3 + ENDIF + ENDIF + IF( ITRFL .EQ. 0 ) THEN + CALL XABORT(NAMSBR// + > ': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)//' OR '// + > TKEY1(2)//' '//TKEY2(2)) + ELSE IF(ITRFL .EQ. 1) THEN +*---- +* USE MTRFLX +* 1) CONDENSE AND HOMOGENIZE FLUX +* 2) COMPUTE FLUX DISADVANTAGE FACTOR +* 3) COMPUTE VOLUME +* 4) COMPUTE OVERV +*---- + READ(IFT16) RKEY1,RKEY2,NBE,NID,NID, + > (MATMSH(IR),VQLE(IR), + > (PHI(IGR,IR),IGR=1,NGMTR),IR=1,MTRMSH) + VOLUME=0.0 + DO IR=1,MTRMSH + IGF=0 + VOLUME=VOLUME+VQLE(IR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) IR,VQLE(IR) + WRITE(IOUT,6110)(PHI(IGR,IR),IGR=1,NGMTR) + ENDIF + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + FLXINT(IGC)=FLXINT(IGC)+PHI(IGR,IR)*VQLE(IR) + OVERV(IGC)=OVERV(IGC) + > +PHI(IGR,IR)*VQLE(IR)/VELMTR(IGR) + ENDDO + ENDDO + IMIX=MATMSH(IR) + IF(KMSPEC(IMIX) .EQ. 1) THEN + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + FLXDIS(IGC)=FLXDIS(IGC)+PHI(IGR,IR)*VQLE(IR) + ENDDO + ENDDO + ENDIF + ENDDO + ELSE IF(ITRFL .EQ. 2) THEN +*---- +* USE REGION FLUX +* 1) CONDENSE AND HOMOGENIZE FLUX +* 2) COMPUTE FLUX DISADVANTAGE FACTOR +* 4) COMPUTE OVERV +*---- + READ(IFT16) RKEY1,RKEY2,NBE,NID,NID,VOLUME, + > (PHI(IGR,1),IGR=1,NGMTR) + IR=IMIREG + IGF=0 + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) IR,VOLUME + WRITE(IOUT,6110)(PHI(IGR,IR),IGR=1,NGMTR) + ENDIF + DO 120 IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO 121 IGR=IGD,IGF + FLXINT(IGC)=FLXINT(IGC)+PHI(IGR,IR)*VOLUME + OVERV(IGC)=OVERV(IGC) + > +(PHI(IGR,IR)*VOLUME)/VELMTR(IGR) + 121 CONTINUE + FLXDIS(IGC)=FLXINT(IGC) + 120 CONTINUE + ELSE +*---- +* USE CELLAV FLUX +* 1) CONDENSE AND HOMOGENIZE FLUX +* 2) COMPUTE FLUX DISADVANTAGE FACTOR +* 3) COMPUTE VOLUME +* 4) COMPUTE OVERV +*---- + IR=1 + VOLUME=1.0 + READ(IFT16) RKEY1,RKEY2,NBE, + > (PHI(IGR,IR),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6101) + WRITE(IOUT,6110)(PHI(IGR,IR),IGR=1,NGMTR) + ENDIF + DO IGR=1, NGMTR + PHI(IGR,IR)=PHI(IGR,IR)/CELLV + ENDDO + IGF=0 + DO 130 IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO 131 IGR=IGD,IGF + FLXINT(IGC)=FLXINT(IGC)+PHI(IGR,IR) + OVERV(IGC)=OVERV(IGC)+PHI(IGR,IR)/VELMTR(IGR) + 131 CONTINUE + FLXDIS(IGC)=FLXINT(IGC) + 130 CONTINUE + ENDIF + DO 140 IGC=1,NGCCPO + FLXDIS(IGC)=FLXDIS(IGC)/FLXINT(IGC) + OVERV(IGC)=OVERV(IGC)/FLXINT(IGC) + 140 CONTINUE +*---- +* RADIAL AND AXIAL DIFFUSION COEFFICIENTS +* AND BUCKLING +*---- + TKEY1(2)='CELLAV ' + TKEY2(2)='K ' + TKEY1(1)='CELLAV ' + TKEY2(1)='DIFFUSION ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. 5*NGMTR+5 ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(NID,IR=1,3), + > (RID,IGR=1,NGMTR), + > (RID,IGR=1,NGMTR), + > (RID,IGR=1,NGMTR), + > (B2INI(IR),IR=1,2) + TKEY1(1)='CELLAV ' + TKEY2(1)='CRITICALB ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .EQ. 2*NGMTR+4 ) THEN + READ(IFT16) RKEY1,RKEY2,NBE,IBUCK, + > (B2CRI(IR),IR=1,3) + IF(IBUCK .EQ. 2) THEN + B2CRI(3)=B2INI(1)+B2CRI(2) + B2CRI(1)=B2INI(1)/B2CRI(3) + B2CRI(2)=B2CRI(2)/B2CRI(3) + ELSE IF(IBUCK .EQ. 3) THEN + B2CRI(3)=B2CRI(1)+B2INI(2) + B2CRI(1)=B2CRI(1)/B2CRI(3) + B2CRI(2)=B2INI(2)/B2CRI(3) + ELSE + B2CRI(1)=B2CRI(1)/B2CRI(3) + B2CRI(2)=B2CRI(2)/B2CRI(3) + ENDIF + ELSE IF(NBE .EQ. -2) THEN + B2CRI(3)=B2INI(1)+B2INI(2) + B2CRI(1)=B2INI(1)/B2CRI(3) + B2CRI(2)=B2INI(2)/B2CRI(3) + ELSE + CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(2)//' '//TKEY2(2)) + ENDIF + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6010) (FLXINT(IGC),IGC=1,NGCCPO) + WRITE(IOUT,6011) (FLXDIS(IGC),IGC=1,NGCCPO) + WRITE(IOUT,6012) (OVERV(IGC),IGC=1,NGCCPO) + WRITE(IOUT,6013) (B2CRI(IR),IR=1,3) + WRITE(IOUT,6001) + ENDIF + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),' OUTPUT FROM ',A6,1X,5('*')) + 6001 FORMAT(1X,30('*')) + 6010 FORMAT(6X,'INTEGRATED FLUXES'/ + >1P,10(2X,E10.3)) + 6011 FORMAT(6X,'FLUX DISADVANTAGE FACTORS'/ + >1P,10(2X,E10.3)) + 6012 FORMAT(6X,'1/V '/ + >1P,10(2X,E10.3)) + 6013 FORMAT(6X,'CRITICAL BUCKLINGS'/ + >1P,3(2X,E10.3)) + 6100 FORMAT(6X,'MAIN TRANSPORT GROUP FLUX IN REGION = ',I10, + > 5X,'OF VOLUME = ',1P,E10.3) + 6101 FORMAT(6X,'CELLAV MAIN TRANSPORT GROUP FLUX ') + 6110 FORMAT(1P,10(2X,E10.3)) + END diff --git a/Donjon/src/T16FND.f b/Donjon/src/T16FND.f new file mode 100644 index 0000000..f278cae --- /dev/null +++ b/Donjon/src/T16FND.f @@ -0,0 +1,140 @@ +*DECK T16FND + SUBROUTINE T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBELEM) +* +*---- +* +*Purpose: +* Find next record on tape16 identified by keys TKEY1 and TKEY2. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* IPRINT print level where: +* <100 for no print; +* >=100 print record to read; +* >=10000 print all record read. +* IOPT processing option with: +* =-1 start at current position and read to end of file with +* no backspace before return; +* =0 start at current position and read to end of file with +* backspace before return; +* =1 rewind before reading and read to end of file; +* =2 start at current position, rewind, start at beginning of +* file until end of file. +* NKEY number of keys set to test: +* =1 search for TKEY1(1),TKEY2(1) until end of file; +* >1 search for TKEY1(1),TKEY2(1) until +* (TKEY1(IK),TKEY2(IK),IK=2,NKEY) or end of file. +* TKEY1 primary key. +* TKEY2 secondary key. +* +*Parameters: output +* NBELEM number of element found on record with: +* <-1 record not found before alternative keys -NBELEM ; +* =-1 record not found before end of files; +* >=0 record found with NBELEM elements. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16,IPRINT,IOPT,NKEY,NBELEM + CHARACTER TKEY1(NKEY)*10,TKEY2(NKEY)*10 +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='T16FND') + CHARACTER RKEY1*10,RKEY2*10 + INTEGER NBE,IEND,IKEY +*---- +* Print keys if required +*---- + IF(IPRINT .GE. 100) THEN + IF(IPRINT .LT. 10000) THEN + WRITE(6,6000) TKEY1(1),TKEY2(1) + ENDIF + ENDIF +*---- +* REWIND FILE FIRST IF IOPT=1 +*---- + IEND=1 + IF(IOPT .EQ. 1) THEN + REWIND(IFT16) + ELSE IF (IOPT .EQ. 2) THEN + IEND=0 + ENDIF +*---- +* LOOP FOR READ +*---- + 100 CONTINUE + READ(IFT16,END=105) RKEY1,RKEY2,NBE + IF(IPRINT .GE. 10000) THEN + WRITE(6,6003) RKEY1,RKEY2,NBE + ENDIF + IF(RKEY1 .EQ. TKEY1(1) .AND. + > RKEY2 .EQ. TKEY2(1) ) THEN +*---- +* KEYS FOUND BACKSPACE AND RETURN +*---- + NBELEM=NBE + IF(IOPT .GE. 0) BACKSPACE(IFT16) + IF(IPRINT .GE. 100) THEN + WRITE(6,6001) RKEY1,RKEY2,NBELEM + ENDIF + RETURN + ELSE IF(NKEY .GE. 2) THEN + DO IKEY=2,NKEY + IF(RKEY1 .EQ. TKEY1(IKEY) .AND. + > RKEY2 .EQ. TKEY2(IKEY) ) THEN + NBELEM=-IKEY + IF(IOPT .GE. 0) BACKSPACE(IFT16) + IF(IPRINT .GE. 100) THEN + WRITE(6,6004) RKEY1,RKEY2,NBE, + > TKEY1(1),TKEY2(1) + ENDIF + RETURN + ENDIF + ENDDO + ENDIF +*---- +* KEYS NOT FOUND READ NEXT RECORD +*---- + GO TO 100 +*---- +* END OF FILE REACHED +*---- + 105 CONTINUE + IF(IEND .EQ. 0) THEN +*---- +* REWIND FILE AND CONTINUE READ +*---- + IEND=1 + REWIND(IFT16) + GO TO 100 + ENDIF +*---- +* RECORD ABSENT, RETURN +*---- + NBELEM=-1 + IF(IPRINT .GE. 100) THEN + IF(IPRINT .LT. 10000) THEN + WRITE(6,6002) TKEY1(1),TKEY2(1) + ENDIF + ENDIF + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT( 1X, 'FIND T16 RECORD = ',2(A10,2X)) + 6001 FORMAT( 1X, ' T16 RECORD = ',2(A10,2X),I10, + > 1X,'FOUND') + 6002 FORMAT( 1X, ' T16 RECORD = ',2(A10,2X),10X, + > 1X,'NOT FOUND') + 6003 FORMAT(11X,'T16 RECORD READ = ',2(A10,2X),I10) + 6004 FORMAT( 1X,'T16 STOP RECORD = ',2(A10,2X),I10, + > 1X,'FOUND BEFORE RECORD = ',2(A10,2X)) + END diff --git a/Donjon/src/T16GET.f b/Donjon/src/T16GET.f new file mode 100644 index 0000000..387b93f --- /dev/null +++ b/Donjon/src/T16GET.f @@ -0,0 +1,235 @@ +*DECK T16GET + SUBROUTINE T16GET(MAXMIX,MNLOCP,MNCPLP,MNPERT,NALOCP,IDLCPL, + > NCMIXS,MNBURN,NAMMIX,MIXRCI,PARRCI,MIXPER, + > PARPER,MIXREG) +* +*---- +* +*Purpose: +* Read from input T16CPO processing options. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* MAXMIX maximum number of mixtures. +* MNLOCP maximum number of local parameters. +* MNCPLP maximum number of coupled parameters. +* MNPERT maximum number of perturbations per local parameter. +* NALOCP local parameter names allowed. +* IDLCPL local ID for perturbation parameters. +* +*Parameters: input/output +* NCMIXS number of current mixtures. +* MNBURN current and final number of burnup steps +* NAMMIX names of mixtures. +* MIXRCI reference information for mixtures where: +* =0 no information for mixture; +* >0 information not updated; +* <0 information to be updated. +* PARRCI reference local parameters for mixtures. +* MIXPER perturbation information for mixtures. +* =0 no information for mixture; +* >0 information not updated; +* <0 information to be updated. +* PARPER perturbation parameters for mixtures. +* +*Parameters: output +* MIXREG mixture update identifier where: +* =0 do not update; +* =-1 update using CELLAV information; +* > 0 update using specified region number. +* +*Comments: +* Input data is of the form: +* [[ MIXNAM [ { CELLAV | REGION noreg } ] +* [ RC [ nburn ] frstrec ] +* [[ NAMPER valref npert +* (valper(i),frstrec(i),i=1,npert)]] +* ]] +* [ MTMD [ valreft valrefd ] npert +* (valpert(i), valperd(i), frstrec(i),i=1,npert)]] +* ] +* +*---- +* + IMPLICIT NONE + INTEGER MAXMIX,MNLOCP,MNCPLP,MNPERT,NCMIXS,MNBURN + CHARACTER NALOCP(MNLOCP+MNCPLP)*4 + INTEGER IDLCPL(2,MNLOCP+MNCPLP),NAMMIX(2,MAXMIX), + > MIXRCI(2+MNLOCP+MNCPLP,MAXMIX), + > MIXPER(MNPERT,MNLOCP+MNCPLP,MAXMIX), + > MIXREG(MAXMIX) + REAL PARRCI(MNLOCP,MAXMIX), + > PARPER(MNPERT,2,MNLOCP+MNCPLP,MAXMIX) +*---- +* READ VARIABLES +*---- + CHARACTER TEXT12*12 + INTEGER ITYPE,NITMA + REAL FLOTT + DOUBLE PRECISION DFLOTT +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT,NTC + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NTC=3,NAMSBR='T16GET') + INTEGER KCHAR(NTC),INEXTM,ILOCP,ILOCL,NLPAR, + > ILPAR,NBRCI,IPAR,IMIX,IRLOC +*---- +* READ INPUT DATA. +*---- + INEXTM=0 + 100 CONTINUE + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + 101 CONTINUE + IF(ITYPE .NE. 3) CALL XABORT(NAMSBR// + > ': KEYWORD EXPECTED') + IF(TEXT12 .EQ. ';') THEN +*---- +* END OF INPUT REACHED +* EXIT READ +*---- + GO TO 105 + ELSE IF(TEXT12 .EQ. 'CELLAV') THEN +*---- +* CELLAV KEYWORD FOUND +*---- + IF(INEXTM .EQ. 0) CALL XABORT(NAMSBR// + > ': MIXTURE NAME MUST BE DEFINED BEFORE CELLAV') + MIXREG(INEXTM)=-1 + ELSE IF(TEXT12 .EQ. 'REGION') THEN +*---- +* REGION KEYWORD FOUND +*---- + IF(INEXTM .EQ. 0) CALL XABORT(NAMSBR// + > ': MIXTURE NAME MUST BE DEFINED BEFORE REGION') + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE .NE. 1) CALL XABORT(NAMSBR// + > ': REGION NUMBER MUST FOLLOW REGION KEYWORD') + IF(NITMA .LT. 1) CALL XABORT(NAMSBR// + > ': REGION NUMBER MUST BE > 0') + MIXREG(INEXTM)=NITMA + ELSE IF(TEXT12 .EQ. 'RC') THEN +*---- +* REFERENCE CASE INFORMATION +*---- + IF(INEXTM .EQ. 0) CALL XABORT(NAMSBR// + > ': MIXTURE NAME MUST BE DEFINED RC') + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE .NE. 1) CALL XABORT(NAMSBR// + > ': DATA TYPE FOLLOWING RC MUST BE INTEGER') + IF(NITMA .LT. 1) CALL XABORT(NAMSBR// + > ': FIRST INTEGER VALUE FOLLOWING RC MUST BE > 0') + MIXRCI(1,INEXTM)=NITMA + IF(MIXRCI(2,INEXTM) .EQ. 0) THEN + MIXRCI(2,INEXTM)=-1 + ENDIF + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE .NE. 1) GO TO 101 + IF(NITMA .LT. 1) CALL XABORT(NAMSBR// + > ': SECOND INTEGER VALUE FOLLOWING RC MUST BE > 0') + MNBURN=MAX(MNBURN,MIXRCI(1,INEXTM)) + MIXRCI(2,INEXTM)=-MIXRCI(1,INEXTM) + MIXRCI(1,INEXTM)=NITMA + ELSE +*---- +* EITHER PERTURBATION OR NEW MIXTURE +* 1) IF PERTURBATION +* TREAT INPUT AND RETURN TO READ NEXT KEYWORD +* OTHERWISE TEXT12 IS NEW MIXTURE NAME +*---- + IRLOC=2 + DO ILOCP=1,MNLOCP+MNCPLP + NLPAR=1 + IF(ILOCP .GT. MNLOCP) NLPAR=2 + IF(TEXT12 .EQ. NALOCP(ILOCP)) THEN + IF(INEXTM .EQ. 0) CALL XABORT(NAMSBR// + > ': MIXTURE NAME REQUIRED FOR PERTURBATIONS') +*---- +* SAVE REFERENCE PARAMETER AND TEST FOR COHERENCE +*---- + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE .EQ. 2) THEN + DO ILPAR=1,NLPAR + IF(ITYPE .NE. 2) CALL XABORT(NAMSBR// + > ': REFERENCES EXPECTED FOR PERTURBATIONS') + ILOCL=IDLCPL(ILPAR,ILOCP) + IF(MIXRCI(IRLOC+ILOCL,INEXTM) .EQ. 0) THEN + PARRCI(ILOCL,INEXTM)=FLOTT + ELSE IF(PARRCI(ILOCL,INEXTM) .NE. FLOTT) THEN + CALL XABORT(NAMSBR// + > ': REFERENCE PARAMETER NOT COHERENT FOR '// + > NALOCP(ILOCP)// + > ' PERTURBATION INITIALIZATION') + ENDIF + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + ENDDO + ELSE IF( MIXRCI(IRLOC+ILOCP,INEXTM) .EQ. 0) THEN + CALL XABORT(NAMSBR// + > ': REFERENCE CASE NOT INITIALIZED FOR '// + > NALOCP(ILOCP)//' PERTURBATION') + ENDIF +*---- +* READ NUMBER OF PERTURBATIONS +*---- + IF(ITYPE .NE. 1) CALL XABORT(NAMSBR// + > ': INVALID RECORD FOLLOWING PERTURBATION') + IF(NITMA .LT. 0) CALL XABORT(NAMSBR// + > ': NUMBER OF PERTURBATION MUST BE >= 0') + NBRCI=NITMA + MIXRCI(IRLOC+ILOCP,INEXTM)=-NITMA +*---- +* READ PERTURBATIONS PARAMETERS +*---- + DO IPAR=1,NBRCI + DO ILPAR=1,NLPAR + ILOCL=IDLCPL(ILPAR,ILOCP) + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE .NE. 2) CALL XABORT(NAMSBR// + > ': INVALID RECORD FOR REFERENCE PARAMETER') + PARPER(IPAR,ILPAR,ILOCP,INEXTM)=FLOTT + ENDDO + CALL REDGET(ITYPE,NITMA,FLOTT,TEXT12,DFLOTT) + IF(ITYPE .NE. 1) CALL XABORT(NAMSBR// + > ': INVALID RECORD FOLLOWING PERTURBATION') + IF(NITMA .LT. 0) CALL XABORT(NAMSBR// + > ': NUMBER OF PERTURBATION MUST BE >= 0') + MIXPER(IPAR,ILOCP,INEXTM)=NITMA + ENDDO + GO TO 100 + ENDIF + ENDDO +*---- +* 3) TEXT12 IS A NEW MIXTURE NAME +* TREAT INPUT AND RETURN TO READ NEXT KEYWORD +*---- + READ(TEXT12,'(A4,A2)') KCHAR(1),KCHAR(2) + DO IMIX=1,NCMIXS + IF(KCHAR(1) .EQ. NAMMIX(1,IMIX) .AND. + > KCHAR(2) .EQ. NAMMIX(2,IMIX) ) THEN + INEXTM=IMIX + GO TO 145 + ENDIF + ENDDO + NCMIXS=NCMIXS+1 + NAMMIX(1,NCMIXS)=KCHAR(1) + NAMMIX(2,NCMIXS)=KCHAR(2) + IF(NCMIXS .GT. MAXMIX) CALL XABORT(NAMSBR// + > ': TOO MANY MIXTURES READ') + INEXTM=NCMIXS + 145 CONTINUE +*---- +* ASSUME CELLAV BY DEFAULT +*---- + MIXREG(INEXTM)=-1 + ENDIF + GO TO 100 + 105 CONTINUE +*---- +* ALL THE REQUIRED INFORMATION READ +* RETURN +*---- + RETURN + END diff --git a/Donjon/src/T16LST.f b/Donjon/src/T16LST.f new file mode 100644 index 0000000..4ea70fd --- /dev/null +++ b/Donjon/src/T16LST.f @@ -0,0 +1,50 @@ +*DECK T16LST + SUBROUTINE T16LST(IFT16 ) +* +*---- +* +*Purpose: +* Print records stored on tape16. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16 +*---- +* T16 KEYS +*---- + CHARACTER TKEY1*10,TKEY2*10 + INTEGER NKEY,IOPT,NBE +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='T16LST') + INTEGER IPRINT +*---- +* LIST TAPE16 RECORDS AFTER REWINDING +*---- + WRITE(IOUT,6000) NAMSBR + IPRINT=10000 + IOPT=1 + NKEY=1 + TKEY1=' ' + TKEY2=TKEY1 + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE) + WRITE(IOUT,6001) + RETURN + +*---- +* PRINT FORMAT +*---- + 6000 FORMAT( 1X, 'PRINTING CONTENTS OF TAPE16 FILE USING ',A6) + 6001 FORMAT( 1X, 'END OF TAPE16 FILE REACHED') + END diff --git a/Donjon/src/T16MPI.f b/Donjon/src/T16MPI.f new file mode 100644 index 0000000..3c979ae --- /dev/null +++ b/Donjon/src/T16MPI.f @@ -0,0 +1,218 @@ +*DECK T16MPI + SUBROUTINE T16MPI(IPCPO ,IPRINT,MAXMIX,MNLOCP,MNCPLP,MNPERT, + > NALOCP,IDLCPL,NCMIXS,NGCCPO,ENECPO,NAMMIX, + > MIXRCI,PARRCI,PARPER) +* +*---- +* +*Purpose: +* Initialize mixture processing option. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPCPO pointer to CPO data structure. +* IPRINT print level. +* MAXMIX maximum number of mixtures. +* MNLOCP maximum number of local parameters. +* MNCPLP maximum number of coupled parameters. +* MNPERT maximum number of perturbations per local parameter. +* NALOCP local parameter names allowed. +* IDLCPL local ID for perturbation parameters. +* NCMIXS number of current mixtures. +* NGCCPO number of edit groups. +* ENECPO final energy group structure for CPO. +* NAMMIX names of mixtures. +* +*Parameters: output +* MIXRCI reference information for mixtures where: +* =0 no information for mixture; +* >0 information not updated; +* <0 information to be updated. +* PARRCI reference local parameters for mixtures. +* PARPER perturbation parameters for mixtures. +* +*---- +* + USE GANLIB + IMPLICIT NONE + TYPE(C_PTR) IPCPO + INTEGER IPRINT,MAXMIX,MNLOCP,MNCPLP,MNPERT, + > NCMIXS,NGCCPO + CHARACTER NALOCP(MNLOCP+MNCPLP)*4 + INTEGER IDLCPL(2,MNLOCP+MNCPLP),NAMMIX(2,MAXMIX), + > MIXRCI(2+MNLOCP+MNCPLP,MAXMIX) + REAL ENECPO(NGCCPO+1),PARRCI(MNLOCP,MAXMIX), + > PARPER(MNPERT,2,MNLOCP+MNCPLP,MAXMIX) +*---- +* MEMORY ALLOCATION +*---- + INTEGER ,ALLOCATABLE, DIMENSION(:) :: IDSUF,NBPER + REAL,ALLOCATABLE, DIMENSION(:) :: ENEMIX,LOCALP +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT,NPARAM,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NPARAM=4,ILCMUP=1,ILCMDN=2, + > NTC=3,NAMSBR='T16MPI') + CHARACTER NAMDIR*12 + INTEGER IPARAM(NPARAM), + > ILOCP,IMIX,IPER,NBPERP,IGR, + > NLPAR,ILPAR,ILOCL,NPERTN,IR +*---- +* GET MIXTURE NAMES +*---- + CALL LCMGET(IPCPO,'MIXTURE-PREF',NAMMIX) +*---- +* GET PERTURBATION SUFFIX NAMES AND COMPARE WITH +* REFERENCE NAMES +*---- + NPERTN=MNLOCP+MNCPLP + ALLOCATE(ENEMIX(NGCCPO+1),IDSUF(NPERTN)) + CALL LCMGET(IPCPO,'PERTURB-SUFX',IDSUF) + DO ILOCP=1,NPERTN + WRITE(NAMDIR,'(A4)') IDSUF(ILOCP) + IF(NAMDIR .NE. NALOCP(ILOCP)) CALL XABORT(NAMSBR// + > ': INCOHERENT PERTURBATION NAMES') + ENDDO + DEALLOCATE(IDSUF) +*---- +* GET NUMBER OF PERTURBATION PER LOCAL PARAMETER PER MIXTURE +*---- + ALLOCATE(NBPER(NPERTN*NCMIXS)) + CALL LCMGET(IPCPO,'PERTURB-NUMB',NBPER) + IPER=0 + DO IMIX=1,NCMIXS + DO ILOCP=1,NPERTN + IPER=IPER+1 + MIXRCI(2+ILOCP,IMIX)=NBPER(IPER) + ENDDO + ENDDO + DEALLOCATE(NBPER) + ALLOCATE(LOCALP(MNLOCP)) +*---- +* GET LOCAL PARAMETERS +*---- + DO IMIX=1,NCMIXS +*---- +* GET REFERENCE MIXTURE PARAMETERS +*---- + WRITE(NAMDIR,'(A4,A2,A6)') + > NAMMIX(1,IMIX),NAMMIX(2,IMIX),'RC ' + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + CALL LCMGET(IPCPO,'PARAM ',IPARAM) + IF(IPARAM(1) .NE. NGCCPO) THEN + CALL XABORT(NAMSBR// + > ': INVALID NUMBER OF GROUPS FOR REFERENCE') + ENDIF +*---- +* TEST ENERGY GROUP STRUCTURE +*---- + CALL LCMGET(IPCPO,'ENERGY ',ENEMIX) + DO IGR=1,NGCCPO+1 + IF(ENECPO(IGR) .NE. ENEMIX(IGR)) THEN + CALL XABORT(NAMSBR// + > ': INVALID GROUP STRUCTURE FOR REFERENCE') + ENDIF + ENDDO +*---- +* READ LOCAL PARAMETERS AND TRANSFER +* TO LOCAL TABLE +*---- + MIXRCI(2,IMIX)=IPARAM(4) + CALL LCMGET(IPCPO,'LOCAL-PARAMS',LOCALP) + DO ILOCP=1,MNLOCP + PARRCI(ILOCP,IMIX)=LOCALP(ILOCP) + ENDDO + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) +*---- +* GET PERTURBATIONS PARAMETERS +*---- + DO ILOCP=1,NPERTN + NBPERP=MIXRCI(2+ILOCP,MAXMIX) + IF(NBPERP .GT. 0) THEN + NLPAR=1 + IF(ILOCP .GT. MNLOCP) NLPAR=2 + DO IPER=1,NBPERP + WRITE(NAMDIR,'(A4,A2,A4,I2)') + > NAMMIX(1,IMIX),NAMMIX(2,IMIX),NALOCP(ILOCP),IPER + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + CALL LCMGET(IPCPO,'PARAM ',IPARAM) + IF(IPARAM(1) .NE. NGCCPO) THEN + CALL XABORT(NAMSBR// + > ': INVALID NUMBER OF GROUPS FOR PERTURBATION') + ENDIF +*---- +* TEST ENERGY GROUP STRUCTURE +*---- + CALL LCMGET(IPCPO,'ENERGY ',ENEMIX) + DO IGR=1,NGCCPO+1 + IF(ENECPO(IGR) .NE. ENEMIX(IGR)) THEN + CALL XABORT(NAMSBR// + > ': INVALID GROUP STRUCTURE FOR REFERENCE') + ENDIF + ENDDO + CALL LCMGET(IPCPO,'LOCAL-PARAMS',LOCALP) +*---- +* READ PERTURBED LOCAL PARAMETERS AND TRANSFER +* TO LOCAL TABLE +*---- + DO ILPAR=1,NLPAR + ILOCL=IDLCPL(ILPAR,ILOCP) + PARPER(IPER,ILPAR,ILOCP,IMIX)=LOCALP(ILOCL) + ENDDO + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) + ENDDO + ENDIF + ENDDO + ENDDO + DEALLOCATE(LOCALP,ENEMIX) +*---- +* PROCESS PRINT LEVEL +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR,NCMIXS + DO IMIX=1,NCMIXS + IF(MIXRCI(2,IMIX) .GT. 0) THEN + WRITE(IOUT,6010) (NAMMIX(IR,IMIX),IR=1,2), + > MIXRCI(2,IMIX) + WRITE(IOUT,6020) + > (NALOCP(ILOCP),PARRCI(ILOCP,IMIX),ILOCP=1,MNLOCP) + ENDIF + DO ILOCP=1,NPERTN + NBPERP=MIXRCI(2+ILOCP,IMIX) + NLPAR=1 + IF(ILOCP .GT. MNLOCP) NLPAR=2 + IF(NBPERP .GT. 0) THEN + WRITE(IOUT,6011) NBPERP,NALOCP(ILOCP) + DO IPER=1,NBPERP + WRITE(IOUT,6022) IPER, + > (NALOCP(IDLCPL(ILPAR,ILOCP)), + > PARPER(IPER,ILPAR,ILOCP,IMIX), + > ILPAR=1,NLPAR) + ENDDO + ENDIF + ENDDO + ENDDO + WRITE(IOUT,6001) + ENDIF + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),'OUTPUT FROM ',A6,5('*')/ + > 6X,'CONTENTS OF CPO BEFORE UPDATE'/ + > 6X,'NUMBER OF MIXTURES = ',I10) + 6001 FORMAT(1X,28('*')) + 6010 FORMAT(6X,'NAME OF MIXTURES = ',A4,A4, + > 2X,'NUMBER OF BURNUP = ',I10, + > 2X,'ALREADY STORED ON CPO FILE') + 6011 FORMAT(6X,I10,' PERTURBATIONS FOR ',A4, + > 2X,'ALREADY STORED ON CPO FILE') + 6020 FORMAT(6X,'LOCAL PARAMETER FOR REFERENCE CASE'/ + > 1P,6(2x,A4,1X,E10.3)) + 6022 FORMAT(6X,'LOCAL PARAMETER PERTURBATION = ',I2/ + > 1P,2(2x,A4,1X,E10.3)) + END diff --git a/Donjon/src/T16MPS.f b/Donjon/src/T16MPS.f new file mode 100644 index 0000000..fe368e6 --- /dev/null +++ b/Donjon/src/T16MPS.f @@ -0,0 +1,275 @@ +*DECK T16MPS + SUBROUTINE T16MPS(IPCPO ,IPRINT,MAXMIX,MNLOCP,MNCPLP,MNPERT, + > NALOCP,IDLCPL,NCMIXS,NGCCPO,TITLE ,SUBTIT , + > ENECPO,NAMMIX,MIXRCI,PARRCI,PARPER) +* +*---- +* +*Purpose: +* Save mixture processing option on CPO. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPCPO pointer to CPO data structure. +* IPRINT print level. +* MAXMIX maximum number of mixtures. +* MNLOCP maximum number of local parameters. +* MNCPLP maximum number of coupled parameters. +* MNPERT maximum number of perturbations per local parameter. +* NALOCP local parameter names allowed. +* IDLCPL local ID for perturbation parameters. +* NCMIXS number of current mixtures. +* NGCCPO number of edit groups. +* TITLE title. +* SUBTIT subtitle. +* ENECPO final energy group structure for CPO. +* NAMMIX names of mixtures. +* MIXRCI reference information for mixtures where: +* =0 no information for mixture; +* >0 information not updated; +* <0 information to be updated. +* PARRCI reference local parameters for mixtures. +* PARPER perturbation parameters for mixtures. +* +*---- +* + USE GANLIB + IMPLICIT NONE + TYPE(C_PTR) IPCPO + INTEGER IPRINT,MAXMIX,MNLOCP,MNCPLP,MNPERT, + > NCMIXS,NGCCPO + CHARACTER NALOCP(MNLOCP+MNCPLP)*4 + INTEGER IDLCPL(2,MNLOCP+MNCPLP) + CHARACTER TITLE*72,SUBTIT*240 + INTEGER NAMMIX(2,MAXMIX), + > MIXRCI(2+MNLOCP+MNCPLP,MAXMIX) + REAL ENECPO(NGCCPO+1),PARRCI(MNLOCP,MAXMIX), + > PARPER(MNPERT,2,MNLOCP+MNCPLP,MAXMIX) +*---- +* MEMORY ALLOCATION +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDSUF,NBPER + REAL, ALLOCATABLE, DIMENSION(:) :: LOCALP +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT,NPARAM,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6,NAMMAC*12 + PARAMETER (IOUT=6,NPARAM=4,ILCMUP=1,ILCMDN=2, + > NTC=3,NAMSBR='T16MPS',NAMMAC='MACR ') + CHARACTER NAMDIR*12 + INTEGER IPARAM(NPARAM),KCHAR(NTC), + > NBURN,ILOCP,IMIX,IGC, + > IPER,NBPERP,ILCMLN,ITYLCM,NLPAR,ILPAR,ILOCL, + > IR,NPERTN,NMODRC +*---- +* SAVE MIXTURE NAMES +*---- + NAMDIR=NAMMAC + READ(NAMDIR,'(3A4)') (KCHAR(IR),IR=1,NTC) + NPERTN=MNLOCP+MNCPLP + CALL LCMPUT(IPCPO,'MIXTURE-PREF',2*NCMIXS,3,NAMMIX) +*---- +* SAVE PERTURBATION SUFFIX NAMES +*---- + ALLOCATE(IDSUF(NPERTN)) + DO 100 ILOCP=1,NPERTN + READ(NALOCP(ILOCP),'(A4)') IDSUF(ILOCP) + 100 CONTINUE + CALL LCMPUT(IPCPO,'PERTURB-SUFX',NPERTN,3,IDSUF) + DEALLOCATE(IDSUF) +*---- +* SAVE NUMBER OF PERTURBATION PER LOCAL PARAMETER PER MIXTURE +*---- + ALLOCATE(NBPER(NPERTN*NCMIXS)) + IPER=0 + DO IMIX=1,NCMIXS + DO ILOCP=1,NPERTN + IPER=IPER+1 + NBPER(IPER)=ABS(MIXRCI(2+ILOCP,IMIX)) + ENDDO + ENDDO + CALL LCMPUT(IPCPO,'PERTURB-NUMB',NPERTN*NCMIXS, + > 1,NBPER) + DEALLOCATE(NBPER) + ALLOCATE(LOCALP(MNLOCP)) +*---- +* SCAN OVER MIXTURES +*---- + DO IMIX=1,NCMIXS +*---- +* MIXTURE TO UPDATE +*---- + WRITE(NAMDIR,'(A4,A2,A6)') + > NAMMIX(1,IMIX),NAMMIX(2,IMIX),'RC ' + NBURN=ABS(MIXRCI(2,IMIX)) + IPARAM(1)=NGCCPO + IPARAM(2)=1 + IPARAM(3)=2 + IPARAM(4)=NBURN + NMODRC=0 + DO ILOCP=1,NPERTN + IF(MIXRCI(2+ILOCP,IMIX) .LT. 0) THEN + NMODRC=NMODRC-1 + ENDIF + ENDDO + IF(MIXRCI(2,IMIX) .LT. 0 ) THEN + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + CALL LCMLEN(IPCPO,'PARAM ',ILCMLN,ITYLCM) + IF(ILCMLN .EQ. 0) THEN + CALL LCMPUT(IPCPO,'PARAM ',NPARAM,1,IPARAM) + CALL LCMPUT(IPCPO,'ENERGY ',NGCCPO+1,2,ENECPO) + ELSE + CALL LCMGET(IPCPO,'PARAM ',IPARAM) + IF(IPARAM(1) .NE. NGCCPO .OR. + > IPARAM(2) .NE. 1 .OR. + > IPARAM(3) .NE. 2 .OR. + > IPARAM(4) .NE. NBURN ) THEN +*---- +* ABORT SINCE REFERENCE CASE PARAMETERS HAVE CHANGED +*---- + CALL XABORT(NAMSBR// + > ': INCOMPATIBLE PARAMETERS FOR '//NAMDIR) + ENDIF + ENDIF + LOCALP(:MNLOCP)=0.0 + DO ILOCP=1,MNLOCP + LOCALP(ILOCP)=PARRCI(ILOCP,IMIX) + ENDDO + CALL LCMPUT(IPCPO,'LOCAL-PARAMS',MNLOCP, 2,LOCALP) + CALL LCMPTC(IPCPO,'TITLE ', 72, TITLE) + CALL LCMPTC(IPCPO,'SUB-TITLE ', 240, SUBTIT) + CALL LCMPUT(IPCPO,'ISOTOPESNAME', NTC, 3, KCHAR) + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) + ELSE IF(NMODRC .LT. 0) THEN + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + LOCALP(:MNLOCP)=0.0 + DO ILOCP=1,MNLOCP + LOCALP(ILOCP)=PARRCI(ILOCP,IMIX) + ENDDO + CALL LCMPUT(IPCPO,'LOCAL-PARAMS',MNLOCP, 2,LOCALP) + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) + ENDIF +*---- +* PERTURBATIONS TO UPDATE +*---- + DO ILOCP=1,NPERTN + NBPERP=ABS(MIXRCI(2+ILOCP,IMIX)) + IF(MIXRCI(2+ILOCP,IMIX) .LT. 0) THEN + NLPAR=1 + IF(ILOCP .GT. MNLOCP) NLPAR=2 + DO IPER=1,NBPERP + WRITE(NAMDIR,'(A4,A2,A4,I2)') + > NAMMIX(1,IMIX),NAMMIX(2,IMIX),NALOCP(ILOCP),IPER + CALL LCMSIX(IPCPO,NAMDIR,ILCMUP) + CALL LCMLEN(IPCPO,'PARAM ',ILCMLN,ITYLCM) + IF(ILCMLN .EQ. 0) THEN + CALL LCMPUT(IPCPO,'PARAM ',NPARAM,1,IPARAM) + CALL LCMPUT(IPCPO,'ENERGY ',NGCCPO+1,2,ENECPO) + ELSE + CALL LCMGET(IPCPO,'PARAM ',IPARAM) + IF(IPARAM(1) .NE. NGCCPO .OR. + > IPARAM(2) .NE. 1 .OR. + > IPARAM(3) .NE. 2 .OR. + > IPARAM(4) .NE. NBURN ) THEN +*---- +* ABORT SINCE PERTURBATION PARAMETERS HAVE CHANGED +*---- + CALL XABORT(NAMSBR// + > ': INCOMPATIBLE PARAMETERS FOR '//NAMDIR) + ENDIF + ENDIF +*---- +* TRANSFER REFERENCE PARAMETERS +*---- + DO ILOCL=1,MNLOCP + LOCALP(ILOCL)=PARRCI(ILOCL,IMIX) + ENDDO +*---- +* TRANSFER PERTURBED PARAMETERS +*---- + DO ILPAR=1,NLPAR + ILOCL=IDLCPL(ILPAR,ILOCP) + LOCALP(ILOCL)=PARPER(IPER,ILPAR,ILOCP,IMIX) + ENDDO + CALL LCMPUT(IPCPO,'LOCAL-PARAMS',MNLOCP, 2, LOCALP) + CALL LCMPTC(IPCPO,'TITLE ', 72, TITLE) + CALL LCMPTC(IPCPO,'SUB-TITLE ', 240, SUBTIT) + CALL LCMPUT(IPCPO,'ISOTOPESNAME', NTC, 3, KCHAR) + CALL LCMSIX(IPCPO,NAMDIR,ILCMDN) + ENDDO + ENDIF + ENDDO + ENDDO + DEALLOCATE(LOCALP) +*---- +* PROCESS PRINT LEVEL +*---- + IF(IPRINT .GE. 1) THEN + WRITE(IOUT,6000) NAMSBR,NCMIXS,NGCCPO + WRITE(IOUT,6030) (ENECPO(IGC),IGC=1,NGCCPO+1) + DO IMIX=1,NCMIXS + IF(MIXRCI(2,IMIX) .LT. 0) THEN + WRITE(IOUT,6010) (NAMMIX(IR,IMIX),IR=1,2), + > ABS(MIXRCI(2,IMIX)) + WRITE(IOUT,6020) + > (NALOCP(ILOCP),PARRCI(ILOCP,IMIX),ILOCP=1,MNLOCP) + ELSE IF(MIXRCI(2,IMIX) .GT. 0) THEN + WRITE(IOUT,6011) (NAMMIX(IR,IMIX),IR=1,2), + > ABS(MIXRCI(2,IMIX)) + WRITE(IOUT,6020) + > (NALOCP(ILOCP),PARRCI(ILOCP,IMIX),ILOCP=1,MNLOCP) + ENDIF + DO ILOCP=1,NPERTN + NBPERP=ABS(MIXRCI(2+ILOCP,IMIX)) + NLPAR=1 + IF(ILOCP .GT. MNLOCP) NLPAR=2 + IF(MIXRCI(2+ILOCP,IMIX) .LT. 0) THEN + WRITE(IOUT,6012) NBPERP,NALOCP(ILOCP) + DO IPER=1,NBPERP + WRITE(IOUT,6021) IPER, + > (NALOCP(IDLCPL(ILPAR,ILOCP)), + > PARPER(IPER,ILPAR,ILOCP,IMIX), + > ILPAR=1,NLPAR) + ENDDO + ELSE IF(MIXRCI(2+ILOCP,IMIX) .GT. 0) THEN + WRITE(IOUT,6013) NBPERP,NALOCP(ILOCP) + DO IPER=1,NBPERP + WRITE(IOUT,6021) IPER, + > (NALOCP(IDLCPL(ILPAR,ILOCP)), + > PARPER(IPER,ILPAR,ILOCP,IMIX), + > ILPAR=1,NLPAR) + ENDDO + ENDIF + ENDDO + ENDDO + WRITE(IOUT,6001) + ENDIF +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),'OUTPUT FROM ',A6,5('*')/ + > 6X,'CONTENTS OF CPO AFTER UPDATE'/ + > 6X,'NUMBER OF MIXTURES = ',I10/ + > 6X,'NUMBER OF GROUPS = ',I10) + 6001 FORMAT(1X,28('*')) + 6010 FORMAT(6X,'NAME OF MIXTURES = ',A4,A4, + > 2X,'NUMBER OF BURNUP = ',I10, + > 2X,'UPDATED FROM CURRENT TAPE16') + 6011 FORMAT(6X,'NAME OF MIXTURES = ',A4,A4, + > 2X,'NUMBER OF BURNUP = ',I10, + > 2X,'TAKEN FROM OLD CPO') + 6012 FORMAT(6X,I10,' PERTURBATIONS FOR ',A4, + > 2X,'UPDATED FROM CURRENT TAPE16') + 6013 FORMAT(6X,I10,' PERTURBATIONS FOR ',A4, + > 2X,'UPDATED FROM OLD CPO') + 6020 FORMAT(6X,'LOCAL PARAMETER FOR REFERENCE CASE'/ + > 1P,6(2X,A4,1X,E10.3)) + 6021 FORMAT(6X,'LOCAL PARAMETER PERTURBATION = ',I2, + > 1P,2(2x,A4,1X,E10.3)) + 6030 FORMAT(6X,'CPO ENERGY STRUCTURE (EV)'/ + >1P,10(2X,E10.3)) + RETURN + END diff --git a/Donjon/src/T16RCA.f b/Donjon/src/T16RCA.f new file mode 100644 index 0000000..baadd16 --- /dev/null +++ b/Donjon/src/T16RCA.f @@ -0,0 +1,405 @@ +*DECK T16RCA + SUBROUTINE T16RCA(IFT16 ,IPRINT,NGCCPO,NGMTR ,IFGMTR,NVXSR , + > NMXSR ,B2CRI ,BRNIRR, NZONE,RECXSV,RECXSM, + > RECTMP,RECSCA,ZONVOL) +* +*---- +* +*Purpose: +* Read tape16 CELLAV cross sections at a specific burnup. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* IPRINT print level where: +* =0 for no print; >= 1 print processing option. +* NGCCPO number of edit groups. +* NGMTR number of main transport groups. +* IFGMTR fewgroups for main transport. +* NVXSR number of vector cross sections. +* NMXSR number of matrix cross sections. +* B2CRI critical bucklings. +* NZONE number of zones. +* ZONVOL zone volume. +* +*Parameters: output +* BRNIRR burnup and irradiation. +* RECXSV vector cross sections. +* RECXSM matrix cross sections. +* RECTMP dummy vector cross sections. +* RECSCA dummy matrix cross sections. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16,IPRINT,NGCCPO,NGMTR,NVXSR,NMXSR + INTEGER IFGMTR(NGCCPO) + REAL B2CRI(3),BRNIRR(3), + > RECXSV(NGCCPO,NVXSR+NMXSR), + > RECXSM(NGCCPO,NGCCPO,NMXSR), + > RECTMP(NGMTR,4),RECSCA(NGMTR,NGMTR) + REAL ZONVOL(NZONE) +*---- +* T16 PARAMETERS +*---- + INTEGER MAXKEY + PARAMETER (MAXKEY=2) + CHARACTER TKEY1(MAXKEY)*10,TKEY2(MAXKEY)*10, + > RKEY1*10,RKEY2*10 + INTEGER NKEY,IOPT,NBE,NID,IR, IZ + REAL RID +*---- +* LOCAL VARIABLES +* WSMEV FACTOR TO TRANSFORM MEV IN JOULES (WS) +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + REAL WSMEV + PARAMETER (IOUT=6,NAMSBR='T16RCA',WSMEV=1.602189E-13) + INTEGER IGR,IGC,IGD,IGF,JGR,JGC,JGD,JGF + REAL FLXNOR,BRNTMP(3),RTIME + INTEGER NZONE + REAL CELLV +*---- +* INITIALIZE CROSS SECTION VECTORS +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + RECXSV(:NGCCPO,:NVXSR+NMXSR)=0.0 + RECXSM(:NGCCPO,:NGCCPO,:NMXSR)=0.0 +*---- +* LOCATE NEXT CELLAV RECORD +*---- + IOPT=0 + TKEY1(1)='CELLAV ' + TKEY2(1)='MODERATOR ' + NKEY=1 + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .LE. 0 ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE + NKEY=2 +*---- +* CELL AVERAGED ABSORPTION X-S +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='ABSORPTION' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,4),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,4),IGR=1,NGMTR) + ENDIF +*---- +* CELL AVERAGED NU*FISSION +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='NU-FISSION' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,3),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,3),IGR=1,NGMTR) + ENDIF +*---- +* CELL AVERAGED TRANSPORT +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='TOTAL-X ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,2),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,2),IGR=1,NGMTR) + ENDIF + CELLV=0.0 + DO IZ=1, NZONE + CELLV=CELLV+ZONVOL(IZ) + ENDDO + TKEY1(1)='CELLAV ' + TKEY2(1)='FLUX ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,1),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,1),IGR=1,NGMTR) + ENDIF + DO IGR=1, NGMTR + RECTMP(IGR,1)=RECTMP(IGR,1)/CELLV + ENDDO +*---- +* CONDENSE TRANSPORT, ABSORPTION AND NU-FISSION X-S +* OVER CPO GROUPS +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + FLXNOR=0.0 + DO IGR=IGD,IGF + FLXNOR=FLXNOR+RECTMP(IGR,1) + ENDDO + IF(FLXNOR .GT. 0.0) THEN + FLXNOR=1.0/FLXNOR + DO IGR=IGD,IGF + RECTMP(IGR, 1)=RECTMP(IGR, 1)*FLXNOR + RECXSV(IGC, 2)=RECXSV(IGC, 2) + > +RECTMP(IGR,2)*RECTMP(IGR,1) + RECXSV(IGC, 3)=RECXSV(IGC, 3) + > +RECTMP(IGR,3)*RECTMP(IGR,1) + RECXSV(IGC,15)=RECXSV(IGC,15) + > +RECTMP(IGR,4)*RECTMP(IGR,1) + ENDDO + ELSE + CALL XABORT(NAMSBR// + > ': FLUX IN ONE CPO GROUP IS 0.0') + ENDIF + ENDDO +*---- +* ISOTROPIC SCATTERING MATRIX FROM GROUP IGR TO JGR +* IS STORED ON TAPE 16 AS +* ((RECSCA(IGR,JGR),IGR=1,NGMTR),JGR=1,NGMTR) +* RECXSM(IGTO,IGFROM,1) REPRESENT +* SCATTERING CROSS SECTION +* FROM GROUP "IGFROM" TO GROUP "IGTO" +* FOR ANISOTROPY LEVEL 1 +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='SCATTER ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR*NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE, + > ((RECSCA(IGR,JGR),IGR=1,NGMTR),JGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) ((RECSCA(IGR,JGR),IGR=1,NGMTR),JGR=1,NGMTR) + ENDIF +*---- +* FISSION SPECTRUM +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='FISSPECT ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,4),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,4),IGR=1,NGMTR) + ENDIF +*---- +* CONDENSE ISOTROPIC SCATTERING MATRIX AND FISSION SPECTRUM +* OVER CPO GROUPS +* COMPUTE TOTAL ISOTROPIC SCATTERING +* COMPUTE TOTAL AND TRANSPORT CORRECTION +* TOTAL(1) = ABSORPTION (15) + SCATTERING (21) +* TRANSPORT CORRECTION (2) = TOTAL(1) -TRANSPORT CORRECTED (2) +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + RECXSV(IGC, 5)=RECXSV(IGC,5)+RECTMP(IGR,4) + JGF=0 + DO JGC=1,NGCCPO + JGD=JGF+1 + JGF=IFGMTR(JGC) + DO JGR=JGD,JGF + RECXSM(JGC,IGC,1)=RECXSM(JGC,IGC,1) + > +RECSCA(IGR,JGR)*RECTMP(IGR,1) + RECXSV(IGC,21)=RECXSV(IGC,21) + > +RECSCA(IGR,JGR)*RECTMP(IGR,1) + ENDDO + ENDDO + ENDDO + RECXSV(IGC,1)=RECXSV(IGC,15)+RECXSV(IGC,21) + RECXSV(IGC,2)=RECXSV(IGC,1)-RECXSV(IGC,2) + ENDDO +*---- +* LINEARLY ANISOTROPIC SCATTERING FROM GROUP IGR TO JGR +* IS STORED ON TAPE 16 AS +* ((RECSCA(IGR,JGR),IGR=1,NGMTR),JGR=1,NGMTR) +* RECXSM(IGTO,IGFROM,2) REPRESENT +* SCATTERING CROSS SECTION +* FROM GROUP "IGFROM" TO GROUP "IGTO" +* FOR ANISOTROPY LEVEL 2 +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='SCATERP1 ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .EQ. NGMTR*NGMTR ) THEN + READ(IFT16) RKEY1,RKEY2,NBE, + > ((RECSCA(IGR,JGR),IGR=1,NGMTR),JGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) ((RECSCA(IGR,JGR),IGR=1,NGMTR),JGR=1,NGMTR) + ENDIF +*---- +* CONDENSE LINEARLY ANISOTROPIC SCATTERING MATRIX +* OVER CPO GROUPS +* COMPUTE TOTAL LINEARLY ANISOTROPIC SCATTERING +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + JGF=0 + DO JGC=1,NGCCPO + JGD=JGF+1 + JGF=IFGMTR(JGC) + DO JGR=JGD,JGF + RECXSM(JGC,IGC,2)=RECXSM(JGC,IGC,2) + > +RECTMP(IGR,4)*RECSCA(IGR,JGR) + RECXSV(IGC,22)=RECXSV(IGC,22) + > +RECTMP(IGR,4)*RECSCA(IGR,JGR) + ENDDO + ENDDO + ENDDO + ENDDO + ENDIF +*---- +* RADIAL AND AXIAL DIFFUSION COEFFICIENTS +* AND BUCKLING +*---- + TKEY1(2)='CELLAV ' + TKEY2(2)='K ' + TKEY1(1)='CELLAV ' + TKEY2(1)='DIFFUSION ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. 5*NGMTR+5 ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(NID,IR=1,3), + > (RECTMP(IGR,2),IGR=1,NGMTR), + > (RECTMP(IGR,3),IGR=1,NGMTR), + > (RID,IGR=1,NGMTR), + > (RID,IR=1,2) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,2),IGR=1,NGMTR) + WRITE(IOUT,6110) (RECTMP(IGR,3),IGR=1,NGMTR) + ENDIF +*---- +* CONDENSE DIFFUSION COEFFICIENTS +* COMPUTE STRD=1/3*DIFF +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + RECXSV(IGC,17)=RECXSV(IGC,17)+RECTMP(IGR,1) + > *(B2CRI(1)*RECTMP(IGR,2)+B2CRI(2)*RECTMP(IGR,3)) + RECXSV(IGC,18)=RECXSV(IGC,18) + > +RECTMP(IGR,1)*RECTMP(IGR,2) + RECXSV(IGC,19)=RECXSV(IGC,19) + > +RECTMP(IGR,1)*RECTMP(IGR,2) + RECXSV(IGC,20)=RECXSV(IGC,20) + > +RECTMP(IGR,1)*RECTMP(IGR,3) + ENDDO +*---- +* IF DIFFUSION COEFFICIENT VANISHES +* ASSUME D=1/3*(TRANSPORT CORRECTED) +* NO DIRECTIONAL EFFECT +* THEN USE STRD=1/3*DIFF +*---- + IF(RECXSV(IGC,17) .EQ. 0.0 .OR. + > RECXSV(IGC,18) .EQ. 0.0 .OR. + > RECXSV(IGC,19) .EQ. 0.0 .OR. + > RECXSV(IGC,19) .EQ. 0.0 ) THEN + RECXSV(IGC,17)=RECXSV(IGC,1)-RECXSV(IGC,2) + RECXSV(IGC,18)=0.0 + RECXSV(IGC,19)=0.0 + RECXSV(IGC,20)=0.0 + ELSE + RECXSV(IGC,17)=1.0/(3.0*RECXSV(IGC,17)) + RECXSV(IGC,18)=1.0/(3.0*RECXSV(IGC,18)) + RECXSV(IGC,19)=1.0/(3.0*RECXSV(IGC,19)) + RECXSV(IGC,20)=1.0/(3.0*RECXSV(IGC,20)) + ENDIF + ENDDO +*---- +* FISSION CROSS SECTION +*---- + TKEY1(2)='MTR ' + TKEY2(2)='FEWGROUPS ' + TKEY1(1)='CELLAV ' + TKEY2(1)='SIGMAF ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,4),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,4),IGR=1,NGMTR) + ENDIF +*---- +* CONDENSE FISSION CROSS SECTION +* OVER CPO GROUPS +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + RECXSV(IGC, 4)=RECXSV(IGC, 4) + > +RECTMP(IGR,4)*RECTMP(IGR,1) + ENDDO + ENDDO +*---- +* BURNUP INFORMATION +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='AVG-ENERGY' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .EQ. 5 ) THEN + READ(IFT16) RKEY1,RKEY2,NBE,RTIME, + > BRNTMP(3),BRNTMP(1),BRNTMP(2) + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6010) RTIME,BRNTMP(3),BRNTMP(1),BRNTMP(2) + ENDIF + BRNIRR(1)=BRNTMP(1) + BRNIRR(2)=BRNTMP(2) + BRNIRR(3)=WSMEV*BRNTMP(3) + ENDIF + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6001) + ENDIF + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),' OUTPUT FROM ',A6,1X,5('*')) + 6001 FORMAT(1X,30('*')) + 6010 FORMAT(6X,'BURNUP IRRADIATION '/1P, + > 6X,'TIME (DAYS) = ',E10.3/ + > 6X,'ENERGY (MEV) = ',E10.3/ + > 6X,'BURNUP (MWD/T) = ',E10.3/ + > 6X,'IRRADIATION (N/KB) = ',E10.3) + 6100 FORMAT(6X,'CELLAV MAIN TRANSPORT GROUP ',A10) + 6110 FORMAT(1P,10(2X,E10.3)) + END diff --git a/Donjon/src/T16REC.f b/Donjon/src/T16REC.f new file mode 100644 index 0000000..b7cd63a --- /dev/null +++ b/Donjon/src/T16REC.f @@ -0,0 +1,62 @@ +*DECK T16REC + SUBROUTINE T16REC(IFT16 ,IPRINT,INEXTR) +* +*---- +* +*Purpose: +* Locate next set of records on tape16. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* IPRINT print level where: +* =0 for no print; >= 1 print processing option. +* INEXTR next record set to read. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16,IPRINT,INEXTR +*---- +* T16 PARAMETERS +*---- + INTEGER MAXKEY + PARAMETER (MAXKEY=3) + CHARACTER TKEY1(MAXKEY)*10,TKEY2(MAXKEY)*10, + > RKEY1*10,RKEY2*10 + INTEGER NKEY,IOPT,NBE,NSKIPR,ISKIPR +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='T16REC') +*---- +* REWIND AND SKIP FIRST INEXTR-1 SETS OF RECORDS +*---- + REWIND(IFT16) + NSKIPR=INEXTR + TKEY1(1)='MTR ' + TKEY2(1)='FEWGROUPS ' + NKEY=1 + IOPT=-1 + DO ISKIPR=1,NSKIPR + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF(NBE .EQ. -1) THEN + WRITE(IOUT,9000) NAMSBR,TKEY1(1),TKEY2(1),INEXTR + CALL XABORT(NAMSBR//': INVALID RECORD NUMBER ON TAPE16') + ENDIF + READ(IFT16) RKEY1,RKEY2,NBE + ENDDO + RETURN +*---- +* ABORT FORMAT +*---- + 9000 FORMAT(1X,A6,1X,7('*'),' ERROR ',7('*')/ + > 8X,I6,' TAPE16 RECORD WITH KEYS =',2(A10,2X), + > 'NOT FOUND'/ + > 8X,21('*')) + END diff --git a/Donjon/src/T16RRE.f b/Donjon/src/T16RRE.f new file mode 100644 index 0000000..730364b --- /dev/null +++ b/Donjon/src/T16RRE.f @@ -0,0 +1,294 @@ +*DECK T16RRE + SUBROUTINE T16RRE(IFT16 ,IPRINT,NGCCPO,NGMTR ,IFGMTR,NVXSR , + > NMXSR ,IMIREG,VELMTR,B2CRI ,BRNIRR,FLXINT, + > OVERV,RECXSV,RECXSM,RECTMP,RECSCA) +* +*---- +* +*Purpose: +* Read tape16 REGION cross sections at a specific burnup. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IFT16 tape16 file unit. +* IPRINT print level where: +* =0 for no print; >= 1 print processing option. +* NGCCPO number of edit groups. +* NGMTR number of main transport groups. +* IFGMTR fewgroups for main transport. +* NVXSR number of vector cross sections. +* NMXSR number of matrix cross sections. +* IMIREG mixture update identifier where +* =0 do not update; +* =-1 update using CELLAV information; +* > 0 update using specified region number. +* VELMTR velocity for main transport. +* B2CRI critical bucklings. +* FLXINT volume integrated fluxes. +* OVERV 1/V cross sections. +* +*Parameters: output +* BRNIRR burnup and irradiation. +* RECXSV vector cross sections. +* RECXSM matrix cross sections. +* RECTMP dummy vector cross sections. +* RECSCA dummy matrix cross sections. +* +*---- +* + IMPLICIT NONE + INTEGER IFT16,IPRINT,NGCCPO,NGMTR,NVXSR,NMXSR,IMIREG + INTEGER IFGMTR(NGCCPO) + REAL VELMTR(NGMTR),B2CRI(3),BRNIRR(3), + > FLXINT(NGCCPO),OVERV(NGCCPO), + > RECXSV(NGCCPO,NVXSR+NMXSR), + > RECXSM(NGCCPO,NGCCPO,NMXSR), + > RECTMP(NGMTR,4),RECSCA(NGMTR,NGMTR) +*---- +* T16 PARAMETERS +*---- + INTEGER MAXKEY + PARAMETER (MAXKEY=2) + CHARACTER TKEY1(MAXKEY)*10,TKEY2(MAXKEY)*10, + > RKEY1*10,RKEY2*10 + INTEGER NKEY,IOPT,NBE,NID,NJD +*---- +* LOCAL VARIABLES +* WSMEV FACTOR TO TRANSFORM MEV IN JOULES (WS) +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + REAL WSMEV + PARAMETER (IOUT=6,NAMSBR='T16RRE',WSMEV=1.602189E-13) + INTEGER IREG,IGR,IGC,IGD,IGF,JGR,JGC,JGD,JGF, + > NREGON + REAL VOLUME,BRNTMP(3),RTIME +*---- +* INITIALIZE CROSS SECTION VECTORS +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + RECXSV(:NGCCPO,:NVXSR+NMXSR)=0.0 + RECXSM(:NGCCPO,:NGCCPO,:NMXSR)=0.0 +*---- +* LOCATE NEXT REGION DIMENSIONS RECORD +* AND READ NREGON +*---- + IOPT=0 + TKEY1(1)='REGION ' + TKEY2(1)='DIMENSIONS' + NKEY=1 + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. 2 ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,NREGON + TKEY1(2)='CELLAV ' + TKEY2(2)='NGROUPS ' + NKEY=2 + DO IREG=1,NREGON +*---- +* REGIONAL FLUX +*---- + TKEY1(1)='REGION ' + TKEY2(1)='FLUX ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. 3+NGMTR ) CALL XABORT(NAMSBR// + > ': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + IF(IMIREG .EQ. IREG) THEN + READ(IFT16) RKEY1,RKEY2,NBE,NID,NJD,VOLUME, + > (RECTMP(IGR,1),IGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,1),IGR=1,NGMTR) + ENDIF +*---- +* TREAT ALL CONDENSED GROUPS +*---- + TKEY1(1)='REGION ' + TKEY2(1)='SIGMAS ' + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) +*---- +* FLUX AND 1/V CROSS SECTION CONDENSATION +*---- + DO IGR=IGD,IGF + FLXINT(IGC)=FLXINT(IGC)+RECTMP(IGR,1) + OVERV(IGC)=OVERV(IGC)+RECTMP(IGR,1)/VELMTR(IGR) + ENDDO + IF(FLXINT(IGC) .NE. 0.0) THEN + OVERV(IGC)=OVERV(IGC)/FLXINT(IGC) + DO IGR=IGD,IGF + RECTMP(IGR,1)=RECTMP(IGR,1)/FLXINT(IGC) + ENDDO + FLXINT(IGC)=FLXINT(IGC)*VOLUME + ENDIF +*---- +* LOOP OBER MTR GROUP ASSOCIATED WITH CPO GROUPS +*---- + DO IGR=IGD,IGF +*---- +* READ CROSS SECTIONS +*---- + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. 4+NGMTR ) CALL XABORT(NAMSBR// + > ': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE, + > RECTMP(IGR,4),RECTMP(IGR,3),RECTMP(IGR,2), + > (RECSCA(IGR,JGR),JGR=1,NGMTR) + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6101) TKEY2(1),IGR + WRITE(IOUT,6110) + > RECTMP(IGR,4),RECTMP(IGR,3),RECTMP(IGR,2), + > (RECSCA(IGR,JGR),JGR=1,NGMTR) + ENDIF +*---- +* ABSORPTION, NU-FISSION AND TRANSPORT SECTION CONDENSATION +*---- + RECXSV(IGC, 2)=RECXSV(IGC, 2) + > +RECTMP(IGR,2)*RECTMP(IGR,1) + RECXSV(IGC, 3)=RECXSV(IGC, 3) + > +RECTMP(IGR,3)*RECTMP(IGR,1) + RECXSV(IGC,15)=RECXSV(IGC,15) + > +RECTMP(IGR,4)*RECTMP(IGR,1) +*---- +* SCATTERING SECTION CONDENSATION +*---- + JGF=0 + DO JGC=1,NGCCPO + JGD=JGF+1 + JGF=IFGMTR(JGC) + DO JGR=JGD,JGF + RECXSM(JGC,IGC,1)=RECXSM(JGC,IGC,1) + > +RECSCA(IGR,JGR)*RECTMP(IGR,1) + RECXSV(IGC,21)=RECXSV(IGC,21) + > +RECSCA(IGR,JGR)*RECTMP(IGR,1) + ENDDO + ENDDO + ENDDO +*---- +* TOTAL AND TRANSPORT CORRECTION +*---- + RECXSV(IGC,1)=RECXSV(IGC,15)+RECXSV(IGC,21) + RECXSV(IGC,2)=RECXSV(IGC,1)-RECXSV(IGC,2) + ENDDO + IF( NBE .EQ. 2*NGMTR ) THEN + IF(IPRINT .GE. 100) THEN + RECTMP(IGR,3)=RECTMP(IGR,2) + WRITE(IOUT,6100) TKEY2(1) + WRITE(IOUT,6110) (RECTMP(IGR,2),IGR=1,NGMTR) + WRITE(IOUT,6110) (RECTMP(IGR,3),IGR=1,NGMTR) + ENDIF +*---- +* CONDENSE DIFFUSION COEFFICIENTS +* COMPUTE STRD=1/3*DIFF +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + RECXSV(IGC,17)=RECXSV(IGC,17)+RECTMP(IGR,1) + > *(B2CRI(1)*RECTMP(IGR,2)+B2CRI(2)*RECTMP(IGR,3)) + RECXSV(IGC,18)=RECXSV(IGC,18) + > +RECTMP(IGR,1)*RECTMP(IGR,2) + RECXSV(IGC,19)=RECXSV(IGC,19) + > +RECTMP(IGR,1)*RECTMP(IGR,2) + RECXSV(IGC,20)=RECXSV(IGC,20) + > +RECTMP(IGR,1)*RECTMP(IGR,3) + ENDDO + IF(RECXSV(IGC,17) .EQ. 0.0 .OR. + > RECXSV(IGC,18) .EQ. 0.0 .OR. + > RECXSV(IGC,19) .EQ. 0.0 .OR. + > RECXSV(IGC,19) .EQ. 0.0 ) THEN + RECXSV(IGC,17)=RECXSV(IGC,1)-RECXSV(IGC,2) + RECXSV(IGC,18)=0.0 + RECXSV(IGC,19)=0.0 + RECXSV(IGC,20)=0.0 + ELSE + RECXSV(IGC,17)=1.0/(3.0*RECXSV(IGC,17)) + RECXSV(IGC,18)=1.0/(3.0*RECXSV(IGC,18)) + RECXSV(IGC,19)=1.0/(3.0*RECXSV(IGC,19)) + RECXSV(IGC,20)=1.0/(3.0*RECXSV(IGC,20)) + ENDIF + ENDDO + ELSE + DO IGC=1,NGCCPO + RECXSV(IGC,17)=1.0/(3.0*(RECXSV(IGC,1)-RECXSV(IGC,2))) + RECXSV(IGC,18)=RECXSV(IGC,17) + RECXSV(IGC,19)=RECXSV(IGC,17) + RECXSV(IGC,20)=RECXSV(IGC,17) + ENDDO + ENDIF + GO TO 105 + ELSE + READ(IFT16) RKEY1,RKEY2,NBE + ENDIF + ENDDO + 105 CONTINUE +*---- +* READ FISSION SPECTRUM +*---- + TKEY1(1)='CELLAV ' + TKEY2(1)='FISSPECT ' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .NE. NGMTR ) CALL XABORT(NAMSBR// + >': CANNOT FIND '//TKEY1(1)//' '//TKEY2(1)) + READ(IFT16) RKEY1,RKEY2,NBE,(RECTMP(IGR,4),IGR=1,NGMTR) +*---- +* CONDENSE FISSION SPECTRUM OVER CPO GROUPS +*---- + IGF=0 + DO IGC=1,NGCCPO + IGD=IGF+1 + IGF=IFGMTR(IGC) + DO IGR=IGD,IGF + RECXSV(IGC, 5)=RECXSV(IGC,5)+RECTMP(IGR,4) + ENDDO + ENDDO +*---- +* BURNUP INFORMATION +*---- + TKEY1(2)='MTR ' + TKEY2(2)='FEWGROUPS ' + TKEY1(1)='CELLAV ' + TKEY2(1)='AVG-ENERGY' + CALL T16FND(IFT16 ,IPRINT,IOPT ,NKEY ,TKEY1 ,TKEY2 , + > NBE ) + IF( NBE .EQ. 5 ) THEN + READ(IFT16) RKEY1,RKEY2,NBE,RTIME, + > BRNTMP(3),BRNTMP(1),BRNTMP(2) + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6010) RTIME,BRNTMP(3),BRNTMP(1),BRNTMP(2) + ENDIF + BRNIRR(1)=BRNTMP(1) + BRNIRR(2)=BRNTMP(2) + BRNIRR(3)=WSMEV*BRNTMP(3) + ENDIF + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6001) + ENDIF + RETURN +*---- +* PRINT FORMAT +*---- + 6000 FORMAT(1X,5('*'),' OUTPUT FROM ',A6,1X,5('*')) + 6001 FORMAT(1X,30('*')) + 6010 FORMAT(6X,'BURNUP IRRADIATION '/1P, + > 6X,'TIME (DAYS) = ',E10.3/ + > 6X,'ENERGY (MEV) = ',E10.3/ + > 6X,'BURNUP (MWD/T) = ',E10.3/ + > 6X,'IRRADIATION (N/KB) = ',E10.3) + 6100 FORMAT(6X,'CELLAV MAIN TRANSPORT GROUP ',A10) + 6101 FORMAT(6X,'CELLAV MAIN TRANSPORT GROUP ',A10, + > 6X,'GROUP =',I10) + 6110 FORMAT(1P,10(2X,E10.3)) + END diff --git a/Donjon/src/T16WDS.f b/Donjon/src/T16WDS.f new file mode 100644 index 0000000..537e547 --- /dev/null +++ b/Donjon/src/T16WDS.f @@ -0,0 +1,157 @@ +*DECK T16WDS + SUBROUTINE T16WDS(IPCPO ,NGCCPO,NVXSR ,NMXSR ,IBURN ,EFJ , + > NAMDXS,ITYXS ,FLXINT,FLXDIS,OVERV ,RECXSV, + > IDRXSM,RECXSM,RECSCA) +* +*---- +* +*Purpose: +* Write properties to CPO data structure. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPCPO pointer to CPO data structure. +* NGCCPO number of edit groups. +* NVXSR number of vector cross sections. +* NMXSR number of matrix cross sections. +* IBURN burnup step. +* EFJ energy of fission in joules. +* NAMDXS name of vector cross sections. +* ITYXS types of cross sections saved. +* FLXINT volume integrated fluxes. +* FLXDIS flux disadvantage factor. +* OVERV 1/V cross sections. +* RECXSV vector cross sections. +* IDRXSM compression vector for matrix cross sections. +* RECXSM matrix cross sections. +* RECSCA dummy matrix cross sections. +* +*---- +* + USE GANLIB + IMPLICIT NONE + TYPE(C_PTR) IPCPO + INTEGER NGCCPO,NVXSR,NMXSR,IBURN + CHARACTER NAMDXS(NVXSR+NMXSR)*12 + INTEGER IDRXSM(NGCCPO,2),ITYXS(NVXSR+NMXSR) + REAL EFJ,FLXINT(NGCCPO), + > FLXDIS(NGCCPO),OVERV(NGCCPO), + > RECXSV(NGCCPO,NVXSR+NMXSR), + > RECXSM(NGCCPO,NGCCPO,NMXSR), + > RECSCA(NGCCPO*NGCCPO) +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,ILCMUP=1,ILCMDN=2,NAMSBR='T16WDS') + CHARACTER NAMBRN*12,NAMMAC*12,NAMLEG*2 + INTEGER IVXS,IMXS,IGTO,IGFROM,IGMIN,IGMAX,NXSCMP + REAL DENMAC +*---- +* SET UP BURUP DIRECTORY +*---- + WRITE(NAMBRN,'(A8,I4)') 'BURN ',IBURN + CALL LCMSIX(IPCPO ,NAMBRN,ILCMUP) +*---- +* SAVE ISOTOPES DENSITY, ENERGY, INTEGRATED FLUX, +* DISADVANTAGE FACTOR AND OVERV ON MAIN DIRECTORY +*---- + DENMAC=1.0 + CALL LCMPUT(IPCPO ,'ISOTOPESDENS', 1,2,DENMAC) + CALL LCMPUT(IPCPO ,'ISOTOPES-EFJ', 1,2,EFJ) + CALL LCMPUT(IPCPO ,'FLUX-INTG ',NGCCPO,2,FLXINT) + CALL LCMPUT(IPCPO ,'FLUXDISAFACT',NGCCPO,2,FLXDIS) + CALL LCMPUT(IPCPO ,'OVERV ',NGCCPO,2,OVERV) + NAMMAC='MACR ' + CALL LCMSIX(IPCPO ,NAMMAC,ILCMUP) +*---- +* FIND IF VECTOR XS NOT ALL 0.0 +* AND INITIALIZE ITYXS ACCORDINGLY +* SAVE XS +*---- + DO IVXS=1,NVXSR + ITYXS(IVXS)=0 + DO IGFROM=1,NGCCPO + IF(RECXSV(IGFROM,IVXS) .NE. 0.0) THEN + ITYXS(IVXS)=1 + CALL LCMPUT(IPCPO ,NAMDXS(IVXS), + > NGCCPO,2,RECXSV(1,IVXS)) + ENDIF + ENDDO + ENDDO +*---- +* FIND IF SCATTERING XS NOT ALL 0.0 +* AND INITIALIZE ITYXS ACCORDINGLY +*---- + DO IMXS=1,NMXSR + ITYXS(IMXS+NVXSR)=0 + DO IGTO=1,NGCCPO + DO IGFROM=1,NGCCPO + IF(RECXSM(IGTO,IGFROM,IMXS) .NE. 0.0) THEN + ITYXS(IMXS+NVXSR)=1 + CALL LCMPUT(IPCPO ,NAMDXS(IMXS+NVXSR), + > NGCCPO,2,RECXSV(1,IMXS+NVXSR)) + GO TO 105 + ENDIF + ENDDO + ENDDO + 105 CONTINUE + ENDDO +*---- +* SAVE ITYXS +*---- + CALL LCMPUT(IPCPO ,'XS-SAVED ',NVXSR+NMXSR,1,ITYXS) +*---- +* COMPRESS SCATTERING MATRIX +* RECXSM(IGTO,IGFROM,IMXS) REPRESENT SCATTERING CROSS SECTION +* FROM GROUP "IGFROM" TO GROUP "IGTO" +* IDRXSM(IGTO,1) IS MAXIMUM GROUP NUMBER +* WITH SCATTERING TO "IGTO" GROUP +* IDRXSM(IGTO,2) IS NUMBER OF GROUPS +* WITH SCATTERING TO "IGTO" GROUP +* RECSCA(IX) IS COMPRESSED SCATTERING MATRIX +* IX CAN BE LOCALIZED IN RECXSM(IGTO,IGFROM) USING +* IF(IGTO=1) THEN +* IPOSD=1 +* ELSE +* IPOSD=1+SUM( IDRXSM(IGF,2) , IGF=1,IGTO-1) +* ENDIF +* IF(IGFROM.GT.IDRXSM(IGTO,1)) THEN +* XSSCMP NOT STORED +* ELSE IF(IGFROM.LT.IDRXSM(IGTO,1)-IDRXSM(IGTO,2)+1) THEN +* XSSCMP NOT STORED +* ELSE +* IX=IPOSD+IDRXSM(IGTO,1)-IGFROM +* RECSCA(IX)=RECXSM(IGTO,IGFROM) +* ENDIF +*---- + DO IMXS=1,NMXSR + NXSCMP=0 + DO IGTO=1,NGCCPO + IGMIN=IGTO + IGMAX=IGTO + DO IGFROM=1,NGCCPO + IF(RECXSM(IGTO,IGFROM,IMXS) .NE. 0.0) THEN + IGMIN=MIN(IGMIN,IGFROM) + IGMAX=MAX(IGMAX,IGFROM) + ENDIF + ENDDO + IDRXSM(IGTO,1)=IGMAX + IDRXSM(IGTO,2)=IGMAX-IGMIN+1 + DO IGFROM=IGMAX,IGMIN,-1 + NXSCMP=NXSCMP+1 + RECSCA(NXSCMP)=RECXSM(IGTO,IGFROM,IMXS) + ENDDO + ENDDO + WRITE(NAMLEG,'(I2)') IMXS-1 + CALL LCMPUT(IPCPO,'NJJ '//NAMLEG//' ',NGCCPO,1,IDRXSM(1,1)) + CALL LCMPUT(IPCPO,'IJJ '//NAMLEG//' ',NGCCPO,1,IDRXSM(1,2)) + CALL LCMPUT(IPCPO,'SCAT'//NAMLEG//' ',NXSCMP,2,RECSCA) + ENDDO + CALL LCMSIX(IPCPO ,NAMMAC,ILCMDN) + CALL LCMSIX(IPCPO ,NAMBRN,ILCMDN) + RETURN + END diff --git a/Donjon/src/TAVG.f b/Donjon/src/TAVG.f new file mode 100644 index 0000000..b2f84bb --- /dev/null +++ b/Donjon/src/TAVG.f @@ -0,0 +1,151 @@ +*DECK TAVG + SUBROUTINE TAVG(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Perform computations according to the time-average model. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* D. Sekki +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The TAVG: module specification is: +* FMAP := TAVG: FMAP POWER :: (desctavg) ; +* where +* FMAP : name of a \emph{fmap} object, that will be updated by the TAVG: +* module. The FMAP object must contain the average exit burnups and +* refuelling schemes of channels. +* POWER name of a \emph{power} object containing the channel and bundle +* powers, previously computed by the FLPOW: module. The channel and bundle +* powers are used by the TAVG: module to compute the normalized axial +* power-shape over each channel. +* (desctavg) : structure describing the input data to the TAVG: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER TEXT*12,HSIGN*12 + INTEGER ISTATE(NSTATE) + DOUBLE PRECISION DFLOT + LOGICAL LEXIT,LSHAP + TYPE(C_PTR) IPMAP,IPPOW,JPMAP +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.NE.2)CALL XABORT('@TAVG: TWO PARAMETERS EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT(' ' + 1 //'@TAVG: LCM OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).NE.1)CALL XABORT('@TAVG: MODIFICATION MODE ' + 1 //'FOR L_MAP EXPECTED.') + CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN) + TEXT=HENTRY(1) + IF(HSIGN.NE.'L_MAP')CALL XABORT('@TAVG: SIGNATURE ' + 1 //' OF '//TEXT//' IS '//HSIGN//'. L_MAP EXPECTED.') + IPMAP=KENTRY(1) + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT(' ' + 1 //'@TAVG: LCM OBJECT EXPECTED AT RHS.') + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + TEXT=HENTRY(2) + IF(HSIGN.NE.'L_POWER')CALL XABORT('@TAVG: SIGNATURE ' + 1 //' OF '//TEXT//' IS '//HSIGN//'. L_POWER EXPECTED.') + IF(JENTRY(2).NE.2)CALL XABORT('@TAVG: READ-ONLY MODE ' + 1 //'FOR L_POWER EXPECTED.') + IPPOW=KENTRY(2) +*---- +* READ INPUT DATA +*---- + IMPX=1 + ARP=0.5 + LEXIT=.FALSE. + LSHAP=.FALSE. +* PRINTING INDEX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TAVG: CHARACTER DATA EXPECTED(1).') + IF(TEXT.NE.'EDIT')GOTO 10 + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@TAVG: INTEGER DATA EXPECTED.') + IMPX=MAX(0,NITMA) +* AX-SHAPE OPTION + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TAVG: CHARACTER DATA EXPECTED(2).') + 10 IF(TEXT.NE.'AX-SHAPE')GOTO 20 + LSHAP=.TRUE. +* RELAXATION PARAMETER + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TAVG: CHARACTER DATA EXPECTED(3).') + 20 IF(TEXT.NE.'RELAX')GOTO 30 + CALL REDGET(ITYP,NITMA,ARP,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@TAVG: REAL DATA EXPECTED.') + IF(ARP.LE.0.)CALL XABORT('@TAVG: POSITIVE AND NON-ZERO RELAX' + 1 //'ATION PARAMETER EXPECTED.') +* B-EXIT OPTION + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TAVG: CHARACTER DATA EXPECTED(4).') + 30 IF(TEXT.NE.'B-EXIT')GOTO 40 + LEXIT=.TRUE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TAVG: CHARACTER DATA EXPECTED(5).') + 40 IF(TEXT.NE.';')CALL XABORT('@TAVG: END TO MODULE ; EXPECTED.') + IF((.NOT.LSHAP).AND.(.NOT.LEXIT))CALL XABORT('@TAVG: MODULE' + 1 //' OPTION WAS NOT SPECIFIED.') +*---- +* RECOVER INFORMATION +*---- + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) +* FUEL-MAP GEOMETRY + JPMAP=LCMGID(IPMAP,'GEOMAP') + ISTATE(:NSTATE)=0 + CALL LCMGET(JPMAP,'STATE-VECTOR',ISTATE) + NX=ISTATE(3) + NY=ISTATE(4) + NZ=ISTATE(5) +* CHECK EXISTING DATA + CALL LCMLEN(IPMAP,'BURN-AVG',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@TAVG: MISSING BURNUP DATA IN FUEL' + 1 //'-MAP OBJECT.') + CALL LCMLEN(IPMAP,'REF-SCHEME',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@TAVG: MISSING REF-SCHEME DATA IN ' + 1 //'FUEL-MAP OBJECT.') + CALL LCMLEN(IPPOW,'POWER-CHAN',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@TAVGCL: MISSING POWER-CHAN DATA I' + 1 //'N L_POWER OBJECT.') +*---- +* PERFORM CALCULATION +*---- + IF(LSHAP)CALL TAVGCL(IPMAP,IPPOW,NCH,NB,NCOMB,NX,NY,NZ,ARP,IMPX) + IF(LEXIT)CALL TAVGEX(IPMAP,IPPOW,NCH,NCOMB,NX,NY,NZ,IMPX) + IF(IMPX.GT.2)CALL LCMLIB(IPMAP) + RETURN + END diff --git a/Donjon/src/TAVGCL.f b/Donjon/src/TAVGCL.f new file mode 100644 index 0000000..2f31a27 --- /dev/null +++ b/Donjon/src/TAVGCL.f @@ -0,0 +1,175 @@ +*DECK TAVGCL + SUBROUTINE TAVGCL(IPMAP,IPPOW,NCH,NB,NCOMB,NX,NY,NZ,ARP,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute burnup limits over the fuel lattice for the time-average +* integration, based on the axial power shape over each channel. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* D. Sekki, R. Chambon +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* IPPOW pointer to power information. +* NCH number of reactor channels. +* NB number of fuel bundles per channel. +* NCOMB number of combustion zones. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* ARP relaxation parameter for shape convergence. +* IMPX printing index (=0 for no print). +* +*Parameters: scratch +* BURN0 low burnup integration limits. +* BURN1 upper burnup integration limits. +* +*---------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPPOW + INTEGER NCH,NB,NCOMB,NX,NY,NZ,IMPX + REAL ARP +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER MIX(NX*NY*NZ),NAMX(NX),NAMY(NY), + 1 IVECT(NCOMB,NB),NSCH(NCH),BZONE(NCH),IGAR(NB) + REAL POWB(NCH,NB),POWC(NCH),PSI(NB),BVAL(NCOMB),SOLD(NCH,NB), + 1 BURN0(NCH,NB),BURN1(NCH,NB),B0(NB),B1(NB),SNEW(NCH,NB) + CHARACTER TEXT*12,CHANX*2,CHANY*2 + DOUBLE PRECISION PNUM,PDEN + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ICHMAP +*---- +* RECOVER INFORMATION +*---- + MIX(:NX*NY*NZ)=0 + CALL LCMGET(IPMAP,'BMIX',MIX) +* CHANNEL NAMES + NAMX(:NX)=0 + CALL LCMGET(IPMAP,'XNAME',NAMX) + NAMY(:NY)=0 + CALL LCMGET(IPMAP,'YNAME',NAMY) +* COMBUSTION-ZONE INDEX + BZONE(:NCH)=0 + CALL LCMGET(IPMAP,'B-ZONE',BZONE) +* AVERAGE EXIT BURNUPS + BVAL(:NCOMB)=0.0 + CALL LCMGET(IPMAP,'BURN-AVG',BVAL) +* REFUELLING SCHEME + NSCH(:NCH)=0 + CALL LCMGET(IPMAP,'REF-SCHEME',NSCH) +* REFUELLING VECTOR + IVECT(:NCOMB,:NB)=0 + CALL LCMGET(IPMAP,'REF-VECTOR',IVECT) +* PREVIOUS AXIAL SHAPE + SOLD(:NCH,:NB)=0.0 + CALL LCMGET(IPMAP,'AX-SHAPE',SOLD) +* CHANNEL POWERS + POWC(:NCH)=0.0 + CALL LCMGET(IPPOW,'POWER-CHAN',POWC) +* BUNDLE POWERS + POWB(:NCH,:NB)=0.0 + CALL LCMGET(IPPOW,'POWER-BUND',POWB) +*---- +* SET THE CHANNEL INDEX MAP +*---- + ALLOCATE(ICHMAP(NX,NY)) + ICHMAP(:NX,:NY)=0 + ICH=0 + DO 35 J=1,NY + DO 30 I=1,NX + IEL=(J-1)*NX+I + DO 10 IZ=1,NZ + IF(MIX((IZ-1)*NX*NY+IEL).NE.0) GO TO 20 + 10 CONTINUE + GO TO 30 + 20 ICH=ICH+1 + ICHMAP(I,J)=ICH + 30 CONTINUE + 35 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@TAVGCL: INVALID NUMBER OF CHANNELS') +*---- +* CALCULATION OVER EACH CHANNEL +*---- + IF(IMPX.GT.0)WRITE(IOUT,1005) + BURN0(:NCH,:NB)=0.0 + BURN1(:NCH,:NB)=0.0 + ICH=0 + PNUM=0.0D0 + PDEN=0.0D0 + DO 45 J=1,NY + DO 40 I=1,NX + IF(ICHMAP(I,J).EQ.0)GOTO 40 + ICH=ICH+1 +* POWER-SHAPE + DO IB=1,NB + IF(POWC(ICH).EQ.0.0) CALL XABORT('TAVGCL: ZERO CHANNEL POWER.') + PSI(IB)=ARP*(POWB(ICH,IB)/POWC(ICH))+(1.-ARP)*SOLD(ICH,IB) + SNEW(ICH,IB)=PSI(IB) + PNUM=PNUM+(SNEW(ICH,IB)-SOLD(ICH,IB))**2 + PDEN=PDEN+SNEW(ICH,IB)**2 + IGAR(IB)=IVECT(BZONE(ICH),IB) + ENDDO + IBSH=ABS(NSCH(ICH)) +* INTEGRATION LIMITS + CALL TAVGLM(NB,IBSH,BVAL(BZONE(ICH)),PSI,B0,B1,IGAR,NSCH(ICH)) + DO IB=1,NB + BURN0(ICH,IB)=B0(IB) + BURN1(ICH,IB)=B1(IB) + ENDDO + IF(IMPX.GE.3) THEN +* PRINT BURNUP LIMITS + WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH + WRITE(CHANX,'(A2)') (NAMX(I)) + WRITE(CHANY,'(A2)') (NAMY(J)) + WRITE(IOUT,1000)TEXT,CHANY,CHANX,NSCH(ICH) + WRITE(IOUT,1001)'B0',(B0(IB),IB=1,NB) + WRITE(IOUT,1001)'B1',(B1(IB),IB=1,NB) + ENDIF + 40 CONTINUE + 45 CONTINUE +* AXIAL-SHAPE ERROR + EPS=REAL(SQRT(PNUM/PDEN)) +*---- +* PRINT INFORMATION +*---- + IF(IMPX.GT.0)WRITE(IOUT,1002)EPS,ARP + IF(IMPX.GE.3) THEN +* PRINT SHAPE + WRITE(IOUT,1003) + DO ICH=1,NCH + WRITE(TEXT,'(A6,I3.3)')'CHAN #',ICH + WRITE(IOUT,1004)TEXT,(SNEW(ICH,IB),IB=1,NB) + ENDDO + ENDIF +*---- +* STORE INFORMATION +*---- + CALL LCMPUT(IPMAP,'BURN-BEG',NCH*NB,2,BURN0) + CALL LCMPUT(IPMAP,'BURN-END',NCH*NB,2,BURN1) + CALL LCMPUT(IPMAP,'EPS-AX',1,2,EPS) + CALL LCMPUT(IPMAP,'AX-SHAPE',NCH*NB,2,SNEW) + DEALLOCATE(ICHMAP) + RETURN +* + 1000 FORMAT(/5X,A12,5X,'NAME:',1X,A2,A2, + 1 5X,'REFUELLING SCHEME:',1X,I2) + 1001 FORMAT(A3,12(F8.1,1X)) + 1002 FORMAT(1X,'AXIAL-SHAPE ERROR =>',1P,E13.6,5X, + 1 'RELAXATION PARAMETER =>',E13.6/) + 1003 FORMAT(/20X,'** AXIAL SHAPE OVER EACH', + 1 1X,'CHANNEL **'/) + 1004 FORMAT(1X,A10,(2X,12(F6.4,1X))) + 1005 FORMAT(/1X,'** COMPUTING BURNUP INTEG', + 1 'RATION',1X,'LIMITS **'/) + END diff --git a/Donjon/src/TAVGEX.f b/Donjon/src/TAVGEX.f new file mode 100644 index 0000000..34a4f4e --- /dev/null +++ b/Donjon/src/TAVGEX.f @@ -0,0 +1,109 @@ +*DECK TAVGEX + SUBROUTINE TAVGEX(IPMAP,IPPOW,NCH,NCOMB,NX,NY,NZ,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the core-average exit burnup and channel refuelling rates. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* IPPOW pointer to power information. +* NCH number of reactor channels. +* NCOMB number of combustion zones. +* NX number of elements along x-axis in fuel map. +* NY number of elements along y-axis in fuel map. +* NZ number of elements along z-axis in fuel map. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP,IPPOW + INTEGER NCH,NCOMB,NX,NY,NZ,IMPX +*---- +* LOCAL VARIABLES +*---- + PARAMETER(IOUT=6) + INTEGER MIX(NX*NY*NZ),BZONE(NCH),NSCH(NCH),NAMX(NX),NAMY(NY) + REAL BVAL(NCOMB),RATE(NCH),POWC(NCH) + DOUBLE PRECISION SUMR,SUMB + CHARACTER TEXT*12,CHANX*2,CHANY*2 +*---- +* RECOVER INFORMATION +*---- + MIX(:NX*NY*NZ)=0 + CALL LCMGET(IPMAP,'BMIX',MIX) +* CHANNEL POWERS + POWC(:NCH)=0.0 + CALL LCMGET(IPPOW,'POWER-CHAN',POWC) +* REFUELLING SCHEME + NSCH(:NCH)=0 + CALL LCMGET(IPMAP,'REF-SCHEME',NSCH) +* AVERAGE EXIT BURNUPS + BVAL(:NCOMB)=0.0 + CALL LCMGET(IPMAP,'BURN-AVG',BVAL) +* COMBUSTION-ZONE INDEX + BZONE(:NCH)=0 + CALL LCMGET(IPMAP,'B-ZONE',BZONE) +* CHANNEL NAMES + NAMX(:NX)=0 + CALL LCMGET(IPMAP,'XNAME',NAMX) + NAMY(:NY)=0 + CALL LCMGET(IPMAP,'YNAME',NAMY) +*---- +* CALCULATION OVER EACH CHANNEL +*---- + IF(IMPX.GT.0)WRITE(IOUT,1000) + RATE(:NCH)=0.0 + IEL=0 + ICH=0 + SUMR=0.0D0 + SUMB=0.0D0 + DO 15 J=1,NY + DO 10 I=1,NX + IEL=IEL+1 + IF(MIX(IEL).EQ.0)GOTO 10 + ICH=ICH+1 +* REFUELLING RATE + RATE(ICH)=POWC(ICH)/BVAL(BZONE(ICH)) + SUMR=SUMR+RATE(ICH) + SUMB=SUMB+BVAL(BZONE(ICH))*RATE(ICH) + IF(IMPX.LT.4)GOTO 10 +* PRINT RATE + WRITE(TEXT,'(A9,I3.3)')'CHANNEL #',ICH + WRITE(CHANX,'(A2)') (NAMX(I)) + WRITE(CHANY,'(A2)') (NAMY(J)) + WRITE(IOUT,1001)TEXT,CHANY,CHANX,NSCH(ICH),RATE(ICH) + 10 CONTINUE + 15 CONTINUE +* EXIT BURNUP + BEXIT=REAL(SUMB/SUMR) + IF(IMPX.EQ.0)GOTO 20 + IF(BEXIT.LT.10000.)THEN + WRITE(IOUT,1002)BEXIT + ELSE + WRITE(IOUT,1003)BEXIT + ENDIF + 20 CALL LCMPUT(IPMAP,'B-EXIT',1,2,BEXIT) + CALL LCMPUT(IPMAP,'REF-RATE',NCH,2,RATE) + RETURN +* + 1000 FORMAT(/1X,'**',1X,'COMPUTING CHANNEL', + 1 1X,'REFUELLING',1X,'RATES',1X,'**'/) + 1001 FORMAT(5X,A12,5X,'NAME:',1X,A2,A2,5X,'RE', + 1 'F-SCHEME:',1X,I2,5X,'REF-RATE: ',F6.4/) + 1002 FORMAT(/1X,'CORE-AVERAGE EXIT BURNUP', + 1 1X,'=',1X,F7.2,1X,'MW*DAY/T'/) + 1003 FORMAT(/1X,'CORE-AVERAGE EXIT BURNUP', + 1 1X,'=',1X,F8.2,1X,'MW*DAY/T'/) + END diff --git a/Donjon/src/TAVGLM.f b/Donjon/src/TAVGLM.f new file mode 100644 index 0000000..e2b8995 --- /dev/null +++ b/Donjon/src/TAVGLM.f @@ -0,0 +1,118 @@ +*DECK TAVGLM + SUBROUTINE TAVGLM(NB,SHIFT,BCHAN,PSI,BURN0,BURN1,IVECT,NSCH) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the burnup integration limits for a given channel. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal +* +*Author(s): +* D.Rozon, M.Beaudet, D.Sekki, I. Trancart +* +*Parameters: input +* NB number of fuel bundles. +* SHIFT number of bundles to refuel (bundle-shift). +* PSI axial shape over each bundle. +* NSCH refuelling scheme of a given channel. +* BCHAN average exit burnup for a given channel. +* IVECT refuelling pattern vector for a given channel. +* +*Parameters: output +* BURN0 lower burnup integration limit. +* BURN1 upper burnup integration limit. +* +*Parameters: scratch +* DELT incremental burnup over each fuel bundle. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NB,SHIFT,NSCH,IVECT(NB),CHR(NB),AGLIM + REAL BURN0(NB),BURN1(NB),PSI(NB),BCHAN,DELT(NB) +*---- +* LOCAL VARIABLES +*---- + LOGICAL LAXSH +*---- +* SCRATCH STORAGE ALLOCATION +*---- +*---- +* COMPUTE BURNUP LIMITS +*---- + BURN0(:NB)=0.0 + BURN1(:NB)=0.0 + DELT(:NB)=0.0 + LAXSH=.FALSE. + DO 10 IB=1,NB + DELT(IB)=SHIFT*BCHAN*PSI(IB) + IF(IVECT(IB).GT.IB)THEN + LAXSH=.TRUE. + ENDIF + 10 CONTINUE +* Burnup attribution with axial Shuffling + IF(LAXSH)THEN + AGLIM=INT(NB/SHIFT)+1 + CHR(:NB)=AGLIM +* Two loops on bundle cycles (IA) and nmake tesumber of bundles (IB) + DO 25 IA=0,AGLIM-1 + DO 20 IB=1,NB +* Index ordering + IF (NSCH.LT.0) THEN + KK=NB-IB+1 + KV=NB-IVECT(IB)+1 + ELSE + KK=IB + KV=IVECT(IB) + ENDIF +* New fuel + IF(IVECT(IB).EQ.0)THEN + CHR(IB)=0 + BURN0(KK)=0. + BURN1(KK)=DELT(KK) + ELSE +* Compute new burnup if previous bundle cycle done + IF(CHR(IVECT(IB)).EQ.(IA-1))THEN + CHR(IB)=IA + BURN0(KK)=BURN1(KV) + BURN1(KK)=DELT(KK)+BURN1(KV) + ENDIF + ENDIF + 20 CONTINUE + 25 CONTINUE +* Burnup attribution without axial Shuffling +* One loop on number of bundles (IB) + ELSE +* NEGATIVE DIRECTION + IF(NSCH.LT.0)THEN + DO 40 IB=1,NB + KK=NB-IB+1 + KA=NB-IVECT(IB)+1 + IF(IVECT(IB).LE.0)THEN + BURN0(KK)=0. + ELSE + BURN0(KK)=BURN1(KA) + ENDIF + BURN1(KK)=BURN0(KK)+DELT(KK) + 40 CONTINUE +* POSITIVE DIRECTION + ELSE + DO 50 IB=1,NB + IF(IVECT(IB).LE.0)THEN + BURN0(IB)=0. + ELSE + BURN0(IB)=BURN1(IVECT(IB)) + ENDIF + BURN1(IB)=BURN0(IB)+DELT(IB) + 50 CONTINUE + ENDIF + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + RETURN + END diff --git a/Donjon/src/THM.f b/Donjon/src/THM.f new file mode 100644 index 0000000..4917d83 --- /dev/null +++ b/Donjon/src/THM.f @@ -0,0 +1,1489 @@ +*DECK THM + SUBROUTINE THM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Simplified thermal-hydraulics module. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert, P. Gallet and V. Salino +* 02/2025: C. HUET - Modifications to include pressure drop calculation +* 08/2025: M.Bellier & R. Guasch modifified to include : +* - drift-flux model +* - variable axial properties +* +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The THM: module specification is: +* THERMO MAPFL := THM: [ THERMO ] MAPFL :: (descthm) ; +* where +* THERMO : name of the \emph{thermo) object that will be created or updated +* by the THM: module. Object \emph{thermo} contains thermal-hydraulics +* information set or computed by THM: in transient or in permanent +* conditions such as the distribution of the enthalpy, the pressure, the +* velocity, the density and the temperatures of the coolant for all the +* channels in the geometry. It also contains all the values of the fuel +* temperatures in transient or in permanent conditions according to the +* discretisation chosen for the fuel rods. +* MAPFL : name of the \emph{map} object containing fuel regions description +* and local parameter informations. +* (descthm) : structure describing the input data to the THM: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6,PI=3.141592654,ZKILO=1.0E3) + PARAMETER(IMAXO=1000,JMAXO=100,KMAXO=200,NMAXO=40,MAXRAD=10) + PARAMETER(DTEMPR=5.0,DTEMPT=40.0,DPRESS=4.0) + CHARACTER TEXT*40,TEXT12*12,HSIGN*12,PNAME*12,TXTDIR*12,HSMG*131, + > UCONDF*12,UCONDC*12,SNAME*32,SCOMP*32,FNAME*32,FCOMP*32 + INTEGER ISTATE(NSTATE),TIMEIT,ITIME + REAL STATE(NSTATE),DTIME,KHGAP,KHCONV,WTEFF + REAL POULET,HX(IMAXO),HY(JMAXO),HZ(KMAXO) + REAL RPRAD(MAXRAD),FPRAD(MAXRAD),TERP(MAXRAD) + DOUBLE PRECISION DFLOT,DSUM + LOGICAL LPRAD + TYPE(C_PTR) IPTHM,IPMAP,JPMAP,KPMAP,JPTHM,KPTHM,LPTHM,MPTHM, + > KPTHMI,LPTHMI,MPTHMI +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NUM,IREFSC + REAL, ALLOCATABLE, DIMENSION(:) :: XX,YY,ZZ,BURN,BURN2,PW,FRO, + 1 FNFUCST,FNTGCST,FRACPU + REAL, ALLOCATABLE, DIMENSION(:) :: FPOWER,KCONDF,KCONDC,TIMESR, + 1 TPOWER,PFORM,DTERP + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XBURN,POW,TCOMB,DCOOL, + 1 TCOOL,TSURF,PCOOL,HCOOL + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: RAD + DOUBLE PRECISION ARF,ARCI,ARCE,DARF,DARC + REAL, ALLOCATABLE, DIMENSION(:,:) :: VAL,RVAL + REAL, ALLOCATABLE, DIMENSION(:) :: ACOOL,PCH,HD,FFUEL,FCOOL + REAL, ALLOCATABLE, DIMENSION(:) :: RAPCOOL,RAPFUEL,PM + REAL, ALLOCATABLE, DIMENSION(:,:) :: FNFU,FNTG +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.NE.2)CALL XABORT('@THM: 2 PARAMETERS EXPECTED.') + IPTHM=KENTRY(1) + IPMAP=KENTRY(2) + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@THM:' + 1 //' LCM OBJECT EXPECTED AT FIRST LHS.') + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@THM:' + 1 //' LCM OBJECT EXPECTED AT SECOND LHS.') + CALL LCMGTC(IPMAP,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP')THEN + TEXT=HENTRY(2) + CALL XABORT('@THM: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_MAP EXPECTED.') + ENDIF +*---- +* RECOVER L_MAP STATE-VECTOR +*---- + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NPARM=ISTATE(8) + NSIMS=ISTATE(13) + ALLOCATE(FNFUCST(NCH),FNTGCST(NCH),FRACPU(NCH)) +*---- +* READ DATA +*---- + IMPX=1 + ITIME=0 + DTIME=0.0 + FPUISS=0.974 + CFLUX=2.0E+6 + SPEED=0.0 + TINLET=0.0 + POULET=0.0 + POROS=0.05 + ICONDF=0 + ICONDC=0 + IHGAP=0 + IHCONV=0 + IFRCDI=0 + ISUBM=1 + RC=0.0 + RIG=0.0 + RGG=0.0 + RTG=0.0 + PITCH=0.0 + MAXIT1=50 + MAXIT2=50 + MAXIT3=50 + IFLUID=0 + IFUEL=0 + IGAP=0 + IPRES=0 + IDFM=0 + ERMAXT=1.0 + ERMAXC=1.0E-3 + NFD=5 + NDTOT=8 + NPRAD=0 + TIMEIT=0 + NPOWER=0 + RELAX=1.0 + RTIME=0.0 + WTEFF=5.0/9.0 ! Rowlands weighting factor + EPSR=0.0 + THETA=0.0 + UCONDF='CELSIUS' + UCONDC='CELSIUS' + TPOW=0.0 + FNFUCST(:NCH)=1.0 + FNTGCST(:NCH)=0.0 + FRACPU(:NCH)=0.0 + IF(JENTRY(1).EQ.1) THEN + CALL LCMGET(IPTHM,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NCH) CALL XABORT('THM: INVALID STATE VECTOR FO' + > //'R IPTHM OPJECT.') + MAXIT1=ISTATE(3) + MAXIT2=ISTATE(4) + MAXIT3=ISTATE(5) + NFD=ISTATE(6) + NDTOT=ISTATE(7) + ITIME=ISTATE(8) + TIMEIT=ISTATE(9) + IHGAP=ISTATE(10) + IHCONV=ISTATE(11) + ICONDF=ISTATE(12) + ICONDC=ISTATE(13) + IFRCDI=ISTATE(14) + ISUBM=ISTATE(15) + IF(ICONDF.EQ.1) NCONDF=ISTATE(16) + IF(ICONDC.EQ.1) NCONDC=ISTATE(17) + NPRAD=ISTATE(18) + IFLUID=ISTATE(20) + IGAP=ISTATE(21) + IPRES=ISTATE(22) + CALL LCMGET(IPTHM,'REAL-PARAM',STATE) + DTIME=STATE(1) + FPUISS=STATE(2) + CFLUX=STATE(3) + SPEED=STATE(4) + POULET=STATE(5) + TINLET=STATE(6) + POROS=STATE(7) + RC=STATE(8) + RIG=STATE(9) + RGG=STATE(10) + RTG=STATE(11) + PITCH=STATE(12) + ERMAXT=STATE(13) + ERMAXC=STATE(14) + RELAX=STATE(15) + RTIME=STATE(16) + IF(IHGAP.EQ.1) KHGAP=STATE(17) + IF(IHCONV.EQ.1) KHCONV=STATE(18) + WTEFF=STATE(19) + TPOW=STATE(20) + EPSR=STATE(22) + THETA=STATE(23) +*---- +* RECOVER CELL-DEPENDENT DATA +*---- + CALL LCMGET(IPTHM,'NB-FUEL',FNFUCST) + CALL LCMGET(IPTHM,'NB-TUBE',FNTGCST) + CALL LCMGET(IPTHM,'FRACT-PU',FRACPU) +*---- +* RECOVER CONDUCTIVITY INFORMATION ON LCM OBJECT THM +*---- + IF(ICONDF.EQ.1) THEN + ALLOCATE(KCONDF(NCONDF+3)) + CALL LCMGET(IPTHM,'KCONDF',KCONDF) + CALL LCMGTC(IPTHM,'UCONDF',12,UCONDF) + ENDIF + IF(ICONDC.EQ.1) THEN + ALLOCATE(KCONDC(NCONDC+1)) + CALL LCMGET(IPTHM,'KCONDC',KCONDC) + CALL LCMGTC(IPTHM,'UCONDC',12,UCONDC) + ENDIF + ENDIF +*---- +* READ INPUT DATA +*---- + IPICK=0 + LPRAD=.FALSE. + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.10)GO TO 60 + 20 IF(ITYP.NE.3)CALL XABORT('@THM: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'EDIT') THEN +* Read printing index + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR EDIT EXPECTED.') + ELSE IF(TEXT.EQ.'TIME') THEN +* Time at beginning of time-step (s). + CALL REDGET(ITYP,NITMA,RTIME,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RTIME EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.2) THEN + DTIME=FLOT + ELSE IF(ITYP.EQ.3) THEN + GO TO 20 + ELSE + CALL XABORT('@THM: REAL FOR DTIME EXPECTED.') + ENDIF + ITIME=1 + ELSE IF(TEXT.EQ.'FLUID') THEN +* Read fluid type + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@THM: CHARACTER FOR FLUID EXPECTED.') + IF(TEXT.EQ.'H2O') THEN + IFLUID=0 + ELSE IF(TEXT.EQ.'D2O') THEN + IFLUID=1 + ELSE IF(TEXT.EQ.'SALT') THEN + IFLUID=2 + CALL REDGET(ITYP,NITMA,FLOT,SNAME,DFLOT) + IF(ITYP.NE.3) THEN + CALL XABORT('@THM: CHARACTER FOR FLUID SALT NAME EXPECTED' + > //'.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,SCOMP,DFLOT) + IF(ITYP.NE.3) THEN + CALL XABORT('@THM: CHARACTER FOR FLUID SALT COMPOSITION' + > //'EXPECTED.') + ENDIF + ELSE + CALL XABORT('@THM: INVALID FLUID TYPE.') + ENDIF + ELSE IF(TEXT.EQ.'FUEL') THEN +* Read fuel type + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@THM: CHARACTER FOR FLUID EXPECTED.') + IF(TEXT.EQ.'UO2') THEN + IFUEL=0 + ELSE IF(TEXT.EQ.'SALT') THEN + IFUEL=1 + CALL REDGET(ITYP,NITMA,FLOT,FNAME,DFLOT) + IF(ITYP.NE.3) THEN + CALL XABORT('@THM: CHARACTER FOR FLUID EXPECTED.') + ENDIF + CALL REDGET(ITYP,NITMA,FLOT,FCOMP,DFLOT) + IF(ITYP.NE.3) THEN + CALL XABORT('@THM: CHARACTER FOR FLUID EXPECTED.') + ENDIF + ELSE + CALL XABORT('@THM: INVALID FUEL TYPE.') + ENDIF + ELSE IF(TEXT.EQ.'FPUISS') THEN +* Coolant power factor + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.2) THEN + FPUISS=FLOT + ELSE + CALL XABORT('@THM: REAL FOR FPUISS EXPECTED.') + ENDIF + ELSE IF(TEXT.EQ.'CRITFL') THEN +* Critical heat flux (W/m^2) + CALL REDGET(ITYP,NITMA,CFLUX,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR CFLUX EXPECTED.') + ELSE IF(TEXT.EQ.'CWSECT') THEN +* Core coolant section (m^2) + CALL REDGET(ITYP,NITMA,CWSECT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR CWSECT EXPECTED.') +* Coolant flow (m^3/h) + CALL REDGET(ITYP,NITMA,FLOW,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR FLOW EXPECTED.') + SPEED=FLOW/(3600.0*CWSECT) + ELSE IF(TEXT.EQ.'INLET-Q') THEN +* Core coolant section (m^2) + IF((POULET.EQ.0.0).OR.(TINLET.EQ.0.0)) CALL XABORT('@THM: INLE' + > //'T INFORMATION NOT SET BEFORE USING INLET-Q.') + CALL REDGET(ITYP,NITMA,CWSECT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR CWSECT EXPECTED.') +* Inlet mass flow rate (kg/s) + CALL REDGET(ITYP,NITMA,QFLUID,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR QFLUID EXPECTED.') + IF(IFLUID.EQ.0) THEN + CALL THMPT(POULET,TINLET,RHOL,R2,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(POULET,TINLET,RHOL,R2,R3,R4,R5) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(SNAME,SCOMP,TINLET,RHOL,R2,R3,R4,R5,IMPX) + ENDIF + SPEED=QFLUID/(CWSECT*RHOL) + ELSE IF(TEXT.EQ.'SPEED') THEN +* Coolant velocity (m/s) + CALL REDGET(ITYP,NITMA,SPEED,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR SPEED EXPECTED.') + ELSE IF(TEXT.EQ.'INLET') THEN +* The POULET and TINLET informations are used to compute initial +* enthalpy and water density. +* Outlet pressure (Pa) + CALL REDGET(ITYP,NITMA,POULET,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR POULET EXPECTED.') +* Inlet temperature (K) + CALL REDGET(ITYP,NITMA,TINLET,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR TINLET EXPECTED.') + ELSE IF(TEXT.EQ.'PUFR') THEN + ICONDF=0 +* Plutonium mass enrichment + CALL THMINP('PUFR',NCH,FRACPU) + ELSE IF(TEXT.EQ.'POROS') THEN + ICONDF=0 +* Oxyde porosity + CALL REDGET(ITYP,NITMA,POROS,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR POROS EXPECTED.') + ELSE IF(TEXT.EQ.'CONDF') THEN + IF(ICONDF.EQ.1)DEALLOCATE(KCONDF) + ICONDF=1 +* Fuel conductivity expressed as a function of fuel temperature +* (function = polynomial + inverse term) + CALL REDGET(ITYP,NCONDF,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR CONDF EXPECTED.') + IF(NCONDF.LT.0)CALL XABORT('@THM: NCONDF MUST BE LARGER OR ' + > //'EQUAL TO 0.') + ALLOCATE(KCONDF(NCONDF+3)) + DO I=1,NCONDF+1 + CALL REDGET(ITYP,NITMA,KCONDF(I),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR KCONDF EXPECTED.') + ENDDO + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@THM: CHARACTER DATA EXPECTED (INV, ' + > //'CELSIUS OR KELVIN) IN CONDF STATEMENT.') + IF(TEXT12.EQ.'INV') THEN + CALL REDGET(ITYP,NITMA,KCONDF(NCONDF+2),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR INV EXPECTED.') + CALL REDGET(ITYP,NITMA,KCONDF(NCONDF+3),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR REF EXPECTED.') + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + ELSE + KCONDF(NCONDF+2)=0.0 ! Coefficient for the inverse term + KCONDF(NCONDF+3)=-273.15 ! Reference for the inverse term + ENDIF + IF((TEXT12.NE.'CELSIUS').AND.(TEXT12.NE.'KELVIN')) THEN + CALL XABORT('@THM: UNIT KEYWORD EXPECTED (CELSIUS OR ' + > //'KELVIN) IN CONDF STATEMENT.') + ENDIF + UCONDF=TEXT12 + ELSE IF(TEXT.EQ.'CONDC') THEN + IF(ICONDC.EQ.1)DEALLOCATE(KCONDC) + ICONDC=1 +* Clad conductivity expressed as a polynomial of clad temperature + CALL REDGET(ITYP,NCONDC,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR CONDC EXPECTED.') + IF(NCONDC.LT.0)CALL XABORT('@THM: NCONDC MUST BE LARGER OR ' + > //'EQUAL TO 0.') + ALLOCATE(KCONDC(NCONDC+1)) + DO I=1,NCONDC+1 + CALL REDGET(ITYP,NITMA,KCONDC(I),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR KCONDC EXPECTED.') + ENDDO + CALL REDGET(ITYP,NITMA,FLOT,UCONDC,DFLOT) + IF((ITYP.NE.3).OR.((UCONDC.NE.'CELSIUS').AND. + > (UCONDC.NE.'KELVIN'))) THEN + CALL XABORT('@THM: UNIT KEYWORD EXPECTED (CELSIUS OR ' + > //'KELVIN) IN CONDC STATEMENT.') + ENDIF + ELSE IF(TEXT.EQ.'HGAP') THEN + IHGAP=1 +* Fixed, user-chosen value of the HGAP (heat exchange coefficient +* of the gap) (W/m^2/K) + CALL REDGET(ITYP,NITMA,KHGAP,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR HGAP EXPECTED.') + ELSE IF(TEXT.EQ.'HCONV') THEN + IHCONV=1 +* Fixed, user-chosen value of the HCONV (heat transfer coefficient +* between clad and fluid) (W/m^2/K) + CALL REDGET(ITYP,NITMA,KHCONV,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR HCONV EXPECTED.') + ELSE IF(TEXT.EQ.'TEFF') THEN +* Surface temperature's weighting factor in effective fuel +* temperature + CALL REDGET(ITYP,NITMA,WTEFF,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR TEFF EXPECTED.') + ELSE IF(TEXT.EQ.'FORCEAVE') THEN +* Force the use of the average value approximation for fuel +* conductivity + IFRCDI=1 + ELSE IF(TEXT.EQ.'MONO') THEN +* one-phase flow model + ISUBM=0 + ELSE IF(TEXT.EQ.'BOWR') THEN +* Bowring's correlation + ISUBM=1 + ELSE IF(TEXT.EQ.'SAHA') THEN +* Saha-Zuber correlation + ISUBM=2 + ELSE IF(TEXT.EQ.'RADIUS') THEN +* Fuel pellet radius (m) + CALL REDGET(ITYP,NITMA,RC,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RC EXPECTED.') +* Internal clad rod radius (m) + CALL REDGET(ITYP,NITMA,RIG,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RIG EXPECTED.') +* External clad rod radius (m) + CALL REDGET(ITYP,NITMA,RGG,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RGG EXPECTED.') +* Guide tube radius (m) + CALL REDGET(ITYP,NITMA,RTG,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RTG EXPECTED.') + ELSE IF(TEXT.EQ.'ASSMB') THEN +* Number of active fuel rods + CALL THMINP('NB-FUEL',NCH,FNFUCST) +* Number of guide tubes + CALL THMINP('NB-TUBE',NCH,FNTGCST) + ELSE IF(TEXT.EQ.'CLUSTER') THEN +* Hexagonal pitch (m) + CALL REDGET(ITYP,NITMA,PITCH,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR PITCH EXPECTED.') +* Number of active fuel pins in cluster + CALL THMINP('NB-FUEL',NCH,FNFUCST) + ELSE IF(TEXT.EQ.'CONV') THEN +* Number of conduction iterations + CALL REDGET(ITYP,MAXIT1,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR MAXIT1 EXPECTED.') +* Number of center-pellet iterations + CALL REDGET(ITYP,MAXIT2,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR MAXIT2 EXPECTED.') +* Number of flow iterations + CALL REDGET(ITYP,MAXIT3,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR MAXIT3 EXPECTED.') +* Temperature maximum error (K) + CALL REDGET(ITYP,NITMA,ERMAXT,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR ERMAXT EXPECTED.') +* maximum relative error for the calculation of the properties +* in the coolant (pressure, enthalpy, density, velocity,...) + CALL REDGET(ITYP,NITMA,ERMAXC,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR ERMAXC EXPECTED.') + ELSE IF(TEXT.EQ.'RODMESH') THEN +* Number of discretisation points in fuel + CALL REDGET(ITYP,NFD,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR NFD EXPECTED.') +* Number of discretisation points in fuel rod (fuel+cladding) + CALL REDGET(ITYP,NDTOT,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR NDTOT EXPECTED.') + ELSE IF(TEXT.EQ.'RELAX') THEN +* Relaxation parameter + CALL REDGET(ITYP,NITMA,RELAX,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RELAX EXPECTED.') + ELSE IF(TEXT.EQ.'RAD-PROF') THEN +* Set radial power profile + NPRAD=0 + LPRAD=.TRUE. + 30 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.3)GO TO 20 + NPRAD=NPRAD+1 + RPRAD(NPRAD)=FLOT + IF(NPRAD.GT.MAXRAD) CALL XABORT('@THM: MAXRAD OVERFLOW.') + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RAD-PROF-X EXPECTED.') + IF(RPRAD(NPRAD).LT.0.0)CALL XABORT('@THM: R TOO SMALL.') + IF(RPRAD(NPRAD).GT.RC)CALL XABORT('@THM: R TOO LARGE.') + CALL REDGET(ITYP,NITMA,FPRAD(NPRAD),TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR RAD-PROF-F EXPECTED.') + GO TO 30 + ELSE IF(TEXT.EQ.'POWER-LAW') THEN +* The total power in W generated in the fuel is defined as +* T-POWER*TIME-LAW(t). + CALL REDGET(ITYP,NITMA,TPOW,TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR T-POWER EXPECTED.') + CALL REDGET(ITYP,NPOWER,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER VALUE EXPECTED.') + ALLOCATE(TIMESR(NPOWER),TPOWER(NPOWER)) + DO I=1,NPOWER + CALL REDGET(ITYP,NITMA,TIMESR(I),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR TIME EXPECTED.') + CALL REDGET(ITYP,NITMA,TPOWER(I),TEXT12,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR POWER EXPECTED.') + ENDDO + CALL LCMPUT(IPTHM,'TIME-SR1',NPOWER,2,TIMESR) + CALL LCMPUT(IPTHM,'POWER-SR1',NPOWER,2,TPOWER) + DEALLOCATE(TPOWER,TIMESR) + ELSE IF(TEXT.EQ.'F-RUG') THEN +* Rugosity of the fuel rod + CALL REDGET(ITYP,NITMA,EPSR,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR F-RUG EXPECTED.') + ELSE IF(TEXT.EQ.'THETA') THEN +* Angle of the fuel channel + CALL REDGET(ITYP,NITMA,THETA,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR THETA EXPECTED.') + ELSE IF(TEXT.EQ.'PDROP') THEN +* Pressure drop identification + CALL REDGET(ITYP,IPRES,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR IPRES EXPECTED.') + ELSE IF(TEXT.EQ.'DFM') THEN +* Drift Flux Model identification + CALL REDGET(ITYP,IDFM,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@THM: INTEGER FOR IDFM EXPECTED.') + ELSE IF(TEXT.EQ.'SET-PARAM') THEN +* Reset a global parameter + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@THM: CHARACTER NAME EXPECTED.') + CALL REDGET(ITYP,NITMA,VALUE,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@THM: REAL FOR VALUE EXPECTED.') + JPMAP=LCMGID(IPMAP,'PARAM') + DO 40 IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + CALL LCMGET(KPMAP,'P-TYPE',ITYPE) + IF(ITYPE.EQ.1) THEN + IF(PNAME.EQ.TEXT) THEN + CALL LCMPUT(KPMAP,'P-VALUE',1,2,VALUE) + IF(IMPX.GT.0) WRITE(6,500) PNAME,VALUE + GO TO 10 + ELSE + GO TO 40 + ENDIF + ELSE IF(ITYPE.EQ.2) THEN + CALL XABORT('@THM: CANNOT RESET LOCAL PARAMETER: '//TEXT) + ENDIF + 40 CONTINUE + CALL XABORT('@THM: GLOBAL PARAMETER NAME NOT FOUND: '//TEXT) + ELSE IF(TEXT.EQ.';') THEN + GO TO 60 + ELSE IF(TEXT.EQ.'PICK') THEN + IPICK=1 + GO TO 60 + ELSE + CALL XABORT('@THM: INVALID KEYWORD: '//TEXT//'.') + ENDIF + GO TO 10 +*---- +* TEST DATA INPUT +*---- + 60 IF(TINLET.LE.273.15) CALL XABORT('@THM: INLET TEMPERATURE MUST BE' + > //' HIGHER THAN 273.15K.') + IF(SPEED.EQ.0.0) CALL XABORT('@THM: ZERO COOLANT SPEED.') + IF(POULET.EQ.0.0) CALL XABORT('@THM: ZERO OUTLET PRESSURE.') + IF(RC.EQ.0.0) CALL XABORT('@THM: ZERO FUEL PELLET RADIUS.') + IF(RIG.EQ.0.0) CALL XABORT('@THM: ZERO INTERNAL CLAD ROD RADIUS.') + IF(RGG.EQ.0.0) CALL XABORT('@THM: ZERO EXTERNAL CLAD ROD RADIUS.') + IF(NDTOT.GT.NMAXO) CALL XABORT('@THM: NFD OVERFLOW, TOO MANY FUE' + > //'L DOMAINS') + IF(NDTOT.LT.8) CALL XABORT('@THM: NDTOT MUST AT LEAST BE EQUAL T' + > //'O 8') + IF(NFD.LT.4) CALL XABORT('@THM: NFD MUST AT LEAST BE EQUAL TO 4') + IF(NFD.GE.NDTOT) CALL XABORT('@THM: NFD MUST BE LOWER THAN NDTO' + > //'T.') + IF((RELAX.LE.0.0).OR.(RELAX.GT.1.0)) CALL XABORT('@THM: RELAX ' + > //'PARAMETER EXPECTED BETWEEN 0<RELAX<=1.') + IF((WTEFF.LT.0.0).OR.(WTEFF.GT.1.0)) CALL XABORT('@THM: WTEFF ' + > //'PARAMETER EXPECTED BETWEEN 0<=WTEFF<=1.') + IF(ITIME.EQ.1) RELAX=1.0 + IF((RC.NE.RIG).AND.(IFUEL.EQ.1)) CALL XABORT('@THM: WITH MOLTEN' + > //' SALT FUEL INNER CLAD RADIUS MUST BE EQUAL TO FUEL RADIUS') +*---- +* PRINT CHANNEL-DEPENDENT DATA +*---- + IF(IMPX.GT.1) THEN + WRITE(6,'(/28H THM: CHANNEL-DEPENDENT DATA)') + I1=1 + DO I=1,(NCH-1)/8+1 + I2=I1+7 + IF(I2.GT.NCH) I2=NCH + WRITE(6,'(//8H CHANNEL,8(I8,6X,1H|))') (J,J=I1,I2) + WRITE(6,'(8H NB-FUEL,8(F10.2,4X,1H|))') (FNFUCST(J),J=I1,I2) + WRITE(6,'(8H NB-TUBE,8(F10.2,4X,1H|))') (FNTGCST(J),J=I1,I2) + WRITE(6,'(8H PUFR ,8(1P,E13.4,2H |))') (FRACPU(J),J=I1,I2) + I1=I1+8 + ENDDO + ENDIF +*---- +* SET POWER DISTRIBUTION +*---- + ALLOCATE(FRO(NFD-1)) + IF(NPRAD.EQ.0) THEN + FRO(:NFD-1)=1.0 + ELSE + IF(.NOT.LPRAD) THEN + CALL LCMGET(IPTHM,'RAD-PROF_R',RPRAD) + CALL LCMGET(IPTHM,'RAD-PROF_F',FPRAD) + ELSE + CALL LCMPUT(IPTHM,'RAD-PROF_R',NPRAD,2,RPRAD) + CALL LCMPUT(IPTHM,'RAD-PROF_F',NPRAD,2,FPRAD) + ENDIF + DAR1=0.0 + DELT=0.5*RC**2/REAL(NFD-1) + DO IM=1,NFD-1 + DAR2=DAR1+DELT + RADM=SQRT(DAR1+DAR2) + CALL ALTERP(.FALSE.,NPRAD,RPRAD(1),RADM,.FALSE.,TERP(1)) + DSUM=0.0D0 + DO J=1,NPRAD + DSUM=DSUM+TERP(J)*FPRAD(J) + ENDDO + FRO(IM)=REAL(DSUM) + DAR1=DAR2 + ENDDO + ENDIF + IF(IMPX.GT.1) WRITE(6,480) (FRO(IM),IM=1,NFD-1) +*---- +* RECOVER GEOMAP STATE-VECTOR +* ISTATE(1): 7 = XYZ, 9 = HEXZ +* In 3d hexagonal, NY=0, but THM: expects a 3D geometry, so we set +* NY=1 and continue. +*---- + JPMAP=LCMGID(IPMAP,'GEOMAP') + CALL LCMGET(JPMAP,'STATE-VECTOR',ISTATE) + NX=ISTATE(3) + NY=ISTATE(4) + NZ=ISTATE(5) + NEL=ISTATE(6) + IF((ISTATE(1).EQ.9).AND.(NY.EQ.0)) NY=1 + IF(NX.GT.IMAXO) CALL XABORT('@THM: NX OVERFLOW.') + IF(NY.GT.JMAXO) CALL XABORT('@THM: NY OVERFLOW.') + IF(NZ.GT.KMAXO) CALL XABORT('@THM: NZ OVERFLOW.') + ALLOCATE(PCH(NZ),ACOOL(NZ),HD(NZ)) + ALLOCATE(FNFU(NCH,NZ),FNTG(NCH,NZ),RAPCOOL(NZ), + > RAPFUEL(NZ),PM(NZ),FFUEL(NZ),FCOOL(NZ)) +*---- +* RECOVER REACTOR MESH IN METER +* The arrays HX, HY, and HZ contain the mesh size in X-, Y-, and +* Z-direction and are used to determine the volume of a mesh, i.e. +* V(I,J,K)=HX(I)*HY(J)*HZ(K) +* For 3D hexagonal, set HX and HY to the square root of the SA surface +* SASS +*---- + ALLOCATE(XX(NX+1),YY(NY+1),ZZ(NZ+1)) + IF(ISTATE(1).EQ.7) THEN + CALL LCMGET(JPMAP,'MESHX',XX) + CALL LCMGET(JPMAP,'MESHY',YY) + ENDIF + CALL LCMGET(JPMAP,'MESHZ',ZZ) + IF(ISTATE(1).EQ.9) THEN + CALL LCMGET(JPMAP,'SIDE',SIDE) + SASS=1.5*SQRT(3.0)*SIDE*SIDE/1.0E4 + DO 70 I=1,NX + HX(I) = SQRT(SASS) + 70 CONTINUE + DO 80 I=1,NY + HY(I) = SQRT(SASS) + 80 CONTINUE + ELSE + DO 90 I=1,NX + HX(I)=(XX(I+1)-XX(I))/100.0 + 90 CONTINUE + DO 100 I=1,NY + HY(I)=(YY(I+1)-YY(I))/100.0 + 100 CONTINUE + ENDIF + DO 110 I=1,NZ + HZ(I)=(ZZ(I+1)-ZZ(I))/100.0 + 110 CONTINUE + DO 120 I=1,NZ+1 + ZZ(I)=ZZ(I)/100.0 + 120 CONTINUE + CALL LCMPUT(IPTHM,'MESHZ',NZ+1,2,ZZ) + DEALLOCATE(ZZ,YY,XX) +*---- +* RECOVER LOCAL PARAMETER INFORMATION FROM L_MAP OBJECT +*---- + ALLOCATE(NUM(NEL),BURN(NCH*NB),PW(NCH*NB)) + CALL LCMGET(IPMAP,'BMIX',NUM) + CALL LCMLEN(IPMAP,'BURN-INST',ILONG,ITYLCM) + IF(ILONG.EQ.NCH*NB) THEN + CALL LCMGET(IPMAP,'BURN-INST',BURN) + ELSE + CALL LCMLEN(IPMAP,'BURN-BEG',ILONG,ITYLCM) + IF(ILONG.NE.NCH*NB) CALL XABORT('@THM: MISSING BURNUP INFO ON ' + > //'FUELMAP.') + ALLOCATE(BURN2(NCH*NB)) + CALL LCMGET(IPMAP,'BURN-BEG',BURN) + CALL LCMGET(IPMAP,'BURN-END',BURN2) + DO I=1,NCH*NB + BURN(I)=(BURN(I)+BURN2(I))/2.0 + ENDDO + DEALLOCATE(BURN2) + ENDIF + CALL LCMLEN(IPTHM,'POWER-SR1',NPOWER,ITYLCM) + IF(NPOWER.NE.0) THEN +* USE POWER TIME LAW + IF(IMPX.GT.0) WRITE(6,*) 'THM: T-POWER = ',TPOW,' W' + IF(TPOW.EQ.0.0) CALL XABORT('@THM: T-POWER NOT DEFINED.') + IF(NCH.NE.1) CALL XABORT('@THM: NCH=1 EXPECTED.') + ALLOCATE(TIMESR(NPOWER),TPOWER(NPOWER),DTERP(NPOWER)) + CALL LCMGET(IPTHM,'TIME-SR1',TIMESR) + CALL LCMGET(IPTHM,'POWER-SR1',TPOWER) + IF(ITIME.EQ.0) THEN + CALL ALTERP(.FALSE.,NPOWER,TIMESR(1),RTIME,.FALSE.,DTERP(1)) + ELSE + IF(DTIME.EQ.0.0) CALL XABORT('@THM: DTIME NOT DEFINED.') + CALL ALTERI(.FALSE.,NPOWER,TIMESR(1),RTIME,RTIME+DTIME, + > DTERP(1)) + DO J=1,NPOWER + DTERP(J)=DTERP(J)/DTIME + ENDDO + ENDIF + DPOW=0.0D0 + DO J=1,NPOWER + DPOW=DPOW+DTERP(J)*TPOWER(J) + ENDDO + DPOW=DPOW*TPOW + DEALLOCATE(DTERP,TPOWER,TIMESR) + CALL LCMLEN(IPMAP,'AXIAL-FPW',ILONG,ITYLCM) + IF(ILONG.NE.NB) CALL XABORT('THM: NO AXIAL-FPW ON THE FUELMAP') + ALLOCATE(PFORM(NB)) + CALL LCMGET(IPMAP,'AXIAL-FPW',PFORM) + DO I=1,NB + PW(I)=DPOW*PFORM(I)*1.0E-3 + ENDDO + DEALLOCATE(PFORM) + ELSE +* RECOVER POWER FROM FUELMAP + CALL LCMGET(IPMAP,'BUND-PW',PW) + ENDIF + IF(IMPX.GT.2) THEN + PTOT=0.0 + DO I=1,NCH*NB + PTOT=PTOT+PW(I) + ENDDO + ENDIF +*---- +* REBUILD LOCAL PARAMETER INFORMATION FOR THM +*---- + ALLOCATE(IREFSC(NCH)) + CALL LCMLEN(IPMAP,'REF-SCHEME',ILONG,ITYLCM) + IF(ILONG.EQ.NCH) THEN + CALL LCMGET(IPMAP,'REF-SCHEME',IREFSC) + ELSE + IREFSC(:NCH)=1 + ENDIF + ALLOCATE(XBURN(NZ,NX,NY),POW(NZ,NX,NY)) + XBURN(:NZ,:NX,:NY)=0.0 + POW(:NZ,:NX,:NY)=0.0 + ICH=0 + DO 165 IY=1,NY + DO 160 IX=1,NX + IEL=(IY-1)*NX+IX + DO 130 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).NE.0) GO TO 140 + 130 CONTINUE + GO TO 160 + 140 ICH=ICH+1 + IB=0 + DO 150 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).EQ.0) GO TO 150 + IB=IB+1 + IMA=(IB-1)*NCH+ICH + IF(IREFSC(ICH).GT.0) THEN + XBURN(IZ,IX,IY)=BURN(IMA) + POW(IZ,IX,IY)=PW(IMA)*1.0E3 + ELSE + XBURN(NZ-IZ+1,IX,IY)=BURN(IMA) + POW(NZ-IZ+1,IX,IY)=PW(IMA)*1.0E3 + ENDIF + 150 CONTINUE + IF(IB.NE.NB) CALL XABORT('@THM: INVALID NUMBER OF BUNDLES.') + 160 CONTINUE + 165 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@THM: INVALID NUMBER OF CHANNELS.') + DEALLOCATE(PW,BURN) +*---- +* RECOVER AVERAGE FUEL TEMPERATURE FIELD FROM THM OBJECT +*---- + ALLOCATE(TCOMB(NZ,NX,NY)) + TCOMB(:NZ,:NX,:NY)=0.0 + JPMAP=LCMGID(IPMAP,'PARAM') + DO 220 IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF(PNAME.EQ.'T-FUEL') THEN + CALL LCMGET(KPMAP,'P-TYPE',ITYPE) + ALLOCATE(VAL(NCH,NB)) + IF(ITYPE.EQ.1) THEN + IF(IMPX.GT.0) WRITE(6,510) 'GLOBAL',PNAME + CALL LCMGET(KPMAP,'P-VALUE',FLOT) + DO 175 ICH=1,NCH + DO 170 IB=1,NB + VAL(ICH,IB)=FLOT + 170 CONTINUE + 175 CONTINUE + ELSE IF(ITYPE.EQ.2) THEN + IF(IMPX.GT.0) WRITE(6,510) 'LOCAL',PNAME + CALL LCMGET(KPMAP,'P-VALUE',VAL) + ENDIF + ICH=0 + DO 215 IY=1,NY + DO 210 IX=1,NX + IEL=(IY-1)*NX+IX + DO 180 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).NE.0) GO TO 190 + 180 CONTINUE + GO TO 210 + 190 ICH=ICH+1 + IB=0 + DO 200 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).EQ.0) GO TO 200 + IB=IB+1 + IF(IREFSC(ICH).GT.0) THEN + TCOMB(IZ,IX,IY)=VAL(ICH,IB) + ELSE + TCOMB(NZ-IZ+1,IX,IY)=VAL(ICH,IB) + ENDIF + 200 CONTINUE + 210 CONTINUE + 215 CONTINUE + DEALLOCATE(VAL) + ENDIF + 220 CONTINUE + DEALLOCATE(IREFSC) +*---- +* TEST TO COMPUTE STEADY-STATE OR TRANSIENT CALCULATION +*---- + IF(ITIME.EQ.0) THEN + GO TO 230 + ELSE IF(ITIME.EQ.1) THEN + GO TO 310 + ELSE + CALL XABORT('@THM: UNEXPECTED VALUE FOR ITIME.') + ENDIF +*---- +* CALL DRIVER FOR STEADY-STATE CALCULATION +*---- +* memory allocation for the steady-state calculation + 230 ALLOCATE(DCOOL(NZ,NX,NY),TCOOL(NZ,NX,NY),TSURF(NZ,NX,NY), + > PCOOL(NZ,NX,NY),HCOOL(NZ,NX,NY),RAD((NDTOT-1),NZ,NX,NY)) + DCOOL(:NZ,:NX,:NY)=0.0 + TCOOL(:NZ,:NX,:NY)=0.0 + TSURF(:NZ,:NX,:NY)=0.0 + PCOOL(:NZ,:NX,:NY)=0.0 + HCOOL(:NZ,:NX,:NY)=0.0 + RAD(:NDTOT-1,:NZ,:NX,:NY)=0.0 +*---- +* COMPUTE FUEL RADII +*---- + ALLOCATE(RVAL((NDTOT-1),NZ)) + IF(JENTRY(1).EQ.0) THEN + WRITE(6,*)'RC,RIG=',RC,RIG +*CGT THERE IS GAP + IF(RC.NE.RIG) THEN + IGAP=0 + ARF=0.5*RC**2 ! at fuel radius + ARCI=0.5*RIG**2 ! at internal clad radius + ARCE=0.5*RGG**2 ! at external clad radius + DARF=ARF/REAL(NFD-1) + DARC=(ARCE-ARCI)/REAL(NDTOT-NFD-2) + DO IEL=1,NZ + RVAL(1,IEL)=0.0 + DO I=1,NFD-1 + RVAL(I+1,IEL)=REAL(SQRT(2.0D0*REAL(I)*DARF)) + ENDDO + DO I=NFD+1,NDTOT-1 + RVAL(I,IEL)=REAL(SQRT(2.0D0*(ARCI+REAL(I-NFD-1)*DARC))) + ENDDO + ENDDO + ELSE +*CGT NO GAP + IGAP=1 + ARF=0.5*RC**2 ! at fuel radius + ARCE=0.5*RGG**2 ! at external clad radius + DARF=ARF/REAL(NFD-1) + DARC=(ARCE-ARF)/REAL(NDTOT-NFD-1) + DO IEL=1,NZ + RVAL(1,IEL)=0.0 + DO I=1,NFD + RVAL(I+1,IEL)=REAL(SQRT(2.0D0*REAL(I)*DARF)) + ENDDO + DO I=NFD+1,NDTOT-1 + RVAL(I,IEL)=REAL(SQRT(2.0D0*(ARF+REAL(I-NFD)*DARC))) + ENDDO + ENDDO + ENDIF + CALL LCMPUT(IPTHM,'REF-RAD',(NDTOT-1)*NZ,2,RVAL) + JPTHM=LCMDID(IPTHM,'HISTORY-DATA') + KPTHM=LCMDID(JPTHM,'TIMESTEP0000') + LPTHM=LCMLID(KPTHM,'CHANNEL',NCH) + ELSE + JPTHM=LCMGID(IPTHM,'HISTORY-DATA') + KPTHM=LCMGID(JPTHM,'TIMESTEP0000') + LPTHM=LCMGID(KPTHM,'CHANNEL') + ENDIF +*---- +* LOOP OVER REACTOR CHANNELS +*---- + ICH=0 + SUMSEC=0.0 + DO 265 IY=1,NY + DO 260 IX=1,NX + IEL=IX+(IY-1)*NX + DO 240 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).NE.0) GO TO 250 + 240 CONTINUE + GO TO 260 + 250 ICH=ICH+1 +*---- +* COMPUTE HYDRAULICS CONSTANTS +* SASS: assembly cross section in m^2 +* RC: fuel pellet radius in m +* RTG: guide tube radius in m +* ACOOL: coolant cross section per assembly in m^2 +* RAPCOOL: assembly over coolant volumic ratio +* RAPFUEL: assembly over fuel volumic ratio +* FCOOL: power density fraction in coolant. +* FFUEL: power density fraction in fuel. +* PCH: heating perimeter in m +* PM: perimeter in contact with flow in m +* HD: hydraulic diameter of one assembly in m +* SPEED: inlet flow velocity in m/s +*---- + IF(FNFUCST(ICH).EQ.0.0) GO TO 260 + SASS=HX(IX)*HY(IY) + DO K=1, NZ + FNFU(ICH,K)=FNFUCST(ICH) + FNTG(ICH,K)=FNTGCST(ICH) + IF(PITCH.EQ.0.0) THEN +* PWR ASSEMBLY + ACOOL(K)=SASS-FNFU(ICH,K)*PI*RGG*RGG-FNTG(ICH,K)*PI*RTG*RTG + RAPCOOL(K)=SASS/ACOOL(K) + PCH(K)=FNFU(ICH,K)*2.0*PI*RGG + PM=PCH(K)+FNTG(ICH,K)*2.0*PI*RTG + SUMSEC=SUMSEC+ACOOL(K) + ELSE +* CANDU CLUSTER + ATOTHEX=3.0*PITCH**2.0*(3.0)**0.5/2.0 + ATIGEHEX=3.0*PI*RGG*RGG + ACOOL(K)=ATOTHEX-ATIGEHEX + PM(K)=6.0*PI*RGG + PCH(K)=PM(K) + RAPCOOL(K)=3.0*SASS/(FNFU(ICH,K)*ACOOL(K)) + SUMSEC=SUMSEC+FNFU(ICH,K)*ACOOL(K)/3.0 + ENDIF + RAPFUEL(K)=SASS/(FNFU(ICH,K)*PI*RC*RC) + FCOOL(K)=(1.0-FPUISS)*RAPCOOL(K) + FFUEL(K)=FPUISS*RAPFUEL(K) + HD(K)=4.0*ACOOL(K)/PM(K) + IF(HD(K).LE.0.) CALL XABORT('THM: NEGATIVE HYDRAULIC + >DIAMETER(1).') + ENDDO +*---- +* RECOVER STEADY-STATE RADII +*---- + IF(JENTRY(1).EQ.0) THEN + RAD(:,:,IX,IY)=RVAL(:,:) + ELSE IF(JENTRY(1).EQ.1) THEN + MPTHM=LCMGIL(LPTHM,ICH) + CALL LCMGET(MPTHM,'RADII',RAD(1,1,IX,IY)) + ENDIF +*---- +* EXECUTION OF THE STEADY-STATE DRIVER PROGRAM +*---- + MPTHM=LCMDIL(LPTHM,ICH) + CALL THMDRV(MPTHM,IMPX,IX,IY,NZ,XBURN(1,IX,IY),SASS,HZ,CFLUX, + > POROS,FNFU(ICH,:),NFD,NDTOT,IFLUID,SNAME,SCOMP,IGAP,IFUEL,FNAME, + > FCOMP,FCOOL,FFUEL,ACOOL, + > HD,PCH,RAD(1,1,IX,IY),MAXIT1,MAXIT2,ERMAXT,SPEED,TINLET,POULET, + > FRACPU(ICH),ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC,KCONDC, + > UCONDC,IHGAP,KHGAP,IHCONV,KHCONV,WTEFF,IFRCDI,ISUBM,FRO, + > POW(1,IX,IY),IPRES,IDFM,TCOMB(1,IX,IY),DCOOL(1,IX,IY), + > TCOOL(1,IX,IY),TSURF(1,IX,IY),HCOOL(1,IX,IY),PCOOL(1,IX,IY)) + 260 CONTINUE + 265 CONTINUE + IF(IMPX.GT.1) WRITE(6,610) SUMSEC,CWSECT + DEALLOCATE(RVAL) + CALL LCMPUT(KPTHM,'TIME',1,2,RTIME) + IF(IMPX.GT.1) WRITE(6,470) 'TIMESTEP0000',RTIME +*---- +* PRINT AVERAGED THERMALHYDRAULICS PROPERTIES OVER THE CORE MAP +*---- + IF(IMPX.GT.1) THEN + CALL THMAVG(IPMAP,IMPX,NX,NY,NZ,NCH,TCOMB,TSURF,DCOOL,TCOOL, + > PCOOL,HCOOL,POW,NSIMS) + ENDIF + DEALLOCATE(RAD,HCOOL) + GO TO 400 +*---- +* CALL DRIVER FOR TRANSIENT CALCULATION +*---- +* memory allocation for the transient calculation + 310 ALLOCATE(TSURF(NZ,NX,NY),TCOOL(NZ,NX,NY),DCOOL(NZ,NX,NY), + > PCOOL(NZ,NX,NY)) + TSURF(:NZ,:NX,:NY)=0.0 + TCOOL(:NZ,:NX,:NY)=0.0 + DCOOL(:NZ,:NX,:NY)=0.0 + PCOOL(:NZ,:NX,:NY)=0.0 +*---- +* RECOVER TIME INDEX AT INITIAL CONDITIONS +*---- + JPTHM=LCMDID(IPTHM,'HISTORY-DATA') + KPTHMI=LCMGID(JPTHM,'TIMESTEP0000') + CALL LCMGET(KPTHMI,'TIME',TIMEPR) + IF(ABS(RTIME-TIMEPR).LE.1.0E-3*DTIME) THEN + TIMEIT=1 + ELSE + DO I=1,TIMEIT + WRITE(TXTDIR,'(8HTIMESTEP,I4.4)') I + KPTHMI=LCMGID(JPTHM,TXTDIR) + CALL LCMGET(KPTHMI,'TIME',TIMEPR) + IF(ABS(RTIME-TIMEPR).LE.1.0E-3*DTIME) THEN + TIMEIT=I+1 + GO TO 315 + ENDIF + ENDDO + WRITE(HSMG,'(45H@THM: UNABLE TO FIND INITIAL CONDITIONS AT T=, + > 1P,E14.4,3H S.)') RTIME + CALL XABORT(HSMG) + ENDIF + 315 LPTHMI=LCMGID(KPTHMI,'CHANNEL') + WRITE(TXTDIR,'(8HTIMESTEP,I4.4)') TIMEIT + KPTHM=LCMDID(JPTHM,TXTDIR) + LPTHM=LCMLID(KPTHM,'CHANNEL',NCH) + IF(IMPX.GT.1) WRITE(6,530) TIMEIT,RTIME,RTIME+DTIME +*---- +* LOOP OVER REACTOR CHANNELS +*---- + ICH=0 + DO 355 IY=1,NY + DO 350 IX=1,NX + IEL=IX+(IY-1)*NX + DO 320 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).NE.0) GO TO 330 + 320 CONTINUE + GO TO 350 + 330 ICH=ICH+1 +*---- +* COMPUTE HYDRAULICS CONSTANTS +*---- + IF(FNFUCST(ICH).EQ.0.0) GO TO 350 + SASS=HX(IX)*HY(IY) + DO K=1, NZ + FNFU(ICH,K)=FNFUCST(ICH) + FNTG(ICH,K)=FNTGCST(ICH) + IF(PITCH.EQ.0.0) THEN +* PWR ASSEMBLY + ACOOL(K)=SASS-FNFU(ICH,K)*PI*RGG*RGG-FNTG(ICH,K)*PI*RTG*RTG + RAPCOOL(K)=SASS/ACOOL(K) + PCH(K)=FNFU(ICH,K)*2.0*PI*RGG + PM=PCH(K)+FNTG(ICH,K)*2.0*PI*RTG + ELSE +* CANDU CLUSTER + ATOTHEX=3.0*PITCH**2.0*(3.0)**0.5/2.0 + ATIGEHEX=3.0*PI*RGG*RGG + ACOOL(K)=ATOTHEX-ATIGEHEX + PM(K)=6.0*PI*RGG + PCH(K)=PM(K) + RAPCOOL(K)=3.0*SASS/(FNFU(ICH,K)*ACOOL(K)) + ENDIF + RAPFUEL(K)=SASS/(FNFU(ICH,K)*PI*RC*RC) + FCOOL(K)=(1.0-FPUISS)*RAPCOOL(K) + FFUEL(K)=FPUISS*RAPFUEL(K) + HD(K)=4.0*ACOOL(K)/PM(K) + IF(HD(K).LE.0.) CALL XABORT('THM: NEGATIVE HYDRAULIC + >DIAMETER(2).') + ENDDO +*---- +* EXECUTION OF THE TRANSIENT DRIVER PROGRAM +*---- + MPTHMI=LCMGIL(LPTHMI,ICH) + MPTHM=LCMDIL(LPTHM,ICH) + CALL THMTRS(MPTHMI,MPTHM,IMPX,IX,IY,NZ,XBURN(1,IX,IY),SASS,HZ, + > DTIME,CFLUX,POROS,FNFU(ICH,:),NFD,NDTOT,IFLUID,SNAME,SCOMP, + > IGAP,IFUEL,FNAME,FCOMP, + > FCOOL,FFUEL,ACOOL,HD,PCH,MAXIT3,MAXIT1,MAXIT2,ERMAXT,ERMAXC, + > SPEED,TINLET,POULET,FRACPU(ICH),ICONDF,NCONDF,KCONDF,UCONDF, + > ICONDC,NCONDC,KCONDC,UCONDC,IHGAP,KHGAP,IHCONV,KHCONV,WTEFF, + > IFRCDI,ISUBM,FRO,POW(1,IX,IY),TCOMB(1,IX,IY),DCOOL(1,IX,IY), + > TCOOL(1,IX,IY),TSURF(1,IX,IY)) + 350 CONTINUE + 355 CONTINUE + CALL LCMPUT(KPTHM,'TIME',1,2,RTIME+DTIME) + IF(IMPX.GT.1) WRITE(6,470) TXTDIR,RTIME+DTIME +*---- +* RECOVER LOCAL PARAMETER INFORMATION COMPUTED BY THMDRV OR THMTRS +*---- + 400 ERRA1=0.0 + ERRA2=0.0 + ERRA3=0.0 + ERRBB=0.0 + ZMINA1=1.0E10 + ZMINA2=1.0E10 + ZMINA3=1.0E10 + ZMINBB=1.0E10 + ZMAXA1=0.0 + ZMAXA2=0.0 + ZMAXA3=0.0 + ZMAXBB=0.0 + RATIOX=0.0 + ALLOCATE(IREFSC(NCH)) + CALL LCMLEN(IPMAP,'REF-SCHEME',ILONG,ITYLCM) + IF(ILONG.EQ.NCH) THEN + CALL LCMGET(IPMAP,'REF-SCHEME',IREFSC) + ELSE + IREFSC(:NCH)=1 + ENDIF + JPMAP=LCMGID(IPMAP,'PARAM') + DO 460 IPAR=1,NPARM + KPMAP=LCMGIL(JPMAP,IPAR) + CALL LCMGTC(KPMAP,'P-NAME',12,PNAME) + IF((PNAME.EQ.'T-FUEL').OR.(PNAME.EQ.'D-COOL').OR. + 1 (PNAME.EQ.'T-COOL').OR.(PNAME.EQ.'T-SURF').OR. + 2 (PNAME.EQ.'P-COOL')) THEN + CALL LCMGET(KPMAP,'P-TYPE',ITYPE) + ALLOCATE(VAL(NCH,NB)) + RELAX0=1.0 + IF(ITYPE.EQ.1) THEN + IF(IMPX.GT.0) WRITE(6,510) 'GLOBAL',PNAME + CALL LCMGET(KPMAP,'P-VALUE',FLOT) + DO 415 ICH=1,NCH + DO 410 IB=1,NB + VAL(ICH,IB)=FLOT + 410 CONTINUE + 415 CONTINUE + ELSE IF(ITYPE.EQ.2) THEN + RELAX0=RELAX + IF(IMPX.GT.0) WRITE(6,510) 'LOCAL',PNAME + CALL LCMGET(KPMAP,'P-VALUE',VAL) + ENDIF + ICH=0 + DO 455 IY=1,NY + DO 450 IX=1,NX + IEL=(IY-1)*NX+IX + DO 420 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).NE.0) GO TO 430 + 420 CONTINUE + GO TO 450 + 430 ICH=ICH+1 + IB=0 + DO 440 IZ=1,NZ + IF(NUM((IZ-1)*NX*NY+IEL).EQ.0) GO TO 440 + IB=IB+1 + FLOT=0.0 + IF(PNAME.EQ.'T-FUEL') THEN + IF(IREFSC(ICH).GT.0) THEN + FLOT=RELAX0*TCOMB(IZ,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ELSE + FLOT=RELAX0*TCOMB(NZ-IZ+1,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ENDIF + IF(ITIME.EQ.0) ERRA1=MAX(ERRA1,ABS(VAL(ICH,IB)-FLOT)) + ZMINA1=MIN(ZMINA1,FLOT) + ZMAXA1=MAX(ZMAXA1,FLOT) + ELSE IF(PNAME.EQ.'D-COOL') THEN + IF(IREFSC(ICH).GT.0) THEN + FLOT=RELAX0*DCOOL(IZ,IX,IY)/ZKILO+(1.0-RELAX0)*VAL(ICH,IB) + ELSE + FLOT=RELAX0*DCOOL(NZ-IZ+1,IX,IY)/ZKILO+(1.0-RELAX0) + > *VAL(ICH,IB) + ENDIF + IF(ITIME.EQ.0) ERRA2=MAX(ERRA2,ABS(VAL(ICH,IB)-FLOT)) + ZMINA2=MIN(ZMINA2,FLOT) + ZMAXA2=MAX(ZMAXA2,FLOT) + ELSE IF(PNAME.EQ.'T-COOL') THEN + IF(IREFSC(ICH).GT.0) THEN + FLOT=RELAX0*TCOOL(IZ,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ELSE + FLOT=RELAX0*TCOOL(NZ-IZ+1,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ENDIF + IF(ITIME.EQ.0) ERRA3=MAX(ERRA3,ABS(VAL(ICH,IB)-FLOT)) + ZMINA3=MIN(ZMINA3,FLOT) + ZMAXA3=MAX(ZMAXA3,FLOT) + ELSE IF(PNAME.EQ.'T-SURF') THEN + IF(IREFSC(ICH).GT.0) THEN + FLOT=RELAX0*TSURF(IZ,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ELSE + FLOT=RELAX0*TSURF(NZ-IZ+1,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ENDIF + IF(ITIME.EQ.0) ERRBB=MAX(ERRBB,ABS(VAL(ICH,IB)-FLOT)) + ZMINBB=MIN(ZMINBB,FLOT) + ZMAXBB=MAX(ZMAXBB,FLOT) + ELSE IF(PNAME.EQ.'P-COOL') THEN + IF(IREFSC(ICH).GT.0) THEN + FLOT=RELAX0*PCOOL(IZ,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ELSE + FLOT=RELAX0*PCOOL(NZ-IZ+1,IX,IY)+(1.0-RELAX0)*VAL(ICH,IB) + ENDIF + IF(ITIME.EQ.0) ERRA4=MAX(ERRBB,ABS(VAL(ICH,IB)-FLOT)) + ZMINA4=MIN(ZMINBB,FLOT) + ZMAXA4=MAX(ZMAXBB,FLOT) + ELSE + CALL XABORT('@THM: INVALID PARAMETER TYPE: '// PNAME//'.') + ENDIF + VAL(ICH,IB)=FLOT + 440 CONTINUE + 450 CONTINUE + 455 CONTINUE + ITYPE=2 + CALL LCMPUT(KPMAP,'P-TYPE',1,1,ITYPE) + CALL LCMPUT(KPMAP,'P-VALUE',NCH*NB,2,VAL) + CALL LCMLEN(IPMAP,'AXIAL-FPW',JLONG,ITYLCM) + DD1=0.0 + DD2=0.0 + IF(JLONG.NE.0) THEN + ALLOCATE(FPOWER(NB)) + IF(JLONG.NE.NB) CALL XABORT('THM: UNABLE TO FIND RECORD AXIA' + 1 //'L-FPW IN THE FUELMAP.') + CALL LCMGET(IPMAP,'AXIAL-FPW',FPOWER) + DO ICH=1,NCH + DO IB=1,NB + DD1=DD1+VAL(ICH,IB)*FPOWER(IB)**2 + DD2=DD2+FPOWER(IB)**2 + ENDDO + ENDDO + DEALLOCATE(FPOWER) + ELSE + ALLOCATE(PW(NCH*NB)) + CALL LCMGET(IPMAP,'BUND-PW',PW) + ITOT=0 + DO IB=1,NB + DO ICH=1,NCH + ITOT=ITOT+1 + DD1=DD1+VAL(ICH,IB)*PW(ITOT)**2 + DD2=DD2+PW(ITOT)**2 + ENDDO + ENDDO + DEALLOCATE(PW) + ENDIF + TMOY0=DD1/DD2 + TEXT12='AVG-'//PNAME(:8) + CALL LCMLEN(IPTHM,TEXT12,KLONG,ITYLCM) + IF(((PNAME.EQ.'T-FUEL').OR.(PNAME.EQ.'T-COOL').OR. + 1 (PNAME.EQ.'P-COOL')).AND.(KLONG.GT.0)) THEN + CALL LCMGET(IPTHM,TEXT12,TMOY0I) + IF(PNAME.EQ.'T-FUEL') THEN + RATIO=ABS(TMOY0/DTEMPR-TMOY0I/DTEMPR) + IF(IMPX.GT.0) WRITE(6,490) TEXT12,TMOY0I,TMOY0,RATIO + RATIOX=MAX(RATIOX,RATIO) + ELSE IF(PNAME.EQ.'T-COOL') THEN + RATIO=ABS(TMOY0/DTEMPT-TMOY0I/DTEMPT) + IF(IMPX.GT.0) WRITE(6,490) TEXT12,TMOY0I,TMOY0,RATIO + RATIOX=MAX(RATIOX,RATIO) + ELSE IF(PNAME.EQ.'P-COOL') THEN + RATIO=ABS(TMOY0/DPRESS-TMOY0I/DPRESS) + IF(IMPX.GT.0) WRITE(6,490) TEXT12,TMOY0I,TMOY0,RATIO + RATIOX=MAX(RATIOX,RATIO) + ENDIF + ENDIF + CALL LCMPUT(IPTHM,TEXT12,1,2,TMOY0) + DEALLOCATE(VAL) + ENDIF + IF(PNAME.EQ.'T-FUEL') THEN + IF(ITIME.EQ.0) CALL LCMPUT(IPTHM,'ERROR-T-FUEL',1,2,ERRA1) + CALL LCMPUT(IPTHM,'MIN-T-FUEL',1,2,ZMINA1) + CALL LCMPUT(IPTHM,'MAX-T-FUEL',1,2,ZMAXA1) + IF(IMPX.GT.0) WRITE(6,520) 'FUEL TEMPERATURE',ERRA1,'K', + 1 ZMINA1,'K',ZMAXA1,'K' + ELSE IF(PNAME.EQ.'D-COOL') THEN + IF(ITIME.EQ.0) CALL LCMPUT(IPTHM,'ERROR-D-COOL',1,2,ERRA2) + CALL LCMPUT(IPTHM,'MIN-D-COOL',1,2,ZMINA2) + CALL LCMPUT(IPTHM,'MAX-D-COOL',1,2,ZMAXA2) + IF(IMPX.GT.0) WRITE(6,520) 'COOLANT DENSITY',ERRA2,'g/cc', + 1 ZMINA2,'g/cc',ZMAXA2,'g/cc' + ELSE IF(PNAME.EQ.'T-COOL') THEN + IF(ITIME.EQ.0) CALL LCMPUT(IPTHM,'ERROR-T-COOL',1,2,ERRA3) + CALL LCMPUT(IPTHM,'MIN-T-COOL',1,2,ZMINA3) + CALL LCMPUT(IPTHM,'MAX-T-COOL',1,2,ZMAXA3) + IF(IMPX.GT.0) WRITE(6,520) 'COOLANT TEMPERATURE',ERRA3,'K', + 1 ZMINA3,'K',ZMAXA3,'K' + ELSE IF(PNAME.EQ.'T-SURF') THEN + IF(ITIME.EQ.0) CALL LCMPUT(IPTHM,'ERROR-T-SURF',1,2,ERRBB) + IF(IMPX.GT.0) WRITE(6,520) 'FUEL SURFACE TEMPERATURE',ERRBB, + 1 'K',ZMINBB,'K',ZMAXBB,'K' + ELSE IF(PNAME.EQ.'P-COOL') THEN + IF(ITIME.EQ.0) CALL LCMPUT(IPTHM,'ERROR-P-COOL',1,2,ERRA4) + CALL LCMPUT(IPTHM,'MIN-P-COOL',1,2,ZMINA4) + CALL LCMPUT(IPTHM,'MAX-P-COOL',1,2,ZMAXA4) + IF(IMPX.GT.0) WRITE(6,520) 'COOLANT PRESSURE',ERRA4,'Pa', + 1 ZMINA4,'Pa',ZMAXA4,'Pa' + ENDIF + 460 CONTINUE + DEALLOCATE(IREFSC) +*---- +* SAVE CONDUCTIVITY INFORMATION ON LCM OBJECT THM +*---- + IF(ICONDF.EQ.1) THEN + CALL LCMPUT(IPTHM,'KCONDF',NCONDF+3,2,KCONDF) + CALL LCMPTC(IPTHM,'UCONDF',12,UCONDF) + ENDIF + IF(ICONDC.EQ.1) THEN + CALL LCMPUT(IPTHM,'KCONDC',NCONDC+1,2,KCONDC) + CALL LCMPTC(IPTHM,'UCONDC',12,UCONDC) + ENDIF +*---- +* RELEASE MEMORY +*---- + DEALLOCATE(ACOOL,PCH,HD) + DEALLOCATE(RAPCOOL,RAPFUEL,PM,FNFU,FNTG,FFUEL,FCOOL) + DEALLOCATE(PCOOL,DCOOL,TCOOL,TSURF,TCOMB) + DEALLOCATE(NUM) + DEALLOCATE(POW,XBURN) + DEALLOCATE(FRO) + IF(ICONDF.EQ.1)DEALLOCATE(KCONDF) + IF(ICONDC.EQ.1)DEALLOCATE(KCONDC) +*---- +* STATE-VECTOR FOR THM +*---- + HSIGN='L_THM' + CALL LCMPTC(IPTHM,'SIGNATURE',12,HSIGN) + ISTATE(:NSTATE)=0 + ISTATE(1)=NCH + ISTATE(2)=NZ + ISTATE(3)=MAXIT1 + ISTATE(4)=MAXIT2 + ISTATE(5)=MAXIT3 + ISTATE(6)=NFD + ISTATE(7)=NDTOT + ISTATE(8)=ITIME + ISTATE(9)=TIMEIT + ISTATE(10)=IHGAP + ISTATE(11)=IHCONV + ISTATE(12)=ICONDF + ISTATE(13)=ICONDC + ISTATE(14)=IFRCDI + ISTATE(15)=ISUBM + IF(ICONDF.EQ.1) ISTATE(16)=NCONDF + IF(ICONDC.EQ.1) ISTATE(17)=NCONDC + ISTATE(18)=NPRAD + ISTATE(19)=NPOWER + ISTATE(20)=IFLUID + ISTATE(21)=IGAP + ISTATE(22)=IPRES + ISTATE(23)=IDFM + CALL LCMPUT(IPTHM,'STATE-VECTOR',NSTATE,1,ISTATE) + STATE(:NSTATE)=0.0 + STATE(1)=DTIME + STATE(2)=FPUISS + STATE(3)=CFLUX + STATE(4)=SPEED + STATE(5)=POULET + STATE(6)=TINLET + STATE(7)=POROS + STATE(8)=RC + STATE(9)=RIG + STATE(10)=RGG + STATE(11)=RTG + STATE(12)=PITCH + STATE(13)=ERMAXT + STATE(14)=ERMAXC + STATE(15)=RELAX + STATE(16)=RTIME + IF(IHGAP.EQ.1) STATE(17)=KHGAP + IF(IHCONV.EQ.1) STATE(18)=KHCONV + STATE(19)=WTEFF + STATE(20)=TPOW + STATE(21)=RATIOX + STATE(22)=EPSR + STATE(23)=THETA + CALL LCMPUT(IPTHM,'REAL-PARAM',NSTATE,2,STATE) + IF(IMPX.GT.0) THEN + WRITE(6,540) ISTATE(:15),ISTATE(18:23) + IF(ISTATE(10).EQ.1) WRITE(6,550) (ISTATE(16)) + IF(ISTATE(11).EQ.1) WRITE(6,560) (ISTATE(17)) + WRITE(6,570) STATE(:16),STATE(19),STATE(21:23) + IF(ISTATE(10).EQ.1) WRITE(6,580) (STATE(17)) + IF(ISTATE(11).EQ.1) WRITE(6,590) (STATE(18)) + IF(ISTATE(19).GT.0) WRITE(6,600) (STATE(20)) + ENDIF + IF(IMPX.GT.4) CALL LCMLIB(IPTHM) +*---- +* SAVE CELL-DEPENDENT DATA +*---- + CALL LCMPUT(IPTHM,'NB-FUEL',NCH,2,FNFUCST) + CALL LCMPUT(IPTHM,'NB-TUBE',NCH,2,FNTGCST) + CALL LCMPUT(IPTHM,'FRACT-PU',NCH,2,FRACPU) + DEALLOCATE(FRACPU,FNTGCST,FNFUCST) +*---- +* RECOVER THE VARIATION RATIO AND SAVE IT IN A CLE-2000 VARIABLE +*---- + IF(IPICK.EQ.1) THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF(ITYP.NE.-2) CALL XABORT('THM: OUTPUT REAL EXPECTED.') + ITYP=2 + CALL REDPUT(ITYP,NITMA,RATIOX,TEXT12,DFLOT) + CALL REDGET(ITYP,NITMA,FLOT,TEXT12,DFLOT) + IF((ITYP.NE.3).OR.(TEXT12.NE.';')) THEN + CALL XABORT('THM: ; CHARACTER EXPECTED.') + ENDIF + ENDIF + RETURN +* + 470 FORMAT(/11H THM: SAVE ,A,9H AT TIME=,1P,E12.4,3H S.) + 480 FORMAT(/31H THM: RADIAL POWER FORM FACTORS/(1P,10E12.4)) + 490 FORMAT(/18H THM: PARAMETER = ,A,1P,E12.4,3H ->,E12.4,7H RATIO=, + 1 E12.4) + 500 FORMAT(/27H THM: SET GLOBAL PARAMETER ,A,2H =,1P E12.4) + 510 FORMAT(/14H THM: RECOVER ,A,13H PARAMETER = ,A,1H.) + 520 FORMAT(/15H THM: ERROR ON ,A,2H =,F12.3,1X,A,13H MIN VALUE =, + 1 F12.3,1X,A,13H MAX VALUE =,F12.3,1X,A) + 530 FORMAT(/28H THM: PERFORM TRANSIENT STEP,I5,9H BETWEEN ,1P,E14.4, + 1 4H AND,E14.4,3H S.) + 540 FORMAT(/ + 1 14H STATE VECTOR:/ + 2 7H NZ ,I9,27H (NUMBER OF AXIAL MESHES)/ + 3 7H NCH ,I9,43H (NUMBER OF CHANNELS IN THE RADIAL PLANE)/ + 4 7H MAXIT1,I9,36H (NUMBER OF CONDUCTION ITERATIONS)/ + 5 7H MAXIT2,I9,39H (NUMBER OF CENTER-PELLET ITERATIONS)/ + 6 7H MAXIT3,I9,30H (NUMBER OF FLOW ITERATIONS)/ + 7 7H NFD ,I9,32H (NUMBER OF FUEL RADIAL ZONES)/ + 8 7H NDTOT ,I9,36H (NUMBER OF DISCRETISATION POINTS)/ + 9 7H ITIME ,I9,21H (CALCULATION TYPE)/ + 1 7H TIMEIT,I9,30H (TRANSIENT ITERATION INDEX)/ + 2 7H IHGAP ,I9,34H (HGAP FLAG (0=DEFAULT/1=FIXED))/ + 3 7H IHCONV,I9,42H (HCONV FLAG (0=DITTUS-BOELTER/1=FIXED))/ + 4 7H ICONDF,I9,46H (FUEL CONDUCTIVITY FLAG (0=STORA-CHENEBAULT, + 5 54H (UOX), COMETHE (MOX)/1=USER-PROVIDED FUNCTION OF FUEL, + 6 14H TEMPERATURE))/ + 7 7H ICONDC,I9,39H (CLAD CONDUCTIVITY FLAG (0=DEFAULT/1, + 8 47H=USER-PROVIDED POLYNOMIAL OF CLAD TEMPERATURE))/ + 9 7H IFRCDI,I9,40H (FUEL CONDUCTIVITY APPROXIMATION FLAG, + 1 44H (0=DEFAULT/1=AVERAGE APPROXIMATION FORCED))/ + 2 7H ISUBM ,I9,47H (BOILING MODEL FLAG (0=ONE-PHASE/1=BOWRING C, + 3 37HORRELATION/2=SAHA-ZUBER CORRELATION))/ + 4 7H NPRAD ,I9,47H (RADIAL POWER FORM FACTOR (0=FLAT/NUMBER OF , + 5 8HPOINTS))/ + 6 7H NPOWER,I9,36H (NUMBER OF POINTS IN POWER-TABLE)/ + 7 7H IFLUID,I9,32H (TYPE OF FLUID (0=H2O/1=D2O))/ + 8 7H IGAP ,I9,39H (GAP IS CONSIDERED (0=GAP/1=NO GAP))/ + 9 7H IPRES ,I9,46H (PRESSURE DROP (0=CONSTANT/1=NON CONSTANT))/ + 1 7H IDFM ,I9,47H (DRIFT FLUX MODEL (0=HEM1/1=EPRI/2=MODEBSTIO, + 2 21HN/3=GERAMP/4=CHEXAL))) + 550 FORMAT( + 1 7H NCONDF,I9,43H (DEGREE OF FUEL CONDUCTIVITY POLYNOMIAL)) + 560 FORMAT( + 1 7H NCONDC,I9,43H (DEGREE OF CLAD CONDUCTIVITY POLYNOMIAL)) + 570 FORMAT(/ + 1 12H REAL PARAM:,1P/ + 2 7H DTIME ,E12.4,19H (TIME STEP IN S)/ + 3 7H FPUISS,E12.4,25H (COOLANT POWER FACTOR)/ + 4 7H CFLUX ,E12.4,32H (CRITICAL HEAT FLUX IN W/M^2)/ + 5 7H SPEED ,E12.4,28H (COOLANT VELOCITY IN M/S)/ + 6 7H POULET,E12.4,34H (OUTLET COOLANT PRESSURE IN PA)/ + 7 7H TINLET,E12.4,35H (INLET COOLANT TEMPERATURE IN K)/ + 8 7H POROS ,E12.4,19H (OXYDE POROSITY)/ + 9 7H RC ,E12.4,28H (FUEL PELLET RADIUS IN M)/ + 1 7H RIG ,E12.4,34H (INTERNAL CLAD ROD RADIUS IN M)/ + 2 7H RGG ,E12.4,34H (EXTERNAL CLAD ROD RADIUS IN M)/ + 3 7H RTG ,E12.4,27H (GUIDE TUBE RADIUS IN M)/ + 4 7H PITCH ,E12.4,24H (HEXAGONAL SIDE IN M)/ + 5 7H ERMAXT,E12.4,35H (TEMPERATURE MAXIMUM ERROR IN K)/ + 6 7H ERMAXC,E12.4,32H (FLOW MAXIMUM RELATIVE ERROR)/ + 7 7H RELAX ,E12.4,25H (RELAXATION PARAMETER)/ + 8 7H RTIME ,E12.4,20H (TIME VALUE IN S)/ + 9 7H WTEFF ,E12.4,44H (SURFACE TEMPERATURE WEIGHTING FACTOR IN , + 1 27HEFFECTIVE FUEL TEMPERATURE)/ + 2 7H RATIOX,E12.4,35H (MAXIMUM OF VARIABLE VARIATIONS)/ + 3 7H EPSR ,E12.4,34H (RUGOSITY IN M OF THE FUEL ROD)/ + 4 7H THETA ,E12.4,41H (ANGLE IN RADIANS OF THE FUEL CHANNEL)) + 580 FORMAT(7H HGAP ,1P,E12.4,20H (HGAP IN W/m^2/K)) + 590 FORMAT(7H HCONV ,1P,E12.4,21H (HCONV IN W/m^2/K)) + 600 FORMAT(7H HCONV ,1P,E12.4,22H (POWER FACTOR IN W)) + 610 FORMAT(/37H THM: CORE COOLANT SECTION. COMPUTED=,1P,E9.2, + 1 7H GIVEN=,E9.2,4H m2.) + END diff --git a/Donjon/src/THMAVG.f b/Donjon/src/THMAVG.f new file mode 100644 index 0000000..0e09a65 --- /dev/null +++ b/Donjon/src/THMAVG.f @@ -0,0 +1,426 @@ +*DECK THMAVG + SUBROUTINE THMAVG(IPMAP,IMPX,NX,NY,NZ,NCH,TCOMB,TSURF,DCOOL, + > TCOOL,PCOOL,HCOOL,POW,NSIMS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Print averaged thermalhydraulics properties over the core map. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* M. Cordiez +* +*Parameters: input +* IPMAP pointer to the fuelmap object. +* IMPX printing index (=0 for no print). +* NX number of meshes along X direction. +* NY number of meshes along Y direction. +* NZ number of meshes along Z direction (channel direction). +* NCH number of fuel channels in the axial plane. +* TCOMB averaged fuel temperature distribution in K. +* TSURF surface fuel temperature distribution in K. +* DCOOL coolant density distribution in g/cc. +* TCOOL coolant temperature distribution in K. +* PCOOL coolant pressure distribution in Pa. +* HCOOL coolant enthalpty distribution in J/kg. +* POW power distribution in W. +* NSIMS flag greater than zero to activate axial averaging of +* thermohydraulics information. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER MAXHHX + PARAMETER(MAXHHX=30) + TYPE(C_PTR) IPMAP + INTEGER IMPX,NX,NY,NZ,NCH,NSIMS + REAL TCOMB(NZ,NX,NY),TSURF(NZ,NX,NY),DCOOL(NZ,NX,NY), + > TCOOL(NZ,NX,NY),PCOOL(NZ,NX,NY),HCOOL(NZ,NX,NY),POW(NZ,NX,NY) +*---- +* LOCAL VARIABLES +*---- +* Variables for an averaged fuel bundle + INTEGER NBLEVELCOMB,IHY(MAXHHX) + REAL TCOMBAVGAVG, TSURFAVGAVG, DCOOLAVGAVG, TCOOLAVGAVG, + > PCOOLAVGAVG, HCOOLAVGAVG, POWAVGAVG, POWRELAVGAVG + REAL TCOMBAVG(NZ), TSURFAVG(NZ), DCOOLAVG(NZ), TCOOLAVG(NZ), + > PCOOLAVG(NZ), HCOOLAVG(NZ), POWERAVG(NZ), POWRELAVG(NZ) +* --> POWRELAVG : relative power by axial plane +* Variables for axially averaged to draw a core map + REAL TCOMBCM(NX,NY),TSURFCM(NX,NY),DCOOLCM(NX,NY),TCOOLCM(NX,NY), + > PCOOLCM(NX,NY),HCOOLCM(NX,NY),POWERCM(NX,NY),POWRELCM(NX,NY) + REAL POWAVGCM, POWRELAVGCM + CHARACTER HHX(MAXHHX)*1,TEXT1*1,TEXT1B*1,TEXT4*4 +*---- +* ALLOCATABLE ARRAYS +*---- + CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: HZONE +*---- +* RECOVER NAVAL BATTLE COORDINATES OF THE MAP +*---- + IF(NSIMS.GT.0) THEN + LX=NSIMS/100 + LY=MOD(NSIMS,100) + ALLOCATE(HZONE(NCH)) + CALL LCMGTC(IPMAP,'S-ZONE',4,NCH,HZONE) + TEXT4=HZONE(1) + READ(TEXT4,'(A1,I2)') TEXT1,INTG2 + L=0 + DO K=1,NCH + TEXT4=HZONE(K) + READ(TEXT4,'(A1,I2)') TEXT1B,INTG2B + IF(TEXT1B.EQ.TEXT1) THEN + L=L+1 + IF(L.GT.MAXHHX)CALL XABORT('@THMAVG: MAXHHX OVERFLOW.(1)') + IF(L.GT.LY)CALL XABORT('@THMAVG: INCOHERENCE IN BASIC ' + > //'ASSEMBLY LAYOUT GIVEN IN RESINI: (1).') + IHY(L)=INTG2B + ENDIF + ENDDO + L=L+1 + IF(L.GT.MAXHHX)CALL XABORT('@THMAVG: MAXHHX OVERFLOW.(2)') + IHY(L)=0 + L=0 + DO K=1,NCH + TEXT4=HZONE(K) + READ(TEXT4,'(A1,I2)') TEXT1B,INTG2B + IF(INTG2B.EQ.IHY((LY+1)/2)) THEN + L=L+1 + IF(L.GT.MAXHHX)CALL XABORT('@THMAVG: MAXHHX OVERFLOW.(3)') + IF(L.GT.LX)CALL XABORT('@THMAVG: INCOHERENCE IN BASIC ' + > //'ASSEMBLY LAYOUT GIVEN IN RESINI: (2).') + HHX(L)=TEXT1B + ENDIF + ENDDO + DEALLOCATE(HZONE) + ENDIF +*---- +* VARIABLES INITIALIZATION +*---- +* Variables for an average fuel bundle + TCOMBAVGAVG = 0 + TSURFAVGAVG = 0 + DCOOLAVGAVG = 0 + TCOOLAVGAVG = 0 + PCOOLAVGAVG = 0 + HCOOLAVGAVG = 0 + POWAVGAVG = 0 + POWRELAVGAVG = 0 + NBLEVELCOMB = 0 + DO L=1,NZ + TCOMBAVG(L) = 0.0 + TSURFAVG(L) = 0.0 + DCOOLAVG(L) = 0.0 + TCOOLAVG(L) = 0.0 + PCOOLAVG(L) = 0.0 + HCOOLAVG(L) = 0.0 + POWERAVG(L) = 0.0 + POWRELAVG(L) = 0.0 + ENDDO +* Variables for an averaged core layer (map of values) + POWAVGCM = 0 + POWRELAVGCM = 0 +*---- +* SUM THE VALUES FOR A EVERY FUEL BUNDLE TO AVERAGE THEM +*---- + NBASS=0 + DO 95 I=1,NX + DO 90 J=1,NY + TCOMBCM(I,J) = 0.0 + TSURFCM(I,J) = 0.0 + DCOOLCM(I,J) = 0.0 + TCOOLCM(I,J) = 0.0 + PCOOLCM(I,J) = 0.0 + HCOOLCM(I,J) = 0.0 + POWERCM(I,J) = 0.0 + POWRELCM(I,J) = 0.0 + IF(POW((NZ+1)/2,I,J).GT.0.0) THEN +* We do not average on the reflectors whose values equal 0 + NBASS=NBASS+1 + TCOMBAVG=TCOMBAVG+TCOMB(:,I,J) + TSURFAVG=TSURFAVG+TSURF(:,I,J) + DCOOLAVG=DCOOLAVG+DCOOL(:,I,J) + TCOOLAVG=TCOOLAVG+TCOOL(:,I,J) + PCOOLAVG=PCOOLAVG+PCOOL(:,I,J) + HCOOLAVG=HCOOLAVG+HCOOL(:,I,J) + POWERAVG=POWERAVG+POW(:,I,J) + ENDIF + 90 CONTINUE + 95 CONTINUE +*---- +* COMPUTE THE AVERAGED VALUES FOR A GENERIC FUEL BUNDLE +*---- + IF(NSIMS.GT.0) THEN + TCOMBAVG=TCOMBAVG/REAL(NBASS) + TSURFAVG=TSURFAVG/REAL(NBASS) + DCOOLAVG=DCOOLAVG/REAL(NBASS) + TCOOLAVG=TCOOLAVG/REAL(NBASS) + PCOOLAVG=PCOOLAVG/REAL(NBASS) + HCOOLAVG=HCOOLAVG/REAL(NBASS) + POWERAVG=POWERAVG/REAL(NBASS) +* +* Computation of the relative power by axial plane and +* computation of the averaged-on-z-axis values of an average +* fuel bundle + DO L=1,NZ + TCOMBAVGAVG=TCOMBAVGAVG+TCOMBAVG(L) + TSURFAVGAVG=TSURFAVGAVG+TSURFAVG(L) + DCOOLAVGAVG=DCOOLAVGAVG+DCOOLAVG(L) + TCOOLAVGAVG=TCOOLAVGAVG+TCOOLAVG(L) + PCOOLAVGAVG=PCOOLAVGAVG+PCOOLAVG(L) + HCOOLAVGAVG=HCOOLAVGAVG+HCOOLAVG(L) + POWAVGAVG=POWAVGAVG+POWERAVG(L) + IF(POWERAVG(L).NE.0) NBLEVELCOMB=NBLEVELCOMB+1 + ENDDO + TCOMBAVGAVG=TCOMBAVGAVG/REAL(NBLEVELCOMB) + TSURFAVGAVG=TSURFAVGAVG/REAL(NBLEVELCOMB) + DCOOLAVGAVG=DCOOLAVGAVG/REAL(NBLEVELCOMB) + TCOOLAVGAVG=TCOOLAVGAVG/REAL(NBLEVELCOMB) + PCOOLAVGAVG=PCOOLAVGAVG/REAL(NBLEVELCOMB) + HCOOLAVGAVG=HCOOLAVGAVG/REAL(NBLEVELCOMB) + POWAVGAVG=POWAVGAVG/REAL(NBLEVELCOMB) + POWRELAVG=POWERAVG/POWAVGAVG +* +* Computation of the average relative power by axial plane +* (it must be equal to 1) + DO L=1,NZ + POWRELAVGAVG=POWRELAVGAVG+POWRELAVG(L) + ENDDO + POWRELAVGAVG=POWRELAVGAVG/REAL(NBLEVELCOMB) +* +* There is no use in computing them if the user does not want them + IF(IMPX.GT.2) THEN + WRITE(6,'(/28H THMAVG: AVERAGE FUEL BUNDLE/1X,27(1H-))') + WRITE(6,210) ' ___________________________________________', + > '_____________________________________________________', + > '___________________' + WRITE(6,210) '| | TFUEL | TSURF | DCOOL ', + > ' | TCOOL | PCOOL | HCOOL | ', + > 'POWER | POW REL |' + WRITE(6,230) '| AVG |',TCOMBAVGAVG,' |',TSURFAVGAVG,' |', + > DCOOLAVGAVG,' |',TCOOLAVGAVG,' |',PCOOLAVGAVG,' |', + > HCOOLAVGAVG,' |',POWAVGAVG,' |',POWRELAVGAVG,' |' + WRITE(6,210) '|_____|_____________|_____________|__________', + > '___|_____________|_____________|_____________|_______', + > '______|___________|' + DO L=NZ,1,-1 + IF(L.EQ.1) THEN + WRITE(6,230) '| BOT |',TCOMBAVG(L),' |',TSURFAVG(L), + > ' |',DCOOLAVG(L),' |',TCOOLAVG(L),' |',PCOOLAVG(L), + > ' |',HCOOLAVG(L),' |',POWERAVG(L),' |', + > POWRELAVG(L),' |' + ELSEIF(L.EQ.NZ) THEN + WRITE(6,230) '| TOP |',TCOMBAVG(L),' |',TSURFAVG(L), + > ' |',DCOOLAVG(L),' |',TCOOLAVG(L),' |',PCOOLAVG(L), + > ' |',HCOOLAVG(L),' |',POWERAVG(L),' |', + > POWRELAVG(L),' |' + ELSE + WRITE(6,235) '| ',L,' |',TCOMBAVG(L),' |',TSURFAVG(L), + > ' |',DCOOLAVG(L),' |',TCOOLAVG(L),' |',PCOOLAVG(L), + > ' |',HCOOLAVG(L),' |',POWERAVG(L),' |', + > POWRELAVG(L),' |' + ENDIF + ENDDO + WRITE(6,210) '|_____|_____________|_____________|_________', + > '____|_____________|_____________|_____________|______', + > '_______|___________|' + ENDIF +*---- +* COMPUTE THE AVERAGED VALUES ON THE CORE MAP +*---- +* We do not average on the reflectors whose values equal 0 + DO K=1,NZ + TCOMBCM(:,:)=TCOMBCM(:,:)+TCOMB(K,:,:) + TSURFCM(:,:)=TSURFCM(:,:)+TSURF(K,:,:) + DCOOLCM(:,:)=DCOOLCM(:,:)+DCOOL(K,:,:) + TCOOLCM(:,:)=TCOOLCM(:,:)+TCOOL(K,:,:) + PCOOLCM(:,:)=PCOOLCM(:,:)+PCOOL(K,:,:) + HCOOLCM(:,:)=HCOOLCM(:,:)+HCOOL(K,:,:) + POWERCM(:,:)=POWERCM(:,:)+POW(K,:,:) + ENDDO + TCOMBCM=TCOMBCM/REAL(NBLEVELCOMB) + TSURFCM=TSURFCM/REAL(NBLEVELCOMB) + DCOOLCM=DCOOLCM/REAL(NBLEVELCOMB) + TCOOLCM=TCOOLCM/REAL(NBLEVELCOMB) + PCOOLCM=PCOOLCM/REAL(NBLEVELCOMB) + HCOOLCM=HCOOLCM/REAL(NBLEVELCOMB) + POWERCM=POWERCM/REAL(NBLEVELCOMB) +* Calculation of the relative power distribution (avg = 1) + DO 106 I=1,NX + DO 105 J=1,NY + POWAVGCM=POWAVGCM+POWERCM(I,J) + 105 CONTINUE + 106 CONTINUE + POWAVGCM=POWAVGCM/REAL(NBASS) + POWRELCM=POWERCM/POWAVGCM + DO 108 I=1,NX + DO 107 J=1,NY + POWRELAVGCM=POWRELAVGCM+POWRELCM(I,J) + 107 CONTINUE + 108 CONTINUE + POWRELAVGCM=POWRELAVGCM/REAL(NBASS) +* +* There is no use in computing them if the user does not want them + IF(IMPX.GT.2) THEN + IDEB=1 + JDEB=1 +* We do not draw the reflector + I=1 + DO WHILE (POW((NZ+1)/2,I,(NY+1)/2).EQ.0) + IDEB=IDEB+1 + I=I+1 + END DO + J=1 + DO WHILE (POW((NZ+1)/2,(NX+1)/2,J).EQ.0) + JDEB=JDEB+1 + J=J+1 + END DO +* ******************** +* We write the results +* ******************** +* Fuel temperature + WRITE(6,'(/25H THMAVG: AVERAGE CORE MAP/1X,24(1H-))') + WRITE(6,202) 'TCOMB' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 111 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 110 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,205,ADVANCE='NO') TCOMBCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 110 CONTINUE + 111 CONTINUE +* Surface temperature + WRITE(6,202) 'TSURF' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 113 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 112 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,205,ADVANCE='NO') TSURFCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 112 CONTINUE + 113 CONTINUE +* Coolant density + WRITE(6,202) 'DCOOL' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 115 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 114 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,206,ADVANCE='NO') DCOOLCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 114 CONTINUE + 115 CONTINUE +* Coolant temperature + WRITE(6,202) 'TCOOL' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 117 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 116 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,205,ADVANCE='NO') TCOOLCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 116 CONTINUE + 117 CONTINUE +* Coolant pressure + WRITE(6,202) 'PCOOL' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 119 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 118 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,207,ADVANCE='NO') PCOOLCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 118 CONTINUE + 119 CONTINUE +* Coolant enthalpy + WRITE(6,202) 'HCOOL' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 121 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 120 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,207,ADVANCE='NO') HCOOLCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 120 CONTINUE + 121 CONTINUE +* Power + WRITE(6,202) 'POWER' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 123 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 122 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,207,ADVANCE='NO') POWERCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 122 CONTINUE + 123 CONTINUE +* Power + WRITE(6,209) 'RELATIVE POWER, REFLECTORS EXCLUDED (AVG:', + 1 POWRELAVGCM,')' + WRITE(6,203,ADVANCE='NO') (HHX(I),I=1,NX-2*IDEB+2) + DO 125 J=JDEB,NY + WRITE(6,204,ADVANCE='NO') IHY(J-JDEB+1) + ENDLINE=0 + DO 124 I=IDEB,NX + IF(POW((NZ+1)/2,I,J).GT.0) THEN + WRITE(6,206,ADVANCE='NO') POWRELCM(I,J) + ENDLINE=1 + ELSE IF(ENDLINE.EQ.0) THEN + WRITE(6,208,ADVANCE='NO') + ENDIF + 124 CONTINUE + 125 CONTINUE + ENDIF + ENDIF + RETURN +* + 202 FORMAT(/1X,A) + 203 FORMAT(1X,20(8X,1A1)) + 204 FORMAT(/1X,I2) + 205 FORMAT(F9.1) + 206 FORMAT(F9.3) + 207 FORMAT(1P,E9.2) + 208 FORMAT(9X) + 209 FORMAT(/1X,A,F7.4,A) + 210 FORMAT(1X,A,A,A,A) + 230 FORMAT(1X,A,F12.2,A,F12.2,A,F12.4,A,F12.2,A,3P,E12.4, + > A,1P,E12.4,A,1P,E12.4,A,0P,F10.4,A) + 235 FORMAT(1X,A,I3,A,F12.2,A,F12.2,A,F12.4,A,F12.2,A,3P,E12.4, + > A,1P,E12.4,A,1P,E12.4,A,0P,F10.4,A) + END diff --git a/Donjon/src/THMCCD.f b/Donjon/src/THMCCD.f new file mode 100644 index 0000000..ddf9765 --- /dev/null +++ b/Donjon/src/THMCCD.f @@ -0,0 +1,78 @@ +*DECK THMCCD + REAL FUNCTION THMCCD(TEMP,POROS,FRACPU) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the product of the heat capacity of fuel (in J/Kg/K) times +* its density (in Kg/m^3). +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* P. Gallet +* +*Parameters: input +* TEMP fuel temperature in Kelvin. +* POROS oxyde porosity. +* FRACPU plutonium mass fraction in fuel. +* +*Parameters: output +* THMCCD product of the heat capacity of fuel times its density +* (in J/K/m^3). +* +*Reference: +* J. J. Carbajo, G. L. Yoder, S. G. Popov and V. K. Ivanov, "A review of +* the thermophysical properties of MOX and UO2 fuels," J. of Nuclear +* Materials, 299, 181-198 (2001). +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + REAL TEMP,POROS,FRACPU +*---- +* LOCAL VARIABLES +* CP: heat capacity in J/Kg/K +* DENS0: fuel density with zero porosity +* ROURA: uranium density in Kg/m^3 +* ROPLU: plutonium density in Kg/m^3 +*---- + REAL CP,DENS0,RO,ROURA,ROPLU,A1,A2,A3,A4,CORR,T2,T1,C1U,C2U,C3U, + > C4U,C5U,C6U,C1PU,C2PU,C3PU,C4PU,C5PU,C6PU,CPU,CPPU + PARAMETER (ROURA=10970.0,ROPLU=11460.0,A1=0.99672,A2=1.179E-05, + > A3=-2.429E-09,A4=1.219E-12,C1U=193.238,C2U=325.7294, + > C3U=-312.0042,C4U=116.8224,C5U=-9.7535,C6U=-2.6441,C1PU=311.7866, + > C2PU=39.258,C3PU=-2.256,C4PU=0.0,C5PU=0.0,C6PU=-7.0131) +* + T2=MAX(0.0,TEMP) + T1=T2/1000.0 +* temperature correction coefficient for density calculation + CORR=1.0/(A1+A2*T2+A3*T2**2.0+A4*T2**3.0)**3.0 + IF(FRACPU.EQ.0.0) THEN +* UOX +* density of the UOX fuel + RO=(1.0-POROS)*ROURA*CORR +* heat capacity of the UOX fuel + CPU=C1U+C2U*T1+C3U*T1**2.0+C4U*T1**3.0+C5U*T1**4.0+C6U + > /(T1**2.0) + CPPU=0.00 + CP=CPU + ELSE +* MOX +* density of the MOX fuel + DENS0=100.0*CORR/((FRACPU/ROPLU)+((100.0-FRACPU)/ROURA)) + RO=(1.-POROS)*DENS0 +* heat capacity of the MOX fuel + CPU=C1U+C2U*T1+C3U*T1**2.0+C4U*T1**3.0+C5U*T1**4.0+C6U + > /(T1**2.0) + CPPU=C1PU+C2PU*T1+C3PU*T1**2.0+C6PU/(T1**2.0) + CP=((100.0-FRACPU)*CPU+FRACPU*CPPU)/100.0 + ENDIF +* total internal energy of the fuel + THMCCD=RO*CP + RETURN + END diff --git a/Donjon/src/THMCDI.f b/Donjon/src/THMCDI.f new file mode 100644 index 0000000..89f00af --- /dev/null +++ b/Donjon/src/THMCDI.f @@ -0,0 +1,209 @@ +*DECK THMCDI + FUNCTION THMCDI(T2K,T1K,BURN,POROS,FRACPU,ICONDF,NCONDF,KCONDF, + > UCONDF,IFRCDI) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the thermal conductivity integral of UOX or MOX fuel. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert, V. Salino +* +*Parameters: input +* T2K final temperature in Kelvin. +* T1K initial temperature in Kelvin. +* BURN fuel burnup in MWday/tonne. +* POROS fuel porosity. +* FRACPU plutonium mass fraction in fuel. +* ICONDF fuel conductivity flag (0=Stora-Chenebault or COMETHE/ +* 1=user-provided polynomial + inverse term). +* NCONDF degree of user-provided fuel conductivity polynomial. +* KCONDF polynomial coefficients for fuel conductivity in W/m/K^(k+1) +* (except for the two last coefficients which belongs to the +* inverse term). +* UCONDF required unit of temperature in polynomial for fuel +* conductivity (KELVIN or CELSIUS). +* IFRCDI flag indicating if average approximation is forced during +* fuel conductivity evaluation (0=default/1=average +* approximation forced). +* +*Parameters: output +* THMCDI thermal conductivity integral in Watt/m/K. +* +*Reference: +* A. Poncot, "Assimilation de donnees pour la dynamique du xenon dans +* les coeurs de centrale nucleaire", Ph.D Thesis, Universite de +* Toulouse, France, 2008. +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER ICONDF,NCONDF,IFRCDI + REAL T1K,T2K,BURN,POROS,FRACPU,KCONDF(NCONDF+3),THMCDI + CHARACTER UCONDF*12 +*---- +* LOCAL VARIABLES +* NPAS number of rectangles in the quadrature +* DT rectangle width +* T2T1 temperature difference +* DTMIN cutoff criterion for selecting the approximation +* FPI burnup correcting factor +* CIRRA burnup correction constant +* HV* coefficients of the Stora-Chenebault correlation +* HK* coefficients of the Comethe correlation +*---- + INTEGER NPAS,I,K + REAL T1,T2,DT,TM,DTMIN,T2T1,FPI,TT,TMK,TEMP,FTP,CINT,FP,TTK + REAL HV1, HV2, HV3 + REAL HK1, HK2, HK4, HK5 + REAL ZKELV,CIRRA +* + PARAMETER ( ZKELV=273.15 ) + PARAMETER ( HV1= 1.3324E-08 , HV2 = -4.3554E-05 , + & HV3 = 5.8915E-02 ) + PARAMETER ( HK1= 40.05 , HK2 = 129.4 , HK4 = 0.8 , + & HK5 = 0.6416E-12 ) + PARAMETER ( CIRRA= 0.124E-02 ) +* + REAL A + DATA NPAS /10/ + DATA DTMIN /10./ +* + IF(MIN(T1K,T2K).LE.0.0) THEN + CALL XABORT('@THMCDI: NEGATIVE TEMPERATURE.') + ENDIF + T1=T1K-ZKELV + T2=T2K-ZKELV +* + T2T1 = T2-T1 + DT = T2T1/NPAS + TM = (T1+T2)/2.0 + IF(ICONDF.EQ.1) THEN +* User-given conductivity, as a function of temperature + IF((ABS(T2T1).LT.DTMIN).OR.(IFRCDI.EQ.1)) THEN +* Use the average value approximation + THMCDI=0.0 + IF(UCONDF.EQ.'KELVIN') THEN + TMK = TM + ZKELV + DO K=1,NCONDF+1 + THMCDI=THMCDI + KCONDF(K)*TMK**(K-1) + ENDDO + THMCDI=THMCDI + KCONDF(NCONDF+2)/(TMK-KCONDF(NCONDF+3)) + ELSE + DO K=1,NCONDF+1 + THMCDI=THMCDI + KCONDF(K)*TM**(K-1) + ENDDO + THMCDI=THMCDI + KCONDF(NCONDF+2)/(TM-KCONDF(NCONDF+3)) + ENDIF + ELSE +* Use the rectangle quadrature approximation + TT=T1-DT*0.5 + CINT=0. + DO I=1,NPAS + TT=TT+DT + IF(UCONDF.EQ.'KELVIN') THEN + TTK = TT + ZKELV + DO K=1,NCONDF+1 + CINT=CINT + KCONDF(K)*TTK**(K-1) + ENDDO + CINT=CINT + KCONDF(NCONDF+2)/(TTK-KCONDF(NCONDF+3)) + ELSE + DO K=1,NCONDF+1 + CINT=CINT + KCONDF(K)*TT**(K-1) + ENDDO + CINT=CINT + KCONDF(NCONDF+2)/(TT-KCONDF(NCONDF+3)) + ENDIF + ENDDO + THMCDI=CINT/NPAS + ENDIF + ELSE IF(FRACPU.GT.0.) THEN +* Use the Comethe correlation for MOX fuel + FPI=CIRRA*BURN + IF((ABS(T2T1).LT.DTMIN).OR.(IFRCDI.EQ.1)) THEN +* Use the average value approximation + IF(TM.GT.1000.0) THEN + A=2.0 + ELSE + A=2.58-0.58E-03*TM + ENDIF + FP=(1.0-A*POROS)/(1.0-A*0.05) + TMK = TM + ZKELV + TEMP = HK2 + (1.0 + HK4*FRACPU*1.E-02) * TMK + FTP = FP * (HK1/TEMP + HK5*TMK*TMK*TMK) *100.0 + IF(TM.EQ.0.) THEN + THMCDI=FTP + ELSE + THMCDI=1.0/(1.0/FTP+FPI/TM) + ENDIF + ELSE +* Use the rectangle quadrature approximation + TT=T1-DT*0.5 + CINT=0. + DO I=1,NPAS + TT=TT+DT + IF(TT.GT.1000.0) THEN + A=2.0 + ELSE + A=2.58-0.58E-03*TT + ENDIF + FP=(1.0-A*POROS)/(1.0-A*0.05) + TTK = TT + ZKELV + TEMP = HK2 + (1.0 + HK4*FRACPU*1.E-02) * TTK + FTP = FP * (HK1/TEMP + HK5*TTK*TTK*TTK) *100.0 + IF(TT.EQ.0.0) THEN + CINT=CINT+FTP + ELSE + CINT=CINT+1.0/(1.0/FTP+FPI/TT) + ENDIF + ENDDO + THMCDI=CINT/NPAS + ENDIF + ELSE +* Use the Stora-Chenebault correlation for UOX fuel +* (also called the "HGAP Variable 88" correlation) + FPI=CIRRA*BURN + IF((ABS(T2T1).LT.DTMIN).OR.(IFRCDI.EQ.1)) THEN +* Use the average value approximation + IF(TM.GT.1000.) THEN + A=2.0 + ELSE + A=2.58-0.58E-03*TM + ENDIF + FP=(1.0-A*POROS)/(1.0-A*0.034) + FTP=FP*(HV3+HV2*TM+HV1*TM*TM)*100.0 + IF(TM.EQ.0.0) THEN + THMCDI=FP*HV3*100.0 + ELSE + THMCDI=1.0/(1.0/FTP+FPI/TM) + ENDIF + ELSE +* Use the rectangle quadrature approximation + TT=T1-DT*0.5 + CINT=0. + DO I=1,NPAS + TT=TT+DT + IF(TT.GT.1000.) THEN + A=2.0 + ELSE + A=2.58-0.58E-03*TT + ENDIF + FP=(1.0-A*POROS)/(1.0-A*0.034) + FTP=FP*(HV3+HV2*TT+HV1*TT*TT)*100.0 + IF(TT.EQ.0.0) THEN + CINT=CINT+FP*HV3*100.0 + ELSE + CINT=CINT+1.0/(1.0/FTP+FPI/TT) + ENDIF + ENDDO + THMCDI=CINT*DT/T2T1 + ENDIF + ENDIF + RETURN + END diff --git a/Donjon/src/THMDFM.f90 b/Donjon/src/THMDFM.f90 new file mode 100644 index 0000000..1e4e0ba --- /dev/null +++ b/Donjon/src/THMDFM.f90 @@ -0,0 +1,141 @@ +!DECK THMDFM + SUBROUTINE THMDFM(PCOOL,VCOOL,HMAVG,HD,TL,TSAT,IDFM,EPS,XFL,RHO,RHOL,RHOG, VGJ, VGJprime, C0, HLV) +! +!----------------------------------------------------------------------- +! +! Purpose: +! Drift-flux Model for the computation of thermohydraulics parameters in two-phase flow +! +!Copyright: +! Copyright (C) 2025 Ecole Polytechnique de Montreal. +! +!Author(s): +! M. Bellier +! +!Parameters: input +! PCOOL pressure in Pascal +! VCOOL coolant velocity in m/s +! HMAVG averaged enthalpy +! HD hydraulic diameter in m +! TL liquid temperature in K +! TSAT saturation temperature in K +! IDFM flag indicating if the drift flux model is to be used +! (0=HEM1(no drift velocity)/1=EPRI/2=MODEBSTION/3=GERAMP/4=CHEXAL) +! EPS input coolant void fraction +! +! +!Parameters: output +! XFL coolant flow quality +! RHO coolant density in Kg/m^3 +! RHOL liquid density in kg/m^3 +! RHOG vapour density in kg/m^3 +! VGJ drift velocity +! C0 concentration parameter +! VGJprime +! HLV delta between liquid and vapour enthaply +! +!----------------------------------------------------------------------- +! +!---- +! SUBROUTINE ARGUMENTS +!---- + REAL PCOOL,VCOOL,HMAVG,HD,TL,TSAT,EPS,XFL,RHO,RHOL,RHOG, VGJ, VGJprime, C0, HLV + INTEGER IDFM +!---- +! LOCAL VARIABLES +!---- + REAL EPSold, ERREPS, VLIQ, VVAP, TCALO, HLSAT, HGSAT, ZMUL, ZMUG, CPL, CPG, ZKL, ZKG, ZMU, REY + INTEGER NITER +!---- +! INITIALIZE VARIABLES +!---- + VGJ = 0 + C0 = 1 + VGJprime = 0 + +!---- +! MAIN LOOP +!---- + NITER=0 + ERREPS=1 + + 10 CONTINUE +!---- +! SAVE THE OLD EPSILON VALUE +!---- + EPSold = EPS + NITER = NITER+1 + +!---- +! TEST ON ERR EPS +!---- + IF (NITER .GT. 150) GOTO 20 + IF (ERREPS .LT. 1E-8) GOTO 20 + +!---- +! COMPUTE DENSITIES +!---- + TCALO=EPS*TSAT+(1.0-EPS)*TL + CALL THMTX(TCALO,0.0,RHOL,HLSAT,ZKL,ZMUL,CPL) + CALL THMTX(TCALO,1.0,RHOG,HGSAT,ZKG,ZMUG,CPG) + + RHO = RHOL*(1 - EPS)+ EPS*RHOG + +!---- +! COMPUTE PHASES VELOCITIES AND REYNOLDS +!---- + VLIQ = VCOOL - (1.0/(1.0- EPS) - RHOL/RHO) *VGJprime + VVAP = VCOOL + RHOL/RHO *VGJprime + ZMU = (ZMUL*ZMUG/ (ZMUL*(1.0-EPS) + ZMUG*EPS)) + REY = RHO * ABS(VCOOL) * HD / ZMU + +!---- +! COMPUTE FLOW QUALITY +!---- + + IF (HLSAT .GT. HMAVG) THEN + XFL = 0 + ELSE IF (HMAVG .GT. HGSAT) THEN + XFL = 1 + ELSE + XFL = (HMAVG - HLSAT)/(HGSAT - HLSAT) + ENDIF + +!---- +! COMPUTE VGJ, VGJprime AND C0 AFTER CHOSEN CORRELATION +!---- + CALL THMVGJ(VCOOL, RHO, PCOOL, ZMU, XFL, HD, RHOG, RHOL, EPS, IDFM, VGJ, C0) + VGJprime = VGJ + (C0-1)*VCOOL + +!---- +! COMPUTE HLV +!---- + HLV=HGSAT-HLSAT +!---- +! COMPUTE NEW EPS VALUE +!---- + IF (XFL.EQ.0) THEN + EPS = 0 + ELSE IF (XFL.EQ.1) THEN + EPS = 1 + ELSE + EPS = XFL / (C0 * (XFL + (RHOG/RHOL) * (1 - XFL)) + (RHOG * VGJ) / (RHOL * VCOOL)) + ENDIF +!---- +! COMPUTE DELTA BETWEEN EPSold AND EPS +!---- + ERREPS = ABS(EPSold - EPS) + GOTO 10 + + +!---- +! EXIT LOOP +!---- + 20 CONTINUE + + IF (NITER.GT.150) THEN + PRINT *, 'THMDFM: Maximum number of iterations reached (150)' + ELSE + PRINT *, 'THMDFM: Convergence reached in I = ', NITER, 'iterations' + ENDIF +END diff --git a/Donjon/src/THMDRV.f b/Donjon/src/THMDRV.f new file mode 100644 index 0000000..ff642e3 --- /dev/null +++ b/Donjon/src/THMDRV.f @@ -0,0 +1,628 @@ +*DECK THMDRV + SUBROUTINE THMDRV(MPTHM,IMPX,IX,IY,NZ,XBURN,VOLXY,HZ,CFLUX,POROS, + > FNFU,NFD,NDTOT,IFLUID,SNAME,SCOMP,IGAP,IFUEL,FNAME,FCOMP,FCOOL, + > FFUEL,ACOOL,HD,PCH,RAD, + > MAXIT1,MAXITL,ERMAXT,SPEED,TINLET,POUTLET, + > FRACPU,ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC,KCONDC,UCONDC, + > IHGAP,KHGAP,IHCONV,KHCONV,WTEFF,IFRCDI,ISUBM,FRO,POW,IPRES,IDFM, + > TCOMB, DCOOL,TCOOL,TSURF,HCOOL,PCOOL) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver of the steady-state thermal-hydraulics calculation. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* C. Garrido +* 08/2023: Modifications to include Molten Salt heat transfer in coolant +* C. Garrido +* 07/2024: Modifications to include Molten Salt heat transfer in static +* fuel +* C. Huet +* 02/2025: Modifications to include pressure drop calculation +* R. Guasch & M. Bellier +* 08/2025: Modifications to include mass+momentum+energy conservation equation +* solution using a Drift-Flux Model. +* +*Parameters: input +* MPTHM directory of the THM object containing steady-state +* thermohydraulics data. +* IMPX printing index (=0 for no print). +* IX position of mesh along X direction. +* IY position of mesh along Y direction. +* NZ number of meshes along Z direction (channel direction). +* XBURN burnup distribution in MWday/tonne. +* VOLXY mesh area in the radial plane. +* HZ Z-directed mesh widths. +* CFLUX critical heat flux in W/m^2. +* POROS oxyde porosity. +* FNFU number of active fuel rods in the fuel bundle. +* NFD number of discretization points in fuel region. +* NDTOT number of total discretization points in the the fuel +* pellet and the cladding. +* IFLUID type of fluid (0=H2O; 1=D2O; 2=SALT). +* SNAME Name of the molten salt (e.g. "LiF-BeF2") +* SCOMP Composition of the molten salt (e.g. "0.66-0.34") +* FCOOL power density fraction in coolant. +* FFUEL power density fraction in fuel. +* ACOOL coolant cross section area in m^2. +* HD hydraulic diameter of one assembly in m. +* PCH heating perimeter in m. +* RAD fuel and clad radii in m. +* MAXIT1 maximum number of conduction iterations. +* MAXITL maximum number of center-pellet iterations. +* ERMAXT convergence criterion. +* SPEED inlet flow velocity in m/s. +* TINLET inlet temperature in K. +* POUTLET outlet pressure in Pa. +* FRACPU plutonium fraction in fuel. +* ICONDF fuel conductivity flag (0=Stora-Chenebault or COMETHE/ +* 1=user-provided polynomial + inverse term). +* NCONDF degree of user-provided fuel conductivity polynomial. +* KCONDF polynomial coefficients for fuel conductivity in W/m/K^(k+1) +* (except for the two last coefficients which belongs to the +* inverse term). +* UCONDF required unit of temperature in polynomial for fuel +* conductivity (KELVIN or CELSIUS). +* ICONDC clad conductivity flag (0=default/1=user-provided +* polynomial). +* NCONDC degree of user-provided clad conductivity polynomial. +* KCONDC polynomial coefficients for clad conductivity in W/m/K^(k+1). +* UCONDC required unit of temperature in polynomial for clad +* conductivity (KELVIN or CELSIUS). +* IHGAP flag indicating HGAP chosen (0=default/1=user-provided). +* KHGAP fixed user-provided HGAP value in W/m^2/K. +* IHCONV flag indicating HCONV chosen (0=default/1=user-provided). +* KHCONV fixed user-provided HCONV value in W/m^2/K. +* WTEFF surface temperature's weighting factor in effective fuel +* temperature. +* IFRCDI flag indicating if average approximation is forced during +* fuel conductivity evaluation (0=default/1=average +* approximation forced). +* ISUBM subcooling model (0: one-phase; 1: Jens-Lottes model; +* 2: Saha- Zuber model). +* FRO radial power form factors. +* POW power distribution in W. +* IGAP Flag indicating if the gap is considered (0=gap/1=no gap) +* IFUEL type of fuel (0=UO2/MOX; 1=SALT). +* FNAME Name of the molten salt (e.g. "LiF-BeF2") +* FCOMP Composition of the molten salt (e.g. "0.66-0.34") +* IPRES flag indicating if pressure is to be computed (0=nonstant/ +* 1=variable). +* IDFM flag indicating if the drift flux model is to be used +* (0=Without modifications(Chexal correlation for epsilon, no drift flux model in the Navier-Stokes equations) +* /1=EPRI/2=MODEBSTION/3=GERAMP/4=HEM1(VGJ=0)) +* +*Parameters: output +* TCOMB averaged fuel temperature distribution in K. +* DCOOL coolant density distribution in g/cc. +* TCOOL coolant temperature distribution in K. +* TSURF surface fuel temperature distribution in K. +* HCOOL coolant enthalpty distribution in J/kg. +* PCOOL coolant pressure distribution in Pa. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE t_saltdata +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) MPTHM + INTEGER IMPX,IX,IY,NZ,NFD,NDTOT,IFLUID,MAXIT1,MAXITL,IHGAP,IGAP, + > IFUEL,IPRES, IDFM + REAL XBURN(NZ),VOLXY,CFLUX,POROS,FRACPU,ERMAXT, + > SPEED,TINLET,POUTLET, + > FFUEL(NZ),ACOOL(NZ),RAD(NDTOT-1,NZ),FNFU(NZ),FCOOL(NZ),HZ(NZ), + > KCONDF(NCONDF+3),KCONDC(NCONDC+1),KHGAP,KHCONV,WTEFF,FRO(NFD-1), + > POW(NZ),TCOMB(NZ),DCOOL(NZ),TCOOL(NZ),TSURF(NZ),HCOOL(NZ), + > PCOOL(NZ),MUT(NZ), HD(NZ), PCH(NZ) + CHARACTER UCONDF*12,UCONDC*12 +*---- +* LOCAL VARIABLES +*---- + TYPE(tpdata) STP,FTP + PARAMETER (KMAXO=100,MAXNPO=40) + REAL TRE11(MAXNPO),RADD(MAXNPO),ENT(4),MFLOW,TLC(NZ) + CHARACTER HSMG*131,SNAME*32,SCOMP*32,FNAME*32,FCOMP*32 + REAL XS(4),TC1,PC(NZ),TP(NZ),RHOL,XFL(NZ),EPS(NZ),HINLET, + > TCLAD(NZ),ENTH(NZ),SLIP(NZ),AGM(NZ),QFUEL(NZ),QCOOL(NZ),K11, + > VLIQ(NZ),VVAP(NZ) + INTEGER KWA(NZ) + REAL XX2(MAXNPO),XX3(MAXNPO),ZF(2) + DATA XS/-0.861136,-0.339981,0.339981,0.861136/ + + REAL TBUL(NZ),VGJprime(NZ),HLV(NZ),DGCOOL(NZ),DLCOOL(NZ) + + INTEGER I + REAL PINLET, ERRV, ERRP, ERRD, NORMV, NORMP, NORMD +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: VCOOL,TCENT + REAL, ALLOCATABLE, DIMENSION(:,:) :: TEMPT + + REAL, ALLOCATABLE, DIMENSION(:) :: PTEMP, VTEMP, DTEMP +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(VCOOL(NZ),TEMPT(NDTOT,NZ),TCENT(NZ)) + ALLOCATE(PTEMP(NZ), VTEMP(NZ), DTEMP(NZ)) +*---- +* COMPUTE THE INLET FLOW ENTHALPY AND VELOCITY +* INITIALIZE PINLET TO POUTLET, WILL BE UPDATED IF IPRES=1 +* ELSE PINLET = POUTLET +*---- + PINLET = POUTLET + IF(NDTOT.GT.MAXNPO) CALL XABORT('THMDRV: MAXNPO OVERFLOW.') + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PINLET,TSAT) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PINLET,TSAT) +*CGT TODO: GET ALSO FREEZING?? + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSGT(SNAME,SCOMP,STP,IMPX) + CALL THMSST(STP,TSAT,IMPX) +*CGT + ENDIF + IF (IFUEL.EQ.1) THEN + CALL THMSGT(FNAME,FCOMP,FTP,IMPX) + ENDIF + + IF(TINLET.GT.TSAT) THEN + WRITE(HSMG,'(27HTHMDRV: INLET TEMPERATURE (,1P,E12.4, + > 40H K) GREATER THAN SATURATION TEMPERATURE.)') TINLET + CALL XABORT(HSMG) + ENDIF + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TINLET,RHOIN,HINLET,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TINLET,RHOIN,HINLET,R3,R4,R5) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TINLET,RHOIN,HINLET,R3,R4,R5,IMPX) + ENDIF + MFLOW=SPEED*RHOIN + HMSUP=HINLET +*---- +* INITIALIZE VALUES OF STEAM QUALITIES, VOID FRACTION AND DENSITY +* PRESSURE, VELOCITY AND TEMPERATURE OF THE COOLANT ALONG THE CHANNEL. +*--- + DO K=1,NZ + EPS(K)=0.0 + XFL(K)=0.0 + SLIP(K)=1.0 + KWA(K)=0 + MUT(K)=0.0 + QFUEL(K)=0.0 + VGJprime(K)=0.0 + HLV(K)=0.0 + + PCOOL(K)=PINLET + VCOOL(K)=MFLOW/RHOIN + DCOOL(K)=RHOIN + DLCOOL(K)=RHOIN + DGCOOL(K)=0.0 + TCOOL(K)=TINLET + HCOOL(K)=HINLET +*---- +* COMPUTE THE SATURATION TEMPERATURE AND THE THERMODYNAMIC PROPERTIES +* IF THE PRESSURE DROP IS COMPUTED +*--- + + IF (IPRES.EQ.1) THEN + IF(POW(K).EQ.0.0) CYCLE + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PCOOL(K),TSAT) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PCOOL(K),TSAT) + ENDIF + + TB=TSAT-0.1 + IF(TCOOL(K).LT.TB) THEN + IF(IFLUID.EQ.0) THEN + CALL THMPT(PCOOL(K),TCOOL(K),RHOIN,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PCOOL(K),TCOOL(K),RHOIN,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TCOOL(K),R11,H11,K11,MUT(K),C11,IMPX) + ENDIF + ELSE + IF(IFLUID.EQ.0) THEN + CALL THMPT(PCOOL(K),TB,R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PCOOL(K),TB,R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TB,R11,H11,K11,MUT(K),C11,IMPX) + ENDIF + ENDIF + ENDIF + ENDDO +*---- +* MAIN LOOP ALONG THE 1D CHANNEL. +*---- + ERRV = 1.0 + ERRP = 1.0 + ERRD = 1.0 + NORMP = PINLET + NORMV = SPEED + NORMD = RHOIN + I=0 + IF (IPRES .EQ. 0) GOTO 30 + 10 CONTINUE +*---- +* UPDATE HINLET FUNCTION OF INLET PRESSURE AND TEMPERATURE +*---- + HMSUP=HINLET + SPEED=MFLOW/DCOOL(1) +*---- +* WHILE LOOP FOR PRESSURE AND VELOCITY CONVERGENCE +* CHECK FOR CONVERGENCE +*---- + IF (I .GT. 1000) GOTO 20 + IF ((ERRP.LT.5E-4).AND.(ERRV.LT.5E-4).AND.(IDFM.EQ.0)) GOTO 20 + + IF ((IDFM.GT.0).AND.(I.GT.3)) THEN + IF ((ERRP.LT.5E-4).AND.(ERRV.LT.5E-4).AND.(ERRD.LT.5E-4)) THEN + GOTO 20 + ENDIF + ENDIF + + I = I + 1 + + PTEMP = PCOOL + VTEMP = VCOOL + DTEMP = DCOOL + + SPEED = MFLOW/DCOOL(1) + CALL THMPV(SPEED, PCOOL(NZ), VCOOL, DCOOL, + > PCOOL, TCOOL, MUT, XFL, HD, NZ, + > HZ, EPS, DLCOOL,DGCOOL, VGJprime, IDFM, ACOOL) +* Extrapolate from first two values of PCOOL to get PINLET at first face. +* This ensures that computed HINLET is not HCOOL(1) + PINLET = (3.0/2.0)*PCOOL(1) - (1.0/2.0)*PCOOL(2) + IF (IFLUID.EQ.0) THEN + CALL THMPT(PINLET, TINLET, RHOIN, HINLET, R3, R4, R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TINLET,RHOIN,HINLET,R3,R4,R5) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TINLET,RHOIN,HINLET,R3,R4,R5,IMPX) + ENDIF +* Update inlet enthalpy based on computed inlet pressure. + HMSUP = HINLET + 30 CONTINUE +*---- +* MAIN LOOP ALONG THE 1D CHANNEL. +*---- + K0=0 ! onset of nucleate boiling point + DO K=1,NZ + IF(POW(K).EQ.0.0) CYCLE + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PCOOL(K),TSAT) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PCOOL(K),TSAT) + ENDIF + TBUL(K)=TSAT +*---- +* COMPUTE THE LINEAR POWER, THE VOLUMIC POWER AND THE THERMAL EXCHANGE +* COEFFICIENT OF THE GAP +*---- + DV=VOLXY*HZ(K) +* linear power in W/m + POWLIN=(POW(K)/DV)*VOLXY/FNFU(K) +* volumic power in W/m^3 + QFUEL(K)=POW(K)*FFUEL(K)/DV + QCOOL(K)=POW(K)*FCOOL(K)/DV +*---- +* INITIALIZATION OF PINCELL TEMPERATURES +*---- + IF(POW(K).EQ.0.0) CYCLE + IF(IMPX.GT.4) WRITE(6,190) K + DO L=1,NDTOT + TRE11(L)=TCOMB(K) + ENDDO + DO L=1,NDTOT-1 + RADD(L)=RAD(L,K) + ENDDO +*---- +* COMPUTE THE POWER DENSITY AND HEAT FLOW ALONG THE CHANNEL +*---- +* out-of-clad heat flow in W/m2 + IF(IMPX.GT.5) WRITE(6,'(15H THMDRV: QFUEL(,I5,2H)=,1P,E12.4, + > 6H W/m2.)') K,QFUEL(K) + PHI2=0.5*QFUEL(K)*RAD(NFD,K)**2/RAD(NDTOT-1,K) + IF(PHI2.GT.CFLUX) THEN + WRITE(HSMG,'(23HTHMDRV: THE HEAT FLUX (,1P,E12.4,5H) IS , + > 37HGREATER THAN THE CRITICAL HEAT FLUX (,E12.4,2H).)') + > PHI2,CFLUX + CALL XABORT(HSMG) + ENDIF +*---- +* COMPUTE FOUR VALUES OF ENTHALPY IN J/KG TO BE USED IN GAUSSIAN +* INTEGRATION. DELTH1 IS THE ENTHALPY INCREASE IN EACH AXIAL MESH. +*---- + IF (IDFM.EQ.0) THEN + DELTH1=(PCH(K)/ACOOL(K)*PHI2+QCOOL(K))*HZ(K)/MFLOW + ELSE + DELTH1= (PCH(K)/ACOOL(K)*PHI2+QCOOL(K))*HZ(K)*ACOOL(K) + ENDIF + IF ((K.GT.1).AND.(IDFM.GT.0)) THEN + DELTH1= (PCH(K)/ACOOL(K)*PHI2+QCOOL(K))*HZ(K)*ACOOL(K) + DELTH1 = DELTH1 + ((VCOOL(K-1) + EPS(K-1)*(DLCOOL(K-1)- + > DGCOOL(K-1))/DCOOL(K-1)*VGJprime(K-1)) + > + (VCOOL(K) + EPS(K)*(DLCOOL(K)-DGCOOL(K))/ + > DCOOL(K)*VGJprime(K)))/2*(PCOOL(K-1)*ACOOL(K-1)-PCOOL(K) + > *ACOOL(K)) + DELTH1 = DELTH1 +(EPS(K-1)*DGCOOL(K-1)*(DLCOOL(K-1)/ + > DCOOL(K-1))*HLV(K-1)*VGJprime(K-1)*ACOOL(K-1))-(EPS(K)* + > DGCOOL(K)*(DLCOOL(K)/DCOOL(K))*HLV(K)*VGJprime(K)*ACOOL(K)) + DELTH1 = DELTH1/MFLOW/ACOOL(K) + ENDIF + DO I1=1,4 + POINT=(1.0+XS(I1))/2.0 + ENT(I1)=HMSUP+POINT*DELTH1 + ENDDO + HMSUP=HMSUP+DELTH1 +*---- +* COMPUTE THE VALUE OF THE DENSITY AND THE CLAD-COOLANT HEAT TRANSFER +* COEFFICIENT +*---- + IF(K.GT.1) THEN + XFL(K)=XFL(K-1) + EPS(K)=EPS(K-1) + SLIP(K)=SLIP(K-1) + ENDIF +*CGT + IF ((IFLUID.EQ.0).OR.(IFLUID.EQ.1)) THEN + CALL THMH2O(0,IX,IY,K,K0,PCOOL(K),MFLOW,HMSUP,ENT,HD(K), + > IFLUID,IHCONV,KHCONV,ISUBM,RAD(NDTOT-1,K),ZF,VCOOL(K), + > IDFM,PHI2,XFL(K),EPS(K),SLIP(K),ACOOL(K),PCH(K),HZ(K),TCALO, + > RHO,RHOL,RHOG,TRE11(NDTOT),KWA(K),VGJprime(K),HLV(K)) + ELSEIF (IFLUID.EQ.2) THEN + CALL THMSAL(IMPX,0,IX,IY,K,K0,MFLOW,HMSUP,ENT,HD(K),STP, + > IHCONV,KHCONV,ISUBM,RAD(NDTOT-1,K),ZF,PHI2,XFL(K), + > EPS(K),SLIP(K),HZ(K),TCALO,RHO,RHOL,TRE11(NDTOT), + > KWA(K)) + ENDIF +*CGT +*---- +* STEADY-STATE SOLUTION OF THE CONDUCTION EQUATIONS IN A FUEL PIN. +*---- + DTINV=0.0 + IF(IGAP.EQ.0) THEN + CALL THMROD(IMPX,NFD,NDTOT-1,MAXIT1,MAXITL,ERMAXT,DTINV,RADD, + > TRE11,TRE11,QFUEL(K),FRO,TRE11(NDTOT),POWLIN,XBURN(K), + > POROS,FRACPU,ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC, + > KCONDC,UCONDC,IHGAP,KHGAP,IFRCDI,TC1,XX2,XX3,ZF) + ELSE + CALL THMRNG(IMPX,NFD,NDTOT-1,MAXIT1,MAXITL,ERMAXT,DTINV,RADD, + > TRE11,TRE11,QFUEL(K),FRO,TRE11(NDTOT),XBURN(K), + > POROS,FRACPU,ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC, + > KCONDC,UCONDC,IFRCDI,IFUEL,FTP,TC1,XX2,XX3,ZF) + ENDIF +* + DO K1=1,NDTOT-1 + TRE11(K1)=XX2(K1)+TRE11(NDTOT)*XX3(K1) + ENDDO +*---- +* RECOVER MESHWISE TEMPERATURES AND FLUID DENSITY. BY DEFAULT, USE THE +* ROWLANDS FORMULA TO COMPUTE THE EFFECTIVE FUEL TEMPERATURE, OTHERWISE +* USE USER-SPECIFIED WEIGHTING FACTOR. +*---- + TCOMB(K)=(1.0-WTEFF)*TC1+WTEFF*TRE11(NFD) + TCENT(K)=TC1 + TSURF(K)=TRE11(NFD) + TCLAD(K)=TRE11(NDTOT) + TCOOL(K)=TCALO + DCOOL(K)=RHO + DLCOOL(K)=RHOL + HCOOL(K)=HMSUP + PC(K)=PINLET + TP(K)=TCLAD(K) + TLC(K)=TCOOL(K) + ENTH(K)=HCOOL(K) + AGM(K)=MFLOW ! constant flow rate + DO K2=1,NDTOT + TEMPT(K2,K)=TRE11(K2) + ENDDO + IF (IPRES .EQ. 0) THEN + PCOOL(K)=PINLET + VCOOL(K)=MFLOW/DCOOL(K) + ENDIF +*---- +* COMPUTE THE SATURATION TEMPERATURE AND THE THERMODYNAMIC PROPERTIES +* IF THE PRESSURE DROP IS COMPUTED +*--- + IF (IPRES.EQ.1) THEN + IF(POW(K).EQ.0.0) CYCLE + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PCOOL(K),TSAT) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PCOOL(K),TSAT) + ENDIF + + TB=TSAT-0.1 + IF(TCOOL(K).LT.TB) THEN + IF(IFLUID.EQ.0) THEN + CALL THMPT(PCOOL(K),TCOOL(K),RHOIN,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PCOOL(K),TCOOL(K),RHOIN,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TCOOL(K),R11,H11,K11,MUT(K),C11,IMPX) + ENDIF + ELSE + IF(IFLUID.EQ.0) THEN + CALL THMPT(PCOOL(K),TB,R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PCOOL(K),TB,R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TB,R11,H11,K11,MUT(K),C11,IMPX) + ENDIF + ENDIF + ENDIF + ENDDO +*---- +* IF THE PRESSURE DROP IS COMPUTED, COMPUTE THE +* THE PRESSURE AND VELOCITY RESIDUALS +* IF DFM IS ACTIVATED, COMPUTE DCOOL RESIDUALS +*---- + IF (IPRES .EQ. 0) GOTO 20 + ERRV = 0.0 + ERRP = 0.0 + ERRD = 0.0 + NORMV = 0.0 + NORMP = 0.0 + NORMD = 0.0 + + DO K=1,NZ +* Under relaxation of coolant pressure and velocity. + VCOOL(K) = 0.40*VCOOL(K) + (1.00-0.40)*VTEMP(K) + PCOOL(K) = 0.40*PCOOL(K) + (1.00-0.40)*PTEMP(K) + ERRV = ERRV + (VCOOL(K)-VTEMP(K))**2 + NORMV = NORMV + VCOOL(K)**2 + ERRP = ERRP + (PCOOL(K)-PTEMP(K))**2 + NORMP = NORMP + PCOOL(K)**2 + IF (IDFM.GT.0) THEN +* Under relaxation of coolant density. + DCOOL(K) = 0.40*DCOOL(K) + (1.00-0.40)*DTEMP(K) + ERRD = ERRD + (DCOOL(K) - DTEMP(K))**2 + NORMD = NORMD + DCOOL(K)**2 + ENDIF + ENDDO + NORMV = SQRT(NORMV) + NORMP = SQRT(NORMP) + ERRV = SQRT(ERRV) / NORMV + ERRP = SQRT(ERRP) / NORMP + IF (IDFM.GT.0) THEN + NORMD = SQRT(NORMD) + ERRD = SQRT(ERRD) / NORMD + ENDIF + GO TO 10 + + 20 CONTINUE + + IF (I.GE.1000) THEN + PRINT *, 'ERRV =', ERRV + PRINT *, 'ERRP =', ERRP + PRINT *, 'ERRD =', ERRD + CALL XABORT('THMDRV: MAXIMUM NB OF ITERATIONS REACHED.') + ELSE IF(IMPX.GT.0) THEN + WRITE(6,'(37H THMDRV: CONVERGENCE REACHED AT ITER=,I5,1H.)') I + ENDIF + +*---- +* RECONSTRUCT THE PHASE VELOCITIES FROM VCOOL, EPS and VGJ +*---- + DO K=1,NZ + IF (IDFM .GT. 0) THEN + VLIQ(K) = VCOOL(K) - (1.0/(1.0- EPS(K)) - DLCOOL(K)/DCOOL(K)) + > * VGJprime(K) + VVAP(K) = VCOOL(K) + DLCOOL(K)/DCOOL(K) *VGJprime(K) + ELSE + VLIQ(K) = VCOOL(K) + VVAP(K) = VCOOL(K) + ENDIF + ENDDO +*---- +* PRINT THE THERMOHYDRAULICAL PARAMETERS +*---- + IF(IMPX.GT.4) THEN + WRITE(6,250) 'POW', POW(:NZ) + WRITE(6,250) 'PCOOL', PCOOL(:NZ) + WRITE(6,250) 'VCOOL', VCOOL(:NZ) + WRITE(6,250) 'DCOOL', DCOOL(:NZ) + WRITE(6,250) 'TCOOL', TCOOL(:NZ) + WRITE(6,250) 'EPS', EPS(:NZ) + WRITE(6,250) 'XFL', XFL(:NZ) + WRITE(6,250) 'TSAT', TBUL(:NZ) + WRITE(6,250) 'MUT', MUT(:NZ) + ENDIF +*---- +* PRINT THE OUTLET THERMOHYDRAULICAL PARAMETERS +*---- + IF(IMPX.GT.3) THEN + WRITE(6,'(/16H THMDRV: CHANNEL,2I6/1X,27(1H-))') IX,IY + WRITE(6,210) ' ____________________________________________', + > '_____________________________________________________', + > '_____________________________________________________', + > '______________' + WRITE(6,210) '| | TCOMB | TSURF | DCOOL ', + > ' | TCOOL | PCOOL | HCOOL | ', + > 'QFUEL | QCOOL | VOID | QUAL |', + > ' SLIP | FLOW |', + > '| | K | K | Kg/m3 | ', + > ' K | Pa | J/Kg | W/m3 ', + > ' | W/m3 | | | ', + > ' | REGIME |' + WRITE(6,210) '|_____|____________|____________|____________', + > '_|_____________|_____________|_____________|_________', + > '____|_____________|___________|_____________|________', + > '_____|________|' + DO L=NZ,1,-1 + IF(L.EQ.1) THEN + WRITE(6,220) '| BOT |',TCOMB(L),' |',TSURF(L), + > ' |',DCOOL(L),' |',TCOOL(L),' |',PCOOL(L), + > ' |',HCOOL(L),' |',QFUEL(L),' |',QCOOL(L),' |', + > EPS(L),' |',XFL(L),' |',SLIP(L),' |',KWA(L),' |' + ELSEIF(L.EQ.NZ) THEN + WRITE(6,220) '| TOP |',TCOMB(L),' |',TSURF(L), + > ' |',DCOOL(L),' |',TCOOL(L),' |',PCOOL(L), + > ' |',HCOOL(L),' |',QFUEL(L),' |',QCOOL(L),' |', + > EPS(L),' |',XFL(L),' |',SLIP(L),' |',KWA(L),' |' + ELSE + WRITE(6,230) '| ',L,' |',TCOMB(L),' |',TSURF(L), + > ' |',DCOOL(L),' |',TCOOL(L),' |',PCOOL(L), + > ' |',HCOOL(L),' |',QFUEL(L),' |',QCOOL(L),' |', + > EPS(L),' |',XFL(L),' |',SLIP(L),' |',KWA(L),' |' + ENDIF + ENDDO + WRITE(6,210) '|_____|____________|____________|____________', + > '_|_____________|_____________|_____________|_________', + > '____|_____________|___________|_____________|________', + > '_____|________|' + WRITE(6,240) MFLOW + ENDIF +*---- +* MODIFICATION OF THE VECTORS TO FIT THE GEOMETRY OF THE CHANNELS AND +* THE BUNDLES AND WRITE THE DATA IN LCM OBJECT THM +*---- + CALL LCMPUT(MPTHM,'PRESSURE',NZ,2,PCOOL) + CALL LCMPUT(MPTHM,'DENSITY',NZ,2,DCOOL) + CALL LCMPUT(MPTHM,'LIQUID-DENS',NZ,2,DLCOOL) + CALL LCMPUT(MPTHM,'ENTHALPY',NZ,2,HCOOL) + CALL LCMPUT(MPTHM,'VELOCITIES',NZ,2,VCOOL) + CALL LCMPUT(MPTHM,'V-LIQ',NZ,2,VLIQ) + CALL LCMPUT(MPTHM,'V-VAP',NZ,2,VVAP) + CALL LCMPUT(MPTHM,'EPSILON',NZ,2,EPS) + CALL LCMPUT(MPTHM,'EPSOUT',1,2,EPS(NZ)) + CALL LCMPUT(MPTHM,'XFL',NZ,2,XFL) + CALL LCMPUT(MPTHM,'CENTER-TEMPS',NZ,2,TCENT) + CALL LCMPUT(MPTHM,'COOLANT-TEMP',NZ,2,TCOOL) + CALL LCMPUT(MPTHM,'POWER',NZ,2,POW) + CALL LCMPUT(MPTHM,'TEMPERATURES',NDTOT*NZ,2,TEMPT) + CALL LCMPUT(MPTHM,'PINLET',1,2,PINLET) + CALL LCMPUT(MPTHM,'TINLET',1,2,TINLET) + CALL LCMPUT(MPTHM,'VINLET',1,2,SPEED) + CALL LCMPUT(MPTHM,'POULET',1,2,POUTLET) + CALL LCMPUT(MPTHM,'RADII',(NDTOT-1)*NZ,2,RAD) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(TCENT,TEMPT,VCOOL) + DEALLOCATE(PTEMP, VTEMP, DTEMP) + RETURN +* + 190 FORMAT(/21H THMDRV: AXIAL SLICE=,I5) + 210 FORMAT(1X,A,A,A,A) + 220 FORMAT(1X,A,F11.2,A,F11.2,A,F12.4,A,F12.2,A,3P,E12.4, + > A,1P,E12.4,A,1P,E12.4,A,1P,E12.4,A,0P,F10.4,A,E12.4,A, + > E12.4,A,I5,2X,A) + 230 FORMAT(1X,A,I3,A,F11.2,A,F11.2,A,F12.4,A,F12.2,A,3P,E12.4, + > A,1P,E12.4,A,1P,E12.4,A,1P,E12.4,A,0P,F10.4,A,E12.4,A, + > E12.4,A,I5,2X,A) + 240 FORMAT(7H MFLXT=,1P,E12.4,8H Kg/m2/s) + 250 FORMAT(9H THMDRV: ,A6,1H:,1P,11E12.4/(4X,12E12.4)) + END diff --git a/Donjon/src/THMFRI.f b/Donjon/src/THMFRI.f new file mode 100644 index 0000000..cc413e3 --- /dev/null +++ b/Donjon/src/THMFRI.f @@ -0,0 +1,53 @@ +*DECK THMFRI + SUBROUTINE THMFRI(REY,EPS,HD,FRIC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the value of the friction factor coefficient with : +* - Laminar flow correlation based on condition on Reynolds number +* - Muller Steinhagen correlation formula (single phase) +* - Churchill's correlation in two phase flows +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal. +* +*Author(s): +* P. Gallet (creation) +* 07/08/2025 : Modified by M. Bellier to include Churchill +* +*Parameters: input +* REY reynolds number +* EPS void fraction +* HD hydraulic diameter +* +*Parameters: output +* FRIC friction factor coefficient +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + REAL REY,FRIC,HD,EPS,R +*---- +* COMPUTE VALUE OF THE FRICTION FACTOR COEFFICIENT AS FUNCTION OF THE +* REYNOLDS NUMBER +*---- + +! Laminar flow + IF (REY.LE.1187.0) THEN + FRIC=64.0/REY +! Blasius-like correlation used by C. Huet in his python prototype + ELSE IF (EPS.LT.0.002) THEN + FRIC=0.3164/(REY**0.25) +! Churchill's correlation + ELSE + R = 0.0000004/HD !Relative roughness=Roughness/Hydraulic Diameter + FRIC=8*(((8.0/REY)**12)+((2.475*LOG(((7/REY)**0.9)+0.27*R)) + > **16+(37530/REY)**16)**(-1.5))**(0.0833333) + ENDIF + + RETURN + END diff --git a/Donjon/src/THMGAP.f b/Donjon/src/THMGAP.f new file mode 100644 index 0000000..1ca6149 --- /dev/null +++ b/Donjon/src/THMGAP.f @@ -0,0 +1,95 @@ +*DECK THMGAP + SUBROUTINE THMGAP(POWLIN,BURN,HGAP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the heat exchange coefficient of the gap. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input +* POWLIN linear power in W/m +* BURN fuel burnup in MWday/tonne +* +*Parameters: output +* HGAP heat exchange coefficient of the gap in W/m^2/K. Values with +* POWLIN greater than 400 W/cm or BURN greater than 50000 +* MWday/ton and up to 90000 MWday/ton are extrapolated. +* After 90000 MWday/ton, the setting of a constant HGAP value +* is required and the thermal mechanic model below is by-passed. +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + REAL POWLIN,BURN,HGAP +*---- +* LOCAL VARIABLES +*---- + CHARACTER HSMG*300 + REAL TAB1(19),TAB2(11),C(19,11),TERP1(19),TERP2(11),WK1(3,19), + > WK2(3,11) + INTEGER I1,I2 +* + DATA TAB1/0.,5000.,10000.,15000.,20000.,25000.,30000.,35000., + > 40000.,45000.,50000.,55000.,60000.,65000.,70000., + > 75000.,80000.,85000.,90000./ + DATA TAB2/0.,30.,100.,170.,240.,310.,380.,400.,420.,440.,460./ + DATA C/0.657,0.702,0.814,0.987,1.311,2.114,2.445,2.415,2.324,2.229 + > ,2.137,2.048,1.962,1.880,1.786,1.697,1.608,1.519,1.430 + > ,0.678,0.726,0.848,1.043,1.444,2.465,2.810,2.790,2.718,2.640 + > ,2.562,2.484,2.406,2.328,2.250,2.172,2.094,2.016,1.938 + > ,0.727,0.783,0.927,1.173,1.755,3.283,3.661,3.666,3.637,3.598 + > ,3.554,3.505,3.453,3.397,3.356,3.307,3.259,3.211,3.163 + > ,0.787,0.854,1.032,1.373,2.322,3.800,3.790,3.780,3.769,3.756 + > ,3.741,3.724,3.706,3.687,3.673,3.656,3.640,3.623,3.607 + > ,0.861,0.949,1.185,1.725,3.385,3.873,3.863,3.854,3.842,3.829 + > ,3.814,3.797,3.779,3.760,3.746,3.729,3.713,3.696,3.680 + > ,0.949,1.068,1.415,2.385,3.925,3.910,3.900,3.891,3.879,3.865 + > ,3.850,3.834,3.817,3.800,3.785,3.769,3.754,3.738,3.722 + > ,1.071,1.248,1.843,3.686,3.957,3.941,3.929,3.915,3.898,3.875 + > ,3.847,3.814,3.779,3.742,3.711,3.678,3.644,3.611,3.578 + > ,1.114,1.317,2.033,3.981,3.964,3.946,3.931,3.911,3.885,3.851 + > ,3.807,3.754,3.697,3.638,3.589,3.535,3.481,3.428,3.374 + > ,1.161,1.396,2.264,4.153,4.002,3.950,3.926,3.897,3.856,3.804 + > ,3.735,3.651,3.560,3.469,3.390,3.306,3.221,3.137,3.052 + > ,1.212,1.485,2.542,4.155,4.090,3.953,3.913,3.869,3.806,3.729 + > ,3.624,3.495,3.356,3.219,3.098,2.969,2.841,2.712,2.583 + > ,1.268,1.586,2.873,3.938,4.243,3.956,3.889,3.826,3.731,3.620 + > ,3.465,3.273,3.067,2.867,2.687,2.497,2.306,2.116,1.926/ +* + IF(BURN.GT.90000.) THEN + WRITE(HSMG,'(22HTHMGAP: BURNUP VALUE (,1P,E11.4, + > 35H) TOO HIGH FOR THE THERMAL MECHANIC, + > 41H MODEL COMPUTING THE HEAT EXCHANGE OF THE, + > 38H FUEL-CLADDING GAP (LIMIT 90000MWd/t)., + > 45H ALTERNATIVELY, YOU CAN SET THE HGAP CONSTANT, + > 19H IN THE THM MODULE.)') BURN + CALL XABORT(HSMG) + ENDIF + + CALL ALTERP(.TRUE.,19,TAB1(1),BURN,.FALSE.,TERP1(1),WK1(1,1)) + HGAP=0.0 + IF(POWLIN.LE.460.E2) THEN + CALL ALTERP(.TRUE.,11,TAB2(1),POWLIN/1.0E2,.FALSE.,TERP2(1), + > WK2(1,1)) + DO I1=1,19 + DO I2=1,11 + HGAP=HGAP+TERP1(I1)*TERP2(I2)*C(I1,I2) + ENDDO + ENDDO + ELSE + DO I1=1,19 + HGAP=HGAP+TERP1(I1)*C(I1,11) + ENDDO + ENDIF + HGAP=HGAP*1.0E4 + RETURN + END diff --git a/Donjon/src/THMGCD.f b/Donjon/src/THMGCD.f new file mode 100644 index 0000000..8a0ffa7 --- /dev/null +++ b/Donjon/src/THMGCD.f @@ -0,0 +1,58 @@ +*DECK THMCCD + REAL FUNCTION THMGCD(TEMP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the product of the heat capacity of cladding (in J/Kg/K) times +* its density (in Kg/m^3). +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal. +* +*Author(s): +* P. Gallet +* +*Parameters: input +* TEMP cladding temperature in Kelvin. +* +*Parameters: output +* THMGCD product of the heat capacity of the cladding times its density +* (in J/K/m^3). +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + REAL TEMP +*---- +* LOCAL VARIABLES +* CP: cladding heat capacity in J/Kg/K +* RO: cladding density with zero porosity in kg/m^3 +*---- + REAL CP,RO,DKELV,T0,T1,T2 + PARAMETER (DKELV=273.15,T0=1090.0,T1=1169.0,T2=1243.0) +* +* calculation of the density of the cladding with the value of the +* temperature + RO=6690.0-0.1855*TEMP +* calculation of the heat capacity of the cladding in J/kg/K + IF(TEMP.LE.T0) THEN +* for : T<1090.0 + CP=226.7+0.2066*TEMP-0.6492E-04*TEMP**2.0 + ELSE IF(TEMP.LE.T1) THEN +* for : 1090<=T<1169.0 + CP=6.94*TEMP-7189.0 + ELSE IF(TEMP.LE.T2) THEN +* for : 1169<=T<1243.0 + CP=9312.9-7.177*TEMP + ELSE +* for T>=1243.0 + CP=356.0 + ENDIF +* calculation of internal energy of the cladding in J/m^3/K + THMGCD=RO*CP + RETURN + END diff --git a/Donjon/src/THMGDI.f b/Donjon/src/THMGDI.f new file mode 100644 index 0000000..ef4781f --- /dev/null +++ b/Donjon/src/THMGDI.f @@ -0,0 +1,76 @@ +*DECK THMGDI + FUNCTION THMGDI(T2K,T1K,ICONDC,NCONDC,KCONDC,UCONDC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the average thermal conductivity of the cladding +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal. +* +*Author(s): +* P. Gallet, V. Salino +* +*Parameters: input +* T2K final temperature in Kelvin. +* T1K initial temperature in Kelvin. +* ICONDC clad conductivity flag (0=default/1=user-provided +* polynomial). +* NCONDC degree of user-provided clad conductivity polynomial. +* KCONDC polynomial coefficients for clad conductivity in W/m/K^(k+1). +* UCONDC required unit of temperature in polynomial for clad +* conductivity (KELVIN or CELSIUS). +* +*Parameters: output +* THMGDI thermal conductivity of the cladding in W/m/K. +* +*Reference: +* A. Poncot, "Assimilation de donnees pour la dynamique du xenon dans +* les coeurs de centrale nucleaire", Ph.D Thesis, Universite de +* Toulouse, France, 2008. +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER ICONDC,NCONDC + REAL T1K,T2K,KCONDC(NCONDC+1),THMGDI + CHARACTER UCONDC*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER K + REAL T1,T2,TM,TMK,ZKELV +* + PARAMETER ( ZKELV=273.15 ) +* + IF(MIN(T1K,T2K).LE.0.0) THEN + CALL XABORT('@THMGDI: NEGATIVE TEMPERATURE.') + ENDIF + T1=T1K-ZKELV + T2=T2K-ZKELV +* + TM=(T1+T2)*0.5 + IF(ICONDC.EQ.1) THEN +* User-given conductivity, as a polynomial of temperature + THMGDI=0.0 + IF(UCONDC.EQ.'KELVIN') THEN + TMK = TM + ZKELV + DO K=1,NCONDC+1 + THMGDI = THMGDI + KCONDC(K)*TMK**(K-1) + ENDDO + ELSE + DO K=1,NCONDC+1 + THMGDI = THMGDI + KCONDC(K)*TM**(K-1) + ENDDO + ENDIF + ELSE +* thermal conductivity of the cladding in W/m/K + THMGDI=12.0+1.25E-2*TM + ENDIF + + RETURN + END diff --git a/Donjon/src/THMH2O.f b/Donjon/src/THMH2O.f new file mode 100644 index 0000000..eb22012 --- /dev/null +++ b/Donjon/src/THMH2O.f @@ -0,0 +1,389 @@ +*DECK THMH2O + SUBROUTINE THMH2O(ITIME,I,J,K,K0,PINLET,MFLOW,HMAVG,ENT,HD,IFLUID, + > IHCONV,KHCONV,ISUBM,RADCL,ZF,VCOOL,IDFM,PHI,XFL,EPS,SLIP, + > ACOOL,PCH,DZ,TCALO,RHO,RHOLAV,RHOG,TSCLAD,KWA,VGJprime,HLV) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Nucleate boiling correlations along a single coolant channel. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert, P. Gallet +* +*Parameters: input +* ITIME type of calculation (0=steady-state; 1=transient). +* I position of channel alon X-axis +* J position of channel alon Y-axis +* K position of channel alon Z-axis +* K0 onser of nuclear boiling point +* PINLET pressure in Pascal +* MFLOW massic coolant flow rate in Kg/m^2/s +* HMAVG averaged enthalpy +* ENT four values of enthalpy in J/Kg to be used in Gaussian +* integration +* HD hydraulic diameter in m +* IFLUID type of fluid (0=H2O; 1=D2O). +* IHCONV flag indicating HCONV chosen (0=default/1=user-provided). +* KHCONV fixed user-provided HCONV value in W/m^2/K. +* ISUBM subcooling model (0: one-phase; 1: Jens-Lottes model; +* 2: Saha-Zuber model). +* RADCL outer clad radius in m +* ZF parameters used to compute heat flux on clad surface in +* transient cases. +* PHI heat flow exchanged between clad and fluid in W/m^2. +* Given in steady-state cases. +* XFL input coolant flow quality +* EPS input coolant void fraction +* SLIP input slip ratio of vapor phase speed to liquid phase speed. +* ACOOL coolant cross section area in m^2. +* PCH heating perimeter in m. +* DZ axial mesh width in m. +* VCOOL local coolant velocity +* IDFM flag indicating if the drift flux model is to be used +* (0=HEM1(no drift velocity)/1=EPRI/2=MODEBSTION/3=GERAMP/4=CHEXAL) +* +*Parameters: output +* PHI heat flow exchanged between clad and fluid in W/m^2. +* Computed in transient cases. +* XFL output coolant flow quality +* EPS output coolant void fraction +* SLIP output slip ratio of vapor phase speed to liquid phase speed. +* TCALO coolant temperature in K +* RHO coolant density in Kg/m^3 +* RHOLAV liquid density in kg/m^3 +* RHOG vapour density in kg/m^3 +* TSCLAD clad temperature in K +* KWA flow regime (=0: single-phase; =1: subcooled; =2: nucleate +* boiling; =3 superheated steam) +* VGJ drift velocity in m/s +* VGJprime +* HLV delta between liquid and vapour enthalpies +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER I,J,K,K0,IFLUID,IHCONV,ISUBM,KWA + REAL PINLET,MFLOW,HMAVG,ENT(4),HD,KHCONV,RADCL,ZF(2),PHI,TCALO, + > RHO,RHOLAV,TSCLAD,XFL,EPS,SLIP,ACOOL,PCH,DZ,VCOOL,VGJprime +*---- +* LOCAL VARIABLES +*---- + REAL W(4),HL(4),JL,JG,REL,PRL,VGJ,UL + CHARACTER HSMG*131 + LOGICAL LFIRST +*---- +* SAVE VARIABLES +*---- + SAVE DHSUB,DSAT,W + DATA W /0.347855,0.652145,0.652145,0.347855/ +*---- +* COMPUTE THE PROPERTIES OF THE SATURATED STEAM +*---- + IF(HMAVG.LT.0.0) CALL XABORT('THMH2O: NEGATIVE INPUT ENTHALPY.') + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PINLET,TSAT) + CALL THMTX(TSAT,0.0,RHOL,HLSAT,ZKL,ZMUL,CPL) + CALL THMTX(TSAT,1.0,RHOG,HGSAT,ZKG,ZMUG,CPG) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PINLET,TSAT) + CALL THMHTX(TSAT,0.0,RHOL,HLSAT,ZKL,ZMUL,CPL) + CALL THMHTX(TSAT,1.0,RHOG,HGSAT,ZKG,ZMUG,CPG) + ENDIF +*---- +* COMPUTE THE DENSITY AND TEMPERATURE OF THE LIQUID +*---- + HL(1)=MIN1(ENT(1),HLSAT) + HL(2)=MIN1(ENT(2),HLSAT) + HL(3)=MIN1(ENT(3),HLSAT) + HL(4)=MIN1(ENT(4),HLSAT) + CALL THMPH(IFLUID,PINLET,HL(1),R11,TL1) + CALL THMPH(IFLUID,PINLET,HL(2),R11,TL2) + CALL THMPH(IFLUID,PINLET,HL(3),R11,TL3) + CALL THMPH(IFLUID,PINLET,HL(4),R11,TL4) + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TL1,RHO1,R2,R3,R4,CP1) + CALL THMPT(PINLET,TL2,RHO2,R2,R3,R4,CP2) + CALL THMPT(PINLET,TL3,RHO3,R2,R3,R4,CP3) + CALL THMPT(PINLET,TL4,RHO4,R2,R3,R4,CP4) + IF(ABS(TSAT-TL1).LT.0.1) CALL THMTX(TSAT,0.0,RHO1,R2,R3,R4,CP1) + IF(ABS(TSAT-TL2).LT.0.1) CALL THMTX(TSAT,0.0,RHO2,R2,R3,R4,CP2) + IF(ABS(TSAT-TL3).LT.0.1) CALL THMTX(TSAT,0.0,RHO3,R2,R3,R4,CP3) + IF(ABS(TSAT-TL4).LT.0.1) CALL THMTX(TSAT,0.0,RHO4,R2,R3,R4,CP4) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TL1,RHO1,R2,R3,R4,CP1) + CALL THMHPT(PINLET,TL2,RHO2,R2,R3,R4,CP2) + CALL THMHPT(PINLET,TL3,RHO3,R2,R3,R4,CP3) + CALL THMHPT(PINLET,TL4,RHO4,R2,R3,R4,CP4) + IF(ABS(TSAT-TL1).LT.0.1) CALL THMHTX(TSAT,0.0,RHO1,R2,R3,R4,CP1) + IF(ABS(TSAT-TL2).LT.0.1) CALL THMHTX(TSAT,0.0,RHO2,R2,R3,R4,CP2) + IF(ABS(TSAT-TL3).LT.0.1) CALL THMHTX(TSAT,0.0,RHO3,R2,R3,R4,CP3) + IF(ABS(TSAT-TL4).LT.0.1) CALL THMHTX(TSAT,0.0,RHO4,R2,R3,R4,CP4) + ENDIF + TL=0.5*(W(1)*TL1+W(2)*TL2+W(3)*TL3+W(4)*TL4) + RHOLAV=0.5*(W(1)*RHO1+W(2)*RHO2+W(3)*RHO3+W(4)*RHO4) + CPLAV=0.5*(W(1)*CP1+W(2)*CP2+W(3)*CP3+W(4)*CP4) +*---- +* COMPUTE THE STEAM FLOW QUALITY AND LIQUID ENTHALPY +* Reference: R. T. Lahey Jr. and F. J. Moody, "The thermal hydraulics +* of a Boiling water nuclear reactor," American Nuclear Society, 1977. +* Equation (5.177), page 224 +* F2: Thermodynamic quality +*---- + TSCLAD=600.0 + IF(K0.GT.0) TSCLAD=TSAT+DSAT + XFL0=XFL + EPS0=EPS + SLIP0=SLIP + LFIRST=.TRUE. + HLAVG=HMAVG + F2=0.0 + F3=0.0 + IF(K0.GT.0) THEN + HLV=HGSAT-HLSAT + IF((HLV.GT.0.0).AND.(DHSUB.GT.0.0)) THEN + F2=(HMAVG-HLSAT)/HLV + F3=(DHSUB/HLV)*EXP(-(HMAVG-HLSAT)/DHSUB-1.0) + ENDIF + IF(HMAVG.GE.HGSAT) THEN + XFL=1.0 + EPS=1.0 + SLIP=1.0 + HLAVG=0.0 + ELSE + IF(ISUBM.EQ.1) THEN +* Use the Paul Gallet thesis model. + PI=RHOLAV*CPLAV*(TSCLAD-TL)/(RHOG*HLV) + XFL=XFL0+PCH*PHI*DZ/(MFLOW*ACOOL*HLV)/(1.0+PI) + ELSE IF(ISUBM.EQ.2) THEN +* Use a profile fit model. + XFL=MAX(XFL0,(F2+F3)/(1.0+F3)) + ENDIF + HLAVG=MIN(HLSAT,(HMAVG-XFL*HGSAT)/(1.0-XFL)) + ENDIF +*---- +* RECOMPUTE THE LIQUID PROPERTIES +*---- + IF(HLAVG.GT.0.0) THEN + CALL THMPH(IFLUID,PINLET,HLAVG,RHOL,TL) + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TL,R1,R2,ZKL,ZMUL,CPL) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TL,R1,R2,ZKL,ZMUL,CPL) + ENDIF +*---- +* COMPUTE THE COOLANT VOID FRACTION AND SLIP RATIO +* A drift-flux model is proposed by means of the concentration +* parameter CO and the drift velocity VGJ (their correspondent +* correlations are supposed to work fine under different flow regimes. +*---- + IF(HGSAT.GT.HLSAT) THEN + CO=1.13 + PR=PINLET/10**6 + SIGM=-7.2391E-6*PR**3+2.8345E-4*PR**2-5.1566E-3*PR+4.2324E-2 + VGJ=1.18*((SIGM*9.81*(RHOL-RHOG))/RHOL**2)**0.25 + F4=CO*((XFL*RHOL)+((1.0-XFL)*RHOG))+(RHOL*RHOG*VGJ/MFLOW) + EPS=(XFL*RHOL)/F4 + JL=(1.0-XFL)*MFLOW/RHOL + JG=XFL*MFLOW/RHOG + IF(EPS.NE.0) SLIP=JG*(1.0-EPS)/(JL*EPS) + ENDIF + ELSE +* superheated steam + CALL THMPH(IFLUID,PINLET,HMAVG,RHOG,TCALO) + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TCALO,R1,R2,ZKG,ZMUG,CPG) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TCALO,R1,R2,ZKG,ZMUG,CPG) + ENDIF + ENDIF + ENDIF +*---- +* COMPUTE THE FLUID PROPERTIES +* RHO: fluid density +* REL: Reynolds number of liquid phase +* PRL: Prandtl number of liquid phase +*---- + IF(XFL.EQ.0.0) THEN +* One phase liquid + TB=TSAT-0.1 + IF(TL.LT.TB) THEN + TCALO=TL + ELSE + TCALO=TB + ENDIF + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TCALO,R1,R2,ZKONE,ZMUONE,CPONE) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TCALO,R1,R2,ZKONE,ZMUONE,CPONE) + ENDIF + RHO=RHOLAV + REL=MFLOW*HD/ZMUONE + PRL=ZMUONE*CPONE/ZKONE + ELSE IF(HMAVG.LT.HGSAT) THEN +* Two-phase flow + IF((IFLUID.EQ.0).AND.(IDFM.GT.0)) THEN + CALL THMDFM(PINLET,VCOOL,HMAVG,HD,TL,TSAT,IDFM,EPS,XFL, + > RHO,RHOL,RHOG,VGJ,VGJprime,C0,HLV) + CALL THMTX(TCALO, 0.0, RHO11, H11, ZK11, ZMUL, CPL) + UL = VCOOL - (EPS / (1.0 - EPS))*RHOG/RHO * VGJprime + REL = ABS(UL*RHOL) * HD / ZMUL + PRL = ZMUL*CPL/ZKL + ELSE + REL=MFLOW*(1.0-XFL)*HD/ZMUL + PRL=ZMUL*CPL/ZKL + ENDIF + TCALO=EPS*TSAT+(1.0-EPS)*TL + ZKONE=ZKL + CPONE=CPL + RHO=EPS*RHOG+(1.0-EPS)*RHOL + JL=(1.0-XFL)*MFLOW/RHOL + JG=XFL*MFLOW/RHOG + IF(EPS.NE.0) THEN + SLIP=JG*(1.0-EPS)/(JL*EPS) + ENDIF + ELSE +* superheated steam + RHO=RHOG + REL=MFLOW*HD/ZMUG + PRL=ZMUG*CPG/ZKG + ENDIF +*---- +* THERMAL EXCHANGE BETWEEN CLAD AND FLUID USING THE DITTUS AND BOELTER +* CORRELATION (SINGLE PHASE) OR CHEN CORRELATION (SATURATED BOILING) +*---- + IF(IHCONV.EQ.0) THEN + ITER=0 + KWA=99 + DO + ITER=ITER+1 + IF(ITER.GT.500) THEN + WRITE(HSMG,'(30HTHMH2O: HCONV FAILURE IN SLICE,I5,1H.)') K + CALL XABORT(HSMG) + ENDIF + HA=0.023*(ZKONE/HD)*REL**0.8*PRL**0.4 + F=1.0 + S=1.0 + IF((XFL.EQ.XFL0).OR.(TSCLAD.LE.TSAT).OR.(KWA.EQ.0)) THEN +* Single-phase convection. Use Dittus-Boelter correlation + KWA=0 + HB=0.0 + K0=0 + XFL=XFL0 + EPS=EPS0 + SLIP=SLIP0 + ELSE IF(HMAVG.LT.HGSAT) THEN +* Subcooled convection. Use Dittus-Boelter and Forster-Zuber +* correlations +* XM: Martinelli parameter +* F: Reynolds number factor +* S: nucleate boiling suppression factor +* SIGM: surface tension in N/m +* HA: Dittus-Boelter coefficient +* HB: Forster-Zuber coefficient +* + IF(HMAVG.LT.HLSAT) THEN + KWA=1 + ELSE + KWA=2 + ENDIF + XM=(XFL/(1.0-XFL))**0.9*(RHOL/RHOG)**0.5*(ZMUG/ZMUL)**0.1 + IF(XM.LE.0.100207) THEN + F=1.0 + ELSE + F=2.35*(0.213+XM)**0.736 + ENDIF + RE=REL*F**1.25 + S=1.0/(1.0+2.53E-6*RE**1.17) + PR=PINLET/10**6 + SIGM=-7.2391E-6*PR**3+2.8345E-4*PR**2-5.1566E-3*PR+4.2324E-2 + HA=0.023*(ZKL/HD)*REL**0.8*PRL**0.4 + DTSAT=TSCLAD-TSAT + IF(IFLUID.EQ.0) THEN + CALL THMSAP(PW, TSCLAD) + ELSE + CALL THMHSP(PW, TSCLAD) + ENDIF + DP=PW-PINLET +* Forster-Zuber equation + HLV=HGSAT-HLSAT + HB=0.00122*ZKL**0.79*CPL**0.45*RHOL**0.49/(ZMUL**0.29* + > SIGM**0.5*HLV**0.24*RHOG**0.24)*DTSAT**0.24*DP**0.75 + ELSE +* Superheated steam. Use Mokry correlation + KWA=3 + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TSCLAD,RHOW,R2,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TSCLAD,RHOW,R2,R3,R4,R5) + ENDIF + HA=0.0061*(ZKG/HD)*REL**0.904*PRL**0.684*(RHOW/RHO)**0.564 + HB=0.0 + ENDIF +* Chen correlation + HCONV=F*HA+S*HB + IF(HCONV.LE.0.0) THEN + WRITE(HSMG,'(34HTHMH2O: DRY OUT REACHED IN CHANNEL,3I5)') + > I,J,K + CALL XABORT(HSMG) + ENDIF + IF(ITIME.EQ.0) THEN + TWAL=(PHI+S*HB*TSAT+F*HA*TCALO)/(S*HB+F*HA) + ELSE + ZNUM=ZF(1)+RADCL*S*HB*TSAT+RADCL*F*HA*TCALO + ZDEN=ZF(2)+RADCL*S*HB+RADCL*F*HA + TWAL=MAX(273.15,ZNUM/ZDEN) + PHI=MAX(0.0,(ZF(1)-TWAL*ZF(2))/RADCL) + ENDIF + IF(ABS(TSCLAD-TWAL).GT.1.0E-5*TSCLAD) THEN + TSCLAD=TWAL + ELSE + EXIT + ENDIF + ENDDO + ELSE IF(IHCONV.EQ.1) THEN + IF(ITIME.EQ.0) THEN + TSCLAD=TCALO+PHI/KHCONV + ELSE + RCHC=RADCL*KHCONV + TSCLAD=MAX(273.15,(ZF(1)+RCHC*TCALO)/(ZF(2)+RCHC)) + PHI=(ZF(1)-TSCLAD*ZF(2))/RADCL + ENDIF + ENDIF +*---- +* COMPUTE INITIAL BULK LIQUID ENTHALPY SUBCOOLING DHSUB +*---- + IF((ISUBM.GT.0).AND.(K0.EQ.0).AND.LFIRST) THEN + DTSUB=0.0 + IF(ISUBM.EQ.1) THEN +* Bowring correlation +* Reference: R. W. Bowring, "Physical Model, Based on Bubble +* Detachment, and Calculation of Steam Voidage in the Subcooled +* Region of a Heated Channel," OECD Report HPR-10, 1962. +* Equation3 (3) and (17) + VC=MFLOW/RHOL + ETA=14.0+0.1*PINLET/1.01325E+05 + DTSUB=ETA*PHI/VC*1.0E-6 + ELSE IF(ISUBM.EQ.2) THEN +* Saha-Zuber subcooling model +* PE: Peclet number + PE=MFLOW*CPL*HD/ZKL + IF(PE.LE.70000.0) THEN + DTSUB=PHI*HD/(455.0*ZKL) + ELSE +* reactor conditions + DTSUB=154.0*PHI/(MFLOW*CPL) + ENDIF + ENDIF + IF(TCALO.GE.TSAT-DTSUB) K0=K + DSAT=TSCLAD-TCALO-DTSUB + DHSUB=CPL*DTSUB + LFIRST=.FALSE. + ENDIF + RETURN + END diff --git a/Donjon/src/THMINP.f b/Donjon/src/THMINP.f new file mode 100644 index 0000000..19c38c5 --- /dev/null +++ b/Donjon/src/THMINP.f @@ -0,0 +1,64 @@ +*DECK THMINP + SUBROUTINE THMINP(HNAME,NCH,VECT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read channel-dependent data. +* +*Copyright: +* Copyright (C) 2018 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input +* HNAME character*8 name of the data +* NCH number of channels +* +*Parameters: output +* VECT data vector +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + CHARACTER*(*) HNAME + INTEGER NCH + REAL VECT(NCH) +*---- +* LOCAL VARIABLES +*---- + INTEGER ITYP,NITMA,ICH + REAL FLOT + CHARACTER TEXT*8,HSMG*131 + DOUBLE PRECISION DFLOT +* + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + FLOT=REAL(NITMA) + VECT(:NCH)=FLOT + ELSE IF(ITYP.EQ.2) THEN + VECT(:NCH)=FLOT + ELSE IF((ITYP.EQ.3).AND.(TEXT.EQ.'CHAN')) THEN + DO ICH=1,NCH + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN + VECT(ICH)=REAL(NITMA) + ELSE IF(ITYP.EQ.2) THEN + VECT(ICH)=FLOT + ELSE + WRITE(HSMG,'(14H@THMINP: NAME=,A,21H. INTEGER OR REAL VAL, + > 12HUE EXPECTED.)') HNAME + CALL XABORT(HSMG) + ENDIF + ENDDO + ELSE + WRITE(HSMG,'(14H@THMINP: NAME=,A,26H. SINGLE INTEGER OR REAL V, + > 30HALUE OR CHAN KEYWORD EXPECTED.)') HNAME + CALL XABORT(HSMG) + ENDIF + RETURN + END diff --git a/Donjon/src/THMPH.f b/Donjon/src/THMPH.f new file mode 100644 index 0000000..487262e --- /dev/null +++ b/Donjon/src/THMPH.f @@ -0,0 +1,100 @@ +*DECK THMPH + SUBROUTINE THMPH(IFLUID,PP,HH,RHO,TEMP) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Backwards inversion of steam tables to find water density and +* temperature. +* +*Copyright: +* Copyright (C) 2012 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert, P. Gallet +* +*Parameters: input +* IFLUID type of fluid (0=H2O; 1=D2O). +* PP pressure (Pa) +* HH enthalpy (J/Kg) +* +*Parameters: output +* RHO water density (Kg/m^3) +* TEMP temperature (K) +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IFLUID + REAL PP,HH,RHO,TEMP +*---- +* LOCAL VARIABLES +*---- + PARAMETER(DT=-0.01,ZKELV=273.15,S=1.0) + REAL A(15),R1,R3,R4,R5,RV,HSAT,HV,XTH + DATA A/ + > 0.2873E+03,-0.5098E+00,-0.3459E+00,0.1910E+00,-0.2840E-01, + > 0.8266E+02,0.1141E+01,-0.2724E+01,0.1077E+00,-0.1144E+02, + > 0.9500E+01,-0.2715E+01,-0.1290E+02,0.9148E+01,-0.8093E+01 / +*---- +* INITIAL APPROXIMATION OF T1 +*---- + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PP,TSAT) + CALL THMTX(TSAT,1.0,RV,HV,R3,R4,R5) + CALL THMTX(TSAT,0.0,R1,HSAT,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PP,TSAT) + CALL THMHTX(TSAT,1.0,RV,HV,R3,R4,R5) + CALL THMHTX(TSAT,0.0,R1,HSAT,R3,R4,R5) + ENDIF + IF((ABS(HSAT-HH)/HSAT).LE.1.0E-5) THEN + T1=TSAT + GO TO 20 + ELSEIF(HH.LE.HSAT) THEN + T=(HH-1270.0E3)/420.0E3 + P=(PP-140.0E5)/30.0E5 + H1=A(1)+P*(A(2)+P*(A(3)+P*(A(4)+P*A(5)))) + H2=A(6)+P*(A(7)+P*(A(8)+P*(A(9)))) + H3=A(10)+P*(A(11)+P*(A(12))) + H4=A(13)+P*A(14) + H5=A(15) + T1=H1+T*(H2+T*(H3+T*(H4+T*(H5))))+ZKELV +* INLET TEMPERATURE WAS VERIFIED TO BE GREATER THAN 0 C. T1 INITIAL +* GUESS LOWER THAN THAT SHOULD BE INTERPRETED AS FLAWED (FAR FROM +* FITTING REGION). CORRECTING WITH AN ABOVE-0 C GUESS. + IF(T1.LT.ZKELV) T1=10.0+ZKELV + ELSEIF(HH.LE.HV) THEN +* saturated steam + TEMP=TSAT + XTH=(HH-HSAT)/(HV-HSAT) + RHO=1.0/(XTH/RV+(1.0-XTH)/R1) + GO TO 30 + ELSE +* superheated steam + T1=TSAT + ENDIF +*---- +* NEWTON ITERATIONS +*---- + ITER=0 + 10 ITER=ITER+1 + IF(ITER.GT.30) CALL XABORT('THMPH: CONVERGENCE FAILURE.') + IF(IFLUID.EQ.0) THEN + CALL THMPT(PP,T1,R1,H1,R3,R4,R5) + CALL THMPT(PP,T1+DT,R1,H1P,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PP,T1,R1,H1,R3,R4,R5) + CALL THMHPT(PP,T1+DT,R1,H1P,R3,R4,R5) + ENDIF + IF(ABS((HH-H1)/HH).LT.1.E-05) GO TO 20 + T1=T1+(HH-H1)*DT/(H1P-H1) + IF((HH.LE.HSAT).AND.(T1.GE.TSAT)) T1=TSAT + IF((HH.GE.HV).AND.(T1.LE.TSAT)) T1=TSAT + GO TO 10 + 20 RHO=R1 + TEMP=T1 + 30 RETURN + END diff --git a/Donjon/src/THMPLO.f b/Donjon/src/THMPLO.f new file mode 100644 index 0000000..236c6ec --- /dev/null +++ b/Donjon/src/THMPLO.f @@ -0,0 +1,56 @@ +*DECK THMPLO + SUBROUTINE THMPLO(P,X,PHIL0) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the value of the corrective factor for two phase calculation +* of frictional pressure loss based on an homogeneous flow correlation +* +*Copyright: +* Copyright (C) 2014 Ecole Polytechnique de Montreal. +* +*Author(s): +* P. Gallet +* C. Huet +* 02/2025: C. Huet - Preparation to future models +* 08/2025: M. Bellier - Implmentation of Lockhart-Martinelli correlation +* +*Parameters: input +* P pressure (Pa) +* X steam quality +* +*Parameters: output +* PHIL0 corrective factor for two phase pressure loss calculation +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + REAL P,X,PHIL0 +*---- +* LOCAL VARIABLES +*---- + REAL TSAT,MUL,MUG,TG,TL,R1,R2,R3, RHOL,RHOG,XLM +*---- +* COMPUTE VALUE OF THE CORRECTIVE FACTOR USING DENSITIES AND +* VISCOSITIES OF BOTH SATURATED WATER AND DRY SATURATED STEAM +*---- +* compute the values of the thermodynamic parameters of steam and +* liquid phases using freesteam steam tables + CALL THMSAT(P,TSAT) + TG=TSAT+0.01 + TL=TSAT-0.01 + CALL THMPT(P,TL,RHOL,R1,R2,MUL,R3) + CALL THMPT(P,TG,RHOG,R1,R2,MUG,R3) +*- CORRELATION = ? +* PHIL0=(1+X*(RHOL/RHOG-1))/((1+X*(MUL/MUG-1))**0.25) +*- +* - LOCKHART-MARTINELLI CORRELATION + XLM = ((1-X)/X)**0.9*(RHOG/RHOL)**0.5*(MUG/MUL)**0.1 + PHIL0 = (1.0 + 20/XLM + 1.0/XLM**2)**0.5 + + RETURN + END
\ No newline at end of file diff --git a/Donjon/src/THMPV.f90 b/Donjon/src/THMPV.f90 new file mode 100644 index 0000000..97d0382 --- /dev/null +++ b/Donjon/src/THMPV.f90 @@ -0,0 +1,203 @@ +SUBROUTINE THMPV(SPEED, POULET, VCOOL, DCOOL, PCOOL, TCOOL, MUT, XFL, HD, NZ, HZ, EPS, RHOL, RHOG, VGJ, IDFM, ACOOL) +! +!----------------------------------------------------------------------- +! +!Purpose: +! Update the pressure and velocity vectors in the THM model to model the +! pressure drop and the velocity of the fluid in the channel +! +!Copyright: +! Copyright (C) 2025 Ecole Polytechnique de Montreal +! +!Author(s): C. Huet +! 02/2025: C. Huet - Creation +! +!Parameters: input +! SPEED inlet velocity of the fluid in the channel +! POULET Pressure at the outlet +! VCOOL velocity of the fluid in the channel +! DCOOL density of the fluid in the channel +! PCOOL pressure of the fluid in the channel +! TCOOL temperature of the fluid in the channel +! MUT dynamic viscosity of the fluid in the channel +! XFL quality of the fluid in the channel +! HD hydraulic diameter of the channel +! NZ number of nodes in the channel +! HZ height of the channel +! EPS coolant void fraction in the channel +! RHOL density of the liquid fraction +! RHOG density of the vapour fraction +! VGJ drift velocity in the channel +! IDFM flag for the use of the drift flux model +! ACOOL cross-sectional area of the channel +! +!Parameters: output +! VCOOL velocity of the fluid in the channel +! PCOOL pressure of the fluid in the channel +! +!----------------------------------------------------------------------- +! + USE GANLIB + IMPLICIT NONE +!---- +! SUBROUTINE ARGUMENTS +!---- + INTEGER NZ, IDFM + REAL SPEED, POULET, VCOOL(NZ), DCOOL(NZ), PCOOL(NZ), TCOOL(NZ), MUT(NZ), XFL(NZ) + REAL HZ(NZ),VGJ(NZ),RHOL(NZ), RHOG(NZ), EPS(NZ), HD(NZ), ACOOL(NZ) +!---- +! LOCAL VARIABLES +!---- + REAL g + REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: A + + INTEGER K, I, J, IER + REAL PHIL0, TPMULT, TPMULT0 + REAL REY, REY0, FRIC,FRIC0,DELTA, UL + REAL CP11, H11, K11, RHO11, MUL + + g = 9.81 !gravity + ALLOCATE(A(2*NZ,2*NZ+1)) + FORALL (I=1:2*NZ, J=1:2*NZ+1) A(I, J) = 0.0 + +!---- +! MATRIX FILLING FOR THE PRESSURE AND VELOCITY CALCULATION +!---- +! BOTTOM OF THE CHANNEL +!---- + PRINT *, 'THMPV: Filling the matrix for pressure and velocity calculation' + PRINT *, 'THMPV: NZ = ', NZ + PRINT *, 'POULET = ', POULET + DO K = 1, NZ + IF (K .EQ. 1) THEN + IF(IDFM.GT.0) THEN + ! COMPUTE MUL, UL and Reynolds AT K + CALL THMTX(TCOOL(K), 0.0, RHO11, H11, K11, MUL, CP11) + UL = VCOOL(K) - (EPS(K) / (1.0 - EPS(K)))*RHOG(K)/DCOOL(K) * VGJ(K) + REY0 = ABS(UL*RHOL(K)) * HD(K) / MUL + ! COMPUTE MUL, UL and Reynolds AT K+1 + CALL THMTX(TCOOL(K+1), 0.0, RHO11, H11, K11, MUL, CP11) + UL = VCOOL(K+1) - (EPS(K+1) / (1.0 - EPS(K+1)))*RHOG(K+1)/DCOOL(K+1) * VGJ(K+1) + REY = ABS(UL*RHOL(K+1)) * HD(K+1) / MUL + ELSE + REY = ABS(VCOOL(K+1)*DCOOL(K+1)) * (1.0 - XFL(K+1)) * HD(K+1) / MUT(K+1) + REY0 = ABS(VCOOL(K)*DCOOL(K)) * (1.0 - XFL(K)) * HD(K) / MUT(K) + ENDIF + + + CALL THMFRI(REY,EPS(K+1),HD(K+1),FRIC)!MUT Ã isoler vapeur/liquide : passer par THMTX(TCOOL, X=0) + CALL THMFRI(REY0,EPS(K),HD(K),FRIC0) + + IF (XFL(K) .GT. 0.0) THEN + CALL THMPLO(PCOOL(K), XFL(K), PHIL0) + TPMULT0 = PHIL0 + CALL THMPLO(PCOOL(K+1), XFL(K+1), PHIL0) + TPMULT = PHIL0 + ELSE + TPMULT = 1.0 + TPMULT0 = 1.0 + ENDIF + A(1,1) = 1.0 +! MOMENTUM CONSERVATION EQUATION + IF (IDFM .GT. 0) THEN + DELTA = ((EPS(K)/1-EPS(K))*RHOL(K)*RHOG(K)/DCOOL(K)*VGJ(K)**2) - & + ((EPS(K+1)/1-EPS(K+1))*RHOL(K+1)*RHOG(K+1)/DCOOL(K+1)*VGJ(K+1)* & + ACOOL(K+1)/ACOOL(K)**2) + ELSE + DELTA = 0.0 + ENDIF + A(K+NZ,K) = - (VCOOL(K)*DCOOL(K))*(1.0 - (TPMULT0*FRIC0*HZ(K))/(2.0*HD(K))) + A(K+NZ,K+1) = (VCOOL(K+1)*DCOOL(K+1))*(1.0 + (TPMULT*FRIC*HZ(K))/ & + (2.0*HD(K+1)))*ACOOL(K+1)/ACOOL(K) + A(K+NZ, 2*NZ+1) = - ((DCOOL(K+1)* HZ(K+1)*ACOOL(K+1)/ACOOL(K) + DCOOL(K)* HZ(K)) & + * g ) /2 + DELTA + A(K+NZ,K-1+NZ) = 0.0 + A(K+NZ,K+NZ) = -1.0 + A(K+NZ,K+1+NZ) = ACOOL(K+1)/ACOOL(K) + +! MASS CONSERVATION EQUATION + A(1, 2*NZ+1) = SPEED + +!---- +! TOP OF THE CHANNEL +!---- + ELSE IF (K .EQ. NZ) THEN +! MASS CONSERVATION EQUATION + A(K,K-1) = - DCOOL(K-1)*ACOOL(K-1)/ACOOL(K) + A(K,K) = DCOOL(K) +! MOMENTUM CONSERVATION EQUATION + A(K, 2*NZ+1) = 0.0 + A(2*NZ, 2*NZ+1) = POULET + A(2*NZ, 2*NZ) = 1.0 +!---- +! MIDDLE OF THE CHANNEL +!---- + ELSE + IF (IDFM.GT.0) THEN +! COMPUTE MUL, UL and Reynolds AT K + CALL THMTX(TCOOL(K), 0.0, RHO11, H11, K11, MUL, CP11) + UL = VCOOL(K) - (EPS(K) / (1.0 - EPS(K)))*RHOG(K)/DCOOL(K) * VGJ(K) + REY0 = ABS(UL*RHOL(K)) * HD(K) / MUL +! COMPUTE MUL, UL and Reynolds AT K+1 + CALL THMTX(TCOOL(K+1), 0.0, RHO11, H11, K11, MUL, CP11) + UL = VCOOL(K+1) - (EPS(K+1) / (1.0 - EPS(K+1)))*RHOG(K+1)/DCOOL(K+1) * VGJ(K+1) + REY = ABS(UL*RHOL(K+1)) * HD(K+1) / MUL + ELSE + REY = ABS(VCOOL(K+1)*DCOOL(K+1)) * (1.0 - XFL(K+1)) * HD(K+1) / MUT(K+1) + REY0 = ABS(VCOOL(K)*DCOOL(K)) * (1.0 - XFL(K)) * HD(K) / MUT(K) + ENDIF + CALL THMFRI(REY,EPS(K+1),HD(K+1),FRIC) + CALL THMFRI(REY0,EPS(K),HD(K),FRIC0) + + IF (XFL(K) .GT. 0.0) THEN + CALL THMPLO(PCOOL(K+1), XFL(K+1), PHIL0) + TPMULT = PHIL0 + CALL THMPLO(PCOOL(K), XFL(K), PHIL0) + TPMULT0 = PHIL0 + ELSE + TPMULT = 1.0 + TPMULT0 = 1.0 + ENDIF +! MASS CONSERVATION EQUATION + A(K,K-1) = - DCOOL(K-1)*ACOOL(K-1)/ACOOL(K) + A(K,K) = DCOOL(K) + A(K,K+1) = 0.0 + A(K, 2*NZ+1) = 0.0 +!---- +! MOMENTUM CONSERVATION EQUATION +!---- + IF (IDFM .GT. 0) THEN + DELTA = ((EPS(K)/1-EPS(K))*RHOL(K)*RHOG(K)/DCOOL(K)*VGJ(K)**2) - & + ((EPS(K+1)/1-EPS(K+1))*RHOL(K+1)*RHOG(K+1)/DCOOL(K+1)*VGJ(K+1)**2*ACOOL(K+1) & + /ACOOL(K)) + ELSE + DELTA = 0.0 + ENDIF + A(K+NZ,K) = - (VCOOL(K)*DCOOL(K))*(1.0 - (TPMULT0*FRIC0*HZ(K))/(2.0*HD(K))) + A(K+NZ,K+1) = (VCOOL(K+1)*DCOOL(K+1))*(1.0 + (TPMULT*FRIC*HZ(K))/ & + (2.0*HD(K+1)))*ACOOL(K+1)/ACOOL(K) + A(K+NZ, 2*NZ+1) = - ((DCOOL(K+1)* HZ(K+1)*ACOOL(K+1)/ACOOL(K) + DCOOL(K)* & + HZ(K)) * g ) /2 + DELTA + A(K+NZ,K-1+NZ) = 0.0 + A(K+NZ,K+NZ) = -1.0 + A(K+NZ,K+1+NZ) = ACOOL(K+1)/ACOOL(K) + ENDIF + END DO +!---- +! SOLVING THE LINEAR SYSTEM +!---- + call ALSBD(2*NZ, 1, A, IER, 2*NZ) + + if (IER /= 0) CALL XABORT('THMPV: SINGULAR MATRIX.') +!---- +! RECOVER THE PRESSURE AND VELOCITY VECTORS +!---- + DO K = 1, NZ + VCOOL(K) = REAL(A(K, 2*NZ+1)) + PCOOL(K) = REAL(A(K+NZ, 2*NZ+1)) + END DO + + DEALLOCATE(A) + + RETURN + END
\ No newline at end of file diff --git a/Donjon/src/THMRNG.f b/Donjon/src/THMRNG.f new file mode 100644 index 0000000..fa8ed5b --- /dev/null +++ b/Donjon/src/THMRNG.f @@ -0,0 +1,278 @@ +*DECK THMRNG + SUBROUTINE THMRNG(IMPX,NFD,NDTOT,MAXIT1,MAXIT2,ERMAXT,DTINV, + 1 RAD,XX0,XX1,QFUEL,FRO,TSURF,BURN,POROS,FRACPU,ICONDF, + 2 NCONDF,KCONDF,UCONDF,ICONDC,NCONDC,KCONDC,UCONDC, + 3 IFRCDI,IFUEL,FTP,TC1,XX2,XX3,ZF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solution of the discretized thermal conduction equations in a single +* fuel rod in an axial slice of the fuel channel. Version without gap +* +*Copyright: +* Copyright (C) 2024 Ecole Polytechnique de Montreal. +* +*Author(s): +* C. Garrido based on THMROD by A. Hebert +* +*Parameters: input +* IMPX print parameter. +* NFD number of fuel discretized points in the cladded fuel rod. +* The last point of the discretization (i=NFD) is taken at the +* surface of the fuel pellet. +* NDTOT total number of discretized points in the cladded fuel rod +* with the radial zones in the cladding. The points which are +* located at i=NFD+1 and i=NDTOT are respectively taken at the +* inner surface of clad and in the center of external clad ring. +* MAXIT1 maximum number of conduction iterations. +* MAXIT2 maximum number of center-pellet iterations. +* ERMAXT convergence criterion. +* DTINV inverse time step. Equal to 1/DT in transient cases. Equal to +* 0 in steady-state cases. +* RAD fuel and clad radii (m). +* XX0 temperatures at time n-1 (K). +* XX1 estimate of the temperatures at time n (K). +* QFUEL volumic power in fuel at time n (W/m^3). +* FRO radial power form factors. All components are set to 1.0 for +* a constant power source in fuel. +* TSURF estimate of the external clad surface temperature at +* time n (K). +* BURN fuel burnup in MWday/tonne. +* POROS fuel porosity. +* FRACPU plutonium percent fraction. +* ICONDF fuel conductivity flag (0=Stora-Chenebault or COMETHE/ +* 1=user-provided polynomial + inverse term). +* NCONDF degree of user-provided fuel conductivity polynomial. +* KCONDF polynomial coefficients for fuel conductivity in W/m/K^(k+1) +* (except for the two last coefficients which belongs to the +* inverse term). +* UCONDF required unit of temperature in polynomial for fuel +* conductivity (KELVIN or CELSIUS). +* ICONDC clad conductivity flag (0=default/1=user-provided +* polynomial). +* NCONDC degree of user-provided clad conductivity polynomial. +* KCONDC polynomial coefficients for clad conductivity in W/m/K^(k+1). +* UCONDC required unit of temperature in polynomial for clad +* conductivity (KELVIN or CELSIUS). +* IFRCDI flag indicating if average approximation is forced during +* fuel conductivity evaluation (0=default/1=average +* approximation forced). +* IFUEL type of fuel (0=UO2/MOX; 1=SALT). +* FTP tpdata object with correlations to obtain properties of +* molten salt. +* +*Parameters: output +* TC1 estimate of center-pellet temperature at time n (K). +* XX1 estimate of the temperatures at time n (K). +* XX2 first component of temperatures at time n (K). +* XX3 second component of temperatures at time n. The actual +* temperatures are given as XX2(:)+TSURF*XX3(:) where TSURF +* is the temperature of the external clad surface. +* ZF components of the linear power transmitted from clad to fluid. +* The linear power (W/m) is given as 2*PI*(ZF(1)-TSURF*ZF(2)). +* +*----------------------------------------------------------------------- + USE t_saltdata +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(tpdata) FTP + INTEGER IMPX,NFD,NDTOT,MAXIT1,MAXIT2,ICONDF,NCONDF,ICONDC,NCONDC, + 1 IFRCDI,IFUEL + REAL ERMAXT,DTINV,RAD(NDTOT),XX0(NDTOT),XX1(NDTOT),QFUEL, + 1 FRO(NFD-1),TSURF,BURN,POROS,FRACPU,KCONDF(NCONDF+3), + 2 KCONDC(NCONDC+1),TC1,XX2(NDTOT),XX3(NDTOT),ZF(2) + CHARACTER UCONDF*12,UCONDC*12 +*---- +* LOCAL VARIABLES +*---- + REAL COEF(3) +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: DAR,ZK,CONDXA + REAL, ALLOCATABLE, DIMENSION(:,:) :: TRID +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(DAR(NDTOT),ZK(NDTOT),CONDXA(NDTOT),TRID(NDTOT,NDTOT+2)) +*---- +* COMPUTE ARs AND VOLUMES +*---- + DAR(:NDTOT)=0.0 + ARF=0.5*RAD(NFD)**2 ! at fuel radius/clad interface + ARCE=0.5*RAD(NDTOT)**2 ! at external clad radius + DO I=1,NFD + DAR(I)=0.5*(RAD(I+1)**2-RAD(I)**2) + ENDDO + DO I=NFD+1,NDTOT + DAR(I)=0.5*(RAD(I)**2-RAD(I-1)**2) + ENDDO +*---- +* COMPUTE THE THERMAL CONDUCTIVITY INTEGRALS AT TIME n-1 +*---- + ZK(:NDTOT)=0.0 + DO I=1,NFD + IF(IFUEL.EQ.0) THEN + ZK(I)=THMCDI(XX0(I),XX0(I+1),BURN,POROS,FRACPU,ICONDF,NCONDF, + > KCONDF,UCONDF,IFRCDI) + ELSE + ZK(I)=THMSDI(XX0(I),XX0(I+1),FTP,IFRCDI,IMPX) + ENDIF + ENDDO + DO I=NFD+1,NDTOT-1 + ZK(I)=THMGDI(XX0(I),XX0(I+1),ICONDC,NCONDC,KCONDC,UCONDC) + ENDDO + ZK(NDTOT)=THMGDI(XX0(NDTOT),TSURF,ICONDC,NCONDC,KCONDC,UCONDC) +*---- +* COMPUTE CONDXA +*---- + CONDXA(:NDTOT)=0.0 + COEF(1)=0.0 + COEF(2)=0.0 + COEF(3)=0.0 + DO I=1,NDTOT + IF(I.LE.NFD) THEN + IF(IFUEL.EQ.0) THEN + CONDXA(I)=THMCCD(XX0(I),POROS,FRACPU)*DTINV*XX0(I)*DAR(I) + ELSE + CONDXA(I)=THMSCD(XX0(I),FTP,IMPX)*DTINV*XX0(I)*DAR(I) + ENDIF + ELSE IF(I.GE.NFD+1) THEN + CONDXA(I)=THMGCD(XX0(I))*DTINV*XX0(I)*DAR(I) + ENDIF + ENDDO +*---- +* ITERATIVE PROCEDURE +*---- + ITERT=0 + 10 ITERT=ITERT+1 + IF(ITERT.GT.MAXIT1) CALL XABORT('THMRNG: CONVERGENCE FAILURE(1).') +*---- +* COMPUTE THE THERMAL CONDUCTIVITY INTEGRALS AT TIME n +*---- + ZK(:NDTOT)=0.0 + DO I=1,NFD + IF(IFUEL.EQ.0) THEN + ZK(I)=THMCDI(XX1(I),XX1(I+1),BURN,POROS,FRACPU,ICONDF,NCONDF, + > KCONDF,UCONDF,IFRCDI) + ELSE + ZK(I)=THMSDI(XX1(I),XX1(I+1),FTP,IFRCDI,IMPX) + ENDIF + ENDDO + DO I=NFD+1,NDTOT-1 + ZK(I)=THMGDI(XX1(I),XX1(I+1),ICONDC,NCONDC,KCONDC,UCONDC) + ENDDO + ZK(NDTOT)=THMGDI(XX1(NDTOT),TSURF,ICONDC,NCONDC,KCONDC,UCONDC) +*---- +* BUILD THE TRIDIAGONAL SYSTEM +*---- + TRID(:NDTOT,:NDTOT+2)=0.0 + COEF(1)=0.0 + COEF(2)=0.0 + COEF(3)=0.0 + DO I=1,NDTOT + TRID(I,NDTOT+1)=CONDXA(I) + IF(I.LE.NFD-2) THEN + ARI=0.5*RAD(I+1)**2 + COEF(3)=4.0*ARI*ZK(I)/(DAR(I)+DAR(I+1)) + TRID(I,NDTOT+1)=TRID(I,NDTOT+1)+QFUEL*FRO(I)*DAR(I) + ELSE IF(I.EQ.NFD-1) THEN + ARI=0.5*RAD(I+1)**2 + COEF(3)=4.0*ARI*ZK(I)/(DAR(I)+DAR(I+1)) + TRID(I,NDTOT+1)=TRID(I,NDTOT+1)+QFUEL*FRO(I)*DAR(I) + ELSE IF(I.EQ.NFD) THEN + ARI=0.5*RAD(I+1)**2 + COEF(3)=4.0*ARI*ZK(I)/DAR(I) + TRID(I,NDTOT+1)=TRID(I,NDTOT+1)+QFUEL*FRO(NFD-1)*DAR(I) + ELSE IF(I.LE.NDTOT-1) THEN + ARI=0.5*RAD(I)**2 + COEF(3)=4.0*ARI*ZK(I)/(DAR(I)+DAR(I+1)) + ELSE IF(I.EQ.NDTOT) THEN + COEF(3)=4.0*ARCE*ZK(I)/DAR(I) + TRID(I,NDTOT+2)=TRID(I,NDTOT+2)+COEF(3) + ENDIF + COEF(2)=COEF(1)+COEF(3) + IF(I.GT.1) TRID(I,I-1)=-COEF(1) + IF(I.LE.NFD) THEN + IF(IFUEL.EQ.0) THEN + TRID(I,I)=THMCCD(XX1(I),POROS,FRACPU)*DTINV*DAR(I) + ELSE + TRID(I,I)=THMSCD(XX1(I),FTP,IMPX)*DTINV*DAR(I) + ENDIF + ELSE IF(I.GE.NFD+1) THEN + TRID(I,I)=THMGCD(XX1(I))*DTINV*DAR(I) + ENDIF + TRID(I,I)=TRID(I,I)+COEF(2) + IF(I.LT.NDTOT) THEN + TRID(I,I+1)=-COEF(3) + COEF(1)=COEF(3) + ENDIF + ENDDO + ZWORK=COEF(3) +*---- +* SOLVE LINEAR SYSTEM +*---- + CALL ALSB(NDTOT,2,TRID,IER,NDTOT) + IF(IER.NE.0) CALL XABORT('THMRNG: SINGULAR MATRIX') +*---- +* SET TEMPERATURE AT TIME n +*---- + ERR=0.0 + IMAX=0 + DO I=1,NDTOT + TNEW=TRID(I,NDTOT+1)+TSURF*TRID(I,NDTOT+2) + IF(ABS(XX1(I)-TNEW).GT.ERR) THEN + ERR=ABS(XX1(I)-TNEW) + IMAX=I + ENDIF + IF(ITERT.LE.20) THEN + XX1(I)=TNEW + ELSE +* perform under-relaxation + XX1(I)=0.5*(TNEW+XX1(I)) + ENDIF + ENDDO + ZF(1)=ZWORK*TRID(NDTOT,NDTOT+1) + ZF(2)=ZWORK*(1.0-TRID(NDTOT,NDTOT+2)) + IF(IMPX.GT.4) WRITE(6,100) ITERT,ERR,ERMAXT,IMAX + IF((ERR.LT.ERMAXT).AND.(ITERT.NE.1)) GO TO 20 + GO TO 10 +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 20 DO I=1,NDTOT + XX2(I)=TRID(I,NDTOT+1) + XX3(I)=TRID(I,NDTOT+2) + ENDDO + DEALLOCATE(TRID,CONDXA,ZK,DAR) +*---- +* COMPUTE THE CENTER-PELLET TEMPERATURE. +*---- + TC=0.5*(XX1(1)+XX1(2)) + ITERC=0 + 30 ITERC=ITERC+1 + IF(ITERC.GT.MAXIT2) CALL XABORT('THMRNG: CONVERGENCE FAILURE(2).') + TCOLD=TC + IF(IFUEL.EQ.0) THEN + CC1=THMCDI(XX1(1),TC,BURN,POROS,FRACPU,ICONDF,NCONDF,KCONDF, + > UCONDF,IFRCDI) + CC2=THMCDI(TC,XX1(2),BURN,POROS,FRACPU,ICONDF,NCONDF,KCONDF, + > UCONDF,IFRCDI) + ELSE + CC1=THMSDI(XX1(1),TC,FTP,IFRCDI,IMPX) + CC2=THMSDI(TC,XX1(2),FTP,IFRCDI,IMPX) + ENDIF + TC=(CC1*XX1(1)+CC2*XX1(2))/(CC1+CC2) + IF(ITERT.GT.20) TC=0.5*(TC+TCOLD) + DELTAA=ABS(TC-TCOLD) + IF(IMPX.GT.4) WRITE(6,110) ITERC,DELTAA,ERMAXT + IF((DELTAA.LT.ERMAXT).AND.(ITERC.NE.1)) GO TO 40 + GO TO 30 + 40 TC1=2.0*XX1(1)-TC + RETURN + 100 FORMAT(/15H THMRNG: ITERT=,I5,1P,7H ERROR=,E12.4,5H EPS=,E12.4, + > 5H POS=,I5) + 110 FORMAT(/15H THMRNG: ITERC=,I5,1P,7H ERROR=,E12.4,5H EPS=,E12.4) + END diff --git a/Donjon/src/THMROD.f b/Donjon/src/THMROD.f new file mode 100644 index 0000000..03b2e9d --- /dev/null +++ b/Donjon/src/THMROD.f @@ -0,0 +1,263 @@ +*DECK THMROD + SUBROUTINE THMROD(IMPX,NFD,NDTOT,MAXIT1,MAXIT2,ERMAXT,DTINV, + 1 RAD,XX0,XX1,QFUEL,FRO,TSURF,POWLIN,BURN,POROS,FRACPU,ICONDF, + 2 NCONDF,KCONDF,UCONDF,ICONDC,NCONDC,KCONDC,UCONDC,IHGAP,KHGAP, + 3 IFRCDI,TC1,XX2,XX3,ZF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solution of the discretized thermal conduction equations in a single +* fuel rod in an axial slice of the fuel channel. +* +*Copyright: +* Copyright (C) 2018 Ecole Polytechnique de Montreal. +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IMPX print parameter. +* NFD number of fuel discretized points in the cladded fuel rod. +* The last point of the discretization (i=NFD) is taken at the +* surface of the fuel pellet. +* NDTOT total number of discretized points in the cladded fuel rod +* with the radial zones in the cladding. The points which are +* located at i=NFD+1 and i=NDTOT are respectively taken at the +* inner surface of clad and in the center of external clad ring. +* MAXIT1 maximum number of conduction iterations. +* MAXIT2 maximum number of center-pellet iterations. +* ERMAXT convergence criterion. +* DTINV inverse time step. Equal to 1/DT in transient cases. Equal to +* 0 in steady-state cases. +* RAD fuel and clad radii (m). +* XX0 temperatures at time n-1 (K). +* XX1 estimate of the temperatures at time n (K). +* QFUEL volumic power in fuel at time n (W/m^3). +* FRO radial power form factors. All components are set to 1.0 for +* a constant power source in fuel. +* TSURF estimate of the external clad surface temperature at +* time n (K). +* POWLIN estimate of the linear power at time n (W/m). +* BURN fuel burnup in MWday/tonne. +* POROS fuel porosity. +* FRACPU plutonium percent fraction. +* ICONDF fuel conductivity flag (0=Stora-Chenebault or COMETHE/ +* 1=user-provided polynomial + inverse term). +* NCONDF degree of user-provided fuel conductivity polynomial. +* KCONDF polynomial coefficients for fuel conductivity in W/m/K^(k+1) +* (except for the two last coefficients which belongs to the +* inverse term). +* UCONDF required unit of temperature in polynomial for fuel +* conductivity (KELVIN or CELSIUS). +* ICONDC clad conductivity flag (0=default/1=user-provided +* polynomial). +* NCONDC degree of user-provided clad conductivity polynomial. +* KCONDC polynomial coefficients for clad conductivity in W/m/K^(k+1). +* UCONDC required unit of temperature in polynomial for clad +* conductivity (KELVIN or CELSIUS). +* IHGAP flag indicating HGAP chosen (0=default/1=user-provided). +* KHGAP fixed user-provided HGAP value in W/m^2/K. +* IFRCDI flag indicating if average approximation is forced during +* fuel conductivity evaluation (0=default/1=average +* approximation forced). +* +*Parameters: output +* TC1 estimate of center-pellet temperature at time n (K). +* XX1 estimate of the temperatures at time n (K). +* XX2 first component of temperatures at time n (K). +* XX3 second component of temperatures at time n. The actual +* temperatures are given as XX2(:)+TSURF*XX3(:) where TSURF +* is the temperature of the external clad surface. +* ZF components of the linear power transmitted from clad to fluid. +* The linear power (W/m) is given as 2*PI*(ZF(1)-TSURF*ZF(2)). +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IMPX,NFD,NDTOT,MAXIT1,MAXIT2,ICONDF,NCONDF,ICONDC,NCONDC, + 1 IHGAP,IFRCDI + REAL ERMAXT,DTINV,RAD(NDTOT),XX0(NDTOT),XX1(NDTOT),QFUEL, + 1 FRO(NFD-1),TSURF,POWLIN,BURN,POROS,FRACPU,KCONDF(NCONDF+3), + 2 KCONDC(NCONDC+1),KHGAP,TC1,XX2(NDTOT),XX3(NDTOT),ZF(2) + CHARACTER UCONDF*12,UCONDC*12 +*---- +* LOCAL VARIABLES +*---- + REAL COEF(3) +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: DAR,ZK,CONDXA + REAL, ALLOCATABLE, DIMENSION(:,:) :: TRID +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(DAR(NDTOT),ZK(NDTOT),CONDXA(NDTOT),TRID(NDTOT,NDTOT+2)) +*---- +* COMPUTE ARs AND VOLUMES +*---- + DAR(:NDTOT)=0.0 + ARF=0.5*RAD(NFD)**2 ! at fuel radius + ARCI=0.5*RAD(NFD+1)**2 ! at internal clad radius + ARCE=0.5*RAD(NDTOT)**2 ! at external clad radius + DO I=1,NFD-1 + DAR(I)=0.5*(RAD(I+1)**2-RAD(I)**2) + ENDDO + DO I=NFD+2,NDTOT + DAR(I)=0.5*(RAD(I)**2-RAD(I-1)**2) + ENDDO +*---- +* COMPUTE THE THERMAL CONDUCTIVITY INTEGRALS AT TIME n-1 +*---- + ZK(:NDTOT)=0.0 + DO I=1,NFD-1 + ZK(I)=THMCDI(XX0(I),XX0(I+1),BURN,POROS,FRACPU,ICONDF,NCONDF, + > KCONDF,UCONDF,IFRCDI) + ENDDO + DO I=NFD+1,NDTOT-1 + ZK(I)=THMGDI(XX0(I),XX0(I+1),ICONDC,NCONDC,KCONDC,UCONDC) + ENDDO + ZK(NDTOT)=THMGDI(XX0(NDTOT),TSURF,ICONDC,NCONDC,KCONDC,UCONDC) +*---- +* COMPUTE CONDXA +*---- + CONDXA(:NDTOT)=0.0 + COEF(1)=0.0 + COEF(2)=0.0 + COEF(3)=0.0 + DO I=1,NDTOT + IF(I.LE.NFD-1) THEN + CONDXA(I)=THMCCD(XX0(I),POROS,FRACPU)*DTINV*XX0(I)*DAR(I) + ELSE IF(I.GE.NFD+2) THEN + CONDXA(I)=THMGCD(XX0(I))*DTINV*XX0(I)*DAR(I) + ENDIF + ENDDO +*---- +* ITERATIVE PROCEDURE +*---- + ITERT=0 + 10 ITERT=ITERT+1 + IF(ITERT.GT.MAXIT1) CALL XABORT('THMROD: CONVERGENCE FAILURE(1).') +*---- +* COMPUTE THE THERMAL CONDUCTIVITY INTEGRALS AT TIME n +*---- + ZK(:NDTOT)=0.0 + DO I=1,NFD-1 + ZK(I)=THMCDI(XX1(I),XX1(I+1),BURN,POROS,FRACPU,ICONDF,NCONDF, + > KCONDF,UCONDF,IFRCDI) + ENDDO + DO I=NFD+1,NDTOT-1 + ZK(I)=THMGDI(XX1(I),XX1(I+1),ICONDC,NCONDC,KCONDC,UCONDC) + ENDDO + ZK(NDTOT)=THMGDI(XX1(NDTOT),TSURF,ICONDC,NCONDC,KCONDC,UCONDC) + IF(IHGAP.EQ.0) THEN + CALL THMGAP(POWLIN,BURN,HGAP) + ELSE IF(IHGAP.EQ.1) THEN + HGAP=KHGAP + ENDIF +*---- +* BUILD THE TRIDIAGONAL SYSTEM +*---- + TRID(:NDTOT,:NDTOT+2)=0.0 + COEF(1)=0.0 + COEF(2)=0.0 + COEF(3)=0.0 + DO I=1,NDTOT + TRID(I,NDTOT+1)=CONDXA(I) + IF(I.LE.NFD-2) THEN + ARI=0.5*RAD(I+1)**2 + COEF(3)=4.0*ARI*ZK(I)/(DAR(I)+DAR(I+1)) + TRID(I,NDTOT+1)=TRID(I,NDTOT+1)+QFUEL*FRO(I)*DAR(I) + ELSE IF(I.EQ.NFD-1) THEN + ARI=0.5*RAD(I+1)**2 + COEF(3)=4.0*ARI*ZK(I)/DAR(I) + TRID(I,NDTOT+1)=TRID(I,NDTOT+1)+QFUEL*FRO(I)*DAR(I) + ELSE IF(I.EQ.NFD) THEN + RAVG=2.0*RAD(NFD)*RAD(NFD+1)/(RAD(NFD)+RAD(NFD+1)) + COEF(3)=RAVG*HGAP + ELSE IF(I.EQ.NFD+1) THEN + COEF(3)=4.0*ARCI*ZK(I)/DAR(I+1) + ELSE IF(I.LE.NDTOT-1) THEN + ARI=0.5*RAD(I)**2 + COEF(3)=4.0*ARI*ZK(I)/(DAR(I)+DAR(I+1)) + ELSE IF(I.EQ.NDTOT) THEN + COEF(3)=4.0*ARCE*ZK(I)/DAR(I) + TRID(I,NDTOT+2)=TRID(I,NDTOT+2)+COEF(3) + ENDIF + COEF(2)=COEF(1)+COEF(3) + IF(I.GT.1) TRID(I,I-1)=-COEF(1) + IF(I.LE.NFD-1) THEN + TRID(I,I)=THMCCD(XX1(I),POROS,FRACPU)*DTINV*DAR(I) + ELSE IF(I.GE.NFD+2) THEN + TRID(I,I)=THMGCD(XX1(I))*DTINV*DAR(I) + ENDIF + TRID(I,I)=TRID(I,I)+COEF(2) + IF(I.LT.NDTOT) THEN + TRID(I,I+1)=-COEF(3) + COEF(1)=COEF(3) + ENDIF + ENDDO + ZWORK=COEF(3) +*---- +* SOLVE LINEAR SYSTEM +*---- + CALL ALSB(NDTOT,2,TRID,IER,NDTOT) + IF(IER.NE.0) CALL XABORT('THMROD: SINGULAR MATRIX') +*---- +* SET TEMPERATURE AT TIME n +*---- + ERR=0.0 + IMAX=0 + DO I=1,NDTOT + TNEW=TRID(I,NDTOT+1)+TSURF*TRID(I,NDTOT+2) + IF(ABS(XX1(I)-TNEW).GT.ERR) THEN + ERR=ABS(XX1(I)-TNEW) + IMAX=I + ENDIF + IF(ITERT.LE.20) THEN + XX1(I)=TNEW + ELSE +* perform under-relaxation + XX1(I)=0.5*(TNEW+XX1(I)) + ENDIF + ENDDO + ZF(1)=ZWORK*TRID(NDTOT,NDTOT+1) + ZF(2)=ZWORK*(1.0-TRID(NDTOT,NDTOT+2)) + IF(IMPX.GT.4) WRITE(6,100) ITERT,ERR,ERMAXT,IMAX + IF((ERR.LT.ERMAXT).AND.(ITERT.NE.1)) GO TO 20 + GO TO 10 +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 20 DO I=1,NDTOT + XX2(I)=TRID(I,NDTOT+1) + XX3(I)=TRID(I,NDTOT+2) + ENDDO + DEALLOCATE(TRID,CONDXA,ZK,DAR) +*---- +* COMPUTE THE CENTER-PELLET TEMPERATURE. +*---- + TC=0.5*(XX1(1)+XX1(2)) + ITERC=0 + 30 ITERC=ITERC+1 + IF(ITERC.GT.MAXIT2) CALL XABORT('THMROD: CONVERGENCE FAILURE(2).') + TCOLD=TC + CC1=THMCDI(XX1(1),TC,BURN,POROS,FRACPU,ICONDF,NCONDF,KCONDF, + > UCONDF,IFRCDI) + CC2=THMCDI(TC,XX1(2),BURN,POROS,FRACPU,ICONDF,NCONDF,KCONDF, + > UCONDF,IFRCDI) + TC=(CC1*XX1(1)+CC2*XX1(2))/(CC1+CC2) + IF(ITERT.GT.20) TC=0.5*(TC+TCOLD) + DELTAA=ABS(TC-TCOLD) + IF(IMPX.GT.4) WRITE(6,110) ITERC,DELTAA,ERMAXT + IF((DELTAA.LT.ERMAXT).AND.(ITERC.NE.1)) GO TO 40 + GO TO 30 + 40 TC1=2.0*XX1(1)-TC + RETURN + 100 FORMAT(/15H THMROD: ITERT=,I5,1P,7H ERROR=,E12.4,5H EPS=,E12.4, + > 5H POS=,I5) + 110 FORMAT(/15H THMROD: ITERC=,I5,1P,7H ERROR=,E12.4,5H EPS=,E12.4) + END diff --git a/Donjon/src/THMSAL.f b/Donjon/src/THMSAL.f new file mode 100644 index 0000000..2121395 --- /dev/null +++ b/Donjon/src/THMSAL.f @@ -0,0 +1,198 @@ +*DECK THMSAL + SUBROUTINE THMSAL(IMPX,ITIME,I,J,K,K0,MFLOW,HMAVG,ENT,HD,STP, + > IHCONV,KHCONV,ISUBM,RADCL,ZF,PHI,XFL,EPS,SLIP,DZ,TCALO, + > RHO,RHOLAV,TSCLAD,KWA) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Adaptation of THMH2O.f for convection of Molten Salts using Gnielinski +* correlation. +* +*Copyright: +* Copyright (C) 2023 Ecole Polytechnique de Montreal. +* +*Author(s): +* Cristian Garrido Tamm (cristian.garrido@idom.com) +* +*Parameters: input +* IMPX printing index (=0 for no print). +* ITIME type of calculation (0=steady-state; 1=transient). +* I position of channel alon X-axis +* J position of channel alon Y-axis +* K position of channel alon Z-axis +* K0 onser of nuclear boiling point +* MFLOW massic coolant flow rate in Kg/m^2/s +* HMAVG averaged enthalpy +* ENT four values of enthalpy in J/Kg to be used in Gaussian +* integration +* HD hydraulic diameter in m +* STP tpdata object with correlations to obtain properties of molten salt. +* IHCONV flag indicating HCONV chosen (0=default/1=user-provided). +* KHCONV fixed user-provided HCONV value in W/m^2/K. +* ISUBM subcooling model (0: one-phase; 1: Jens-Lottes model; +* 2: Saha-Zuber model). +* RADCL outer clad radius in m +* ZF parameters used to compute heat flux on clad surface in +* transient cases. +* PHI heat flow exchanged between clad and fluid in W/m^2. +* Given in steady-state cases. +* XFL input coolant flow quality +* EPS input coolant void fraction +* SLIP input slip ratio of vapor phase speed to liquid phase speed. +* DZ axial mesh width in m. +* +*Parameters: output +* PHI heat flow exchanged between clad and fluid in W/m^2. +* Computed in transient cases. +* XFL output coolant flow quality +* EPS output coolant void fraction +* SLIP output slip ratio of vapor phase speed to liquid phase speed. +* TCALO coolant temperature in K +* RHO coolant density in Kg/m^3 +* RHOLAV liquid density in kg/m^3 +* TSCLAD clad temperature in K +* KWA flow regime (=0: single-phase; =1: subcooled; =2: nucleate +* boiling; =3 superheated steam) +* +*----------------------------------------------------------------------- +* + USE t_saltdata +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(tpdata) STP + INTEGER I,J,K,K0,IHCONV,ISUBM,KWA + REAL MFLOW,HMAVG,ENT(4),HD,KHCONV,RADCL,ZF(2),PHI,TCALO,RHO, + > RHOLAV,TSCLAD,XFL,EPS,SLIP,DZ +*---- +* LOCAL VARIABLES +*---- + REAL W(4),HL(4) + CHARACTER HSMG*131 +*---- +* SAVE VARIABLES +*---- + SAVE W + DATA W /0.347855,0.652145,0.652145,0.347855/ +*---- +* COMPUTE THE DENSITY AND TEMPERATURE OF THE LIQUID +*---- + IF(HMAVG.LT.0.0) CALL XABORT('THMSAL: NEGATIVE INPUT ENTHALPY.') + IF(ISUBM.NE.0) CALL XABORT('THMSAL: NOT A ONE PHASE FLOW.') + CALL THMSST(STP,TSAT,IMPX) + HL(1)=ENT(1) + HL(2)=ENT(2) + HL(3)=ENT(3) + HL(4)=ENT(4) + CALL THMSH(STP,HL(1),R11,TL1,IMPX) + CALL THMSH(STP,HL(2),R11,TL2,IMPX) + CALL THMSH(STP,HL(3),R11,TL3,IMPX) + CALL THMSH(STP,HL(4),R11,TL4,IMPX) + CALL THMSPT(STP,TL1,RHO1,R2,R3,R4,CP1,IMPX) + CALL THMSPT(STP,TL2,RHO2,R2,R3,R4,CP2,IMPX) + CALL THMSPT(STP,TL3,RHO3,R2,R3,R4,CP3,IMPX) + CALL THMSPT(STP,TL4,RHO4,R2,R3,R4,CP4,IMPX) + TL=0.5*(W(1)*TL1+W(2)*TL2+W(3)*TL3+W(4)*TL4) + RHOLAV=0.5*(W(1)*RHO1+W(2)*RHO2+W(3)*RHO3+W(4)*RHO4) + CPLAV=0.5*(W(1)*CP1+W(2)*CP2+W(3)*CP3+W(4)*CP4) +*---- +* COMPUTE THE FLUID PROPERTIES +* RHO: fluid density +* REL: Reynolds number of liquid phase +* PRL: Prandtl number of liquid phase +*---- + IF(XFL.NE.0.0) THEN + CALL XABORT('THMSAL: INVALID VALUE OF FLOW QUALITY') + ENDIF +* One phase liquid + TB=TSAT + IF(TL.LT.TB) THEN + TCALO=TL + ELSE + TCALO=TB + ENDIF + CALL THMSPT(STP,TCALO,R1,R2,ZKONE,ZMUONE,CPONE,IMPX) + RHO=RHOLAV + REL=MFLOW*HD/ZMUONE + PRL=ZMUONE*CPONE/ZKONE + ZKL=ZKONE + XFL0=XFL + EPS0=EPS + SLIP0=SLIP +*---- +* THERMAL EXCHANGE BETWEEN CLAD AND FLUID USING THE DITTUS AND BOELTER +* CORRELATION (SINGLE PHASE) OR CHEN CORRELATION (SATURATED BOILING) +*---- + IF(IHCONV.EQ.0) THEN + ITER=0 + KWA=99 +*CGT CHECK IF REYNOLDS AND PRANDTL ARE IN RANGE OF VALIDITY OF +* GNIELINSKI CORRELATION + TSCLAD=TCALO + IF((REL.LT.2300).OR.(REL.GT.1E6)) THEN + WRITE(6,*) " THMSAL: ***WARNING*** REYNOLDS OUT RANGE." + ENDIF + IF((PRL.LT.0.6).OR.(PRL.GT.1E5)) THEN + WRITE(6,*) " THMSAL: ***WARNING*** PRANDTL OUT RANGE." + ENDIF + DO + ITER=ITER+1 + IF(ITER.GT.50) THEN + WRITE(HSMG,'(30HTHMSAL: HCONV FAILURE IN SLICE,I5,1H.)') K + CALL XABORT(HSMG) + ENDIF +*CGT Changed Dittus-Boelter by Gnielinski correlation +*CGT PRW: Prandtl number of liquid at wall temperature + CALL THMSPT(STP,TSCLAD,R1,R2,ZKONE,ZMUONE,CPONE,IMPX) + PRW=ZMUONE*CPONE/ZKONE + HA=(ZKL/HD)*0.012*(REL**0.87-280)*PRL**0.8*(1+(HD/DZ) + > **(2.0/3.0))*(PRL/PRW)**0.11 + IF(IMPX.GT.4) THEN + WRITE(6,*) 'THMSAL: REL,PRL,PRW,HA=',REL,PRL,PRW,HA + ENDIF + F=1.0 + S=1.0 + IF((XFL.EQ.XFL0).OR.(TSCLAD.LE.TSAT).OR.(KWA.EQ.0)) THEN +* Single-phase convection. Use Gnielinski correlation + KWA=0 + HB=0.0 + K0=0 + XFL=XFL0 + EPS=EPS0 + SLIP=SLIP0 + ELSE + CALL XABORT('THMSAL: INVALID HEAT TRANSFER REGIME') + ENDIF +* Chen correlation + HCONV=F*HA+S*HB + IF(HCONV.LE.0.0) THEN + WRITE(HSMG,'(34HTHMSAL: DRY OUT REACHED IN CHANNEL,3I5)') + > I,J,K + CALL XABORT(HSMG) + ENDIF + IF(ITIME.EQ.0) THEN + TWAL=(PHI+S*HB*TSAT+F*HA*TCALO)/(S*HB+F*HA) + ELSE + ZNUM=ZF(1)+RADCL*S*HB*TSAT+RADCL*F*HA*TCALO + ZDEN=ZF(2)+RADCL*S*HB+RADCL*F*HA + TWAL=MAX(273.15,ZNUM/ZDEN) + PHI=MAX(0.0,(ZF(1)-TWAL*ZF(2))/RADCL) + ENDIF + IF(ABS(TSCLAD-TWAL).GT.1.0E-5*TSCLAD) THEN + TSCLAD=TWAL + ELSE + EXIT + ENDIF + ENDDO + ELSE IF(IHCONV.EQ.1) THEN + IF(ITIME.EQ.0) THEN + TSCLAD=TCALO+PHI/KHCONV + ELSE + RCHC=RADCL*KHCONV + TSCLAD=MAX(273.15,(ZF(1)+RCHC*TCALO)/(ZF(2)+RCHC)) + PHI=(ZF(1)-TSCLAD*ZF(2))/RADCL + ENDIF + ENDIF + RETURN + END diff --git a/Donjon/src/THMSCD.f b/Donjon/src/THMSCD.f new file mode 100644 index 0000000..83a8187 --- /dev/null +++ b/Donjon/src/THMSCD.f @@ -0,0 +1,45 @@ +*DECK THMSCD + REAL FUNCTION THMSCD(TEMP,FTP,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the product of the heat capacity of fuel (in J/Kg/K) times +* its density (in Kg/m^3). Version for molten salts. +* +*Copyright: +* Copyright (C) 2024 Ecole Polytechnique de Montreal. +* +*Author(s): +* C. Garrido +* +*Parameters: input +* TEMP fuel temperature in Kelvin. +* FTP tpdata object with correlations to obtain properties of +* molten salt. +* +*Parameters: output +* THMSCD product of the heat capacity of fuel times its density +* (in J/K/m^3). +* +*----------------------------------------------------------------------- +* + USE t_saltdata + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(tpdata) FTP + REAL TEMP + INTEGER IMPX +*---- +* LOCAL VARIABLES +* CP: heat capacity in J/Kg/K +* RHO: fuel density Kg/m^3 +*---- + REAL CP,RHO,R2,R3,R4 +* + CALL THMSPT(FTP,TEMP,RHO,R2,R3,R4,CP,IMPX) + THMSCD=RHO*CP + RETURN + END diff --git a/Donjon/src/THMSDI.f b/Donjon/src/THMSDI.f new file mode 100644 index 0000000..3c4951b --- /dev/null +++ b/Donjon/src/THMSDI.f @@ -0,0 +1,81 @@ +*DECK THMSDI + FUNCTION THMSDI(T2K,T1K,FTP,IFRCDI,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the thermal conductivity integral of UOX or MOX fuel. +* +*Copyright: +* Copyright (C) 2024 Ecole Polytechnique de Montreal. +* +*Author(s): +* C. Garrido +* +*Parameters: input +* T2K final temperature in Kelvin. +* T1K initial temperature in Kelvin. +* FTP tpdata object with correlations to obtain properties of molten salt. +* IFRCDI flag indicating if average approximation is forced during +* fuel conductivity evaluation (0=default/1=average +* approximation forced). +* IMPX printing index (=0 for no print). +* +*Parameters: output +* THMSDI thermal conductivity integral in Watt/m/K. +* +*Reference: +* A. Poncot, "Assimilation de donnees pour la dynamique du xenon dans +* les coeurs de centrale nucleaire", Ph.D Thesis, Universite de +* Toulouse, France, 2008. +* +*----------------------------------------------------------------------- +* + USE t_saltdata + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(tpdata) FTP + INTEGER IFRCDI,IMPX + REAL T1K,T2K,THMSDI +*---- +* LOCAL VARIABLES +* NPAS number of rectangles in the quadrature +* DT rectangle width +* T2T1 temperature difference +* DTMIN cutoff criterion for selecting the approximation +*---- + INTEGER NPAS,I + REAL T1,T2,DT,TM,DTMIN,T2T1,TT + REAL R1,R2,ZKONE,ZMUONE,CPONE,CINT + DATA NPAS /10/ + DATA DTMIN /10./ +* + IF(MIN(T1K,T2K).LE.0.0) THEN + CALL XABORT('@THMSDI: NEGATIVE TEMPERATURE.') + ENDIF + T1=T1K + T2=T2K +* + T2T1 = T2-T1 + DT = T2T1/NPAS + TM = (T1+T2)/2.0 +* User-given conductivity, as a function of temperature + IF((ABS(T2T1).LT.DTMIN).OR.(IFRCDI.EQ.1)) THEN +* Use the average value approximation + CALL THMSPT(FTP,TM,R1,R2,ZKONE,ZMUONE,CPONE,IMPX) + THMSDI=ZKONE + ELSE +* Use the rectangle quadrature approximation + TT=T1-DT*0.5 + CINT=0. + DO I=1,NPAS + TT=TT+DT + CALL THMSPT(FTP,TT,R1,R2,ZKONE,ZMUONE,CPONE,IMPX) + CINT=CINT + ZKONE + ENDDO + THMSDI=CINT/NPAS + ENDIF + RETURN + END diff --git a/Donjon/src/THMTRS.f b/Donjon/src/THMTRS.f new file mode 100644 index 0000000..43b0caa --- /dev/null +++ b/Donjon/src/THMTRS.f @@ -0,0 +1,570 @@ +*DECK THMTRS + SUBROUTINE THMTRS(MPTHMI,MPTHM,IMPX,IX,IY,NZ,XBURN,VOLXY,HZ,DTIME, + > CFLUX,POROS,FNFU,NFD,NDTOT,IFLUID,SNAME,SCOMP, + > IGAP,IFUEL,FNAME,FCOMP,FCOOL,FFUEL,ACOOL, + > HD,PCH,MAXITC,MAXIT1,MAXITL,ERMAXT,ERMAXC,SPDIN,TINLET,POULET, + > FRACPU,ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC,KCONDC,UCONDC, + > IHGAP,KHGAP,IHCONV,KHCONV,WTEFF,IFRCDI,ISUBM,FRO,POW,TCOMB,DCOOL, + > TCOOL,TSURF) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Driver of the transient thermal-hydraulics module for a single time +* iteration +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal. +* +*Author(s): +* P. Gallet and A. Hebert +* +* 08/2023: C. Garrido Modifications to include Molten Salt heat transfer in +* coolant +* 07/2024: C. Garrido Modifications to include Molten Salt heat transfer +* in static fuel +* +*Parameters: input +* MPTHMI directory of the THM object containing steady-state +* thermohydraulics data at t-1. +* MPTHM directory of the THM object containing steady-state +* thermohydraulics data at t. +* IMPX printing index (=0 for no print). +* IX position of mesh along X direction. +* IY position of mesh along Y direction. +* NZ number of meshes along Z direction (channel direction). +* XBURN burnup distribution in MWday/tonne. +* VOLXY mesh area in the radial plane. +* HZ Z-directed mesh widths. +* DTIME time step in s. +* CFLUX critical heat flux in W/m^2. +* POROS oxyde porosity. +* FNFU number of active fuel rods in the fuel bundle. +* NFD number of discretisation points in fuel regions. +* NDTOT number of total discretization points in the the fuel +* pellet and the cladding. +* IFLUID type of fluid (0=H2O; 1=D2O). +* FCOOL power density fraction in coolant. +* FFUEL power density fraction in fuel. +* ACOOL coolant cross section area in m^2. +* HD hydraulic diameter of one assembly in m. +* PCH heating perimeter in m. +* MAXITC maximum number of flow iterations. +* MAXIT1 maximum number of conduction iterations. +* MAXITL maximum number of center-pellet iterations. +* ERMAXT convergence criterion for temperature in fuel pin in K. +* ERMAXC convergence criterion for coolant parameters (relative error). +* SPDIN inlet flow velocity at t in m/s. +* TINLET inlet temperature at t in K. +* POULET outlet pressure at t in Pa. +* FRACPU plutonium fraction in fuel. +* ICONDF fuel conductivity flag (0=Stora-Chenebault or COMETHE/ +* 1=user-provided polynomial + inverse term). +* NCONDF degree of user-provided fuel conductivity polynomial. +* KCONDF polynomial coefficients for fuel conductivity in W/m/K^(k+1) +* (except for the two last coefficients which belongs to the +* inverse term). +* UCONDF required unit of temperature in polynomial for fuel +* conductivity (KELVIN or CELSIUS). +* ICONDC clad conductivity flag (0=default/1=user-provided +* polynomial). +* NCONDC degree of user-provided clad conductivity polynomial. +* KCONDC polynomial coefficients for clad conductivity in W/m/K^(k+1). +* UCONDC required unit of temperature in polynomial for clad +* conductivity (KELVIN or CELSIUS). +* IHGAP flag indicating HGAP chosen (0=default/1=user-provided). +* KHGAP fixed user-provided HGAP value in W/m^2/K. +* IHCONV flag indicating HCONV chosen (0=default/1=user-provided). +* KHCONV fixed user-provided HCONV value in W/m^2/K. +* WTEFF surface temperature's weighting factor in effective fuel +* temperature. +* IFRCDI flag indicating if average approximation is forced during +* fuel conductivity evaluation (0=default/1=average +* approximation forced). +* ISUBM subcooling model (0: one-phase; 1: Bowring model; 2: Saha- +* Zuber model). +* FRO radial power form factors. +* POW power distribution at t in W. +* IGAP Flag indicating if the gap is considered (0=gap/1=no gap) +* IFUEL type of fuel (0=UO2/MOX; 1=SALT). +* FNAME Name of the molten salt (e.g. "LiF-BeF2") +* FCOMP Composition of the molten salt (e.g. "0.66-0.34") +* +*Parameters: output +* TCOMB averaged fuel temperature distribution in K. +* DCOOL averaged coolant density distribution in g/cc. +* TCOOL averaged coolant temperature distribution in K. +* TSURF surface fuel temperature distribution in K. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE t_saltdata +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) MPTHMI,MPTHM + INTEGER IMPX,IX,IY,NZ,NFD,NDTOT,IFLUID,MAXITC,MAXIT1,MAXITL,IHGAP, + > IGAP,IFUEL + REAL XBURN(NZ),VOLXY,HZ(NZ),DTIME,CFLUX,POROS,FNFU(NZ),FFUEL(NZ), + > ERMAXT,ERMAXC,FCOOL(NZ),SPDIN,TINLET,POULET,FRACPU, + > KCONDF(NCONDF+3),KCONDC(NCONDC+1),KHGAP,KHCONV,WTEFF,FRO(NFD-1), + > POW(NZ),TCOMB(NZ),DCOOL(NZ),TCOOL(NZ),TSURF(NZ),DGCOOL(NZ), + > HLV(NZ),ACOOL(NZ),PCH(NZ),HD(NZ) + CHARACTER UCONDF*12,UCONDC*12 +*---- +* LOCAL VARIABLES +*---- + TYPE(tpdata) STP,FTP + PARAMETER(KMAXO=100,MAXNPO=40,PES=9.81) + REAL ENT(4),RHOINL,MFLXIN,RHOIN0,MFLXIN0,HINLET,HINLE0,MUIN, + > DV(NZ),PARAM1,PARAM2,PARAM3,ERRG,ERRP,ERRH,ERR,DELTH,HMINF, + > POWLIN(NZ),PHI(NZ),MUT(NZ),RESM(NZ),RESP(NZ),RESH(NZ),QFUEL(NZ), + > QCOOL(NZ),TC1,AGM(NZ),PC(NZ),TSAT,PHIC(NZ),TP(NZ),TLC(NZ), + > HZC(NZ),XFL(NZ),EPS(NZ),TB,HGSAT,TCLAD(NZ),MFLXT0(NZ),ENTH(NZ), + > MFLXT(NZ),SLIP(NZ),K11 + INTEGER KWA(NZ) + REAL TRE10(MAXNPO),TRE11(MAXNPO),RADD(MAXNPO),XX2(MAXNPO), + > XX3(MAXNPO),ZF(2) + CHARACTER HSMG*131,SNAME*32,SCOMP*32,FNAME*32,FCOMP*32 + REAL XS(4) + DATA XS/-0.861136,-0.339981,0.339981,0.861136/ + INTEGER IDFM +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: VELOT0,DCOOL0,PREST0,ENTHT0, + > DLIQT0,VELOT,PREST,ENTHT,TCENTT,DLIQT + REAL, ALLOCATABLE, DIMENSION(:,:) :: RAD,TEMPT0,TEMPT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(RAD(NDTOT-1,NZ),VELOT0(NZ),DCOOL0(NZ),PREST0(NZ), + > ENTHT0(NZ),TEMPT0(NDTOT,NZ),DLIQT0(NZ),VELOT(NZ),PREST(NZ), + > ENTHT(NZ),TEMPT(NDTOT,NZ),TCENTT(NZ),DLIQT(NZ)) +*---- +* RECOVER DATA FROM FORMER TIME STEP OR STEADY-STATE CALCULATION IN THM +*---- + CALL LCMGET(MPTHMI,'DENSITY',DCOOL0) + CALL LCMGET(MPTHMI,'PRESSURE',PREST0) + CALL LCMGET(MPTHMI,'ENTHALPY',ENTHT0) + CALL LCMGET(MPTHMI,'VELOCITIES',VELOT0) + CALL LCMGET(MPTHMI,'TEMPERATURES',TEMPT0) + CALL LCMGET(MPTHMI,'LIQUID-DENS',DLIQT0) + CALL LCMGET(MPTHMI,'POULET',POUT0) + CALL LCMGET(MPTHMI,'TINLET',TIN0) + CALL LCMGET(MPTHMI,'RADII',RAD) + IDFM = 0 +*---- +* CALCULATE THE INVERSE TIME STEP +*---- + IF(DTIME.EQ.0.0) THEN + CALL XABORT('THMTRS: TIME STEP NOT DEFINED') + ELSE + DTINV=1.0/DTIME + ENDIF +*---- +* COMPUTE THE INLET FLOW ENTHALPY AND MASS FLOW RATE +*---- + IF(IFLUID.EQ.0) THEN + CALL THMSAT(POULET,TSAT) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(POULET,TSAT) +*CGT TODO: GET SATURATION TEMPERATURE FROM MSTPDB. GET ALSO FREEZING?? + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSGT(SNAME,SCOMP,STP,IMPX) + CALL THMSST(STP,TSAT,IMPX) + ENDIF + IF(IFUEL.EQ.1) THEN + CALL THMSGT(FNAME,FCOMP,FTP,IMPX) + ENDIF + IF(TINLET.GT.TSAT) THEN + WRITE(HSMG,'(28HTHMTRS: OUTLET TEMPERATURE (,1P,E12.4, + 1 40H K) GREATER THAN SATURATION TEMPERATURE.)') TINLET + CALL XABORT(HSMG) + ENDIF + RHOIN0=0.0 + IF(IFLUID.EQ.0) THEN + CALL THMPT(POUT0,TIN0,RHOIN0,HINLE0,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(POUT0,TIN0,RHOIN0,HINLE0,R3,R4,R5) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TINLET,RHOIN0,HINLE0,R3,R4,R5,IMPX) + ENDIF + MFLXIN0=SPDIN*RHOIN0 + IF(IFLUID.EQ.0) THEN + CALL THMPT(POULET,TINLET,RHOINL,HINLET,R3,MUIN,CPVIN) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(POULET,TINLET,RHOINL,HINLET,R3,MUIN,CPVIN) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TINLET,RHOINL,HINLET,R3,MUIN,CPVIN,IMPX) + ENDIF + MFLXIN=SPDIN*RHOINL + IF(NDTOT.GT.MAXNPO) CALL XABORT('THMTRS: MAXNPO OVERFLOW') +*---- +* MAIN LOOP ALONG THE 1D CHANNEL. + DO K=1,NZ +*---- +* COMPUTE THE LINEAR POWER, THE VOLUMIC POWER, THE THERMAL EXCHANGE +* COEFFICIENT OF THE GAP AND THE THERMAL HEAT FLUX ALONG THE CHANNEL +*---- + DV(K)=VOLXY*HZ(K) +* linear power in W/m. + POWLIN(K)=(POW(K)/DV(K))*VOLXY/FNFU(K) +* volumic power in W/m^3. + QFUEL(K)=POW(K)*FFUEL(K)/DV(K) + QCOOL(K)=POW(K)*FCOOL(K)/DV(K) +*---- +* INITIALIZATION OF THE THERMO-HYDRAULICAL PROPERTIES OF THE FLUID +*---- + DCOOL(K)=DCOOL0(K) + MUT(K)=MUIN + VELOT(K)=VELOT0(K) + MFLXT0(K)=DCOOL0(K)*VELOT(K) + MFLXT(K)=MFLXT0(K) + PREST(K)=PREST0(K) + ENTHT(K)=ENTHT0(K) + DLIQT(K)=DLIQT0(K) + DO L=1,NDTOT + TEMPT(L,K)=TEMPT0(L,K) + ENDDO + RESM(K)=MFLXT(K) + RESP(K)=PREST(K) + RESH(K)=ENTHT(K) + ENDDO +*---- +* ITERATIVE PROCEDURE FOR EACH CHANNEL +*---- + DO K=1,NZ + XFL(K)=0.0 + EPS(K)=0.0 + XFL(K)=0.0 + MFLXT(K)=0.0 + SLIP(K)=1.0 + KWA(K)=0 + ENDDO + KMIN=1 + DO K=1,NZ + IF(POW(K).NE.0.0) THEN + KMIN=K + EXIT + ENDIF + ENDDO + ITERC=0 + 20 ITERC=ITERC+1 + IF(ITERC.GT.MAXITC) THEN + CALL XABORT('THMTRS: CONVERGENCE FAILURE IN FLOW CALCULATION.') + ENDIF +*---- +* MAIN LOOP ALONG THE 1D CHANNEL. +*---- + K0=0 ! onset of nuclear boiling point + DO K=KMIN,NZ + IF(POW(K).EQ.0.0) CYCLE + IF(IMPX.GT.4) WRITE(6,190) K +*---- +* SOLVE THE CONDUCTION EQUATIONS INSIDE THE FUEL ROD +*---- + DO L=1,NDTOT-1 + TRE10(L)=TEMPT0(L,K) + TRE11(L)=TEMPT(L,K) + RADD(L)=RAD(L,K) + ENDDO + TSCLAD=TEMPT(NDTOT,K) + IF(IGAP.EQ.0) THEN + CALL THMROD(IMPX,NFD,NDTOT-1,MAXIT1,MAXITL,ERMAXT,DTINV, + 1 RADD,TRE10,TRE11,QFUEL(K),FRO,TSCLAD,POWLIN(K),XBURN(K), + 2 POROS,FRACPU,ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC, + 3 KCONDC,UCONDC,IHGAP,KHGAP,IFRCDI,TC1,XX2,XX3,ZF) + ELSE + CALL THMRNG(IMPX,NFD,NDTOT-1,MAXIT1,MAXITL,ERMAXT,DTINV, + 1 RADD,TRE10,TRE11,QFUEL(K),FRO,TSCLAD,POWLIN(K),XBURN(K), + 2 POROS,FRACPU,ICONDF,NCONDF,KCONDF,UCONDF,ICONDC,NCONDC, + 3 KCONDC,UCONDC,IFRCDI,IFUEL,FTP + 4 TC1,XX2,XX3,ZF) + ENDIF +*---- +* COMPUTE THE HEAT FLUX FROM CLAD TO COOLANT IN W/m^2 +*---- + PHI(K)=(ZF(1)-TSCLAD*ZF(2))/RAD(NDTOT-1,K) + IF(PHI(K).GT.CFLUX) THEN + WRITE(HSMG,'(23HTHMTRS: THE HEAT FLUX (,1P,E12.4,5H) IS , + > 37HGREATER THAN THE CRITICAL HEAT FLUX (,E12.4,2H).)') + > PHI(K),CFLUX + WRITE(6,'(/1X,A)') HSMG + ENDIF +*---- +* FLOW RATE CALCULATION WITH MASS CONSERVATION EQUATION +*---- + PARAM1=0.5*(DCOOL0(K)-DCOOL(K))*DTINV*HZ(K) + IF(K.EQ.KMIN) THEN + PARAM1=PARAM1+0.5*(RHOIN0-RHOINL)*DTINV*HZ(K) + MFLXT(K)=MFLXIN+PARAM1 + ELSE + PARAM1=PARAM1+0.5*(DCOOL0(K-1)-DCOOL(K-1))*DTINV*HZ(K) + MFLXT(K)=MFLXT(K-1)+PARAM1 + ENDIF +*---- +* ENTHALPY VECTOR CALCULATION WITH ENERGY CONSERVATION EQUATION +*---- + PARAM1=0.5*DCOOL(K)*DTINV*HZ(K)+MFLXT(K) + PARAM2=0.5*DCOOL0(K)*ENTHT0(K)*DTINV*HZ(K) + PARAM3=(QCOOL(K)+PHI(K)*PCH(K)/ACOOL(K))*HZ(K) + IF(K.EQ.KMIN) THEN + PARAM2=PARAM2+0.5*(RHOIN0*HINLE0-RHOINL*HINLET)*DTINV*HZ(K) + PARAM2=PARAM2+MFLXIN*HINLET + HMINF=HINLET + ELSE + PARAM2=PARAM2+0.5*(DCOOL0(K-1)*ENTHT0(K-1)- + 1 DCOOL(K-1)*ENTHT(K-1))*DTINV*HZ(K) + PARAM2=PARAM2+MFLXT(K-1)*ENTHT(K-1) + HMINF=ENTHT(K-1) + ENDIF + ENTHT(K)=(PARAM2+PARAM3)/PARAM1 + DELTH=ENTHT(K)-HMINF +*---- +* COMPUTE THE COOLANT TEMPERATURE AND THE OUTER CLADDING TEMPERATURE +*---- + DO I1=1,4 + POINT=(1.0+XS(I1))/2.0 + ENT(I1)=HMINF+POINT*DELTH + ENDDO + IF(K.GT.1) THEN + XFL(K)=XFL(K-1) + EPS(K)=EPS(K-1) + SLIP(K)=SLIP(K-1) + ENDIF +*CGT + IF ((IFLUID.EQ.0).OR.(IFLUID.EQ.1)) THEN + CALL THMH2O(1,IX,IY,K,K0,PREST(K),MFLXT(K),ENTHT(K),ENT,HD(K), + > IFLUID,IHCONV,KHCONV,ISUBM,RAD(NDTOT-1,K),ZF,VELOT(K), + > IDFM,PHI(K),XFL(K),EPS(K),SLIP(K),ACOOL(K),PCH(K),HZ(K),TCALO, + > DCOOL(K),DLIQT(K),DGCOOL(K),TRE11(NDTOT), + > KWA(K),VGJprime,HLV(K)) + + ELSEIF (IFLUID.EQ.2) THEN + CALL THMSAL(IMPX,1,IX,IY,K,K0,MFLXT(K),ENTHT(K),ENT,HD(K), + > STP,IHCONV,KHCONV,ISUBM,RAD(NDTOT-1,K),ZF,PHI(K), + > XFL(K), + > EPS(K),SLIP(K),HZ(K),TCALO,DCOOL(K),DLIQT(K), + > TRE11(NDTOT),KWA(K)) + ENDIF +*CGT + DO L=1,NDTOT-1 + TRE11(L)=XX2(L)+TRE11(NDTOT)*XX3(L) + TEMPT(L,K)=TRE11(L) + ENDDO + TEMPT(NDTOT,K)=TRE11(NDTOT) +*---- +* RECOVER MESHWISE TEMPERATURES AND FLUID DENSITY. BY DEFAULT, USE THE +* ROWLANDS FORMULA TO COMPUTE THE EFFECTIVE FUEL TEMPERATURE, OTHERWISE +* USE USER-SPECIFIED WEIGHTING FACTOR. +*---- + TCOMB(K)=(1.0-WTEFF)*TC1+WTEFF*TRE11(NFD) + TCOOL(K)=TCALO + TCENTT(K)=TC1 + TSURF(K)=TRE11(NFD) + TCLAD(K)=TRE11(NDTOT) + ENDDO +*---- +* MOMENTUM VECTOR CALCULATION WITH MOMENTUM CONSERVATION EQUATION +*---- +* DO K=NZ,1,-1 +* IF(POW(K).EQ.0.0) CYCLE +* RET=ABS(MFLXT(K))*(1.0-XFL(K))*HD/MUT(K) +* PARAM1=0.5*(MFLXT(K)-MFLXT0(K))*DTINV*HZ(K) +* PARAM2=MFLXT(K)**2.0/DCOOL(K) +* CALL THMFRI(RET,F) +* IF(XFL(K).GT.0.0) THEN +* CALL THMPLO(PREST(K),XFL(K),PHIL0) +* ELSE +* PHIL0=1.0 +* ENDIF +* PARAM31=DCOOL(K)*PES +* PARAM32=0.5*F*MFLXT(K)**2.0/HD/DLIQT0(K)*PHIL0 +* PARAM3=(PARAM31+PARAM32)*HZ(K) +* IF(K.EQ.1) THEN +* PARAM1=PARAM1+0.5*(MFLXIN-MFLXIN0)*DTINV*HZ(1) +* PARAM2=PARAM2-MFLXIN**2.0/RHOINL +* PREST(1)=PREST(2)+PARAM1+PARAM2+PARAM3 +* ELSE IF(K.LT.NZ) THEN +* PARAM1=PARAM1+0.5*(MFLXT(K-1)-MFLXT0(K-1))*DTINV* +* 1 HZ(K) +* PARAM2=PARAM2-MFLXT(K-1)**2.0/DCOOL(K-1) +* PREST(K)=PREST(K+1)+PARAM1+PARAM2+PARAM3 +* ELSE IF(K.EQ.NZ) THEN +* PARAM1=PARAM1+0.5*(MFLXT(NZ-1)-MFLXT0(NZ-1))*DTINV* +* 1 HZ(NZ) +* PARAM2=PARAM2-MFLXT(K-1)**2.0/DCOOL(K-1) +* PREST(NZ)=POULET+PARAM1+PARAM2+PARAM3 +* ENDIF +* ENDDO + PINLET=PREST(KMIN) +*---- +* CALCULATE THE VOID FRACTION COEFFICIENT AND THE STEAM QUALITY +*---- + DO K=1,NZ + HZC(K)=HZ(K) + PHIC(K)=PHI(K) + TP(K)=TCLAD(K) + TLC(K)=TCOOL(K) + ENTH(K)=ENTHT(K) + AGM(K)=MFLXT(K) + PC(K)=PREST(K) + ENDDO +*---- +* COMPUTE NEW VALUES OF DENSITIES AND VELOCITIES OVER CHANNEL +*---- + DO K=1,NZ + IF(EPS(K).GT.0.0) THEN + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PREST(K),TSAT) + CALL THMTX(TSAT,1.0,RGSAT,HGSAT,R3,R4,R5) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PREST(K),TSAT) + CALL THMHTX(TSAT,1.0,RGSAT,HGSAT,R3,R4,R5) + ENDIF + DCOOL(K)=DLIQT(K)*(1.0-EPS(K))+EPS(K)*RGSAT + ELSE + DCOOL(K)=DLIQT(K) + ENDIF + VELOT(K)=MFLXT(K)/DCOOL(K) + ENDDO +*---- +* CONVERGENCE TEST FOR THE ENTHALPY, PRESSURE DENSITY AND +* MASS FLUX CALCULATION. +*---- + ERRG=0.0 + ERRP=0.0 + ERRH=0.0 + ERR=0.0 + ERX=0.0 + DO K=1,NZ + IF(POW(K).EQ.0.0) CYCLE + IF(IFLUID.EQ.0) THEN + CALL THMSAT(PREST(K),TSAT) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHST(PREST(K),TSAT) + ENDIF + TB=TSAT-0.1 + IF(TCOOL(K).LT.TB) THEN + IF(IFLUID.EQ.0) THEN + CALL THMPT(PREST(K),TCOOL(K),R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PREST(K),TCOOL(K),R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TCOOL(K),R11,H11,K11,MUT(K),C11,IMPX) + ENDIF + ELSE + IF(IFLUID.EQ.0) THEN + CALL THMPT(PREST(K),TB,R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PREST(K),TB,R11,H11,K11,MUT(K),C11) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TB,R11,H11,K11,MUT(K),C11,IMPX) + ENDIF + ENDIF + ERRG=MAX(ERRG,ABS(MFLXT(K)-RESM(K))/MFLXT(K)) + ERRP=MAX(ERRP,ABS(PREST(K)-RESP(K))/PREST(K)) + ERRH=MAX(ERRH,ABS(ENTHT(K)-RESH(K))/ENTHT(K)) + RESM(K)=MFLXT(K) + RESP(K)=PREST(K) + RESH(K)=ENTHT(K) + ENDDO + ERR=MAX(ERRG,ERRP,ERRH) + IF(IMPX.GT.1) WRITE(6,200) ITERC,ERRG,ERRP,ERRH + IF(IFLUID.EQ.0) THEN + CALL THMPT(PINLET,TINLET,RHOINL,HINLET,R3,MUIN,CPVIN) + ELSE IF(IFLUID.EQ.1) THEN + CALL THMHPT(PINLET,TINLET,RHOINL,HINLET,R3,MUIN,CPVIN) + ELSE IF(IFLUID.EQ.2) THEN + CALL THMSPT(STP,TINLET,RHOINL,HINLET,R3,MUIN,CPVIN,IMPX) + ENDIF + IF((ERR.LT.ERMAXC).AND.(ITERC.GT.1)) THEN + GO TO 30 + ELSE + GO TO 20 + ENDIF +*---- +* PRINT THE OUTLET THERMOHYDRAULICAL PARAMETERS +*---- + 30 IF(IMPX.GT.3) THEN + WRITE(6,'(/16H THMTRS: CHANNEL,2I6/1X,27(1H-))') IX,IY + WRITE(6,210) ' ___________________________________________', + > '____________________________________________________', + > '____________________________________________________', + > '_______________________________' + WRITE(6,210) '| | TFUEL | TSURF | MFLXT ', + > ' | DCOOL | TCOOL | PCOOL | HCO', + > 'OL | QFUEL | QCOOL | VOID | ', + > 'QUAL | SLIP | FLOW |', + > '| | K | K | Kg/m2/s | K', + > 'g/m3 | K | Pa | J/Kg | ', + > ' W/m3 | W/m3 | | ', + > '| | REGIME |' + WRITE(6,210) '|_____|____________|____________|___________', + > '__|_____________|_____________|_____________|_______', + > '______|_____________|_____________|___________|_____', + > '________|_____________|________|' + DO L=NZ,1,-1 + IF(L.EQ.1) THEN + WRITE(6,220) '| BOT |',TCOMB(L),' |',TSURF(L), + > ' |',MFLXT(L),' |',DCOOL(L),' |',TCOOL(L), + > ' |',PREST(L),' |',ENTHT(L),' |',QFUEL(L), + > ' |',QCOOL(L),' |',EPS(L),' |',XFL(L),' |',SLIP(L), + > ' |',KWA(L),' |' + ELSEIF(L.EQ.NZ) THEN + WRITE(6,220) '| TOP |',TCOMB(L),' |',TSURF(L), + > ' |',MFLXT(L),' |',DCOOL(L),' |',TCOOL(L), + > ' |',PREST(L),' |',ENTHT(L),' |',QFUEL(L), + > ' |',QCOOL(L),' |',EPS(L),' |',XFL(L),' |',SLIP(L), + > ' |',KWA(L),' |' + ELSE + WRITE(6,225) '| ',L,' |',TCOMB(L),' |',TSURF(L), + > ' |',MFLXT(L),' |',DCOOL(L),' |',TCOOL(L), + > ' |',PREST(L),' |',ENTHT(L),' |',QFUEL(L), + > ' |',QCOOL(L),' |',EPS(L),' |',XFL(L),' |',SLIP(L), + > ' |',KWA(L),' |' + ENDIF + ENDDO + WRITE(6,210) '|_____|____________|____________|___________', + > '__|_____________|_____________|_____________|_______', + > '______|_____________|_____________|___________|_____', + > '________|_____________|________|' + + ENDIF +*---- +* MODIFICATION OF THE VECTORS TO FIT THE GEOMETRY OF THE CHANNELS AND +* THE BUNDLES AND WRITE THE DATA IN LCM OBJECT THM +*---- + CALL LCMPUT(MPTHM,'PRESSURE',NZ,2,PREST) + CALL LCMPUT(MPTHM,'DENSITY',NZ,2,DCOOL) + CALL LCMPUT(MPTHM,'ENTHALPY',NZ,2,ENTHT) + CALL LCMPUT(MPTHM,'VELOCITIES',NZ,2,VELOT) + CALL LCMPUT(MPTHM,'CENTER-TEMPS',NZ,2,TCENTT) + CALL LCMPUT(MPTHM,'COOLANT-TEMP',NZ,2,TCOOL) + CALL LCMPUT(MPTHM,'LIQUID-DENS',NZ,2,DLIQT) + CALL LCMPUT(MPTHM,'PINLET',1,2,PINLET) + CALL LCMPUT(MPTHM,'TINLET',1,2,TINLET) + CALL LCMPUT(MPTHM,'VINLET',1,2,SPEED) + CALL LCMPUT(MPTHM,'POWER',NZ,2,POW) + CALL LCMPUT(MPTHM,'POULET',1,2,POULET) + CALL LCMPUT(MPTHM,'TEMPERATURES',NDTOT*NZ,2,TEMPT) + CALL LCMPUT(MPTHM,'RADII',(NDTOT-1)*NZ,2,RAD) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DLIQT,TCENTT,TEMPT,ENTHT,PREST,VELOT,DLIQT0,TEMPT0, + > ENTHT0,PREST0,DCOOL0,VELOT0,RAD) + RETURN +* + 190 FORMAT(/21H THMTRS: AXIAL SLICE=,I5) + 200 FORMAT(/24H THMTRS: FLOW ITERATION=,I5,1P,8H ERROR=,3E12.4) + 210 FORMAT(1X,A,A,A,A) + 220 FORMAT(1X,A,F11.2,A,F11.2,A,F12.4,A,F12.4,A,F12.2,A,3P,E12.4, + > A,1P,E12.4,A,1P,E12.4,A,1P,E12.4,A,0P,F10.4,A,E12.4,A, + > E12.4,A,I5,2X,A) + 225 FORMAT(1X,A,I3,A,F11.2,A,F11.2,A,F12.4,A,F12.4,A,F12.2,A,3P, + > E12.4,A,1P,E12.4,A,1P,E12.4,A,1P,E12.4,A,0P,F10.4,A, + > E12.4,A,E12.4,A,I5,2X,A) + END diff --git a/Donjon/src/THMVGJ.f90 b/Donjon/src/THMVGJ.f90 new file mode 100644 index 0000000..7fdae19 --- /dev/null +++ b/Donjon/src/THMVGJ.f90 @@ -0,0 +1,111 @@ +SUBROUTINE THMVGJ(VCOOL, DCOOL, PCOOL, MUT, XFL, HD, RHOG, RHOL, EPS, IDFM, VGJ, C0) +! +!----------------------------------------------------------------------- +! +!Purpose: +! Update the concentration parameter CO and the drift velocity VGJ +! in the THM model after several correlations to implement the drift flux model +! in the THM code +! +!Copyright: +! Copyright (C) 2025 Ecole Polytechnique de Montreal +! +!Author(s): M. Bellier +! 04/2025: M. Bellier - Creation +! +!Parameters: input +! XFL quality of the fluid in the channel +! DCOOL density of the fluid in the channel +! VCOOL velocity of the fluid in the channel +! PCOOL pressure of the fluid in the channel +! TCOOL temperature of the fluid in the channel +! MUT dynamic viscosity of the fluid in the channel +! HD hydraulic diameter of the channel +! RHOG density of the vapour in given thermohydraulic conditions +! RHOL density of the liquid in given thermohydraulic conditions +! ESP void fraction of the fluid +! IDFM flag indicating if the drift flux model is to be used +! (0=HEM1(no drift velocity)/1=EPRI/2=MODEBSTION/3=GERAMP/4=CHEXAL) +! +!Parameters: output +! VGJ drift velocity +! C0 concentration parameter +! +!----------------------------------------------------------------------- +! + USE GANLIB + IMPLICIT NONE +!---- +! SUBROUTINE ARGUMENTS +!---- + REAL VCOOL, DCOOL, PCOOL, MUT, XFL, HD + REAL EPS, RHOG, RHOL + INTEGER IDFM +!---- +! LOCAL VARIABLES +!---- + REAL g + REAL C1, k1, k0, r, PR, SIGM, VGJ, C0, REY + INTEGER PC + + REY = ABS(VCOOL*DCOOL) * (1.0 - XFL) * HD / MUT !Reynolds + g = 9.81 !gravity + PR=PCOOL/10**6 ! PCOOL ou autre valeur de P ? initialement Pinlet + SIGM=-7.2391E-6*PR**3+2.8345E-4*PR**2-5.1566E-3*PR+4.2324E-2 +!---- +! VGJ AND C0 CALCULATION +!---- +IF (RHOG.EQ.0) THEN + C0=0 + VGJ=0 +ELSE IF (RHOL.EQ.0) THEN + C0=0 + VGJ=0 + +ELSE IF (IDFM.EQ.0) THEN +!HEM1 correlation (no drift velocity) + VGJ = 0 + C0 = 1 + +ELSE IF (IDFM.EQ.4) THEN +! Chexal correlation +! Correlation used in previous codes, after the work of Sarra Zoghlami for CANDU reactors + C0=1.13 + VGJ=1.18*((SIGM*9.81*(RHOL-RHOG))/(RHOL**2))**0.25 + + +ELSE IF (IDFM.EQ.3) THEN +! GEramp correlation + IF (SIGM.EQ.0) THEN + VGJ = 0 + ELSE + VGJ = (g*SIGM*(RHOL-RHOG)/(RHOG**2))**0.25 + IF (EPS.GT.0.65) THEN + VGJ= VGJ*(2.9/0.35)*(1-EPS) + C0= 1 + (0.1/0.35)*(1-EPS) + ELSE + VGJ = 2.9*VGJ + C0= 1.1 + ENDIF + ENDIF + +ELSE IF (IDFM.EQ.1) THEN +! EPRI correlation + VGJ= ((2**0.5)*g*SIGM*(RHOL-RHOG)/(RHOL**2))**0.25 * ((1+EPS)**1.5) + PC = 22060000 + C1 = (4 * (PC**2))/(PCOOL*(PC - PCOOL)) + k1 = MIN(0.8, 1/(1 + exp(-REY /60000))) + k0 = k1 + (1-k1) * (RHOG / RHOL)**2 + r = (1+1.57*(RHOG/RHOL))/(1-k1) + IF (EPS.GT.0) THEN + C0 = (k0 + (1 - k0)*(EPS**r)*exp((-1)*C1*(1-EPS))*(sinh(C1/2)/sinh(C1/2*EPS)))**(-1) + ENDIF + +ELSE IF (IDFM.EQ.2) THEN +! Modfified Bestion Correlation + VGJ = 0.188 * (((RHOL - RHOG) * g * HD ) / RHOG )*0.5 + C0 = 1.2 - 0.2*(RHOG/RHOL)**0.5 + +ENDIF +RETURN +END
\ No newline at end of file diff --git a/Donjon/src/TINCHA.f b/Donjon/src/TINCHA.f new file mode 100644 index 0000000..4b02488 --- /dev/null +++ b/Donjon/src/TINCHA.f @@ -0,0 +1,85 @@ +*DECK TINCHA + SUBROUTINE TINCHA(IPMAP,NCH,IMPX,NAMCHA,TTIME,RFCHAN) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute 'REF-CHAN' record in L_MAP object for history-based cases. +* +*Copyright: +* Copyright (C) 2013 Ecole Polytechnique de Montreal +* +*Author(s): +* A. Hebert +* +*Parameters: input +* IPMAP pointer to fuel-map information. +* NCH number of channels +* IMPX print flag +* NAMCHA channel name +* TTIME refuelling time +* +*Parameters: output +* RFCHAN time values at which channels are refueled inside a refueling +* time period +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCH,IMPX + CHARACTER*(*) NAMCHA + REAL RFCHAN(NCH) +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40) + INTEGER ISTATE(NSTATE) + CHARACTER XNAM*4,YNAM*4,TEXT4*4 + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX,IXN,IYN +* + CALL LCMSIX(IPMAP,'GEOMAP',1) + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.7) CALL XABORT('TINCHA: 3-D CARTESIAN GEOMETRY' + + //' REQUIRED') + NX = ISTATE(3) + NY = ISTATE(4) + NREG = ISTATE(6) + ALLOCATE(MIX(NREG),IXN(NX),IYN(NY)) + CALL LCMGET(IPMAP,'MIX',MIX) + CALL LCMSIX(IPMAP,' ',2) + CALL LCMGET(IPMAP,'XNAME',IXN) + CALL LCMGET(IPMAP,'YNAME',IYN) + TEXT4 = NAMCHA(2:3) + IX = 1 + IY = 1 + DO 10 I=1,NX + WRITE(XNAM,'(A4)') IXN(I) + IF (XNAM.EQ.TEXT4) THEN + IX = I + GOTO 20 + ENDIF + 10 CONTINUE + 20 TEXT4 = NAMCHA(1:1) + DO 30 I=1,NY + WRITE(YNAM,'(A4)') IYN(I) + IF (YNAM.EQ.TEXT4) THEN + IY = I + GOTO 40 + ENDIF + 30 CONTINUE +* + 40 I = (IY-1)*NX + IX + ICHANAM = MIX(I) + IF(ICHANAM.EQ.0) CALL XABORT('TINCHA: WRONG CHANNEL NAME') + DEALLOCATE(IYN,IXN,MIX) + RFCHAN(ICHANAM) = TTIME + IF(IMPX.GT.0) THEN + WRITE(6,*) 'TINCHA: REFUEL ',NAMCHA,' NUMBER ',I,' AT TIME ', + 1 TTIME + ENDIF + RETURN + END diff --git a/Donjon/src/TINFL.f b/Donjon/src/TINFL.f new file mode 100644 index 0000000..ac3dfb6 --- /dev/null +++ b/Donjon/src/TINFL.f @@ -0,0 +1,56 @@ +*DECK TINFL + SUBROUTINE TINFL (NNS,NW,NW2,NK) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Produce the useful vector for refuelling, according +* to a given refuelling-scheme +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: input/output +* NNS Number corresponding to the refuelling type +* NW Vector corresponding to the refuelling type +* NW > 0 : Position of the bundle before refuelling +* NW = 0 : Insertion of a new bundle +* NW2 Vector NW when the refueling is negative +* NK Number of bundles per channel +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +* + INTEGER NNS,NK,NW(NK),NW2(NK) + INTEGER MODEID,I,IP,NL +* + MODEID = NNS +* +*---- MODE DE RECHARGEMENT GENERALISE +* + IF(MODEID.GT.NK) THEN + WRITE(6,'(13H @TINFL: NNS=,I6,4H NK=,I6)') NNS,NK + CALL XABORT('@TINFL: ONLY BI-DIRECTIONNAL REFUELING ') + ELSE +* +*------- MODE DE RECHARGEMENT DIRECT +* + NW2(:NK)=0 + NW(:MODEID)=0 +* + IF(MODEID.NE.NK) THEN + NL = NK - MODEID + DO 20 I=1,NL + IP = MODEID + I + NW(IP) = I + NW2(I)=I+NNS + 20 CONTINUE + ENDIF +* + ENDIF + RETURN + END diff --git a/Donjon/src/TINMIC.f b/Donjon/src/TINMIC.f new file mode 100644 index 0000000..8fa8585 --- /dev/null +++ b/Donjon/src/TINMIC.f @@ -0,0 +1,178 @@ +*DECK TINMIC + SUBROUTINE TINMIC(IPMIC,IPMIC2,IPMIC3,NB,NCH,NW,ICH,NISO,NISO2, + 1 IWORK,BSH,NDENS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Microscopic refueling to update the microlib (micro-depletion) +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal +* +*Author(s): +* M. Guyot +* +*Parameters: input/output +* IPMIC Adress of the L_LIBRARY in creation mode. +* IPMIC2 Adress of the fuel-map L_LIBRARY in read-only mode. +* IPMIC3 Adress of the L_LIBRARY in read-only mode, containing new +* fuel properties. +* NB Number of bundles +* NCH Number of channels +* NW Vector containing new index for the refuelling +* ICH Number of the channel to refuel +* NISO Number of isotopes in the fuel-map microlib +* NISO2 Number of isotopes in the third microlib +* IWORK Useful vector for refueling +* BSH Vector containing new mixtures after shifting +* NDENS New isotopic densities after refueling +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMIC,IPMIC2,IPMIC3 + INTEGER NB,NCH,NW(NB),ICH,NISO,NISO2,IWORK(NB,2),BSH(NB) + REAL NDENS(NISO) +*---- +* LOCAL VARIABLES +*---- + PARAMETER (IOUT=6,MAXISO=100) + INTEGER IB,ISO,ISO2,IMIX,I,SHT(NB),IND(MAXISO),IND2(MAXISO),I1,I2 + CHARACTER TEXT*12,TEXT2*12 + LOGICAL LMIX + TYPE(C_PTR) JPMIC2,JPMIC3 + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX,MIX2,TODO,TODO2,TYP,TYP2 + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NAME,NAME2,USED,USED2 + REAL, ALLOCATABLE, DIMENSION(:) :: DENS,DENS2,TEMP,TEMP2,VOL,VOL2 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(MIX(NISO),MIX2(NISO2),TODO(NISO),TODO2(NISO2),TYP(NISO), + 1 TYP2(NISO2)) + ALLOCATE(NAME(3,NISO),NAME2(3,NISO2),USED(3,NISO),USED2(3,NISO2)) + ALLOCATE(DENS(NISO),DENS2(NISO2),TEMP(NISO),TEMP2(NISO2), + 1 VOL(NISO),VOL2(NISO2)) +*---- +* RECOVER INFORMATION +*---- + CALL LCMGET(IPMIC2,'ISOTOPESMIX',MIX) + CALL LCMGET(IPMIC3,'ISOTOPESMIX',MIX2) + CALL LCMGET(IPMIC2,'ISOTOPERNAME',NAME) + CALL LCMGET(IPMIC3,'ISOTOPERNAME',NAME2) + CALL LCMGET(IPMIC2,'ISOTOPESUSED',USED) + CALL LCMGET(IPMIC3,'ISOTOPESUSED',USED2) + CALL LCMGET(IPMIC2,'ISOTOPESDENS',DENS) + CALL LCMGET(IPMIC3,'ISOTOPESDENS',DENS2) + CALL LCMGET(IPMIC2,'ISOTOPESTODO',TODO) + CALL LCMGET(IPMIC3,'ISOTOPESTODO',TODO2) + CALL LCMGET(IPMIC2,'ISOTOPESTYPE',TYP) + CALL LCMGET(IPMIC3,'ISOTOPESTYPE',TYP2) + CALL LCMGET(IPMIC2,'ISOTOPESTEMP',TEMP) + CALL LCMGET(IPMIC3,'ISOTOPESTEMP',TEMP2) + CALL LCMGET(IPMIC2,'ISOTOPESVOL',VOL) + CALL LCMGET(IPMIC3,'ISOTOPESVOL',VOL2) +*---- +* CHECK IF THE MIXTURES TO SHIFT EXIST IN THE MICROLIB +*---- + DO 10 IB=1,NB + LMIX=.FALSE. + DO 15 ISO2=1,NISO2 + IF(MIX2(ISO2).EQ.IWORK(IB,2)) THEN + LMIX=.TRUE. + ENDIF + 15 CONTINUE + IMIX=MIX2(ISO2) + IF(.NOT.LMIX) THEN + WRITE(IOUT,*) '@TINMIC: THE MIXTURE ',IMIX,' IS NOT PRESENT ' + + //'IN THE MICROLIB FOR THE REFUEL. ' + CALL XABORT('@TINMIC: REFUELING ERROR. ') + ENDIF + 10 CONTINUE +*---- +* COMPUTE THE VECTORS FOR THE REFUELING +*---- +* SHT CONTAINS THE MIXTURES OF THE CHANNEL TO SHIFT + SHT(:NB)=0 + DO I=1,NB + SHT(I)=ICH+(I-1)*NCH + ENDDO +* BSH CONTAINS THE NEW MIXTURE AFTER SHIFTING + DO I=1,NB + IF(NW(I).EQ.0) THEN + BSH(I)=0 + ELSE + BSH(I)=SHT(NW(I)) + ENDIF + ENDDO + + CALL LCMGET(IPMIC,'ISOTOPESDENS',NDENS) + + DO 20 IB=1,NB + IND(:MAXISO)=0 + IND2(:MAXISO)=0 + I1=0 + I2=0 + DO 25 ISO=1,NISO + IF(MIX(ISO).EQ.SHT(IB)) THEN + I1=I1+1 + IF(I1.GE.MAXISO) CALL XABORT('@TINMIC: NUMBER OF ISOTOPES' + + //' OVERFLOW(1). ') + IND(I1)=ISO + ENDIF + 25 CONTINUE + IF(BSH(IB).EQ.0) THEN +* THE PROPERTIES ARE RECOVERED FROM THE THIRD LIBRARY + DO 30 ISO2=1,NISO2 + IF(MIX2(ISO2).EQ.IWORK(IB,2)) THEN + I2=I2+1 + IF(I2.GE.MAXISO) CALL XABORT('@TINMIC: NUMBER OF ISOTOPES' + + //' OVERFLOW(2). ') + IND2(I2)=ISO2 + ENDIF + 30 CONTINUE + IF(I1.NE.I2) CALL XABORT('@TINMIC: WRONG NUMBER OF ISOTOPES ' + + //'IN THE NEW MIXTURE(1). ') + DO 35 J=1,I1 + NDENS(IND(J))=DENS2(IND2(J)) + WRITE(TEXT,'(3A4)') (USED(I0,IND(J)),I0=1,3) + WRITE(TEXT2,'(3A4)') (USED2(I0,IND2(J)),I0=1,3) + JPMIC3=LCMGID(IPMIC3,TEXT2) + CALL LCMSIX(IPMIC,TEXT,1) + CALL LCMEQU(JPMIC3,IPMIC) + CALL LCMSIX(IPMIC,' ',2) + 35 CONTINUE +* THE PROPERTIES ARE RECOVERED FROM THE FUEL MAP LIBRARY + ELSE + DO 40 ISO=1,NISO + IF(MIX(ISO).EQ.BSH(IB)) THEN + I2=I2+1 + IF(I2.GE.MAXISO) CALL XABORT('@TINMIC: NUMBER OF ISOTOPES' + + //' OVERFLOW(3). ') + IND2(I2)=ISO + ENDIF + 40 CONTINUE + IF(I1.NE.I2) CALL XABORT('@TINMIC: WRONG NUMBER OF ISOTOPES ' + + //'IN THE NEW MIXTURE(2). ') + DO 45 J=1,I1 + NDENS(IND(J))=DENS(IND2(J)) + WRITE(TEXT,'(3A4)') (USED(I0,IND(J)),I0=1,3) + WRITE(TEXT2,'(3A4)') (USED(I0,IND2(J)),I0=1,3) + JPMIC2=LCMGID(IPMIC2,TEXT2) + CALL LCMSIX(IPMIC,TEXT,1) + CALL LCMEQU(JPMIC2,IPMIC) + CALL LCMSIX(IPMIC,' ',2) + 45 CONTINUE + ENDIF + 20 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(VOL2,VOL,TEMP2,TEMP,DENS2,DENS) + DEALLOCATE(USED2,USED,NAME2,NAME) + DEALLOCATE(TYP2,TYP,TODO2,TODO,MIX2,MIX) + RETURN + END diff --git a/Donjon/src/TINREF.f b/Donjon/src/TINREF.f new file mode 100644 index 0000000..5a7e609 --- /dev/null +++ b/Donjon/src/TINREF.f @@ -0,0 +1,347 @@ +*DECK TINREF + SUBROUTINE TINREF(IPRES,IPMIC,IPMIC2,IPMIC3,NCH,NK,NX,NY,NZ,NREG, + + NAMCHA,NS,MS,WINT,MIX,IXN,IYN,BS,PS,ISFT,POW,MAXS,NSS, + + IND,IPRT,KRF,LMIC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Refuel a channel according to a refuelling mode in Cartesian geometry. +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: input/output +* IPRES Adress of the map Linked_List or XSM file. +* IPMIC Adress of the L_LIBRARY in creation mode. +* IPMIC2 Adress of the fuel-map L_LIBRARY in read-only mode. +* IPMIC3 Adress of the L_LIBRARY in read-only mode, containing new +* fuel properties. +* NCH Number of channels +* NK Number of bundles per channel +* NX Number of X-Meshes +* NY Number of Y-Meshes +* NZ Number axial planes +* NREG Number of regions in fuel map geometry +* NAMCHA Name of the channel to refuel +* NS Number of bundles inserted +* MS Old maximum of shift + 1. +* MIX Fuel map bundle index +* IXN Name of the channel according to X +* IYN Name of the channel according to Y +* POW Power distribution. +* INDEX Fuel type indice +* IND Fuel type indice in the channel to refuel +* MAXS Maximum number of power shift +* IPRT Flag for printing level +* KRF Type of refueling +* LMIC =.true. for a micro-refueling +* +*Parameters: +* WINT +* BS +* PS +* ISFT +* NSS +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPRES,IPMIC,IPMIC2,IPMIC3 + INTEGER NCH,NK,NX,NY,NZ,NS,NREG,ILONG,ITYP,IX,IY,IPRT,MS,IS, + 1 MAXS,KS,NSS(NCH),NNS + REAL WINT(NCH,NK),BS(NCH,NK,MS),PS(NCH,NK,MS),POW(NCH,NK) + CHARACTER XNAM*4,YNAM*4,NAMCHA*4,TEXT4*4 + INTEGER MIX(NREG),IXN(NX),IYN(NY),ISFT(NCH,NK),IND(*) + LOGICAL LMIC + REAL TMPDAY(3) +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40,IOUT=6) + INTEGER ISTATE(NSTATE),I,J + CHARACTER CS*2,HSMG*131 + INTEGER, ALLOCATABLE, DIMENSION(:) :: NW,NW2,NWU,ISONA,ISOMI,ISHF + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ICHMAP,INDEX,IWORK + REAL, ALLOCATABLE, DIMENSION(:) :: DENIS,NDENS + REAL, ALLOCATABLE, DIMENSION(:,:) :: WORK + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: WORKS + LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASK,MASKL +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(NW(NK),NW2(NK),INDEX(NCH,NK),IWORK(NK,2),ICHMAP(NX,NY)) + ALLOCATE(WORK(NK,2),WORKS(NK,MS,2)) +*---- +* RECOVER SHIFT VECTOR +*---- + CALL LCMLEN(IPRES,'ISHIFT',ILS,ITYLCM) + IF(ILS.NE.0) THEN + CALL LCMGET(IPRES,'ISHIFT',ISFT(1,1)) + DO 18 I=1,NK + DO 17 J=1,NCH + MAXS=MAX(MAXS,ISFT(J,I)) + 17 CONTINUE + 18 CONTINUE + ELSE + MAXS=0 + DO 115 I=1,NK + DO 15 J=1,NCH + ISFT(J,I) = 0 + 15 CONTINUE +115 CONTINUE + ENDIF + DO 1 I=1,NK + DO 2 J=1,NCH + WINT(J,I) = 0.0 + DO 3 K=1,MS + BS(J,I,K)=0.0 + PS(J,I,K)=0.0 + 3 CONTINUE + 2 CONTINUE + 1 CONTINUE +*---- +* RECOVER FUEL BURNUPS +*---- + CALL LCMLEN(IPRES,'BURN-INST',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + CALL XABORT('@TINREF: INITIAL BURNUP REQUIRED') + ENDIF + CALL LCMGET(IPRES,'BURN-INST',WINT) +*---- +* RECOVER FUEL INDEX +*---- + CALL LCMLEN(IPRES,'FLMIX',ILONG,ITYP) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPRES,'FLMIX',INDEX) + ELSE + CALL XABORT('@TINREF: FLMIX ARE REQUIRED') + ENDIF + + IF(MAXS.GT.0) THEN + DO 16 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMGET(IPRES,'BSHIFT'//CS,BS(1,1,IS)) + CALL LCMGET(IPRES,'PSHIFT'//CS,PS(1,1,IS)) + 16 CONTINUE + ENDIF +*---- +* SET THE CHANNEL INDEX MAP +*---- + CALL LCMSIX(IPRES,' ',0) + CALL LCMGET(IPRES,'BMIX',MIX) + ICHMAP(:NX,:NY)=0 + ICH=0 + DO 26 IY=1,NY + DO 25 IX=1,NX + IEL=(IY-1)*NX+IX + DO 23 IZ=1,NZ + IF(MIX((IZ-1)*NX*NY+IEL).NE.0) GO TO 24 + 23 CONTINUE + GO TO 25 + 24 ICH=ICH+1 + ICHMAP(IX,IY)=ICH + 25 CONTINUE + 26 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@TINREF: INVALID NUMBER OF CHANNELS') +*---- +* SEARCH FOR THE CHANNEL NUMBER FROM ITS NAME +*---- + TEXT4 = NAMCHA(2:3) + IX = 0 + IY = 0 + DO 10 I=1,NX + WRITE(XNAM,'(A4)') IXN(I) + IF (XNAM.EQ.TEXT4) THEN + IX = I + GOTO 11 + ENDIF + 10 CONTINUE + WRITE(HSMG,'(26H@TINREF: NO CHANNEL NAMED ,A4,12H IN FUELMAP.)') + + NAMCHA + 11 TEXT4 = NAMCHA(1:1) + DO 20 I=1,NY + WRITE(YNAM,'(A4)') IYN(I) + IF (YNAM.EQ.TEXT4) THEN + IY = I + GOTO 21 + ENDIF + 20 CONTINUE + WRITE(HSMG,'(26H@TINREF: NO CHANNEL NAMED ,A4,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + + 21 ICH=ICHMAP(IX,IY) + IF(ICH.EQ.0) THEN + WRITE(6,'(13H @TINREF: IX=,I6,4H IY=,I6)') IX,IY + WRITE(HSMG,'(23H@TINREF: CHANNEL NAMED ,A4,13H HAS NO FUEL.)') + + NAMCHA + CALL XABORT(HSMG) + ENDIF + IF(NSS(ICH).NE.0) THEN + IF(ABS(NSS(ICH)).NE.ABS(NS)) THEN + WRITE(6,'(14H @TINREF: ICH=,I6,5H NSS=,I6,4H NS=,I6)') ICH, + + NSS(ICH),NS + CALL XABORT('@TINREF: WRONG REFUELING SCHEME') + ENDIF + NS = NSS(ICH) + ENDIF + IF( IPRT.GT.3 )THEN + WRITE(6,*) ' REFUELING CHANNEL ',NAMCHA,' IX IY ',IX,IY + WRITE(6,*) ' REFUELING CHANNEL ',ICH,' SCHEME ',NS + WRITE(6,*) ' INITIAL BURNUP ',(WINT(ICH,I),I=1,NK) + ENDIF + + NNS = ABS(NS) + CALL TINFL(NNS,NW,NW2,NK) + + II=0 + DO 30 K=1,NK + KK = K + IF (NS.LT.0) THEN + KK = NK - K + 1 + ENDIF + KA = NW(K) +*---- +* INSERTION OF A NEW BUNDLE OR REPOSITIONNING +*---- + IF (KA.EQ.0) THEN + II=II+1 + WORK(KK,1) = 0.0 + IWORK(KK,1)=0 + IF( KRF.EQ.1 )THEN + IWORK(KK,2)=INDEX(ICH,KK) + ELSE + IWORK(KK,2)=IND(II) + ENDIF + IF(MAXS.GT.0) THEN + DO 39 IS=1,MAXS + WORKS(KK,IS,1) = 0.0 + WORKS(KK,IS,2) = 0.0 + 39 CONTINUE + ENDIF + ELSE + IF (NS.LT.0) THEN + KA = NK - KA + 1 + ENDIF + WORK(KK,1) = WINT(ICH,KA) + WORK(KK,2) = POW(ICH,KA) + IWORK(KK,1)= ISFT(ICH,KA) + IWORK(KK,2)= INDEX(ICH,KA) + IF(MAXS.GT.0) THEN + DO 19 IS=1,MAXS + WORKS(KK,IS,1) = BS(ICH,KA,IS) + WORKS(KK,IS,2) = PS(ICH,KA,IS) + 19 CONTINUE + ENDIF + ENDIF + 30 CONTINUE + + DO 40 K=1,NK + WINT(ICH,K) = WORK(K,1) + POW(ICH,K) = WORK(K,2) + ISFT(ICH,K) = IWORK(K,1) + INDEX(ICH,K) = IWORK(K,2) + IF(MAXS.GT.0) THEN + DO 22 IS=1,MAXS + BS(ICH,K,IS)=WORKS(K,IS,1) + PS(ICH,K,IS)=WORKS(K,IS,2) + 22 CONTINUE + ENDIF + IF(WORK(K,1).NE.0.0) THEN + KS=ISFT(ICH,K)+1 + BS(ICH,K,KS)=WINT(ICH,K) + PS(ICH,K,KS)=WORK(K,2) + ISFT(ICH,K)=KS + ENDIF + 40 CONTINUE + + MAXS=0 + DO 112 I=1,NK + DO 12 J=1,NCH + MAXS=MAX(MAXS,ISFT(J,I)) + 12 CONTINUE + 112 CONTINUE +*---- +* CALL THE SUBROUTINE FOR A MICROSCOPIC REFUEL +*---- + IF(LMIC) THEN + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMIC2,'STATE-VECTOR',ISTATE) + NISO=ISTATE(2) + NDEP=ISTATE(12) + IF(NDEP.NE.NK*NCH) CALL XABORT('@TINREF: WRONG NUMBER OF ' + + //'DEPLETING MIXTURES IN THE LIBRARY.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMIC3,'STATE-VECTOR',ISTATE) + NISO2=ISTATE(2) + ALLOCATE(NWU(NK)) + DO I=1,NK + IF(NS.GT.0) THEN + NWU(I)=NW(I) + ELSE + NWU(I)=NW2(I) + ENDIF + ENDDO + ALLOCATE(NDENS(NISO),ISHF(NK)) + CALL TINMIC(IPMIC,IPMIC2,IPMIC3,NK,NCH,NWU,ICH,NISO,NISO2, + 1 IWORK,ISHF,NDENS) + CALL LCMPUT(IPMIC,'ISOTOPESDENS',NISO,2,NDENS) +*---- +* COMPUTE THE MACROSCOPIC X-SECTIONS +*---- + CALL LCMGET(IPMIC,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + NBISO=ISTATE(2) + NGRP=ISTATE(3) + ALLOCATE(MASK(MAXMIX),MASKL(NGRP)) + ALLOCATE(ISONA(3*NBISO),ISOMI(NBISO),DENIS(NBISO)) + CALL LCMGET(IPMIC,'ISOTOPESUSED',ISONA) + CALL LCMGET(IPMIC,'ISOTOPESMIX',ISOMI) + CALL LCMGET(IPMIC,'ISOTOPESDENS',DENIS) + MASK(:MAXMIX)=.FALSE. + MASKL(:NGRP)=.TRUE. + DO 13 I=1,NBISO + IBM=ISOMI(I) + MASK(IBM)=.TRUE. + 13 CONTINUE + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 +* COMPUTATION OF THE MACROSCOPIC XS + CALL LIBMIX(IPMIC,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS,MASK, + 1 MASKL,ITSTMP,TMPDAY) + DEALLOCATE(DENIS,ISOMI,ISONA,MASKL,MASK) + DEALLOCATE(NWU,NDENS,ISHF) + ENDIF + + IF( IPRT.GT.3 )THEN + WRITE(6,*) ' SHIFTING BURNUP ',(WINT(ICH,I),I=1,NK) + ENDIF + + CALL LCMSIX(IPRES,' ',0) + IF(IPRT.GT.3) WRITE(6,*) ' REFUELLING TYPE DIRECT OR HOMOGENOUS' + CALL LCMPUT(IPRES,'BURN-INST',NCH*NK,2,WINT(1,1)) + CALL LCMPUT(IPRES,'FLMIX',NCH*NK,1,INDEX(1,1)) + CALL LCMPUT(IPRES,'ISHIFT',NCH*NK,1,ISFT(1,1)) + + IF(MAXS.GT.0) THEN + DO 14 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMPUT(IPRES,'BSHIFT'//CS,NCH*NK,2,BS(1,1,IS)) + CALL LCMPUT(IPRES,'PSHIFT'//CS,NCH*NK,2,PS(1,1,IS)) + 14 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WORKS,WORK,ICHMAP,IWORK,INDEX,NW2,NW) + RETURN + END diff --git a/Donjon/src/TINREH.f b/Donjon/src/TINREH.f new file mode 100644 index 0000000..05990ff --- /dev/null +++ b/Donjon/src/TINREH.f @@ -0,0 +1,332 @@ +*DECK TINREH + SUBROUTINE TINREH(IPRES,IPMIC,IPMIC2,IPMIC3,NCH,NK,NH,NZ,NREG, + + NAMCHA,NS,MS,WINT,MIX,IHN,BS,PS,ISFT,POW,MAXS,NSS,IND, + + IPRT,KRF,LMIC) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Refuel a channel according to a refuelling mode in hexagonal +* geometry. +* +*Copyright: +* Copyright (C) 2015 Ecole Polytechnique de Montreal +* +*Author(s): +* E. Varin, M. Guyot and A. Hebert +* +*Parameters: input/output +* IPRES Adress of the map Linked_List or XSM file. +* IPMIC Adress of the L_LIBRARY in creation mode. +* IPMIC2 Adress of the fuel-map L_LIBRARY in read-only mode. +* IPMIC3 Adress of the L_LIBRARY in read-only mode, containing new +* fuel properties. +* NCH Number of channels +* NK Number of bundles per channel +* NH Number of hexagons in the plane +* NZ Number axial planes +* NREG Number of regions in fuel map geometry +* NAMCHA Name of the channel to refuel +* NS Number of bundles inserted +* MS Old maximum of shift + 1. +* MIX Fuel map bundle index +* IHN Name of the channel according to the hexagonal position +* POW Power distribution. +* INDEX Fuel type indice +* IND Fuel type indice in the channel to refuel +* MAXS Maximum number of power shift +* IPRT Flag for printing level +* KRF Type of refueling +* LMIC =.true. for a micro-refueling +* +*Parameters: +* WINT +* BS +* PS +* ISFT +* NSS +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPRES,IPMIC,IPMIC2,IPMIC3 + INTEGER NCH,NK,NH,NZ,NS,NREG,ILONG,ITYP,IH,IPRT,MS,IS,MAXS, + 1 KS,NSS(NCH),NNS + REAL WINT(NCH,NK),BS(NCH,NK,MS),PS(NCH,NK,MS),POW(NCH,NK) + INTEGER MIX(NREG),IHN(2,NH),ISFT(NCH,NK),IND(*) + LOGICAL LMIC + REAL TMPDAY(3) + CHARACTER NAMCHA*8 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40,IOUT=6) + INTEGER ISTATE(NSTATE),I,J + CHARACTER HNAM*8,CS*2,HSMG*131 + INTEGER, ALLOCATABLE, DIMENSION(:) :: NW,NW2,NWU,ISONA,ISOMI,ISHF, + + ICHMAP + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: INDEX,IWORK + REAL, ALLOCATABLE, DIMENSION(:) :: DENIS,NDENS + REAL, ALLOCATABLE, DIMENSION(:,:) :: WORK + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: WORKS + LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASK,MASKL +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(NW(NK),NW2(NK),INDEX(NCH,NK),IWORK(NK,2),ICHMAP(NH)) + ALLOCATE(WORK(NK,2),WORKS(NK,MS,2)) +*---- +* RECOVER SHIFT VECTOR +*---- + CALL LCMLEN(IPRES,'ISHIFT',ILS,ITYLCM) + IF(ILS.NE.0) THEN + CALL LCMGET(IPRES,'ISHIFT',ISFT(1,1)) + DO 18 I=1,NK + DO 17 J=1,NCH + MAXS=MAX(MAXS,ISFT(J,I)) + 17 CONTINUE + 18 CONTINUE + ELSE + MAXS=0 + DO 115 I=1,NK + DO 15 J=1,NCH + ISFT(J,I) = 0 + 15 CONTINUE +115 CONTINUE + ENDIF + DO 1 I=1,NK + DO 2 J=1,NCH + WINT(J,I) = 0.0 + DO 3 K=1,MS + BS(J,I,K)=0.0 + PS(J,I,K)=0.0 + 3 CONTINUE + 2 CONTINUE + 1 CONTINUE +*---- +* RECOVER FUEL BURNUPS +*---- + CALL LCMLEN(IPRES,'BURN-INST',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + CALL XABORT('@TINREH: INITIAL BURNUP REQUIRED') + ENDIF + CALL LCMGET(IPRES,'BURN-INST',WINT) +*---- +* RECOVER FUEL INDEX +*---- + CALL LCMLEN(IPRES,'FLMIX',ILONG,ITYP) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPRES,'FLMIX',INDEX) + ELSE + CALL XABORT('@TINREH: FLMIX ARE REQUIRED') + ENDIF + + IF(MAXS.GT.0) THEN + DO 16 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMGET(IPRES,'BSHIFT'//CS,BS(1,1,IS)) + CALL LCMGET(IPRES,'PSHIFT'//CS,PS(1,1,IS)) + 16 CONTINUE + ENDIF +*---- +* SET THE CHANNEL INDEX MAP +*---- + CALL LCMSIX(IPRES,' ',0) + CALL LCMGET(IPRES,'BMIX',MIX) + ICHMAP(:NH)=0 + ICH=0 + DO 25 IH=1,NH + DO 23 IZ=1,NZ + IF(MIX((IZ-1)*NH+IH).NE.0) GO TO 24 + 23 CONTINUE + GO TO 25 + 24 ICH=ICH+1 + ICHMAP(IH)=ICH + 25 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@TINREH: INVALID NUMBER OF CHANNELS') +*---- +* SEARCH FOR THE CHANNEL NUMBER FROM ITS NAME +*---- + IH = 0 + DO 10 I=1,NH + WRITE(HNAM,'(2A4)') IHN(1,I),IHN(2,I) + IF (HNAM.EQ.NAMCHA) THEN + IH = I + GOTO 21 + ENDIF + 10 CONTINUE + WRITE(HSMG,'(26H@TINREH: NO CHANNEL NAMED ,A8,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + + 21 ICH=ICHMAP(IH) + IF(ICH.EQ.0) THEN + WRITE(6,'(13H @TINREH: IH=,I6)') IH + WRITE(HSMG,'(23H@TINREH: CHANNEL NAMED ,A8,13H HAS NO FUEL.)') + + NAMCHA + CALL XABORT(HSMG) + ENDIF + IF(NSS(ICH).NE.0) THEN + IF(ABS(NSS(ICH)).NE.ABS(NS)) THEN + WRITE(6,'(14H @TINREH: ICH=,I6,5H NSS=,I6,4H NS=,I6)') ICH, + + NSS(ICH),NS + CALL XABORT('@TINREH: WRONG REFUELING SCHEME') + ENDIF + NS = NSS(ICH) + ENDIF + IF( IPRT.GT.3 )THEN + WRITE(6,*) ' REFUELING CHANNEL ',NAMCHA,' IH ',IH + WRITE(6,*) ' REFUELING CHANNEL ',ICH,' SCHEME ',NS + WRITE(6,*) ' INITIAL BURNUP ',(WINT(ICH,I),I=1,NK) + ENDIF + + NNS = ABS(NS) + CALL TINFL(NNS,NW,NW2,NK) + + II=0 + DO 30 K=1,NK + KK = K + IF (NS.LT.0) THEN + KK = NK - K + 1 + ENDIF + KA = NW(K) +*---- +* INSERTION OF A NEW BUNDLE OR REPOSITIONNING +*---- + IF (KA.EQ.0) THEN + II=II+1 + WORK(KK,1) = 0.0 + IWORK(KK,1)=0 + IF( KRF.EQ.1 )THEN + IWORK(KK,2)=INDEX(ICH,KK) + ELSE + IWORK(KK,2)=IND(II) + ENDIF + IF(MAXS.GT.0) THEN + DO 39 IS=1,MAXS + WORKS(KK,IS,1) = 0.0 + WORKS(KK,IS,2) = 0.0 + 39 CONTINUE + ENDIF + ELSE + IF (NS.LT.0) THEN + KA = NK - KA + 1 + ENDIF + WORK(KK,1) = WINT(ICH,KA) + WORK(KK,2) = POW(ICH,KA) + IWORK(KK,1)= ISFT(ICH,KA) + IWORK(KK,2)= INDEX(ICH,KA) + IF(MAXS.GT.0) THEN + DO 19 IS=1,MAXS + WORKS(KK,IS,1) = BS(ICH,KA,IS) + WORKS(KK,IS,2) = PS(ICH,KA,IS) + 19 CONTINUE + ENDIF + ENDIF + 30 CONTINUE + + DO 40 K=1,NK + WINT(ICH,K) = WORK(K,1) + POW(ICH,K) = WORK(K,2) + ISFT(ICH,K) = IWORK(K,1) + INDEX(ICH,K) = IWORK(K,2) + IF(MAXS.GT.0) THEN + DO 22 IS=1,MAXS + BS(ICH,K,IS)=WORKS(K,IS,1) + PS(ICH,K,IS)=WORKS(K,IS,2) + 22 CONTINUE + ENDIF + IF(WORK(K,1).NE.0.0) THEN + KS=ISFT(ICH,K)+1 + BS(ICH,K,KS)=WINT(ICH,K) + PS(ICH,K,KS)=WORK(K,2) + ISFT(ICH,K)=KS + ENDIF + 40 CONTINUE + + MAXS=0 + DO 112 I=1,NK + DO 12 J=1,NCH + MAXS=MAX(MAXS,ISFT(J,I)) + 12 CONTINUE + 112 CONTINUE +*---- +* CALL THE SUBROUTINE FOR A MICROSCOPIC REFUEL +*---- + IF(LMIC) THEN + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMIC2,'STATE-VECTOR',ISTATE) + NISO=ISTATE(2) + NDEP=ISTATE(12) + IF(NDEP.NE.NK*NCH) CALL XABORT('@TINREH: WRONG NUMBER OF ' + + //'DEPLETING MIXTURES IN THE LIBRARY.') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMIC3,'STATE-VECTOR',ISTATE) + NISO2=ISTATE(2) + ALLOCATE(NWU(NK)) + DO I=1,NK + IF(NS.GT.0) THEN + NWU(I)=NW(I) + ELSE + NWU(I)=NW2(I) + ENDIF + ENDDO + ALLOCATE(NDENS(NISO),ISHF(NK)) + CALL TINMIC(IPMIC,IPMIC2,IPMIC3,NK,NCH,NWU,ICH,NISO,NISO2, + 1 IWORK,ISHF,NDENS) + CALL LCMPUT(IPMIC,'ISOTOPESDENS',NISO,2,NDENS) +*---- +* COMPUTE THE MACROSCOPIC X-SECTIONS +*---- + CALL LCMGET(IPMIC,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + NBISO=ISTATE(2) + NGRP=ISTATE(3) + ALLOCATE(MASK(MAXMIX),MASKL(NGRP)) + ALLOCATE(ISONA(3*NBISO),ISOMI(NBISO),DENIS(NBISO)) + CALL LCMGET(IPMIC,'ISOTOPESUSED',ISONA) + CALL LCMGET(IPMIC,'ISOTOPESMIX',ISOMI) + CALL LCMGET(IPMIC,'ISOTOPESDENS',DENIS) + MASK(:MAXMIX)=.FALSE. + MASKL(:NGRP)=.TRUE. + DO 13 I=1,NBISO + IBM=ISOMI(I) + MASK(IBM)=.TRUE. + 13 CONTINUE + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 +* COMPUTATION OF THE MACROSCOPIC XS + CALL LIBMIX(IPMIC,MAXMIX,NGRP,NBISO,ISONA,ISOMI,DENIS,MASK, + 1 MASKL,ITSTMP,TMPDAY) + DEALLOCATE(DENIS,ISOMI,ISONA,MASKL,MASK) + DEALLOCATE(NWU,NDENS,ISHF) + ENDIF + + IF( IPRT.GT.3 )THEN + WRITE(6,*) ' SHIFTING BURNUP ',(WINT(ICH,I),I=1,NK) + ENDIF + + CALL LCMSIX(IPRES,' ',0) + IF(IPRT.GT.3) WRITE(6,*) ' REFUELLING TYPE DIRECT OR HOMOGENOUS' + CALL LCMPUT(IPRES,'BURN-INST',NCH*NK,2,WINT(1,1)) + CALL LCMPUT(IPRES,'FLMIX',NCH*NK,1,INDEX(1,1)) + CALL LCMPUT(IPRES,'ISHIFT',NCH*NK,1,ISFT(1,1)) + + IF(MAXS.GT.0) THEN + DO 14 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMPUT(IPRES,'BSHIFT'//CS,NCH*NK,2,BS(1,1,IS)) + CALL LCMPUT(IPRES,'PSHIFT'//CS,NCH*NK,2,PS(1,1,IS)) + 14 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WORKS,WORK,ICHMAP,IWORK,INDEX,NW2,NW) + RETURN + END diff --git a/Donjon/src/TINSHH.f b/Donjon/src/TINSHH.f new file mode 100644 index 0000000..9cfa8c5 --- /dev/null +++ b/Donjon/src/TINSHH.f @@ -0,0 +1,243 @@ +*DECK TINSHH + SUBROUTINE TINSHH(IPRES,NCH,NK,NH,NZ,NREG,MS,NAMCHA,NAMCH2, + + WINT,MIX,BS,PS,ISFT,IHN,IPRT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute new burnup values per channel after shuffling of two +* channels in hexagonal geometry. +* +*Copyright: +* Copyright (C) 2015 Ecole Polytechnique de Montreal +* +*Author(s): +* E. Varin, M. Guyot and A. Hebert +* +*Parameters: input/output +* IPRES ßAdress of the map Linked_List or XSM file. +* NAMCHA Name of the channel to refuel +* NAMCH2 Name of the channel to refuel +* NS Number of bundles inserted +* MIX Fuel map bundle index +* MS Maximum number of power shift +* +*Parameters: +* NCH +* NK +* NH +* NZ +* NREG +* WINT +* BS +* PS +* ISFT +* IHN +* IPRT +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPRES + INTEGER NCH,NK,NH,NZ,NREG,ILONG,ITYP,IPRT,ICH1,ICH2,ILS, + 1 ITYLCM,IS,MAXS,MS + REAL WINT(NCH,NK),BS(NCH,NK,MS),PS(NCH,NK,MS) + INTEGER MIX(NREG),IHN(2,NH),ISFT(NCH,NK) + CHARACTER NAMCHA*8,NAMCH2*8 +*---- +* LOCAL VARIABLES +*---- + INTEGER ICH,I,J,IZ,IH + CHARACTER HNAM*8,CS*2,HSMG*131 + INTEGER, ALLOCATABLE, DIMENSION(:) :: ICHMAP + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: INDEX + REAL, ALLOCATABLE, DIMENSION(:,:) :: POOL +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ICHMAP(NH),INDEX(NCH,NK),POOL(NCH,NK)) +*---- +* RECOVER INFORMATIONS FROM FUEL MAP OBJECT +*---- + DO 1 I=1,NK + DO 2 J=1,NCH + WINT(J,I) = 0.0 + ISFT(J,I) = 0 + POOL(J,I) = 0.0 + DO 3 IS=1,MS + BS(J,I,IS)=0.0 + PS(J,I,IS)=0.0 + 3 CONTINUE + 2 CONTINUE + 1 CONTINUE +*---- +* RECOVER FUEL BURNUPS +*---- + CALL LCMLEN(IPRES,'BURN-INST',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + CALL XABORT('@TINSHH: INITIAL BURNUP REQUIRED') + ENDIF + CALL LCMGET(IPRES,'BURN-INST',WINT(1,1)) +*---- +* RECOVER FUEL INDEX +*---- + CALL LCMLEN(IPRES,'FLMIX',ILONG,ITYP) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPRES,'FLMIX',INDEX) + ELSE + CALL XABORT('@TINSHH: FLMIX ARE REQUIRED') + ENDIF +*---- +* RECOVER SHIFT VECTOR +*---- + MAXS=0 + CALL LCMLEN(IPRES,'ISHIFT',ILS,ITYLCM) + IF(ILS.NE.0) THEN + CALL LCMGET(IPRES,'ISHIFT',ISFT(1,1)) + DO 16 I=1,NK + DO 15 J=1,NCH + MAXS=MAX(MAXS,ISFT(J,I)) + 15 CONTINUE + 16 CONTINUE + ELSE + MAXS=0 + ENDIF + + IF(MAXS.GT.0) THEN + DO 17 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMGET(IPRES,'BSHIFT'//CS,BS(1,1,IS)) + CALL LCMGET(IPRES,'PSHIFT'//CS,PS(1,1,IS)) + 17 CONTINUE + ENDIF +*---- +* SET THE CHANNEL INDEX MAP +*---- + CALL LCMSIX(IPRES,' ',0) + CALL LCMGET(IPRES,'BMIX',MIX) + ICHMAP(:NH)=0 + ICH=0 + DO 25 IH=1,NH + DO 23 IZ=1,NZ + IF(MIX((IZ-1)*NH+IH).NE.0) GO TO 24 + 23 CONTINUE + GO TO 25 + 24 ICH=ICH+1 + ICHMAP(IH)=ICH + 25 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@TINSHH: INVALID NUMBER OF CHANNELS') +*---- +* SEARCH FOR CHANNEL NUMBER TO MOVE +*---- + IH = 0 + DO 10 I=1,NH + WRITE(HNAM,'(2A4)') IHN(1,I),IHN(2,I) + IF (HNAM.EQ.NAMCHA) THEN + IH = I + GOTO 21 + ENDIF + 10 CONTINUE + WRITE(HSMG,'(26H@TINREH: NO CHANNEL NAMED ,A8,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + + 21 ICH1 = ICHMAP(IH) + IF(ICH1.EQ.0) THEN + WRITE(6,'(13H @TINSHH: IH=,I6)') IH + WRITE(HSMG,'(23H@TINSHH: CHANNEL NAMED ,A4,13H HAS NO FUEL.)') + + NAMCHA + CALL XABORT(HSMG) + ENDIF + IF(IPRT.GT.3) THEN + WRITE(6,*) + WRITE(6,*) ' SHUFFLING CHANNEL ',NAMCHA,ICH1 + WRITE(6,*) ' BEFORE ',NAMCHA,(WINT(ICH1,I),I=1,NK) + ENDIF +*---- +* SEARCH FOR CHANNEL NUMBER WHERE TO MOVE +*---- + IF(NAMCH2.NE.'POOL') THEN + IH = 0 + DO 40 I=1,NH + WRITE(HNAM,'(2A4)') IHN(1,I),IHN(2,I) + IF (HNAM.EQ.NAMCH2) THEN + IH = I + GOTO 41 + ENDIF + 40 CONTINUE + WRITE(HSMG,'(26H@TINREH: NO CHANNEL NAMED ,A8,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + + 41 ICH2 = ICHMAP(IH) + IF(ICH2.EQ.0) CALL XABORT('@TINSHH: WRONG CHANNEL NAME') + IF(IPRT.GT.3) THEN + WRITE(6,*) + WRITE(6,*) ' SHUFFLING CHANNEL ',NAMCH2,ICH2 + WRITE(6,*) ' BEFORE ',NAMCH2,(WINT(ICH2,I),I=1,NK) + ENDIF +*---- +* SHUFFLING +*---- + DO 50 I=1,NK + IF(WINT(ICH2,I).NE.0.0) THEN + WRITE(6,*) ' BURNUP ',WINT(ICH2,I) + CALL XABORT('@TINSHH: WRONG POSITION TO SHUFFLE, ' + + //'CHANNEL NOT EMPTY') + ENDIF + WINT(ICH2,I) = WINT(ICH1,I) + WINT(ICH1,I) = 0.0 + ISFT(ICH2,I) = ISFT(ICH1,I) + ISFT(ICH1,I) = 0 + INDEX(ICH2,I) = INDEX(ICH1,I) + IF(MAXS.GT.0) THEN + DO 56 IS=1,MAXS + BS(ICH2,I,IS) = BS(ICH1,I,IS) + PS(ICH2,I,IS) = PS(ICH1,I,IS) + BS(ICH1,I,IS) = 0.0 + PS(ICH1,I,IS) = 0.0 + 56 CONTINUE + ENDIF + 50 CONTINUE + IF(IPRT.GT.3) THEN + WRITE(6,*) + WRITE(6,*) ' AFTER ',NAMCH2,(WINT(ICH2,I),I=1,NK) + ENDIF + ELSE + WRITE(6,*) ' CHANNEL TO POOL ' +*---- +* RECOVER DISCHARGED FUEL BURNUPS +*---- + CALL LCMLEN(IPRES,'BURN-POOL',ILONG,ITYP) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPRES,'BURN-POOL',POOL(1,1)) + ENDIF + DO 51 I=1,NK + POOL(ICH1,I) = WINT(ICH1,I) + WINT(ICH1,I) = 0.0 + 51 CONTINUE + CALL LCMPUT(IPRES,'BURN-POOL',NCH*NK,2,POOL(1,1)) + ENDIF + IF(IPRT.GT.3) + + WRITE(6,*) ' AFTER ',NAMCHA,(WINT(ICH1,I),I=1,NK) + CALL LCMSIX(IPRES,' ',0) + CALL LCMPUT(IPRES,'BURN-INST',NCH*NK,2,WINT(1,1)) + CALL LCMPUT(IPRES,'FLMIX',NCH*NK,1,INDEX(1,1)) + CALL LCMPUT(IPRES,'ISHIFT',NCH*NK,1,ISFT(1,1)) + IF(MAXS.GT.0) THEN + DO 53 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMPUT(IPRES,'BSHIFT'//CS,NCH*NK,2,BS(1,1,IS)) + CALL LCMPUT(IPRES,'PSHIFT'//CS,NCH*NK,2,PS(1,1,IS)) + 53 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(POOL,INDEX,ICHMAP) + RETURN + END diff --git a/Donjon/src/TINSHU.f b/Donjon/src/TINSHU.f new file mode 100644 index 0000000..9c31b9b --- /dev/null +++ b/Donjon/src/TINSHU.f @@ -0,0 +1,274 @@ +*DECK TINSHU + SUBROUTINE TINSHU(IPRES,NCH,NK,NX,NY,NZ,NREG,MS,NAMCHA,NAMCH2, + + WINT,MIX,BS,PS,ISFT,IXN,IYN,IPRT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute new burnup values per channel after shuffling of two +* channels +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal +* +*Author(s): +* E. Varin, M. Guyot +* +*Parameters: input/output +* IPRES Adress of the map Linked_List or XSM file. +* NAMCHA Name of the channel to refuel +* NAMCH2 Name of the channel to refuel +* NS Number of bundles inserted +* MIX Fuel map bundle index +* MS Maximum number of power shift +* +*Parameters: +* NCH +* NK +* NX +* NY +* NZ +* NREG +* WINT +* BS +* PS +* ISFT +* IXN +* IYN +* IPRT +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPRES + INTEGER NCH,NK,NX,NY,NZ,NREG,ILONG,ITYP,IX,IY,IPRT, + 1 ICH1,ICH2,ILS,ITYLCM,IS,MAXS,MS + REAL WINT(NCH,NK),BS(NCH,NK,MS),PS(NCH,NK,MS) + CHARACTER XNAM*4,YNAM*4,NAMCHA*4,NAMCH2*4,TEXT4*4,CS*2 + INTEGER MIX(NREG),IXN(NX),IYN(NY),ISFT(NCH,NK) +*---- +* LOCAL VARIABLES +*---- + INTEGER ICH,IEL,I,J,IZ + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ICHMAP + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: INDEX + REAL, ALLOCATABLE, DIMENSION(:,:) :: POOL + CHARACTER HSMG*131 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ICHMAP(NX,NY),INDEX(NCH,NK),POOL(NCH,NK)) +*---- +* RECOVER INFORMATIONS FROM FUEL MAP OBJECT +*---- + DO 1 I=1,NK + DO 2 J=1,NCH + WINT(J,I) = 0.0 + ISFT(J,I) = 0 + POOL(J,I) = 0.0 + DO 3 IS=1,MS + BS(J,I,IS)=0.0 + PS(J,I,IS)=0.0 + 3 CONTINUE + 2 CONTINUE + 1 CONTINUE +*---- +* RECOVER FUEL BURNUPS +*---- + CALL LCMLEN(IPRES,'BURN-INST',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + CALL XABORT('@TINSHU: INITIAL BURNUP REQUIRED') + ENDIF + CALL LCMGET(IPRES,'BURN-INST',WINT(1,1)) +*---- +* RECOVER FUEL INDEX +*---- + CALL LCMLEN(IPRES,'FLMIX',ILONG,ITYP) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPRES,'FLMIX',INDEX) + ELSE + CALL XABORT('@TINSHU: FLMIX ARE REQUIRED') + ENDIF +*---- +* RECOVER SHIFT VECTOR +*---- + MAXS=0 + CALL LCMLEN(IPRES,'ISHIFT',ILS,ITYLCM) + IF(ILS.NE.0) THEN + CALL LCMGET(IPRES,'ISHIFT',ISFT(1,1)) + DO 16 I=1,NK + DO 15 J=1,NCH + MAXS=MAX(MAXS,ISFT(J,I)) + 15 CONTINUE + 16 CONTINUE + ELSE + MAXS=0 + ENDIF + + IF(MAXS.GT.0) THEN + DO 17 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMGET(IPRES,'BSHIFT'//CS,BS(1,1,IS)) + CALL LCMGET(IPRES,'PSHIFT'//CS,PS(1,1,IS)) + 17 CONTINUE + ENDIF +*---- +* SET THE CHANNEL INDEX MAP +*---- + CALL LCMSIX(IPRES,' ',0) + CALL LCMGET(IPRES,'BMIX',MIX) + ICHMAP(:NX,:NY)=0 + ICH=0 + DO 26 IY=1,NY + DO 25 IX=1,NX + IEL=(IY-1)*NX+IX + DO 23 IZ=1,NZ + IF(MIX((IZ-1)*NX*NY+IEL).NE.0) GO TO 24 + 23 CONTINUE + GO TO 25 + 24 ICH=ICH+1 + ICHMAP(IX,IY)=ICH + 25 CONTINUE + 26 CONTINUE + IF(ICH.NE.NCH) CALL XABORT('@TINSHU: INVALID NUMBER OF CHANNELS') +*---- +* SEARCH FOR CHANNEL NUMBER TO MOVE +*---- + TEXT4 = NAMCHA(2:3) + IX = 0 + IY = 0 + DO 10 I=1,NX + WRITE(XNAM,'(A4)') IXN(I) + IF (XNAM.EQ.TEXT4) THEN + IX = I + GOTO 11 + ENDIF + 10 CONTINUE + WRITE(HSMG,'(26H@TINSHU: NO CHANNEL NAMED ,A4,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + 11 TEXT4 = NAMCHA(1:1) + DO 20 I=1,NY + WRITE(YNAM,'(A4)') IYN(I) + IF (YNAM.EQ.TEXT4) THEN + IY = I + GOTO 21 + ENDIF + 20 CONTINUE + WRITE(HSMG,'(26H@TINSHU: NO CHANNEL NAMED ,A4,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + + 21 ICH1 = ICHMAP(IX,IY) + IF(ICH1.EQ.0) THEN + WRITE(6,'(13H @TINSHU: IX=,I6,4H IY=,I6)') IX,IY + WRITE(HSMG,'(23H@TINREF: CHANNEL NAMED ,A4,13H HAS NO FUEL.)') + + NAMCHA + CALL XABORT(HSMG) + ENDIF + IF(IPRT.GT.3) THEN + WRITE(6,*) + WRITE(6,*) ' SHUFFLING CHANNEL ',NAMCHA,ICH1 + WRITE(6,*) ' BEFORE ',NAMCHA,(WINT(ICH1,I),I=1,NK) + ENDIF +*---- +* SEARCH FOR CHANNEL NUMBER WHERE TO MOVE +*---- + IF(NAMCH2.NE.'POOL') THEN + TEXT4 = NAMCH2(2:3) + IX = 1 + IY = 1 + DO 30 I=1,NX + WRITE(XNAM,'(A4)') IXN(I) + IF (XNAM.EQ.TEXT4) THEN + IX = I + GOTO 31 + ENDIF + 30 CONTINUE + WRITE(HSMG,'(26H@TINSHU: NO CHANNEL NAMED ,A4,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + 31 TEXT4 = NAMCH2(1:1) + DO 40 I=1,NY + WRITE(YNAM,'(A4)') IYN(I) + IF (YNAM.EQ.TEXT4) THEN + IY = I + GOTO 41 + ENDIF + 40 CONTINUE + WRITE(HSMG,'(26H@TINSHU: NO CHANNEL NAMED ,A4,12H IN FUELMAP.)') + + NAMCHA + CALL XABORT(HSMG) + + 41 ICH2 = ICHMAP(IX,IY) + IF(ICH2.EQ.0) CALL XABORT('@TINSHU: WRONG CHANNEL NAME') + IF(IPRT.GT.3) THEN + WRITE(6,*) + WRITE(6,*) ' SHUFFLING CHANNEL ',NAMCH2,ICH2 + WRITE(6,*) ' BEFORE ',NAMCH2,(WINT(ICH2,I),I=1,NK) + ENDIF +*---- +* SHUFFLING +*---- + DO 50 I=1,NK + IF(WINT(ICH2,I).NE.0.0) THEN + WRITE(6,*) ' BURNUP ',WINT(ICH2,I) + CALL XABORT('@TINSHU: WRONG POSITION TO SHUFFLE, ' + + //'CHANNEL NOT EMPTY') + ENDIF + WINT(ICH2,I) = WINT(ICH1,I) + WINT(ICH1,I) = 0.0 + ISFT(ICH2,I) = ISFT(ICH1,I) + ISFT(ICH1,I) = 0 + INDEX(ICH2,I) = INDEX(ICH1,I) + IF(MAXS.GT.0) THEN + DO 56 IS=1,MAXS + BS(ICH2,I,IS) = BS(ICH1,I,IS) + PS(ICH2,I,IS) = PS(ICH1,I,IS) + BS(ICH1,I,IS) = 0.0 + PS(ICH1,I,IS) = 0.0 + 56 CONTINUE + ENDIF + 50 CONTINUE + IF(IPRT.GT.3) THEN + WRITE(6,*) + WRITE(6,*) ' AFTER ',NAMCH2,(WINT(ICH2,I),I=1,NK) + ENDIF + ELSE + WRITE(6,*) ' CHANNEL TO POOL ' +*---- +* RECOVER DISCHARGED FUEL BURNUPS +*---- + CALL LCMLEN(IPRES,'BURN-POOL',ILONG,ITYP) + IF(ILONG.NE.0) THEN + CALL LCMGET(IPRES,'BURN-POOL',POOL(1,1)) + ENDIF + DO 51 I=1,NK + POOL(ICH1,I) = WINT(ICH1,I) + WINT(ICH1,I) = 0.0 + 51 CONTINUE + CALL LCMPUT(IPRES,'BURN-POOL',NCH*NK,2,POOL(1,1)) + ENDIF + IF(IPRT.GT.3) + + WRITE(6,*) ' AFTER ',NAMCHA,(WINT(ICH1,I),I=1,NK) + CALL LCMSIX(IPRES,' ',0) + CALL LCMPUT(IPRES,'BURN-INST',NCH*NK,2,WINT(1,1)) + CALL LCMPUT(IPRES,'FLMIX',NCH*NK,1,INDEX(1,1)) + CALL LCMPUT(IPRES,'ISHIFT',NCH*NK,1,ISFT(1,1)) + IF(MAXS.GT.0) THEN + DO 53 IS=1,MAXS + WRITE (CS,'(I2)') IS + CALL LCMPUT(IPRES,'BSHIFT'//CS,NCH*NK,2,BS(1,1,IS)) + CALL LCMPUT(IPRES,'PSHIFT'//CS,NCH*NK,2,PS(1,1,IS)) + 53 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(POOL,INDEX,ICHMAP) + RETURN + END diff --git a/Donjon/src/TINST.f b/Donjon/src/TINST.f new file mode 100644 index 0000000..7ee314c --- /dev/null +++ b/Donjon/src/TINST.f @@ -0,0 +1,454 @@ +*DECK TINST + SUBROUTINE TINST(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Perform computations according to the time-linear model. +* +*Copyright: +* Copyright (C) 2009 Ecole Polytechnique de Montreal +* +*Author(s): +* B. Toueg, M. Guyot +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The TINST: module specification is: +* Option 1 +* FMAP := TINST: FMAP [ POWER ] :: (desctinst) ; +* Option 2 +* MICLIB3 FMAP := TINST: FMAP MICLIB2 MICLIB :: (desctinst) ; +* where +* FMAP : name of a \emph{fmap} object, that will be updated by the TINST: +* module. The FMAP object must contain the instantaneous burnups for each +* fuel bundle and the weight of each fuel mixture. +* POWER : name of a \emph{power} object containing the channel and bundle +* powers, previously computed by the FLPOW: module. The channel and bundle +* powers are used by the TINST: module to compute the new burn-up of each +* bundle. If bundle-powers are previously specified with the module RESINI:, +* you can refuel your core without a POWER object. +* MICLIB3 : name of a \emph{library} object, that will be created by the +* TINST: module. This \emph{MICROLIB} contains the fuel properties after +* refueling when keyword MICRO is used in (desctinst). +* +* MICLIB2 : name of a \emph{library} object, that will be read by the TINST: +* module. This must be a fuel-map LIBRARY created either created by the +* NCR: or the EVO: module. +* MICLIB : name of a \emph{library} object, that will be read by the TINST: +* module. This \emph{MICROLIB} contains the new fuel properties, that +* should be used for the refueling. +* (desctinst) : structure describing the input data to the TINST: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER TEXT*12,HSIGN*12,NAMCHA*8,NAMCHA2*8,TEXT12*12 + INTEGER IMPX,MSHT,NB,NCH,IMOD,NCOMB,NF,NX,NY,NZ,MAXS,ITYP, + + NREG,KREF,I,ISTATE(NSTATE),LENGT,NS,NSS,NITMA + DOUBLE PRECISION DFLOT + LOGICAL LNOTHING,LMIC + REAL TIME,BURNSTEP,FLOT + TYPE(C_PTR) IPMAP,IPPOW,IPMIC,IPMIC2,IPMIC3,JPMAP,KPMAP,LPMAP, + + MPMAP +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDX,NSSV,IXN,IYN,MIX,IVS + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IHN + REAL, ALLOCATABLE, DIMENSION(:) :: BUNDPOW,WINT,BS,PS,POW,RFCHAN, + + BURNINST +*---- +* PARAMETER VALIDATION +*---- + IF((NENTRY.LT.1).AND.(NENTRY.GT.5)) CALL XABORT('@TINST: WRONG ' + + //'NUMBER OF PARAMETERS') + IPMAP=C_NULL_PTR + IPPOW=C_NULL_PTR + IPMIC=C_NULL_PTR + IPMIC2=C_NULL_PTR + IPMIC3=C_NULL_PTR + IF(JENTRY(1).EQ.0) THEN + IPMIC=KENTRY(1) + I=2 + TEXT12=HENTRY(1) + IF(IENTRY(1).GT.2) CALL XABORT('@TINST: LCM OR XSM OBJECT TYPE' + + //' FOR ENTRY='//TEXT12//'.') + ELSE + I=1 + ENDIF + DO IEN=I,NENTRY + TEXT12=HENTRY(IEN) + IF(IENTRY(IEN).GT.2) CALL XABORT('@TINST: LCM OR XSM OBJECT TY' + + //'PE FOR ENTRY='//TEXT12//'.') + CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_MAP') THEN + IPMAP=KENTRY(IEN) + IF(JENTRY(IEN).NE.1) CALL XABORT('@TINST: MODIFICATION MODE ' + + //'FOR L_MAP EXPECTED') + ELSEIF(HSIGN.EQ.'L_POWER') THEN + IPPOW=KENTRY(IEN) + IF(JENTRY(IEN).NE.2) CALL XABORT('@TINST: READ-ONLY MODE ' + + //'FOR L_POWER EXPECTED') + ELSEIF(HSIGN.EQ.'L_LIBRARY') THEN + IF(.NOT.C_ASSOCIATED(IPMIC2)) THEN + IPMIC2=KENTRY(IEN) + CALL LCMEQU(IPMIC2,IPMIC) + IF(JENTRY(IEN).NE.2) CALL XABORT('@TINST: READ-ONLY MODE' + + //' FOR SECOND L_LIBRARY EXPECTED') + ELSE + IPMIC3=KENTRY(IEN) + IF(JENTRY(IEN).NE.2) CALL XABORT('@TINST: READ-ONLY MODE ' + + //'FOR THIRD L_LIBRARY EXPECTED') + ENDIF + ENDIF + ENDDO +*---- +* RECOVER INFORMATION +*---- + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + NB=ISTATE(1) + NCH=ISTATE(2) + NCOMB=ISTATE(3) + IMOD=ISTATE(5) + MAXS=ISTATE(6) + MSHT=MAXS+1 + NF=ISTATE(7) + NPARM=ISTATE(8) + IF(NF.EQ.0) CALL XABORT('@TINST: NO FUEL IN MAP OBJECT.') +*---- +* ONLY TIME INSTANTANEOUS CALCULATIONS IN TINST: +*---- + IF(IMOD.NE.2) + + CALL XABORT('@TINST: INST-BURN OPTION ' + + //'SHOULD BE USED IN RESINI.') + JPMAP=LCMGID(IPMAP,'GEOMAP') + ISTATE(:NSTATE)=0 + CALL LCMGET(JPMAP,'STATE-VECTOR',ISTATE) + IGEO=ISTATE(1) + NX=ISTATE(3) + NY=ISTATE(4) + NZ=ISTATE(5) + NREG = ISTATE(6) +* CHECK EXISTING DATA + IF(.NOT.C_ASSOCIATED(IPPOW)) THEN + CALL LCMLEN(IPMAP,'BUND-PW',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@TINST: MISSING BUND-PW DATA IN ' + + //'L_MAP OBJECT.') + ELSE + CALL LCMLEN(IPPOW,'POWER-CHAN',LENGT,ITYP) + IF(LENGT.EQ.0)CALL XABORT('@TINST: MISSING POWER-CHAN DATA I' + + //'N L_POWER OBJECT.') + ENDIF +*---- +* READ INPUT DATA +*---- + IMPX=0 + LNOTHING=.TRUE. + LMIC=.FALSE. + TTIME=0.0 + ALLOCATE(RFCHAN(NCH)) + RFCHAN(:NCH)=0.0 + 2 TIME=0.0 + BURNSTEP=0.0 +* READ KEYWORD + 1 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TINST: CHARACTER DATA EXPECTED(1).') + IF(TEXT.EQ.'EDIT')THEN +* PRINTING INDEX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@TINST: INTEGER DATA EXPECTED.') + IMPX=MAX(0,NITMA) + GOTO 1 + ELSEIF(TEXT.EQ.'TIME')THEN +* TIME VALUE + IF(TIME.NE.0.0)CALL XABORT('@TINST: TIME ALREADY SPECIFIED(1).') + IF(BURNSTEP.NE.0.0)CALL XABORT('@TINST: BURNSTEP ALREADY // + + //SPECIFIED(1).') + CALL REDGET(ITYP,NITMA,TIME,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@TINST: REAL DATA EXPECTED(1).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@TINST: CHARACTER DATA EXPECTED(2).') + IF(TIME.LT.0.)CALL XABORT('@TINST: EXPECTING REAL > 0 (1).') + IF(TEXT.EQ.'DAY')THEN + TIME=TIME + ELSEIF(TEXT.EQ.'HOUR')THEN + TIME=TIME/24. + ELSEIF(TEXT.EQ.'MINUTE')THEN + TIME=TIME/(24.*60.) + ELSEIF(TEXT.EQ.'SECOND')THEN + TIME=TIME/(24.*60.*60.) + ELSE + CALL XABORT('@TINST: EXPECTING DAY|HOUR|MINUTE|SECOND.') + ENDIF + LNOTHING=.FALSE. + GOTO 10 + ELSEIF(TEXT.EQ.'BURN-STEP')THEN +* BURN-STEP + IF(TIME.NE.0.)CALL XABORT('@TINST: TIME ALREADY SPECIFIED(2).') + IF(BURNSTEP.NE.0.)CALL XABORT('@TINST: BURNSTEP ALREADY ' + + //'SPECIFIED(2).') + CALL REDGET(ITYP,NITMA,BURNSTEP,TEXT,DFLOT) + IF(ITYP.NE.2)CALL XABORT('@TINST: REAL DATA EXPECTED(2).') + IF(BURNSTEP.LE.0.)CALL XABORT('@TINST: EXPECTING REAL > 0 (2).') + LNOTHING=.FALSE. + GOTO 10 + ELSEIF(TEXT.EQ.'REFUEL')THEN +* REFUEL + KREF=1 + LNOTHING=.FALSE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(3).') + IF(TEXT.EQ.'MICRO') THEN + LMIC=.TRUE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(4).') + ENDIF + IF(TEXT.EQ.'CHAN') THEN + CALL REDGET(ITYP,NITMA,FLOT,NAMCHA,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(5).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) + + CALL XABORT('@TINST: INTEGER DATA EXPECTED(2).') + NS = NITMA + CALL TINCHA(IPMAP,NCH,IMPX,NAMCHA,TTIME,RFCHAN) + ELSE + CALL XABORT('@TINST: INVALID KEYWORD '//TEXT) + ENDIF + GOTO 20 + ELSEIF(TEXT.EQ.'NEWFUEL')THEN +* NEWFUEL + KREF=2 + LNOTHING=.FALSE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(4).') + IF(TEXT.EQ.'CHAN') THEN + CALL REDGET(ITYP,NITMA,FLOT,NAMCHA,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(5).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) + + CALL XABORT('@TINST: INTEGER DATA EXPECTED(3).') + NS = NITMA + NSS=ABS(NS) + ALLOCATE(IDX(NSS)) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(6).') + IF(TEXT.EQ.'SOME')THEN + DO 11 I=1,NSS + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) + + CALL XABORT('@TINST: INTEGER DATA EXPECTED(4).') + IF (NITMA.GT.NF) + + CALL XABORT('@TINST: WRONG NUMBER OF FUEL TYPE. ') + IDX(I) = NITMA + 11 CONTINUE + ELSEIF(TEXT.EQ.'ALL')THEN + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1) + + CALL XABORT('@TINST: INTEGER DATA EXPECTED(5).') + IF (NITMA.GT.NF) + + CALL XABORT('@TINST: WRONG NUMBER OF FUEL TYPE. ') + DO 12 I=1,NSS + IDX(I) = NITMA + 12 CONTINUE + ELSE + CALL XABORT('@TINST: INVALID KEYWORD '//TEXT) + ENDIF + ELSE + CALL XABORT('@TINST: INVALID KEYWORD '//TEXT) + ENDIF + GOTO 20 +* SHUFFL + ELSEIF (TEXT.EQ.'SHUFF') THEN + KREF = 3 + LNOTHING=.FALSE. + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(7).') + IF(TEXT.EQ.'CHAN') THEN + CALL REDGET(ITYP,NITMA,FLOT,NAMCHA,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(8).') + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(8).') + IF(TEXT.EQ.'TO') THEN + CALL REDGET(ITYP,NITMA,FLOT,NAMCHA2,DFLOT) + IF(ITYP.NE.3) + + CALL XABORT('@TINST: CHARACTER DATA EXPECTED(9).') + IF(IMPX.GT.2) + + WRITE(6,*) 'TINST : ACTION ',NAMCHA,' TO ',NAMCHA2 + ELSE + CALL XABORT('@TINST: INVALID KEYWORD '//TEXT) + ENDIF + ELSE + CALL XABORT('@TINST: INVALID KEYWORD '//TEXT) + ENDIF + GOTO 20 + ELSEIF(TEXT.EQ.'PICK') THEN +* RECOVER THE BURNUP AND SAVE IT IN A CLE-2000 VARIABLE + IF(IMPX.GT.2) WRITE(IOUT,40) BURNAVG + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.-2) CALL XABORT('TINST: OUTPUT REAL EXPECTED.') + ITYP=2 + CALL REDPUT(ITYP,NITMA,BURNAVG,TEXT,DFLOT) + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF((ITYP.NE.3).OR.(TEXT.NE.';')) THEN + CALL XABORT('TINST: ; CHARACTER EXPECTED.') + ENDIF + GOTO 30 + ELSEIF(TEXT.EQ.';')THEN + GOTO 30 + ELSE +* KEYWORD DOES NOT MATCH + CALL XABORT('@TINST: WRONG KEYWORD: '//TEXT//'.') + ENDIF +*---- +* PERFORM CALCULATION +*---- + 10 ALLOCATE(BUNDPOW(NCH*NB)) + IF(.NOT.C_ASSOCIATED(IPPOW)) THEN + CALL LCMGET(IPMAP,'BUND-PW',BUNDPOW) + ELSE + CALL LCMGET(IPPOW,'POWER-BUND',BUNDPOW) + ENDIF + IF(LMIC) CALL XABORT('@TINST: NO MICRO-DEPLETION ') + TTIME = TTIME + TIME + ALLOCATE(BURNINST(NCH*NB)) + CALL TINSTB(IPMAP,TIME,BURNSTEP,NCH,NB,NF,BUNDPOW,BURNAVG, + 1 BURNINST,IMPX) +*---- +* SAVE LOCAL PARAMETERS FOR HISTORICAL FOLLOW-UP +*---- + CALL LCMLEN(IPMAP,'_TINST',ILONG,ITYLCM) + IF(IMPX.GT.0) WRITE(6,50) ILONG+1,BURNAVG + JPMAP=LCMLID(IPMAP,'_TINST',ILONG+1) + KPMAP=LCMDIL(JPMAP,ILONG+1) + CALL LCMPUT(KPMAP,'TIME',1,2,TTIME) + CALL LCMPUT(KPMAP,'BURNAVG',1,2,BURNAVG) + CALL LCMPUT(KPMAP,'BURN-INST',NCH*NB,2,BURNINST) + CALL LCMPUT(KPMAP,'POWER-BUND',NCH*NB,2,BUNDPOW) + IF(NPARM.GT.0) THEN + LPMAP=LCMGID(IPMAP,'PARAM') + MPMAP=LCMLID(KPMAP,'PARAM',NPARM) + CALL LCMEQU(LPMAP,MPMAP) + ISTATE(19)=1 + CALL LCMPTC(IPMAP,'CYCLE-NAMES',12,'_TINST') + ENDIF + DEALLOCATE(BURNINST,BUNDPOW) + GOTO 1 +* + 20 CALL LCMSIX(IPMAP,' ',0) + ALLOCATE(NSSV(NCH)) + CALL LCMLEN(IPMAP,'REF-SCHEME',ILONG,ITYP) + IF(ILONG.EQ.0) THEN + DO 25 I=1,NCH + NSSV(I) = 0 + 25 CONTINUE + ELSEIF(ILONG.NE.NCH) THEN + CALL XABORT('@TINST: REF-SCHEME HAS NOT THE CORRECT LENGHT') + ELSE + CALL LCMGET(IPMAP,'REF-SCHEME',NSSV) + ENDIF + CALL LCMSIX(IPMAP,' ',0) + IF(IGEO.EQ.7) THEN +* Cartesian geometry. + ALLOCATE(IXN(NX),IYN(NY)) + CALL LCMGET(IPMAP,'XNAME',IXN) + CALL LCMGET(IPMAP,'YNAME',IYN) + ALLOCATE(WINT(NCH*NB),MIX(NREG),BS(NCH*NB*MSHT),PS(NCH*NB*MSHT), + 1 IVS(NCH*NB*MSHT)) + IF(KREF.EQ.1.OR.KREF.EQ.2) THEN + IF(KREF.EQ.1) ALLOCATE(IDX(ABS(NS))) + ALLOCATE(POW(NCH*NB)) + IF(.NOT.C_ASSOCIATED(IPPOW)) THEN + CALL LCMGET(IPMAP,'BUND-PW',POW) + ELSE + CALL LCMGET(IPPOW,'POWER-BUND',POW) + ENDIF + CALL TINREF(IPMAP,IPMIC,IPMIC2,IPMIC3,NCH,NB,NX,NY,NZ,NREG, + + NAMCHA,NS,MSHT,WINT,MIX,IXN,IYN,BS,PS,IVS,POW, + + MAXS,NSSV,IDX,IMPX,KREF,LMIC) + DEALLOCATE(POW,IDX) + ELSE + CALL TINSHU(IPMAP,NCH,NB,NX,NY,NZ,NREG,MSHT,NAMCHA,NAMCHA2, + + WINT,MIX,BS,PS,IVS,IXN,IYN,IMPX) + ENDIF + DEALLOCATE(IXN,IYN) + ELSE IF(IGEO.EQ.9) THEN +* Hexagonal geometry. + ALLOCATE(IHN(2,NX)) + CALL LCMGET(IPMAP,'HNAME',IHN) + ALLOCATE(WINT(NCH*NB),MIX(NREG),BS(NCH*NB*MSHT),PS(NCH*NB*MSHT), + 1 IVS(NCH*NB*MSHT)) + IF(KREF.EQ.1.OR.KREF.EQ.2) THEN + IF(KREF.EQ.1) ALLOCATE(IDX(ABS(NS))) + ALLOCATE(POW(NCH*NB)) + IF(.NOT.C_ASSOCIATED(IPPOW)) THEN + CALL LCMGET(IPMAP,'BUND-PW',POW) + ELSE + CALL LCMGET(IPPOW,'POWER-BUND',POW) + ENDIF + CALL TINREH(IPMAP,IPMIC,IPMIC2,IPMIC3,NCH,NB,NX,NZ,NREG, + + NAMCHA,NS,MSHT,WINT,MIX,IHN,BS,PS,IVS,POW,MAXS, + + NSSV,IDX,IMPX,KREF,LMIC) + DEALLOCATE(POW,IDX) + ELSE + CALL TINSHH(IPMAP,NCH,NB,NX,NZ,NREG,MSHT,NAMCHA,NAMCHA2, + + WINT,MIX,BS,PS,IVS,IHN,IMPX) + ENDIF + DEALLOCATE(IHN) + ELSE + CALL XABORT('TINST: GEOMETRY TYPE NOT SUPPORTED') + ENDIF + DEALLOCATE(BS,PS,IVS,MIX) + DEALLOCATE(WINT) + DEALLOCATE(NSSV) + MSHT=MAXS+1 + KREF=0 + GOTO 2 +* + 30 IF(LNOTHING)CALL XABORT('@TINST: NO OPTION SPECIFIED.') + CALL LCMSIX(IPMAP,' ',0) + ISTATE(:NSTATE)=0 + CALL LCMGET(IPMAP,'STATE-VECTOR',ISTATE) + ISTATE(6)=MAXS + CALL LCMPUT(IPMAP,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPMAP,'DEPL-TIME',1,2,TTIME) + CALL LCMPUT(IPMAP,'REF-CHAN',NCH,2,RFCHAN) + DEALLOCATE(RFCHAN) + RETURN + 40 FORMAT(/20H TINST: PICK BURNUP=,1P,E12.4,10H MWd/tonne) + 50 FORMAT(/38H TINST: STORE INFORMATION IN LIST ITEM,I3,9H OF TINST, + + 20H DIRECTORY AT BURNUP,1P,E12.4,8H MW-D/T./) + END diff --git a/Donjon/src/TINSTB.f b/Donjon/src/TINSTB.f new file mode 100644 index 0000000..48c54db --- /dev/null +++ b/Donjon/src/TINSTB.f @@ -0,0 +1,152 @@ +*DECK TINSTB + SUBROUTINE TINSTB(IPMAP,TIME,BURNSTP,NCH,NB,NF,BUNDPOW,BURNAVG, + 1 BURNINS,IMPX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute new burnup for each bundle given either an average burnup step +* or a burning time +* +*Copyright: +* Copyright (C) 2009 Ecole Polytechnique de Montreal +* +*Author(s): +* B. Toueg +* +*Parameters: input/output +* IPMAP pointer to fuel-map information. +* TIME time to burn +* BURNSTP average burnup step +* NCH number of reactor channels. +* NB number of fuel bundles. +* NF number of fuel types. +* BUNDPOW bundle powers. +* BURNAVG average burnup. +* BURNINS instantaneous burnups. +* IMPX printing index (=0 for no print). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAP + INTEGER NCH,NB,NF,IMPX + REAL BUNDPOW(NCH,NB), BURNINS(NCH,NB) + REAL TIME,BURNSTP, BURNAVG, PTOT, MASSTOT, WEIGHT +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + TYPE(C_PTR) JPMAP,KPMAP + CHARACTER HSMG*131 + INTEGER, ALLOCATABLE, DIMENSION(:) :: FLMIX,IFLRANK + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: BUNDMIX + REAL, ALLOCATABLE, DIMENSION(:) :: FLWEIGHT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(BUNDMIX(NCH,NB),FLMIX(NF),FLWEIGHT(NF)) +*---- +* RECOVER INFORMATION +*---- + CALL LCMLIB(IPMAP) +* FUEL MIX + BUNDMIX(:NCH,:NB)=0 + CALL LCMGET(IPMAP,'FLMIX',BUNDMIX) +* BURN-INST + BURNINS(:NCH,:NB)=0.0 + CALL LCMGET(IPMAP,'BURN-INST',BURNINS) +* FUEL INFORMATION (WEIGHT & MIX) + JPMAP=LCMGID(IPMAP,'FUEL') + MAXFL=0 ! maximum fuel mix number + DO IFL=1,NF + KPMAP=LCMGIL(JPMAP,IFL) + CALL LCMGET(KPMAP,'MIX',FLMIX(IFL)) + MAXFL=MAX(MAXFL,FLMIX(IFL)) + CALL LCMGET(KPMAP,'WEIGHT',FLWEIGHT(IFL)) + ENDDO + IF(MAXFL.LT.NF)THEN + WRITE(HSMG,'(38H@TINSTB: FOUND MAX FUEL MIX NUMBER : (,I6, + 1 8H) THOUGH,I7,23H FUEL MIXES ARE DEFINED)') + CALL XABORT(HSMG) + ENDIF +* the mix stored in FLMIX field of /FMAP/ +* is not the rank of the fuel in FUEL Dir list of /FMAP/ + ALLOCATE(IFLRANK(MAXFL)) + IFLRANK(:MAXFL)=0 + DO IFL=1,NF + IFLRANK(FLMIX(IFL))=IFL + ENDDO +*---- +* COMPUTE BURNAVG, PTOT, MASSTOT, ( TIME if BURNSTEP is specified) +*---- + BURNAVG=0. + PTOT=0. + MASSTOT=0. + NTOT=0 + DO ICH=1,NCH + DO IB=1,NB + IBD=BUNDMIX(ICH,IB) + IF(IBD.EQ.0) CYCLE + IFL=IFLRANK(IBD) + IF(IFL.EQ.0) CYCLE + NTOT=NTOT+1 + WEIGHT = FLWEIGHT(IFL) + BURNAVG=BURNAVG+BURNINS(ICH,IB) + PTOT=PTOT+BUNDPOW(ICH,IB) + MASSTOT=MASSTOT+WEIGHT + ENDDO + ENDDO + BURNAVG=BURNAVG/REAL(NTOT) + IF(TIME.EQ.0.)THEN + TIME = BURNSTP*MASSTOT/PTOT + ENDIF + IF(IMPX.GT.0)THEN + WRITE(IOUT,*)'@TINSTB: TOTAL POWER = ',PTOT,' kW' + WRITE(IOUT,*)'@TINSTB: TOTAL FUEL MASS = ',MASSTOT,' kg' + WRITE(IOUT,*)'@TINSTB: AVERAGE BURN UP BEFORE = ', + 1 BURNAVG,'MWd/t' + ENDIF +*---- +* COMPUTE NEW BURN-INST GIVEN TIME +*---- + BURNAVG=0. + NTOT=0 + DO ICH=1,NCH + DO IB=1,NB + IBD=BUNDMIX(ICH,IB) + IF(IBD.EQ.0) CYCLE + IFL=IFLRANK(IBD) + IF(IFL.EQ.0) CYCLE + NTOT=NTOT+1 + WEIGHT = FLWEIGHT(IFL) + IF(WEIGHT.GT.0.)THEN + BURNINS(ICH,IB)=BURNINS(ICH,IB) + 1 +(BUNDPOW(ICH,IB)/WEIGHT)*TIME + BURNAVG=BURNAVG+BURNINS(ICH,IB) + ELSE + IF(IMPX.GT.0)THEN + WRITE(IOUT,*)'@TINSTB: WARNING MIX ', + 1 BUNDMIX(ICH,IB),' WEIGHS ',WEIGHT,'kg' + ENDIF + ENDIF + ENDDO + ENDDO + BURNAVG=BURNAVG/REAL(NTOT) + IF(IMPX.GT.0)THEN + WRITE(IOUT,*)'@TINSTB: AVERAGE BURN UP AFTER = ',BURNAVG,'MWd/t' + ENDIF + CALL LCMPUT(IPMAP,'BURN-INST',NCH*NB,2,BURNINS) +*---- +* RELEASE MEMORY AND RETURN +*---- + DEALLOCATE(IFLRANK) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(FLWEIGHT,FLMIX,BUNDMIX) + RETURN + END diff --git a/Donjon/src/USPLIT.f b/Donjon/src/USPLIT.f new file mode 100644 index 0000000..2e4ee2b --- /dev/null +++ b/Donjon/src/USPLIT.f @@ -0,0 +1,302 @@ +*DECK USPLIT + SUBROUTINE USPLIT(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Provide a link between the material index and reactor geometry; +* create a matex object. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* J. Koclas, D. Sekki, V. Descotes +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The USPLIT: module specification is: +* GEOM MATEX := USPLIT: { GEOM | GEOMOLD } :: (desclink) ; +* where +* GEOM : name of a \emph{geometry} object. This object is defined in creation +* (appears only on LHS) or modification (appears on both LHS and RHS) +* mode. An existing geometry previously created in the GEO: module is +* modified. Only 3-D Cartesian or 3-D Hexagonal reactor geometries are +* allowed. +* MATEX name of a \emph{matex} object to be created by the module. +* GEOMOLD : name of a \emph{geometry} object previously created in the GEO: +* module. This object must be specified in read-only mode (appears only on +* RHS). It is copied into GEOM at the beginning of USPLIT: module. Only 3-D +* Cartesian or 3-D Hexagonal reactor geometries are allowed. +* (desclink) : structure describing the input data to the USPLIT: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER TEXT*12,HSIGN*12 + INTEGER ISTATE(NSTATE),NCODE(6),ICODE(6) + REAL ZCODE(6) + DOUBLE PRECISION DFLOT + TYPE(C_PTR) IPGEO,IPMTX + INTEGER, ALLOCATABLE, DIMENSION(:) :: ISPLX,ISPLY,ISPLZ,MAT,INDX, + 1 IRMIX,IFMIX,MIXA + REAL, ALLOCATABLE, DIMENSION(:) :: XX,YY,ZZ + LOGICAL LASBLY +*---- +* PARAMETER VALIDATION +*---- + IF(NENTRY.LT.2)CALL XABORT('@USPLIT: 2 PARAMETERS EXPECTED.') + IPGEO=KENTRY(1) + IPMTX=KENTRY(2) + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@USPLIT:' + 1 //' LCM OBJECT EXPECTED AT LHS.') + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2))CALL XABORT('@USPLIT:' + 1 //' LCM OBJECT EXPECTED AT LHS.') + IF(JENTRY(1).EQ.0) THEN + IF(NENTRY.LT.3)CALL XABORT('@USPLIT: 3 PARAMETERS EXPECTED.') + IF((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2))CALL XABORT('@USPLIT:' + 1 //' LCM OBJECT EXPECTED AT RHS.') + IF(JENTRY(3).NE.2)CALL XABORT('@USPLIT: READ-ONLY MODE EXPECTE' + 1 //'D FOR L_GEOM.') + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_GEOM')THEN + TEXT=HENTRY(3) + CALL XABORT('@USPLIT: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_GEOM EXPECTED.') + ENDIF + CALL LCMEQU(KENTRY(3),IPGEO) + ELSE IF(JENTRY(1).EQ.1) THEN + CALL LCMGTC(IPGEO,'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_GEOM')THEN + TEXT=HENTRY(1) + CALL XABORT('@USPLIT: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_GEOM EXPECTED.') + ENDIF + ELSE + TEXT=HENTRY(1) + CALL XABORT('@USPLIT: CREATE OR MODFICATION MODE EXPECTED FOR ' + 1 //TEXT//'.') + ENDIF + IF(JENTRY(2).NE.0)CALL XABORT('@USPLIT: CREATE MODE EXPECTED FOR' + 1 //' L_MATEX.') + LASBLY=.FALSE. +*---- +* RECOVER STATE-VECTOR INFORMATION +*---- + ISTATE(:NSTATE)=0 + CALL LCMGET(IPGEO,'STATE-VECTOR',ISTATE) + IGEO=ISTATE(1) + NMAT=ISTATE(7) + CALL LCMLEN(IPGEO,'MIX-ASBLY',NITMA,ITYP) + IF(NITMA.EQ.0) THEN + NMIXA=0 + ELSE + NMIXA=NITMA/2 + ENDIF + CALL LCMLEN(IPGEO,'A-NMIXP',NITMA,ITYP) + IF(NITMA.NE.1) THEN + NMIXP=0 + ELSE + CALL LCMGET(IPGEO,'A-NMIXP',NMIXP) + ENDIF + IF((IGEO.NE.7).AND.(IGEO.NE.9))CALL XABORT('@USPLIT: ONLY ' + 1 //' 3D-CARTESIAN OR 3D-HEXAGONAL GEOMETRY ALLOWED.') +*---- +* READ INFORMATION +*---- + IMPX=1 + NREFL=0 + NFUEL=0 + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@USPLIT: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'EDIT') THEN +* READ PRINTING INDEX + CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER FOR EDIT EXPECTED.') + ELSE IF(TEXT.EQ.'NGRP') THEN +* NUMBER OF ENERGY GROUPS + CALL REDGET(ITYP,NGRP,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER DATA EXPECTED(1).') + IF(NGRP.LT.1)CALL XABORT('@USPLIT: INVALID NUMBER FOR NGRP.') + ELSE IF(TEXT.EQ.'MAXR') THEN +* MAXIMUM NUMBER OF REGIONS + CALL REDGET(ITYP,MAXR,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER DATA EXPECTED(2).') + IF(MAXR.LT.1)CALL XABORT('@USPLIT: INVALID NUMBER FOR MAXR.') + ELSE IF(TEXT.EQ.'NMIX') THEN +* MAXIMUM NUMBER OF REGIONS + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER DATA EXPECTED(3).') + IF(NITMA.LT.NMAT)CALL XABORT('@USPLIT: INVALID NMIX < NMAT.') + NMAT=NITMA + ELSE IF(TEXT.EQ.'NREFL') THEN +* NUMBER OF REFLECTOR TYPES + CALL REDGET(ITYP,NREFL,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER DATA EXPECTED(4).') + IF(NREFL.LT.1)CALL XABORT('@USPLIT: REFLECTOR NOT DEFINED.') + IF(NREFL.GT.NMAT-1)CALL XABORT('@USPLIT: WRONG NUMBER OF ' + 1 //'REFLECTOR TYPES.') +* REFLECTOR MIXTURES + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'RMIX')CALL XABORT('@USPLIT: KEYWORD RMIX EXPECTED.') + ALLOCATE(IRMIX(NREFL)) + DO I=1,NREFL + CALL REDGET(ITYP,IRMIX(I),FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER DATA EXPECTED(5).') + IF(IRMIX(I).LT.1)CALL XABORT('@USPLIT: INVALID RMIX' + 1 //' NUMBER < 1.') + IF(IRMIX(I).GT.NMAT)CALL XABORT('@USPLIT: INVALID RMIX NUMBE' + 1 //'R > NBMIX.') + ENDDO + ELSE IF(TEXT.EQ.'NFUEL') THEN +* NUMBER OF FUEL TYPES + CALL REDGET(ITYP,NFUEL,FLOT,TEXT,DFLOT) + IF(ITYP.EQ.1) THEN +* general definition of fuel mixture + IF(NFUEL.LT.1)CALL XABORT('@USPLIT: FUEL NOT DEFINED.') + IF(NREFL+NFUEL.NE.NMAT)THEN + WRITE(IOUT,*)'@USPLIT: NREFL:',NREFL,', NFUEL:',NFUEL + WRITE(IOUT,*)'@USPLIT: TOTAL NUMBER OF MATERIALS ',NMAT + CALL XABORT('@USPLIT: WRONG NUMBER OF REFLECTOR OR FUEL TY' + 1 //'PES.') + ENDIF +* FUEL MIXTURES + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(TEXT.NE.'FMIX')CALL XABORT('@USPLIT: KEYWORD FMIX EXPECTE' + 1 //'D.') + ALLOCATE(IFMIX(NFUEL)) + DO I=1,NFUEL + CALL REDGET(ITYP,IFMIX(I),FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@USPLIT: INTEGER DATA EXPECTED(6' + 1 //').') + IF(IFMIX(I).LT.1)CALL XABORT('@USPLIT: INVALID FMIX NUMBER' + 1 //' < 1.') + IF(IFMIX(I).GT.NMAT)CALL XABORT('@USPLIT: INVALID FMIX NUM' + 1 //'BER > NBMIX.') + ENDDO + ELSEIF((ITYP.EQ.3).AND.(TEXT.EQ.'ASBLY')) THEN +* automatic definition of fuel mixture from unfolded geometry +* by NAP: + LASBLY=.TRUE. + IF(NMIXA.EQ.0)CALL XABORT('@USPLIT: No assembly previously ' + 1 //'defined (NMIXA=0).') + IF(NMIXP.EQ.0)CALL XABORT('@USPLIT: No assembly previously ' + 1 //'defined (NMIXP=0).') + NFUEL=NMIXA*(NMIXP+1) + ALLOCATE(MIXA(2*NMIXA)) + CALL LCMGET(IPGEO,'MIX-ASBLY',MIXA) + ALLOCATE(IFMIX(NFUEL)) + DO I=1,NMIXA + IFMIX((I-1)*(NMIXP+1)+1)=MIXA(I) + DO J=1,NMIXP + IFMIX((I-1)*(NMIXP+1)+1+J)=MIXA(I+NMIXA)+J-1 + ENDDO + ENDDO + ELSE + CALL XABORT('@USPLIT: INTEGER DATA or ASBLY keyword is EXPEC' + 1 //'TED.') + ENDIF + ELSE IF(TEXT.EQ.';') THEN + GO TO 20 + ELSE + CALL XABORT('@USPLIT: FINAL ; EXPECTED.') + ENDIF + GO TO 10 +*---- +* RECOVER INFORMATION +*---- + 20 IMPX0=MAX(0,IMPX-1) + ALLOCATE(ISPLX(MAXR),ISPLY(MAXR),ISPLZ(MAXR),MAT(MAXR)) + ALLOCATE(XX(MAXR+1),YY(MAXR+1),ZZ(MAXR+1)) + CALL READ3D(MAXR,MAXR,MAXR,MAXR,IPGEO,IHEX,IR,ILK,SIDE,XX,YY,ZZ, + 1 IMPX0,LX,LY,LZ,MAT,NEL,NCODE,ICODE,ZCODE,ISPLX,ISPLY,ISPLZ,ISPLH, + 2 ISPLL) +*---- +* CORRECT READ3D OUTPUT TO AVOID HEXAGON SPLITTING +*---- + ISTATE(11)=0 +*---- +* COMPUTE RENUMBERED MATERIAL INDEX +*---- + IF((NEL.NE.LX*LY*LZ).AND.(IHEX.EQ.0))CALL XABORT('@USPLIT: WRONG' + 1 // ' GEOMETRY.') + IF((NEL.NE.LX*LZ).AND.(IHEX.NE.0))CALL XABORT('@USPLIT: WRONG' + 1 // ' HEXAGONAL GEOMETRY, WRONG NUMBER OF ELEMENTS.') + DEALLOCATE(ISPLZ,ISPLY,ISPLX) + ALLOCATE(INDX(NEL)) + IF(NREFL.EQ.0) ALLOCATE(IRMIX(1)) + IF(NFUEL.EQ.0) ALLOCATE(IFMIX(1)) + CALL USPMIX(IPMTX,NEL,NREFL,NFUEL,MAT,IRMIX,IFMIX,INDX,NMIX) +*---- +* STATE-VECTOR FOR GEOMETRY +*---- + IF(IHEX.EQ.0) THEN + CALL LCMPUT(IPMTX,'MESHX',LX+1,2,XX) + CALL LCMPUT(IPMTX,'MESHY',LY+1,2,YY) + CALL LCMPUT(IPMTX,'MESHZ',LZ+1,2,ZZ) + CALL LCMPUT(IPGEO,'MESHX',LX+1,2,XX) + CALL LCMPUT(IPGEO,'MESHY',LY+1,2,YY) + CALL LCMPUT(IPGEO,'MESHZ',LZ+1,2,ZZ) + ELSE + CALL LCMPUT(IPMTX,'SIDE',1,2,SIDE) + CALL LCMPUT(IPMTX,'MESHZ',LZ+1,2,ZZ) + CALL LCMPUT(IPGEO,'SIDE',1,2,SIDE) + CALL LCMPUT(IPGEO,'MESHZ',LZ+1,2,ZZ) + CALL LCMPUT(IPGEO,'IHEX',1,1,IHEX) + LY=1 + ENDIF + DEALLOCATE(ZZ,YY,XX) +* MODIFY GEOMETRY + ISTATE(3)=LX + ISTATE(4)=LY + ISTATE(5)=LZ + ISTATE(6)=NEL + ISTATE(7)=NMIX + CALL LCMPUT(IPGEO,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL LCMPUT(IPGEO,'MIX',NEL,1,INDX) + DEALLOCATE(IFMIX,IRMIX,INDX,MAT) + IF(LASBLY) DEALLOCATE(MIXA) +*---- +* STATE-VECTOR FOR MATEX +*---- + NTOT=NEL + HSIGN='L_MATEX' + CALL LCMPTC(IPMTX,'SIGNATURE',12,HSIGN) + ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NMIX + ISTATE(3)=NREFL + ISTATE(4)=NFUEL + ISTATE(5)=NTOT + ISTATE(6)=IGEO + ISTATE(7)=NEL + ISTATE(8)=LX + ISTATE(9)=LY + ISTATE(10)=LZ + CALL LCMPUT(IPMTX,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(IMPX.GT.0) CALL LCMLIB(IPMTX) + RETURN + END diff --git a/Donjon/src/USPMIX.f b/Donjon/src/USPMIX.f new file mode 100644 index 0000000..338a14c --- /dev/null +++ b/Donjon/src/USPMIX.f @@ -0,0 +1,94 @@ +*DECK USPMIX + SUBROUTINE USPMIX(IPMTX,NEL,NREFL,NFUEL,MAT,RMIX,FMIX,INDX,NMIX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover and check the material mixtures. +* +*Copyright: +* Copyright (C) 2007 Ecole Polytechnique de Montreal. +* +*Author(s): +* D. Sekki +* +*Parameters: input +* IPMTX pointer to matex information. +* NEL total number of volumes in reactor geometry. +* NREFL total number of reflector types. +* NFUEL total number of fuel types. +* MAT material index from geometry. +* RMIX reflector-type mixtures indices. +* FMIX fuel-type mixtures indices. +* +*Parameters: output +* INDX renumbered material index. +* NMIX total number of non-virtual volumes. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMTX + INTEGER NEL,NREFL,NFUEL,MAT(NEL),RMIX(NREFL),FMIX(NFUEL), + 1 INDX(NEL),NMIX +*---- +* LOCAL VARIABLES +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: RTOT,FTOT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(RTOT(NREFL),FTOT(NFUEL)) +*---- +* MATERIAL INDEX +*---- + RTOT(:NREFL)=0 + FTOT(:NFUEL)=0 + INDX(:NEL)=0 + NMIX=0 + DO IEL=1,NEL + IF(MAT(IEL).NE.0)THEN + NMIX=NMIX+1 + INDX(IEL)=NMIX + ENDIF + ENDDO + IF((NFUEL.EQ.0).AND.(NREFL.EQ.0)) GOTO 20 +* CHECK MIXTURES + DO 10 IEL=1,NEL + IMIX=MAT(IEL) + IF(IMIX.EQ.0)GOTO 10 + IF(NREFL.EQ.0)GOTO 5 + DO IREFL=1,NREFL + IF(IMIX.EQ.RMIX(IREFL))THEN + RTOT(IREFL)=RTOT(IREFL)+1 + GOTO 10 + ENDIF + ENDDO + 5 IF(NFUEL.EQ.0)GOTO 10 + DO IFUEL=1,NFUEL + IF(IMIX.EQ.FMIX(IFUEL))THEN + FTOT(IFUEL)=FTOT(IFUEL)+1 + GOTO 10 + ENDIF + ENDDO + 10 CONTINUE +* STORAGE +20 CALL LCMPUT(IPMTX,'MAT',NEL,1,MAT) + CALL LCMPUT(IPMTX,'INDEX',NEL,1,INDX) + IF(NREFL.NE.0) THEN + CALL LCMPUT(IPMTX,'RMIX',NREFL,1,RMIX) + CALL LCMPUT(IPMTX,'RTOT',NREFL,1,RTOT) + ENDIF + IF(NFUEL.NE.0) THEN + CALL LCMPUT(IPMTX,'FMIX',NFUEL,1,FMIX) + CALL LCMPUT(IPMTX,'FTOT',NFUEL,1,FTOT) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(FTOT,RTOT) + RETURN + END diff --git a/Donjon/src/XENCAL.f b/Donjon/src/XENCAL.f new file mode 100644 index 0000000..2ed0230 --- /dev/null +++ b/Donjon/src/XENCAL.f @@ -0,0 +1,116 @@ +*DECK XENCAL + SUBROUTINE XENCAL(IPLIB,IPPOW,NB,NCH,NGRP,NMIX,NBISO,XEN) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the Xenon distribution according to the bundle flux +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal +* +*Author(s): +* M. Guyot +* +*Parameters: input/output +* IPLIB adress of the L_LIBRARY +* IPPOW adress of the L_POWER +* NB number of fuel bundles per channel +* NCH number of channels +* NGRP number of energy groups +* NMIX number of mixtures present in the library +* NBISO number of isotopes +* XEN xenon concentrations in each bundle +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB,IPPOW + INTEGER NB,NCH,NGRP,NMIX + REAL XEN(NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER ICH,IB,IGRP,IBM + REAL TAUF(NMIX,NGRP),TAUX(NMIX,NGRP),XLAMBDA,GAMMAI,GAMMAX,CF,TF, + 1 TX + TYPE(C_PTR) JPLIB,KPLIB,LPLIB,MPLIB +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IMIX + REAL, ALLOCATABLE, DIMENSION(:) :: SIGX,SIGF + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FLUB + CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: HNAMIS +*---- +* SCRATCH STORAGE ALLOCATION +* SIGX microscopic capture cross section of Xe-135 +* SIGF macroscopic fission cross section +* FLUB bundle fluxes +*---- + ALLOCATE(SIGX(NGRP),SIGF(NMIX),FLUB(NCH,NB,NGRP)) + ALLOCATE(HNAMIS(NBISO),IMIX(NBISO)) +*---- +* SET THE YIELD AND THE DECAY CONSTANTE FOR XENON +*---- + XLAMBDA = 2.09E-5 + GAMMAI = 0.0631 + GAMMAX = 0.0045 + CF=1.0E-24 +*---- +* COMPUTE FISSION AND XENON REACTION RATES IN EACH BUNDLE +*---- + FLUB(:NCH,:NB,:NGRP)=0.0 + TAUF(:NMIX,:NGRP)=0.0 + TAUX(:NMIX,:NGRP)=0.0 + CALL LCMGET(IPPOW,'FLUX-BUND',FLUB) + CALL LCMSIX(IPLIB,'MACROLIB',1) + JPLIB=LCMGID(IPLIB,'GROUP') + CALL LCMSIX(IPLIB,' ',2) + CALL LCMGTC(IPLIB,'ISOTOPESUSED',12,NBISO,HNAMIS) + CALL LCMGET(IPLIB,'ISOTOPESMIX',IMIX) + LPLIB=LCMGID(IPLIB,'ISOTOPESLIST') +* + DO 10 IGRP=1,NGRP + KPLIB=LCMGIL(JPLIB,IGRP) + CALL LCMGET(KPLIB,'NFTOT',SIGF) + DO 20 ICH=1,NCH + DO 30 IB=1,NB + IBM=NCH*(IB-1)+ICH + ISO=0 + DO JSO=1,NBISO + IF((HNAMIS(JSO).EQ.'Xe135').AND.(IMIX(JSO).EQ.IBM)) THEN + ISO=JSO + GO TO 35 + ENDIF + ENDDO + CALL XABORT('XENCAL: UNABLE TO FIND ISOTOPE=Xe135.') + 35 MPLIB=LCMGIL(LPLIB,ISO) + CALL LCMGET(MPLIB,'NG',SIGX) + TAUX(IBM,IGRP)=TAUX(IBM,IGRP)+FLUB(ICH,IB,IGRP)* + + SIGX(IGRP) + TAUF(IBM,IGRP)=TAUF(IBM,IGRP)+FLUB(ICH,IB,IGRP)* + + SIGF(IBM) + 30 CONTINUE + 20 CONTINUE + 10 CONTINUE +* + DO 40 IBM=1,NMIX + TF=0.0 + TX=0.0 + DO 50 IGRP=1,NGRP + TF=TF+TAUF(IBM,IGRP) + TX=TX+TAUX(IBM,IGRP) + 50 CONTINUE + XEN(IBM)=CF*(GAMMAX+GAMMAI)*TF/(XLAMBDA+TX*CF) + 40 CONTINUE +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(IMIX,HNAMIS) + DEALLOCATE(FLUB,SIGF,SIGX) + RETURN + END diff --git a/Donjon/src/XENLIB.f b/Donjon/src/XENLIB.f new file mode 100644 index 0000000..5ab52d4 --- /dev/null +++ b/Donjon/src/XENLIB.f @@ -0,0 +1,99 @@ +*DECK XENLIB + SUBROUTINE XENLIB(IPLIB,MAXMIX,NMIX,NBISO,NGRP,XEN) + +* +*----------------------------------------------------------------------- +* +*Purpose: +* Update the macroscopic cross sections thanks to the Xenon distribution +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal +* +*Author(s): +* M. Guyot +* +*Parameters: input/output +* IPLIB adress of the L_LIBRARY +* MAXMIX maximum number of mixtures in the library +* NMIX number of mixtures present in the library +* NBISO number of isotopes +* NGRP number of energy groups +* XEN xenon concentrations in each bundle +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPLIB + INTEGER MAXMIX,NMIX,NBISO,NGRP + REAL XEN(NMIX) +*---- +* LOCAL VARIABLES +*---- + INTEGER IMIX,ISO + REAL TMPDAY(3) + CHARACTER TEXT*8 + INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NAME,USED + REAL, ALLOCATABLE, DIMENSION(:) :: DENS + LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASK,MASKL +*---- +* SCRATCH STORAGE ALLOCATION +* MIX 'ISOTOPESMIX' +* NAME 'ISOTOPESNAME' +* USED 'ISOTOPESUSED' +* DENS 'ISOTOPESDENS' updated +*---- + ALLOCATE(MIX(NBISO),NAME(3,NBISO),USED(3,NBISO),DENS(NBISO)) +*---- +* RECOVER INFORMATION +*---- + CALL LCMGET(IPLIB,'ISOTOPESMIX',MIX) + CALL LCMGET(IPLIB,'ISOTOPERNAME',NAME) + CALL LCMGET(IPLIB,'ISOTOPESUSED',USED) + CALL LCMGET(IPLIB,'ISOTOPESDENS',DENS) +*---- +* PERFORM CALCULATION +*---- + IMIX=0 + DO 10 ISO=1,NBISO + WRITE(TEXT,'(2A4)') (NAME(I,ISO),I=1,2) + IF(TEXT.EQ.'Xe135 ') THEN + IMIX=IMIX+1 + DENS(ISO)=XEN(IMIX) + ENDIF + 10 CONTINUE + + IF(IMIX.NE.NMIX) CALL XABORT('@XENLIB: Xe135 SHOULD BE EXTRACTED ' + 1 //'IN ALL MIXTURES .') + + CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO,2,DENS) +*---- +* UPDATE MACROSCOPIC XS +*---- + ALLOCATE(MASK(MAXMIX),MASKL(NGRP)) + MASK(:MAXMIX)=.FALSE. + MASKL(:NGRP)=.TRUE. + DO 20 I=1,NBISO + IBM=MIX(I) + MASK(IBM)=.TRUE. + 20 CONTINUE + ITSTMP=0 + TMPDAY(1)=0.0 + TMPDAY(2)=0.0 + TMPDAY(3)=0.0 +*---- +* CALL THE DRAGON SUBROUTINE FOR THE COMPUTATION OF THE MACROSCOPIC XS +*---- + CALL LIBMIX(IPLIB,MAXMIX,NGRP,NBISO,USED,MIX,DENS,MASK,MASKL, + 1 ITSTMP,TMPDAY) + DEALLOCATE(MASKL,MASK) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(DENS,USED,NAME,MIX) + RETURN + END diff --git a/Donjon/src/XENON.f b/Donjon/src/XENON.f new file mode 100644 index 0000000..9b5ca5c --- /dev/null +++ b/Donjon/src/XENON.f @@ -0,0 +1,157 @@ +*DECK XENON + SUBROUTINE XENON(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Computing the Xenon distribution +* +*Copyright: +* Copyright (C) 2010 Ecole Polytechnique de Montreal. +* +*Author(s): +* M. Guyot +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Comments: +* The XENON: module specification is: +* MICROLIB := XENON: MICROLIB [ POWER ] :: (descxenon) ; +* where +* MICROLIB : name of a \emph{library} object, that will be updated by the +* XENON : module. The Xenon should be extracted in this library for the use +* of this module. +* POWER : name of a \emph{power} object containing the bundle fluxes, +* previously computed by the FLPOW: module. The fluxes should be normalized +* to the reactor power. +* (descxenon) : structure describing the input data to the XENON: module. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6) + CHARACTER HSIGN*12,TEXT*12 + INTEGER ISTATE(NSTATE),ITYP,NITMA + REAL FLOT + DOUBLE PRECISION DFLOT + LOGICAL LINI + TYPE(C_PTR) IPLIB,IPPOW + REAL, ALLOCATABLE, DIMENSION(:) :: XEN +*---- +* PARAMETER VALIDATION +*---- + IPLIB=C_NULL_PTR + IPPOW=C_NULL_PTR + IF((NENTRY.NE.1).AND.(NENTRY.NE.2)) + 1 CALL XABORT('@XENON: 1 OR 2 PARAMETERS EXPECTED.') + DO I=1,NENTRY + IF((IENTRY(I).NE.1).AND.(IENTRY(I).NE.2)) + 1 CALL XABORT('@XENON: LCM OBJECT EXPECTED AT LHS') + ENDDO + IF(JENTRY(1).NE.1)CALL XABORT('@XENON: MODIFICATION MODE EXPECTED' + 1 //' FOR L_LIBRARY.') + IF(NENTRY.EQ.2) THEN + IF(JENTRY(2).NE.2)CALL XABORT('@XENON: READ-ONLY MODE EXPECTED' + 1 //' FOR L_POWER AT LHS.') + ENDIF + DO IEN=1,NENTRY + CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN) +* L_LIBRARY + IF(HSIGN.EQ.'L_LIBRARY')THEN + IPLIB=KENTRY(IEN) +* L_POWER + ELSEIF(HSIGN.EQ.'L_POWER')THEN + IPPOW=KENTRY(IEN) + ELSE + TEXT=HENTRY(IEN) + CALL XABORT('@XENON: SIGNATURE OF '//TEXT//' IS '//HSIGN// + 1 '. L_LIBRARY OR L_POWER EXPECTED.') + ENDIF + ENDDO +*---- +* RECOVER INFORMATION +*---- +* L_LIBRARY + CALL LCMSIX(IPLIB,' ',0) + ISTATE(:NSTATE)=0 + CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE) + MAXMIX=ISTATE(1) + NBISO=ISTATE(2) + NGRP=ISTATE(3) + NMIX=ISTATE(14) +* L_POWER + IF(C_ASSOCIATED(IPPOW)) THEN + CALL LCMSIX(IPPOW,' ',0) + ISTATE(:NSTATE)=0 + CALL LCMGET(IPPOW,'STATE-VECTOR',ISTATE) + IF(ISTATE(1).NE.NGRP)CALL XABORT('@XENON: DIFFERENT NGR' + 1 //'P NUMBER IN L_LIBRARY AND L_POWER OBJECT.') + NCH=ISTATE(6) + NB=ISTATE(7) + IF(NCH*NB.NE.NMIX)CALL XABORT('@XENON: DIFFERENT ' + 1 //'MIXTURE NUMBER IN L_LIBRARY AND L_POWER OBJECT.') + ENDIF +*---- +* READ INPUT DATA +*---- + IPRT=0 + LINI=.FALSE. +* READ KEYWORD + 10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.3)CALL XABORT('@XENON: CHARACTER DATA EXPECTED(1).') + IF(TEXT.EQ.'EDIT')THEN +* PRINTING INDEX + CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT) + IF(ITYP.NE.1)CALL XABORT('@XENON: INTEGER DATA EXPECTED.') + IPRT=MAX(0,NITMA) + GOTO 10 + ELSEIF(TEXT.EQ.'INIT')THEN + LINI=.TRUE. + GOTO 10 + ELSEIF(TEXT.EQ.';')THEN + GOTO 20 + ELSE +* KEYWORD DOES NOT MATCH + CALL XABORT('@XENON: WRONG KEYWORD:'//TEXT//'.') + ENDIF + + 20 IF((.NOT.C_ASSOCIATED(IPPOW)).AND.(.NOT.LINI)) THEN + CALL XABORT('@XENON: L_POWER OBJECT REQUIRED .') + ENDIF + ALLOCATE(XEN(NMIX)) +*---- +* COMPUTE THE VALUE OF THE XENON CONCENTRATIONS +*---- + IF(.NOT.LINI) THEN + CALL XENCAL(IPLIB,IPPOW,NB,NCH,NGRP,NMIX,NBISO,XEN) + ELSE + XEN(:NMIX)=0.0 + ENDIF +*---- +* PUT THE CONCENTRATIONS IN THE LIBRARY AND COMPUTE NEW XS +*---- + CALL XENLIB(IPLIB,MAXMIX,NMIX,NBISO,NGRP,XEN) + DEALLOCATE(XEN) + RETURN + END diff --git a/Donjon/src/donmod.f90 b/Donjon/src/donmod.f90 new file mode 100644 index 0000000..3f7196a --- /dev/null +++ b/Donjon/src/donmod.f90 @@ -0,0 +1,91 @@ +! +!----------------------------------------------------------------------- +! +!Purpose: +! Dispatch to a calculation module in DONJON. ANSI-C interoperable. +! +!Copyright: +! Copyright (C) 2009 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 +! +!----------------------------------------------------------------------- +! +integer(c_int) function donmod(cmodul, nentry, hentry, ientry, jentry, & + kentry, hparam_c) bind(c) +! + use GANLIB + implicit none +!---- +! subroutine arguments +!---- + character(kind=c_char), dimension(*) :: cmodul + integer(c_int), value :: nentry + character(kind=c_char), dimension(13,*) :: hentry + integer(c_int), dimension(nentry) :: ientry, jentry + type(c_ptr), dimension(nentry) :: kentry + character(kind=c_char), dimension(73,*) :: hparam_c +!---- +! local variables +!---- + integer :: i, ier + character :: hmodul*12, hsmg*131, hparam*72 + character(len=12), allocatable :: hentry_f(:) + type FIL_file_array + type(FIL_file), pointer :: my_file + end type FIL_file_array + type(FIL_file_array), pointer :: my_file_array(:) + integer, external :: DONDRV +! + allocate(hentry_f(nentry),my_file_array(nentry)) + call STRFIL(hmodul, cmodul) + do i=1,nentry + call STRFIL(hentry_f(i), hentry(1,i)) + if((ientry(i) >= 3).and.(ientry(i) <= 5)) then +! open a Fortran file. + call STRFIL(hparam, hparam_c(1,i)) + my_file_array(i)%my_file=>FILOPN(hparam,jentry(i),ientry(i)-1,0) + if(.not.associated(my_file_array(i)%my_file)) then + write(hsmg,'(29hdonmod: unable to open file '',a12,2h''.)') hentry_f(i) + call XABORT(hsmg) + endif + kentry(i)=c_loc(my_file_array(i)%my_file) + endif + enddo +! ---------------------------------------------------------- + donmod=DONDRV(hmodul,nentry,hentry_f,ientry,jentry,kentry) +! ---------------------------------------------------------- + do i=1,nentry + if(jentry(i) == -2) then +! destroy a LCM object or a Fortran file. + if(ientry(i) <= 2) then + call LCMCL(kentry(i),2) + kentry(i)=c_null_ptr + else if((ientry(i) >= 3).and.(ientry(i) <= 5)) then + ier=FILCLS(my_file_array(i)%my_file,2) + if(ier < 0) then + write(hsmg,'(32hdonmod: unable to destroy file '',a12,2h''.)') hentry_f(i) + call XABORT(hsmg) + endif + kentry(i)=c_null_ptr + endif + else +! close a Fortran file. + if((ientry(i) >= 3).and.(ientry(i) <= 5)) then + ier=FILCLS(my_file_array(i)%my_file,1) + if(ier < 0) then + write(hsmg,'(30hdonmod: unable to close file '',a12,2h''.)') hentry_f(i) + call XABORT(hsmg) + endif + endif + endif + enddo + deallocate(my_file_array,hentry_f) + flush(6) + return +end function donmod |
