summaryrefslogtreecommitdiff
path: root/Dragon/src/SYBRHL.f
blob: 5794b6a3cc0967c1705335ed0be96eea5f7fbcef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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