commit 45ec12321e583500d09837dcbe673ccc942c6949
parent c643ab9de624115a9421f1c0a8c7d31f8f538286
Author: Anders Damsgaard <andersd@riseup.net>
Date: Wed, 20 Dec 2017 13:55:02 -0500
Split calculation of periodic BC correction into separate internal function
Diffstat:
M | src/contact_search.jl | | | 78 | ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------ |
1 file changed, 48 insertions(+), 30 deletions(-)
diff --git a/src/contact_search.jl b/src/contact_search.jl
@@ -128,36 +128,16 @@ function findContactsInGrid!(simulation::Simulation, grid::Any)
i_corrected = i
j_corrected = j
- # vector for correcting inter-particle distance in case of
- # boundary periodicity
- distance_modifier .= [0., 0.]
-
- # only check for contacts within grid boundaries, and wrap
- # around if they are periodic
- if i < 1 || i > nx || j < 1 || j > ny
-
- if i < 1 && grid.bc_west == 2 # periodic -x
- distance_modifier[1] = grid.xq[end] - grid.xq[1]
- i_corrected = nx
- elseif i > nx && grid.bc_east == 2 # periodic +x
- distance_modifier[1] = -(grid.xq[end] - grid.xq[1])
- i_corrected = 1
- end
-
- if j < 1 && grid.bc_south == 2 # periodic -y
- distance_modifier[2] = grid.yq[end] - grid.yq[1]
- j_corrected = ny
- elseif j > ny && grid.bc_north == 2 # periodic +y
- distance_modifier[2] = -(grid.yq[end] - grid.yq[1])
- j_corrected = 1
- end
-
- # skip iteration if target still falls outside grid after
- # periodicity correction
- if i_corrected < 1 || i_corrected > nx ||
- j_corrected < 1 || j_corrected > ny
- continue
- end
+ # correct indexes if necessary
+ periodicBoundaryCorrection!(grid, i, j,
+ i_corrected, j_corrected,
+ distance_modifier)
+
+ # skip iteration if target still falls outside grid after
+ # periodicity correction
+ if i_corrected < 1 || i_corrected > nx ||
+ j_corrected < 1 || j_corrected > ny
+ continue
end
@inbounds for idx_j in grid.grain_list[i_corrected, j_corrected]
@@ -170,6 +150,44 @@ function findContactsInGrid!(simulation::Simulation, grid::Any)
nothing
end
+"""
+ periodicBoundaryCorrection!(grid::Any, i::Integer, j::Integer,
+ i_corrected::Integer, j_corrected::Integer,
+ distance_modifier::Vector{Float64})
+
+Determine the geometric correction and grid-index adjustment required across
+periodic boundaries.
+"""
+function periodicBoundaryCorrection!(grid::Any, i::Integer, j::Integer,
+ i_corrected::Integer, j_corrected::Integer,
+ distance_modifier::Vector{Float64})
+
+ # vector for correcting inter-particle distance in case of
+ # boundary periodicity
+ distance_modifier .= [0., 0.]
+
+ # only check for contacts within grid boundaries, and wrap
+ # around if they are periodic
+ if i < 1 || i > size(grid.xh)[1] || j < 1 || j > size(grid.xh)[2]
+
+ if i < 1 && grid.bc_west == 2 # periodic -x
+ distance_modifier[1] = grid.xq[end] - grid.xq[1]
+ i_corrected = size(grid.xh)[1]
+ elseif i > size(grid.xh)[1] && grid.bc_east == 2 # periodic +x
+ distance_modifier[1] = -(grid.xq[end] - grid.xq[1])
+ i_corrected = 1
+ end
+
+ if j < 1 && grid.bc_south == 2 # periodic -y
+ distance_modifier[2] = grid.yq[end] - grid.yq[1]
+ j_corrected = size(grid.xh)[2]
+ elseif j > size(grid.xh)[2] && grid.bc_north == 2 # periodic +y
+ distance_modifier[2] = -(grid.yq[end] - grid.yq[1])
+ j_corrected = 1
+ end
+ end
+end
+
export checkAndAddContact!
"""
checkAndAddContact!(simulation, i, j)