tdetermine bond total tension/compression and tension/compression rate - 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 4d51c127fcf39c33d6a85637b5cb51b321fe320a
(DIR) parent 1cbb23226d339f3e3ef3d13fef3ab0141148fcbe
(HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
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(-)
---
(DIR) diff --git a/slider.c b/slider.c
t@@ -62,12 +62,17 @@ void update_kinematics(slider s, Float dt, long int iteration)
}
// 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 i)
{
+ // 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 Float dt)
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 the
+// incremental linear-elastic model by Potyondy and Cundall 2004
// Resolve interaction between a slider and all of its neighbors
(DIR) 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;
(DIR) 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)
{
(DIR) 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);