Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl # fast
git clone https://src.adamsgaard.dk/Granular.jl.git # slow
Log | Files | Refs | README | LICENSE Back to index

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