summaryrefslogtreecommitdiff
path: root/Dragon/src/CLM.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 /Dragon/src/CLM.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/CLM.f')
-rw-r--r--Dragon/src/CLM.f229
1 files changed, 229 insertions, 0 deletions
diff --git a/Dragon/src/CLM.f b/Dragon/src/CLM.f
new file mode 100644
index 0000000..704baae
--- /dev/null
+++ b/Dragon/src/CLM.f
@@ -0,0 +1,229 @@
+*DECK CLM
+ SUBROUTINE CLM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Combine liquid fuel mixtures from different fuel channels
+* and redistribute in channels.
+*
+*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): G. Marleau
+*
+*Parameters: input/output
+* NENTRY number of LCM objects or files used by the operator.
+* HENTRY name of each LCM object or file:
+* HENTRY(1): create or modification type(L_LIBRARY)
+* HENTRY(2): optional read-only type(L_MACROLIB) used to
+* initialize a new lattice code library.
+* IENTRY type of each LCM object or file:
+* =1 LCM memory object; =2 XSM file; =3 sequential binary file;
+* =4 sequential ascii file.
+* JENTRY access of each LCM object or file:
+* =0 the LCM object or file is created;
+* =1 the LCM object or file is open for modifications;
+* =2 the LCM object or file is open in read-only mode.
+* KENTRY LCM object address or file unit number.
+*
+* Comment:
+* All the mixture must contain the same isotopes with possibly
+* different concentrations.
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ TYPE(C_PTR) KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) IPLIB,IPTRK
+ INTEGER IOUT,NSTATE,ILCMUP,ILCMDN
+ CHARACTER NAMSBR*6
+ PARAMETER (IOUT=6,NSTATE=40,ILCMUP=1,ILCMDN=2,NAMSBR='CLM ')
+*----
+* LOCAL PARAMETERS
+*----
+ INTEGER NBSL,NBST,IEN,ISTATE(NSTATE),NBMIX,NBISO,NBREG,IREG,
+ > IPRINT,NCLM,ICLM,ISO,JSO,NGRO,ITSTMP
+ INTEGER MIXI,MIXJ
+ REAL VOLTOT,TMPDAY(3)
+ CHARACTER HSIGN*12
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IDCLM,ISOMIX,MATCOD
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ISONRF,IACT
+ REAL, ALLOCATABLE, DIMENSION(:) :: VOLUME,DENISO,VOLMIX,
+ > DENRD
+ LOGICAL, ALLOCATABLE, DIMENSION(:) :: MASK,MASKL
+*----
+* PARAMETER VALIDATION.
+*----
+ IF(NENTRY .LT. 2) CALL XABORT(NAMSBR//
+ >': At least 2 parameters expected.')
+ IF(IENTRY(1) .NE. 1 .AND.
+ > IENTRY(1) .NE. 2) CALL XABORT(NAMSBR//
+ >': LCM OBJECT OR XSM FILE EXPECTED AT LHS.')
+ IF(JENTRY(1) .NE. 1) CALL XABORT(NAMSBR//': ENTRY'
+ 1 //' IN MODIFICATION MODE EXPECTED.')
+ IPLIB=KENTRY(1)
+*----
+* Find IPLIB and IPTRK structures
+*----
+ IPRINT=1
+ NBSL=0
+ NBST=0
+ DO IEN=1,NENTRY
+ HSIGN=' '
+ IF(NBSL .EQ. 0) THEN
+*----
+* Find Library to modify
+*----
+ IF(IENTRY(IEN) .LE. 2 .AND. JENTRY(IEN) .EQ. 1) THEN
+ CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.EQ.'L_LIBRARY') THEN
+ IPLIB=KENTRY(IEN)
+ WRITE(IOUT,6000) HENTRY(IEN)
+ NBSL=1
+ GO TO 100
+ ENDIF
+ ENDIF
+ ENDIF
+ IF(NBST .EQ. 0) THEN
+*----
+* Find Tracking for volume of mixtures to combine
+*----
+ IF(IENTRY(IEN) .LE. 2 .AND. JENTRY(IEN) .EQ. 2) THEN
+ CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.EQ.'L_TRACK') THEN
+ IPTRK=KENTRY(IEN)
+ WRITE(IOUT,6001) HENTRY(IEN)
+ NBST=1
+ GO TO 100
+ ENDIF
+ ENDIF
+ ENDIF
+ 100 CONTINUE
+ IF(NBSL+NBST.EQ.2) GO TO 105
+ ENDDO
+ 105 CONTINUE
+*----
+* Get information about mixtures on IPLIB
+*----
+ CALL LCMGET(IPLIB,'STATE-VECTOR',ISTATE)
+ NBMIX=ISTATE(1)
+ NBISO=ISTATE(2)
+ NGRO=ISTATE(3)
+ ALLOCATE(ISONRF(3,NBISO),ISOMIX(NBISO),DENISO(NBISO))
+ CALL LCMGET(IPLIB,'ISOTOPERNAME',ISONRF)
+ CALL LCMGET(IPLIB,'ISOTOPESMIX ',ISOMIX)
+ CALL LCMGET(IPLIB,'ISOTOPESDENS',DENISO)
+ ALLOCATE(IDCLM(NBMIX))
+ ALLOCATE(IACT(3,NBISO),DENRD(NBISO))
+*----
+* Read proceessing option
+*----
+ CALL CLMGET(IPRINT,NBMIX,NBISO,ISONRF,ISOMIX,
+ > NCLM,IDCLM,IACT,DENRD)
+*----
+* Get information about volumes for mixtures on IPTRK
+*----
+ ALLOCATE(VOLMIX(NCLM))
+ CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE)
+ NBREG=ISTATE(1)
+ ALLOCATE(MATCOD(NBREG),VOLUME(NBREG))
+ CALL LCMGET(IPTRK,'MATCOD ',MATCOD)
+ CALL LCMGET(IPTRK,'VOLUME ',VOLUME)
+*----
+* Find volume of each mixtures to combine and total volume
+*----
+ VOLTOT=0.0
+ DO ICLM=1,NCLM
+ VOLMIX(ICLM)=0.0
+ DO IREG=1,NBREG
+ IF(IDCLM(ICLM) .EQ. MATCOD(IREG))
+ > VOLMIX(ICLM)=VOLMIX(ICLM)+VOLUME(IREG)
+ ENDDO
+ VOLTOT=VOLTOT+VOLMIX(ICLM)
+ ENDDO
+ DEALLOCATE(MATCOD,VOLUME)
+*----
+* Find isotopes associated with first mixture to combine
+* with wame isotope from other mixtures
+*----
+ DO ISO=1,NBISO
+ MIXI=IACT(1,ISO)
+ IF(MIXI.EQ.1) THEN
+ DENISO(ISO)=DENISO(ISO)*VOLMIX(MIXI)
+ DO JSO=1,NBISO
+ MIXJ=IACT(1,JSO)
+ IF(MIXJ.GT.1 .AND. IACT(2,JSO).EQ.ISO) THEN
+ DENISO(ISO)=DENISO(ISO)+DENISO(JSO)*VOLMIX(MIXJ)
+ ENDIF
+ ENDDO
+ DENISO(ISO)=DENISO(ISO)/VOLTOT
+ ENDIF
+ ENDDO
+ DEALLOCATE(VOLMIX)
+*----
+* correct mixture according to SETI or ADDI
+*----
+ DO ISO=1,NBISO
+ MIXI=IACT(1,ISO)
+ IF(MIXI.EQ.1) THEN
+ IF(IACT(3,ISO).EQ. -2) THEN
+ DENISO(ISO)=DENRD(ISO)
+ ELSE IF(IACT(3,ISO).EQ. -1) THEN
+ DENISO(ISO)=DENISO(ISO)+DENRD(ISO)
+ ELSE IF(IACT(3,ISO).EQ. 1) THEN
+ DENISO(ISO)=DENISO(ISO)*(1.0+DENRD(ISO))
+ ELSE IF(IACT(3,ISO).EQ. 2) THEN
+ DENISO(ISO)=DENISO(ISO)*DENRD(ISO)
+ ENDIF
+ DO JSO=1,NBISO
+ MIXJ=IACT(1,JSO)
+ IF(MIXJ.GT.1 .AND. IACT(2,JSO).EQ.ISO) THEN
+ DENISO(JSO)=DENISO(ISO)
+ ENDIF
+ ENDDO
+ ENDIF
+ ENDDO
+ DEALLOCATE(DENRD,IACT)
+*----
+* Replace new densities in adequate location in DESISO vector
+*----
+ ALLOCATE(MASK(NBMIX),MASKL(NGRO))
+ MASKL(:NBMIX)=.FALSE.
+ MASKL(:NGRO)=.TRUE.
+ DO ICLM=1,NCLM
+ MASK(IDCLM(ICLM))=.TRUE.
+ ENDDO
+ DEALLOCATE(IDCLM)
+ CALL LCMPUT(IPLIB,'ISOTOPESDENS',NBISO,2,DENISO)
+*----
+* Reset macrolib
+*----
+ ITSTMP=0
+ TMPDAY(1)=0.0
+ TMPDAY(2)=0.0
+ TMPDAY(3)=0.0
+ CALL LCMGET(IPLIB,'ISOTOPESUSED',ISONRF)
+ CALL LIBMIX(IPLIB,NBMIX,NGRO,NBISO,ISONRF,ISOMIX,DENISO,MASK,
+ > MASKL,ITSTMP,TMPDAY)
+ DEALLOCATE(MASKL,MASK)
+ DEALLOCATE(ISONRF,ISOMIX,DENISO)
+ RETURN
+*----
+* FORMATS
+*----
+ 6000 FORMAT('LIBRARY is identified as : ',A12)
+ 6001 FORMAT('TRACKING is identified as : ',A12)
+ END