Skip to content

Commit 145582a

Browse files
Collisions should now be working with periodicity again
1 parent 9ad4f9c commit 145582a

2 files changed

Lines changed: 42 additions & 26 deletions

File tree

src/simulation/m_collisions.fpp

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3134
contains
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()

src/simulation/m_ibm.fpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ module m_ibm
3434
type(ghost_point), dimension(:), allocatable :: ghost_points
3535
$:GPU_DECLARE(create='[ghost_points]')
3636

37-
integer, dimension(:), allocatable :: ib_gbl_idx_lookup
38-
$:GPU_DECLARE(create='[ib_gbl_idx_lookup]')
39-
4037
integer :: num_gps !< Number of ghost points
4138
#if defined(MFC_OpenACC)
4239
$:GPU_DECLARE(create='[gp_layers, num_gps]')

0 commit comments

Comments
 (0)