From 7dfcc480ba1e19bd3232349fc733caef94034292 Mon Sep 17 00:00:00 2001 From: stainer_t Date: Mon, 8 Sep 2025 13:48:49 +0200 Subject: Initial commit from Polytechnique Montreal --- Dragon/src/SYBRHL.f | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 Dragon/src/SYBRHL.f (limited to 'Dragon/src/SYBRHL.f') diff --git a/Dragon/src/SYBRHL.f b/Dragon/src/SYBRHL.f new file mode 100644 index 0000000..5794b6a --- /dev/null +++ b/Dragon/src/SYBRHL.f @@ -0,0 +1,181 @@ +*DECK SYBRHL + SUBROUTINE SYBRHL(IPRT,NSOUT,NREG,G,PROB) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Stamm'ler normalisation of collision, escape and transmission +* probabilities. +* +*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 parameter (equal to zero for no print). +* NSOUT number of surfaces. +* NREG number of regions. +* +*Parameters: input/output +* G surface and volume array on input and +* renormalization factors at output. +* PROB collision, escape and transmission probabilities on input +* and normalized collision, escape and transmission +* probabilities at output. +* +*Reference: +* R. Roy et.al., +* Normalization techniques for CP matrices, Physor-90, +* Marseille/France, v 2, p ix-40 (1990). +* A. Villarino, R.J.J.Stamm'ler and A.A.Ferri and J.J.Casal +* Helios: Angularly dependent collision probabilities E., +* Nucl.Sci.Eng. 112,16-31, 1992. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPRT,NSOUT,NREG + REAL G(NSOUT+NREG),PROB((NSOUT+NREG)*(NSOUT*NREG+1)/2) +*---- +* LOCAL VARIABLES +*---- + INTEGER CPTLB,CPTAC,CTOT + PARAMETER (CPTLB=3, CPTAC=3, CTOT=CPTAC+CPTLB, IUNOUT=6, + 1 EPSCON=1.0E-6, NITMAX=20) + DOUBLE PRECISION WFSPAD,WFSP,NOM,DENOM,DMU + LOGICAL NOTCON + REAL, ALLOCATABLE, DIMENSION(:,:) :: WEIG +* + INDPOS(I,J)=MAX(I,J)*(MAX(I,J)-1)/2+MIN(I,J) +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(WEIG(NSOUT+NREG,3)) +*---- +* INITIALISATION OF WEIGHTS +*---- + NOTCON=.FALSE. + DO 10 IR=1,NSOUT+NREG + WEIG(IR,1)=0.0 + WEIG(IR,2)=0.5 + WEIG(IR,3)=0.5 + 10 CONTINUE +*---- +* MAIN ITERATION LOOP +*---- + IF(IPRT.GT.8) THEN + WRITE(IUNOUT,'(/30H SYBRHL: NORMALIZATION FACTORS)') + WRITE(IUNOUT,'(1X,A24)') 'ITER. MU ERROR ' + ENDIF + NIT=0 + 20 NIT=NIT+1 + IF(NIT.GT.NITMAX) THEN + NOTCON=.TRUE. + WRITE(IUNOUT,'(31H SYBRHL: WEIGHTS NOT CONVERGED.)') + GO TO 80 + ENDIF + DO 40 IR=1,NSOUT+NREG + WFSPAD=G(IR)+PROB(INDPOS(IR,IR))*WEIG(IR,3) + WFSP=PROB(INDPOS(IR,IR)) + DO 30 JR=1,NSOUT+NREG + WFSPAD=WFSPAD-WEIG(JR,3)*PROB(INDPOS(IR,JR)) + WFSP=WFSP+PROB(INDPOS(IR,JR)) + 30 CONTINUE + WEIG(IR,3)=REAL(WFSPAD/WFSP) + 40 CONTINUE +*---- +* ACCELERATION BY RESIDUAL MINIMIZATION +*---- + IF(MOD(NIT-1,CTOT).GE.CPTAC) THEN + NOM = 0.0D0 + DENOM = 0.0D0 + DO 50 IR=1,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) + 50 CONTINUE + IF(DENOM.EQ.0.0D0) THEN + DMU=1.0D0 + ELSE + DMU=-NOM/DENOM + ENDIF + ZMU=REAL(DMU) + IF(ZMU.GT.10.0 .OR. ZMU.LT.0.0) THEN + IF( IPRT.GT.2 ) WRITE(IUNOUT,'(I3,1P,G12.4,A)') NIT,ZMU, + > ' =MU / SYBRHL: NON ACCELERATION' + ZMU=1.0 + ENDIF + DO 60 IR=1,NSOUT+NREG + WEIG(IR,3)=WEIG(IR,2)+ZMU*(WEIG(IR,3)-WEIG(IR,2)) + WEIG(IR,2)=WEIG(IR,1)+ZMU*(WEIG(IR,2)-WEIG(IR,1)) + 60 CONTINUE + ELSE + ZMU = 1.0 + ENDIF +*---- +* CALCULATIONS OF SQUARE DISTANCE BETWEEN 2 ITERATIONS AND UPDATING +* OF THE SOLUTION +*---- + TOTCON = 0.0 + DO 70 IR=1,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) + 70 CONTINUE + IF(IPRT.GT.8) WRITE(IUNOUT,'(I3,F9.5,E15.7)') NIT,ZMU,TOTCON +*---- +* CONVERGENCE TEST +*---- + IF(TOTCON.LT.EPSCON) GO TO 80 + GO TO 20 +*---- +* RENORMALIZE "PIJ" SYMMETRIC MATRIX +*---- + 80 IPRB=0 + DO 95 IR=1,NSOUT+NREG + G(IR)=WEIG(IR,1) + DO 90 JR=1,IR + IPRB=IPRB+1 + PROB(IPRB)=PROB(IPRB)*(WEIG(IR,1)+WEIG(JR,1)) + 90 CONTINUE + 95 CONTINUE +*---- +* PRINT WEIGHT FACTORS IF THERE IS A PROBLEM +*---- + IF(NOTCON .OR. (IPRT.GE.15)) THEN + WRITE(IUNOUT,'(24H SURFACE WEIGHTS FACTORS/)') + NSURC=1 + DO 100 IP =1,(9+NSOUT)/10 + NSURM=MIN(NSOUT,NSURC+9) + WRITE(IUNOUT,'(10X,10(A5,I6)/)') + > (' SUR ',IR,IR= NSURC, NSURM) + WRITE(IUNOUT,'(10H WEIGHT ,10F11.5)') + > (WEIG(IR,1),IR=NSURC,NSURM) + NSURC=NSURC+10 + 100 CONTINUE + WRITE(IUNOUT,'(24H VOLUME WEIGHTS FACTORS/)') + NVOLC=NSOUT+1 + DO 110 IP=1,(9+NREG)/10 + NVOLM=MIN(NSOUT+NREG,NVOLC+9) + WRITE(IUNOUT,'(10X,10(A5,I6)/)') + > (' VOL ',IR,IR=NVOLC-NSOUT,NVOLM-NSOUT) + WRITE(IUNOUT,'(10H WEIGHT ,10F11.5)') + > (WEIG(IR,1),IR=NVOLC,NVOLM) + NVOLC=NVOLC+10 + 110 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(WEIG) + RETURN + END -- cgit v1.2.3