\section*{Problem 2}

\subsubsection*{Cross-Section Data}

Two-group cross-section data stored in Python dictionary:

\begin{lstlisting}[language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    commentstyle=\color{gray},
    stringstyle=\color{red},
    showstringspaces=false,
    numbers=left,
    numberstyle=\tiny,
    frame=single,
    breaklines=true]
import numpy as np

cross_sections = {
    'fast': {
        'D': 1.4,                    # Diffusion constant [cm]
        'Sigma_a': 0.010,            # Absorption [cm^-1]
        'Sigma_s': 0.050,            # Scattering from fast to thermal [cm^-1]
        'nu_Sigma_f': 0.000,         # nu*Sigma_f [cm^-1]
        'chi': 1,                    # Fission spectrum
        'v': 1.8e7,                  # Average group velocity [cm/sec]
    },
    'thermal': {
        'D': 0.35,                   # Diffusion constant [cm]
        'Sigma_a': 0.080,            # Absorption [cm^-1]
        'Sigma_s': 0.0,              # Scattering from thermal to fast [cm^-1]
        'nu_Sigma_f': 0.125,         # nu*Sigma_f [cm^-1]
        'chi': 0,                    # Fission spectrum
        'v': 2.2e5,                  # Average group velocity [cm/sec]
    }
}

# Extract variables for easy access
D_fast = cross_sections['fast']['D']
D_thermal = cross_sections['thermal']['D']
Sigma_a_fast = cross_sections['fast']['Sigma_a']
Sigma_a_thermal = cross_sections['thermal']['Sigma_a']
Sigma_s_fast = cross_sections['fast']['Sigma_s']
nu_Sigma_f_fast = cross_sections['fast']['nu_Sigma_f']
nu_Sigma_f_thermal = cross_sections['thermal']['nu_Sigma_f']
\end{lstlisting}

\subsection*{Part A}

\subsubsection*{Python Code}
\begin{lstlisting}[language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    commentstyle=\color{gray},
    stringstyle=\color{red},
    showstringspaces=false,
    numbers=left,
    numberstyle=\tiny,
    frame=single,
    breaklines=true]
# Four-Factor Formula: k_inf = epsilon * p * f * eta

# Fast fission factor: epsilon = 1 (no fast fissions)
epsilon = 1.0

# Resonance escape probability
p = Sigma_s_fast / (Sigma_a_fast + Sigma_s_fast)

# Thermal utilization factor: f = 1 (single-region)
f = 1.0

# Reproduction factor
eta = nu_Sigma_f_thermal / Sigma_a_thermal

# Four-Factor Formula
k_inf = epsilon * p * f * eta

print(f"k_inf = epsilon * p * f * eta = {k_inf:.4f}")
\end{lstlisting}

\subsubsection*{Solution}

The infinite multiplication factor is calculated using the \textbf{Four-Factor Formula}:

\[k_\infty = \varepsilon \cdot p \cdot f \cdot \eta\]

where:
\begin{itemize}
    \item $\varepsilon$ = fast fission factor (neutrons from fast fissions per thermal fission)
    \item $p$ = resonance escape probability (fraction of fast neutrons reaching thermal energies)
    \item $f$ = thermal utilization factor (fraction of thermal neutrons absorbed in fuel)
    \item $\eta$ = reproduction factor (neutrons produced per thermal neutron absorbed in fuel)
\end{itemize}

\textbf{Given cross-sections:}
\begin{itemize}
    \item $\nu\Sigma_{f,fast}$ = 0.000 cm$^{-1}$ (no fast fissions)
    \item $\nu\Sigma_{f,thermal}$ = 0.125 cm$^{-1}$
    \item $\Sigma_{a,fast}$ = 0.010 cm$^{-1}$
    \item $\Sigma_{a,thermal}$ = 0.080 cm$^{-1}$
    \item $\Sigma_{s,fast}$ = 0.050 cm$^{-1}$ (scattering from fast to thermal)
\end{itemize}

\textbf{Calculating each factor:}

\textbf{1. Fast fission factor:}
\[\varepsilon = 1.0000 \quad \text{(no fast fissions since } \nu\Sigma_{f,fast} = 0\text{)}\]

