Esempio n. 1
0
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);
}
Esempio n. 2
0
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
}
Esempio n. 3
0
/* 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);
}
Esempio n. 4
0
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
}