Granular.jl

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

commit e82bda84db3fa2525beabcc434837a0e484cc087
parent 5445639fc2cc81ef14066c5c67e773097c0f07f2
Author: Anders Damsgaard <andersd@riseup.net>
Date:   Fri,  9 Jun 2017 16:07:58 -0400

add functionality to read/write simulation and simulation status to disk

Diffstat:
Msrc/io.jl | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/simulation.jl | 2++
Dtest/jdl.jl | 61-------------------------------------------------------------
Atest/jld.jl | 16++++++++++++++++
Mtest/runtests.jl | 2+-
Mtest/vtk.jl | 2++
6 files changed, 73 insertions(+), 62 deletions(-)

diff --git a/src/io.jl b/src/io.jl @@ -4,6 +4,7 @@ import JLD ## IO functions +export writeSimulation """ writeSimulation(simulation::Simulation; filename::String="", @@ -32,6 +33,7 @@ function writeSimulation(simulation::Simulation; end end +export readSimulation """ readSimulation(filename::String=""; verbose::Bool=true) @@ -46,6 +48,54 @@ function readSimulation(filename::String=""; return JLD.load(filename, "simulation") end +export writeSimulationStatus +""" + writeSimulationStatus(simulation::Simulation; + folder::String=".", + verbose::Bool=false) + +Write current simulation status to disk in a minimal txt file. +""" +function writeSimulationStatus(simulation::Simulation; + folder::String=".", + verbose::Bool=false) + folder = folder * "/" * simulation.id + mkpath(folder) + filename = string(folder, "/", simulation.id, ".status.txt") + + writedlm(filename, [simulation.time + simulation.time/simulation.time_total*100. + float(simulation.file_number)]) + if verbose + info("wrote status to $filename") + end +end + +export readSimulationStatus +""" + readSimulationStatus(filename::String; + folder::String=".", + verbose::Bool=false) + +Write current simulation status to disk in a minimal txt file. +""" +function readSimulationStatus(simulation_id::String; + folder::String=".", + verbose::Bool=true) + + folder = folder * "/" * simulation_id + filename = string(folder, "/", simulation_id, ".status.txt") + + data = readdlm(filename) + if verbose + info("$simulation_id:\n" * + " time: $(data[1]) s\n" * + " complete: $(data[2])%\n" * + " last output file: $(Int(round(data[3])))\n") + end + return data[3] +end + export writeVTK """ Write a VTK file to disk containing all ice floes in the `simulation` in an @@ -497,5 +547,7 @@ function removeSimulationFiles(simulation::Simulation; folder::String=".") run(`bash -c "rm -rf $(folder)/$(simulation.id).*.vtu"`) run(`bash -c "rm -rf $(folder)/$(simulation.id).*.vtp"`) run(`bash -c "rm -rf $(folder)/$(simulation.id).*.vts"`) + run(`bash -c "rm -rf $(folder)/$(simulation.id).status.txt"`) + run(`bash -c "rm -rf $(folder)/$(simulation.id).*.jld"`) run(`bash -c "rm -rf $(folder)"`) end diff --git a/src/simulation.jl b/src/simulation.jl @@ -100,7 +100,9 @@ function run!(simulation::Simulation; if show_file_output println() end + writeSimulation(simulation, verbose=show_file_output) writeVTK(simulation, verbose=show_file_output) + writeSimulationStatus(simulation, verbose=show_file_output) simulation.file_time_since_output_file = 0.0 end diff --git a/test/jdl.jl b/test/jdl.jl @@ -1,61 +0,0 @@ -#!/usr/bin/env julia - -info("#### $(basename(@__FILE__)) ####") - -info("Writing simple simulation to JDL file") -sim = SeaIce.createSimulation(id="test") -SeaIce.addIceFloeCylindrical(sim, [ 0., 0.], 10., 1., verbose=false) -SeaIce.addIceFloeCylindrical(sim, [18., 0.], 10., 1., verbose=false) -sim.ocean = SeaIce.createRegularOceanGrid([10, 20, 5], [10., 25., 2.]) -SeaIce.findContacts!(sim, method="all to all") -SeaIce.writeVTK(sim, verbose=false) - -SeaIce.writeSimulation(sim) - -sim2 = SeaIce.readSimulation("./test/test.1.jld") -SeaIce.compareSimulations(sim, sim2) - - - -""" -cmd_post = "" -if Base.is_linux() - cmd = "sha256sum" -elseif Base.is_apple() - cmd = ["shasum", "-a", "256"] -elseif Base.is_windows() - info("checksum verification not yet implemented on Windows") - exit() - cmd = ["powershell", "-Command", "\"Get-FileHash", "-Algorithm", "SHA256"] - cmd_post = "\"" -else - error("checksum verification of VTK file not supported on this platform") -end - -icefloepath = "test/test.icefloes.1.vtu" -icefloechecksum = -"c75ffde29fbdd80161dafd524e690fbcbae2136d4f68c29f725d2d2454c6a162 " * -icefloepath * "\n" - -oceanpath = "test/test.ocean.1.vts" -oceanchecksum = -"d56ffb109841a803f2b2b94c74c87f7a497237204841d557d2b1043694d51f0d " * -oceanpath * "\n" - -@test readstring(`$(cmd) $(icefloepath)$(cmd_post)`) == icefloechecksum -@test readstring(`$(cmd) $(oceanpath)$(cmd_post)`) == oceanchecksum - -SeaIce.removeSimulationFiles(sim) - -info("Testing VTK write during run!()") -SeaIce.setOutputFileInterval!(sim, 1e-9) -SeaIce.setTotalTime!(sim, 1.5) -SeaIce.setTimeStep!(sim) -sim.file_number = 0 -SeaIce.run!(sim, single_step=true) - -@test readstring(`$(cmd) $(icefloepath)$(cmd_post)`) == icefloechecksum -@test readstring(`$(cmd) $(oceanpath)$(cmd_post)`) == oceanchecksum - -SeaIce.removeSimulationFiles(sim) -""" diff --git a/test/jld.jl b/test/jld.jl @@ -0,0 +1,16 @@ +#!/usr/bin/env julia + +info("#### $(basename(@__FILE__)) ####") + +info("Writing simple simulation to JLD file") +sim = SeaIce.createSimulation(id="test") +SeaIce.addIceFloeCylindrical(sim, [ 0., 0.], 10., 1., verbose=false) +SeaIce.addIceFloeCylindrical(sim, [18., 0.], 10., 1., verbose=false) +sim.ocean = SeaIce.createRegularOceanGrid([10, 20, 5], [10., 25., 2.]) +SeaIce.findContacts!(sim, method="all to all") +SeaIce.writeVTK(sim, verbose=false) + +SeaIce.writeSimulation(sim) + +sim2 = SeaIce.readSimulation("./test/test.1.jld") +SeaIce.compareSimulations(sim, sim2) diff --git a/test/runtests.jl b/test/runtests.jl @@ -10,7 +10,7 @@ include("collision-2floes-oblique.jl") include("cohesion.jl") include("netcdf.jl") include("vtk.jl") -include("jdl.jl") +include("jld.jl") include("grid.jl") include("ocean.jl") include("atmosphere.jl") diff --git a/test/vtk.jl b/test/vtk.jl @@ -51,4 +51,6 @@ SeaIce.run!(sim, single_step=true) @test readstring(`$(cmd) $(icefloepath)$(cmd_post)`) == icefloechecksum @test readstring(`$(cmd) $(oceanpath)$(cmd_post)`) == oceanchecksum +@test SeaIce.readSimulationStatus(sim.id) == 1 + SeaIce.removeSimulationFiles(sim)