summaryrefslogtreecommitdiff
path: root/Dragon/src/M2TDRV.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/M2TDRV.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/M2TDRV.f')
-rw-r--r--Dragon/src/M2TDRV.f294
1 files changed, 294 insertions, 0 deletions
diff --git a/Dragon/src/M2TDRV.f b/Dragon/src/M2TDRV.f
new file mode 100644
index 0000000..44aee88
--- /dev/null
+++ b/Dragon/src/M2TDRV.f
@@ -0,0 +1,294 @@
+*DECK M2TDRV
+ SUBROUTINE M2TDRV(IMPX,LOUT,IPMAC,NGRP,NBMIX,MAXMIX,NL,NBFIS,ICTR,
+ 1 IGMAIL,BUP,TEMP,HBM,NBM)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Build an Apotrim interface file.
+*
+*Copyright:
+* 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
+*
+*Author(s): A. Hebert
+*
+*Parameters: input
+* IMPX print index.
+* LOUT Apotrim file unit number.
+* IPMAC LCM pointer to the Macrolib.
+* NGRP number of energy groups.
+* NBMIX number of material mixtures in the Apotrim file.
+* MAXMIX number of material mixtures in the Macrolib.
+* NL maximum anisotropy level in the Apotrim file (=1 for
+* isotropic collision in LAB).
+* NBFIS maximum number of fissile isotopes in a mixture.
+* ICTR flag set to 1 if the Apotrim xs are transport corrected.
+* IGMAIL flag set to 1 to avoid writing the energy mesh on file.
+* BUP burnup of each Apotrim mixture.
+* TEMP temperature of each Apotrim mixture in Celsius.
+* HBM name of material mixtures in the Apotrim file.
+* NBM corresponding material mixtures indices in the Macrolib.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMAC
+ INTEGER IMPX,LOUT,NGRP,NBMIX,MAXMIX,NL,NBFIS,ICTR,IGMAIL,
+ 1 HBM(5,NBMIX),NBM(NBMIX)
+ REAL BUP(NBMIX),TEMP(NBMIX)
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) JPMAC,KPMAC
+ CHARACTER TEXT20*20,FMTOUT*80,CM*2
+ PARAMETER(FMTOUT='(1P,6E13.5)',IOUT=6)
+ INTEGER FFAGGM,LLAGGM,FFDGGM,WWGALM,FFAGM,LLAGM,NNPSNM
+*----
+* ALLOCATABLE STATEMENTS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IFDG,IADR,IJJ,NJJ,IPOS
+ REAL, ALLOCATABLE, DIMENSION(:) :: GAR1,XTRAN,SIG,WORK,TRAN
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: GAR2
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(IFDG(NGRP),IADR(NGRP+1),IJJ(MAXMIX),NJJ(MAXMIX),
+ 1 IPOS(MAXMIX))
+ ALLOCATE(GAR1(NGRP),GAR2(5,NGRP),XTRAN(NGRP*NGRP),SIG(MAXMIX),
+ 1 WORK(NGRP*MAXMIX),TRAN(NGRP))
+*----
+* RECOVER THE ENERGY MESH
+*----
+ IF(IGMAIL.EQ.0) THEN
+ CALL LCMGET(IPMAC,'ENERGY',GAR1)
+ DO 10 I=1,NGRP+1
+ GAR1(I)=1.0E-6*GAR1(I)
+ 10 CONTINUE
+ WRITE(LOUT,'(2I8)') NBMIX,NGRP
+ WRITE(LOUT,FMTOUT) (GAR1(I),I=1,NGRP+1)
+ IF(IMPX.GE.1) THEN
+ WRITE(IOUT,4000) NBMIX,NGRP
+ WRITE(IOUT,4100) (GAR1(I),I=1,NGRP+1)
+ ENDIF
+ ENDIF
+*----
+* MIXTURE LOOP
+*----
+ DO 100 IMED=1,NBMIX
+ WRITE(TEXT20,'(5A4)') (HBM(I0,IMED),I0=1,5)
+ IF(IMPX.GT.0) WRITE(IOUT,'(/25H M2TDRV: PROCESS MIXTURE ,A20)')
+ 1 TEXT20
+ IBM=NBM(IMED)
+ JPMAC=LCMGID(IPMAC,'GROUP')
+*----
+* RECOVER FISSION INFORMATION
+*----
+ LFIS=0
+ IF(NBFIS.EQ.1) THEN
+ DO 20 IGR=1,NGRP
+ KPMAC=LCMGIL(JPMAC,IGR)
+ CALL LCMLEN(KPMAC,'CHI',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMAC,'CHI',SIG)
+ GAR1(IGR)=SIG(IBM)
+ IF(GAR1(IGR).NE.0.0) LFIS=1
+ ELSE
+ GAR1(IGR)=0.0
+ ENDIF
+ 20 CONTINUE
+ IF((LFIS.EQ.1).AND.(IMPX.GE.1)) THEN
+ WRITE(IOUT,1110)
+ WRITE(IOUT,4100) (GAR1(IGR),IGR=1,NGRP)
+ ENDIF
+ ENDIF
+ WRITE(LOUT,'(A20,2I5,3I3,2I10)') TEXT20,IMED,NGRP,LFIS,ICTR,NL-1,
+ 1 NINT(TEMP(IMED)),NINT(BUP(IMED))
+ IF(LFIS.EQ.1) WRITE(LOUT,FMTOUT) (GAR1(IGR),IGR=1,NGRP)
+*----
+* RECOVER TRANSPORT CORRECTION
+*----
+ IF(ICTR.GT.0) THEN
+ DO 25 IGR=1,NGRP
+ KPMAC=LCMGIL(JPMAC,IGR)
+ CALL LCMLEN(KPMAC,'TRANC',ILONG1,ITYLCM)
+ CALL LCMLEN(KPMAC,'SIGS01',ILONG2,ITYLCM)
+ IF(ILONG1.GT.0) THEN
+ CALL LCMGET(KPMAC,'TRANC',SIG)
+ TRAN(IGR)=SIG(IBM)
+ ELSE IF(ILONG2.GT.0) THEN
+ CALL LCMGET(KPMAC,'SIGS01',SIG)
+ TRAN(IGR)=SIG(IBM)
+ ELSE
+ TRAN(IGR)=0.0
+ ENDIF
+ 25 CONTINUE
+ ENDIF
+*----
+* RECOVER REMAINING VECTOR XS INFORMATION
+*----
+ IF(ICTR.EQ.0) THEN
+ IOF=0
+ NXS=4
+ ELSE
+ IOF=1
+ NXS=5
+ ENDIF
+ DO 30 IGR=1,NGRP
+ KPMAC=LCMGIL(JPMAC,IGR)
+ CALL LCMGET(KPMAC,'NTOT0',SIG)
+ GAR2(IOF+1,IGR)=SIG(IBM)
+ IF(ICTR.GT.0) THEN
+ GAR2(1,IGR)=TRAN(IGR)
+ GAR2(IOF+1,IGR)=GAR2(IOF+1,IGR)-TRAN(IGR)
+ ENDIF
+ GAR2(IOF+2,IGR)=SIG(IBM)
+ CALL LCMLEN(KPMAC,'SIGS00',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMAC,'SIGS00',SIG)
+ GAR2(IOF+2,IGR)=GAR2(IOF+2,IGR)-SIG(IBM)
+ ENDIF
+ CALL LCMLEN(KPMAC,'N2N',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMAC,'N2N',SIG)
+ GAR2(IOF+2,IGR)=GAR2(IOF+2,IGR)+SIG(IBM)
+ GAR2(IOF+4,IGR)=SIG(IBM)
+ ELSE
+ GAR2(IOF+4,IGR)=0.0
+ ENDIF
+ CALL LCMLEN(KPMAC,'N3N',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMAC,'N3N',SIG)
+ GAR2(IOF+2,IGR)=GAR2(IOF+2,IGR)+2.0*SIG(IBM)
+ GAR2(IOF+4,IGR)=GAR2(IOF+4,IGR)+2.0*SIG(IBM)
+ ENDIF
+ CALL LCMLEN(KPMAC,'N4N',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMAC,'N4N',SIG)
+ GAR2(IOF+2,IGR)=GAR2(IOF+2,IGR)+3.0*SIG(IBM)
+ GAR2(IOF+4,IGR)=GAR2(IOF+4,IGR)+3.0*SIG(IBM)
+ ENDIF
+ CALL LCMLEN(KPMAC,'NUSIGF',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPMAC,'NUSIGF',SIG)
+ GAR2(IOF+3,IGR)=SIG(IBM)
+ ELSE
+ GAR2(IOF+3,IGR)=0.0
+ ENDIF
+ 30 CONTINUE
+ WRITE(IOUT,4300) NL-1
+ DO 40 IGR=1,NGRP
+ WRITE(LOUT,FMTOUT) (GAR2(II,IGR),II=1,NXS)
+ 40 CONTINUE
+ IF(IMPX.GE.1) THEN
+ WRITE(IOUT,1000)
+ DO 50 IGR=1,NGRP
+ WRITE(IOUT,'(8X,I7,1P,6E15.6)') IGR,(GAR2(II,IGR),II=1,NXS)
+ 50 CONTINUE
+ ENDIF
+*----
+* RECOVER TRANSFER XS INFORMATION
+*----
+ DO 90 INL=1,NL
+ WRITE (CM,'(I2.2)') INL-1
+ IADR(1)=1
+ NNPSNM=0
+ FFAGGM=NGRP+1
+ LLAGGM=0
+ FFDGGM=NGRP+1
+ WWGALM=0
+ FFAGM=1
+ LLAGM=NGRP
+ DO 70 IGR=1,NGRP
+ KPMAC=LCMGIL(JPMAC,IGR)
+ IFDG(IGR)=NGRP+1
+ CALL LCMGET(KPMAC,'IJJS'//CM,IJJ)
+ CALL LCMGET(KPMAC,'NJJS'//CM,NJJ)
+ CALL LCMGET(KPMAC,'IPOS'//CM,IPOS)
+ CALL LCMGET(KPMAC,'SCAT'//CM,WORK)
+ IF(ICTR.GT.0) THEN
+ IOF=IPOS(IBM)-IGR+IJJ(IBM)
+ WORK(IOF)=WORK(IOF)-TRAN(IGR)
+ ENDIF
+ IFDG(IGR)=MIN(IFDG(IGR),IJJ(IBM)-NJJ(IBM)+1)
+ IPO=IPOS(IBM)+NJJ(IBM)
+ DO 60 IB=1,NJJ(IBM)
+ NNPSNM=NNPSNM+1
+ XTRAN(NNPSNM)=WORK(IPO-IB)*REAL(2*INL-1)
+ 60 CONTINUE
+ IADR(IGR+1)=IADR(IGR)+(IJJ(IBM)-IFDG(IGR)+1)
+ 70 CONTINUE
+ WRITE(LOUT,'(A20,2I5,3I3,2I10)') TEXT20,IMED,NGRP,LFIS,ICTR,INL-1,
+ 1 NINT(TEMP(IMED)),NINT(BUP(IMED))
+ WRITE(LOUT,'(8I8)') FFAGGM,LLAGGM,FFDGGM,WWGALM,FFAGM,LLAGM
+ WRITE(LOUT,'(8I8)') (IFDG(IGR),IGR=1,NGRP)
+ WRITE(LOUT,'(8I8)') (IADR(IGR),IGR=1,NGRP+1)
+ WRITE(LOUT,'(I10)') NNPSNM
+ WRITE(LOUT,FMTOUT) (XTRAN(II),II=1,NNPSNM)
+ IF(IMPX.GE.2) THEN
+ WRITE(IOUT,3000) INL-1
+ WRITE(IOUT,3050) FFAGGM,LLAGGM,FFDGGM,WWGALM,FFAGM,LLAGM,NNPSNM
+ WRITE(IOUT,3100)
+ WRITE(IOUT,4200) (IFDG(IGR),IGR=1,NGRP)
+ WRITE(IOUT,3200)
+ WRITE(IOUT,4200) (IADR(IGR),IGR=1,NGRP+1)
+ ENDIF
+* PRINT TRANSFERT MATRICES ON LISTING, WIDLY AS THEY ARE CODED
+* IN MACROLIB FOR IMPX.EQ.2, EXPLICITLY FOR IMPX.EQ.3
+ IF(IMPX.EQ.2) THEN
+ WRITE(IOUT,3300)
+ WRITE(IOUT,4100) (XTRAN(II),II=1,NNPSNM)
+ ENDIF
+ IF(IMPX.EQ.3) THEN
+ WRITE(IOUT,3300)
+ DO 85 IG=1,NGRP
+ DO 80 IGP=1,NGRP
+ SECT=0.0
+ IF((IG.GE.FFAGGM).AND.(IG.LE.LLAGGM).AND.
+ 1 (IGP.GE.FFDGGM).AND.(IGP.LE.(FFDGGM+WWGALM-1))) THEN
+ SECT=XTRAN((IG-FFAGGM)*WWGALM+IGP-FFDGGM+1)
+ WRITE(IOUT,3060) IGP,IG,SECT
+ ELSE IF((IGP.GE.IFDG(IG)).AND.
+ 1 (IGP.LE.(IADR(IG+1)-IADR(IG)+IFDG(IG)-1))
+ 2 .AND.(IG.GE.FFAGM).AND.(IG.LE.LLAGM)) THEN
+ SECT=XTRAN(IADR(IG)+IGP-IFDG(IG))
+ WRITE(IOUT,3060) IGP,IG,SECT
+ ENDIF
+ 80 CONTINUE
+ 85 CONTINUE
+ ENDIF
+ 90 CONTINUE
+ 100 CONTINUE
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(TRAN,WORK,SIG,XTRAN,GAR2,GAR1)
+ DEALLOCATE(IPOS,NJJ,IJJ,IADR,IFDG)
+ RETURN
+*
+ 1000 FORMAT (//29X,10(2H**)/29X,'** CROSS SECTIONS **'/29X,
+ 1 10(2H**)//)
+ 1110 FORMAT (//31X,10(2H**)/31X,'* FISSION SPECTRUM *',
+ 1 /31X,10(2H**))
+ 3000 FORMAT (//26X,15(2H**)/26X,'* P',I1,' TRANSFER CROSS SECTIONS *'/
+ 1 26X,15(2H**)/)
+ 3050 FORMAT (//10X,'FAGGM = ',I6,10X,'LAGGM = ',I6,10X,'FDGGM = ',I6
+ 1 /10X,'WGALM = ',I6,10X,'FAGM = ',I6,10X,'LAGM = ',I6
+ 2 /10X,'NPSNM = ',I10)
+ 3060 FORMAT (1X,I3,' ==>',I3,1P,E13.5)
+ 3100 FORMAT (//26X,6(2H**)/26X,'* FDGM *'/26X,6(2H**)/)
+ 3200 FORMAT (//26X,6(2H**)/26X,'* IADM *'/26X,6(2H**)/)
+ 3300 FORMAT (//26X,6(2H**)/26X,'* XTRAN *'/26X,6(2H**)/)
+ 4000 FORMAT (//25X,11(3H***)/25X,'* NUMBER OF MIXTURES : ',I5,
+ 1 ' *'/25X,'* ',I5,'-GROUP ENERGY MESH *'/25X,11(3H***))
+ 4100 FORMAT (2X,1P,5E15.6)
+ 4200 FORMAT (3X,5I10)
+ 4300 FORMAT (//28X,13(2H**)/28X,'* ANISOTROPY LEVEL : P',I1,' *'/
+ 1 28X,13(2H**))
+ END