\textbf{2. Resonance escape probability:}
\[p = \frac{\Sigma_{s,fast}}{\Sigma_{a,fast} + \Sigma_{s,fast}} = \frac{0.050}{0.010 + 0.050} = \frac{0.050}{0.060} = 0.8333\]

\textbf{3. Thermal utilization factor:}
\[f = 1.0000 \quad \text{(single-region, homogeneous medium)}\]

\textbf{4. Reproduction factor:}
\[\eta = \frac{\nu\Sigma_{f,thermal}}{\Sigma_{a,thermal}} = \frac{0.125}{0.080} = 1.5625\]

\textbf{Final calculation:}
\[k_\infty = \varepsilon \cdot p \cdot f \cdot \eta = 1.0000 \times 0.8333 \times 1.0000 \times 1.5625 = 1.3021\]

\[\boxed{k_\infty = 1.302}\]

\subsection*{Part B}

\subsubsection*{Python Code}
\begin{lstlisting}[language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    commentstyle=\color{gray},
    stringstyle=\color{red},
    showstringspaces=false,
    numbers=left,
    numberstyle=\tiny,
    frame=single,
    breaklines=true]
# Calculate diffusion lengths
# L^2_fast = D_fast / Sigma_total_fast
# where Sigma_total_fast = Sigma_a_fast + Sigma_s_fast (removal from fast group)
Sigma_total_fast = Sigma_a_fast + Sigma_s_fast
L_squared_fast = D_fast / Sigma_total_fast

# L^2_th = D_th / Sigma_a_th
L_squared_th = D_thermal / Sigma_a_thermal

L_fast = np.sqrt(L_squared_fast)
L_thermal = np.sqrt(L_squared_th)

print(f"L_fast = {L_fast:.3f} cm")
print(f"L_thermal = {L_thermal:.3f} cm")
\end{lstlisting}

\subsubsection*{Solution}

The diffusion lengths for each group are calculated as:

\[L^2 = \frac{D}{\Sigma_{removal}}\]

\textbf{Fast Group:}

The removal cross-section includes both absorption and scattering out:
\[\Sigma_{removal,fast} = \Sigma_{a,fast} + \Sigma_{s,fast} = 0.010 + 0.050 = 0.060 \text{ cm}^{-1}\]

\[L^2_{fast} = \frac{D_{fast}}{\Sigma_{removal,fast}} = \frac{1.4}{0.060} = 23.333 \text{ cm}^2\]

\[L_{fast} = \sqrt{23.333} = 4.830 \text{ cm}\]

\textbf{Thermal Group:}

For the thermal group (lowest energy group), only absorption removes neutrons:
\[L^2_{thermal} = \frac{D_{thermal}}{\Sigma_{a,thermal}} = \frac{0.35}{0.080} = 4.375 \text{ cm}^2\]

\[L_{thermal} = \sqrt{4.375} = 2.092 \text{ cm}\]

\[\boxed{L_{fast} = 4.830 \text{ cm}, \quad L_{thermal} = 2.092 \text{ cm}}\]

\subsection*{Part C}

\subsubsection*{Solution}

For a rectangular solid geometry (box) with dimensions $L_x$, $L_y$, and $L_z$, where the neutron flux goes to zero at the edges (bare reactor boundary condition), the \textbf{geometric buckling} is:

\[\boxed{B^2 = \left(\frac{\pi}{L_x}\right)^2 + \left(\frac{\pi}{L_y}\right)^2 + \left(\frac{\pi}{L_z}\right)^2}\]

This expression comes from solving the neutron diffusion equation with boundary conditions $\phi = 0$ at the reactor boundaries. The solution for the fundamental mode has the form:

\[\phi(x,y,z) = A \sin\left(\frac{\pi x}{L_x}\right) \sin\left(\frac{\pi y}{L_y}\right) \sin\left(\frac{\pi z}{L_z}\right)\]

The geometric buckling is the eigenvalue associated with this spatial mode, representing the curvature of the neutron flux distribution. Each term corresponds to the buckling in one spatial dimension:

\begin{itemize}
    \item $B_x^2 = \left(\frac{\pi}{L_x}\right)^2$ - buckling in x-direction
    \item $B_y^2 = \left(\frac{\pi}{L_y}\right)^2$ - buckling in y-direction
    \item $B_z^2 = \left(\frac{\pi}{L_z}\right)^2$ - buckling in z-direction
