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