tprofiling.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
       ---
       tprofiling.jl (7472B)
       ---
            1 #!/usr/bin/env julia
            2 if VERSION < v"0.7.0-DEV.2004"
            3     using Base.Test
            4 else
            5     using Test
            6 end
            7 import Plots
            8 import Granular
            9 import CurveFit
           10 
           11 verbose=false
           12 
           13 @info "Testing performance with many interacting grains"
           14 
           15 function timeSingleStepInDenseSimulation(nx::Int; verbose::Bool=true,
           16                                          profile::Bool=false,
           17                                          grid_sorting::Bool=true,
           18                                          include_atmosphere::Bool=false)
           19 
           20     sim = Granular.createSimulation()
           21     #nx, ny = 25, 25
           22     #nx, ny = 250, 250
           23     ny = nx
           24     dx, dy = 40., 40.
           25     sim.ocean = Granular.createRegularOceanGrid([nx, ny, 2], [nx*dx, ny*dy, 10.])
           26     if !grid_sorting
           27         sim.ocean.input_file = false  # fallback to all-to-all contact search
           28     end
           29     r = min(dx, dy)/2.
           30     if include_atmosphere
           31         sim.atmosphere = Granular.createRegularAtmosphereGrid([nx, ny, 2],
           32                                                             [nx*dx, ny*dy, 10.])
           33     end
           34 
           35     # add grains in regular packing
           36     for iy=1:ny
           37         for ix=1:nx
           38             x = r + (ix - 1)*dx
           39             y = r + (iy - 1)*dy
           40             fixed = false
           41             if ix == 1 || iy == 1 || ix == nx || iy == ny
           42                 fixed = true
           43             end
           44             Granular.addGrainCylindrical!(sim, [x, y], r*1.1, 1.,
           45                                           fixed=fixed, verbose=false)
           46         end
           47     end
           48     printstyled("number of grains: $(length(sim.grains))\n",
           49                        color=:green)
           50     if grid_sorting
           51         if include_atmosphere
           52             printstyled("using cell-based spatial decomposition " *
           53                              " (ocean + atmosphere)\n", color=:green)
           54         else
           55             printstyled("using cell-based spatial " * 
           56                              "decomposition (ocean)\n", color=:green)
           57         end
           58     else
           59         printstyled("using all-to-all contact search\n", color=:green)
           60     end
           61 
           62     Granular.setTotalTime!(sim, 1.0)
           63     Granular.setTimeStep!(sim)
           64     Granular.run!(sim, single_step=true, verbose=true)
           65     if profile
           66         @profile Granular.run!(sim, single_step=true, verbose=true)
           67         if verbose
           68             Profile.print()
           69         end
           70         Granular.run!(sim, single_step=true, verbose=true)
           71     end
           72     n_runs = 4
           73     t_elapsed = 1e12
           74     for i=1:n_runs
           75         tic()
           76         @time Granular.run!(sim, single_step=true, verbose=true)
           77         t = toc()
           78         if t < t_elapsed
           79             t_elapsed = t
           80         end
           81     end
           82 
           83     #Granular.writeVTK(sim)
           84 
           85     @test sim.grains[1].n_contacts == 0
           86     @test sim.grains[2].n_contacts == 1
           87     @test sim.grains[3].n_contacts == 1
           88     @test sim.grains[nx].n_contacts == 0
           89     @test sim.grains[nx + 1].n_contacts == 1
           90     @test sim.grains[nx + 2].n_contacts == 4
           91     return t_elapsed, Base.summarysize(sim)
           92 end
           93 
           94 #nx = Int[4 8 16 32 64 96]
           95 nx = round.(logspace(1, 2, 16))
           96 elements = zeros(length(nx))
           97 t_elapsed = zeros(length(nx))
           98 t_elapsed_all_to_all = zeros(length(nx))
           99 t_elapsed_cell_sorting = zeros(length(nx))
          100 t_elapsed_cell_sorting2 = zeros(length(nx))
          101 memory_usage_all_to_all = zeros(length(nx))
          102 memory_usage_cell_sorting = zeros(length(nx))
          103 memory_usage_cell_sorting2 = zeros(length(nx))
          104 for i=1:length(nx)
          105     @info "nx = $(nx[i])"
          106     t_elapsed_all_to_all[i], memory_usage_all_to_all[i] =
          107         timeSingleStepInDenseSimulation(Int(nx[i]), grid_sorting=false)
          108     t_elapsed_cell_sorting[i], memory_usage_cell_sorting[i] =
          109         timeSingleStepInDenseSimulation(Int(nx[i]), grid_sorting=true)
          110     t_elapsed_cell_sorting2[i], memory_usage_cell_sorting2[i] =
          111         timeSingleStepInDenseSimulation(Int(nx[i]), grid_sorting=true, 
          112                                         include_atmosphere=true)
          113     elements[i] = nx[i]*nx[i]
          114 end
          115 
          116 #Plots.gr()
          117 Plots.pyplot()
          118 Plots.scatter(elements, t_elapsed_all_to_all,
          119               xscale=:log10,
          120               yscale=:log10,
          121               label="All to all")
          122 fit_all_to_all = CurveFit.curve_fit(CurveFit.PowerFit,
          123                                     elements, t_elapsed_all_to_all)
          124 label_all_to_all = @sprintf "%1.3g n^%3.2f" fit_all_to_all.coefs[1] fit_all_to_all.coefs[2]
          125 Plots.plot!(elements, fit_all_to_all(elements),
          126             xscale=:log10,
          127             yscale=:log10,
          128             label=label_all_to_all)
          129 
          130 Plots.scatter!(elements, t_elapsed_cell_sorting,
          131                xscale=:log10,
          132                yscale=:log10,
          133                label="Cell-based spatial decomposition (ocean only)")
          134 fit_cell_sorting = CurveFit.curve_fit(CurveFit.PowerFit,
          135                                     elements, t_elapsed_cell_sorting)
          136 label_cell_sorting = @sprintf "%1.3g n^%3.2f" fit_cell_sorting.coefs[1] fit_cell_sorting.coefs[2]
          137 Plots.plot!(elements, fit_cell_sorting(elements),
          138             xscale=:log10,
          139             yscale=:log10,
          140             label=label_cell_sorting)
          141 
          142 Plots.scatter!(elements, t_elapsed_cell_sorting2,
          143                xscale=:log10,
          144                yscale=:log10,
          145                label="Cell-based spatial decomposition (ocean + atmosphere)")
          146 fit_cell_sorting2 = CurveFit.curve_fit(CurveFit.PowerFit,
          147                                        elements, t_elapsed_cell_sorting2)
          148 label_cell_sorting2 = @sprintf "%1.3g n^%3.2f" fit_cell_sorting2.coefs[1] fit_cell_sorting2.coefs[2]
          149 Plots.plot!(elements, fit_cell_sorting2(elements),
          150             xscale=:log10,
          151             yscale=:log10,
          152             label=label_cell_sorting2)
          153 
          154 Plots.title!("Dense granular system " * "(host: $(gethostname()))")
          155 Plots.xaxis!("Number of grains")
          156 Plots.yaxis!("Wall time per time step [s]")
          157 Plots.savefig("profiling-cpu.pdf")
          158 
          159 Plots.scatter(elements, memory_usage_all_to_all .÷ 1024,
          160               xscale=:log10,
          161               yscale=:log10,
          162               label="All to all")
          163 fit_all_to_all = CurveFit.curve_fit(CurveFit.PowerFit,
          164                                     elements, memory_usage_all_to_all .÷ 1024)
          165 label_all_to_all = @sprintf "%1.3g n^%3.2f" fit_all_to_all.coefs[1] fit_all_to_all.coefs[2]
          166 Plots.plot!(elements, fit_all_to_all(elements),
          167             xscale=:log10,
          168             yscale=:log10,
          169             label=label_all_to_all)
          170 
          171 Plots.scatter!(elements, memory_usage_cell_sorting .÷ 1024,
          172                xscale=:log10,
          173                yscale=:log10,
          174                label="Cell-based spatial decomposition (ocean only)")
          175 fit_cell_sorting = CurveFit.curve_fit(CurveFit.PowerFit,
          176                                     elements, memory_usage_cell_sorting .÷ 1024)
          177 label_cell_sorting = @sprintf "%1.3g n^%3.2f" fit_cell_sorting.coefs[1] fit_cell_sorting.coefs[2]
          178 Plots.plot!(elements, fit_cell_sorting(elements),
          179             xscale=:log10,
          180             yscale=:log10,
          181             label=label_cell_sorting)
          182 
          183 Plots.scatter!(elements, memory_usage_cell_sorting2 .÷ 1024,
          184                xscale=:log10,
          185                yscale=:log10,
          186                label="Cell-based spatial decomposition (ocean + atmosphere)")
          187 fit_cell_sorting2 = CurveFit.curve_fit(CurveFit.PowerFit,
          188                                        elements,
          189                                        memory_usage_cell_sorting2 .÷ 1024)
          190 label_cell_sorting2 = @sprintf "%1.3g n^%3.2f" fit_cell_sorting2.coefs[1] fit_cell_sorting2.coefs[2]
          191 Plots.plot!(elements, fit_cell_sorting2(elements),
          192             xscale=:log10,
          193             yscale=:log10,
          194             label=label_cell_sorting2)
          195 
          196 Plots.title!("Dense granular system " * "(host: $(gethostname()))")
          197 Plots.xaxis!("Number of grains")
          198 Plots.yaxis!("Memory usage [kb]")
          199 Plots.savefig("profiling-memory-usage.pdf")