tadd viscous and non-viscous damping - slidergrid - grid of elastic sliders on … | |
git clone git://src.adamsgaard.dk/slidergrid | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c1d935d91f4cf966769161facb856ed8c426f859 | |
parent 25a1b1a29874237888551abd9d157460aedac79f | |
Author: Anders Damsgaard <[email protected]> | |
Date: Wed, 30 Mar 2016 10:51:54 -0700 | |
add viscous and non-viscous damping | |
Diffstat: | |
M slidergrid/main.c | 12 ++++++++++++ | |
M slidergrid/simulation.c | 2 +- | |
M slidergrid/slider.c | 66 +++++++++++++++++++++++------… | |
M slidergrid/slider.h | 8 ++++++++ | |
4 files changed, 71 insertions(+), 17 deletions(-) | |
--- | |
diff --git a/slidergrid/main.c b/slidergrid/main.c | |
t@@ -175,6 +175,18 @@ int main(int argc, char** argv) | |
#endif | |
} | |
+ // add global viscous damping | |
+ for (i=0; i<sim.N; i++) | |
+ if (sim.sliders[i].damping_viscosity_linear > 1.0e-16 || | |
+ sim.sliders[i].damping_viscosity_angular > 1.0e-16) | |
+ slider_global_viscous_damping(&sim.sliders[i]); | |
+ | |
+ // add global non-viscous damping | |
+ for (i=0; i<sim.N; i++) | |
+ if (sim.sliders[i].damping_coefficient > 1.0e-16) | |
+ slider_nonviscous_damping(&sim.sliders[i]); | |
+ | |
+ | |
for (i=0; i<sim.N; i++) | |
update_kinematics(&sim.sliders[i], sim.dt, sim.iteration); | |
diff --git a/slidergrid/simulation.c b/slidergrid/simulation.c | |
t@@ -220,7 +220,7 @@ int save_sliders_to_vtk_file( | |
// angular positions | |
fprintf(f, " <DataArray NumberOfComponents=\"3\" type=\"Float32\" " | |
- "Name=\"Angular position [m]\" format=\"ascii\">\n"); | |
+ "Name=\"Angular position [rad]\" format=\"ascii\">\n"); | |
fprintf(f, " "); | |
for (i=0; i<N; i++) | |
fprintf(f, "%f %f %f ", | |
diff --git a/slidergrid/slider.c b/slidergrid/slider.c | |
t@@ -1,4 +1,5 @@ | |
#include <stdio.h> | |
+#include <math.h> | |
#include "typedefs.h" | |
#include "slider.h" | |
#include "vector_math.h" | |
t@@ -31,6 +32,10 @@ void initialize_slider_values(slider* s) | |
s->bond_shear_kv_stiffness = 0.0; | |
s->bond_shear_kv_viscosity = 0.0; | |
+ s->damping_viscosity_linear = 0.0; | |
+ s->damping_viscosity_angular = 0.0; | |
+ s->damping_coefficient = 0.0; | |
+ | |
// define all entries in neighbor list as empty | |
int i; | |
for (i=0; i<MAX_NEIGHBORS; i++) { | |
t@@ -137,14 +142,6 @@ void bond_parallel_deformation(slider* s1, const slider s… | |
// relative contact interface velocity w/o rolling | |
const Float3 vel_linear = subtract_float3(s1->vel, s2.vel); | |
- // relative contact interface velocity with rolling | |
- 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)))); | |
- | |
// Normal component of the relative contact interface velocity | |
const Float vel_n = -1.0*dot_float3(vel_linear, n); | |
t@@ -219,6 +216,15 @@ void bond_normal_deformation(slider* s1, const slider s2, | |
multiply_float3(n, | |
multiply_float3(n, tangential_displacement0_uncor))); | |
+ // project future tangential displacement | |
+ | |
+ | |
+ // determine dtangential_displacement by central differences | |
+ | |
+ | |
+ // use dtangential_displacement for elastic response | |
+ | |
+ // use vel_t for viscous response | |
} | |
t@@ -227,14 +233,10 @@ void bond_deformation(slider* s1, const slider s2, | |
const int idx_neighbor, const int iteration) | |
{ | |
bond_parallel_deformation(s1, s2, idx_neighbor, iteration); | |
- | |
- | |
+ //bond_normal_deformation(s1, s2, idx_neighbor, iteration); | |
} | |
- | |
- | |
- | |
void bond_parallel_kelvin_voigt(slider* s1, const slider s2, | |
const int idx_neighbor) | |
{ | |
t@@ -335,8 +337,7 @@ void bond_shear_kelvin_voigt(slider* s1, const slider s2, | |
void slider_interaction(slider* s1, const slider s2, const int idx_neighbor) | |
{ | |
bond_parallel_kelvin_voigt(s1, s2, idx_neighbor); | |
- | |
- | |
+ //bond_normal_kelvin_voigt(s1, s2, idx_neighbor); | |
} | |
t@@ -360,7 +361,7 @@ void slider_neighbor_interaction( | |
if (s->neighbors[idx_neighbor] != -1) { | |
- slider_displacement( | |
+ bond_deformation( | |
s, sliders[s->neighbors[idx_neighbor]], | |
idx_neighbor, iteration); | |
t@@ -379,3 +380,36 @@ void slider_neighbor_interaction( | |
} | |
} | |
} | |
+ | |
+// add frequency-independent viscosity to sum of forces and torques to damp | |
+// reflected waves from the edge of the lattice | |
+// Mora and Place (1994), Place et al (2002) | |
+void slider_viscous_damping(slider* s) | |
+{ | |
+ s->force.x += - s->damping_viscosity_linear*s->vel.x; | |
+ s->force.y += - s->damping_viscosity_linear*s->vel.y; | |
+ s->force.z += - s->damping_viscosity_linear*s->vel.z; | |
+ | |
+ s->torque.x += - s->damping_viscosity_angular*s->vel.x; | |
+ s->torque.y += - s->damping_viscosity_angular*s->vel.y; | |
+ s->torque.z += - s->damping_viscosity_angular*s->vel.z; | |
+} | |
+ | |
+// add local non-viscous damping, Potyondy and Cundall (2004) | |
+void slider_nonviscous_damping(slider* s) | |
+{ | |
+ s->force.x += | |
+ - s->damping_coefficient*fabs(s->force.x)*copysign(1.0, s->vel.x); | |
+ s->force.y += | |
+ - s->damping_coefficient*fabs(s->force.y)*copysign(1.0, s->vel.y); | |
+ s->force.z += | |
+ - s->damping_coefficient*fabs(s->force.z)*copysign(1.0, s->vel.z); | |
+ | |
+ s->torque.x += | |
+ - s->damping_coefficient*fabs(s->torque.x)*copysign(1.0, s->angvel.x); | |
+ s->torque.y += | |
+ - s->damping_coefficient*fabs(s->torque.y)*copysign(1.0, s->angvel.y); | |
+ s->torque.z += | |
+ - s->damping_coefficient*fabs(s->torque.z)*copysign(1.0, s->angvel.z); | |
+ | |
+} | |
diff --git a/slidergrid/slider.h b/slidergrid/slider.h | |
t@@ -39,6 +39,11 @@ typedef struct { | |
Float bond_shear_kv_stiffness; // Hookean elastic stiffness [N/m] | |
Float bond_shear_kv_viscosity; // viscosity [N/(m*s)] | |
+ // Damping parameters | |
+ Float damping_viscosity_linear; // Linear velocity damping [N/(m/s)] | |
+ Float damping_viscosity_angular; // Angular velocity damping [N*m/(rad/s)] | |
+ Float damping_coefficient; // Dimensionless damping [-] | |
+ | |
// The uniquely identifying indexes of the slider neighbors which are bond… | |
// to this slider. A value of -1 denotes an empty field. Preallocated fo… | |
// speed. | |
t@@ -65,4 +70,7 @@ void slider_neighbor_interaction( | |
const int N, | |
const int iteration); | |
+void slider_viscous_damping(slider* s); | |
+void slider_nonviscous_damping(slider* s); | |
+ | |
#endif |