tgrain.c: add temporal integration scheme (2nd order taylor expansion) - granular - granular dynamics simulation
(HTM) git clone git://src.adamsgaard.dk/granular
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 96dfeaee4f7fc99516cc12cb75e44c922891b3c1
(DIR) parent 7f62b5e0ac9c7b40bfbb7a5cfe06af79dc966d81
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Sun, 28 Mar 2021 17:11:06 +0200
grain.c: add temporal integration scheme (2nd order taylor expansion)
Diffstat:
M grain.c | 32 +++++++++++++++++++++++++++++++
M grain.h | 1 +
2 files changed, 33 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/grain.c b/grain.c
t@@ -279,3 +279,35 @@ grain_kinetic_energy(const struct grain *g)
return grain_translational_kinetic_energy(g) +
grain_rotational_kinetic_energy(g);
}
+
+static void
+grain_temporal_integration_two_term_taylor(struct grain *g, double dt)
+{
+ size_t i;
+ double dx, mass = grain_mass(g);
+ double moment_of_inertia = grain_moment_of_inertia(g);
+
+ for (i = 0; i < 3; i++) {
+ g->acc[i] = g->force[i] / mass;
+ g->angacc[i] = g->torque[i] / moment_of_inertia;
+ }
+
+ if (g->fixed)
+ for (i = 0; i < 3; i++)
+ g->acc[i] = 0.0;
+
+ for (i = 0; i < 3; i++) {
+ dx = g->vel[i] * dt + 0.5 * g->acc[i] * dt * dt;
+ g->pos[i] += dx;
+ g->disp[i] += dx;
+ g->angpos[i] += g->angvel[i] * dt + 0.5 * g->angacc[i] * dt * dt;
+ g->vel[i] += g->acc[i] * dt;
+ g->angvel[i] += g->angacc[i] * dt;
+ }
+}
+
+void
+grain_temporal_integration(struct grain *g, double dt)
+{
+ grain_temporal_integration_two_term_taylor(g, dt);
+}
(DIR) diff --git a/grain.h b/grain.h
t@@ -48,5 +48,6 @@ void grain_zero_kinematics(struct grain *g);
double grain_translational_kinetic_energy(const struct grain *g);
double grain_rotational_kinetic_energy(const struct grain *g);
double grain_kinetic_energy(const struct grain *g);
+void grain_temporal_integration(struct grain *g, double dt);
#endif