tdetermine bond total tension/compression and tension/compression rate - slider… | |
git clone git://src.adamsgaard.dk/slidergrid | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 4d51c127fcf39c33d6a85637b5cb51b321fe320a | |
parent 1cbb23226d339f3e3ef3d13fef3ab0141148fcbe | |
Author: Anders Damsgaard <[email protected]> | |
Date: Wed, 16 Mar 2016 10:56:21 -0700 | |
determine bond total tension/compression and tension/compression rate | |
Diffstat: | |
M slider.c | 31 +++++++++++++++++++++++++++++… | |
M slider.h | 5 +++-- | |
M vector_math.c | 5 +++++ | |
M vector_math.h | 1 + | |
4 files changed, 38 insertions(+), 4 deletions(-) | |
--- | |
diff --git a/slider.c b/slider.c | |
t@@ -62,12 +62,17 @@ void update_kinematics(slider s, Float dt, long int iterat… | |
} | |
// Find the relative displacement and velocity between two sliders | |
-void slider_displacement(slider s1, const slider s2, const Float dt) | |
+void slider_displacement(slider s1, const slider s2, const Float dt, const int… | |
{ | |
+ // vector pointing from neighbor (s2) position to this slider position (s1) | |
const Float3 dist = subtract_float3(s1.pos, s2.pos); | |
+ | |
+ // length of inter-slider vector | |
const Float dist_norm = norm_float3(dist); | |
+ // unit vector pointing from neighbor (s2) to slider s1 | |
+ const Float3 n = divide_float3_scalar(dist, dist_norm); | |
// relative contact interface velocity w/o rolling | |
const Float3 vel_linear = subtract_float3(s1.vel, s2.vel); | |
t@@ -80,12 +85,34 @@ void slider_displacement(slider s1, const slider s2, const… | |
multiply_scalar_float3(dist_norm/2., | |
cross_float3(dist, s2.angvel)))); | |
+ // Normal component of the relative contact interface velocity | |
+ const Float vel_n = multiply_scalar_float3(-1.0, dot_float3(vel_linear, n)… | |
+ | |
+ // Tangential component of the relative contact interface velocity | |
+ // Hinrichsen and Wolf 2004, eq. 13.9 | |
+ const Float3 = subtract_float3(vel, multiply_float3(n, dot_float3(n, vel))… | |
+ | |
+ // read previous inter-slider distance vector | |
+ const Float3 dist0 = s1.neighbor_distance[i]; | |
+ | |
+ // increment in inter-slider distance | |
+ const Float3 ddist = subtract_float3(dist, dist0); | |
+ | |
+ // save current inter-slider distance | |
+ s1.neighbor_distance[i] = dist; | |
+ | |
+ // total relative displacement in inter-slider distance | |
+ s1.neighbor_relative_distance_displacement[i] = | |
+ add_float3(s1.neighbor_relative_distance_displacement[i], ddist); | |
+ // total relative displacement in inter-slider distance | |
+ s1.neighbor_relative_distance_velocity[i] = vel_n; | |
} | |
-// Resolve bond mechanics between a slider and one of its neighbors | |
+// Resolve bond mechanics between a slider and one of its neighbors based on t… | |
+// incremental linear-elastic model by Potyondy and Cundall 2004 | |
// Resolve interaction between a slider and all of its neighbors | |
diff --git a/slider.h b/slider.h | |
t@@ -41,8 +41,9 @@ typedef struct { | |
int neighbors[MAX_NEIGHBORS]; | |
// relative spatial movement between this slider and its neighbors | |
- Float3 neighbor_relative_displacement[MAX_NEIGHBORS]; | |
- Float3 neighbor_relative_contact_velocity[MAX_NEIGHBORS]; | |
+ Float3 neighbor_distance[MAX_NEIGHBORS]; | |
+ Float3 neighbor_relative_distance_displacement[MAX_NEIGHBORS]; | |
+ Float neighbor_relative_distance_velocity[MAX_NEIGHBORS]; | |
} slider; | |
diff --git a/vector_math.c b/vector_math.c | |
t@@ -51,6 +51,11 @@ inline Float3 cross_float3(Float3 v1, Float3 v2) | |
v1.x*v2.y - v1.y*v2.x); | |
} | |
+inline Float dot_float3(Float3 v1, Float3 v2) | |
+{ | |
+ return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; | |
+} | |
+ | |
// vector-scalar operations | |
inline Float3 add_float3_scalar(Float3 v, Float s) | |
{ | |
diff --git a/vector_math.h b/vector_math.h | |
t@@ -13,6 +13,7 @@ Float3 subtract_float3(Float3 v1, Float3 v2); | |
Float3 multiply_float3(Float3 v1, Float3 v2); | |
Float3 divide_float3(Float3 v1, Float3 v2); | |
Float3 cross_float3(Float3 v1, Float3 v2); | |
+Float dot_float3(Float3 v1, Float3 v2) | |
// vector-scalar operations | |
Float3 multiply_float3_scalar(Float3 v, Float s); |