summaryrefslogtreecommitdiff
path: root/Dragon/src/FLU2DR.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/FLU2DR.f')
-rw-r--r--Dragon/src/FLU2DR.f1284
1 files changed, 1284 insertions, 0 deletions
diff --git a/Dragon/src/FLU2DR.f b/Dragon/src/FLU2DR.f
new file mode 100644
index 0000000..37ac316
--- /dev/null
+++ b/Dragon/src/FLU2DR.f
@@ -0,0 +1,1284 @@
+*DECK FLU2DR
+ SUBROUTINE FLU2DR(IPRT,IPMACR,IPFLUX,IPSYS,IPTRK,IPFLUP,IPSOU,
+ 1 IGPT,IFTRAK,CXDOOR,TITLE,NUNKNO,NREG,NSOUT,NANIS,NLF,NLIN,NFUNL,
+ 2 NGRP,NMAT,NIFIS,LFORW,LEAKSW,MAXINR,EPSINR,MAXOUT,EPSUNK,EPSOUT,
+ 3 NCPTL,NCPTA,ITYPEC,IPHASE,ITPIJ,ILEAK,OPTION,REFKEF,MATCOD,
+ 4 KEYFLX,VOL,XSTRC,XSDIA,XSNUF,XSCHI,LREBAL,INITFL,NMERG,IMERG)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Fixed source problem or inverse power method for K-effective or
+* buckling iteration. Perform thermal iterations.
+*
+*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.
+* IPMACR pointer to the macrolib LCM object.
+* IPFLUX pointer to the flux LCM object.
+* IPSYS pointer to the system LCM object.
+* IPTRK pointer to the tracking LCM object.
+* IPFLUP pointer to the unperturbed flux LCM object (if ITYPEC=1).
+* IPSOU pointer to the fixed source LCM object (if ITYPEC=0 or 1).
+* IGPT index of the fixed source eigenvalue problem to solve.
+* IFTRAK tracking file unit number.
+* CXDOOR character name of the flux solution door.
+* TITLE title.
+* NUNKNO number of unknowns per energy group including spherical
+* harmonic terms, interface currents and fundamental
+* currents.
+* NREG number of regions.
+* NSOUT number of outer surfaces.
+* NANIS maximum cross section Legendre order in object IPMACR.
+* NLF number of Legendre orders for the flux.
+* NLIN number of polynomial components in flux spatial expansion.
+* NFUNL number of spherical harmonics components.
+* NGRP number of energy groups.
+* NMAT number of mixtures in the macrolib.
+* NIFIS number of fissile isotopes.
+* LFORW flag set to .false. to solve an adjoint problem.
+* LEAKSW leakage flag (=.true. if leakage is present on the outer
+* surface).
+* 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.
+* NCPTL number of free iterations in an acceleration cycle.
+* NCPTA number of accelerated iterations in an acceleration cycle.
+* ITYPEC type of flux evaluation:
+* =-2 Fourier analysis;
+* =-1 skip the flux calculation;
+* =0 fixed sources;
+* =1 fixed source eigenvalue problem (GPT type);
+* =2 fission sources/k effective convergence;
+* =3 fission sources/k effective convergence/
+* db2 buckling evaluation;
+* =4 fission sources/db2 buckling convergence;
+* =5 b2 sources/db2 buckling convergence.
+* IPHASE type of flux solution door (1 for asm 2 for pij).
+* ITPIJ type of cp available:
+* =1 scatt mod pij (wij);
+* =2 stand. pij;
+* =3 scatt mod pij+pijk (wij,wijk);
+* =4 standard pij+pijk.
+* 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.
+* 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).
+* REFKEF target effective multiplication factor.
+* MATCOD mixture indices.
+* KEYFLX index of L-th order flux components in unknown vector.
+* VOL volumes.
+* XSTRC transport-corrected macroscopic total cross sections.
+* XSDIA transport-corrected macroscopic within-group scattering cross
+* sections.
+* XSNUF nu*macroscopic fission cross sections.
+* XSCHI fission spectrum.
+* LREBAL thermal iteration rebalancing flag (=.true. if thermal
+* rebalancing required).
+* INITFL flux initialization flag (=0/1/2: uniform flux/LCM/DSA).
+* NMERG number of leakage zones.
+* IMERG leakage zone index in each material mixture zone.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* INTERNAL PARAMETERS:
+* SYBILF : SYBIL FLUX SOLUTION DOOR EXT ROUTINE
+* TRFICF : DEFAULT CP FLUX SOLUTION DOOR EXT ROUTINE
+* BIVAF : DEFAULT 2D DIFFUSION FLUX SOLUTION DOOR EXT ROUTINE
+* TRIVAF : DEFAULT 3D DIFFUSION FLUX SOLUTION DOOR EXT ROUTINE
+* PNF : DEFAULT PN/SPN FLUX SOLUTION DOOR EXT ROUTINE
+* SNF : DEFAULT SN FLUX SOLUTION DOOR EXT ROUTINE
+*----
+*
+ USE GANLIB
+ USE DOORS_MOD
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPMACR,IPFLUX,IPSYS,IPTRK,IPFLUP,IPSOU
+ INTEGER IPRT,IGPT,IFTRAK,NUNKNO,NREG,NSOUT,NANIS,NLF,NLIN,NFUNL,
+ 1 NGRP,NMAT,NIFIS,MAXINR,MAXOUT,NCPTL,NCPTA,ITYPEC,IPHASE,ITPIJ,
+ 2 ILEAK,MATCOD(NREG),KEYFLX(NREG,NLIN,NFUNL),INITFL,NMERG,
+ 3 IMERG(NMAT)
+ REAL EPSINR,EPSUNK,EPSOUT,VOL(NREG),XSTRC(0:NMAT,NGRP),
+ 1 XSDIA(0:NMAT,0:NANIS,NGRP),XSNUF(0:NMAT,NIFIS,NGRP),
+ 2 XSCHI(0:NMAT,NIFIS,NGRP)
+ CHARACTER CXDOOR*12,TITLE*72,OPTION*4,HLEAK*6
+ LOGICAL LFORW,LEAKSW,LREBAL,CFLI,CEXE
+ DOUBLE PRECISION REFKEF
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40,PI=3.141592654)
+ TYPE(C_PTR) IPREB,J1,JPSOU,JPFLUX,JPMACR,KPMACR,JPSYS,KPSYS,IPSTR,
+ 1 JPSTR,KPSTR,JPFLUP1,JPFLUP2,JPSOUR
+ INTEGER JPAR(NSTATE),KEYSPN(NREG)
+ CHARACTER CAN(0:19)*2,MESSIN*8,MESSOU*5,HTYPE(0:5)*4
+ INTEGER INDD(3)
+ DOUBLE PRECISION AKEEP(8),FISOUR,OLDBIL,AKEFF,AKEFFO,AFLNOR,
+ 1 BFLNOR,DDELN1,DDELD1,PROD,FLXIN
+ LOGICAL LSCAL,LEXAC,REBFLG
+ REAL ALBEDO(6),FLUXC(NREG),B2(4)
+*
+************************************************************************
+* *
+* ICHAR : COUNTER FOR NUM. OF OUTER ITERATIONS *
+* ICTOT : TOTAL NUMBER OF FLUX CALCULATIONS *
+* *
+************************************************************************
+*
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ,IPOS,NPSYS,KEYCUR,
+ 1 MATALB
+ REAL, ALLOCATABLE, DIMENSION(:) :: DHOM,FXSOR,XSCAT,GAMMA,V,FL,DFL
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: DIFHET,SFNU
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FLUX
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: XCSOU
+*----
+* FOR NUMERICAL FOURIER ANALYSIS
+*----
+ REAL OMEGA,XLEN,EKKK,EVALRHO,SPECR
+ REAL, ALLOCATABLE, DIMENSION(:) :: ARRAYRHO1
+ REAL, ALLOCATABLE, DIMENSION(:) :: XXX
+*----
+* DATA STATEMENTS
+*----
+ SAVE CAN,HTYPE
+ DATA CAN /'00','01','02','03','04','05','06','07','08','09',
+ > '10','11','12','13','14','15','16','17','18','19'/
+ DATA (HTYPE(JJ),JJ=0,5)/'S ','P ',2*'K ','B ','L '/
+*----
+* SCRATCH STORAGE ALLOCATION
+* DHOM homogeneous leakage coefficients.
+* DIFHET heterogeneous leakage coefficients.
+* FLUX iteration flux:
+* FLUX(:,:,1) <=old outer;
+* FLUX(:,:,2) <=present outer;
+* FLUX(:,:,3) <=new outer;
+* FLUX(:,:,4) <=source outer;
+* FLUX(:,:,5) <=old inner;
+* FLUX(:,:,6) <=present inner;
+* FLUX(:,:,7) <=new inner;
+* FLUX(:,:,8) <=source inner.
+*----
+ ALLOCATE(IJJ(0:NMAT),NJJ(0:NMAT),IPOS(0:NMAT),NPSYS(NGRP))
+ ALLOCATE(FLUX(NUNKNO,NGRP,8),XSCAT(0:NMAT*NGRP),GAMMA(NGRP),
+ 1 DHOM(NGRP),DIFHET(NMERG,NGRP),XCSOU(NGRP))
+*
+ REBFLG=.TRUE.
+ IPREB=IPMACR
+*
+ AKEEP(:8)=0.0D0
+ ICHAR=0
+ ICTOT=0
+*----
+* RECOVER INDEX FOR THE CURRENTS IN FLUX, NUMERICAL SURFACES,
+* ALBEDO IF NEEDED BY THE REBALANCING.
+*----
+ ICREB=0
+ NNN=0
+ INSB=0
+ IBFP=0
+ NDIM=0
+ NFOU=0
+ LX=0
+ ITYPE=0
+ IF(CXDOOR.EQ.'MCCG') THEN
+ CALL LCMGET(IPTRK,'STATE-VECTOR',JPAR)
+ NANIS_TRK=JPAR(6)
+ NDIM=JPAR(16)
+ INSB=JPAR(22)
+ CALL LCMLEN(IPTRK,'KEYCUR$MCCG',ICREB,ITYLCM)
+ IF(ICREB.GT.0) THEN
+ CALL LCMLEN(IPTRK,'NZON$MCCG',ILONG,ITYLCM)
+ NNN=ILONG-ICREB
+ ALLOCATE(KEYCUR(NSOUT),V(ILONG),MATALB(ILONG))
+ CALL LCMGET(IPTRK,'KEYCUR$MCCG',KEYCUR)
+ CALL LCMGET(IPTRK,'V$MCCG',V)
+ CALL LCMGET(IPTRK,'ALBEDO',ALBEDO)
+ CALL LCMGET(IPTRK,'NZON$MCCG',MATALB)
+ ENDIF
+ ELSE IF(CXDOOR.EQ.'SN') THEN
+ CALL LCMGET(IPTRK,'STATE-VECTOR',JPAR)
+ ITYPE=JPAR(6)
+ NDIM=JPAR(9)
+ LX=JPAR(12)
+ LY=JPAR(13)
+ INSB=JPAR(27)
+ IBFP=JPAR(31)
+ NFOU=JPAR(34)
+ ENDIF
+*----
+* SELECT THE CALCULATION DOORS FOR WHICH A GROUP-BY-GROUP SCALAR
+* PROCEDURE WILL BE USED. A VECTORIAL APPROACH WILL BE USED WITH
+* OTHER DOORS. LSCAL is true for CXDOOR = 'TRAFIC'.
+*----
+ LSCAL=(INSB.EQ.0)
+*
+ CALL KDRCPU(CPU0)
+ IF(ILEAK.LT.6) THEN
+ INORM=1
+ ELSE IF(ILEAK.EQ.6) THEN
+ INORM=2 ! Ecco
+ ELSE IF(ILEAK.GE.7) THEN
+ INORM=3 ! Tibere
+ ENDIF
+ LEXAC=.FALSE.
+ AKEEP(5)=1.0D0
+ AKEEP(6)=1.0D0
+ AKEEP(7)=1.0D0
+ DIFHET(:NMERG,:NGRP)=0.0
+ GAMMA(:NGRP)=1.0
+*----
+* EXTERNAL FLUX(:,:,2) INITIALISATION AND FIXED-EXTERNAL SOURCE IN
+* FLUX(:,:,4)
+*----
+ IF(ITYPEC.GE.3) THEN
+ CALL LCMGET(IPFLUX,'B2 B1HOM',B2(4))
+ IF(ILEAK.GE.7) CALL LCMGET(IPFLUX,'B2 HETE',B2)
+ ELSE
+ B2(:4)=0.0
+ ENDIF
+ AKEFFO=0.0D0
+ IF(LFORW) THEN
+ IF(ITYPEC.EQ.1) THEN
+ J1=LCMGID(IPSOU,'DSOUR')
+ JPSOU=LCMGIL(J1,IGPT)
+ J1=LCMGID(IPFLUX,'DFLUX')
+ JPFLUX=LCMGIL(J1,IGPT)
+ ELSE
+ IF(C_ASSOCIATED(IPSOU)) THEN
+ J1=LCMGID(IPSOU,'DSOUR')
+ JPSOU=LCMGIL(J1,1)
+ ENDIF
+ JPFLUX=LCMGID(IPFLUX,'FLUX')
+ JPSOUR=LCMLID(IPFLUX,'SOUR',NGRP)
+ ENDIF
+ ELSE
+ IF(ITYPEC.EQ.1) THEN
+ J1=LCMGID(IPSOU,'ASOUR')
+ JPSOU=LCMGIL(J1,IGPT)
+ J1=LCMGID(IPFLUX,'ADFLUX')
+ JPFLUX=LCMGIL(J1,IGPT)
+ ELSE
+ IF(C_ASSOCIATED(IPSOU)) THEN
+ J1=LCMGID(IPSOU,'ASOUR')
+ JPSOU=LCMGIL(J1,1)
+ ENDIF
+ JPFLUX=LCMGID(IPFLUX,'AFLUX')
+ JPSOUR=LCMLID(IPFLUX,'SOUR',NGRP)
+ ENDIF
+ ENDIF
+ ALLOCATE(FXSOR(0:NMAT))
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ DO 20 IG=1,NGRP
+ FLUX(:NUNKNO,IG,2)=0.0
+ FLUX(:NUNKNO,IG,4)=0.0
+ CALL LCMLEL(JPFLUX,1,ILINIT,ITYLCM)
+ IF(LFORW) THEN
+ CALL LCMGDL(JPFLUX,IG,FLUX(1,IG,2))
+ ELSE
+ CALL LCMGDL(JPFLUX,NGRP-IG+1,FLUX(1,IG,2))
+ ENDIF
+*
+ IF(((ITYPEC.EQ.0).OR.(ITYPEC.EQ.-2)).AND.
+ 1 (.NOT.C_ASSOCIATED(IPSOU))) THEN
+ KPMACR=LCMGIL(JPMACR,IG)
+ FXSOR(0)=0.0
+ CALL LCMGET(KPMACR,'FIXE',FXSOR(1))
+ CALL DOORS(CXDOOR,IPTRK,NMAT,0,NUNKNO,FXSOR,
+ > FLUX(1,IG,4))
+ ELSE IF(((ITYPEC.EQ.0).OR.(ITYPEC.EQ.1).OR.(ITYPEC.EQ.-2))
+ 1 .AND.C_ASSOCIATED(IPSOU))THEN
+ IF(LFORW) THEN
+ CALL LCMGDL(JPSOU,IG,FLUX(1,IG,4))
+ ELSE
+ CALL LCMGDL(JPSOU,NGRP-IG+1,FLUX(1,IG,4))
+ ENDIF
+ ENDIF
+ 20 CONTINUE
+ DEALLOCATE(FXSOR)
+*-------
+* IF IMPORTED FLUX PRESENT FOR SN, REORDER FLUX.
+*-------
+ IF((CXDOOR.EQ.'SN').AND.(INITFL.EQ.2)) THEN
+ CALL LCMLEN(IPFLUX,'KEYFLX',ILINIT,ITYLCM)
+ IF(ILINIT.NE.NREG) THEN
+ WRITE(*,*) NREG, ILINIT
+ CALL XABORT('FLU2DR: NUMBER OF REGIONS FROM SPN CALCULATION'
+ 1 //' (OBTAINED FROM LENGTH OF KEYFLX) DOES NOT MATCH NUMBER '
+ 2 //'OF REGIONS IN SN CALCULATION. CHECK INPUT FILE FOR '
+ 3 //'POTENTIAL ERRORS.')
+ ENDIF
+ KEYSPN(:) = 0
+ CALL LCMGET(IPFLUX,'KEYFLX',KEYSPN)
+ DO 25 IG=1,NGRP
+ CALL SNEST(IPTRK,IPRT,NREG,NUNKNO,MATCOD,IG,KEYFLX,KEYSPN,
+ 1 FLUX(:,IG,2))
+ 25 CONTINUE
+ ENDIF
+*----
+* FOURIER ANALYSIS FLUX INITIALISATION
+*----
+ ALLOCATE(ARRAYRHO1(NFOU**NDIM))
+ ARRAYRHO1(:)=0.0
+ IFACOUNT=-1
+ 26 IFACOUNT=IFACOUNT+1
+*
+ IF(ITYPEC.EQ.-2) THEN
+ IF(NFOU.EQ.0)
+ > CALL XABORT('FLU2DR: NEED TO SPECIFY FOURIER ANALYSIS '
+ > //'KEYWORD NFOU IN TRACKING, AS WELL AS NUMBER OF '
+ > //'FREQUENCIES TO INVESTIGATE.')
+ IF(CXDOOR.NE.'SN')
+ > CALL XABORT('FLU2DR: FOURIER ANALYSIS ONLY MEANT FOR SN')
+ IF(NGRP.NE.1)
+ > CALL XABORT('FLU2DR: FOURIER ANALYSIS NOT MEANT FOR MULTI-'
+ > //'GROUP PROBLEMS. CONSIDER ADDING THAT FUNCTIONALITY. ')
+ IGR=1
+
+ FLUX(:,:,:) = 0.0
+
+ SUMXSTRC=0.0
+ DO IR=1,NREG
+ SUMXSTRC = SUMXSTRC + XSTRC(MATCOD(IR),1)
+ ENDDO
+ AVXSTRC = (SUMXSTRC/NREG)
+
+ ALLOCATE(XXX(LX+1))
+ CALL LCMGET(IPTRK,'XXX',XXX)
+ CALL LCMGET(IPTRK,'XLEN',XLEN)
+
+ OMEGA = (2*PI)/(XLEN*AVXSTRC)
+ EKKK =(REAL(IFACOUNT)/NFOU)
+
+ IF(ITYPE.EQ.2)THEN
+ PARTX=0.0
+ DO IX=1,LX
+ PARTX = XXX(IX) + ((XXX(IX+1)-XXX(IX))/2)
+ IND=KEYFLX(IX,1,1)
+ IF(IND.GT.0)
+ > FLUX(IND,IGR,2) = COS(EKKK*OMEGA*AVXSTRC*PARTX)
+ ENDDO
+ ELSE
+ CALL XABORT('FLU2DR: FOURIER ANALYSIS FOR GEOMETRIES OTHER '
+ > //'THAN CARTESIAN 1D NOT AVAILABLE.')
+ ENDIF
+ DEALLOCATE(XXX)
+ ENDIF
+*----
+* COMPUTE FIRST K-EFFECTIVE
+*----
+ IF((ITYPEC.EQ.0).OR.(ITYPEC.EQ.5).OR.(ITYPEC.EQ.-2)) THEN
+ AKEFFO=1.0D0
+ AKEFF=1.0D0
+ AFLNOR=1.0D0
+ ELSE IF(ITYPEC.EQ.1) THEN
+ CALL LCMGET(IPFLUP,'STATE-VECTOR',JPAR)
+ IF(JPAR(6).GE.2) THEN
+ CALL LCMGET(IPFLUP,'K-EFFECTIVE',RKEFF)
+ CALL LCMGET(IPFLUP,'K-INFINITY',CUREIN)
+ ENDIF
+ AKEFF=RKEFF
+ IF(JPAR(6).GE.3) THEN
+ B2(:4)=0.0
+ CALL LCMGET(IPFLUP,'B2 B1HOM',B2(4))
+ ENDIF
+ IF((JPAR(6).GT.2).AND.(JPAR(7).GE.6)) THEN
+ CALL LCMGET(IPFLUP,'B2 HETE',B2)
+ ENDIF
+ IF((JPAR(6).GT.2).AND.(JPAR(7).GE.5)) THEN
+ CALL LCMGET(IPFLUP,'GAMMA',GAMMA)
+ ENDIF
+ AKEFFO=AKEFF
+ AKEEP(2)=AKEFF
+ AFLNOR=1.0D0/RKEFF
+ ELSE
+ OLDBIL=0.0D0
+ CALL FLUKEF(IPRT,IPMACR,NGRP,NREG,NUNKNO,NMAT,NIFIS,NANIS,
+ 1 MATCOD(1),VOL,KEYFLX(1,1,1),XSTRC,XSDIA,XSNUF,XSCHI,NMERG,
+ 2 IMERG,DIFHET,FLUX(1,1,2),B2,ILEAK,LEAKSW,OLDBIL,AKEFF,AFLNOR)
+ AKEFFO=AKEFF
+ AKEEP(2)=AKEFF
+ ENDIF
+ B2VALO=B2(4)
+*
+ NCTOT=NCPTA+NCPTL
+ IF(NCPTA.EQ.0) THEN
+ NCPTM=NCTOT+1
+ ELSE
+ NCPTM=NCPTL
+ ENDIF
+ MESSOU=' '
+ IF(IPRT.GT.0) WRITE(6,1090) 0,1.0,EPSOUT,AKEFFO,B2(4)
+*----
+* CALCULATION OF THE INITIAL LEAKAGE COEFFICIENTS
+*----
+ IF(ITYPEC.GT.2) THEN
+ DIFHET(:NMERG,:NGRP)=0.0
+ IF(OPTION.EQ.'LKRD') THEN
+ CALL LCMGET(IPMACR,'STATE-VECTOR',JPAR)
+ IF(JPAR(2).NE.NMAT) THEN
+ CALL XABORT('FLU2DR: INVALID NMAT IN THE MACROLIB.')
+ ELSE IF(JPAR(9).NE.1) THEN
+ CALL XABORT('FLU2DR: INVALID LEAKAGE IN THE MACROLIB.')
+ ENDIF
+ ALLOCATE(FL(NMAT),DFL(NMAT))
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ DO IG=1,NGRP
+ KPMACR=LCMGIL(JPMACR,IG)
+ CALL LCMLEN(KPMACR,'DIFF',ILONG,ITYLCM)
+ IF(ILONG.EQ.0) CALL XABORT('FLU2DR: UNABLE TO RECOVER T'
+ > //'HE DIFF RECORD IN THE MACROLIB OBJECT.')
+ IF(NMERG.EQ.NMAT) THEN
+ CALL LCMGET(KPMACR,'DIFF',DIFHET(1,IG))
+ ELSE
+ CALL LCMGET(KPMACR,'DIFF',DFL)
+ CALL LCMGET(KPMACR,'FLUX-INTG',FL)
+ DO INM=1,NMERG
+ DDELN1=0.D0
+ DDELD1=0.D0
+ DO IBM=1,NMAT
+ IF(IMERG(IBM).EQ.INM) THEN
+ DDELN1=DDELN1+FL(IBM)/DFL(IBM)
+ DDELD1=DDELD1+FL(IBM)
+ ENDIF
+ ENDDO
+ IF(DDELN1.EQ.0.D0) CALL XABORT('FLU2DR: DDELN1=0.')
+ DIFHET(INM,IG)=REAL(DDELD1/DDELN1)
+ ENDDO
+ ENDIF
+ ENDDO
+ DEALLOCATE(DFL,FL)
+ GAMMA(:NGRP)=1.0
+ ELSE IF(OPTION.EQ.'RHS') THEN
+ CALL LCMLEN(IPFLUX,'DIFFHET',ILONG,ITYLCM)
+ IF(ILONG.EQ.NMERG*NGRP) THEN
+ IF(LFORW) THEN
+ CALL LCMGET(IPFLUX,'DIFFHET',DIFHET)
+ ELSE
+* Permute the diffusion coefficients if the LKRD option
+* is set for an adjoint calculation
+ CALL LCMGET(IPFLUX,'DIFFHET',DIFHET)
+ DO INM=1,NMERG
+ GAMMA(:NGRP)=DIFHET(INM,:NGRP)
+ DO IG=1,NGRP
+ DIFHET(INM,IG)=GAMMA(NGRP-IG+1)
+ ENDDO
+ ENDDO
+ ENDIF
+ ELSE
+ CALL XABORT('FLU2DR: UNABLE TO RECOVER THE DIFFHET RECO'
+ > //'RD IN THE FLUX OBJECT.(1)')
+ ENDIF
+ GAMMA(:NGRP)=1.0
+ ELSE IF((LEAKSW).OR.(ILEAK.EQ.5)) THEN
+* Todorova heterogeneous leakage model.
+ CALL FLULPN(IPMACR,NUNKNO,OPTION,'DIFF',NGRP,NREG,NMAT,
+ 1 VOL,MATCOD,NMERG,IMERG,KEYFLX(1,1,1),FLUX(1,1,2),B2(4),
+ 2 IPRT,DIFHET,DHOM)
+ GAMMA(:NGRP)=1.0
+ ELSE
+* FUNDAMENTAL MODE CONDITION.
+ IF(NMERG.NE.1) CALL XABORT('FLU2DR: ONE LEAKAGE ZONE EXPEC'
+ 1 //'TED.(1)')
+ CALL B1HOM(IPMACR,LEAKSW,NUNKNO,OPTION,'DIFF',NGRP,NREG,
+ 1 NMAT,NIFIS,VOL,MATCOD,KEYFLX(1,1,1),FLUX(1,1,2),REFKEF,
+ 2 IPRT,DIFHET(1,1),GAMMA,AKEFF,INORM,B2)
+ ENDIF
+ CALL LCMPUT(IPFLUX,'B2 B1HOM',1,2,B2(4))
+ CALL LCMPUT(IPFLUX,'DIFFHET',NMERG*NGRP,2,DIFHET)
+ ENDIF
+*
+**** OUTER LOOP ******************************************
+ IGDEB=1
+ CFLI=.FALSE.
+ CEXE=.FALSE.
+ DO 400 IT=1,MAXOUT
+ CALL KDRCPU(CPU1)
+ MESSIN=' '
+*----
+* FISSION SOURCE CALCULATION IN FLUX(:,:,4)
+*----
+ IF(((ITYPEC.EQ.0).OR.(ITYPEC.EQ.-2))
+ 1 .AND.(.NOT.C_ASSOCIATED(IPSOU))) THEN
+ ALLOCATE(FXSOR(0:NMAT))
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ FLUX(:NUNKNO,:NGRP,4)=0.0
+ DO IG=1,NGRP
+ KPMACR=LCMGIL(JPMACR,IG)
+ FXSOR(0)=0.0
+ CALL LCMGET(KPMACR,'FIXE',FXSOR(1))
+ CALL DOORS(CXDOOR,IPTRK,NMAT,0,NUNKNO,FXSOR,
+ > FLUX(1,IG,4))
+ ENDDO
+ DEALLOCATE(FXSOR)
+ ELSE IF((ITYPEC.EQ.0).OR.(ITYPEC.EQ.-2)) THEN
+ DO IG=1,NGRP
+ IF(LFORW) THEN
+ CALL LCMGDL(JPSOU,IG,FLUX(1,IG,4))
+ ELSE
+ CALL LCMGDL(JPSOU,NGRP-IG+1,FLUX(1,IG,4))
+ ENDIF
+ ENDDO
+ ELSE IF(ITYPEC.EQ.1) THEN
+ DO IG=1,NGRP
+ IF(LFORW) THEN
+ CALL LCMGDL(JPSOU,IG,FLUX(1,IG,4))
+ ELSE
+ CALL LCMGDL(JPSOU,NGRP-IG+1,FLUX(1,IG,4))
+ ENDIF
+ DO IUN=1,NUNKNO
+ FLUX(IUN,IG,4)=-FLUX(IUN,IG,4)
+ ENDDO
+ ENDDO
+ ELSE
+ FLUX(:NUNKNO,:NGRP,4)=0.0
+ ENDIF
+ IF(NIFIS.GT.0) THEN
+ IF(CXDOOR.EQ.'BIVAC') THEN
+ CALL BIVFIS(IPTRK,NREG,NMAT,NIFIS,NUNKNO,NGRP,MATCOD,VOL,
+ > XSCHI,XSNUF,FLUX(1,1,2),FLUX(1,1,4))
+ ELSE IF(CXDOOR.EQ.'TRIVAC') THEN
+ CALL TRIFIS(IPTRK,NREG,NMAT,NIFIS,NUNKNO,NGRP,MATCOD,VOL,
+ > XSCHI,XSNUF,FLUX(1,1,2),FLUX(1,1,4))
+ ELSE
+ ALLOCATE(FXSOR(NUNKNO))
+ DO IS=1,NIFIS
+ FXSOR(:NUNKNO)=0.0
+ DO IG=1,NGRP
+ CALL DOORS(CXDOOR,IPTRK,NMAT,0,NUNKNO,XSNUF(0,IS,IG),
+ > FXSOR,FLUX(1,IG,2))
+ ENDDO
+ DO IR=1,NREG
+ IBM=MATCOD(IR)
+ IF(IBM.EQ.0) CYCLE
+ DO IE=1,NLIN
+ IND=KEYFLX(IR,IE,1)
+ IF(IND.EQ.0) CYCLE
+ DO IG=1,NGRP
+ FLUX(IND,IG,4)=FLUX(IND,IG,4)+XSCHI(IBM,IS,IG)*
+ > FXSOR(IND)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO ! IS
+ DEALLOCATE(FXSOR)
+ ENDIF
+ FLUX(:NUNKNO,:NGRP,4)=FLUX(:NUNKNO,:NGRP,4)*REAL(AFLNOR)
+ ENDIF
+*----
+* VOLUME-INTEGRATED SOURCE CALCULATION FOR USE IN NEUTRON BALANCE
+*----
+ DO IG=1,NGRP
+ XCSOU(IG)=0.0D0
+ DO IR=1,NREG
+ IND=KEYFLX(IR,1,1)
+ IF((CXDOOR.EQ.'BIVAC').OR.(CXDOOR.EQ.'TRIVAC')) THEN
+ ! volumes are already included in the sources
+ IF(IND.GT.0) XCSOU(IG)=XCSOU(IG)+FLUX(IND,IG,4)
+ ELSE
+ IF(IND.GT.0) XCSOU(IG)=XCSOU(IG)+FLUX(IND,IG,4)*VOL(IR)
+ ENDIF
+ ENDDO
+ ENDDO
+ ISBS=-1
+ IF(C_ASSOCIATED(IPSOU)) CALL LCMLEN(IPSOU,'NBS',ISBS,ITYLCM)
+*----
+* SET THE STARTING ENERGY GROUP
+*----
+ DO 40 IG=1,NGRP
+ IGDEB=IG
+ IF(XCSOU(IG).NE.0.0.OR.ISBS.NE.0) GO TO 50
+ 40 CONTINUE
+*----
+* DOWNLOAD FROM EXTERNAL FLUX(:,:,2) TO PRESENT INTERNAL FLUX(:,:,6)
+*----
+ 50 FLUX(:NUNKNO,:NGRP,6)=FLUX(:NUNKNO,:NGRP,2)
+*
+**** INNER LOOP ******************************************
+ DO 270 JT=1,MAXINR
+ FLUX(:NUNKNO,IGDEB:NGRP,7)=FLUX(:NUNKNO,IGDEB:NGRP,6)
+ FLUX(:NUNKNO,IGDEB:NGRP,8)=FLUX(:NUNKNO,IGDEB:NGRP,4)
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ DO 140 IG=IGDEB,NGRP
+*----
+* PROCESS SELF-SCATTERING REDUCTION IN INNER SOURCES.
+*----
+ IF((ITPIJ.EQ.2).OR.(ITPIJ.EQ.4)) THEN
+ IF((CXDOOR.EQ.'BIVAC').OR.(CXDOOR.EQ.'TRIVAC')) THEN
+ CALL XABORT('FLU2DR: SCATTERING REDUCTION IS MANDATORY.')
+ ENDIF
+ CALL DOORS(CXDOOR,IPTRK,NMAT,NANIS,NUNKNO,XSDIA(0,0,IG),
+ > FLUX(1,IG,8),FLUX(1,IG,7))
+ ENDIF
+ IF(ILEAK.EQ.6) THEN
+* ECCO ISOTROPIC STREAMING MODEL.
+ CCLBD=0.0
+ IF((ITPIJ.EQ.1).OR.(ITPIJ.EQ.3).AND.(OPTION.EQ.'B1'))
+ > CCLBD=1.0-GAMMA(IG)
+ DO 75 IE=1,NLIN
+ DO 70 IR=1,NREG
+ IBM=MATCOD(IR)
+ IND=NUNKNO/2+KEYFLX(IR,IE,1)
+ IF(IND.EQ.NUNKNO/2) GO TO 70
+ IF(OPTION(2:2).EQ.'1') THEN
+* B1 OR P1 CASE.
+ IF(ITPIJ.EQ.2) THEN
+ FLUX(IND,IG,8)=FLUX(IND,IG,8)+XSDIA(IBM,1,IG)*
+ > FLUX(IND,IG,7)
+ ENDIF
+ ELSE IF(ITPIJ.EQ.1) THEN
+* B0, P0, B0TR OR P0TR CASE.
+ FLUX(IND,IG,8)=FLUX(IND,IG,8)-XSDIA(IBM,1,IG)*
+ > FLUX(IND,IG,7)*GAMMA(IG)
+ ENDIF
+ FLUX(IND,IG,8)=FLUX(IND,IG,8)+CCLBD*XSDIA(IBM,1,IG)*
+ > FLUX(IND,IG,7)
+ 70 CONTINUE
+ 75 CONTINUE
+ ELSE IF(ILEAK.GE.7) THEN
+* TIBERE ANISOTROPIC STREAMING MODEL.
+ CCLBD=0.0
+ IF((ITPIJ.EQ.3).AND.(OPTION.EQ.'B1')) CCLBD=1.0-GAMMA(IG)
+ DO 86 IE=1,NLIN
+ DO 85 IR=1,NREG
+ IND0=KEYFLX(IR,IE,1)
+ IF(IND0.EQ.0) GO TO 85
+ IBM=MATCOD(IR)
+ INDD(1)=NUNKNO/4+IND0
+ INDD(2)=NUNKNO/2+IND0
+ INDD(3)=3*NUNKNO/4+IND0
+ DO 80 IDIR=1,3
+ IND=INDD(IDIR)
+ IF(OPTION(2:2).EQ.'1') THEN
+* B1 OR P1 CASE.
+ IF(ITPIJ.EQ.4) THEN
+ FLUX(IND,IG,8)=FLUX(IND,IG,8)+XSDIA(IBM,1,IG)*
+ > FLUX(IND,IG,7)
+ ENDIF
+ ELSE IF(ITPIJ.EQ.3) THEN
+* B0, P0, B0TR OR P0TR CASE.
+ FLUX(IND,IG,8)=FLUX(IND,IG,8)-XSDIA(IBM,1,IG)*
+ > FLUX(IND,IG,7)*GAMMA(IG)
+ ENDIF
+ FLUX(IND,IG,8)=FLUX(IND,IG,8)+CCLBD*XSDIA(IBM,1,IG)*
+ > FLUX(IND,IG,7)
+ 80 CONTINUE
+ 85 CONTINUE
+ 86 CONTINUE
+ ENDIF
+*----
+* COMPUTE INNER SOURCES ASSUMING SELF-SCATTERING REDUCTION.
+*----
+ IF(.NOT.LSCAL) THEN
+ KPMACR=LCMGIL(JPMACR,IG)
+ NUNK2=NUNKNO
+ IF(ILEAK.EQ.6) NUNK2=NUNKNO/2
+ IF(ILEAK.GE.7) NUNK2=NUNKNO/4
+ IF((CXDOOR.EQ.'SN').AND.(IBFP.EQ.0)) THEN
+ NUNK2=NUNKNO
+ CALL SNSOUR(NUNKNO,IG,IPTRK,KPMACR,NANIS,NREG,NMAT,NUNK2,
+ 1 NGRP,MATCOD,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE IF(CXDOOR.EQ.'SN') THEN
+ NUNK2=NUNKNO
+ IPSTR=LCMGID(IPSYS,'STREAMING')
+ JPSTR=LCMGID(IPSTR,'GROUP')
+ KPSYS=LCMGIL(JPSTR,IG)
+ CALL SNSBFP(IG,IPTRK,KPMACR,KPSYS,NANIS,NLF,NREG,NMAT,
+ 1 NUNK2,NGRP,MATCOD,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE
+ HLEAK=' '
+ CALL FLUSOU(CXDOOR,HLEAK,NUNKNO,IG,IPTRK,KPMACR,NMAT,NANIS,
+ 1 NUNK2,NGRP,FLUX(1,1,7),FLUX(1,1,8))
+ ENDIF
+ IF((ILEAK.EQ.6).AND.(OPTION(2:2).EQ.'1')) THEN
+* ECCO ISOTROPIC STREAMING MODEL.
+ HLEAK='ECCO '
+ CALL FLUSOU(CXDOOR,HLEAK,NUNKNO,IG,IPTRK,KPMACR,NMAT,NANIS,
+ 1 NUNK2,NGRP,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE IF(ILEAK.GE.7) THEN
+* TIBERE ANISOTROPIC STREAMING MODEL.
+ HLEAK='TIBERE'
+ CALL FLUSOU(CXDOOR,HLEAK,NUNKNO,IG,IPTRK,KPMACR,NMAT,NANIS,
+ 1 NUNK2,NGRP,FLUX(1,1,7),FLUX(1,1,8))
+ ENDIF
+ ENDIF
+ 140 CONTINUE
+*----
+* FLUX COMPUTATION
+*----
+ NPSYS(:NGRP)=0
+ DO 150 IG=IGDEB,NGRP
+ NPSYS(IG)=IG
+ 150 CONTINUE
+ JPSTR=C_NULL_PTR
+ IF(C_ASSOCIATED(IPSYS)) THEN
+ JPSYS=LCMGID(IPSYS,'GROUP')
+ IF(ILEAK.EQ.6.OR.((MOD(ILEAK,10).EQ.7).AND.(IPHASE.EQ.1))) THEN
+ IPSTR=LCMGID(IPSYS,'STREAMING')
+ JPSTR=LCMGID(IPSTR,'GROUP')
+ ENDIF
+ ENDIF
+ IF((.NOT.LSCAL).AND.(ILEAK.EQ.0)) THEN
+ IDIR=0
+ CALL DOORFV(CXDOOR,JPSYS,NPSYS,IPTRK,IFTRAK,IPRT,NGRP,
+ 1 NMAT,IDIR,NREG,NUNKNO,IPHASE,LEXAC,MATCOD,VOL,KEYFLX,TITLE,
+ 2 FLUX(1,1,8),FLUX(1,1,7),IPREB,IPSOU,REBFLG,FLUXC,EVALRHO)
+ ELSE IF(.NOT.LSCAL) THEN
+ CALL FLUDBV(CXDOOR,IPHASE,JPSYS,JPSTR,NPSYS,IPTRK,IFTRAK,
+ 1 IPRT,NREG,NUNKNO,NFUNL,NGRP,NMAT,NANIS,LEXAC,MATCOD,VOL,KEYFLX,
+ 2 TITLE,ILEAK,LEAKSW,XSTRC,XSDIA,B2,NMERG,IMERG,DIFHET,GAMMA,
+ 3 FLUX(1,1,2),FLUX(1,1,8),FLUX(1,1,7),IPREB,IPSOU,REBFLG,FLUXC)
+ ELSE
+* A GROUP-BY-GROUP SCALAR PROCEDURE IS BEEN USED.
+ IF(.NOT.C_ASSOCIATED(IPSYS)) THEN
+ CALL XABORT('FLU2DR: MISSING L_PIJ OBJECT.')
+ ENDIF
+ KPSTR=C_NULL_PTR
+ DO 230 IG=IGDEB,NGRP
+ IF(IPRT.GT.10) WRITE(6,'(/25H FLU2DR: PROCESSING GROUP,I5,
+ > 6H WITH ,A,1H.)') IG,CXDOOR
+ KPMACR=LCMGIL(JPMACR,IG)
+ NUNK2=NUNKNO
+ IF(ILEAK.EQ.6) NUNK2=NUNKNO/2
+ IF(ILEAK.GE.7) NUNK2=NUNKNO/4
+ IF(CXDOOR.EQ.'BIVAC') THEN
+ CALL BIVSOU(NUNKNO,IG,IPTRK,KPMACR,NANIS,NREG,NMAT,NUNK2,
+ 1 NGRP,MATCOD,VOL,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE IF(CXDOOR.EQ.'TRIVAC') THEN
+ CALL TRIVSO(NUNKNO,IG,IPTRK,KPMACR,NANIS,NREG,NMAT,NUNK2,
+ 1 NGRP,MATCOD,VOL,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE IF((CXDOOR.EQ.'SN').AND.(IBFP.EQ.0)) THEN
+ CALL SNSOUR(NUNKNO,IG,IPTRK,KPMACR,NANIS,NREG,NMAT,NUNK2,
+ 1 NGRP,MATCOD,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE IF(CXDOOR.EQ.'SN') THEN
+ JPSYS=LCMGID(IPSYS,'GROUP')
+ KPSYS=LCMGIL(JPSYS,IG)
+ CALL SNSBFP(IG,IPTRK,KPMACR,KPSYS,NANIS,NLF,NREG,NMAT,
+ 1 NUNK2,NGRP,MATCOD,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE
+ HLEAK=' '
+ CALL FLUSOU(CXDOOR,HLEAK,NUNKNO,IG,IPTRK,KPMACR,NMAT,NANIS,
+ 1 NUNK2,NGRP,FLUX(1,1,7),FLUX(1,1,8))
+ ENDIF
+ IF((ILEAK.EQ.6).AND.(OPTION(2:2).EQ.'1')) THEN
+* ECCO ISOTROPIC STREAMING MODEL.
+ HLEAK='ECCO '
+ CALL FLUSOU(CXDOOR,HLEAK,NUNKNO,IG,IPTRK,KPMACR,NMAT,NANIS,
+ 1 NUNK2,NGRP,FLUX(1,1,7),FLUX(1,1,8))
+ ELSE IF(ILEAK.GE.7) THEN
+* TIBERE ANISOTROPIC STREAMING MODEL.
+ HLEAK='TIBERE'
+ CALL FLUSOU(CXDOOR,HLEAK,NUNKNO,IG,IPTRK,KPMACR,NMAT,NANIS,
+ 1 NUNK2,NGRP,FLUX(1,1,7),FLUX(1,1,8))
+ ENDIF
+*
+ NPSYS(:NGRP)=0
+ NPSYS(IG)=IG
+ IF(ILEAK.EQ.0) THEN
+ IDIR=0
+ CALL DOORFV(CXDOOR,JPSYS,NPSYS,IPTRK,IFTRAK,IPRT,NGRP,
+ 1 NMAT,IDIR,NREG,NUNKNO,IPHASE,LEXAC,MATCOD,VOL,KEYFLX,TITLE,
+ 2 FLUX(1,1,8),FLUX(1,1,7),IPREB,IPSOU,REBFLG,FLUXC,EVALRHO)
+ ELSE
+ CALL FLUDBV(CXDOOR,IPHASE,JPSYS,JPSTR,NPSYS,IPTRK,IFTRAK,
+ 1 IPRT,NREG,NUNKNO,NFUNL,NGRP,NMAT,NANIS,LEXAC,MATCOD,VOL,
+ 2 KEYFLX,TITLE,ILEAK,LEAKSW,XSTRC,XSDIA,B2,NMERG,IMERG,DIFHET,
+ 3 GAMMA,FLUX(1,1,2),FLUX(1,1,8),FLUX(1,1,7),IPREB,IPSOU,REBFLG,
+ 4 FLUXC)
+ ENDIF
+ 230 CONTINUE
+ ENDIF
+ IF(LREBAL.AND.(ITYPEC.NE.5)) THEN
+ CALL FLUBAL(IPMACR,NGRP,ILEAK,NMAT,NREG,ICREB,NUNKNO,NANIS,
+ 1 MATCOD,VOL,KEYFLX(1,1,1),XSTRC,XSDIA,XCSOU,IGDEB,B2,NMERG,
+ 2 IMERG,DIFHET,KEYCUR,MATALB(NNN+1),ALBEDO,V(NNN+1),FLUX(1,1,7))
+ ENDIF
+*----
+* ACCELERATING INNER ITERATIONS CYCLICALLY DEPENDING ON PARAM.
+*----
+ IF(MOD(JT-1,NCTOT).GE.NCPTM) THEN
+ CALL FLU2AC(NGRP,NUNKNO,IGDEB,FLUX(1,1,5),AKEEP(5),ZMU)
+ ELSE
+ ZMU=1.0
+ ENDIF
+*----
+* CALCULATING ERROR AND PREC BETWEEN PRESENT AND NEW FLUX FOR
+* EACH GROUP. RETAIN LARGEST ERROR BETWEEN ANY GROUP.
+*----
+ EINN=0.0
+ ICHAR=ICHAR+1
+ ICTOT=ICTOT+NGRP-IGDEB+1
+ IGDEBO=IGDEB
+ DO 260 IG=IGDEBO,NGRP
+ GINN=0.0
+ FINN=0.0
+ DO 240 IR=1,NREG
+ IND=KEYFLX(IR,1,1)
+ IF(IND.EQ.0) GO TO 240
+ GINN=MAX(GINN,ABS(FLUX(IND,IG,6)-FLUX(IND,IG,7)))
+ FINN=MAX(FINN,ABS(FLUX(IND,IG,7)))
+ 240 CONTINUE
+ FLUX(:NUNKNO,IG,5)=FLUX(:NUNKNO,IG,6)
+ FLUX(:NUNKNO,IG,6)=FLUX(:NUNKNO,IG,7)
+ GINN=GINN/FINN
+ IF((GINN.LT.EPSINR).AND.(IGDEB.EQ.IG)) THEN
+ IGDEB=IGDEB+1
+ ELSEIF((IGDEB.EQ.IG).AND.(IG.LT.NGRP)) THEN
+ ERRDEB1=GINN
+ ENDIF
+ EINN=MAX(EINN,GINN)
+ 260 CONTINUE
+*
+ ITERF=JT
+ IF(IPRT.GT.0) WRITE(6,1080) JT,EINN,EPSINR,IGDEB,ZMU
+ IF((IPRT.GT.0).AND.(IGDEB.GT.1).AND.(IGDEB.LE.NGRP)) THEN
+ WRITE(6,1082) ERRDEB1
+ ENDIF
+ IF(EINN.LT.EPSINR) THEN
+* thermal convergence is reached
+ CFLI=CEXE
+ GOTO 280
+ ENDIF
+* near convergence (eps < 10.0 criterion) a new outer iteration
+* is started
+ IF((IGDEB.GT.1).AND.(EINN.LT.10.*EPSINR)) GOTO 281
+ 270 CONTINUE
+ MESSIN='*NOT*'
+**** END OF INNER LOOP ******************************************
+*
+ 281 MESSIN='*NEARLY*'
+ 280 IF(LREBAL) THEN
+ IF(LEAKSW) THEN
+ IF(ICREB.EQ.0) THEN
+ WRITE(6,*) ' *** INCOMPATIBILITY ON LEAKAGE SWITCH ***'
+ CALL XABORT('FLU2DR: ERROR ON LEAKAGE SWITCH')
+ ELSE
+ IF(IPRT.GT.0)
+ & WRITE(6,*) 'FLU2DR: LEAKAGE & ICREB -> REBALANCING ON'
+ ENDIF
+ ELSE
+ IF(IPRT.GT.0)
+ & WRITE(6,*) 'FLU2DR: NO LEAKAGE-> REBALANCING ON'
+ ENDIF
+ ELSE
+ IF(IPRT.GT.0) WRITE(6,*) 'FLU2DR: LEAKAGE-> REBALANCING OFF'
+ ENDIF
+ CALL KDRCPU(CPU2)
+ IF(IPRT.GT.0) WRITE(6,1040) CPU2-CPU1,'INTERNAL',MESSIN,ITERF
+*----
+* PROMOTE FROM NEW INTERNAL FLUX(,,,7) TO NEW EXTERNAL FLUX(,,,3)
+*----
+ FLUX(:NUNKNO,:NGRP,3)=FLUX(:NUNKNO,:NGRP,7)
+ FLUX(:NUNKNO,:NGRP,4)=FLUX(:NUNKNO,:NGRP,8)
+*----
+* HOTELLING DEFLATION IN GPT CASES.
+*----
+ IF(ITYPEC.EQ.1) THEN
+ JPFLUP1=LCMGID(IPFLUP,'FLUX')
+ JPFLUP2=LCMGID(IPFLUP,'AFLUX')
+ DDELN1=0.0D0
+ DDELD1=0.0D0
+ DO 300 IG=1,NGRP
+ IF(LFORW) THEN
+ CALL LCMGDL(JPFLUP1,IG,FLUX(1,IG,5)) ! EVECT
+ CALL LCMGDL(JPFLUP2,IG,FLUX(1,IG,6)) ! ADECT
+ ELSE
+ CALL LCMGDL(JPFLUP2,NGRP-IG+1,FLUX(1,IG,5)) ! ADECT
+ CALL LCMGDL(JPFLUP1,NGRP-IG+1,FLUX(1,IG,6)) ! EVECT
+ ENDIF
+ 300 CONTINUE
+ FLUX(:NUNKNO,:NGRP,7)=0.0
+ IF(CXDOOR.EQ.'BIVAC') THEN
+ CALL BIVFIS(IPTRK,NREG,NMAT,NIFIS,NUNKNO,NGRP,MATCOD,VOL,
+ > XSCHI,XSNUF,FLUX(1,1,6),FLUX(1,1,7))
+ ELSE IF(CXDOOR.EQ.'TRIVAC') THEN
+ CALL TRIFIS(IPTRK,NREG,NMAT,NIFIS,NUNKNO,NGRP,MATCOD,VOL,
+ > XSCHI,XSNUF,FLUX(1,1,6),FLUX(1,1,7))
+ ELSE
+ ALLOCATE(FXSOR(NUNKNO))
+ DO IS=1,NIFIS
+ FXSOR(:NUNKNO)=0.0
+ DO IG=1,NGRP
+ CALL DOORS(CXDOOR,IPTRK,NMAT,0,NUNKNO,XSNUF(0,IS,IG),
+ > FXSOR,FLUX(1,IG,6))
+ ENDDO
+ DO IR=1,NREG
+ IBM=MATCOD(IR)
+ IF(IBM.EQ.0) CYCLE
+ DO IE=1,NLIN
+ IND=KEYFLX(IR,IE,1)
+ IF(IND.EQ.0) CYCLE
+ DO IG=1,NGRP
+ FLUX(IND,IG,7)=FLUX(IND,IG,7)+XSCHI(IBM,IS,IG)*
+ > FXSOR(IND)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO ! IS
+ DEALLOCATE(FXSOR)
+ ENDIF
+*
+ DO 335 IG=1,NGRP
+ DO 330 IND=1,NUNKNO
+ DDELN1=DDELN1+FLUX(IND,IG,7)*FLUX(IND,IG,3)
+ DDELD1=DDELD1+FLUX(IND,IG,7)*FLUX(IND,IG,5)
+ 330 CONTINUE
+ 335 CONTINUE
+ DO 345 IG=1,NGRP
+ DO 340 IND=1,NUNKNO
+ FLUX(IND,IG,3)=FLUX(IND,IG,3)-REAL(DDELN1/DDELD1)*FLUX(IND,IG,5)
+ 340 CONTINUE
+ 345 CONTINUE
+ ENDIF
+*
+ IF(ITYPEC.EQ.2) THEN
+* NO B-N LEAKAGE CALCULATION REQUIRED
+ IF(B2(4).NE.0.0) CALL XABORT('FLU2DR: NON ZERO BUCKLING.')
+ CALL FLUKEF(IPRT,IPMACR,NGRP,NREG,NUNKNO,NMAT,NIFIS,NANIS,
+ 1 MATCOD(1),VOL,KEYFLX(1,1,1),XSTRC,XSDIA,XSNUF,XSCHI,NMERG,
+ 2 IMERG,DIFHET,FLUX(1,1,3),B2,ILEAK,LEAKSW,OLDBIL,AKEFF,AFLNOR)
+ ELSE IF(ITYPEC.GT.2) THEN
+* PERFORM LEAKAGE CALCULATION.
+ CALL LCMLEN(IPFLUX,'DIFFHET',ILONG,ITYLCM)
+ IF(ILONG.EQ.0) THEN
+ CALL XABORT('FLU2DR: UNABLE TO RECOVER THE DIFFHET RECORD '
+ 1 //'IN THE FLUX OBJECT.(2)')
+ ENDIF
+ CALL LCMGET(IPFLUX,'DIFFHET',DIFHET)
+ GAMMA(:NGRP)=1.0
+ IF(ILEAK.EQ.5) THEN
+* Todorova heterogeneous leakage model.
+ CALL FLULPN(IPMACR,NUNKNO,OPTION,HTYPE(ITYPEC),NGRP,NREG,
+ 1 NMAT,VOL,MATCOD,NMERG,IMERG,KEYFLX(1,1,1),FLUX(1,1,3),B2(4),
+ 2 IPRT,DIFHET,DHOM)
+ IF(.NOT.LEAKSW) THEN
+ CALL B1HOM(IPMACR,LEAKSW,NUNKNO,'LKRD',HTYPE(ITYPEC),NGRP,
+ 1 NREG,NMAT,NIFIS,VOL,MATCOD,KEYFLX(1,1,1),FLUX(1,1,3),
+ 2 REFKEF,IPRT,DHOM(1),GAMMA,AKEFF,INORM,B2)
+ GO TO 350
+ ENDIF
+ ENDIF
+ IF(LEAKSW) THEN
+ IF(HTYPE(ITYPEC).NE.'K') THEN
+ CALL XABORT('FLU2DR: TYPE K EXPECTED WITH OPEN GEOMETRY.')
+ ENDIF
+ JPMACR=LCMGID(IPMACR,'GROUP')
+ ALLOCATE(SFNU(NMAT,NIFIS))
+ PROD=0.0D0
+ DO IGR=1,NGRP
+ KPMACR=LCMGIL(JPMACR,IGR)
+ SFNU(:NMAT,:NIFIS)=0.0
+ IF(NIFIS.GT.0) CALL LCMGET(KPMACR,'NUSIGF',SFNU)
+ DO IBM=1,NMAT
+ FLXIN=0.0D0
+ DO I=1,NREG
+ IND=KEYFLX(I,1,1)
+ IF((MATCOD(I).EQ.IBM).AND.(IND.GT.0)) THEN
+ FLXIN=FLXIN+FLUX(IND,IGR,3)*VOL(I)
+ ENDIF
+ ENDDO
+ DO NF=1,NIFIS
+ PROD=PROD+SFNU(IBM,NF)*FLXIN
+ ENDDO
+ ENDDO
+ ENDDO
+ DEALLOCATE(SFNU)
+ AKEFF=AKEFF*PROD/OLDBIL
+ OLDBIL=PROD
+ IF(IPRT.GT.0) WRITE (6,1150) B2(4),AKEFF
+ ELSE
+* FUNDAMENTAL MODE CONDITION.
+ IF(NMERG.NE.1) CALL XABORT('FLU2DR: ONE LEAKAGE ZONE EXPEC'
+ 1 //'TED.(2)')
+ CALL B1HOM(IPMACR,LEAKSW,NUNKNO,OPTION,HTYPE(ITYPEC),NGRP,
+ 1 NREG,NMAT,NIFIS,VOL,MATCOD,KEYFLX(1,1,1),FLUX(1,1,3),
+ 2 REFKEF,IPRT,DIFHET(1,1),GAMMA,AKEFF,INORM,B2)
+ IF(ILEAK.GE.7) THEN
+* COMPUTE THE DIRECTIONNAL BUCKLING COMPONENTS FOR TIBERE.
+ IHETL=ILEAK/10-1
+ IF(IHETL.GT.0) THEN
+ CALL FLUBLN(IPMACR,IPRT,NGRP,NMAT,NREG,NUNKNO,NIFIS,
+ 1 MATCOD,VOL,KEYFLX(1,1,1),FLUX(1,1,3),IHETL,REFKEF,B2)
+ ENDIF
+ ENDIF
+ ENDIF
+ 350 CALL LCMPUT(IPFLUX,'B2 B1HOM',1,2,B2(4))
+ CALL LCMPUT(IPFLUX,'DIFFHET',NMERG*NGRP,2,DIFHET)
+ ENDIF
+ IF(ITYPEC.GE.3) THEN
+ IF(B2(4).EQ.0.0) THEN
+ BFLNOR=1.0D0
+ ELSE
+ BFLNOR=1.0D0/ABS(B2(4))
+ ENDIF
+ EEXT=REAL(ABS(B2(4)-B2VALO)*BFLNOR)
+ B2VALO=B2(4)
+ ENDIF
+ IEXTF=IT
+ IF((ITYPEC.GT.1).AND.(ITYPEC.LT.5)) THEN
+ IF(AKEFF.NE.0.0) AFLNOR=1.0D0/AKEFF
+ EEXT=REAL(ABS(AKEFF-AKEFFO)/AKEFF)
+ ELSE
+ EEXT=0.0
+ ENDIF
+ AKEEP(3)=AKEFF
+*----
+* ACCELERATING INNER ITERATIONS CYCLICALLY DEPENDING ON PARAM.
+*----
+ IF(MOD(IT-1,NCTOT).GE.NCPTM) THEN
+ CALL FLU2AC(NGRP,NUNKNO,1,FLUX(1,1,1),AKEEP(1),ZMU)
+ ELSE
+ ZMU=1.0
+ ENDIF
+*
+ EINN=0.0
+ IF(IPRT.GT.0) WRITE(6,1090) IT,EEXT,EPSOUT,AKEFF,B2(4)
+ IF(EEXT.LT.EPSOUT) THEN
+* COMPARE FLUX FOR OUTER ITERATIONS
+ DO 370 IG=1,NGRP
+ GINN=0.0
+ FINN=0.0
+ DO 360 IR=1,NREG
+ IND=KEYFLX(IR,1,1)
+ IF(IND.EQ.0) GO TO 360
+ GINN=MAX(GINN,ABS(FLUX(IND,IG,2)-FLUX(IND,IG,3)))
+ FINN=MAX(FINN,ABS(FLUX(IND,IG,3)))
+ 360 CONTINUE
+ FLUX(:NUNKNO,IG,1)=FLUX(:NUNKNO,IG,2)
+ FLUX(:NUNKNO,IG,2)=FLUX(:NUNKNO,IG,3)
+ GINN=GINN/FINN
+ EINN=MAX(EINN,GINN)
+ 370 CONTINUE
+ IF(IPRT.GT.0) WRITE(6,1100) IT,EINN,EPSUNK,AFLNOR,ZMU
+ CEXE=.TRUE.
+ ELSE
+ FLUX(:NUNKNO,:NGRP,1)=FLUX(:NUNKNO,:NGRP,2)
+ FLUX(:NUNKNO,:NGRP,2)=FLUX(:NUNKNO,:NGRP,3)
+ IF(IPRT.GT.0) WRITE(6,1110) IT,AFLNOR,ZMU
+ ENDIF
+ IF((ITYPEC.GE.2).AND.(AKEFF.NE.0.0)) THEN
+ AFLNOR=(AKEFF/AKEEP(3))*AFLNOR
+ ENDIF
+ AKEEP(1)=AKEEP(2)
+ AKEEP(2)=AKEEP(3)
+*----
+* UPDATE KEFF
+*----
+ AKEFFO=AKEFF
+ IF((EEXT.LT.EPSOUT).AND.(EINN.LT.EPSUNK).AND.(IT.GE.2)) GO TO 410
+ 400 CONTINUE
+ WRITE(6,*) '*** FLU2DR: CONVERGENCE NOT REACHED ***'
+ WRITE(6,*) '*** FLU2DR: CONVERGENCE NOT REACHED ***'
+ WRITE(6,*) '*** FLU2DR: CONVERGENCE NOT REACHED ***'
+ MESSOU='*NOT*'
+*
+**** CONVERGENCE REACHED ******************************************
+ 410 RKEFF=REAL(AKEFF)
+ IF(IPRT.GE.3) THEN
+ WRITE(6,1010) (IR,IR=1,NREG)
+ ALLOCATE(FL(NREG))
+ DO 425 IG=1,NGRP
+ WRITE(6,1070) IG
+ FL(:NREG)=0.0
+ DO 420 IR=1,NREG
+ IND=KEYFLX(IR,1,1)
+ IF(IND.GT.0) FL(IR)=FLUX(IND,IG,3)
+ 420 CONTINUE
+ WRITE(6,1020) (FL(IR),IR=1,NREG)
+ 425 CONTINUE
+ DEALLOCATE(FL)
+ ENDIF
+ IF(IPRT.GE.4) THEN
+ ALLOCATE(FL(NREG))
+ DO 445 IG=1,NGRP
+ WRITE(6,1070) IG
+ DO 440 IA=2,NFUNL
+ FL(:NREG)=0.0
+ DO 430 IR=1,NREG
+ IND=KEYFLX(IR,1,IA)
+ IF(IND.GT.0) FL(IR)=FLUX(IND,IG,3)
+ 430 CONTINUE
+ WRITE(6,1030) IA,(FL(IR),IR=1,NREG)
+ 440 CONTINUE
+ 445 CONTINUE
+ DEALLOCATE(FL)
+ ENDIF
+*----
+* COMPUTE K-INF
+*----
+ IF(ITYPEC.GE.2) THEN
+ FISOUR=0.0D0
+ OLDBIL=0.0D0
+ DO 490 IG=1,NGRP
+ DO 460 IR=1,NREG
+ IND=KEYFLX(IR,1,1)
+ IF(IND.EQ.0) GO TO 460
+ DO 450 IS=1,NIFIS
+ FISOUR=FISOUR+XSNUF(MATCOD(IR),IS,IG)*FLUX(IND,IG,3)*VOL(IR)
+ 450 CONTINUE
+ OLDBIL=OLDBIL+XSTRC(MATCOD(IR),IG)*FLUX(IND,IG,3)*VOL(IR)
+ 460 CONTINUE
+ KPMACR=LCMGIL(JPMACR,IG)
+ CALL LCMGET(KPMACR,'NJJS00',NJJ(1))
+ CALL LCMGET(KPMACR,'IJJS00',IJJ(1))
+ CALL LCMGET(KPMACR,'IPOS00',IPOS(1))
+ CALL LCMGET(KPMACR,'SCAT00',XSCAT(1))
+ DO 480 IR=1,NREG
+ IBM=MATCOD(IR)
+ IF(IBM.GT.0) THEN
+ IND=KEYFLX(IR,1,1)
+ JG=IJJ(IBM)
+ DO 470 JND=1,NJJ(IBM)
+ IF(JG.EQ.IG) THEN
+ OLDBIL=OLDBIL-XSDIA(IBM,0,IG)*FLUX(IND,JG,3)*VOL(IR)
+ ELSE
+ OLDBIL=OLDBIL-XSCAT(IPOS(IBM)+JND-1)*FLUX(IND,JG,3)*VOL(IR)
+ ENDIF
+ JG=JG-1
+ 470 CONTINUE
+ ENDIF
+ 480 CONTINUE
+ 490 CONTINUE
+ CUREIN=0.0
+ IF(FISOUR.NE.0.0) CUREIN=REAL(FISOUR/OLDBIL)
+*
+* FLUX NORMALIZATION TO KEFF.
+ IF(ITYPEC.LT.5) THEN
+ FLUX(:NUNKNO,:NGRP,3)=FLUX(:NUNKNO,:NGRP,3)*REAL(AKEFF/FISOUR)
+ FLUX(:NUNKNO,:NGRP,4)=FLUX(:NUNKNO,:NGRP,4)*REAL(AKEFF/FISOUR)
+ ENDIF
+ ENDIF
+*----
+* PRINT TIME TAKEN
+*----
+ CALL KDRCPU(CPU1)
+ IF(IPRT.GE.1) WRITE(6,1040) CPU1-CPU0,'EXTERNAL',MESSOU,IEXTF
+*----
+* FOURIER ANALYSIS: STORE E-VALUE AND FIND SPECTRAL RADIUS
+*----
+ IF(ITYPEC.EQ.-2) THEN
+ WRITE(6,1130)
+ ARRAYRHO1(IFACOUNT+1)=EVALRHO
+ IF(IFACOUNT.LT.(NFOU-1)) GO TO 26
+ SPECR=MAXVAL(ARRAYRHO1)
+ WRITE(6,1140) SPECR
+ CALL LCMPUT(IPFLUX,'SPEC-RADIUS',1,2,SPECR)
+ ENDIF
+ DEALLOCATE(ARRAYRHO1)
+*----
+* PRINT TRACKING INFORMATION
+*----
+ IF(IPRT.GE.1) THEN
+ IF((ITYPEC.EQ.0).OR.(ITYPEC.EQ.-2)) THEN
+ WRITE(6,1050) ICHAR,EEXT
+ ELSE
+ WRITE(6,1060) ICHAR,CUREIN,AKEFF,B2(4),EEXT
+ ENDIF
+ WRITE(6,1120) ICTOT
+ ENDIF
+*----
+* RELEASE ARRAYS
+*----
+ IF(CXDOOR.EQ.'MCCG') THEN
+ IF(ICREB.GT.0) DEALLOCATE(MATALB,V,KEYCUR)
+ ENDIF
+*----
+* SAVE THE SOLUTION
+*----
+ DO 510 IG=1,NGRP
+ IF(LFORW) THEN
+ CALL LCMPDL(JPFLUX,IG,NUNKNO,2,FLUX(1,IG,3))
+ CALL LCMPDL(JPSOUR,IG,NUNKNO,2,FLUX(1,IG,4))
+ ELSE
+ CALL LCMPDL(JPFLUX,NGRP-IG+1,NUNKNO,2,FLUX(1,IG,3))
+ CALL LCMPDL(JPSOUR,NGRP-IG+1,NUNKNO,2,FLUX(1,IG,4))
+ ENDIF
+ 510 CONTINUE
+ IF(C_ASSOCIATED(IPSOU)) THEN
+ CALL LCMLEN(IPSOU,'NORM-FS',ILEN,ITYLCM)
+ IF(ILEN.GT.0) THEN
+ CALL LCMGET(IPSOU,'NORM-FS',ZNORM)
+ CALL LCMPUT(IPFLUX,'NORM-FS',1,2,ZNORM)
+ CALL LCMPUT(IPFLUX,'MATCOD',NREG,1,MATCOD)
+ ENDIF
+ ENDIF
+ IF(IBFP.NE.0) THEN
+ CALL LCMGET(IPSYS,'ECUTOFF',ECUTOFF)
+ CALL LCMPUT(IPFLUX,'ECUTOFF',1,2,ECUTOFF)
+ CALL LCMPUT(IPFLUX,'FLUXC',NREG,2,FLUXC)
+ ENDIF
+ IF(ITYPEC.GE.2) THEN
+ CALL LCMPUT(IPFLUX,'K-EFFECTIVE',1,2,RKEFF)
+ CALL LCMPUT(IPFLUX,'K-INFINITY',1,2,CUREIN)
+ ENDIF
+ IF(ITYPEC.GE.3) THEN
+ CALL LCMPUT(IPFLUX,'B2 B1HOM',1,2,B2(4))
+ ENDIF
+ IF((ITYPEC.GT.2).AND.(ILEAK.GE.7)) THEN
+ CALL LCMPUT(IPFLUX,'B2 HETE',3,2,B2)
+ ENDIF
+ IF((ITYPEC.GT.2).AND.(ILEAK.GE.6)) THEN
+ CALL LCMPUT(IPFLUX,'GAMMA',NGRP,2,GAMMA)
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(XCSOU,DIFHET,DHOM,GAMMA,XSCAT,FLUX)
+ DEALLOCATE(NPSYS,IPOS,NJJ,IJJ)
+ RETURN
+*
+ 1010 FORMAT (/28H FLUXES AVERAGED :/
+ 1 (9X,2H/=,I4,:,6X,2H/=,I4,:,6X,2H/=,I4,:,6X,2H/=,I4,:,6X,2H/=,
+ 2 I4,:,6X,2H/=,I4,:,6X,2H/=,I4,:,6X,2H/=,I4,:,6X,2H/=,I4,:,6X,
+ 3 2H/=,I4))
+ 1020 FORMAT (7H FLUX ,2H: ,1P,10E12.5/(9X,10E12.5))
+ 1030 FORMAT (5H CUR ,I2,2H: ,1P,10E12.5/(9X,10E12.5))
+ 1040 FORMAT (18H FLU2DR: CPU TIME=, F10.0,1X,A8,13H CONVERGENCE ,
+ 1 A8,14H REACHED AFTER ,I6,12H ITERATIONS. )
+ 1050 FORMAT (/20H ++ TRACKING CALLED=,I4,6H TIMES ,
+ 1 11H PRECISION=,E9.2)
+ 1060 FORMAT (/20H ++ TRACKING CALLED=,I4,6H TIMES ,
+ 1 12H FINAL KINF=,1P,E13.6,
+ 2 12H FINAL KEFF=,E13.6,4H B2=,E12.5,
+ 3 11H PRECISION=,E9.2)
+ 1070 FORMAT (/14H ENERGY GROUP ,I6)
+ 1080 FORMAT (10X,3HIN(,I3,6H) FLX:,5H PRC=,1P,E9.2,5H TAR=,E9.2,
+ 1 7H IGDEB=, I13,6H ACCE=,0P,F12.5)
+ 1082 FORMAT (18X,28HFIRST UNCONVERGED GROUP PRC=,1P,E9.2)
+ 1090 FORMAT (5H OUT(,I3,6H) EIG:,5H PRC=,1P,E9.2,5H TAR=,E9.2,
+ 1 6H KEFF=,E13.6,6H BUCK=,E12.5)
+ 1100 FORMAT (5H OUT(,I3,6H) FLX:,5H PRC=,1P,E9.2,5H TAR=,E9.2,
+ 1 6H FNOR=,E13.6,6H ACCE=,0P,F12.5)
+ 1110 FORMAT (5H OUT(,I3,6H) FLX:,28X,6H FNOR=,1P,E13.6,6H ACCE=,
+ 1 0P,F12.5)
+ 1120 FORMAT (38H ++ TOTAL NUMBER OF FLUX CALCULATIONS=,I10)
+ 1130 FORMAT (24H CONVERGENCE NOT SOUGHT.)
+ 1140 FORMAT (49H FLU2DR: SPECTRAL RADIUS FOR FOURIER ANALYSIS IS ,
+ 1 E13.6)
+ 1150 FORMAT(/18H FLU2DR: BUCKLING=,1P,E13.5,15H K-EFFECTIVE =,E13.5)
+ END