twall.jl - Granular.jl - Julia package for granular dynamics simulation | |
git clone git://src.adamsgaard.dk/Granular.jl | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
twall.jl (18726B) | |
--- | |
1 #!/usr/bin/env julia | |
2 | |
3 # Check the basic dynamic wall functionality | |
4 | |
5 @info "# Test wall initialization" | |
6 @info "Testing argument value checks" | |
7 sim = Granular.createSimulation() | |
8 Granular.addGrainCylindrical!(sim, [ 0., 0.], 10., 2., verbose=false) | |
9 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, | |
10 [.1, .1,… | |
11 1.) | |
12 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, | |
13 [1., 1.], | |
14 1.) | |
15 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, | |
16 [.1, .1,… | |
17 1.) | |
18 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, | |
19 [0., 1.,… | |
20 bc="asdf… | |
21 sim = Granular.createSimulation() | |
22 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, [1.… | |
23 1.) | |
24 | |
25 | |
26 @info "Check that wall mass equals total grain mass and max. thickness" | |
27 sim = Granular.createSimulation() | |
28 @test length(sim.walls) == 0 | |
29 Granular.addGrainCylindrical!(sim, [ 0., 0.], 10., 2., verbose=false) | |
30 sim.grains[1].mass = 1.0 | |
31 Granular.addWallLinearFrictionless!(sim, [1., 0.], 1., verbose=true) | |
32 @test length(sim.walls) == 1 | |
33 @test sim.walls[1].mass ≈ 1.0 | |
34 @test sim.walls[1].thickness ≈ 2.0 | |
35 | |
36 @info "Test wall surface area and defined normal stress" | |
37 sim = Granular.createSimulation() | |
38 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
39 Granular.addGrainCylindrical!(sim, [ 0., 0.], 10., 2., verbose=false) | |
40 sim.grains[1].mass = 1.0 | |
41 Granular.addWallLinearFrictionless!(sim, [1., 0.], 1., verbose=false) | |
42 Granular.addWallLinearFrictionless!(sim, [0., 1.], 1., verbose=false) | |
43 @test length(sim.walls) == 2 | |
44 @test sim.walls[1].mass ≈ 1.0 | |
45 @test sim.walls[1].thickness ≈ 2.0 | |
46 @test sim.walls[2].mass ≈ 1.0 | |
47 @test sim.walls[2].thickness ≈ 2.0 | |
48 @test Granular.getWallSurfaceArea(sim, 1) ≈ 20.0*2.0 | |
49 @test Granular.getWallSurfaceArea(sim, 2) ≈ 10.0*2.0 | |
50 | |
51 sim.walls[1].normal_stress = 1.0 | |
52 @test Granular.getWallNormalStress(sim, wall_index=1, stress_type="defin… | |
53 sim.walls[1].force = 1.0 | |
54 @test Granular.getWallNormalStress(sim, wall_index=1, stress_type="effec… | |
55 @test_throws ErrorException Granular.getWallNormalStress(sim, wall_index… | |
56 | |
57 sim.walls[1].normal = [1.0, 1.0, 1.0] | |
58 @test_throws ErrorException Granular.getWallSurfaceArea(sim, 1) | |
59 @test_throws ErrorException Granular.getWallSurfaceArea(sim, [1.,1.], 0.… | |
60 | |
61 @info "# Test wall-grain interaction: elastic" | |
62 | |
63 @info "Wall present but no contact" | |
64 sim = Granular.createSimulation() | |
65 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
66 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
67 Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01, verbose=false) | |
68 Granular.setTimeStep!(sim, verbose=false) | |
69 Granular.interactWalls!(sim) | |
70 @test sim.walls[1].force ≈ 0. | |
71 @test sim.grains[1].force[1] ≈ 0. | |
72 @test sim.grains[1].force[2] ≈ 0. | |
73 | |
74 @info "Wall present but no contact" | |
75 sim = Granular.createSimulation() | |
76 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
77 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
78 Granular.addWallLinearFrictionless!(sim, [1., 0.], +2.01, verbose=false) | |
79 Granular.setTimeStep!(sim, verbose=false) | |
80 Granular.interactWalls!(sim) | |
81 @test sim.walls[1].force ≈ 0. | |
82 @test sim.grains[1].force[1] ≈ 0. | |
83 @test sim.grains[1].force[2] ≈ 0. | |
84 | |
85 @info "Wall at -x" | |
86 sim = Granular.createSimulation() | |
87 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
88 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., youngs_modulus=0., | |
89 verbose=false) | |
90 Granular.addWallLinearFrictionless!(sim, [1., 0.], -1. + .01, verbose=fa… | |
91 Granular.setTimeStep!(sim, verbose=false) | |
92 Granular.interactWalls!(sim) | |
93 @test sim.walls[1].force < 0. | |
94 @test sim.grains[1].force[1] > 0. | |
95 @test sim.grains[1].force[2] ≈ 0. | |
96 | |
97 @info "Wall at -x" | |
98 sim = Granular.createSimulation() | |
99 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
100 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
101 Granular.addWallLinearFrictionless!(sim, [1., 0.], -1. + .01, verbose=fa… | |
102 Granular.setTimeStep!(sim, verbose=false) | |
103 Granular.interactWalls!(sim) | |
104 @test sim.walls[1].force < 0. | |
105 @test sim.grains[1].force[1] > 0. | |
106 @test sim.grains[1].force[2] ≈ 0. | |
107 | |
108 @info "Wall at +x" | |
109 sim = Granular.createSimulation() | |
110 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
111 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
112 Granular.addWallLinearFrictionless!(sim, [1., 0.], +1. - .01, verbose=fa… | |
113 Granular.setTimeStep!(sim, verbose=false) | |
114 Granular.interactWalls!(sim) | |
115 @test sim.walls[1].force > 0. | |
116 @test sim.grains[1].force[1] < 0. | |
117 @test sim.grains[1].force[2] ≈ 0. | |
118 | |
119 @info "Wall at -y" | |
120 sim = Granular.createSimulation() | |
121 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
122 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
123 Granular.addWallLinearFrictionless!(sim, [0., 1.], -1. + .01, verbose=fa… | |
124 Granular.setTimeStep!(sim, verbose=false) | |
125 Granular.interactWalls!(sim) | |
126 @test sim.walls[1].force < 0. | |
127 @test sim.grains[1].force[1] ≈ 0. | |
128 @test sim.grains[1].force[2] > 0. | |
129 | |
130 @info "Wall at +y" | |
131 sim = Granular.createSimulation() | |
132 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
133 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
134 Granular.addWallLinearFrictionless!(sim, [0., 1.], +1. - .01, verbose=fa… | |
135 Granular.setTimeStep!(sim, verbose=false) | |
136 Granular.interactWalls!(sim) | |
137 @test sim.walls[1].force > 0. | |
138 @test sim.grains[1].force[1] ≈ 0. | |
139 @test sim.grains[1].force[2] < 0. | |
140 | |
141 @info "# Test wall-grain interaction: elastic-viscous" | |
142 | |
143 @info "Wall present but no contact" | |
144 sim = Granular.createSimulation() | |
145 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
146 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
147 Granular.addWallLinearFrictionless!(sim, [1., 0.], -1.01, verbose=false) | |
148 sim.walls[1].contact_viscosity_normal = 1e3 | |
149 Granular.setTimeStep!(sim, verbose=false) | |
150 Granular.interactWalls!(sim) | |
151 @test sim.walls[1].force ≈ 0. | |
152 @test sim.grains[1].force[1] ≈ 0. | |
153 @test sim.grains[1].force[2] ≈ 0. | |
154 | |
155 @info "Wall present but no contact" | |
156 sim = Granular.createSimulation() | |
157 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
158 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
159 Granular.addWallLinearFrictionless!(sim, [1., 0.], +2.01, verbose=false) | |
160 sim.walls[1].contact_viscosity_normal = 1e3 | |
161 Granular.setTimeStep!(sim, verbose=false) | |
162 Granular.interactWalls!(sim) | |
163 @test sim.walls[1].force ≈ 0. | |
164 @test sim.grains[1].force[1] ≈ 0. | |
165 @test sim.grains[1].force[2] ≈ 0. | |
166 | |
167 @info "Wall at -x" | |
168 sim = Granular.createSimulation() | |
169 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
170 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
171 Granular.addWallLinearFrictionless!(sim, [1., 0.], -1. + .01, verbose=fa… | |
172 sim.walls[1].contact_viscosity_normal = 1e3 | |
173 Granular.setTimeStep!(sim, verbose=false) | |
174 Granular.interactWalls!(sim) | |
175 @test sim.walls[1].force < 0. | |
176 @test sim.grains[1].force[1] > 0. | |
177 @test sim.grains[1].force[2] ≈ 0. | |
178 | |
179 @info "Wall at +x" | |
180 sim = Granular.createSimulation() | |
181 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
182 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
183 Granular.addWallLinearFrictionless!(sim, [1., 0.], +1. - .01, verbose=fa… | |
184 sim.walls[1].contact_viscosity_normal = 1e3 | |
185 Granular.setTimeStep!(sim, verbose=false) | |
186 Granular.interactWalls!(sim) | |
187 @test sim.walls[1].force > 0. | |
188 @test sim.grains[1].force[1] < 0. | |
189 @test sim.grains[1].force[2] ≈ 0. | |
190 | |
191 @info "Wall at -y" | |
192 sim = Granular.createSimulation() | |
193 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
194 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
195 Granular.addWallLinearFrictionless!(sim, [0., 1.], -1. + .01, verbose=fa… | |
196 sim.walls[1].contact_viscosity_normal = 1e3 | |
197 Granular.setTimeStep!(sim, verbose=false) | |
198 Granular.interactWalls!(sim) | |
199 @test sim.walls[1].force < 0. | |
200 @test sim.grains[1].force[1] ≈ 0. | |
201 @test sim.grains[1].force[2] > 0. | |
202 | |
203 @info "Wall at +y" | |
204 sim = Granular.createSimulation() | |
205 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
206 Granular.addGrainCylindrical!(sim, [ 0., 0.], 1., 2., verbose=false) | |
207 Granular.addWallLinearFrictionless!(sim, [0., 1.], +1. - .01, verbose=fa… | |
208 sim.walls[1].contact_viscosity_normal = 1e3 | |
209 Granular.setTimeStep!(sim, verbose=false) | |
210 Granular.interactWalls!(sim) | |
211 @test sim.walls[1].force > 0. | |
212 @test sim.grains[1].force[1] ≈ 0. | |
213 @test sim.grains[1].force[2] < 0. | |
214 | |
215 @info "Full collision with wall" | |
216 sim = Granular.createSimulation() | |
217 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
218 Granular.addGrainCylindrical!(sim, [1.2, 0.5], 1., 2., verbose=false) | |
219 Granular.addWallLinearFrictionless!(sim, [1., 0.], 0., verbose=false) | |
220 sim.walls[1].contact_viscosity_normal = 1e3 | |
221 sim.grains[1].lin_vel[1] = -0.2 | |
222 Granular.setTimeStep!(sim, verbose=false) | |
223 Granular.setTotalTime!(sim, 5.) | |
224 lin_vel0 = sim.grains[1].lin_vel | |
225 Granular.run!(sim) | |
226 @test sim.grains[1].lin_vel[1] < abs(lin_vel0[1]) | |
227 @test sim.grains[1].lin_vel[2] ≈ 0. | |
228 lin_vel1 = sim.grains[1].lin_vel | |
229 | |
230 sim = Granular.createSimulation() | |
231 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
232 Granular.addGrainCylindrical!(sim, [1.2, 0.5], 1., 2., verbose=false) | |
233 Granular.addWallLinearFrictionless!(sim, [1., 0.], 0., verbose=false) | |
234 sim.walls[1].contact_viscosity_normal = 1e4 | |
235 sim.grains[1].lin_vel[1] = -0.2 | |
236 Granular.setTimeStep!(sim, verbose=false) | |
237 Granular.setTotalTime!(sim, 5.) | |
238 lin_vel0 = sim.grains[1].lin_vel | |
239 Granular.run!(sim) | |
240 @test sim.grains[1].lin_vel[1] < abs(lin_vel0[1]) | |
241 @test sim.grains[1].lin_vel[1] < lin_vel1[1] | |
242 @test sim.grains[1].lin_vel[2] ≈ 0. | |
243 | |
244 | |
245 @info "# Testing wall dynamics" | |
246 | |
247 @info "Wall present, no contact, fixed (default)" | |
248 sim = Granular.createSimulation() | |
249 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
250 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
251 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false) | |
252 Granular.setTimeStep!(sim, verbose=false) | |
253 Granular.interactWalls!(sim) | |
254 Granular.updateWallKinematics!(sim) | |
255 @test sim.walls[1].force ≈ 0. | |
256 @test sim.walls[1].acc ≈ 0. | |
257 @test sim.walls[1].vel ≈ 0. | |
258 @test sim.walls[1].pos ≈ -0.01 | |
259 @test sim.grains[1].force[1] ≈ 0. | |
260 @test sim.grains[1].force[2] ≈ 0. | |
261 | |
262 @info "Wall present, no contact, fixed (TY2)" | |
263 sim = Granular.createSimulation() | |
264 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
265 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
266 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false) | |
267 Granular.setTimeStep!(sim, verbose=false) | |
268 Granular.interactWalls!(sim) | |
269 Granular.updateWallKinematics!(sim, method="Two-term Taylor") | |
270 @test sim.walls[1].force ≈ 0. | |
271 @test sim.walls[1].acc ≈ 0. | |
272 @test sim.walls[1].vel ≈ 0. | |
273 @test sim.walls[1].pos ≈ -0.01 | |
274 @test sim.grains[1].force[1] ≈ 0. | |
275 @test sim.grains[1].force[2] ≈ 0. | |
276 | |
277 @info "Wall present, no contact, fixed (TY3)" | |
278 sim = Granular.createSimulation() | |
279 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
280 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
281 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false) | |
282 Granular.setTimeStep!(sim, verbose=false) | |
283 Granular.interactWalls!(sim) | |
284 @test_throws ErrorException Granular.updateWallKinematics!(sim, method="… | |
285 Granular.updateWallKinematics!(sim, method="Three-term Taylor") | |
286 @test sim.walls[1].force ≈ 0. | |
287 @test sim.walls[1].acc ≈ 0. | |
288 @test sim.walls[1].vel ≈ 0. | |
289 @test sim.walls[1].pos ≈ -0.01 | |
290 @test sim.grains[1].force[1] ≈ 0. | |
291 @test sim.grains[1].force[2] ≈ 0. | |
292 | |
293 @info "Wall present, contact, fixed" | |
294 sim = Granular.createSimulation() | |
295 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
296 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
297 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, verbose=false) | |
298 Granular.setTimeStep!(sim, verbose=false) | |
299 Granular.interactWalls!(sim) | |
300 Granular.updateWallKinematics!(sim) | |
301 @test sim.walls[1].acc ≈ 0. | |
302 @test sim.walls[1].vel ≈ 0. | |
303 @test sim.walls[1].pos ≈ -0.01 | |
304 | |
305 @info "Wall present, no contact, velocity BC" | |
306 sim = Granular.createSimulation() | |
307 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
308 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
309 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, | |
310 bc="velocity", vel=1.0, | |
311 verbose=false) | |
312 Granular.setTimeStep!(sim, verbose=false) | |
313 Granular.interactWalls!(sim) | |
314 Granular.updateWallKinematics!(sim) | |
315 @test sim.walls[1].force ≈ 0. | |
316 @test sim.walls[1].acc ≈ 0. | |
317 @test sim.walls[1].vel ≈ 1. | |
318 @test sim.walls[1].pos > -0.01 | |
319 @test sim.grains[1].force[1] ≈ 0. | |
320 @test sim.grains[1].force[2] ≈ 0. | |
321 | |
322 @info "Wall present, no contact, velocity BC (TY2)" | |
323 sim = Granular.createSimulation() | |
324 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
325 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
326 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, | |
327 bc="velocity", vel=1.0, | |
328 verbose=false) | |
329 Granular.setTimeStep!(sim, verbose=false) | |
330 Granular.interactWalls!(sim) | |
331 Granular.updateWallKinematics!(sim, method="Two-term Taylor") | |
332 @test sim.walls[1].force ≈ 0. | |
333 @test sim.walls[1].acc ≈ 0. | |
334 @test sim.walls[1].vel ≈ 1. | |
335 @test sim.walls[1].pos > -0.01 | |
336 @test sim.grains[1].force[1] ≈ 0. | |
337 @test sim.grains[1].force[2] ≈ 0. | |
338 | |
339 @info "Wall present, no contact, velocity BC (TY3)" | |
340 sim = Granular.createSimulation() | |
341 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
342 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
343 Granular.addWallLinearFrictionless!(sim, [1., 0.], -0.01, | |
344 bc="velocity", vel=1.0, | |
345 verbose=false) | |
346 Granular.setTimeStep!(sim, verbose=false) | |
347 Granular.interactWalls!(sim) | |
348 @test_throws ErrorException Granular.updateWallKinematics!(sim, method="… | |
349 Granular.updateWallKinematics!(sim, method="Three-term Taylor") | |
350 @test sim.walls[1].force ≈ 0. | |
351 @test sim.walls[1].acc ≈ 0. | |
352 @test sim.walls[1].vel ≈ 1. | |
353 @test sim.walls[1].pos > -0.01 | |
354 @test sim.grains[1].force[1] ≈ 0. | |
355 @test sim.grains[1].force[2] ≈ 0. | |
356 | |
357 @info "Wall present, contact, velocity BC (TY2)" | |
358 sim = Granular.createSimulation() | |
359 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
360 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
361 Granular.addWallLinearFrictionless!(sim, [1., 0.], 0.1, | |
362 bc="velocity", vel=1.0, | |
363 verbose=false) | |
364 Granular.setTimeStep!(sim, verbose=false) | |
365 Granular.interactWalls!(sim) | |
366 Granular.updateWallKinematics!(sim, method="Two-term Taylor") | |
367 @test sim.walls[1].bc == "velocity" | |
368 @test sim.walls[1].acc ≈ 0. | |
369 @test sim.walls[1].vel ≈ 1. | |
370 @test sim.walls[1].pos > -0.9 | |
371 | |
372 @info "Wall present, contact, velocity BC (TY2)" | |
373 sim = Granular.createSimulation() | |
374 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0]) | |
375 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 2., verbose=false) | |
376 Granular.addWallLinearFrictionless!(sim, [1., 0.], 0.1, | |
377 bc="velocity", vel=1.0, | |
378 verbose=false) | |
379 Granular.setTimeStep!(sim, verbose=false) | |
380 Granular.interactWalls!(sim) | |
381 Granular.updateWallKinematics!(sim, method="Two-term Taylor") | |
382 @test sim.walls[1].acc ≈ 0. | |
383 @test sim.walls[1].vel ≈ 1. | |
384 @test sim.walls[1].pos > -0.9 | |
385 | |
386 @info "Wall present, contact, normal stress BC" | |
387 sim = Granular.createSimulation() | |
388 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [2., 2., 1.]) | |
389 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 1., verbose=false) | |
390 Granular.addWallLinearFrictionless!(sim, [1., 0.], 2., | |
391 bc="normal stress", | |
392 normal_stress=0., | |
393 verbose=false) | |
394 Granular.setTimeStep!(sim, verbose=false) | |
395 Granular.interactWalls!(sim) | |
396 Granular.updateWallKinematics!(sim) | |
397 @test sim.walls[1].force ≈ 0. | |
398 @test sim.walls[1].acc ≈ 0. | |
399 @test sim.walls[1].vel ≈ 0. | |
400 @test sim.grains[1].force[1] ≈ 0. | |
401 @test sim.grains[1].force[2] ≈ 0. | |
402 | |
403 @info "Wall present, contact, normal stress BC" | |
404 sim = Granular.createSimulation() | |
405 sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [2., 2., 1.]) | |
406 Granular.addGrainCylindrical!(sim, [ 1., 1.], 1., 1., verbose=false) | |
407 sim.grains[1].fixed = true | |
408 Granular.addWallLinearFrictionless!(sim, [1., 0.], 2., | |
409 bc="normal stress", | |
410 normal_stress=-1e4, | |
411 verbose=false) | |
412 Granular.setTimeStep!(sim, verbose=false) | |
413 Granular.interactWalls!(sim) | |
414 Granular.updateWallKinematics!(sim) | |
415 @test sim.walls[1].force ≈ 0. | |
416 @test sim.walls[1].acc < 0. | |
417 @test sim.walls[1].vel < 0. | |
418 @test sim.grains[1].force[1] ≈ 0. | |
419 @test sim.grains[1].force[2] ≈ 0. | |
420 for i=1:5 | |
421 Granular.interactWalls!(sim) | |
422 Granular.updateWallKinematics!(sim) | |
423 @test sim.walls[1].force > 0. | |
424 @test sim.walls[1].acc < 0. | |
425 @test sim.walls[1].vel < 0. | |
426 @test sim.walls[1].pos < 2. | |
427 @test sim.grains[1].force[1] < 0. | |
428 @test sim.grains[1].force[2] ≈ 0. | |
429 end | |
430 | |
431 @info "Granular packing, wall present, normal stress BC" | |
432 sim = Granular.createSimulation() | |
433 Granular.regularPacking!(sim, [5, 5], 1.0, 2.0) | |
434 Granular.fitGridToGrains!(sim, sim.ocean) | |
435 Granular.setGridBoundaryConditions!(sim.ocean, "impermeable") | |
436 global y_max_init = 0. | |
437 for grain in sim.grains | |
438 if y_max_init < grain.lin_pos[2] + grain.contact_radius | |
439 global y_max_init = grain.lin_pos[2] + grain.contact_radius | |
440 end | |
441 end | |
442 Granular.addWallLinearFrictionless!(sim, [0., 1.], y_max_init, | |
443 bc="normal stress", normal_stress=-1… | |
444 Granular.setTimeStep!(sim) | |
445 Granular.setTotalTime!(sim, 1.) | |
446 Granular.run!(sim) | |
447 Granular.removeSimulationFiles(sim) | |
448 @test sim.walls[1].pos < y_max_init |