summaryrefslogtreecommitdiff
path: root/Donjon/src/XENON.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Donjon/src/XENON.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/XENON.f')
-rw-r--r--Donjon/src/XENON.f157
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