BEAVRS/models/openmc/beavrs/materials.py

254 lines
9.2 KiB
Python
Executable file

#!/usr/bin/env python
# Packages
import os
from copy import copy
from collections import OrderedDict
import numpy as np
import openmc
from openmc.data import atomic_mass, atomic_weight
import beavrs.constants as c
MB10 = atomic_mass('B10')
MB11 = atomic_mass('B11')
MU234 = atomic_mass('U234')
MU235 = atomic_mass('U235')
MU238 = atomic_mass('U238')
def openmc_materials(ppm):
# Initialize openmc material dictionary
mats = OrderedDict()
##############################################
# Create materials that use natural abundances
##############################################
# Create air material
mats['Air'] = openmc.Material(name='Air')
mats['Air'].temperature = 300
mats['Air'].set_density('g/cc', 0.000616)
mats['Air'].add_element('O', 0.2095, 'ao')
mats['Air'].add_element('N', 0.7809, 'ao')
mats['Air'].add_element('Ar', 0.00933, 'ao')
mats['Air'].add_element('C', 0.00027, 'ao')
# Create stainless steel material
mats['SS304'] = openmc.Material(name='SS304')
mats['SS304'].temperature = 300
mats['SS304'].set_density('g/cc', 8.03)
mats['SS304'].add_element('Si', 0.0060, 'wo')
mats['SS304'].add_element('Cr', 0.1900, 'wo')
mats['SS304'].add_element('Mn', 0.0200, 'wo')
mats['SS304'].add_element('Fe', 0.6840, 'wo')
mats['SS304'].add_element('Ni', 0.1000, 'wo')
# Create Ag-In-Cd control rod material
mats['Ag-In-Cd'] = openmc.Material(name='Ag-In-Cd')
mats['Ag-In-Cd'].temperature = 300
mats['Ag-In-Cd'].set_density('g/cc', 10.16)
mats['Ag-In-Cd'].add_element('Ag', 0.80, 'wo')
mats['Ag-In-Cd'].add_element('In', 0.15, 'wo')
mats['Ag-In-Cd'].add_element('Cd', 0.05, 'wo')
# Create B4C control rod material
mats['B4C'] = openmc.Material(name='B4C')
mats['B4C'].temperature = 300
mats['B4C'].set_density('g/cc', 1.76)
mats['B4C'].add_element('B', 0.7826, 'wo')
mats['B4C'].add_element('C', 0.2174, 'wo')
# Create He gas gap material
mats['Helium'] = openmc.Material(name='Helium')
mats['Helium'].temperature = 300
mats['Helium'].set_density('g/cc', 0.0015981)
mats['Helium'].add_element('He', 1.0, 'wo')
# Create inconel 718 material
mats['Inconel 718'] = openmc.Material(name='Inconel 718')
mats['Inconel 718'].temperature = 300
mats['Inconel 718'].set_density('g/cc', 8.2)
mats['Inconel 718'].add_element('Si', 0.0035, 'wo')
mats['Inconel 718'].add_element('Cr', 0.1896, 'wo')
mats['Inconel 718'].add_element('Mn', 0.0087, 'wo')
mats['Inconel 718'].add_element('Fe', 0.2863, 'wo')
mats['Inconel 718'].add_element('Ni', 0.5119, 'wo')
# Create zircaloy 4 material
mats['Zircaloy 4'] = openmc.Material(name='Zircaloy 4')
mats['Zircaloy 4'].temperature = 300
mats['Zircaloy 4'].set_density('g/cc', 6.55)
mats['Zircaloy 4'].add_element('O', 0.00125, 'wo')
mats['Zircaloy 4'].add_element('Cr', 0.0010, 'wo')
mats['Zircaloy 4'].add_element('Fe', 0.0021, 'wo')
mats['Zircaloy 4'].add_element('Zr', 0.98115, 'wo')
mats['Zircaloy 4'].add_element('Sn', 0.0145, 'wo')
# Create carbon steel material
mats['Carbon Steel'] = openmc.Material(name='Carbon Steel')
mats['Carbon Steel'].temperature = 300
mats['Carbon Steel'].set_density('g/cc', 7.8)
mats['Carbon Steel'].add_element('C', 0.00270, 'wo')
mats['Carbon Steel'].add_element('Mn', 0.00750, 'wo')
mats['Carbon Steel'].add_element('P', 0.00025, 'wo')
mats['Carbon Steel'].add_element('S', 0.00025, 'wo')
mats['Carbon Steel'].add_element('Si', 0.00400, 'wo')
mats['Carbon Steel'].add_element('Ni', 0.00750, 'wo')
mats['Carbon Steel'].add_element('Cr', 0.00350, 'wo')
mats['Carbon Steel'].add_element('Mo', 0.00625, 'wo')
mats['Carbon Steel'].add_element('V', 0.00050, 'wo')
mats['Carbon Steel'].add_element('Nb', 0.00010, 'wo')
mats['Carbon Steel'].add_element('Cu', 0.00200, 'wo')
mats['Carbon Steel'].add_element('Ca', 0.00015, 'wo')
mats['Carbon Steel'].add_element('B', 0.00003, 'wo')
mats['Carbon Steel'].add_element('Ti', 0.00015, 'wo')
mats['Carbon Steel'].add_element('Al', 0.00025, 'wo')
mats['Carbon Steel'].add_element('Fe', 0.96487, 'wo')
##############################################
# Create special materials
##############################################
########## Enriched UO2 Fuel #################
# Specify enrichments to be calculated
enrs = [0.0161006, 0.0239993, 0.0310221, 0.0319547, 0.0340585]
dens = [10.31341, 10.29748, 10.30166, 10.34115, 10.35917]
# Loop around enrichments
for enr, den in zip(enrs, dens):
# Calculate molar mass of Uranium
enr_25 = enr
enr_24 = 0.008*enr_25
enr_28 = 1.0 - (enr_24 + enr_25)
MU = 1.0/(enr_24/MU234 + enr_25/MU235 + enr_28/MU238)
# Determine molar mass of UO2
MUO2 = MU + 2.0*atomic_weight('O')
# Compute weight percent of U in UO2
wUpUO2 = MU/MUO2
# Calculate Uranium atom fraction
a_U = wUpUO2*MUO2/MU
# Calculate Oxygen atom fraction
a_O = (1.0 - wUpUO2)*MUO2/atomic_weight('O')
# Create material
name = enr*100
mat_name = 'Fuel {0:1.1f}%'.format(name)
mats[mat_name] = openmc.Material(name=mat_name)
mats[mat_name].temperature = 300
mats[mat_name].set_density('g/cc', den)
mats[mat_name].add_element('O', a_O, 'ao')
mats[mat_name].add_element('U', a_U, 'ao', enrichment=enr*100)
########## Borosilicate Glass #################
# CASMO weight fractions
wO_bsg = 0.5481
wAl_bsg = 0.0344
wSi_bsg = 0.3787
wB10_bsg = 0.0071
wB11_bsg = 0.0317
# Molar mass of BSG
M_bsg = 1.0/(wO_bsg/atomic_weight('O') + wAl_bsg/atomic_weight('Al') + \
wSi_bsg/atomic_weight('Si') + wB10_bsg/MB10 + wB11_bsg/MB11)
# Compute atom fractions
aO_bsg = wO_bsg*M_bsg/atomic_weight('O')
aAl_bsg = wAl_bsg*M_bsg/atomic_weight('Al')
aSi_bsg = wSi_bsg*M_bsg/atomic_weight('Si')
aB10_bsg = wB10_bsg*M_bsg/MB10
aB11_bsg = wB11_bsg*M_bsg/MB11
# Create material
mats['Borosilicate Glass'] = openmc.Material(name='Borosilicate Glass')
mats['Borosilicate Glass'].temperature = 300
mats['Borosilicate Glass'].set_density('g/cc', 2.26)
mats['Borosilicate Glass'].add_element('O', aO_bsg, 'ao')
mats['Borosilicate Glass'].add_element('Si', aSi_bsg, 'ao')
mats['Borosilicate Glass'].add_element('Al', aAl_bsg, 'ao')
mats['Borosilicate Glass'].add_nuclide('B10', aB10_bsg, 'ao')
mats['Borosilicate Glass'].add_nuclide('B11', aB11_bsg, 'ao')
########## Borated Water #################
# Density of clean water at 2250 psia T=560F NIST
h2o_dens = 0.73986
# Compute weight percent of natural boron in borated water
wB_Bh2o = ppm*1.0e-6
# Borated water density
rho_Bh2o = h2o_dens/(1 - wB_Bh2o)
# Compute weight percent of clean water in borated water
wh2o_Bh2o = 1.0 - wB_Bh2o
# Compute molecular mass of clean water
M_h2o = 2*atomic_weight('H') + atomic_weight('O')
# Compute molecular mass of borated water
M_Bh2o = 1.0/(wB_Bh2o/atomic_weight('B') + wh2o_Bh2o/M_h2o)
# Compute atom fractions of boron and water
aB_Bh2o = wB_Bh2o*M_Bh2o/atomic_weight('B')
ah2o_Bh2o = wh2o_Bh2o*M_Bh2o/M_h2o
# Compute atom fractions of hydrogen
ah_Bh2o = 2.0*ah2o_Bh2o
aho_Bh2o = ah2o_Bh2o
# Create material
mats['Borated Water'] = openmc.Material(name='Borated Water')
mats['Borated Water'].temperature = 300
mats['Borated Water'].set_density('g/cc', rho_Bh2o)
mats['Borated Water'].add_element('B', aB_Bh2o, 'ao')
mats['Borated Water'].add_element('H', ah_Bh2o, 'ao')
mats['Borated Water'].add_element('O', aho_Bh2o, 'ao')
mats['Borated Water'].add_s_alpha_beta(name='c_H_in_H2O')
########## Nozzle / Support Plate Borated Materials #################
# Calculate volume of water and steel in Nozzle / Support Plate for a
# single assembly
Bh2o_spn_vol = c.latticePitch**2 - float(c.n_nozzle_pins)*np.pi*c.cladOR**2
ss_spn_vol = float(c.n_nozzle_pins)*np.pi*c.cladOR**2
# From ML033530020 volw/volss
Bh2o_vol_frac = c.nozzle_water_vol_frac
ss_vol_frac = c.nozzle_ss_vol_frac
Bh2o_spn_actualvol = (c.latticePitch**2)*Bh2o_vol_frac
ss_spn_actualvol = (c.latticePitch**2)*ss_vol_frac
# adjust density such that mass of water and steel are conserved
rho_Bh2o_spn = (rho_Bh2o * Bh2o_spn_actualvol) / Bh2o_spn_vol
rho_ss_spn = (8.03 * ss_spn_actualvol) / ss_spn_vol
# Create borated water
mats['Water SPN'] = openmc.Material(name='Water SPN')
mats['Water SPN'].set_density('g/cc', rho_Bh2o_spn)
mats['Water SPN'].add_element('B', aB_Bh2o, 'ao')
mats['Water SPN'].add_element('H', ah_Bh2o, 'ao')
mats['Water SPN'].add_element('O', aho_Bh2o, 'ao')
mats['Water SPN'].add_s_alpha_beta(name='c_H_in_H2O')
# Create stainless steel
mats['SS304 SPN'] = openmc.Material(name='SS SPN')
mats['SS304 SPN'].temperature = 300
mats['SS304 SPN'].set_density('g/cc', rho_ss_spn)
mats['SS304 SPN'].add_element('Si', 0.0060, 'wo')
mats['SS304 SPN'].add_element('Cr', 0.1900, 'wo')
mats['SS304 SPN'].add_element('Mn', 0.0200, 'wo')
mats['SS304 SPN'].add_element('Fe', 0.6840, 'wo')
mats['SS304 SPN'].add_element('Ni', 0.1000, 'wo')
return mats