-
Notifications
You must be signed in to change notification settings - Fork 587
Description
As @jessicahunter24 has pointed out, our implementation of the UFS method relies on each UFS mesh cell having equal volume fractions of fuel. In general, this is not true, e.g. the ATR model. To remedy this situation, we need the capability to calculate the volume fraction of fuel regions at the beginning of a run. There are a number of ways to do this:
- For each mesh cell, pick points uniformly in the mesh cell, call find_cell, and see if the resulting cell/material contains a fissionable nuclide. Do this repeatedly to see what fraction of points are in fuel. That fraction times the volume of the mesh cell is the volume of the fuel.
- Cover each mesh cell with rays and add up the track lengths in fissionable regions -- this is similar to how volume is calculated in MOC.
- More advanced methods as outlined in LA-8113-MS or Dave Millman's thesis work.
We would introduce a new variable real(8), allocatable :: ufs_volume_frac(:,:,:) where each item is the calculated volume fraction for a mesh cell. This variable would be used in lieu of ufs_mesh % volume_frac.
To check if a material is fissionable, right now we would have to check every nuclide in the material -- this could be circumventing by adding an attribute logical :: fissionable on the Material type and then performing the check at initialization time for every material in the problem.
The problem with options 1 and 2 is that they would introduce stochastic error into the estimate of the volume fraction, which would then bias the source distribution and hence the tally results. Problem 3 is more attractive from this perspective, but would require significantly more work since the method is not as simple. An entirely alternative option would be to have the user input volume fractions, but that would be very cumbersome.