summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Schinagl <oliver@schinagl.nl>2008-01-09 13:02:54 (GMT)
committerOliver Schinagl <oliver@schinagl.nl>2008-01-09 13:02:54 (GMT)
commit29e82f50f6f23b1a344b486f377d918425e37188 (patch)
tree6d5ff663d8ef89898d5584eab9f63f45126b145a
parent4f8eda57dc837193ea25737b28d3514b3858639f (diff)
download2iv35-29e82f50f6f23b1a344b486f377d918425e37188.zip
2iv35-29e82f50f6f23b1a344b486f377d918425e37188.tar.gz
2iv35-29e82f50f6f23b1a344b486f377d918425e37188.tar.bz2
simulation reset added; colormap autoscaling moved to fluids main loop
-rw-r--r--Smoke/colormap.c2
-rw-r--r--Smoke/colormap.h1
-rw-r--r--Smoke/fluids.c94
-rw-r--r--Smoke/fluids.h11
-rw-r--r--Smoke/gtk.c4
-rw-r--r--Smoke/gtk_main.c117
-rwxr-xr-xSmoke/smoke.binbin640613 -> 641533 bytes
7 files changed, 132 insertions, 97 deletions
diff --git a/Smoke/colormap.c b/Smoke/colormap.c
index 37afa8f..f928bce 100644
--- a/Smoke/colormap.c
+++ b/Smoke/colormap.c
@@ -158,7 +158,7 @@ fftw_real *colormap_get_frame(void)
-void colormap_autoscale(void)
+static void colormap_autoscale(void)
{
if (colormap_autoscaling) {
int k, DIM;
diff --git a/Smoke/colormap.h b/Smoke/colormap.h
index 9115753..2b08fcc 100644
--- a/Smoke/colormap.h
+++ b/Smoke/colormap.h
@@ -35,7 +35,6 @@ void colormap_set_frame(fftw_real *frame);
fftw_real *colormap_get_frame(void);
-void colormap_autoscale(void);
struct color4f colormap_get_color(float value);
diff --git a/Smoke/fluids.c b/Smoke/fluids.c
index d1fc279..51ee23e 100644
--- a/Smoke/fluids.c
+++ b/Smoke/fluids.c
@@ -55,15 +55,13 @@ static int DIM; //size of simulation grid
//init_simulation: Initialize simulation data structures as a function of the grid size 'n'.
// Although the simulation takes place on a 2D grid, we allocate all data structures as 1D arrays,
// for compatibility with the FFTW numerical library.
-fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data)
+void fluids_init_simulation(int n, struct vis_data_arrays *vis_data)
{
int i; size_t dim1, dim2;
- fftw_real *return_value;
DIM = n;
dim1 = n * 2*(n/2+1)*sizeof(fftw_real); //Allocate data structures
- return_value = (fftw_real *)malloc(dim1);
vx = (fftw_real*) malloc(dim1);
vy = (fftw_real*) malloc(dim1);
vx0 = (fftw_real*) malloc(dim1);
@@ -86,7 +84,7 @@ fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data)
}
for (i = 0; i < n * n; i++) //Initialize data structures to 0
- { vx[i] = vy[i] = vx0[i] = vy0[i] = fx[i] = fy[i] = rho[i] = rho0[i] = height_array[i] = 0.0f; }
+ { vx[i] = vy[i] = vx0[i] = vy0[i] = fx[i] = fy[i] = rho[i] = rho0[i] = 0.0f; }
vis_data->rho = rho;
vis_data->force = (fftw_real *)malloc(dim2);
@@ -95,8 +93,13 @@ fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data)
vis_data->div_vel = (fftw_real *)malloc(dim1);
vis_data->height = (fftw_real *)malloc(dim2);
vis_data->normals = (struct point *)malloc(dim2 *sizeof(struct point *));
+}
- return return_value;
+void fluids_reset_simulation(void) {
+ int i;
+
+ for (i = 0; i < DIM * DIM; i++) //Initialize data structures to 0
+ { vx[i] = vy[i] = vx0[i] = vy0[i] = fx[i] = fy[i] = rho[i] = rho0[i] = 0.0f; }
}
int rescale_to_winwidth(float value)
@@ -363,23 +366,62 @@ fftw_real calculate_height_plot(int dataset, int index)
return return_value;
}
+
void copy_frames(fftw_real *dataset)
{
memcpy(smoke_get_frame(), dataset, DIM * 2 * (DIM / 2 + 1) * sizeof(fftw_real));
}
+
float par_der(float xy1, float xy2, fftw_real cell)
{
return (xy1 - (xy2/ cell));
}
+
+fftw_real *get_frame(struct vis_data_arrays *vis_data, int dataset)
+{
+ fftw_real *return_value;
+
+ switch(dataset)
+ {
+ default:
+ case DATASET_RHO:
+ return_value = vis_data->rho;
+ break;
+ case DATASET_VEL:
+ return_value = vis_data->vel;
+ break;
+ case DATASET_FORCE:
+ return_value = vis_data->force;
+ break;
+ case DATASET_DIVV:
+ return_value = vis_data->div_vel;
+ break;
+ case DATASET_DIVF:
+ return_value = vis_data->div_force;
+ break;
+ case DATASET_HIST:
+ return_value = vis_data->history[0];
+ }
+
+ return return_value;
+}
+
+
void populate_arrays(struct vis_data_arrays *vis_data)
{
int idx, i, j;
+ float scale_min, scale_max;
+ fftw_real *frame;
+
fftw_real wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width
fftw_real hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height
-
+
+ frame = get_frame(vis_data, smoke_get_dataset());
+ scale_min = scale_max = frame[0];
+
for (j = 0; j < DIM; j++)
{
for (i = 0; i < DIM; i++)
@@ -401,37 +443,15 @@ void populate_arrays(struct vis_data_arrays *vis_data)
// printf("n: %lf; old: %lf\n",
// vis_data->normals[idx].z, normal_array[idx].z);
// }
- }
- }
-}
-fftw_real *get_frame(struct vis_data_arrays *vis_data, int dataset)
-{
- fftw_real *return_value;
- switch(dataset)
- {
- default:
- case DATASET_RHO:
- return_value = vis_data->rho;
- break;
- case DATASET_VEL:
- return_value = vis_data->vel;
- break;
- case DATASET_FORCE:
- return_value = vis_data->force;
- break;
- case DATASET_DIVV:
- return_value = vis_data->div_vel;
- break;
- case DATASET_DIVF:
- return_value = vis_data->div_force;
- break;
- case DATASET_HIST:
- return_value = vis_data->history[0];
- }
-
- return return_value;
+
+ if (colormap_get_autoscaling()) {
+ if (scale_min > frame[idx]) { colormap_set_scale_min(frame[idx]); }
+ if (scale_max < frame[idx]) { colormap_set_scale_max(frame[idx]); }
+ }
+ }
+ }
}
//do_one_simulation_step: Do one complete cycle of the simulation:
@@ -441,7 +461,7 @@ fftw_real *get_frame(struct vis_data_arrays *vis_data, int dataset)
// - gluPostRedisplay: draw a new visualization frame
-void calculate_one_simulation_step(struct vis_data_arrays *vis_data)
+void fluids_calculate_one_simulation_step(struct vis_data_arrays *vis_data)
{
int dataset;
fftw_real *frame;
@@ -452,7 +472,6 @@ void calculate_one_simulation_step(struct vis_data_arrays *vis_data)
diffuse_matter(DIM, vx, vy, rho, rho0, dt);
calculate_height_plots();
calculate_normal_vectors();
- colormap_autoscale();
}
populate_arrays(vis_data);
@@ -466,6 +485,7 @@ void calculate_one_simulation_step(struct vis_data_arrays *vis_data)
heightplots_set_frame(vis_data->height);
normals_set_frame(vis_data->normals);
+// streamlines_set_frame(vis_data->history);
}
//------ VISUALIZATION CODE STARTS HERE -----------------------------------------------------------------
diff --git a/Smoke/fluids.h b/Smoke/fluids.h
index 85e82b5..07e8c1b 100644
--- a/Smoke/fluids.h
+++ b/Smoke/fluids.h
@@ -74,7 +74,9 @@ extern float threshold1;
extern float threshold2;
extern int active_slider;
-void fluids_init(int dim);
+int rescale_to_winwidth(float value);
+
+
void fluids_set_calculate(int calculate);
int fluids_get_calculate(void);
@@ -83,11 +85,10 @@ void fluids_insert_smoke(int x, int y);
int fluids_get_dim(void);
-fftw_real *init_simulation(int n, struct vis_data_arrays *vis_data);
-
-int rescale_to_winwidth(float value);
+void fluids_init_simulation(int n, struct vis_data_arrays *vis_data);
+void fluids_reset_simulation(void);
-void calculate_one_simulation_step(struct vis_data_arrays *vis_data);
+void fluids_calculate_one_simulation_step(struct vis_data_arrays *vis_data);
float get_dataset(int index);
void set_autoscaling(void);
diff --git a/Smoke/gtk.c b/Smoke/gtk.c
index fc2971a..537a7f3 100644
--- a/Smoke/gtk.c
+++ b/Smoke/gtk.c
@@ -203,7 +203,7 @@ expose_event (GtkWidget *widget,
// fluids
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
- calculate_one_simulation_step(vis_data);
+ fluids_calculate_one_simulation_step(vis_data);
visualize(vis_data);
// endf
@@ -876,7 +876,7 @@ main (int argc,
struct vis_data_arrays vis_data;
/* Initialize the simulation */
- init_simulation(50, &vis_data);
+ fluids_init_simulation(50, &vis_data);
/* Initialize GTK. */
gtk_init (&argc, &argv);
diff --git a/Smoke/gtk_main.c b/Smoke/gtk_main.c
index 679ba12..f2ba7d0 100644
--- a/Smoke/gtk_main.c
+++ b/Smoke/gtk_main.c
@@ -139,6 +139,12 @@ static gboolean select_zoom_speed(GtkRange *adjustment, gpointer data)
return TRUE;
}
+static gboolean reset_simulation(GtkWidget *button, gpointer data) {
+ fluids_reset_simulation();
+
+ return TRUE;
+}
+
GtkWidget *create_main_page(void)
{
@@ -154,64 +160,73 @@ GtkWidget *create_main_page(void)
page = gtk_vbox_new(FALSE, 0);
- box = gtk_vbox_new(FALSE, 0);
- button = gtk_check_button_new_with_label("Draw Grid");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), renderer_get_render_grid());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_grid), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- button = gtk_check_button_new_with_label("Draw Smoke");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), smoke_get_render());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_smoke), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- button = gtk_check_button_new_with_label("Draw Glyphs");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), glyphs_get_render());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_glyphs), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
+ frame = gtk_frame_new("Simulation");
- button = gtk_check_button_new_with_label("Draw Isolines");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), isolines_get_render());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_isolines), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
-
- button = gtk_check_button_new_with_label("Draw Streamlines");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), streamlines_get_render());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_streamlines), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
+ box = gtk_vbox_new(FALSE, 0);
+ button = gtk_check_button_new_with_label("Draw Grid");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), renderer_get_render_grid());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_grid), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_check_button_new_with_label("Draw Smoke");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), smoke_get_render());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_smoke), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_check_button_new_with_label("Draw Glyphs");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), glyphs_get_render());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_glyphs), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
- button = gtk_check_button_new_with_label("Draw Flowvis");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), flowvis_get_render());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_flowvis), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
+ button = gtk_check_button_new_with_label("Draw Isolines");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), isolines_get_render());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_isolines), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_check_button_new_with_label("Draw Streamlines");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), streamlines_get_render());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_streamlines), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
- button = gtk_check_button_new_with_label("Toggle Calculation");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), fluids_get_calculate());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_calculate), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
+ button = gtk_check_button_new_with_label("Draw Flowvis");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), flowvis_get_render());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_render_flowvis), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
- button = gtk_check_button_new_with_label("Draw Normals Vectors");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), normals_get_render());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_normals), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
+ button = gtk_check_button_new_with_label("Toggle Calculation");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), fluids_get_calculate());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_calculate), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
- button = gtk_check_button_new_with_label("Draw Normals2 Vectors");
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), normals_get_render2());
- g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_normals2), NULL);
- gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
- gtk_widget_show(button);
+ button = gtk_check_button_new_with_label("Draw Normals Vectors");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), normals_get_render());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_normals), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
- gtk_box_pack_start (GTK_BOX(page), box, FALSE, TRUE, 0);
- gtk_widget_show(box);
+ button = gtk_check_button_new_with_label("Draw Normals2 Vectors");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), normals_get_render2());
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(select_normals2), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_button_new_with_label("Reset Simulation");
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_simulation), NULL);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+ gtk_widget_show(box);
+ gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0);
+ gtk_widget_show(frame);
frame = gtk_frame_new("Dataset");
diff --git a/Smoke/smoke.bin b/Smoke/smoke.bin
index b5a7166..0d6b680 100755
--- a/Smoke/smoke.bin
+++ b/Smoke/smoke.bin
Binary files differ