# 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
instance of `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.volume_calculations`

:

```
settings = openmc.Settings()
settings.volume_calculations = [cell_vol_calc, mat_vol_calc]
```

To execute the volume calculations, one can either set `Settings.run_mode`

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 `VolumeCalculation.from_hdf5()`

class
method:

```
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.