diff --git a/bfps/cpp/particles/abstract_particles_output.hpp b/bfps/cpp/particles/abstract_particles_output.hpp index 7510bc6e9990e8cb714580567da7e9ae9842bf87..cf71c99e72adec24273da23b5c113de5e1af02fb 100644 --- a/bfps/cpp/particles/abstract_particles_output.hpp +++ b/bfps/cpp/particles/abstract_particles_output.hpp @@ -28,11 +28,13 @@ class abstract_particles_output { std::unique_ptr<real_number[]> buffer_particles_positions_send; std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_send; partsize_t size_buffers_send; + int buffers_size_particle_rhs_send; std::unique_ptr<real_number[]> buffer_particles_positions_recv; std::vector<std::unique_ptr<real_number[]>> buffer_particles_rhs_recv; std::unique_ptr<partsize_t[]> buffer_indexes_recv; - partsize_t size_buffers_recv; + partsize_t size_buffers_recv; + int buffers_size_particle_rhs_recv; int nb_processes_involved; bool current_is_involved; @@ -66,7 +68,9 @@ public: : 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), nb_processes_involved(0), current_is_involved(true), particles_chunk_per_process(0), particles_chunk_current_size(0), particles_chunk_current_offset(0) { @@ -143,6 +147,8 @@ public: 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; } template <int size_particle_rhs> @@ -159,12 +165,22 @@ public: TIMEZONE("sort-to-distribute"); if(size_buffers_send < nb_particles && nb_particles){ - buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[nb_particles]); - buffer_particles_positions_send.reset(new real_number[nb_particles*size_particle_positions]); + 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]); + + 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[nb_particles*size_particle_rhs]); + 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){ + 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]); } - size_buffers_send = nb_particles; } for(partsize_t idx_part = 0 ; idx_part < nb_particles ; ++idx_part){ @@ -210,12 +226,22 @@ public: assert(nb_to_receive == particles_chunk_current_size); if(size_buffers_recv < nb_to_receive && nb_to_receive){ - buffer_indexes_recv.reset(new partsize_t[nb_to_receive]); - buffer_particles_positions_recv.reset(new real_number[nb_to_receive*size_particle_positions]); + 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; + } for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ - buffer_particles_rhs_recv[idx_rhs].reset(new real_number[nb_to_receive*size_particle_rhs]); + buffer_particles_rhs_recv[idx_rhs].reset(new real_number[size_buffers_recv*buffers_size_particle_rhs_recv]); } - size_buffers_recv = nb_to_receive; + } + 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]); + } } { @@ -235,12 +261,12 @@ public: } if(size_buffers_send < nb_to_receive && nb_to_receive){ - buffer_indexes_send.reset(new std::pair<partsize_t,partsize_t>[nb_to_receive]); - buffer_particles_positions_send.reset(new real_number[nb_to_receive*size_particle_positions]); + 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]); for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ - buffer_particles_rhs_send[idx_rhs].reset(new real_number[nb_to_receive*size_particle_rhs]); + buffer_particles_rhs_send[idx_rhs].reset(new real_number[size_buffers_send*buffers_size_particle_rhs_send]); } - size_buffers_send = nb_to_receive; } {