tgrid-boundaries.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
       ---
       tgrid-boundaries.jl (9801B)
       ---
            1 #!/usr/bin/env julia
            2 
            3 verbose=false
            4 
            5 @info "## Inactive/Periodic BCs"
            6 
            7 @info "Testing assignment and reporting of grid boundary conditions"
            8 ocean = Granular.createEmptyOcean()
            9 
           10 @test ocean.bc_west == 1
           11 @test ocean.bc_east == 1
           12 @test ocean.bc_north == 1
           13 @test ocean.bc_south == 1
           14 
           15 if !Sys.iswindows()
           16     const originalSTDOUT = stdout
           17     (out_r, out_w) = redirect_stdout()
           18     Granular.reportGridBoundaryConditions(ocean)
           19     close(out_w)
           20     redirect_stdout(originalSTDOUT)
           21     output = String(readavailable(out_r))
           22     @test output == """West  (-x): inactive\t(1)
           23     East  (+x): inactive\t(1)
           24     South (-y): inactive\t(1)
           25     North (+y): inactive\t(1)
           26     """
           27 
           28     (out_r, out_w) = redirect_stdout()
           29     Granular.setGridBoundaryConditions!(ocean, "periodic", "south, west",
           30                                         verbose=true)
           31     close(out_w)
           32     redirect_stdout(originalSTDOUT)
           33     output = String(readavailable(out_r))
           34     @test output == """West  (-x): periodic\t(2)
           35     East  (+x): inactive\t(1)
           36     South (-y): periodic\t(2)
           37     North (+y): inactive\t(1)
           38     """
           39     @test ocean.bc_west == 2
           40     @test ocean.bc_east == 1
           41     @test ocean.bc_north == 1
           42     @test ocean.bc_south == 2
           43 
           44     Granular.setGridBoundaryConditions!(ocean, "inactive", "all", verbose=false)
           45     (out_r, out_w) = redirect_stdout()
           46     Granular.setGridBoundaryConditions!(ocean, "periodic", "-y, -x",
           47                                         verbose=true)
           48     close(out_w)
           49     redirect_stdout(originalSTDOUT)
           50     output = String(readavailable(out_r))
           51     @test output == """West  (-x): periodic\t(2)
           52     East  (+x): inactive\t(1)
           53     South (-y): periodic\t(2)
           54     North (+y): inactive\t(1)
           55     """
           56     @test ocean.bc_west == 2
           57     @test ocean.bc_east == 1
           58     @test ocean.bc_north == 1
           59     @test ocean.bc_south == 2
           60 
           61     Granular.setGridBoundaryConditions!(ocean, "inactive", "all", verbose=false)
           62     (out_r, out_w) = redirect_stdout()
           63     Granular.setGridBoundaryConditions!(ocean, "periodic", "north, east",
           64                                         verbose=true)
           65     close(out_w)
           66     redirect_stdout(originalSTDOUT)
           67     output = String(readavailable(out_r))
           68     @test output == """West  (-x): inactive\t(1)
           69     East  (+x): periodic\t(2)
           70     South (-y): inactive\t(1)
           71     North (+y): periodic\t(2)
           72     """
           73     @test ocean.bc_west == 1
           74     @test ocean.bc_east == 2
           75     @test ocean.bc_north == 2
           76     @test ocean.bc_south == 1
           77 
           78     Granular.setGridBoundaryConditions!(ocean, "inactive", "all", verbose=false)
           79     (out_r, out_w) = redirect_stdout()
           80     Granular.setGridBoundaryConditions!(ocean, "periodic", "+y, +x",
           81                                         verbose=true)
           82     close(out_w)
           83     redirect_stdout(originalSTDOUT)
           84     output = String(readavailable(out_r))
           85     @test output == """West  (-x): inactive\t(1)
           86     East  (+x): periodic\t(2)
           87     South (-y): inactive\t(1)
           88     North (+y): periodic\t(2)
           89     """
           90     @test ocean.bc_west == 1
           91     @test ocean.bc_east == 2
           92     @test ocean.bc_north == 2
           93     @test ocean.bc_south == 1
           94 
           95     (out_r, out_w) = redirect_stdout()
           96     Granular.setGridBoundaryConditions!(ocean, "inactive", "all", verbose=false)
           97     close(out_w)
           98     redirect_stdout(originalSTDOUT)
           99     output = String(readavailable(out_r))
          100     @test output == ""
          101     @test ocean.bc_west == 1
          102     @test ocean.bc_east == 1
          103     @test ocean.bc_north == 1
          104     @test ocean.bc_south == 1
          105 
          106     (out_r, out_w) = redirect_stdout()
          107     Granular.setGridBoundaryConditions!(ocean, "periodic", "all")
          108     close(out_w)
          109     output = String(readavailable(out_r))
          110     redirect_stdout(originalSTDOUT)
          111     @test output == """West  (-x): periodic\t(2)
          112     East  (+x): periodic\t(2)
          113     South (-y): periodic\t(2)
          114     North (+y): periodic\t(2)
          115     """
          116     @test ocean.bc_west == 2
          117     @test ocean.bc_east == 2
          118     @test ocean.bc_north == 2
          119     @test ocean.bc_south == 2
          120 
          121     (out_r, out_w) = redirect_stdout()
          122     Granular.setGridBoundaryConditions!(ocean, "inactive")
          123     close(out_w)
          124     output = String(readavailable(out_r))
          125     redirect_stdout(originalSTDOUT)
          126     @test output == """West  (-x): inactive\t(1)
          127     East  (+x): inactive\t(1)
          128     South (-y): inactive\t(1)
          129     North (+y): inactive\t(1)
          130     """
          131     @test ocean.bc_west == 1
          132     @test ocean.bc_east == 1
          133     @test ocean.bc_north == 1
          134     @test ocean.bc_south == 1
          135 
          136     (out_r, out_w) = redirect_stdout()
          137     Granular.setGridBoundaryConditions!(ocean, "periodic")
          138     close(out_w)
          139     output = String(readavailable(out_r))
          140     redirect_stdout(originalSTDOUT)
          141     @test output == """West  (-x): periodic\t(2)
          142     East  (+x): periodic\t(2)
          143     South (-y): periodic\t(2)
          144     North (+y): periodic\t(2)
          145     """
          146     @test ocean.bc_west == 2
          147     @test ocean.bc_east == 2
          148     @test ocean.bc_north == 2
          149     @test ocean.bc_south == 2
          150 
          151     @test_throws ErrorException Granular.setGridBoundaryConditions!(ocean,
          152                                                                     "periodic",
          153                                                                     "asdf")
          154 
          155     @test_throws ErrorException Granular.setGridBoundaryConditions!(ocean,
          156                                                                     "asdf")
          157 end
          158 
          159 @info "Testing granular interaction across periodic boundaries"
          160 sim = Granular.createSimulation()
          161 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          162 Granular.setGridBoundaryConditions!(sim.ocean, "periodic")
          163 Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false)
          164 Granular.addGrainCylindrical!(sim, [0.9, 0.5], 0.11, 0.1, verbose=false)
          165 
          166 # there should be an error if all-to-all contact search is used
          167 @test_throws ErrorException Granular.findContacts!(sim)
          168 @test_throws ErrorException Granular.findContacts!(sim, method="all to all")
          169 @test_throws ErrorException Granular.findContactsAllToAll!(sim)
          170 
          171 Granular.sortGrainsInGrid!(sim, sim.ocean, verbose=false)
          172 Granular.findContacts!(sim, method="ocean grid")
          173 @test 2 == sim.grains[1].contacts[1]
          174 @test 1 == sim.grains[1].n_contacts
          175 @test 1 == sim.grains[2].n_contacts
          176 
          177 
          178 @info "Test grain position adjustment across periodic boundaries"
          179 # do not readjust inside grid, inactive boundaries
          180 sim = Granular.createSimulation()
          181 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          182 Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false)
          183 Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false)
          184 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          185 @test [0.1, 0.5, 0.] ≈ sim.grains[1].lin_pos
          186 
          187 # do not readjust inside grid, periodic boundaries
          188 sim = Granular.createSimulation()
          189 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          190 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false)
          191 Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false)
          192 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          193 @test [0.1, 0.5, 0.] ≈ sim.grains[1].lin_pos
          194 
          195 # do not readjust outside grid, inactive boundaries
          196 sim = Granular.createSimulation()
          197 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          198 Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false)
          199 Granular.addGrainCylindrical!(sim, [-0.1, 0.5], 0.11, 0.1, verbose=false)
          200 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          201 @test [-0.1, 0.5, 0.] ≈ sim.grains[1].lin_pos
          202 
          203 # readjust outside grid, periodic boundaries, -x
          204 sim = Granular.createSimulation()
          205 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          206 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false)
          207 Granular.addGrainCylindrical!(sim, [-0.1, 0.5], 0.11, 0.1, verbose=false)
          208 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          209 @test [0.9, 0.5, 0.] ≈ sim.grains[1].lin_pos
          210 
          211 # readjust outside grid, periodic boundaries, +x
          212 sim = Granular.createSimulation()
          213 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          214 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false)
          215 Granular.addGrainCylindrical!(sim, [1.1, 0.5], 0.11, 0.1, verbose=false)
          216 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          217 @test [0.1, 0.5, 0.] ≈ sim.grains[1].lin_pos
          218 
          219 # readjust outside grid, periodic boundaries, -y
          220 sim = Granular.createSimulation()
          221 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          222 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false)
          223 Granular.addGrainCylindrical!(sim, [0.3, -0.1], 0.11, 0.1, verbose=false)
          224 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          225 @test [0.3, 0.9, 0.] ≈ sim.grains[1].lin_pos
          226 
          227 # readjust outside grid, periodic boundaries, +y
          228 sim = Granular.createSimulation()
          229 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          230 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false)
          231 Granular.addGrainCylindrical!(sim, [0.3, 1.1], 0.11, 0.1, verbose=false)
          232 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          233 @test [0.3, 0.1, 0.] ≈ sim.grains[1].lin_pos
          234 
          235 # throw error if atmosphere and ocean BCs differ
          236 sim = Granular.createSimulation()
          237 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          238 sim.atmosphere = Granular.createRegularAtmosphereGrid([5, 5, 2], [1., 1., 1.])
          239 Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false)
          240 Granular.addGrainCylindrical!(sim, [0.3, 1.1], 0.11, 0.1, verbose=false)
          241 @test_throws ErrorException Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          242 
          243 
          244 @info "## Impermeable BCs"
          245 
          246 @info "Test grain velocity adjustment across impermeable boundaries"
          247 # do not readjust inside grid, inactive boundaries
          248 sim = Granular.createSimulation()
          249 sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.])
          250 Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false)
          251 Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false)
          252 Granular.moveGrainsAcrossPeriodicBoundaries!(sim)
          253 @test [0.1, 0.5, 0.] ≈ sim.grains[1].lin_pos