Skip to content

Commit

Permalink
Merge pull request arfc#165 from yardasol/openmc-msbr-model
Browse files Browse the repository at this point in the history
OpenMC MSBR model and data
  • Loading branch information
samgdotson authored Dec 6, 2022
2 parents 5b6bf0c + c1a2dd2 commit 6bac510
Show file tree
Hide file tree
Showing 14 changed files with 2,126 additions and 57 deletions.
5 changes: 4 additions & 1 deletion doc/releasenotes/v0.5.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ New Features
Describe any new features to the code.
- ``openmc`` support via `DepcodeOpenMC`
- OpenMC compatible MSBR model.



Expand Down Expand Up @@ -81,7 +82,9 @@ Script Changes
- Add ``SERPENT_DATA`` and ``SERPENT_ACELIB`` variables to ``.bashrc``

- A new script, ``scripts/ci/openmc-xs.bash``, that downloads the OpenMC HDF5 cross section library.

- A new script, ``download_endfb71.bash``, that downloads the ENDF/B 7.1 cross section library -- including thermal scattering, decay, and fission yield data -- in ACE format.
- A new script, ``process_endfb71_to_openmc.bash``, that converts the library created by ``download_endfb71.bash`` into an OpenMC-usable HDF5 format. Requires OpenMC to be installed from source to use.
- A new script ``openmc_msbr_model.py``, that creates an OpenMC-usable MSBR model based on the Serpent MSBR model.


Python API Changes
Expand Down
27 changes: 27 additions & 0 deletions examples/msbr/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## MSBR Model

This model is based on the following technical report:

Robertson, R. C. (1971). Conceptual Design Study of a Single-Fluid Molten-Salt Breeder Reactor. (ORNL--4541). ORNL.

For a complete discussion of the model, please see Chapter 4 in:

Yardas, O. (2023). Implementation and validation of OpenMC in SaltProc [MS Thesis, University of Illinois at Urbana-Champaign].


## Key features
- Zone IB
- Zone IIA
- Simplified Zone IIB (graphite slabs are constructed from cylindrical sectors, and so do not have a consistent width; the last gap in the ccw direction in each octant is smaller than the other gaps, which all have the same dimension)
- Control rod elements (A Guess, as no spec was provided)
- Radial reflectors.
- Simplified axial reflectors (flat as opposed to dished in the reference specification)

## Missing from model
- Zone IA
- Support structure above the main core
- Radial reflector axial ribs
- Radial reflector retaining rings
- Zone IIB Graphite Dowel pins and Hastelloy N eliptical pins
- Salt inlets and outlest
- Zone I eliptical graphite sealing pins
103 changes: 103 additions & 0 deletions examples/msbr/control_rods.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import openmc
import numpy as np

def control_rod(gr_sq_neg,
gr_extra_regions,
inter_elem_channel,
fuel_hole,
fuel,
moder):
"""Create universe for control rod element with control rod fully inserted.
Based on specification in Roberton, 1971.
Parameters
----------
gr_sq_neg : openmc.Intersection
The region bounding the outer surface of the 6 in. x 6 in. graphite
element.
gr_extra_regions : list of (openmc.Region, str)
'Add-on' regions and their names for the graphite element.
Includes ribs, rib tips, and gap-filling regions.
inter_elem_channel : openmc.Region, list of (openmc.Region, str)
Inter-element channel region(s).
fuel_hole : openmc.ZCylinder
Central fuel hole in graphite element.
fuel : openmc.Material
Fuel salt material
moder : openmc.Material
Graphite material
Returns
-------
cr : openmc.Universe
Univerese for control rod element with control rod fully insterted.
"""

s1 = openmc.ZCylinder(r=4.7625, name='control_rod')

c1 = openmc.Cell(fill=moder, region=-s1, name='control_rod')
c2 = openmc.Cell(fill=fuel, region=(+s1 & -fuel_hole), name='cr_fuel_inner')
c3 = openmc.Cell(fill=moder, region=(+fuel_hole &
gr_sq_neg &
inter_elem_channel),
name='cr_moderator')
c4 = openmc.Cell(fill=fuel, region= (~gr_sq_neg & inter_elem_channel),
name='cr_fuel_outer')
#universe_id=3
cr = openmc.Universe(name='control_rod', cells=[c1, c2, c3, c4])

for (reg, name) in gr_extra_regions:
cr.add_cell(openmc.Cell(fill=moder, region=reg,
name=f'cr_moderator_{name}'))

return cr

def control_rod_channel(gr_sq_neg,
gr_extra_regions,
inter_elem_channel,
fuel_hole,
fuel,
moder):
"""Create universe for control rod element with control rod fully withdrawn.
Based on specification in Roberton, 1971.
Parameters
----------
gr_sq_neg : openmc.Intersection
The region bounding the outer surface of the 6 in. x 6 in. graphite
element.
gr_extra_regions : list of (openmc.Region, str)
'Add-on' regions and their names for the graphite element.
Includes ribs, rib tips, and gap-filling regions.
inter_elem_channel : openmc.Region, list of (openmc.Region, str)
Inter-element channel region(s).
fuel_hole : openmc.ZCylinder
Central fuel hole in graphite element.
fuel : openmc.Material
Fuel salt material
moder : openmc.Material
Graphite material
Returns
-------
crc : openmc.Universe
Universe for control rod element with control rod fully withdrawn.
"""

c1 = openmc.Cell(fill=fuel, region=(-fuel_hole), name='crc_fuel_inner')

c2 = openmc.Cell(fill=moder, region=(+fuel_hole &
gr_sq_neg &
inter_elem_channel),
name='crc_moderator')
c3 = openmc.Cell(fill=fuel, region=(~gr_sq_neg & inter_elem_channel),
name='crc_fuel_outer')

# universe_id=4
crc = openmc.Universe(name='control_rod_channel', cells=[c1, c2, c3])

for (reg, name) in gr_extra_regions:
crc.add_cell(openmc.Cell(fill=moder, region=reg,
name=f'crc_moderator_{name}'))

return crc
Loading

0 comments on commit 6bac510

Please sign in to comment.