tdetermine bond-parallel and bond-normal deformation inseparate functions - 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 1414f822da9c0bc70985abc65dfbca045da8cae9
 (DIR) parent 9f1ef4954a24c00f095bfafec2afb26292b947b8
 (HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
       Date:   Wed, 23 Mar 2016 15:22:10 -0700
       
       determine bond-parallel and bond-normal deformation inseparate functions
       
       Diffstat:
         M Makefile                            |       2 +-
         M slidergrid/slider.c                 |     157 +++++++++++++++++++++++++------
         M slidergrid/slider.h                 |       6 +++++-
       
       3 files changed, 135 insertions(+), 30 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -10,7 +10,7 @@ ESSENTIALOBJS=$(SRCFOLDER)/main.o \
                                  $(SRCFOLDER)/simulation.o
        BIN=example
        
       -default: example
       +default: example tests
        
        example: example.o $(ESSENTIALOBJS)
                $(CC) $(LDLIBS) $^ -o $@
 (DIR) diff --git a/slidergrid/slider.c b/slidergrid/slider.c
       t@@ -24,9 +24,13 @@ void initialize_slider_values(slider* s)
        
            s->mass = 0.0;
            s->moment_of_inertia = 0.0;
       +
            s->bond_parallel_kv_stiffness = 0.0;
            s->bond_parallel_kv_viscosity = 0.0;
        
       +    s->bond_shear_kv_stiffness = 0.0;
       +    s->bond_shear_kv_viscosity = 0.0;
       +
            // define all entries in neighbor list as empty
            int i;
            for (i=0; i<MAX_NEIGHBORS; i++) {
       t@@ -34,6 +38,7 @@ void initialize_slider_values(slider* s)
                s->neighbor_distance[i] = zeroes_float3();
                s->neighbor_relative_distance_displacement[i] = zeroes_float3();
                s->neighbor_relative_distance_velocity[i] = zeroes_float3();
       +        s->neighbor_tangential_displacment[i] = zeroes_float3();
            }
        }
        
       t@@ -117,11 +122,9 @@ void update_kinematics(slider* s, Float dt, long int iteration)
            s->angvel = add_float3(s->angvel, dangvel_dt);
        }
        
       -// Find the relative displacement and velocity between two sliders
       -void slider_displacement(slider* s1, const slider s2,
       +void bond_parallel_deformation(slider* s1, const slider s2,
                const int idx_neighbor, const int iteration)
        {
       -
            // vector pointing from neighbor (s2) position to this slider position (s1)
            const Float3 dist = subtract_float3(s1->pos, s2.pos);
        
       t@@ -135,21 +138,16 @@ void slider_displacement(slider* s1, const slider s2,
            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 = -1.0*dot_float3(vel_linear, n);
        
       -    // Tangential component of the relative contact interface velocity
       -    // Hinrichsen and Wolf 2004, eq. 13.9
       -    //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[idx_neighbor];
        
       t@@ -161,13 +159,6 @@ void slider_displacement(slider* s1, const slider s2,
            const Float3 ddist = divide_float3_scalar(
                    subtract_float3(dist_future, dist0), 2.0);
        
       -    // Get displacement change from previous and current inter-slider distance
       -    // this can cause instabilities when only elasticity is included
       -    //const Float3 ddist = subtract_float3(dist, dist0);
       -
       -    //if (iteration == 0)
       -        //ddist = zeroes_float3();
       -
            // save current inter-slider distance
            s1->neighbor_distance[idx_neighbor] = dist;
        
       t@@ -183,48 +174,102 @@ void slider_displacement(slider* s1, const slider s2,
            // total relative displacement in inter-slider distance
            s1->neighbor_relative_distance_velocity[idx_neighbor] = 
                multiply_float3_scalar(n, vel_n);
       +}
       +
       +void bond_normal_deformation(slider* s1, const slider s2,
       +        const int idx_neighbor, const int iteration)
       +{
       +    // 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);
       +
       +    // 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))));
       +
       +    // Tangential component of the relative contact interface velocity
       +    // Hinrichsen and Wolf 2004, eq. 13.9
       +    const Float3 vel_t =
       +        subtract_float3(vel, multiply_float3_scalar(n, dot_float3(n, vel)));
       +
       +    // Read previous (uncorrected) tangential displacement vector
       +    Float3 tangential_displacement0_uncor;
       +    if (iteration == 0)
       +        tangential_displacement0_uncor = zeroes_float3();
       +    else
       +        tangential_displacement0_uncor =
       +            s1->neighbor_tangential_displacment[idx_neighbor];
       +
       +    // Correct previous tangential displacement vector if the contact plane is 
       +    // reoriented
       +    const Float3 tangential_displacement0 =
       +        subtract_float3(tangential_displacement0_uncor,
       +                multiply_float3(n,
       +                    multiply_float3(n, tangential_displacement0_uncor)));
        
       -    //printf("displacement = %f %f %f\n", ddist.x, ddist.y, ddist.z);
        }
        
        
       -// Resolve bond mechanics between a slider and one of its neighbors based on the 
       -// incremental linear-elastic model by Potyondy and Cundall 2004
       -void slider_interaction(slider* s1, const slider s2, const int idx_neighbor)
       +// Find the bond deformation
       +void bond_deformation(slider* s1, const slider s2,
       +        const int idx_neighbor, const int iteration)
        {
       +    bond_parallel_deformation(s1, s2, idx_neighbor, iteration);
       +
       +
       +}
        
       -    // determine the bond stiffness from the harmonic mean.
       +
       +
       +
       +
       +void bond_parallel_kelvin_voigt(slider* s1, const slider s2,
       +        const int idx_neighbor)
       +{
       +    // determine the bond-parallel KV stiffness from the harmonic mean.
            // differs from Potyondy & Stack 2004, eq. 6.
            const Float bond_parallel_kv_stiffness =
                2.*s1->bond_parallel_kv_stiffness*s2.bond_parallel_kv_stiffness/
                (s1->bond_parallel_kv_stiffness + s2.bond_parallel_kv_stiffness
                 + 1.0e-40);
        
       -    // determine the bond viscosity from the harmonic mean.
       +    // determine the bond-parallel KV viscosity from the harmonic mean.
            const Float bond_parallel_kv_viscosity =
                2.*s1->bond_parallel_kv_viscosity*s2.bond_parallel_kv_viscosity/
                (s1->bond_parallel_kv_viscosity + s2.bond_parallel_kv_viscosity
                 + 1.0e-40);
        
       -    // bond-parallel elasticity
       +    // bond-parallel Kelvin-Voigt elasticity
            const Float3 f_n_elastic =
                multiply_scalar_float3(bond_parallel_kv_stiffness,
                        s1->neighbor_relative_distance_displacement[idx_neighbor]);
        
       -    // bond-parallel viscosity
       +    // bond-parallel Kelvin-Voigt viscosity
            const Float3 f_n_viscous =
                multiply_scalar_float3(bond_parallel_kv_viscosity,
                        s1->neighbor_relative_distance_velocity[idx_neighbor]);
        
       -    // bond-parallel force, counteracts tension and compression
       +    // bond-parallel Kelvin-Voigt force, counteracts tension and compression
            const Float3 f_n = multiply_scalar_float3(-1.0,
                    add_float3(f_n_elastic, f_n_viscous));
        
       -    // add bond-parallel force to sum of forces on slider
       +    // add bond-parallel Kelvin-Voigt force to sum of forces on slider
            s1->force = add_float3(s1->force, f_n);
        
        #ifdef DEBUG_SLIDER_FORCE_COMPONENTS
       -    printf("slider_interaction: f_n = %f %f %f, "
       +    printf("slider_interaction KV-parallel: f_n = %f %f %f, "
                    "f_n_elastic = %f %f %f, f_n_viscous = %f %f %f\n",
                    f_n.x,
                    f_n.y,
       t@@ -238,6 +283,62 @@ void slider_interaction(slider* s1, const slider s2, const int idx_neighbor)
        #endif
        }
        
       +void bond_shear_kelvin_voigt(slider* s1, const slider s2,
       +        const int idx_neighbor)
       +{
       +    // determine the bond-shear KV stiffness from the harmonic mean.
       +    const Float bond_shear_kv_stiffness =
       +        2.*s1->bond_shear_kv_stiffness*s2.bond_shear_kv_stiffness/
       +        (s1->bond_shear_kv_stiffness + s2.bond_shear_kv_stiffness
       +         + 1.0e-40);
       +
       +    // determine the bond-shear KV viscosity from the harmonic mean.
       +    const Float bond_shear_kv_viscosity =
       +        2.*s1->bond_shear_kv_viscosity*s2.bond_shear_kv_viscosity/
       +        (s1->bond_shear_kv_viscosity + s2.bond_shear_kv_viscosity
       +         + 1.0e-40);
       +
       +    // bond-parallel Kelvin-Voigt elasticity
       +    const Float3 f_n_elastic =
       +        multiply_scalar_float3(bond_shear_kv_stiffness,
       +                s1->neighbor_relative_distance_displacement[idx_neighbor]);
       +
       +    // bond-parallel Kelvin-Voigt viscosity
       +    const Float3 f_n_viscous =
       +        multiply_scalar_float3(bond_shear_kv_viscosity,
       +                s1->neighbor_relative_distance_velocity[idx_neighbor]);
       +
       +    // bond-parallel Kelvin-Voigt force, counteracts tension and compression
       +    const Float3 f_n = multiply_scalar_float3(-1.0,
       +            add_float3(f_n_elastic, f_n_viscous));
       +
       +    // add bond-parallel Kelvin-Voigt force to sum of forces on slider
       +    s1->force = add_float3(s1->force, f_n);
       +
       +#ifdef DEBUG_SLIDER_FORCE_COMPONENTS
       +    printf("slider_interaction KV-shear: f_n = %f %f %f, "
       +            "f_n_elastic = %f %f %f, f_n_viscous = %f %f %f\n",
       +            f_n.x,
       +            f_n.y,
       +            f_n.z,
       +            f_n_elastic.x,
       +            f_n_elastic.y,
       +            f_n_elastic.z,
       +            f_n_viscous.x,
       +            f_n_viscous.y,
       +            f_n_viscous.z);
       +#endif
       +}
       +
       +// Resolve bond mechanics between a slider and one of its neighbors based on the 
       +// incremental linear-elastic model by Potyondy and Cundall 2004
       +void slider_interaction(slider* s1, const slider s2, const int idx_neighbor)
       +{
       +    bond_parallel_kelvin_voigt(s1, s2, idx_neighbor);
       +
       +
       +}
       +
        
        // Resolve interaction between a slider and all of its neighbors
        void slider_neighbor_interaction(
 (DIR) diff --git a/slidergrid/slider.h b/slidergrid/slider.h
       t@@ -35,6 +35,10 @@ typedef struct {
            Float bond_parallel_kv_stiffness;  // Hookean elastic stiffness [N/m]
            Float bond_parallel_kv_viscosity;  // viscosity [N/(m*s)]
        
       +    // inter-slider bond-shear Kelvin-Voigt contact model parameters
       +    Float bond_shear_kv_stiffness;  // Hookean elastic stiffness [N/m]
       +    Float bond_shear_kv_viscosity;  // viscosity [N/(m*s)]
       +
            // The uniquely identifying indexes of the slider neighbors which are bonded 
            // to this slider.  A value of -1 denotes an empty field.  Preallocated for 
            // speed.
       t@@ -44,7 +48,7 @@ typedef struct {
            Float3 neighbor_distance[MAX_NEIGHBORS];
            Float3 neighbor_relative_distance_displacement[MAX_NEIGHBORS];
            Float3 neighbor_relative_distance_velocity[MAX_NEIGHBORS];
       -
       +    Float3 neighbor_tangential_displacment[MAX_NEIGHBORS];
        } slider;