| tgrid-boundaries.jl - Granular.jl - Julia package for granular dynamics simulat… | |
| git clone git://src.adamsgaard.dk/Granular.jl | |
| Log | |
| Files | |
| Refs | |
| README | |
| 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", verbos… | |
| 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", verbos… | |
| 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", verbos… | |
| 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", verbos… | |
| 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!(ocea… | |
| 152 "per… | |
| 153 "asd… | |
| 154 | |
| 155 @test_throws ErrorException Granular.setGridBoundaryConditions!(ocea… | |
| 156 "asd… | |
| 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 a… | |
| 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.… | |
| 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!… | |
| 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 |