79512204

Date: 2025-03-16 06:45:03
Score: 0.5
Natty:
Report link

I found the problem. My step was not working properly. new step function for Fluid:

fn step(&mut self) {
        const ITER: i32 = 16;

        diffuse(1, &mut self.vx0, &mut self.vx, self.visc, self.dt, ITER);
        diffuse(2, &mut self.vy0, &mut self.vy, self.visc, self.dt, ITER);

        project(
            &mut self.vx0,
            &mut self.vy0,
            &mut self.vx,
            &mut self.vy,
            ITER,
        );

        advect(
            1,
            &mut self.vx,
            Axis::X,
            &mut self.vx0,
            &mut self.vy0,
            self.dt,
        );
        advect(
            2,
            &mut self.vy,
            Axis::Y,
            &mut self.vx0,
            &mut self.vy0,
            self.dt,
        );

        project(
            &mut self.vx,
            &mut self.vy,
            &mut self.vx0,
            &mut self.vy0,
            ITER,
        );

        diffuse(0, &mut self.s, &mut self.density, self.diff, self.dt, ITER);
        advect2(
            0,
            &mut self.density,
            &mut self.s,
            &mut self.vx,
            &mut self.vy,
            self.dt,
        );

        set_bnd(1, &mut self.vx);
        set_bnd(2, &mut self.vy);
        set_bnd(0, &mut self.density);
    }

and added an advect2 function which functions same way as defined in the jos stam solver on which mine is based on. Here is the code:

fn advect2<'a>(
    b: usize,
    d: &mut Array2D,
    d0: &mut Array2D,
    vx: &'a mut Array2D,
    vy: &'a mut Array2D,
    dt: f32,
) {
    let dtx = dt * (N - 2) as f32;
    let dty = dt * (N - 2) as f32;

    let n_float = N as f32;

    let (mut i0, mut i1, mut j0, mut j1);
    let (mut tmp1, mut tmp2, mut x, mut y);
    let (mut s0, mut s1, mut t0, mut t1);

    for i in 1..(N - 1) {
        for j in 1..(N - 1) {
            tmp1 = dtx * vx[i][j];
            tmp2 = dty * vy[i][j];

            x = i as f32 - tmp1;
            y = j as f32 - tmp2;

            x = clamp(x, 0.5, n_float + 0.5);
            i0 = x.floor();
            i1 = i0 + 1.0;

            y = clamp(y, 0.5, n_float + 0.5);
            j0 = y.floor();
            j1 = j0 + 1.0;

            s1 = x - i0;
            s0 = 1.0 - s1;
            t1 = y - j0;
            t0 = 1.0 - t1;

            let i0i = i0 as usize;
            let i1i = i1 as usize;
            let j0i = j0 as usize;
            let j1i = j1 as usize;

            d[i][j] = s0 * (t0 * d0[i0i][j0i] + t1 * d0[i0i][j1i])
                + s1 * (t0 * d0[i1i][j0i] + t1 * d0[i1i][j1i]);
        }
    }

    set_bnd(b, d);
}
Reasons:
  • Blacklisted phrase (0.5): not working properly
  • Long answer (-1):
  • Has code block (-0.5):
  • Self-answer (0.5):
  • Low reputation (1):
Posted by: Yash Joshi