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

contact-search-and-geometry.jl (11342B)


      1 #!/usr/bin/env julia
      2 using Test
      3 import Granular
      4 
      5 # Check the contact search and geometry of a two-particle interaction
      6 
      7 @info "Testing interGrainPositionVector(...) and findOverlap(...)"
      8 sim = Granular.createSimulation("test")
      9 sim = Granular.createSimulation(id="test")
     10 Granular.addGrainCylindrical!(sim, [ 0.01, 0.01], 10., 1., verbose=false)
     11 Granular.addGrainCylindrical!(sim, [18.01, 0.01], 10., 1., verbose=false)
     12 
     13 position_ij = Granular.interGrainPositionVector(sim, 1, 2)
     14 overlap_ij = Granular.findOverlap(sim, 1, 2, position_ij)
     15 
     16 @test [-18., 0., 0.] ≈ position_ij
     17 @test -2. ≈ overlap_ij
     18 
     19 
     20 @info "Testing findContactsAllToAll(...)"
     21 sim_copy = deepcopy(sim)
     22 Granular.findContactsAllToAll!(sim)
     23 
     24 
     25 @info "Testing findContacts(...)"
     26 sim = deepcopy(sim_copy)
     27 Granular.findContacts!(sim)
     28 
     29 sim.grains[1].enabled = false
     30 # The contact should be registered in ice floe 1, but not ice floe 2
     31 @test 2 == sim.grains[1].contacts[1]
     32 @test [-18., 0., 0.] ≈ sim.grains[1].position_vector[1]
     33 for ic=2:sim.Nc_max
     34     @test 0 == sim.grains[1].contacts[ic]
     35     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
     36     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
     37 end
     38 for ic=1:sim.Nc_max
     39     @test 0 == sim.grains[2].contacts[ic]
     40     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
     41     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
     42 end
     43 @test 1 == sim.grains[1].n_contacts
     44 @test 1 == sim.grains[2].n_contacts
     45 
     46 @info "Testing findContacts(...)"
     47 sim = deepcopy(sim_copy)
     48 Granular.findContacts!(sim)
     49 
     50 @test 2 == sim.grains[1].contacts[1]
     51 @test [-18., 0., 0.] ≈ sim.grains[1].position_vector[1]
     52 for ic=2:sim.Nc_max
     53     @test 0 == sim.grains[1].contacts[ic]
     54     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
     55     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
     56 end
     57 for ic=1:sim.Nc_max
     58     @test 0 == sim.grains[2].contacts[ic]
     59     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
     60     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
     61 end
     62 @test 1 == sim.grains[1].n_contacts
     63 @test 1 == sim.grains[2].n_contacts
     64 
     65 @test_throws ErrorException Granular.findContacts!(sim, method="")
     66 
     67 sim = deepcopy(sim_copy)
     68 sim.grains[1].enabled = false
     69 sim.grains[2].enabled = false
     70 Granular.findContacts!(sim)
     71 for ic=1:sim.Nc_max
     72     @test 0 == sim.grains[1].contacts[ic]
     73     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
     74     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
     75 end
     76 for ic=1:sim.Nc_max
     77     @test 0 == sim.grains[2].contacts[ic]
     78     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
     79     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
     80 end
     81 @test 0 == sim.grains[1].n_contacts
     82 @test 0 == sim.grains[2].n_contacts
     83 
     84 
     85 sim = deepcopy(sim_copy)
     86 Granular.disableGrain!(sim, 1)
     87 Granular.findContacts!(sim)
     88 for ic=1:sim.Nc_max
     89     @test 0 == sim.grains[1].contacts[ic]
     90     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
     91     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
     92 end
     93 for ic=1:sim.Nc_max
     94     @test 0 == sim.grains[2].contacts[ic]
     95     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
     96     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
     97 end
     98 @test 0 == sim.grains[1].n_contacts
     99 @test 0 == sim.grains[2].n_contacts
    100 
    101 
    102 sim = deepcopy(sim_copy)
    103 Granular.disableGrain!(sim, 1)
    104 Granular.disableGrain!(sim, 2)
    105 Granular.findContacts!(sim)
    106 for ic=1:sim.Nc_max
    107     @test 0 == sim.grains[1].contacts[ic]
    108     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
    109     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
    110 end
    111 for ic=1:sim.Nc_max
    112     @test 0 == sim.grains[2].contacts[ic]
    113     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
    114     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
    115 end
    116 @test 0 == sim.grains[1].n_contacts
    117 @test 0 == sim.grains[2].n_contacts
    118 
    119 @info "Testing if interact(...) removes contacts correctly"
    120 sim = deepcopy(sim_copy)
    121 Granular.findContacts!(sim)
    122 Granular.interact!(sim)
    123 Granular.findContacts!(sim)
    124 
    125 @test 2 == sim.grains[1].contacts[1]
    126 @test [-18., 0., 0.] ≈ sim.grains[1].position_vector[1]
    127 for ic=2:sim.Nc_max
    128     @test 0 == sim.grains[1].contacts[ic]
    129     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
    130     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
    131 end
    132 for ic=1:sim.Nc_max
    133     @test 0 == sim.grains[2].contacts[ic]
    134     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
    135     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
    136 end
    137 @test 1 == sim.grains[1].n_contacts
    138 @test 1 == sim.grains[2].n_contacts
    139 
    140 
    141 @info "Testing findContactsGrid(...)"
    142 sim = deepcopy(sim_copy)
    143 sim.ocean = Granular.createRegularOceanGrid([4, 4, 2], [80., 80., 2.])
    144 Granular.sortGrainsInGrid!(sim, sim.ocean)
    145 Granular.findContactsInGrid!(sim, sim.ocean)
    146 
    147 @test 2 == sim.grains[1].contacts[1]
    148 for ic=2:sim.Nc_max
    149     @test 0 == sim.grains[1].contacts[ic]
    150     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
    151     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
    152 end
    153 for ic=1:sim.Nc_max
    154     @test 0 == sim.grains[2].contacts[ic]
    155     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
    156     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
    157 end
    158 @test 1 == sim.grains[1].n_contacts
    159 @test 1 == sim.grains[2].n_contacts
    160 
    161 
    162 sim = deepcopy(sim_copy)
    163 sim.ocean = Granular.createRegularOceanGrid([4, 4, 2], [80., 80., 2.])
    164 sim.grains[1].fixed = true
    165 Granular.sortGrainsInGrid!(sim, sim.ocean)
    166 Granular.findContactsInGrid!(sim, sim.ocean)
    167 
    168 @test 2 == sim.grains[1].contacts[1]
    169 for ic=2:sim.Nc_max
    170     @test 0 == sim.grains[1].contacts[ic]
    171     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
    172     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
    173 end
    174 for ic=1:sim.Nc_max
    175     @test 0 == sim.grains[2].contacts[ic]
    176     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
    177     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
    178 end
    179 @test 1 == sim.grains[1].n_contacts
    180 @test 1 == sim.grains[2].n_contacts
    181 
    182 
    183 sim = deepcopy(sim_copy)
    184 sim.ocean = Granular.createRegularOceanGrid([4, 4, 2], [80., 80., 2.])
    185 sim.grains[1].enabled = false
    186 sim.grains[2].enabled = false
    187 Granular.sortGrainsInGrid!(sim, sim.ocean)
    188 Granular.findContactsInGrid!(sim, sim.ocean)
    189 
    190 for ic=1:sim.Nc_max
    191     @test 0 == sim.grains[1].contacts[ic]
    192     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
    193     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
    194 end
    195 for ic=1:sim.Nc_max
    196     @test 0 == sim.grains[2].contacts[ic]
    197     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
    198     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
    199 end
    200 @test 0 == sim.grains[1].n_contacts
    201 @test 0 == sim.grains[2].n_contacts
    202 
    203 @info "Testing findContacts(...)"
    204 sim = deepcopy(sim_copy)
    205 sim.ocean = Granular.createRegularOceanGrid([4, 4, 2], [80., 80., 2.])
    206 Granular.sortGrainsInGrid!(sim, sim.ocean)
    207 Granular.findContacts!(sim)
    208 
    209 @test 2 == sim.grains[1].contacts[1]
    210 for ic=2:sim.Nc_max
    211     @test 0 == sim.grains[1].contacts[ic]
    212     @test [0., 0., 0.] ≈ sim.grains[1].position_vector[ic]
    213     @test [0., 0., 0.] ≈ sim.grains[1].contact_parallel_displacement[ic]
    214 end
    215 for ic=1:sim.Nc_max
    216     @test 0 == sim.grains[2].contacts[ic]
    217     @test [0., 0., 0.] ≈ sim.grains[2].position_vector[ic]
    218     @test [0., 0., 0.] ≈ sim.grains[2].contact_parallel_displacement[ic]
    219 end
    220 @test 1 == sim.grains[1].n_contacts
    221 @test 1 == sim.grains[2].n_contacts
    222 
    223 @test_throws ErrorException Granular.findContacts!(sim, method="")
    224 
    225 @info "Testing contact registration with multiple contacts"
    226 sim = Granular.createSimulation(id="test")
    227 Granular.addGrainCylindrical!(sim, [2., 2.], 1.01, 1., verbose=false)
    228 Granular.addGrainCylindrical!(sim, [4., 2.], 1.01, 1., verbose=false)
    229 Granular.addGrainCylindrical!(sim, [6., 2.], 1.01, 1., verbose=false)
    230 Granular.addGrainCylindrical!(sim, [2., 4.], 1.01, 1., verbose=false)
    231 Granular.addGrainCylindrical!(sim, [4., 4.], 1.01, 1., verbose=false)
    232 Granular.addGrainCylindrical!(sim, [6., 4.], 1.01, 1., verbose=false)
    233 Granular.addGrainCylindrical!(sim, [2., 6.], 1.01, 1., verbose=false)
    234 Granular.addGrainCylindrical!(sim, [4., 6.], 1.01, 1., verbose=false)
    235 Granular.addGrainCylindrical!(sim, [6., 6.], 1.01, 1., verbose=false)
    236 sim.ocean = Granular.createRegularOceanGrid([4, 4, 2], [8., 8., 2.])
    237 Granular.sortGrainsInGrid!(sim, sim.ocean)
    238 Granular.findContacts!(sim)
    239 @test 2 == sim.grains[1].n_contacts
    240 @test 3 == sim.grains[2].n_contacts
    241 @test 2 == sim.grains[3].n_contacts
    242 @test 3 == sim.grains[4].n_contacts
    243 @test 4 == sim.grains[5].n_contacts
    244 @test 3 == sim.grains[6].n_contacts
    245 @test 2 == sim.grains[7].n_contacts
    246 @test 3 == sim.grains[8].n_contacts
    247 @test 2 == sim.grains[9].n_contacts
    248 Granular.interact!(sim)
    249 Granular.interact!(sim)
    250 Granular.interact!(sim)
    251 Granular.interact!(sim)
    252 @test 2 == sim.grains[1].n_contacts
    253 @test 3 == sim.grains[2].n_contacts
    254 @test 2 == sim.grains[3].n_contacts
    255 @test 3 == sim.grains[4].n_contacts
    256 @test 4 == sim.grains[5].n_contacts
    257 @test 3 == sim.grains[6].n_contacts
    258 @test 2 == sim.grains[7].n_contacts
    259 @test 3 == sim.grains[8].n_contacts
    260 @test 2 == sim.grains[9].n_contacts
    261 for i=1:9
    262     sim.grains[i].contact_radius = 0.99
    263 end
    264 Granular.interact!(sim)
    265 for i=1:9
    266     @test sim.grains[i].n_contacts == 0
    267 end
    268 
    269 @info "Test contact search in regular square grid (all to all)"
    270 sim = Granular.createSimulation()
    271 nx = 60; ny = 50
    272 Granular.regularPacking!(sim, [nx, ny], 1., 1., padding_factor=0,
    273                          tiling="square")
    274 for grain in sim.grains
    275     grain.contact_radius *= 1.00001
    276 end
    277 Granular.findContacts!(sim)
    278 #Granular.plotGrains(sim)
    279 for j=2:(ny-1)
    280     for i=2:(nx-1)
    281         idx = (j - 1)*nx + i
    282         @test sim.grains[idx].n_contacts == 4
    283     end
    284 end
    285 
    286 @info "Test contact search in regular square grid (sorting grid)"
    287 sim = Granular.createSimulation()
    288 nx = 60; ny = 50
    289 Granular.regularPacking!(sim, [nx, ny], 1., 1., padding_factor=0,
    290                          tiling="square")
    291 Granular.fitGridToGrains!(sim, sim.ocean, verbose=false)
    292 for grain in sim.grains
    293     grain.contact_radius *= 1.00001
    294 end
    295 Granular.findContacts!(sim)
    296 #Granular.plotGrains(sim)
    297 for j=2:(ny-1)
    298     for i=2:(nx-1)
    299         idx = (j - 1)*nx + i
    300         @test sim.grains[idx].n_contacts == 4
    301     end
    302 end
    303 
    304 @info "Test changes to the max. number of contacts"
    305 sim = Granular.createSimulation()
    306 nx = 60; ny = 50
    307 Granular.regularPacking!(sim, [nx, ny], 1., 1., padding_factor=0,
    308                          tiling="square")
    309 @test 32 == sim.Nc_max
    310 @test_throws ErrorException Granular.setMaximumNumberOfContactsPerGrain!(sim, 0)
    311 @test_throws ErrorException Granular.setMaximumNumberOfContactsPerGrain!(sim,-1)
    312 @test_throws ErrorException Granular.setMaximumNumberOfContactsPerGrain!(sim,32)
    313 
    314 for Nc_max in [4, 32, 33, 100, 1]
    315     @info("Nc_max = $Nc_max")
    316     Granular.setMaximumNumberOfContactsPerGrain!(sim, Nc_max)
    317     for grain in sim.grains
    318         @test length(grain.contacts) == Nc_max
    319         @test length(grain.position_vector) == Nc_max
    320         @test length(grain.contact_rotation) == Nc_max
    321         @test length(grain.contact_age) == Nc_max
    322         @test length(grain.contact_area) == Nc_max
    323         @test length(grain.compressive_failure) == Nc_max
    324     end
    325 end