tstable behavior with elastic bond model - 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 29dcc40d11391606b585ee8c16d62ffab38d835d
 (DIR) parent 22987b940714da80cd5638c1bd3367747956b4ee
 (HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
       Date:   Wed, 23 Mar 2016 12:11:05 -0700
       
       stable behavior with elastic bond model
       
       Diffstat:
         M slidergrid/debug.h                  |      10 +++++++---
         M slidergrid/main.c                   |      26 ++++++++++++++++++++++++--
         M slidergrid/slider.c                 |      14 ++++++++++----
         M slidergrid/slider.h                 |       2 +-
         M test.c                              |       9 +++++----
       
       5 files changed, 47 insertions(+), 14 deletions(-)
       ---
 (DIR) diff --git a/slidergrid/debug.h b/slidergrid/debug.h
       t@@ -5,12 +5,16 @@
        // slider-bond initialization function
        //#define DEBUG_FIND_AND_BOND_TO_NEIGHBORS
        
       +// if defined, verbose information to stdout will be shown about the individual 
       +// components of the sum of forces
       +//#define DEBUG_SLIDER_FORCE_COMPONENTS
       +
        // if defined, verbose information to stdout will be shown before the slider 
        // integration
        #define DEBUG_SLIDER_FORCE_TORQUE_AND_NEIGHBORS
        
       -// if defined, verbose information to stdout will be shown about the individual 
       -// components of the sum of forces
       -#define DEBUG_SLIDER_FORCE_COMPONENTS
       +// if defined, verbose information to stdout will be shown after the slider 
       +// integration
       +#define DEBUG_SLIDER_KINEMATICS
        
        #endif
 (DIR) diff --git a/slidergrid/main.c b/slidergrid/main.c
       t@@ -134,8 +134,10 @@ int main(int argc, char** argv)
                            sim.sliders[i].vel.y,
                            sim.sliders[i].vel.z);*/
        
       -        for (i=0; i<sim.N; i++)
       +        for (i=0; i<sim.N; i++) {
                    project_slider_position(&sim.sliders[i], sim.dt, sim.iteration);
       +            zero_slider_force_torque(&sim.sliders[i]);
       +        }
        
                /*for (i=0; i<sim.N; i++)
                    printf("%d: pos = %f %f %f, pos_future = %f %f %f\n", i,
       t@@ -169,13 +171,33 @@ int main(int argc, char** argv)
                    for (j=0; j<MAX_NEIGHBORS; j++)
                        if (sim.sliders[i].neighbors[j] >= 0)
                            printf("%d ", sim.sliders[i].neighbors[j]);
       -            puts("\n");
       +            //puts("\n");
       +            puts("");
        #endif
                }
        
                for (i=0; i<sim.N; i++)
                    update_kinematics(&sim.sliders[i], sim.dt, sim.iteration);
        
       +#ifdef DEBUG_SLIDER_KINEMATICS
       +        for (i=0; i<sim.N; i++) {
       +            int j;
       +            printf("main.c: Slider %d: pos = %f %f %f, vel = %f %f %f, "
       +                    "acc = %f %f %f\n",
       +                    i,
       +                    sim.sliders[i].pos.x,
       +                    sim.sliders[i].pos.y,
       +                    sim.sliders[i].pos.z,
       +                    sim.sliders[i].vel.x,
       +                    sim.sliders[i].vel.y,
       +                    sim.sliders[i].vel.z,
       +                    sim.sliders[i].acc.x,
       +                    sim.sliders[i].acc.y,
       +                    sim.sliders[i].acc.z);
       +        }
       +        puts("");
       +#endif
       +
                if (time_since_file >= sim.file_interval) {
                    if (write_simulation_output(&sim, output_folder)) {
                        fprintf(stderr, "\nFatal error: Could not write one or more "
 (DIR) diff --git a/slidergrid/slider.c b/slidergrid/slider.c
       t@@ -52,8 +52,11 @@ void project_slider_position(slider* s, Float dt, long int iteration)
                        s->angpos.x + s->angvel.x*dt + 0.5*s->angacc.x*dt*dt,
                        s->angpos.y + s->angvel.y*dt + 0.5*s->angacc.y*dt*dt,
                        s->angpos.z + s->angvel.z*dt + 0.5*s->angacc.z*dt*dt);
       +}
        
       -    // reset sum of forces and torques on slider
       +// reset sum of forces and torques on slider
       +void zero_slider_force_torque(slider* s)
       +{
            s->force = zeroes_float3();
            s->torque = zeroes_float3();
        }
       t@@ -155,8 +158,11 @@ void slider_displacement(slider* s1, const slider s2,
        
            // increment in inter-slider distance, divide by two to get displacement 
            // over 1 time step
       -    Float3 ddist = divide_float3_scalar(
       -            subtract_float3(dist_future, dist0), 2.0);
       +    //const Float3 ddist = divide_float3_scalar(
       +            //subtract_float3(dist_future, dist0), 2.0);
       +
       +    // Get displacement change from previous and current inter-slider distance
       +    const Float3 ddist = subtract_float3(dist, dist0);
        
            //if (iteration == 0)
                //ddist = zeroes_float3();
       t@@ -177,7 +183,7 @@ void slider_displacement(slider* s1, const slider s2,
            s1->neighbor_relative_distance_velocity[idx_neighbor] = 
                multiply_float3_scalar(n, vel_n);
        
       -    printf("displacement = %f %f %f\n", ddist.x, ddist.y, ddist.z);
       +    //printf("displacement = %f %f %f\n", ddist.x, ddist.y, ddist.z);
        }
        
        
 (DIR) diff --git a/slidergrid/slider.h b/slidergrid/slider.h
       t@@ -50,9 +50,9 @@ typedef struct {
        
        void print_slider_position(slider s);
        void initialize_slider_values(slider* s);
       -//void check_slider_values(slider s);
        
        void project_slider_position(slider* s, Float dt, long int iteration);
       +void zero_slider_force_torque(slider* s);
        void update_kinematics(slider* s, Float dt, long int iteration);
        
        void slider_neighbor_interaction(
 (DIR) diff --git a/test.c b/test.c
       t@@ -12,7 +12,8 @@ simulation setup_simulation()
            sim.id = "test";
        
            // initialize grid of sliders
       -    int nx = 10;
       +    //int nx = 10;
       +    int nx = 2;
            int ny = 1;
            int nz = 1;
            sim.N = nx*ny*nz;
       t@@ -28,17 +29,17 @@ simulation setup_simulation()
                initialize_slider_values(&sim.sliders[i]);
        
                // set custom values for certain parameters
       -        sim.sliders[i].mass = 1.0e3;
       +        sim.sliders[i].mass = 1.0;
                sim.sliders[i].moment_of_inertia = 1.0e3;
                sim.sliders[i].bond_parallel_stiffness = 1.0e5;
                //sim.sliders[i].bond_parallel_viscosity = 1.0e2;
            }
        
       -    sim.sliders[0].vel.x = 1.0;
       +    sim.sliders[0].vel.x = 0.1;
        
            // set temporal parameters
            sim.time = 0.0;
       -    sim.time_end = 1.0;
       +    sim.time_end = 10.0;
            sim.file_interval = 0.1;
        
            return sim;