tcompressive_failure.jl - Granular.jl - Julia package for granular dynamics sim… | |
git clone git://src.adamsgaard.dk/Granular.jl | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tcompressive_failure.jl (7596B) | |
--- | |
1 #!/usr/bin/env julia | |
2 using Test | |
3 import Granular | |
4 | |
5 verbose = false | |
6 debug = false | |
7 if debug | |
8 import PyPlot | |
9 end | |
10 | |
11 function plot_interaction(sim::Granular.Simulation, output::String) | |
12 time = Float64[] | |
13 force_n_1 = Float64[] | |
14 force_n_2 = Float64[] | |
15 force_t_1 = Float64[] | |
16 force_t_2 = Float64[] | |
17 torque_1 = Float64[] | |
18 torque_2 = Float64[] | |
19 compressive_failure = Bool[] | |
20 while sim.time < sim.time_total | |
21 Granular.run!(sim, verbose=verbose, single_step=true) | |
22 append!(time, sim.time) | |
23 append!(compressive_failure, sim.grains[1].compressive_failure[1… | |
24 append!(force_n_1, sim.grains[1].force[1]) | |
25 append!(force_n_2, sim.grains[2].force[1]) | |
26 append!(force_t_1, sim.grains[1].force[2]) | |
27 append!(force_t_2, sim.grains[2].force[2]) | |
28 append!(torque_1, sim.grains[1].torque[3]) | |
29 append!(torque_2, sim.grains[2].torque[3]) | |
30 end | |
31 PyPlot.clf() | |
32 PyPlot.subplot(3,1,1) | |
33 PyPlot.plot(time, force_n_1, "-b", label="1") | |
34 PyPlot.plot(time, force_n_2, "--y", label="2") | |
35 PyPlot.legend(loc="upper right") | |
36 PyPlot.ylabel("\$f_x\$ [N]") | |
37 PyPlot.subplot(3,1,2) | |
38 PyPlot.plot(time, force_t_1, "-b", label="1") | |
39 PyPlot.plot(time, force_t_2, "--y", label="2") | |
40 PyPlot.legend(loc="upper right") | |
41 PyPlot.ylabel("\$f_y\$ [N]") | |
42 PyPlot.subplot(3,1,3) | |
43 PyPlot.plot(time, torque_1, "-b", label="1") | |
44 PyPlot.plot(time, torque_2, "--y", label="2") | |
45 PyPlot.legend(loc="upper right") | |
46 PyPlot.ylabel("Torque [Nm]") | |
47 PyPlot.xlabel("Time [s]") | |
48 PyPlot.tight_layout() | |
49 PyPlot.savefig(output) | |
50 end | |
51 | |
52 @info "Testing compressive failure: uniaxial compression" | |
53 sim = Granular.createSimulation("compressive_failure_uniaxial") | |
54 Granular.addGrainCylindrical!(sim, [0.0,0.0], 1.0, 0.5, | |
55 fracture_toughness=1285e3, | |
56 lin_vel=[1.0, 0.0], fixed=true, verbose=ve… | |
57 Granular.addGrainCylindrical!(sim, [2.0,0.0], 1.0, 0.5, | |
58 fracture_toughness=1285e3, | |
59 fixed=true, verbose=verbose) | |
60 @test count(x->x==true, sim.grains[1].compressive_failure) == 0 | |
61 Granular.setTimeStep!(sim, verbose=verbose) | |
62 Granular.setTotalTime!(sim, 1.0) | |
63 | |
64 if debug | |
65 Granular.removeSimulationFiles(sim) | |
66 Granular.setOutputFileInterval!(sim, 0.01) | |
67 plot_interaction(sim, sim.id * ".pdf") | |
68 else | |
69 Granular.run!(sim, verbose=verbose) | |
70 end | |
71 | |
72 @test sim.grains[1].compressive_failure[1] == true | |
73 @test count(x->x==true, sim.grains[1].compressive_failure) == 1 | |
74 @test sim.grains[1].force[1] < 0.0 | |
75 @test sim.grains[1].force[2] ≈ 0.0 | |
76 @test sim.grains[2].force[1] > 0.0 | |
77 @test sim.grains[2].force[2] ≈ 0.0 | |
78 @test sim.grains[1].torque ≈ zeros(3) | |
79 @test sim.grains[2].torque ≈ zeros(3) | |
80 | |
81 @info "Testing compressive failure: shear" | |
82 sim = Granular.createSimulation("compressive_failure_shear") | |
83 Granular.addGrainCylindrical!(sim, [0.0,0.0], 1.0, 0.5, | |
84 fracture_toughness=1285e3, | |
85 lin_vel=[0.0, 1.0], fixed=true, verbose=ve… | |
86 Granular.addGrainCylindrical!(sim, [1.5,1.5], 1.0, 0.5, | |
87 fracture_toughness=1285e3, | |
88 fixed=true, verbose=verbose) | |
89 @test count(x->x==true, sim.grains[1].compressive_failure) == 0 | |
90 Granular.setTimeStep!(sim, verbose=verbose) | |
91 Granular.setTotalTime!(sim, 1.0) | |
92 | |
93 if debug | |
94 Granular.removeSimulationFiles(sim) | |
95 Granular.setOutputFileInterval!(sim, 0.01) | |
96 plot_interaction(sim, sim.id * ".pdf") | |
97 else | |
98 Granular.run!(sim, verbose=verbose) | |
99 end | |
100 | |
101 @test sim.grains[1].compressive_failure[1] == true | |
102 @test count(x->x==true, sim.grains[1].compressive_failure) == 1 | |
103 @test sim.grains[1].force[1] > 0.0 | |
104 @test sim.grains[1].force[2] < 0.0 | |
105 @test abs(sim.grains[1].force[1]) < abs(sim.grains[1].force[2]) | |
106 @test sim.grains[2].force[1] < 0.0 | |
107 @test sim.grains[2].force[2] > 0.0 | |
108 @test abs(sim.grains[2].force[1]) < abs(sim.grains[2].force[2]) | |
109 @test sim.grains[1].torque[1:2] ≈ zeros(2) | |
110 @test sim.grains[1].torque[3] < 0.0 | |
111 @test sim.grains[2].torque[1:2] ≈ zeros(2) | |
112 @test sim.grains[2].torque[3] < 0.0 | |
113 | |
114 @info "Testing robustness of overlap calculations" | |
115 sim = Granular.createSimulation("overlap") | |
116 Granular.addGrainCylindrical!(sim, [0.0,0.0], 1.0, 0.5, | |
117 fracture_toughness=1285e3, | |
118 lin_vel=[0., 1.0], fixed=true, verbose=ver… | |
119 Granular.addGrainCylindrical!(sim, [2.0,0.0], 1.0, 0.5, | |
120 fracture_toughness=1285e3, | |
121 fixed=true, verbose=verbose) | |
122 @test count(x->x==true, sim.grains[1].compressive_failure) == 0 | |
123 Granular.setTimeStep!(sim, verbose=verbose) | |
124 Granular.setTotalTime!(sim, 1.0) | |
125 Granular.run!(sim, single_step=true, verbose=verbose) | |
126 @test sim.grains[1].compressive_failure[1] == false | |
127 @test sim.grains[1].contact_area[1] == 0.0 | |
128 @test count(x->x==true, sim.grains[1].compressive_failure) == 0 | |
129 | |
130 sim = Granular.createSimulation("overlap") | |
131 Granular.addGrainCylindrical!(sim, [0.,0.], 1.0, 0.5, | |
132 fracture_toughness=1.0, | |
133 fixed=true, verbose=verbose) | |
134 Granular.addGrainCylindrical!(sim, [0.0+1e-9,0.0], 1.0, 0.5, | |
135 fracture_toughness=1.0, | |
136 fixed=true, verbose=verbose) | |
137 Granular.setTimeStep!(sim, verbose=verbose) | |
138 Granular.setTotalTime!(sim, 1.0) | |
139 Granular.run!(sim, single_step=true, verbose=verbose) | |
140 @test sim.grains[1].compressive_failure[1] == true | |
141 @test sim.grains[1].contact_area[1] ≈ π*1.0^2 | |
142 | |
143 sim = Granular.createSimulation("overlap") | |
144 Granular.addGrainCylindrical!(sim, [0.,0.], 1.0, 0.5, | |
145 fracture_toughness=1.0, | |
146 fixed=true, verbose=verbose) | |
147 Granular.addGrainCylindrical!(sim, [0.1,0.], 1.0, 0.5, | |
148 fracture_toughness=1.0, | |
149 fixed=true, verbose=verbose) | |
150 Granular.setTimeStep!(sim, verbose=verbose) | |
151 Granular.setTotalTime!(sim, 1.0) | |
152 Granular.run!(sim, single_step=true, verbose=verbose) | |
153 @test sim.grains[1].compressive_failure[1] == true | |
154 @test sim.grains[1].contact_area[1] < π*1.0^2 | |
155 @test sim.grains[1].contact_area[1] > 0. | |
156 | |
157 sim = Granular.createSimulation("overlap") | |
158 Granular.addGrainCylindrical!(sim, [0.0,0.0], 1.0, 0.5, | |
159 fracture_toughness=1.0, | |
160 fixed=true, verbose=verbose) | |
161 Granular.addGrainCylindrical!(sim, [0.0+1e-9,0.0], 0.1, 0.5, | |
162 fracture_toughness=1.0, | |
163 fixed=true, verbose=verbose) | |
164 @test count(x->x==true, sim.grains[1].compressive_failure) == 0 | |
165 Granular.setTimeStep!(sim, verbose=verbose) | |
166 Granular.setTotalTime!(sim, 1.0) | |
167 Granular.run!(sim, single_step=true, verbose=verbose) | |
168 @test sim.grains[1].position_vector[1] ≈ [-1e-9, 0., 0.] | |
169 @test sim.grains[1].compressive_failure[1] == true | |
170 @test sim.grains[1].contact_area[1] ≈ π*0.1^2 | |
171 | |
172 sim = Granular.createSimulation("overlap") | |
173 Granular.addGrainCylindrical!(sim, [0.0,0.0], 1.0, 0.5, | |
174 fracture_toughness=1.0, | |
175 fixed=true, verbose=verbose) | |
176 Granular.addGrainCylindrical!(sim, [0.3,0.4], 0.1, 0.5, | |
177 fracture_toughness=1.0, | |
178 fixed=true, verbose=verbose) | |
179 @test count(x->x==true, sim.grains[1].compressive_failure) == 0 | |
180 Granular.setTimeStep!(sim, verbose=verbose) | |
181 Granular.setTotalTime!(sim, 1.0) | |
182 Granular.run!(sim, single_step=true, verbose=verbose) | |
183 @test sim.grains[1].compressive_failure[1] == true | |
184 @test sim.grains[1].contact_area[1] ≈ π*0.1^2 |