tcontact-search-and-geometry.jl - 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
       ---
       tcontact-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