From 9ea73dbce395723cff54736053065b996e3e8c38 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 19 Jun 2019 12:50:18 -0500 Subject: [PATCH 1/5] Update cladding material, default temperature, water density, boron level --- smr/build-assembly.py | 10 ++++++++-- smr/build-core-fresh.py | 9 ++++++++- smr/smr/__init__.py | 6 ++++++ smr/smr/materials.py | 29 +++++++++++++++++------------ smr/smr/pins.py | 2 +- 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/smr/build-assembly.py b/smr/build-assembly.py index ad1fb03..2970847 100644 --- a/smr/build-assembly.py +++ b/smr/build-assembly.py @@ -12,6 +12,7 @@ from smr.materials import materials from smr.surfaces import surfs, lattice_pitch, bottom_fuel_stack, top_active_core from smr.assemblies import assembly_universes from smr.plots import assembly_plots +from smr import inlet_temperature # Define command-line options @@ -100,9 +101,14 @@ settings.particles = 10000 settings.output = {'tallies': False, 'summary': False} settings.source = source settings.sourcepoint_write = False - +settings.temperature = { + 'default': inlet_temperature, + 'method': 'interpolation', + 'range': (300.0, 1500.0), +} if args.multipole: - settings.temperature = {'multipole': True, 'tolerance': 1000} + settings.temperature['multipole'] = True + settings.temperature['tolerance'] = 1000 settings.export_to_xml(str(directory / 'settings.xml')) diff --git a/smr/build-core-fresh.py b/smr/build-core-fresh.py index b53fd4f..6908b23 100644 --- a/smr/build-core-fresh.py +++ b/smr/build-core-fresh.py @@ -13,6 +13,7 @@ from smr.materials import materials from smr.plots import core_plots from smr.surfaces import lattice_pitch, bottom_fuel_stack, top_active_core from smr.core import core_geometry +from smr import inlet_temperature def clone(mat): @@ -88,8 +89,14 @@ settings.output = {'tallies': False, 'summary': False} settings.source = source settings.sourcepoint_write = False +settings.temperature = { + 'default': inlet_temperature, + 'method': 'interpolation', + 'range': (300.0, 1500.0), +} if args.multipole: - settings.temperature = {'multipole': True, 'tolerance': 1000} + settings.temperature['multipole'] = True + settings.temperature['tolerance'] = 1000 settings.export_to_xml(str(directory / 'settings.xml')) diff --git a/smr/smr/__init__.py b/smr/smr/__init__.py index e69de29..027517e 100644 --- a/smr/smr/__init__.py +++ b/smr/smr/__init__.py @@ -0,0 +1,6 @@ +_MPA_PER_PSIA = 0.0068947572931683625 + +# Values from ML17013A274, Table 4.1-1 +inlet_temperature = (497 - 32)*5/9 + 273.15 +core_average_temperature = (543 - 32)*5/9 + 273.15 +system_pressure = 1850*_MPA_PER_PSIA diff --git a/smr/smr/materials.py b/smr/smr/materials.py index 8487b3a..9f718f9 100644 --- a/smr/smr/materials.py +++ b/smr/smr/materials.py @@ -1,7 +1,9 @@ """Instantiate the OpenMC Materials needed by the core model.""" import openmc -from openmc.data import atomic_weight, atomic_mass +from openmc.data import atomic_weight, atomic_mass, water_density + +from . import system_pressure, core_average_temperature _DEPLETION_NUCLIDES = [ @@ -41,13 +43,11 @@ mats = {} # Create He gas material for fuel pin gap mats['He'] = openmc.Material(name='Helium') -mats['He'].temperature = 300 mats['He'].set_density('g/cc', 0.0015981) mats['He'].add_element('He', 1.0, 'ao') # Create air material for instrument tubes mats['Air'] = openmc.Material(name='Air') -mats['Air'].temperature = 300 mats['Air'].set_density('g/cc', 0.00616) mats['Air'].add_element('O', 0.2095, 'ao') mats['Air'].add_element('N', 0.7809, 'ao') @@ -56,7 +56,6 @@ mats['Air'].add_element('C', 0.00027, 'ao') # Create inconel 718 material mats['In'] = openmc.Material(name='Inconel') -mats['In'].temperature = 300 mats['In'].set_density('g/cc', 8.2) mats['In'].add_element('Si', 0.0035, 'wo') mats['In'].add_element('Cr', 0.1896, 'wo') @@ -66,7 +65,6 @@ mats['In'].add_element('Ni', 0.5119, 'wo') # Create stainless steel material mats['SS'] = openmc.Material(name='SS304') -mats['SS'].temperature = 300 mats['SS'].set_density('g/cc', 8.03) mats['SS'].add_element('Si', 0.0060, 'wo') mats['SS'].add_element('Cr', 0.1900, 'wo') @@ -76,7 +74,6 @@ mats['SS'].add_element('Ni', 0.1000, 'wo') # Create carbon steel material mats['CS'] = openmc.Material(name='Carbon Steel') -mats['CS'].temperature = 300 mats['CS'].set_density('g/cc', 7.8) mats['CS'].add_element('C', 0.00270, 'wo') mats['CS'].add_element('Mn', 0.00750, 'wo') @@ -97,7 +94,6 @@ mats['CS'].add_element('Fe', 0.96487, 'wo') # Create zircaloy 4 material mats['Zr'] = openmc.Material(name='Zircaloy-4') -mats['Zr'].temperature = 300 mats['Zr'].set_density('g/cc', 6.55) mats['Zr'].add_element('O', 0.00125, 'wo') mats['Zr'].add_element('Cr', 0.0010, 'wo') @@ -105,9 +101,18 @@ mats['Zr'].add_element('Fe', 0.0021, 'wo') mats['Zr'].add_element('Zr', 0.98115, 'wo') mats['Zr'].add_element('Sn', 0.0145, 'wo') +# Create M5 alloy material +m5_niobium = 0.01 # http://publications.jrc.ec.europa.eu/repository/bitstream/JRC100644/lcna28366enn.pdf +m5_oxygen = 0.00135 # http://publications.jrc.ec.europa.eu/repository/bitstream/JRC100644/lcna28366enn.pdf +m5_density = 6.494 # 10.1039/C5DT03403E +mats['M5'] = openmc.Material(name='M5') +mats['M5'].add_element('Zr', 1.0 - m5_niobium - m5_oxygen) +mats['M5'].add_element('Nb', m5_niobium) +mats['M5'].add_element('O', m5_oxygen) +mats['M5'].set_density('g/cm3', m5_density) + # Create Ag-In-Cd control rod material mats['AIC'] = openmc.Material(name='Ag-In-Cd') -mats['AIC'].temperature = 300 mats['AIC'].set_density('g/cc', 10.16) mats['AIC'].add_element('Ag', 0.80, 'wo') mats['AIC'].add_element('In', 0.15, 'wo') @@ -116,10 +121,11 @@ mats['AIC'].add_element('Cd', 0.05, 'wo') #### Borated Water -boron_ppm = 975 +# Concentration of boron at beginning of equilibrium cycle +boron_ppm = 1240 # ML17013A274, Figure 4.3-17 -# Density of clean water at 2250 psia T=560F NIST -h2o_dens = 0.73986 +# Density of water +h2o_dens = water_density(core_average_temperature, system_pressure) # Weight percent of natural boron in borated water wB_Bh2o = boron_ppm * 1.0e-6 @@ -146,7 +152,6 @@ aho_Bh2o = ah2o_Bh2o # Create borated water for coolant / moderator mats['H2O'] = openmc.Material(name='Borated Water') -mats['H2O'].temperature = 300 mats['H2O'].set_density('g/cc', rho_Bh2o) mats['H2O'].add_element('B', aB_Bh2o, 'ao') mats['H2O'].add_element('H', ah_Bh2o, 'ao') diff --git a/smr/smr/pins.py b/smr/smr/pins.py index c2620f1..03aeb0a 100644 --- a/smr/smr/pins.py +++ b/smr/smr/pins.py @@ -743,7 +743,7 @@ def pin_universes(num_rings=10, num_axial=196, depleted=False): fuel_fill = mats['UO2 1.6 {}'.format(fuel)] outside_pin_surfaces = [surfs['clad IR'], surfs['clad OR']] - outside_pin_mats = [mats['He'], mats['Zr'], mats['H2O']] + outside_pin_mats = [mats['He'], mats['M5'], mats['H2O']] univs['Outside pin'] = make_pin( 'Outside pin', From 9a24a5c4f5085e4f3ca4671447be657036210ac9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 24 Jul 2019 21:53:06 -0500 Subject: [PATCH 2/5] Use RPV dimensions from NuScale DCA --- smr/smr/surfaces.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smr/smr/surfaces.py b/smr/smr/surfaces.py index a139b1e..bae7309 100644 --- a/smr/smr/surfaces.py +++ b/smr/smr/surfaces.py @@ -79,8 +79,8 @@ top_nozzle_width = 8.406*INCHES # ML17013A274, Figure 4.2-2 core_barrel_IR = 74*INCHES/2 # ML17013A274, Table 4.1-2 core_barrel_OR = 78*INCHES/2 # ML17013A274, Table 4.1-2 neutron_shield_OR = core_barrel_OR + 2.0 -rpv_IR = 120.0 # Estimate? -rpv_OR = 135.0 # Estimate? +rpv_IR = 96.5*INCHES/2 # ML17013A274, Table 5.3-1 +rpv_OR = 105*INCHES/2 # ML17013A274, Table 5.3-1 # axial parameters lowest_extent = 0.000 From 2d88d33730bdce8fd83d88d27dd0f2e699392b6c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 24 Jul 2019 21:54:12 -0500 Subject: [PATCH 3/5] Add ability to change reference z value --- smr/smr/surfaces.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/smr/smr/surfaces.py b/smr/smr/surfaces.py index bae7309..5a53ef2 100644 --- a/smr/smr/surfaces.py +++ b/smr/smr/surfaces.py @@ -40,7 +40,7 @@ clad_OR = 0.374*INCHES/2 # ML17013A274, Table 4.1-2 active_fuel_length = 78.74*INCHES # ML17013A274, Figure 4.2-10 plenum_length = 5.311*INCHES # ML17013A274, Figure 4.2-10 fuel_rod_length = 85.00*INCHES # ML17013A274, Table 4.1-2 -lower_end_cap = 0.575*INCHES # ML17007A001, Table 3-2 +lower_end_cap_length = 0.575*INCHES # ML17007A001, Table 3-2 # pin cell parameters guide_tube_IR = 0.450*INCHES/2 # ML17013A274, Table 4.1-2 @@ -83,15 +83,16 @@ rpv_IR = 96.5*INCHES/2 # ML17013A274, Table 5.3-1 rpv_OR = 105*INCHES/2 # ML17013A274, Table 5.3-1 # axial parameters -lowest_extent = 0.000 -bottom_support_plate = 20.000 -top_support_plate = 25.000 -bottom_lower_nozzle = 25.000 -top_lower_nozzle = 35.160 -bottom_fuel_rod = 35.160 -top_lower_thimble = 36.007 -bottom_fuel_stack = 36.007 -bot_burn_abs = 41.087 +reference_z = 0.0 +lowest_extent = reference_z +bottom_support_plate = lowest_extent + 20.000 +top_support_plate = bottom_support_plate + 5.000 +bottom_lower_nozzle = bottom_support_plate + 5.000 +top_lower_nozzle = bottom_lower_nozzle + 4.0*INCHES +bottom_fuel_rod = bottom_lower_nozzle + 4.0*INCHES +top_lower_thimble = bottom_fuel_rod + lower_end_cap_length +bottom_fuel_stack = bottom_fuel_rod + lower_end_cap_length +bot_burn_abs = bottom_fuel_stack + 2.0*INCHES top_active_core = bottom_fuel_stack + active_fuel_length top_plenum = top_active_core + plenum_length top_fuel_rod = bottom_fuel_rod + fuel_rod_length @@ -170,13 +171,13 @@ surfs['IT OR'] = copy.deepcopy(surfs['BA IR 6']) # Rectangular prisms for grid spacers surfs['rod grid box'] = \ - openmc.get_rectangular_prism(rod_grid_side, rod_grid_side) + openmc.rectangular_prism(rod_grid_side, rod_grid_side) # Rectangular prisms for lattice grid sleeves surfs['lat grid box inner'] = \ - openmc.get_rectangular_prism(17.*pin_pitch, 17.*pin_pitch) + openmc.rectangular_prism(17.*pin_pitch, 17.*pin_pitch) surfs['lat grid box outer'] = \ - openmc.get_rectangular_prism(grid_strap_side, grid_strap_side) + openmc.rectangular_prism(grid_strap_side, grid_strap_side) surfs['bot support plate'] = openmc.ZPlane( z0=bottom_support_plate, name='bot support plate') From 7e8feea6b193f9c2cbcad7bdfc2d0de6051c0170 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 24 Jul 2019 21:54:43 -0500 Subject: [PATCH 4/5] Use SS 302 for the plenum spring, M5 for end plugs --- smr/smr/materials.py | 9 +++++++++ smr/smr/pins.py | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/smr/smr/materials.py b/smr/smr/materials.py index 9f718f9..989bda5 100644 --- a/smr/smr/materials.py +++ b/smr/smr/materials.py @@ -63,6 +63,15 @@ mats['In'].add_element('Mn', 0.0087, 'wo') mats['In'].add_element('Fe', 0.2863, 'wo') mats['In'].add_element('Ni', 0.5119, 'wo') +# Create stainless steel 302 +mats['SS302'] = openmc.Material(name='SS302') +mats['SS302'].set_density('g/cm3', 7.86) +mats['SS302'].add_element('Si', 0.01, 'wo') +mats['SS302'].add_element('Cr', 0.18, 'wo') +mats['SS302'].add_element('Mn', 0.02, 'wo') +mats['SS302'].add_element('Fe', 0.70, 'wo') +mats['SS302'].add_element('Ni', 0.09, 'wo') + # Create stainless steel material mats['SS'] = openmc.Material(name='SS304') mats['SS'].set_density('g/cc', 8.03) diff --git a/smr/smr/pins.py b/smr/smr/pins.py index 03aeb0a..676fc8a 100644 --- a/smr/smr/pins.py +++ b/smr/smr/pins.py @@ -674,16 +674,16 @@ def pin_universes(num_rings=10, num_axial=196, depleted=False): univs['end plug'] = make_pin( 'end plug', [surfs['clad OR']], - [mats['Zr'], mats['H2O']]) + [mats['M5'], mats['H2O']]) univs['pin plenum'] = make_pin( 'pin plenum', surfaces=[surfs['plenum spring OR'], surfs['clad IR'], surfs['clad OR']], - materials=[mats['In'], + materials=[mats['SS302'], mats['He'], - mats['Zr'], + mats['M5'], mats['H2O']]) univs['pin plenum grid (intermediate)'] = make_pin( From 6fd5188890859cd069d22c27e8255cd7ab6147ce Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 24 Jul 2019 22:16:54 -0500 Subject: [PATCH 5/5] Remove neutron shields, which don't exist for NuScale model --- smr/smr/core.py | 67 +------------------------------------------------ 1 file changed, 1 insertion(+), 66 deletions(-) diff --git a/smr/smr/core.py b/smr/smr/core.py index 4d80fbf..aef9444 100644 --- a/smr/smr/core.py +++ b/smr/smr/core.py @@ -133,75 +133,10 @@ def core_geometry(num_rings, num_axial, depleted): +surfs['lower bound'] & -surfs['upper bound']) root_univ.add_cell(cell) - # Neutron shield panels - cell = openmc.Cell(name='neutron shield panel NW') - cell.fill = mats['SS'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - +surfs['neutron shield NWbot SEtop'] & - -surfs['neutron shield NWtop SEbot'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel N') - cell.fill = mats['H2O'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - +surfs['neutron shield NWtop SEbot'] & - -surfs['neutron shield NEtop SWbot'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel SE') - cell.fill = mats['SS'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - -surfs['neutron shield NWbot SEtop'] & - +surfs['neutron shield NWtop SEbot'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel E') - cell.fill = mats['H2O'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - +surfs['neutron shield NWbot SEtop'] & - +surfs['neutron shield NEbot SWtop'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel NE') - cell.fill = mats['SS'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - +surfs['neutron shield NEbot SWtop'] & - -surfs['neutron shield NEtop SWbot'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel S') - cell.fill = mats['H2O'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - -surfs['neutron shield NWtop SEbot'] & - +surfs['neutron shield NEtop SWbot'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel SW') - cell.fill = mats['SS'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - -surfs['neutron shield NEbot SWtop'] & - +surfs['neutron shield NEtop SWbot'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - - cell = openmc.Cell(name='neutron shield panel W') - cell.fill = mats['H2O'] - cell.region = (+surfs['core barrel OR'] & -surfs['neutron shield OR'] & - -surfs['neutron shield NWbot SEtop'] & - -surfs['neutron shield NEbot SWtop'] & - +surfs['lower bound'] & -surfs['upper bound']) - root_univ.add_cell(cell) - # Downcomer cell = openmc.Cell(name='downcomer') cell.fill = mats['H2O'] - cell.region = (+surfs['neutron shield OR'] & -surfs['RPV IR'] & + cell.region = (+surfs['core barrel OR'] & -surfs['RPV IR'] & +surfs['lower bound'] & -surfs['upper bound']) root_univ.add_cell(cell)