summaryrefslogtreecommitdiff
path: root/Dragon/src/PIJRHL.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/PIJRHL.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/PIJRHL.f')
-rw-r--r--Dragon/src/PIJRHL.f194
1 files changed, 194 insertions, 0 deletions
diff --git a/Dragon/src/PIJRHL.f b/Dragon/src/PIJRHL.f
new file mode 100644
index 0000000..9e2040b
--- /dev/null
+++ b/Dragon/src/PIJRHL.f
@@ -0,0 +1,194 @@
+*DECK PIJRHL
+ SUBROUTINE PIJRHL(IPRT,NREG,NSOUT,SIGTAL,PROB)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* HELIOS type normalization of collision probs (CP).
+*
+*Copyright:
+* Copyright (C) 1994 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, E. Varin
+*
+*Parameters: input
+* IPRT print level.
+* NREG number of zones for geometry.
+* NSOUT number of surfaces for geometry.
+* SIGTAL albedo-sigt vector.
+*
+*Parameters: input/output
+* PROB CP matrix for all types.
+*
+*References:
+* R. Roy and G. Marleau,
+* Normalization Techniques for CP Matrices,
+* CONF/PHYSOR-90, Marseille/France, V 2, P IX-40 (1990).
+* \\\\
+* E.A. Villarino, R.J.J. Stamm'ler, A.A. Ferri and J.J. Casal
+* HELIOS: Angularly Dependent Collision Probabilities.
+* Nucl.Sci.Eng. 112,16-31, 1992.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER IPRT,NREG,NSOUT
+ REAL SIGTAL(-NSOUT:NREG)
+ DOUBLE PRECISION PROB(*)
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER IUNOUT,NITMAX,NIT,IPRINT,IR,JR,IP,IPRB,IND,I,J,CPTLB,
+ > CPTAC,CTOT,NSURC,NSURM,NVOLC,NVOLM
+ LOGICAL NOTCON
+ DOUBLE PRECISION NOM,DENOM,DMU,WFSPAD,WFSP,EPSCON,R1,R2,TOTCON,
+ > TMPCON
+ CHARACTER HSMG*131
+ PARAMETER (IUNOUT=6, IPRINT=10, EPSCON=1.0E-6, NITMAX=20)
+*----
+* ALLOCATABLE ARRAYS
+*----
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: CHI
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: WEIG
+*
+*----- INTRINSIC FUNCTION FOR POSITION IN CONDENSE PIJ MATRIX
+*
+ IND(I,J)=(MAX(I+NSOUT+1,J+NSOUT+1)*
+ > (MAX(I+NSOUT+1,J+NSOUT+1)-1))/2
+ > +MIN(I+NSOUT+1,J+NSOUT+1)
+*----
+* SCRATCH STORAGE ALLOCATION
+* WEIG : ADDITIVE WEIGHT
+*----
+ ALLOCATE(WEIG(-NSOUT:NREG,3),CHI(-NSOUT:NREG))
+*
+ NOTCON= .FALSE.
+ CPTLB = 3
+ CPTAC = 3
+ CTOT = CPTAC+CPTLB
+*
+* INITIALISATION OF WEIGHTS
+ DO 60 IR=-NSOUT, NREG
+ WEIG(IR,1)=0.0D0
+ WEIG(IR,2)=0.5D0
+ WEIG(IR,3)=0.5D0
+ 60 CONTINUE
+ DO 50 IR=-NSOUT, NREG
+ CHI(IR)= 1.0D0
+ IF( IR.GE.0.AND.SIGTAL(IR).EQ.0.0D0 )THEN
+ CHI(IR)= 0.0D0
+ ENDIF
+ 50 CONTINUE
+*
+* MAIN ITERATION LOOP
+ IF(IPRT.GT.2) WRITE(IUNOUT,'(A24)')
+ > 'ITER. MU ERROR '
+ DO 110 NIT=1,NITMAX
+*
+ DO 220 IR= -NSOUT, NREG
+ WFSPAD = PROB(IND(IR,0))
+ > + CHI(IR)*PROB(IND(IR,IR))*WEIG(IR,3)
+ WFSP = CHI(IR)*PROB(IND(IR,IR))
+ DO 200 JR=-NSOUT, NREG
+ WFSPAD = WFSPAD - CHI(JR)*WEIG(JR,3)*PROB(IND(IR,JR))
+ WFSP = WFSP + CHI(JR)*PROB(IND(IR,JR))
+ 200 CONTINUE
+ IF(WFSP.NE.0.0) WEIG(IR,3) = WFSPAD / WFSP
+ 220 CONTINUE
+*
+* ACCELERATION TECHNIQUE
+ IF( MOD(NIT-1,CTOT).GE.CPTAC )THEN
+ NOM = 0.0D0
+ DENOM = 0.0D0
+ DO 10 IR=-NSOUT, NREG
+ R1= WEIG(IR,2) - WEIG(IR,1)
+ R2= WEIG(IR,3) - WEIG(IR,2)
+ NOM = NOM + R1*(R2-R1)
+ DENOM = DENOM + (R2-R1)*(R2-R1)
+ 10 CONTINUE
+ IF(DENOM.EQ.0.0D0) THEN
+ DMU = 1.0D0
+ ELSE
+ DMU = - NOM / DENOM
+ ENDIF
+ IF( DMU.GT.50.0D0 .OR. DMU.LT.0.0D0 ) THEN
+ WRITE(HSMG,'(37HPIJRHL: PROBLEM OF ACCELERATION (DMU=,1P,
+ > E11.4,2H).)') DMU
+ CALL XABORT(HSMG)
+ ENDIF
+ DO 20 IR=-NSOUT, NREG
+ WEIG(IR,3) = WEIG(IR,2) + DMU *
+ > (WEIG(IR,3) - WEIG(IR,2))
+ WEIG(IR,2) = WEIG(IR,1) + DMU *
+ > (WEIG(IR,2) - WEIG(IR,1))
+ 20 CONTINUE
+ ELSE
+ DMU = 1.0D0
+ ENDIF
+*
+* CALCULATIONS OF SQUARE DISTANCE BETWEEN 2 ITERATIONS
+* AND UPDATING THE SOLUTION
+ TOTCON = 0.0D0
+ DO 100 IR=-NSOUT, NREG
+ TMPCON=ABS(WEIG(IR,3)-WEIG(IR,2))/WEIG(IR,3)
+ TOTCON=MAX(TMPCON,TOTCON)
+ WEIG(IR,1)= WEIG(IR,2)
+ WEIG(IR,2)= WEIG(IR,3)
+ 100 CONTINUE
+ IF( IPRT.GT.2 ) WRITE(IUNOUT,'(I3,F9.5,E15.7)') NIT,DMU,TOTCON
+*
+* CONVERGENCE TEST
+ IF( TOTCON.LT.EPSCON )GO TO 120
+*
+ 110 CONTINUE
+ NOTCON=.TRUE.
+ WRITE(IUNOUT,'(35H PIJRHL: WEIGHTS NOT CONVERGED )')
+ 120 CONTINUE
+*
+* RENORMALIZE "PIJ" SYMMETRIC MATRIX
+ IPRB = 0
+ DO 240 IR = -NSOUT, NREG
+ DO 230 JR= -NSOUT, IR
+ IPRB= IPRB+1
+ IF( IR.NE.0.AND.JR.NE.0 )THEN
+ PROB(IPRB)=PROB(IPRB)*(WEIG(IR,1)+WEIG(JR,1))
+ ENDIF
+ 230 CONTINUE
+ 240 CONTINUE
+*
+* PRINT WEIGHT FACTORS IF THERE IS A PROBLEM...
+ IF( NOTCON .OR. IPRT.GE.IPRINT )THEN
+ WRITE(IUNOUT,'(30H0 SURFACE WEIGHTS FACTORS /)')
+ NSURC = -1
+ DO 300 IP = 1, (9 +NSOUT) / 10
+ NSURM= MAX( -NSOUT, NSURC-9 )
+ WRITE(IUNOUT,'(10X,10( A5, I6)/)')
+ > (' SUR ',-IR,IR= NSURC, NSURM, -1)
+ WRITE(IUNOUT,'(10H WEIGHT ,10F11.5)')
+ > (WEIG(IR,1),IR=NSURC,NSURM,-1)
+ NSURC = NSURC - 10
+ 300 CONTINUE
+ WRITE(IUNOUT,'(30H0 VOLUME WEIGHTS FACTORS /)')
+ NVOLC = 1
+ DO 310 IP = 1, (9 + NREG) / 10
+ NVOLM= MIN( NREG, NVOLC+9 )
+ WRITE(IUNOUT,'(10X,10( A5 , I6)/)')
+ > (' VOL ',IR,IR=NVOLC,NVOLM, 1)
+ WRITE(IUNOUT,'(10H WEIGHT ,10F11.5)')
+ > (WEIG(IR,1),IR=NVOLC,NVOLM, 1)
+ NVOLC = NVOLC + 10
+ 310 CONTINUE
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(CHI,WEIG)
+ RETURN
+ END