tfix various errors during test and wall initialization - 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 ccd9921a7fd354df82bcfcfb115844cc26278beb
 (DIR) parent a9d41bf6abc198818ed79d3ff76f9be05bd9a80b
 (HTM) Author: Anders Damsgaard <andersd@riseup.net>
       Date:   Tue, 14 Nov 2017 14:58:58 -0500
       
       fix various errors during test and wall initialization
       
       Diffstat:
         M docs/src/man/getting_started.md     |       4 ++--
         M src/simulation.jl                   |       4 ++--
         M src/wall.jl                         |      61 +++++++++++++++++++++++++++++--
         M test/memory-management.jl           |       4 ++--
         M test/wall.jl                        |      20 ++++++++++++++++++--
       
       5 files changed, 82 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/docs/src/man/getting_started.md b/docs/src/man/getting_started.md
       t@@ -16,14 +16,14 @@ The relevant functions are all contained in the `Granular` module, which can be
        imported with `import Granular`.  *Note:* As per Julia conventions, functions 
        that contain an exclamation mark (!) modify the values of the arguments.
        
       -Any of the functions called below are documented in the source code, and their 
       +All of the functions called below are documented in the source code, and their 
        documentation can be found in the [Public API Index](@ref main-index) in the 
        online documentation, or simply from the Julia shell by typing `?<function 
        name>`.  An example:
        
        ```julia-repl
        julia> ?Granular.createSimulation
       -  createSimulation([id::String="unnamed"])
       +  createSimulation([id])
        
          Create a simulation object to contain all relevant variables such as temporal 
          parameters, fluid grids, grains, and contacts. The parameter id is used to 
 (DIR) diff --git a/src/simulation.jl b/src/simulation.jl
       t@@ -2,7 +2,7 @@
        
        export createSimulation
        """
       -    createSimulation([id::String="unnamed"])
       +    createSimulation([id])
        
        Create a simulation object to contain all relevant variables such as temporal 
        parameters, fluid grids, grains, and contacts.  The parameter `id` is used to
       t@@ -227,7 +227,7 @@ Add an `wall` to the `simulation` object.  If `verbose` is true, a short
        confirmation message will be printed to stdout.
        """
        function addWall!(simulation::Simulation,
       -                  grain::WallLinearFrictionless,
       +                  wall::WallLinearFrictionless,
                          verbose::Bool = false)
            push!(simulation.walls, wall)
        
 (DIR) diff --git a/src/wall.jl b/src/wall.jl
       t@@ -87,7 +87,7 @@ function addWallLinearFrictionless!(simulation::Simulation,
        
            # if not set, set wall mass to equal the mass of all grains.
            if isnan(mass)
       -        if length(simulation.grains < 1)
       +        if length(simulation.grains) < 1
                    error("If wall mass is not specified, walls should be added " *
                          "after grains have been added to the simulation.")
                end
       t@@ -100,13 +100,13 @@ function addWallLinearFrictionless!(simulation::Simulation,
        
            # if not set, set wall thickness to equal largest grain thickness
            if isnan(thickness)
       -        if length(simulation.grains < 1)
       +        if length(simulation.grains) < 1
                    error("If wall thickness is not specified, walls should be added " *
                          "after grains have been added to the simulation.")
                end
                thickness = -Inf
                for grain in simulation.grains
       -            if grain.thickess > thickness
       +            if grain.thickness > thickness
                        thickness = grain.thickness
                    end
                end
       t@@ -128,3 +128,58 @@ function addWallLinearFrictionless!(simulation::Simulation,
            nothing
        end
        
       +export getWallSurfaceArea
       +"""
       +    getWallSurfaceArea(simulation, wall_index)
       +
       +Returns the surface area of the wall given the grid size and its index.
       +
       +# Arguments
       +* `simulation::Simulation`: the simulation object containing the wall.
       +* `wall_index::Integer=1`: the wall number in the simulation object.
       +"""
       +function getWallSurfaceArea(sim::Simulation, wall_index::Integer)
       +
       +    if sim.walls[wall_index].normal ≈ [1., 0.]
       +        return (sim.ocean.yq[end,end] - sim.ocean.yq[1,1]) *
       +            sim.walls[wall_index].thickness
       +    elseif sim.walls[wall_index].normal ≈ [0., 1.]
       +        return (sim.ocean.xq[end,end] - sim.ocean.xq[1,1]) *
       +            sim.walls[wall_index].thickness
       +    else
       +        error("Wall normal not understood")
       +    end
       +    nothing
       +end
       +
       +export getWallNormalStress
       +"""
       +    getWallNormalStress(simulation[, wall_index, stress_type])
       +
       +Returns the current "effective" or "defined" normal stress on the wall with
       +index `wall_index` inside the `simulation` object.  The returned value is given
       +in Pascal.
       +
       +# Arguments
       +* `simulation::Simulation`: the simulation object containing the wall.
       +* `wall_index::Integer=1`: the wall number in the simulation object.
       +* `stress_type::String="effective"`: the normal-stress type to return.  The
       +    defined value corresponds to the normal stress that the wall is asked to
       +    uphold. The effective value is the actual current normal stress.  Usually,
       +    the magnitude of the effective normal stress fluctuates around the defined
       +    normal stress.
       +"""
       +function getWallNormalStress(sim::Simulation;
       +                             wall_index::Integer=1,
       +                             stress_type::String="effective")
       +    if stress_type == "defined"
       +        return sim.walls[wall_index].normal_stress
       +
       +    elseif stress_type == "effective"
       +        return sim.walls[wall_index].force / getWallSurfaceArea(sim, wall_index,
       +                                                                sim.ocean)
       +    else
       +        error("stress_type not understood, should be 'effective' or 'defined'" *
       +              " but is '$stress_type'.")
       +    end
       +end
 (DIR) diff --git a/test/memory-management.jl b/test/memory-management.jl
       t@@ -5,8 +5,8 @@ info("#### $(basename(@__FILE__)) ####")
        info("Testing memory footprint of Granular types")
        
        sim = Granular.createSimulation()
       -empty_sim_size = 96
       -empty_sim_size_recursive = 544
       +empty_sim_size = 104
       +empty_sim_size_recursive = 552
        
        @test sizeof(sim) == empty_sim_size
        @test Base.summarysize(sim) == empty_sim_size_recursive
 (DIR) diff --git a/test/wall.jl b/test/wall.jl
       t@@ -28,6 +28,22 @@ Granular.addGrainCylindrical!(sim, [ 0., 0.], 10., 2., verbose=false)
        sim.grains[1].mass = 1.0
        Granular.addWallLinearFrictionless!(sim, [1., 0.], 1., verbose=true)
        @test length(sim.walls) == 1
       -@test sim.walls.mass ≈ 1.0
       -@test sim.walls.mass ≈ 2.0
       +@test sim.walls[1].mass ≈ 1.0
       +@test sim.walls[1].thickness ≈ 2.0
       +
       +info("Test wall surface area and defined normal stress")
       +sim = Granular.createSimulation(id="test")
       +sim.ocean = Granular.createRegularOceanGrid([1, 1, 1], [10., 20., 1.0])
       +Granular.addGrainCylindrical!(sim, [ 0., 0.], 10., 2., verbose=false)
       +sim.grains[1].mass = 1.0
       +Granular.addWallLinearFrictionless!(sim, [1., 0.], 1., verbose=true)
       +Granular.addWallLinearFrictionless!(sim, [0., 1.], 1., verbose=true)
       +@test length(sim.walls) == 2
       +@test sim.walls[1].mass ≈ 1.0
       +@test sim.walls[1].thickness ≈ 2.0
       +@test sim.walls[2].mass ≈ 1.0
       +@test sim.walls[2].thickness ≈ 2.0
       +@test Granular.getWallSurfaceArea(sim, 1) ≈ 20.0*2.0
       +@test Granular.getWallSurfaceArea(sim, 2) ≈ 10.0*2.0
       +