The code here now lives in c-finney/MicroHTGR, under
ThermalHydraulics/, where it is coupled directly to the OpenMC neutronics model it was written to work with.For the original, unmodified project, go to bryanhhuynh/HTGR-SCAPC.
This fork is kept read-only so existing links and citations keep resolving. It receives no further updates.
A fork of bryanhhuynh/HTGR-SCAPC, a steady-state single-channel thermal-hydraulics solver for a prismatic high-temperature gas-cooled reactor coolant channel, coupled to a direct recuperated Brayton cycle.
nc_htgr.py solves, node by node along the channel:
- coolant enthalpy rise and pressure drop (Churchill friction factor, Gnielinski / laminar Nusselt blending),
- the convective film temperature drop,
- conduction through the graphite web to the fuel hole, including the radiative and conductive gap,
- compact and peak TRISO kernel temperatures,
then closes the power cycle to report thermal efficiency and net electrical output. Helium properties come from CoolProp.
All original work in this repository is by Bryan Huynh.
It was written as the thermal-hydraulics and power-cycle contribution to CHUDR (Compact Helium-cooled Universal Defense Reactor), a 4 MWe / 10 MWth transportable prismatic HTGR designed by a six-person senior design team in the ENU 4192 course at the University of Florida — Cade Finney, Evan Alder, Bryan Huynh, Colin Frazier, William St. Peter and Daniel Fernandez — under the guidance of Dr. DuWayne Schubring.
This fork exists only to hold the small set of changes listed below, which were made while coupling the solver to the neutronics model. It is not an independent work.
Three changes, relative to Bryan's original upload:
| Change | Where | Why |
|---|---|---|
| Axial heating profile mirrored for downward flow | _get_qprime in nc_htgr.py |
The solver iterates from the physical bottom of the core upward, but with flow_upward false the inlet is at the physical top. Without mirroring the z lookup, the power profile is applied backwards — the inlet node reads the outlet power and vice versa. |
eps_recup 0.90 → 0.94 |
nc_input.csv |
Recuperator effectiveness selected for the CHUDR design point. |
packing_fraction 0.30 → 0.33 |
nc_input.csv |
Match the TRISO packing fraction of the calibrated neutronics model. |
Nothing else in the solver was modified.
A note on the cycle. The upstream repository is described as using an indirect Brayton cycle, and this fork's description says direct. That is a difference in repository metadata only — Bryan's original source already implements a direct recuperated cycle (
# Direct recuperated Brayton cycle). No cycle conversion was performed here.
pip install numpy pandas CoolProp
python nc_htgr.py --deck nc_input.csvAll inputs are set in nc_input.csv: channel and core geometry, flow
conditions, gap and conduction assumptions, and the Brayton cycle parameters.
With axial_shape,neutronics_table the axial power profile is read from the CSV
named by the neutronics_file key. neutronics.csv is an example profile
exported from the OpenMC model, with one row per axial node:
z_center_cm, hottest_channel_q_W, average_channel_q_W, std_channel_q_W, median_channel_q_W, coldest_channel_q_W
channel_case picks which column to solve — hot, average or cold. Set
axial_shape,cosine instead to use an analytic profile with peaking_factor
and qprime_max_W_m.
Results are written as htgr_out_*.csv in the working directory: per-node
average and hot channel tables, the cycle state points, and a reactor summary.
⚠️ Known issue, fixed only in MicroHTGR. The deck in this archived fork setsneutronics_file,BOLCriticalHeating.csv, a file that is not in the repository, so a default run fails withFileNotFoundError. Change it toneutronics.csv, or use the MicroHTGR copy, where this is corrected and a relativeneutronics_filealso resolves against the deck's own directory.
In MicroHTGR this solver is the
thermal-hydraulics half of a converged neutronics ↔ TH coupling. OpenMC solves
the eigenvalue problem, the axial heating profile is extracted from a mesh
tally, nc_htgr returns coolant, compact and matrix temperatures, those are
mapped back onto the OpenMC axial zones, and the loop repeats until both k_eff
and the heating profile converge. In a criticality-search depletion run this
happens at every depletion timestep.
Attribution for this code is recorded in
MicroHTGR's NOTICE.md.
The upstream project carries no licence file, so the original code remains © Bryan Huynh, all rights reserved. It is included in MicroHTGR with his permission. Anyone wanting to reuse it should ask him.