summaryrefslogtreecommitdiff
path: root/Dragon/src/MCTLIB.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/MCTLIB.f')
-rw-r--r--Dragon/src/MCTLIB.f204
1 files changed, 204 insertions, 0 deletions
diff --git a/Dragon/src/MCTLIB.f b/Dragon/src/MCTLIB.f
new file mode 100644
index 0000000..661c6f6
--- /dev/null
+++ b/Dragon/src/MCTLIB.f
@@ -0,0 +1,204 @@
+*DECK MCTLIB
+ SUBROUTINE MCTLIB(IPLIB,NMIX,NGRP,NL,NFM,NDEL,NED,NAMEAD,LN2N,
+ < XSTOT,XSS,XSSNN,XSNUSI,XSCHI,XSN2N,XSN3N,XSEDI)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Recover macroscopic cross-section information from the macrolib.
+*
+*Copyright:
+* Copyright (C) 2008 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): B. Arsenault
+*
+*Parameters: input
+* IPLIB pointer to the LIBRARY data structure.
+* NMIX number of mixtures in the geometry.
+* NGRP number of energy groups.
+* NL number of Legendre orders required in the estimations
+* (NL=1 or higher).
+* NFM number of fissile isotopes.
+* NDEL number of delayed precursor groups.
+* NED number of extra edit vectors.
+* NAMEAD names of these extra edits.
+* LN2N N2N cross section recovery flag.
+*
+*Parameters: output
+* XSTOT total macroscopic cross sections for each mixture and energy
+* group.
+* XSS total scattering cross sections for each mixture and energy
+* group.
+* XSSNN in-group and out-of-group macroscopic transfert cross sections
+* for each mixture and energy group.
+* XSNUSI the values of Nu time the fission cross sections for each
+* isotope per mixture and energy group.
+* XSCHI the values of fission spectrum per isotope per mixture for
+* each energy group.
+* XSN2N N2N macroscopic cross sections for each mixture and energy
+* group.
+* XSN3N N3N macroscopic cross sections for each mixture and energy
+* group.
+* XSEDI extra edit cross sections for each mixture and energy group.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPLIB
+ INTEGER NMIX,NGRP,NL,NFM,NDEL,NED,NAMEAD(2,NED)
+ LOGICAL LN2N
+ REAL XSTOT(NMIX,NGRP),XSS(NMIX,NGRP,NL),XSN2N(NMIX,NGRP),
+ < XSN3N(NMIX,NGRP),XSSNN(NMIX,NGRP,NGRP,NL),
+ < XSNUSI(NMIX,NFM,NGRP,1+NDEL),XSCHI(NMIX,NFM,NGRP,1+NDEL),
+ < XSEDI(NMIX,NGRP,NED)
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) JPMC,KPMC
+ INTEGER IGROUP,JGROUP,IMAT,IED,IPOS,IEN0,IENBR,ILONG,ITYLCM,
+ < IMAX,IL,IDEL
+ DOUBLE PRECISION SUM
+ CHARACTER TEXT12*12,CM*2
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJS00,NJJS00,IPOS00
+ REAL, ALLOCATABLE, DIMENSION(:) :: SCAT
+*----
+* ALLOCATE THE MEMORY THAT IS REQUIRED TO READ THE SCATTERING MATTRICES
+*----
+ ALLOCATE(IJJS00(NMIX),NJJS00(NMIX),IPOS00(NMIX))
+*----
+* PROCESS THE CROSS SECTIONS FOR EACH ENERGY GROUP
+* THIS IS THE MAIN LOOP
+*----
+ XSSNN(:NMIX,:NGRP,:NGRP,:NL)=0.0
+ JPMC = LCMGID(IPLIB,'GROUP')
+ DO IGROUP=1,NGRP
+ KPMC = LCMGIL(JPMC,IGROUP)
+*----
+* READ THE TOTAL MACROSCOPIC CROSS SECTIONS
+*----
+ CALL LCMGET(KPMC,'NTOT0',XSTOT(1,IGROUP))
+*----
+* READ THE TOTAL SCATTERING CROSS SECTIONS AND MATRICES
+*----
+ DO IL=1,NL
+ WRITE(CM,'(I2.2)') IL-1
+ CALL LCMGET(KPMC,'SIGS'//CM,XSS(1,IGROUP,IL))
+ CALL LCMGET(KPMC,'IJJS'//CM,IJJS00)
+ CALL LCMGET(KPMC,'NJJS'//CM,NJJS00)
+ CALL LCMGET(KPMC,'IPOS'//CM,IPOS00)
+ IMAX=0
+ DO IMAT=1,NMIX
+ IMAX=IMAX+NJJS00(IMAT)
+ ENDDO
+ ALLOCATE(SCAT(IMAX))
+ CALL LCMGET(KPMC,'SCAT'//CM,SCAT)
+ DO IMAT=1,NMIX
+ IPOS=IPOS00(IMAT)
+ IEN0=IJJS00(IMAT)
+ IENBR=NJJS00(IMAT)
+ DO WHILE (IENBR.GE.1)
+ XSSNN(IMAT,IGROUP,IEN0,IL)=SCAT(IPOS)
+ IPOS=IPOS+1
+ IENBR=IENBR-1
+ IEN0=IEN0-1
+ ENDDO
+ ENDDO
+ DEALLOCATE(SCAT)
+ ENDDO
+*----
+* RECOVER THE N2N MACROSCOPIC CROSS SECTIONS
+*----
+ IF(LN2N) THEN
+ CALL LCMLEN(KPMC,'N2N',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMC,'N2N',XSN2N(1,IGROUP))
+ ELSE
+ XSN2N(:NMIX,IGROUP)=0.0
+ ENDIF
+ CALL LCMLEN(KPMC,'N3N',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMC,'N3N',XSN3N(1,IGROUP))
+ ELSE
+ XSN3N(:NMIX,IGROUP)=0.0
+ ENDIF
+ DO IMAT=1,NMIX
+ XSS(IMAT,IGROUP,1)=XSS(IMAT,IGROUP,1)-2.0*XSN2N(IMAT,IGROUP)
+ 1 -3.0*XSN3N(IMAT,IGROUP)
+ IF(XSS(IMAT,IGROUP,1).LT.0.0) CALL XABORT('MCTLIB: BUG1')
+ XSS(IMAT,IGROUP,1)=MIN(XSTOT(IMAT,IGROUP),XSS(IMAT,IGROUP,1))
+ ENDDO
+ ELSE
+ XSN2N(:NMIX,IGROUP)=0.0
+ XSN3N(:NMIX,IGROUP)=0.0
+* N2N CORRECTION IN UPPER ENERGY GROUPS
+ DO IMAT=1,NMIX
+ IF(XSS(IMAT,IGROUP,1).GT.XSTOT(IMAT,IGROUP)) THEN
+ XSN2N(IMAT,IGROUP)=XSS(IMAT,IGROUP,1)-XSTOT(IMAT,IGROUP)
+ XSS(IMAT,IGROUP,1)=2.0*XSTOT(IMAT,IGROUP)-
+ 1 XSS(IMAT,IGROUP,1)
+ ENDIF
+ IF(XSS(IMAT,IGROUP,1).LT.0.0) CALL XABORT('MCTLIB: BUG2')
+ ENDDO
+ ENDIF
+*----
+* RECOVER FISSION INFORMATION
+*----
+ IF(NFM.GT.0) THEN
+ CALL LCMGET(KPMC,'NUSIGF',XSNUSI(1,1,IGROUP,1))
+ CALL LCMGET(KPMC,'CHI',XSCHI(1,1,IGROUP,1))
+ DO IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL
+ CALL LCMGET(KPMC,TEXT12,XSNUSI(1,1,IGROUP,1+IDEL))
+ WRITE(TEXT12,'(3HCHI,I2.2)') IDEL
+ CALL LCMGET(KPMC,TEXT12,XSCHI(1,1,IGROUP,1+IDEL))
+ ENDDO
+ ENDIF
+*----
+* RECOVER SPECIAL EDIT CROSS SECTIONS
+*----
+ DO IED=1,NED
+ WRITE(TEXT12,'(2A4)') NAMEAD(1,IED),NAMEAD(2,IED)
+ CALL LCMLEN(KPMC,TEXT12,ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMC,TEXT12,XSEDI(1,IGROUP,IED))
+ ELSE
+ XSEDI(:NMIX,IGROUP,IED)=0.0
+ ENDIF
+ ENDDO
+ ENDDO
+*----
+* RELEASE THE TEMPORARY MEMORY ALLOCATION
+*----
+ DEALLOCATE(IPOS00,NJJS00,IJJS00)
+*----
+* SCATTERING MATRIX NORMALIZATION
+*----
+ DO IL=1,NL
+ DO IMAT=1,NMIX
+ DO IGROUP=1,NGRP
+ SUM=0.0D0
+ DO JGROUP=1,NGRP
+ SUM=SUM+XSSNN(IMAT,JGROUP,IGROUP,IL) ! JGROUP <-- IGROUP
+ ENDDO
+ IF(SUM.NE.0.0) THEN
+ DO JGROUP=1,NGRP
+ XSSNN(IMAT,JGROUP,IGROUP,IL)=XSSNN(IMAT,JGROUP,IGROUP,IL)
+ 1 *XSS(IMAT,IGROUP,IL)/REAL(SUM)
+ ENDDO
+ ENDIF
+ ENDDO
+ ENDDO
+ ENDDO
+ RETURN
+ END