void Fluid::dens_temp_step(float dt) { add_source(sd, d, dt); add_source(sT, T, dt); SWAPFPTR(d0, d); diffuse(0, d0, d, diffusion, dt); SWAPFPTR(d0, d); SWAPFPTR(T0, T); advect_cool(0, d0, d, T0, T, u, v, w, dt); }
void Fluid::dens_step(float dt) { add_source(sd, d, dt); #ifdef DIFFUSE SWAPFPTR(d0, d); diffuse(0, d0, d, diffusion, dt); #endif #ifdef ADVECT SWAPFPTR(d0, d); advect(0, d0, d, u, v, w, dt); #endif }
/* order perm[i0..i1-1] such that *perm[i] <= *perm[j] forall i0<=i<q and q<=j<i1 */ static void hoare_selectp (const float **perm, int i0, int i1, int q) { float pivot = PERM(i0); int j0, j1, lim; assert (i1 - i0 > 1 && q > i0 && q < i1); for (j0 = i0, j1 = i1 ; 1 ; ) { while (j0 < j1 - 1) { j0++; if (PERM(j0) > pivot) goto endseginf; } lim = j1; break; endseginf: while (j1 - 1 > j0) { j1--; if (PERM(j1) <= pivot) goto endsegsup; } lim = j0; break; endsegsup: SWAPFPTR (j0, j1); } assert (lim > i0); if (lim == i1) { SWAPFPTR (i0, i1 - 1); lim = i1 - 1; } if (lim == q) return; else if (q < lim) hoare_selectp (perm, i0, lim, q); else hoare_selectp (perm, lim, i1, q); }
void Fluid::vel_step(float dt) { add_source(su, u, dt); add_source(sv, v, dt); add_source(sw, w, dt); add_buoyancy(dt); vorticity_confinement(dt); #ifdef DIFFUSE SWAPFPTR(u0, u); SWAPFPTR(v0, v); SWAPFPTR(w0, w); diffuse(1, u0, u, viscosity, dt); diffuse(2, v0, v, viscosity, dt); diffuse(3, w0, w, viscosity, dt); project(); #endif #ifdef ADVECT SWAPFPTR(u0, u); SWAPFPTR(v0, v); SWAPFPTR(w0, w); advect(1, u0, u, u0, v0, w0, dt); advect(2, v0, v, u0, v0, w0, dt); advect(3, w0, w, u0, v0, w0, dt); project(); #endif }