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