Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl
Log | Files | Refs | README | LICENSE

commit 9377d1980d99d3dcf6b1a344a58e6e3233a17a49
parent 3b72b5d77be841aba8b0a2080279f86437a09da4
Author: Anders Damsgaard <andersd@riseup.net>
Date:   Wed,  1 Nov 2017 15:04:16 -0400

add fields for grid boundary conditions

Diffstat:
Msrc/atmosphere.jl | 3+++
Msrc/contact_search.jl | 4++--
Msrc/datatypes.jl | 13+++++++++++++
Msrc/ocean.jl | 9++++++---
Mtest/memory-management.jl | 34+++++++++++++++++-----------------
5 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/src/atmosphere.jl b/src/atmosphere.jl @@ -17,6 +17,8 @@ function createEmptyAtmosphere() Array{Vector{Int}}(1, 1), + 0, 0, 0, 0, + false) end @@ -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 diff --git a/src/contact_search.jl b/src/contact_search.jl @@ -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 diff --git a/src/datatypes.jl b/src/datatypes.jl @@ -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 #= @@ -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 diff --git a/src/ocean.jl b/src/ocean.jl @@ -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 @@ -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 @@ -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! diff --git a/test/memory-management.jl b/test/memory-management.jl @@ -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 @@ -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 @@ -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") @@ -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)") @@ -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)") @@ -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 @@ -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 @@ -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