diff options
Diffstat (limited to 'Dragon/src/DOORFV.f')
| -rw-r--r-- | Dragon/src/DOORFV.f | 336 |
1 files changed, 336 insertions, 0 deletions
diff --git a/Dragon/src/DOORFV.f b/Dragon/src/DOORFV.f new file mode 100644 index 0000000..eaa1098 --- /dev/null +++ b/Dragon/src/DOORFV.f @@ -0,0 +1,336 @@ +*DECK DOORFV + SUBROUTINE DOORFV(CDOOR,IPSYS,NPSYS,IPTRK,IFTRAK,IMPX,NGRP,NMAT, + 1 IDIR,NREG,NUN,IPHASE,LEXAC,MAT,VOL,KEYFLX,TITR,SUNKNO,FUNKNO, + 2 IPMACR,IPSOU,REBFLG,FLUXC,EVALRHO) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Calculation of the flux. Vectorial version. Multigroup rebalancing +* option. +* +*Copyright: +* Copyright (C) 2004 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. Le Tellier +* +*Parameters: input +* CDOOR name of the geometry/solution operator. +* IPSYS pointer to the assembly LCM object (L_PIJ signature). IPSYS is +* a list of directories. +* NPSYS index array pointing to the IPSYS list component corresponding +* to each energy group. Set to zero if a group is not to be +* processed. Usually, NPSYS(I)=I. +* IPTRK pointer to the tracking (L_TRACK signature). +* IFTRAK unit of the sequential binary tracking file. +* IMPX print flag (equal to zero for no print). +* NGRP number of energy groups. +* NMAT number of mixtures in the internal library. +* IDIR directional collision probability flag: +* =0 for pij or wij; +* =k for pijk or wijk k=1,2,3. +* direction of fundamental current for TIBERE with MoC +* (=0,1,2,3). +* NREG total number of merged blocks for which specific values +* of the neutron flux and reactions rates are required. +* NUN total number of unknowns in vectors SUNKNO and FUNKNO. +* IPHASE type of flux solution (=1: use a native flux solution door; +* =2: use collision probabilities). +* LEXAC type of exponential function calculation (=.false. to compute +* exponential functions using tables). +* MAT index-number of the mixture type assigned to each volume. +* VOL volumes. +* KEYFLX index of L-th order flux components in unknown vector. +* TITR title. +* SUNKNO input source vector. Depending on the solution technique +* used, sources may oy may not include volumes. +* FUNKNO unknown vector. +* IPMACR pointer to the macrolib LCM object. +* IPSOU pointer to the fixed source LCM object. +* REBFLG ACA or SCR rebalancing flag. +* FLUXC flux at the cutoff energy. +* EVALRHO dominance ratio. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSYS,IPTRK,IPMACR,IPSOU + CHARACTER CDOOR*12,TITR*72 + INTEGER NPSYS(NGRP),IFTRAK,IMPX,NGRP,NMAT,IDIR,NREG,NUN,IPHASE, + > MAT(NREG),KEYFLX(NREG) + REAL VOL(NREG) + REAL, TARGET, INTENT(IN) :: SUNKNO(NUN,NGRP) + REAL, TARGET, INTENT(INOUT) :: FUNKNO(NUN,NGRP) + LOGICAL LEXAC,REBFLG + REAL,OPTIONAL :: FLUXC(NREG) + REAL,OPTIONAL :: EVALRHO +*---- +* LOCAL VARIABLES +*---- + PARAMETER (IUNOUT=6,NSTATE=40) + INTEGER IPAR(NSTATE) + LOGICAL LBIHET + CHARACTER CNFDIR(0:3)*9 + TYPE(C_PTR) JPSOU,JPSOU1,JPSOU2 + SAVE CNFDIR +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NGIND,NBS,NBS2 + LOGICAL, ALLOCATABLE, DIMENSION(:) :: INCONV + REAL, ALLOCATABLE, DIMENSION(:) :: FGAR + REAL, POINTER, DIMENSION(:,:) :: SUNKN,SUNKNO2,FUNKNO2 + TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: JPSYS,KPSYS,KPSOU1, + 1 KPSOU2 +*---- +* DATA STATEMENTS +*---- + DATA CNFDIR /'F L U X ','C U R - X','C U R - Y','C U R - Z'/ +*---- +* RECOVER FIXED SOURCES FROM IPSOU LCM OBJECT +*---- + ALLOCATE(NBS(NGRP)) + ISBS=0 + NBS(:)=0 + JPSOU1=C_NULL_PTR + JPSOU2=C_NULL_PTR + IF(C_ASSOCIATED(IPSOU)) THEN + CALL LCMLEN(IPSOU,'NBS',ILEN,ITYLCM) + IF(ILEN.GT.0) THEN + ISBS=1 + CALL LCMGET(IPSOU,'NBS',NBS) + JPSOU=LCMGID(IPSOU,'BS') + JPSOU1=JPSOU + JPSOU=LCMGID(IPSOU,'BSINFO') + JPSOU2=JPSOU + IF(.NOT.C_ASSOCIATED(JPSOU1)) THEN + CALL LCMLIB(IPSOU) + CALL XABORT('DOORFV: BS DIRECTORY IS MISSING.') + ELSE IF(.NOT.C_ASSOCIATED(JPSOU2)) THEN + CALL LCMLIB(IPSOU) + CALL XABORT('DOORFV: BSINFO DIRECTORY IS MISSING.') + ENDIF + ENDIF + ENDIF +*---- +* GATHER INITIAL FLUXES AND SOURCES FOR PARALLEL PROCESSING +*---- + NGEFF=0 + JJ=0 + IIG=0 + DO IG=1,NGRP + IF(NPSYS(IG).NE.0) THEN + NGEFF=NGEFF+1 + IIG=IG + ENDIF + ENDDO + IF(NGEFF.EQ.0) RETURN + ALLOCATE(NGIND(NGEFF),JPSYS(NGEFF),NBS2(NGEFF),KPSOU1(NGEFF), + 1 KPSOU2(NGEFF)) + NBS2(:)=0 + KPSOU1(:)=C_NULL_PTR + KPSOU2(:)=C_NULL_PTR + IF(NGEFF.EQ.1) THEN + NGIND(1)=IIG + SUNKNO2=>SUNKNO(1:NUN,IIG:IIG) + FUNKNO2=>FUNKNO(1:NUN,IIG:IIG) + IF(ISBS.EQ.1) NBS2(1)=NBS(IIG) + JPSYS(1)=LCMGIL(IPSYS,NPSYS(IIG)) + IF(NBS2(1).NE.0) THEN + KPSOU1(1)=LCMGIL(JPSOU1,IIG) + KPSOU2(1)=LCMGIL(JPSOU2,IIG) + ENDIF + ELSE IF(NGEFF.EQ.NGRP) THEN + SUNKNO2=>SUNKNO + FUNKNO2=>FUNKNO + IF(ISBS.EQ.1) NBS2(:)=NBS(:) + DO IG=1,NGRP + NGIND(IG)=IG + JPSYS(IG)=LCMGIL(IPSYS,NPSYS(IG)) + IF(NBS2(IG).NE.0) THEN + KPSOU1(IG)=LCMGIL(JPSOU1,IG) + KPSOU2(IG)=LCMGIL(JPSOU2,IG) + ENDIF + ENDDO + ELSE + ALLOCATE(SUNKNO2(NUN,NGEFF),FUNKNO2(NUN,NGEFF)) + JJ=0 + DO IG=1,NGRP + IF(NPSYS(IG).NE.0) THEN + JJ=JJ+1 + NGIND(JJ)=IG + SUNKNO2(:NUN,JJ)=SUNKNO(:NUN,IG) + FUNKNO2(:NUN,JJ)=FUNKNO(:NUN,IG) + IF(ISBS.EQ.1) NBS2(JJ)=NBS(IG) + JPSYS(JJ)=LCMGIL(IPSYS,NPSYS(IG)) + IF(NBS2(JJ).NE.0) THEN + KPSOU1(JJ)=LCMGIL(JPSOU1,IG) + KPSOU2(JJ)=LCMGIL(JPSOU2,IG) + ENDIF + ENDIF + ENDDO + ENDIF +* + IF(IMPX.GT.3) THEN + WRITE(IUNOUT,'(//11H DOORFV: **,A,3H** ,A72)') CDOOR,TITR + ALLOCATE(FGAR(NREG)) + DO II=1,NGEFF + FGAR(:NREG)=0.0 + DO I=1,NREG + IF(KEYFLX(I).NE.0) FGAR(I)=SUNKNO(KEYFLX(I),II) + ENDDO + WRITE(IUNOUT,'(/33H N E U T R O N S O U R C E S (,I5, + 1 3H ):,4X,A9)') NGIND(II),CNFDIR(IDIR) + WRITE(IUNOUT,'(1P,6(5X,E15.7))') (FGAR(I),I=1,NREG) + ENDDO + DEALLOCATE(FGAR) + ENDIF +*--- +* RECOVER FLUXES FROM A PREVIOUS SELF-SHIELDING CALCULATION IF AVAILABLE +*--- + DO JJ=1,NGEFF + CALL LCMLEN(JPSYS(JJ),'FUNKNO$USS',ILENG,ITYLCM) + IF(ILENG.EQ.NUN) THEN + CALL LCMGET(JPSYS(JJ),'FUNKNO$USS',FUNKNO2(1,JJ)) + ENDIF + ENDDO +*---- +* RECOVER STATE VECTOR INFORMATION +*---- + CALL LCMGET(IPTRK,'STATE-VECTOR',IPAR) + LBIHET=IPAR(40).NE.0 + IF(NREG.NE.IPAR(1)) CALL XABORT('DOORFV: INVALID NREG ON LCM.') +*---- +* DOUBLE HETEROGENEITY TREATMENT. REDEFINE THE SOURCE. +*---- + NMATG=0 + NREGG=0 + IF(LBIHET) THEN + ALLOCATE(SUNKN(NUN,NGEFF)) + NMATG=NMAT + NREGG=NREG + DO II=1,NGEFF + SUNKN(:NUN,II)=SUNKNO2(:NUN,II) + IF(CDOOR.EQ.'MCCG') THEN + CALL DOORFB2(JPSYS(II),IPTRK,IMPX,NMAT,NREG,NUN,KEYFLX, + 1 NMAT2,NREG2,SUNKNO2(1,II)) + ELSE + CALL DOORFB2(JPSYS(II),IPTRK,IMPX,NMAT,NREG,NUN,KEYFLX, + 1 NMAT2,NREG2,SUNKNO2(1,II)) + ENDIF + ENDDO + NMAT=NMAT2 + NREG=NREG2 + ELSE + ALLOCATE(SUNKN(1,1)) + ENDIF +*--- +* RECOVER POINTERS TO EACH GROUP PROPERTIES +*--- + ALLOCATE(KPSYS(NGEFF)) + DO II=1,NGEFF + IF(LBIHET) THEN + KPSYS(II)=LCMGID(JPSYS(II),'BIHET') + ELSE + KPSYS(II)=JPSYS(II) + ENDIF + ENDDO +*---- +* COMPUTE NEW FLUXES +*---- + IF(IPHASE.EQ.1) THEN +* USE A NATIVE DOOR + IF ((CDOOR.EQ.'EXCELL').AND.(IPAR(7).EQ.5)) THEN + CALL MUSF(KPSYS,IPTRK,IMPX,NGEFF,NGIND,IDIR,NREG,NUN,MAT, + > VOL,FUNKNO2,SUNKNO2,TITR) + ELSE IF(CDOOR.EQ.'SYBIL') THEN + CALL SYBILF(KPSYS,IPTRK,IFTRAK,IMPX,NGEFF,NGIND,IDIR,NREG, + > NUN,MAT,VOL,FUNKNO2,SUNKNO2,TITR) + ELSE IF(CDOOR.EQ.'BIVAC') THEN + NLF=IPAR(14) + IF(NLF.EQ.0) THEN + CALL BIVAF(KPSYS,IPTRK,IFTRAK,IMPX,NGEFF,NGIND,IDIR,NREG, + > NUN,MAT,VOL,KEYFLX,FUNKNO2,SUNKNO2,TITR) + ELSE + IF(IDIR.NE.0) CALL XABORT('DOORFV: EXPECTING IDIR=0') + IF(IFTRAK.NE.0) CALL XABORT('DOORFV: EXPECTING IFTRAK=0') + ALLOCATE(INCONV(NGEFF)) + INCONV(:NGEFF)=.TRUE. + MAXIT=20 + CALL PNFLV(KPSYS,INCONV,NGIND,IPTRK,IMPX,MAXIT,NGEFF, + > NREG,NMAT,NUN,MAT,VOL,KEYFLX,FUNKNO2,SUNKNO2) + DEALLOCATE(INCONV) + ENDIF + ELSE IF(CDOOR.EQ.'TRIVAC') THEN + IF(IDIR.NE.0) CALL XABORT('DOORFV: EXPECTING IDIR=0') + IF(IFTRAK.NE.0) CALL XABORT('DOORFV: EXPECTING IFTRAK=0') + ALLOCATE(INCONV(NGEFF)) + INCONV(:NGEFF)=.TRUE. + MAXIT=20 + CALL TRIFLV(KPSYS,INCONV,NGIND,IPTRK,IMPX,MAXIT,NGEFF,NREG, + > NUN,KEYFLX,FUNKNO2,SUNKNO2) + DEALLOCATE(INCONV) + ELSE IF(CDOOR.EQ.'SN') THEN + CALL SNF(KPSYS,IPTRK,IFTRAK,IMPX,NGEFF,NGIND,IDIR,NREG, + > NMAT,NUN,MAT,VOL,KEYFLX,FUNKNO2,SUNKNO2,TITR,NBS2, + > KPSOU1,KPSOU2,FLUXC,EVALRHO) + ELSE IF(CDOOR.EQ.'MCCG') THEN + CALL MCCGF(KPSYS,IPTRK,IFTRAK,IPMACR,IMPX,NGRP,NGEFF,NGIND, + > IDIR,NREG,NMAT,NUN,LEXAC,MAT,VOL,KEYFLX,FUNKNO2, + > SUNKNO2,TITR,REBFLG) + ENDIF + ELSE IF(IPHASE.EQ.2) THEN + CALL TRFICF(KPSYS,IFTRAK,IMPX,NGEFF,NGIND,IDIR,NREG,NUN,MAT, + > VOL,KEYFLX,FUNKNO2,SUNKNO2,TITR) + ENDIF +*---- +* DOUBLE HETEROGENEITY TREATMENT +*---- + IF(LBIHET) THEN + NMAT=NMATG + NREG=NREGG + DO II=1,NGEFF + SUNKNO2(:NUN,II)=SUNKN(:NUN,II) + CALL DOORFB3(JPSYS(II),IPTRK,IMPX,NMAT,NREG,NUN,KEYFLX, + 1 SUNKNO2(1,II),FUNKNO2(1,II)) + ENDDO + ENDIF + DEALLOCATE(SUNKN) +* + IF(IMPX.GT.3) THEN + ALLOCATE(FGAR(NREG)) + DO II=1,NGEFF + FGAR(:NREG)=0.0 + DO I=1,NREG + IF(KEYFLX(I).NE.0) FGAR(I)=FUNKNO(KEYFLX(I),II) + ENDDO + IF(IMPX.GT.4) THEN + WRITE(IUNOUT,'(/31H U N K N O W N F L U X E S (,I5, + 1 3H ):,6X,A9)') NGIND(II),CNFDIR(IDIR) + WRITE(IUNOUT,300) (FUNKNO2(I,II),I=1,NUN) + ELSE + WRITE(IUNOUT,'(/31H N E U T R O N F L U X E S (,I5, + 1 3H ):,6X,A9)') NGIND(II),CNFDIR(IDIR) + WRITE(IUNOUT,300) (FGAR(I),I=1,NREG) + ENDIF + ENDDO + DEALLOCATE(FGAR) + ENDIF +*---- +* SCATTER NEW FLUXES +*---- + DO JJ=1,NGEFF + FUNKNO(:NUN,NGIND(JJ))=FUNKNO2(:NUN,JJ) + ENDDO + IF((NGEFF.GT.1).AND.(NGEFF.LT.NGRP)) DEALLOCATE(FUNKNO2,SUNKNO2) + DEALLOCATE(KPSYS,JPSYS,NGIND,NBS) + RETURN + 300 FORMAT(1P,6(5X,E15.7)) + END |
