tadd fields for grid boundary conditions - 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
       ---
 (DIR) commit 9377d1980d99d3dcf6b1a344a58e6e3233a17a49
 (DIR) parent 3b72b5d77be841aba8b0a2080279f86437a09da4
 (HTM) Author: Anders Damsgaard <andersd@riseup.net>
       Date:   Wed,  1 Nov 2017 15:04:16 -0400
       
       add fields for grid boundary conditions
       
       Diffstat:
         M src/atmosphere.jl                   |       3 +++
         M src/contact_search.jl               |       4 ++--
         M src/datatypes.jl                    |      13 +++++++++++++
         M src/ocean.jl                        |       9 ++++++---
         M test/memory-management.jl           |      34 ++++++++++++++++----------------
       
       5 files changed, 41 insertions(+), 22 deletions(-)
       ---
 (DIR) diff --git a/src/atmosphere.jl b/src/atmosphere.jl
       t@@ -17,6 +17,8 @@ function createEmptyAtmosphere()
        
                              Array{Vector{Int}}(1, 1),
        
       +                      0, 0, 0, 0,
       +
                              false)
        end
        
       t@@ -127,6 +129,7 @@ function createRegularAtmosphereGrid(n::Vector{Int},
                         zl,
                         u, v,
                         Array{Array{Int, 1}}(size(xh, 1), size(xh, 2)),
       +                 0, 0, 0, 0,
                         false)
        end
        
 (DIR) diff --git a/src/contact_search.jl b/src/contact_search.jl
       t@@ -3,8 +3,8 @@ export findContacts!
        """
            findContacts!(simulation[, method])
            
       -Top-level function to perform an inter-grain contact search, based on ice 
       -floe linear positions and contact radii.
       +Top-level function to perform an inter-grain contact search, based on grain 
       +linear positions and contact radii.
        
        The simplest contact search algorithm (`method="all to all"`) is the most 
        computationally expensive (O(n^2)).  The method "ocean grid" bins the grains 
 (DIR) diff --git a/src/datatypes.jl b/src/datatypes.jl
       t@@ -188,7 +188,14 @@ mutable struct Ocean
            h::Array{Float64, 4}
            e::Array{Float64, 4}
        
       +    # Grains in grid cells
            grain_list::Array{Vector{Int}, 2}
       +
       +    # Boundary conditions for grains
       +    bc_west::Integer
       +    bc_south::Integer
       +    bc_east::Integer
       +    bc_north::Integer
        end
        
        #=
       t@@ -245,6 +252,12 @@ mutable struct Atmosphere
        
            grain_list::Array{Vector{Int}, 2}
        
       +    # Boundary conditions for grains
       +    bc_west::Integer
       +    bc_south::Integer
       +    bc_east::Integer
       +    bc_north::Integer
       +
            # If true the grid positions are identical to the ocean grid
            collocated_with_ocean_grid::Bool
        end
 (DIR) diff --git a/src/ocean.jl b/src/ocean.jl
       t@@ -17,7 +17,8 @@ function createEmptyOcean()
                         zeros(1,1,1,1),
                         zeros(1,1,1,1),
                         zeros(1,1,1,1),
       -                 Array{Array{Int, 1}}(1, 1))
       +                 Array{Array{Int, 1}}(1, 1),
       +                 0, 0, 0, 0)
        end
        
        export readOceanNetCDF
       t@@ -59,7 +60,8 @@ function readOceanNetCDF(velocity_file::String, grid_file::String)
                          v,
                          h,
                          e,
       -                  Array{Array{Int, 1}}(size(xh, 1), size(xh, 2))
       +                  Array{Array{Int, 1}}(size(xh, 1), size(xh, 2)),
       +                  0, 0, 0, 0
                         )
            return ocean
        end
       t@@ -239,7 +241,8 @@ function createRegularOceanGrid(n::Array{Int, 1},
                         xh, yh,
                         zl, zi,
                         u, v, h, e,
       -                 Array{Array{Int, 1}}(size(xh, 1), size(xh, 2)))
       +                 Array{Array{Int, 1}}(size(xh, 1), size(xh, 2)),
       +                 0, 0, 0, 0)
        end
        
        export addOceanDrag!
 (DIR) diff --git a/test/memory-management.jl b/test/memory-management.jl
       t@@ -6,13 +6,13 @@ info("Testing memory footprint of Granular types")
        
        sim = Granular.createSimulation()
        empty_sim_size = 96
       -empty_sim_size_recursive = 472
       +empty_sim_size_recursive = 544
        
        @test sizeof(sim) == empty_sim_size
        @test Base.summarysize(sim) == empty_sim_size_recursive
        
       -size_per_icefloe = 352
       -size_per_icefloe_recursive = 1136
       +size_per_grain = 352
       +size_per_grain_recursive = 1136
        
        info("Testing memory usage when adding grains")
        for i=1:100
       t@@ -22,17 +22,17 @@ for i=1:100
        
            @test sizeof(sim.grains) == sizeof(Int)*i
            @test sizeof(sim.grains[:]) == sizeof(Int)*i
       -    @test Base.summarysize(sim.grains) == size_per_icefloe_recursive*i + 
       +    @test Base.summarysize(sim.grains) == size_per_grain_recursive*i + 
                sizeof(Int)*i
        
            @test Base.summarysize(sim) == empty_sim_size_recursive + sizeof(Int)*i + 
       -        size_per_icefloe_recursive*i
       +        size_per_grain_recursive*i
        
       -    @test Base.summarysize(sim.grains[i]) == size_per_icefloe_recursive
       +    @test Base.summarysize(sim.grains[i]) == size_per_grain_recursive
        
            for j=1:i
       -        @test sizeof(sim.grains[j]) == size_per_icefloe
       -        @test Base.summarysize(sim.grains[j]) == size_per_icefloe_recursive
       +        @test sizeof(sim.grains[j]) == size_per_grain
       +        @test Base.summarysize(sim.grains[j]) == size_per_grain_recursive
            end
        
        end
       t@@ -60,7 +60,7 @@ for i=1:10
            @test sizeof(sim) == empty_sim_size
            @test Base.summarysize(sim) == empty_sim_size_recursive + 
                sizeof(Int)*length(sim.grains) + 
       -        size_per_icefloe_recursive*length(sim.grains)
       +        size_per_grain_recursive*length(sim.grains)
        end
        
        info("Check memory when stepping time with two separate grains")
       t@@ -73,7 +73,7 @@ for i=1:10
            @test sizeof(sim) == empty_sim_size
            @test Base.summarysize(sim) == empty_sim_size_recursive + 
                sizeof(Int)*length(sim.grains) + 
       -        size_per_icefloe_recursive*length(sim.grains)
       +        size_per_grain_recursive*length(sim.grains)
        end
        
        info("Check memory when stepping time with two interacting grains (all to all)")
       t@@ -86,7 +86,7 @@ for i=1:10
            @test sizeof(sim) == empty_sim_size
            @test Base.summarysize(sim) == empty_sim_size_recursive + 
                sizeof(Int)*length(sim.grains) + 
       -        size_per_icefloe_recursive*length(sim.grains)
       +        size_per_grain_recursive*length(sim.grains)
        end
        
        info("Check memory when stepping time with two interacting grains (cell sorting)")
       t@@ -124,11 +124,11 @@ Granular.setTotalTime!(sim, 10.0)
        Granular.setTimeStep!(sim, epsilon=0.07, verbose=false)
        Granular.run!(sim, single_step=true, verbose=false)
        original_sim_size_recursive = Base.summarysize(sim)
       -original_icefloes_size_recursive = Base.summarysize(sim.grains)
       +original_grains_size_recursive = Base.summarysize(sim.grains)
        original_ocean_size_recursive = Base.summarysize(sim.ocean)
        original_atmosphere_size_recursive = Base.summarysize(sim.atmosphere)
        Granular.run!(sim, verbose=false)
       -@test Base.summarysize(sim.grains) == original_icefloes_size_recursive
       +@test Base.summarysize(sim.grains) == original_grains_size_recursive
        @test Base.summarysize(sim.ocean) == original_ocean_size_recursive
        @test Base.summarysize(sim.atmosphere) == original_atmosphere_size_recursive
        @test Base.summarysize(sim) == original_sim_size_recursive
       t@@ -142,11 +142,11 @@ Granular.setTotalTime!(sim, 10.0)
        Granular.setTimeStep!(sim, epsilon=0.07, verbose=false)
        Granular.run!(sim, single_step=true, verbose=false)
        original_sim_size_recursive = Base.summarysize(sim)
       -original_icefloes_size_recursive = Base.summarysize(sim.grains)
       +original_grains_size_recursive = Base.summarysize(sim.grains)
        original_ocean_size_recursive = Base.summarysize(sim.ocean)
        original_atmosphere_size_recursive = Base.summarysize(sim.atmosphere)
        Granular.run!(sim, verbose=false)
       -@test Base.summarysize(sim.grains) == original_icefloes_size_recursive
       +@test Base.summarysize(sim.grains) == original_grains_size_recursive
        @test Base.summarysize(sim.ocean) == original_ocean_size_recursive
        @test Base.summarysize(sim.atmosphere) == original_atmosphere_size_recursive
        @test Base.summarysize(sim) == original_sim_size_recursive
       t@@ -161,11 +161,11 @@ Granular.setTotalTime!(sim, 10.0)
        Granular.setTimeStep!(sim, epsilon=0.07, verbose=false)
        Granular.run!(sim, single_step=true, verbose=false)
        original_sim_size_recursive = Base.summarysize(sim)
       -original_icefloes_size_recursive = Base.summarysize(sim.grains)
       +original_grains_size_recursive = Base.summarysize(sim.grains)
        original_ocean_size_recursive = Base.summarysize(sim.ocean)
        original_atmosphere_size_recursive = Base.summarysize(sim.atmosphere)
        Granular.run!(sim, verbose=false)
       -@test Base.summarysize(sim.grains) == original_icefloes_size_recursive
       +@test Base.summarysize(sim.grains) == original_grains_size_recursive
        @test Base.summarysize(sim.ocean) == original_ocean_size_recursive
        @test Base.summarysize(sim.atmosphere) == original_atmosphere_size_recursive
        @test Base.summarysize(sim) == original_sim_size_recursive