Introduction
Introduction Statistics Contact Development Disclaimer Help
timplement bond-parallel interaction - slidergrid - grid of elastic sliders on …
git clone git://src.adamsgaard.dk/slidergrid
Log
Files
Refs
README
LICENSE
---
commit de268460b46629fdcfcfd155a1699fd3bd69b5c0
parent 73fcb298a3755f169f631813de24a4e2904510d3
Author: Anders Damsgaard <[email protected]>
Date: Wed, 16 Mar 2016 11:41:29 -0700
implement bond-parallel interaction
Diffstat:
M slider.c | 78 +++++++++++++++++++++++++----…
M slider.h | 5 +++--
M vector_math.h | 2 +-
3 files changed, 67 insertions(+), 18 deletions(-)
---
diff --git a/slider.c b/slider.c
t@@ -62,7 +62,8 @@ void update_kinematics(slider s, Float dt, long int iteratio…
}
// Find the relative displacement and velocity between two sliders
-void slider_displacement(slider s1, const slider s2, const Float dt, const int…
+void slider_displacement(slider s1, const slider s2,
+ const int idx_neighbor, const int iteration)
{
// vector pointing from neighbor (s2) position to this slider position (s1)
t@@ -78,52 +79,99 @@ void slider_displacement(slider s1, const slider s2, const…
const Float3 vel_linear = subtract_float3(s1.vel, s2.vel);
// relative contact interface velocity with rolling
- const Float3 vel = add_float3(vel_linear,
+ /*const Float3 vel = add_float3(vel_linear,
add_float3(
multiply_scalar_float3(dist_norm/2.,
cross_float3(dist, s1.angvel)),
multiply_scalar_float3(dist_norm/2.,
- cross_float3(dist, s2.angvel))));
+ 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)…
+ const Float vel_n = -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))…
+ //const Float3 vel_t =
+ //subtract_float3(vel, multiply_float3_scalar(n, dot_float3(n, vel)));
// read previous inter-slider distance vector
- const Float3 dist0 = s1.neighbor_distance[i];
+ Float3 dist0;
+ if (iteration == 0)
+ dist0 = make_float3(0., 0., 0.);
+ else
+ dist0 = s1.neighbor_distance[idx_neighbor];
// increment in inter-slider distance
const Float3 ddist = subtract_float3(dist, dist0);
// save current inter-slider distance
- s1.neighbor_distance[i] = dist;
+ s1.neighbor_distance[idx_neighbor] = dist;
// total relative displacement in inter-slider distance
- s1.neighbor_relative_distance_displacement[i] =
- add_float3(s1.neighbor_relative_distance_displacement[i], ddist);
+ if (iteration == 0)
+ s1.neighbor_relative_distance_displacement[idx_neighbor] = ddist;
+ else
+ s1.neighbor_relative_distance_displacement[idx_neighbor] =
+ add_float3(s1.neighbor_relative_distance_displacement[idx_neighbor…
+ ddist);
// total relative displacement in inter-slider distance
- s1.neighbor_relative_distance_velocity[i] = vel_n;
-
+ s1.neighbor_relative_distance_velocity[idx_neighbor] =
+ multiply_float3_scalar(n, vel_n);
}
// Resolve bond mechanics between a slider and one of its neighbors based on t…
// incremental linear-elastic model by Potyondy and Cundall 2004
+void slider_interaction(slider s1, const slider s2, const int idx_neighbor)
+{
+
+ // determine the bond stiffness from the harmonic mean.
+ // differs from Potyondy & Stack 2004, eq. 6.
+ const Float spring_stiffness =
+ 2.*s1.spring_stiffness*s2.spring_stiffness/
+ (s1.spring_stiffness + s2.spring_stiffness);
+
+
+ // bond-parallel elasticity
+ const Float3 f_n_elastic =
+ multiply_scalar_float3(bond_normal_stiffness,
+ s1.neighbor_relative_distance_displacement[idx_neighbor]);
+
+ // bond-parallel viscosity
+ const Float3 f_n_viscous =
+ multiply_scalar_float3(bond_normal_viscosity,
+ s1.neighbor_relative_distance_displacement[idx_neighbor]);
+
+ // bond-parallel force, counteracts tension and compression
+ const Float3 f_n = multiply_float3(f_n_elastic, f_n_viscous);
+
+ // add bond-parallel force to sum of forces on slider
+ s1.force = add_float3(s1.force, f_n);
+}
// Resolve interaction between a slider and all of its neighbors
void slider_neighbor_interaction(
slider s,
const slider* sliders,
- const int N)
+ const int N,
+ const int iteration)
{
- int i;
- for (i=0; i<MAX_NEIGHBORS; i++) {
- if (s.neighbors[i] != -1) {
+ int idx_neighbor;
+ for (idx_neighbor=0; idx_neighbor<MAX_NEIGHBORS; idx_neighbor++) {
+
+ // reset sum of forces on slider
+ s.force = make_float3(0., 0., 0.);
+
+ if (s.neighbors[idx_neighbor] != -1) {
+
+ slider_displacement(
+ s, sliders[s.neighbors[idx_neighbor]],
+ idx_neighbor, iteration);
+
+ slider_interaction(
+ s, sliders[s.neighbors[idx_neighbor]], idx_neighbor);
}
diff --git a/slider.h b/slider.h
t@@ -30,7 +30,8 @@ typedef struct {
Float moment_of_inertia;
// inter-slider contact model parameters
- Float spring_stiffness; // elastic compressibility [N/m]
+ Float bond_normal_stiffness; // Hookean elastic stiffness [N/m]
+ Float bond_normal_viscosity; // viscosity [N/(m*s)]
// slider-surface contact model parameters
Float coulomb_friction; // Coulomb frictional value [-]
t@@ -43,7 +44,7 @@ typedef struct {
// relative spatial movement between this slider and its neighbors
Float3 neighbor_distance[MAX_NEIGHBORS];
Float3 neighbor_relative_distance_displacement[MAX_NEIGHBORS];
- Float neighbor_relative_distance_velocity[MAX_NEIGHBORS];
+ Float3 neighbor_relative_distance_velocity[MAX_NEIGHBORS];
} slider;
diff --git a/vector_math.h b/vector_math.h
t@@ -13,7 +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)
+Float dot_float3(Float3 v1, Float3 v2);
// vector-scalar operations
Float3 multiply_float3_scalar(Float3 v, Float s);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.