tcompressive_failure.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
---
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=verbose)
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=verbose)
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=verbose)
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