Development of a Core Design Optimization... the Planned LEU Conversion of the MIT...

Development of a Core Design Optimization Tool and Analysis in Support of
the Planned LEU Conversion of the MIT Research Reactor (MITR-II)
by
HEATHER M. CONNAWAY
B.S. Nuclear Engineering, 2010
The University of Florida
Submitted to the Department of Nuclear Science and Engineering in Partial
Fulfillment of the Requirements for the Degree of
Master of Science in Nuclear Science and Engineering
at the
Massachusetts Institute of Technology
September 2012
MASSACHUSErSINS~T1f1E
FEB
'Y
J)
©2012 Massachusetts Institute of Technology
All rights reserved
Signature of Author:
Heather M. Connaway
August 17, 2012
Certified by:
Benoit Forget, Ph.D.
Asfta'tAroffessor of Nuclear Science and Engineering
Thesis Supervisor
-K'
'/)
A//
//L
Thomas H. Newton, Jr., Ph.D.
Associate Director, Engineering, Nuclear Reactor Laboratory
(
Thesis Reader
Accepted by:
id S. Kazimi, Ph.D.
TEPCO Profes r of Nuclear Engineering
Chair, Department Committee on Graduate Students
4
2
Development of a Core Design Optimization Tool and Analysis in Support of the
Planned LEU Conversion of the MIT Research Reactor (MITR-II)
by
HEATHER M. CONNAWAY
Submitted to the Department of Nuclear Science and Engineering in Partial
Fulfillment of the Requirements for the Degree of
Master of Science in Nuclear Science and Engineering
at the
Massachusetts Institute of Technology
ABSTRACT
The MIT Research Reactor (MITR-II) is currently undergoing analysis for the planned
conversion from high enriched uranium (HEU) to low enriched uranium (LEU), as part of a
global effort to minimize the availability of weapons-grade uranium. In support of efficient fuel
management analysis with the new LEU fuel, a core design optimization tool has been
developed. Using a coarse model, the tool can quickly consider the large range of refueling
options available, and identify a solution which minimizes power peaking with the least fuel
shuffling possible. The selected scheme can then be examined in greater detail with a more
robust simulation tool.
The unique geometry of the MITR core makes it difficult to develop a model that both runs very
quickly and provides detailed power distribution information. Therefore, a correlation-based
approach has been employed. Relationships between burnup, critical control blade position, core
Um mass, and power distribution are used to predict fuel element U23s depletion, critical control
blade motion, and power peaking. The tool applies the correlations to identify an optimal loading
pattern, defined as the core which has the lowest maximum radial peaking factor in the set of
valid solutions with the minimum number of fuel shuffling actions. The correlations that are
utilized by the optimization tool were developed using data from simulations with MCODE-FM,
a fuel management wrapper for the MCNP-ORIGEN linkage code MCODE. The correlations
have been verified with results from additional MCODE-FM runs, and the code logic has been
verified with the core loading solutions for a variety of input parameters. The verification found
that the code is able to predict radial peaking, core mass, and general control blade motion with
sufficient accuracy to develop a good refueling scheme. The tool provides the output solution in
an interactive format, which allows the user to quickly examine small perturbations on the
identified loading pattern. In addition to the optimization tool development, loading patterns for
the mixed HEU-LEU fuel transition cores have been evaluated. This analysis identified general
behavioral trends of the mixed-fuel cores, which serve as an initial basis for future transition core
analysis.
Thesis Supervisor: Benoit Forget
Title: Assistant Professor of Nuclear Science and Engineering
3
4
Acknowledgements
This work was sponsored by the Global Threat Reduction Initiative Program at Argonne
National Laboratory.
I would like to thank my advisors Benoit Forget and Thomas Newton for their guidance and
support. This project that has been an excellent learning experience for me, and they have
provided very helpful advice and feedback throughout my time here at MIT. I would also like to
thank Nick Horelik, who spent a great deal of time demonstrating the fundamentals of MCODEFM. He was always very willing to help whenever I ran into trouble, and his well-structured code
work served as an excellent example when developing my own code. I am also grateful to LinWen Hu and Ed Pilat for their feedback throughout my time working on the conversion project,
and to Paul Romano for his assistance when I was just getting started. In addition, I would like to
thank Argonne National Laboratory employees Benoit Dionne and Arne Olson for taking the
time to meet with me. Their feedback strongly influenced the direction of my research.
I am also grateful to my NSE classmates, particularly my fellow Gators, for making my time at
MIT and in Boston much more enjoyable. Finally, I would like to thank my parents, brothers
Patrick and Sean, and boyfriend Adam for their love and encouragement. I am very fortunate to
have such a strong support system, and I would not be where I am today without them.
5
6
Table of Contents
2
I IN TRO DU CTION .................................................................................................................
14
1.1
Objectives.......................................................................................................................
14
1.2
M ITR D escription ..........................................................................................................
15
1.3
M ITR Fuel Elem ents....................................................................................................
17
1.4
Current M ITR Fuel M anagem ent................................................................................
20
LEU REFUELING CORE-DESIGN OPTIMIZATION TOOL ....................
22
2.1
Selected Approach..........................................................................................................
22
2.2
Analysis and Correlations ..........................................................................................
24
2.2.1
Criticality, Cycle Length, and Control Blade Movement ..................................
25
2.2.2
Pow er D istribution...............................................................................................
37
2.3
M ethodology ..................................................................................................................
51
2.3.1
Evaluation of Previous Core ................................................................................
2.3.2
Determination of Core U23s Mass Needed to Achieve Target Burnup................ 56
2.3.3
Elem ent Evaluation.............................................................................................
60
2.3.4
Placing Fresh Elem ents.......................................................................................
60
2.3.5
M aking Required Loading Pattern Changes ........................................................
61
2.3.6
Full Optim ized Search ........................................................................................
62
2 .4
U sa g e ..............................................................................................................................
53
66
2.4.1
GU I Interface ..........................................................................................................
66
2.4.2
Output .....................................................................................................................
69
V erification.....................................................................................................................
72
2.5
2.5.1
V erification of Code M ethodology.....................................................................
72
2.5.2
V erification of Correlations................................................................................
79
3
TRAN SITION CORE AN A LY SIS.......................................................................................
91
4
CON CLU SION S ...................................................................................................................
97
5
FU TU RE W O RK ..................................................................................................................
98
REFEREN CES ...........................................................................................................................
100
APPENDIX A - OPTIMIZATION TOOL SOURCE CODE ....................................................
102
A .] gui/Optim izerGuiD ialog.py..............................................................................................
102
A .2 utils/LEU core optim ization.py ......................................................................................
1 10
7
A .3 utils/getcurrent core.py..................................................................................................
115
A .4 utils/opt-subs.py...............................................................................................................
125
A .5 utils/shuffle subs.py.........................................................................................................
150
APPENDIX B - TRANSITION CORE FUEL SHUFFLING SCHEMES................................
8
180
List of Figures
Figure 1-1 Cross-Sectional View of the MITR Core [6].........................................................
16
Figure 1-2 Engineering Drawing of an HEU Fuel Element [7].................................................
17
Figure 1-3 Cross-Sectional Engineering Drawing of an HEU Fuel Element [7] ......................
17
Figure 1-4 Schematic of the Proposed LEU Fuel Element Design [2]......................................
18
Figure 2-1 REBUS-PC Model of the MITR-1I Core [6]..........................................................
23
Figure 2-2 Critical Blade Position, Depletion of Cores 179-190 [2].........................................
24
Figure 2-3 Critical Blade Position, LEU Equilibrium Run, Core 190 (7 MW).........................
25
Figure 2-4 U 23 Mass in Core as a Function of (a) Time and (b) Burnup................................
26
Figure 2-5 U 23 Mass Lost as a Function of Burnup................................................................
27
Figure 2-6 U 2 3 5 Mass Lost by an Individual Element vs. Core Burnup, for LEU Equilibrium Core
19 0 .................................................................................................................................................
28
Figure 2-7 Element Depletion Rate vs. Element Mass Peaking Factor....................................
29
Figure 2-8 Allowable LEU Element BOC and EOC U 23 Mass Ranges for Each Ring ........... 30
Figure 2-9 Critical Blade Position as a Function of U235 Mass in the Core, LEU Equilibrium Core
19 0 .................................................................................................................................................
31
Figure 2-10 Critical Control Blade Position for 3,4,5, and 6 New LEU Fuel Elements Added to
th e S am e C o re ...............................................................................................................................
32
Figure 2-11 Critical Blade Position vs. Mass, LEU Equilibrium Cores 187-190, 7 MW, steps 2 to
E O C ...............................................................................................................................................
32
Figure 2-12 Data Fits for the Power-Dependent Critical Blade Position vs. Core U2 35 Mass
Equations, Steps 2 to EOC, for Equation Parameters (a) Slope and (b) Y-Intercept ..............
33
Figure 2-13 Critical Control Blade Position vs. Core U2 35 Mass, Steps 0 to I.........................
34
Figure 2-14 Relative Change in Control Blade Position vs. Relative Change in Mass for All
C ores, A ll P ow ers .........................................................................................................................
35
Figure 2-15 Blade Worth Curves for LEU Equilibrium Cores.................................................
36
Figure 2-16 Differential Blade Worth Curves for LEU Equilibrium Cores, LEU Cores 187-190,
BOC and EOC.............................................................................................................. 36
Figure 2-17 Power Distribution (W) at (a) BOC and (b) EOC at Axial Level 3 (of 6) for a Core
Loaded with the Sam e Element in Every Location ..................................................................
37
Figure 2-18 Example Classifications of Parallel and Perpendicular Elements..........................
9
38
Figure 2-19 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass
Peaking Factors for location A 2, BO C ......................................................................................
40
Figure 2-20 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass
Peaking Factors for B-ring Locations, BOC.............................................................................
40
Figure 2-21 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass
Peaking Factors for C-ring Locations, BOC .............................................................................
41
Figure 2-22 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass
Peaking Factors for location A2, EOC .....................................................................................
41
Figure 2-23 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass
Peaking Factors for B-ring Locations, EOC .............................................................................
42
Figure 2-24 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass
Peaking Factors for C-ring Locations, EOC .............................................................................
42
Figure 2-25 (a) BOC Power (W), (b) BOC Mass (g), (c) EOC Power (W), and (d) EOC Mass
(g), for Equilibrium Core 189, Location C2, Plate 18 .............................................................
46
Figure 2-26 (a) Power (W) and (b) Mass (g) for Equilibrium Core 189, Location C2, Plate 18,
Ax ial Z on e 15 (of 18) ...................................................................................................................
47
Figure 2-27 Preliminary Attempt to Correlate the Lateral Power Peaking Factors to Lateral Mass
Peaking Factors for the First and Last Lateral Stripe; Data for select C-ring Elements, LEU Core
18 6 , B O C ......................................................................................................................................
48
Figure 2-28 Logical Flow Chart For the General Methodology of the Optimization Tool.......... 52
Figure 2-29 Logical Flow Chart for Evaluation of the Previous Core .....................................
54
Figure 2-30 Segmentation of a LEU Fuel Element Radially, Axially, and Laterally to Evaluate
M ass B iases...................................................................................................................................
55
Figure 2-31 Example of a 'storedelements/storage mats' File from an MCODE-FM Run....... 55
Figure 2-32 Example of Control Blade Behavior at the Maximum and Minimum Allowable BOC
Po sitio n s ........................................................................................................................................
57
Figure 2-33 Example of Target Mass Range Analysis for 3 Different EOC Blade Position
Co n strain ts ....................................................................................................................................
58
Figure 2-34 Logical Flow Chart For Calculation of U235 Mass Needed....................................
59
Figure 2-35 Flow Logic Diagram for the Evaluation of a Core Loading Pattern.....................
64
Figure 2-36 Flow Logic Diagram Summarizing the Approach of the Full Search Algorithm..... 65
Figure 2-37 User Interface Window for Optimizing a New Core ............................................
66
Figure 2-38 Example of the Excel Output File Content, (a) BOC and (b) EOC .......................
70
10
Figure 2-39 Example of the Excel Output File Content with After Changes to the Element in C10
and the Target Cycle Length, (a) BOC and (b) EOC.................................................................
71
Figure 2-40 Comparison of the Correlation Predicated and MCODE-FM Calculated Maximum
Radial Peaking Factors in Each Element for (a) BOC and (b) EOC for LEU Equilibrium Core
80
18 5 .................................................................................................................................................
Figure 2-41 Comparison of the Correlation Predicated and MCODE-FM Calculated Maximum
Peaking Factors, (a) BOC Axial, (b) EOC Axial, (c) BOC Lateral, (d) EOC Lateral, for LEU
E qu ilibrium C ore 185 ...................................................................................................................
81
Figure 2-42 Critical Control Blade Position over LEU Equilibrium Core 185 ........................
81
Figure 2-43 Individual Element Maximum Radial Peaking Factor Verification, (a) Core 191
BOC, (b) Core 191 EOC, (c) Core 192 BOC, (d) Core 192 EOC, (e) Core 193 BOC, (f) Core 193
EOC...................................................................................... 89
Figure 2-44 Critical Control Blade Position Verification, (a) Core 191, (b) Core 192, (c) Core
90
19 3 .................................................................................................................................................
11
List of Tables
Table 1-1 A Comparison of HEU and LEU Element Dimensions [2] .....................................
19
Table 2-1 Linear Fit to M ass Loss vs. Burnup.........................................................................
27
Table 2-2 Linear Fits to Individual Element Mass Loss Rates vs. Element Mass Peaking; Loss
R ates in g/M W d ............................................................................................................................
30
Table 2-3 Linear Fits to the Blade Position vs. Core Mass Values for LEU Equilibrium Cores
187 to 190, for M CODE-FM time steps Step 2 to EOC...............................................................
33
Table 2-4 Linear Fits against Core Power to the Slope and Y-intercept of the Blade Position vs.
34
M ass E qu ation s .............................................................................................................................
Table 2-5 Linear Fit to the Change in Critical Control Blade Position vs. Change in Core Mass
Data for LEU Equilibrium Cores 187-190, MCODE-FM steps 0 to 2....................
35
Table 2-6 Polynomial Fit to the Differential Blade Worth Data, LEU Cores 187-190............ 36
Table 2-7 Summary of Individual Core Location Element Orientation / Plate Orientation
R elation ship s.................................................................................................................................
39
Table 2-8 Linear Fits to the BOC Maximum Element Radial Peaking Factor vs. Element Mass
P eak in g F actor Data ......................................................................................................................
43
Table 2-9 Linear Fits to the EOC Maximum Element Radial Peaking Factor vs. Element Mass
P eak ing Factor Data ......................................................................................................................
44
Table 2-10 BOC Axial Power Peaking Factor Prediction; Data Set is Maximum Peaking Value in
Each Element of LEU Equilibrium Cores 186-190 ..................................................................
49
Table 2-11 EOC Axial Power Peaking Factor Prediction; Data Set is Maximum Peaking Value in
Each Element of LEU Equilibrium Cores 186-190 ..................................................................
49
Table 2-12 BOC Lateral Power Peaking Factor Prediction; Data Set is Maximum Peaking Value
in Each Element of LEU Equilibrium Cores 186-190..............................................................
50
Table 2-13 EOC Lateral Power Peaking Factor Prediction; Data Set is Maximum Peaking Value
in Each Element of LEU Equilibrium Cores 186-190 ..............................................................
50
Table 2-14 Source Code Files for the Optimization Tool..........................................................
51
Table 2-15 B-Ring Partner Locations for Placing 3 Fresh Elements.........................................
61
Table 2-16 Description of Optimization Tool Interface Window Items....................................
67
Table 2-17 Solution From LEU 190, For Default Input Constraints of 50 days, 6 MW, 2.0
Maximum Peaking, 3 New, 48.0 Maximum EOC Blade, 17.0 Minimum BOC Blade, 35.0
M axim um B O C B lade ..................................................................................................................
74
12
Table 2-18 Comparison of Solution (1) With Default Inputs, (2) With "keep" MIT 349 in Core,
75
a n d .................................................................................................................................................
Table 2-19 Comparison of Solution with Maximum Peaking Constraint of 1.9.....................
77
Table 2-20 Comparison of Original Solutions with Case with Minimum BOC Critical Blade
Po sition o f 2 9 cm ..........................................................................................................................
78
Table 2-21 MCODE Peaking Factor Values from MCNP Tally Data and the % Error in the
Correlation Prediction of the Parameter, LEU Equilibrium Core 185, 6 radial/ 18 axial/ 4 Lateral
Me sh ..............................................................................................................................................
82
Table 2-22 Evaluation of the Depletion Correlations, LEU Equilibrium Core 185 .................
83
Table 2-23 Fuel Shuffling for Verification Cores 191-193 .....................................................
84
Table 2-24 Individual Element U235 Depletion Verification ...................................................
85
Table 2-25 Individual Element Maximum Radial Peaking Factor Verification.......................
86
Table 2-26 Individual Element Maximum Axial Peaking Factor Verification ........................
87
Table 2-27 Individual Element Maximum Lateral Peaking Factor Verification......................
88
Table 2-28 Critical Control Blade Position Verification ..........................................................
90
Table 3-1 Summary of the Transition Core Cases Discussed....................................................
93
Table 3-2 Key Performance Parameters For Transition Cores Case 1 ......................................
94
Table 3-3 Key Performance Parameters for Transition Cores Case 2......................................
94
Table 3-4 Key Performance Parameters for Transition Core cases with 10,000 MWh bumup per
core
(a) Case 3, (b) Case 4 with 1 Lateral Zone Mesh, (c) Case 4 with 4
Lateral Zone Mesh, (d) Case 5 with 4 Lateral Zone Mesh .......................................................
95
Table 3-5 Key Performance Parameters for Transition Core Cases at Higher Burnups (a) Case 4
at 15,000 MWh per core, I Lateral Zone Mesh, (b) Case 4 at 20,000 MWh per core, I Lateral
Zone Mesh, (c) Case 5 at 15,000 MWh per core, 4 Lateral Zone Mesh, (d) Case 5 at 20,000
MWh for Core 192 and 15,000 MWh for all other Cores, 4 Lateral Zone Mesh .....................
13
96
1
1.1
INTRODUCTION
Objectives
There is an ongoing effort worldwide to transition away from the use of highly enriched uranium
(HEU) in research reactors. The Reduced Enrichment for Research and Test Reactors (RERTR)
Program was established in the United States in 1978 to facilitate the conversion of HEU-fueled
reactors to low enriched uranium (LEU). The use of LEU (defined as fuel with less than 20%
uranium-235 enrichment) will minimize the availability of weapons-grade uranium. Increased
fears of terrorism have resulted in a stronger push to convert all of the U.S. reactors as quickly as
possible. A goal has been established to convert all domestic reactors to LEU by 2014. However,
conversion by this date while maintaining operation is not feasible for higher power reactors,
which require the development and qualification of a higher density fuel [1]. With the exception
of the five high performance reactors, all other domestic civilian reactors have been successfully
converted to HEU.
For the reactor facilities themselves, an important goal is to develop an LEU core which
maintains the scientific usefulness of the reactor. The Massachusetts Institute of Technology
Reactor (MITR-II) is a 6 MW tank-type research reactor located in Cambridge Massachusetts. It
has a compact HEU-fueled core, and delivers a neutron flux comparable to that of a typical
PWR. The MITR is planned for conversion to LEU using a new type of fuel based upon a
uranium-molybdenum alloy (UMo). The LEU-fueled MITR core must meet in-core experimental
needs such as neutron spectrum, reactivity, and size, and must be optimized to provide a high
neutron flux to the experimental facilities [1 ],[2].
The MITR has a long operating history with HEU (discussed in detail in Section 1.2). The
operators are therefore very adept at fuel management, and are able to employ standardized
refueling approaches. They can roughly predict an appropriate way to refuel before they ever
analyze a potential loading pattern with a simulation tool, and can design a shuffling pattern
without having to evaluate an excessive number of cores. The LEU fuel, however, has very
different material properties than HEU, and in addition the LEU fuel to be used in the MITR
(discussed in Section 0) has not yet been employed in an operating reactor. An LEU-fueled core
will not behave the same as an HEU fueled core, and the traditional assumptions regarding fuel
management cannot automatically be applied to LEU. It will therefore be much more difficult to
engage in efficient fuel management with the unfamiliar LEU fuel.
14
Fuel management is a crucial aspect of nuclear reactor operations. It involves a number of
decisions, including the number of fresh elements to insert, the selection of partially-burned
elements to employ, and the locations and orientations of these elements within the core. Proper
fuel management minimizes the cost of the fuel cycle, while satisfying requirements for power,
flux, and other parameters. This process is largely constrained by safety and operational
limitations. There are numerous variables which must be considered in core design, which results
in a massive decision space [3]. Reload optimization methods are necessary, which can
accurately identify the optimal loading scheme from the full set of possible solutions, without
undergoing the time-consuming practice of explicitly simulating every one with a set of full
criticality and depletion models.
The goal of this project is to develop a refueling optimization code that can be used for reload
analysis of the MITR following its conversion to LEU fuel. This tool is intended to evaluate a
number of potential core arrangements very quickly using coarse models and select the best
solution. A core designer can then analyze the chosen loading scheme more explicitly with the
stronger existing fuel management tools. In support of the optimization tool, this analysis also
seeks to evaluate and establish general trends related to criticality and the power distribution
profile in LEU-fueled cores.
Another objective of this work is to analyze the predicted behavior of the core during the
transition from HEU to LEU. The current plan for this conversion is to slowly introduce LEU
into the HEU fueled reactor over a series of sequential cores of mixed fuel. The two fuel types
have very different properties, and it is the objective of this analysis to verify that the transition
cores can be employed without violating the safety constraints of the reactor, particularly power
peaking.
1.2
MITR Description
The MIT Reactor is employed for a number of experimental purposes, including neutron
activation analysis, neutron scattering, and the study of dose reduction, coolant chemistry, and
irradiation effects [4]. It was initially designed as a D 2 0 cooled and moderated core, and it first
achieved criticality in July of 1958 (MITR-I). The reactor was redesigned following optimization
analysis and a re-evaluation of the facility needs, and the current MITR-II began operating in
1975 [1],[4]. The reactor was uprated from 5MW to 6MW in November of 2011. It can achieve
maximum thermal and fast fluxes of 7.0E 3 n/cm 2-s and 1.7E14 n/cm 2 -s respectively [4].
15
MITR-II is a tank-type research reactor which currently employs HEU plate-type rhomboidal
fuel elements. The core itself is hexagonal, with 27 available fuel positions. Typically 24
locations are fueled, and the remaining positions are available for in-core experiments. Core
positions are categorized in concentric rings, referred to as the A-, B-, and C-rings. An
illustration of the MITR core can be seen in Figure 1-1. The core is cooled and moderated by
light water, with a surrounding heavy water reflector and graphite region. There are also a
number of beam ports, which provide a neutron flux to experimental facilities [5]. The boronstainless steel control blades are positioned on the periphery of the core, along each side of the
hexagon. There is additional boron-impregnated stainless steel present in fixed absorbers in the
radial arms extending from the core [1].
-Vernier
Control Rod
Core Structure
Core Tank
Control Blade
C
l
Control Blade Flow
'Relief Hole
Coolant Entrance
Channel
Fuel Element
Figure 1-1 Cross-Sectional View of the MITR Core 161
16
1.3
MITR Fuel Elements
The current HEU fuel elements are composed of 93% enriched uranium contained in an
aluminide cermet matrix. The plates are aluminum clad, with aluminum longitudinal fins
included to enhance heat transfer. The fuel has a density of 3.7 g/cc, with a total loading of 506 g
of 2 35U per element [6]. Each rhomboidal fuel element contains 15 plates. The dimensions of the
HEU elements can be seen in Figure 1-2 and Figure 1-3.
Figure 1-2 Engineering Drawing of an HEU Fuel Element
171
.000 TUTAL PLATE THICKNESS
15 PLATES
570'.7M4 GAP VIDTH
SECTION A-A
Figure 1-3 Cross-Sectional Engineering Drawing of an HEU Fuel Element
17
171
The proposed LEU fuel elements consist of a monolithic uranium-molybdenum alloy, arranged
in 18 aluminum-clad plates. The uranium is enriched to 19.75% U23 5 , and the fuel has a density
of 17.02 g/cc [6]. The LEU fuel elements contain plates of an identical length and height to that
of the HEU elements, but the plates have a thinner width to maintain the overall dimensions of
the elements. Because of the significantly higher density, the LEU elements contain more U235
per element than the HEU fuel. A schematic of an LEU element is shown in Figure 1-4, and a
comparison of the HEU and LEU fuel element dimensions is documented in Table 1-1.
Ik I
W3
h
flttoa .
Figure 1-4 Schematic of the Proposed LEU Fuel Element Design 121
18
Table 1-1 A Comparison of HEU and LEU Element Dimensions 121
Plate and Channel Dimensions
HEU
LEU
Fuel plate length (inch)
Fuel meat length (inch)
23
22.375
23
22.375
Fuel plates per assembly
15
18
Interior (full) channels per assembly
14
17
End (partial) channels per assembly
2
2
Fuel meat thickness (mil)
30
20
2.082
15 (6061 Al)
158
2.082
10 (6061 Al + Zr)
132
Interior channel water gap (fin tip-to-tip) (mil)
78
72
Effective interior channel thickness (mil)
88
82
Finned width (inch) a
2.2
2.2
Fuel meat width (inch)a
Clad thickness (base of fin to fuel surface)
Plate to plate pitch, CL to CL (mil)
Number of fins per plate
110 per side
I 10 per side
Fin depth (mil)
Fin width (mil)
10
10
10
10
Width between fuel meat and side plate (mil)
113
113
Width between fins and side plate (mil)
Channel width (inch) a
Side plate thickness (mil)
54
2.308
188
54
2.308
188
Side plate flat-to-flat, outer edge of one side plate to
outer edge of second side plate on element (inch)
2.375
2.375
2.38
2.38
Outer plate fin-tip to side plate end plane (mil)
44
38
Effective outer plate gap to side plate end plane (mil)
49
43
Outer plate fin-tip to nozzle at full width (mil)
56.5
50.5
Effective outer plate gap to nozzle at full width (mil)
61.5
55.5
Element end flat-to-flat (inch)
19
1.4
Current MITR Fuel Management
Routine fuel management and bumup analysis calculations for the MITR are currently done
using a CITATION-based model developed by Bernard in the 1970's [6]. CITATION is a finite
difference diffusion theory code. By evaluating the fission density and burnup (as a percent of
the limit) of each element, the elements to be removed are identified. The impact of replacing a
burned element with a fresh element or element from storage is evaluated using a set of reactivity
coefficients, specified in mili-beta per gram of
235
U (mass difference between the two elements).
There also exists a REBUS-PC model of the MITR. REBUS-PC, a system of codes based upon
DIF3D, can be used to solve for cycle-by-cycle operation for a given fuel loading scheme, or for
equilibrium conditions of a fixed fuel management scheme. It was developed directly for the
analysis of research reactor fuel cycles. To capture the unique geometry of the MITR core, the
REBUS-PC model represents the reactor in a series of very small triangular meshes, with
circular surfaces modeled by jagged boundaries. The model employs a 7-group neutron crosssection library generated by the ID transport code WIMS-ANL. WIMS produces collapsed
cross-sections in a broad group structure, which are then written in ISOTXS format for use by
REBUS-PC. The ISOTXS cross-sections are burnup and spatially dependent [12]. REBUS-PC
was successful in modeling HEU cores. However, in trial analysis for LEU cores, the code was
not able to achieve accurate results with the WIMS-ANL cross-sections. The REBUS-PC model
is not currently used for fuel management [6].
In recent years, a graphical user interface and fuel management wrapper, called MCODE-FM,
has been developed. This tool employs the MCNP-ORIGEN linkage code MCODE to model
successive MITR cores [8]. MCODE (MCNP - ORIGEN Coupled Depletion) employs the
predictor-corrector method to calculate nuclide concentrations at each time step of a core lifetime
using the continuous energy Monte Carlo Code MCNP5 and the point-depletion code
ORIGEN2.2. MCODE-FM creates MCODE input files for a sequence of fuel loading
configurations, accounting for changes in element positions, orientations, and compositions. Fuel
elements can be shuffled, rotated, flipped, and stored. There is also an optional criticality search
algorithm, which allows for tracking of the critical blade movement for a series of cores.
MCODE-FM also allows the user to specify the per-element segmentation scheme, which is used
for material depletion regions within an element and for MCNP cell regions in each plate [9].
MCODE-FM is equipped with a graphical user interface (GUI) for constructing and visualizing
an MCODE-FM run for a sequence of core loading patterns. The tool also provides a suite of
data analysis and visualization features, which can be used to study MCODE-FM results
(including power peaking,
2 35
U mass changes, and overall power distribution) more closely [9].
The MCODE-FM package was recently enhanced, and has a number of new features including
accurate tracking of element flips and rotations, treatment of in-core experiments or custom fuel
20
dummies, and more robust options for element segmentation. New modules have been
introduced to aggregate data from sequential core output files and the code also now offers a
function to create a VTK file of output data, which can be used for 3D visualization of core
properties including power distribution [9].
Despite the robust nature of the existing core analysis tools, there remains room for additional
development in the area of fuel management. Currently, multiple refueling core loading pattern
options can only be compared "by hand" by generating a unique input file for each. MCODE-FM
can model a particular core in great detail, but this can be a time-consuming process, and the user
must specify the precise configuration to run. MCODE-FM is excellent for in-depth analysis
once a reload scheme is selected, but is not ideal for evaluating a number of cases very quickly.
21
2
2.1
LEU REFUELING CORE-DESIGN OPTIMIZATION TOOL
Selected Approach
The optimization tool is intended to serve as an aid in quickly assessing the large number of refueling
options available for a given LEU-fueled core. Development of the tool began with a review of many
of the existing optimization methodologies [14],[15],[16]. The proposed approach for the tool
underwent a great deal of evolution before arriving at the current implementation. A discussion of the
initially-pursued alternative approach makes it clear why this methodology was selected.
The initial plan was to develop a script which would automate the simulation of all available core
loading schemes using REBUS-PC Version 1.4. As discussed in Chapter 1.4, there is an existing
REBUS-PC model for the MITR. REBUS-PC is used by the RERTR Program for core design
analysis, and provides neutron flux distribution in space, energy, and time, as well as isotropic
changes in both fuel and absorbers with burnup [10]. The code analyzes reactor operating cycles by
dividing them into subintervals, and performing burnup calculations over each subinterval using the
average reaction rate of the subinterval. These average reaction rates are determined from diffusion
theory solutions computed at the beginning and end of each subinterval. The entire process is then
iterated until a desired convergence is achieved [11]. Upon completion of the REBUS-PC runs, the
optimization program would then identify the best loading pattern based upon user-specified
constraints and priorities, such as power-peaking limits and target burnup.
The unique geometry of the MITR core constrains somewhat the available tools for neutronics
analysis. Many deterministic transport and diffusion theory codes do not have the capability to
accurately treat the rhomboidal fuel elements and overall hexagonal core, while Monte Carlo codes
are too time consuming for use in optimization. The CITATION model works well for routine fuel
management, but it models the core using a series of concentric ring meshes and triangular radiating
segments, creating a pie-like mesh that would not be constructive for comparing power peaking
values in fine mesh volumes. For these reasons, REBUS was viewed as the primary code option.
In order to use REBUS for LEU core analysis, it would be necessary to make modifications to the
WIMS cross-section model which, as discussed in Section 1.4, do not produce accurate results with
LEU. It would also be necessary to create a new input model. The existing input, developed by
Argonne National Laboratory (ANL), models the MITR very explicitly, as shown in the crosssectional image of the model in Figure 2-1. However, simulation of this model takes far too long for
it to be run several times in order to evaluate the full set of possible loading schemes.
22
Figure 2-1 REBUS-PC Model of the MITR-I1 Core
161
The idea was proposed that a new REBUS input structure could be developed which models the
reactor much more coarsely, capturing all of the necessary information while running in the shortest
time possible. Suggested changes included changing the meshing of the fuel elements and using an
albedo to represent the reflector region. At this point, discussions were initiated with ANL RERTR
staff members Dr. Arne Olson and Dr. Benoit Dionne to evaluate the feasibility of developing such a
model. They raised several key points which led to the abandonment of this approach. To simulate a
given fuel management program with a new geometry model, it would be necessary for the RERTR
staff to make changes to the source code of the MIT Reactor Laboratory's version of REBUS. In
addition, a REBUS model which had sufficiently large meshing for a number of configurations to be
23
simulated in a reasonable amount of time would not yield detailed information about the power
distribution or peaking. Dr. Dionne proposed the idea that a similar degree of accuracy could
potentially be achieved by developing a series of correlations for the relationships between burnup,
core mass, critical blade position, and power distribution. This is the approach that has been
implemented in the MITR refueling optimization tool. By employing a set of correlations and
analysis-based loading pattern rules, the code is able to quickly identify an optimal loading pattern
without the time-intensive process of explicitly modeling every available fuel shuffling option.
2.2
Analysis and Correlations
A great deal of analysis has been done in support of the optimization tool development. By examining
data from MCODE-FM simulations, fixed rules regarding fuel shuffling can be established and
correlations which represent the relationships between reactor performance properties can be
developed. Using this information, it is possible to approximate how a particular core will behave
over a given bumup. The correlations that are discussed in this section are evaluated in Section 2.5
with MCODE-FM results.
The sequence of equilibrium cores initially modeled by Horelik were used as an analysis starting
point [9]. In the "equilibrium" core run, MITR core configurations #178 through #190 were
simulated, with cores 185 to 190 considered to be operating in pseudo-equilibrium, as captured in the
control blade motion shown in Figure 2-2 [2]. The LEU element masses for this run were selected
based upon a scaling of the target CITATION masses for each core. In all cores, locations Al, A3,
and B3 were loaded with dummy elements. Each core was run at 0 power for 5 days prior to a full
power run to simulate refueling, and the LEU cores were each burned for 47 days at 7MW. The
simulation was done for a wide range of fuel element meshing schemes [9].
Core
179
180
181
182
183
184
Depletion detail effects developing
185
186
187
188
189
Pseudo- equilibrium
50
C
0
o 3: 40
*~30
E
20
20
010
0
0
500
1000
1500
2000
MWdays
2500
3000
Figure 2-2 Critical Blade Position, Depletion of Cores 179-190 121
24
3500
190
2.2.1
Criticality, Cycle Length, and Control Blade Movement
The maximum full power burnup that can be achieved by a given core is dictated by the excess
reactivity present at the beginning of the cycle (BOC). This excess reactivity is controlled by the
mass of U 2 35 present in the core, and is reflected in the control blade position needed to achieve
criticality. The available reactivity can be monitored as the core bums by observing the movement of
the control blade over the course of the core life, an example of which is shown in Figure 2-3.
50
--
45
r0
40
C
0
Cu
35
-C
*6-'
0
rU
E
30
U
25
20
0
50
100
150
200
250
300
350
Burnup (MWd)
Figure 2-3 Critical Blade Position, LEU Equilibrium Run, Core 190 (7 MW)
Over the first few days of operation, there is a relatively large withdrawal of the control blades to
compensate for the poisoning effect of the fission products which begin to accumulate. As the major
fission products reach equilibrium concentrations, there is a significant decrease in the rate of
withdrawal. The size of this initial rapid control blade removal jump is related to the reactor power. In
order to develop a full set of relationships for this, each of the final four cores of the equilibrium run
were re-run at a set of powers.
As shown below in Figure 2-4a, for a given mass of initial U 23 in a core, the rate of U2 35 depletion is
linear when evaluated against the days of operation, and is dependent upon the reactor power - a
higher power corresponds to a higher rate of fuel depletion. When compared against total burnup, the
rate of depletion is also linear, and does not depend upon the reactor power (Figure 2-4b). Regardless
of power, a given core will have roughly the same mass after a given burnup. Figure 2-4b still
captures the fact that the cores at lower power experience a smaller total U235 loss, since for a given
time period, a core has less total burnup at a lower power.
25
17400
-187,7
-
17300
187,6 MW
--
17200 4
187,5 MW
bb
a)
187, 4 MW
188, 7 MW
17100
L-
188,6 MW
-188,5
MW
17000
0
16900
-
MW
- 188,4 MW
-189, 7 MW
16800
- 189,6 MW
16700
189, 5 MW
189, 4 MW
16600
-190,7
-
---
16500
0
10
20
30
40
Days Operating at Full Power
MW
50 -
190,6 MW
190, 5 MW
-
190,4 MW
(a)
17500
17400
Core1 8 9
17300
17200
bb
0
Un
C
17100
17000
Cor
16900
0
I--
8
16800
I PMWV
16700
6
rMw
16600
7
16500
MW
--0
50
100
150
200
250
Burnup (MWd)
(b)
Figure 2-4 U235 Mass in Core as a Function of (a) Time and (b) Burnup
26
300
350
To remove the dependence on initial core mass, this data can be plotted as the U235 mass lost vs.
burnup (Figure 2-5). This yields a single linear trendline (Table 2-1), which is applicable to any core.
This relationship is utilized by the optimization tool when assessing the initial mass of U235 needed to
achieve a desired burnup.
X 190, 7 MW
450
@190,6 MW
+ 190, 5 MW
400
-
190, 4 MW
350
189, 7 MW
300
*189,6 MW
E 189, 5 MW
0
-j
in
rn
250
C4
200
A 189,4 MW
X 188,7 MW
X 188, 6MW
0
150
188, 5 MW
188, 4 MW
100
----
*187, 7 MW
50
* 187, 6 MW
0
0
50
100
200
150
250
Burnup (MWd)
Figure 2-5 U2
Mass Lost as a Function of Burnup
Table 2-1 Linear Fit to Mass Loss vs. Burnup
27
300
A 187, 5 MW
35 0 X 187,4 MW
When the tool evaluates the behavior of a particular core loading pattern, it is necessary to consider
the depletion of the individual elements. To support this, two different types of relationships were
developed. When the optimization tool evaluates the potential usefulness of each element prior to
designing a new core, it does not yet know where the elements will be placed, or how their mass will
compare to the core average - therefore the final masses of the elements must be approximated by
using a linear fit to the average mass loss vs. burnup data for all elements in all rings of the core.
However, when the tool is evaluating the behavior of a particular loading scheme, it knows where
each of the elements is placed as well as how the element's mass relates to the average element mass
in the core. Therefore more refined correlations can be applied that capture the effects of an element's
location and relative mass.
Figure 2-6, below, documents the mass of U235 lost in each element of core 190 as a function of core
burnup. As this plot demonstrates, each element in the core has a unique mass loss rate.
- 190 A2
*190 B2
A 190 B4
X 190 B6
l 190 B8
10
-190 B9
+ 190 C1
* 190 C2
A190 C3
X 190 C4
X 190 C5
5 190 C6
+ 190 C7
--
5
190 C8
0
0
50
100
150
200
250
300
Burnup (MWd)
'190 C9
190 Cl0
1J90 C11
190 C12
190 C13
350 190 C14
190 C15
Figure 2-6 U235 Mass Lost by an Individual Element vs. Core Burnup, for LEU Equilibrium Core 190
To generate a complete set of correlations for individual element depletion, the depletion rate for each
of the elements loaded in cores 187 to 190 has been plotted against its BOC element mass peaking
factor (Figure 2-7), where the element mass peaking factor is defined as:
Element M ass Peaking Factor =
28
U235 Mass in an Element
Average Element U235 Mass
The depletion data is separated by ring. The optimization tool uses linear fits to these data sets to
approximate the depletion of each element in a particular loading pattern. As discussed in further
detail in Section 2.2.2, the locations with more initial U2 35 mass will have a larger fraction of the core
power distribution. Consequently, these locations deplete more, and have a larger loss in mass over a
given burnup. In addition, for a given mass peaking factor, the global power shape within the core
causes a larger depletion rate in A- and B-ring elements. Each of the depletion rate data points shown
in Figure 2-7 represents a fit to the mass loss vs. bumup data for an individual element at burnup
points 0, 7, 21, 70, 280, and 329 MWd.
0.07
0.06
0.05
0
* A - ring
0.04
Lfl
mB-ring
r*J
0.03
A C - ring
C
0
0W
0.02
0.
0
W3
0.01
0
0.7
0.8
0.9
1
1.1
1.2
Element U235 Mass Peaking Factor
Figure 2-7 Element Depletion Rate vs. Element Mass Peaking Factor
(Data from Cores 187-190)
The parameters of the mass loss linear fits are shown in Table 2-2. It should be noted that while the
linear fit for the B-ring mass loss rate has a very poor R 2 value, this does not translate to a large
spread in the mass loss values themselves. As Figure 2-7 demonstrated, the elements in the B-ring
data all have a Um depletion rate that falls between 0.0506 and 0.0636 grams of U235 lost per MWd
of burnup. Among the individual B-ring elements in LEU cores 187-190, all of the elements with a
mass peaking of 1.0 to 1.1 had a total mass loss in the range of 16.65 to 19.16 grams, with a standard
deviation of 0.689, and all of the elements with a mass peaking of .I to 1.2 had a total mass loss in
the range of 17.94 to 20.911 grams, with a standard deviation of 0.821. When evaluated in terms of
their BOC element masses, all of the B-ring elements lost between 2.25% and 2.61% of their initial
mass over the 329 MWd bumup.
29
I
Table 2-2 Linear Fits to Individual Element Mass Loss Rates vs. Element Mass Peaking; Loss Rates in g/MWd
Parameter
Equation
A - ring Element Mass Loss Rate
= 0.0611* (Mass Peaking) + 0.0003
0.94
B - ring Element Mass Loss Rate
= 0.0281 * (Mass Peaking) + 0.0259
0.22
C - ring Element Mass Loss Rate
0.0369 * (Mass Peaking) + 0.0109
0.83
0.0502,Standard Deviation = 0.0065
-
Average Element Mass Loss Rate
=
R
The equilibrium run mass data was also used to define allowable individual LEU element U 235 mass
ranges for each of the rings. Shown in Figure 2-8, these limits are used by the optimization tool to
determine where an element may be placed and to identify elements that need to be removed. This
process is discussed in greater detail in Section 2.3.3. Essentially, this approach establishes burnup
limits for each ring, with the assumption that element mass is a reasonable indicator of burnup. The
maximum allowed bumup for any element in the core is represented by the minimum allowable Cring mass. Note that the bumup limits can be overridden in the optimization tool by specifying that an
element must remain in the core. These constraints were developed based upon the shuffling done in
the equilibrium core runs. Their usage helps to ensure that the target mass is properly distributed
between the rings and that power peaking is constrained. Note that these ranges apply to LEU only;
as discussed in Section 0, the HEU and LEU fuel elements have very significant property differences,
including density, and the fresh LEU elements have much more U23 mass than the HEU elements.
For example, HEU Core 190 had BOC B-ring masses of 445-490 grams U 235, while the BOC B-ring
elements in LEU core 190 were in the range of 730 to 810 grams.
A more refined treatment of
element burnup could be implemented in the future.
-
BOC A-ring
BOC B-ring
anm BOC C-ring
O
EOC A-ring
EOC B-ring
EOC C-ring
500
600
700
800
900
Allowable Element U235 Mass (g)
Figure 2-8 Allowable LEU Element BOC and EOC UN Mass Ranges for Each Ring
30
Because the relationship between burnup and U235 mass can be accurately correlated, it is then
possible to evaluate how the control blade position changes with burnup by correlating this parameter
to the U235 mass in the core. As mentioned above, the rate of blade withdrawal is dependent upon
reactor power. This can be seen below in Figure 2-9, which shows the control blade position vs. U235
mass profile for LEU equilibrium core 190 burned at a series of powers.
5 0
~
. ..........................-
..
.
--.---
.
.
.
45
i-190,7
40
--
-
-
35
MW
190,5MW
190,4 MW
.-
1.
0
30
CO
25
20
J-
17300
17250
17200
17150
17100
17050
17000
16950
16900
16850
U235 in Core (g)
Figure 2-9 Critical Blade Position as a Function of U235 Mass in the Core, LEU Equilibrium Core 190
For a given operating power, the relationship between blade position and core U
mass is relatively
consistent once the fission products reach equilibrium, regardless of initial core mass. For example,
Figure 2-10 below shows the critical control blade position profiles relative to core U235 mass for the
same test core with 3,4,5, and 6 new LEU fuel elements introduced. Inserting additional U 235
necessitates increased control blade insertion to suppress the added reactivity, but the relationship
between critical position and mass is consistent once the fission products reach equilibrium - all four
cases join essentially the same control blade position line.
31
E
50
-
45
-
40
-
0
35
LA
-
0
0.
:
20
-
3 new
---
new
6 new
00
-6
new
5
0
17800
17600
17400
17200
17000
16800
16600
U235 Mass in Core (g)
Figure 2-10 Critical Control Blade Position for 3,4,5, and 6 New LEU Fuel Elements Added to the Same Core
Utilizing this fact, a linear fit was applied to the critical blade position vs. U
mass data from the
time steps at equilibrium fission product values (MCODE-FM Step 2 (3 days) to the end of cycle
(EOC)), for each of the simulated powers. An example of the data points for the 7 MW cores can be
seen below in Figure 2-11. Similar data sets to Figure 2-11 were generated for the cores run at 4MW,
5MW, and 6MW ( Table 2-3).
55
,
,
50 4-~----_
-
45 4-
E
0
40
_
-
- - -
-
4-
-
-
-
- - - -
---
-
- - -
.--
*
-
-
-
-_
_
_
-_
0
CL
35
cu
C30
-
-
--
-
-
-
-
-
-
-
--
-
25
17400
17300
17200
17100
17000
16900
16800
16700
16600
16500
U235 Mass in Core (g)
Figure 2-11 Critical Blade Position vs. Mass, LEU Equilibrium Cores 187-190, 7 MW, steps 2 to EOC
32
Table 2-3 Linear Fits to the Blade Position vs. Core Mass Values for LEU Equilibrium Cores 187 to 190, for MCODE-FM time
steps Step 2 to EOC
Parameter
Equation
R2
Blade Position,Step 2 to EOC,4MW
= -(0.0127)
* (Core Mass) + 253.74
0.86
Blade Position,Step 2 to EOC,5MW
= -(0.0143)
* (Core Mass) + 282.74
0.87
Blade Position,Step 2 to EOC,6MW
= -(0.0164)
* (Core Mass) + 320.35
0.90
Blade Position,Step 2 to EOC,7MW
= -(0.0195)
* (Core Mass) + 373.66
0.94
To expand the data set for application across all possible core powers, the properties (y-intercept and
slope) of the individual power fits were then correlated. Both of these parameters vary linearly with
power (Figure 2-12). The optimization tool can therefore create an equilibrium fission product critical
position vs. core mass equation for any target power between 4 and 7 MW. The parameters of the
critical blade position equation fit are documented in Table 2-4.
0
450
-0.003
400
-0.006
350
E -0.009
300
250
-0.012
CU
o2-0.015
a)
200
150
-0.018
100
-0.021
50
-0.024
,
-rn
3
4
5
6
7
0
8
3
5
7
9
Core Power (MW)
Core Power (MW)
(a)
(b)
Figure 2-12 Data Fits for the Power-Dependent Critical Blade Position vs. Core U2 35 Mass Equations, Steps 2 to EOC, for
Equation Parameters (a) Slope and (b) Y-Intercept
33
Table 2-4 Linear Fits against Core Power to the Slope and Y-intercept of the Blade Position vs. Mass Equations
Parameter
Equation
EquationSlope
=
Equation Y - Intercept
-(0.0026)
R2
(Core Power) - 0.0018
*
(45.599) * (Core Power) + 61.713
=
0.95
0.95
While a given core is building up to equilibrium fission product levels, the critical control blade
position is consistent as a function of U2 35 mass regardless of core operating power, as captured in the
Figure 2-13 plot of critical position vs. U 2 mass for steps 0 to 1 (0 to 1 days). Essentially, the
impact of the operating power is captured in the value of the mass change for the time step - higher
power cores will have a larger change in mass, and consequently a larger jump in control blade
position. As Figure 2-13 also demonstrates, the rate of blade withdrawal is relatively the same for all
cores regardless of the initial U235 mass (as captured by the similar slopes of the individual core
position vs. mass lines). Therefore, it is possible to use a single data fit to the relative change in blade
position vs. relative change in core mass for all cores at all powers. This was done to capture the
blade motion over steps 0 to 2 (Figure 2-14,Table 2-5).
45
-4-190, 7 MW
--
42.5
c
189, 7 MW
-- A-188, 7 MW
40
-- -
37 5
- - --
-
- -
- -
-
-
-
-
-
-
--
87, 7 MW
-0-
190, 6 MW
-0--189,
E
--.
-
35
30
I-
6 MW
188,6 MW
-4--187, 6 MW
0 32.5
~0
-
-
-
- -
-
I- -
----
--
- -
.-
190, 5 MW
189,5 MW
188, 5 MW
27.5
--
~--
25
-....
------
---
187, 5 MW
-
-.-....-- - -
---
---
--
-
_
--
-
--
--
-
190, 4 MW
189,4 MW
22.5
- - -
-
20
17400
.. .
..
17350
17300
17250
17200
17150
17100
17050
-
-
188,4 MW
-- 0- 187, 4 MW
..
17000
16950
16900
Core U235 Mass (g)
Figure 2-13 Critical Control Blade Position vs. Core U235 Mass, Steps 0 to I
34
20
18
E
0
16
14
0
12
O 10
S
4J
0
5
10
20
15
25
30
Relative Change in Mass (g)
Figure 2-14 Relative Change in Control Blade Position vs. Relative Change in Mass for All Cores, All Powers
(Both Parameters are Relative to BOC Values)
Table 2-5 Linear Fit to the Change in Critical Control Blade Position vs. Change in Core Mass Data for LEU Equilibrium
Cores 187-190, MCODE-FM steps 0 to 2
Equation
Parameter
Change in Control
Blade Position
0.5223 * (Change in Mass) + 0.1415
R2
0.98
These correlations will all be affected if there is an experiment present in the core which adds some
reactivity (positive or negative). To treat this case, a series of blade worth curves were generated. The
BOC and EOC MCNP input files for the final four cores of the LEU equilibrium run were re-run with
a sequence of control blade positions. The resultant worth curve data is below in Figure 2-15. With
the blade worth data, the optimization tool can evaluate how a given reactivity insertion would impact
the control blade motion, and can extrapolate from there the change in core mass that is needed to
compensate using the blade position vs. mass relationships discussed above.
35
1.06
190 BOC
---
-
1.04
- - - --1.02- -----
1.02
190 EOC
WE______________________
1
0
9'0.98
0.96
__98_
---
189 BOC
----
189 EOC
BOC
-188
0.94
--
188 EOC
0.92
---
187 BOC
---
0.9
0
10
20
30
40
Control Blade Position (cm Withdrawn)
-187
EOC
50
Figure 2-15 Blade Worth Curves for LEU Equilibrium Cores
As Figure 2-15 demonstrates, the slopes of the worth curves are fairly consistent - a given change in
blade position has roughly the same impact on every core, at both beginning and end of life. This is
confirmed by the differential worth curve data, shown in Figure 2-16 for the BOC and EOC of cores
187-190. The optimization tool uses a third-order polynomial fit to this data (Table 2-6).
U
E
300
-
-------
250
K----
* 190 BOC
U190 EOC
200
A 189 BOC
150
X 189 EOC
100
X 188 BOC
N
C.
@188
50
EOC
187 BOC
0
0
10
20
30
40
Control Blade Position (cm Withdrawn)
50
-187 EOC
Figure 2-16 Differential Blade Worth Curves for LEU Equilibrium Cores, LEU Cores 187-190, BOC and EOC
(Ap/Az values are plotted at the mid-point position value for the segment)
Table 2-6 Polynomial Fit to the Differential Blade Worth Data, LEU Cores 187-190
Parameter
Blade Worth
Equation
lAp\
CAZ
- 0.0091 *
-
0.9524 * z 2 + 25.3827 * z + 53.1686
(z = Control Blade Position, cmn Withdrawn)
36
R2
0.98
2.2.2
Power Distribution
There are three fission power peaking factor quantities of interest for thermal-hydraulic safety
analysis:
e
Radial Peaking Factor =
e
Axial Peaking Factor =
*
Lateral Peaking Factor =
Power in a Plate
Average Plate Power in the Core
(2)
Power in an Axial Segment of a Plate
Average Axial Section Power in that Plate
(3)
Power in a Lateral Stripe of an Axial Segment of a Plate
Average Lateral Segment Power in that Axial Segment of that Plate
(4)
The shape of the core, as well as the peripheral positioning of the control blades, leads to a natural
global power profile within the core, which evolves as burnup occurs and the blades withdraw. At
BOC, when the control blades are closer to full insertion, there is a power shift to the center of the
core, resulting in larger peaking in the A- and B-rings. As the blades withdraw, there is less
suppression of fission in the C-ring elements, and power shifts outward, resulting in a flatter profile in
the A- and B-rings, and increased peaking in the C-ring [6]. This is demonstrated in Figure 2-17,
which shows the BOC and EOC power distributions in axial zone 3 (of 6) for a test core that was
loaded with an identical element in all locations to isolate this effect. At BOC, the most significant
peaking was in the innermost plates of the elements in A2, B6, and B9, while at EOC, peaking is
more pronounced in the outermost plates of the C-ring elements. Because of this behavior, it is
necessary to have separate peaking factor correlations for BOC and EOC.
Value
141.997
S127,858
,6000
5000
4000
4000
3000
-3000
2105.082
2372,053
(b)
Figure 2-17 Power Distribution (W) at (a) BOC and (b) EOC at Axial Level 3 (of 6) for a Core Loaded with the Same Element
in Every Location
37
2.2.2.1
Radial Power Peaking
Because radial peaking is defined relative to the total average plate power in the core, the maximum
radial peaking value in an element can be related to the element's mass peaking factor. The elements
with a larger mass peaking have a larger portion of the total core power, and a larger power in their
hottest plate. For some locations in the core, power peaking is also strongly influenced by plate
orientation. In addition, for all locations, the power peaking in an element is influenced by the mass
of U235 in its neighboring elements. The impact of neighbors was not captured in this analysis.
However, the optimization search tool methodology (discussed in Section 2.3) has logic in place that
attempts to prevent extreme improper mass loading, such as the placement of fresh elements next to
each other.
In this analysis, the majority of the data has been classified according to whether the plates in an
element are parallel or perpendicular to the center of the core. An example case can be seen in Figure
2-18. These classifications are not relevant for locations B2, B5, and B8; However, because of the
dummy element generally placed in B3, location B2 is still characterized by its orientation relative to
this neighboring location. Orientation does not matter significantly for the A-ring element radial
peaking, and because Elements C3, C8, and C13 have two edges exposed to the reflector region,
orientation does not significantly impact their maximum peaking value either. The orientations shown
in Figure 2-18 are for an element loaded upright in each location. A flipped element will have the
opposite plate orientation. Table 2-7 documents the relationship between element orientation
(up/down) and plate orientation (parallel/perpendicular) for each core location.
Figure 2-18 Example Classifications of Parallel and Perpendicular Elements
38
Table 2-7 Summary of Individual Core Location Element Orientation / Plate Orientation Relationships
Radial peaking analysis was done using the final four equilibrium run cores from the case with a 1
radial /1 lateral /6 axial depletion mesh. As demonstrated by Horelik, this coarser mesh is more
conservative for radial peaking analysis [9]. To develop a more complete set of correlations for the Bring locations, each of these cores was also re-run with all of the B-ring elements flipped. Based upon
trends observed in preliminary analysis, the elements in each ring were separated into behavioral
groups. For each group, a linear fit was then developed which correlates the maximum expected
radial peaking factor in an element to the element's mass peaking factor (Table 2-8 and Table 2-9 )
The data for these correlations is shown in Figure 2-19,
elements, and Figure 2-22, Figure 2-23, and Figure 2-24 for
grouped by plate orientation (perpendicular/parallel, or
orientation (up/down). In general, for a given element mass
larger if the element is in a parallel orientation.
39
Figure 2-20, and Figure 2-21 for BOC
EOC elements. Note that the data sets are
"par"' and "per"), rather than element
in a given core, the radial peaking will be
1.95
-
-
-
-
- - - - - - -
- - -
-
E
LU
1.75
----
*
0
,
1.55
*A2,
a,
a-
1.35
c
1.15
E
all
orientations
bo
-
- - -
-
-
-
E
0.95
0.9
0.95
1
1.05
1.1
Element U235 Mass Peaking Factor
Figure 2-19 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass Peaking Factors for location
A2, BOC
1.9
C
1.8
-
1.7
-
------
-----
--
E
S
1.6
1---
*B1
par
A BI per
Z
---------
.1.
A B2
B2 par
per
B4 par
a
A
B5
B6 par
A
1.3
c:
-
1.2 d -
-
-
-
-----
--
-
-
A B6 per
. B7 par
-
-
-
-
-
-
- - -
-
-
-
-
E
. - 1.
1
1.02
1.04
- - - - --
1.06
-- - -
1.08
-
1.1
- -
1.12
1.14
-
-
1.16
- - -B
AB7 per
+ B8
B9 par
9 per
1.18
Element U235 Mass Peaking Factor
Figure 2-20 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass Peaking Factors for B-ring
Locations, BOC
40
1.9
A C1, C5, C6, C10,
C11, C15,
E
1.7parallel
A
-
2
1.5
__AAA
1perpendicular
1 C2, C4, C7, C9,
C12, C14,
parallel
*
CL
(C2, C4, C7, C9,
C12, C14,
perpendicular
E
E
C1, C5, C6, C10,
C11, C15,
-
0.9
EC3, C8, C13, all
orientations
0.7
0.65
0.75
0.85
0.95
1.05
Element U235 Mass Peaking Factor
1.15
1.25
Figure 2-21 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass Peaking Factors for C-ring
Locations, BOC
1.95
C>
E
U.'
1.75
CU
0
U
1.55
-------
*
-
*A2,
all orientations
M
a-
1.35
--
C
1.15
--
-
-
-
-
-
-
---
-
-
-__
___
__
E
X
0U. n
-r
0.9
-
-
-
-
-
r -
0.95
-
-
-
-
-
-r
-
1
-
-
-
-
-
1.05
-
-
-
-
-
1.1
Element U235 Mass Peaking Factor
Figure 2-22 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass Peaking Factors for location
A2, EOC
41
1.8
C
a)
1.7
E
0
1.5
a.0
LL
*B1 par
A BI per
* B2 par
A B2 per
B4 par
AB4 per
+ B5
*B6 par
A B6 per
* B7 par
A B7 per
+ B8
B9 par
B9 per
1.6
'1
99
U
J10
1.4
1.3
A
A
1.2
E
E
1.1
1
0.95
1
1.05
1.1
1.2
1.15
Element U235 Mass Peaking Factor
Figure 2-23 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass Peaking Factors for B-ring
Locations, EOC
2.1
E
,
1.9
C1, C5, C6, C10,
C11, C15, parallel
---
LU
1.7
0
CI, C5,C6, C10,
Cli, C15,
perpendicular
A'~
1. 5
* C2, C4, C7, C9, C12,
C14, parallel
UA.
1.3
-C
OC
E
1.1
E
E
0.9
" C2, C4, C7, C9, C12,
C14, perpendicular
- - - - - - - - - - - - - --
-
----
~
N C3, C8, C13, all
orientations
0.7
r
0.65
0.75
0.85
0.95
1.05
1.15
1.25
Element Mass Peaking Factor
Figure 2-24 Data for Linear Fits to Element Maximum Radial Peaking Factors vs. Element Mass Peaking Factors for C-ring
Locations, EOC
42
Table 2-8 Linear Fits to the BOC Maximum Element Radial Peaking Factor vs. Element Mass Peaking Factor Data
2
Location(s)
Orientation
Equation for Element Maximum Radial
Peaking Factor
A2
-
= 1.1198 * (Mass Peak) + 0.5067
0.85
BI
Parallel
= 1.0718 * (Mass Peak) + 0.5063
0.89
Perpendicular
= 0.6714 * (Mass Peak) + 0.6734
0.83
B2
B4
Parallel
Perpendicular
Parallel
-
B6
Parallel
Perpendicular
Parallel
1.486, Standard Deviation = 0.0276
-
0.7183 * (Mass Peak) + 0.4207
0.61
1.509,Standard Deviation = 0.02497
-
1.0845 * (Mass Peak) + 0.1879
0.57
1.246, Standard Deviation = 0.0273
-
=
=
Perpendicular
B5
B7
=
=
=
= 1.5742 * (Mass Peak) + 0.0888 *
= 0.5090
(Mass Peak) + 0.8653
0.95
0.61
(Mass Peak) + 0.6559
0.96
0.6626 * (Mass Peak) + 0.7148
0.97
= 0.7242 * (Mass Peak) + 0.4541
0.57
=
Perpendicular
1.0215
*
B8
-
B9
Parallel
Perpendicular
=
=
1.5742 * (Mass Peak) + 0.0888
1.1220 * (Mass Peak) + 0.1641
0.95
Cl, C5, C6,
CO, C1l1, C15
Parallel
Perpendicular
=
1.2336 * (Mass Peak) + 0.1725
0.66
= 0.8834 * (Mass Peak) + 0.3569
0.92
C2, C4, C7,
Parallel
= 1.2609 * (Mass Peak) + 0.3380
0.82
C9, C12, C14
Perpendicular
= 1.0922 * (Mass Peak) - 0.065
0.92
-
= 1.6105 * (Mass Peak) + 0.0210
0.87
C3, C8, C13
* Data from B9 Parallel Case
43
0.91
*
Table 2-9 Linear Fits to the EOC Maximum Element Radial Peaking Factor vs. Element Mass Peaking Factor Data
Location(s)
Orientation
A2
-
B1
B2
B4
(Mass Peak) + 0.5426
0.73
Parallel
= 0.6553 * (Mass Peak) + 0.8845
0.78
Perpendicular
= 0.6627 * (Mass Peak) + 0.6214
0.91
Parallel
Perpendicular
0.2786 * (Mass Peak) + 1.1032
= 1.1518 * (Mass Peak) + 0.116
0.37
= 1.0012
*
-
0.95
Parallel
=
1.416,StandardDeviation = 0.0179
-
Perpendicular
=
1.338, Standard Deviation = 0.0273
0.57
B5
B6
2
Equation for Element Maximum Radial
Peaking Factor
-
Parallel
= 0.5583
=
*
(Mass Peak) + 0.5386
0.31
0.9589 * (Mass Peak) + 0.5934*
0.73*
0.3618 * (Mass Peak) + 0.9586
0.21
Perpendicular
Parallel
=
0.9362 * (Mass Peak) + 0.6627
0.93
Perpendicular
=
0.4904 * (Mass Peak) + 0.8185
0.58
= 0.8640 * (Mass Peak) + 0.2284
0.57
0.9589 * (Mass Peak) + 0.5934
0.73
Perpendicular
= 0.2953 * (Mass Peak) + 1.0182
0.28
Cl, C5, C6,
CIO, C1i, CI5
Parallel
Perpendicular
1.4121 * (Mass Peak) + 0.5147
= 0.7089 * (Mass Peak) + 0.5599
0.80
C2, C4, C7,
C9, C12, C14
Parallel
Perpendicular
=
1.7124 * (Mass Peak) + 0.0761
0.74
1.6247 * (Mass Peak) - 0.572
0.80
(Mass Peak) + 0.2316
0.88
B7
B8
-
Parallel
B9
C3, C8, C13
-
=
=
=
= 1.6991
* Data from B9 Parallel Case
44
*
0.87
A few of the data sets are very nearly constant values (horizontal trend lines), with virtually no
correlation to the location mass peaking value. Therefore, for conservatism, the maximum expected
radial peaking factors for these locations will be predicted by the optimization tool as the average
value plus three standard deviations (3y). The location data sets where this average value approach is
taken have values that are well below the maximum plate peaking value in each core.
In general, the correlations with the weaker R 2 values have radial power peaking values that are very
nearly constant vs. mass peaking (rather than a large spread in power peaking values at a given mass
peaking value). Additionally, the locations with lower radial power peaking tend to be the ones with
less correlation between mass peaking and power peaking. The correlations are stronger in the
locations with the hottest plates.
In the set of cores analyzed, the linear fit to the location B6, 'parallel' data set predicts a somewhat
lower maximum radial peaking factor for a given mass peaking factor than the equation for location
B9 does. However, experience with analysis of LEU core loading patterns, as well as with the HEUto-LEU transition cores, has shown that B6 typically behaves very similarly to B9 in terms of power
peaking. Therefore, for conservatism, the maximum radial peaking in B6 is predicted using the
equation developed from the B9 data.
2.2.2.2
Axial and Lateral Power Peaking
Axial and lateral peaking factor analysis was done using the final five cores of an equilibrium run
with a 6 radial/ 4 lateral/ 18 axial depletion mesh. The distribution of axial and lateral peaking factors
is much more complex than that of radial peaking. Because these parameters are defined with
reference to the power distribution within a single plate of a fuel element, they cannot be correlated to
the element-to-element U235 mass distribution within the core. However, it is also not possible to
develop a straightforward correlation between a plate's power distribution and its mass distribution.
Within a fuel plate the power profile is not dictated by the mass profile, and axial and lateral power
peaking do not necessarily occur in the axial zone or lateral strip with the most mass. Consider, for
example, Figure 2-25, which shows the BOC and EOC power and mass distributions within a single
plate of a single element from equilibrium core 189 (location C2, plate 18). The power profile follows
a cosine-like shape axially, with power peaking in the more central axial zones. This profile shifts
upwards as the core bums. Because there is a higher rate of fission in intermediate axial zones,
elements which have experienced any bumup will have lower mass values in these regions. The BOC
skewing of the power profile towards the bottom of the core also generally results in slightly larger
masses at the top of a fuel element. Smoothing this distribution is one reason why elements are
frequently flipped at some point in their life.
45
Value
0.576048
Value
587.4643
t
-~0.56
-500
-400
-0.54
,-300
0.52
200
-0.5
0.48
0.478319
100
45,35723
(b)
Value
J.571629
Value
57.8391
50.55
0.525
-400
-300
0.5
200
0.475
i100
0.452141
69.39202
(d)
(c)
Figure 2-25 (a) BOC Power (V),
(b) BOC Mass (g), (c) EOC Power (W), and (d) EOC Mass (g), for Equilibrium Core 189,
Location C2, Plate 18
46
Figure 2-26 shows a closer view of a single axial level (level 15 of 18), to provide a better example of
lateral power and mass distribution. The maximum power lateral stripe in an axial zone is generally
on an edge of the plate. However, because of this larger fission rate on the edges, there tends to be a
larger concentration of U 235 mass in the central lateral regions for burned elements. Much like axial
peaking, lateral power peaking does not follow the lateral mass distribution.
Value
575.3602
1560
Value
0.514322
10.514
520
0.512
'480
440
-0.508
418.8699
10.506
0.505997
(b)
Figure 2-26 (a) Power (W) and (b) Mass (g) for Equilibrium Core 189, Location C2, Plate 18, Axial Zone 15 (of 18)
Preliminary analysis was also done to see if it would be possible to develop lateral peaking
correlations by isolating the mass and power values for only the first and last lateral zones, but this
approach did not yield meaningful results. An example is shown in Figure 2-27. In this figure, the
maximum lateral power peaking factor is 1.95 (circled in red), which is an extreme outlier for the data
set. Similar attempts were made with the axial distribution data, with the same conclusion. Because
there is so much variation in the maximum power peaking factors for fuel regions with very similar
mass profiles, attempts at correlating result in the prediction of values that are much less than the
maximum values in the data sets.
47
2.5
Power Peaking Value
2
U
+-CI,C15,
~C6,
X
L
mU 1.5
C5,
CIO, CII,
oeParallel
A C2, C4, C7, C9,
C12, C14,
0~
X
d LParallel
C3, C8, C13
0~X
7i0
.
0
09
0.92
0.94
0.96
0.98
1
1.02
1.04
Lateral Zone Mass Peaking Factor
Figure 2-27 Preliminary Attempt to Correlate the Lateral Power Peaking Factors to Lateral Mass Peaking Factors for the First
and Last Lateral Stripe; Data for select C-ring Elements, LEU Core 186, BOC
While the correlation approach is too coarse to predict these power peaking parameters based on mass
distribution, this analysis does take into account element orientation. The core locations were again
divided into groups and where applicable, a distinction was made between parallel and perpendicular
elements. The axial and lateral power peaking factor values are documented in Table 2-10 to Table
2-13. For each data set, the minimum, maximum, and average values are documented, as well as the
standard deviations. For conservatism, in the optimization tool results, the maximum anticipated axial
and lateral peaking factor values will be reported by the optimization tool as the average plus three
standard deviations (listed as "predicted value" in the tables). All of the actual observed axial and
lateral peaking values fall below the predicted value for the data set. The optimization tool does not
consider axial and lateral peaking when comparing loading schemes, but does include these
parameters in the output to provide more information on predicted core behavior. In the C-ring, plate
orientation has a noticeable impact on the values, but in the B-ring there were no observable different
behavioral groups. The A- and B- rings each have a single predicted expected maximum axial
peaking factor, which will be reported for every element in the ring. As the data tables reflect, axial
and lateral peaking are significant in the C-ring. The maximum BOC axial peaking is observed in the
enclosed C-ring locations (C2, C4, C7, C9, C12, and C14) when they are in the parallel orientation.
The maximum BOC lateral peaking is observed in these same elements when they are in the
perpendicular orientation. The impact of orientation is not as significant in the corner C-ring elements
(Cl, C3, C5, C6, C8, C10, Cl1, C13, and C15). The data utilized in this analysis are the maximum
peaking factor values in each element of cores 187-190. All reported values (maximum, minimum,
etc.) refer to the value's position within this data set of individual element maximum values.
48
Table 2-10 BOC Axial Power Peaking Factor Prediction; Data Set is Maximum Peaking Value in Each Element of LEU
Equilibrium Cores 186-190
Minimum
Maximum
Average
Standard
Value
Value
Value
Deviation
Predicted
in the
in the
in the
of the
Value
Data Set
Data Set
Data Set
Data Set
A-ring
-
1.25
1.34
1.30
0.03
1.40
B-ring
-
1.30
1.50
1.37
0.05
1.52
CL, C5, C6,
C10,CILC15
Parallel
Perpendicular
1.50
1.80
1.64
0.08
1.86
1.47
1.62
1.51
0.05
1.67
C2, C4, C7,
C9, C12, C14
Parallel
Perpendicular
1.62
1.49
1.84
1.74
0.06
1.93
1.61
1.55
0.04
1.66
C3, C8, C13
-
1.51
1.66
1.60
0.04
1.74
Table 2-11 EOC Axial Power Peaking Factor Prediction; Data Set is Maximum Peaking Value in Each Element of LEU
Equilibrium Cores 186-190
Location(s)
Orientation
Minimum
Maximum
Average
Standard
Value
Value
Value
Deviation
Predicted
in the
in the
in the
of the
Value
Data Set
Data Set
Data Set
Data Set
A-ring
-
1.24
1.29
1.27
0.02
1.32
B-ring
-
1.25
1.41
1.31
0.04
1.42
Cl, C5, C6,
Cl0,CII,C15
Parallel
Perpendicular
1.29
1.32
1.42
1.34
0.03
1.44
1.43
1.36
0.04
1.50
C2, C4, C7,
C9,C12,C14
Parallel
Perpendicular
1.32
1.46
1.37
0.03
1.47
1.33
1.44
1.37
0.04
1.48
C3, C8, C13
-
1.33
1.43
1.38
0.03
1.48
49
Table 2-12 BOC Lateral Power Peaking Factor Prediction; Data Set is Maximum Peaking Value in Each Element of LEU
Equilibrium Cores 186-190
Location(s)
Orientation
Minimum
Maximum
Average
Standard
Value
in the
Value
in the
Value
in the
Deviation
of the
Data Set
Data Set
Data Set
Data Set
Predicted
Value
A-ring
-
1.44
1.52
1.48
0.03
1.58
B-ring
-
1.35
1.77
1.56
0.10
1.86
CI, C5, C6,
C0CIC15
Parallel
Perpendicular
1.51
1.96
1.68
0.10
1.98
1.66
1.87
1.74
0.09
2.00
C2, C4, C7,
C9, C12, C14
Parallel
Perpendicular
1.43
1.64
1.51
0.06
1.71
1.64
1.89
1.71
0.07
1.90
C3, C8, C13
-
1.58
1.88
1.72
0.08
1.97
Table 2-13 EOC Lateral Power Peaking Factor Prediction; Data Set is Maximum Peaking Value in Each Element of LEU
Equilibrium Cores 186-190
Location(s)
Orientation
Minimum
Maximum
Average
Standard
Value
in the
Value
in the
Value
in the
Predicted
Value
Data Set
Data Set
Data Set
Deviation
of the
Data Set
A-ring
-
1.40
1.54
1.46
0.06
1.64
B-ring
-
1.35
1.75
1.51
0.08
1.75
C1, C5, C6,
C10,CI1,C15
Parallel
Perpendicular
1.46
1.85
1.58
0.10
1.87
1.65
1.80
1.72
0.05
1.87
C2, C4, C7,
C9, C12, C14
Parallel
Perpendicular
1.39
1.59
1.46
0.05
1.62
1.64
1.78
1.70
0.05
1.85
C3, C8, C13
-
1.61
1.87
1.75
0.07
1.95
50
2.3
Methodology
The optimization tool is written in Python, for smooth compatibility with MCODE-FM, the MCODE-
FM GUI wrapper, and the existing data analysis tools. The methodology of the optimization tool is
summarized in the logical flow chart in Figure 2-28. The basic goal of the code is to identify a core
loading pattern that has sufficient U2 35 mass to reach a target cycle length at a given power, without
violating BOC and EOC constraints on control blade position. An optimal solution is one which can
achieve the target burnup with the fewest number of loading pattern changes while maintaining a
maximum radial peaking factor that is below the maximum allowed value. The tool does not consider
axial or lateral peaking when evaluating different cases, but these parameters are predicted in the
output. The source code for the optimization tool is contained in the files documented in Table 2-14.
Table 2-14 Source Code Files for the Optimization Tool
File
Description
/gui/optimizerGuiDialog.py
Optimization tool GUI module
/ _ce
ptimizaio.py
Main script that handles the execution of
the core loading optimization
/utils/get-currentcore.py
Evaluates old MCODE-FM run
Contains all of the subroutines used in
element evaluation and fuel shuffling
Contains the additional subroutines used by
/ sthe
optimization tool
The search for a new core design begins with an evaluation of the existing core and the available
stored elements, as simulated in a previous MCODE-FM run. The code then determines the U2 mass
As a default, the optimization
that will be needed for the new core, based upon the target burnup.
tool will attempt to find two valid optimal designs - one which utilizes fresh elements, and one which
does not. However, the user has the option to indicate that the fresh elements must be used, and if that
option is implemented the code will not search for a solution without them. Similarly, if there are no
fresh elements available, only one solution will be found. In addition, the optimization tool is only
capable of incorporating a maximum of three fresh elements. This is the maximum number of fresh
elements introduced in any of the equilibrium cores used in the correlation development, and the
peaking factor correlations may not be valid for cores with more. Therefore, if the number of fresh
elements exceeds this value, the code cannot design a core using the fresh elements. The user also has
the option of preventing the shuffling of in-core elements by adding them to a 'Remain in Core' list,
51
and of forcing stored elements to be used by adding them to a 'Use from Storage list'. The tool will
prioritize these requests. When the search is complete, an MCODE-FM input file is created for both
of the solutions. In addition, the solution data is written to an Excel spreadsheet, which summarizes
the behavior of each core at both BOC and EOC. The methodologies of the key steps of the
optimization search are discussed in detail in the following sections.
Figure 2-28 Logical Flow Chart For the General Methodology of the Optimization Tool
52
2.3.1
Evaluation of Previous Core
A logical flow chart detailing the way the optimization tool evaluates the existing core is shown in
Figure 2-29. Using a user-specified MCODE-FM input file from the previous core run, it evaluates
the EOC core loading pattern and properties of the elements in the core and in storage.
The final loading pattern and element orientations are read from the MCODE-FM input file. To
obtain the detailed element material data, the code identifies the MCNP input file of the final step of
the final cycle, as well as the individual data files for the stored elements. As the tool determines the
mass of each element, it evaluates the associations between the MCNP cell material data and the
MCODE-FM element mesh zones (axial, lateral, and radial node). In this process, the tool also
considers the element's orientation (flips and rotations), and adjusts the indexing as needed (e.g., for a
6 axial zone meshed flipped element, the cells associated with axial node 6 will be re-associated with
axial node 1, and so on). While the optimization search is only interested in the total element masses,
the appropriate node-by-node material associations are necessary to write an accurate MCODE-FM
input file for the new core.
Accurate node-by-node material data is also important in evaluating the mass biases within the
element. Although the optimization tool does not utilize the inter-element mass distributions in
designing a core, it does report in the output file the individual element mass biases axially, laterally,
and radially. With this knowledge, the user can make well-informed decisions regarding flipping and
rotating the elements in the new core. These biases represent total mass in the first half of the material
zones vs. the total mass in the second half of the material zones in a given dimension (segmentation
demonstrated in Figure 2-30). If there is an odd number of zones in one dimension, the code will
ignore the central zone (e.g., for 9 axial zones, the axial bias will represent the mass in zones 1-4 vs.
the mass in zones 6-9). The code assumes that element segmentation is symmetric about the
midpoint; therefore if this is not the case (e.g., an element with a lateral striping set of 30%,75%,
90%), the bias values should be ignored.
When the code identifies the existing loading pattern from the MCODE-FM input file, it will check
the element's universe number (if present). The universe input parameter was introduced to MCODEFM by Horelik to allow the inclusion custom dummies or experiments in a run [9]. Fuel elements are
given a universe of '-I'. which serves as a flag for MCODE-FM to use the fuel geometry, while all
other universe numbers imply a custom element. Therefore the code will not store any elements with
a universe other than '-l'. These items are not valid fuel elements, and the code does not have the
ability to treat them in the loading pattern analysis. The user can still have the code account for these
items' reactivity by specifying their anticipated worth in the new core. Similarly, if there is anything
(including fuel elements) present in location Al, A3, or B3, the item will not be stored. Because these
positions are principally used for in-core experiments, the optimization tool is only valid for
designing a core with those three locations unfueled.
53
MCODE-FM Export File For the Previous
Run
I
Determine U-235 Masses of In-Core Elements
Establish Final Loading Pattern Parameters
Determine # of Cycles in Run
In-Core Element
1-9
Locations
Read Fuel Element Segmentation + MCNP Cell Densities
&Compositions From Cycle Data File & Final MCNP Input
In-Core Element Orientations
Final Orientations of In-Storage Elements
L------------------
--------
Identify Final Timestep of Final Cycle
-
---.
Adjust CellMaterial Data Associations
to Account for Flips/Rotations
I
Evaluate Element Masses
Evaluate
In-Core
Element
Mass
Biases
Determine U-23S Masses of Stored Elements
ReadStored
Element Files
For
Stored
Element
File
Adjust Cell
Material Data
Associations to
Account for
Flips/Rotations
Evaluate
Element
Masses
For Element
in Storage..
I Calculate
Read Fuel
Element
Segmentation +
Cell Densities &
Compositions
- -I
U-235
Mass
or MCN
Cell in the
F
Add to
Element
Mass Sum
Establish
Total
Core
U-235
Mass
1
Figure 2-30 Segmentation of a LEU Fuel Element Radially, Axially, and Laterally to Evaluate Mass Biases
Currently, the optimization tool considers the elements listed in the 'storedelements' file in the
'storage_mats' folder of the old run as the only set of available stored elements.
This file is created by
MCODE-FM. Elements are added to the file as they are removed from the core. If there are additional
stored elements available that were not simulated in the run, versions of the elements from other runs
can be used. To do this, their element name/data file associations must be written into the
'storedelements' file of the run that is used as the input to the optimization tool.
The format of the
MCODE-FM storedelements file in the format shown in Figure 2-31. If additional elements are to
be included, the data files themselves can be left in their original locations, or can be copied to the
'storedelements' folder of the run of interest; however, if the files are copied,
their data file paths in
the 'storedelements' file must be adjusted to reflect this. Note that as long as an optimization search
is only considering the files that were actually stored in a given run, this file does not ever need to be
modified.
stored.elernents
MIT318
/home/connaway/LEU_equilibrium/storage
mats/tmp1JObqy
MIT322
/home/connaway/LEU_equilibrium/storage_mats/tmp6cNX60
MIT302
/home/connawayj/LEUequilibrium/storage
mats/tmpHOwEl
MIT279
/home/connaway'/LEUequilibrium/storageobats/tmptzlm96
MIT285
/home/connaway/LEU_equilibrium/storagemats/tmp2hK5E8
MIT281
/home/connaway/LEU_equilibrium/storagemats/tmpBcnI
Oa
Figure 2-31 Example of a 'stored elements/storagemats' File from an ICODE-FM Run
55
As discussed above, when the optimization tool is evaluating the stored elements, it checks their final
in-core orientations in the MCODE-FM input file. Material data is written to the stored element files
based upon their final orientation in the core. The code then adjusts the MCODE-FM node/MCNP
cell associations as needed to return the data to an unflipped, unrotated state to ensure that the
materials are assigned correctly. If a stored element does not have path information in the input file (if
the user has copied the element into the 'storagemats' file), the optimization tool can still use the
element in core design. If the element does end up being used in the new core, however, it should be
replaced in the input file with the actual element from its true run using the MCODE-FM GUI. The
MCODE-FM GUI will perform the appropriate adjustments to the material data when it loads the
element, following the same approach as the optimization tool, using the element's true MCODE
input file. In the future, the functionality could be added to the optimization tool to fully read
elements from multiple runs.
2.3.2
Determination of Core U 23 Mass Needed to Achieve Target Burnup
The optimization tool begins its search by identifying the U2 35 mass that is needed to reach the target
burnup without violating the blade position constraints. This analysis utilizes the relationships
between burnup, mass change, and control blade position discussed in Section 2.2.1.
The maximum and minimum allowable masses are dictated by the minimum and maximum allowable
control blade positions. For a fixed cycle length and power, there will be a consistent change in mass
over BOC to MCODE-FM Step 2 (day 3 of operation), and over Step 2 to EOC (as predicted with the
mass change vs. burnup equations). Using the relationships between core mass and critical control
blade position, it is therefore possible to construct anticipated mass vs. control blade curves for both
the maximum and minimum constraints. An example of this approach is shown in Figure 2-32. Note
that the minimum blade position is associated with more excess reactivity, and therefore corresponds
to the maximum mass allowed, and vice-versa.
56
Maximum
-BOC
C
Blade
Limit
-&IMinimum
BOC Blade
Limit
U
-4
bI
a Line for Step
2to EOC
Relationship
Decreasing U-235 Mass
Figure 2-32 Example of Control Blade Behavior at the Maximum and Minimum Allowable BOC Positions
These curves are then compared to the control blade behavior curve that reaches the maximum
allowable EOC control blade position. It is assumed that if the control blade position rises above this
limit, the core does not have enough reactivity to maintain full power. Therefore the beginning of this
curve represents the minimum mass that can be present to achieve the desired burnup. The EOC
constraint-based curve is evaluated against the BOC-based curves to identify a target mass range. An
example of this analysis is shown in Figure 2-33 for three different EOC blade position constraint
cases. Case 1 requires an initial mass that is less than the minimum allowed mass. Therefore, the
target initial mass will be any value in the range of the maximum and minimum allowed masses, and
at EOC the blade will be lower than the maximum allowed position. Case 2 requires an initial mass
that is greater than the maximum allowed mass. Therefore this case is not possible - either the target
burnup needs to be reduced, or the blade position constraints need to be relaxed. Case 3 requires an
initial mass that falls between the two BOC blade constraints. Therefore the acceptable initial mass
range for this case is any value between the exact Case 3 target mass and the maximum allowed mass.
57
6Is
*
0
e 00
Maximum
BOC Blade
Limit
0'
Minimum
BOC Blade
Limit
S---
Case 1
Case 2
- ---
Case 3
Decreasing U-235 Mass
Figure 2-33 Example of Target Mass Range Analysis for 3 Different EOC Blade Position Constraints
The target mass search also has the capability to account for the anticipated reactivity effect of any
experiments that may be present in the core. If a nonzero experiment reactivity worth is specified, the
code adjusts the calculated control blade vs. mass relationships for the three control blade constraints
(using the blade worth curve in Figure 2-16). It is assumed that the reactivity impact will be
consistent throughout the core depletion, resulting in a shift of the Step 2-to-EOC blade position vs.
mass curve. The code approximates the blade worth based upon the predicted Step 2 blade position,
and then uses the worth to predict the control blade shift that would be caused by the input reactivity
value. Next, the code determines the U 235 mass needed to compensate for this shift, using the slope of
the blade position vs. mass line. The insertion of negative reactivity increases the target mass range,
while positive reactivity decreases it. This routine has not been validated with results from a run with
in-core experiments, and should be used with caution. A complete flow chart for the target mass
analysis process is shown in
Figure 2-34.
58
Figure 2-34 Logical Flow Chart For Calculation of U235 Mass Needed
59
2.3.3
Element Evaluation
Before the optimization tool begins designing a new core, it first evaluates all of the elements currently in
storage and in the core. The code predicts the EOC masses of all elements for the target burnup using the
average element depletion rate. Each element's BOC and EOC mass values are then evaluated in terms of
the fixed allowable mass ranges for each ring of the core (Figure 2-8), and the code identifies the ring(s)
where the element may be placed. The code then checks each of the current in-core elements, and
identifies those that have a BOC mass or predicted EOC mass that is outside the allowable range for its
current location. From this analysis, the code develops a list of elements that need to be removed or
shuffled to a new location. Essentially, this is how the code incorporates fuel element burnup limits. It is
assumed that elements with a mass below the allowed range have reached the burnup limit for utilization
in that location. The minimum allowed C-ring mass value therefore represents the burnup limit for use in
the core. The mass constraints are overridden if the user explicitly requires the use of a particular
element. This approach could be enhanced in the future to allow for more flexible user input-based
burnup constraints.
2.3.4
Placing Fresh Elements
When the code is designing a core that utilizes the fresh elements, the first fuel shuffling decision it
makes is the fresh element placement. The optimal locations for fresh elements are decided, the elements
are placed, and their positions are fixed - the new elements are added to the 'Remain in Core' list, and
will not be removed or shuffled by the rest of the optimization search. The new elements are placed in the
locations where they will bring the largest addition of U235 mass.
First the tool identifies the minimum mass B-ring element that is not in the 'Remain in Core' list. If there
is only one fresh element to place, it replaces the minimum mass B-ring element and this portion of the
search is done. If there are two fresh elements to place, the tool next identifies the lowest mass element of
the elements that are not in the 'Remain in Core' list, are not the previously identified minimum mass
element, and are not a neighbor of the minimum mass element. These are the two locations that are
fueled. The tool checks the list of neighbors to ensure that two fresh elements are not placed next to one
another to minimize power peaking. If there are three fresh elements to place, the tool identifies the
second and third locations based upon a list of "partners" of the minimum mass element. The partner
relationships are shown in Table 2-15. The code will select the minimum mass element from each of the
element sets. If this element is in the 'Remain in Core' list, the code will attempt to replace the other
element in the set. If both elements are in the 'Remain in Core' list, the code will not be able to find a
solution that uses fresh elements. The use of the partner element relationships ensures that the fresh U 235
is well distributed in the B-ring. In general, the three elements that are selected will be the same elements
that would be chosen if the code just chose the three lowest mass elements in the B-ring. However, by
using the partner relationships, the code is able to catch instances where one of three elements that were
60
loaded together has already been removed. For example, at the end of the LEU equilibrium run, the
lowest mass B-ring elements are in B6 and B9, at 714 grams, which were last loaded in Core 185. The
third location that was fuelled with them in Core 185, B4, was already refueled again in Core 189.
Therefore, the third lowest B-ring mass is 756 grams in location in B8. If just the lowest mass locations
were used, the code would place fresh fuel in both B8 and B9. However, because the relationships are
employed, the code will identify B2, at a mass of 760 grams, as the more appropriate third location.
Table 2-15 B-Ring Partner Locations for Placing 3 Fresh Elements
Minimum Mass
Element
Location
B1
B2
B4
B5
B6
B7
B8
B9
2.3.5
Second Element to Replace
B4
B5
B1
B7
B2
B4
B1
B2
or
or
or
or
or
or
or
or
B5
B6
B9
B8
B4
B5
B2
B4
Third Element to Replace
B7
B8
B6
B1
B8
B9
B5
B6
or
or
or
or
or
or
or
or
B8
B9
B7
B2
B9
B1
B6
B7
Making Required Loading Pattern Changes
Before the optimization tool searches the full range of solutions, it does the loading pattern changes that
are absolutely necessary. The first priority is placing the elements in the 'Use from Storage' list. The
code will first try to use the stored element to replace an in-core element that needs to be moved (as
discovered in the element evaluation process), considering only in-core elements in the ring(s) that the
stored element is allowed in. If it is not possible to replace an element that needs to be removed, the
stored element is free to replace any element in its valid ring(s). The code will prioritize the replacement
that brings the largest addition of U
mass. If it is not possible to add mass by placing the stored
element, the code will do the replacement that has the minimum loss of mass. Throughout this process,
the code will check to ensure that the in-core element in question is not in the 'Remain in Core' list.
When the stored element is placed in the core, it is added to the 'Remain in Core' list. This prevents the
code from removing it again later. If the code cannot find a valid location, the element will not be placed,
and an error message will be written to the output file. Once the in-core element is removed, it is
regarded by the optimization tool as an available element for placement in another location.
61
Once all of the 'Use from Storage' elements have been placed in the core, the code will check to see if
there are any remaining locations with unacceptable elements. The code will then try to replace each of
these elements with a stored element that is valid for the ring in question. Priority will-be given to the
replacement which brings the largest addition of mass. Again the code will bypass removing any
elements in the 'Remain in Core' list. However, for these elements, the code will issue a warning
message since the element in question was selected by the code for removal or shuffling. For these
replacements, the newly placed element is not added to the 'Remain in Core' list. It is not required that
this particular element be used; it is only necessary that the old element comes out. Therefore, the
element that is placed is valid for replacement when the code does the full optimum core search for the
final loading pattern. Essentially it is just a place-holder to ensure that the previous in-core element is
removed from the search. Throughout this process, the elements that are removed from the core are added
to the list of available stored elements, so that they may be shuffled to another location if this is a better
solution than the utilization of a previously stored element.
2.3.6
Full Optimized Search
It is the goal of the previous search algorithm to identify and remove the "problem" elements, so that at
the stage when the code prepares for a more complete search, the solution loading pattern is already fairly
good. Before the code begins the full search, it will evaluate the loading pattern that has been designed
thus far. If the core is acceptable, the code will store it as a valid solution, and possible optimal loading
pattern.
The core evaluation process is outlined in Figure 2-35. First, a check will be performed to see if the core
has a valid U 2 35 mass that is within the target mass range. If the mass is acceptable, the individual
location mass peaking factors are also evaluated to utilize in analyzing power peaking. The code will then
evaluate the newly placed elements (any element that was not in its current location at the EOC of the
previous core) to determine their optimal orientation. The BOC radial peaking factor is predicted for
both 'Up' and 'Down' loading, and the case with the smaller maximum BOC radial peaking factor is
selected. Next, the radial peaking factors of all elements in the core are checked for both BOC and EOC
(using the ring-specific U2 35 depletion equations and mass peaking/power peaking relationships), and
locations with a value above the maximum limit are identified. Next, the code examines whether the
radial peaking values for these locations could be brought low enough by flipping the element. If so, the
element is flipped, and if not, the core is not a valid solution. When all of the necessary adjustments have
been made, the core loading pattern is finished and, if valid, can be stored as a potential solution.
Next a full search for all potential loading patterns is initiated. This process begins by establishing each
case of an in-core element being replaced by a stored element that is acceptable (in the mass range) for
the location. Then, for each of these configurations, the process is repeated, considering each case of a
second stored element replacing a second in-core element. Next a third replacement is considered, and so
62
on. When an element is removed, it is appended to the list of available elements for placement in the
core. In this way, the code also considers shuffling the existing elements. This process is briefly
summarized in Figure 2-36.
The code first develops and evaluates every instance of one replacement before considering the cases
with two replacements, develops and evaluates every instance of two replacements before considering
three, and so on. Before moving on to each stage, the code stops to consider if any of the valid solutions
found thus far have a total number of changes that is fewer than the number of shuffles that would be
done in the next layer of the search (including the shuffles done in the earlier required changes). If this is
the case, the code does not proceed with the search - an optimal solution with the minimum number of
changes to the core has already been identified.
63
Figure 2-35 Flow Logic Diagram for the Evaluation of a Core Loading Pattern
64
S
S
S
Figure 2-36 Flow Logic Diagram Summarizing the Approach of the Full Search Algorithm
For every acceptable core loading pattern, four parameters are stored: element locations, element
orientations, maximum peaking value in the core (BOC or EOC), and the total number of changed
locations. In this data set, the number of changed locations represents any location that 1) has a different
element or 2) has the same element, in the opposite orientation. Both of these parameters are evaluated
relative to the previous core's EOC loading pattern. When the search is complete, the code will identify
the minimum number of changes in any of the solutions. If there are multiple solutions with this
minimum number of changes, the code will identify the case that has the smallest predicted maximum
(BOC or EOC) radial peaking factor. This is considered the optimal core loading pattern. This core has a
mass which can achieve the target burnup, using the fewest shuffling motions possible, with the lowest
maximum radial power peaking factor.
65
The code is established to perform up to five levels of shuffling within the "full search" algorithm. In
preliminary analysis during code development, allowing the search to develop and evaluate every
combination of replacing and/or shuffling four elements caused the search to take roughly an hour to
complete. To put that value in perspective, the optimization runs for the cases discussed in the code
verification in Section 2.5.1 generally took under 10 seconds. The goal in employing the very coarse
correlation method is to have a code which runs very quickly. Therefore it is not reasonable to include
additional logic to add even more tiers to the full search. The user also has the option of limiting this
portion of the search even further by specifying a maximum number of tiers for the full search (the
default constraint is three). As discussed above, the full search algorithm is intended to make minor
improvements after the bulk of the required shuffling decisions are made in the previous stages of the
code.
2.4
2.4.1
Usage
GUI Interface
The core design optimization tool is accessible through the MCODE-FM GUI wrapper. The optimization
user interface window (shown in Figure 2-37) is opened by selecting 'Optimize a New LEU Core' from
the 'Tools' menu. A detailed description of the items in the interface window is provided in Table 2-16.
The input variable values are populated with defaults, which can be modified as desired. The 'Fuel
Elements in Core' and 'Fuel Elements in Storage' lists are populated by the code when the user selects a
previous run via the 'Select Export File for Previous Core Run' button. If an attempt is made to run the
optimization tool while the 'Fuel Elements in Core' list is empty, the GUI will return an error and return
the user to the input dialog.
----..
-----------------.
---------- ---
----------------- ---------
Mue
urn All
Pue
2ruun
M--
BIAde-U
freB
M-t-
Blad u
cmi
35 0
Bx-:)
.......
.....
0ue~ne
0m.[J
40 0
i170
P&A
be Ued
F 771777771$Mc
Select
tDtm V.,th of
)
Mu,umm Mlade Prnjtio E,--,:
.....
# o rkec. Femecm
Plat
dlicrs in th,70ful Search
E ,pot Piefor PremusuLCoeRun
Elementto Femam , Cor
Used
Fcrce Spred Elemnt to be
Re-e tom
Remam m.i
Coe' List
Pemoe Frmm'Use Frm toruge'List
RUN...
Figure 2-37 User Interface Window for Optimizing a New Core
66
-
-----------
- ----
Table 2-16 Description of Optimization Tool Interface Window Items
Item
Output File
Target Power
Target Cycle Length
Maximum Allowed Plate
Description
Filename that will be given to the result directory and files
Desired average power (MW) of the new core
Desired length (days) of the new core
Constraint on maximum radial peaking value in the new core,
Peaking
Reactivity Worth of
BOC and EOC
Anticipated reactivity insertion (pcm, +/-) from experiments in new
Experiments
core
Maximum Blade Position, EOC
Blade position constraints;
Maximum Blade Position, BOC
Utilized by the optimization tool to
Minimum Blade Position, BOC
evaluate the Um mass needed
New Elements Must Be Used
# of New Elements
If selected, code will only find solution that uses the new elements
Number of available fresh fuel elements
Max # of Tiers in the Full
Search#Constraint
Search
Select Export File For Previous
on the Optimization Search Code Loops
Opens dialog to allow user to indicate MCODE-FM run for previous
Core Run
Force Element to Remain in
Core
Remove Element From 'Remain
in Core' List
Force Stored Element to be
Used
Remove From 'Use From
Storage' List
core
Adds selected in-core element to 'Remain in Core' list
Removes selected in-core element from 'Remain in Core' list
Adds selected in-storage element to 'Use from Storage' list
Removes selected in-storage element from 'Use from Storage
Run
Runs the optimization tool
Ok
Closes the interface window
list
Fuel Elements in Core
List of fuel elements in the core at the end of the previous run
Fuel Elements in Storage
List of fuel elements in storage at the end of the previous run
Remain in Core
Use from Storage
List of fuel elements that the optimization tool cannot move in the
core
List of fuel elements that the optimization must bring in from storage
67
Once the in-core and in-storage lists are populated, the user has the option of selecting specific
elements from them that must be used in the new core. If an in-core element is added to the
'Remain in Core' list, the code will not remove the element or move it from its current location.
The "Remain in Core" input parameter was introduced to treat instances where a user wants to keep
in the core an element that the code would otherwise remove. The fact that the code wants to
remove the element implies that it already has a very low mass for its current location. The
assumption can therefore be made that the element will be removed in the near future, so it is not
productive to shuffle it for one core. In the future this routine could be enhanced to allow for
elements that must remain in the core, but can be shuffled. If an in-storage element is added to the
'Use From Storage' list, the code will identify the most appropriate location for it in the core, and
will place it. Note that adding elements to these lists constrains the options available to the
optimization search, and may make it difficult (or impossible) for the code to find a valid solution.
Similarly, it is more difficult to find a valid solution with tighter constraints on the allowable blade
positions and maximum radial peaking. The "Max # of Tiers in the Full Search" value is applied by
the optimization tool as a constraint on the full search portion of the code.
When the interface window has been filled with the full set of user constraints, the optimization
search can be executed by selecting the 'Run' button. The optimization tool will perform the search,
and report back to the user when the search is completed. If the search was successful, a set of
output files will be created, and named based upon the user-specifiedfilename. The output files are:
" filenamewithfresh.xls: An Excel file output for the solution that utilizes fresh elements
" filename nofresh.xls: An Excel file output for the solution that does not utilize fresh
elements
e
filename_with_fresh.export: An MCODE-FM input file for the optimized core design that
utilizes the fresh new elements
" filename nofresh.export: An MCODE-FM input file for the optimized core design that
does not utilize the fresh new elements
" filename.txt: A text file documenting the search process; also contains the warnings and
errors encountered in the search
Note that if the 'New Elements Must be Used' option was selected, the code will only find a core
design that uses the new fresh elements. In this case, the filename no_fresh.export and
filename nojfresh.xls files will not be created. Similarly, if the number of new elements specified
is 0, or is greater than 3, the code will only find a solution that uses just the current in-core and instorage elements. The contents of the output Excel workbooks are discussed in detail below.
68
2.4.2
Output
The code will create an output directory in the user's current directory, and name it according to the
input text. It is recommended that the variable "Output File" not contain spaces since it will be used
as the directory name. General properties of the search, such as the target mass range or warning
messages encountered will be written to a text output file. When the search is complete, the code
will create MCODE-FM input files for the solutions (with and without fresh fuel).
In addition, solutions will each be written to an Excel file. The Excel files each have a separate
worksheet for: (1) a list of the previous core loading pattern, (2) a summary of all available
elements in the core and in storage, (3) anticipated BOC behavior for the optimized core, (4) EOC
behavior for the optimized core, and (5) parameters for the core behavior correlations. This file
documents the properties of the newly designed core loading pattern, including element orientations
and masses, maximum predicted peaking factors for each element (radial, axial, and lateral), and
predicted control blade positions. This spreadsheet format for the output file was selected because it
allows the user to easily assess the impact of making small changes to the optimized solution. All of
the predicted core parameters are based upon the loading pattern specified in the BOC worksheet
and the burnup data specified in the EOC worksheet. If any changes are made to this content (e.g.,
increasing the power or swapping an element), the rest of the content will update automatically.
An example of the Excel output format is shown in Figure 2-38. In the BOC spreadsheet, the
locations that have a different loading than the previous core (a different element, or the same
element in the opposite orientation) are starred. The spreadsheet documents the predicted peaking
factors, and indicates the maximum radial, axial, and lateral peaking factors in the core. The EOC
spreadsheet contains the same content, as well as the burnup parameters and the predicted control
blade behavior. Figure 2-39 demonstrates the behavior of the workbook when a change is made. In
this particular case, a different element was placed in C1O and the cycle length was extended.
Because the element has a different mass than the one it replaced, all of the power peaking factors
(BOC and EOG) are updated to reflect the change in mass distribution. This change also affects the
EOC masses, since individual element depletion is dependent upon BOC element mass peaking
factors. The predicted control blade positions are also updated, which is a reflection of the change
in core mass as well as the change in total burnup. In addition, the spreadsheet updates to star C 10
as a changed location relative to the EOC of the previous core, so that the user can continue to keep
track of the shuffling actions. By employing this output format, the optimization tool allows a user
to quickly assess a configuration that they are interested in without having to wait or tailor the
optimization tool inputs to land on that solution. Note that rotations are also reported in the output these represent the elements' rotated states in the previous core (the optimization tool does not
make decisions regarding element rotation).
69
Optimized Core, BOCBehavior
Suggested Loading Pattern
Location
A2
B1
B2
B4
B5
B6
B7
B8
B9
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
C13
C14
C15
Element g U235 Orientation
MIT345
704.63U
791.63U
MIT354
Fresh
831.00 U
MIT355
792.58U
MIT352
758.97U
Fresh
831.00D
MIT356
790.18U
MIT353
756.82U
Fresh
831.00D
590.69U
R
MIT299
MIT326
686.76D
R
MIT290
592.33U
MIT340
686.64D
707.87D
MIT341
MIT342
703.02D
MIT334
634.62 D
MIT323
658.36U
MIT324
646.39 D
R
MIT330
751.77D
MIT333
627.42D
R
MIT332
717.97D
R
662.49 D
MIT317
MIT338
699.41 D
MIT335
724.18U
net
Maximum Predicted Power Peaking Factors
Radial
Axial
Lateral
1.6091 1.4034 1.5750
1.4160 1.5172 1.8607
1.2547 1.5172 1.8607
1.3888 1.5172 1.8607
1.3279 1.5172 1.8607
1.4563 1.5172 1.8607
1.4463 1.5172 1.8607
1.2199 1.5172 1.8607
1.4668 1.5172 1.8607
1.0860 1.6720 1.9978
1.5479 1.9326 1.7065
1.3538 1.7359 1.9670
0.9828 1.6645 1.9044
1.4666 1.6720 1.9978
1.3842 1.8642 1.9791
1.4560 1.9326 1.7065
1.5024 1.7359 1.9670
0.9214 1.6645 1.9044
1.5354 1.6720 1.9978
1.2539 1.8642 1.9791
1.6028 1.9326 1.7065
1.5117 1.7359 1.9670
1.0023 1.6645 1.9044
1.4206 1.8642 1.9791
MassPk
0.9845
1.1060
1.1610
1.1074
1.0604
1.1610
1.1040
1.0574
1.1610
0.8253
0,9595
0.8276
0.9593
0.9890
0.9822
0.8867
0.9198
0.9031
1.0503
0.8766
1.0031
0.9256
0.9772
1.0118
17177.74
max pks: 1.609124 1.9326
1.9978
(a)
Optimized Core, EOCBehavior
Power
Days
6
Burnup
50
300.00
Suggested Loading Pattern:
Location
A2
BI
B2
B4
B5
B6
B7
B8
B9
C1
C2
C3
C4
Element g U235 Orientation
MIT345
686.50U
MIT354
774.54U
813.44U
Fresh
MIT355
775.47U
MIT11352 742.26U
813.44D
Fresh
MIT356
773.10U
740.14U
MIT353
Fresh
81344 D
MIT299
578.29U
R
MIT326
672.87D
MIT290
579.90U
R
MFIT340 672.75D
C5
MIT341
693.65 D
C6
C7
C8
C9
C10
C11
C12
C13
C14
C15
MIT342
MIT334
MIT323
MIT324
MIT330
M1T333
MIT332
MIT317
MIT338
MIT335
688.88D
621.54D
644.90U
633.13D
736.87D
614.44D
703.60D
648.97D
685.33D
709.71U
net
Mass Pk
R
R
R
0.9797
1.1054
1.1609
1.1067
1.0593
1.1609
1.1033
1.0563
1.1609
0.8253
0.9603
0.8276
0.9601
0.9899
0.9831
0.8870
0.9204
0.9035
1.0516
0.8769
1.0041
0.9262
0.9780
1.0128
16817.16
Maximum Predicted Power Peaking Factors
Radial
Axial
Lateral
1.5235 1.3239 1.6370
1.3539 1.4175 1.7515
1.4531 1.4175 1.7515
1.4199 1.4175 1.7515
1.1300 1.4175 1.7515
1.3786 1.4175 1.7515
1.3596 1.4175 1.7515
1.1410 1.4175 1.7515
1.3610 1.4175 1.7515
1.1449 1.4962 1.8709
1.7205 14678
1.6231
1.6377 14819
1.9457
0.9879 1.4849 1.8459
1.2617 1.4962 1.8709
1.9030 1.4431 1.8714
1.5950 1.4678 1.6231
1.7954 1.4819 1.9457
0.8960 1.4849 1.8459
1.3054 1.962
1.8709
1.8714
1.7529 1.431
1.7955 1.4678 1.6231
1.8052 1.4819 1.9457
1,0170
1.4849 1.8459
1.9449 1.4431 1.8714
max pks: 1.944927 1.4962
1.9457
Control Blade Position
Days
Mass
Position
0 17177.74 24.93
3 17155.26 36.81
50 16817.16 42.69
(b)
Figure 2-38 Example of the Excel Output File Content, (a) BOC and (b) EOC
70
Optimized Core, BOC Behavior
Suggested Loading Pattern
Maximum Predicted Power Peaking Factors
Location
A2
BI
B2
B4
BS
B6
B7
B8
B9
C1
C2
C3
C4
C5
C6
C7
C8
< C10
CT1
C12
C13
C14
C15
Element g U235 Orientation
MIT345
704.63U
MIT354
791.63 U
Fresh
831.00U
MIT355
792.58U
MIT352
758.97U
Fresh
831.00D
MIT356
790.18U
MIT353
756.82U
Fresh
831.00D
MIT299
590.69U
R
MIT326
686.76D
MIT298
592.33U
R
MIT340
686.64D
MIT341
707.87D
MIT342
703.020
MIT334
634.62D
MIT323
658.36U
R
MIT2811
562.09 D
TTn
2671
D
R
MIT332
717.97D
R
MIT317
662.49D
MIT338
699.41D
MIT335
724.18U
net
Mass Pk
0.9955
1.1184
1.1740
1.1197
1.0722
1.1740
1.1163
1.0692
1.1740
0.8345
0.9702
0.8368
0.9701
1.0001
0.9932
0.8966
0.9301
0.9132
0.7941
0.8864
1.0143
0.9359
0.9881
1.0231
16988.06
Radial
Axial
Lateral
1.6214 1.4034 1.5750
1.4243 1.5172 1.8607
1.2640 1.5172 1.8607
1.4022 1.5172 1.8607
1.3279 1.5172 1.8607
1.4629 1.5172 1.8607
1.4545 1.5172 1.8607
1.2284 1.5172 1.8607
1.4813 1.5172 1.8607
1.0941 1.6720 1.9978
1.5614 1.9326 1.7065
1.3687 1.7359 1.9670
0.9945 1.6645 1.9044
1.4790 1.6720 1.9978
1.3977 1.8642 1.9791
1.4685 1.9326 1.7065
1.5189 1.7359 1.9670
0.9324
1.6645 1.9044
1.2479 1.6720 1.9978
1,2659
1.8642 1.9791
1.6170 1.9326 1.7065
1.5283 1.7359 1.9670
1.0142 1.6645 1.9044
1.4346 1.8642 1.9791
max pks: 1.621433 1.9326
1.9978
(a)
Optimized Core. EOCBehavior
Power
6
Days ,-Burnup
330.0
Suggested Loading Pattern:
Location
A2
Bi
B2
B4
B5
B6
B7
B8
B9
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
C13
C14
C15
Element g U235 Orientation
MIT345
684.46U
MIT354
T72.71U
Fresh
811.57U
MIT355
773.65U
740.48U
MIT352
Fresh
811.57D0
MIT356
771.28U
MIT353
738.36U
Fresh
811.57D
MIT299
576.93U
R
MIT326
671.35D
MIT290
578.54U
R
MIT340
671.23D
MIT341
692.10D
MIT342
687.33D
MIT334
620.11D
MIT323
643.43U
M1IT324
631.68D
R
MIT281
548.82D3
MIT333
613.030
R
MIT332
702.02D
R
MIT317
647.49D
MIT338
683.78 D
11T335
708.13U
net
MassPk
0.9901
1.1177
1.1739
1.1191
1.0711
1.1739
1.1157
1.0680
1.1739
0.8345
0.9711
0.8369
0.9709
1.0011
0.9942
0.8970
0.9307
0.9137
0.7939
0,8867
1,0155
0.9366
0.9891
1.0243
16591.62
Maximum Predicted Power Peaking Factors
Radial
Axial
Lateral
1.5339 1.3239 1.6370
1.3621 1.4175 1.7515
1.4681 1.4175 1.7515
1.4199 1.4175 1.7515
1.1366 1.4175 1.7515
1.3833 1.4175 1.7515
1.3656 1.4175 1.7515
1.1512 1.4175 1.7515
1.3649 1.4175 1.7515
1.1515 1.4962 1.8709
1.7390 1.4678 1.6231
1.6535 1.4819 1.9457
1.0055 1.4849 1.8459
1.2696 1.4962 1.8709
1.9187 1.4431 1.8714
1.6121 1.4678 1.6231
1.8130 1.4819 1.9457
0.9125 1.4849 1.8459
1.1227 1.4962 1.8709
1.7669 1.4431 1.8714
1.8150 1.4678 1.6231
1.8230 1.4819 1.9457
1.0350 1.4849 1.8459
1.9611
max pks: 1.961132
1.4431
1.8714
1.4962
1.9457
Control Blade Position
Days
Mass
Position
0 16988.06 28.23
3 16965.50 40.11
55 16591.62 46.62
(b)
Figure 2-39 Example of the Excel Output File Content with After Changes to the Element in C10 and the Target Cycle
Length, (a) BOC and (b) EOC
71
If the optimization tool is not able to find a valid solution, but it has successfully evaluated the
previous core loading pattern, it will still create an Excel file for the user. The previous core loading
pattern printed will be in place of the BOC optimal core data. This serves to provide the user with a
complete summary of the current in-core pattern, as well as the set of available elements. In
addition, by examining the spreadsheet data, the user may gather a better understanding of why the
search failed, and can adjust the input constraints accordingly.
2.5
Verification
2.5.1
Verification of Code Methodology
Verification of the optimization tool seeks to (1) ensure that the code is accurately accounting for
user-input constraints and (2) ensure that the correlations are accurately predicting the behavior of a
given core (Section 0). Table 2-17 documents the solutions found by the code starting from the
EOC of the equilibrium run with a 1 radial/6 axial/l lateral mesh and the 'default' input parameters
(shown populating the GUI input dialog in Figure 2-37). These input parameters (which are applied
by the code in addition to the built-in constraints) are:
e
Cycle Length = 50 days
e
Power=6 MW
e
Minimum BOC Blade Position
17 cm
e
Maximum BOC Blade Position
35 cm
e
Maximum EOC Blade Position
48 cm
e
Number of New Elements = 3
e
Maximum Plate Peaking = 2.0
72
The table also documents the loading pattern at the end of Core 190, and shows the orientation and
mass of each element. The changes made from the EOC of the previous core are highlighted. Both
solutions properly identify that locations B6 and B9 need to be refueled. In the case with fresh
elements, the third fresh element is properly placed in location B2, the lower mass location of B2
and B4 (which are the two options for element placement, per the relationships in Table 2-15). In
the case without fresh fuel, the replacement of the two lowest mass B-ring elements does not
introduce as much U 2 35 as the fresh fuel. In this solution, the code provides additional mass by
replacing the 591 gram element in C1 with a 703 gram stored element. Note that the solution with
fresh fuel still introduces more total U235, and this is reflected in the lower BOC and EOC critical
control blade positions. Additionally, in both cases, the BOC blade position is within the allowable
range of 17 to 35 cm, the EOC blade position is below the limit of 48 cm, and the maximum BOC
and EOC radial peaking factors in the core are below the limit of 2.0. The code also recommends
flipping the elements when placing them in B6, B9, and Cl, since this is the lower radial peaking
orientation.
Table 2-18 compares the solution with fresh elements to two more constrained solutions - one with
the requirement that MIT-349 (loaded in B9 at the EOC of Core 190) remain in the core, and the
other with the requirement that MIT-346 be used from storage. When the code is unable to remove
MIT-349, it properly identifies B8 as the appropriate location for fresh element placement. Note
that unlike in B9, the code does not recommend flipping the element in B8, where plate peaking is
not dependent upon orientation. The replacement in B8 introduces less U2 35 than the replacement in
B9, and this is reflected in the higher critical control blade positions. When the code is required to
use MIT-346 from storage, it identifies MIT-299, with a mass of 590.6 grams, as the appropriate
element to replace. Note that the maximum peaking value in this configuration is actually slightly
lower than the maximum peaking factor in the original solution. However, the original solution was
first selected by the code because it has a lower number of shuffles - as long as the maximum
peaking is below the limit, the code prioritizes minimizing fuel shuffling over minimizing power
peaking.
73
Table 2-17 Solution From LEU 190, For Default Input Constraints of 50 days, 6 MW, 2.0 Maximum Peaking, 3 New, 48.0
Maximum EOC Blade, 17.0 Minimum BOC Blade, 35.0 Maximum BOC Blade
EOC of Core 190
Solution with Fresh
Location
Element
Orient
Mass
Element
A2
BI
B2
B4
B5
B6
MIT345
MIT354
MIT351
MIT355
MIT352
MIT348
U
U
U
U
U
U
704.6
791.6
760.0
792.6
759.0
714.2
MIT345
MIT354
B7
MIT356
U
B8
MIT353
B9
MIT349
C1
Orient
Solution without Fresh
Mass
Element
Orient
U
U
Nresh
U
MIT355
U
MIT352
U
'Freh
D
704.6
791.6
831.0
792.6
759.0
831.0
MIT345
MIT354
MIT351
MIT355
MIT352
MIT336
U
U
U
U
U
D
704.6
791.6
760.0
792.6
759.0
074..5
790.2
MIT356
U
790.2
MIT356
U
790.2
U
756.8
MIT353
U
756.8
MIT353
U
756.8
MIT299
U
U
714.7
590.7
Fesh
MIT299
D
U
81
590.7
347
MIT344
U
03.3
C2
MIT326
D
686.8
MIT326
D
686.8
MIT326
D
686.8
C3
MIT290
U
592.3
MIT290
U
592.3
MIT290
U
592.3
C4
MIT340
D
686.6
MIT340
D
686.6
MIT340
D
686.6
C5
MIT341
707.9
MIT341
C6
MIT342
D
D
703.0
MIT342
D
D
707.9
703.0
MIT341
MIT342
D
D
707.9
703.0
C7
MIT334
D
634.6
D
C8
MIT323
U
658.4
MIT334
MIT323
U
634.6
658.4
MIT334
MIT323
D
U
634.6
658.4
Mass
C9
MIT324
D
646.4
MIT324
D
646.4
MIT324
D
646.4
CIO
MIT330
D
751.8
MIT330
D
751.8
MIT330
D
751.8
C11
MIT333
D
627.4
MIT333
D
627.4
MIT333
D
627.4
C12
MIT332
D
718.0
MIT332
D
718.0
MIT332
D
718.0
C13
MIT317
D
662.5
MIT317
D
662.5
MIT317
D
662.5
C14
MIT338
D
699.4
MIT338
D
699.4
MIT338
D
699.4
C15
MIT335
U
724.2
MIT335
U
724.2
MIT335
U
724.2
Maximum Radial Peaking, BOC
Maximum Radial Peaking, EOC
1.61
1.62
1.94
1.96
BOC Critical Blade Position (cm)
EOC Critical Blade Position (cm)
24.93
27.07
42.69
44.85
*Gold indicates fuel shuffling
74
Table 2-18 Comparison of Solution (1) With Default Inputs, (2) With "keep" MIT 349 in Core, and
(3) With "use" MIT346 from Storage
Original Solution With New
Keep MIT349 in Core
Location Element Orient Mass Element Orient Mass
Use MIT346 From Storage
Element Orient Mass
A2
BI
B2
B4
B5
B6
B7
B8
B9
Cl
C2
C3
C4
C5
C6
C7
C8
C9
CIO
MIT345
MIT354
Fresh
MIT355
MIT352
Fresh
MIT356
MIT353
Fresh
MIT299
MIT326
MIT290
MIT340
MIT341
MIT342
MIT334
MIT323
MIT324
MIT330
U
U
U
U
U
D
U
U
D
U
D
U
D
D
D
D
U
D
D
704.6
791.6
831.0
792.6
759.0
831.0
790.2
756.8
831.0
590.7
686.8
592.3
686.6
707.9
703.0
634.6
658.4
646.4
751.8
MIT345
MIT354
Fresh
MIT355
MIT352
Fresh
MIT356
Fresh
MIT349
MIT299
MIT326
MIT290
MIT340
MIT341
MIT342
MIT334
MIT323
MIT324
MIT330
U
U
U
U
U
D
U
U
U
U
D
U
D
D
D
D
U
D
D
704.6
791.6
831.0
792.6
759.0
831.0
790.2
831,0
.714.7
590.7
686.8
592.3
686.6
707.9
703.0
634.6
658.4
646.4
751.8
MIT345
MIT354
Fresh
MIT355
MIT352
Fresh
MIT356
MIT353
Fresh
MfT346
MIT326
MIT290
MIT340
MIT341
MIT342
MIT334
MIT323
MIT324
MIT330
U
U
U
U
U
D
U
U
D
U
D
U
D
D
D
D
U
D
D
704.6
791.6
831.0
792.6
759.0
831.0
790.2
756.8
831.0
69
686.8
592.3
686.6
707.9
703.0
634.6
658.4
646.4
751.8
ClI
C12
C13
C14
C15
MIT333
MIT332
MIT317
MIT338
MIT335
D
D
D
D
U
627.4
718.0
662.5
699.4
724.2
MIT333
MIT332
MIT317
MIT338
MIT335
D
D
D
D
U
627.4
718.0
662.5
699.4
724.2
MIT333
MIT332
MIT317
MIT338
MIT335
D
D
D
D
U
627.4
718.0
662.5
699.4
724.2
BOC Radial Peak
1.6091
1.66
1.60
EOC Radial Peak
BOC Blade (cm)
EOC Blade (cm)
1.9449
24.93
42.69
1.95
27.90
45.27
1.94
25.28
42.65
*Gold indicates a change from the original solution
75
Table 2-19 compares the original solution with the solution found by the code if the maximum
allowed radial power peaking factor is reduced from 2.0 to 1.9. The original solution had two
locations with EOC radial peaking values greater than 1.9 - C6 and Cl 5. To reduce the peaking in
C 15, the code flips it, orienting the plates perpendicular rather than parallel. The peaking in location
C6 could have also been brought below the limit by flipping the current element, MIT-342, with a
mass of 703 grams, from 'down' to 'up'. However, that is not the solution that the code finds.
Instead, it has placed a different element from storage there in the 'up' orientation, MIT-351 with a
mass of 760 grams. The code selected this solution because it regards flipping a current element and
bringing in a new element as equivalent in terms of shuffling. Placing MIT-351 in this location has
a lower maximum core-wide radial peaking factor than just flipping MIT-342, and therefore this
action is selected by the code as the better solution. This is because radial peaking is calculated by
the code based on the mass distribution. With MIT-351 loaded in C6 in the new solution, the
maximum radial peaking value is the EOC peaking of 1.800 in MIT-317 in Cl3, which has an
element mass peaking factor of 0.9225 at BOC and 0.9231 at EOC. If MIT-342 was kept in the
location and flipped, MIT-317 would have a slightly higher mass peaking factor of 0.9256 at BOC
and 0.9262 at EOC, which corresponds to an EOC radial peaking factor of 1.805. Therefore the
code elected to shuffle rather than flip.
The impact of the control blade position constraints is examined in Table 2-20, which compares the
original solutions (which had a minimum allowed BOC control blade position of 17 cm) with the
solutions found when the minimum allowed BOC control blade position is increased to 29 cm. Both
of the original solutions had BOC critical blade positions below this value. A higher minimum BOC
blade position implies that there must be less excess reactivity in the core, and therefore less U-235
mass. In the case with fresh elements, the code handles this by replacing a 708 gram element in C5
with a 558 gram element, in addition to making the required placement of the fresh elements in the
B-ring. In the case without fresh elements, the code achieves a lower excess reactivity by replacing
MIT-334, which has a mass of 635 grams, rather than MIT-299, which has a mass of 591 grams.
The replacement therefore introduces 83 grams of U235 instead of 127. This solution still makes the
appropriate replacements to the B-ring as well.
Note that in both of the solutions with the higher minimum BOC blade position, the EOC blade
position is very close to the EOC blade constraint of 48 cm. The optimization tool was also run with
the constraint of a minimum allowed blade position of 30 cm. In this case, the code returned an
error that a valid target mass range could not be defined - the BOC blade position window of 30 to
35 cm allows for an initial mass of 16681 to 16970.4 grams U23s, while the target burnup requires
an initial mass of 16978.6 grams to remain below the EOC blade limit.
76
Table 2-19 Comparison of Solution with Maximum Peaking Constraint of 1.9
Original Solution With New
BOC
Peaking Must Be Below 1.9
EOC
BOC
Mass Max Mass Max
mass Pk
Pk
MIT345 U 705 0.98
MIT354 U 792 1.11
Fresh U 831 1.16
MIT355 U 793 1.11
MIT352 U 759 1.06
Fresh D 831 1.16
MIT356 U 790 1.10
1.61
Pk
Mass Max Mass Max
Pk
mass Pk
B9
C1
MIT353 U 757 1.06
Fresh D 831 1.16
MIT299 U 591 0.83
1.52 MIT345 U
1.35 MIT354 U
1.42
1.25 1.16 1.45 Fresh U
1.39 1.11 1.42 MIT355 U
1.33 1.06 1.13 MIT352 U
Fresh D
1.46 1.16 1.38
1.45 1.10 1.36 MIT356 U
1.22 1.06 1.14 MIT353 U
D
1.47 1.16 1.36 Fresh
1.09 0.83 1.14 MIT299 U
C2
C3
MIT326 D 687 0.96
MIT290 U 592 0.83
1.55 0.96
1.35 0.83
C4
C5
C6
C7
C8
C9
MIT340 D 687
MIT341 D 708
MIT342 D 703
MIT334 D 635
MIT323 U 658
MIT324 D 646
C1O
CII
MIT330 D 752 1.05
MIT333 D 627 0.88
C12
C13
MIT332 D 718 1.00
MIT317 D 662 0.93
MIT338 D 699 0.98
MIT335 U 724 1.01
A2
BI
B2
B4
B5
B6
B7
B8
C14
C15
0.96
0.99
0.98
0.89
0.92
0.90
Max. Plate Power
Peak
BOC
1.61
0.98
1.47
0.98
1.11
831
793
Pk
Pk
0.98 1.61
1.10 1.41
1.16 1.25
1.10 1.38
0.98
1.52
1.10
1.16
1.35
1.10
1.42
1.33 1.06
1.45 1.16
1.44 1.10
1.22 1.05
1.46 1.16
1.08 0.82
1.13
1.38
1.36
1.14
759 1.06
831 1.16
790 1.10
757 1.05
831 1.16
591 0.82
1.38
1.46
1.50 0.92 1.80
0.92 0.90 0.90
1.54 1.05 1.31
1.25 0.88 1.75
1.60
1.51
1.00
0.93
1.00
1.42
0.98
1.01
BOC
24.93
Guold indicates a change frorn the original
705
792
Pk
1.45
1.36
1.14
1.71
1.72 MIT326 D 687 0.96 1.54 0.96
1.64 MIT290 U 592 0.82 1.35 0.82 1.63
0.96 0.99 MIT340 D 687 0.96 0.98 0.96 0.98
0.99 1.26 MIT341 D 708 0.99 1.46 0.99 1.26
MIT351 U 760 1.06 1.29 1.06 1,3
0.98
0.89 1.60 MIT334 D 635 0.88 1.45 0.88 1.59
MIT323 U 658 0.92 1.50 0.92
MIT324 D 646 0.90 0.92 0.90
MIT330 D 752 1.05 1.53 1.05
MIT333 D 627 0.87 1.25 0.87
1.80 MIT332 D 718 1.00 1.60 1.00
1.81 MIT317 D 662 0.92 1.51 0.92
1.02 MIT338 D 699 0.97 1.00 0.97
MIT335 D 724 1.01 1.49 1.01
Max. Plate Power
Peak
Blade Position
EOC
EOC
soluion; red
E BOC
42.69
EOC
1.61
indicates a value
77
OT interest
tr
tnc constraint
1.79
0.89
1.30
1.75
1.79
1.01
1.28
Blade Position
BOC
EOC
26.18
43.55
Table 2-20 Comparison of Original Solutions with Case with Minimum BOC Critical Blade Position of 29 cm
Original
Minimum BOC Critical Blade Position of 29 cm
Solution with Fresh Solution with no Fresh
Element
A2
Bi
B2
B4
B5
B6
B7
B8
B9
Cl
C2
C3
C4
C5
C6
C7
C8
C9
CIO
CI
C12
C13
C14
C15
MIT345
MIT354
Fresh
MIT355
MIT352
Fresh
MIT356
MIT353
Fresh
MIT299
MIT326
MIT290
MIT340
MIT341
MIT342
MIT334
MIT323
MIT324
MIT330
MIT333
MIT332
MIT317
MIT338
MIT335
BOC Rad. Peak
EOC Rad. Peak
BOC Blade (cm)
EOC Blade (cm)
U
U
U
U
U
D
U
U
D
U
D
U
D
D
D
D
U
D
D
D
D
D
D
U
Mass
Element
705
792
831
793
759
831
790
757
831
591
687
592
687
708
703
635
658
646
752
627
718
662
699
724
MIT345
MIT354
MIT351
MIT355
MIT352
MIT336
MIT356
MIT353
MIT347
MIT344
MIT326
MIT290
MIT340
MIT341
MIT342
MIT334
MIT323
MIT324
MIT330
MIT333
MIT332
MIT317
MIT338
MIT335
1.61
1.95
M7
42.69
U
U
U
U
U
D
U
U
D
U
D
U
D
D
D
D
U
D
D
D
D
D
D
U
Solution with Fresh
Mass
Element
705
792
760
793
759
741
790
757
756
703
687
592
687
708
703
635
658
646
752
627
718
662
699
724
MIT345
MIT354
Fresh
MIT355
MIT352
Fresh
MIT356
MIT353
Fresh
MIT299
MIT326
MIT290
MIT340
MIT300
MIT342
MIT334
MIT323
MIT324
MIT330
MIT333
MIT332
MIT317
MIT338
MIT335
1.63
1.96
U
U
U
U
U
D
U
U
D
U
D
U
D
U
D
D
U
D
D
D
D
D
D
U
Solution with no Fresh
Mass
Element
705
792
831
793
759
831
790
757
831
591
687
592
687
558
703
635
658
646
752
627
718
662
699
724
MIT345
MIT354
MIT351
MIT355
MIT352
MIT336
MIT356
MIT353
MIT347
MIT299
MIT326
MIT290
MIT340
MIT341
MIT342
MIT343
MIT323
MIT324
MIT330
MIT333
MIT332
MIT317
MIT338
MIT335
Mass
U
U
U
U
U
D
U
U
D
U
D
U
D
D
D
U
U
D
D
D
D
D
D
U
705
792
760
793
759
741
790
757
756
591
687
592
687
708
703
719
658
646
752
627
718
662
699
724
1.62
1.96
1.62
1.96
4
29.77
29.79
44.85
47.13
47.17
*Gold indicates a change from the original solution; red indicates a value of interest for the constraint
78
2.5.2
2.5.2.1
Verification of Correlations
Equilibrium Core 185
Preliminary verification of the correlations was done using LEU equilibrium core 185, which was
not analyzed or included in the development of the correlations. This is the first 'pseudoequilibrium' core of the equilibrium run. This analysis was done using the 6 radial/ 4 lateral/ 18
axial mesh case. It should be noted that for any case, the accuracy of the correlations will be
somewhat dependent upon the depletion mesh used for the run, since this impacts the MCODE-FM
predicted power distribution.
The radial peaking factors are compared in Figure 2-40, and the axial and lateral peaking factors are
compared in Figure 2-41. Recall that the optimization tool only takes into account radial peaking
when searching for an optimal loading pattern. The axial and lateral values are reported for a given
core to provide the user with a general idea of the locations that may be of concern for peaking, but
these parameters do not impact the solution. As Figure 2-40 reflects, the correlations are accurate in
identifying the locations that are of the most concern for plate peaking. Table 2-21 documents the
MCODE-FM calculated BOC and EOC value for each parameter as well as the percent error in the
correlation prediction for that value. In the table, the locations with a peaking value above 1.7 are
highlighted as well as the locations with a percent error below zero - that is, the locations where the
peaking is under-predicted. Only one axial or lateral value is under-predicted - the correlations
predict a BOC lateral peaking value in C14 of 1.71, and the MCODE-FM value is 1.72, which is a
I% error. This implies that the correlations are sufficiently conservative in approximating axial and
lateral peaking. The locations where the radial peaking values are underpredicted are not the
locations with the hottest plates, and therefore are not the locations of most concern for safety
limits. The most significant error in the radial peaking values is in C1 1, where the correlations
predict a BOC radial peaking of 1.44, while the MCODE-FM value is 1.53. Both of these values are
well below the maximum BOC peaking value in the core of 1.79. Note that the predicted EOC
peaking factors are also based upon the predicted EOC mass values from the depletion correlations.
The errors in the EOC masses are documented in Table 2-22. The depletion equations over/underpredict the individual element mass loss over core life values by a maximum of 8.7%, which
translates to less than I % error in the element mass. It should be noted that there is not a fixed
direction for conservatism when considering the element depletion. Over-predicting the mass of a
heavier element is conservative, since this will translate into an over-prediction of the element's
mass peaking factor and therefore it's radial peaking. However, over-predicting the mass of a
lighter element could result in skewing the calculated mass distribution, and under-predicting the
mass peaking and power peaking factors of a heavier element. As the data in the table indicates, the
errors in the EOC mass values are very minor and should not significantly skew the power peaking
correlations. The control blade motion is plotted in Figure 2-42.
79
2.50
0
2.30
2.10
LIL
bo
1.90
---------
-
- ------------
-
-
-
1.70
1.50
0.
1.30
1.10
E
0.90
E
0.70
CR
0.50
A2 B1 B2 B4 B5 B6 B7 B8 B9 C1 C2 C3 C4 C5 C6 C7 C8 C9 C1OC11C12C13C14C15
0 MCODE-FM
0 Predicted
a
(a)
2.50
Cj
2.30
0
2.10
U-
1.90
btO
S
1.70
1.50
1.30
1.10
E
E
0.90
0.70
0.50
A2 B1 B2 B4 B5 B6 B7 B8 B9 C1 C2 C3 C4 C5 C6 C7 C8 C9 ClCC12C13C14C15
I MCODE-FM
* Predicted
(b)
Figure 2-40 Comparison of the Correlation Predicated and MCODE-FM Calculated Maximum Radial Peaking Factors in
Each Element for (a) BOC and (b) EOC for LEU Equilibrium Core 185
80
2.0
I
I
II
.1.8
2.0
I
ba
M
"u*1. 5
a. 1.5
II
x 1.3
1.3
E
1.0
E
'C
en 0.8
E
=1.0
E
*X0.8
0.5
1.8
0)
Nq
..
N4
c ia
a
0
.Pre .
. .. .MCDF
d-icN
t.. .. ..
0
0
-
U
U
CO
co
U
ca
U
Li
U
,-
0.5
-
NN
co
-
<
U
Nl
co
n
CD
Predicted m MCODE-FM
in
Ml
co
Wf
U
00
0
N
U
I:
4r
Predicted 0 MCODE-FMW
(a)
2.1
U
(3
i
U
(b)
.1
o 2.1
4-0
I II I I I
U
U-
I I
La.
ba
1.7
E.
n. 1.7
I
I
n
1.3
S1.3
E 0.9
E
E 0.9
E
0.5
j
0.5
N
N
<
n
NT
ooCD
0)
CDU
W~
00
U U
U
U Predicted U MCODE-FM
0
-
U
N
H
U
Nj
TT
-
<
Nj
C
W)
NDC
C)
Nj
DU
U
U Predicted
(c)
R*
U
D
U
00
U
a MCODE-FM
a
4
U
U
U
(d)
Figure 2-41 Comparison of the Correlation Predicated and MCODE-FM Calculated Maximum Peaking Factors, (a) BOC
Axial, (b) EOC Axial, (c) BOC Lateral, (d) EOC Lateral, for LEU Equilibrium Core 185
55
50
0-,
:t
0
45
- -4-Correlation
Prediction
C
en 40
0
C
Li
35
30
E
U
25
-U--MCODE-FM
Criticality
Search
20
0
10
20
30
Days Operating
40
50
Figure 2-42 Critical Control Blade Position over LEU Equilibrium Core 185
81
Table 2-21 MCODE Peaking Factor Values from MCNP Tally Data and the % Error in the Correlation Prediction of the
Parameter, LEU Equilibrium Core 185, 6 radial/ 18 axial/ 4 Lateral Mesh
Radial Peaking
BOC
EOC
Value
%
Value
Vau Error Vau
Error
A2
BI
B2
B4
B5
B6
B7
B8
B9
C1
C2
C3
C4
C5
C6
C7
C8
C9
C1O
C11
C12
C13
C14
C15
1.64
1.37
1.14
1.45
1.19
1.40
1.31
1.50
3.22
3.53
0.70
11.48
8.19
3.08
-5.23
8.08
1.49
1.15
1.30
0.81
1.01
1.45
1.37
1.49
1.00
1.08
1.53
1.37
1.45
1.33
1.58
-3.84
22.38
10.43
5.07
29.60
-12.23
19.20
-6.77
7.70
19.13
-6.42
9.08
13.97
16.45
-9.44
1.52
1.29
1.10
1.38
1.14
1.63
1.32
1.29
1.69
1.44
1.53
0.86
1.03
1.64
1.04
1.09
3.38
4.75
21.85
2.69
1.61
5.28
2.63
-9.64
1.84
11.71
6.09
13.10
-8.76
12.58
7.83
7.02
-1.80
7.89
5.61
6.83
-6.20
9.86
-1.15
3.94
Axial Peaking
EOC
BOC
Value
Vau
Value
VleError
1.32
1.29
1.37
1.45
1.37
1.36
1.40
1.44
1.32
1.66
1.57
1.52
1.52
1.67
1.66
1.54
1.53
1.59
1.61
=
1.67
6.42
17.75
11.14
4.83
10.61
11.59
8.20
5.32
14.91
12.14
11.30
10.38
9.49
9.76
11.35
9.94
4.83
7.88
9.08
17.49
11.66
7.72
10.22
11.60
1.24
1.31
1.27
1.33
1.30
1.29
1.39
1.33
1.31
1.32
1.35
1.40
1.32
1.38
1.31
1.31
1.36
1.33
1.30
1.30
1.33
1.40
1.36
1.32
Value
Error Vau
6.58
8.19
11.27
6.23
9.28
10.22
1.73
6.67
8.60
9.19
8.78
5.97
12.11
8.17
9.77
11.69
8.83
11.91
14.71
10.77
10.61
5.88
7.82
9.11
*Red indicates a Peaking factor above 1.7; gold indicates a negative % error in the prediction
82
Lateral Peaking
EOC
BOC
1.52
1.57
1.68
1.55
1.55
1.49
1.44
1.62
1.67
1.49
Error
3.89
18.36
10.52
20.08
19.96
25.18
8.36
29.05
15.05
18.59
14.50
15.57
Value
Vau
E%
Error
1.48
1.54
1.62
1.45
1.53
1.43
10.69
1.68
1.42
1.42
1.51
1.38
2.37
1.49
1.68
1.67
1.63
1.59
1.55
1.68
1.53
6.95
13.39
14.39
1.70
1.53
1.46
16.86
13.96
22.93
24.26
10.37
16.95
-1 00
29.15
1.43
1.46
1.48
1.54
13.45
8.05
20.89
14.50
22.11
4.48
23.14
23.18
23.68
17.42
10.55
6.10
10.24
22.35
11.40
9.67
6.77
8.47
30.63
10.83
9.67
9.46
21.71
Table 2-22 Evaluation of the Depletion Correlations, LEU Equilibrium Core 185
Mass Lost,
BOC to EOC
EOC Mass
A2
BI
B2
B4
B5
B6
B7
B8
B9
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10O
C11
C12
C 3
C14
C15
2.5.2.2
Predicted
712.38
758.28
733.80
812.01
762.56
812.01
757.17
748.11
812.01
707.63
587.92
610.24
577.50
588.38
615.20
711.67
589.20
723.50
572.16
709.82
633.44
700.84
667.17
706.35
MCODE
712.62
7
758.17
7
735.27
8
811.55
7
763.35
8
810.46
756.32
7
748.98
8
811.07
707.53
7
5
588.51
610.77
6
5
578.51
5
588.61
6
615.39
7
711.91
5
588.75
723.74
7
5
572.03
7
709.43
633.46
6
7
700.13
6
666.99
706.19
Error
-0.03
0.01
-0.20
0.06
-0.10
0.19
0.11
-0.12
0.12
0.01
-0.10
-0.09
-0.17
-0.04
-0.03
-0.03
0.08
-0.03
0.02
0.05
0.00
0.10
0.03
0.02
Predicted
20.90
18.66
18.33
19.37
18.72
19.37
18.64
18.52
19.37
15.98
13.90
14.29
13.72
13.91
14.37
16.05
13.92
16.26
13.62
16.02
14.69
15.87
15.28
15.96
MCODE
20.66
18.77
16.87
19.82
17.93
20.91
19.49
17.64
20.30
16.09
13.32
13.76
12.71
13.68
14.19
15.81
14.37
16.02
13.76
16.41
14.67
16.57
15.47
16.13
Error
1.18
-0.57
8.69
-2.28
4.36
-7.39
-4.32
4.98
-4.61
-0.65
4.37
3.84
7.94
1.64
1.30
1.54
-3.14
1.50
-0.96
-2.36
0.15
-4.26
-1.22
-1.02
Hypothetical Cores 191 to 193
The correlations have also been evaluated against data from a series of test cases which simulate
the refueling of three hypothetical cores following LEU Equilibrium Core 190. The shuffling
pattern used is documented in Table 2-23. For convenience, the cores are referred to as Cores
191-193. The verification cores were run with a 6 radial/ 4 lateral/ 6 axial depletion mesh for 45
days each at 7 MW, for a core burnup of 315 MWd. Each core was run at zero power for 5 days
initially to simulate refueling. The optimization tool correlations were applied to the BOC
masses of each core, to predict EOC masses, BOC and EOC power peaking, and critical control
83
blade motion over the life of the core. The control blade position and radial peaking verifications
are of the most interest, since these parameters actively impact which loading pattern the code
selects. In this core set, the fresh fuel elements were placed in Core 191 according to the
minimum mass B-ring elements at the end of Core 190, and in Core 193 based upon an estimate
of the locations that would need refueling. The other fuel shuffling decisions were based upon
the HEU element fuel shuffling done in the earliest transition core scheme (Case 1, Table B. 1 of
the Appendix).
Table 2-23 Fuel Shuffling for Verification Cores 191-193
Core
Fuel Shuffling
191
Fresh fuel in B6 and B9, MIT-336 replaces MIT-323 in C8, MIT 343 replaces MIT-324
in C9; MIT-317 and MIT-335, in C13 and C15 respectively, are flipped
192
MIT-349 replaces MIT-299 in Cl; MIT-294 replaces MIT-290 in C3
193
Fresh fuel in B2, B4, and B8; MIT-347 replaces MIT-345 in A2
Table 2-24 documents the individual element EOC U2 masses and BOC to EOC mass losses.
The radial, axial, and lateral peaking values are evaluated in Table 2-25 to Table 2-27. The radial
peaking factors are also shown in Figure 2-43. For each parameter, the tables list the correlationpredicted value, the MCODE-FM result value, and the percent error in the prediction. As Figure
2-43 demonstrates, the correlations consistently identify correctly the locations that will be of
greatest concern for radial peaking at both BOC and EOC. The hottest peaking factors in each
data set are generally over-predicted by roughly 6-10%. The most significantly under-predicted
radial peaking value in the three cores is location C 11 of Core 192. This element has a predicted
BOC peaking value of 1.24 and an actual value of 1.48; the under-prediction may be due to the
spread in the correlation data set. This value is well below the maximum BOC radial peaking
factor in the core of 1.89. The axial peaking factors are generally over-predicted, with the
exception of a few values that are under-predicted by less than 5%. The lateral peaking factors
are all over-predicted by a large margin. The critical control blade position positions are
evaluated in Figure 2-44 and Table 2-28. As this data shows , the correlations are somewhat
under-predicting the critical positions, particularly at BOC. This should be investigated further.
The correlations in general were somewhat less accurate with these cases than with the Core 185
evaluation, which may be a reflection of the difference in the axial depletion mesh.
84
0-
0
2z
Core 191
Core 192
EOC Mass
U235 Mass Loss
EOC Mass
U235 Mass Loss
Predict MCODE % Error Predict MCODE % Erro Predict MCODE % Erroi Predict MCODE %Erre
A2
685.6
685.3
0.05
18.9
19.3
-1.79 1 666.6
666.4
0.03 | 18.7
18.8 -0.96
BI
773.8
773.5
0.04
17.9
18.2
-1.64
755.7
755.5
0.03
17.8
18
-1.16
B2
742
743.3
-0.17
16.2
7.98
17.5
725.9
727.3
-0.20
17.4
16
9.05
B4
774.6
774.4
0.03
17.9
18.2
-1.46
756.6
756.7
-0.02
17.8
17.6
0.97
B5
741.2
742
-0.10
17.5
16.7
4.61 724.6 725.9
-0.18
17.4
16.1
8.03
B6
813.3
811.6
0.21
18.4
20.1
-8.40 793.4
792.1
0.16
18.3
19.6 -6.56
B7
772.9
771.9
0.13
17.9
18.8
-5.14
754.1
753.4
0.10
17.8
18.5
-3.95
B8
739.9
740.8
-0.12
17.5
16.6
5.38
723.4
724.4 -0.14
17.4
16.4
6.17
B9
813.3
812.1
0.15
18.4
19.6
-6.38
793.8
792.9
0.11
18.3
19.1
-4.44
Cl
585.7
586
-0.05
12.8
13.1
2.50
700.3
700.5
-0.03
15.1
14.9
1.41
C2
-0.11
672.5
673.3
14.5
13.7
5.62
658.8
659.4 -0.09
14.5
13.8
4.42
C3
596.7
13
597
2.42 584.9
-0.05
13.3
585
-0.02
13.2
13.1
0.68
C4
672.6
673.7
-0.15
13.5
14.5
7.70 659.2
660.2 -0.16
14.5
13.4
7.69
C5
693.4
-0.01
693.3
14.9
14.8
0.67
14.8
14.7
0.52
678.6
678.7
-0.01
C6
0.00
14.8
688.4
688.4
14.8
-0.05 673.7
14.7
673.8 -0.01
14.6
0.61
C7
624.5
624.7
-0.03
13.5
1.41
13.7
611
611.2 -0.03
13.7
13.5
1.30
C8
716.6 715.8
0.11
16
15.2
-4.99 700.6
699.9
0.11
15.1
15.9 -4.70
C9
703.9
703.8
0.02
15
15.2
-1.03
688.8
688.8
0.00
14.9
15
-0.11
CIO 737.7
737.2
0.08
15.6
16.1
-3.47 721.7
721.3
0.05
15.5
15.9 -2.45
CI1
617.2
616.6
0.09
14.2
13.6
-4.09 603.1
602.6
0.08
13.5
14
-3.60
705
704.9
0.03
C12
15.2
15
-1.21
689.9
689.7
0.03
15
15.2
-1.57
0.08
652.4
C13
652.9
14.7
-3.74 638.3
14.2
637.7
0.09
14.1
14.7 -3.93
C14
685.5
685.9
-0.06
14.7
2.67 671.3
14.3
671.5 -0.04
14.7
14.4
2.03
C15
709.8
710.2
-0.05 I 15.1
14.8
2.52
695.1
695.3
-0.03
15.1
14.9
1.30-
Core 193
EOC Mass
U235 Mass Loss
Predict MCODE % Error Predict MCODE % Error
734.9
735
-0.01 1 20.5
20.5
0.18
737.9 737.8
0.02
17.6
17.7
-0.98
813.2 813.9
-0.09
18.5
17.8
4.20
739.2 739.4
17.6
17.4
-0.03
1.22
813.2 813.7
-0.06
18
18.5
2.85
774.1
773
0.14
18
19.1
-5.84
735.9 735.2
0.09
17.5
18.2
-3.56
813.2 813.4
-0.03
18.5
18.3
1.33
774.9 774.1
0.11
18.9
18
-4.55
685.6 685.9
-0.03
14.9
1.52
14.7
14.2
645.2 645.8
-0.09
13.6
4.36
572
572.1
-0.01
13
12.9
0.35
646
646.9 -0.13
14.2
13.4
6.46
664.2 664.1
0.01
14.5
14.6
-0.47
659.4 659.6 -0.03
14.2
14.4
1.55
597.8
598
-0.04
13.4
13.2
1.66
685
14.9
684.6
0.06
15.3
-2.87
674.1
674.1
14.7
14.7
0.00
-0.10
706.1
706
0.02
15.2
15.3
-0.85
589.3
589
0.06
13.3
13.6
-2.42
675
674.9
0.00
14.7
14.7
-0.19
623.9 623.3
0.08
13.9
14.4
-3.65
657.1
657.5 -0.06
14.4
14
2.65
680.5 680.6 -0.02
14.8
14.7
0.75
Core 193
Core 192
Core 191
EOC Radial Peaking
EOC Radial Peaking BOC Radial Peaking
BOC Radial Peaking
EOC Radial Peaking
BOC Radial Peaking
Predict MCODE %Erroi Predict MCOD % Err] Predict MCOD % Error Predict MCODE % Error
Predict MCODE % Error I
4.0I
1.54
1.22
1.60
1.68
1.70
2.15
1.47
1.50
2.71
1.55
1.47
2.91
1.59
1.52
1.58
1.55
A2
1.60
4.75
1.26
1.32
2.11
1.36
1.27
1.39
6.01
4.10
1.34
1.40
1.35
1.25
7.99
1.35
1.41
3.00
1.37
BI
23.76
1.46
1.18
2.31
1.23
1.26
1.09
20.68
1.32
1.14
2.69
1.33
1.09
22.17
1.17
1.14
2.89
1.18
B2
7.81
1.42
1.32
1.33
-2.08
1.34
1.37
7.09
1.42
1.40
-1.81
4.39
1.37
1.42
1.36
1.41
-2.24
B4
1.38
-0.90
1.20
1.19
1.26
5.33
2.01
1.33
1.10
1.12
1.15
15.07
-2.47
1.33
1.13
1.15
10.31
1.20
B5
1.33
1.61
1.63
1.66
1.72
7.28
1.84
4.30
1.62
1.69
1.73
9.33
1.89
1.69
1.70
1.67
1.79
6.33
B6
1.91
1.29
3.29
1.34
1.36
3.85
1.42
1.32
2.50
1.35
3.12
1.43
1.39
1.34
0.83
1.36
1.44
1.45
-0.68
B7
3.18
1.20
-1.51
1.24
1.32
4.25
1.30
1.08
1.13
1.17
3.04
1.14
1.21
-0.52
1.14
-0.50
1.22
1.22
B8
3.80
1.60
1.66
4.87
1.84
1.76
1.63
3.67
10.12
1.69
1.89
1.71
1.70
3.05
1.65
8.42
1.76
B9
1.91
1.18
6.57
1.26
10.31
1.11
10.48 1.23
1.15
10.84
1.27
1.12
1.25
1.09
1.15
5.68
5.08
1.04
1.09
Cl
11.87
1.49
1.66
30.08
1.16
1.51
1.61
5.34
1.70
1.25
22.92
12.95
1.53
1.71
1.51
1.21
27.42
1.54
C2
1.73
1.60
1.63
-2.37
1.35
1.38
0.85
1.65
-5.70
1.66
1.46
1.38
1.42
17.20
19.42
1.67
1.38
1.16
C3
0.50
0.94
0.93
1.98
0.93
0.97
0.95
-0.31
0.97
0.92
5.59
1.84
0.97
0.96
7.33
0.98
0.91
C4
0.98
5.18
1.18
1.24
20.47
1.43
1.18
1.19
5.20
1.25
24.39
1.45
1.17
1.18
6.60
25.63
1.26
1.46
1.16
C5
13.50
1.85
1.63
-1.36
1.36
1.69
11.74 1.34
1.88
1.46
-6.23
1.71
1.37
10.78
1.41
-2.72
1.89
1.38
C6
1.41
9.60
1.55
34.04
1.42
1.06
1.47
8.01
1.58
27.71
1.13
1.45
1.44
10.95
1.59
1.11
30.50
1.45
C7
4.27
1.83
1.90
7.91
1.49
1.91
2.11
1.61
1.95
-0.08
1.65
1.84
6.48
1.64
1.96
1.60
3.62
1.66
C8
-1.35
1.76
1.74
14.85
1.36
-4.73 1.56
1.86
1.77
1.50
6.10
1.59
1.80
-0.89
1.41
13.24
1.79
1.60
C9
1.25
2.04
1.28
1.22
22.16
1.49
1.32
-1.87
1.30
1.28
19.16
1.52
1.36
-4.58
1.29
1.30
18.34
CI0O 1.53
1.96
1.68
1.71
-12.05
1.38
1.22
0.12
1.74
1.74
1.48
-16.16
1.24
1.74
0.82
1.75
-14.87
1.25
1.47
ClI
2.48
1.70
1.74
21.61
1.28
1.56
1.70
4.81
1.78
11.56
1.42
1.59
1.71
4.58
1.79
1.34
19.25
1.60
C12
1.35
1.73
1.76
1.90
1.44
4.15
1.46
1.72
1.79
-2.49
1.54
1.50
1.58
1.78
1.81
0.63
1.51
1.50
C13
-2.93
0.99
1.87
0.96
0.95
-2.84
0.97
1.03
0.72
1.00
0.98
0.99
-2.01
1.03
1.01
0.94
1.00
6.21
C14
1.18
6.04
1.25
28.63
1.13
1.45
7.67
1.27
1.18
1.48
28.42
C15
2909
9.69
1. 15
16
1
1.49
27
1
.8
11.I5
28.42
96
11
127
2 0
115
, 4
00
Core 191
A2
BI
B2
B4
B5
B6
B7
B8
B9
CI
C2
C3
C4
C5
C6
C7
C8
C9
CIO
C II
C12
C13
C14
C15
Core 192
BOC Axial Peaking
EOC Axial Peaking
BOC Axial Peaking
Predict MCODE % Error Predict MCOD % Erro Predict MCOD % Error
1.40
1.31
7.28
1.32
1.30
1.74 1 1.40
1.35
4.13
1.52
1.38
9.78
1.42
1.29
9.66
1.52
1.37
10.56
1.52
1.35
12.18
1.42
1.35
5.17
1.52
1.36
11.71
1.52
1.36
11.36
1.42
1.31
1.52
8.18
1.40
8.37
1.52
1.40
8.65
1.42
1.28
11.16
1.52
1.39
9.06
1.52
1.42
7.04
1.42
1.34
5.63
1.52
1.36
11.64
1.52
1.35
12.68
1.42
1.34
6.05
1.52
1.39
9.48
1.52
1.35
12.39
1.42
1.34
6.17
1.52
1.34
13.26
1.52
1.37
11.04
1.42
1.31
8.57
1.52
1.33
14.27
1.67
1.63
2.75
1.50
1.43
4.52
1.67
1.52
10.11
1.93
1.78
8.62
1.47
1.38
6.36
1.93
1.77
9.27
1.74
1.68
3.58
1.48
1.36
8.96
1.74
1.57
10.30
1.66
1.65
0.70
1.48
1.47
1.14
1.66
1.66
0.42
1.67
1.55
7.87
1.50
1.37
8.84
1.67
1.58
5.67
1.86
1.67
11.68
1.44
1.40
3.38
1.86
1.58
18.20
1.93
1.73
11.61
1.47
1.40
4.65
1.93
1.69
14.34
1.74
1.62
7.21
1.48
1.40
6.03
1.74
1.63
6.27
1.93
1.74
I 1.04
1.47
1.46
0.49
1.93
1.70
13.56
1.67
1.62
3.47
1.50
1.37
9.39
1.67
1.60
4.63
1.86
1.65
13.05
1.44
1.37
5.38
1.86
1.61
15.79
1.93
1.77
9.19
1.47
1.39
5.35
1.93
1.66
16.20
1.74
1.72
0.68
1.48
1.39
6.51
1.74
1.57
10.35
1.66
1.74
-4.58
1.48
1.39
6.72
1.66
1.60
4.28
1.64
1.67
2.13
1.50
1.49
0.60
1.67
1.60
4.75
Core 193
EOC Axial Peaking
BOC Axial Peaking
Predict MCOD 0%Err Predict MCOD 0%Error
1.32
1.32
0.37 1 1.40
1.36
3.27
1.42
1.32
7.57
1.52
1.34
13.08
1.42
1.30
8.85
1.52
1.39
9.15
1.42
1.36
4.39
1.52
1.37
10.38
1.42
1.37
3.75
1.52
1.36
11.86
1.42
1.29
9.79
1.52
1.37
10.54
1.42
1.30
9.16
1.52
1.35
12.18
1.42
1.32
7.33
1.52
1.46
3.68
1.42
1.31
7.83
1.52
13.71
1.33
1.50
1.35
10.51
1.67
1.61
3.87
1.47
1.43
2.93
1.93
1.76
10.11
1.48
1.38
7.33
1.74
1.67
4.24
1.48
1.36
8.86
1.66
1.67
-0.15
1.50
1.35
10.86
1.67
1.60
4.72
1.44
1.36 5.94 1.86
1.68
11.24
1.47
1.35
9.13
1.93
1.73
11.46
1.48
1.38
7.21
1.74
1.65
4.97
1.47
1.42
3.64
1.93
1.74
10.78
1.50
1.35
11.02 1.67
1.70
-1.50
1.44
1.41
2.14
1.86
1.74
7.36
1.47
1.34
9.92
1.93
1.78
8.35
1.48
1.36
8.69
1.74
1.58
9.92
1.48
1.36
9.21
1.66
1.65
0.89
1.50
1.37
9.14
1.67
1.62
3.47
EOC Axial Peaking
Predict MCODE % Error
1.32
1.32
0.58
1.42
1.32
7.73
1.42
1.32
7.63
1.42
1.29
9.52
1.42
1.36
4.54
1.42
1.35
5.02
1.42
1.33
6.91
1.42
1.36
4.07
1.42
1.36
4.17
1.50
12.89
1.33
1.47
6.06
1.38
1.48
1.49
-0.33
1.48
1.39
7.15
1.50
1.36
10.25
1.44
1.35
6.94
1.47
1.32
11.13
1.48
1.41
5.23
1.47
1.34
9.17
1.50
1.35
11.18
1.44
1.37
5.25
1.47
1.37
7.00
1.48
9.33
1.36
1.48
1.36
9.34
1.50
1.41
5.93
1.41
5.9 31
1.50
00
BOC
Predict
1.58
A2
B1
1.86
B2
1.86
B4
1.86
B5
1.86
B6
1.86
B7
1.86
B8
1.86
1.86
B9
CI
2.00
1.71
C2
1.97
C3
C4
1.90
C5
2.00
C6
1.98
C7
1.71
C8
1.97
1.71
C9
CIO
2.00
C 11 1.98
1.71
C12
C13
1.97
C14
1.90
C15
2.00
Core 193
Core 192
Core 191
EOC Lateral Peaking
BOC Lateral Peaking EOC Lateral Peaking BOC Lateral Peaking
Lateral Peaking
EOC Lateral Peaking
JMCODE% Error Predict MCODE% Err Predict MCODE% Error Predict MCOD % Errc PredictTMCODE% Error PredictMCODE % Error
27.24
1.29
1.26 30.42 1.58
1.30
21.59
1.64
27.69
1.58
1.32
19.67
1.64
1.27
23.64
1.64
1.28
1.37
35.34
1.75
1.48
18.14
22.10
1.75
1.46
19.65 1.86
1.52
29.30
1.75
1.49
17.64
1.86
1.44
1.75
1.46
20.19
1.37
35.74
35.07
1.75
1.34 30.57 1.86
1.86
1.38
19.53
1.35
37.79
1.75
1.47
1.31
33.21
1.39 25.83 1.86
1.41
31.82
1.75
1.37
27.72
1.86
1.39
33.90
1.75
1.45
28.54
1.75
1.75
1.26
38.60
1.86
1.38
34.49
1.75
1.26
38.68
1.37
35.49
1.75
1.32
33.13
1.86
1.36
37.24
33.75
1.29
44.60
1.75
1.31
1.86
1.24
49.57 1.75
1.24 40.92 1.86
1.24
50.48
1.75
1.21
44.27
19.91
1.75
1.46
1.86
1.43
30.32
1.75
1.46
20.18
24.23
1.50
21.05
1.86
1.45
24.41
1.75
1.50
1.75
1.37
28.09
1.35
37.68
33.93
1.75
1.32 32.41 1.86
32.20
1.86
1.39
1.39
33.78
1.75
1.32
1.24
41.33
1.29 36.23 1.86
1.28
45.66
1.75
39.39
1.86
1.30
43.18
1.75
1.21
53.63
1.75
1.26
1.53
30.28
1.87
1.57
19.33
1.58
26.41
1.87
1.60
16.97 2.00
36.73
1.87
1.51
23.57
2.00
1.46
20.66 00
26.90
1.62
1.35
1.34 20.98 1.71
1.34
1.37
24.94 1.62
1.62
1.33
22.00
1.71
1.32
29.58
00
22.80
33.39
1.95
1.58
1.47
1.59 22.33 1.97
1.51
29.87
1.95
1.95
1.53
26.76
1.97
1.52
29.73
27.79
1.85
1.62
13.98
1.49
23.59
1.85
1.45
27.52 1.90
1.85
1.50
23.29
1.90
1.54
1.63
16.95
1.45
29.31
1.56
28.41
1.87
1.87
1.50 24.57 2.00
23.27
2.00
1.61
23.99
21.43
1.87
1.52
1.65
1.32
41.49
1.53
29.47
1.87
1.87
1.41
32.82 1.98
1.98
1.48
34.09
1.87
1.45
28.78
1.58
25.34
27.85
1.62
1.28
26.56
34.60 1.71
1.33
1.29
32.00
1.62
1.21
1.28
27.12
1.71
1.23
38.88
1.62
1.50
29.99
1.53
28.37
1.95
1.95
1.60 21.85 1.97
25.21
1.97
1.59
23.38
26.17
1.95
1.55
1.56
1.31
24.01
1.26
35.74
1.62
29.42 1.71
1.25
35.19
1.62
28.66
1.71
1.26
1.62
1.26
1.37
24.88
1.87
1.56 20.07 2.00
1.51
32.08
1.87
1.53
22.33
1.48
34.62
1.87
1.62
15.34 2.00
1.52
31.14
1.35
38.18
1.49
32.51
1.87
1.87
1.41
32.66 1.98
30.44
1.98
1.49
33.18
38.60
1.87
1.43
1.43
28.75
1.62
1.26
33.91
1.27 27.58 1.71
1.27
1.36
25.42
1.62
1.62
1.29
26.05
1.71
1.27
34.72
1.52
29.58
1.95
1.55
25.88
1.51
30.19
1.95
1.58 23.09 1.97
20.97
1.95
1.57
23.90
1.97
1.63
1.85
1.47
25.45
1.48 24.73 1.90
1.50
26.88
1.56
18.42
1.90
1.55
23.14 1.85
1.45
30.93
1.85
1.53
30.97
1.87
1.60
17.22
2.00
1.52
31.03
1.87
1.54 21.35 2.00
1.54
29.94
1.87
1.53
22.20
2.0
2.0
to
CL
-d 1.5
hub"Ln-C
111f
TLO00
11
Z ht~d~I
1.5
oJ
w~
-i
ru
1.0
ru
1.0
0.5
0.5
<
CO
LO
CD CO U
000
00~
003(
U
U
N-4
U
rN
-
i Predicted n MCODE-FM
-
ca
Ln
0D
r-
M00
a-i
r4
z
w
U
pq
U
C
r4
r
-
:
w Predicted 0 MCODE-FM
(b)
(a)
2.0
2.0
oa 1.5
a) 1.5
S
Cu
-o
"O
0 1.0
Cu 1.0
X
05r
.
P
M M 0M
U
U
U
0 Predicted U MCODE-FM
C)
r(i
A2 B2 B5 B7 B9 C2 C4 C6 C8 C1OC12C14
a Predicted U MCODE-FM
Ni-:
A (3
(d)
(c)
2.0
1.9
bOo
.E 1.7
Cu
0)
a-
bO
2
1.5
1.3
1.1
0.9
0.7
0.5
w
V
1.5
c: 1.0
0
"
<
("
U(
M0 00
tM
mM
"
U
Predicted m MCODE-FM
R~ D
U
U
00
U
0
r-1
0 .5
N;t
iiiiIP
,, ,r
< Pi
r-1
U U U
M MCO D- U
w Predicted a MCODE-F
(e)
K*j
U
A
LD 00
U
C..
0D
N
r-f
U
r-1
0
T
rU
(f)
Figure 2-43 Individual Element Maximum Radial Peaking Factor Verification, (a) Core 191 BOC, (b) Core 191 EOC, (c)
Core 192 BOC, (d) Core 192 EOC, (e) Core 193 BOC, (f) Core 193 EOC
89
55
55
50
50
.2
:t
0
0-45
o E
U
-ug45
$ 40
40
M
35
-
30
L
30
o E
35
U U
-3.25
22
U
20
15
25
20
15
0
5
10 15 20 25 30 35 40 45
Days Operating
50
0
5
10
15 20 25 30 35 40 45 50
Days Operating
(b)
55
C
0
50
0
n
45
40
C
0
Li
Li
35
E
30
S25
20
15
0
5
10
15 20 25 30 35
Days Operating
40 45 50
(c)
Figure 2-44 Critical Control Blade Position Verification, (a) Core 191, (b) Core 192, (c) Core 193
Table 2-28 Critical Control Blade Position Verification
Critical Control Blade Position
Core
191
192
193
Predicted
21.70
26.69
26.12
BOC
MCODE-FM
26.60
30.05
27.41
% Error
-18.44
-11.18
-4.68
90
Predicted
42.53
47.52
46.96
EOC
MCODE-FM
44.99
51.80
49.50
% Error
-5.48
-8.26
-5.13
3
TRANSITION CORE ANALYSIS
The current plan for the HEU-to-LEU conversion of the MITR is to transition to an LEU-fueled
core by introducing the elements into the HEU-fueled reactor over a series of refueling. HEU
elements will be incrementally replaced with LEU, until the core is fully converted. In'support of
this approach, a series of transition core loading schemes were simulated. From this, it is possible to
begin collecting information on the general behavioral trends of the mixed HEU-LEU cores, and to
evaluate the effectiveness of different possible transitional loading schemes. Because the transition
cores will contain a mixture of HEU and LEU fuel, the LEU-based correlations discussed in Section
2 are not applicable. It is not useful to pursue developing unique correlations for the mixed fuel
cores, since they will only be employed in the one-time transition. The best approach for the
transition core analysis is therefore to simulate potential fuel schemes directly with MCODE-FM.
A selection of the modeled transition core shuffling schemes are discussed here to provide an
overview of the general behavior of the mixed fuel cores. The full loading patterns for the transition
cores discussed can be found in Appendix B. The general properties of the different cases are
summarized in Table 3-1. These cases are representative of the general evolution of the transition
core analysis. The transition core runs are built from the final core of the HEU equilibrium
run,
Core 190. One additional HEU core is simulated, and LEU elements are first introduced in Core
192.
The power peaking definitions were modified slightly for analysis of the mixed fuel cores. Peaking
in a plate is defined for a given fuel type based upon the number of plates in that fuel type, and axial
peaking is defined in terms of the axial power distribution in a lateral stripe of a plate rather than in
the entire plate. These unique definitions are used for the transition cores at the request of the MITR
thermal-hydraulics team. In summary, for this analysis, the power peaking factors are defined as:
c mi,
e
Power in a Plate
Radial Peaking Factor,LEU =
rCore Power
1
e
Radial Peaking Factor,HEU
(5)
24*18
Po= r inea Plate
(6)
24*15
e
Axial Peaking Factor =
*
Lateral Peaking Factor
Power in an Axial segment of aLateralStripe of aPlate
Average Axial Section Power in Stripe of that Plate
Power in a Stripe of an AxialSegment of aPlate
Average Stripe Power in that Axial Segment of that Plate
91
(7)
(8)
The key performance parameters of the select transition core schemes are summarized in Table 3-2
to Table 3-5. The first case employs a loading pattern that follows a similar approach to refueling as
the equilibrium cores, with three fresh elements introduced every other core. The results of this run,
and other similar cases, found that the significantly larger mass of the LEU causes a great deal more
power to be concentrated in the LEU elements. This becomes more pronounced in the later
transition cores, when the HEU elements are very depleted. Future runs attempted to mitigate this
by utilizing the heaviest mass HEU elements available from storage. Later runs also implemented
the orientation behavioral trends discussed previously, such as reducing radial peaking by flipping
fresh fuel when placing it in locations B6 and B9, to achieve a perpendicular plate orientation. In
addition, the low EOC control blade positions of the early runs imply that the full burnup potential
of the cores is not being reached.
Later schemes examined the impact of introducing larger amounts of LEU much more quickly. In
Case 2, the reactor is converted in three cores, by repeatedly filling the B-ring with fresh LEU and
then shifting the LEU to the A- and C- rings. This type of loading pattern is not realistic for
conversion, since it is not desirable to insert that many fresh LEU elements the very first time the
fuel is ever used in the MITR, but the case was considered interesting for evaluation purposes.
While this approach does smooth radial peaking, it also creates so much excess reactivity that the
control blades begin lower than the generally desired range.
In the rest of the evaluated transition core loading patterns, the reactor is converted by introducing 3
fresh LEU elements in Core 192, 5 in 193, and 8 in 194 and 195. This approach was examined with
multiple burnup schemes. Three cases are represented here, which have minor differences in their
loading patterns. In the later runs, a lateral mesh was introduced so that lateral power peaking could
be examined as well. To build the run, the final seven cores of the HEU equilibrium run were re-run
with a lateral mesh. This was done to ensure an accurate material distribution in the mixed-core
HEU elements. For this refueling approach, the best performance in terms of radial peaking was
achieved when the cores were allowed to go to a higher burnup.
From the evaluation of these cases, some general recommendations can be made regarding future
transition core analysis. Because of the significant mass differences between HEU and LEU fuel,
the transition cores should employ the heaviest available HEU elements, particularly in locations
next to an LEU element, to minimize power peaking. A more expansive set of cases should be run
with varying numbers of fresh LEU elements per core, to better establish an appropriate number to
introduce at a time. Inserting more fresh LEU elements at once was shown to help in smoothing
power peaking. However, this also may create too much excess reactivity. The cases with a slower
introduction of LEU elements were run before behaviors such as the relationship between plate
peaking and plate orientation had been fully identified, so these cores may not be the best loading
pattern for this approach. There may be the potential to convert with a slow introduction of LEU by
identifying a better fuel shuffling scheme. The cases which were run for multiple burnups
92
demonstrated some improvement in power peaking when the cores were run to a higher bumup. In
particular, it is helpful to achieve a high burnup in the earliest transition cores, before shifting the
LEU elements to the C-ring. The LEU demonstrated the ability to reach a burnup of 15,000 MWh
per core without running out of reactivity.
Table 3-1 Summary of the Transition Core Cases Discussed
Case
Shuffling Scheme
Case I
3 Fresh LEU Elements Introduced
to the B-Ring Every Other Core
Case 2
8 Fresh LEU Elements Introduced
to the B-Ring Each Core
Case 3**
3 Fresh LEU Introduced in Core
192, 5 in 193, 8 in 194, and 8 in
195
Details of the Run(s)
6 Radial/ 8 Axial/ 4 Lateral
Depletion Mesh
Cores 192 to 195 Burnups in
range of 3000-6300 MWh, Cores
196-201 Burned to 5000 MWh
6 Radial/ 8 Axial/ 4 Lateral
Depletion Mesh
10,000 MWh Burnup
6 Radial/ 8 Axial / 4 Lateral
Depletion Mesh
10,000 MWh Burnup
6 Radial/
8 Axial /
I Lateral
Case 4**
3 Fresh LEU Introduced in Core
192, 5 in 193, 8 in 194, and 8 in
195
*
10,000 MWh
15,000 MWh
Depletion Mesh
20,00 MWh
6 Radial/
8 Axial!/
4 Lateral
Depletion Mesh
10,000 MWh
10,000 MWh
Case 5**
3 Fresh LEU Introduced in Core
192, 5 in 193, 8 in 194, and 8 in
195
6 Radial!
8 Axial /
4 Lateral
Depletion Mesh
15,000 MWh
20,000 MWh
for Core 192,
15,000 MWh
for all other
Cores
* Depletion mesh option and Individual Core Burnup
** Cases 3 through 5 have the same refueling approach, but unique shuffling patterns, as documented in Appendix B.
93
Table 3-2 Key Performance Parameters For Transition Cores Case I
Maximum
Power Peaking
Core
192 BOC
EOC
193 BOC
EOC
194 BOC
EOC
195 BOC
EOC
196 BOC
EOC
197 BOC
EOC
198 BOC
EOC
199 BOC
EOC
200 BOC
EOC
201 BOC
EOC
Axial
1.86
1.48
1.88
1.52
1.83
1.53
1.86
1.56
1.86
1.52
1.86
1.49
1.93
1.63
1.95
1.62
2.02
1.67
2.05
1.84
Radial
2.24
2.14
2.17
2.03
2.00
1.96
1.99
1.91
1.89
1.81
1.90
1.78
1.82
1.87
1.77
1.76
1.79
1.70
1.75
1.68
Lateral
-
Critical
Blade
(cm)
22.50
37.07
22.00
33.62
24.41
34.74
23.26
33.93
22.80
34.92
22.25
34.48
19.95
30.53
18.74
29.04
17.14
27.68
16.61
25.86
Table 3-3 Key Performance Parameters for Transition Cores Case 2
Maximum
Power Peaking
Core
Axial
192 BOC 2.04
EOC 1.53
193 BOC 2.18
EOC 1.67
194 BOC 2.42
EOC 1.76
Radial
1.75
1.65
1.70
1.79
1.81
1.67
94
Lateral
-
Critical
Blade
(cm)
16.63
32.14
13.83
28.11
12.10
25.49
Table 3-4 Key Performance Parameters for Transition Core cases with 10,000 MWh burnup per core
(a) Case 3, (b) Case 4 with I Lateral Zone Mesh, (c) Case 4 with 4 Lateral Zone Mesh, (d) Case 5 with 4 Lateral Zone Mesh
(b)
(a)
Maximum
Power Peaking
Core
Axial Radial Lateral
192 BOC 1.98
1.80
EOC 1.44
1.72
193 BOC 1.92
1.73
EOC 1.42
2.06
194 BOC 2.12
1.66
EOC 1.62
1.80
195 BOC 2.32
1.72
1.58
EOC 1.73
Critical
Blade
(cm)
18.88
35.89
19.54
36.50
16.32
30.98
12.44
25.85
Core
Maximum
Critical
Power Peaking
Blade
Axial Radial Lateral
(cm)
192 BOC
1.97
1.83
-
EOC
193 BOC
1.53
2.03
1.49
1.73
-
18.61
35.45
1.76
1.63
-
19.05
34.28
2.17
1.63
-
16.11
EOC
195 BOC
1.58
2.28
1.83
1.75
-
31.76
12.67
EOC
1.73
1.59
-
26.22
EOC
194 BOC
(c)
Maximum
Power Peaking
Core
Axial Radial Lateral
1.60
1.88
192 BOC 2.05
1.53
1.75
EOC 1.62
1.62
1.82
193 BOC 2.25
1.64
1.65
EOC 1.65
1.72
1.64
194 BOC 2.23
1.82
1.83
EOC 1.74
1.59
1.74
195 BOC 2.46
1.73
1.57
EOC 1.87
(d)
Critical
Blade
(cm)
18.70
34.45
18.71
34.20
16.57
31.31
12.62
25.76
Core
192 BOC
EOC
193 BOC
EOC
194 BOC
EOC
195 BOC
EOC
95
Maximum
Critical
Power Peaking
Blade
Axial Radial Lateral
(cm)
1.98
1.60
1.93
1.64
2.00
1.66
2.16
1.73
1.84
1.78
1.89
1.81
1.66
1.53
1.74
1.62
1.57
1.70
1.65
1.59
1.81
1.70
1.84
1.76
19.06
35.28
19.22
34.99
16.86
32.97
13.54
27.57
Table 3-5 Key Performance Parameters for Transition Core Cases at Higher Burnups (a) Case 4 at 15,000 MWh per core, I
Lateral Zone Mesh, (b) Case 4 at 20,000 MWh per core, I Lateral Zone Mesh, (c) Case 5 at 15,000 MWh per core, 4 Lateral
Zone Mesh, (d) Case 5 at 20,000 MWh for Core 192 and 15,000 MWh for all other Cores, 4 Lateral Zone Mesh
(b)
(a)
Core
192 BOC
EOC
193 BOC
EOC
194 BOC
EOC
195 BOC
EOC
Maximum
Power Peaking
Critical
Blade
Axial Radial Lateral
1.97
1.83
1.40
1.72
1.89
1.74
1.62
1.37
1.70
2.01
1.91
1.48
2.16
1.65
1.63
1.62
(cm)
18.61
38.37
20.25
42.20
19.09
37.98
15.34
30.46
(c)
Maximum
Power Peaking
Axial Radial Lateral
Core
1.57
192 BOC 1.98
1.84
1.56
1.73
EOC 1.57
1.95
1.62
193 BOC 1.91
1.80
1.68
EOC 1.55
1.69
1.66
194 BOC 1.98
1.64
EOC 1.54 1.52
1.69
1.66
195 BOC 2.15
EOC 1.70
1.66
1.69
Core
192
193
194
195
Maximum
Critica
I
Power Peaking
Blade
Axial
Radial Lateral
(cm)
BOC
1.97
1.83
-
18.61
EOC
1.34
1.69
-
41.92
BOC
1.87
1.74
-
22.38
EOC
1.28
1.63
-
51.60
BOC
Did not have sufficient
EOC
reactivity
BOC
to maintain criticality
EOC
-
Run Crashed
(d)
Critical
Blade
(cm)
19.06
38.92
20.83
41.31
19.32
39.12
15.43
32.25
Core
192
193
194
195
96
BOC
EOC
BOC
EOC
BOC
EOC
BOC
EOC
Maximum
Critical
Power Peaking
Blade
Axial
1.98
1.45
1.87
1.47
1.89
1.49
2.04
1.70
Radial Lateral
1.84
1.71
1.91
1.81
1.64
1.58
1.65
1.72
1.57
1.60
1.68
1.60
1.76
1.63
1.68
1.62
(cm)
19.06
42.39
23.03
47.03
20.03
40.10
15.47
32.75
4
CONCLUSIONS
A core design optimization tool has been developed which allows for very fast assessment of LEU
fuel shuffling. This tool identifies a core loading pattern that can achieve a target burnup with the
fewest number of loading pattern changes, while maintaining a maximum radial peaking factor that
is below the maximum allowed value. Using correlations developed from simulated LEU cores
operating in equilibrium, the optimization tool predicts both the BOC and EOC power distribution,
as well as element U2 3 5 loss and critical control blade positioning.
While operators are very familiar with the most appropriate ways to refuel HEU cores, there is not
the same breadth of knowledge regarding LEU. The use of the core design optimization tool is
intended to help avoid wasting time with lengthy simulations of unfavorable loading patterns. In
addition, the interactive spreadsheet format of the output allows a user to quickly assess
perturbations on a given core.
Verification analysis has demonstrated that the tool is capable of adapting its solution to account for
user-specified constraints. In addition, the correlation-predicted parameters have been evaluated
with MCODE-FM results. The axial and lateral peaking values are being largely over-predicted in
the output, where the parameters are reported as the average plus three standard deviations of the
values in the correlation development data set. The code has much better accuracy in predicting
control blade motion, radial peaking, and EOC element masses. This is important since these are the
parameters considered in the search for an optimal solution.
The examination of the equilibrium cores has established general LEU core behavioral trends. It is
hoped that this data may serve as reference and guidance in future analysis of LEU-fueled MITR
cores, and that in conjunction with the transition core analysis, it may aid in the design of the actual
transition cores that will be loaded in the conversion.
97
5
FUTURE WORK
This project has a great deal of room for expansion. It is always possible to develop more refined
correlations by incorporating additional data sets. One of the most important areas that should be
examined next is the impact that neighboring elements have on an element's power peaking.
Analysis has shown that significant mass differences in elements near one another, as well as high
concentrations of U235 in one area, can enhance power peaking, and these should be incorporated
into the optimization search.
In terms of the correlations, there is room for refinement in the prediction of axial and lateral
peaking. Either a method needs to be identified which can better utilize the known mass distribution
to predict the power distribution within a plate, or a more advanced modeling technique must be
introduced. This type of analysis is very complex, since even within a plate of an element, the
power distribution is strongly affected by the properties of the surrounding elements.
Analysis should be done to accommodate additional cases, such as fueling the traditionally unfueled
locations Al, A3, and B3. A method should also be developed to accommodate the impact that
experiments may have on power peaking in addition to reactivity. In addition, because the reactor is
not yet converted, it would be useful to also incorporate HEU-based correlations into the tool.
Although there is not as significant a need for core design tools for the well-understood HEU fuel, it
would still be useful for the reactor team to have an HEU-compatible optimization tool for quick
analysis.
The optimization tool makes the bulk of its decisions by utilizing fixed rules regarding element
masses and shuffling. Improvement in the solution may be found if this rule set is enhanced with
additional logic. This could be accomplished by identifying other consistent trends in LEU core
behavior. In support of this, it would be useful to simulate additional LEU cores for a wider range
of powers, bumups, and initial core masses and mass distributions. The fuel shuffling logic could
also be expanded with additional user input constraints. For example, it would be useful to add the
ability to distinguish between elements that must be kept in the core and elements that must be kept
in their current location. A more complex approach could also be applied to handle element bumup.
Currently, built-in burnup limits are applied by targeting for removal the elements which fall below
specified mass limits. The burnup limits could also be transitioned into a flexible, user-specified
constraint.
The flexibility of the tool itself could also be enhanced if the code is given the ability to start a
search from any time-step in a run. In this way a user is not constrained if they do not have an
existing MCODE-FM run with the current MITR core as the EOC core in the run. In addition, the
capability could be added to the GUI to load stored elements from multiple runs.
98
To summarize, the keys areas that are recommended for future analysis and development in support
of the optimization tool are:
e
Improved models for power distribution within a fuel plate
*
The impact of neighboring elements on an element's power profile
e
Core behavior for cases that do not have dummies in Al, A3, and B3
*
Correlations for HEU cores
"
Improved loading pattern search methods and additional user-specified parameters, such as
the distinction between 'keep in core' and 'keep in current location' for in-core elements
*
Additional built-in and user-specified fuel shuffling constraints, including improved burnup
limits
"
Increased flexibility in reading a previous core, including the ability to start a search from a
core that is not the final core in a run, and the ability to use stored elements from multiple
old MCODE-FM runs
"
Accounting for the reactivity impact of experiments - the existing code has the capability to
incorporate experiment reactivity worth, but further analysis and verification should be done
with known experimental data
In addition to the optimization tool-focused work, analysis of LEU-fueled core behavior should be
ongoing in support of the MITR conversion. A select set of cores have been evaluated for the
transition core and equilibrium core runs, but a wider range of cases should be examined to develop
an even more robust understanding of LEU behavior. For example, the control blade positions of
the LEU equilibrium cores were roughly 25 to 30 cm at BOC, and 40 to 50 cm at EOC. This
implies that equilibrium could be achieved for a longer cycle length (than 47 days) by developing a
shuffling pattern that establishes cores with larger initial U2 35 masses (and lower initial control
blade positions).
99
REFERENCES
[1]
Newton, Thomas H. Jr. Development of a Low Enrichment Uranium Corefor the MIT
Reactor. Massachusetts Institute of Technology. 2006.
[2]
Wilson, E.H, N.E. Horelik, F.E. Dunn, T.H. Newton, Jr., L. Hu, and J. G. Stevens. Power
Distributionsin Fresh and Depleted LEU and HEU Cores of the MITR Reactor,Revision
0. Argonne National Laboratory, ANL/RERTR/TM-12-3, Revision 0. February 22, 2010.
131
Turinsky, Paul J., et al. Evolution of Nuclear FuelManagement and Reactor Operational
Tools. Nuclear Engineering and Technology, Vol. 37, No. 1. 2005.
[41
The International Atomic Energy Agency. Research Reactors in the World - MITR-II
[online]. http://nucleus.iaea.org/RRDB/RR/HeaderInfo.aspx?RId=457. Accessed July 27,
2012.
151
Hu, Lin-wen and Gordon Kohse. MITR Users' Guide. 2008.
161
Romano, Paul K. Developing Fuel Management Capabilities Based on Coupled Monte
Carlo Depletion In Support of the MIT Research Reactor (MITR) Conversion.
Massachusetts Institute of Technology. 2009.
171
MITR Staff. MIT Reactor MITR-2 Fuel Element Assembly. Cambridge, MA. Drawing
R3F-201-4. 1996.
181
Romano, Paul K. and Benoit Forget. Development of a GraphicalUser InterfaceforInCore Fuel Management Using MCODE. American Nuclear Society, Topical Meeting
Advances in Nuclear Fuel Management IV. 2009.
191
Horelik, Nick. Expandingand Optimizing Fuel Management and DataAnalysis
Capabilitiesof MCODE-FMin Support of MIT Research Reactor (MITR-II) LEU
Conversion. Massachusetts Institute of Technology. 2012.
1101 Olson, Arne. A Users' Guide for the REBUS-PC Code, Version 1.4. RERTR Program,
Argonne National Laboratory. 2001.
100
[111 Nuclear Energy Agency. REBUS-PC 1.4, Code Systemfor Analysis of Research Reactor
Fuel Cycles. http://www.oecd-nea.org/tools/abstract/detail/ccc-0708. Accessed April 17,
2011.
1121 Deen, J. R., et al. WIMS-ANL User Manual: Rev. 6. Argonne National Laboratory. 2004.
1131 Xu, et. al. MCODE, Version 2.2 - An MCNP-ORIGEN Depletion Program. Center for
Advanced Nuclear Energy Systems. Massachusetts Institute of Technology. 2006.
[141 Turinsky, Paul J. Nuclear FuelManagement Optimization: A Work in Progress. Nuclear
Techology, Vol. 151. 2005.
[151 Bihn Do, Quang, et al. An Evolutionary Optimization of the Refueling Simulation for a
CANDU Reactor. IEEE Transactions on Nuclear Science, Vol. 53, No. 5. 2006.
[161 Van Geemert, et al. Research Reactor In-Core Fuel Management Optimization by
Application of Multiple Cyclic Interchange Algorithms. Nuclear Engineering and Design,
Vol. 186, pg 369-377. 1998.
101
APPENDIX A - OPTIMIZATION TOOL SOURCE CODE
A.1 gui/OptimizerGuiDialog.py
#/us r/bCin/env pvt hon
import os
from math import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import fileIO
import uuid
class OptimizerPanel(QDialog):
in storage elements=[]
in core elements=[]
keep in core=[]
use from stor=[]
def
ini.
(self, parent=None):
super(OptimizerPanel, self).
init
(parent)
op tions
# build g.ui d
self.
loadpreviousButton = QPushBut ton (":-
I
okButton = QDialogButtonBox(QDialogButtonBox.Ok)
self.runButton = QPushButton("'
. ..
= QPushButton(" self.force in
self.force
use = QPushButton ("
self.remove force in = QPushButton("
self.remove force use = QPushButton(
self.forcenewCheckbox = QCheckBox("
n:
newLabel = QLabel(":
self.newLineEdit = QLineEdit()
self.newLineEdit.setAlignment(Qt.AlignHCenter)
self .newLineEdit . setText ( **)
newLayout=QHBoxLayout()
newLayout.addWidget(self.forcenewCheckbox)
newLayout.addWidget(newLabel)
newLayout.addWidget(self.newLineEdit)
shuffleLabel = QLabel("
self.shuffleLineEdit=QLineEdit()
self.shuffleLineEdit.setAlignment(Qt.AlignHCenter)
self.shuffleLineEdit . setText ( ')
102
newLayout.addWidget(shuffleLabel)
newLayout.addWidget(self.shuffleLineEdit)
buttonLayout =
QGridLayouto
buttonLayout.addWidget(self.loadpreviousButton,0,0)
buttonLayout.addWidget(self.runButton,3,O)
buttonLayout.addWidget(self.force-inl,(,)
buttonLayout.addWidget(self.remove force in,1,1)
buttonLayout-addWidget(self.remove-force use,2,I)
buttonLayout.addWidget(self.force-use,2,O)
doneLayout=QGridLayouto
doneLayout-addWidget(okButton,1,0)
nameLabel = QLabel("C;..,--'-:--;-0 F - L L
self.nameLineEdit = QLineEdito
self.nameLineEdit-setAlignment(Qt.AlignHCenter)
self
. nameLineEdit. setText
nameLayout = QHBoxLayouto
nameLayout-addWidget(nameLabel)
nameLayout-addWidget(self.nameLineEdit)
powerLabel = QLabel(
self-powerLineEdit=QLineEdito
self.powerLineEdit.setAlignment(Qt.AlignHCenter)
self.powerLineEdit.setText(''.*."-:')
powerLayout=QHBoxLayouto
powerLayout.addWidget(powerLabel)
powerLayout.addWidget(self.powerLineEdit)
dayLabel = QLabel(
self.dayLineEdit=QLineEdito
self.dayLineEdit-setAlignment(Qt.AlignHCenter)
self.dayLineEdit-setText(':'-*-:.-;')
powerLayout-addWidget(dayLabel)
powerLayout-addWidget(self.dayLineEdit)
peakLabel
self.peakLineEdit=QLineEdito
self.peakLineEdit.setAlignment(Qt.AlignHCenter)
self.peakLineEdit.setText(';."')
peakLayout=QHBoxLayouto
peakLayout.addWidget(peakLabel)
peakLayout.addWidget(self.peakLineEdit)
reactivityLabel
= QLabel("-,
self.reactivityLineEdit=QLineEdito
self.reactivityLineEdit-setAlignment(Qt.AlignHCenter)
self.reactivityLineEdit.setText(''-...'-11)
peakLayout.addWidget(reactivityLabel)
peakLayout-addWidget(self.reactivityLineEdit)
EOC bladeLabel = QLabel(".,' :,",
self.EOCblade Edit=QLineEdito
self.EOCblade-Edit.setAlignment(Qt.AlignHCenter)
103
self.EOCblade Edit.setText('4 ".,,''
bladeLayout=QGridLayouto
bladeLayout.addWidget(EOC bladeLabel,0,0)
bladeLayout.addWidget(self.EOCblade-Edit,",I)
BOC
=
bladeLabel
QLabel C, I., S-, C.--c,
self.BOC bladeEdit=QLineEdito
self.BOC bladeEdit.setAlignment(Qt.AlignHCenter)
self-BOC bladeEdit-setText(''<'-.-i."-l')
bladeLayout.addWidget(BOC bladeLabel,1,0)
bladeLayout.addWidget(self.BOC-bladeEditl.,I.)
r in
s .
mBOC bladeLabel
--r7
-,.-!
self.mBOC bladeEdit=QLineEdito
self.mBOC bladeEdit.setAlignment(Qt.AlignHCenter)
self.mBOC bladeEdit.setText( .-.f )
bladeLayout.addWidget(mBOC bladeLabel,2,O)
bladeLayout.addWidget(self.mBOC-bladeEdit,2,1)
self.inelementsTree = QTreeWidgeto
self.inelementsTree.setColumnCount(l)
self.inelementsTree.setHeaderLabels(["'*'l j"-;
self.inelementsTree.setSelectionMode(
QAbstractltemView.ExtendedSelection)
self.storelementsTree = QTreeWidgeto
self.storelementsTree-setColumnCount(i)
self.storelementsTree.setHeaderLabels([" -i':-l,--.:self-storelementsTree.setSelectionMode(
QAbstractItemView.ExtendedSelection)
self.forceinelementsTree = QTreeWidgeto
self.forceinelementsTree.setColumnCount('L)
self.forceinelementsTree.setHeaderLabels([", :-r...,:,..,
self.forceinelementsTree-setSelectionMode(
QAbstractltemView.ExtendedSelection)
self.forcestorelementsTree = QTreeWidgeto
self.forcestorelementsTree.setColumnCount(l.)
self.forcestorelementsTree.setHeaderLabels(["':, .f.I
self.forcestorelementsTree.setSelectionMode(
QAbstractltemView.ExtendedSelection)
sideLayout = QGridLa yout
sideLayout.addLayout (nameLayout,
sideLayout.addLayout (powerLayoutIL)
sideLayout.addLayout (newLayout,5,-)
sideLayout.addLayout (peakLayout ,
sideLayout.addLayout (bladeLayout,,I
rea
layout
QGridLayouto
layout.addLayout(sideLayoutr',,,",-)
layout.addWidget(self.inelementsTree,.';,-I )
layout.addLayout(buttonLayout,',, ,)
layout.addWidget(self.storelementsTree,0,;-)
I I
layout.addWidget(self.forceinelementsTree,',!.)
104
layout.addWidget(self.forcestorelementsTree,1,Z)
layout.addLayout(doneLayout, 3 ,0)
self.setLayout(layout)
# Create
self.connect
signals
(self.loadpreviousButton, SIGNAL (":
ke)
")-,
self.loadprevious)
self. connect (okButton, SIGNALcc
(''")
self .accept)
self. connect (okButton, SIGNAL (
c
()
self .accept)
self.connect (self.runButton,
SIGNAL("click ,
"' self.runoptimization)
self.connect (self.force
in,
SIGNAL("clike
()"),self.forcestayin)
self. connect (self.force use, SIGNAL("c
) ,self.forceuse)
self.connect (self.remove force in,
SIGNAL("c ic
"),self.delete
1e
force in)
self.connect(self.remove
force use,SIGNAL("l
:),self.delete force use)
rpimizaion(self)
def
do run=True
must use new=False
num fresh elements=int(self.newLineEdit.text()
output file name=str(self.nameLineEdit.text()
core power=float(self.powerLineEdit.text()
cycle length=float(self.dayLineEdit.text()
rad peakinglimit=float(self.peakLineEdit.text()
experiment worth=float(self.reactivityLineEdit.text()
max BOC blade=float(self.BOCbladeEdit.text()
min BOC blade=float(self.mBOC bladeEdit.text()
maxEOC blade=float(self.EOCblade Edit.text())
max shuffles=int(self.shuffleLineEdit.text()
if self.forcenewCheckbox.isChecked():
must use new=True
elements to use=map(str,self.use from stor)
elementsto keep_n=map(str,self.keep in core)
elementsto keep=[]
for item in elements to keep n:
item=str(item)
item=item.split()
item=item[1]
elements to keep.append(item)
#
checkiptvrabe
c K
Zper
Y-1
--
o
ro
.:K'--
if cycle length<=,:
do run=False
QMessageBox.information(self,"
","
105
if len(self.in coreelements)==0:
do run=False
QMessageBox.information(self,"eturn
np
if min BOC blade>max BOC blade:
do run=False
QMessageBox.information(self, "turn
p
o"E
",
"ro
if max BOC blade>max EOC blade:
do run=False
QMessageBox. information (self,
if do run:
#oes result directory
aleady exist
import os
current dir=os.getcwd()
dir name=output file name
results dir=os.path.join(current dir,dir name)
if os.path.isdir(results dir):
reply = QMessageBox.question (self,
r,
QMessageBox.Yes
I
QMessageBox.No)
if reply == QMessageBox.No:
do run=False
else:
pass
if do-run:
print("
import utils.LEU core optimization
done=False
done=utils.LEU core optimization.main(self.exportfilename,output file name,nu
m fresh elements,core power,cycle length,rad peaking limit,experiment worth,m
ax BOC blade,min BOC blade,max EOC blade,must use new,elements to keep,elemen
ts to use,max shuffles)
if done:
QMessageBox.information(self, "
else:
QMessageBox.information(self,
,
106
self)
def pouaelmns
# Create item for each element
self.inelementsTree.clear()
self.storelementsTree.clear()
for element in self.in core elements:
item = QTreeWidgetItem(self.inelementsTree, [element])
for element in self.in storageelements:
item
QTreeWidgetItem(self.storelementsTree,
[element])
def ppleJ
ree
(self):
self.forceinelementsTree.clear()
self.forcestorelementsTree.clear()
for element in self.keepincore:
item=QTreeWidgetItem(self.forceinelementsTree,[element])
for element in self.use from stor:
item=QTreeWidgetItem(self.forcestorelementsTree,[element])
def Ic
:'(self):
element = self.currentcoreElement()
if element is not None:
self.keep in core.append(element)
self.populateForceFuel()
def
def
def
rce s- (self):
element = self.currentstorElement()
if element is not None:
self.use from stor.append(element)
self.populateForceFuel()
let-,
orce n(self):
element=self.currentforceinElement()
if element is not None:
self.keep in core.remove(element)
self.populateForceFuel()
elt
force
(self):
element=self.currentforcestorElement()
if element is not None:
self.use from stor.remove(element)
self.populateForceFuel()
def c
ament (self)
item=self.inelementsTree.currentItem()
if item is None:
return item
else:
item=item.text(")
107
return item
def
3 lem
(self)
item=self.storelementsTree.currentItem()
if item is None:
return item
else:
item=item.text(0)
return item
def
r(self):
item=self.forceinelementsTree.currentItem()
if item is None:
return item
else:
item=item.text (H)
return item
def c r
T
'orcestrem
(self) :
item=self.forcestorelementsTree.currentItem()
if item is None:
return item
else:
item=item.text (C)
return item
-------------------------------------------------------------------def
(self):
QMessageBox. information (self,
"
e
-.
self.exportfilename = str(QFileDialog.getOpenFileName(
self,
"
if not self.exportfilename:
return
- -- - -
- --
-------
----
--- --
-
-
-L
a
i
a
runDir = os.path.dirname(self.exportfilename)
runDir=os.path.abspath(runDir)
self.in core elements=[]
self.in storage elements=[]
108
o e E e
e t
D t
self.keep in core=[]
self.usefrom stor=[]
with open(self.exportfilename,'r')
as exportfile:
# Determine number of cycles in export
timesteps=exportfile.readlines()[2]
timesteps=len(timesteps.split())-1
file
#t Getfil
core loading pattern
exportfile.seek(O)
# return to beginning of
(from time
data)
file
line=exportfile.readline()
while line !='':
item=str(line).split()
if len(item) == 0:
line = exportfile.readline()
continue
if item[0]t1
elementpath=item
lastlocation=elementpath[len(elementpath)- 1] # location of
the element in the core (or in storage) for the final
timestep
tmpwords=exportfile.readline().split()
if tmpwords ["I== ' 'i
e se ' :
universe=eval(tmpwords[1])
exportfile.readline()
# read "element" line
else:
universe=-#read line
wlas "element" line
starttime = eval(exportfile.readline().split()[1])
final cycle=int(starttime)+len(elementpath)-1
# re
srienttations
etae
flipline=exportfile.readline().split()
rotateline=exportfile-readline().split()
# e
ate name
exportfile.readline()
name=exportfile.readline().split()[2]
if universe
=-l: # nly consiler fuel
if lastlocation !=
if finalcycle==timesteps: #iplie
is
in
the f"i naI t ime-S t ep
location string = lastlocation +
tc
tC're the
me
o
the
core
"
thi
+ name
self.in coreelements.append(locationstring) 4
le-ment that is in each lc
n
io
line=exportfile.readline()
self.in
tt
elements.sort()
109
Load Stored Element
-----------------------------
storage
Data-'--
file=os.path.join(runDir,os.path.join("sorgema:,"o'en
try:
with open(storage file,"r") as fh:
lines = fh.readlines()
if len(lines) == 0:
pass
else:
for i, line in enumerate(lines):
if i%3 ==
0:
self.in storage elements.append(line.stripo)
except:
pass
self.populateElements()
self.populateForceFuel()
A.2 utils/LEUcore optimization.py
h
i /n
#I !
optimized core.py
determines the
import
import
import
import
sys
os
get
opt
optimized loading pattern to meet a desired cycle length
current core
subs
import shuffle subs
from time import strftime, localtime
def
* (export file,output file,number fresh,power,days,radPK,worth,maxBOCblad
e,min BOC blade,max EOC blade,must use new,force keep,use from storage,max sh
uffles):
success=True
current dir=os.getcwd()
dir name=output file
results dir=os.path.join(current dir,dir name)
if not os.path.isdir(results dir):
110
os.makedirs(results dir)
else:
for file
in os.listdir(resultsdir):
file path=os.path.join(results dir,file )
try:
os.unlink(filepath)
except Exception, e:
print e
output=output file+'.,txt '
output=os.path.join(results_dir,output)
mcode new=outputfile+"
.
o
.ex
n
mcode nonew=output file+"_
mcode new=os.path.join(results dir,mcode new)
mcode nonew=os.path.join(results dir,mcode no new)
X
excel new=output file+"
X"
excel no new=output file+"
excel new=os.path.join(results dir,excel new)
is
mpat.
excel template=output file+"
exceltemplate=os.path.join(resultsdir,excel template)
excel no new=os.path.join(results dir,excel no new)
output write=open(output,)
with output write as fh:
time now=strftime(
::
,localtimeo)
fh. write(
n)
fh.write
("
fh.write ("
fh.write (Cr
DsgnO
z
o
n")
fh.write ("
fh.write(U
fh. write("
fh.close
-.
n
+ time now)
a
)
ok=True
#--- -------- -
---------------------
-
--
-
-
--
-
--
mass rangel,mass range2,ok=
opt subs.get BOC mass(days,power,max EOC blade,min BOCblade,max BOC blade,wo
rth,output)
mass-range=[mass-rangel,mass-range2]
111
if ok: # only proceed if it
without v
iling
thece nr
is
a
pcssible to chieve the target
coastrainLs
burnip
-----------------------------------------------------------------------
o
#EvaluateEOC
4-
od ru-----------------------------------
----------------------------------------------------------------------
old core,old orientations,location total massmass bias,stored element total
masses,storage mass biases,total U235,mcodeFM mats,mcodeFM data=get current c
ore.getcore(export file,output)
# Evaluate
.
element
properti.e s
a nd
rake necessary
loading
patter
-chiangqes-
#---------------------------------------------------------------------------
final core new,final orientations new,final coreno new,final orientations no
new,full mass dict,available new,available no new,proper places dict,force k
eepnew,force keep no new=shuffle subs.select elements(old core,location tota
lmass,stored element total masses,power,days,
number fresh,must usenew,force keep,use from storage,old orientations,output
If
The retrne:
Op~timrized
solion
return 2
1ltions,
r
with
resh elmentC
has the requi -ed chancges m-ade, but
---------------------------------------------------------------------------------
-------------------------------------------------
fresh e reents--
-
-----
------------ ----
burnup=days*power
if len(final core new) !=r.:
output write=open(output,
with output-write as fh:
fh.write
)
("
fh . write (~
fh. close ()
112
-- -
s &
\withL1out
is not yet
optimal pattern new,optimal orients new=shuffle subs.full search(old core,old
orientations,final core new,final orientations new,full _mass dict,available
new,radPK,burnup,force keep new,proper places dict,mass range,max shuffles)
else:
optimal pattern new={}
if len(final core no new) !=(:
output write=open(output,'a')
with output-write as fh:
fh .write
.
e
fh.close ()
optimal pattern no new,optimalorients no new=shuffle subs.full search(old co
re,old orientations,final _core no new,final _orientations no newfullmass dic
t,available no new,radPK,burnup,forcekeep no new,proper places dict,mass ran
ge,max shuffles)
else:
optimal pattern no new={}
-# - - --
- - -------- - -
Process resu
s
-
- --
--
-----
-----
----
_
---
------
------------------------------------------------------------------------
output write=open(output,
)
with output write as fh:
if len(final core new) !=h and len(final core no new) !=:
fh.write(
o
z
t
sc J'7e
elif len(finalcore new)==O
fh.write('
e o
and len(final core no new)!=O:
elif len(final core no new)=C
fh.write(
, n7)
and len(final core new)!= :
else:
fh.write(
fh
.
o
success=False
close ()
if success:
113
output write=open(output,'')
with outputwrite as fh:
fh .w rite ("\n.....
..
. ...............................
..
fh.write (.. . . . .. . . . .. . . .
fh.close ()
# qenerate Excel Spreadsheets & MCODE-FM inpfu
fes
if len(optimal pattern new) !=0: #if a core was sucessulIly found t-at
uses new fresh elements
opt subs.process results(excel
new,old core,old orientations,optimal
pattern_
new,optimal orients new,
location total mass,mass bias,storedelement total masses,storage mass biases
,power,days,full massdict)
that
if
len(optimal pattern
no new) !=0:
does not use fresh elements
#if a core was
sucessful l
iun
d
opt subs.process results(excel no new,old core,old orientations,optimal patte
rn no new,optimal orients no new,
locationtotalmass,mass bias,stored element total masses,storage mass biases
,power,days,full mass dict)
output write=open (output, '7)
with output-write as fh:
(.......
fh.write
r
fh.close ()
if len(optimalpattern new) !=u:
opt subs.write to mcode (optimal pattern new,optimal orients new,mcodeFM mats,
mcodeFM data,days,power,mcode new)
if len(optimal pattern no new) != :
opt
subs.write to mcode(optimal pattern no new,optimal
_mats,mcodeFM data,days,power,mcode no new)
else:
output write=open (output, '
with output write as fh:
114
orients
no new,mcodeFM
fh.write("
n.
.
fh.close()
optsubs.process results(excel template,old core,old orientationsold core,ol
d orientations,
location total mass,mass bias,stored element total masses,storage mass biases
,power,days,full mass dict)
else: # burnup range
success=False
not compatible with blade constraints
outputfile=open(output,' ')
with output file as fh:
time now=strftime("
fh. write("
"
: localtime()
fh.write ("n
,f
"
+ timenow)
fh.close
return success
A.3 utils/getcurrentcore.py
get
current core.py
Determines the core loading pattern and masses of the elements in
in storage for the EOC of final cycle of an mcodeFM run
from
future
import division
import sys
import os
import util subs
import cPickle
from data.classes import *
import opt subs
115
the core &
import math
import re
def g
rexportfile,output):
output write=open(output,'a')
with output-write as fh:
f h . w r it e (
n
i ",r:........................ .......
fh.write (
.. Bg
i
n
C
.. . . . . . . . . . . . .
rIo
Cf
or
+
rn
n
ne
fh.write('
. '+exportfile)
fh.close()
runDir = os.path.dirname(exportfile)
runDir=os.path.abspath(runDir)
exportfile=open(exportfile, 'r')
thickness 18=0.05
thickness 15=0'.07.2
height='.32
width=5.
82
AvsNumber=.i0?1419
arn cmf (1
well
24
# at/ml1 ,
10^2
negIected bdc
ensites
a re
in
at
/
-cc)
the elemers
thatare c urrent-ly in the core and
n sorage,
as
U2 3
msse
S
#---------------------------------------------------------------------astei
#Dterine
nurof cyles in exo rt
timesteps=exportfile.readlines()[2]
timesteps=len (timesteps .split () )-1
ile
(frMm tme data
mcodeFM mats={}
mcodeFMdata={}
pattern
n
corlad
exportfile.seek(')
#0 rtun
to beinning
finalcore={}
stored elements final orientations={}
mass bias={}
final orientations={}
line=exportfile.readline()
orientation uncertain=[]
116
of
file
valid locs[P.
Ii'
Z
L'
while line !=
item=str(line).split()
if len(item) == 0:
line = exportfile.readline()
continue
if item[0]=="p
elementpath=item
lastlocation=elementpath[len(elementpath)-I]
elem,enltv in the core (or nstorage)
for the finaI(l timestep
tmpwords=exportfile.readline().split()
if tmpwords[0]=='un i
universe=eval (tmpwords [])
exportfile.
readl ine () f read "eeet"
line
else:
universe=-1
#read line was "element" line
starttime = eval(exportfile.readline().split()[1])
finalcycle=int(starttime)+1en(elementpath)-I
flip times=[]
rotate times=[]
of the
orientation
# determIne final
flipline=exportfile.readline().split()
for num in range(1,len(flipline)):
flip times.append(flipline[num])
rotateline=exportfile.readline().split()
for num in range(1,len(rotateline)):
rotatetimes.append(rotateline[num])
elementisflippedfinal=False
elementisrotatedfinal=False
if len(flip times)%2 !=C:
elementisflippedfinal=True
if len(rotate times)%2 !=O:
elementisrotatedfinal=True
exportfile.readline()
name=exportfile.readline().split()[2]
if
the
core
in
universe == -l: # only conider fue
1 Cments
if lastlocation !="
if
final
cycle==timesteps: # irm-pli-s tha
s
the filimestepLi;
if lastlocation in valid locs:
final
core[lastlocation]=name t
t
the
-cre
eeach
t i lc.ation in the final
l
t is
name of th
final orientations[namel=[elementisflippedfinal,elementisrotatedfinal]
else:
)
output write=(output,
with output write as fh:
fh.write("
fh .close ()
117
i
# detemine
if
the orientations
of elements
are now
that
in
storage
lastlocation
stored elements final orientations[name]=[elementisflippedfinal,elementisrota
tedfinal]
line=exportfile.readline()
# Get U2.35 mass of in c're elements
with open(output, a
fh.write(
n
as fh:
athering~~~~~~
incr
eDet
asdaaf
fh.close ()
in
# begin
cr
necessary for obtaining U235 masses oxf
files
ient1iyin
=:e
) ".format
cycleDir =os .path.join (runDir , "cce
dataType="
:4
ererts
(timesteps))
:"
step='
terine
number
f
steps
(ased
on mc
i
files
step check=os .path. join
(cycleDir, os.path. join(.p
p) ) )
while os.path.isfile(step check):
step+=1
step check=os.path. join
p)))
step=step-1
#t identif.yj MiCN
(cycleDir, os.path. join("
i
(input,
output,
l ft
tmp i ri
", "m
S(".f
cce
ormat (ste
".format(ste
>
and datafile
elem7ent U235,,' mlasses,
DataPath=os .path. join
(cycleDir, "
" .format(step))
mcnpIN=os.path. join (DataPath, "
#mcnpOUT
5 .pa
.i
a
P ath, "m cT{)
i"
fmt
(Sep
DataFile=os.path.join(cycleDir, "
ZAID=',
irea
frm
M
__
fie:etermine
&
0P7otp.p
_
2)
masses
- his port
acco
of
th
codr
d apte
mass matIsotopeFractions, atom matIsotopeFractions,matIsotopeFractions
opt subs.get mat mass fractions(mcnpIN)
elementDict = util
subs.read elements(DataFile)
cell
densities=opt subs.readMCNP densities(mcnpIN)
massDict = {}
location masses={}
mass bias={}
location
total
mass={}
118
=
for location in elementDict.keys():
element = elementDict[location]
loc name=utilsubs.TRANSLATER[location]
elementN=final core[loc name]
mcodeFM mats[elementN]={}
mcodeFMdata[elementN={}
mats = element['mae: ria-,l
massDict[location] = {}
]L
try:
element[
except KeyError:
element[
try:
element['a
except KeyError:
element ['o
len (element[ '
if
']
nds'])== :
z=height/ 2
determin
for ax in range(element['ax-"il- ],-l,-l):
u
'.append(z-ax*height/element['ai.
element[bo
sement sizes (assuming uftorm ax. mesh)
mcodeFM data[elementNJ
mcodeFMdata[elementN]
mcodeFM data [elementN]
mcodeFM data [elementN]
mcodeFM data[elementN] ['l
# cIheck
])-1]
]plates
orient aticn to see if monp
fi
i
e Is
need
tC
un~flppd
# unrotatied,
values
if final orientations[elementN][0]:
old cells={}
old matNum={}
# eleen
is
liped
in
])
#
speciried
n
*]=element['
['semnai
['ial']=element['aza'
r
ng ' ]]=element[ lu<]
[
1'
['i
al ' ]=element ['.i
lateral nodes=[]
lateralnodes.append(0.0)
for point in element['lbondf']:
lateral nodes.append(point)
lateral nodes.append(100.0)
plates=elementP[.,a ial' [len(element ['ra
if
plates==1::
thickness=thickness_18
else:
thickness=thickness_15
qt
if they aren't
fnlcr
for axialn in range (1, element/[
for lateraln in range(1,len(elementP
[]
for radialn in range(-,len(element[
old cells[(radialn,lateraln,axialn)]
list(mats[(radialn,lateraln,axialn)][]
119
=
to0be
-everse to
mats[(radialn,lateraln,axialn)]
old matNum[(radialn,lateraln,axialn)] =
[m t']
for axialn in range(element['axI']):
for lateraln
in range(len(elementl+1)
for radialn
in range(len(element[ 'Iil:
new node=(radialn+1,lateraln+l,axialn+1)
old node=(radialn+1,
lateraln+1,element
IxI] -
axialn)
mats[newnode][' cell']=oldcells[old node]
mats[new-node] ['ma']=old
matNum[old node]
if
final orientations[elementN][1]:
# element is
rotated
in final
core
old cells={}
old matNum={}
for axialn in range(-,element[zi'])
for lateraln
in range(l,len(element[l
for radialn
in range (1,len (element['
old cells[(radialn,lateraln,axialn)] =
list(mats[(radialn,lateraln,axialn)]['cell '])
old matNum[(radialn,lateraln,axialn)]
mats[(radialn,lateraln,axialn)]['-mt']
radialn,
for axialn in range (element['eial']):
for lateraln
in range (len (element[
-1)
for radialn
in range(len(element['
a
)):
newnode=(radialn+i,lateraln+1,axialn+1)
old node=(len (element[
len (element [
ooi
])--lateraln,
axialn+1
mats[new-node][
]=old cells[old node]
mats[new node][
=old matNum[old-node]
for axialNode in range(l,element[
J+1):
mcodeFM mats[elementN][axialNode]={}
segment height=abs (element [
] [axialNode] element [
:
] [axialNode-1])
massDict[location][axialNode] = {}
for lateralNode in range(Ilen(element['])+2):
mcodeFM mats[elementN][axialNode][lateralNode]={}
lateral fraction=(lateral nodes[lateralNode]lateral nodes[lateralNode-1])/100.0
massDict[location][axialNode][lateralNode] = []
for radialNode in range (1,len(element[
mcodeFMmats [elementN] [axialNode][lateralNode] [radialNode]={}
cells =
list
(mats[(radialNode,lateralNode,axialNode)]
]
matNum = mats[(radialNode,lateralNode,axialNode)][V
material data=matIsotopeFractions[matNum]
mcodeFM mats [elementNJ [axialNode] [lateralNode] [radialNode]
ata
#
or w
new mde
m - -it laer
120
]-material
']
d
mcodeFM mats[elementN] [axialNode] [lateralNode] [radialNode] [
of 1st cell
ties[str(cells[0])] # store densitity
(ok b/call
#
th
Ins]=cell
densi
cells innoe are
sme ma trial.
cells.sort()
for cell in cells:
cell=str
(cell)
cell volume=segment height*thickness*width*lateralfraction
if not ZAID in mass matIsotopeFractions[matNum]:
mass =
else:
density val=float(cell densities[cell])
if density val<O:
# is mass density
total cell mass=density val*cell volume
else:
# is atom density
cell sum=O
for isotope in atom matIsotopeFractions[matNum]:
isotopemass=int(isotope[len(isotope)-3:])
cell
total
um
sum+=atom matIsotopeFractions[matNum][isotope]*isotopemass
cell_mass=float(cell_densities[cell])*cell-volume*10/(AvsNumber)*cell
s
mass =
total cell mass*mass matIsotopeFractions[matNum][ZAID]
massDict[location][axialNode][lateralNode].append(mass)
#1------------------------------------------------------------------------#dtriemass'
bises
of elem.
Tents in core
)
(laxially
laeayLn
num axial zones=element[' a
]
half ax=int(math.floor(element['x
']/2))
num lateral_zones=len (element [*
half lat=int(math.floor(num lateral zones/2))
half plate=int(math.floor(plates/2))
axial bias start to half=0
lateral bias start to half=v
radial bias start to half=,
axial bias half to end=,
121
lateral bias half to end=0
radial bias halfto end=u
for axialNode in range(,half ax+1):
for lateralNode in range(l ,len(element l+2)
for plateNum in range(plates):
axial bias
start to half+=massDict[location][axialNode][lateralNode][plateNum
for axialNode
in
range(element['aial'],
element[
for lateralNode in range(ilen(element[l
for plateNum in range(plates):
axial]
-
half
ax,-
D+2)
axial bias half to end+=massDict[location][axialNode][lateralNode][plateNum]
for lateralNode in range(1., halflat+1):
for axialNode in range(i,
element[Kazal'+1):
for plateNum in range(plates):
lateral bias
um]
start to half+=massDict[location][axialNode][lateralNode][plateN
for lateralNode in range(num lateral zones, num lateral zones half-lat,-l):
for axialNode in range(-, element['.':ial]+1):
for plateNum in range(plates):
lateral bias half
]
to end+=massDict[location][axialNode][lateralNode][plateNum
for axialNode in range(1, element['.
]+1):
for lateralNode in range(1, len(element['.o]))
for plateNum in range(halfplate):
radial bias start to half+=massDict[location][axialNode][lateralNode][plateNu
m]
for plateNum in range(plates-1, plates-half plate-1,-1):
radial bias half to end+=massDict[location][axialNode][lateralNode][plateNum]
axial U235 =(axial bias start to half+axial bias half to end)/
radial U235=(radial bias start to half+radial bias half to end)/2
lateralU235=(lateral bias start to half+lateral bias half to end)/2
try:axial bias start to half=axial bias start to half/axialU235
except:axial bias start to half=]
try:axial bias half to end=axial bias half to end/axial U235
except:axial bias half to end=try:radial bias start to half=radial bias start to half/radial U235
except:radial bias start to half=.
122
try:radial bias half to end=radial bias half to end/radialU235
except:radial bias half to end=1
try:lateral biasstarttohalf=lateralbiasstart to half/lateralU235
except:lateralbiasstartto half=l
try:lateral bias half toend=lateral bias half to end/lateralU235
except:lateral bias halftoend=1
mass bias [locationl=[num axial zones,
num lateral zones,plates,axialbiasstart to half,axial bias half to end,radi
al bias start tohalf,radial bias half to end,lateral bias start to half,late
ral bias half to end]
mass value=0
# get toal
U235 in elements & in core
for axialNode in range(1,num axial zones+1):
for lateralNode in range(I,num lateral_zones+1):
for values in
range (len (massDict [location] [axialNode] [lateralNodel)
mass value+=massDict [location] [axialNode] [lateralNode] [values]
location_total mass [location]=mass_value
total U235_in core=sum (location total mass. values )
#--------lo
- -------
st ore eemmt
#-----------------
-
--
----
--
--------------------
----
-
-
------
dactca
----- ---
-----
-
-------------------
-
--
-
---
--
with open(output, ' 9 ) as fh:
fh.close ()
storage
f ile=os.path.
join
(runDir,os .path. join("
"
r
en
storedelement cellmasses,storedelement total masses,
stored-element mesh, uncertain-orientations,
new storage dict,mcodeFM mats,mcodeFM data=opt subs.read stored elements(stor
age file,stored elements final orientations,mcodeFM mats,mcodeFM data,output)
if len(uncertain orientations) !=:
output write=open(output, 9)
with output write as fh:
e
fh.write('" ,
for element in uncertain orientations:
fh.write(element)
fh.write(' n')
fh.close ()
123
determine mass biases within stor*ed. elements
(aillv, laterally, and
radially)
storage mass biases={}
for name in stored element cell masses:
num axial zones=stored-element mesh[name][L /zil[0]
halfax=int(math.floor(num axial zones/2))
num lat zones=storedelementmesh[name] l[' i a er a e * ] [0 ]
half lat=int(math.floor(numlat zones/2))
plates=stored element mesh[name][1'.pia
iA]
half plate=int(math.floor(plates/2))
axial bias start tohalf=O
lateral bias start to half=H
radial bias start to half=O
axial-bias half to end=O
lateral bias half to end=u
radial bias half to end=fl
for axialNode in range(.,half ax+1):
for lateralNode in range(1,numlat_zones+1):
for plateNum in range(1,plates+1):
axial bias start to half+=stored-element
ode][axialNode]
cell masses [name] [plateNum] [lateralN
for axialNode in range(num axial zones, num axial zones - half ax,-1):
for lateralNode in range(1,numlatzones+1):
for plateNum in range(1,plates+1):
axial bias half to end+=stored element cell masses[name] [plateNum] [lateralNod
el[axialNode]
for lateralNode in range(l,
half lat+'):
for axialNode in range(1, num axial zones+I):
for plateNum in range(C,plates+J):
lateral bias start to half+=stored element cell masses [name] [plateNum] [latera
INode][axialNode]
for lateralNode in range(num lat zones, num lat zones - half lat,-1):
for axialNode in range(1, num _axial zones+l):
for plateNum in range(I,plates+):
lateral bias half to end+=stored element cell masses [name] [plateNum] [lateraiN
ode][axialNode]
124
for axialNode in range(., numaxialzones+1):
for lateralNode in range(1, numlatzones+l):
for plateNum in range(1,half-plate+1):
#print (p1ateNum)
radial bias startto half+=stored element cellmasses[name][plateNum][lateral
Node][axialNode]
for plateNum in range(plates, plates-half plate,-l):
#print1(plateNum)
radial bias half toend+=storedelement cell masses[name][plateNum][lateralNo
de][axialNode]
axial U235 =(axial bias start to half+axial bias half to end)/2
radialU235=(radial bias start tohalf+radial bias half to end)/
lateralU235=(lateral bias startto half+lateral biashalf toend )/2
try:axial bias startto half=axial bias start tohalf/axialU235
except:axial bias start to half=1
try:axial bias half to end=axial bias half to end/axialU235
except:axial biashalf to end=1
try:radial bias startto half=radial biasstart to half/radialU235
except:radial bias start to half=1
try:radial bias half toend=radial bias half to end/radialU235
except:radial bias half to end=try:lateral bias startto half=lateral bias start to half/lateralU235
except:lateral bias start to half=1
try:lateral bias half toend=lateral biashalf to end/lateralU235
except:lateral bias half to end=1
storage mass biases[name]=[num axial zones,
num latzones,plates,axial bias start tohalf,axialbias half to end,radial b
ias startto half,radial bias half to end,lateral bias start to half,lateral_
bias half to end]
return(final corefinal orientations,location total mass,mass bias,stored ele
ment totalmasses,storage mass biases,total U235_in core,mcodeFM mats,mcodeFM
data)
A. 4 utils/optsubs.py
! pr
/us
/
py1hon
import sys
import os
from xlwt import Workbook, Formula
125
from xlwt import easyxf
import util subs
import cPickle
from data.classes import *
import math
import re
#---
----------------------------------------------------------------------
def
get EOC mass (days,power,final
worth, output):
blade limit,min
initial,max
do optimization=True
#Sparate blade movement correlations exist
initial,experiment
for s' p
2
days
and 2-
f ial
output write=open (output,' a ')
with output write as fh:
fh.write
("in
..................................................
......
fh .close ()
# parameters for the step 2->EOCL
int= 4'.5q*power +
1.
slope= C.256*power .00181
egaltionr
y
# for
a de
ie
fia
blade
psiin
at EC
end mass=(final blade limit-y int)/slope
of
fialbad
lmtc
core burnup=power*days
mass lost=1.20F*coreburnup+v.74
ut
start mass=end mass+mass lost
b
i
ii
presentr
rpsents
#-in
ore
h
ohv
if days> :
*(()*power)+J.08"
mass-change Oto2=1.2
masschange_ 2toEnd= . 2
*((days-.)
M
*power)+:;.7
target
mass step 2=end mass+mass change 2toEnd
target
blade step_2=slope*target mass step 2+y int
blade change Oto2=-(.5223*(mass changeOto2) + .
126
5
Vld
oiino
t
blade min
blade max
limit step2=mininitial-blade change Oto2
limit step2=max initial-bladechangeOto2
maxmass allowed step2=(blade min limit step2-y int)/slope # max
allowable mass coresponds to min
allowable blade position
minmassallowedstep2=(blade
max limit
step2-y int)/slope
# and
vise versa
min initial mass allowed=minmassallowed step2 (masschange Oto2)
max initial mass allowed=max mass allowed step2 (mass changeOto2)
# account for reactivity
of ezeriments
If
necessarv
if experiment worth!=0.:
target insertion-worth= -0.2574*(targetbladestep_2**2) +
10.744 3*target blade step_2 + 1.0.367
min insertion-worth=
-0.257 4 *(blade min limit step2**2) +
10. 7443*blade minlimit
step2 + 126.0367
max insertion worth=
-( :.274*(blade max limit step2**2) +
10.7443*blade max limit
step2 + 126.0367
target dz= -experiment worth/targetinsertion worth
min dz
= -experiment worth/min insertion worth
max dz
= -experiment worth/max insertion worth
targetdm=target dz/slope
mindmmin _dz/slope
max dm=maxdz/slope
start mass=start mass-target dm
min initial mass allowed=min initial mass allowed-min dm
max initial mass allowed=max initial mass allowed-max dm
output write=open(output, ', )
with output write as fh:
initial)+"
..
str(max initial
mass allowed)+
fh.write
("
"+str
(max initial)+"
.,
str (min initial
mass allowed)+n
fh.write("
'
"+str(final
blade limit)+"
str (start-mass)
+ "
fh.close()
"+str(min
max initial
ass,start
power)
mass allowed,start
mass,min initial
cor
max
I
cn
a
mass
'
.
-L
n)
l
x
o
.
.
" +
as.a
*
+
mass,do optimization=evaluate mass range(end m
allowed,max initial
mass allowed,output,days,
ma
g
ass a1
127
t
output write=open(output,'a')
with output write as fh:
if do optimization:
f h. write("nTeiiilms
+str(startmass)
+
an
"+str(max
else:
fh. write ("\
ftenewcr
utb
mass allowed)+
col
mass rag
not..
()
fh.close
else:
are
A vai ,
initial
# The analysis is not valid
for cycle lenqths
output write=open(output,'a')
with output write as fh:
fh.write
(' \nl E:.'JR:
r
the. tl
less
than 3
davs
()
fh.close
do optimization=False
return(start mass,max initial mass allowed,dooptimization)
#-
-------------------------- -
- - - - -- - - --------- ----
-
-
def
g(end mass, start
mass allowed,output,days,power):
mass,min
initial
mass allowed,max
initial
do optimization=True
if start mass>max initial mass allowed:
# i
tri:e, the
h
taet
bunp
i
nct achievable It
initi
ma-ss
eqire
would cause the b ades
iner
to be
itially
Led'
#,
e
the
a
allowable
allowable
allowable
allowable
~
w
G1
limit requir
shutdown margi
for sufficient
delta mass-max initial mass allowed-end mass
5
burnup=(allowable delta mass-. 0784)t/l .
power=allowable burnup/days
days=allowable burnup/power
output write=open (output,
with output write as fh:
fh.write(V ..
T
)
o
fh.write
n
,.
"+str(allowable burnup)+ "
)
fh.write( '
,"+str(allowable power)+ "
+ str(allowable days)+
"
fh.close()
start mass=max initial mass allowed
128
)
-
-
dooptimization=False
if start mass<min initial massallowed:
i
true,
the calculated initial.
mass reqire
d would corr espoJ
4o
an
Iial
blade ,csition above the limit (could cause core to be
Xe prcluded)
#
ni tial
mass w
1 be ad justeci
y for necessary
level
initial
blade insertion
reactivi
4
start
mass=mininitial
return(max initial
def
ea
MCN
to allow sufficient
mass allowed
mass allowed,start
mass,do-optimization)
eiie(mcnpfile):
cell densities={}
mcnpfile=open (mcnpfile,' _')
lines=mcnpfile .readlines ()
i=
for line in lines:
i=i+1
item=str(line).split()
if len(item)>l:
if
item[1]=='KVUL
and item[2]=='EL
i'
keepreading=True
while keep reading:
read line=str(lines[i]).split()
if len(read line)>2:
if
read line[]=='
and read line [2]='
keep reading=False
if
len(readline)==3:
cell name=read line[,]
cell density=read line[2]
cell densities[cell name]=cell density
i=i+1
return cell-densities
def
c
excess
(mcnplnput File):
129
initial
re matNum
te
re. compile("('
,
",
re.IGNORECASE)
l
llowed by u t6
nCumbers
comment = re.compile(" c", re.IGNORECASE)
CCormm
zaid = re.compile("
",re.IGNORECASE)
oweb
a p'eriodJ, 2 diits, ana
itte
Cg inning
re
i th a
re
ji gts
# 'cm'
at
f
with open(mcnpInputFile,".") as fh:
mass matIsotopeFractions={}
atom matIsotopeFractions={}
matIsotopeFractions = {1
mcodeIsotopeFractions={}
readingMat = False
currentMat =while True: # loop throgh
entiLe fiie
line = fh.readline()
if line == "": break
if re comment.search(line): continue
matMatch = re matNum.search(line)
if matMatch:
currentMat = int(matMatch.group(0))
matIsotopeFractions[currentMat] = {}
mcodelsotopeFractions [currentMat] = []
words = line.split()
for i,
word in enumerate(words):
zaidMatch = re zaid.search(word)
130
P for
#
in sart
#f 4 or ;
s
if zaidMatch:
zaid = zaidMatch.group(0)
value = eval(words[i+1])
matIsotopeFractions[currentMat][zaid] = value
item=(words[i],words[i+1])
mcodeIsotopeFractions[currentMat].append(item)
readingMat = True
elif readingMat and line[0] ="
words = line.split()
for i, word in enumerate(words):
zaidMatch = re zaid.search(word)
if zaidMatch:
zaid
zaidMatch.group(C)
value = eval(words[i+1])
item=(words[i],words[i+1])
mcodeIsotopeFractions[currentMat].append(item)
matIsotopeFractions[currentMat][zaid] = value
else:
readingMat = False
for mat in matIsotopeFractions:
mass matIsotopeFractions[mat]={}
atom matIsotopeFractions[mat]={I
sum
= 0
atom sum=O
zaidMassFracts = {}
do mass to atom = True
do atom to mass = True
normalize atom=False
m i={}
m net=0
for zaid in matIsotopeFractions[mat]:
value = matIsotopeFractions[mat][zaid]
if
value <
is currently mass fraction
do atomto mass=False
mass matIsotopeFractions[mat][zaid] = abs (value)
4 for converting to atom
MW
int(zaid[(len(zaid)-3 ):])
#val
try:
m i[zaid]=value/MW
except:
m i[zaid]=
m net+=m i[zaid]
else:
# i
crre
ntly at if
ra tion
do mass to atom=False
normalize atom=True
MW = int(zaid[(len(zaid)chrC
of
t
z
srn
newVal
value*MW
131
):])
#a
he last3
zaidMassFracts[zaid]
sum_ += newVal
atom sum+=value
= newVal
if do mass to atom:
for zaid in m i:
try:
atom matIsotopeFractions[mat][zaidl=m i[zaidl/m net
except ZeroDivisionError:
break
if normalizeatom:
for zaid in matIsotopeFractions [mat]:
#
to normalize
atom
fractions
value=matIsotopeFractions[mat][zaid]
try:
atommatIsotopeFractions[mat][zaid]=value/atom
except ZeroDivisionError:
break
if do atom to mass:
for zaid in zaidMassFracts:
try:
mass matIsotopeFractions[mat][zaid]
zaidMassFracts[zaid]/sum_
except ZeroDivisionError:
break
sum
=
return mass matIsotopeFractions, atom matIsotopeFractions,
mcodeIsotopeFractions
# mass/atom versions
usseJ to caIc. rase:-s
i nI
or: ii
w ite
n e w MCOE
Inp Ut
--------------------------------------------------------rC~
O
used
to
---
def
-(storage
file,final orientations,mcodeFM matsmcodeFM dat
a,output)
thickness_18=.0502
thickness 15=;.72
height=7 6.- -
132
width=5.28828
ZAID=' J
3_ '
AvsNumber=6.C2214192
barn cm (1024 ->c)
# at/mol
,0^23
neglected
densities
b/c
are
orientation uncertain=[]
try:
with open(storage file,"r") as fh:
lines = fh.readlines()
Exception("E
len(lines)
== 0: raise
if
except:
with open(output,'a') as fh:
fh. write('iiERR
tola
fIe
oe
lmetdt raile
fl.'
fh .close ()
storedElements = {} 4 key is name, value is path to stored element
for i, line in enumerate(lines):
if i%3 == 0: storedElements[line.stripo] = lines[i+l].strip()
storageElementDicts =
stored-names=[]
[]
get stored element names
for item in storedElements.keys():
stored names.append(item)
#pen the file
for each stored element, and read, Ie
for file
in storedElements.values():
try:
storedElementDict = cPickle.load(open(file_,""
storageElementDicts.append((file
except:
with open(output, ' a)
as fh:
-I
::I.""II. f h .wr it e ( '",
fh.close ()
name index=0 #for
element
)
,storedElementDict))
nameS
ciing
stored mass dictionary={}
element properties={}
storage dict new={}
for storageFile,storedElementDict in storageElementDicts:
name=stored names[name index]
mcodeFM mats[name]={}
mcodeFM data[name]={}
storage dict new[name]=storedElementDict
133
data
in at /
element properties[name]={}
plates
storedElementDict['lra.ts']
axial = storedElementDict['a.xia']
radial = storedElementDict['raia'.,
mcodeFM data[name]['ca;ia']=axial
mcodeFM data[name] [
d
]=copy.deepcopy(radial)
mcodeFM data[name]['pla-es']=plates
materials
= storedElementDict['aelrals']
fixedmats = {
nodelist=[]
for node in materials.keyso:
if
len(node) ==2
fixednode
(node[0],1,node[1])
else:
fixednode = node
fixedmats[fixednode]=materials[node]
nodelist.append(fixednode)
materials = fixedmats
if
in storedElementDict:
segmentation = storedElementDict[
mt
o
else: segmentation =
]
mcodeFM data[name] [.,.-',-ei']=segmentation
if
in storedElementDict:
striping = storedElementDict['..'-: n']
else: striping = []
mcodeFM data [name][
]=copy.deepcopy (striping)
if len(segmentation)==:
z=height/.'
for ax in range(axial,-1,-l):
segmentation.append(z-ax*height/axial)
radial.insert(O,0)
striping.
insert
(i), C. 0)
striping.append(Z
.)
number of laterals=len(striping)-K
cell dictionary={}
number of plates=radial[len(radial)-']
if number of plates==18:
thickness=thickness_18
else:
thickness=thickness 15
for plates in range(1, number of plates+.):
cell dictionary[plates]={}
for laterals in range(1,len(striping)):
cell dictionary[plates][laterals]={}
for axials in range(1, axial+1):
cell dictionary[plates][laterals][axial]={}
134
#
Check if
element
was
flipped or rotated final1-e
in
core
-
if
so,
need to be reve~rsed
materials
if
name in final orientations:
if
final orientations[name]:
Ti core
rfliped fin.al] time
is
# eleentr
Sneed to reverse data axially
old mats={}
old density={1
for node in nodelist:
old mats [node]-materials [node]
old density[node]=materials[node]['n
E
for axialn in range(axial):
for lateraln in range(len(striping)-l):
for radialn in range(len(radial)-1):
new node=(radialn+1 ,lateraln+l,axialn+.)
old node=(radialn+1, lateraln+1,axial-axialn)
materials[new node]
ides<] = old mats[oldnode]
ol density[old node]
materials [new-node] [ ' e=
if
final orientations[name][1]:
# eleient is rotated final time in core
i need to reverse data radially
oldmats={}
old density={}
for node in nodelist:
old mats [node]=materials [node] ['
i
old density [node]=materials [node] ['
for axialn in range(axial):
for lateraln in range(len(striping)-l):
for radialn in range(len(radial)-I):
new node=(radialn+1,lateraln+l,axialn+1)
old node=(len(radial)-i-radialn,len(striping) -llateraln,axialn+1)
materials [new node] []
= old mats[old node]
materials[newnode] [
t']
old-density[old node]
else:
orientation uncertain.append(name)
for axialn in range(axial):
mcodeFM mats[name][axialn+1]={}
for lateraln in range(len(striping)-1):
mcodeFM mats[name][axialn+1] [lateraln+1]={}
for radialn in range(len(radial)-1):
mcodeFMmats[name] [axialn+1] [lateraln+1] [radialn+1]={}
node=(radialn+1,lateraln+1,axialn+1)
mcodeFM_mats [name] [axialn+1]
mcodeFM
[lateraln+1]
[radialn+1
mats [name] [axialn+1] [lateraln+1] [radialn+]
135
[
[
-]materials
[node][
]=materials [node] [
for node in nodelist:
radial zone=node[l]
for plate in range(radial[radial zone-1]+1,
radial[radial zone]+1):
striping[lateral
# lateral serment
lateral zone=node [1.]
lateral fraction=(striping[lateral zone]zone-1])/100G.
#axli
segmrent
axialzone=node[2]
axial segment height=abs(segmentation[axial zone]segmentation[axial zone-1])
material set=node
density=materials[material set] [
nuclides=materials[material set]
zaids=[]
dens=[]
for item in nuclides:
zaids.append(item[0])
dens.append(item[1])
do atom to mass=True
do mass to atom=True
cell volume=axial
i
n
cl
'
segment height*thickness*width*lateral fraction
sum =0
atom sum=O
cell sum='
atom isotope fracts={}
mass isotope fracts={}
m i={}
m new=0
for i in range( ,len(nuclides)):
value=float(dens[i])
idnumber=zaids [i]
zaid part=idnumber.split('
) []
icurrtly
if value < 1:
do atom to mass=False
mas1ctio
mass isotope fracts[zaid part]=abs(value)
molecular mass
approx=int(zaid part[(len(zaid
try:
m
i[zaid part]=abs(value)/molecular mass approx
except:
m i[zaid part]=
m net+=m i[zaid part]
136
part)-
else: # is currently atom fractio
do mass to atom=False
normalize atom=True
# get ator f.action by
rmalizing
molecular mass-approx=int(zaidpart[(len(zaid _part)-3) :1)
newVal=value*molecular mass approx
mass isotopefracts[zaidpart] = newVal
sum +=newVal
atomsum+=value
if normalize atom:
for i in range(o,len(nuclides)):
value=float(dens[i])
idnumber=zaids [i]
zaid part=idnumber.split(. .) []
try:
atom isotope fracts[zaid part]=value/atom sum
except ZeroDivisionError:
break
if do atom to mass:
# convert atom fract to mass fract
for idnumber in mass isotope fracts:
try:
mass isotope fracts[idnumber]=mass isotopefracts[idnumber]/sum
except ZeroDivisionError:
break
if do mass to atom:
# corvert mass fract to atom fract
for idnumber in m i:
try:
atom_i sotope_ fracts[idnumber]=m i[idnumber]/m net
except ZeroDivisionError:
break
density=float(density)
if density<O:
# is
mass deisitV
total cell mass=density*cell volume #I ttal mas
else:
# is a:tomic lensity
for idnumber in atom isotope fracts:
molecular mass approx=int(idnumber[(len(idnumber)-
cell sum+=molecular mass approx*atom isotope fracts[idnumber]
total cell mass=density*cell volume*-0/(AvsNumber)*cell
137
sum
o
m
jtass
of
ist
U235
U235_cell
i
ell
cell-dictionary[plate]
mass=total cell
[lateral-zone]
[axial
mass*mass
isotope fracts[ZAID]
zone]=U235_cell
#
mass #. store value
stored mass dictionary[name]=cell dictionary
element properties[name]['pl ate']=number ofplates
element properties[name]['arials']=[axial,
segmentation]
element-properties [name] [
t
l]=[number-of
laterals,
name-index+=1
striping]
elementmass dict={}
for element in stored mass dictionary:
elementmass dict[element]=C
for plate in stored mass dictionary[element]:
for lateral node in stored mass dictionary[element][plate]:
for axial node in
stored mass dictionary[element][plate][lateral node]:
mass val=stored mass dictionary[element][plate][lateral
element mass dict[element]+-mass val
node][axial node]
return stored mass dictionary,element mass dict, element properties,
orientation-uncertain, storagedict new, mcodeFM mats, mcodeFM data
# stoed
iass dictionary
ul distribution
of cell
masses fr
eh
element, element nmass dict
total
mass of each element
s
A(results file,
old core,old orientations,opt core pattern,opt core orientations,location tot
al mass,mass bias,stored element total masses,storage mass biases,power,days,
full mass dict):
def
process-results
of
Creates an excel file with the core loading pattern & masses
an mcodeFM run
Creates a text file containing
optimization search
the warnings
138
& errors
from the
end
encountered in the
book = Workbook()
previouscore
= book. add sheet (
elementsummary = book.add sheet('E
BOCcore = book.add sheet('
or
EOCcore = book.add sheet(- (i
u
me
)
m
)
data_=book.add sheet('
style=easyxf(numformatstr=' K
.
style2=easyxf (numformat str='.
)
Populate Worksheet Sumry of Previous Cr
prviu w.ite1l iII
sore
previous core. write(6,
, "
a
previous core.write
(6,2,"leen<)
previous core.write
(,3,"'inato"
row=7
col=1
sorted
locs=[]
for location in old core:
location=util subs.TRANSLATE[location]
sorted locs.append(location)
sorted
locs .sort
()
for location in sorted locs:
location=util subs.TRANSLATE R[location]
previous core.write(row,col,location)
col+=1
element=old core[location]
previous core.write(row,col,element)
col+=l
orientations=
if
old orientations [element] [0]:
orientations=
else:
orientations=' U '
previous core.write(row,col,orientations)
col+=1
orientations='
if old orientations[elementl[1]:
orientations=',
previous core.write(row,col,orientations)
row+=i
c ol=1
element
summary.write(,,
element
summary.write(4,.
)
139
L ading
Patt
----------
I
element_summary.write
((44 ,2,
"235Ms
i
l
")
, 3, "!
ar
.1wr t
el me t:um
elementsummary.write(4, 2 ,"at'""ais"
element summary.write(43,
element summary.write(4,
",
1
element summary.write (4, ,7
element summary. write (3,', "M
element
summary.write (4, 1,
":
)
element summary. write (4,11, "Lae)
element summary.write(4,8,"P
element summary.write(4,8,"Pasha
element-summary.wrlte(4,Q4, I
g)"
:n
F
row=5
col=1
#, write data for in-core elements
for location in sorted locs:
locationN=util subs.TRANSLATE R[location]
element name=old core[locationN]
data-mass bias[location]
element mass=location total mass[location]
element summary.write(row,col,element name)
col+=l
elementsummary.write(row,col,element mass,style2)
col+=l
for i in range(3):
element summary.write(row,col,data[i])
col+=1
for i in range(3,len(data)):
element summary.write(row,col,data[i],style)
col+
I
row+=1
col=1
for element in stored element total masses:
element summary.write(row,col,element)
col+=1
element summary.write(row,col,stored element total masses[element],style2)
data=storage mass biases[element]
col+=1
for i in range( 3 ):
element summary.write(row,col,data[i])
col+=1
for i in range(3,len(data)):
element summary.write(row,col,data[i],style)
col+=1
row+=1
col=1
Ccre
.write------(----,-------BOC core.write(.,~,
4
140
BOCcore. write (4, ,
BOCcore.write(6,1,
BOC core.write(6,2,'
g
e
d
r
I
2
BOCcore.write(6,3,'g
BOC core.write(6,4,
BOC core write (6, 6,Mask'
BOC core.write(5,
BOCcore. write (6, 8,'Rail')
BOC core.write(6,9,'Axial)
BOC core.write(6,10,'Lateral')
row=7
co1=0
for location in
sorted locs:
BOCcore.write(row,col,Formula('i
riu
o
%{ ' C
:row+1}))
col+=1
locationN=utilsubs.TRANSLATE R[location]
name=opt core pattern[locationN]
mass=full mass dict[name]
flipped=opt core orientations[locationN][ 0]
rotated=opt core orientations[locationN][ 1]
if
rotated:
rot= UI
else:
rot=''
if
flipped:
orient='D'
else:
orient="'C
BOCcore.write(row,col,locationN)
col+=1
BOC core.write(row,col,name)
col+=1
BOCcore.write(row,col,mass,style2)
col+=1
BOC core.write(row,col,orient)
col+= 1
BOC core.write(row,col,rot)
col+=1
BOC core. write
lcadtion
mass
(row, col, Formula(".
pk
:row+1}),style)
col+=1
era
pka:pk~at
c
:
k~et
eak~latin,
Dr
141
"'.adal1ar
,J.
eC
col+=1
#
adalJ P eak
BOCcore .write(row,col,]
Formula
(Ic d ""
col+=1
xial
#
)'%{I
: row+-,1}) ,style)
cw
PeakI
BOC core.write(row,col,Formula(
"))'%{'ow: row+1},
style)
col+=1
#t Lat eral Pe aking
BOCcore.write(row,col,Formula(
%{
:row+1}),style)
co1=0
row+=1
BOC_ core.write (32,2, 'e)
BOC_ core. write (32, 3, Formula
BOC_ core.write
(32,
BOC_ core. write (32, E, Formula
BOC_ core .write (32, 9, Formula
BOC core.write
(32,1,
Formul
#
Popula-te Worksheet
(K
:..i
V:'
Summary of
ECC Core Behavior---
burnup=power*days
core.write(1,1,
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
EOC
core.write(U,8,
,
core.write(,'
core. write (6,ir
EOC
EOC
EOC
EOC
EOC
EOC
EOC
core.write(1,
core.write(,
core.write(2,
core.write(.,
15)
core.write(3,
)
.,
core.write(2,
core.write(5,
14Formula(
core.write(4,1,
core.write(,,
core.write(/,6,power)
core.write(1,7,
core.write(
core.write(1,,
)
.
,
)
,days)
)
core.write(2,8,Formula(
core.write(
,1
)
),style2)
9)
,
)
core.write(,2,
core.write( 6 ,3,
core.write(6,4,
core.write(6,6,
)
core.write(5,8,
)
)
)f
"A
142
-----------------------
#
EOC_core.write(3, 15,Formula (' :
BOC Mass
EOC core.write(4,15,Formula ('EC
Cre
av
# Step 2
'),style2)
#
eir
EOC_core.write(5,15,Formula
EO
Mass
istyle2)
ri33
!
(3 days) Mass
),style2)
EOCcore.write(5,l1,Formula
1',style2)
EOCcore.write(4,16,Formula
EOCcore.write(3,16,Formula
B'OC' blade
EC
bIade
('
('
13 ,style2) # day 3 blade
.4
S 2s+
)
#
),style2)
row=."
col=1
for location in sorted_locs:
locationN=util subs.TRANSLATER[location]
name=optcore pattern[locationN]
EOCcore.write(row,col,locationN)
col+=1
EOC core. write (row, col, Formula(
ii
o ( 't %{'
k'
_o
w :row+(}))
name
col+=1
EOC core.write(row,col, Formula ( B"
'%{>r':row+}),style2)
col+=1
o
e
Behavi
J
r C J_ (row
da
mass
re
EOC core.write(row,col,Formula('-,
r %{'r o:row+1}))
#
C. rientation
(flip)
col+=1
EOC core.write(row,col,Formula(
:row+l})) # orientatiun (rutate)
col+=1
EOC core. write (row, col, Formula(
location mass pk
col+=]
e
B''
r
%
:row+}), style)
col+=I
#T Raia
Beakrigr
FOG core.write(row,col,Formula('
:row+.}), style)
col+=1
# Axial
Peakina
FOCcore.write (row, col, Formsil a(
if
! f
:row+1 }),style)
col+=1
Lterale
PeaK
143
#
EOC core.write(row,col,Formula('"t
row
d=D"
ra)d,""))
CoreatinataU
%{fm
:row+1}) ,style)
col=l
row+=1
EOC core .write (32,2, 'ne')
EOC core. write (32,3, Formula('um':
p:'
EOC core.write(32,7,'max
EOC core -write (32, 8, Formula ( '
(:3)
EOCcore.write(32,9,Formula(
EOC core. write(32, 1 0, FormulaV(x'
# opul ate Worksheet
Summary of
M
.write(1,I,''
i
write (3, 1, 'Cpl
a
i
.write(5,0,'
.write(', '
data
write(5,2,
data .write(3,4,
data .write(4,4,
write(4,6, '
data
data .write(4, 8,
n
data .write (4, ,)D
data .write(5, 4,
r
data .write(5,5, e)
data .write(5, 6,
data
data
data
data
.write(,,,
data .write( ,1
data_.write (G,
)
)
data .write(5,
data_.wr it e (5,,S
p
)
'
S
)
'I)
data .write3,
data_ .write(4,1
data .write(4,13
x
data_.write (5, 1,)
data_. write (4, 14,
data_.write(5,15,x
data_ .write('', 1
data_.write(4, 7,'
data_.write(5, 17,
data_.write(5,1,
data_.write(4,19, I
data .write (4,19,
data .write(r,20,
r
)
)
)
n
)
)
)
)
)
)
row=7
col=0
K-wit iniida
)
))
Data for Correlations
depletion,radpk,axlatpk=equation data()
data
1)
'octondt
144
-------------------
for location in sorted locs:
locationN=util subs.TRANSLATE R[location]
data .write(row,col,locationN)
col+=1
data_ .write(row,col,depletion[locationN][0)],style)
col+=1
data .write(row,col,depletion[locationN][1],style)
col+=2
for i in range(4):
data_ .write(row,col,radpk[locationN]['..''][i],style)
col+=1
for i in range(4):
data_.write(row,col,radpk[locationN] [''][i] ,style)
col+=I
col+=]
for i in range(S):
data .write(row,col,axlatpk[locationN][iI,style)
col+=1
row+=l
col=0
book.save(results
def
aation
file)
ata():
#v'alues are slope, y-intercept
burnuprate equation={}
#
un
(burnupra
# wer
E *
rup)
burnup rat-=(slo
rate
equation
burnup
burnup
burnup
burnup
burnup
burnup
burnup
burnup
burnup
burnup
rate
rate
rate
rate
rate
rate
rate
rate
rate
rate
equation [I
equation[
equation[
equation[
equation[
equation[
equation[
equation[
equation[
equation[
for
applied as
Mass
Loss RaLe vs.
EOC mflass-=BOC!-
mass
-
pe*(mass peaking)+y-intercept"
. 1
. 2
0.
,
281,
1=I
.2
. 0299]
1,0.
02! c
145
Mass
Peaking
Eqn.
burnup rate
equation['V2']=[ 0.0369,0.0109]
burnuprate_equation[':
1I]=[
burnup rate equation[-n.
0. 0109]
burnup rateequation[ ..
burnup rateequation[':
burnup rate equation['
0 .0
0. 010 9]
burnup rate equation['7
burnup rateequation[':
burnup rate equation['
I']=[ i.0369,. 0 1
burnuprate equation['
.06,0. 0109]
burnup rate equation['
0. 036,0.0109]
burnup rate equation['burnup rate equation["'
r) r- ,, 7
rc
"
J ":
").
burnup rateequation['L
-values are slope & y- I
rcet
-1C! ma
-U p5
-J<O'7h
5+'1(
# were
pksope
,Masspky-n
radial peaking equation={}
BOC
sl;pe
D BOC slope
down
intercept
down,
BC
of
tr
radial
peakilng
equat ion,
'~
ep
up, BOC y-intercept up, EOC slope up, FOC
-intercept uu,
y-intercept
down, EOC slope down, EOC y-
.......................................
B
C UP .........
EOC UP
-BC DOWN ......
E C Dwn.....
radial peaking equation['
' =dict(U=[1.1198
, 0.
67
,1. 00
,0.5426
],D=[1.11'8 ,0.5067 /
' 73
, 0 . 627- , 0 . 21
radial peaking e quation[ '
']dict(U=[.671
e_:CX
1JP Pe e.T1i 1.
D=[1. 71
,.6
,63
.45
1
Dow
=p
radial
peaking e quation['']/
=dict(U=[0.718
3 2 ,
1.1518
,
160
1,D=[.0000
,1.5
,, ,
32 ])# Down
p ara
el up
perpend cua
radial peaking e quation['N'] =dict(U=[ 1.8
,!0 .00 0, ,1.4
9
])
D wn =
..........
radial peaking e quation[
],D=[ .0000 ,1.32
araI
']=it=[.0
9
I
pe-
D
iicU
e d
allel, ioCrdwdoesn'
w-m= t pepnicular
pte -pU'er~i
=
up
arle,
c
i cl
c -I -a
Pepniua
= perpediLcular
1,D=
3
=
, sr u
a la
radial
peaking e quation['-. '].1 =dict (U=[1.5-74.
9
]D=[.
radial peaking e quation[
] =dict (U=
2
ID=[1. 21
peaking- e quation[
radial] =dict(U=[0.72
,2-'
],D=[C.
,peaking
radiale quation[
];,'=dict (U=[1.-574
D=[I 12' 2,0.4541
,1.72
, ~
0 u2r
r 071])# Dcwn
uJ-])
-up= = a p
radial
peaking equation[''] =d ict (U=[.8
[1 . /3 U ''
16
])#
or
en
a
,1.991
,qu1a
4t ])
Dow
= p
radial peaking equation[
I =dict (U=[
ng
aD=i[a1.9 p
radial
peaking e quation[
=dict(U=[1.61
' ] =dict(U=[V.
quation[
I-T
1
a
I
e 6c
0 3
,
0
=pe rpendicularY
.7 I ,0.559
1
aD=i[a1.l p a
guation[
peaking_ e quation[
radial
]
,D=[
1.
9
A
. 124
c'',s
radial peaking e
, . 5 9
] D= [1.. 1220
radial-peaking e quation[
]D=[
=dic t(U[
=dict(U=[.
,-
.233,0.2725
radial peaking- e
80
09 , .
] D= [ 1.
quatiouL
perpendi
=
.
] =dict(U=[1.9
=dict(U=[I.883
,
]06
])#iDown
146
=
a
a l,
up
,0.5
47
,1.6991 ,02316
=dict (U=[1.6105 ,.210
doesn'
t matter
])
Orientato
1 '7124 ,0.0761
radial peaking equation['J9'] =dict (U=[1.2609 ,0.3380
= p a rae
,
dow1n
perDendicular
])
,D=[1.0922 ,-0.065 ,1.6247 ,-0.572
,0.5147
,1.121
, 0 1725
']=dict (U=[1.2
radial peaking equation[
Up =F paale, down = perpendicular
])#
,D=[1. 1220 ,0.3569 ,0.7(09 ,.9
,0.5599
,0.369
,0.39
radial peaking equation['l 'K]=dict (U=[.883
Down]) =arallel,
up
perpendicular
,D=[1.2336 ,0.1725 ,.1
" 5 ,1.247
,-0.572
i ']=dict
radial peaking equation['
up
perpendicular
paralle,
,0.0.61 )
# Down
,D=[1.2609 ,0.3380 ,1.7124
,T0.
021) 1.69 ,0.2316
radial
peaking equation[ 'l'J=dict
(U=[1. 10 O
doesn't
er
2 16 ] # o-ientation
,-0.0 2 1-0 ,1 69-91 ,
,D=[1.6105
0 ,1.7124 ,O.0761
peaking equation[''
'I =dict (U=[1.2609 ,0.3
radial
4
perpendicular
paral Ie , don
,D=[1.0922 ,-0.065
,1.62
-. 5
'I=dict (U=[1.2336 ,0.17215 ,1.4121 ,0.5147
peaking equation[
radial
lown = perendicular
Up = Ti e ,
,D=[I.1220 ,0.3569 ,C. 7089 ,
E99 ]) I
radialpeakingequation[S']
10 ,1.691
,D=[1.6105 ,0.0
,C.2316
& later
of max expected axial
# dictionary
al peaking
ax lat
pk={}
boo, max
# values are Up: max ax boc, max lit
max ax boc, max lat boc, max ax ecc, max lat ecc
ax coo,
factors
max
lat
B UAX, B U LA, E I AX, E U LA, B D AX, B
E D LA ; B=BOC,E=EOC, U=UP, D=DOWN,AX=Axial Pk,LA=Laterial PK
2 1.64
j.
[1 .40,
.58,
1 .32,
pk['A']
ax lat
1.
1.58,
0,
orientation
doesn't matter
.42,
, 1.86,
1.52, 1.86, 1.42,
ax lat pk['l '] =[1.5
Pa ra
11e, up = perpe n
car
axlatpk[V2
[86,
1.2, 1.6,S1.42,
perpedicar
para lie,
up
1.86,
1.42,
.42.,
ax lat pk['s']
[1.5,
.86,
= perpendcular
Parall c-u
.42,
1 .42,
1.52,
[152,
.86,
ax lat
pk['h']
ion doesn't matter
orienta
6 ] = 1.52, 1.86, ,
ax-lat-pk[
paralel dow = erp~endicular
1.6,
'] =[.
ax lat pk['
paralle,
ax
lat
ax lat
1.86, 1.42,
.42,
1.56,
.42,
.P6,
.42 ,
52,
axlat pk[''] =[
.0,
prpendIcu
up
=[1.66 ar 1.90,
-arallel,axlat
pk[l =i 2']
=.
-']
pk[=perpenicla
lat up
'ar'allel, ax
down:
D iA, E D AX,
1.64]
1.75]#
Down
.75]#
1.75]#4 Down
1.75]#
1.75]#
1.5,
up = perpendiciuar
1.86,
] =[1.52,
pk['.'
pk[
ecc;
1.42,
Down
1.52C,
1.42,
1 .4
1.52,
,
.4
1.:6, 1.42,
1.472,
1.86,
a
,
1
LUp =
1.t7]#4 Bap;=
D ow
1.98,
Down
ip
ax
cf si
lat
pk[
iUS>
eTI t a jo
ax lat pkk
]
=[
'I
.4,
pr p
i
0own
,
[ .
']
lat pk['
ar
dop
= prp"e
] =[.66
pk[
lat
a
pra'llel, up =pe rpe ndl
ax lat pkV'4 y',-
parallel,
ax
parallel,
ax
aD~lI,
V~V>
Down
1.97,
[
r
1.87]4
.,
I.
'1
147
=
1."5]#
.48,
,.7,
-,
.
,
a
14
ax lat pk[C
="74,
.
doesn't
mate
ax lat
pk[ '
[.3,-.i,
parallel,
down =dperpedi cular
axlat pk['C 0
[.6,
1.98:,
pa rallel, down
p erpe dc ular
ax latpk['I ]=[.6
,2.00,
parallel,
up = perpendcu.l
axlat pk[l2']=[.,
1.9,
parallel,
up = perpend.ri.ar
ax lat pk[' .1. ]-[.
4,
orientation doesn't matter
ax lat pk[ '
[
3I
parallel, down
perpendicular
axlat pk[ '
']=[1.86, 1.9 8 ,
perpendicu7llar
down
parallel,
1-48,
1-95,
1.74, 1.97,
1.48, 1.95]#
o'Drientation
.4
, 1 6 ,
1414,
1.87,
.66 ,
1.90,
1.48, 1.85]#
1.67,
2.00,
1.50, 1.87]# Up
. 8 6,
1.98
.44,
.]
Up
Down
=
Down
=
,
1.84,
1.93,
1.71,
1.47,
1.621#
.48,
1.95,
1.74,
1.97,
1.48,
1.95]#
.47,
1.62,
i.66, 1.90,
1.48,
1.85]4 Up
.144,
1.87,
1.67,
1.50,
1.87]#
14
2.00,
Up=
return(burnup rate equation, radial-peaking equation, ax lat pk)
def
wr ._tomde'
(loading pattern,orientations,mcodeFM
wer,filename):
import uuid
4 create da a
mcodeFM data[
mcodeFM mats [
mcodeFM mats
mcodeFM mats
) (
) (
) , (
), (
),(
mcodeFM
mcodeFM
mcodeFM
mcodeFM
mcodeFM
mcodeFM
or
~] [
]=-*
]=[ ('
) (
~] [
) (
) (
data[
data [
data
data [
data [
data [
~] [
][
~] [
~] [,
]='
148
mats, mcodeFM data,days,po
fresh count=1
write file=open(filename,',')
with write file as fh:
fh.write('
cxl
fh.write('
'+str(days))
power=power*10**6
fh.write(' \-oe
'+str (power)+'
)
for location in loading pattern:
element=loading pattern[location]
flipped=orientations[location][0]
rotated=orientations[location][1]
id name=str(uuid.uuid4())
if element='reI:
writeelement=element+str(fresh count)
fresh-count+=1
else:
writeelement=element
fh.write(
'+location+'
(
fh. writep
'+location)
f h . w rit e (
rni
re
fh.write(' \n
mn
'+id name)
fh.write(
t
i
if flipped:
fh.write(i
else:
fh.write(
'ip'
if rotated:
fh.write('
else:
fh.write('i'
fh.write('i\,
m
'+id name+'
'+writeelement)
plates-mcodeFMdata[element] ['
axial=mcodeFM data[element] ['azi']
num axs=int(axial)
striping=mcodeFMdata [element] [ '
r
num lats=len(striping)+1
radial=mcodeFM data[element]['- -l-]segmentation=mcodeFM data [element] [ '
g
num rads=len(radial)
fh .write(
o
'+str
(plates))
fh.write(
nxi
'+str(axial))
fh.write(
)
for item in striping:
fh.write(str(item)+'
)
fh.write(
m
for i in range(len(segmentation)-1,-1,-1):
item=segmentation[i]
fh.write(str(item)+'
fh .write(
)
for item in radial:
fh.write(str(item) +
)
if
element==
e: ' :
149
f h. writ(\n
i
a
i
'+str (mcodeFM-mats [- Fr ']['
])+' \)
i=1
for nuclide in mcodeFM matsfres']['mat':
if
i==5:
fh.write('\n')
i=1
fh.write(nuclide[0]-+
'+nuclide[l]+'
)
i+=i
else:
for radial node in range(1,numrads+1):
for lateral node in range(i,num lats+l):
for axial node in range(l, num axs+l):
density=mcodeFM mats[element][axial node][lateral node][radial node][
fh.write
(' \
i1e
+str(radial
node)+'
'+str(lateral node)+
'+str(axial node)+' '+str(density))
materials-mcodeFM mats[element] [axial-node] [lateralnode]
fh.write
]
[radial-node]['m§
('in')
i=1
#pri
( elemrnt, materi a] s)
for nuclide in materials:
if
i==5:
fh. write('\'
i=1
fh.write(nuclide[0]+'
i +=1
fh.write(-i')
fh.close()
A.5 utils/shuffle subs.py
# s n/env
pyt
from
future
import division
import math
import util
subs
import copy
150
'+nuclide[1]+'
)
def
se let e Iements (in
core pattern,in
core masses,in storage massespower,days,
num new,forcenew,force keep,force use,in orient,output):
C
D .
I,
in core masses new={}
for location in in core masses:
location n=util subs.TRANSLATE R[location]
element=in core pattern[location n]
in core masses new[element]=in core masses [location]
in core masses=in core masses new
burnup=days*power
full mass dict=dict(in core masses.itemso+in storage masses.items()
#
s
x
loading
ate
t
pattern with new=copy.deepcopy(in core pattern)
pattern no new=copy.deepcopy(in core pattern)
151
SlIn r
v
output write=open(output,- I ')
with outputwrite as fh:
fh. write (
n......EautigteFl
nni
e
fAa
beE
mn
fh.close ()
#
Approximate
wha-t
the element masses
will be at EOC
in core end masses,instorageendmasses=predict
age masses,burnup)
#Evaluate
wherec
the elments
storaqe
i
& in
burns (incore masses,instor
core
can go
(A/B/C)
unusable stored,must come out,proper places in,properplaces
stored,current
p
laces,current B,keep masses =
evaluate proper places (in core pattern,in core masses,incore end masses,in s
torage masses,instorageend masses)
store
d-iat. a a-bout
elmen
placement
in
dict
.
un usable=[unusable stored,must come out,properplaces
d]
un usable new=copy.deepcopy(un usable)
un usable no new=copy.deepcopy(un usable)
proper places dict=dict(proper places
------------------------
if
in.itemso+proper places stored.items()
-
num new !=0:
output write=open(output,
with output-write as fh:
in,proper places store
-
)
fh .write (
fh.write(
fh. close ()
152
-
-T
REi---------
if num new>3:
output write=open(output,',2')
with output write as fh:
h
fh.writeC",nrnrror:
J _M
__
I-1
fh.write ("\h
cd
fresh pattern with new={}
else:
took out new=[]
orients withnew=copy.deepcopy(in orient)
forcekeepnew=copy.deepcopy(force keep)
forcekeep new=force keep new+keep masses
full
mass dict[
'r
=31
# PLACE NEW ELEMENTS IN CORE
output write=open(output,'')
with output write as fh:
fh.write(' \
-l
i
p
imur E:
fh.close ()
pattern with new,force keep new,took outnew,orients with new=place new in co
re(num new,pattern withnew,in core masses, currentB,output, force keepnew,
took out new,orients with new)
# REMOVE/ PUT IN NECESSARY ELEMENTS
output write=open(output,' a' )
with output write as fh:
fh.write(
n
:
1
:C
fh .close ()
pattern with new,force keep new,orients with new,available with new=replace u
nacceptable elements(pattern with new,forcekeep new,un usable new,full mass_
dict,force use,tookoutnew,in storage masses,orients with new,output)
if num new ==O or num new>3:
pattern with new={}
orients with new={)
forcekeep new=[]
available withnew=[]
-------------------------
-
if not force-new:
output write=open(output,
with output write as fh:
fh .write(
')
153
-
--.
1
'2
fh.write(
e
fh.close()
took out no new=[]
orients no new=copy.deepcopy(in orient)
forcekeepno new=copy.deepcopy(force keep)
force keep no new=force keep no new+keep masses
# REMOVE/ PUT ;N NECESSARY ELEMENTS
output write=open(output,'a')
with outputwrite as fh:
fh.write(
d
ca
e
to
ain
at
r
wt
fh.close()
pattern no new,force keep no new,orients no new,available no new=replace unac
ceptableelements(pattern no new,force keep no new,unusable no new,full mass
_dict,forceuse,took out no new,in storage masses,orients no new,output)
else:
pattern no new={}
orients no new={}
force keep no new=[]
available no new=[]
return(pattern with new,orients with new,pattern no new,orients no new,full m
ass dict,available with new,available no new,proper places dict,force keep ne
w,force keep no new)
cd
------------------
def
2
(in
core masses,in
storage masses,burnup)
in core end masses={}
in storage end masses={
for element in in core masses:
in core end masses[elerent]=incore
rrasses[element]-(.:
154
.
14*burnup)
for element in in storage masses:
in storage end masses[element]=in storage masses[element](.050148*burnup)
return(incoreend masses,in storage endmasses)
-------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------- evaluate proper places
------------
--------------------------------------------
-----------------------------------------------------------------------------------------------------
def
prc-per p_ ae(current
locations,in
storage masses,in storage end masses):
evaluate
core
masses,in core
end masses,in
currentplaces={}
proper places in={}
properplaces stored={}
keep-masses=[]
currentB=[]
must come out=[]
unusable-stored=[]
#
for
Evaluate
the
rings
# EvaluWate
for
of
the
current
elements
location in current locations:
ring=location[I]
element name=current locations[location]
current places[element name]=ring
if
ring=='-.*.:
current B.append(element name)
the currently
element
in
in
l
core masses:
if
in core masses[element]>=>85:
# beclons iB
proper places in[element]=[
if
in
an
e
elements
belion-----------------
ade
core masses[element ]<:8
go
C
5
I
and in
155
core masses[element]>= ''<:
if in core end masses[element]>699:
# st i
a owed .n B or C
proper places in[element]=['B,'']
else:
B
# mass00
to- lowfr
proper places in[element]=''
if in core-masses[element]<74
and in core masses [element]>=7 15:
# can go in A, B, or C
if in core endmasses[element]>699:
stillallowed
in A, B, or C
properplaces in[element]=['A',''
,'C,]
else:
4 mass too ow for B
if in core end masses[element]>653:
#
tlla
loe
proper places
,i or- C
in[element]='A',''']
else:
# mass too low for A
properplaces in[element]=['C']
if
in
core masses [element]<715* and in
core masses [element]>=6I0:
Aor C
# can g00 i
if in core end masses[element]>653:
# still aloe
in A orC
proper places in[element]=['f-,'']
else:
# mass 0o l0 w for A
proper places in[element]=[''I
if in core masses[element]<60C:
Can o nly g
n C
if in core end masses[element]>l0:
wIll hae
enough
u
mass at EO
proper places in[element]=[L'
else:
# mass aEOC will be too low; element cainot be usedin
must come out.append(element)
proper places in[elementl=[
#Evaluate where
te
for element in in
curren'tly
]
stored elments
storage masses:
if in storage masses[element]>=78:
e -oooC
proper places stored[element]=['']
in
if in storage masses[element]<!
storage masses[element]>=-7:
if in
5
and
storage end masses[element]>699:
sV
156
belong---------------------
the new
proper places stored[element]=[' ','C']
else:
# mass
low foB
proper places stored[element]=['']
if in storagemasses[element]<745 and
in storage masses[element]>=1';:
# can go in A, Br
if in storageend masses[element]>699:
#t s1l allowed in A, B, orC
properplaces
stored [element]=['
,'-
'C
else:
# mass too low for B
if in storage end masses[element]>653:
#. stil
aliowed in A or C
proper places stored[element]=['A , t"
else:
# mass too low for A
proper places stored[element]=['C']
availableC.append(element)
]
t
:'
if in storage masses[element]<715 and
in storage masses[element]>=670:
# can go in A or C
if in storage end masses[element]>653:
#ti
a:
- lowed in A
properplaces stored[element]=[%'
A<,
else:
#f mass tco lowo
proper places
A
stored[element]=[<'
.'
1]
if in storage masses[element]<670:
# can ony
o i
C
if
in storage end masses[element]>10:
# will have enough mass at EOC
proper places stored[element]=[''I
else:
t mass a
EOC will be t
lo'w; elemen
cannot be used
in
the new
proper places stored[element]=[ ' N ]
unusable stored.append(element)
E aore
she
whether
In-Co r
eieI ents a
ok i
current
lcat i ns--
--------------------------------------------------------------
for
element in proper places-in:
location fine=False
for
can-go in proper places in[element]:
if
can go ==
current piaces[element]:
location fine=True
#
its
Tn
etma
s
r still
curre-ntin
if
not location fine:
must come out.append(element)
157
wi
h
ac
a
1
#
location &
the element mass
tmust
e
rmoved
no longer
is
acceptable
for
its
c-urrent
return(unusable stored,must come out,proper places in,proper places stored,cu
rrent places,current B,keep masses)
#-
-------
-
-------
------
- -
-
----------------------------------
-
#----------------------- ---------------------------------- --
place new in
core
-
-----
----
--------
-
- ---------
-
-
-------- --
def plc
newn
cre(N new,freshpattern withnew,in core masses,
currentB,output, force keep,took out,orientations):
# create inverse dict
-(m:lcatir
loc dict={}
for location in fresh pattern with new:
element name=fresh pattern with new[location]
loc dict[element name]=location
#print
(locatIOn, in core massees element namel;
empty fresh=False 4 il
elIe me nt-s c an n ot
be- found
if
item "ke"'is
wil
be rplac
the
replace three={"
slcte
["ky"
": [
set
o true
t
item
eplced,
05
], }
B ring neighbors
[
{
[
#ini
1)
minmu
a
/iD
, "
,"
],
a stion
if
t
]t,
"'
n
1
}
in
the L rin
158
usoing the ne
the other
(2 OR 3
:[
?I
71
twoeement
repace
It
min B mass=830
# dummy value unt-i
minimum mass
elernent in
the
B-r in
s
identife
for B ring element in currentB:
if B ringelement not in force keep:
if in coremasses[Bring element]<min B mass:
min B mass=in core masses[B ring element]
min B name=B ring element
i denti fy location of minimuMmass B rinq element
for item in fresh pattern with new:
if fresh pattern with new[item]==min Bname:
min Blocation=item
# now know name
if
&locat io
of minimum mass
element
N new==l: #take out the minimum mass B-rinq
old=fresh pattern
with new[min B location]
tookout.append(old)
fresh
pattern
with new[min B location]='
element
if N new==2:
min B mass=830
# determine the B-ring element with the next lowest mass that is not a
neighbor
for B ring element in currentB:
if B ring element not in force keep:
if Bring element is not min B name:
test location=loc dict[B ring element]
if test location not in B ring neighbors[min_B location]: #
chec'k that
it's
notaC
negbr
if in core masses[B ring element]<minB mass: #see if it has
a lower mass th
the curren0t ino value
min B mass=in core masses[B ring-element]
secondreplace=B ring element
# determine seond element's locatio in the core
for item in fresh pattern with new:
if fresh pattern with new[item]==second replace:
second fresh-location=item
#tnow have t1
are
&iocatioCi II nfrt
2d
B-ring E
old=fresh pattern with new[minB location]
took out append(old)
fresh pattern
withnew[minB location]=
'
old=fresh pattern with new[second fresh location]
took out append(old)
fresh pattern with new[second fresh location]='
if Nnew==3:
# determine secon
to
r
min B loc=loc dict[min B name]
oneloc=replace three[min B lc]
j
twoloc=replace three[min B loc][1]
onename=fresh pattern with new[oneloc]
159
a
meri
leen
to
e
twoname=fresh pattern with new[twoloc]
onemass=in coremasses[onename]
twomass=in core masses[twoname]
if onemass<twomass:
if onename not in force keep:
second replaced=onename
else:
if twoname not in force keep:
second replaced=twoname
else:
output write=open(output,'
with output write as fh:
')
f h. wr it e(
fh.close()
empty fresh=True
else:
if twoname not in force keep:
secondreplaced=twoname
else:
if onename not in force keep:
second replaced=onename
else:
output write=open(output,'a')
with output write as fh:
fh .write (
fh.close()
empty fresh=True
#! determine th ird
to replace
min B loc=loc dict[min B name]
oneloc=replacethree[min B loc][2] #am
twoloc=replace three[min B loc][3]
onename=fresh pattern with new'[oneloc]
twoname=fresh pattern with new[twoloc]
onemass=in core masses[onename]
twomass=in core-masses[twoname]
if onemass<twomass:
if onename not in force keep:
third replaced=onename
else:
if twoname not in force keep:
third replaced=twoname
else:
output write=open(output,
with output write as fh:
fh.close()
empty fresh=True
else:
if twoname not in force keep:
third replaced=twoname
else:
if onename not in force keep:
third replaced=onenarne
160
)
else:
output write=open(output,'a')
with output write as fh:
fh.wr it e
fh.close()
empty fresh=True
if not emptyfresh:
#
determIie second & third removed elements' locations in the core
for item in fresh pattern with new:
if fresh pattern with new[item]==secondreplaced:
second fresh location=item
if fresh pattern with new[item]==third replaced:
third fresh location=item
old=fresh pattern with new[minB location]
took out append(old)
fresh pattern with new[min B location]= 'Fres
old=fresh pattern with new[second fresh location]
took out.append(old)
fresh pattern with new[second fresh location]='e-s'
old=fresh pattern with new[third fresh location]
took out append (old)
fresh pattern with new[third fresh-location]='Fresh'
if empty-fresh:
fresh pattern with new={)
else:
force keep.append(''
orientations['
]=[False,False]
return(fresh pattern with new,force keep,took out,orientations)
fr esh pattrn
s alp9hanurcr
with
n
- - - - - -----> -r-' --
newis
~------~
r
dict,
--
with
key': value
as
- - - - - - - - - - --.-
161
locat
in
eet;
locat ion
- - -- - - - - - - - -
def
re la-e
(nccpt
ab
len
rs(existing pattern,force
stored elements
dict,force use,took out,starting
unusable stored=un usable[0]
proper places stored=un usable[3]
proper places in=un usable["]
mustcomeout=un usable[1]
used stored element=[]
current places={}
current A=[]
current B=[]
current C=[]
loc dict={}
available storage=[]
for item in starting stored elements list:
available storage.append(item)
available storage=available storage+took out
for removed element in took out:
if removed element in must come out:
must come out.remove(removed element)
162
keep,un usable,full
list,orientations,output)
mass
# determine wich
each fuiel eleLement is currently in & create
to ex Sisi
patter
(elerent loca ion vs
Ca
for location in existing-pattern:
an
invere dict.
ring=location[0]
elementname=existing pattern[location]
locdict[element name]=location
current places[element name]=ring
# Place the elements in the "for-ce use" list
into the core -----------------------------------------------------------------------------------for
element
in
force-use:
if
element in unusable stored:
unusable stored; implies its
mass is too
warningline= "
warningline=warningline+"
o
warningline=warningline+-""+
warningline=warningline+
its
"h
masss
vTali
t
l
ti
l
"
e
te
ch
ErrorMessages.append(warningline)
properplacesstored[element]="''
# element is in
s so low; t ere fe
it should only go In the C-ring
mass diffs={}
min masses={}
possible locations=proper places
try
to place=0
is
# Else: element was ilst
of
low to reall
be used in ths
" + element +" wilb
'lcd
for
fo r
ring in
#±
possible locations:
hecki
there
are
eleet
this
ist
:/c
stored[element]
loop
through the
ngs th
that
need
ou
come
to
elemnot
fthat
ring
---------------------------------------------------
for
should remove element in must come out:
Inth
:n lt
of elements
need to be
if
should remove element not in
(force keep):
J Isr did
say it ha t
ta
in
(or ement
i make
sre
should remove element ring=current
wher
e
the
el
ement
if
# if
it'
in
the
places[should remove
element]
isno
rin
should remove element ring==ring:
the
elmn
a
oIn
str
163
#
d
Tm
if
full mass dict[should remove element]<full mass dict[element]:
storecI element is heavier than the in-core element
mass diffs[should remove element]=
full mass dict[element]-full mass dict[should remove element]
that can be added
#
if the
# note mass
min masses[should remove element]=full mass dict[should remove element]
#either way, also just store the in-core mass
if len(mass diffs) !=2:
imples there are element
that are liIghter than the oe that needs to go in
out
for in
rlmnacement
that
core element,mass diff val in mass diffs:
if mass diff val==max(massdiffs.valueso):
would hve tie
addition of mass
largest
# Note
with
th
that need to come
that
this
element
is
being removed,
identify
& repiace
it
storae
don't wat
optim
element to replace=in coreelement
replacement spot=loc dict[elementtoreplace]
available storage.append(element to replace)
must come out.remove(element to replace)
existing pattern[replacement spot]=element
try
to place=1 # indicates search for placement Is
done
force keep.append(element) # this
elment HAD to be used;
ainsearch
to removi
it againlater
available-storage.remove(element)
# note tha- i
was used
orientations[element]=[Fals'e,False]
else
lIter
#cal
than
es that
-ipl
could re p ace
the
if len(min masses)!=0:
#tr if
ther e were any
ut that
stre
elemnt
c
relc
for in core element, in core element mass in min-masses:
if in core element mass== min(min masses.values():
lightest eleme
ti
ol
elc
C1 CIi
Tr '
# Note
it
if ln
(assdiffs0
jd
any elemnt
it
wit
the
that
ti
elemIrnt
is
bring
emvTed,
& relace
eement
strg
element to replace=in core element
replacement spot=loc dict[element to replace]
available storage.append(element to replace)
existing pattern[replacement spot]=element
try
to place=1#
indicats
rch
for placemnt
force
use5;>.
'
keep.append(element)
ootr
164
#
his
lm
IS
available-storage.remove(element)
used from
# notr
tai
s
storage
orientations[element]=[False,False]
"need"
come
# if none of the above were true,
there were not any
elents
t hat
to come out of this ring
if try to place==O: # true if there were no elements that "need" to
ot that
hstored
element is valid to replace
massdiffs={}
min masses={}
for ring in
the
element
i s valid
possible locations:
#t loop again through the rirs
or
for in core element in current places:
if in core element not in force-keep:
sure user didn't
say element has to stay in
if current places[in core element]==ring:
identify any ri-core elemenrt in the ring
if
full
mass dict[in
core element]<full mass dict[element]:
# mrIa-ne
mass diffs[in core element]=fullmass dict[element]full
mass dict[incore
element] #if
mass can be added, s t ore dif
minmasses=full massdict[in core element]
4also
us-t store
mass of in-core element
if
would, add mass
len(mass diffs)
# implieS
!=e:
there are rpl
emet
for in core element in mass diffs:
mass diff val=mass diffs[in core element]
replacemient
if mass diff val==max(massdiffs.valueso):
addition 0f masS
the laroest
triat would hae
# identify
#t NteA
hat this eleIen is
be in
r emove,
r
the storage element
elementto_replace=in core element
replacement spot=loc dict[elementto replace]
available storage.append(element to replace)
existing pattern[replacement spot]=element
tryto place=1 # irdicate-s
earh
r pia c
n
force keep.append(element)
tid-s e
- rlemen A
wantoptiizaio
n-search to
removei
again
later
us, II
on
available storage.remove(element) a no
with
Jsd
f-om st or ag
orientations[element]=[False,False)
else:
masses !=a
a
wle
epacme
if len(min masses)!=,,,':
165
id
t
that
for in core element in min masses:
in core element mass-min masses[in core element]
if in core element mass== min(min masses.valueso):
# identify the lightest element it could replace
# Note that this element is
with the
it
& replace
being removed,
storage element
element to replace=in core element
replacementspot=loc dict[elementtoreplace]
available storage.append(element to_replace)
existingpattern[replacementspot]=element
# indicates search for placement is
trytoplace=l
done
used;
used
force keep.append(element) # this elemen. HAD to be
want optimization search to remove it again later
available-storage.remove (element) # note that it was
don't
from storage
orientations[element]=[False,False]
if
try to place==n:
has not been placed in
#f eement still
"n + element
error line=" TYa7
error
line+
line=error
theI
"
"+"
Ar
core
+
o
" +element +"
wai
+
+ possible locations[element]
output write=open(output,t '')
with output write as fh:
.i"+error line+" r")
fh.write("
fh.close ()
need to b-eremoved
elements that
fy any remaining3 in-cor
- #Nwidenti
us"stred
not been replaced yet, by a "
their
current ring that hav
eleent
element or a new "rEST"
stored.it
full dictproper places=dict(proper places in.items(+properplaces
ems ()
of
for should remove
c
elements that
if
alread
element
in must
n
should remove element
been
come out:
t pC
not in took out:
taken
if should remove element in force keep:
166
#
# i
for
n lt
elmn
he
fro.
n
'
warning message=" Wa
n
.
+should remove element +"
output write=open(output,'aI)
with output write as fh:
fh. write (" \n \n"+warning message+"\n")
fh.close()
else:
# remove the element
mass diff={}
max-masses={}
remove from =current places[should remove element]
for storedelement in available storage:
if stored element in full dict-properplaces:
if remove from in
full dict proper places[stored element]:
# if
the stored element can go in t'heocaton that
needs to be replaced
if
full mass dict[stored element]>full mass dict[should remove element]:
# if
the stored element is heavier than the incore element
mass diff[storedelement]=full mass dict[storedelement]full
mass dict
[should remove element]
# note mass that
can be added
max masses[stored element]=full
the stored ele-ment's ma ss
mass dict[stored
element]
# al:so just
note
if len(mass diff)!=u:
for stored element in mass diff:
mass diff val=mass diff[stored element]
re.lacement
it with
it
ws
tha-
if mass diff val==max(mass diff.valueso):
wo:uld hav-e the largest
addition of mass
he str
used
eeme
#
ietify
# Note> that this
element is being removed,
repac
t
element to use=stored element
element to replace=should remove element
replacement spot=loc dict[element to replace]
available storage.append(element to replace)
existing pattern[replacement spot]=element to use
available storage.remove(element to use) i note that
from strorag
orientations[element
it
else:
to use]=[False,False]
is
no
if len(max masses)!=':
for stored element in max masses:
167
psil
td
ident ify the
it
i
storage mass-max masses[stored element]
if storage mass== max(max masses.valueso) :
mass element that couldbe used
largest
thi s element is being removed, & replace
# Note that
with the storagie element
element to use=storedelement
elementto replace=should remove element
replacementspot=locdict[element to replace]
available storage.append(element toreplace)
existing pattern[replacementspot]=element to use
available-storage.remove(element to use) f rote
that
was used
rom storage
orientations[element to use]=[False,False]
# Else - a replacement was not found for the element
previous spot, oven
# t
is still
in the core in is
i
shuldn
though
be
else:
+should remove element
warning-message="
+
output write=open(output, ' 2 )
with output write as fh:
fh.write (warning message)
fh.close
()
return(existing
pattern,force
keep,orientations,available
storage)
De:,?7
------------------------------------
def
S(old core,old orientations,new core,new orientations, full
t,available elements,
max peak, burnup, force
keep, ok locations,mass
168
rangeo,max
shuf fles) :
mass dic
I
min diffs:'"
for location in new core:
if new-core[location] != old corellocation]:
diffs+nc
mi
169
# assiqn the orientations to the locations instead of the elements
orient copy={}
for location in old core:
element=old core[location]
orient copy[location]=old orientations[element]
old orientations=orientcopy
orient copy={}
for location in new core:
element=new core[location]
orient copy[location]=new orientations[element]
new orientations=orient copy
# create dict ionary that will store all
of the valid solutions found
(valid= can meet targe
bur-nup, has low enough peaking)
solution set={}
number of solutions=0
Nchanges=[]
Nchanges.append(/4) 4 dummy
# assign correlatio
prarreters
from opt subs import equation data
depletion,radial peak eqns,axlatpk=equation data()
--
---------------------------------------------------------------------A
-a-
elements
& in
solution
as it
e the l_ adi
red repaceents
th
---
chCtangCqes- maCe in
the placement of
-
(i~~e.,
an
l
z
th
ltain
stqands nw--
core mass=0
valid
for
if
solution=True
location in new core:
element=new core[location]
core mass+=full mass dict[element]
core mass<=mass range[0]
valid
solution=False
or core mass>=mass
#hiscor
stre
beoremakng-hanges
starting
core=copy.deepcopy(new core)
starting
orientations=copy.deepcopy(new
starting stored=copy.deepcopy(available
its
eaa
if
valid
peaking
solution:
170
range[1]:
toIt
orientations)
elements)
p
tern
new
elemrtenti
('any location
optimal orientations
# dtrmrine
an
th-,at was nothere
for new elements
the poeviolus Core)
in
with
new orientations=orient new(new core,old core,new orientations,full mass dict
,radial-peak eqns,coremass)
valid solution,
neworienations,maximum rad peak,numchanges=evaluate core (full mass dict,new
_core,old core,new orientations,old orientations,max peak,burnup,
depletion,radial peak eqns,forcekeep)
# if it's stil a valid solution (has low enough peaking) store it as a
potent ia
so Utin
if valid solution:
# store the loading pattern, orientatLons,max peakin
value, and
of
changes to the core
solutionset[numberofsolutions]=[new core,new orientations,maximum rad peak
,num changes]
number of solutions+=1
Nchanges .append (num_changes)
-----------------------------Everv
ossibe Re'fueling Opti
Now Do a
----------------------
Search that Considers
-------
Cr
i
of
aid
locatiorls
C conisd
er
trial
spots=[]
for location in starting core:
element=starting core[location]
if element not in force keep:
trial spots.append(location) #the
vc
th'e ones
thi.out an eIent
that must stay;
In pa
a-re
round=1
while round<:
# repace
ehat
entin
e cre
locatio
n
for location in trial-spots:
lcc
ull
atio
elemt
that
ca
for stored
tt
s
e
with
1 e lemnt
r
for
ts
0fl
o
reulngo
for Its
is vald
#
or
#
for
refuled
element
t in t
in starting
stored:
171
element
if location[0] in ok locations[stored element]:
s al
wed i
this
location
(can go in th-je rng)
# create
a unique instance of the core foDr tis
if te
core 1,orients 1,available1,spots
1=mk copy(starting-core,starting
ons,starting stored,trial spots)
# do the replacement
in core element=core l[location]
orientati
core 1,available 1,spots_l=doreplacement(core_1,availablel,spots1,
in coreelement,stored-element,location)
if round==l:
# evaluate this
loading
valid,core mass=evaluate mass(core 1,full mass dict,mass range)
if valid: # if mass is ok
orients l=orient new(corel,old core,orientsl,full mass dict,radial peakeqn
s,core mass)
valid,
orientsl,maxrp,num changes=evaluate core(full mass dict,corel,old core,orie
nts l,old orientations,max peak,burnup,
depletion,radial peak eqns,force keep)
if valid: # if peaking ok
solution
if
set[number of solutions]l=[core l,orientsl,maxrp,num changes]
number of solutions+=1
Nchanges.append(num changes)
4 now replace a second element it min # of changes not arad
second sweep through
if round>=2:
if min(Nchanges)>=2+min diffs
and 2+min diffs<=max shuffles:
for location2 in spots 1:
for storedelement2 in available 1:
if
location2 [] in ok locations[stored
element2): #
ring
Sored element is al owed i n this
met
it's
core 2,orients 2,available_2,spots_2=mk copy(core_1,starting
ilablel,spots1)
in core element=core_2[location2]
orientations,ava
core 2,available 2,spots 2=do replacement(core_2,available_2,spots_2,in
element,stored-element2,location2)
if round==:
valid,core mass=evaluate mass(core_2,full mass dict,mass
if valid:
core_
range)
orients 2=orient new(core_2,old core,orients_2,full mass dict,radial peak eqn
s,core mass)
valid,orients 2,maxrp,num changes=evaluate core(full mass dict,core 2,old c or
e,orients 2,old orientations,max peak,burnup,depletion,radial peak egns,force
_keep)
if valid:
solution-set[number
of solutions]=[core
2,orients_2,maxrp,num
172
changes]
Nchanges.append(num changes)
number of solutions+=l
#! replace a third
if round>=3:
if
min(Nchanges)>=3+min diffs and 3'+min diffs<=maxshuffles:
for location3 in spots 2:
for storedelement3 in available 2:
if location3[0] in oklocations[stored element3]:
core 3,orients 3,available_3,spots_3=mk-copy(core 2,starting orientations,ava
ilable_2,spots_2)
in core element=core_3[location3]
core 3,available 3,spots 3=doTreplacement(core_3,available 3,spots_3,in core_
element,storedelement3,location3)
if round==3:
valid,core mass=evaluate mass(core 3,full massdict,mass range)
if valid:
orients 3=orient new(core_3,oldcore,orients_3,full mass dict,radial peak eqn
s,core mass)
valid,orients_3,maxrp,num changes=evaluate core(full mass dict,core_3,old cor
e,orients_3,old orientations,maxpeak,burnup,depletion,radial peak eqns,force
_keep)
if valid:
solution set[number of
4+min diffs<=max
solutions]=[core 3,orients 3,maxrp,num changes]
Nchanges .append (numchanges)
number of solutions+=1
rplace
P
a fcurth
if round>=4:
if min(Nchanges)>=4+min diffs and
shuffles:
for location4 in spots 3:
for stored element4 in available 3:
if location4[C] in ok-locations[stored element4]:
core 4,orients 4,available_4,spots_4=mk-copy(core_3,starting orientations,ava
ilable 3,spots_3)
in coreelement=core_4[location4]
core 4,available 4,spots 4=do replacement(core_4,available 4,spots_4,in
core
element,stored element4,location4)
if round==4:
valid,core mass=evaluate mass(core 4,full massdict,mass range)
if valid:
orients 4=orient new(core_4,old core,orients 4,full
s,core mass)
mass dict,radial peak eqn
valid,orients_4,maxrp,num changes=evaluate core(full mass dict,core 4,old cor
173
e,orients_4,oldorientations,
max peak,burnup,depletion,radial
peak eqns,force
_keep)
if
valid:
solution set[number of solutions]=[core 4,orients 4,maxrp,numchanges)
Nchanges.append(num changes)
number of solutions+=l
4 replace a fifth
if round>=5:
if min(Nchanges)>=5+min diffs and
b+mindiffs<=maxshuffles:
for location5 in spots 4:
for stored element5 in available 4:
if location5[0] in
ok-locations[stored element5]:
core 5,orients 5,available_5,spots_5=mkcopy(core_4,starting orientations,ava
ilable_4,spots_4)
in core element=core_5[location5]
core 5,available 5,spots 5=do replacement(core_5,available 5,spots_5,in core
element,storedelement5,location5)
if round==,5:
valid,core mass=evaluate mass(core_5,full mass dict,mass range)
if valid:
orients 5=orient new(core_5,old core,orients_5,full mass dict,radial peak eqn
s,core mass)
valid,orients_5,maxrp,num changes=evaluate core(fullmass dict,core 5,old cor
e,orients_5,old orientations,max peak,burnup,depletion,radial peak eqns,force
_keep)
if valid:
solution set[number of solutions]=[core 5,orients 5,maxrp,num changes]
Nchanges.append(num changes)
number of solutions+=1
round+=1
En _' 0_
I
the bes
tfy
sol uion
min changed=min(Nchanges)
rad peak data=[]
for solution in solution set:
if solution set[solution][3]==min changed:
# if
wit
the min #
yf
change
rad peak data.append(solution set[solution][2])
min peak=min(rad peak data)
for solution in solution set:
if solution set[solution][ ]==min changed and
solution set[solution][2]==min peak:
174
t
a
tion
optimalloading pattern=solutionset[solution][) ]
optimalloading orients=solutionset[solution][1]
# if
there was no solution,
return emprty solut ion
if len(solution set)==(:
optimal loading pattern={}
optimal loading orients={}
return(optimal
set
loading pattern,optimal loadingorients)
# ---
---------------------------------------------------------------------------------------------------------------------------------------------Br ief Ut illity Funic rons ror
the
-----------s
Analys
Optimization
----------------------------------------------------------------------------------
def ik
cop(old
core, old-orientations,old-available,oldspots):
new core=copy.deepcopy(old core)
neworientations=copy.deepcopy(old orientations)
newavailable=copy.deepcopy(old available)
newlocations=copy.deepcopy(old spots)
return(newcore,new orientations,new available,new locations)
---------------------------------------------------------------------------
def
d
e
a
(core,available,spots,
available.append(core element)
available.remove(stored element)
s toraqe
core[location]=stored element
spots-remove(location)
sp-ots
refLul
core element,stored
# pu TeC
reove
ie
the
element,location)
n
lcati-on
f rm
o s1r
the 1 St of
return(core,available,spots)
---------------------------------------------------------------------------
175
def
-v;luat
(core pattern,mass
dict,mass range):
valid solution=True
core mass=0
get total U-235 mass of core
for location in core pattern:
element=core pattern[location]
core mass+=mass dict[element]
# n the
ev valid BOC mass range?
if core mass<=mass range[O] or core mass>=mass range[l]:
valid solution=False
return(valid solution,core mass)
def
-t.o.
(full mass dict,new core,old core,new orientation,old orientatio
n,max _peak,burnup,depletion equation,radial peaking equation,force keep):
different spots=[]
core mass=.
mass peaking factors={}
valid solution=True
176
# get total U-235 mass of new core
for location in new core:
element=new core [location]
coremass+=full massdict[element]
# determi ne rass peaking factors
for location in new core:
element=new core[location]
mass peakingfactors[location]=fullmassdict[element]/(core mass/len(new cor
e))
# determiine eo- mass peaking
eoc masses={}
net mass eoc=0
E mass peaking factors={}
for location in new core:
factors
depletion rate=depletion equation[location][0]*mass peaking factors[location]
+depletion equation[location][1]
mass lost=depletionrate*burnup
element=newcore[location]
eoc masses[location]=full mass dict[element]-mass lost
netmasseoc+=eoc masses[location]
for location in new-core:
E masspeaking
ore))
factors[location]=eoc masses[location]/(net mass ecc/len(new c
#
if
it
only proceed i
anayz
has an ok rass)
if
valid
solution:
rad peaking B={}
radpeaking E={}
in
Srow evauat-e the rest
that
the new
of new
core
core
if
it
o see
is
a valid solution
i the
(i.e.,
chanas
need to be made to meet the peakingq constrant
for location
in new core:
orientation=new orientation[location] [0]
if
orientation==False:
orientation=' r'
else:
orientation='
'
rad peaking B(location]=float
(radial
peaking equation[location][orientation][
*])*float (mass peaking factors[locationl)+
float (radial
peakingequation[location]
[orientation]
[1])
rad peaking E[location]=float(radial peaking equation[location][orientation][
])*float(E mass peakingfactors[location])+
float
(radial
peaking equation[location] [orientation]
[])
#f
hepeakn
iS
too
i,
se eifiisl
177
enghwtte
if rad peaking B[location]>maxpeak or
rad peakingE[location]>max peak:
if orientation==
test orientation=
else:
test orientation='
test peak B=radialpeaking equation[location][test orientation][0]*mass peaki
ng factors[location]+
radial
peakingequation[location]
[testorientation]
[1]
test
peakE=radial
peakingequation[location]
[testorientation]
king factors[location]+
radial peaking equation[location][test orientation][3]
#i the2
peakin11is
low
enAIough wth
[2]*E mass pea
the emn
fipped,
flip
the elementif test
peak B<=maxpeak and test
if test
orientation=='-'
save orientation=False
else:
save orientation=True
peakE<=max peak:
new orientation[location]=[save orientation,new orientation[location][1]]
rad peakingB[location]=test peak B
rad peakingE[location]=test peakE
#
oherwise,
this
core
icading pattern cannot
meet
the peaking
else:
valid solution=False
#
deterimine
toaTnmero
ch
th1a t
anrges
w er
rn-i
ii
~)
changes=O
maximum peaking value=i
if
tLhe
if valid
# all 1
co re iS
solution:
a
chng
the. same ei
id
iitsadffern
fere
afe
evat
t intaton
o
ing
eleen
Eh
Pt'-1 KiOI
in
spot
rif
it'
for location
in new core:
element name=new core[location]
if element name not in force keep:
if new core[location]!=old core[location]:
changes+=
else:
if new orientation[location]!=old orientation[location]:
changes+=1
full peak dict=dict(rad peakingB.itemso+rad peakingE.itemso)
maximum peaking value=max(full
peak dict..valueso)
178
#
return(valid solution,new orientation,maximumpeaking value,changes)
def
n(new
ri
core,old core,new orientations,
quation,core mass):
full
mass dict,radial
peaking e
mass peaking factors={}
#eermin
e mass peakcing factors
for location
in new core:
element=new core [location]
mass peaking
e))
factors[location]=fullmass
#determi ne the changes that
for location
in new core:
if new core[location]!=
#f Lt :he elementis
# therefore,
identify
dict[element]/(core mass/len(new cor
have been made to the Ioading pattern
old core[location]:
changed, either
minimum radial
r ienttion
peaking
is
orientat
fin
on
for these
elements
rad peaking _up=radialpeaking equation[location] [ '']
[location]+radial peaking equation[location][''1[1]
[J]*masspeaking
factors
rad peaking down=radial peaking equation [location] [
][J]*mass peaking facto
rs[location]+radial peakingequation[location] [' '][1]
if rad peaking up <= rad peaking down:
new orientations[location]=[False,new orientations[location][1]]
else:
new orientations[location]=[True,new orientations[location] [11]]
return(neworientations)
179
APPENDIX B - TRANSITION CORE FUEL SHUFFLING SCHEMES
180
Core
191 (8/25/09)
1
2
*
0
C3
C4
C6
C6
C7
C8
C9
4
5
6
7
Core
195 L
8
Core
197 L
13
14
Core
198 L
15
16
LEU-4 (f)
(new) LEU-10
LEU-4
(new)
(new)
(new) LEU-1
(new)
LEU-7
LEU-8
Core
199L
17
18
(new)
(new)
LEU-16
Core
200 L
19
20
Core
201 L
21
22
(new)
LEU-22
(new)
LEU-23
(new)
LEU-24
(new) LEU-19
LEU-17
(new) LEU-20
(new)
(new)
(f)
LEU-18
LEU-15
LEU12
(new) LEU-21
LEU-8 (f)
MIT-291 (C4)
MIT-49
(f)
(f)
R
LEW.4 (f)
MI T-296 (C12)
MIT-302
LEU-5 (f)
MIT-347
(f)
MIT-37
452.6
LEU-9 (f)
LEU-15 (f)
LEU-6 (f)
LEU-12 (f)
R
R
(f)
(f)
LEU-10 (f)
MIT-348
6284
4
37.86
103.32
27.86
0
3591
4.8
108.32
139.49
65.46
LEU-16 (f)
(f)
R
R
MIT-318
R
0
LEU-3 (f)
(f)MT2
R
32.86
LEU-2 (f)
MIT-347
MIT-336
MIT-343
2340
3.5
00
LEU-11 (f)
R
R
R
R
R
Cycle (days)
LEU-14
(new)
R
Net Time (days) 5.00
(new)
LEU-9
LEU-6
(new) LEU-3
0
LEU-13
(new) LEU-11
(new)
R
(f)
(f)
(new)
(new)
LEU-5
(new) LEU-2
C15
Burnup (MWh)
Power (MW)
10
451.6e MIT-351
(new)
C10
C11
C12
C13
C14
9
Core
196 L
11
12
Loading Pattern Changes
Location
A2
B1
B2
B4
6
B6
B7
B8
69
C1
C2
3
Core
194 L
Core
193 L
Core
192 L
LEU-13 (f)
LEU-1 (f)
0
3024.07
4.7
144.49
171.30
31.17
LEU-7 (f)
0
3198.8
4.6
176.30
205.27
26.81
0
5000
5
0
41.67
28.97
210.27
251.94 256.94
5000
5
0
5000
5
303.60
345.27
41.67
298.60
0
5000
5
350.27
391.94
41.67
0
5000
5
396.94
438.60
41.67
0
5000
5
443.60
485.27
41.67
41.67
Table B.2 Transition Core 2 Loading Pattern
Core
191 (8/25109)
1
2
Core
192 L
3
Core
193 L
4
5
Core
194 L
6
7
8
(new LEU)
(new LEU)
(new LEU)
(new LEU) ()
(new LEU) (f)
(new LEU)
(new LEU)
(new LEU) (f)
(f)
LEU-10
LEU-9
LEU-13
LEU-14
LEU-11
LEU-15
LEU-16
LEU-12
LEU 4
(new LEU)
(new LEU)
(new LEU)
(new LEU) (f)
(new LEU) (f)
(new LEU)
(new LEU)
(new LEU)
LEU I
LEU 17
LEU 18
LEU 19
LEU20
LEU 21
LEU22
LEU23
LEU24
(f)
LEU-10
(f)
LEU-7
(f)
LEU-9
(f)
LEU-8
(f)
LEU-13
(f)
LEU-5
(f)
LEU-14
(f)
LEU-2
(f)
MIT-347
LEU-1
(f)
LEU-11
LEU-12
LEU-15
(f)
LEU-6
(f), R
LEU-16
(f), R
LEU-3
Loading Pattern Changes
A2
B1
B2
B4
B5
B6
B7
B8
B9
C1
C2
C3
C4
CS
C6
C7
C8
R
(f)
NIIT-336
C9
(f)
MIT-343
CIO
C11
C12
C13
C14
C15
(new LEU)
(new LEU)
(new LEU)
(new LEU) (f)
(new LEU) (f)
(new LEU)
(new LEU)
(new LEU) (f), R
R
(f)
(f)
(f)
(f)
(f)
(f)
R
R
(f)
(f)
R
MIT-351
LEU-4
LEU-7
LEU-8
LEU-5
LEU-2
LEU-1
LEU-6
LEU-3
MIT-353
MIT-349
MIT-318
MIT-346
MIT-354
MIT-355
MIT-347
R
(f) R
(took out 297)
MIT-348
MIT-356
MIT-331
MIT-352
Burnup (MWh)
2340
10000
10000
10000
Power (MW)
Cycle (days)
3.5
27.86
6
69.44
6
69.44
6
69.44
Net Time (days)
5.00
32.86
37.86
107.30
112.30
182
181.75
186.75
256.19
-r
-
Core
Core
Core
19(/I2/)
1 1
2
192 L
193 L
-
3
4
5
j
Core
Core
194 L
195 L
78
6
10
9
Loading Pattern Changes
Location
A2
81
82
"0
B4
0
B6
B6
17
B8
B9
0
C1
C2
R
(f)
D
MIT-349
(
D
MIT-318
R
(f)
D
MIT-346
R
(f)
D
MIT-347
C3
0
C4
00
CS
CS
()
C7
C8
(f)
MIT-336
C9
(f)
MIT-343
R
C10
(f)
C11
(f)
D
R
(
U
LEU-6
(
D
MIT-354
U
LEU-7
MIT-348
U
R
MIT-355
It
D,R
U
C12
C13
D
U,R
C14
C16
MIT-356
MIT-331
(f), R
(f)
u
U,R
LEU-8
iEy.3II
Bumup (MWh)
2340
10000
10000
10000
Power (MW)
3.6
6
6
6
6
Cycle (days)
27.86
69.44
69.44
69.44
69.44
Net Time (days)
5.00
32.86
37.86
107.30
112.30
181.75
186.75
256.19
10000
219.52
330.63
.cE
Core
Core
Core
191 (8/25/09)
192 L
193 L
1
Location
A2
2
3
4
U
MIT-351
U
MIT-353
B2
B4
()R
D,R
B5
(f), R
D,R
B6
B7
B8
(new L5U)
B9
C1
C2
(new LEU) (f)
(f)
C4
R
8
9
c
"N
-~U
C
(riew LEU)
(new LEU)
U
LEU-4
(new LEU)
u
'LEU-5
U
LEU-9
(new LEU)
U
LEU-17
(new LEU)
U
LEU-18
(new LEU)
U
LEU-11
(new LEU)
U
LEU-19
(now LEU)(f)
D
LEU-12
(new LEU) (f)
D
LEU-20
0)
U
MIT-356
(new LEU)
D
LEU-6
(new LEU) (f)
D
LEU-21
C-
U
LEU-2
(new LEU)
U
LEU-7
(new LEU)
U
LEU-22
(new LEU)
U
LEU-23
(new LEU) (f)
D
LEU-24
(f
D
LEU-15
(f)
D
U
MIT-3"I54
VI
D
D
LEU-3
MIT-349
U
(new LEU) (f) D
(f) R
U,R
(f)
D
MIT-318
(f)
D
MIT-346
(f),R
R
C8
(f)
MlT-336
C9
(f)
MIT-343
C10
C11
(new LEU)
U
LEU-15
LEU-8
(f)
D
R
D,R
(f)
(f)
U
D
U
_a
(f)
D
LEU-4
(f
D
MIIT-352
M(f
D
LEU-5
0
CU
CU
LEU-9
-
U
Q)
0
MIT-348
D
R
U
MIT~335
U,R
C15
MIT-331
U,R
MIT-331
(f) R
D,R
MIT-356
R
DR
LEU-3
U
LEU-6
(f)
D
MIT-364
(f
D
LEU-11
U
LEU-12
0
(f)
D
LEU-7
(f)
D
MIT-353
(f), R
U,R
n,-
00
LEU-8
Burnup (MWh)
2340
10000
10000
10000
Power (MW)
3.5
6
6
6
6
Cycle (days)
27.86
69.44
69.44
69.44
69.44
5.00
32.86
37.86
107.30
112.30
181.75
u
E
(f)
LEU-2
MIT-347
C14
(/n
MIT-35
C12
Net Time (days)
0
10
a)
C7
C13
7
195 L
0 00
D,R
C5
C6
0-
6
R
C3
Core
194 L
Pattern Changes
LocaionLoading
B1
0
5
Core
186.75
256.19
10000
219.52
CU
-
Sa)
330.63
*
*
-c
0
Core
Core
191 (8/25/09)
1
2
Core
192 L
3
Core
193 L
4
5
Core
194 L
6
7
195 L
8
U
U
LEU-4
(new LEU) if)
D
LEU-5
MIT-356
(new LEU)
D,R
0
LEU-6
U r
LEU-
(new LEU)
u
LEU-
U
BD
MIT-354
new LEU) (f)
U
D
(f
D
MIT-349
(f) R
U,R
(f)
(f)
D
D
MIT-318
MIT-346
(f)
U
U
B2(new
LEU)
B4
(f),R
D,R
B5
B6
(f),R
D,R
U
B7
(nwLEU)
B8
C1
U4
0
LV
R
(new LEU)
U
LEU-17
(new LEU)
U
LEU-18
(new LEU)
U
LEU-11
(new LEU)
U
LEU-19
(new LEU) if
D
LEU-12
new LEU) (f)
D
LEU-20
new LEU) (f)
D
LEU-21
(new LEU)
U
LEU-22
(new LEU)
new LEU) (f)
U
D
LEU-23
LEU-24
(f)
D
LEU-15
LE-9
(new LEU
U
LEU-15
R
U,R
LEU-4
D
MIT-352
LEU8
C2(f)
C3
C4
D
(fY
D
E
W
0
0)
C6
C7
R
C8
(f)
MIT-336
C9
C10
C11
(f)
MIT-343
R
U
(f
D
U
(
u
LEU-6
(f)
D
MIT-354
MIT-347
(f) R
U,R
D,R
MIT-331
MIT-356
D,R
LEU-3
R
U,R
LEU-7
D
MIT-353
DR
LEU-8
C15
Burnup(MWh)
2340
10000
10000
10000
Power (MW)
3.5
6
6
6
U,R
Cycle (days)
27.86
5.00
32.86
MIT-331
R
69.44
37.86
107.30
69.44
112.30
181.75
0
C
0
LEU-11
D
LEU-12
-C
+
R
MIT-335
00
.$
(f)
LEU-2
C12
R
.x
MIT-355E
MIT-348
D,R
D
U
C2(f)
Net Time (days)
0
LEU-5
CS
C13
C14
0
MIT-351
e
0
10
Pattern Changes0
LoatonLoading
A2
0
9
O
u
C)
'n
10000
6
69.44
186.75
256.19
-0
C
69.44
219.52
330.63
Co
CO0
16
q-