\end{itemize}

The total geometric buckling is the sum of the directional components.

\textbf{Note:} The derivation of this formula from the diffusion equation was completed in Exam 1. The proof is left to that work.

\subsection*{Part D}

\subsubsection*{Python Code}
\begin{lstlisting}[language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    commentstyle=\color{gray},
    stringstyle=\color{red},
    showstringspaces=false,
    numbers=left,
    numberstyle=\tiny,
    frame=single,
    breaklines=true]
import sympy as sm

# Given dimensions
L_x_val = 150  # cm (width)
L_y_val = 200  # cm (length)

# Define L_z (height) as unknown
L_z_sym = sm.Symbol('L_z', positive=True)

# Buckling with unknown height
B_sq = (sm.pi / L_x_val)**2 + (sm.pi / L_y_val)**2 + (sm.pi / L_z_sym)**2

# Criticality equation: k_inf = (L^2_fast * B^2 + 1)(L^2_thermal * B^2 + 1)
criticality_eq = (L_squared_fast * B_sq + 1) * (L_squared_th * B_sq + 1) - k_inf

# Solve for L_z
L_z_solutions = sm.solve(criticality_eq, L_z_sym)
L_z_critical = float([sol for sol in L_z_solutions if sol.is_real and sol > 0][0])

print(f"Critical height L_z = {L_z_critical:.2f} cm")
\end{lstlisting}

\subsubsection*{Solution}

For a trough with width $L_x = 150$ cm and length $L_y = 200$ cm, we need to find the critical height $L_z$ where $k_{eff} = 1$.

\textbf{Criticality condition using two-group theory:}

At criticality, the effective multiplication factor equals unity:
\[k_{eff} = \frac{k_\infty}{(L_{fast}^2 B^2 + 1)(L_{thermal}^2 B^2 + 1)} = 1\]

Rearranging:
\[(L_{fast}^2 B^2 + 1)(L_{thermal}^2 B^2 + 1) = k_\infty\]

The geometric buckling for the rectangular trough is:
\[B^2 = \left(\frac{\pi}{L_x}\right)^2 + \left(\frac{\pi}{L_y}\right)^2 + \left(\frac{\pi}{L_z}\right)^2\]

\textbf{Known values:}
\begin{itemize}
    \item $k_\infty = 1.3021$
    \item $L_{fast}^2 = 23.333$ cm$^2$
    \item $L_{thermal}^2 = 4.375$ cm$^2$
    \item $L_x = 150$ cm
    \item $L_y = 200$ cm
\end{itemize}

\textbf{Calculation:}

Substituting the buckling expression:
\[B^2 = \left(\frac{\pi}{150}\right)^2 + \left(\frac{\pi}{200}\right)^2 + \left(\frac{\pi}{L_z}\right)^2\]

\[B^2 = 4.386 \times 10^{-4} + 2.467 \times 10^{-4} + \frac{\pi^2}{L_z^2}\]

Substituting into the criticality equation:
\[\left(23.333 \left(6.853 \times 10^{-4} + \frac{\pi^2}{L_z^2}\right) + 1\right) \left(4.375 \left(6.853 \times 10^{-4} + \frac{\pi^2}{L_z^2}\right) + 1\right) = 1.3021\]

Solving this equation numerically (or symbolically with SymPy) yields:

\[\boxed{L_z = 31.72 \text{ cm}}\]

\textbf{Verification:}
\begin{itemize}
    \item $B^2 = 0.010496$ cm$^{-2}$
    \item $k_{eff} = 1.000000$ \checkmark
\end{itemize}

The trough would become critical at a height of approximately 31.7 cm.

\subsection*{Part E}

\subsubsection*{Python Code}
\begin{lstlisting}[language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    commentstyle=\color{gray},
    stringstyle=\color{red},
    showstringspaces=false,
    numbers=left,
    numberstyle=\tiny,
    frame=single,
    breaklines=true]
# Prompt criticality
BETA = 640e-5  # Delayed neutron fraction

# Prompt critical k_eff = 1/(1-beta)
k_eff_prompt = 1 / (1 - BETA)

