31#include <boost/mpi/collectives/gather.hpp>
32#include <boost/mpi/collectives/reduce.hpp>
33#include <boost/serialization/utility.hpp>
34#include <boost/serialization/vector.hpp>
47 std::vector<std::reference_wrapper<Particle const>>;
56 std::vector<int> m_ids;
58 virtual std::vector<double>
66 operator()(boost::mpi::communicator
const &comm)
const final;
67 std::vector<int>
const &
ids()
const {
return m_ids; }
76template <
class T>
struct shape_impl;
78template <>
struct shape_impl<
double> {
79 static std::vector<std::size_t> eval(std::size_t ) {
return {1}; }
81template <
class _, std::
size_t N>
struct shape_impl<
Utils::Vector<_, N>> {
82 static std::vector<std::size_t> eval(std::size_t ) {
return {
N}; }
84template <
class T>
struct shape_impl<
std::
vector<T>> {
85 static std::vector<std::size_t> eval(std::size_t n_part) {
86 std::vector<std::size_t>
ret{n_part};
87 std::ranges::copy(shape_impl<T>::eval(n_part), std::back_inserter(
ret));
92template <
class T,
class U>
struct shape_impl<
std::
pair<T, U>> {
93 static std::vector<std::size_t> eval(std::size_t n_part) {
94 return shape_impl<T>::eval(n_part);
98inline auto get_argsort(boost::mpi::communicator
const &comm,
101 std::vector<unsigned int>
argsort{};
105 if (comm.rank() == 0) {
110 for (
auto const pid :
vec) {
132get_all_particle_positions(boost::mpi::communicator
const &comm,
137 using pos_type =
decltype(
traits.position(std::declval<Particle>()));
143 for (
auto const &
particle : local_particles) {
158 if (comm.rank() != 0) {
159 return std::vector<pos_type>();
165 for (
auto const &pos :
vec) {
198 std::vector<std::size_t>
shape()
const override {
201 return detail::shape_impl<decltype(declval<ObsType>()(
205 template <
typename T>
struct is_map : std::false_type {};
206 template <
typename T>
228 if (comm.rank() != 0) {
233 auto const size = std::accumulate(
235 [](
auto const acc,
auto const &
vec) { return acc + vec.size(); });
243 for (
auto const val :
vec) {
248 std::vector<double>
output{};
252 for (std::size_t
j = 0;
j <
n_dims; ++
j) {
261 boost::mpi::reduce(comm,
local_result, result, observable, 0);
Vector implementation and trait types for boost qvm interoperability.
Base class for observables.
This class implements an interface to the particle_observables library that implements necessary algo...
std::vector< double > evaluate(boost::mpi::communicator const &comm, ParticleReferenceRange const &local_particles, ParticleObservables::traits< Particle > const &) const override
std::vector< std::size_t > shape() const override
Particle-based observable.
PidObservable(std::vector< int > ids)
std::vector< int > const & ids() const
std::vector< double > operator()(boost::mpi::communicator const &comm) const final
virtual std::vector< double > evaluate(boost::mpi::communicator const &comm, ParticleReferenceRange const &local_particles, const ParticleObservables::traits< Particle > &traits) const =0
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
std::vector< std::reference_wrapper< Particle const > > ParticleReferenceRange
void flatten(Range const &v, OutputIterator out)
Flatten a range of ranges.
std::vector< T, allocator< T > > vector