Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl # fast
git clone https://src.adamsgaard.dk/Granular.jl.git # slow
Log | Files | Refs | README | LICENSE Back to index

packing.jl (7005B)


      1 #!/usr/bin/env julia
      2 using Test
      3 import Granular
      4 
      5 verbose = false
      6 plot = false
      7 plot_packings=false
      8 
      9 @info "Testing regular packing generation (power law GSD)"
     10 sim = Granular.createSimulation()
     11 Granular.regularPacking!(sim, [2, 2], 1., 1., size_distribution="powerlaw")
     12 @test 4 == length(sim.grains)
     13 for grain in sim.grains
     14     @test grain.contact_radius ≈ 1.
     15 end
     16 
     17 sim = Granular.createSimulation()
     18 Granular.regularPacking!(sim, [10, 10], 1., 10., size_distribution="powerlaw")
     19 @test 100 == length(sim.grains)
     20 for grain in sim.grains
     21     @test grain.contact_radius >= 1.
     22     @test grain.contact_radius <= 10.
     23 end
     24 plot && Granular.plotGrains(sim, filetype="regular-powerlaw.png", show_figure=false)
     25 
     26 @info "Testing regular packing generation (uniform GSD)"
     27 sim = Granular.createSimulation()
     28 Granular.regularPacking!(sim, [2, 2], 1., 1., size_distribution="uniform")
     29 @test 4 == length(sim.grains)
     30 for grain in sim.grains
     31     @test grain.contact_radius ≈ 1.
     32 end
     33 
     34 sim = Granular.createSimulation()
     35 Granular.regularPacking!(sim, [10, 10], 1., 10., size_distribution="uniform")
     36 @test 100 == length(sim.grains)
     37 for grain in sim.grains
     38     @test grain.contact_radius >= 1.
     39     @test grain.contact_radius <= 10.
     40 end
     41 plot && Granular.plotGrains(sim, filetype="regular-uniform.png", show_figure=false)
     42 
     43 
     44 @info "Testing irregular (Poisson-disk) packing generation (monodisperse size)"
     45 sim = Granular.createSimulation("poisson1-monodisperse-nopadding")
     46 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [1., 1., 1.])
     47 Granular.irregularPacking!(sim,
     48                            radius_max=.1,
     49                            radius_min=.1,
     50                            padding_factor=0.,
     51                            plot_during_packing=plot_packings,
     52                            verbose=verbose)
     53 @test length(sim.grains) > 23
     54 
     55 @info "Testing irregular (Poisson-disk) packing generation (wide PSD)"
     56 sim = Granular.createSimulation("poisson2-wide-nopadding")
     57 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [1., 1., 1.])
     58 Granular.irregularPacking!(sim,
     59                            radius_max=.1,
     60                            radius_min=.005,
     61                            padding_factor=0.,
     62                            plot_during_packing=plot_packings,
     63                            verbose=verbose)
     64 @test length(sim.grains) > 280
     65 sim = Granular.createSimulation("poisson3-wide-padding")
     66 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [1., 1., 1.])
     67 Granular.irregularPacking!(sim,
     68                            radius_max=.1,
     69                            radius_min=.005,
     70                            padding_factor=2.,
     71                            plot_during_packing=plot_packings,
     72                            verbose=verbose)
     73 @test length(sim.grains) > 280
     74 
     75 sim = Granular.createSimulation("poisson4-binary-search")
     76 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [1., 1., 1.])
     77 Granular.irregularPacking!(sim,
     78                            radius_max=.1,
     79                            radius_min=.005,
     80                            binary_radius_search=true,
     81                            plot_during_packing=plot_packings,
     82                            verbose=verbose)
     83 @test length(sim.grains) > 280
     84 
     85 @info "Testing irregular packing with inactive boundaries"
     86 sim = Granular.createSimulation("poisson-inactive")
     87 sim.ocean = Granular.createRegularOceanGrid([5, 5, 1], [1., 1., 1.])
     88 Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=verbose)
     89 Granular.irregularPacking!(sim,
     90                            radius_max=.05,
     91                            radius_min=.1,
     92                            padding_factor=0.,
     93                            plot_during_packing=plot_packings,
     94                            verbose=verbose)
     95 Granular.findContacts!(sim, method="ocean grid")
     96 plot && Granular.plotGrains(sim, filetype="poisson-inactive.png", show_figure=false)
     97 for grain in sim.grains
     98     @test grain.n_contacts == 0
     99 end
    100 
    101 @info "Testing irregular packing with periodic boundaries"
    102 sim = Granular.createSimulation("poisson-periodic")
    103 sim.ocean = Granular.createRegularOceanGrid([5, 5, 1], [1., 1., 1.])
    104 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=verbose)
    105 Granular.irregularPacking!(sim,
    106                            radius_max=.05,
    107                            radius_min=.1,
    108                            padding_factor=0.,
    109                            plot_during_packing=plot_packings,
    110                            verbose=verbose)
    111 plot && Granular.plotGrains(sim, filetype="poisson-periodic.png", show_figure=false)
    112 Granular.findContacts!(sim, method="ocean grid")
    113 for grain in sim.grains
    114     @test grain.n_contacts == 0
    115 end
    116 
    117 
    118 @info "Testing raster-based mapping algorithm"
    119 sim = Granular.createSimulation("raster-packing1")
    120 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [1., 1., 1.])
    121 Granular.addGrainCylindrical!(sim, [0.5, 0.5], 0.4, 1.0)
    122 occupied = Granular.rasterMap(sim, 0.08)
    123 occupied_ans = Array{Bool}([
    124 0 0 0 0 0 0 0 0 0 0 0 0;
    125 0 0 0 1 1 1 1 1 1 0 0 0;
    126 0 0 1 1 1 1 1 1 1 1 1 0;
    127 0 1 1 1 1 1 1 1 1 1 1 0;
    128 0 1 1 1 1 1 1 1 1 1 1 1;
    129 0 1 1 1 1 1 1 1 1 1 1 1;
    130 0 1 1 1 1 1 1 1 1 1 1 1;
    131 0 1 1 1 1 1 1 1 1 1 1 1;
    132 0 1 1 1 1 1 1 1 1 1 1 0;
    133 0 0 1 1 1 1 1 1 1 1 1 0;
    134 0 0 1 1 1 1 1 1 1 1 0 0;
    135 0 0 0 0 1 1 1 1 0 0 0 0])
    136 @test occupied == occupied_ans
    137 Granular.addGrainCylindrical!(sim, [0.03, 0.03], 0.02, 1.0)
    138 occupied = Granular.rasterMap(sim, 0.08)
    139 occupied_ans = Array{Bool}([
    140 1 0 0 0 0 0 0 0 0 0 0 0;
    141 0 0 0 1 1 1 1 1 1 0 0 0;
    142 0 0 1 1 1 1 1 1 1 1 1 0;
    143 0 1 1 1 1 1 1 1 1 1 1 0;
    144 0 1 1 1 1 1 1 1 1 1 1 1;
    145 0 1 1 1 1 1 1 1 1 1 1 1;
    146 0 1 1 1 1 1 1 1 1 1 1 1;
    147 0 1 1 1 1 1 1 1 1 1 1 1;
    148 0 1 1 1 1 1 1 1 1 1 1 0;
    149 0 0 1 1 1 1 1 1 1 1 1 0;
    150 0 0 1 1 1 1 1 1 1 1 0 0;
    151 0 0 0 0 1 1 1 1 0 0 0 0])
    152 @test occupied == occupied_ans
    153 sim_init = deepcopy(sim)
    154 plot && Granular.plotGrains(sim, filetype="rastermap.png", show_figure=false)
    155 
    156 @info "Testing raster-based mapping algorithm (power law GSD)"
    157 sim = deepcopy(sim_init)
    158 np_init = length(sim.grains)
    159 Granular.rasterPacking!(sim, 0.02, 0.04, verbose=verbose)
    160 @test np_init < length(sim.grains)
    161 plot && Granular.plotGrains(sim, filetype="powerlaw.png", show_figure=false)
    162 
    163 @info "Testing raster-based mapping algorithm (uniform GSD)"
    164 sim = deepcopy(sim_init)
    165 np_init = length(sim.grains)
    166 Granular.rasterPacking!(sim, 0.02, 0.04, size_distribution="uniform",
    167                         verbose=verbose)
    168 @test np_init < length(sim.grains)
    169 plot && Granular.plotGrains(sim, filetype="uniform.png", show_figure=false)
    170 
    171 @info "Tesing square packing"
    172 sim = Granular.createSimulation()
    173 Granular.regularPacking!(sim, [5,6], 1.0, 1.0, tiling="square",
    174                         padding_factor=0.0)
    175 @test length(sim.grains) == 5*6
    176 plot && Granular.plotGrains(sim, filetype="square.png", show_figure=false)
    177 
    178 @info "Tesing triangular packing"
    179 sim = Granular.createSimulation()
    180 Granular.regularPacking!(sim, [6,6], 1.0, 1.0, tiling="triangular",
    181                         padding_factor=0.0)
    182 @test length(sim.grains) == 6*6
    183 plot && Granular.plotGrains(sim, filetype="triangular.png", show_figure=false)