Dane Sabo 943066540c Auto sync: 2025-11-10 18:04:37 (36 files changed)
M  .task/backlog.data

M  .task/completed.data

M  .task/pending.data

M  .task/undo.data

A  Class_Work/nuce2101/exam2/NUCE2101_SABO/Submission.pdf

A  Class_Work/nuce2101/exam2/NUCE2101_SABO/problem1.py

A  Class_Work/nuce2101/exam2/NUCE2101_SABO/problem1_equal_loading.png

A  Class_Work/nuce2101/exam2/NUCE2101_SABO/problem1_unequal_loading.png
2025-11-10 18:04:37 -05:00

300 lines
9.2 KiB
TeX

\section*{Problem 1}
\subsection*{System Description}
A two-loop reactor system with:
\begin{itemize}
\item Reactor (lumped hot leg) at temperature $T_{hot}$
\item Steam Generator 1 with cold leg at $T_{cold1}$
\item Steam Generator 2 with cold leg at $T_{cold2}$
\item Equal mass flow rates and water masses in each loop
\item Reactor Water Mass Fraction (RWMF): $\mu$
\end{itemize}
\textbf{Given parameters:}
\begin{itemize}
\item Base heat capacity: $C_0 = 33.33$ \%-sec/\degree F
\item Base time constant: $\tau_0 = 0.75 \times C_0 = 25.00$ sec
\item Initial temperature: $T_{hot} = T_{cold1} = T_{cold2} = 450$ \degree F
\end{itemize}
\textbf{Derived parameter:}
The flow heat capacity rate per loop is \textit{not directly given} in the problem statement but can be derived from the relationship between time constants and heat capacities:
\[W = \frac{C_0}{2\tau_0} = \frac{33.33}{2 \times 25.00} = 0.6667 \text{ \%-sec/\degree F}\]
This represents the (mass flow rate $\times$ specific heat) for each loop.
\textbf{System parameters as functions of $\mu$:}
\begin{itemize}
\item Reactor time constant: $\tau_r = \mu \tau_0$
\item Reactor heat capacity: $C_r = \mu C_0$
\item Steam generator time constant (each): $\tau_{sg} = \frac{(1-\mu)\tau_r}{2}$
\item Steam generator heat capacity (each): $C_{sg} = \frac{(1-\mu)C_0}{2}$
\end{itemize}
\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]
import numpy as np
import sympy as sm
# Given parameters
C_0 = 33.33 # Base heat capacity [%-sec/degF]
tau_0 = 25.00 # Base time constant [sec]
W = C_0 / (2 * tau_0) # Flow heat capacity rate per loop
def calculate_system_parameters(mu):
C_r = mu * C_0 # Reactor heat capacity
C_sg = (1 - mu) * C_0 / 2 # Steam generator heat capacity (each)
return C_r, C_sg
# Matrix form: dT/dt = A*T + B
def get_matrix_A(C_r, C_sg, W):
A = np.array([
[-2*W/C_r, W/C_r, W/C_r],
[W/C_sg, -W/C_sg, 0],
[W/C_sg, 0, -W/C_sg]
])
return A
# Vector B (forcing terms):
# B = [P_r/C_r, -Qdot1/C_sg, -Qdot2/C_sg]^T
\end{lstlisting}
\subsubsection*{Solution}
The energy balance for each component yields differential equations:
\textbf{Reactor energy balance:}
\[C_r \frac{dT_{hot}}{dt} = P_r - W(T_{hot} - T_{cold1}) - W(T_{hot} - T_{cold2})\]
\textbf{Steam Generator 1 energy balance:}
\[C_{sg} \frac{dT_{cold1}}{dt} = W(T_{hot} - T_{cold1}) - \dot{Q}_1\]
\textbf{Steam Generator 2 energy balance:}
\[C_{sg} \frac{dT_{cold2}}{dt} = W(T_{hot} - T_{cold2}) - \dot{Q}_2\]
where:
\begin{itemize}
\item $P_r$ = reactor power (positive for heat generation)
\item $\dot{Q}_1, \dot{Q}_2$ = steam generator heat removal rates (positive for heat removal)
\item $W = \frac{C_0}{2\tau_0} = 0.6667$ \%-sec/\degree F = flow heat capacity rate per loop
\end{itemize}
\textbf{Matrix Form:}
Define the temperature vector: $\mathbf{T} = \begin{bmatrix} T_{hot} \\ T_{cold1} \\ T_{cold2} \end{bmatrix}$
The system can be written as:
\[\boxed{\frac{d\mathbf{T}}{dt} = \mathbf{A} \mathbf{T} + \mathbf{B}}\]
where the coefficient matrix $\mathbf{A}$ is:
\[\mathbf{A} = \begin{bmatrix}
-\frac{2W}{C_r} & \frac{W}{C_r} & \frac{W}{C_r} \\[0.3em]
\frac{W}{C_{sg}} & -\frac{W}{C_{sg}} & 0 \\[0.3em]
\frac{W}{C_{sg}} & 0 & -\frac{W}{C_{sg}}
\end{bmatrix}\]
and the forcing vector $\mathbf{B}$ is:
\[\mathbf{B} = \begin{bmatrix}
\frac{P_r}{C_r} \\[0.3em]
-\frac{\dot{Q}_1}{C_{sg}} \\[0.3em]
-\frac{\dot{Q}_2}{C_{sg}}
\end{bmatrix}\]
\textbf{Numerical example for $\mu = 0.5$:}
With $\mu = 0.5$: $C_r = 16.66$ \%-sec/\degree F, $C_{sg} = 8.33$ \%-sec/\degree F, $W = 0.6667$ \%-sec/\degree F
\[\boxed{\mathbf{A} = \begin{bmatrix}
-0.0800 & 0.0400 & 0.0400 \\
0.0800 & -0.0800 & 0 \\
0.0800 & 0 & -0.0800
\end{bmatrix}}\]
\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]
# At steady state, dT/dt = 0
# From SG1: 0 = W*(T_hot - T_cold1) - Qdot1
DeltaT1 = Qdot1 / W
# From SG2: 0 = W*(T_hot - T_cold2) - Qdot2
DeltaT2 = Qdot2 / W
# From reactor: P_r = W*DeltaT1 + W*DeltaT2
power_balance = Qdot1 + Qdot2
\end{lstlisting}
\subsubsection*{Solution}
At steady state, all time derivatives are zero ($\frac{dT}{dt} = 0$).
\textbf{From Steam Generator 1 equation:}
\[0 = W(T_{hot} - T_{cold1}) - \dot{Q}_1\]
\[\boxed{\Delta T_1 = T_{hot} - T_{cold1} = \frac{\dot{Q}_1}{W}}\]
\textbf{From Steam Generator 2 equation:}
\[0 = W(T_{hot} - T_{cold2}) - \dot{Q}_2\]
\[\boxed{\Delta T_2 = T_{hot} - T_{cold2} = \frac{\dot{Q}_2}{W}}\]
\textbf{From Reactor equation:}
\[0 = P_r - W\Delta T_1 - W\Delta T_2\]
\[P_r = W\Delta T_1 + W\Delta T_2 = \dot{Q}_1 + \dot{Q}_2\]
This confirms the power balance: reactor power equals total steam generator heat removal rates.
\subsection*{Part C}
\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]
# Average reactor temperature (mass-weighted)
def calculate_T_ave(T_hot, T_cold1, T_cold2, mu, C_0):
C_r = mu * C_0
C_sg = (1 - mu) * C_0 / 2
# Mass-weighted average
T_ave = (C_r*T_hot + C_sg*T_cold1 + C_sg*T_cold2) / C_0
# Simplified form
T_ave_simplified = mu*T_hot + (1-mu)*(T_cold1 + T_cold2)/2
return T_ave_simplified
# For mu = 0.5:
T_ave_50 = 0.5*T_hot + 0.25*T_cold1 + 0.25*T_cold2
# For mu = 0.75:
T_ave_75 = 0.75*T_hot + 0.125*T_cold1 + 0.125*T_cold2
\end{lstlisting}
\subsubsection*{Solution}
The average reactor temperature must be calculated as a \textbf{mass-weighted average}:
\[T_{ave} = \frac{C_r T_{hot} + C_{sg} T_{cold1} + C_{sg} T_{cold2}}{C_r + 2C_{sg}}\]
Since $C_r + 2C_{sg} = \mu C_0 + 2 \cdot \frac{(1-\mu)C_0}{2} = C_0$, this simplifies to:
\[T_{ave} = \frac{C_r T_{hot} + C_{sg} T_{cold1} + C_{sg} T_{cold2}}{C_0}\]
Substituting $C_r = \mu C_0$ and $C_{sg} = \frac{(1-\mu)C_0}{2}$:
\[\boxed{T_{ave} = \mu T_{hot} + \frac{(1-\mu)}{2}(T_{cold1} + T_{cold2})}\]
\textbf{Important:} This formula \textit{depends on $\mu$}!
\textbf{For $\mu = 0.5$:}
\[T_{ave} = \frac{T_{hot}}{2} + \frac{T_{cold1} + T_{cold2}}{4}\]
\textbf{For $\mu = 0.75$:}
\[T_{ave} = \frac{3T_{hot}}{4} + \frac{T_{cold1} + T_{cold2}}{8}\]
\textbf{Note:} When the system is balanced ($P_r = \dot{Q}_1 + \dot{Q}_2$), the mass-weighted average temperature remains constant even during transients, since $\frac{d(C_0 \cdot T_{ave})}{dt} = P_r - \dot{Q}_1 - \dot{Q}_2 = 0$.
\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]
from scipy.integrate import odeint
def reactor_odes(y, t, W, C_r, C_sg, P_r, Qdot1, Qdot2):
"""
P_r: Reactor power (heat generation rate)
Qdot1, Qdot2: SG heat removal rates
"""
T_hot, T_cold1, T_cold2 = y
dT_hot_dt = (P_r - W*(T_hot - T_cold1) - W*(T_hot - T_cold2)) / C_r
dT_cold1_dt = (W*(T_hot - T_cold1) - Qdot1) / C_sg
dT_cold2_dt = (W*(T_hot - T_cold2) - Qdot2) / C_sg
return [dT_hot_dt, dT_cold1_dt, dT_cold2_dt]
# Initial conditions at equilibrium
y0 = [450, 450, 450]
# Time array: 0 to 30 seconds
t = np.linspace(0, 30, 500)
# Solve for different cases
solution = odeint(reactor_odes, y0, t, args=(W, C_r, C_sg, P_r, Qdot1, Qdot2))
T_hot = solution[:, 0]
T_cold1 = solution[:, 1]
T_cold2 = solution[:, 2]
# Calculate average temperature (mass-weighted, depends on mu)
T_ave = mu*T_hot + (1-mu)*(T_cold1 + T_cold2)/2
\end{lstlisting}
\subsubsection*{Solution}
Transient simulations were performed for four cases using numerical integration (scipy.integrate.odeint):
\textbf{Cases simulated:}
\begin{enumerate}
\item $\mu = 0.5$, equally loaded ($\dot{Q}_1 = 50\%$, $\dot{Q}_2 = 50\%$)
\item $\mu = 0.75$, equally loaded ($\dot{Q}_1 = 50\%$, $\dot{Q}_2 = 50\%$)
\item $\mu = 0.5$, unequally loaded ($\dot{Q}_1 = 60\%$, $\dot{Q}_2 = 40\%$)
\item $\mu = 0.75$, unequally loaded ($\dot{Q}_1 = 60\%$, $\dot{Q}_2 = 40\%$)
\end{enumerate}
All cases assume reactor power $P_r = 100\%$ and initial conditions at equilibrium ($T_{hot} = T_{cold1} = T_{cold2} = 450$ \degree F).
\textbf{Note:} Power percentages refer to fraction of total reactor power, not individual SG ratings.
\textbf{Equally Loaded Cases:}
\begin{center}
\includegraphics[width=0.95\textwidth]{../python/problem1_equal_loading.png}
\end{center}
\textbf{Unequally Loaded Cases:}
\begin{center}
\includegraphics[width=0.95\textwidth]{../python/problem1_unequal_loading.png}
\end{center}