Engy-4350: Nuclear Reactor Engineering Spring 2019 UMass Lowell; Prof. V. F. de Almeida 03Feb2019
$ \newcommand{\Amtrx}{\boldsymbol{\mathsf{A}}} \newcommand{\Bmtrx}{\boldsymbol{\mathsf{B}}} \newcommand{\Mmtrx}{\boldsymbol{\mathsf{M}}} \newcommand{\Imtrx}{\boldsymbol{\mathsf{I}}} \newcommand{\Pmtrx}{\boldsymbol{\mathsf{P}}} \newcommand{\Lmtrx}{\boldsymbol{\mathsf{L}}} \newcommand{\Umtrx}{\boldsymbol{\mathsf{U}}} \newcommand{\Smtrx}{\boldsymbol{\mathsf{S}}} \newcommand{\xvec}{\boldsymbol{\mathsf{x}}} \newcommand{\uvar}{\boldsymbol{u}} \newcommand{\fvar}{\boldsymbol{f}} \newcommand{\avec}{\boldsymbol{\mathsf{a}}} \newcommand{\bvec}{\boldsymbol{\mathsf{b}}} \newcommand{\cvec}{\boldsymbol{\mathsf{c}}} \newcommand{\rvec}{\boldsymbol{\mathsf{r}}} \newcommand{\mvec}{\boldsymbol{\mathsf{m}}} \newcommand{\gvec}{\boldsymbol{\mathsf{g}}} \newcommand{\zerovec}{\boldsymbol{\mathsf{0}}} \newcommand{\norm}[1]{\bigl\lVert{#1}\bigr\rVert} \newcommand{\transpose}[1]{{#1}^\top} \DeclareMathOperator{\rank}{rank} \newcommand{\Power}{\mathcal{P}} $
Refer to Notebook 02.
'''Function to build a list of atomic properties'''
def get_atoms(z_max=117):
'''
Build a list of atomic properties for all atoms of interest up to `z_max`.
Use the `mendeleev` package.
Parameters
----------
z_max: int, optional
Maximum Z number; default = 117.
Returns
-------
atoms: list(namedtuple)
List of namedtuples with names: name, Z, symbol, vdw_radius.
Examples
--------
'''
# Use the Mendeleev python package (periodic table of elements)
from mendeleev import element
from collections import namedtuple
Atom = namedtuple('Atom', ['name','Z','symbol','vdw_radius'])
atoms = list()
z_max = 96 # up to Curium
for i in range(z_max):
el = element(i+1)
#print('%20s vdw radius [pm] = %3.1f'%(e.name,round(e.vdw_radius,1)))
atm = Atom( name=el.name, Z=el.atomic_number, symbol=el.symbol, vdw_radius=el.vdw_radius )
atoms.append( atm )
#van_der_waals_radii
return atoms
'''Get a list of atoms Z <= 96 (Cm)'''
atoms = get_atoms(96)
'''Plot the van der Walls radii for all elements of interest'''
from matplotlib import pyplot as plt # import the pyplot function of the matplotlib package
(fig, ax) = plt.subplots(figsize=(18,6))
ax.plot(range(len(atoms)), [atm.vdw_radius for atm in atoms],
'-.',color='black', marker='*',markersize=12)
plt.xticks(range(0,len(atoms),2),[atm.symbol for atm in atoms][::2],rotation=0,fontsize=12)
ax.set_ylabel('vdW radius [pm]',fontsize=16)
ax.set_xlabel('Element',fontsize=16)
ax.xaxis.grid(True,linestyle='-',which='major',color='lightgrey',alpha=0.9)
# create a twin y axis to reconfigure the top x axis
ay1 = ax.twiny()
ay1.set_xlim(ax.get_xlim())
#ay1.xaxis.tick_top()
ay1.set_xticks([])
ay1.set_xticks(range(1,len(atoms),2),[atm.symbol for atm in atoms][1::2])
ay1.set_xticklabels([atm.symbol for atm in atoms][1::2],minor=True,fontsize=12)
#ax1.spines["top"].set_position(("axes", 2))
plt.show()
Let's compute the sizes of nuclei relative to the atom they are in. Using the IAEA search engine,
More fields
of the NUCLIDE Ground State
section,Z range
to 1, 96R
buttonSearch
buttonYou requested:
line to be 1 ≤ Z ≤96 ≤ R ≤
CSV
download button to save a table filenuclides-z1-to-z96.csv
.'''View the raw data'''
!cat data/nuclides-z1-to-z96.csv
'''Function to read the CSV data'''
def read_csv(file_name):
'''
Read csv data into a `pandas` data frame (table).
Parameters
----------
file_name: str, required
File name and its path relative to this notebook.
Returns
-------
df: pandas.df
`Pandas` data frame (table).
Examples
--------
'''
import pandas as pd
# read the data into a data frame (or table)
df = pd.read_csv(file_name)
#print(df) # uncomment for a screen output of the data
# plot the data directly from Pandas (quick check)
ax = df.plot(x='Z', y='radius',legend=False,
title='Nuclides Radii', fontsize=14, figsize=(18,6))
ax.set_ylabel('$r$ [fm]',fontsize=16)
ax.set_xlabel('Z',fontsize=16)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
ax.grid()
return df
'''Import the data as a Pandas table'''
df = read_csv('data/nuclides-z1-to-z96.csv')
Let's collect the important size data for all nuclides.
'''Function for creating a nuclide container'''
def get_nuclides( df ):
'''
Create a list of named tuple nuclides
Parameters
----------
df: pandas data frame, required
Table of data for nuclides.
Returns
-------
nuclides: list(namedtuple)
List of namedtuples. Names: name, Z, A, radius, unc.
Examples
--------
'''
nuclides = list()
# design a container data structure
from collections import namedtuple
Nuclide = namedtuple('Nuclide', ['name','Z','A','radius','unc'])
# fill in the list of containers
radius_misses = 0 # counter of nuclides without radius data
a_max = 0 # maximum A number with radius data present
z_max = 0 # maximum Z number with radius data present
import pandas as pd
for row in df.itertuples():
# note row[0] is the index
if pd.isnull(row[4]):
radius_misses += 1
continue
z = int(row[1])
n = int(row[2])
a = z+n
a_max = max(a,a_max)
z_max = max(z,z_max)
symbol = row[3]
nuc = Nuclide( name=row[3]+'-'+str(z+n), Z=z, A=a, radius=row[4], unc=int(row[5]) )
nuclides.append(nuc)
print('Number of nuclides with radius data = ',len(nuclides))
print('Number of nuclides without radius data = ',radius_misses)
print('')
print('Max Z number with radius data = ',z_max)
print('Max A number with radius data = ',a_max)
return (nuclides, z_max, a_max)
'''Create a list of nuclides'''
(nuclides, z_max, a_max) = get_nuclides( df )
Number of nuclides with radius data = 908 Number of nuclides without radius data = 2146 Max Z number with radius data = 96 Max A number with radius data = 248
Let's calculate and plot the geometric cross sectional area of the nuclei.
'''Plot the van der Walls radii for all elements of interest'''
import math
from matplotlib import pyplot as plt # import the pyplot function of the matplotlib package
fig, ax = plt.subplots(figsize=(18,6))
# plot the cross sectional area of the nuclei; 1 barn = 100 fm^2
ax.plot([nc.A for nc in nuclides], [math.pi*nc.radius**2/100 for nc in nuclides],
' ',color='green', marker='.',markersize=12)
ax.set_ylabel('Geometric Cross Sectional Area [b]',fontsize=16)
ax.set_xlabel('Nuclide A Number',fontsize=16)
fig.suptitle(r'%i Nuclides; $1 \leq Z \leq %i$; $1 \leq A \leq %i$ '%(len(nuclides),z_max,a_max),fontsize=20)
ax.grid()
plt.show()
If an atom is the size of a classroom, say 10 m in diameter, what would the corresponding values of the nuclei be?
'''Plot the classroom size nuclei diameter'''
import math
from matplotlib import pyplot as plt # import the pyplot function of the matplotlib package
fig, ax = plt.subplots(figsize=(18,6))
# plot the classroom-sized atom nuclide diameter for a classroom of 10-m diameter
ax.plot([nc.A for nc in nuclides], [2*nc.radius*1e-15 * 5.0/atoms[nc.Z-1].vdw_radius*1e+12 * 1e+6 for nc in nuclides],
' ',color='blue', marker='.',markersize=12)
ax.set_ylabel(' Classroom-Sized Nuclide Diameter [$\mu~m$]',fontsize=16)
ax.set_xlabel('Nuclide A Number',fontsize=16)
fig.suptitle(r'%i Nuclides; $1 \leq Z \leq %i$; $1 \leq A \leq %i$ '%(len(nuclides),z_max,a_max),fontsize=20)
ax.grid()
plt.show()
'''Plot the classroom size nuclei diameter'''
import math
from matplotlib import pyplot as plt # import the pyplot function of the matplotlib package
fig, ax = plt.subplots(figsize=(18,6))
ax.plot([nc.Z for nc in nuclides], [2*nc.radius*1e-15 * 5.0/atoms[nc.Z-1].vdw_radius*1e+12 * 1e+6 for nc in nuclides],
' ',color='blue', marker='.',markersize=12)
#plt.xticks(range(0,len([nc.Z for nc in nuclides]),2),[nc.Z for nc in nuclides][::2],rotation=0,fontsize=12)
ax.set_ylabel(' Classroom-Sized Nuclide Diameter [$\mu~m$]',fontsize=16)
ax.set_xlabel('Nuclide Z Number',fontsize=16)
# create a twin y axis to reconfigure the top x axis
ay1 = ax.twiny()
ay1.set_xlim(ax.get_xlim())
#ay1.xaxis.tick_top()
ay1.set_xticks([])
ay1.set_xticks(range(1,len(atoms),2),[atm.symbol for atm in atoms][::2])
ay1.set_xticklabels([atm.symbol for atm in atoms][::2],minor=True,fontsize=12)
#ax1.spines["top"].set_position(("axes", 2))
fig.suptitle(r'%i Nuclides $1 \leq Z \leq 96$'%(len(nuclides)),fontsize=20)
ax.grid()
plt.show()
This is a significant capture reaction emitting a prompt capture gamma ray (photon)
\begin{equation*} ^1_0\text{n} \ + \ ^{235}_{92}\text{U} \longrightarrow \ ^{236}_{92}\text{U}^* \overset{\approx 10^{-14}\,\text{s}}{\longrightarrow} \ ^{236}_{92}\text{U} \ + \ \gamma , \end{equation*}Note:
The microscopic cross section of this neutron interaction with the nuclide $^{235}_{92}\text{U}$ represents the probability of interaction measured in units of area; typical units are: cm$^2\times 10^{-24}$ or barn. Therefore it makes sense to compare against the geometric cross sectional area of the nuclide.
Acquiring cross section data and saving it to a file:
view evaluated data
and click on the Text
link to view the data in a two-column arrangement (energy versus cross section).u-235-sigma-c.dat
). Relocate the file in a directory data/
relative to this notebook.'''View the raw data'''
!cat data/u-235-sigma-g.dat
Importing and processing tabular data is readily done using the Pandas Python Package:
'''Visualize the data'''
# Pandas: python package for tabular data analysis
import pandas as pd
# read the data into a data frame (or table)
df = pd.read_csv('data/u-235-sigma-g.dat',
names=['energy [eV]','sigma_g [b]'],
skiprows=3)
#print(df) # uncomment for a screen output of the data
# plot the data directly from Pandas
ax = df.plot(loglog=True, x='energy [eV]', y='sigma_g [b]',legend=False,
title='Capture $\sigma_\gamma$ for $^{235}_{92}$U(n,$\gamma$)', figsize=(16,5))
ax.set(ylabel='$\sigma_\gamma$ [b]')
ax.grid()
To obtain a sense of how significant this reaction is, calculate the cross sectional area of the nucleus and compare with the radiative cross section in the plot.
for nc in nuclides:
if nc.name == 'U-235':
r_u235 = nc.radius
r_u235_unc = nc.unc
print('U-235 r [fm] = ',r_u235,r_u235_unc)
U-235 r [fm] = 5.8337 41
import math
area = math.pi * r_u235**2
print('nucleus geometric cross section area [b] = %5.5f'%(area/100)) # 1 barn = 100 fm^2
nucleus geometric cross section area [b] = 1.06915
From the radiative capture cross section data (plot): $\sigma_\gamma = 101.153$ b at $E=2.4\, 10^{-2}$ eV. Therefore the radiative cross section is
round(101.153/1.06915,1)
94.6
times greater than the nucleus geometric cross section. Note that $\sigma_\gamma\approx 1$ at $E\approx 10$ keV and this reaction is significant for a large extent of neutron energies.