@@ -28,6 +28,9 @@ module m_collisions
2828 $:GPU_DECLARE(create= ' [spring_stiffness, damping_parameter]' )
2929 $:GPU_DECLARE(create= ' [collision_lookup, wall_overlap_distances]' )
3030
31+ integer , dimension (:), allocatable :: ib_gbl_idx_lookup
32+ $:GPU_DECLARE(create= ' [ib_gbl_idx_lookup]' )
33+
3134contains
3235
3336 subroutine s_initialize_collisions_module ()
@@ -99,6 +102,8 @@ contains
99102 encoded_pid2 = collision_lookup(i, 4 )
100103 call s_decode_patch_periodicity(encoded_pid1, pid1, xp1, yp1, zp1)
101104 call s_decode_patch_periodicity(encoded_pid2, pid2, xp2, yp2, zp2)
105+ pid1 = collision_lookup(i, 1 )
106+ pid2 = collision_lookup(i, 2 )
102107 ! call s_get_neighborhood_idx(pid1, pid1) ! global patch ID - > local index call s_get_neighborhood_idx(pid2, pid2)
103108 if (pid1 <= 0 .or. pid2 <= 0 ) cycle
104109
@@ -291,6 +296,8 @@ contains
291296 ! get the decoded pairs for checking if they exist, using ii,jj,kk as dummy indices
292297 call s_decode_patch_periodicity(raw_pairs(pair_idx, 1 ), decoded_pairs(1 ), ii, jj, kk)
293298 call s_decode_patch_periodicity(raw_pairs(pair_idx, 2 ), decoded_pairs(2 ), ii, jj, kk)
299+ decoded_pairs(1 ) = ib_gbl_idx_lookup(decoded_pairs(1 ))
300+ decoded_pairs(2 ) = ib_gbl_idx_lookup(decoded_pairs(2 ))
294301
295302 ! skip self- collisions (an IB cannot collide with its own periodic image)
296303 if (decoded_pairs(1 ) == decoded_pairs(2 )) cycle
@@ -329,34 +336,46 @@ contains
329336 subroutine s_detect_ib_collisions_n2 (num_considered_collisions )
330337
331338 integer , intent (out ) :: num_considered_collisions
332- integer :: pid1, pid2, encoded_pid1, encoded_pid2, current_collisions
339+ integer :: pid1, pid2, encoded_pid2, current_collisions
340+ integer :: xp_lower, xp_upper, yp_lower, yp_upper, zp_lower, zp_upper, xp, yp, zp
333341 real (wp), dimension (3 ) :: centroid_1, centroid_2, distance_vec
334342
335343 num_considered_collisions = 0
336344
337- $:GPU_PARALLEL_LOOP(private= ' [pid1, pid2, centroid_1, centroid_2, distance_vec, current_collisions]' , &
338- & copy= ' [num_considered_collisions]' )
345+ call s_get_periodicities(xp_lower, xp_upper, yp_lower, yp_upper, zp_lower, zp_upper)
346+
347+ $:GPU_PARALLEL_LOOP(private= ' [pid1, pid2, encoded_pid2, centroid_1, centroid_2, xp, yp, zp, distance_vec, &
348+ & current_collisions]' , copyin= ' [xp_lower, xp_upper, yp_lower, yp_upper, zp_lower, zp_upper]' , copy= ' [num_considered_collisions]' )
339349 do pid1 = 1 , num_ibs - 1
340- do pid2 = pid1 + 1 , num_ibs
341- centroid_1 = [patch_ib(pid1)%x_centroid, patch_ib(pid1)%y_centroid, 0._wp ]
342- centroid_2 = [patch_ib(pid2)%x_centroid, patch_ib(pid2)%y_centroid, 0._wp ]
343- if (num_dims == 3 ) then
344- centroid_1(3 ) = patch_ib(pid1)%z_centroid
345- centroid_2(3 ) = patch_ib(pid2)%z_centroid
346- end if
347- distance_vec = centroid_2 - centroid_1
348-
349- if (norm2(distance_vec) < patch_ib(pid1)%radius + patch_ib(pid2)%radius) then
350- $:GPU_ATOMIC(atomic= ' capture' )
351- num_considered_collisions = num_considered_collisions + 1
352- current_collisions = num_considered_collisions
353- $:END_GPU_ATOMIC_CAPTURE()
354-
355- collision_lookup(current_collisions, 1 ) = pid1
356- collision_lookup(current_collisions, 2 ) = pid2
357- collision_lookup(current_collisions, 3 ) = pid1
358- collision_lookup(current_collisions, 4 ) = pid2
359- end if
350+ centroid_1 = [patch_ib(pid1)%x_centroid, patch_ib(pid1)%y_centroid, 0._wp ]
351+ if (num_dims == 3 ) centroid_1(3 ) = patch_ib(pid1)%z_centroid
352+ collision_partner_loop: do pid2 = pid1 + 1 , num_ibs
353+ do xp = xp_lower, xp_upper
354+ do yp = yp_lower, yp_upper
355+ do zp = zp_lower, zp_upper
356+ centroid_2(1 ) = patch_ib(pid2)%x_centroid + real (xp, wp)* (x_domain%end - x_domain%beg)
357+ centroid_2(2 ) = patch_ib(pid2)%y_centroid + real (yp, wp)* (y_domain%end - y_domain%beg)
358+ if (num_dims == 3 ) centroid_2(3 ) = patch_ib(pid2)%z_centroid + real (zp, &
359+ & wp)* (z_domain%end - z_domain%beg)
360+ distance_vec = centroid_2 - centroid_1
361+
362+ if (norm2(distance_vec) < patch_ib(pid1)%radius + patch_ib(pid2)%radius) then
363+ $:GPU_ATOMIC(atomic= ' capture' )
364+ num_considered_collisions = num_considered_collisions + 1
365+ current_collisions = num_considered_collisions
366+ $:END_GPU_ATOMIC_CAPTURE()
367+
368+ call s_encode_patch_periodicity(patch_ib(pid2)%gbl_patch_id, xp, yp, zp, encoded_pid2)
369+
370+ collision_lookup(current_collisions, 1 ) = pid1
371+ collision_lookup(current_collisions, 2 ) = pid2
372+ collision_lookup(current_collisions, 3 ) = patch_ib(pid1)%gbl_patch_id
373+ collision_lookup(current_collisions, 4 ) = encoded_pid2
374+ cycle collision_partner_loop
375+ end if
376+ end do
377+ end do
378+ end do
360379 end do
361380 end do
362381 $:END_GPU_PARALLEL_LOOP()
0 commit comments