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

grid-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