Granular.jl

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

commit c9448d73e65ad2b3d4b243b7ad6803774afbde1b
parent a9fb9ff582212dcc6d22f83851987d97bda76f4f
Author: Anders Damsgaard <andersd@riseup.net>
Date:   Mon,  6 Nov 2017 16:06:00 -0500

add "impermable" grid boundary condition

Diffstat:
Agrid-boundaries.jl | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/datatypes.jl | 2+-
Msrc/grid.jl | 76+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Msrc/packing.jl | 10++++++++--
Msrc/temporal_integration.jl | 1+
Dtest/periodic-boundaries.jl | 190-------------------------------------------------------------------------------
Mtest/runtests.jl | 2+-
7 files changed, 285 insertions(+), 199 deletions(-)

diff --git a/grid-boundaries.jl b/grid-boundaries.jl @@ -0,0 +1,203 @@ +#!/usr/bin/env julia + +info("#### $(basename(@__FILE__)) ####") + +verbose=false +i = 0 + +info("## Inactive/Periodic BCs") + +info("Testing assignment and reporting of grid boundary conditions") +ocean = Granular.createEmptyOcean() + +Test.@test ocean.bc_west == 1 +Test.@test ocean.bc_east == 1 +Test.@test ocean.bc_north == 1 +Test.@test ocean.bc_south == 1 + +const originalSTDOUT = STDOUT +(out_r, out_w) = redirect_stdout() +Granular.reportGridBoundaryConditions(ocean) +close(out_w) +redirect_stdout(originalSTDOUT) +output = convert(String, readavailable(out_r)) +Test.@test output == """West (-x): inactive\t(1) +East (+x): inactive\t(1) +South (-y): inactive\t(1) +North (+y): inactive\t(1) +""" + +(out_r, out_w) = redirect_stdout() +Granular.setGridBoundaryConditions!(ocean, "periodic", "south, west", verbose=true) +close(out_w) +redirect_stdout(originalSTDOUT) +output = convert(String, readavailable(out_r)) +Test.@test output == """West (-x): periodic\t(2) +East (+x): inactive\t(1) +South (-y): periodic\t(2) +North (+y): inactive\t(1) +""" +Test.@test ocean.bc_west == 2 +Test.@test ocean.bc_east == 1 +Test.@test ocean.bc_north == 1 +Test.@test ocean.bc_south == 2 + +(out_r, out_w) = redirect_stdout() +Granular.setGridBoundaryConditions!(ocean, "inactive", "all", verbose=false) +close(out_w) +redirect_stdout(originalSTDOUT) +output = convert(String, readavailable(out_r)) +Test.@test output == "" +Test.@test ocean.bc_west == 1 +Test.@test ocean.bc_east == 1 +Test.@test ocean.bc_north == 1 +Test.@test ocean.bc_south == 1 + +(out_r, out_w) = redirect_stdout() +Granular.setGridBoundaryConditions!(ocean, "periodic", "all") +close(out_w) +output = convert(String, readavailable(out_r)) +redirect_stdout(originalSTDOUT) +Test.@test output == """West (-x): periodic\t(2) +East (+x): periodic\t(2) +South (-y): periodic\t(2) +North (+y): periodic\t(2) +""" +Test.@test ocean.bc_west == 2 +Test.@test ocean.bc_east == 2 +Test.@test ocean.bc_north == 2 +Test.@test ocean.bc_south == 2 + +(out_r, out_w) = redirect_stdout() +Granular.setGridBoundaryConditions!(ocean, "inactive") +close(out_w) +output = convert(String, readavailable(out_r)) +redirect_stdout(originalSTDOUT) +Test.@test output == """West (-x): inactive\t(1) +East (+x): inactive\t(1) +South (-y): inactive\t(1) +North (+y): inactive\t(1) +""" +Test.@test ocean.bc_west == 1 +Test.@test ocean.bc_east == 1 +Test.@test ocean.bc_north == 1 +Test.@test ocean.bc_south == 1 + +(out_r, out_w) = redirect_stdout() +Granular.setGridBoundaryConditions!(ocean, "periodic") +close(out_w) +output = convert(String, readavailable(out_r)) +redirect_stdout(originalSTDOUT) +Test.@test output == """West (-x): periodic\t(2) +East (+x): periodic\t(2) +South (-y): periodic\t(2) +North (+y): periodic\t(2) +""" +Test.@test ocean.bc_west == 2 +Test.@test ocean.bc_east == 2 +Test.@test ocean.bc_north == 2 +Test.@test ocean.bc_south == 2 + +Test.@test_throws ErrorException Granular.setGridBoundaryConditions!(ocean, + "periodic", + "asdf") + +Test.@test_throws ErrorException Granular.setGridBoundaryConditions!(ocean, + "asdf") + + +info("Testing granular interaction across periodic boundaries") +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic") +Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) +Granular.addGrainCylindrical!(sim, [0.9, 0.5], 0.11, 0.1, verbose=false) + +# there should be an error if all-to-all contact search is used +Test.@test_throws ErrorException Granular.findContacts!(sim) +Test.@test_throws ErrorException Granular.findContacts!(sim, method="all to all") +Test.@test_throws ErrorException Granular.findContactsAllToAll!(sim) + +Granular.sortGrainsInGrid!(sim, sim.ocean, verbose=false) +Granular.findContacts!(sim, method="ocean grid") +Test.@test 2 == sim.grains[1].contacts[1] +Test.@test 1 == sim.grains[1].n_contacts +Test.@test 1 == sim.grains[2].n_contacts + + +info("Test grain position adjustment across periodic boundaries") +# do not readjust inside grid, inactive boundaries +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false) +Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos + +# do not readjust inside grid, periodic boundaries +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) +Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos + +# do not readjust outside grid, inactive boundaries +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false) +Granular.addGrainCylindrical!(sim, [-0.1, 0.5], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [-0.1, 0.5] ≈ sim.grains[1].lin_pos + +# readjust outside grid, periodic boundaries, -x +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) +Granular.addGrainCylindrical!(sim, [-0.1, 0.5], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.9, 0.5] ≈ sim.grains[1].lin_pos + +# readjust outside grid, periodic boundaries, +x +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) +Granular.addGrainCylindrical!(sim, [1.1, 0.5], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos + +# readjust outside grid, periodic boundaries, -y +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) +Granular.addGrainCylindrical!(sim, [0.3, -0.1], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.3, 0.9] ≈ sim.grains[1].lin_pos + +# readjust outside grid, periodic boundaries, +y +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) +Granular.addGrainCylindrical!(sim, [0.3, 1.1], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.3, 0.1] ≈ sim.grains[1].lin_pos + +# throw error if atmosphere and ocean BCs differ +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +sim.atmosphere = Granular.createRegularAtmosphereGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) +Granular.addGrainCylindrical!(sim, [0.3, 1.1], 0.11, 0.1, verbose=false) +Test.@test_throws ErrorException Granular.moveGrainsAcrossPeriodicBoundaries!(sim) + + +info("## Impermeable BCs") + +info("Test grain velocity adjustment across impermeable boundaries") +# do not readjust inside grid, inactive boundaries +sim = Granular.createSimulation() +sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) +Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false) +Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) +Granular.moveGrainsAcrossPeriodicBoundaries!(sim) +Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos diff --git a/src/datatypes.jl b/src/datatypes.jl @@ -308,5 +308,5 @@ mutable struct Simulation end # Mappings between boundary condition keys (Integers) and strings -const grid_bc_strings = ["inactive", "periodic"] +const grid_bc_strings = ["inactive", "periodic", "impermeable"] const grid_bc_flags = Dict(zip(grid_bc_strings, 1:length(grid_bc_strings))) diff --git a/src/grid.jl b/src/grid.jl @@ -643,10 +643,10 @@ Grains can interact mechanically across the periodic boundary. `"east"` (+x), `"north"` (+y). The values may be delimited in any way. Also, and by default, all boundaries can be selected with `"all"` (-x, -y, +x, +y), which overrides any other face selection. -* `mode::String`: Boundary behavior, accepted values are `"inactive"` and - `"periodic"`. You cannot specify more than one mode at a time, so if - several modes are desired as boundary conditions for the grid, several calls - to this function should be made. +* `mode::String`: Boundary behavior, accepted values are `"inactive"`, + `"periodic"`, and `"impermeable"`. You cannot specify more than one mode at + a time, so if several modes are desired as boundary conditions for the grid, + several calls to this function should be made. * `verbose::Bool`: Confirm boundary conditions by reporting values to console. # Examples @@ -742,7 +742,6 @@ called after temporal integration of the grain positions. """ function moveGrainsAcrossPeriodicBoundaries!(sim::Simulation) - # return if grids are not enabled if typeof(sim.ocean.input_file) == Bool && typeof(sim.atmosphere.input_file) == Bool @@ -793,6 +792,73 @@ function moveGrainsAcrossPeriodicBoundaries!(sim::Simulation) nothing end +""" + reflectGrainsFromImpermeableBoundaries!(simulation::Simulation) + +If the ocean or atmosphere grids are impermeable, reflect grain trajectories by +reversing the velocity vectors normal to the boundary. This function is to be +called after temporal integration of the grain positions. +""" +function reflectGrainsFromImpermeableBoundaries!(sim::Simulation) + + # return if grids are not enabled + if typeof(sim.ocean.input_file) == Bool && + typeof(sim.atmosphere.input_file) == Bool + return nothing + end + + # return immediately if no boundaries are periodic + if sim.ocean.bc_west != 3 && + sim.ocean.bc_south != 3 && + sim.ocean.bc_east != 3 && + sim.ocean.bc_north != 3 + return nothing + end + + # throw error if ocean and atmosphere grid BCs are different and both are + # enabled + if (typeof(sim.ocean.input_file) != Bool && + typeof(sim.atmosphere.input_file) != Bool) && + (sim.ocean.bc_west != sim.atmosphere.bc_west && + sim.ocean.bc_south != sim.atmosphere.bc_south && + sim.ocean.bc_east != sim.atmosphere.bc_east && + sim.ocean.bc_north != sim.atmosphere.bc_north) + error("Ocean and Atmosphere grid boundary conditions differ") + end + + for grain in sim.grains + + # -x + if sim.ocean.bc_west == 3 && + grain.lin_pos[1] - grain.contact_radius < sim.ocean.xq[1] + + grain.lin_vel[1] *= -1. + end + + # -y + if sim.ocean.bc_south == 3 && + grain.lin_pos[2] - grain.contact_radius < sim.ocean.yq[1] + + grain.lin_vel[2] *= -1. + end + + # +x + if sim.ocean.bc_east == 3 && + grain.lin_pos[1] + grain.contact_radius > sim.ocean.xq[end] + + grain.lin_vel[1] *= -1. + end + + # +y + if sim.ocean.bc_east == 3 && + grain.lin_pos[2] + grain.contact_radius > sim.ocean.yq[end] + + grain.lin_vel[2] *= -1. + end + end + nothing +end + export fitGridToGrains! """ fitGridToGrains!(simulation, grid[, padding]) diff --git a/src/packing.jl b/src/packing.jl @@ -34,8 +34,10 @@ function regularPacking!(simulation::Simulation, seed::Integer=1) r_rand = 0. + pos = zeros(2) h = .5 # disc tickness dx = r_max*2.*(1. + padding_factor) # cell size + dx_padding = r_max*2.*padding_factor srand(seed) for iy in 1:n[2] @@ -48,8 +50,12 @@ function regularPacking!(simulation::Simulation, r_rand = rand()*(r_max - r_min) + r_min end - addGrainCylindrical!(simulation, [ix*dx - .5*dx, iy*dx - .5*dx], - r_rand, h, verbose=false) + # Determine position from grid index and sample randomly from within + # padding + pos .= [ix*dx - .5*dx, iy*dx - .5*dx] .+ + rand(2) .* dx_padding .- .5*dx_padding + + addGrainCylindrical!(simulation, pos, r_rand, h, verbose=false) end end diff --git a/src/temporal_integration.jl b/src/temporal_integration.jl @@ -39,6 +39,7 @@ function updateGrainKinematics!(simulation::Simulation; error("Unknown integration method '$method'") end moveGrainsAcrossPeriodicBoundaries!(simulation) + reflectGrainsFromImpermeableBoundaries!(simulation) nothing end diff --git a/test/periodic-boundaries.jl b/test/periodic-boundaries.jl @@ -1,190 +0,0 @@ -#!/usr/bin/env julia - -info("#### $(basename(@__FILE__)) ####") - -verbose=false -i = 0 - -info("Testing assignment and reporting of grid boundary conditions") -ocean = Granular.createEmptyOcean() - -Test.@test ocean.bc_west == 1 -Test.@test ocean.bc_east == 1 -Test.@test ocean.bc_north == 1 -Test.@test ocean.bc_south == 1 - -const originalSTDOUT = STDOUT -(out_r, out_w) = redirect_stdout() -Granular.reportGridBoundaryConditions(ocean) -close(out_w) -redirect_stdout(originalSTDOUT) -output = convert(String, readavailable(out_r)) -Test.@test output == """West (-x): inactive\t(1) -East (+x): inactive\t(1) -South (-y): inactive\t(1) -North (+y): inactive\t(1) -""" - -(out_r, out_w) = redirect_stdout() -Granular.setGridBoundaryConditions!(ocean, "periodic", "south, west", verbose=true) -close(out_w) -redirect_stdout(originalSTDOUT) -output = convert(String, readavailable(out_r)) -Test.@test output == """West (-x): periodic\t(2) -East (+x): inactive\t(1) -South (-y): periodic\t(2) -North (+y): inactive\t(1) -""" -Test.@test ocean.bc_west == 2 -Test.@test ocean.bc_east == 1 -Test.@test ocean.bc_north == 1 -Test.@test ocean.bc_south == 2 - -(out_r, out_w) = redirect_stdout() -Granular.setGridBoundaryConditions!(ocean, "inactive", "all", verbose=false) -close(out_w) -redirect_stdout(originalSTDOUT) -output = convert(String, readavailable(out_r)) -Test.@test output == "" -Test.@test ocean.bc_west == 1 -Test.@test ocean.bc_east == 1 -Test.@test ocean.bc_north == 1 -Test.@test ocean.bc_south == 1 - -(out_r, out_w) = redirect_stdout() -Granular.setGridBoundaryConditions!(ocean, "periodic", "all") -close(out_w) -output = convert(String, readavailable(out_r)) -redirect_stdout(originalSTDOUT) -Test.@test output == """West (-x): periodic\t(2) -East (+x): periodic\t(2) -South (-y): periodic\t(2) -North (+y): periodic\t(2) -""" -Test.@test ocean.bc_west == 2 -Test.@test ocean.bc_east == 2 -Test.@test ocean.bc_north == 2 -Test.@test ocean.bc_south == 2 - -(out_r, out_w) = redirect_stdout() -Granular.setGridBoundaryConditions!(ocean, "inactive") -close(out_w) -output = convert(String, readavailable(out_r)) -redirect_stdout(originalSTDOUT) -Test.@test output == """West (-x): inactive\t(1) -East (+x): inactive\t(1) -South (-y): inactive\t(1) -North (+y): inactive\t(1) -""" -Test.@test ocean.bc_west == 1 -Test.@test ocean.bc_east == 1 -Test.@test ocean.bc_north == 1 -Test.@test ocean.bc_south == 1 - -(out_r, out_w) = redirect_stdout() -Granular.setGridBoundaryConditions!(ocean, "periodic") -close(out_w) -output = convert(String, readavailable(out_r)) -redirect_stdout(originalSTDOUT) -Test.@test output == """West (-x): periodic\t(2) -East (+x): periodic\t(2) -South (-y): periodic\t(2) -North (+y): periodic\t(2) -""" -Test.@test ocean.bc_west == 2 -Test.@test ocean.bc_east == 2 -Test.@test ocean.bc_north == 2 -Test.@test ocean.bc_south == 2 - -Test.@test_throws ErrorException Granular.setGridBoundaryConditions!(ocean, - "periodic", - "asdf") - -Test.@test_throws ErrorException Granular.setGridBoundaryConditions!(ocean, - "asdf") - - -info("Testing granular interaction across periodic boundaries") -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic") -Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) -Granular.addGrainCylindrical!(sim, [0.9, 0.5], 0.11, 0.1, verbose=false) - -# there should be an error if all-to-all contact search is used -Test.@test_throws ErrorException Granular.findContacts!(sim) -Test.@test_throws ErrorException Granular.findContacts!(sim, method="all to all") -Test.@test_throws ErrorException Granular.findContactsAllToAll!(sim) - -Granular.sortGrainsInGrid!(sim, sim.ocean, verbose=false) -Granular.findContacts!(sim, method="ocean grid") -Test.@test 2 == sim.grains[1].contacts[1] -Test.@test 1 == sim.grains[1].n_contacts -Test.@test 1 == sim.grains[2].n_contacts - - -info("Test grain position adjustment across periodic boundaries") -# do not readjust inside grid, inactive boundaries -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false) -Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos - -# do not readjust inside grid, periodic boundaries -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) -Granular.addGrainCylindrical!(sim, [0.1, 0.5], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos - -# do not readjust outside grid, inactive boundaries -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "inactive", verbose=false) -Granular.addGrainCylindrical!(sim, [-0.1, 0.5], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [-0.1, 0.5] ≈ sim.grains[1].lin_pos - -# readjust outside grid, periodic boundaries, -x -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) -Granular.addGrainCylindrical!(sim, [-0.1, 0.5], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [0.9, 0.5] ≈ sim.grains[1].lin_pos - -# readjust outside grid, periodic boundaries, +x -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) -Granular.addGrainCylindrical!(sim, [1.1, 0.5], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [0.1, 0.5] ≈ sim.grains[1].lin_pos - -# readjust outside grid, periodic boundaries, -y -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) -Granular.addGrainCylindrical!(sim, [0.3, -0.1], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [0.3, 0.9] ≈ sim.grains[1].lin_pos - -# readjust outside grid, periodic boundaries, +y -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) -Granular.addGrainCylindrical!(sim, [0.3, 1.1], 0.11, 0.1, verbose=false) -Granular.moveGrainsAcrossPeriodicBoundaries!(sim) -Test.@test [0.3, 0.1] ≈ sim.grains[1].lin_pos - -# throw error if atmosphere and ocean BCs differ -sim = Granular.createSimulation() -sim.ocean = Granular.createRegularOceanGrid([5, 5, 2], [1., 1., 1.]) -sim.atmosphere = Granular.createRegularAtmosphereGrid([5, 5, 2], [1., 1., 1.]) -Granular.setGridBoundaryConditions!(sim.ocean, "periodic", verbose=false) -Granular.addGrainCylindrical!(sim, [0.3, 1.1], 0.11, 0.1, verbose=false) -Test.@test_throws ErrorException Granular.moveGrainsAcrossPeriodicBoundaries!(sim) - diff --git a/test/runtests.jl b/test/runtests.jl @@ -13,7 +13,7 @@ include("netcdf.jl") include("vtk.jl") include("jld.jl") include("grid.jl") -include("periodic-boundaries.jl") +include("grid-boundaries.jl") include("ocean.jl") include("atmosphere.jl") include("memory-management.jl")