compressive_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