diff --git a/bfps/cpp/particles/particles_field_computer.hpp b/bfps/cpp/particles/particles_field_computer.hpp index 96e9a1e9d6fb411ef899aa6eb9b53469ffa8e225..32687dad5e707566c49e8cb649c125084dc29cd8 100644 --- a/bfps/cpp/particles/particles_field_computer.hpp +++ b/bfps/cpp/particles/particles_field_computer.hpp @@ -120,9 +120,10 @@ class particles_field_computer : public abstract_particles_distr<real_number, 3, const ptrdiff_t tindex = field.getIndexFromGlobalPosition(idx_x_pbc, idx_y_pbc, idx_z_pbc); - particles_current_rhs[idxPart*3+IDX_X] += field.getValue(tindex,IDX_X)*coef; - particles_current_rhs[idxPart*3+IDX_Y] += field.getValue(tindex,IDX_Y)*coef; - particles_current_rhs[idxPart*3+IDX_Z] += field.getValue(tindex,IDX_Z)*coef; + // getValue does not necessary return real_number + particles_current_rhs[idxPart*3+IDX_X] += real_number(field.getValue(tindex,IDX_X))*coef; + particles_current_rhs[idxPart*3+IDX_Y] += real_number(field.getValue(tindex,IDX_Y))*coef; + particles_current_rhs[idxPart*3+IDX_Z] += real_number(field.getValue(tindex,IDX_Z))*coef; } } } diff --git a/bfps/cpp/particles/particles_input_hdf5.hpp b/bfps/cpp/particles/particles_input_hdf5.hpp index ee08421ee0e88892600362b47a8316359928f9f8..d413af0aa1e97937b710e316001e57785d6d28b4 100644 --- a/bfps/cpp/particles/particles_input_hdf5.hpp +++ b/bfps/cpp/particles/particles_input_hdf5.hpp @@ -187,7 +187,7 @@ public: hid_t rspace = H5Dget_space(dset); assert(rspace >= 0); - for(int idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ + for(hsize_t idx_rhs = 0 ; idx_rhs < nb_rhs ; ++idx_rhs){ split_particles_rhs[idx_rhs].reset(new real_number[load_splitter.getMySize()*size_particle_rhs]); hsize_t offset[4] = {0, idx_rhs, load_splitter.getMyOffset(), 0}; diff --git a/bfps/cpp/particles/particles_output_hdf5.hpp b/bfps/cpp/particles/particles_output_hdf5.hpp index 5d5b13fbc3582ce093813a8f9fb6d797729a40a6..57b1d204d0a02497472bacd73f0ff6228fbca2dc 100644 --- a/bfps/cpp/particles/particles_output_hdf5.hpp +++ b/bfps/cpp/particles/particles_output_hdf5.hpp @@ -56,7 +56,9 @@ public: const hid_t type_id = (sizeof(real_number) == 8?H5T_NATIVE_DOUBLE:H5T_NATIVE_FLOAT); { - const hsize_t datacount[3] = {1, total_nb_particles, size_particle_positions}; + assert(total_nb_particles >= 0); + assert(size_particle_positions >= 0); + const hsize_t datacount[3] = {1, hsize_t(total_nb_particles), hsize_t(size_particle_positions)}; hid_t dataspace = H5Screate_simple(3, datacount, NULL); assert(dataspace >= 0); @@ -64,8 +66,10 @@ public: H5P_DEFAULT, H5P_DEFAULT); assert(dataset_id >= 0); - const hsize_t count[3] = {1, nb_particles, size_particle_positions}; - const hsize_t offset[3] = {0, particles_idx_offset, 0}; + assert(nb_particles >= 0); + assert(particles_idx_offset >= 0); + const hsize_t count[3] = {1, hsize_t(nb_particles), size_particle_positions}; + const hsize_t offset[3] = {0, hsize_t(particles_idx_offset), 0}; hid_t memspace = H5Screate_simple(3, count, NULL); assert(memspace >= 0); @@ -89,7 +93,8 @@ public: assert(rethdf >= 0); } { - const hsize_t datacount[3] = {1, total_nb_particles, size_particle_rhs}; + assert(size_particle_rhs >= 0); + const hsize_t datacount[3] = {1, hsize_t(total_nb_particles), hsize_t(size_particle_rhs)}; hid_t dataspace = H5Screate_simple(3, datacount, NULL); assert(dataspace >= 0); @@ -97,8 +102,9 @@ public: H5P_DEFAULT, H5P_DEFAULT); assert(dataset_id >= 0); - const hsize_t count[3] = {1, nb_particles, size_particle_rhs}; - const hsize_t offset[3] = {0, particles_idx_offset, 0}; + assert(particles_idx_offset >= 0); + const hsize_t count[3] = {1, hsize_t(nb_particles), hsize_t(size_particle_rhs)}; + const hsize_t offset[3] = {0, hsize_t(particles_idx_offset), 0}; hid_t memspace = H5Screate_simple(3, count, NULL); assert(memspace >= 0); diff --git a/bfps/cpp/particles/particles_system.hpp b/bfps/cpp/particles/particles_system.hpp index 7a9c3f6ffe0c2a28490a197527c72d279bf08374..56f4fe793dbd82e7f33d56db7cd49c93c7fb4c32 100644 --- a/bfps/cpp/particles/particles_system.hpp +++ b/bfps/cpp/particles/particles_system.hpp @@ -12,18 +12,18 @@ #include "particles_adams_bashforth.hpp" #include "scope_timer.hpp" -template <class real_number, class interpolator_class, int interp_neighbours> +template <class real_number, class field_rnumber, class interpolator_class, int interp_neighbours> class particles_system : public abstract_particles_system<real_number> { MPI_Comm mpi_com; const std::pair<int,int> current_partition_interval; const int partition_interval_size; - field_accessor<real_number> field; + field_accessor<field_rnumber> field; interpolator_class interpolator; - particles_field_computer<real_number, interpolator_class, field_accessor<real_number>, interp_neighbours, particles_adams_bashforth<real_number, 3,3>> computer; + particles_field_computer<real_number, interpolator_class, field_accessor<field_rnumber>, interp_neighbours, particles_adams_bashforth<real_number, 3,3>> computer; std::unique_ptr<int[]> current_my_nb_particles_per_partition; std::unique_ptr<int[]> current_offset_particles_for_partition; @@ -44,7 +44,7 @@ public: particles_system(const std::array<size_t,3>& field_grid_dim, const std::array<real_number,3>& in_spatial_box_width, const std::array<real_number,3>& in_spatial_partition_width, const real_number in_my_spatial_low_limit, const real_number in_my_spatial_up_limit, - const real_number* in_field_data, const std::array<size_t,3>& in_local_field_dims, + const field_rnumber* in_field_data, const std::array<size_t,3>& in_local_field_dims, const std::array<size_t,3>& in_local_field_offset, const std::array<size_t,3>& in_field_memory_dims, MPI_Comm in_mpi_com) diff --git a/bfps/cpp/particles/particles_system_builder.hpp b/bfps/cpp/particles/particles_system_builder.hpp index 0542844cfb1f73c40a65e16a06d4b3f991b43662..30e3be8cfcdfb519aa0f85b792e40b1c2d06e02c 100644 --- a/bfps/cpp/particles/particles_system_builder.hpp +++ b/bfps/cpp/particles/particles_system_builder.hpp @@ -108,11 +108,11 @@ inline RetType evaluate(IterType1 value1, IterType2 value2, Args... args){ /// ////////////////////////////////////////////////////////////////////////////// -template <class rnumber, field_backend be> +template <class field_rnumber, field_backend be, class particles_rnumber> struct particles_system_build_container { template <const int interpolation_size, const int spline_mode> - static std::unique_ptr<abstract_particles_system<rnumber>> instanciate( - const field<rnumber, be, THREE>* fs_cvorticity, // (field object) + static std::unique_ptr<abstract_particles_system<particles_rnumber>> instanciate( + const field<field_rnumber, be, THREE>* fs_cvorticity, // (field object) const kspace<be, SMOOTH>* fs_kk, // (kspace object, contains dkx, dky, dkz) const int nsteps, // to check coherency between parameters and hdf input file (nb rhs) const int nparticles, // to check coherency between parameters and hdf input file @@ -160,23 +160,23 @@ struct particles_system_build_container { local_field_mem_size[IDX_Z] = fs_cvorticity->rmemlayout->subsizes[IDX_Z]; // The spatial box size (all particles should be included inside) - std::array<rnumber,3> spatial_box_width; + std::array<particles_rnumber,3> spatial_box_width; spatial_box_width[IDX_X] = 4 * acos(0) / (fs_kk->dkx); spatial_box_width[IDX_Y] = 4 * acos(0) / (fs_kk->dky); spatial_box_width[IDX_Z] = 4 * acos(0) / (fs_kk->dkz); // The distance between two field nodes in z - std::array<rnumber,3> spatial_partition_width; - spatial_partition_width[IDX_X] = spatial_box_width[IDX_X]/rnumber(field_grid_dim[IDX_X]); - spatial_partition_width[IDX_Y] = spatial_box_width[IDX_Y]/rnumber(field_grid_dim[IDX_Y]); - spatial_partition_width[IDX_Z] = spatial_box_width[IDX_Z]/rnumber(field_grid_dim[IDX_Z]); + std::array<particles_rnumber,3> spatial_partition_width; + spatial_partition_width[IDX_X] = spatial_box_width[IDX_X]/particles_rnumber(field_grid_dim[IDX_X]); + spatial_partition_width[IDX_Y] = spatial_box_width[IDX_Y]/particles_rnumber(field_grid_dim[IDX_Y]); + spatial_partition_width[IDX_Z] = spatial_box_width[IDX_Z]/particles_rnumber(field_grid_dim[IDX_Z]); // The spatial interval of the current process - const rnumber my_spatial_low_limit_z = rnumber(local_field_offset[IDX_Z])*spatial_partition_width[IDX_Z]; - const rnumber my_spatial_up_limit_z = rnumber(local_field_offset[IDX_Z]+local_field_dims[IDX_Z])*spatial_partition_width[IDX_Z]; + const particles_rnumber my_spatial_low_limit_z = particles_rnumber(local_field_offset[IDX_Z])*spatial_partition_width[IDX_Z]; + const particles_rnumber my_spatial_up_limit_z = particles_rnumber(local_field_offset[IDX_Z]+local_field_dims[IDX_Z])*spatial_partition_width[IDX_Z]; // Create the particles system - particles_system<rnumber, particles_interp_spline<double, interpolation_size,spline_mode>, interpolation_size>* part_sys - = new particles_system<rnumber, particles_interp_spline<double, interpolation_size,spline_mode>, interpolation_size>(field_grid_dim, + particles_system<particles_rnumber, field_rnumber, particles_interp_spline<particles_rnumber, interpolation_size,spline_mode>, interpolation_size>* part_sys + = new particles_system<particles_rnumber, field_rnumber, particles_interp_spline<particles_rnumber, interpolation_size,spline_mode>, interpolation_size>(field_grid_dim, spatial_box_width, spatial_partition_width, my_spatial_low_limit_z, @@ -189,7 +189,7 @@ struct particles_system_build_container { // Load particles from hdf5 - particles_input_hdf5<rnumber, 3,3> generator(mpi_comm, fname_input, + particles_input_hdf5<particles_rnumber, 3,3> generator(mpi_comm, fname_input, dset_name, my_spatial_low_limit_z, my_spatial_up_limit_z); // Ensure parameters match the input file @@ -207,14 +207,14 @@ struct particles_system_build_container { part_sys->init(generator); // Return the created particles system - return std::unique_ptr<abstract_particles_system<rnumber>>(part_sys); + return std::unique_ptr<abstract_particles_system<particles_rnumber>>(part_sys); } }; -template <class rnumber, field_backend be> -inline std::unique_ptr<abstract_particles_system<rnumber>> particles_system_builder( - const field<rnumber, be, THREE>* fs_cvorticity, // (field object) +template <class field_rnumber, field_backend be, class particles_rnumber = double> +inline std::unique_ptr<abstract_particles_system<particles_rnumber>> particles_system_builder( + const field<field_rnumber, be, THREE>* fs_cvorticity, // (field object) const kspace<be, SMOOTH>* fs_kk, // (kspace object, contains dkx, dky, dkz) const int nsteps, // to check coherency between parameters and hdf input file (nb rhs) const int nparticles, // to check coherency between parameters and hdf input file @@ -223,10 +223,10 @@ inline std::unique_ptr<abstract_particles_system<rnumber>> particles_system_buil const int interpolation_size, const int spline_mode, MPI_Comm mpi_comm){ - return Template_double_for_if::evaluate<std::unique_ptr<abstract_particles_system<rnumber>>, + return Template_double_for_if::evaluate<std::unique_ptr<abstract_particles_system<particles_rnumber>>, int, 1, 7, 1, // interpolation_size int, 0, 3, 1, // spline_mode - particles_system_build_container<rnumber,be>>( + particles_system_build_container<field_rnumber,be,particles_rnumber>>( interpolation_size, // template iterator 1 spline_mode, // template iterator 2 fs_cvorticity,fs_kk, nsteps, nparticles, fname_input, dset_name, mpi_comm);