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