summaryrefslogtreecommitdiff
path: root/Dragon/src/FLUDRV.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/FLUDRV.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/FLUDRV.f')
-rw-r--r--Dragon/src/FLUDRV.f345
1 files changed, 345 insertions, 0 deletions
diff --git a/Dragon/src/FLUDRV.f b/Dragon/src/FLUDRV.f
new file mode 100644
index 0000000..428113d
--- /dev/null
+++ b/Dragon/src/FLUDRV.f
@@ -0,0 +1,345 @@
+*DECK FLUDRV
+ SUBROUTINE FLUDRV(IPRT,IPFLUX,IPTRK,IPMACR,IPSOU,IFTRAK,IPSYS,
+ 1 IPHASE,ITPIJ,CXDOOR,ITRANC,TITLE,B2,INITFL,LFORW,LEAKSW,IREBAL,
+ 2 NGRP,NMAT,NIFIS,NANIS,NLF,NLIN,NFUNL,OPTION,NUN,MAXINR,EPSINR,
+ 3 MAXOUT,EPSUNK,EPSOUT,IFRITR,IACITR,ITYPEC,ILEAK,NREG,NSOUT,
+ 4 MATCOD,KEYFLX,VOL,REFKEF,NMERG,IMERG)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Driver for Boltzmann equation solvers.
+*
+*Copyright:
+* Copyright (C) 2002 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): R. Roy
+*
+*Parameters: input
+* IPRT print flag.
+* IPFLUX pointer to the flux LCM object.
+* IPTRK pointer to the tracking LCM object.
+* IPMACR pointer to the macrolib LCM object.
+* IPSOU pointer to the fixed source LCM object.
+* IFTRAK tracking file unit number.
+* IPSYS pointer to the system LCM object (=0 for the method of
+* characteristics).
+* IPHASE 1 for asm 2 for pij.
+* ITPIJ type of collision probability information available:
+* =1 scattering modified pij (wij);
+* =2 standard pij;
+* =3 scattering modified pij+pijk (wij,wijk);
+* =4 standard pij+pijk.
+* CXDOOR name of the flux solution door.
+* ITRANC type of transport correction (>0 to perform a correction).
+* TITLE title.
+* B2 initial or imposed directional bucklings.
+* INITFL flux initialization flag (=0/1/2: uniform flux/LCM/DSA).
+* LFORW flag set to .false. to solve an adjoint problem.
+* LEAKSW leakage flag (=.true. if leakage is present on the outer
+* surface).
+* IREBAL flux rebalancing flag (=1: perform rebalancing).
+* NGRP number of energy groups.
+* NMAT number of mixtures.
+* NIFIS number of fissile isotopes.
+* NANIS maximum cross section Legendre order.
+* NLF number of Legendre orders for the flux.
+* NLIN number of polynomial components in flux spatial expansion.
+* NFUNL number of spherical harmonics components.
+* OPTION type of leakage coefficients:
+* 'LKRD' (recover leakage coefficients in Macrolib);
+* 'RHS' (recover leakage coefficients in RHS flux object);
+* 'B0' (B-0), 'P0' (P-0), 'B1' (B-1),
+* 'P1' (P-1), 'B0TR' (B-0 with transport correction) or 'P0TR'
+* (P-0 with transport correction).
+* NUN number of unknowns per energy group including spherical
+* harmonic terms, interface currents and fundamental
+* currents.
+* MAXINR maximum number of thermal iterations.
+* EPSINR thermal iterations epsilon.
+* MAXOUT maximum number of outer iterations.
+* EPSUNK outer iterations eigenvector epsilon.
+* EPSOUT outer iterations eigenvalue epsilon.
+* IFRITR number of free iterations in an acceleration cycle.
+* IACITR number of accelerated iterations in an acceleration cycle.
+* ITYPEC type of flux evaluation:
+* =-1 skip the flux calculation;
+* =0 fixed sources;
+* =1 fixed source eigenvalue problem (GPT type);
+* =2 fission sources/K-eff convergence;
+* =3 fission sources/K-eff convergence/db2 buckling evaluation;
+* =4 fission sources/db2 buckling convergence;
+* =5 b2 sources/db2 buckling convergence.
+* ILEAK method used to include DB2 effect:
+* =1 the scattering modified cp matrix is multiplied by PNLR;
+* =2 the reduced cp matrix is multiplied by PNL;
+* =3 sigs0-db2 approximation;
+* =4 albedo approximation;
+* =5 Todorova-type isotropic streaming model;
+* =6 Ecco-type isotropic streaming model;
+* >6 Tibere type anisotropic streaming model.
+* NREG number of regions.
+* NSOUT number of outer surfaces.
+* MATCOD mixture indices.
+* KEYFLX index of L-th order flux components in unknown vector.
+* VOL volumes.
+* REFKEF target effective multiplication factor (K-eff).
+* NMERG number of leakage zones.
+* IMERG leakage zone index in each material mixture zone.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ CHARACTER CXDOOR*12,TITLE*72,OPTION*4
+ TYPE(C_PTR) IPFLUX,IPTRK,IPMACR,IPSOU,IPSYS
+ INTEGER IPRT,IFTRAK,IPHASE,ITPIJ,ITRANC,INITFL,IREBAL,NGRP,
+ > NMAT,NIFIS,NANIS,NLF,NLIN,NFUNL,NUN,MAXINR,MAXOUT,
+ > IFRITR,IACITR,ITYPEC,ILEAK,NREG,NSOUT,MATCOD(NREG),
+ > KEYFLX(NREG,NLIN,NFUNL),NMERG,IMERG(NMAT)
+ REAL EPSUNK,EPSINR,B2(4),VOL(NREG)
+ LOGICAL LFORW,LEAKSW
+ DOUBLE PRECISION REFKEF
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER (IUNOUT=6,NSTATE=40,NDIMO=2,IGPT=0)
+ TYPE(C_PTR) JPMACR,KPMACR,JPFLUX,IPFLUP,JPSYS,KPSYS
+ LOGICAL LREBAL
+ INTEGER ISTATE(NSTATE)
+ REAL EPSCON(5)
+ CHARACTER CAN(0:19)*2
+*----
+* ALLOCATABLE ARRAYS
+*----
+ REAL, ALLOCATABLE, DIMENSION(:) :: SIGT,SIGS0
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: FLUXO,XSTRC,XSTK
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: XSDIA,XSCHI,XSNUF
+*----
+* DATA STATEMENTS
+*----
+ SAVE CAN
+ DATA CAN /'00','01','02','03','04','05','06','07','08','09',
+ > '10','11','12','13','14','15','16','17','18','19'/
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(FLUXO(NUN,NGRP),XSTRC(0:NMAT,NGRP),
+ > XSDIA(0:NMAT,0:NANIS,NGRP),XSCHI(0:NMAT,NIFIS,NGRP),
+ > XSNUF(0:NMAT,NIFIS,NGRP),XSTK(NMAT,NIFIS))
+*
+ IF(IPRT.GE.3) THEN
+ WRITE(IUNOUT,6000)
+ WRITE(IUNOUT,6001) (IREGIO,VOL(IREGIO),MATCOD(IREGIO),
+ > IREGIO=1,NREG)
+ ENDIF
+ IPFLUP=C_NULL_PTR
+*----
+* RECOVER CROSS SECTIONS.
+*----
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ DO 110 IGR=1,NGRP
+ KPMACR=LCMGIL(JPMACR,IGR)
+ DO 10 IANI=0,NANIS
+ CALL LCMLEN(KPMACR,'NJJS'//CAN(IANI),ILNLCM,ITYLCM)
+ IF(ILNLCM.NE.NMAT) THEN
+ CALL LCMLIB(KPMACR)
+ CALL XABORT('FLUDRV: FLUX CALCULATION ERROR, SCATTERING'//
+ > ' MATRIX OF ORDER ANIS ='//CAN(IANI)//' NOT ON LCM')
+ ENDIF
+ 10 CONTINUE
+*----
+* RECOVER CORRECTED TOTAL AND WITHIN-GROUP SCATTERING CROSS SECTIONS
+*----
+ JPSYS=LCMGID(IPSYS,'GROUP')
+ KPSYS=LCMGIL(JPSYS,IGR)
+ CALL LCMLEN(KPSYS,'DRAGON-TXSC',ILCTX,ITYLCM)
+ CALL LCMLEN(KPSYS,'DRAGON-S0XSC',ILCS0X,ITYLCM)
+ IF(ILCTX.NE.NMAT+1) THEN
+ CALL XABORT('FLUDRV: INVALID LENGTH FOR DRAGON-TXSC.')
+ ELSE IF(MOD(ILCS0X,NMAT+1).NE.0) THEN
+ CALL XABORT('FLUDRV: INVALID LENGTH FOR DRAGON-S0XSC.')
+ ENDIF
+ NANI_ASM=ILCS0X/(NMAT+1)-1
+ ALLOCATE(SIGT(ILCTX),SIGS0(ILCS0X))
+ SIGS0(:ILCS0X)=0.0
+ CALL LCMGET(KPSYS,'DRAGON-TXSC',SIGT)
+ CALL LCMGET(KPSYS,'DRAGON-S0XSC',SIGS0)
+ XSTRC(0:NMAT,IGR)=SIGT(:NMAT+1)
+ XSDIA(0:NMAT,0:NANIS,IGR)=0.0
+ DO IANI=0,MIN(NANIS,NANI_ASM)
+ DO IMAT=1,NMAT
+ XSDIA(IMAT,IANI,IGR)=SIGS0(IANI*(NMAT+1)+IMAT+1)
+ ENDDO
+ ENDDO
+ DEALLOCATE(SIGS0,SIGT)
+ IF(IPRT.GE.3) THEN
+ WRITE(IUNOUT,6002) IGR
+ WRITE(IUNOUT,6003) (IMAT,XSTRC(IMAT,IGR),
+ > XSDIA(IMAT,0,IGR),IMAT=1,NMAT)
+ ENDIF
+*----
+* RECOVER FISSION CROSS SECTIONS
+*----
+ CALL LCMLEN(KPMACR,'CHI',ILONG,ITYLCM)
+ IF( ILONG.EQ.0 )THEN
+ IF(( ITYPEC.NE.0 ).AND.( ITYPEC.NE.5 )
+ 1 .AND.( ITYPEC.NE.-2 ))THEN
+ CALL XABORT('FLUDRV: TYPE S, F OR L REQUESTED')
+ ENDIF
+ XSCHI(0:NMAT,:NIFIS,:NGRP)=0.0
+ XSNUF(0:NMAT,:NIFIS,:NGRP)=0.0
+ ELSE
+ CALL LCMGET(KPMACR,'CHI',XSTK)
+ DO 60 IFIS= 1, NIFIS
+ XSCHI(0,IFIS,IGR)= 0.0
+ DO 50 IMAT= 1, NMAT
+ XSCHI(IMAT,IFIS,IGR)= XSTK(IMAT,IFIS)
+ 50 CONTINUE
+ 60 CONTINUE
+ CALL LCMGET(KPMACR,'NUSIGF',XSTK)
+ DO 80 IFIS= 1, NIFIS
+ XSNUF(0,IFIS,IGR)= 0.0
+ DO 70 IMAT= 1, NMAT
+ XSNUF(IMAT,IFIS,IGR)= XSTK(IMAT,IFIS)
+ 70 CONTINUE
+ 80 CONTINUE
+ IF( IPRT.GT.3 )THEN
+ WRITE(IUNOUT,6004) (IMAT,XSNUF(IMAT,1,IGR),
+ > XSCHI(IMAT,1,IGR),IMAT=1,NMAT)
+ ENDIF
+ ENDIF
+ DO 100 IANI=0,NANIS
+ CALL LCMLEN(KPMACR,'NJJS'//CAN(IANI),ILNLCM,ITYLCM)
+ IF(ILNLCM.NE.NMAT) THEN
+ CALL LCMLIB(KPMACR)
+ CALL XABORT('FLUDRV: FLUX CALCULATION ERROR, SCATTERING'//
+ > ' MATRIX OF ORDER ANIS ='//CAN(IANI)//' NOT ON LCM')
+ ENDIF
+ 100 CONTINUE
+ 110 CONTINUE
+*----
+* FLUX INITIALIZATION
+*----
+ IF(LFORW) THEN
+ CALL LCMLEN(IPFLUX,'FLUX',ILINIT,ITYLCM)
+ ELSE
+ CALL LCMLEN(IPFLUX,'AFLUX',ILINIT,ITYLCM)
+ ENDIF
+ IF((ILINIT.EQ.0).OR.(INITFL.EQ.0)) THEN
+ IF(LFORW) THEN
+ JPFLUX=LCMLID(IPFLUX,'FLUX',NGRP)
+ ELSE
+ JPFLUX=LCMLID(IPFLUX,'AFLUX',NGRP)
+ ENDIF
+ DO 130 IGR=1,NGRP
+ FLUXO(:NUN,IGR)=0.0
+ IF(ITYPEC.GT.0) THEN
+ IF((CXDOOR.EQ.'BIVAC').OR.(CXDOOR.EQ.'TRIVAC')) THEN
+ FLUXO(:NUN,IGR)=1.0
+ ELSE
+ DO 120 IREGIO=1,NREG
+ IND=KEYFLX(IREGIO,1,1)
+ IF(IND.GT.0) FLUXO(IND,IGR)=1.0
+ 120 CONTINUE
+ ENDIF
+ ENDIF
+ IF(LFORW) THEN
+ CALL LCMPDL(JPFLUX,IGR,NUN,2,FLUXO(1,IGR))
+ ELSE
+ CALL LCMPDL(JPFLUX,NGRP-IGR+1,NUN,2,FLUXO(1,IGR))
+ ENDIF
+ 130 CONTINUE
+ ENDIF
+ IF(ITYPEC.GE.2) THEN
+ EIGENK=REAL(REFKEF)
+ CALL LCMPUT(IPFLUX,'K-EFFECTIVE',1,2,EIGENK)
+ ENDIF
+ IF(ITYPEC.GE.3) THEN
+ CALL LCMPUT(IPFLUX,'B2 B1HOM',1,2,B2(4))
+ IF(ILEAK.GE.7) CALL LCMPUT(IPFLUX,'B2 HETE',3,2,B2)
+ ENDIF
+ IF(ITYPEC.EQ.-1) GO TO 1001
+*
+ IF(ILEAK.GE.7.AND.ITYPEC.GE.3) THEN
+ IF(ITRANC.EQ.0) THEN
+ IF(OPTION.EQ.'B0TR'.OR.OPTION.EQ.'P0TR'.OR.OPTION.EQ.'LKRD'
+ > .OR.OPTION.EQ.'RHS')
+ > CALL XABORT('FLUDRV: ILLEGAL OPTION = '//OPTION//
+ > ' FOR HETEROGENEOUS LEAKAGE CALCULATION'//
+ > ' WITHOUT TRANSPORT CORRECTED CROSS SECTIONS')
+ ENDIF
+ ENDIF
+*
+ IF (CXDOOR.EQ.'MCCG') THEN
+ CALL LCMLEN(IPTRK,'KEYCUR$MCCG',ICREB,ITYLCM)
+ CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE)
+ IF ((ICREB.GT.0).AND.(ISTATE(24).EQ.0)) THEN
+ LREBAL=(IREBAL.EQ.1)
+ ELSE
+ LREBAL=(IREBAL.EQ.1).AND.(.NOT.LEAKSW)
+ ENDIF
+ ELSE
+ LREBAL=(IREBAL.EQ.1).AND.(.NOT.LEAKSW)
+ ENDIF
+ CALL FLU2DR(IPRT,IPMACR,IPFLUX,IPSYS,IPTRK,IPFLUP,IPSOU,IGPT,
+ 1 IFTRAK,CXDOOR,TITLE,NUN,NREG,NSOUT,NANIS,NLF,NLIN,NFUNL,NGRP,
+ 2 NMAT,NIFIS,LFORW,LEAKSW,MAXINR,EPSINR,MAXOUT,EPSUNK,EPSOUT,
+ 3 IFRITR,IACITR,ITYPEC,IPHASE,ITPIJ,ILEAK,OPTION,REFKEF,MATCOD,
+ 4 KEYFLX,VOL,XSTRC,XSDIA,XSNUF,XSCHI,LREBAL,INITFL,NMERG,IMERG)
+*
+ 1001 CALL LCMLEN(IPFLUX,'FLUX',ILON1,ITYLCM)
+ CALL LCMLEN(IPFLUX,'AFLUX',ILON2,ITYLCM)
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NGRP
+ ISTATE(2)=NUN
+ IF((ILON1.GT.0).AND.(ILON2.GT.0)) THEN
+ ISTATE(3)=11
+ ELSE IF(ILON1.GT.0) THEN
+ ISTATE(3)=1
+ ELSE IF(ILON2.GT.0) THEN
+ ISTATE(3)=10
+ ENDIF
+ ISTATE(4)=0
+ ISTATE(5)=0
+ ISTATE(6)=ITYPEC
+ ISTATE(7)=ILEAK
+ ISTATE(8)=IFRITR
+ ISTATE(9)=IACITR
+ ISTATE(10)=IREBAL
+ ISTATE(11)=MAXINR
+ ISTATE(12)=MAXOUT
+ ISTATE(17)=NMAT
+ ISTATE(18)=NMERG
+ CALL LCMPUT(IPFLUX,'STATE-VECTOR',NSTATE,1,ISTATE)
+ EPSCON(1)=EPSINR
+ EPSCON(2)=EPSUNK
+ EPSCON(3)=EPSOUT
+ EPSCON(4:5)=0.0
+ CALL LCMPUT(IPFLUX,'EPS-CONVERGE',5,2,EPSCON)
+ CALL LCMPUT(IPFLUX,'KEYFLX',NREG,1,KEYFLX)
+ CALL LCMPTC(IPFLUX,'OPTION',4,OPTION)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(XSTK,XSNUF,XSCHI,XSDIA,XSTRC,FLUXO)
+ RETURN
+*----
+* FORMATS
+*----
+ 6000 FORMAT(//30X,' EDITION REGION/VOL/MIXTURE '//
+ >3(5X,'REGION',5X,'VOL ',5X,'MIXTURE')/)
+ 6001 FORMAT(1P,3(1X,I8,4X,E12.5,I8,4X))
+ 6002 FORMAT(//30X,' G R O U P : ',I5//
+ >30X,' TOTAL MACROSCOPIC CROSS SECTIONS PER MIXTURE '/)
+ 6003 FORMAT(3(1X,'MIXTURE',4X,'NTOT0',11X,'SIGW',3X)/
+ >1P,3(1X,I4,3X,E12.5,3X,E12.5))
+ 6004 FORMAT(3(1X,'MIXTURE',4X,'NUSIGF',11X,'CHI ',3X)/
+ >1P,3(1X,I4,3X,E12.5,3X,E12.5))
+ END