How to choose the neighbor list buffer distance#

Set the neighbor list buffer distance (hoomd.md.nlist.NeighborList.buffer) to maximize the performance of your simulation. The neighbor list recomputes itself more often when buffer is small, and the pair force computation takes more time when buffer is large. There is an optimal value between the extremes that strongly depends on system size, density, the hardware device, the pair potential, step size, and more. Test your specific model, change buffer and measure the performance to find the optimal. For example:

import hoomd

kT = 1.5
sample_steps = 1000

# Prepare a MD simulation.
device = hoomd.device.auto_select()
simulation = hoomd.Simulation(device=device)
simulation.create_state_from_gsd(filename='spheres.gsd')
simulation.state.thermalize_particle_momenta(filter=hoomd.filter.All(), kT=kT)

neighbor_list = hoomd.md.nlist.Cell(buffer=0.4)
lj = hoomd.md.pair.LJ(nlist=neighbor_list)
lj.params[('A', 'A')] = dict(epsilon=1.0, sigma=1.0)
lj.r_cut[('A', 'A')] = 2.5

bussi = hoomd.md.methods.thermostats.Bussi(kT=kT)
constant_volume = hoomd.md.methods.ConstantVolume(filter=hoomd.filter.All(),
                                                  thermostat=bussi)
simulation.operations.integrator = hoomd.md.Integrator(
    dt=0.001, methods=[constant_volume], forces=[lj])

# Complete GPU kernel autotuning before making sensitive timing measurements.
if isinstance(device, hoomd.device.GPU):
    simulation.run(0)
    while not simulation.operations.is_tuning_complete:
        simulation.run(1000)

for buffer in [0, 0.05, 0.1, 0.2, 0.3]:
    neighbor_list.buffer = buffer
    simulation.run(sample_steps)
    device.notice(f'buffer={buffer}: TPS={simulation.tps:0.3g}, '
                  f'num_builds={neighbor_list.num_builds}')

Example output:

buffer=0: TPS=212, num_builds=1001
buffer=0.05: TPS=584, num_builds=197
buffer=0.1: TPS=839, num_builds=102
buffer=0.2: TPS=954, num_builds=53
buffer=0.3: TPS=880, num_builds=37

Important

Ensure that you run sufficient steps to sample many neighbor list builds to properly sample the amortized time spent per build.

Tip

Measure the optimal value of buffer in testing, then apply that fixed value in production runs to avoid wasting time at non-optimal values.

See also

hoomd.md.tune.NeighborListBuffer can automate this process.