summaryrefslogtreecommitdiffstats
path: root/Smoke/fluids.c
diff options
context:
space:
mode:
Diffstat (limited to 'Smoke/fluids.c')
-rw-r--r--Smoke/fluids.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/Smoke/fluids.c b/Smoke/fluids.c
index 01ca443..a6c0a03 100644
--- a/Smoke/fluids.c
+++ b/Smoke/fluids.c
@@ -247,6 +247,11 @@ struct point vector_normal(struct point vert1, struct point vert2, struct point
return_value.y /= length;
return_value.z /= length;
+ if (return_value.x == return_value.y == return_value.z == 0.0f)
+ {
+ return_value.z = 1.0f;
+ }
+
return return_value;
}
@@ -263,7 +268,7 @@ void calculate_normal_vectors(void)
for (j = 0; j < DIM; j++)
{
for (i = 0; i < DIM; i++)
- {
+ {
idx = (j * DIM) + i;
px = wn + (fftw_real)i * wn;
py = hn + (fftw_real)(j + 1) * hn;
@@ -281,33 +286,39 @@ void calculate_normal_vectors(void)
p3.z = height_array[idx + 1];
normal_array[idx] = vector_normal(p2, p1, p3);
+ normal_array[idx + 1] = vector_normal(p2, p1, p3);
}
}
}
struct point calculate_normal_vector(fftw_real *height, int index, int i, int j)
{
- struct point p1, p2, p3;
+ int idx;
+ float px, py;
+ struct point p1, p2, p3, rv;
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
- float px = wn + (fftw_real)i * wn;
- float py = hn + (fftw_real)(j + 1) * hn;
+
+ px = wn + (fftw_real)i * wn;
+ py = hn + (fftw_real)(j + 1) * hn;
p1.x = px;
- p1.y = py + hn;
- p1.z = height[index + DIM];
+ p1.y = py;
+ p1.z = height[index];
p2.x = px;
- p2.y = py;
- p2.z = height[index];
+ p2.y = py + hn;
+ p2.z = height[index + DIM];
p3.x = px + wn;
p3.y = py;
p3.z = height[index + 1];
+ normal_array[index] = vector_normal(p2, p1, p3);
+ rv = vector_normal(p2, p1, p3);
- return vector_normal(p1, p2, p3);
+ return rv;
}
void calculate_height_plots(void)
@@ -486,7 +497,8 @@ void fluids_calculate_one_simulation_step(struct vis_data_arrays *vis_data)
int dataset;
fftw_real *frame;
- if (fluids_calculate) {
+ if (fluids_calculate)
+ {
set_forces();
solve(DIM, vx, vy, vx0, vy0, visc, dt);
diffuse_matter(DIM, vx, vy, rho, rho0, dt);