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