summaryrefslogtreecommitdiff
path: root/Dragon/src/PIJRNL.f
blob: 262bae88f0ae6024ef0495897748c19872d55fc7 (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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
*DECK PIJRNL
      SUBROUTINE PIJRNL(IPRT,NREG,NSOUT,SIGTAL,PROB)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Non-linear 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, G. Marleau
*
*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).
*
*-----------------------------------------------------------------------
*
      IMPLICIT   NONE
      INTEGER    IPRT,NREG,NSOUT,IUNOUT,NITMAX,NIT,
     >           NUNKNO,IPRB,IPRF,IVOL,IDIA,IUNK,JUNK,IR,JR,
     >           NSURC,NSURM,NVOLC,NVOLM,IP,NPR
      REAL       SIGTAL(-NSOUT:NREG)
      DOUBLE PRECISION PROB(*),EPSCON,TOTCON,WFSPAD
      PARAMETER (IUNOUT=6, EPSCON=1.0E-8, NITMAX=10)
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IDL
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: CIJ,WSPACE,WFSP,
     > WEIG
C----
C  SCRATCH STORAGE ALLOCATION
C    CIJ   : MODIFIED CP PROB MATRIX
C    WSPACE: NON-LINEAR SYSTEM MATRIX
C    WFSP  : NON LINEAR SYSTEM SOLUTION
C    IDL   : WSPACE DIAGONAL LOCATION
C    WEIG  : NON-LINEAR WEIGHT
C----
      NPR=(NSOUT+NREG+1)*(NSOUT+NREG+2)/2
      ALLOCATE(IDL(NSOUT+NREG+1))
      ALLOCATE(CIJ(NPR),WSPACE(NPR),WFSP(-NSOUT:NREG),WEIG(-NSOUT:NREG))
C
C     CHARGE MATRIX "CIJ"
      NUNKNO=NREG+NSOUT+1
      IPRB= 0
      IUNK= 0
      IVOL= NSOUT*(NSOUT+1)/2
      DO 20 IR   = -NSOUT, NREG
         IUNK= IUNK+1
         IF( IR.LT.0.OR.SIGTAL(IR).GT.0.0 )THEN
            DO 10 JR= -NSOUT, IR-1
               IPRB= IPRB+1
               IF( JR.LT.0.OR.SIGTAL(JR).GT.0.0 )THEN
                  CIJ(IPRB)= PROB(IPRB)
               ELSE
                  CIJ(IPRB)= 0.0D0
               ENDIF
   10       CONTINUE
         ELSE
            DO 15 JR= -NSOUT, IR-1
               IPRB= IPRB+1
               CIJ(IPRB)= 0.0D0
   15       CONTINUE
         ENDIF
         IPRB= IPRB+1
         IDL(IUNK)= IPRB
         IF( IR.LT.0 )THEN
            IVOL= IVOL+1
            CIJ(IPRB)= PROB(IPRB)
         ELSEIF( IR.GT.0 )THEN
            IVOL= IVOL+IUNK-1
            IF( SIGTAL(IR).GT.0.0 )THEN
               CIJ(IPRB)= PROB(IPRB)
            ELSE
               CIJ(IPRB)= PROB(IVOL)
            ENDIF
         ELSE
            IVOL= IVOL+1
            CIJ(IPRB)= 1.0D0
         ENDIF
   20 CONTINUE
C
C     COPY MATRIX "CIJ" IN THE "WSPACE" ARRAY FOR INVERSION
C          AND ADD TO THE DIAGONAL ALL TERMS OF A LINE
      IPRB= 0
      IUNK= 0
      IDIA= 0
      DO 50 IR   = -NSOUT, NREG
         IUNK= IUNK+1
         IDIA= IDIA+IUNK
         WSPACE(IDIA)= CIJ(IDIA) + CIJ(IDIA)
         DO 30 JR= -NSOUT, IR-1
            IPRB= IPRB+1
            WSPACE(IPRB)= CIJ(IPRB)
            WSPACE(IDIA)= WSPACE(IDIA) + CIJ(IPRB)
   30    CONTINUE
         IPRB= IPRB+1
         IPRF= IPRB
         JUNK= IUNK
         DO 40 JR=  IR+1 , NREG
            IPRF= IPRF+JUNK
            JUNK= JUNK+1
            WSPACE(IDIA)= WSPACE(IDIA) + CIJ(IPRF)
   40    CONTINUE
   50 CONTINUE
      IF( IPRT.GT.100 )THEN
         WRITE(IUNOUT,8002)
         IPRB= 0
         DO 55 IR= -NSOUT, NREG
         DO 52 JR= -NSOUT, IR
            IPRB= IPRB+1
            WRITE(IUNOUT,8003) IR, JR, CIJ(IPRB),
     >                            WSPACE(IPRB),PROB(IPRB)
   52    CONTINUE
   55    CONTINUE
      ENDIF
C
C     INVERSION OF THE INITIAL SYSTEM JACOBIAN MATRIX
      CALL ALDDLF(NUNKNO,WSPACE,IDL)
C
C     INITIALISATION OF WEIGHTS
      DO 60 IR=-NSOUT, NREG
         WEIG(IR)=1.0D0
   60 CONTINUE
      WEIG(0)= 0.0D0
