tAdd tests for `allow_*_acc` and add missing implementation in TY3 temporal integration scheme - 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 7ef507d6d943a442b153d9b162c4d7c3d07a4672
(DIR) parent dafb5876273163ab2718cbcd4e8e256534e7a4c3
(HTM) Author: Anders Damsgaard <andersd@riseup.net>
Date: Mon, 15 Jan 2018 10:17:40 -0500
Add tests for `allow_*_acc` and add missing implementation in TY3 temporal integration scheme
Diffstat:
M src/temporal_integration.jl | 7 ++++++-
M test/collision-2floes-normal.jl | 66 +++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 1 deletion(-)
---
(DIR) diff --git a/src/temporal_integration.jl b/src/temporal_integration.jl
t@@ -102,7 +102,12 @@ function updateGrainKinematicsThreeTermTaylor!(grain::GrainCylindrical,
grain.ang_acc = grain.torque/grain.moment_of_inertia
if grain.fixed
- fill!(grain.lin_acc, 0.)
+ if !grain.allow_x_acc
+ grain.lin_acc[1] = 0.
+ end
+ if !grain.allow_y_acc
+ grain.lin_acc[2] = 0.
+ end
grain.ang_acc = 0.
elseif !grain.rotating
grain.ang_acc = 0.
(DIR) diff --git a/test/collision-2floes-normal.jl b/test/collision-2floes-normal.jl
t@@ -207,3 +207,69 @@ E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
@test E_kin_lin_init > E_kin_lin_final
@test E_kin_rot_init ≈ E_kin_rot_final
+
+
+info("# Testing allow_*_acc for fixed grains")
+sim = Granular.createSimulation(id="test")
+Granular.addGrainCylindrical!(sim, [0., 0.], 10., 1., verbose=verbose)
+Granular.addGrainCylindrical!(sim, [20.05, 0.], 10., 1., verbose=verbose)
+sim.grains[1].lin_vel[1] = 0.1
+sim.grains[2].fixed = true
+
+E_kin_lin_init = Granular.totalGrainKineticTranslationalEnergy(sim)
+E_kin_rot_init = Granular.totalGrainKineticRotationalEnergy(sim)
+grain2_pos_init = sim.grains[2].lin_pos
+
+Granular.setTotalTime!(sim, 10.0)
+Granular.setTimeStep!(sim, epsilon=0.07)
+sim_init = deepcopy(sim)
+sim.grains[2].allow_y_acc = true # should not influence result
+
+info("Two-term Taylor scheme: allow_y_acc")
+sim = deepcopy(sim_init)
+sim.grains[2].allow_y_acc = true # should not influence result
+tol = 0.2
+Granular.run!(sim, temporal_integration_method="Two-term Taylor", verbose=verbose)
+
+E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
+E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
+@test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
+@test E_kin_rot_init ≈ E_kin_rot_final
+@test sim.grains[2].lin_pos ≈ grain2_pos_init
+
+info("Two-term Taylor scheme: allow_x_acc")
+sim = deepcopy(sim_init)
+sim.grains[2].allow_x_acc = true # should influence result
+tol = 0.2
+Granular.run!(sim, temporal_integration_method="Two-term Taylor", verbose=verbose)
+
+E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
+E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
+@test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
+@test E_kin_rot_init ≈ E_kin_rot_final
+@test sim.grains[2].lin_pos[1] > grain2_pos_init[1]
+
+info("Three-term Taylor scheme: allow_y_acc")
+sim = deepcopy(sim_init)
+tol = 0.02
+sim.grains[2].allow_y_acc = true # should influence result
+Granular.run!(sim, temporal_integration_method="Three-term Taylor", verbose=verbose)
+
+E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
+E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
+@test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
+@test E_kin_rot_init ≈ E_kin_rot_final
+@test sim.grains[2].lin_pos ≈ grain2_pos_init
+
+info("Three-term Taylor scheme: allow_x_acc")
+sim = deepcopy(sim_init)
+tol = 0.02
+sim.grains[2].allow_x_acc = true # should influence result
+Granular.run!(sim, temporal_integration_method="Three-term Taylor", verbose=verbose)
+
+E_kin_lin_final = Granular.totalGrainKineticTranslationalEnergy(sim)
+E_kin_rot_final = Granular.totalGrainKineticRotationalEnergy(sim)
+@test E_kin_lin_init ≈ E_kin_lin_final atol=E_kin_lin_init*tol
+@test E_kin_rot_init ≈ E_kin_rot_final
+@test sim.grains[2].lin_pos[1] > grain2_pos_init[1]
+