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
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
|
*----
* Name : rep900_sim_recopy.x2m
* Type : DONJON procedure
* Author : V. Salino (IRSN), basis by A. Hebert
* Date : 01/11/2014
*
* Compute a simple cycle depletion with critical boron.
* Compute equilibrium cycle for a fictive UOX/MOX loading pattern.
* Simulate various additionnal cycle sequences.
*----
* References
*
* Loading pattern freely inspired from public data:
* Exploitation des coeurs REP (p.36),
* N. Kerkar, P. Paulin,
* EDP Sciences, 2008.
*----
* STRUCTURES, MODULES and PROCEDURES definitions
*----
LINKED_LIST GeoRes Track MacroRefl Matex Fmap Power PrevPower
Thermo MicroF Burn Refl.XS SapUOX SapMOX
Flux BuPC MicPC ;
SEQ_ASCII Saphyb_UOX :: FILE './Saphyb_UOX' ;
SEQ_ASCII Saphyb_MOX :: FILE './Saphyb_MOX' ;
SEQ_ASCII Refl.XS_as :: FILE './Refl.XS_as' ;
MODULE TRIVAT: RESINI: SIM: DELETE: GREP: EVO: ABORT: END: ;
REAL DELTA ;
PROCEDURE GeoCo SetFuelMap Steady InitSteady ;
*----
* Local parameters
*----
LOGICAL True False := $True_L $False_L ;
REAL BUcycle PrevBUcycle ;
REAL keff CB PrevCB PredicCB BURNSTEP NextBURNSTEP Yintrcpt Slope ;
REAL evostep ;
REAL CBinit := 2000.0 ;
INTEGER BUindex ;
LOGICAL EoC ; ! End-of-Cycle reached (TRUE) or not (FALSE)
*----
* Calculation options
*----
INTEGER Splitx Splitz := 1 1 ;
STRING Dir := "EDI2B" ;
*----
* Recover the reflector Macrolib and Saphybs
*----
Refl.XS := Refl.XS_as ;
SapUOX := Saphyb_UOX ;
SapMOX := Saphyb_MOX ;
*----
* Set reflector cross sections (Lefebvre-Lebigot)
*----
MacroRefl := Refl.XS ;
*----
* Define geometric properties
*----
REAL rPavX := 17.0 ; ! assemblage 17 x 17
INTEGER iPavX := 17 ; ! assemblage 17 x 17
REAL LPitch := 1.26 ;
REAL Lame := 0.04 ;
REAL dx := 21.5 ;
INTEGER MaxR := iPavX iPavX * 33 * Splitx * Splitx * Splitz * ;
GeoRes Matex := GeoCo ::
<<Splitx>> <<Splitz>> <<MaxR>> <<dx>> ;
Track := TRIVAT: GeoRes ::
MAXR <<MaxR>> DUAL 2 3 ;
*--
* Define the fuel map
*--
Fmap Matex := SetFuelMap Matex :: <<dx>> ;
*----
* A simple cycle depletion
*----
STRING Cycle := "T1" ;
INTEGER CycleIndex := 1 ;
EVALUATE BUcycle BUindex := 0.0 1 ;
*----
* Equilibrium cycle convergence
*----
LOGICAL EquilibrCycl := $False_L ;
REAL BUprevCycle ; ! Mean burnup added during the previous cycle
REAL DiffBUCycle MaxDiffBU MaxDiffPow ;
EVALUATE BUprevCycle := BUcycle ;
STRING PrevCycle := Cycle ;
STRING MainCycle ;
EVALUATE CycleIndex := 1 ;
INTEGER Return PrevBUindex RtnBUindex ;
STRING ReturnCycle PrevRtnCycle ;
REAL epsBUcycle epsBUlocal epsPowlocal :=
5.0 (* MWd/t *) 10. (* MWd/t *) 0.5E-2 (* Relative error *) ;
REPEAT
EVALUATE MainCycle := "T" CycleIndex I_TO_S + ;
EVALUATE Return := 0 ;
EVALUATE Cycle := MainCycle ;
IF CycleIndex 1 = THEN
Fmap := SIM: Fmap ::
EDIT 2
CYCLE <<Cycle>>
QMAP
H G F E D C B A
8 SPC SPC SPC SPC SPC SPC 4 SPC
9 SPC SPC NEW SPC SPC SPC NEW SPC
10 SPC NEW SPC SPC SPC SPC 4 |
11 SPC SPC SPC SPC SPC NEW 4 |
12 SPC SPC SPC SPC SPC 4 | |
13 SPC SPC SPC NEW 4 | | |
14 4 NEW 4 4 | | | |
15 SPC SPC | | | | | |
SPEC
E09 J11 L07 G05 G11 L09 J05 E07
D10 K12 M06 F04 F12 M10 K04 D06 SET AVGB 12500. ! UOX
E10 K11 L06 F05 F11 L10 K05 E06
D09 J12 M07 G04 G12 M09 J04 D07 SET AVGB 12500. ! MOX
C09 J13 N07 G03 G13 N09 J03 C07
C10 K13 N06 F03 F13 N10 K03 C06 SET AVGB 25000.
A09 J15 R07 G01 G15 R09 J01 A07
D11 L12 M05 E04 E12 M11 L04 D05 SET AVGB 37500.
G08 H09 J08 H07
F08 H10 K08 H06
D08 H12 M08 H04
E11 L11 L05 E05 SET AVGB 12500.
F10 K10 K06 F06
D12 M12 M04 D04
E08 H11 L08 H05 SET AVGB 25000.
C08 H13 N08 H03
A08 H15 R08 H01
G09 J09 J07 G07 SET AVGB 37500.
H08 SET AVGB 12500.
ENDCYCLE ;
Flux Thermo MicroF Burn Fmap Matex := InitSteady
Fmap Matex SapUOX SapMOX MacroRefl Track :: <<CycleIndex>> ;
ELSE
* Equilibrium cycle loading pattern
* Debut du cycle suivant :
* On recharge avec SIM. Le contenu de {hcycle} de la Fmap
* est recupere et mis dans ISOTOPESDENS de la Microlib.
* Pour les assemblages NEW, il faut les initialiser a 0. (pas de Xenon)
MicroF Fmap := SIM: MicroF Fmap ::
EDIT 1
CYCLE <<Cycle>> FROM <<PrevCycle>>
QMAP
H G F E D C B A
8 B08 C12 D13 E11 G10 E08 NEW F10
9 M13 D12 NEW B10 B09 E09 NEW C10
10 N12 NEW F08 C11 B11 D10 NEW |
11 L11 F14 E13 F09 C09 NEW NEW |
12 K09 G14 E14 G13 G08 NEW | |
13 H11 G11 F12 NEW NEW | | |
14 NEW NEW NEW NEW | | | |
15 K10 F13 | | | | | |
ENDCYCLE ;
Flux Thermo MicroF Burn Fmap Matex := InitSteady
MicroF Fmap Matex SapUOX SapMOX MacroRefl Track :: <<CycleIndex>> ;
ENDIF ;
EVALUATE BURNSTEP := 50.0 ;
EVALUATE evostep := BURNSTEP 38. / ;
* 38. correspond au facteur de conversion MWj/t -> JEPP
ECHO "pas de temps (en JEPP):" evostep ;
EVALUATE BUcycle BUindex := 0.0 1 ;
EVALUATE PredicCB := 2000.0 ; ! CBinit, debut de cycle
Power Flux Thermo MicroF Burn Fmap Matex := Steady
Flux Thermo MicroF Burn Fmap Matex SapUOX SapMOX
MacroRefl Track ::
<<True>> <<PredicCB>> <<False>> <<True>>
>>CB<< >>keff<< ;
ECHO "BUcycle( 0 )=" BUcycle "CB=" CB "keff=" keff ;
EVALUATE PredicCB := CB ;
EVALUATE PrevCB PrevBUcycle := CB BUcycle ;
EVALUATE BUindex := 1 ;
REPEAT
ECHO "BURNSTEP(" BUindex ") =" BURNSTEP ;
EVALUATE BUcycle := BUcycle BURNSTEP + ;
* A chaque debut d'un nouveau pas de temps on enregistre le contenu
* de la Microlib dans la Fmap, dans le repertoire {hcycle}
Fmap := SIM: Fmap MicroF Power ::
EDIT 1
CYCLE <<Cycle>>
BURN-STEP <<BURNSTEP>>
ENDCYCLE ;
* Mise en place du predicteur-correcteur : on realise un premier pas
* pour faire evoluer les isotopes au pas de temps i+1
BuPC := Burn ;
MicPC := MicroF ;
Burn MicroF := EVO: Burn MicroF Power ::
EDIT 0 RUNG FLUX_POW PIFI DEPL <<evostep>> DAY KEEP ;
Power := DELETE: Power ;
* S'en suit un deuxieme passage dans Steady pour :
* 1) Calcul du flux converge au pas i+1
* 2) Extraction du flux au pas de temps i+1/2 a l'aide des
* flux i et i+1
Power Flux Thermo MicroF Burn Fmap Matex := Steady
Flux Thermo MicroF Burn Fmap Matex SapUOX SapMOX
MacroRefl Track ::
<<True>> <<PredicCB>> <<False>> <<True>>
>>CB<< >>keff<< ;
Burn MicroF := DELETE: Burn MicroF ;
* Pour finir, une evolution des isotopes est realisee du pas de
* temps i (on reprend la Microlib issue du premier passage dans
* Steady, au pas i+1 en utilisant le flux au pas i+1/2
BuPC MicPC := EVO: BuPC MicPC Power ::
EDIT 0 RUNG FLUX_POW PIFI DEPL <<evostep>> DAY KEEP ;
Burn := BuPC ;
MicroF := MicPC ;
BuPC MicPC := DELETE: BuPC MicPC ;
PrevPower := Power ;
Power := DELETE: Power ;
Power Flux Thermo MicroF Burn Fmap Matex := Steady
Flux Thermo MicroF Burn Fmap Matex SapUOX SapMOX
MacroRefl Track ::
<<True>> <<PredicCB>> <<False>> <<False>>
>>CB<< >>keff<< ;
ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ;
ECHO "Save number densities of particularized isotopes in Fmap"
" at cycle " Cycle ;
Fmap := SIM: Fmap MicroF Power ::
EDIT 1
CYCLE <<Cycle>>
SET-FOLLOW
ENDCYCLE ;
IF CB 10.0 - ABS 1.0 < THEN ! Narrower criteria for equilibrium
EVALUATE EoC := $True_L ;
ELSE
EVALUATE EoC := $False_L ;
* Find end-of-cycle using a Newton's method
EVALUATE Slope := PrevCB CB - PrevBUcycle BUcycle - / ;
EVALUATE Yintrcpt := CB Slope BUcycle * - ;
* Distinction des BUindex car le pas de temps utilise n'est pas
* regulier
* Maillage utilise : 0, 50, 100, 150, 300, 500, 1000, 2000, ...
* La condition d'arret du cycle est CB= 10 ppm
IF BUindex 1 = BUindex 2 = + THEN
EVALUATE PredicCB := BUcycle 50.0 + Slope * Yintrcpt + ;
ELSEIF BUindex 3 = THEN
EVALUATE PredicCB := BUcycle 150.0 + Slope * Yintrcpt + ;
ELSEIF BUindex 4 = THEN
EVALUATE PredicCB := BUcycle 200.0 + Slope * Yintrcpt + ;
ELSEIF BUindex 5 = THEN
EVALUATE PredicCB := BUcycle 500.0 + Slope * Yintrcpt + ;
ELSE
EVALUATE PredicCB := BUcycle 1000.0 + Slope * Yintrcpt + ;
ENDIF ;
IF PredicCB 10.0 < THEN
EVALUATE NextBURNSTEP := 10.0 Yintrcpt - Slope / BUcycle - ;
EVALUATE PredicCB := 10.0 ; ! ppm aimed
ELSEIF BUindex 1 = BUindex 2 = + THEN
EVALUATE NextBURNSTEP := 50.0 ; !We have margins before EoC
ELSEIF BUindex 3 = THEN
EVALUATE NextBURNSTEP := 150.0 ; !We have margins before EoC
ELSEIF BUindex 4 = THEN
EVALUATE NextBURNSTEP := 200.0 ; !We have margins before EoC
ELSEIF BUindex 5 = THEN
EVALUATE NextBURNSTEP := 500.0 ; !We have margins before EoC
ELSE
EVALUATE NextBURNSTEP := 1000.0 ; !We have margins before EoC
ENDIF ;
* Use the previous step for future BURNSTEP evaluation
EVALUATE PrevCB PrevBUcycle := CB BUcycle ;
IF NextBURNSTEP 0.0 < THEN
* Return back in time
EVALUATE BUcycle := BUcycle BURNSTEP - ;
IF BUindex 1 = NOT THEN
EVALUATE ReturnCycle RtnBUindex := Cycle BUindex ;
ELSE
EVALUATE ReturnCycle RtnBUindex := PrevRtnCycle PrevBUindex ;
ENDIF ;
EVALUATE Return := Return 1 + ;
EVALUATE Cycle := MainCycle "rtn" Return I_TO_S + + ;
Fmap := SIM: Fmap ::
EDIT 1
CYCLE <<Cycle>> FROM <<ReturnCycle>> BURN <<RtnBUindex>>
QMAP
H G F E D C B A
8 H08 G08 F08 E08 D08 C08 B08 A08
9 H09 G09 F09 E09 D09 C09 B09 A09
10 H10 G10 F10 E10 D10 C10 B10 |
11 H11 G11 F11 E11 D11 C11 B11 |
12 H12 G12 F12 E12 D12 C12 | |
13 H13 G13 F13 E13 D13 | | |
14 H14 G14 F14 E14 | | | |
15 H15 G15 | | | | | |
ENDCYCLE ;
* Reuse previous power distribution
Power := DELETE: Power ;
Power := PrevPower ;
IF BUindex 1 = NOT THEN
* For the next step, use previous step if CB still not above 10
EVALUATE PrevRtnCycle := ReturnCycle ;
EVALUATE PrevBUindex := BUindex ;
ENDIF ;
* Reestablishing cycle implies BUindex reboot
EVALUATE BUindex := 1 ;
* Recompute a smaller step
EVALUATE BURNSTEP := BURNSTEP NextBURNSTEP + ;
ELSE
EVALUATE BURNSTEP := NextBURNSTEP ;
EVALUATE evostep := BURNSTEP 36.8 / ;
ECHO "pas de temps:" evostep ;
EVALUATE BUindex := BUindex 1 + ;
ENDIF ;
ENDIF ;
PrevPower := DELETE: PrevPower ;
UNTIL BUindex 2 = ;
ECHO "Duration of cycle =" BUcycle "MWj/t, for cycle" Cycle ;
Flux := DELETE: Flux ;
Power Thermo Burn := DELETE: Power Thermo Burn ;
IF CycleIndex 1 > THEN
Fmap := SIM: Fmap ::
EDIT 1
COMPARE <<Cycle>> <<PrevCycle>> DIST-BURN >>MaxDiffBU<<
COMPARE <<Cycle>> <<PrevCycle>> DIST-POWR >>MaxDiffPow<< ;
EVALUATE DiffBUCycle := BUprevCycle BUcycle - ABS ;
ECHO "Delta BUcycle =" DiffBUCycle ;
ECHO "Delta BUlocal =" MaxDiffBU ;
ECHO "Delta Powlocal =" MaxDiffPow ;
EVALUATE EquilibrCycl := ! 3 convergence criterion
BUprevCycle BUcycle - ABS epsBUcycle <
MaxDiffBU epsBUlocal < *
MaxDiffPow epsPowlocal < * ;
ENDIF ;
EVALUATE BUprevCycle := BUcycle ;
EVALUATE PrevCycle := Cycle ;
EVALUATE CycleIndex := CycleIndex 1 + ;
IF CycleIndex 20 > THEN
ECHO "Non-convergence " ;
ECHO "Equibrium cycle was not found after 20 iterations." ;
ABORT: ;
ENDIF ;
UNTIL CycleIndex 3 = ;
ECHO "Converged Delta BUlocal =" MaxDiffBU ;
REAL REFVALUE := 12497.43 ;
EVALUATE DELTA := MaxDiffBU REFVALUE - REFVALUE / ABS ;
IF DELTA 5.0E-5 < THEN
PRINT "TEST SUCCESSFUL; DELTA=" DELTA ;
ELSE
PRINT "------------" ;
PRINT "TEST FAILURE" ;
PRINT "------------" ;
PRINT "REFERENCE=" REFVALUE " CALCULATED=" MaxDiffBU ;
ABORT: ;
ENDIF ;
ECHO "Successful end of rep900_sim_recopy." ;
END: ;
QUIT "LIST" .
|