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
+