summaryrefslogtreecommitdiff
path: root/Dragon/src/MACDRV.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/MACDRV.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MACDRV.f')
-rw-r--r--Dragon/src/MACDRV.f356
1 files changed, 356 insertions, 0 deletions
diff --git a/Dragon/src/MACDRV.f b/Dragon/src/MACDRV.f
new file mode 100644
index 0000000..cbdf780
--- /dev/null
+++ b/Dragon/src/MACDRV.f
@@ -0,0 +1,356 @@
+*DECK MACDRV
+ SUBROUTINE MACDRV(IPLIST,INDREC,IPRINT,IDF,NBMIX,NGROUP,NANISO,
+ > NIFISS,NEDMAC,ITRANC,NDELG,NSTEP,NALBP)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Input macroscopic cross sections in Dragon/Donjon.
+*
+*Copyright:
+* Copyright (C) 2006 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
+* IPLIST LCM pointer to the macrolib.
+* INDREC =1 the macrolib is created;
+* =2 an existing macrolib is modified.
+* IPRINT print level.
+* IDF discontinuity factor flag.
+*
+*Parameters: output
+* NBMIX number of mixtures.
+* NGROUP maximum number of groups (default = 1).
+* NANISO maximum scattering anisotropy (default = 1 corresponding to
+* isotropic collision in laboratory).
+* NIFISS number of fissile isotopes per mixtures (default = 0).
+* NEDMAC number of aditional edition cross section types.
+* ITRANC type of transport correction: =0 no transport correction
+* =1 Apollo type transport correction; =2 recover from
+* library; =4 leakage correction alone.
+* NDELG number of precursor groups for delayed neutrons.
+* NSTEP number of delta cross-section sets used for generalized
+* perturbation theory (GPT) or kinetics calculations.
+* NALBP number of physical albedos.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPLIST
+ INTEGER INDREC,IPRINT,IDF,NBMIX,NGROUP,NANISO,NIFISS,NEDMAC,
+ > ITRANC,NDELG,NSTEP,NALBP
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) JPLIST,KPLIST,LPLIST
+ PARAMETER (IUNOUT=6,NCXST=18)
+ CHARACTER CARLIR*12,CARLU*4,CGOXSN*7
+ LOGICAL LIREAD,LOLDXS(NCXST),LNEWXS(NCXST),LNORM,LADD,LUPD
+ INTEGER ITYPLU,INTLIR,IMATER
+ REAL REALIR
+ DOUBLE PRECISION DBLINP
+ DOUBLE PRECISION SQFMAS,XDRCST,NMASS,EVJ
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: ISCATA,IPERMU
+ REAL, ALLOCATABLE, DIMENSION(:) :: TOTL,TOT1,FISS,SPEC,FIXE,TRANC,
+ > DIFF,NFTOT,H,SCAT,NUDL,CHDL,OVERV,XSINT0,XSINT1,DIFFX,DIFFY,
+ > DIFFZ,ENE,VEL,VOL
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: ALB
+ CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XADF
+*----
+* FOR AVERAGED NEUTRON VELOCITY
+* V=SQRT(2*ENER/M)=SQRT(2/M)*SQRT(ENER)
+* SQFMAS=SQRT(2/M) IN CM/S/SQRT(EV) FOR V IN CM/S AND E IN EV
+* =SQRT(2*1.602189E-19(J/EV)* 1.0E4(CM2/M2) /1.67495E-27 (KG))
+* =1383155.30602 CM/S/SQRT(EV)
+*----
+ EVJ=XDRCST('eV','J')
+ NMASS=XDRCST('Neutron mass','kg')
+ SQFMAS=SQRT(2.0D4*EVJ/NMASS)
+*----
+* INITIALIZE USEFUL PARAMETERS
+*----
+ LIREAD=.TRUE.
+ LNORM=.FALSE.
+ LADD=.FALSE.
+ LUPD=(INDREC.EQ.2)
+ NEXTRE=1
+ NEXTMI=1
+ MAXFIS=MAX(1,NIFISS)
+ ALLOCATE(ISCATA(NANISO))
+ ISCATA(:NANISO)=0
+ DO 120 IL=1,NCXST
+ LOLDXS(IL)=.FALSE.
+ LNEWXS(IL)=.FALSE.
+ 120 CONTINUE
+ LPLIST=IPLIST
+ ISTEP=0
+ NTYPE=0
+*----
+* READ A MAIN OPTION
+*----
+ 1000 CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLINP)
+ IF(ITYPLU.NE.3)
+ > CALL XABORT('MACDRV: READ ERROR 1 CHARACTER VARIABLE EXPECTED')
+*----
+* CHECK FOR STOP/RETURN
+*----
+ 1002 IF(CARLIR.EQ.';') THEN
+ GO TO 2000
+ ELSE IF(CARLIR.EQ.'EDIT') THEN
+*----
+* READ THE PRINT INDEX
+*----
+ CALL REDGET(ITYPLU,IPRINT,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ ELSE IF(CARLIR.EQ.'DELP') THEN
+*----
+* READ THE NUMBER OF PRECURSOR GROUPS FOR DELAYED NEUTRONS
+*----
+ CALL REDGET(ITYPLU,NDELG,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ ELSE IF(CARLIR.EQ.'STEP') THEN
+*----
+* STEP TO A GPT SUB-DIRECTORY
+*----
+ CARLIR=' '
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLINP)
+ IF((ITYPLU.NE.3).OR.(CARLIR.NE.'INPUT'))
+ > CALL XABORT('MACDRV: READ ERROR - INPUT STRING EXPECTED')
+ CALL REDGET(ITYPLU,ISTEP,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ IF(INDREC.EQ.1) THEN
+ IF(ISTEP.LT.NSTEP)
+ > CALL XABORT('MACDRV: THIS DIRECTORY STEP ALREADY EXISTS.')
+ ENDIF
+ NSTEP=MAX(NSTEP,ISTEP)
+ JPLIST=LCMLID(IPLIST,'STEP',NSTEP)
+ KPLIST=LCMDIL(JPLIST,ISTEP)
+ LPLIST=KPLIST
+ ELSE IF(CARLIR.EQ.'READ') THEN
+ IF(NBMIX.EQ.0) CALL XABORT('MACDRV: NBMIX NOT YET DEFINED')
+ ALLOCATE(IPERMU(NBMIX))
+ NBELEM=0
+*----
+* IDENTIFY MIXTURES TO READ
+*----
+ NUMMAT=0
+ DO 100 IMATER=1,NBMIX
+ CALL REDGET(ITYPLU,JPERMU,REALIR,CGOXSN,DBLINP)
+ IF(ITYPLU.NE.1) GO TO 1001
+ IF(JPERMU.GT.NBMIX) CALL XABORT('MACDRV: MATERIAL NUMBER IS'
+ > //' LARGER THAN NBMIX')
+ IPERMU(IMATER)=JPERMU
+ NUMMAT=MAX(NUMMAT,JPERMU)
+ IF(IMATER.EQ.NBMIX)
+ > CALL REDGET(ITYPLU,INTLIR,REALIR,CGOXSN,DBLINP)
+ NBELEM=NBELEM+1
+ 100 CONTINUE
+ 1001 IF(ITYPLU.NE.3)
+ > CALL XABORT('MACDRV: READ ERROR 2 CHARACTER VARIABLE EXPECTED')
+ IF(LIREAD) THEN
+ ALLOCATE(TOTL(NBMIX*NGROUP),TOT1(NBMIX*NGROUP),
+ > FISS(NBMIX*NGROUP*MAXFIS),SPEC(NBMIX*NGROUP*MAXFIS),
+ > FIXE(NBMIX*NGROUP),TRANC(NBMIX*NGROUP),DIFF(NBMIX*NGROUP),
+ > NFTOT(NBMIX*NGROUP),H(NBMIX*NGROUP),
+ > SCAT(NBMIX*NGROUP*NGROUP*NANISO))
+ ALLOCATE(NUDL(NBMIX*NGROUP*MAXFIS*MAX(NDELG,1)),
+ > CHDL(NBMIX*NGROUP*MAXFIS*MAX(NDELG,1)))
+ ALLOCATE(OVERV(NBMIX*NGROUP),XSINT0(NBMIX*NGROUP),
+ > XSINT1(NBMIX*NGROUP),DIFFX(NBMIX*NGROUP),DIFFY(NBMIX*NGROUP),
+ > DIFFZ(NBMIX*NGROUP))
+ CALL MACIXS(LPLIST,MAXFIS,NGROUP,NBMIX,NIFISS,NANISO,NDELG,
+ > TOTL,TOT1,FISS,SPEC,FIXE,TRANC,DIFF,NFTOT,H,SCAT,
+ > LOLDXS,ISCATA,NUDL,CHDL,DIFFX,DIFFY,DIFFZ,OVERV,
+ > XSINT0,XSINT1)
+ LIREAD=.FALSE.
+ ENDIF
+ IF(CGOXSN.EQ.'INPUT ') THEN
+ ALLOCATE(HADF(NTYPE),XADF(NBMIX,NGROUP,NTYPE))
+ CALL MACXSR(MAXFIS,NGROUP,NBMIX,NIFISS,NANISO,NDELG,NTYPE,
+ > TOTL,TOT1,FISS,SPEC,FIXE,TRANC,DIFF,NFTOT,H,SCAT,
+ > LOLDXS,LNEWXS,CARLIR,LADD,LUPD,IPRINT,ISCATA,
+ > NUDL,CHDL,DIFFX,DIFFY,DIFFZ,OVERV,XSINT0,XSINT1,
+ > HADF,XADF)
+ IF(NTYPE.GT.0) THEN
+ CALL LCMSIX(IPLIST,'ADF',1)
+ CALL LCMPUT(IPLIST,'NTYPE',1,1,NTYPE)
+ CALL LCMPTC(IPLIST,'HADF',8,NTYPE,HADF)
+ DO ITYPE=1,NTYPE
+ CALL LCMPUT(IPLIST,HADF(ITYPE),NBMIX*NGROUP,2,
+ > XADF(1,1,ITYPE))
+ ENDDO
+ CALL LCMSIX(IPLIST,' ',2)
+ ENDIF
+ DEALLOCATE(XADF,HADF)
+ ENDIF
+ DEALLOCATE(IPERMU)
+ GO TO 1002
+ ELSE IF(CARLIR.EQ.'NGRO') THEN
+ CALL REDGET(ITYPLU,NGROUP,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ ELSE IF(CARLIR.EQ.'NMIX') THEN
+ CALL REDGET(ITYPLU,NBMIX,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ ELSE IF(CARLIR.EQ.'ANIS') THEN
+ NANISC=NANISO
+ CALL REDGET(ITYPLU,NANISO,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ IF(NANISO.GT.NANISC) THEN
+ DEALLOCATE(ISCATA)
+ ALLOCATE(ISCATA(NANISO))
+ ISCATA(:NANISO)=0
+ ENDIF
+ ELSE IF(CARLIR.EQ.'NADF') THEN
+ CALL REDGET(ITYPLU,NTYPE,REALIR,CARLIR,DBLINP)
+ IF(ITYPLU.NE.1) CALL XABORT('MACDRV: READ ERROR - NUMBER ADF '
+ > //'TYPES EXPECTED.')
+ IF(NTYPE.GT.0) IDF=2
+ ELSE IF(CARLIR.EQ.'CTRA') THEN
+*----
+* READ TRANSPORT CORRECTION TYPE
+*----
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.3) CALL XABORT('MACDRV: READ ERROR - CHARACTER CT'
+ > //'RA TYPE EXPECTED')
+ IF(CARLU.EQ.'NONE') THEN
+ ITRANC=0
+ ELSE IF(CARLU.EQ.'APOL') THEN
+ ITRANC=1
+ ELSE IF(CARLU.EQ.'WIMS') THEN
+ ITRANC=2
+ ELSE IF(CARLU.EQ.'LEAK') THEN
+ ITRANC=4
+ ELSE
+ CALL XABORT('MACDRV: NONE, APOL, WIMS OR LEAK EXPECTED')
+ ENDIF
+ ELSE IF(CARLIR.EQ.'NIFI') THEN
+ CALL REDGET(ITYPLU,NIFISS,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1)
+ > CALL XABORT('MACDRV: READ ERROR - INTEGER VARIABLE EXPECTED')
+ MAXFIS=MAX(1,NIFISS)
+ ELSE IF(CARLIR.EQ.'NORM') THEN
+ LNORM=.TRUE.
+ ELSE IF(CARLIR.EQ.'ADD') THEN
+ IF(.NOT.LUPD) CALL XABORT('MACDRV: CANNOT USE THE ADD OPTION ON'
+ > //' A MACROLIB IN CREATION MODE')
+ LADD=.TRUE.
+ ELSE IF(CARLIR.EQ.'VOLUME') THEN
+*----
+* READ MIXTURE VOLUMES
+*----
+ ALLOCATE(VOL(NBMIX))
+ DO 177 IBM=1,NBMIX
+ CALL REDGET(ITYPLU,INTLU,VOL(IBM),CARLU,DBLINP)
+ IF(ITYPLU.NE.2) CALL XABORT('MACDRV: READ ERROR - REAL V'
+ > //'ARIABLE EXPECTED FOR VOLUME')
+ 177 CONTINUE
+ CALL LCMPUT(IPLIST,'VOLUME',NBMIX,2,VOL)
+ DEALLOCATE(VOL)
+ ELSE IF(CARLIR.EQ.'ENER') THEN
+*----
+* READ ENERGY GROUPS
+*----
+ IF(NGROUP.GT.0) THEN
+ ALLOCATE(ENE(NGROUP+1),VEL(NGROUP))
+ CALL REDGET(ITYPLU,INTLU,ENEMAX,CARLU,DBLINP)
+ IF(ITYPLU.NE.2) CALL XABORT('MACDRV: READ ERROR - REAL VAR'
+ > //'IABLE EXPECTED')
+ DO 179 IGR=1,NGROUP
+ ENE(IGR)=ENEMAX
+ CALL REDGET(ITYPLU,INTLU,ENECUR,CARLU,DBLINP)
+ IF(ITYPLU.NE.2) CALL XABORT('MACDRV: READ ERROR - REAL V'
+ > //'ARIABLE EXPECTED')
+ IF(ENECUR.GT.ENEMAX) CALL XABORT('MACDRV: READ ERROR - E'
+ > //'NERGY GOES FROM MAX TO MIN')
+ ENEMAX=ENECUR
+ 179 CONTINUE
+ IF(ENEMAX.LE.0.0) THEN
+ ENE(NGROUP+1)=1.0E-5
+ ELSE
+ ENE(NGROUP+1)=ENEMAX
+ ENDIF
+ CALL LCMPUT(IPLIST,'ENERGY',NGROUP+1,2,ENE)
+ VELG1=SQRT(ENE(1))
+ JVEL=1
+ DO 178 IGR=1,NGROUP
+ VELG2=SQRT(ENE(IGR+1))
+ VEL(JVEL)=REAL(SQFMAS)*SQRT(VELG1*VELG2)
+ VELG1=VELG2
+ ENE(IGR)=LOG(ENE(IGR)/ENE(IGR+1))
+ JVEL=JVEL+1
+ 178 CONTINUE
+ CALL LCMPUT(IPLIST,'AVGVEL',NGROUP,2,VEL)
+ CALL LCMPUT(IPLIST,'DELTAU',NGROUP,2,ENE)
+ DEALLOCATE(VEL,ENE)
+ ENDIF
+ ELSE IF(CARLIR.EQ.'ALBP') THEN
+*----
+* READ GROUP INDEPENDENT PHYSICAL ALBEDOS
+*----
+ CALL REDGET(ITYPLU,NALBD,REALIR,CARLU,DBLINP)
+ IF(ITYPLU.NE.1) CALL XABORT('MACDRV: INTEGER DATA EXPECTED.')
+ IF(NALBD.GT.0) THEN
+ NALBP=NALBD
+ IF(NGROUP.EQ.0) CALL XABORT('MACDRV: NGROUP MISSING FOR ALBP')
+ ALLOCATE(ALB(NALBD,NGROUP))
+ DO IAL=1,NALBD
+ DO IGR=1,NGROUP
+ CALL REDGET(ITYPLU,INTLIR,ALB(IAL,IGR),CARLU,DBLINP)
+ IF(ITYPLU.NE.2) CALL XABORT('MACDRV: ALBEDO EXPECTED.')
+ ENDDO
+ ENDDO
+ CALL LCMPUT(IPLIST,'ALBEDO',NALBP*NGROUP,2,ALB)
+ DEALLOCATE(ALB)
+ ELSE
+ NALBP=0
+ ENDIF
+ ELSE
+ CALL XABORT('MACDRV: '//CARLIR//' IS AN INVALID KEY-WORD.')
+ ENDIF
+ GO TO 1000
+*----
+* TRANSFER MODIFIED X-S ON THE MACROLIB
+*----
+ 2000 IF(.NOT.LIREAD) THEN
+ CALL MACPXS(LPLIST,MAXFIS,NGROUP,NBMIX,NIFISS,NANISO,NDELG,
+ > ITRANC,LNEWXS,TOTL,TOT1,FISS,SPEC,FIXE,TRANC,DIFF,
+ > NFTOT,H,SCAT,NEDMAC,ISCATA,NUDL,CHDL,DIFFX,DIFFY,
+ > DIFFZ,OVERV,XSINT0,XSINT1)
+ DEALLOCATE(DIFFZ,DIFFY,DIFFX,XSINT1,XSINT0,OVERV)
+ DEALLOCATE(CHDL,NUDL)
+ DEALLOCATE(SCAT,H,NFTOT,DIFF,TRANC,FIXE,SPEC,FISS,TOT1,TOTL)
+ ENDIF
+ DEALLOCATE(ISCATA)
+*----
+* NORMALIZATION OF X-S INFORMATION
+*----
+ IF(LNORM) THEN
+ CALL MACNXS(IPLIST,MAXFIS,NGROUP,NBMIX,NIFISS,NANISO)
+ ENDIF
+*----
+* PRINT/CHECK X-S INFORMATION
+*----
+ IF((IPRINT.NE.0).AND.(IPRINT.NE.1)) THEN
+ CALL MACWXS(IPLIST,IPRINT,NGROUP,NBMIX,NIFISS,NANISO,
+ > ITRANC,NEDMAC)
+ ENDIF
+ RETURN
+ END