diff --git a/bfps/cpp/particles/p2p_distr_mpi.hpp b/bfps/cpp/particles/p2p_distr_mpi.hpp index 7f610be18c749077ef73730ebec365b21e212569..a32c33756ccd88df08d5834bfcc33f7bbf7bbf40 100644 --- a/bfps/cpp/particles/p2p_distr_mpi.hpp +++ b/bfps/cpp/particles/p2p_distr_mpi.hpp @@ -246,6 +246,12 @@ public: particles_positions[(idxPart)*size_particle_positions + IDX_Z]); assert(my_down_z_cell_level <= get_cell_coord_z_from_index(particles_coord[idxPart])); assert(get_cell_coord_z_from_index(particles_coord[idxPart]) <= my_top_z_cell_level); + if(inout_index_particles[idxPart] == 3 || inout_index_particles[idxPart] == 52){// TODO + printf("Coord index %ld (tree index %ld)\n", inout_index_particles[idxPart],particles_coord[idxPart]); + printf(">> Box index %ld - %ld - %ld\n", get_cell_coord_x_from_index(particles_coord[idxPart]), + get_cell_coord_y_from_index(particles_coord[idxPart]), + get_cell_coord_z_from_index(particles_coord[idxPart])); + } } } @@ -540,7 +546,8 @@ public: } const std::vector<std::pair<partsize_t,partsize_t>>* neighbors[27]; - const int nbNeighbors = my_tree.getNeighbors(current_cell_idx, neighbors); + long int neighbors_indexes[27]; + const int nbNeighbors = my_tree.getNeighbors(current_cell_idx, neighbors, neighbors_indexes, true); // with other interval for(size_t idx_neighbor = 0 ; idx_neighbor < nbNeighbors ; ++idx_neighbor){ @@ -625,6 +632,24 @@ public: &particles_current_rhs[(intervals[idx_1].first+idx_p2)*size_particle_rhs], dist_r2); } + if((inout_index_particles[(intervals[idx_1].first+idx_p1)] == 3 + && inout_index_particles[(intervals[idx_1].first+idx_p2)] == 52) + || (inout_index_particles[(intervals[idx_1].first+idx_p1)] == 52 + && inout_index_particles[(intervals[idx_1].first+idx_p2)] == 3)){// TODO + printf("test interaction between :\n"); + printf("index %ld (%ld) pos %e %e %e\n", + (intervals[idx_1].first+idx_p1), inout_index_particles[(intervals[idx_1].first+idx_p1)], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_X], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Y], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Z]); + printf("index %ld (%ld) pos %e %e %e\n", + (intervals[idx_1].first+idx_p2), + inout_index_particles[(intervals[idx_1].first+idx_p2)], + particles_positions[(intervals[idx_1].first+idx_p2)*size_particle_positions + IDX_X], + particles_positions[(intervals[idx_1].first+idx_p2)*size_particle_positions + IDX_Y], + particles_positions[(intervals[idx_1].first+idx_p2)*size_particle_positions + IDX_Z]); + printf("Radius = %e (%e)\n", sqrt(dist_r2), dist_r2); + } } } @@ -646,6 +671,25 @@ public: &particles_current_rhs[(intervals[idx_2].first+idx_p2)*size_particle_rhs], dist_r2); } + + if((inout_index_particles[(intervals[idx_1].first+idx_p1)] == 3 + && inout_index_particles[(intervals[idx_2].first+idx_p2)] == 52) + || (inout_index_particles[(intervals[idx_1].first+idx_p1)] == 52 + && inout_index_particles[(intervals[idx_2].first+idx_p2)] == 3)){// TODO + printf("interaction between :\n"); + printf("index %ld (%ld) pos %e %e %e\n", + (intervals[idx_1].first+idx_p1), inout_index_particles[(intervals[idx_1].first+idx_p1)], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_X], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Y], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Z]); + printf("index %ld (%ld) pos %e %e %e\n", + (intervals[idx_2].first+idx_p2), + inout_index_particles[(intervals[idx_2].first+idx_p2)], + particles_positions[(intervals[idx_2].first+idx_p2)*size_particle_positions + IDX_X], + particles_positions[(intervals[idx_2].first+idx_p2)*size_particle_positions + IDX_Y], + particles_positions[(intervals[idx_2].first+idx_p2)*size_particle_positions + IDX_Z]); + printf("Radius = %e (%e)\n", sqrt(dist_r2), dist_r2); + } } } } @@ -654,27 +698,52 @@ public: const long int currenct_cell_idx = iter_cell.first; const std::vector<std::pair<partsize_t,partsize_t>>* neighbors[27]; - const int nbNeighbors = my_tree.getNeighbors(currenct_cell_idx, neighbors); + long int neighbors_indexes[27]; + const int nbNeighbors = my_tree.getNeighbors(currenct_cell_idx, neighbors, neighbors_indexes, false); + + if(iter_cell.first == 3669){ // TODO + printf("Box %ld has %d neighbors\n", iter_cell.first, nbNeighbors); + } for(size_t idx_1 = 0 ; idx_1 < intervals.size() ; ++idx_1){ // with other interval for(size_t idx_neighbor = 0 ; idx_neighbor < nbNeighbors ; ++idx_neighbor){ - for(size_t idx_2 = 0 ; idx_2 < (*neighbors[idx_neighbor]).size() ; ++idx_2){ - for(partsize_t idx_p1 = 0 ; idx_p1 < intervals[idx_1].second ; ++idx_p1){ - for(partsize_t idx_p2 = 0 ; idx_p2 < (*neighbors[idx_neighbor])[idx_2].second ; ++idx_p2){ - const real_number dist_r2 = compute_distance_r2(particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_X], - particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Y], - particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Z], - particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_X], - particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_Y], - particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_Z]); - if(dist_r2 < cutoff_radius*cutoff_radius){ - in_computer.template compute_interaction<size_particle_positions,size_particle_rhs>( - &particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions], - &particles_current_rhs[(intervals[idx_1].first+idx_p1)*size_particle_rhs], - &particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions], - &particles_current_rhs[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_rhs], - dist_r2); + if(currenct_cell_idx < neighbors_indexes[idx_neighbor]){ + for(size_t idx_2 = 0 ; idx_2 < (*neighbors[idx_neighbor]).size() ; ++idx_2){ + for(partsize_t idx_p1 = 0 ; idx_p1 < intervals[idx_1].second ; ++idx_p1){ + for(partsize_t idx_p2 = 0 ; idx_p2 < (*neighbors[idx_neighbor])[idx_2].second ; ++idx_p2){ + const real_number dist_r2 = compute_distance_r2(particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_X], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Y], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Z], + particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_X], + particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_Y], + particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_Z]); + if(dist_r2 < cutoff_radius*cutoff_radius){ + in_computer.template compute_interaction<size_particle_positions,size_particle_rhs>( + &particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions], + &particles_current_rhs[(intervals[idx_1].first+idx_p1)*size_particle_rhs], + &particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions], + &particles_current_rhs[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_rhs], + dist_r2); + } + if((inout_index_particles[(intervals[idx_1].first+idx_p1)] == 3 + && inout_index_particles[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)] == 52) + || (inout_index_particles[(intervals[idx_1].first+idx_p1)] == 52 + && inout_index_particles[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)] == 3)){// TODO + printf("interaction between :\n"); + printf("index %ld (%ld) pos %e %e %e\n", + (intervals[idx_1].first+idx_p1), inout_index_particles[(intervals[idx_1].first+idx_p1)], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_X], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Y], + particles_positions[(intervals[idx_1].first+idx_p1)*size_particle_positions + IDX_Z]); + printf("index %ld (%ld) pos %e %e %e\n", + ((*neighbors[idx_neighbor])[idx_2].first+idx_p2), + inout_index_particles[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)], + particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_X], + particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_Y], + particles_positions[((*neighbors[idx_neighbor])[idx_2].first+idx_p2)*size_particle_positions + IDX_Z]); + printf("Radius = %e (%e)\n", sqrt(dist_r2), dist_r2); + } } } } diff --git a/bfps/cpp/particles/p2p_tree.hpp b/bfps/cpp/particles/p2p_tree.hpp index b11cd826f74e59b8014d4563098069873cf7ded8..4715dfad7fecc1c564a43972504ddd1e621493b2 100644 --- a/bfps/cpp/particles/p2p_tree.hpp +++ b/bfps/cpp/particles/p2p_tree.hpp @@ -46,14 +46,16 @@ public: return emptyCell; } - int getNeighbors(const long int idx, const CellClass* output[27]) const{ + int getNeighbors(const long int idx, const CellClass* output[27], long int output_indexes[27], const bool include_target) const{ int nbNeighbors = 0; + std::fill_n(output, 27, nullptr); + const long int idx_x = get_cell_coord_x_from_index(idx); const long int idx_y = get_cell_coord_y_from_index(idx); const long int idx_z = get_cell_coord_z_from_index(idx); - for(long int neigh_x = - 1 ; neigh_x <= 1 ; ++neigh_x){ + for(long int neigh_x = -1 ; neigh_x <= 1 ; ++neigh_x){ long int neigh_x_pbc = neigh_x+idx_x; if(neigh_x_pbc < 0){ neigh_x_pbc += nb_cell_levels[IDX_X]; @@ -62,7 +64,7 @@ public: neigh_x_pbc -= nb_cell_levels[IDX_X]; } - for(long int neigh_y = - 1 ; neigh_y <= 1 ; ++neigh_y){ + for(long int neigh_y = -1 ; neigh_y <= 1 ; ++neigh_y){ long int neigh_y_pbc = neigh_y+idx_y; if(neigh_y_pbc < 0){ neigh_y_pbc += nb_cell_levels[IDX_Y]; @@ -71,7 +73,7 @@ public: neigh_y_pbc -= nb_cell_levels[IDX_Y]; } - for(long int neigh_z = - 1 ; neigh_z <= 1 ; ++neigh_z){ + for(long int neigh_z = -1 ; neigh_z <= 1 ; ++neigh_z){ long int neigh_z_pbc = neigh_z+idx_z; if(neigh_z_pbc < 0){ neigh_z_pbc += nb_cell_levels[IDX_Z]; @@ -81,13 +83,15 @@ public: } // Not the current cell - if(neigh_x_pbc != idx_x || neigh_y_pbc != idx_y || neigh_z_pbc != idx_z){ + if(include_target || neigh_x_pbc != idx_x || neigh_y_pbc != idx_y || neigh_z_pbc != idx_z){ const long int idx_neigh = get_cell_idx(neigh_x_pbc, neigh_y_pbc, neigh_z_pbc); const auto& iter = data.find(idx_neigh); if(iter != data.end()){ output[nbNeighbors] = &(iter->second); + output_indexes[nbNeighbors] = idx_neigh; + nbNeighbors += 1; } } }