# Solve for height at prompt criticality
L_z_prompt_sym = sm.Symbol('L_z_prompt', positive=True)
B_sq_prompt = (sm.pi / L_x_val)**2 + (sm.pi / L_y_val)**2 + (sm.pi / L_z_prompt_sym)**2

prompt_crit_eq = (L_squared_fast * B_sq_prompt + 1) * \
                 (L_squared_th * B_sq_prompt + 1) - k_inf / k_eff_prompt

L_z_prompt_solutions = sm.solve(prompt_crit_eq, L_z_prompt_sym)
L_z_prompt = float([sol for sol in L_z_prompt_solutions
                    if sol.is_real and sol > 0][0])

print(f"Prompt critical height L_z = {L_z_prompt:.2f} cm")
\end{lstlisting}

\subsubsection*{Solution}

\textbf{Prompt criticality} occurs when the reactor can sustain a chain reaction on prompt neutrons alone, without relying on delayed neutrons. This happens when:

\[k_{eff} = \frac{1}{1 - \beta}\]

where $\beta$ is the delayed neutron fraction.

\textbf{Given:}
\begin{itemize}
    \item $\beta = 640 \times 10^{-5} = 0.00640$
\end{itemize}

\textbf{Prompt critical condition:}
\[k_{eff,prompt} = \frac{1}{1 - 0.00640} = \frac{1}{0.99360} = 1.00644\]

Using the same two-group criticality equation from Part D, but now solving for the height where $k_{eff} = 1.00644$:

\[\frac{k_\infty}{(L_{fast}^2 B^2 + 1)(L_{thermal}^2 B^2 + 1)} = 1.00644\]

Rearranging:
\[(L_{fast}^2 B^2 + 1)(L_{thermal}^2 B^2 + 1) = \frac{k_\infty}{k_{eff,prompt}} = \frac{1.3021}{1.00644} = 1.2938\]

With $B^2 = \left(\frac{\pi}{150}\right)^2 + \left(\frac{\pi}{200}\right)^2 + \left(\frac{\pi}{L_z}\right)^2$, solving numerically:

\[\boxed{L_{z,prompt} = 32.18 \text{ cm}}\]

\textbf{Comparison:}
\begin{itemize}
    \item Delayed critical height: $L_z = 31.72$ cm
    \item Prompt critical height: $L_{z,prompt} = 32.18$ cm
    \item Difference: $\Delta L_z = 0.46$ cm
\end{itemize}

The liquid must rise an additional 0.46 cm above delayed criticality to reach prompt criticality. This small difference highlights why delayed neutrons are crucial for reactor control.

\subsection*{Part F}

\subsubsection*{Solution}

The presence of people near the trough could significantly impact the critical height.

\textbf{Physical mechanism:}

If the neutron flux is not actually zero at the trough edges (as assumed in our bare reactor model), people standing nearby would:

\begin{enumerate}
    \item \textbf{Act as neutron reflectors:} Human bodies contain significant amounts of water ($\sim$60\% by mass), which is an excellent neutron moderator and reflector

    \item \textbf{Reduce neutron leakage:} Neutrons that would have escaped the trough can be scattered back by the hydrogen in the water content of human tissue

    \item \textbf{Increase system reactivity:} Reduced leakage means more neutrons remain in the system to cause fissions
\end{enumerate}

\textbf{Impact on critical height:}

\[\boxed{\text{Critical height would DECREASE}}\]

With people nearby acting as reflectors:
\begin{itemize}
    \item The effective non-leakage probability increases
    \item Less fissile material is needed to achieve $k_{eff} = 1$
    \item Critical height would be \textbf{lower} than our calculated 31.72 cm
\end{itemize}

\textbf{Safety implications:}

This is a \textbf{serious criticality safety concern}. The presence of personnel near fissile liquid containers can:
\begin{itemize}
    \item Make systems go critical at lower fill levels than predicted by bare reactor calculations
    \item Create inadvertent criticality accidents
    \item Necessitate larger safety margins and administrative controls
\end{itemize}

\textbf{Historical note:} Several criticality accidents have occurred due to personnel proximity acting as reflectors, including incidents during the Manhattan Project. This is why strict distance requirements and neutron shielding are mandated in facilities handling fissile materials.
