diff --git a/bfps/cpp/full_code/test_interpolation.cpp b/bfps/cpp/full_code/test_interpolation.cpp
index e702e7089d390168957ac440e8e723b4a1468c7a..b194d372f6b40916bcd64ff8268a44694b0465d0 100644
--- a/bfps/cpp/full_code/test_interpolation.cpp
+++ b/bfps/cpp/full_code/test_interpolation.cpp
@@ -131,8 +131,12 @@ int test_interpolation<rnumber>::do_work()
             this->nabla_u->rval(741, 1, 2) - this->nabla_u->rval(741, 2, 1));
 
     // allocate interpolation arrays
-    std::unique_ptr<double[]> p3data(new double[3*this->ps->getLocalNbParticles()]);
-    std::unique_ptr<double[]> p9data(new double[9*this->ps->getLocalNbParticles()]);
+    std::unique_ptr<double[]> p3data;
+    std::unique_ptr<double[]> p9data;
+    if(this->ps->getLocalNbParticles()){
+        p3data.reset(new double[3*this->ps->getLocalNbParticles()]);
+        p9data.reset(new double[9*this->ps->getLocalNbParticles()]);
+    }
 
     /// sample position
     std::copy(this->ps->getParticlesState(),
@@ -150,7 +154,9 @@ int test_interpolation<rnumber>::do_work()
     /// sample velocity at particles' position
     std::fill_n(p3data.get(), 3*this->ps->getLocalNbParticles(), 0);
     this->ps->sample_compute_field(*this->velocity, p3data.get());
-    DEBUG_MSG("first vel value is %g\n", p3data.get()[0]);
+    if(p3data){
+        DEBUG_MSG("first vel value is %g\n", p3data.get()[0]);
+    }
     this->particles_sample_writer_mpi->template save_dataset<3>(
             "tracers0",
             "velocity",
@@ -162,7 +168,9 @@ int test_interpolation<rnumber>::do_work()
     /// sample vorticity at particles' position
     std::fill_n(p3data.get(), 3*this->ps->getLocalNbParticles(), 0);
     this->ps->sample_compute_field(*this->vorticity, p3data.get());
-    DEBUG_MSG("first vort value is %g\n", p3data.get()[0]);
+    if(p3data){
+        DEBUG_MSG("first vort value is %g\n", p3data.get()[0]);
+    }
     this->particles_sample_writer_mpi->template save_dataset<3>(
             "tracers0",
             "vorticity",
@@ -174,7 +182,9 @@ int test_interpolation<rnumber>::do_work()
     /// sample velocity gradient at particles' position
     std::fill_n(p9data.get(), 9*this->ps->getLocalNbParticles(), 0);
     this->ps->sample_compute_field(*this->nabla_u, p9data.get());
-    DEBUG_MSG("first vel gradient value is %g\n", p9data.get()[0]);
+    if(p9data){
+        DEBUG_MSG("first vel gradient value is %g\n", p9data.get()[0]);
+    }
     this->particles_sample_writer_mpi->template save_dataset<9>(
             "tracers0",
             "velocity_gradient",
diff --git a/bfps/cpp/particles/abstract_particles_output.hpp b/bfps/cpp/particles/abstract_particles_output.hpp
index 6c4c811ba6056bc552818d3460252bd8deb3889d..4fc344d3b102c7af2f3669854718861f0de5c8e8 100644
--- a/bfps/cpp/particles/abstract_particles_output.hpp
+++ b/bfps/cpp/particles/abstract_particles_output.hpp
@@ -67,10 +67,10 @@ public:
     abstract_particles_output(MPI_Comm in_mpi_com, const partsize_t inTotalNbParticles, const int in_nb_rhs) throw()
             : mpi_com(in_mpi_com), my_rank(-1), nb_processes(-1),
                 total_nb_particles(inTotalNbParticles), nb_rhs(in_nb_rhs),
-                buffer_particles_rhs_send(in_nb_rhs), size_buffers_send(-1),
-                buffers_size_particle_rhs_send(-1),
-                buffer_particles_rhs_recv(in_nb_rhs), size_buffers_recv(-1),
-                buffers_size_particle_rhs_recv(-1),
+                buffer_particles_rhs_send(in_nb_rhs), size_buffers_send(0),
+                buffers_size_particle_rhs_send(0),
+                buffer_particles_rhs_recv(in_nb_rhs), size_buffers_recv(0),
+                buffers_size_particle_rhs_recv(0),
                 nb_processes_involved(0), current_is_involved(true), particles_chunk_per_process(0),
                 particles_chunk_current_size(0), particles_chunk_current_offset(0) {
 
@@ -139,16 +139,16 @@ public:
     void releaseMemory(){
         buffer_indexes_send.release();
         buffer_particles_positions_send.release();
-        size_buffers_send = -1;
+        size_buffers_send = 0;
         buffer_indexes_recv.release();
         buffer_particles_positions_recv.release();
-        size_buffers_recv = -1;
+        size_buffers_recv = 0;
         for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
             buffer_particles_rhs_send[idx_rhs].release();
             buffer_particles_rhs_recv[idx_rhs].release();
         }
-        buffers_size_particle_rhs_send = -1;
-        buffers_size_particle_rhs_recv = -1;
+        buffers_size_particle_rhs_send = 0;
+        buffers_size_particle_rhs_recv = 0;
     }
 
     template <int size_particle_rhs>
@@ -164,7 +164,7 @@ public:
         {
             TIMEZONE("sort-to-distribute");
 
-            if(size_buffers_send < nb_particles && nb_particles){
+            if(size_buffers_send < nb_particles){
                 size_buffers_send = nb_particles;
                 buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[size_buffers_send]);
                 buffer_particles_positions_send.reset(new real_number[size_buffers_send*size_particle_positions]);
@@ -176,10 +176,12 @@ public:
                     buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
                 }
             }
-            else if(buffers_size_particle_rhs_send < size_particle_rhs && size_particle_rhs > 0 && size_buffers_send > 0){
+            else if(buffers_size_particle_rhs_send < size_particle_rhs){
                 buffers_size_particle_rhs_send = size_particle_rhs;
-                for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
-                    buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
+                if(size_buffers_send > 0){
+                    for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
+                        buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
+                    }
                 }
             }
 
@@ -225,23 +227,23 @@ public:
         const int nb_to_receive = exchanger.getTotalToRecv();
         assert(nb_to_receive == particles_chunk_current_size);
 
-        if(size_buffers_recv < nb_to_receive && nb_to_receive){
+        if(size_buffers_recv < nb_to_receive){
             size_buffers_recv = nb_to_receive;
             buffer_indexes_recv.reset(new partsize_t[size_buffers_recv]);
             buffer_particles_positions_recv.reset(new real_number[size_buffers_recv*size_particle_positions]);
-            
-            if(buffers_size_particle_rhs_recv < size_particle_rhs){
-                buffers_size_particle_rhs_recv = size_particle_rhs;
-            }
+
+            buffers_size_particle_rhs_recv = size_particle_rhs;
             for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
                 buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
             }
         }
-        else if(buffers_size_particle_rhs_recv < size_particle_rhs && size_buffers_recv > 0){
+        else if(buffers_size_particle_rhs_recv < size_particle_rhs){
             buffers_size_particle_rhs_recv = size_particle_rhs;
-            for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
-                buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
-            }        
+            if(size_buffers_recv > 0){
+                for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
+                    buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]);
+                }
+            }
         }
 
         {
@@ -260,10 +262,11 @@ public:
             return;
         }
 
-        if(size_buffers_send < nb_to_receive && nb_to_receive){
+        if(size_buffers_send < nb_to_receive){
             size_buffers_send = nb_to_receive;
             buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[size_buffers_send]);
             buffer_particles_positions_send.reset(new real_number[size_buffers_send*size_particle_positions]);
+            buffers_size_particle_rhs_send = size_particle_rhs;
             for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){
                 buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]);
             }