Granular.jl

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

commit a9fb9ff582212dcc6d22f83851987d97bda76f4f
parent 6942faf25139645b324b47eea7b671e7dde7aba6
Author: Anders Damsgaard <andersd@riseup.net>
Date:   Mon,  6 Nov 2017 14:59:16 -0500

add tests for regular packing generation, add docstring to grid.jl

Diffstat:
Msrc/grid.jl | 8+++++++-
Msrc/packing.jl | 49++++++++++++++++++++++++++++++++++++++++++++++++-
Mtest/packing.jl | 32+++++++++++++++++++++++++++++++-
3 files changed, 86 insertions(+), 3 deletions(-)

diff --git a/src/grid.jl b/src/grid.jl @@ -799,9 +799,15 @@ export fitGridToGrains! Fit the ocean or atmosphere grid for a simulation to the current grains and their positions. + +# Arguments +* `simulation::Simulation`: simulation object to manipulate. +* `grid::Any`: Ocean or Atmosphere grid to manipulate. +* `padding::Real`: optional padding around edges [m]. +* `verbose::Bool`: show grid information when function completes. """ function fitGridToGrains!(simulation::Simulation, grid::Any; - padding::Float64 = 0., verbose::Bool = true) + padding::Real=0., verbose::Bool=true) if typeof(grid) != Ocean && typeof(grid) != Atmosphere error("grid must be of Ocean or Atmosphere type") diff --git a/src/packing.jl b/src/packing.jl @@ -2,9 +2,56 @@ export regularPacking! """ + + regularPacking!(simulation, n, r_min, r_max[, padding_factor, + size_distribution, size_distribution_parameter]) + +Create a grid-based regular packing with grain numbers along each axis specified +by the `n` vector. + +# Arguments +* `simulation::Simulation`: simulation object where the grains are inserted, + preferably not containing prior grains. +* `n::Vector{Integer}`: 2-element vector determining number of grains along the + `x` and `y` axes. +* `r_min::Real`: minimum desired grain radius. +* `r_max::Real`: maximum desired grain radius. +* `padding_factor::Real`: percentage-wise padding around each grain to allow for + random perturbations to grain position. +* `size_distribution::String`: grain-size distribution to sample. Valid values + are "powerlaw" and "uniform". +* `size_distribution_parameter::Real`: parameter to pass to the grain-size + distribution generating function. +* `seed::Integer`: seed value to the pseudo-random number generator. """ function regularPacking!(simulation::Simulation, - ) + n::Vector{Int}, + r_min::Real, + r_max::Real; + padding_factor::Real=.1, + size_distribution::String="powerlaw", + size_distribution_parameter::Real=-1.8, + seed::Integer=1) + + r_rand = 0. + h = .5 # disc tickness + dx = r_max*2.*(1. + padding_factor) # cell size + srand(seed) + + for iy in 1:n[2] + for ix in 1:n[1] + + if size_distribution == "powerlaw" + r_rand = Granular.randpower(1, size_distribution_parameter, + r_min, r_max) + elseif size_distribution == "uniform" + r_rand = rand()*(r_max - r_min) + r_min + end + + addGrainCylindrical!(simulation, [ix*dx - .5*dx, iy*dx - .5*dx], + r_rand, h, verbose=false) + end + end end diff --git a/test/packing.jl b/test/packing.jl @@ -2,6 +2,36 @@ verbose = true -#info("#### $(basename(@__FILE__)) ####") +info("#### $(basename(@__FILE__)) ####") +info("Testing regular packing generation (power law GSD)") +sim = Granular.createSimulation() +Granular.regularPacking!(sim, [2, 2], 1., 1., size_distribution="powerlaw") +Test.@test 4 == length(sim.grains) +for grain in sim.grains + Test.@test grain.contact_radius ≈ 1. +end +sim = Granular.createSimulation() +Granular.regularPacking!(sim, [10, 10], 1., 10., size_distribution="powerlaw") +Test.@test 100 == length(sim.grains) +for grain in sim.grains + Test.@test grain.contact_radius >= 1. + Test.@test grain.contact_radius <= 10. +end + +info("Testing regular packing generation (uniform GSD)") +sim = Granular.createSimulation() +Granular.regularPacking!(sim, [2, 2], 1., 1., size_distribution="uniform") +Test.@test 4 == length(sim.grains) +for grain in sim.grains + Test.@test grain.contact_radius ≈ 1. +end + +sim = Granular.createSimulation() +Granular.regularPacking!(sim, [10, 10], 1., 10., size_distribution="uniform") +Test.@test 100 == length(sim.grains) +for grain in sim.grains + Test.@test grain.contact_radius >= 1. + Test.@test grain.contact_radius <= 10. +end