tFix grain positions in tests and improve regular grid performance - 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 f9d909579743e69ab0ccdc2014884c54ad962249
 (DIR) parent 4cb1c336f00a3cb7613e7ad2efb5a5de5e3cbc16
 (HTM) Author: Anders Damsgaard <andersd@riseup.net>
       Date:   Wed,  3 Jan 2018 15:09:34 -0500
       
       Fix grain positions in tests and improve regular grid performance
       
       Diffstat:
         M src/grid.jl                         |      15 +++++++++------
         M test/contact-search-and-geometry.jl |       4 ++--
         M test/memory-management.jl           |      16 ++++++++--------
         M test/wall.jl                        |      54 ++++++++++++++++----------------
       
       4 files changed, 46 insertions(+), 43 deletions(-)
       ---
 (DIR) diff --git a/src/grid.jl b/src/grid.jl
       t@@ -164,8 +164,8 @@ function sortGrainsInGrid!(simulation::Simulation, grid::Any; verbose=true)
                else
        
                    if grid.regular_grid
       -                i, j = Int.(floor.(simulation.grains[idx].lin_pos
       -                                   ./ grid.dx[1:2])) + [1,1]
       +                i, j = Int.(ceil.(simulation.grains[idx].lin_pos
       +                                  ./ grid.dx[1:2]))
                    else
        
                        # Search for point in 8 neighboring cells
       t@@ -275,9 +275,12 @@ This function is a wrapper for `getCellCornerCoordinates()` and
        """
        function getNonDimensionalCellCoordinates(grid::Any, i::Int, j::Int,
                                                  point::Vector{Float64})
       -
       -    sw, se, ne, nw = getCellCornerCoordinates(grid.xq, grid.yq, i, j)
       -    return conformalQuadrilateralCoordinates(sw, se, ne, nw, point)
       +    if grid.regular_grid
       +        return (point - Float64.([i-1,j-1]).*grid.dx[1:2])./grid.dx[1:2]
       +    else
       +        sw, se, ne, nw = getCellCornerCoordinates(grid.xq, grid.yq, i, j)
       +        return conformalQuadrilateralCoordinates(sw, se, ne, nw, point)
       +    end
        end
        
        export isPointInCell
       t@@ -296,7 +299,7 @@ function isPointInCell(grid::Any, i::Int, j::Int,
                               method::String="Conformal")
        
            if grid.regular_grid
       -        if [i,j] == Int.(floor.(point ./ grid.dx[1:2])) + [1,1]
       +        if [i,j] == Int.(ceil.(point ./ grid.dx[1:2]))
                    return true
                else
                    return false
 (DIR) diff --git a/test/contact-search-and-geometry.jl b/test/contact-search-and-geometry.jl
       t@@ -7,8 +7,8 @@ info("#### $(basename(@__FILE__)) ####")
        info("Testing interGrainPositionVector(...) and findOverlap(...)")
        sim = Granular.createSimulation("test")
        sim = Granular.createSimulation(id="test")
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 10., 1., verbose=false)
       -Granular.addGrainCylindrical!(sim, [18., 0.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [ 0.01, 0.01], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [18.01, 0.01], 10., 1., verbose=false)
        
        position_ij = Granular.interGrainPositionVector(sim, 1, 2)
        overlap_ij = Granular.findOverlap(sim, 1, 2, position_ij)
 (DIR) diff --git a/test/memory-management.jl b/test/memory-management.jl
       t@@ -102,8 +102,8 @@ end
        
        info("Checking if memory is freed after ended collision (all to all)")
        sim = Granular.createSimulation(id="test")
       -Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=false)
       -Granular.addGrainCylindrical!(sim, [20.05, 0.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [1., 1.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [21.05, 1.], 10., 1., verbose=false)
        sim.grains[1].lin_vel[1] = 0.1
        Granular.setTotalTime!(sim, 10.0)
        Granular.setTimeStep!(sim, epsilon=0.07, verbose=false)
       t@@ -113,8 +113,8 @@ Granular.run!(sim, verbose=false)
        
        info("Checking if memory is freed after ended collision (cell sorting)")
        sim = Granular.createSimulation(id="test")
       -Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=false)
       -Granular.addGrainCylindrical!(sim, [20.05, 0.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [1., 1.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [21.05, 1.], 10., 1., verbose=false)
        sim.ocean = Granular.createRegularOceanGrid([2, 2, 2], [40., 40., 10.])
        sim.grains[1].lin_vel[1] = 0.1
        Granular.setTotalTime!(sim, 10.0)
       t@@ -131,8 +131,8 @@ Granular.run!(sim, verbose=false)
        @test Base.summarysize(sim) == original_sim_size_recursive
        
        sim = Granular.createSimulation(id="test")
       -Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=false)
       -Granular.addGrainCylindrical!(sim, [20.05, 0.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [1., 1.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [21.05, 1.], 10., 1., verbose=false)
        sim.atmosphere = Granular.createRegularAtmosphereGrid([2, 2, 2], [40., 40., 10.])
        sim.grains[1].lin_vel[1] = 0.1
        Granular.setTotalTime!(sim, 10.0)
       t@@ -149,8 +149,8 @@ Granular.run!(sim, verbose=false)
        @test Base.summarysize(sim) == original_sim_size_recursive
        
        sim = Granular.createSimulation(id="test")
       -Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=false)
       -Granular.addGrainCylindrical!(sim, [20.05, 0.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [1., 1.], 10., 1., verbose=false)
       +Granular.addGrainCylindrical!(sim, [21.05, 1.], 10., 1., verbose=false)
        sim.atmosphere = Granular.createRegularAtmosphereGrid([2, 2, 2], [40., 40., 10.])
        sim.ocean = Granular.createRegularOceanGrid([2, 2, 2], [40., 40., 10.])
        sim.grains[1].lin_vel[1] = 0.1
 (DIR) diff --git a/test/wall.jl b/test/wall.jl
       t@@ -195,7 +195,7 @@ Granular.interactWalls!(sim)
        info("Full collision with wall")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [1.2, 0.], 1., 2., verbose=false)
       +Granular.addGrainCylindrical!(sim, [1.2, 0.5], 1., 2., verbose=false)
        Granular.addWallLinearFrictionless!(sim, [1., 0.], 0., verbose=false)
        sim.walls[1].contact_viscosity_normal = 1e3
        sim.grains[1].lin_vel[1] = -0.2
       t@@ -209,7 +209,7 @@ lin_vel1 = sim.grains[1].lin_vel
        
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [1.2, 0.], 1., 2., verbose=false)
       +Granular.addGrainCylindrical!(sim, [1.2, 0.5], 1., 2., verbose=false)
        Granular.addWallLinearFrictionless!(sim, [1., 0.], 0., verbose=false)
        sim.walls[1].contact_viscosity_normal = 1e4
        sim.grains[1].lin_vel[1] = -0.2
       t@@ -227,38 +227,38 @@ info("# Testing wall dynamics")
        info("Wall present, no contact, fixed (default)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01, verbose=false)
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
        Granular.interactWalls!(sim)
        Granular.updateWallKinematics!(sim)
        @test sim.walls[1].force ≈ 0.
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 0.
       -@test sim.walls[1].pos ≈ -1.01
       +@test sim.walls[1].pos ≈ -0.01
        @test sim.grains[1].force[1] ≈ 0.
        @test sim.grains[1].force[2] ≈ 0.
        
        info("Wall present, no contact, fixed (TY2)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01, verbose=false)
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
        Granular.interactWalls!(sim)
        Granular.updateWallKinematics!(sim, method="Two-term Taylor")
        @test sim.walls[1].force ≈ 0.
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 0.
       -@test sim.walls[1].pos ≈ -1.01
       +@test sim.walls[1].pos ≈ -0.01
        @test sim.grains[1].force[1] ≈ 0.
        @test sim.grains[1].force[2] ≈ 0.
        
        info("Wall present, no contact, fixed (TY3)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01, verbose=false)
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
        Granular.interactWalls!(sim)
        @test_throws ErrorException Granular.updateWallKinematics!(sim, method="asdf")
       t@@ -266,27 +266,27 @@ Granular.updateWallKinematics!(sim, method="Three-term Taylor")
        @test sim.walls[1].force ≈ 0.
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 0.
       -@test sim.walls[1].pos ≈ -1.01
       +@test sim.walls[1].pos ≈ -0.01
        @test sim.grains[1].force[1] ≈ 0.
        @test sim.grains[1].force[2] ≈ 0.
        
        info("Wall present, contact, fixed")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01, verbose=false)
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
        Granular.interactWalls!(sim)
        Granular.updateWallKinematics!(sim)
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 0.
       -@test sim.walls[1].pos ≈ -1.01
       +@test sim.walls[1].pos ≈ -0.01
        
        info("Wall present, no contact, velocity BC")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01,
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01,
                                            bc="velocity", vel=1.0,
                                            verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
       t@@ -295,15 +295,15 @@ Granular.updateWallKinematics!(sim)
        @test sim.walls[1].force ≈ 0.
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 1.
       -@test sim.walls[1].pos > -1.01
       +@test sim.walls[1].pos > -0.01
        @test sim.grains[1].force[1] ≈ 0.
        @test sim.grains[1].force[2] ≈ 0.
        
        info("Wall present, no contact, velocity BC (TY2)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01,
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01,
                                            bc="velocity", vel=1.0,
                                            verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
       t@@ -312,15 +312,15 @@ Granular.updateWallKinematics!(sim, method="Two-term Taylor")
        @test sim.walls[1].force ≈ 0.
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 1.
       -@test sim.walls[1].pos > -1.01
       +@test sim.walls[1].pos > -0.01
        @test sim.grains[1].force[1] ≈ 0.
        @test sim.grains[1].force[2] ≈ 0.
        
        info("Wall present, no contact, velocity BC (TY3)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01,
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01,
                                            bc="velocity", vel=1.0,
                                            verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
       t@@ -330,15 +330,15 @@ Granular.updateWallKinematics!(sim, method="Three-term Taylor")
        @test sim.walls[1].force ≈ 0.
        @test sim.walls[1].acc ≈ 0.
        @test sim.walls[1].vel ≈ 1.
       -@test sim.walls[1].pos > -1.01
       +@test sim.walls[1].pos > -0.01
        @test sim.grains[1].force[1] ≈ 0.
        @test sim.grains[1].force[2] ≈ 0.
        
        info("Wall present, contact, velocity BC (TY2)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.9,
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], 0.1,
                                            bc="velocity", vel=1.0,
                                            verbose=false)
        Granular.setTimeStep!(sim, verbose=false)
       t@@ -352,8 +352,8 @@ Granular.updateWallKinematics!(sim, method="Two-term Taylor")
        info("Wall present, contact, velocity BC (TY2)")
        sim = Granular.createSimulation()
        sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       -Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false)
       -Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.9,
       +Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false)
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], 0.1,
                                            bc="velocity", vel=1.0,
                                            verbose=false)
        Granular.setTimeStep!(sim, verbose=false)