openmc-designs/Rep_Na_3_55.py
2023-12-16 19:49:46 -08:00

306 lines
10 KiB
Python

## BISON depletion capability comparison
## Rep_Na_3 assessment case, fuel pellet mesh with 55 radial divisions.
## BISON solves the depletion for regions with the same radius but different volumes.
## The number of radial divisions in the mesh controls the number of the depletion regions
try:
from mpi4py import MPI
rank = MPI.COMM_WORLD.Get_rank()
except ModuleNotFoundError:
rank = 0
import math, sys
import openmc
import openmc.deplete
import numpy as np
from matplotlib import pyplot
######################################################################
# Operational Parameters
######################################################################
fuel_temp = 978.31
gap_temp = 663.69
water_den = 0.7051
ppm_boron = 500
water_temp = 585.25
######################################################################
# Geometric Parameters
######################################################################
Rfo = 0.40956 ## pellet outer radius
Rci = 0.41776 ## clad inner radius
Rco = 0.47736 ## clad outer radius
hpitch = 0.63 ## half-pitch between rods
fheight = 1.3589 ## fuel height
nr = 55 ## number of radial divisions
######################################################################
# Chain Parameters
######################################################################
#chain_path = "/storage/home/lca5209/OpenMC/chains/chain_simple.xml"
#chain_path = "/storage/home/lca5209/OpenMC/chains/chain_casl_pwr.xml"
#chain_path = "/storage/home/lca5209/OpenMC/chains/chain_endfb71_pwr.xml"
chain_path = "/opt/xdata/endfb-vii.1-hdf5/chain_endfb71_pwr.xml"
######################################################################
# Settings
######################################################################
batches = 100
inactive = 20
particles = 50000
seed = np.random.randint(2147483647)*2+1
######################################################################
# Setting the materials
######################################################################
## fuel = 3.0 wt% enriched uranium dioxide
fuel = openmc.Material(material_id=1,name="UO2")
fuel.add_nuclide("U238",0.84223593,'wo')
fuel.add_nuclide("U235",0.03918626,'wo')
fuel.add_nuclide("O16",0.11857781,'wo')
fuel.set_density("g/cc",10.394075)
fuel.temperature = fuel_temp
fuel.volume = (math.pi*Rfo**2)*fheight
mat_list = []
for i in range(nr):
mat = fuel.clone()
mat.volume = (math.pi*((((i+1)/55)*Rfo)**2-(((i)/55)*Rfo)**2))*fheight
mat_list.append(mat)
## gap = helium
gap = openmc.Material(name='He')
gap.set_density('g/cc',0.001598)
gap.add_element('He', 1.0,'wo')
gap.temperature = gap_temp
mat_list.append(gap)
## clad = zircaloy
clad = openmc.Material(name='Zircaloy_4')
clad.set_density('g/cc', 6.56)
clad.add_element('Sn', 0.014 , 'wo')
clad.add_element('Fe', 0.00165, 'wo')
clad.add_element('Cr', 0.001 , 'wo')
clad.add_element('Zr', 0.98335, 'wo')
mat_list.append(clad)
## coolant = borated water
coolant = openmc.Material(name='Borated_water')
coolant.set_density('g/cc', water_den)
coolant.add_nuclide('B10',ppm_boron*0.199E-06,'wo')
coolant.add_nuclide('B11',ppm_boron*0.801E-06,'wo')
coolant.add_element('H',0.1108612,'wo')
coolant.add_element('O',0.8886388,'wo')
coolant.remove_nuclide('O18')
coolant.temperature = water_temp
coolant.add_s_alpha_beta('c_H_in_H2O')
mat_list.append(coolant)
sys.stdout.flush()
try:
MPI.COMM_WORLD.Barrier()
except NameError:
pass
if rank == 0:
print(mat_list)
sys.stdout.flush()
materials = openmc.Materials(mat_list)
materials.cross_sections="/opt/xdata/endfb-vii.1-hdf5/cross_sections.xml"
materials.export_to_xml()
######################################################################
# Building the geometry
######################################################################
## Fuel rings, gap, and cladding
cylinder = []
counter_1 = 0
for i in range(nr):
c = openmc.ZCylinder(surface_id=(i+1), x0=0, y0=0, r=((i+1)/55)*Rfo, name='Fuel '+ str(i+1) + ' OR')
cylinder.append(c)
counter_1 +=1
cylinder_g = openmc.ZCylinder(surface_id=counter_1+1, x0=0, y0=0, r=Rci, name='Gap OR')
cylinder_c = openmc.ZCylinder(surface_id=counter_1+2, x0=0, y0=0, r=Rco, name='Clad OR')
cylinder.append(cylinder_g)
cylinder.append(cylinder_c)
## Box surrounding fuel rod
left = openmc.XPlane(surface_id=counter_1+3, x0=-hpitch, name='left')
right = openmc.XPlane(surface_id=counter_1+4, x0=hpitch, name='right')
bottom = openmc.YPlane(surface_id=counter_1+5, y0=-hpitch, name='bottom')
top = openmc.YPlane(surface_id=counter_1+6, y0=hpitch, name='top')
## Surfaces above/below fuel
fsouth = openmc.ZPlane(surface_id=counter_1+7, z0=-fheight/2.0, name='fsouth')
fnorth = openmc.ZPlane(surface_id=counter_1+8, z0=fheight/2.0, name='fnorth')
## Boundary Conditions
left.boundary_type = 'reflective'
right.boundary_type = 'reflective'
top.boundary_type = 'reflective'
bottom.boundary_type = 'reflective'
fsouth.boundary_type = 'reflective'
fnorth.boundary_type = 'reflective'
cell = []
counter_2 = 0
for i in range(nr):
f = openmc.Cell(cell_id=(i+1), name='fuel '+str(i+1))
cell.append(f)
counter_2 += 1
gap_cell = openmc.Cell(cell_id=counter_2+1, name='Gap cell')
clad_cell = openmc.Cell(cell_id=counter_2+2, name='Clad cell')
water_cell = openmc.Cell(cell_id=counter_2+3, name='Water cell')
cell.append(gap_cell)
cell.append(clad_cell)
cell.append(water_cell)
for i in range(len(cell)-1):
if i==0:
cell[i].region = -cylinder[i] & -fnorth & +fsouth
elif i==(len(cell)-2):
cell[i+1].region = +cylinder[i] & +left & -right & +bottom & -top & -fnorth & +fsouth
cell[i].region = +cylinder[(i-1)] & -cylinder[i] & -fnorth & +fsouth
else:
cell[i].region = +cylinder[(i-1)] & -cylinder[i] & -fnorth & +fsouth
count_3 = 0
for i in range(nr):
cell[i].fill = mat_list[i]
count_3 +=1
cell[count_3].fill = gap
cell[count_3+1].fill = clad
cell[count_3+2].fill = coolant
## Instantiate Universe
root = openmc.Universe(universe_id=0, name='root universe')
## Register Cells with Universe
root.add_cells(cell)
## Instantiate a Geometry, register the root Universe, and export to XML
geometry = openmc.Geometry(root)
geometry.export_to_xml()
plot = openmc.Plot.from_geometry(geometry)
plot.pixels = (250, 250)
plot.filename = 'pinplot_55_regions'
plot.width = (hpitch*2, hpitch*2)
plot.pixels = (500, 500)
plot.color_by = 'cell'
plot.colors = {cell[-3]: 'purple',cell[-2]: 'grey',
cell[-1]: 'blue'}
plots = openmc.Plots([plot])
plots.export_to_xml()
openmc.plot_geometry()
###############################################################################
# Exporting to OpenMC settings.xml file
###############################################################################
## Instantiate a Settings object, set all runtime parameters, and export to XML
settings = openmc.Settings()
settings.batches = batches
settings.inactive = inactive
settings.particles = particles
settings.seed = seed
settings.verbosity = 7
settings.photon_transport = False
## Cross-section temperature information
settings.temperature = {
'method': 'interpolation',
'tolerance': 100 ,
'multipole': True
}
## Create an initial uniform spatial source distribution over fissionable zones
bounds = [-hpitch, -hpitch, -fheight/2, hpitch, hpitch, fheight/2]
uniform_dist = openmc.stats.Box(bounds[:3], bounds[3:], only_fissionable=True)
settings.source = openmc.source.IndependentSource(space=uniform_dist)
entropy_mesh = openmc.RegularMesh()
entropy_mesh.lower_left = [-hpitch, -hpitch, -1.e50]
entropy_mesh.upper_right = [hpitch, hpitch, 1.e50]
entropy_mesh.dimension = [10, 10, 1]
settings.entropy_mesh = entropy_mesh
settings.export_to_xml()
###############################################################################
# Exporting to OpenMC tallies.xml file
###############################################################################
## Instantiate a tally mesh
mesh = openmc.RegularMesh()
mesh.type = 'regular'
mesh.dimension = [1, 1, 100]
mesh.lower_left = [-hpitch, -hpitch, -fheight/2]
mesh.upper_right = [hpitch, hpitch, fheight/2]
## Instantiate some tally Filters
energy_filter = openmc.EnergyFilter([0., 0.625, 20.e6])
energy_filter2 = openmc.EnergyFilter(np.logspace(-3, 7, num=100))
mesh_filter = openmc.MeshFilter(mesh)
## Instantiate the Tally
tally = openmc.Tally(tally_id=1, name='Spatial Tally 1')
tally.filters = [energy_filter, mesh_filter]
tally.scores = ['flux']#, 'fission', 'nu-fission']
## Instantiate the Tally
tallyspec = openmc.Tally(tally_id=2, name='Energy Spectrum Tally 1')
tallyspec.filters = [energy_filter2]
tallyspec.scores = ['flux']#, 'fission', 'nu-fission']
particle_filter = openmc.ParticleFilter(['neutron', 'photon'])
mat_filter = openmc.MaterialFilter(materials)
tallydep = openmc.Tally(tally_id=3, name='Spatial Tally 2')
tallydep.filters = [mat_filter, particle_filter]
tallydep.scores = ['fission', 'heating', 'heating-local']
## Instantiate a Tallies collection and export to XML
tallies = openmc.Tallies([tally, tallyspec,tallydep])
tallies.export_to_xml()
###############################################################################
# Depletion settings
###############################################################################
model = openmc.model.Model(geometry=geometry, materials=materials, settings=settings, tallies=tallies, plots=plots)
## setting the transport operator
operator = openmc.deplete.CoupledOperator(model,chain_path,diff_burnable_mats=False,normalization_mode='fission-q',fission_q={"U235": 202.27e6})
## setting the system linear power [W]
power = [45.50,91.01,136.51,182.02,227.52,273.03,324.45,324.45,273.03,273.03,227.52,182.02,136.51,91.01,45.50]
time_steps = [8640.00,8640.00,8640.00,8640.00,8640.00,8640.00,4268160.00,45792000.00,1728000.00,46915200.00,8640.00,8640.00,8640.00,8640.00,8640.00]
sys.stdout.flush()
try:
MPI.COMM_WORLD.Barrier()
except NameError:
pass
if rank == 0:
print(time_steps)
sys.stdout.flush()
## depleting usin a first-order predictor algorithm
integrator = openmc.deplete.PredictorIntegrator(operator, time_steps, power, timestep_units = 's')
integrator.integrate()