diff --git a/cpp/particles/p2p/p2p_computer.hpp b/cpp/particles/p2p/p2p_computer.hpp index 47d193e095403d329cd704e8623567c0f080a39b..ec8b2bcd35d765939a04d178ed65e3b60888a245 100644 --- a/cpp/particles/p2p/p2p_computer.hpp +++ b/cpp/particles/p2p/p2p_computer.hpp @@ -71,11 +71,16 @@ public: template <int size_particle_positions, int size_particle_rhs> void compute_interaction(const partsize_t /*idx_part1*/, - const real_number pos_part1[], real_number rhs_part1[], + const real_number pos_part1[], + real_number rhs_part1[], const partsize_t /*idx_part2*/, - const real_number pos_part2[], real_number rhs_part2[], - const real_number dist_pow2, const real_number cutoff, - const real_number /*xshift_coef*/, const real_number /*yshift_coef*/, const real_number /*zshift_coef*/) const{ + const real_number pos_part2[], + real_number rhs_part2[], + const real_number dist_pow2, + const real_number cutoff, + const real_number /*xseparation*/, + const real_number /*yseparation*/, + const real_number /*zseparation*/) const{ static_assert(size_particle_positions == 6, "This kernel works only with 6 values for one particle's position+orientation"); static_assert(size_particle_rhs == 6, "This kernel works only with 6 values per particle's rhs"); diff --git a/cpp/particles/p2p/p2p_computer_empty.hpp b/cpp/particles/p2p/p2p_computer_empty.hpp index ce4e282c3bdb7ff4bfc479b5a0b16d106f0492c1..03d8cd64995ed6a190f1d444d2846d230985dec8 100644 --- a/cpp/particles/p2p/p2p_computer_empty.hpp +++ b/cpp/particles/p2p/p2p_computer_empty.hpp @@ -44,8 +44,11 @@ public: const real_number /*pos_part1*/[], real_number /*rhs_part1*/[], const partsize_t /*idx_part2*/, const real_number /*pos_part2*/[], real_number /*rhs_part2*/[], - const real_number /*dist_pow2*/, const real_number /*cutoff*/, - const real_number /*xshift_coef*/, const real_number /*yshift_coef*/, const real_number /*zshift_coef*/) const{ + const real_number /*dist_pow2*/, + const real_number /*cutoff*/, + const real_number /*xseparation*/, + const real_number /*yseparation*/, + const real_number /*zseparation*/) const{ } void merge(const p2p_computer_empty&){} diff --git a/cpp/particles/p2p/p2p_ghost_collisions.hpp b/cpp/particles/p2p/p2p_ghost_collisions.hpp index b89fe8574d20620cfca8320b4f9fbebc0ef85405..13a7fb842b010f29eceb74be803738f35cf27f3b 100644 --- a/cpp/particles/p2p/p2p_ghost_collisions.hpp +++ b/cpp/particles/p2p/p2p_ghost_collisions.hpp @@ -216,11 +216,11 @@ public: const partsize_t idx_part2, const real_number pos_part2[], real_number /*rhs_part2*/[], - const real_number /*dist_pow2*/, + const real_number dist_pow2, const real_number /*cutoff*/, - const real_number /*xshift_coef*/, - const real_number /*yshift_coef*/, - const real_number /*zshift_coef*/){ + const real_number xseparation, + const real_number yseparation, + const real_number zseparation){ switch(this->current_particle_shape) { case SPHERE: @@ -233,19 +233,14 @@ public: break; case CYLINDER: { - double x, y, z, pq, xp, xq, t, s, x_dist, y_dist, z_dist ,min_distance; + double pq, xp, xq, t, s, x_dist, y_dist, z_dist ,min_distance; - /* Relative position vector of the two particles (x,y,z)^T */ - /* complicated usage of fmod, fabs and sgn because C++ fmod does not do what it should. */ - x = std::fmod(pos_part2[0],pi2)-std::fmod(pos_part1[0],pi2); - y = std::fmod(pos_part2[1],pi2)-std::fmod(pos_part1[1],pi2); - z = std::fmod(pos_part2[2],pi2)-std::fmod(pos_part1[2],pi2); + const double x = xseparation; + const double y = yseparation; + const double z = zseparation; + const double r = sqrt(dist_pow2); - x = ( std::fmod( std::fabs(x) +pi ,pi2) - pi ) * sgn(x) ; - y = ( std::fmod( std::fabs(y) +pi ,pi2) - pi ) * sgn(y) ; - z = ( std::fmod( std::fabs(z) +pi ,pi2) - pi ) * sgn(z) ; - - if( sqrt(x*x+y*y+z*z) <= this->cylinder_length ) + if( r <= this->cylinder_length ) { /* p and q are the orientation vectors of the first and second particles. */ @@ -384,7 +379,9 @@ public: D1 = sqrt(x1x1+x0x0+t*t-2.0*x0x1-2.0*x1p0*t); D2 = sqrt(x2x2+x0x0+t*t-2.0*x0x2-2.0*x2p0*t); /* Check if a collision is possible. Exit if true. */ - if( D1<=this->disk_width and D2<=this->disk_width ){ + if ((D1 <= (this->disk_width/2)) and + (D2 <= (this->disk_width/2))) + { std::pair <partsize_t, partsize_t> single_collision_pair(idx_part1, idx_part2); this->collision_pairs_local.insert(single_collision_pair); assert(idx_part1!=idx_part2); @@ -397,7 +394,9 @@ public: D1 = sqrt(x1x1+x0x0+t*t-2.0*x0x1-2.0*x1p0*t); D2 = sqrt(x2x2+x0x0+t*t-2.0*x0x2-2.0*x2p0*t); /* Check if a collision is possible. Exit if true. */ - if( D1<=this->disk_width and D2<=this->disk_width ){ + if ((D1 <= (this->disk_width/2)) and + (D2 <= (this->disk_width/2))) + { std::pair <partsize_t, partsize_t> single_collision_pair(idx_part1, idx_part2); this->collision_pairs_local.insert(single_collision_pair); assert(idx_part1!=idx_part2); diff --git a/cpp/particles/p2p/p2p_merge_collisions.hpp b/cpp/particles/p2p/p2p_merge_collisions.hpp index 96fff9c2d7f6fa9f23d21ff346f1b8b819c9c1d5..cf93f3e8001699b3cb8de2db4c043409bae4861b 100644 --- a/cpp/particles/p2p/p2p_merge_collisions.hpp +++ b/cpp/particles/p2p/p2p_merge_collisions.hpp @@ -47,11 +47,16 @@ public: template <int size_particle_positions, int size_particle_rhs> void compute_interaction(const partsize_t idx_part1, - const real_number /*pos_part1*/[], real_number /*rhs_part1*/[], + const real_number /*pos_part1*/[], + real_number /*rhs_part1*/[], const partsize_t idx_part2, - const real_number /*pos_part2*/[], real_number /*rhs_part2*/[], - const real_number /*dist_pow2*/, const real_number /*cutoff*/, - const real_number /*xshift_coef*/, const real_number /*yshift_coef*/, const real_number /*zshift_coef*/){ + const real_number /*pos_part2*/[], + real_number /*rhs_part2*/[], + const real_number /*dist_pow2*/, + const real_number /*cutoff*/, + const real_number /*xseparation*/, + const real_number /*yseparation*/, + const real_number /*zseparation*/){ mergedParticles.emplace_back(std::max(idx_part1,idx_part2)); }