tcollision-2floes-oblique.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
---
tcollision-2floes-oblique.jl (25824B)
---
1 #!/usr/bin/env julia
2
3 # Check for conservation of kinetic energy (=momentum) during a normal collision
4 # between two ice cylindrical grains
5
6 verbose=false
7
8 @info "## Contact-normal elasticity only"
9 @info "# One ice floe fixed"
10 sim = Granular.createSimulation(id="test")
11 Granular.addGrainCylindrical!(sim, [0., 10.], 10., 1., verbose=verbose)
12 Granular.addGrainCylindrical!(sim, [19., 0.], 10., 1., verbose=verbose)
13 sim.grains[1].lin_vel[1] = 0.1
14 sim.grains[1].contact_dynamic_friction = 0.
15 sim.grains[2].contact_dynamic_friction = 0.
16 sim.grains[2].fixed = true
17
18 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
19 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
20
21 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
22 # should become more correct
23
24 Granular.setTotalTime!(sim, 30.0)
25 #sim.file_time_step = 1.
26 sim_init = deepcopy(sim)
27
28 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
29 Granular.setTimeStep!(sim, epsilon=0.07)
30 tol = 0.1
31 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
32 Granular.run!(sim, temporal_integration_method="Two-term Taylor", verbose=verbose)
33
34 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
35 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
36 E_thermal_final = Granular.totalGrainThermalEnergy(sim)
37 @test E_kin_lin_init ≈ E_kin_lin_final+E_thermal_final atol=E_kin_lin_init*tol
38 @test E_kin_rot_init ≈ E_kin_rot_final
39
40
41 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
42 sim = deepcopy(sim_init)
43 Granular.setTimeStep!(sim, epsilon=0.007)
44 tol = 0.01
45 @info "Relative tolerance: $(tol*100.)%"
46 Granular.run!(sim, temporal_integration_method="Two-term Taylor", verbose=verbose)
47
48 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
49 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
50 E_thermal_final = Granular.totalGrainThermalEnergy(sim)
51 @test E_kin_lin_init ≈ E_kin_lin_final+E_thermal_final atol=E_kin_lin_init*tol
52 @test E_kin_rot_init ≈ E_kin_rot_final
53
54
55 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
56 sim = deepcopy(sim_init)
57 Granular.setTimeStep!(sim, epsilon=0.07)
58 tol = 0.01
59 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
60 Granular.run!(sim, temporal_integration_method="Three-term Taylor", verbose=verbose)
61
62 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
63 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
64 E_thermal_final = Granular.totalGrainThermalEnergy(sim)
65 @test E_kin_lin_init ≈ E_kin_lin_final+E_thermal_final atol=E_kin_lin_init*tol
66 @test E_kin_rot_init ≈ E_kin_rot_final
67
68 @info "# Ice floes free to move"
69
70 sim = Granular.createSimulation(id="test")
71 Granular.addGrainCylindrical!(sim, [0., 10.], 10., 1., verbose=verbose)
72 Granular.addGrainCylindrical!(sim, [19.0, 0.], 10., 1., verbose=verbose)
73 sim.grains[1].lin_vel[1] = 0.1
74 sim.grains[1].contact_dynamic_friction = 0.
75 sim.grains[2].contact_dynamic_friction = 0.
76
77 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
78 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
79
80 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
81 # should become more correct
82
83 Granular.setTotalTime!(sim, 30.0)
84 sim_init = deepcopy(sim)
85
86 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
87 Granular.setTimeStep!(sim, epsilon=0.07)
88 tol = 0.1
89 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
90 Granular.run!(sim, temporal_integration_method="Two-term Taylor", verbose=verbose)
91
92 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
93 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
94 @test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
95 @test E_kin_rot_init ≈ E_kin_rot_final
96
97
98 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
99 sim = deepcopy(sim_init)
100 Granular.setTimeStep!(sim, epsilon=0.007)
101 tol = 0.01
102 @info "Relative tolerance: $(tol*100.)%"
103 Granular.run!(sim, temporal_integration_method="Two-term Taylor", verbose=verbose)
104
105 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
106 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
107 @test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
108 @test E_kin_rot_init ≈ E_kin_rot_final
109
110
111 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
112 sim = deepcopy(sim_init)
113 Granular.setTimeStep!(sim, epsilon=0.07)
114 tol = 0.01
115 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
116 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
117 verbose=verbose)
118
119 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
120 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
121 @test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
122 @test E_kin_rot_init ≈ E_kin_rot_final
123
124
125 @info "## Contact-normal elasticity and tangential viscosity and friction"
126 Granular.setTotalTime!(sim, 30.0)
127 sim_init.grains[1].contact_viscosity_tangential = 1e6
128 sim_init.grains[2].contact_viscosity_tangential = 1e6
129 sim_init.grains[1].contact_dynamic_friction = 1e2 # no Coulomb sliding
130 sim_init.grains[2].contact_dynamic_friction = 1e2 # no Coulomb sliding
131 sim_init.grains[2].fixed = true
132 sim = deepcopy(sim_init)
133
134
135 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
136 Granular.setTimeStep!(sim, epsilon=0.07)
137 tol = 0.1
138 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
139 Granular.setOutputFileInterval!(sim, 1.0)
140 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
141 verbose=verbose)
142
143 @test sim.grains[1].ang_pos[3] < 0.
144 @test sim.grains[1].ang_vel[3] < 0.
145 @test sim.grains[2].ang_pos[3] ≈ 0.
146 @test sim.grains[2].ang_vel[3] ≈ 0.
147 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
148 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
149 println(E_kin_lin_init)
150 println(E_kin_lin_final)
151 println(E_kin_rot_init)
152 println(E_kin_rot_final)
153 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
154
155 @info "mu_d = 0."
156 sim = deepcopy(sim_init)
157 sim.grains[1].contact_dynamic_friction = 0.
158 Granular.setTimeStep!(sim, epsilon=0.07)
159 tol = 0.01
160 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
161 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
162 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
163 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
164 verbose=verbose)
165
166 @test sim.grains[1].ang_pos[3] ≈ 0.
167 @test sim.grains[1].ang_vel[3] ≈ 0.
168 @test sim.grains[2].ang_pos[3] ≈ 0.
169 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
170 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
171 @test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
172 @test E_kin_rot_init ≈ E_kin_rot_final
173
174 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
175 sim = deepcopy(sim_init)
176 Granular.setTimeStep!(sim, epsilon=0.007)
177 tol = 0.1
178 @info "Relative tolerance: $(tol*100.)%"
179 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
180 verbose=verbose)
181
182 @test sim.grains[1].ang_pos[3] < 0.
183 @test sim.grains[1].ang_vel[3] < 0.
184 @test sim.grains[2].ang_pos[3] ≈ 0.
185 @test sim.grains[2].ang_vel[3] ≈ 0.
186 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
187 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
188 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
189
190
191 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
192 sim = deepcopy(sim_init)
193 Granular.setTimeStep!(sim, epsilon=0.07)
194 tol = 0.09
195 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
196 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
197 verbose=verbose)
198
199 @test sim.grains[1].ang_pos[3] < 0.
200 @test sim.grains[1].ang_vel[3] < 0.
201 @test sim.grains[2].ang_pos[3] ≈ 0.
202 @test sim.grains[2].ang_vel[3] ≈ 0.
203 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
204 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
205 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
206
207 @info "# Ice floes free to move"
208
209 sim = Granular.createSimulation(id="test")
210 Granular.addGrainCylindrical!(sim, [0., 10.], 10., 1., verbose=verbose)
211 Granular.addGrainCylindrical!(sim, [19.0, 0.], 10., 1., verbose=verbose)
212 sim.grains[1].lin_vel[1] = 0.1
213 sim.grains[1].contact_viscosity_tangential = 1e4
214 sim.grains[2].contact_viscosity_tangential = 1e4
215
216 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
217 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
218
219 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
220 # should become more correct
221
222 Granular.setTotalTime!(sim, 30.0)
223 sim_init = deepcopy(sim)
224
225 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
226 Granular.setTimeStep!(sim, epsilon=0.07)
227 tol = 0.1
228 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
229 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
230 verbose=verbose)
231
232 @test sim.grains[1].ang_pos[3] < 0.
233 @test sim.grains[1].ang_vel[3] < 0.
234 @test sim.grains[2].ang_pos[3] < 0.
235 @test sim.grains[2].ang_vel[3] < 0.
236 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
237 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
238 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
239
240 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
241 sim = deepcopy(sim_init)
242 Granular.setTimeStep!(sim, epsilon=0.007)
243 tol = 0.04
244 @info "Relative tolerance: $(tol*100.)%"
245 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
246 verbose=verbose)
247
248 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
249 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
250 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
251
252
253 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
254 sim = deepcopy(sim_init)
255 Granular.setTimeStep!(sim, epsilon=0.07)
256 tol = 0.04
257 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
258 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
259 verbose=verbose)
260
261 @test sim.grains[1].ang_pos[3] < 0.
262 @test sim.grains[1].ang_vel[3] < 0.
263 @test sim.grains[2].ang_pos[3] < 0.
264 @test sim.grains[2].ang_vel[3] < 0.
265 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
266 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
267 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
268
269
270 @info "# Ice floes free to move, mirrored"
271
272 sim = Granular.createSimulation(id="test")
273 Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
274 Granular.addGrainCylindrical!(sim, [19.0, 10.], 10., 1., verbose=verbose)
275 sim.grains[2].lin_vel[1] = -0.1
276 sim.grains[1].contact_viscosity_tangential = 1e4
277 sim.grains[2].contact_viscosity_tangential = 1e4
278
279 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
280 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
281
282 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
283 # should become more correct
284
285 Granular.setTotalTime!(sim, 30.0)
286 sim_init = deepcopy(sim)
287
288 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
289 Granular.setTimeStep!(sim, epsilon=0.07)
290 tol = 0.1
291 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
292 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
293 verbose=verbose)
294
295 @test sim.grains[1].ang_pos[3] > 0.
296 @test sim.grains[1].ang_vel[3] > 0.
297 @test sim.grains[2].ang_pos[3] > 0.
298 @test sim.grains[2].ang_vel[3] > 0.
299 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
300 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
301 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
302
303 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
304 sim = deepcopy(sim_init)
305 Granular.setTimeStep!(sim, epsilon=0.007)
306 tol = 0.04
307 @info "Relative tolerance: $(tol*100.)%"
308 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
309 verbose=verbose)
310
311 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
312 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
313 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
314
315
316 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
317 sim = deepcopy(sim_init)
318 Granular.setTimeStep!(sim, epsilon=0.07)
319 tol = 0.04
320 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
321 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
322 verbose=verbose)
323
324 @test sim.grains[1].ang_pos[3] > 0.
325 @test sim.grains[1].ang_vel[3] > 0.
326 @test sim.grains[2].ang_pos[3] > 0.
327 @test sim.grains[2].ang_vel[3] > 0.
328 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
329 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
330 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
331
332
333 @info "# Ice floes free to move, mirrored #2"
334
335 sim = Granular.createSimulation(id="test")
336 Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
337 Granular.addGrainCylindrical!(sim, [19.0, -10.], 10., 1., verbose=verbose)
338 sim.grains[2].lin_vel[1] = -0.1
339
340 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
341 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
342
343 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
344 # should become more correct
345
346 Granular.setTotalTime!(sim, 30.0)
347 sim_init = deepcopy(sim)
348
349 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
350 Granular.setTimeStep!(sim, epsilon=0.07)
351 tol = 0.1
352 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
353 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
354 verbose=verbose)
355
356 @test sim.grains[1].ang_pos[3] < 0.
357 @test sim.grains[1].ang_vel[3] < 0.
358 @test sim.grains[2].ang_pos[3] < 0.
359 @test sim.grains[2].ang_vel[3] < 0.
360 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
361 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
362 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
363
364 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
365 sim = deepcopy(sim_init)
366 Granular.setTimeStep!(sim, epsilon=0.007)
367 tol = 0.04
368 @info "Relative tolerance: $(tol*100.)%"
369 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
370 verbose=verbose)
371
372 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
373 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
374 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
375
376
377 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
378 sim = deepcopy(sim_init)
379 Granular.setTimeStep!(sim, epsilon=0.07)
380 tol = 0.04
381 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
382 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
383 verbose=verbose)
384
385 @test sim.grains[1].ang_pos[3] < 0.
386 @test sim.grains[1].ang_vel[3] < 0.
387 @test sim.grains[2].ang_pos[3] < 0.
388 @test sim.grains[2].ang_vel[3] < 0.
389 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
390 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
391 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
392
393
394 @info "# Tangential elasticity, no tangential viscosity, no Coulomb slip"
395
396 sim = Granular.createSimulation(id="test")
397 Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
398 Granular.addGrainCylindrical!(sim, [19.0, -10.], 10., 1., verbose=verbose)
399 sim.grains[2].lin_vel[1] = -0.1
400 sim.grains[1].contact_dynamic_friction = 1e3 # disable Coulomb slip
401 sim.grains[2].contact_dynamic_friction = 1e3 # disable Coulomb slip
402 sim.grains[1].contact_viscosity_tangential = 0. # disable tan. viscosity
403 sim.grains[2].contact_viscosity_tangential = 0. # disable tan. viscosity
404 sim.grains[1].contact_stiffness_tangential =
405 sim.grains[1].contact_stiffness_normal # enable tangential elasticity
406 sim.grains[2].contact_stiffness_tangential =
407 sim.grains[2].contact_stiffness_normal # enable tangential elasticity
408
409 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
410 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
411
412 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
413 # should become more correct
414
415 Granular.setTotalTime!(sim, 30.0)
416 sim_init = deepcopy(sim)
417
418 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
419 Granular.setTimeStep!(sim, epsilon=0.07)
420 tol = 0.1
421 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
422 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
423 verbose=verbose)
424
425 @test sim.grains[1].ang_pos[3] < 0.
426 @test sim.grains[1].ang_vel[3] < 0.
427 @test sim.grains[2].ang_pos[3] < 0.
428 @test sim.grains[2].ang_vel[3] < 0.
429 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
430 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
431 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
432
433 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
434 sim = deepcopy(sim_init)
435 Granular.setTimeStep!(sim, epsilon=0.007)
436 tol = 0.04
437 @info "Relative tolerance: $(tol*100.)%"
438 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
439 verbose=verbose)
440
441 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
442 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
443 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
444
445
446 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
447 sim = deepcopy(sim_init)
448 Granular.setTimeStep!(sim, epsilon=0.07)
449 tol = 0.04
450 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
451 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
452 verbose=verbose)
453
454 @test sim.grains[1].ang_pos[3] < 0.
455 @test sim.grains[1].ang_vel[3] < 0.
456 @test sim.grains[2].ang_pos[3] < 0.
457 @test sim.grains[2].ang_vel[3] < 0.
458 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
459 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
460 @test E_kin_lin_init+E_kin_rot_init ≈ E_kin_lin_final+E_kin_rot_final atol=E_kin_lin_init*tol
461
462
463 @info "# Tangential elasticity, no tangential viscosity, Coulomb slip"
464
465 sim = Granular.createSimulation(id="test")
466 Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
467 Granular.addGrainCylindrical!(sim, [19.0, -10.], 10., 1., verbose=verbose)
468 sim.grains[2].lin_vel[1] = -0.1
469 sim.grains[1].contact_dynamic_friction = 0.1 # enable Coulomb slip
470 sim.grains[2].contact_dynamic_friction = 0.1 # enable Coulomb slip
471 sim.grains[1].contact_viscosity_tangential = 0. # disable tan. viscosity
472 sim.grains[2].contact_viscosity_tangential = 0. # disable tan. viscosity
473 sim.grains[1].contact_stiffness_tangential =
474 sim.grains[1].contact_stiffness_normal # enable tangential elasticity
475 sim.grains[2].contact_stiffness_tangential =
476 sim.grains[2].contact_stiffness_normal # enable tangential elasticity
477
478 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
479 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
480
481 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
482 # should become more correct
483
484 Granular.setTotalTime!(sim, 30.0)
485 sim_init = deepcopy(sim)
486
487 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
488 sim = deepcopy(sim_init)
489 Granular.setTimeStep!(sim, epsilon=0.007)
490 tol = 0.02
491 @info "Relative tolerance: $(tol*100.)%"
492 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
493 verbose=verbose)
494
495 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
496 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
497 @test E_kin_lin_init+E_kin_rot_init > E_kin_lin_final+E_kin_rot_final
498
499 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
500 sim = deepcopy(sim_init)
501 Granular.setTimeStep!(sim, epsilon=0.07)
502 tol = 0.03
503 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
504 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
505 verbose=verbose)
506
507 @test sim.grains[1].ang_pos[3] < 0.
508 @test sim.grains[1].ang_vel[3] < 0.
509 @test sim.grains[2].ang_pos[3] < 0.
510 @test sim.grains[2].ang_vel[3] < 0.
511 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
512 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
513 @test E_kin_lin_init+E_kin_rot_init > E_kin_lin_final+E_kin_rot_final
514
515
516 @info "# Tangential elasticity, tangential viscosity, no Coulomb slip"
517
518 sim = Granular.createSimulation(id="test")
519 Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
520 Granular.addGrainCylindrical!(sim, [19.0, -10.], 10., 1., verbose=verbose)
521 sim.grains[2].lin_vel[1] = -0.1
522 sim.grains[1].contact_dynamic_friction = 1e3 # disable Coulomb slip
523 sim.grains[2].contact_dynamic_friction = 1e3 # disable Coulomb slip
524 sim.grains[1].contact_viscosity_tangential = 1e4 # enable tan. viscosity
525 sim.grains[2].contact_viscosity_tangential = 1e4 # enable tan. viscosity
526 sim.grains[1].contact_stiffness_tangential =
527 sim.grains[1].contact_stiffness_normal # enable tangential elasticity
528 sim.grains[2].contact_stiffness_tangential =
529 sim.grains[2].contact_stiffness_normal # enable tangential elasticity
530
531 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
532 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
533
534 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
535 # should become more correct
536
537 Granular.setTotalTime!(sim, 30.0)
538 sim_init = deepcopy(sim)
539
540 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
541 sim = deepcopy(sim_init)
542 Granular.setTimeStep!(sim, epsilon=0.007)
543 tol = 0.02
544 @info "Relative tolerance: $(tol*100.)%"
545 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
546 verbose=verbose)
547
548 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
549 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
550 @test E_kin_lin_init+E_kin_rot_init > E_kin_lin_final+E_kin_rot_final
551
552 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
553 sim = deepcopy(sim_init)
554 Granular.setTimeStep!(sim, epsilon=0.07)
555 tol = 0.03
556 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
557 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
558 verbose=verbose)
559
560 @test sim.grains[1].ang_pos[3] < 0.
561 @test sim.grains[1].ang_vel[3] < 0.
562 @test sim.grains[2].ang_pos[3] < 0.
563 @test sim.grains[2].ang_vel[3] < 0.
564 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
565 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
566 @test E_kin_lin_init+E_kin_rot_init > E_kin_lin_final+E_kin_rot_final
567
568
569 @info "# Tangential elasticity, tangential viscosity, Coulomb slip"
570
571 sim = Granular.createSimulation(id="test")
572 Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
573 Granular.addGrainCylindrical!(sim, [19.0, -10.], 10., 1., verbose=verbose)
574 sim.grains[2].lin_vel[1] = -0.1
575 sim.grains[1].contact_dynamic_friction = 0.1 # enable Coulomb slip
576 sim.grains[2].contact_dynamic_friction = 0.1 # enable Coulomb slip
577 sim.grains[1].contact_viscosity_tangential = 1e4 # enable tan. viscosity
578 sim.grains[2].contact_viscosity_tangential = 1e4 # enable tan. viscosity
579 sim.grains[1].contact_stiffness_tangential =
580 sim.grains[1].contact_stiffness_normal # enable tangential elasticity
581 sim.grains[2].contact_stiffness_tangential =
582 sim.grains[2].contact_stiffness_normal # enable tangential elasticity
583
584 E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
585 E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
586
587 # With decreasing timestep (epsilon towards 0), the explicit integration scheme
588 # should become more correct
589
590 Granular.setTotalTime!(sim, 30.0)
591 sim_init = deepcopy(sim)
592
593 @info "Testing kinetic energy conservation with Two-term Taylor scheme"
594 sim = deepcopy(sim_init)
595 Granular.setTimeStep!(sim, epsilon=0.007)
596 tol = 0.02
597 @info "Relative tolerance: $(tol*100.)%"
598 Granular.run!(sim, temporal_integration_method="Two-term Taylor",
599 verbose=verbose)
600
601 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
602 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
603 @test E_kin_lin_init+E_kin_rot_init > E_kin_lin_final+E_kin_rot_final
604
605 @info "Testing kinetic energy conservation with Three-term Taylor scheme"
606 sim = deepcopy(sim_init)
607 Granular.setTimeStep!(sim, epsilon=0.07)
608 tol = 0.03
609 @info "Relative tolerance: $(tol*100.)% with time step: $(sim.time_step)"
610 Granular.run!(sim, temporal_integration_method="Three-term Taylor",
611 verbose=verbose)
612
613 @test sim.grains[1].ang_pos[3] < 0.
614 @test sim.grains[1].ang_vel[3] < 0.
615 @test sim.grains[2].ang_pos[3] < 0.
616 @test sim.grains[2].ang_vel[3] < 0.
617 E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
618 E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
619 @test E_kin_lin_init+E_kin_rot_init > E_kin_lin_final+E_kin_rot_final