How to get local burnup in a 17×17 assembly

Hi everyone,
During the assembly depletion calculation process, how can I obtain the local burnup for different fuel pin? My approach is to tally the heating for pins and then integrate over time to obtain the burnup weighting factor. I am not sure if it’s correct.
Thanks for your help.

model = openmc.model.Model(geometry=assembly, materials=materials, settings=settings) 
model.differentiate_depletable_mats(diff_volume_method = 'divide equally')
chain_file = 'chain_casl_pwr.xml'  
op = openmc.deplete.CoupledOperator(model, chain_file)
integrator = openmc.deplete.PredictorIntegrator(op, depletion_step, power_level,  timestep_units=time_unit)
integrator.integrate()

previous_results = openmc.deplete.Results('depletion_results.h5')
materials_dep = previous_results.export_to_materials(EOL_depletion_step)
materials_dep.export_to_xml() 

Do this and look at the U235 content of the materials.xml file generated to get fractional burnup.
Feel free to axially segment your fuel rods too if you want to look at different burn rates along the rod height.

1 Like

Thanks ! I will try it. Actually, I do utilize model class to build the assembly model, however, I found it’s a little complicated to distinguish different material when using tally. Here is my code,

Blockquote
model = openmc.model.Model()
# Create fuel assembly Lattice
pitch = 21.42
assembly = openmc.RectLattice(name=‘Fuel Assembly’)
assembly.pitch = (pitch/17, pitch/17)
assembly.lower_left = (-pitch/2, -pitch/2)
# Create array indices for guide tube locations in lattice
gt_pos = np.array([
[2, 5], [2, 8], [2, 11],
[3, 3], [3, 13],
[5, 2], [5, 5], [5, 8], [5, 11], [5, 14],
[8, 2], [8, 5], [8, 8], [8, 11], [8, 14],
[11, 2], [11, 5], [11, 8], [11, 11], [11, 14],
[13, 3], [13, 13],
[14, 5], [14, 8], [14, 11]
])
Gd_pos = np.array([
[1,8],
[2,2], [2,14],
[3,6], [3,10],
[6,3], [6,8], [6,13],
[8,1], [8,6], [8,10], [8,15],
[10,3], [10,8], [10,13],
[13,6], [13,10],
[14,2], [14,14],
[15,8]
])
# Create 17x17 array of universes. First we create a 17x17 array all filled
# with the fuel pin universe. Then, we replace the guide tube positions with
# the guide tube pin universe (note the use of numpy fancy indexing to
# achieve this).
assembly.universes = np.full((17, 17), fuel_pin())
assembly.universes[gt_pos[:, 0], gt_pos[:, 1]] = guide_tube_pin()
assembly.universes[Gd_pos[:, 0], Gd_pos[:, 1]] = Gd_fuel_pin() model = openmc.model.Model()
# Create fuel assembly Lattice
pitch = 21.42
assembly = openmc.RectLattice(name=‘Fuel Assembly’)
assembly.pitch = (pitch/17, pitch/17)
assembly.lower_left = (-pitch/2, -pitch/2)
# Create array indices for guide tube locations in lattice
gt_pos = np.array([
[2, 5], [2, 8], [2, 11],
[3, 3], [3, 13],
[5, 2], [5, 5], [5, 8], [5, 11], [5, 14],
[8, 2], [8, 5], [8, 8], [8, 11], [8, 14],
[11, 2], [11, 5], [11, 8], [11, 11], [11, 14],
[13, 3], [13, 13],
[14, 5], [14, 8], [14, 11]
])
Gd_pos = np.array([
[1,8],
[2,2], [2,14],
[3,6], [3,10],
[6,3], [6,8], [6,13],
[8,1], [8,6], [8,10], [8,15],
[10,3], [10,8], [10,13],
[13,6], [13,10],
[14,2], [14,14],
[15,8]
])
# Create 17x17 array of universes. First we create a 17x17 array all filled
# with the fuel pin universe. Then, we replace the guide tube positions with
# the guide tube pin universe (note the use of numpy fancy indexing to
# achieve this).
assembly.universes = np.full((17, 17), fuel_pin())
assembly.universes[gt_pos[:, 0], gt_pos[:, 1]] = guide_tube_pin()
assembly.universes[Gd_pos[:, 0], Gd_pos[:, 1]] = Gd_fuel_pin()

I should know the Cell or material ID corresponding to the location of the fuel rod for tallying. However, there are many material IDs in the geometry.xml file, but only a few in the material.xml file. Could you please advise if there are any tricks for tallying in assembly calculations? In OpenMC examples files, there are only examples for pin tallying.

    distrib_filter = openmc.DistribcellFilter(fuel_rod)
    fiss_tally = openmc.Tally(name="fiss_tally")
    fiss_tally.filters = [distrib_filter]
    fiss_tally.scores = ['kappa-fission']  # eV/source-particle 
    tallies = openmc.Tallies([fiss_tally])
    tallies.export_to_xml()

DistribcellFilter can be used to tally differentiated materials in a fuel assembly.

Thanks! Daedalus,
I still have another question. In fact, the relationship between U235 content and burnup is not linear due to Pu239 fission. Would it be inaccurate to estimate burnup level solely based on U235 content?

Technically you are right, but it is an estimation that can be used on a case-by-case basis. For the reactor I worked on the U235 fractional burnup estimate was used for record keeping. If you want to account for Pu239, just add it to the U235 content to get the total atomic density of fissile material.