Skip to content
scipython.com

Manufacturing Cobalt-60

Posted on

Lecture 12 of the MIT course 22.01: Introduction to Nuclear Engineering and Ionizing Radiation covers the manufacture of \(\mathrm{^{60}Co}\) by neutron irradiation of \(\mathrm{^{59}Co}\) in a research reactor. The thermal neutron absorption cross section of \(\mathrm{^{59}Co}\) is \(\sigma_0 \approx 20 \; \mathrm{barn}\), so for a neutron flux \(\Phi\), the rate of change of the number of \(\mathrm{^{59}Co}\) nuclei, \(N_0\), may be written

\[\frac{\mathrm{d}N_0}{\mathrm{d}t} = -\sigma_0 \Phi N_0 \quad\Rightarrow N_0(t) = N_0(0)\mathrm{e}^{-\sigma_0\Phi t}\]

The \(\mathrm{^{60}Co}\) nuclei produced in this process undergo natural beta-decay with a half-life \(t_{1/2} = 1925.4\;\mathrm{days}\) to the stable isotope, \(\mathrm{^{60}Ni}\), and, potentially, neutron absorption with a cross section \(\sigma_1\). Denoting the number of \(\mathrm{^{60}Ni}\) as \(N_1\):

\[\frac{\mathrm{d}N_1}{\mathrm{d}t} = \sigma_0 \Phi N_0 - \sigma_1 \Phi N_1 - \lambda_1 N_1,\]

where \(\lambda_1 = \ln 2 / t_{1/2}\). This differential equation can be solved with the introduction of the integrating factor \(\exp[(\sigma_1\Phi + \lambda_1)t]\) since:

\[\begin{align*} & \exp[(\sigma_1\Phi + \lambda_1)t]\frac{\mathrm{d}N_1}{\mathrm{d}t} + (\sigma_1 \Phi + \lambda_1) N_1\exp[(\sigma_1\Phi + \lambda_1)t] = \sigma_0 \Phi N_0\exp[(\sigma_1\Phi + \lambda_1)t]\\ \Rightarrow \quad& \frac{\mathrm{d}}{\mathrm{d}t}\left[ \exp[(\sigma_1\Phi + \lambda_1)t] N_1 \right] = \sigma_0 \Phi N_0(0)\exp[(\sigma_1\Phi - \sigma_0\Phi + \lambda_1)t] \\ \Rightarrow \quad & \exp[(\sigma_1\Phi + \lambda_1)t] N_1(t) = \frac{\sigma_0 \Phi N_0(0)}{\sigma_1\Phi - \sigma_0\Phi + \lambda_1}\left[ \exp[(\sigma_1\Phi - \sigma_0\Phi + \lambda_1)t] - 1 \right]\\ \Rightarrow \quad & N_1(t) = \frac{\sigma_0 \Phi N_0(0)}{\sigma_1\Phi - \sigma_0\Phi + \lambda_1}\left[\exp(- \sigma_0\Phi t) - \exp[-(\sigma_1\Phi + \lambda_1)t] \right]. \end{align*}\]

(There appears to be a sign error in the videoed lecture for this derivation).

In principle, the \(\mathrm{^{60}Ni}\) could capture a neutron as well, but the cross section for this process is rather small.

This Jupyter Notebook calculates and plots the amounts of these isotopes as a function of time in a reactor with isotropic neutron flux, \(\Phi = 10^{14}\;\mathrm{n\,cm^{-2}\,s^{-1}}\), and determines the maximum amount of \(\mathrm{^{60}Co}\) created from an initial amount of 100 g of \(\mathrm{^{59}Co}\). \(\sigma_1\) is small and taken to be 0.

import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
from scipy.constants import N_A

# Neutron absorption cross section for 59Co, cm2.
sigma0 = 20 * 1.e-24
# Neutron absorption cross section for 60Co.
sigma1 = 0

# Half-life (days) and decay constant for 60Co, s-1.
thalf1 = 1925.4
lam1 = np.log(2) / (thalf1 * 24 * 60 * 60)

# Neutron flux, cm2.s-1.
Phi = 1.e14
# Mass of 59Co sample, g.
m59Co = 100
# Atomic mass of 59Co, Da.
M59Co = 58.9
# Number of 59Co atoms
N00 = m59Co / M59Co * N_A

def N0(t):
    """Amount of 59Co as a function of time."""
    return N00 * np.exp(-sigma0 * Phi * t)

def N1(t):
    """Amount of 60Co as a function of time."""
    d = Phi * (sigma1 - sigma0) + lam1
    return sigma0 * Phi * N00 / d * (np.exp(-sigma0*Phi*t) - np.exp(-(sigma1*Phi + lam1)*t))

def N2(t):
    """Amount of 60Ni as a function of time."""
    return N00 - N0(t) - N1(t)

def dN1dt(t):
    """Rate of change of 60Co as a function of time."""
    return sigma0 * Phi * N0(t) - N1(t) * (sigma1 * Phi + lam1)

# Plot the isotope amounts up to tmax seconds.
tmax = 3.e9
t = np.linspace(0, tmax, 1000)
plt.plot(t, N0(t), label='$\mathrm{^{59}Co}$')
plt.plot(t, N1(t), label='$\mathrm{^{60}Co}$')
plt.plot(t, N2(t), label='$\mathrm{^{60}Ni}$')
plt.xlabel('$t$ /s')
plt.ylabel('$N$ /atoms')

enter image description here

The problem set associated with the course also suggests finding the optimum amount of time to irradiate the \(\mathrm{^{59}Co}\) to maximise the profit from the \(\mathrm{^{60}Co}\) generated, assuming a reactor time cost of USD 1000 per day and a \(\mathrm{^{60}Co}\) price of USD 100 per \(\mathrm{\mu Ci}\).

# Cost of reactor, USD.s-1.
CR = 1.e3 / 24 / 60 / 60
# Price of 60Co, Bq-1.
CI = 100 * 1.e6 / 3.7e10

def I(t):
    """The predicted net income from the 60Co after time t in the reactor (USD)."""
    # Calculate the activity of 60Co as A1 = lam1.N1.
    return -CR * t + CI * lam1 * N1(t)

def dIdt(t):
    """dI/dt in USD/sec."""
    return -CR + CI * lam1 * dN1dt(t)

The maximum profit can be found as the minimum of \(-I\).

from scipy.optimize import minimize
minimize(lambda t: -I(t), 0.5e9, jac = lambda t:-dIdt(t))

      fun: -2806888567702.389
 hess_inv: array([[42765.86838808]])
      jac: array([-7.46765967e-06])
  message: 'Optimization terminated successfully.'
     nfev: 21
      nit: 6
     njev: 21
   status: 0
  success: True
        x: array([3.38753637e+08])

This turns out to be the same time as would produce the maximum amount of \(\mathrm{^{60}Co}\) possible, presumably because USD 1000 per day is an unrealistically cheap cost for the reactor time during production and omits other considerations (such as isotopic separation and opportunity costs).

topt = 3.388e8 / 60 / 60 / 24 / 365
print(f'{topt:.1f} yrs')

10.7 yrs