Aboria is a C++ library that enables computations over a set of particles or points in N-dimensional space, with the aim of providing a useful library for implementing particle-based numerical algorithms, for example Molecular Dynamics, Smoothed Particle Hydrodynamics or Radial Basis Functions.
The library gives you a STL compatible container class to store a particle set containing a position and unique id for each particle, as well as any number of user-defined variables with arbitrary types.
ABORIA_VARIABLE(scalar, double, "an example scalar variable") const int DIM = 2; using Particles_t = Particles<std::tuple<scalar>,DIM>; using position = Particles_t::position; Particles_t particles(100); std::normal_distribution<double> normal(0.5, 0.2); std::default_random_engine gen; for (auto i: particles) { get<position>(i) = vdouble2(normal(gen), normal(gen)); get<scalar>(i) = normal(gen); }Aboria gives you the ability to embed each particle set within a hypercube domain with arbitrary periodicity. The underlying data structure can be a cell list, kd-tree or hyper oct-tree.
These data structures provide flexible neighbourhood queries that return iterators, and can use any integer p-norm distance measure for p > 0.
for (auto i = euclidean_search(particles.get_query(), vdouble2::Constant(0), radius); i != false; ++i) { std::cout << "Found a particle with dx = " << i.dx() << " and id = " << get<id>(*i) << "\n"; }Aboria gives you an API for forming linear kernel operators from C++ lambda functions, This can be used, for example, to implement Radial Basis Function kernels. These can be wrapped as Eigen matrices in order to solve linear systems.
auto K = create_sparse_operator( particles, particles, radius, [epsilon](const vdouble2 &dx, auto i, auto j) { return (get<scalar>(i) * get<scalar>(j)) / (dx.norm() + epsilon); }); // matrix-vector multiply (matrix-free) const int N = particles.size(); Eigen::VectorXd b = Eigen::VectorXd::LinSpaced(N, 0, 1.0); Eigen::VectorXd c = K * b; // matrix-vector multiply (assemble to a matrix first) Eigen::MatrixXd K_eigen(N, N); K.assemble(K_eigen); c = K_eigen * b;Aboria is distributed under a BSD 3-Clause License, see LICENCE for more details. For documentation see the Aboria website. If you are interested in contributing to Aboria, having trouble getting it working or just have a question, send me an email at martin.robinson@cs.ox.ac.uk or create a GitHub issue or pull request.