twall.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
       ---
       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, .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