Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl # fast
git clone https://src.adamsgaard.dk/Granular.jl.git # slow
Log | Files | Refs | README | LICENSE Back to index

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