openmc.model.pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, domain_radius=None, domain_center=[0.0, 0.0, 0.0], n_particles=None, packing_fraction=None, initial_packing_fraction=0.3, contraction_rate=0.0025, seed=1)[source]

Generate a random, non-overlapping configuration of TRISO particles within a container.

  • radius (float) – Outer radius of TRISO particles.
  • fill (openmc.Universe) – Universe which contains all layers of the TRISO particle.
  • domain_shape ({'cube', 'cylinder', or 'sphere'}) – Geometry of the container in which the TRISO particles are packed.
  • domain_length (float) – Length of the container (if cube or cylinder).
  • domain_radius (float) – Radius of the container (if cylinder or sphere).
  • domain_center (Iterable of float) – Cartesian coordinates of the center of the container.
  • n_particles (int) – Number of TRISO particles to pack in the domain. Exactly one of ‘n_particles’ and ‘packing_fraction’ should be specified – the other will be calculated.
  • packing_fraction (float) – Packing fraction of particles. Exactly one of ‘n_particles’ and ‘packing_fraction’ should be specified – the other will be calculated.
  • initial_packing_fraction (float, optional) – Packing fraction used to initialize the configuration of particles in the domain. Default value is 0.3. It is not recommended to set the initial packing fraction much higher than 0.3 as the random sequential packing algorithm becomes prohibitively slow as it approaches its limit (~0.38).
  • contraction_rate (float, optional) – Contraction rate of outer diameter. This can affect the speed of the close random packing algorithm. Default value is 1/400.
  • seed (int, optional) – RNG seed.

trisos – List of TRISO particles in the domain.

Return type:

list of openmc.model.TRISO


The particle configuration is generated using a combination of random sequential packing (RSP) and close random packing (CRP). RSP performs better than CRP for lower packing fractions (pf), but it becomes prohibitively slow as it approaches its packing limit (~0.38). CRP can achieve higher pf of up to ~0.64 and scales better with increasing pf.

If the desired pf is below some threshold for which RSP will be faster than CRP (‘initial_packing_fraction’), only RSP is used. If a higher pf is required, particles with a radius smaller than the desired final radius (and therefore with a smaller pf) are initialized within the domain using RSP. This initial configuration of particles is then used as a starting point for CRP using Jodrey and Tory’s algorithm [1].

In RSP, particle centers are placed one by one at random, and placement attempts for a particle are made until the particle is not overlapping any others. This implementation of the algorithm uses a mesh over the domain to speed up the nearest neighbor search by only searching for a particle’s neighbors within that mesh cell.

In CRP, each particle is assigned two diameters, and inner and an outer, which approach each other during the simulation. The inner diameter, defined as the minimum center-to-center distance, is the true diameter of the particles and defines the pf. At each iteration the worst overlap between particles based on outer diameter is eliminated by moving the particles apart along the line joining their centers. Iterations continue until the two diameters converge or until the desired pf is reached.


[1]W. S. Jodrey and E. M. Tory, “Computer simulation of close random packing of equal spheres”, Phys. Rev. A 32 (1985) 2347-2351.