tfind and save projected future slider position - slidergrid - grid of elastic … | |
git clone git://src.adamsgaard.dk/slidergrid | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 9361f609b8753a5ee25000d7ff5269592b8f82ec | |
parent ed285da822b8be868f38c8cc1419a2d5fa783592 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Tue, 22 Mar 2016 14:31:48 -0700 | |
find and save projected future slider position | |
Diffstat: | |
M Makefile | 2 +- | |
M slidergrid/main.c | 11 +++++++---- | |
M slidergrid/slider.c | 61 +++++++++++++++++++++++++----… | |
M slidergrid/slider.h | 3 +++ | |
4 files changed, 61 insertions(+), 16 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
t@@ -13,7 +13,7 @@ BIN=test | |
default: run-test | |
run-test: test | |
- ./$< | |
+ ./$< --verbose | |
@#python postprocessing.py --plot-sliders $<-output | |
@#rsync -rav test-output /var/www/html/ | |
diff --git a/slidergrid/main.c b/slidergrid/main.c | |
t@@ -126,10 +126,13 @@ int main(int argc, char** argv) | |
sim.time <= sim.time_end; | |
sim.time += sim.dt) { | |
- // loop over all sliders | |
+ for (i=0; i<sim.N; i++) | |
+ project_slider_position(&sim.sliders[i], sim.dt, sim.iteration); | |
+ | |
+ | |
+ // resolve slider-to-slider interaction | |
for (i=0; i<sim.N; i++) { | |
- // resolve slider-to-slider interaction | |
slider_neighbor_interaction( | |
&sim.sliders[i], | |
sim.sliders, | |
t@@ -151,10 +154,10 @@ int main(int argc, char** argv) | |
printf("%d ", sim.sliders[i].neighbors[j]); | |
puts("\n"); | |
#endif | |
+ } | |
- // update slider kinematics | |
+ for (i=0; i<sim.N; i++) { | |
update_kinematics(&sim.sliders[i], sim.dt, sim.iteration); | |
- } | |
if (time_since_file >= sim.file_interval) { | |
if (write_simulation_output(&sim, output_folder)) { | |
diff --git a/slidergrid/slider.c b/slidergrid/slider.c | |
t@@ -19,8 +19,17 @@ slider create_slider() | |
void initialize_slider_values(slider* s) | |
{ | |
+ s->pos_future = zeroes_float3(); | |
+ s->vel = zeroes_float3(); | |
+ s->acc = zeroes_float3(); | |
+ s->angpos_future = zeroes_float3(); | |
+ s->angpos = zeroes_float3(); | |
+ s->angvel = zeroes_float3(); | |
+ s->angacc = zeroes_float3(); | |
+ | |
s->force = zeroes_float3(); | |
s->torque = zeroes_float3(); | |
+ | |
s->mass = 0.0; | |
s->moment_of_inertia = 0.0; | |
s->bond_parallel_stiffness = 0.0; | |
t@@ -37,6 +46,23 @@ void initialize_slider_values(slider* s) | |
} | |
+ | |
+// find change in inter-slider distance from old position and projected new | |
+// position, based on current kinematics and explicit temporal integration usi… | |
+// TY2 expansion | |
+void project_slider_position(slider* s, Float dt, long int iteration) | |
+{ | |
+ s->pos_future = make_float3( | |
+ s->pos.x + s->vel.x*dt + 0.5*s->acc.x*dt*dt, | |
+ s->pos.y + s->vel.y*dt + 0.5*s->acc.y*dt*dt, | |
+ s->pos.z + s->vel.z*dt + 0.5*s->acc.z*dt*dt); | |
+ | |
+ s->angpos_future = make_float3( | |
+ 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); | |
+} | |
+ | |
/* Explicit temporal integration scheme based on three-term Taylor expansion. | |
* Truncation error O(dt^4) for positions, O(dt^3) for velocities. Accelerati… | |
* change is approximated by backwards differences. */ | |
t@@ -92,7 +118,7 @@ void update_kinematics(slider* s, Float dt, long int iterat… | |
// Find the relative displacement and velocity between two sliders | |
void slider_displacement(slider* s1, const slider s2, | |
- const int idx_neighbor, const int iteration) | |
+ const int idx_neighbor, const int iteration, const Float dt) | |
{ | |
// vector pointing from neighbor (s2) position to this slider position (s1) | |
t@@ -124,14 +150,17 @@ void slider_displacement(slider* s1, const slider s2, | |
//subtract_float3(vel, multiply_float3_scalar(n, dot_float3(n, vel))); | |
// read previous inter-slider distance vector | |
- Float3 dist0; | |
- if (iteration == 0) | |
- dist0 = zeroes_float3(); | |
- else | |
- dist0 = s1->neighbor_distance[idx_neighbor]; | |
+ const Float3 dist0 = s1->neighbor_distance[idx_neighbor]; | |
+ | |
+ const Float3 dist_future = subtract_float3(s1_pos_future, s2_pos_future); | |
- // increment in inter-slider distance | |
- const Float3 ddist = subtract_float3(dist, dist0); | |
+ // 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); | |
+ | |
+ //if (iteration == 0) | |
+ //ddist = zeroes_float3(); | |
// save current inter-slider distance | |
s1->neighbor_distance[idx_neighbor] = dist; | |
t@@ -141,7 +170,8 @@ void slider_displacement(slider* s1, const slider s2, | |
s1->neighbor_relative_distance_displacement[idx_neighbor] = ddist; | |
else | |
s1->neighbor_relative_distance_displacement[idx_neighbor] = | |
- add_float3(s1->neighbor_relative_distance_displacement[idx_neighbo… | |
+ add_float3( | |
+ s1->neighbor_relative_distance_displacement[idx_neighbor], | |
ddist); | |
// total relative displacement in inter-slider distance | |
t@@ -203,7 +233,8 @@ void slider_neighbor_interaction( | |
slider* s, | |
const slider* sliders, | |
const int N, | |
- const int iteration) | |
+ const int iteration, | |
+ const Float dt) | |
{ | |
int idx_neighbor; | |
for (idx_neighbor=0; idx_neighbor<MAX_NEIGHBORS; idx_neighbor++) { | |
t@@ -216,10 +247,18 @@ void slider_neighbor_interaction( | |
slider_displacement( | |
s, sliders[s->neighbors[idx_neighbor]], | |
- idx_neighbor, iteration); | |
+ idx_neighbor, iteration, dt); | |
+ printf("- %d: rel_disp = %f %f %f\n", | |
+ idx_neighbor, | |
+ s->neighbor_relative_distance_displacement[idx_neighbor].x, | |
+ s->neighbor_relative_distance_displacement[idx_neighbor].y, | |
+ s->neighbor_relative_distance_displacement[idx_neighbor].z | |
+ ); | |
slider_interaction( | |
s, sliders[s->neighbors[idx_neighbor]], idx_neighbor); | |
+ printf("s.force = %f %f %f\n", | |
+ s->force.x, s->force.y, s->force.z); | |
} | |
} | |
} | |
diff --git a/slidergrid/slider.h b/slidergrid/slider.h | |
t@@ -8,11 +8,13 @@ | |
typedef struct { | |
// linear position, velocity, acceleration of this slider | |
+ Float3 pos_future; // [m] | |
Float3 pos; // [m] | |
Float3 vel; // [m/s] | |
Float3 acc; // [m/(s*s)] | |
// angular position, velocity, acceleration of this slider | |
+ Float3 angpos_future; // [rad] | |
Float3 angpos; // [rad] | |
Float3 angvel; // [rad/s] | |
Float3 angacc; // [rad/(s*s)] | |
t@@ -50,6 +52,7 @@ 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 update_kinematics(slider* s, Float dt, long int iteration); | |
void slider_neighbor_interaction( |