*---- * Name : rep900_sim.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 Refl.XS SapUOX SapMOX ; 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: ABORT: END: ; PROCEDURE GeoCo SetFuelMap BoronCrit assertS ; *---- * Local parameters *---- REAL BUcycle PrevBUcycle ; REAL keff CB PrevCB PredicCB BURNSTEP NextBURNSTEP Yintrcpt Slope ; REAL CBinit := 2000.0 ; REAL DELTA REFVALUE CALCULATED ; 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 :: EDIT 0 ; SapUOX := Saphyb_UOX :: EDIT 0 ; SapMOX := Saphyb_MOX :: EDIT 0 ; *---- * 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 := rPavX LPitch * 2.0 Lame * + ; INTEGER MaxR := iPavX iPavX * 33 * Splitx * Splitx * Splitz * ; GeoRes Matex := GeoCo :: <> <> <> <> ; Track := TRIVAT: GeoRes :: MAXR <> DUAL 2 3 ; *-- * Define the fuel map *-- Fmap Matex := SetFuelMap Matex :: <> ; *---- * A simple cycle depletion *---- STRING Cycle := "T1" ; INTEGER CycleIndex := 1 ; Fmap := SIM: Fmap :: EDIT 10 CYCLE <> QMAP H G F E D C B A 8 SPC SPC SPC SPC SPC SPC NEW SPC 9 SPC SPC NEW SPC SPC SPC NEW SPC 10 SPC NEW SPC SPC SPC SPC NEW | 11 SPC SPC SPC SPC SPC NEW NEW | 12 SPC SPC SPC SPC SPC NEW | | 13 SPC SPC SPC NEW NEW | | | 14 NEW NEW NEW NEW | | | | 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 ; assertS Fmap :: 'BURN-INST' 1 37500.00 ; assertS Fmap :: 'BURN-INST' 13 25000.00 ; EVALUATE BUcycle BUindex := 0.0 1 ; Power Fmap Matex := BoronCrit Fmap Matex SapUOX SapMOX MacroRefl Track :: <> >>CB<< >>keff<< ; ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ; EVALUATE REFVALUE := 1771.018 ; EVALUATE DELTA := CB REFVALUE - ABS ; IF DELTA 0.1 < THEN PRINT "TEST SUCCESSFUL; DELTA=" DELTA ; ELSE PRINT "------------" ; PRINT "TEST FAILURE" ; PRINT "------------" ; PRINT "REFERENCE=" REFVALUE " CALCULATED=" CB ; ABORT: ; ENDIF ; EVALUATE BURNSTEP := 1000.0 ; REPEAT ECHO "BURNSTEP(" BUindex ") =" BURNSTEP ; EVALUATE BUcycle := BUcycle BURNSTEP + ; Fmap := SIM: Fmap Power :: EDIT 11 CYCLE <> BURN-STEP <> ENDCYCLE ; Power := DELETE: Power ; Power Fmap Matex := BoronCrit Fmap Matex SapUOX SapMOX MacroRefl Track :: <> >>CB<< >>keff<< ; ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ; ! Simple EoC criteria for the first cycle (below 10 plus or minus 1) EVALUATE EoC := CB 10. 1. + <= ; IF EoC NOT THEN IF BUindex 1 = NOT THEN EVALUATE Slope := PrevCB CB - PrevBUcycle BUcycle - / ; EVALUATE Yintrcpt := CB Slope BUcycle * - ; EVALUATE PredicCB := BUcycle 1000.0 + Slope * Yintrcpt + ; IF PredicCB 10.0 < THEN EVALUATE BURNSTEP := 10.0 Yintrcpt - Slope / BUcycle - ; ELSE EVALUATE BURNSTEP := 1000.0 ; ENDIF ; ENDIF ; EVALUATE PrevCB PrevBUcycle := CB BUcycle ; EVALUATE BUindex := BUindex 1 + ; ENDIF ; UNTIL EoC ; Power := DELETE: Power ; *---- * Returning to a previous step (FROM directive) *---- Fmap := SIM: Fmap :: EDIT 10 CYCLE ANTE FROM <> BURN <> ! Before last performed step 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 ; Power Fmap Matex := BoronCrit Fmap Matex SapUOX SapMOX MacroRefl Track :: <> >>CB<< >>keff<< ; ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ; ECHO "BURNSTEP(" BUindex ") =" BURNSTEP ; Fmap := SIM: Fmap Power :: EDIT 1 CYCLE ANTE BURN-STEP <> ! Reperform last step ENDCYCLE ; Power := DELETE: Power ; Power Fmap Matex := BoronCrit Fmap Matex SapUOX SapMOX MacroRefl Track :: <> >>CB<< >>keff<< ; ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ; Power := DELETE: Power ; * Compute the maximum discrepancy on burnup and power distribution REAL MaxDiffBU MaxDiffPow ; Fmap := SIM: Fmap :: EDIT 1 COMPARE <> ANTE DIST-BURN >>MaxDiffBU<< COMPARE <> ANTE DIST-POWR >>MaxDiffPow<< ; ECHO "Delta BUlocal =" MaxDiffBU ; ECHO "Delta Powlocal =" MaxDiffPow ; IF MaxDiffPow 1.0E-3 > MaxDiffBU 1.0E-2 > + THEN PRINT "------------" ; PRINT "TEST FAILURE" ; PRINT "------------" ; ABORT: ; ELSE PRINT "TEST SUCCESSFUL" ; ENDIF ; *---- * Equilibrium cycle convergence *---- LOGICAL EquilibrCycl := $False_L ; REAL BUprevCycle ; ! Mean burnup added during the previous cycle REAL DiffBUCycle ; EVALUATE BUprevCycle := BUcycle ; STRING PrevCycle := Cycle ; STRING MainCycle ; EVALUATE CycleIndex := 2 ; 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 ; * Equilibrium cycle loading pattern Fmap := SIM: Fmap :: EDIT 11 CYCLE <> FROM <> 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 ; EVALUATE BURNSTEP := 1000.0 ; EVALUATE BUcycle BUindex := 0.0 1 ; Power Fmap Matex := BoronCrit Fmap Matex SapUOX SapMOX MacroRefl Track :: <> >>CB<< >>keff<< ; ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ; REPEAT ECHO "BURNSTEP(" BUindex ") =" BURNSTEP ; EVALUATE BUcycle := BUcycle BURNSTEP + ; Fmap := SIM: Fmap Power :: EDIT 11 CYCLE <> BURN-STEP <> ENDCYCLE ; PrevPower := Power ; Power := DELETE: Power ; Power Fmap Matex := BoronCrit Fmap Matex SapUOX SapMOX MacroRefl Track :: <> >>CB<< >>keff<< ; ECHO "BUcycle(" BUindex ")=" BUcycle "CB=" CB "keff=" keff ; 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 IF BUindex 1 = NOT Return 0 = NOT + THEN EVALUATE Slope := PrevCB CB - PrevBUcycle BUcycle - / ; EVALUATE Yintrcpt := CB Slope BUcycle * - ; EVALUATE PredicCB := BUcycle 1000.0 + Slope * Yintrcpt + ; IF PredicCB 10.0 < THEN EVALUATE NextBURNSTEP := 10.0 Yintrcpt - Slope / BUcycle - ; ELSE EVALUATE NextBURNSTEP := 1000.0 ; ENDIF ; ELSE EVALUATE NextBURNSTEP := 1000.0 ; 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 10 CYCLE <> FROM <> BURN <> 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 BUindex := BUindex 1 + ; ENDIF ; ENDIF ; PrevPower := DELETE: PrevPower ; UNTIL EoC ; ECHO "Duration of cycle =" BUcycle "MWj/t, for cycle" Cycle ; Power := DELETE: Power ; Fmap := SIM: Fmap :: EDIT 1 COMPARE <> <> DIST-BURN >>MaxDiffBU<< COMPARE <> <> 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 < * ; 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 EquilibrCycl ; EVALUATE REFVALUE := 12155.97 ; EVALUATE DELTA := BUcycle REFVALUE - ABS ; IF DELTA epsBUcycle < THEN PRINT "TEST SUCCESSFUL; DELTA=" DELTA ; ELSE PRINT "------------" ; PRINT "TEST FAILURE" ; PRINT "------------" ; PRINT "REFERENCE=" REFVALUE " CALCULATED=" BUcycle ; ABORT: ; ENDIF ; *---- * Different average burnup, but using the same burnup distribution *---- Fmap := SIM: Fmap :: EDIT 13 CYCLE EQUI-FIT FROM <> QMAP H G F E D C B A 8 SPC SPC SPC SPC SPC SPC SPC SPC 9 SPC SPC SPC SPC SPC SPC SPC SPC 10 SPC SPC SPC SPC SPC SPC SPC | 11 SPC SPC SPC SPC SPC SPC SPC | 12 SPC SPC SPC SPC SPC SPC | | 13 SPC SPC SPC SPC SPC | | | 14 SPC SPC SPC SPC | | | | 15 SPC SPC | | | | | | SPEC E09 J11 L07 G05 G11 L09 J05 E07 SET AVGB 29500. ! UOX D10 K12 M06 F04 F12 M10 K04 D06 SET AVGB 24000. ! UOX E10 K11 L06 F05 F11 L10 K05 E06 SET AVGB 30200. ! MOX D09 J12 M07 G04 G12 M09 J04 D07 SET AVGB 27300. ! MOX C09 J13 N07 G03 G13 N09 J03 C07 SET AVGB 40200. C10 K13 N06 F03 F13 N10 K03 C06 SET AVGB 36000. A09 J15 R07 G01 G15 R09 J01 A07 SET AVGB 39500. D11 L12 M05 E04 E12 M11 L04 D05 SET AVGB 49900. G08 H09 J08 H07 SET AVGB 29200. F08 H10 K08 H06 SET AVGB 29500. D08 H12 M08 H04 SET AVGB 35500. E11 L11 L05 E05 SET AVGB 35200. F10 K10 K06 F06 SET AVGB 45700. D12 M12 M04 D04 SET AVGB 37500. E08 H11 L08 H05 SET AVGB 50000. C08 H13 N08 H03 SET AVGB 58700. A08 H15 R08 H01 SET AVGB 49500. G09 J09 J07 G07 SET AVGB 54200. H08 SET AVGB 32500. F09 G10 J10 K09 K07 J06 G06 F07 SET AVGB 23500. B09 G14 J14 P09 P07 J02 G02 B07 SET AVGB 12300. B10 F14 K14 P10 P06 K02 F02 B06 SET AVGB 12100. C11 E13 L13 N11 N05 L03 E03 C05 SET AVGB 13500. B11 E14 L14 P11 P05 L02 E02 B05 SET AVGB 9400. C12 D13 M13 N12 N04 M03 D03 C04 SET AVGB 9000. B08 H14 P08 H02 SET AVGB 12300. DIST-AX E09 J11 L07 G05 G11 L09 J05 E07 FROM <> AT E09 D10 K12 M06 F04 F12 M10 K04 D06 FROM <> AT D10 E10 K11 L06 F05 F11 L10 K05 E06 FROM <> AT E10 D09 J12 M07 G04 G12 M09 J04 D07 FROM <> AT D09 C09 J13 N07 G03 G13 N09 J03 C07 FROM <> AT C09 C10 K13 N06 F03 F13 N10 K03 C06 FROM <> AT C10 A09 J15 R07 G01 G15 R09 J01 A07 FROM <> AT A09 D11 L12 M05 E04 E12 M11 L04 D05 FROM <> AT D11 G08 H09 J08 H07 FROM <> AT G08 F08 H10 K08 H06 FROM <> AT F08 D08 H12 M08 H04 FROM <> AT D08 E11 L11 L05 E05 FROM <> AT E11 F10 K10 K06 F06 FROM <> AT F10 D12 M12 M04 D04 FROM <> AT D12 E08 H11 L08 H05 FROM <> AT E08 C08 H13 N08 H03 FROM <> AT C08 A08 H15 R08 H01 FROM <> AT A08 G09 J09 J07 G07 FROM <> AT G09 H08 FROM <> AT H08 F09 G10 J10 K09 K07 J06 G06 F07 FROM <> AT F09 B09 G14 J14 P09 P07 J02 G02 B07 FROM <> AT B09 B10 F14 K14 P10 P06 K02 F02 B06 FROM <> AT B10 C11 E13 L13 N11 N05 L03 E03 C05 FROM <> AT C11 B11 E14 L14 P11 P05 L02 E02 B05 FROM <> AT B11 C12 D13 M13 N12 N04 M03 D03 C04 FROM <> AT C12 B08 H14 P08 H02 FROM <> AT B08 ENDCYCLE ; GREP: Fmap :: GETVAL 'BURN-INST' 1 >>CALCULATED<< ; EVALUATE REFVALUE := 20760.51 ; EVALUATE DELTA := CALCULATED REFVALUE - ABS ; IF DELTA epsBUlocal < THEN PRINT "TEST SUCCESSFUL; DELTA=" DELTA ; ELSE PRINT "------------" ; PRINT "TEST FAILURE" ; PRINT "------------" ; PRINT "REFERENCE=" REFVALUE " CALCULATED=" CALCULATED ; ABORT: ; ENDIF ; REAL Ptot := 2775.0 ; REAL BundPow := Ptot 157.0 / 29.0 / 1.0E+3 * (* MW to kW *) ; Fmap := RESINI: Fmap :: EDIT 0 BUNDLE-POW SAME <> ; Fmap := SIM: Fmap :: EDIT 1 CYCLE EQUI-FIT BURN-STEP 0.001 ! renders EQUI-FIT available for subsequent SIM: calls ENDCYCLE ; *---- * Mixing several cycles into one *---- Fmap := SIM: Fmap :: EDIT 1 CYCLE MIXED FROM <> QMAP H G F E D C B A 8 B08 C12 D13 E11 G10 E08 NEW SPC 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 SPC F13 | | | | | | SPEC A08 FROM EQUI-FIT AT F10 H15 FROM EQUI-FIT AT K10 R08 FROM EQUI-FIT AT K06 H01 FROM EQUI-FIT AT F06 ENDCYCLE ; GREP: Fmap :: GETVAL 'BURN-INST' 1 >>CALCULATED<< ; EVALUATE REFVALUE := 17661.87 ; EVALUATE DELTA := CALCULATED REFVALUE - ABS ; IF DELTA epsBUlocal < THEN PRINT "TEST SUCCESSFUL; DELTA=" DELTA ; ELSE PRINT "------------" ; PRINT "TEST FAILURE" ; PRINT "------------" ; PRINT "REFERENCE=" REFVALUE " CALCULATED=" CALCULATED ; ABORT: ; ENDIF ; GREP: Fmap :: GETVAL 'BURN-INST' 2 >>CALCULATED<< ; EVALUATE REFVALUE := 25944.61 ; EVALUATE DELTA := CALCULATED REFVALUE - ABS ; IF DELTA epsBUlocal < THEN PRINT "TEST SUCCESSFUL; DELTA=" DELTA ; ELSE PRINT "------------" ; PRINT "TEST FAILURE" ; PRINT "------------" ; PRINT "REFERENCE=" REFVALUE " CALCULATED=" CALCULATED ; ABORT: ; ENDIF ; ECHO "test rep900_sim completed" ; END: ; QUIT "LIST" .