I am currently attempting to model the hexagonal fuel log structure of the TMSR-500 design from ThorCon International using OpenMC, specifically the solid fuel slab-in-moderator configuration shown in the attached image. The fuel log consists of vertical fuel slabs embedded within a hexagonal prism of moderator, with clearly defined slots between each slab. Despite my efforts, my model produces a geometry that is quite different from the intended design.
Below is the Python script I’ve developed, which tries to define multiple vertical fuel slabs spaced within a hexagonal prism filled with moderator. The number of slabs is determined based on the apothem, slab thickness, and slot thickness. However, the resulting geometry does not visually resemble the regular parallel slab configuration seen in the image, especially regarding alignment, slab count, and overall symmetry.
import openmc
import openmc
# === PARAMETER GEOMETRY ===
apothem = 19.055 # cm
height_log = 17.0996 # cm
slot_thickness = 0.6 # cm
slab_thickness = 4.0 # cm
outer_slot_thickness = 0.6 # cm
# === MATERIALS ===
#Material define in TMSR-500
#molten salts fuel NaF-BeF2-UF4-ThF4 with mole fraction (76% ; 12%; 9,5%; 2,5% )
T = 564 #inlet temperature as 564 celcius
fuel = openmc.Material(name='fuel_salt', temperature = T+273.2 )
fuel.add_nuclide('Na23', 0.306, 'ao') # Natrium-23
fuel.add_nuclide('Be9', 0.048, 'ao') # Berilium-9
fuel.add_nuclide('Th232', 0.0383, 'ao')# Thorium-232
fuel.add_nuclide('U233', 0.00101, 'ao')# Uranium-233 (10% from total uranium)
fuel.add_nuclide('U235', 0.00199, 'ao')# Uranium-235 (19.7% from total uranium)
fuel.add_nuclide('U238', 0.0071, 'ao') # Uranium-238 (70.3% from total uranium)
fuel.add_nuclide('F19', 0.597, 'ao') # Fluorine-19
#moderator core
moderator = openmc.Material(name='moderator', temperature = T+273.2)
moderator.add_nuclide('C12', 1.0)
moderator.set_density('g/cm3', 2.0)
moderator.add_s_alpha_beta('c_graphite')
#vessel core
vessel = openmc.Material(name='ss-16')
vessel.add_element('C',0.08,'wo')
vessel.add_element('N', 0.1, 'wo')
vessel.add_element('Si', 0.75,'wo')
vessel.add_element('P', 0.045,'wo')
vessel.add_element('S', 0.03,'wo')
vessel.add_element('Cr', 17,'wo')
vessel.add_element('Mn', 2, 'wo')
vessel.add_element('Fe', 65.497,'wo')
vessel.add_element('Ni', 12, 'wo')
vessel.add_element('Mo', 2.5,'wo')
vessel.set_density('g/cm3',8.00)
#reflector core
reflector = openmc.Material(name = 'reflector')
reflector.add_nuclide('C12', 1.0)
reflector.set_density('g/cm3', 2.0)
reflector.add_s_alpha_beta('c_graphite')
#shielding core
shielding = openmc.Material(name='shield')
shielding.add_nuclide('B10', 1.5920E-01)
shielding.add_nuclide('B11', 6480E-01)
shielding.add_nuclide('C12', 2.000E-01)
shielding.set_density('g/cm3', 2.57)
materials = openmc.Materials([fuel, moderator, vessel , reflector, shielding])
materials.export_to_xml()
# === HEXAGONAL FUEL LOG REGION ===
hex_prism_inner = openmc.model.hexagonal_prism(
edge_length=apothem - outer_slot_thickness,
orientation='y',
boundary_type='reflective'
)
hex_prism_outer = openmc.model.hexagonal_prism(
edge_length=apothem,
orientation='y',
boundary_type='reflective'
)
# making region in outer hexagon
outer_slot_region = hex_prism_outer & ~hex_prism_inner
bottom = openmc.ZPlane(z0=-height_log / 2, boundary_type='reflective')
top = openmc.ZPlane(z0=height_log / 2, boundary_type='reflective')
log_region = hex_prism_outer & +bottom & -top
inner_region = hex_prism_inner & +bottom & -top
# === FUEL + SLOT SLAB REGION ===
slab_cells = []
slot_cells = []
# Slot in outer perimeter hexagon
outer_slot_cell = openmc.Cell(
name="Outer Slot",
region=outer_slot_region & +bottom & -top,
fill=moderator
)
# Slab and slot internal
num_slabs = int((2 * (apothem - outer_slot_thickness)) // (slab_thickness + slot_thickness))
x_start = -(apothem - outer_slot_thickness) + (slab_thickness / 2)
for i in range(num_slabs):
x_center = x_start + i * (slab_thickness + slot_thickness)
# boundary region of slab moderator
x_left = openmc.XPlane(x0=x_center - slab_thickness / 2)
x_right = openmc.XPlane(x0=x_center + slab_thickness / 2)
slab_region = +x_left & -x_right & inner_region
slab_cells.append(openmc.Cell(name=f"Fuel Slab {i+1}", region=slab_region, fill=fuel))
if i < num_slabs - 1:
x_slot_left = openmc.XPlane(x0=x_center + slab_thickness / 2)
x_slot_right = openmc.XPlane(x0=x_center + slab_thickness / 2 + slot_thickness)
slot_region = +x_slot_left & -x_slot_right & inner_region
slot_cells.append(openmc.Cell(name=f"Moderator Slot {i+1}", region=slot_region, fill=moderator))
# combine in all region
occupied_region = openmc.Union([cell.region for cell in slab_cells + slot_cells])
remaining_moderator_region = inner_region & ~occupied_region
remaining_moderator_cell = openmc.Cell(
name="Remaining Moderator",
region=remaining_moderator_region,
fill=moderator
)
# === formation FUEL LOG ===
fuel_log_universe = openmc.Universe(
cells=slab_cells + slot_cells + [remaining_moderator_cell, outer_slot_cell]
)
# === GEOMETRY ===
geometry = openmc.Geometry(fuel_log_universe)
# === EXPORT ===
materials.export_to_xml()
geometry.export_to_xml()
# === PLOTTING ===
geometry.plot(
origin=(0, 0, 0),
width=(2*apothem, 2*apothem),
pixels=(600, 600),
basis='xy',
color_by='material'
)
geometry.plot(
origin=(0, 0, 0),
width=(2*apothem, height_log),
pixels=(600, 600),
basis='xz',
color_by='material'
)
how to fix it and spesificly how to make “Y” part at center the fuel log at my reference picture?