summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBWET.f
blob: f30cd99322c23b5dce39f866fa4770a62f0b50e0 (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
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
*DECK LIBWET
      SUBROUTINE LIBWET(MAXR,NEL,NBESP,NSTATE,NMDEPL,ITNAM,ISTATE,
     >                  MATNO,KPAX,BPAX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Identify the depleting isotopes by type and reorder them (recompute
* the KPAX and BPAX matrices).
*
*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): G. Marleau
*
*Parameters: input
* MAXR    number of reaction types.
* NEL     number of isotopes on library.
* NBESP   number of energy-dependent fission yield matrices.
* NSTATE  number of parameters in the state vector.
* NMDEPL  names of reactions:
*           NMDEPL(1)='DECAY'; NMDEPL(2)='NFTOT';
*           NMDEPL(3)='NG'   ; NMDEPL(4)='N2N';
*           etc.
* ITNAM   reactive isotope names in chain.
*
*Parameters: output
* ISTATE  state vector containing the library parameters.
* MATNO   reaction material indices.
*
*Parameters: input/output
* KPAX    complete reaction type matrix.
* BPAX    complete branching ratio matrix.
*
*-----------------------------------------------------------------------
*
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER      MAXR,NEL,NBESP,NSTATE,ITNAM(3,NEL),ISTATE(NSTATE),
     >             MATNO(NEL),KPAX(NEL+MAXR,NEL)
      CHARACTER    NMDEPL(MAXR)*8
      REAL         BPAX(NBESP,NEL+MAXR,NEL)
*----
*  LOCAL VARIABLES
*----
      INTEGER      NDFP,JSO,ISO,ITR,NUNTIL,NHEAVY,NDFI,IUNTIL,NEW,
     >             NLIGHT,NOTHER,NIFP,KPAX0,KPAX1,KPAX2,IEL,JEL,
     >             KREAC,II,NPAR,ICOUNT,NREAC,NSTABL
      REAL         SUMFI
      CHARACTER    TEXT12*12
      LOGICAL      LOGPF
*----
*  INTERNAL PARAMETERS
*----
      INTEGER      KDECAY,KFISSP,KCAPTU,KFISSI,KHEAT
      PARAMETER   (KDECAY=1,KFISSP=2,KCAPTU=3,KFISSI=6,KHEAT=9)
*----
*  COMPUTE NUMBER OF DIRECT FISSION PRODUCT
*  NUMBER DIRECT FISSION PRODUCT
*
*  SET MATNO TO LIGHT (-KFISSP) FOR FISSION PRODUCT
*  SET MATNO TO HEAVY (-KFISSI) FOR FISSILE ISOTOPES
*  SET MATNO TO STABLE (-KHEAT) FOR STABLE ISOTOPES PRODUCING ENERGY
*  SET MATNO TO 0 TO UNUSED ISOTOPES
*----
      NDFI=0
      NDFP=0
      DO 100 JSO=NEL,1,-1
        MATNO(JSO)=0
        KPAX0=KPAX(NEL+KDECAY,JSO)
        KPAX1=KPAX(NEL+KFISSP,JSO)
        KPAX2=KPAX(NEL+KCAPTU,JSO)
        IF((KPAX0.EQ.-9999).OR.(KPAX1.EQ.-9999).OR.(KPAX2.EQ.-9999))
     >  THEN
*         JSO IS A STABLE ISOTOPE
          MATNO(JSO)=-KHEAT
          DO 222 ITR=1,MAXR
            IF(BPAX(1,NEL+ITR,JSO).GT.0.0) THEN
              KPAX(NEL+ITR,JSO)=2
              KPAX(JSO,:NEL)=0
            ENDIF
 222      CONTINUE
          GO TO 100
        ELSE IF(KPAX1.LT.0) THEN
*         JSO IS A FISSION PRODUCT
          MATNO(JSO)=-KFISSP
          NIFP=0
          DO 101 ISO=NEL,1,-1
            IF((KPAX(JSO,ISO).EQ.KFISSP).AND.
     >         (BPAX(1,JSO,ISO).GT.0.0)) THEN
              NIFP=NIFP+1
            ENDIF
 101      CONTINUE
          IF(NIFP.GT.0) THEN
            NDFP=NDFP+1
            KPAX(NEL+KFISSP,JSO)=5+100*NDFP
          ELSE
            KPAX(NEL+KFISSP,JSO)=5
          ENDIF
        ELSE IF(KPAX1.GT.0) THEN
*         JSO IS A FISSILE ISOTOPE
          MATNO(JSO)=-KFISSI
          SUMFI=0.0
          DO 221 ISO=1,NEL
            IF(KPAX(ISO,JSO).EQ.KFISSP) SUMFI=SUMFI+BPAX(1,ISO,JSO)
 221      CONTINUE
          IF(SUMFI.GT.0.0) THEN
            NDFI=NDFI+1
            KPAX(NEL+KFISSP,JSO)=4+100*NDFI
          ELSE
            KPAX(NEL+KFISSP,JSO)=3
          ENDIF
        ENDIF
 100  CONTINUE
*----
*  CHECK IF THE DEPLETION CHAIN IS COHERENT
*----
      DO 200 IEL=1,NEL
        DO 210 JEL=1,NEL
          KREAC=KPAX(JEL,IEL)
          IF(KREAC.EQ.KFISSP) THEN
            IF(MOD(KPAX(NEL+KFISSP,JEL),100).NE.5) THEN
              WRITE(TEXT12,'(3A4)') (ITNAM(II,JEL),II=1,3)
              CALL XABORT('LIBWET: SON '//TEXT12//' IS NOT A FISSION '//
     >                    'PRODUCT')
            ENDIF
            IF((KPAX(NEL+KFISSP,IEL).NE.3).AND.
     >         (MOD(KPAX(NEL+KFISSP,IEL),100).NE.4)) THEN
              WRITE(TEXT12,'(3A4)') (ITNAM(II,IEL),II=1,3)
              CALL XABORT('LIBWET: PARENT '//TEXT12//' IS NOT A FISSI'//
     >                    'LE ISOTOPE')
            ENDIF
          ELSE IF(KREAC.NE.0) THEN
            IF(KPAX(NEL+KREAC,IEL).EQ.0) THEN
              WRITE(TEXT12,'(3A4)') (ITNAM(II,IEL),II=1,3)
              CALL XABORT('LIBWET: PARENT '//TEXT12//' DOES NOT DEPL'//
     >                    'ETE VIA REACTION '//NMDEPL(KREAC))
            ENDIF
          ENDIF
 210    CONTINUE
 200  CONTINUE
*----
*  SET MATNO TO OTHER (-KDECAY) FOR ISOTOPES WITH DAUGHTER OR FATHER
*  AND FOR ISOTOPES WITH DECAY
*----
      DO 112 ISO=1,NEL
        IF(MATNO(ISO).EQ.0) THEN
          IF(KPAX(NEL+KDECAY,ISO).GT.0 .OR.
     >       KPAX(NEL+KCAPTU,ISO).GT.0) THEN
            MATNO(ISO)=-KDECAY
            GO TO 115
          ENDIF
          DO 113 JSO=1,NEL
            IF(KPAX(JSO,ISO).GT.0) THEN
              MATNO(ISO)=-KDECAY
              GO TO 115
            ELSE IF(KPAX(ISO,JSO).GT.0) THEN
              MATNO(ISO)=-KDECAY
              GO TO 115
            ENDIF
 113      CONTINUE
        ENDIF
 115    CONTINUE
 112  CONTINUE
*----
*  SET MATNO TO STABLE (-KHEAT) FOR OTHER ISOTOPES PRODUCING ENERGY
*----
      DO 212 ISO=1,NEL
        IF(MATNO(ISO).EQ.0) THEN
          DO 213 ITR=2,MAXR
            IF(BPAX(1,NEL+ITR,ISO).NE.0.0) THEN
              MATNO(ISO)=-KHEAT
              GO TO 215
            ENDIF
 213      CONTINUE
        ENDIF
 215    CONTINUE
 212  CONTINUE
*----
*  COMPUTE THE MAXIMUM NUMBER OF PARENTS FOR AN ISOTOPE
*----
      NPAR=0
      DO 116 ISO=1,NEL
        ICOUNT=0
        DO 114 JSO=1,NEL
          LOGPF=((MATNO(ISO).EQ.-KFISSP).AND.(MATNO(JSO).EQ.-KFISSI))
          IF((BPAX(1,ISO,JSO).NE.0.0).AND.(.NOT.LOGPF)) ICOUNT=ICOUNT+1
 114    CONTINUE
        NPAR=MAX(NPAR,ICOUNT)
 116  CONTINUE
*----
*  COMPUTE THE MAXIMUM NUMBER OF DEPLETION REACTIONS
*----
      NREAC=4
      DO 118 ISO=1,NEL
        DO 117 ITR=1,MAXR
          IF(KPAX(NEL+ITR,ISO).NE.0) NREAC=MAX(NREAC,ITR)
 117    CONTINUE
 118  CONTINUE
*----
*  SET MATNO TO HEAVY (-KFISSI) FOR ISOTOPES RESULTING FROM DECAY
*  OR CAPTURE OF HEAVY ISOTOPE UNTIL ALL HEAVY ISOTOPES IDENTIFIED
*----
      NUNTIL=NEL
      NHEAVY=0
      DO 120 IUNTIL=1,NUNTIL
        NEW=0
        DO 121 ISO=NEL,1,-1
          IF(MATNO(ISO).EQ.-KFISSI) THEN
            NHEAVY=NHEAVY+1
            DO 122 JSO=NEL,1,-1
              IF(MATNO(JSO).NE.-KFISSI) THEN
                IF((KPAX(JSO,ISO).NE.0).AND.(KPAX(JSO,ISO).NE.KFISSP))
     >          THEN
                  NEW=NEW+1
                  MATNO(JSO)=-KFISSI
                ENDIF
              ENDIF
 122        CONTINUE
          ENDIF
 121    CONTINUE
        IF(NEW.EQ.0) GO TO 125
        NHEAVY=0
 120  CONTINUE
 125  CONTINUE
*----
*  SET MATNO TO LIGHT (-KFISSP) FOR ISOTOPES RESULTING FROM DECAY
*  OR CAPTURE OF LIGHT ISOTOPE UNTIL ALL LIGHT ISOTOPES IDENTIFIED
*----
      NUNTIL=NUNTIL-NHEAVY
      NLIGHT=0
      DO 130 IUNTIL=1,NUNTIL
        NEW=0
        DO 131 ISO=NEL,1,-1
          IF(MATNO(ISO).EQ.-KFISSP) THEN
            NLIGHT=NLIGHT+1
            DO 132 JSO=NEL,1,-1
              IF(MATNO(JSO).NE.-KFISSI.AND.
     >           MATNO(JSO).NE.-KFISSP) THEN
                IF(KPAX(JSO,ISO).NE.0) THEN
                  NEW=NEW+1
                  MATNO(JSO)=-KFISSP
                ENDIF
              ENDIF
 132        CONTINUE
          ENDIF
 131    CONTINUE
        IF(NEW.EQ.0) GO TO 135
        NLIGHT=0
 130  CONTINUE
 135  CONTINUE
*----
*  SET MATNO TO OTHER (-KDECAY) FOR ISOTOPES RESULTING FROM DECAY
*  OR CAPTURE OF OTHER ISOTOPE UNTIL ALL OTHER ISOTOPES IDENTIFIED
*----
      NUNTIL=NUNTIL-NLIGHT
      NOTHER=0
      DO 140 IUNTIL=1,NUNTIL
        NEW=0
        DO 141 ISO=NEL,1,-1
          IF(MATNO(ISO).EQ.-KDECAY) THEN
            NOTHER=NOTHER+1
            DO 142 JSO=NEL,1,-1
              IF(MATNO(JSO).NE.-KFISSI.AND.
     >           MATNO(JSO).NE.-KFISSP.AND.
     >           MATNO(JSO).NE.-KDECAY) THEN
                IF(KPAX(JSO,ISO).NE.0) THEN
                  NEW=NEW+1
                  MATNO(JSO)=-KDECAY
                ENDIF
              ENDIF
 142        CONTINUE
          ENDIF
 141    CONTINUE
        IF(NEW.EQ.0) GO TO 145
        NOTHER=0
 140  CONTINUE
 145  CONTINUE
*----
*  COUNT THE NUMBER OF STABLE ISOTOPES AND SET TO ZERO THEIR RADIOACTIVE
*  DECAY CONSTANT.
*----
      NSTABL=0
      DO 150 ISO=1,NEL
        IF(MATNO(ISO).EQ.-KHEAT) THEN
           NSTABL=NSTABL+1
           BPAX(:,NEL+KDECAY,ISO)=0.0
        ENDIF
 150  CONTINUE
*
      ISTATE(:NSTATE)=0
      ISTATE(1)=NHEAVY+NLIGHT+NOTHER+NSTABL
      ISTATE(2)=NDFI
      ISTATE(3)=NDFP
      ISTATE(4)=NHEAVY
      ISTATE(5)=NLIGHT
      ISTATE(6)=NOTHER
      ISTATE(7)=NSTABL
      ISTATE(8)=NREAC
      ISTATE(9)=NPAR
      ISTATE(10)=NBESP
*----
*  RETURN
*----
      RETURN
      END