@@ -74,8 +74,8 @@ Particle &get_part(CellStructure &cell_structure, int id) {
74
74
return *p;
75
75
}
76
76
} // namespace
77
-
78
- void CollisionDetection ::initialize () {
77
+ namespace Collision {
78
+ void MergedProtocol ::initialize (BondedInteractionsMap &bonded_ias, InteractionsNonBonded &nonbonded_ias ) {
79
79
// If mode is OFF, no further checks
80
80
if (mode == CollisionModeType::OFF) {
81
81
return ;
@@ -111,10 +111,6 @@ void CollisionDetection::initialize() {
111
111
}
112
112
#endif
113
113
114
- auto &system = get_system ();
115
- auto &bonded_ias = *system.bonded_ias ;
116
- auto &nonbonded_ias = *system.nonbonded_ias ;
117
-
118
114
// Check if bond exists
119
115
assert (mode != CollisionModeType::BIND_CENTERS or
120
116
bonded_ias.contains (bond_centers));
@@ -172,15 +168,14 @@ void CollisionDetection::initialize() {
172
168
nonbonded_ias.make_particle_type_exist (part_type_after_glueing);
173
169
}
174
170
175
- system.on_short_range_ia_change ();
176
171
}
177
-
172
+ }
178
173
/* * @brief Calculate position of vs for GLUE_TO_SURFACE mode.
179
174
* Returns id of particle to bind vs to.
180
175
*/
181
176
static auto const &glue_to_surface_calc_vs_pos (
182
177
Particle const &p1, Particle const &p2, BoxGeometry const &box_geo,
183
- CollisionDetection const &collision_params, Utils::Vector3d &pos) {
178
+ Collision::MergedProtocol const &collision_params, Utils::Vector3d &pos) {
184
179
double ratio;
185
180
auto const vec21 = box_geo.get_mi_vector (p1.pos (), p2.pos ());
186
181
auto const dist = vec21.norm ();
@@ -204,7 +199,7 @@ static auto const &glue_to_surface_calc_vs_pos(
204
199
205
200
static void bind_at_point_of_collision_calc_vs_pos (
206
201
Particle const &p1, Particle const &p2, BoxGeometry const &box_geo,
207
- CollisionDetection const &collision_params, Utils::Vector3d &pos1,
202
+ Collision::MergedProtocol const &collision_params, Utils::Vector3d &pos1,
208
203
Utils::Vector3d &pos2) {
209
204
auto const vec21 = box_geo.get_mi_vector (p1.pos (), p2.pos ());
210
205
pos1 = p1.pos () - vec21 * collision_params.vs_placement ;
@@ -214,7 +209,7 @@ static void bind_at_point_of_collision_calc_vs_pos(
214
209
#ifdef VIRTUAL_SITES_RELATIVE
215
210
static void place_vs_and_relate_to_particle (
216
211
CellStructure &cell_structure, BoxGeometry const &box_geo,
217
- CollisionDetection const &collision_params, double const min_global_cut,
212
+ Collision::MergedProtocol const &collision_params, double const min_global_cut,
218
213
int const current_vs_pid, Utils::Vector3d const &pos, int const relate_to) {
219
214
Particle new_part;
220
215
new_part.id () = current_vs_pid;
@@ -227,7 +222,7 @@ static void place_vs_and_relate_to_particle(
227
222
228
223
static void bind_at_poc_create_bond_between_vs (
229
224
CellStructure &cell_structure, BondedInteractionsMap const &bonded_ias,
230
- CollisionDetection const &collision_params, int const current_vs_pid,
225
+ Collision::MergedProtocol const &collision_params, int const current_vs_pid,
231
226
CollisionPair const &c) {
232
227
switch (number_of_partners (*bonded_ias.at (collision_params.bond_vs ))) {
233
228
case 1 : {
@@ -253,7 +248,7 @@ static void bind_at_poc_create_bond_between_vs(
253
248
254
249
static void glue_to_surface_bind_part_to_vs (
255
250
Particle const *const p1, Particle const *const p2,
256
- int const vs_pid_plus_one, CollisionDetection const &collision_params,
251
+ int const vs_pid_plus_one, Collision::MergedProtocol const &collision_params,
257
252
CellStructure &cell_structure) {
258
253
// Create bond between the virtual particles
259
254
const int bondG[] = {vs_pid_plus_one - 1 };
@@ -281,6 +276,17 @@ static auto gather_collision_queue(std::vector<CollisionPair> const &local) {
281
276
}
282
277
283
278
void CollisionDetection::handle_collisions (CellStructure &cell_structure) {
279
+ auto &system = get_system ();
280
+ auto const &box_geo = *system.box_geo ;
281
+ auto const min_global_cut = system.get_min_global_cut ();
282
+ auto update_propagations = m_protocol->handle_collisions (cell_structure, box_geo, min_global_cut, *system.bonded_ias , local_collision_queue);
283
+ if (update_propagations) {
284
+ system.update_used_propagations ();
285
+ }
286
+ clear_queue ();
287
+ }
288
+
289
+ bool Collision::MergedProtocol::handle_collisions (CellStructure &cell_structure, BoxGeometry const &box_geo, double min_global_cut, BondedInteractionsMap const &bonded_ias, std::vector<CollisionPair> &local_collision_queue) {
284
290
// Note that the glue to surface mode adds bonds between the centers
285
291
// but does so later in the process. This is needed to guarantee that
286
292
// a particle can only be glued once, even if queued twice in a single
@@ -301,9 +307,6 @@ void CollisionDetection::handle_collisions(CellStructure &cell_structure) {
301
307
}
302
308
303
309
#ifdef VIRTUAL_SITES_RELATIVE
304
- auto &system = get_system ();
305
- auto const &box_geo = *system.box_geo ;
306
- auto const min_global_cut = system.get_min_global_cut ();
307
310
if ((mode == CollisionModeType::BIND_VS) ||
308
311
(mode == CollisionModeType::GLUE_TO_SURF)) {
309
312
// Gather the global collision queue, because only one node has a collision
@@ -387,7 +390,7 @@ void CollisionDetection::handle_collisions(CellStructure &cell_structure) {
387
390
current_vs_pid++;
388
391
// Create bonds between the vs.
389
392
390
- bind_at_poc_create_bond_between_vs (cell_structure, *system. bonded_ias ,
393
+ bind_at_poc_create_bond_between_vs (cell_structure,bonded_ias,
391
394
*this , current_vs_pid, c);
392
395
} // mode VS
393
396
@@ -455,11 +458,19 @@ void CollisionDetection::handle_collisions(CellStructure &cell_structure) {
455
458
cell_structure.update_ghosts_and_resort_particle (
456
459
Cells::DATA_PART_PROPERTIES | Cells::DATA_PART_BONDS);
457
460
}
458
- system. update_used_propagations () ;
461
+ return true ;
459
462
} // are we in one of the vs_based methods
460
463
#endif // defined VIRTUAL_SITES_RELATIVE
461
-
462
- clear_queue ();
464
+ return false ;
463
465
}
464
466
467
+ void CollisionDetection::initialize () {
468
+ auto &system = get_system ();
469
+ auto &bonded_ias = *system.bonded_ias ;
470
+ auto &nonbonded_ias = *system.nonbonded_ias ;
471
+ m_protocol->initialize (bonded_ias, nonbonded_ias);
472
+ system.on_short_range_ia_change ();
473
+ }
474
+
475
+
465
476
#endif // COLLISION_DETECTION
0 commit comments