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