As well as neighbourhood searching, Aboria has functionality to search by each
particle's unique id. First, let's create a set of N
particles and randomly rearrange their position in the vector
const size_t N = 100; typedef Particles<> particle_type; particle_type particles(N); std::default_random_engine g; std::shuffle(particles.begin(), particles.end(), g);
This will create a set of particles that each have a unique id between 0
and N-1
(but their
positions in the vector particles
is randomised). Now, we are going to turn on the id search capability for
particles
particles.init_id_search();
Then we will try and find the particle with id equal to 2.
auto id_2 = particles.get_query().find(2); assert(*get<id>(id_2) == 2);
Note that each find
function
(e.g. Aboria::CellListQuery::find
)
returns an iterator to the particle set. If we try and search for an id which
doesn't exist, then this iterator will point to the end of the particle vector
auto id_2N = particles.get_query().find(2 * N); assert(id_2N == iterator_to_raw_pointer(particles.end()));
Finally, a note on performance: The id search is done by internally creating
vectors of id and indicies ordered by id. Keeping these vectors ordered at
each call to Aboria::Particles::update_positions
takes O(Nlog(N)). The call to find
performs a binary search on the ordered vectors, with takes O(log(N)) time.