14. Stochastic Volume Calculations¶
OpenMC has a capability to stochastically determine volumes of cells, materials, and universes. The method works by overlaying a bounding box, sampling points from within the box, and seeing what fraction of points were found in a desired domain. The benefit of doing this stochastically (as opposed to equally-spaced points), is that it is possible to give reliable error estimates on each stochastic quantity.
To specify that a volume calculation be run, you first need to create an
openmc.VolumeCalculation. The constructor takes a list of
cells, materials, or universes; the number of samples to be used; and the
lower-left and upper-right Cartesian coordinates of a bounding box that encloses
the specified domains:
lower_left = (-0.62, -0.62, -50.) upper_right = (0.62, 0.62, 50.) vol_calc = openmc.VolumeCalculation([fuel, clad, moderator], 1000000, lower_left, upper_right)
For domains contained within regions that have simple definitions, OpenMC can sometimes automatically determine a bounding box. In this case, the last two arguments are not necessary. For example,
sphere = openmc.Sphere(r=10.0) cell = openm.Cell(region=-sphere) vol_calc = openmc.VolumeCalculation([cell], 1000000)
Of course, the volumes that you need this capability for are often the ones with complex definitions.
Once you have one or more
openmc.VolumeCalculation objects created, you
can then assign then to
settings = openmc.Settings() settings.volume_calculations = [cell_vol_calc, mat_vol_calc]
To execute the volume calculations, one can either set
to ‘volume’ and run
openmc.run(), or alternatively run
openmc.calculate_volumes() which doesn’t require that
Settings.run_mode be set.
When your volume calculations have finished, you can load the results using the
VolumeCalculation.load_results() method on an existing object. If you
don’t have an existing
VolumeCalculation object, you can create one and
load results simultaneously using the
vol_calc = openmc.VolumeCalculation(...) ... openmc.calculate_volumes() vol_calc.load_results('volume_1.h5') # ..or we can create a new object vol_calc = openmc.VolumeCalculation.from_hdf5('volume_1.h5')
After the results are loaded, volume estimates will be stored in
VolumeCalculation.volumes. There is also a
VolumeCalculation.atoms_dataframe attribute that shows stochastic
estimates of the number of atoms of each type of nuclide within the specified
domains along with their uncertainties.