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-