diff --git a/cpp/particles/p2p/p2p_distr_mpi.hpp b/cpp/particles/p2p/p2p_distr_mpi.hpp index b8b16d9fdb89c30fec7fdffa55d234f78bd5db73..6639fb70e5d3df4f1540b8025c00020c7849de07 100644 --- a/cpp/particles/p2p/p2p_distr_mpi.hpp +++ b/cpp/particles/p2p/p2p_distr_mpi.hpp @@ -675,9 +675,9 @@ public: // allocate rhs buffer descriptor.results.reset(new real_number[NbParticlesToReceive*size_particle_rhs]); // clean up rhs buffer - std::fill_n(descriptor.results.get(), NbParticlesToReceive*size_particle_rhs, 0); - // precompute rhs buffer (?) - computer_thread.template init_result_array<size_particle_rhs>(descriptor.results.get(), NbParticlesToReceive); + set_particle_data_to_zero<partsize_t, real_number, size_particle_rhs>( + descriptor.results.get(), + NbParticlesToReceive); // Compute partsize_t idxPart = 0; diff --git a/cpp/particles/particles_distr_mpi.hpp b/cpp/particles/particles_distr_mpi.hpp index aa6478f0e37640f57b1836f25485ec2c14e2c189..df2dd6b9444d6371ced0f9cfb51925234657b68f 100644 --- a/cpp/particles/particles_distr_mpi.hpp +++ b/cpp/particles/particles_distr_mpi.hpp @@ -413,11 +413,19 @@ public: const partsize_t NbParticlesToReceive = descriptor.nbParticlesToRecv; assert(descriptor.toCompute != nullptr); + // allocate buffer descriptor.results.reset(new real_number[NbParticlesToReceive*size_particle_rhs]); - in_computer.template init_result_array<size_particle_rhs>(descriptor.results.get(), NbParticlesToReceive); + // clean up buffer + set_particle_data_to_zero<partsize_t, real_number, size_particle_rhs>( + descriptor.results.get(), + NbParticlesToReceive); if(more_than_one_thread == false){ - in_computer.template apply_computation<field_class, size_particle_positions, size_particle_rhs>(in_field, descriptor.toCompute.get(), descriptor.results.get(), NbParticlesToReceive); + in_computer.template apply_computation<field_class, size_particle_positions, size_particle_rhs>( + in_field, + descriptor.toCompute.get(), + descriptor.results.get(), + NbParticlesToReceive); } else{ TIMEZONE_OMP_INIT_PRETASK(timeZoneTaskKey) diff --git a/cpp/particles/particles_utils.hpp b/cpp/particles/particles_utils.hpp index fcb9802231603f7b7f182e679b286857212c4919..4cef3a3b4d4c44d44408a328497ebca94a7df8a9 100644 --- a/cpp/particles/particles_utils.hpp +++ b/cpp/particles/particles_utils.hpp @@ -398,4 +398,19 @@ std::vector<real_number> BuildLimitsAllProcesses( return spatial_limit_per_proc; } -#endif +template <typename partsize_t, typename rnumber, int size_of_particle> +int set_particle_data_to_zero( + rnumber __restrict__ *data, + const partsize_t numberParticles) +{ + // TODO: ensure simd. + // don't use openmp here, as this function may be called from within openmp parallel regions + std::fill_n( + data, + numberParticles*size_of_particle, + 0); + return EXIT_SUCCESS; +} + +#endif//PARTICLES_UTILS_HPP +