diff --git a/bfps/cpp/field.hpp b/bfps/cpp/field.hpp index 360d37e668130fe1d0e0c415fa98d34fc6b13de3..4d3f78103205f92c8f042a6e4bc9861ccd7472ab 100644 --- a/bfps/cpp/field.hpp +++ b/bfps/cpp/field.hpp @@ -134,6 +134,13 @@ class field return *(this->data + rindex*ncomp(fc) + component); } + inline const rnumber& rval(ptrdiff_t rindex, unsigned int component = 0) const + { + assert(fc == ONE || fc == THREE); + assert(component >= 0 && component < ncomp(fc)); + return *(this->data + rindex*ncomp(fc) + component); + } + inline rnumber &rval(ptrdiff_t rindex, int comp1, int comp0) { assert(fc == THREExTHREE); @@ -242,6 +249,22 @@ class field zindex)*this->clayout->subsizes[2] + xindex); } + + ptrdiff_t get_rindex( + ptrdiff_t xindex, + ptrdiff_t yindex, + ptrdiff_t zindex) const + { + return ((yindex*this->rmemlayout->subsizes[1] + + zindex)*this->rmemlayout->subsizes[2] + + xindex); + } + + ptrdiff_t get_rindex_from_global(const ptrdiff_t in_global_x, const ptrdiff_t in_global_y, const ptrdiff_t in_global_z) const { + return get_rindex(in_global_x - this->rlayout->starts[2], + in_global_y - this->rlayout->starts[1], + in_global_z - this->rlayout->starts[0]); + } }; template <typename rnumber, diff --git a/bfps/cpp/particles/field_accessor.hpp b/bfps/cpp/particles/field_accessor.hpp deleted file mode 100644 index 74e96424669dca0a2f20bccba22db184a133acbc..0000000000000000000000000000000000000000 --- a/bfps/cpp/particles/field_accessor.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef FIELD_ACCESSOR_HPP -#define FIELD_ACCESSOR_HPP - -#include <algorithm> -#include <array> - -#include "particles_utils.hpp" - -template <class real_number> -class field_accessor { - static const int nb_dim = 3; - - const real_number* field_date; - std::array<size_t,3> local_field_dims; - std::array<size_t,3> local_field_offset; - std::array<size_t,3> field_memory_dims; - -public: - field_accessor(const real_number* in_field_date, const std::array<size_t,3>& in_dims, - const std::array<size_t,3>& in_local_field_offset, - const std::array<size_t,3>& in_field_memory_dims) - : field_date(in_field_date), local_field_dims(in_dims), - local_field_offset(in_local_field_offset), - field_memory_dims(in_field_memory_dims){ - } - - ~field_accessor(){} - - const real_number& getValue(const size_t in_index, const int in_dim) const { - assert(in_index < field_memory_dims[IDX_X]*field_memory_dims[IDX_Y]*field_memory_dims[IDX_Z]); - return field_date[in_index*nb_dim + in_dim]; - } - - size_t getIndexFromGlobalPosition(const size_t in_global_x, const size_t in_global_y, const size_t in_global_z) const { - return getIndexFromLocalPosition(in_global_x - local_field_offset[IDX_X], - in_global_y - local_field_offset[IDX_Y], - in_global_z - local_field_offset[IDX_Z]); - } - - size_t getIndexFromLocalPosition(const size_t in_local_x, const size_t in_local_y, const size_t in_local_z) const { - assert(0 <= in_local_x && in_local_x < local_field_dims[IDX_X]); - assert(0 <= in_local_y && in_local_y < local_field_dims[IDX_Y]); - assert(0 <= in_local_z && in_local_z < local_field_dims[IDX_Z]); - return (((in_local_z)*field_memory_dims[IDX_Y] + - in_local_y)*(field_memory_dims[IDX_X]) + - in_local_x); - } -}; - - -#endif diff --git a/bfps/cpp/particles/particles_field_computer.hpp b/bfps/cpp/particles/particles_field_computer.hpp index b7e60294d18bfb288564b981bb990bfb5ea7c5f4..2a835c0e7a064b3ed6a666b2e7b803af8bc86845 100644 --- a/bfps/cpp/particles/particles_field_computer.hpp +++ b/bfps/cpp/particles/particles_field_computer.hpp @@ -132,12 +132,12 @@ class particles_field_computer : public abstract_particles_distr<partsize_t, rea * by[idx_y-interp_limit_my] * bx[idx_x-interp_limit_mx]); - const ptrdiff_t tindex = field.getIndexFromGlobalPosition(idx_x_pbc, idx_y_pbc, idx_z_pbc); + const ptrdiff_t tindex = field.get_rindex_from_global(idx_x_pbc, idx_y_pbc, idx_z_pbc); // 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; + particles_current_rhs[idxPart*3+IDX_X] += real_number(field.rval(tindex,IDX_X))*coef; + particles_current_rhs[idxPart*3+IDX_Y] += real_number(field.rval(tindex,IDX_Y))*coef; + particles_current_rhs[idxPart*3+IDX_Z] += real_number(field.rval(tindex,IDX_Z))*coef; } } } diff --git a/bfps/cpp/particles/particles_system.hpp b/bfps/cpp/particles/particles_system.hpp index 1b37dbce317b3d00e9ba1795727eee23396712f7..6769cb89f379d5f9bb431c9217af53e901549d3b 100644 --- a/bfps/cpp/particles/particles_system.hpp +++ b/bfps/cpp/particles/particles_system.hpp @@ -7,23 +7,20 @@ #include "particles_output_hdf5.hpp" #include "particles_output_mpiio.hpp" #include "particles_field_computer.hpp" -#include "field_accessor.hpp" #include "abstract_particles_input.hpp" #include "particles_adams_bashforth.hpp" #include "scope_timer.hpp" -template <class partsize_t, class real_number, class field_rnumber, class interpolator_class, int interp_neighbours> +template <class partsize_t, class real_number, class field_rnumber, class field_class, class interpolator_class, int interp_neighbours> class particles_system : public abstract_particles_system<partsize_t, real_number> { MPI_Comm mpi_com; const std::pair<int,int> current_partition_interval; const int partition_interval_size; - field_accessor<field_rnumber> field; - interpolator_class interpolator; - particles_field_computer<partsize_t, real_number, interpolator_class, field_accessor<field_rnumber>, interp_neighbours, particles_adams_bashforth<partsize_t, real_number, 3,3>> computer; + particles_field_computer<partsize_t, real_number, interpolator_class, field_class, interp_neighbours, particles_adams_bashforth<partsize_t, real_number, 3,3>> computer; std::unique_ptr<partsize_t[]> current_my_nb_particles_per_partition; std::unique_ptr<partsize_t[]> current_offset_particles_for_partition; @@ -45,18 +42,17 @@ public: const std::array<real_number,3>& in_spatial_box_offset, 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 field_rnumber* in_field_data, const std::array<size_t,3>& in_local_field_dims, + 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, + const field_class& in_field, MPI_Comm in_mpi_com, const int in_current_iteration = 1) : mpi_com(in_mpi_com), current_partition_interval({in_local_field_offset[IDX_Z], in_local_field_offset[IDX_Z] + in_local_field_dims[IDX_Z]}), partition_interval_size(current_partition_interval.second - current_partition_interval.first), - field(in_field_data, in_local_field_dims, in_local_field_offset, in_field_memory_dims), interpolator(), computer(in_mpi_com, field_grid_dim, current_partition_interval, - interpolator, field, in_spatial_box_width, in_spatial_box_offset, in_spatial_partition_width), + interpolator, in_field, in_spatial_box_width, in_spatial_box_offset, in_spatial_partition_width), spatial_box_width(in_spatial_box_width), spatial_partition_width(in_spatial_partition_width), my_spatial_low_limit(in_my_spatial_low_limit), my_spatial_up_limit(in_my_spatial_up_limit), my_nb_particles(0), step_idx(in_current_iteration){ diff --git a/bfps/cpp/particles/particles_system_builder.hpp b/bfps/cpp/particles/particles_system_builder.hpp index 86adb3afbc945c170419aa9efefe78d2e6a2afdd..20b4d56ba89ba1ae288b91e7eb07bfcaef30ec8e 100644 --- a/bfps/cpp/particles/particles_system_builder.hpp +++ b/bfps/cpp/particles/particles_system_builder.hpp @@ -170,12 +170,6 @@ struct particles_system_build_container { || (my_rank != nb_processes_involved-1 && local_field_offset[IDX_Z]+local_field_dims[IDX_Z] != field_grid_dim[IDX_Z]))); } - // The offset of the local field grid - std::array<size_t,3> local_field_mem_size; - local_field_mem_size[IDX_X] = fs_field->rmemlayout->subsizes[FIELD_IDX_X]; - local_field_mem_size[IDX_Y] = fs_field->rmemlayout->subsizes[FIELD_IDX_Y]; - local_field_mem_size[IDX_Z] = fs_field->rmemlayout->subsizes[FIELD_IDX_Z]; - // The spatial box size (all particles should be included inside) std::array<particles_rnumber,3> spatial_box_width; spatial_box_width[IDX_X] = 4 * acos(0) / (fs_kk->dkx); @@ -198,17 +192,16 @@ struct particles_system_build_container { 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<partsize_t, particles_rnumber, field_rnumber, particles_interp_spline<particles_rnumber, interpolation_size,spline_mode>, interpolation_size>* part_sys - = new particles_system<partsize_t, particles_rnumber, field_rnumber, particles_interp_spline<particles_rnumber, interpolation_size,spline_mode>, interpolation_size>(field_grid_dim, + particles_system<partsize_t, particles_rnumber, field_rnumber, field<field_rnumber, be, THREE>, particles_interp_spline<particles_rnumber, interpolation_size,spline_mode>, interpolation_size>* part_sys + = new particles_system<partsize_t, particles_rnumber, field_rnumber, field<field_rnumber, be, THREE>, particles_interp_spline<particles_rnumber, interpolation_size,spline_mode>, interpolation_size>(field_grid_dim, spatial_box_width, spatial_box_offset, spatial_partition_width, my_spatial_low_limit_z, my_spatial_up_limit_z, - fs_field->get_rdata(), local_field_dims, local_field_offset, - local_field_mem_size, + (*fs_field), mpi_comm, in_current_iteration); diff --git a/setup.py b/setup.py index 483894d460cc4ebfa4b595a7254f5167b7916b1d..f06a79ba7c25c1d5cf11ebacdd3daa4c8cc86c97 100644 --- a/setup.py +++ b/setup.py @@ -126,7 +126,6 @@ particle_headers = [ 'cpp/particles/abstract_particles_output.hpp', 'cpp/particles/abstract_particles_system.hpp', 'cpp/particles/alltoall_exchanger.hpp', - 'cpp/particles/field_accessor.hpp', 'cpp/particles/particles_adams_bashforth.hpp', 'cpp/particles/particles_field_computer.hpp', 'cpp/particles/particles_input_hdf5.hpp',