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);