Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl
Log | Files | Refs | README | LICENSE

commit f9d909579743e69ab0ccdc2014884c54ad962249
parent 4cb1c336f00a3cb7613e7ad2efb5a5de5e3cbc16
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:
Msrc/grid.jl | 15+++++++++------
Mtest/contact-search-and-geometry.jl | 4++--
Mtest/memory-management.jl | 16++++++++--------
Mtest/wall.jl | 54+++++++++++++++++++++++++++---------------------------
4 files changed, 46 insertions(+), 43 deletions(-)

diff --git a/src/grid.jl b/src/grid.jl @@ -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 @@ -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 @@ -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 diff --git a/test/contact-search-and-geometry.jl b/test/contact-search-and-geometry.jl @@ -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) diff --git a/test/memory-management.jl b/test/memory-management.jl @@ -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) @@ -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) @@ -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) @@ -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 diff --git a/test/wall.jl b/test/wall.jl @@ -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 @@ -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 @@ -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") @@ -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) @@ -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) @@ -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) @@ -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) @@ -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)