wall.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, .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, .1], 17 1.) 18 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, 19 [0., 1., 1.], 1., 20 bc="asdf") 21 sim = Granular.createSimulation() 22 @test_throws ErrorException Granular.addWallLinearFrictionless!(sim, [1., 0.], 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="defined") ≈ 1.0 53 sim.walls[1].force = 1.0 54 @test Granular.getWallNormalStress(sim, wall_index=1, stress_type="effective") ≈ 1.0/(20.0*2.0) 55 @test_throws ErrorException Granular.getWallNormalStress(sim, wall_index=1, stress_type="nonexistent") 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.5) 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=false) 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=false) 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=false) 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=false) 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=false) 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=false) 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=false) 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=false) 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=false) 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="asdf") 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="asdf") 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=-100e3) 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