summaryrefslogtreecommitdiff
path: root/Dragon/src/SYBJJ1.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/SYBJJ1.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/SYBJJ1.f')
-rw-r--r--Dragon/src/SYBJJ1.f370
1 files changed, 370 insertions, 0 deletions
diff --git a/Dragon/src/SYBJJ1.f b/Dragon/src/SYBJJ1.f
new file mode 100644
index 0000000..a342976
--- /dev/null
+++ b/Dragon/src/SYBJJ1.f
@@ -0,0 +1,370 @@
+*DECK SYBJJ1
+ SUBROUTINE SYBJJ1 (IPAS,NMCEL,NMERGE,NGEN,NPIJ,NPIS,EPSJ,NUNKNO,
+ 1 FUNKNO,SUNKNO,IMPX,NCOUR,XX,YY,NMC,IFR,ALB,INUM,IGEN,PIJW,PISW,
+ 2 PSJW,PSSW)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the neutron flux and interface currents in a 2-D Cartesian
+* or hexagonal assembly using the current iteration method with Roth
+* approximation.
+*
+*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): A. Hebert
+*
+*Parameters: input
+* IPAS total number of regions.
+* NMCEL total number of cells in the domain.
+* NMERGE total number of merged cells for which specific values
+* of the neutron flux and reactions rates are required.
+* Many cells with different position in the domain can
+* be merged before the neutron flux calculation if they
+* own the same generating cell. Equal to the total number
+* of distinct out-currents (NMERGE.le.NMCEL).
+* NGEN total number of generating cells. A generating cell is
+* defined by its material and dimensions, irrespective of
+* its position in the domain (NGEN.le.NMERGE).
+* NPIJ size of cellwise scattering-reduced collision probability
+* matrices.
+* NPIS size of cellwise scattering-reduced escape probability
+* matrices.
+* EPSJ stopping criterion for flux-current iterations.
+* NUNKNO total number of unknowns in vectors SUNKNO and FUNKNO.
+* SUNKNO input source vector.
+* IMPX print flag (equal to 0 for no print).
+* NCOUR number of incoming currents (=4 Cartesian lattice;
+* =6 hexagonal lattice).
+* XX X-thickness of the generating cells.
+* YY Y-thickness of the generating cells.
+* NMC offset of the first volume in each generating cell.
+* IFR index-number of in-currents.
+* ALB transmission/albedo associated with each in-current.
+* Note: IFR and ALB contains information to rebuild the
+* geometrical 'A' matrix.
+* INUM index-number of the merged cell associated to each cell.
+* IGEN index-number of the generating cell associated with each
+* merged cell.
+* PIJW cellwise scattering-reduced collision probability matrices.
+* PISW cellwise scattering-reduced escape probability matrices.
+* PSJW cellwise scattering-reduced collision probability matrices
+* for incoming neutrons.
+* PSSW cellwise scattering-reduced transmission probability matrices.
+*
+*Parameters: input/output
+* FUNKNO unknown vector.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT DOUBLE PRECISION (A-H,O-Z)
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER IPAS,NMCEL,NMERGE,NGEN,NPIJ,NPIS,NUNKNO,IMPX,NCOUR,
+ 1 NMC(NGEN+1),IFR(NCOUR*NMCEL),INUM(NMCEL),IGEN(NMERGE)
+ REAL EPSJ,FUNKNO(NUNKNO),SUNKNO(NUNKNO),XX(NGEN),YY(NGEN),
+ 1 ALB(NCOUR*NMCEL),PIJW(NPIJ),PISW(NPIS),PSJW(NPIS),PSSW(NGEN)
+*----
+* LOCAL VARIABLES
+*----
+ REAL PIJ,PIS
+ DOUBLE PRECISION PIBB(6)
+ LOGICAL LOGTES
+ PARAMETER (MAXIT=400,LACCFC=2,ICL1=3,ICL2=3)
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, DIMENSION(:), POINTER :: INDPIJ,INDNMC
+ DOUBLE PRECISION, DIMENSION(:), POINTER :: CIT0
+ DOUBLE PRECISION, DIMENSION(:,:), POINTER :: CITR,AITR
+ DOUBLE PRECISION, DIMENSION(:), POINTER :: WCURR
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(INDPIJ(NGEN),INDNMC(NMERGE))
+ ALLOCATE(CITR(3,NMERGE),CIT0(NMERGE),AITR(2,NMERGE))
+ ALLOCATE(WCURR(NMERGE))
+*
+ IPIJ=0
+ DO 10 JKG=1,NGEN
+ J2=NMC(JKG+1)-NMC(JKG)
+ INDPIJ(JKG)=IPIJ
+ IPIJ=IPIJ+J2*J2
+ 10 CONTINUE
+ KNMC=0
+ DO 20 JKK=1,NMERGE
+ JKG=IGEN(JKK)
+ J2=NMC(JKG+1)-NMC(JKG)
+ INDNMC(JKK)=KNMC
+ KNMC=KNMC+J2
+ 20 CONTINUE
+*
+ DO 30 I=1,NMERGE
+ WCURR(I)=1.0D0
+ CIT0(I)=0.0D0
+ CITR(1,I)=FUNKNO(IPAS+I)
+ 30 CONTINUE
+*----
+* COMPUTE PSJW * Q(*) CONTRIBUTION
+*----
+ DO 45 IKK=1,NMERGE
+ IKG=IGEN(IKK)
+ I1P=NMC(IKG)
+ I2=NMC(IKG+1)-I1P
+ KNMC=INDNMC(IKK)
+ DO 40 I=1,I2
+ CIT0(IKK)=CIT0(IKK)+PSJW(I1P+I)*SUNKNO(KNMC+I)
+ 40 CONTINUE
+ 45 CONTINUE
+*----
+* COMPUTE NORMALIZATION VECTOR WCURR
+*----
+ DO 65 ICEL=1,NMCEL
+ IKK=INUM(ICEL)
+ IS=NCOUR*(ICEL-1)
+ IKG=IGEN(IKK)
+ IF(NCOUR.EQ.4) THEN
+ A=XX(IKG)
+ B=YY(IKG)
+ DEN1=2.0D0*(A+B)
+ PIBB(1)=B/DEN1
+ PIBB(2)=B/DEN1
+ PIBB(3)=A/DEN1
+ PIBB(4)=A/DEN1
+ ELSE
+ DO 50 JC=1,NCOUR
+ PIBB(JC)=1.0D0/6.0D0
+ 50 CONTINUE
+ ENDIF
+ DO 60 JC=1,NCOUR
+ J1=IFR(IS+JC)
+ WCURR(J1)=WCURR(J1)-PSSW(IKG)*PIBB(JC)*ALB(IS+JC)
+ 60 CONTINUE
+ 65 CONTINUE
+*
+ ISTART=1
+ TEST=0.0D0
+ ITER=0
+ 70 ITER=ITER+1
+ IF(ITER.GT.MAXIT) THEN
+ WRITE(6,'(/47H SYBJJ1: *** WARNING *** MAXIMUM NUMBER OF ITER,
+ 1 15HATIONS REACHED.)')
+ GO TO 190
+ ENDIF
+ IT3=MOD(ITER,3)+1
+ IT2=MOD(ITER-1,3)+1
+ IT1=MOD(ITER-2,3)+1
+ DO 80 I=1,NMERGE
+ CITR(IT3,I)=CIT0(I)
+ 80 CONTINUE
+*----
+* COMPUTE PSSW * J(-) CONTRIBUTION
+*----
+ DO 95 ICEL=1,NMCEL
+ IKK=INUM(ICEL)
+ IS=NCOUR*(ICEL-1)
+ IKG=IGEN(IKK)
+ IF(NCOUR.EQ.4) THEN
+ A=XX(IKG)
+ B=YY(IKG)
+ DEN1=2.0D0*(A+B)
+ PIBB(1)=B/DEN1
+ PIBB(2)=B/DEN1
+ PIBB(3)=A/DEN1
+ PIBB(4)=A/DEN1
+ ELSE
+ DO 85 JC=1,NCOUR
+ PIBB(JC)=1.0D0/6.0D0
+ 85 CONTINUE
+ ENDIF
+ DO 90 JC=1,NCOUR
+ J1=IFR(IS+JC)
+ PSS=PSSW(IKG)*PIBB(JC)
+ CITR(IT3,IKK)=CITR(IT3,IKK)+PSS*ALB(IS+JC)*CITR(IT2,J1)
+ 90 CONTINUE
+ 95 CONTINUE
+*----
+* NORMALIZATION
+*----
+ S1=0.0D0
+ S2=0.0D0
+ DO 100 I=1,NMERGE
+ S1=S1+WCURR(I)*CITR(IT3,I)
+ S2=S2+CIT0(I)
+ 100 CONTINUE
+ ZNORM=S2/S1
+ IF(ZNORM.LT.0.0D0) ZNORM=1.0D0
+ DO 110 I=1,NMERGE
+ CITR(IT3,I)=CITR(IT3,I)*ZNORM
+ 110 CONTINUE
+*----
+* ONE/TWO PARAMETER ACCELERATION
+*----
+ ALP=1.0D0
+ BET=0.0D0
+ LOGTES=(1+MOD(ITER-ISTART,ICL1+ICL2).GT.ICL1)
+ IF(LOGTES) THEN
+ DO 120 I=1,NMERGE
+ AITR(1,I)=CITR(IT3,I)-CITR(IT2,I)
+ AITR(2,I)=CITR(IT2,I)-CITR(IT1,I)
+ 120 CONTINUE
+ DO 135 ICEL=1,NMCEL
+ IKK=INUM(ICEL)
+ IS=NCOUR*(ICEL-1)
+ IKG=IGEN(IKK)
+ IF(NCOUR.EQ.4) THEN
+ A=XX(IKG)
+ B=YY(IKG)
+ DEN1=2.0D0*(A+B)
+ PIBB(1)=B/DEN1
+ PIBB(2)=B/DEN1
+ PIBB(3)=A/DEN1
+ PIBB(4)=A/DEN1
+ ELSE
+ DO 125 JC=1,NCOUR
+ PIBB(JC)=1.0D0/6.0D0
+ 125 CONTINUE
+ ENDIF
+ DO 130 JC=1,NCOUR
+ J1=IFR(IS+JC)
+ PSS=PSSW(IKG)*PIBB(JC)*ALB(IS+JC)
+ AITR(1,IKK)=AITR(1,IKK)-PSS*(CITR(IT3,J1)-CITR(IT2,J1))
+ AITR(2,IKK)=AITR(2,IKK)-PSS*(CITR(IT2,J1)-CITR(IT1,J1))
+ 130 CONTINUE
+ 135 CONTINUE
+ IF((LACCFC.EQ.1).OR.(MOD(ITER-ISTART,ICL1+ICL2).EQ.ICL1)) THEN
+ S1=0.0D0
+ S2=0.0D0
+ DO 140 I=1,NMERGE
+ S1=S1+(CITR(IT3,I)-CITR(IT2,I))*AITR(1,I)
+ S2=S2+AITR(1,I)*AITR(1,I)
+ 140 CONTINUE
+ IF(S2.EQ.0.0D0) THEN
+ ISTART=ITER+1
+ ELSE
+ ALP=S1/S2
+ IF(ALP.LE.0.0D0) THEN
+ ISTART=ITER+1
+ ALP=1.0D0
+ ENDIF
+ ENDIF
+ DO 150 I=1,NMERGE
+ CITR(IT3,I)=CITR(IT2,I)+ALP*(CITR(IT3,I)-CITR(IT2,I))
+ 150 CONTINUE
+ ELSE IF(LACCFC.EQ.2) THEN
+ S1=0.0D0
+ S2=0.0D0
+ S3=0.0D0
+ S4=0.0D0
+ S5=0.0D0
+ DO 160 I=1,NMERGE
+ S1=S1+(CITR(IT3,I)-CITR(IT2,I))*AITR(1,I)
+ S2=S2+AITR(1,I)*AITR(1,I)
+ S3=S3+(CITR(IT3,I)-CITR(IT2,I))*AITR(2,I)
+ S4=S4+AITR(1,I)*AITR(2,I)
+ S5=S5+AITR(2,I)*AITR(2,I)
+ 160 CONTINUE
+ DET=S2*S5-S4*S4
+ IF(DET.EQ.0.0D0) THEN
+ ISTART=ITER+1
+ ELSE
+ ALP=(S5*S1-S4*S3)/DET
+ BET=(S2*S3-S4*S1)/DET
+ IF(ALP.LE.0.0D0) THEN
+ ISTART=ITER+1
+ ALP=1.0D0
+ BET=0.0D0
+ ENDIF
+ ENDIF
+ DO 170 I=1,NMERGE
+ CITR(IT3,I)=CITR(IT2,I)+ALP*(CITR(IT3,I)-CITR(IT2,I))+
+ 1 BET*(CITR(IT2,I)-CITR(IT1,I))
+ 170 CONTINUE
+ ENDIF
+ ENDIF
+*----
+* CHECK THE CONVERGENCE ERROR
+*----
+ ERR1=0.0D0
+ ERR2=0.0D0
+ DO 180 I=1,NMERGE
+ ERR1=MAX(ERR1,ABS(CITR(IT3,I)-CITR(IT2,I)))
+ ERR2=MAX(ERR2,ABS(CITR(IT3,I)))
+ 180 CONTINUE
+ IF(IMPX.GT.3) WRITE(6,'(30H SYBJJ1: CURRENT ITERATION NB.,I4,
+ 1 7H ERROR=,1P,E10.3,5H OVER,E10.3,15H NORMALIZATION=,E10.3,
+ 2 14H ACCELERATION=,2E11.3,1H.)') ITER,ERR1,ERR2,ZNORM,ALP,
+ 3 BET/ALP
+ IF(ITER.EQ.1) TEST=ERR1/ERR2
+ IF((ITER.GT.20).AND.(ERR1/ERR2.GT.TEST)) CALL XABORT('SYBJJ1: '
+ 1 //'CONVERGENCE FAILURE.')
+ IF(LOGTES.OR.(ERR1.GT.EPSJ*ERR2)) GO TO 70
+ IF(IMPX.GT.2) WRITE(6,'(37H SYBJJ1: CURRENT CONVERGENCE AT ITERA,
+ 1 8HTION NB.,I4,7H ERROR=,1P,E10.3,5H OVER,E10.3,1H.)') ITER,ERR1,
+ 2 ERR2
+*
+ 190 DO 200 I=1,IPAS
+ FUNKNO(I)=0.0
+ 200 CONTINUE
+ DO 210 I=1,NMERGE
+ FUNKNO(IPAS+I)=REAL(CITR(IT3,I))
+ 210 CONTINUE
+*----
+* COMPUTE PISW * J(-) CONTRIBUTION
+*----
+ DO 250 ICEL=1,NMCEL
+ IKK=INUM(ICEL)
+ IS=NCOUR*(ICEL-1)
+ IKG=IGEN(IKK)
+ IF(NCOUR.EQ.4) THEN
+ A=XX(IKG)
+ B=YY(IKG)
+ DEN1=2.0D0*(A+B)
+ PIBB(1)=B/DEN1
+ PIBB(2)=B/DEN1
+ PIBB(3)=A/DEN1
+ PIBB(4)=A/DEN1
+ ELSE
+ DO 220 JC=1,NCOUR
+ PIBB(JC)=1.0D0/6.0D0
+ 220 CONTINUE
+ ENDIF
+ I1P=NMC(IKG)
+ I2=NMC(IKG+1)-I1P
+ KNMC=INDNMC(IKK)
+ DO 240 J=1,I2
+ DO 230 JC=1,NCOUR
+ J1=IFR(IS+JC)
+ PIS=PISW(I1P+J)*REAL(PIBB(JC))
+ FUNKNO(KNMC+J)=FUNKNO(KNMC+J)+PIS*ALB(IS+JC)*FUNKNO(IPAS+J1)
+ 230 CONTINUE
+ 240 CONTINUE
+ 250 CONTINUE
+*----
+* COMPUTE PIJW * Q(*) CONTRIBUTION
+*----
+ DO 280 IKK=1,NMERGE
+ IKG=IGEN(IKK)
+ I2=NMC(IKG+1)-NMC(IKG)
+ KNMC=INDNMC(IKK)
+ DO 270 I=1,I2
+ DO 260 J=1,I2
+ PIJ=PIJW(INDPIJ(IKG)+(I-1)*I2+J)
+ FUNKNO(KNMC+J)=FUNKNO(KNMC+J)+PIJ*SUNKNO(KNMC+I)
+ 260 CONTINUE
+ 270 CONTINUE
+ 280 CONTINUE
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(WCURR)
+ DEALLOCATE(AITR,CIT0,CITR)
+ DEALLOCATE(INDNMC,INDPIJ)
+ RETURN
+ END