tSplit calculation of periodic BC correction into separate internal function - Granular.jl - Julia package for granular dynamics simulation
 (HTM) git clone git://src.adamsgaard.dk/Granular.jl
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 45ec12321e583500d09837dcbe673ccc942c6949
 (DIR) parent c643ab9de624115a9421f1c0a8c7d31f8f538286
 (HTM) 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(-)
       ---
 (DIR) diff --git a/src/contact_search.jl b/src/contact_search.jl
       t@@ -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]
       t@@ -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)