commit d75d17f32be9aee6a303c150dfa120373b95cf22
parent 27b1f0f8266144d202c7c3e4f9f6952be5826b13
Author: Anders Damsgaard <andersd@riseup.net>
Date: Wed, 29 Nov 2017 10:20:34 -0500
add fields to grain VTK files, add the option to render with `status()`
Diffstat:
6 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/src/datatypes.jl b/src/datatypes.jl
@@ -21,6 +21,7 @@ mutable struct GrainCylindrical
lin_acc::Vector{Float64}
force::Vector{Float64}
external_body_force::Vector{Float64}
+ lin_disp::Vector{Float64}
# Angular kinematic degrees of freedom for vertical rotation around center
ang_pos::Float64
@@ -106,6 +107,8 @@ mutable struct GrainArrays
lin_vel::Array{Float64, 2}
lin_acc::Array{Float64, 2}
force::Array{Float64, 2}
+ external_body_force::Array{Float64, 2}
+ lin_disp::Array{Float64, 2}
# Angular kinematic degrees of freedom for vertical rotation around center
ang_pos::Array{Float64, 2}
diff --git a/src/grain.jl b/src/grain.jl
@@ -224,6 +224,7 @@ function addGrainCylindrical!(simulation::Simulation,
lin_acc,
force,
[0., 0.], # external_body_force
+ [0., 0.], # lin_disp
ang_pos,
ang_vel,
@@ -341,6 +342,8 @@ function convertGrainDataToArrays(simulation::Simulation)
zeros(Float64, 3, length(simulation.grains)),
zeros(Float64, 3, length(simulation.grains)),
zeros(Float64, 3, length(simulation.grains)),
+ zeros(Float64, 3, length(simulation.grains)),
+ zeros(Float64, 3, length(simulation.grains)),
zeros(Float64, 3, length(simulation.grains)),
zeros(Float64, 3, length(simulation.grains)),
@@ -397,6 +400,9 @@ function convertGrainDataToArrays(simulation::Simulation)
ifarr.lin_vel[1:2, i] = simulation.grains[i].lin_vel
ifarr.lin_acc[1:2, i] = simulation.grains[i].lin_acc
ifarr.force[1:2, i] = simulation.grains[i].force
+ ifarr.external_body_force[1:2, i] =
+ simulation.grains[i].external_body_force
+ ifarr.lin_disp[1:2, i] = simulation.grains[i].lin_disp
ifarr.ang_pos[3, i] = simulation.grains[i].ang_pos
ifarr.ang_vel[3, i] = simulation.grains[i].ang_vel
@@ -470,6 +476,8 @@ function deleteGrainArrays!(ifarr::GrainArrays)
ifarr.lin_vel = f2
ifarr.lin_acc = f2
ifarr.force = f2
+ ifarr.external_body_force = f2
+ ifarr.lin_disp = f2
ifarr.ang_pos = f2
ifarr.ang_vel = f2
@@ -532,6 +540,7 @@ function printGrainInfo(f::GrainCylindrical)
println(" lin_vel: $(f.lin_vel) m/s")
println(" lin_acc: $(f.lin_acc) m/s^2")
println(" force: $(f.force) N\n")
+ println(" external_body_force: $(f.external_body_force) N\n")
println(" ang_pos: $(f.ang_pos) rad")
println(" ang_vel: $(f.ang_vel) rad/s")
@@ -668,6 +677,7 @@ function compareGrains(if1::GrainCylindrical, if2::GrainCylindrical)
@test if1.lin_acc ≈ if2.lin_acc
@test if1.force ≈ if2.force
@test if1.external_body_force ≈ if2.external_body_force
+ @test if1.lin_disp ≈ if2.lin_disp
@test if1.ang_pos ≈ if2.ang_pos
@test if1.ang_vel ≈ if2.ang_vel
@@ -772,6 +782,7 @@ function zeroKinematics!(sim::Simulation)
grain.lin_vel .= zeros(2)
grain.lin_acc .= zeros(2)
grain.force .= zeros(2)
+ grain.lin_disp .= zeros(2)
grain.ang_vel = 0.
grain.ang_acc = 0.
grain.torque = 0.
diff --git a/src/io.jl b/src/io.jl
@@ -186,14 +186,28 @@ end
export status
"""
+ status(folder[, loop, t_int, colored_output, write_header, render)
+
Shows the status of all simulations with output files written under the
specified `folder`, which is the current working directory by default.
+
+# Arguments
+`folder::String="."`: directory (including subdirectories) to scan for
+ simulation output.
+`loop::Bool=false`: continue printing the status every `t_int` seconds.
+`t_int::Int=10`: interval between status updates when `loop=true`.
+`colored_output::Bool=true`: display output with colors.
+`write_header::Bool=true`: write header line explaining the data.
+visualize::Bool=false`: render the simulation output. Does not work well when
+ `loop=true`, as the script regenerates (and overwrites) all output graphics
+ on every call.
"""
function status(folder::String=".";
loop::Bool=false,
t_int::Int=10,
colored_output::Bool=true,
- write_header::Bool=true)
+ write_header::Bool=true,
+ visualize::Bool=false)
if colored_output
id_color_complete = :green
@@ -253,6 +267,11 @@ function status(folder::String=".";
print_with_color(time_color, "$time_s ($time_h) \t")
print_with_color(percentage_color, "$percentage \t")
print_with_color(lastfile_color, "$lastfile \n")
+
+ if visualize
+ sim = createSimulation(id)
+ render(sim)
+ end
end
if write_header
println("--------------------------------------" *
@@ -354,6 +373,7 @@ function writeGrainVTK(simulation::Simulation,
WriteVTK.vtk_point_data(vtkfile, ifarr.lin_acc,
"Linear acceleration [m s^-2]")
WriteVTK.vtk_point_data(vtkfile, ifarr.force, "Sum of forces [N]")
+ WriteVTK.vtk_point_data(vtkfile, ifarr.lin_disp, "Linear displacement [m]")
WriteVTK.vtk_point_data(vtkfile, ifarr.ang_pos, "Angular position [rad]")
WriteVTK.vtk_point_data(vtkfile, ifarr.ang_vel,
@@ -759,7 +779,8 @@ function writeParaviewPythonScript(simulation::Simulation;
end
if simulation.file_number == 0
- simulation.file_number = readSimulationStatus(simulation)
+ simulation.file_number = readSimulationStatus(simulation,
+ verbose=verbose)
end
open(filename, "w") do f
@@ -786,6 +807,7 @@ imagegrains.PointArrayStatus = [
'Linear velocity [m s^-1]',
'Linear acceleration [m s^-2]',
'Sum of forces [N]',
+'Linear displacement [m]',
'Angular position [rad]',
'Angular velocity [rad s^-1]',
'Angular acceleration [rad s^-2]',
diff --git a/src/temporal_integration.jl b/src/temporal_integration.jl
@@ -68,6 +68,11 @@ function updateGrainKinematicsTwoTermTaylor!(grain::GrainCylindrical,
grain.lin_pos +=
grain.lin_vel * simulation.time_step +
0.5*grain.lin_acc * simulation.time_step^2.0
+
+ grain.lin_disp +=
+ grain.lin_vel * simulation.time_step +
+ 0.5*grain.lin_acc * simulation.time_step^2.0
+
grain.ang_pos +=
grain.ang_vel * simulation.time_step +
0.5*grain.ang_acc * simulation.time_step^2.0
@@ -111,6 +116,12 @@ function updateGrainKinematicsThreeTermTaylor!(grain::GrainCylindrical,
grain.lin_vel * simulation.time_step +
0.5 * grain.lin_acc * simulation.time_step^2. +
1. / 6. * d_lin_acc_dt * simulation.time_step^3.
+
+ grain.lin_disp +=
+ grain.lin_vel * simulation.time_step +
+ 0.5 * grain.lin_acc * simulation.time_step^2. +
+ 1. / 6. * d_lin_acc_dt * simulation.time_step^3.
+
grain.ang_pos +=
grain.ang_vel * simulation.time_step +
0.5 * grain.ang_acc * simulation.time_step^2. +
@@ -232,4 +243,3 @@ function updateWallKinematicsThreeTermTaylor!(wall::WallLinearFrictionless,
nothing
end
-
diff --git a/test/memory-management.jl b/test/memory-management.jl
@@ -11,9 +11,8 @@ empty_sim_size_recursive = 552
@test sizeof(sim) == empty_sim_size
@test Base.summarysize(sim) == empty_sim_size_recursive
-size_per_grain = 368
-#size_per_grain_recursive = 1552 # Nc_max = 16
-size_per_grain_recursive = 2576 # Nc_max = 32
+size_per_grain = 376
+size_per_grain_recursive = 2600 # Nc_max = 32
info("Testing memory usage when adding grains")
for i=1:100
diff --git a/test/vtk.jl b/test/vtk.jl
@@ -29,7 +29,7 @@ end
grainpath = "test/test.grains.1.vtu"
grainchecksum =
-"c75ffde29fbdd80161dafd524e690fbcbae2136d4f68c29f725d2d2454c6a162 " *
+"8a8830bb5448ba7daa3f1194a1c6bbfa933823edf9aad43c5259be25550a80ed " *
grainpath * "\n"
graininteractionpath = "test/test.grain-interaction.1.vtp"