tadd more helper functions, complete TY3 integration scheme - slidergrid - grid of elastic sliders on a frictional surface
(HTM) git clone git://src.adamsgaard.dk/slidergrid
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit a270ef4ab316d4b52745938eb25ed87749b5fe0a
(DIR) parent 129e0df22ec2470c059710b4b60635192552c0db
(HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
Date: Tue, 15 Mar 2016 13:43:44 -0700
add more helper functions, complete TY3 integration scheme
Diffstat:
M slider.c | 12 ++++++++----
M vector_math.c | 45 +++++++++++++++++++++++++++++--
M vector_math.h | 12 +++++++++++-
3 files changed, 62 insertions(+), 7 deletions(-)
---
(DIR) diff --git a/slider.c b/slider.c
t@@ -8,10 +8,10 @@ void print_slider_position(slider s)
printf("%f\t%f\t%f\n", s.pos.x, s.pos.y, s.pos.z);
}
+/* Explicit temporal integration scheme based on three-term Taylor expansion */
void integrate_kinematics(slider s, Float dt, int iteration)
{
-
-
+ s.acc = divide_float3_scalar(s.force, s.mass);
Float3 acc0;
if (iteration == 0) {
t@@ -30,9 +30,13 @@ void integrate_kinematics(slider s, Float dt, int iteration)
s.vel.y*dt + 0.5*s.acc.y*dt*dt + 1./6.*dacc_dt.y*dt*dt*dt,
s.vel.z*dt + 0.5*s.acc.z*dt*dt + 1./6.*dacc_dt.z*dt*dt*dt);
- s.pos = add_float3(s.pos, dpos_dt);
-
+ const Float3 dvel_dt = make_float3(
+ s.acc.x*dt + 0.5*dacc_dt.x*dt*dt,
+ s.acc.y*dt + 0.5*dacc_dt.y*dt*dt,
+ s.acc.z*dt + 0.5*dacc_dt.z*dt*dt);
+ s.pos = add_float3(s.pos, dpos_dt);
+ s.vel = add_float3(s.vel, dvel_dt);
}
(DIR) diff --git a/vector_math.c b/vector_math.c
t@@ -1,11 +1,20 @@
#include "typedefs.h"
+
+// constructor
inline Float3 make_float3(Float x, Float y, Float z)
{
Float3 v = {.x = x, .y = y, .z = z};
return v;
}
+inline Float3 copy_float3(Float3 v)
+{
+ return make_float3(v.x, v.y, v.z);
+}
+
+
+// vector-vector operations
inline Float3 add_float3(Float3 v1, Float3 v2)
{
return make_float3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
t@@ -26,7 +35,39 @@ inline Float3 divide_float3(Float3 v1, Float3 v2)
return make_float3(v1.x/v2.x, v1.y/v2.y, v1.z/v2.z);
}
-inline Float3 copy_float3(Float3 v)
+
+// vector-scalar operations
+inline Float3 add_float3_scalar(Float3 v, Float s)
{
- return make_float3(v.x, v.y, v.z);
+ return make_float3(v.x + s, v.y + s, v.z + s);
+}
+
+inline Float3 add_scalar_float3(Float s, Float3 v)
+{
+ return add_float3_scalar(v, s);
+}
+
+inline Float3 subtract_float3_scalar(Float3 v, Float s)
+{
+ return make_float3(v.x - s, v.y - s, v.z - s);
+}
+
+inline Float3 subtract_scalar_float3(Float s, Float3 v)
+{
+ return make_float3(s - v.x, s - v.y, s - v.z);
+}
+
+inline Float3 multiply_float3_scalar(Float3 v, Float s)
+{
+ return make_float3(v.x*s, v.y*s, v.z*s);
+}
+
+inline Float3 divide_float3_scalar(Float3 v, Float s)
+{
+ return make_float3(v.x/s, v.y/s, v.z/s);
+}
+
+inline Float3 divide_scalar_float3(Float s, Float3 v)
+{
+ return make_float3(s/v.x, s/v.y, s/v.z);
}
(DIR) diff --git a/vector_math.h b/vector_math.h
t@@ -1,8 +1,18 @@
#include "typedefs.h"
+// constructor
Float3 make_float3(Float x, Float y, Float z);
+Float3 copy_float3(Float3 v);
+
+// vector-vector operations
Float3 add_float3(Float3 v1, Float3 v2);
Float3 subtract_float3(Float3 v1, Float3 v2);
Float3 multiply_float3(Float3 v1, Float3 v2);
Float3 divide_float3(Float3 v1, Float3 v2);
-Float3 copy_float3(Float3 v);
+
+// vector-scalar operations
+Float3 multiply_float3_scalar(Float3 v, Float s);
+Float3 divide_float3_scalar(Float3 v, Float s);
+Float3 divide_scalar_float3(Float s, Float3 v);
+Float3 add_float3_scalar(Float3 v, Float s)
+Float3 add_scalar_float3(Float s, Float3 v)