C
C     THE NON-LINEAR SYSTEM FOR WEIGHTS IS:
C      F1(W1, W2, ... WN)= W1*(W1*C11+W2*C12+ ... +WN*C1N) - TRUE1
C      F2(W1, W2, ... WN)= W2*(W1*C21+W2*C22+ ... +WN*C2N) - TRUE2
C      ...
C      FN(W1, W2, ... WN)= WN*(W1*CN1+W2*CN2+ ... +WN*CNN) - TRUEN
C     FORMING THE SYSTEM USING WEIGHTS "WEIG" & CONTRIBUTIONS "CIJ"
C
C     MAIN ITERATION LOOP
      DO 110 NIT=1,NITMAX
C
         IPRB= 0
         IUNK= 0
         IVOL= NSOUT*(NSOUT+1)/2
         DO 90 IR=-NSOUT, NREG
            IF( IR.LE.0 )THEN
               IVOL= IVOL+1
            ELSE
               IVOL= IVOL+IUNK
            ENDIF
            IUNK= IUNK+1
            WFSPAD= 0.0D0
            DO 70 JR=-NSOUT, IR
               IPRB= IPRB+1
               WFSPAD=WFSPAD+WEIG(JR)*CIJ(IPRB)
   70       CONTINUE
            IPRF= IPRB
            JUNK= IUNK
            DO 80 JR= IR+1 , NREG
               IPRF= IPRF+JUNK
               JUNK= JUNK+1
               WFSPAD=WFSPAD+WEIG(JR)*CIJ(IPRF)
   80       CONTINUE
            WFSP(IR)=WEIG(IR)*WFSPAD-PROB(IVOL)
   90    CONTINUE
         IF( IPRT.GT.100 )THEN
            WRITE(IUNOUT,9000)
            DO 92 IR= -NSOUT, NREG
               WRITE(IUNOUT,9001) IR, WFSP(IR)
   92       CONTINUE
         ENDIF
         CALL ALDDLS(NUNKNO,IDL,WSPACE,WFSP)
C
C        CALCULATIONS OF SQUARE DISTANCE BETWEEN 2 ITERATIONS
C        AND UPDATING THE SOLUTION
         TOTCON = 0.0D0
         DO 100 IR=-NSOUT, NREG
            TOTCON= TOTCON + WFSP(IR)**2
            WEIG(IR)= WEIG(IR) - WFSP(IR)
  100    CONTINUE
         IF( IPRT.GT.100 )THEN
            WRITE(IUNOUT,9004)
            DO 102 IR= -NSOUT, NREG
               WRITE(IUNOUT,9005) IR, WEIG(IR)
  102       CONTINUE
            WRITE(IUNOUT,'( 8H TOTCON: ,E15.7)') TOTCON
         ENDIF
C
C        CONVERGENCE TEST
         IF( TOTCON.LT.EPSCON )GO TO 120
C
  110 CONTINUE
      WRITE(IUNOUT,'(35H PIJRNL: WEIGHTS NOT CONVERGED          )')
  120 CONTINUE
C
C     RECOMPUTE WEIGHTS FOR VOID REGIONS
      IPRB= (NSOUT+1)*(NSOUT+2)/2
      IVOL= IPRB
      IUNK= NSOUT+1
      DO 220 IR= 1, NREG
         IVOL= IVOL+IUNK
         IUNK= IUNK+1
         IF( SIGTAL(IR).EQ.0.0 )THEN
            WFSPAD= 0.0D0
            DO 200 JR=-NSOUT, IR
               IPRB= IPRB+1
               IF( JR.LT.0.OR.SIGTAL(JR).GT.0.0 )THEN
                  WFSPAD=WFSPAD+WEIG(JR)*PROB(IPRB)
               ENDIF
  200       CONTINUE
            IPRF= IPRB
            JUNK= IUNK
            DO 210 JR= IR+1 , NREG
               IPRF= IPRF+JUNK
               JUNK= JUNK+1
               IF( JR.LT.0.OR.SIGTAL(JR).GT.0.0 )THEN
                  WFSPAD=WFSPAD+WEIG(JR)*PROB(IPRF)
               ENDIF
  210       CONTINUE
            WEIG(IR)=PROB(IVOL)/WFSPAD
         ELSE
            IPRB= IPRB+IUNK
         ENDIF
  220 CONTINUE
C
C     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)*WEIG(JR)
            ENDIF
  230    CONTINUE
  240 CONTINUE
C
C     PRINT WEIGHT FACTORS IF REQUESTED
      IF( IPRT .GE. 100 )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),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),IR=NVOLC,NVOLM, 1)
            NVOLC = NVOLC + 10
 310     CONTINUE
      ENDIF
C----
C  SCRATCH STORAGE DEALLOCATION
C----
      DEALLOCATE(WEIG,WFSP,WSPACE,CIJ)
      DEALLOCATE(IDL)
      RETURN
C
 8002 FORMAT(//' S U R F / S U R F    C O N T R I B U T I O N S'//
     >9X,'BEGIN S',6X,'END S ',11X,'CIJ.    ',11X, 'WSPACE  ',
     >                         11X,'PROBS.  ')
 8003 FORMAT(6X,I10,5X,I10,5X,1P,E15.7,5X,E15.7,5X,E15.7 )
 9000 FORMAT(//' F U N C T I O N     V A L U E S'//
     >9X,'VOL/SUR',6X,'VALUE')
 9001 FORMAT(6X,I10,5X,F10.4)
 9004 FORMAT(//' W E I G H T E D     V A L U E S'//
     >9X,'VOL/SUR',6X,'VALUE')
 9005 FORMAT(6X,I10,5X,F10.4)
      END