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/XENON.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/XENON.f')
| -rw-r--r-- | Donjon/src/XENON.f | 157 |
1 files changed, 157 insertions, 0 deletions
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 |
