int IX(int i, int j) { return i+j*(N+2); } ////////////////////////////////////////////////////////////////////////////////////////// int[] XI(int k) { int i = k%(N+2); int j = int(k/float(N+2)); int[] t = { i, j }; return t; } ////////////////////////////////////////////////////////////////////////////////////////// void swap(float[] x0, float[] x) { float[] tmp = new float[x0.length]; arrayCopy(x0, 0, tmp, 0, x0.length); arrayCopy(x, 0, x0, 0, x0.length); arrayCopy(tmp, 0, x, 0, x0.length); } ////////////////////////////////////////////////////////////////////////////////////////// void add_source(float[] x, float[] s, float dt) { for (int i=0; i<(N+2)*(N+2); i++) { x[i] += s[i]*dt; } } ////////////////////////////////////////////////////////////////////////////////////////// void add_force(float[] u, float[] fx, float dt) { for (int i=0; i<(N+2)*(N+2); i++) { u[i] += fx[i]*dt; } } ////////////////////////////////////////////////////////////////////////////////////////// void set_bnd(int b, float[] x) { for (int i=1; iN+0.5) x=N+ 0.5; i0=(int)x; i1=i0+1; if (y<0.5) y=0.5; if (y>N+0.5) y=N+ 0.5; j0=(int)y; j1=j0+1; s1 = x-i0; s0 = 1-s1; t1 = y-j0; t0 = 1-t1; d[IX(i, j)] = s0*(t0*d0[IX(i0, j0)]+t1*d0[IX(i0, j1)])+ s1*(t0*d0[IX(i1, j0)]+t1*d0[IX(i1, j1)]); } } set_bnd(b, d); } ////////////////////////////////////////////////////////////////////////////////////////// void project(float[] u, float[] v, float[] p, float[] div) { int i, j, k; float h; h = w/N; for ( i=1 ; i<=N ; i++ ) { for ( j=1 ; j<=N ; j++ ) { div[IX(i, j)] = -0.5*h*(u[IX(i+1, j)]-u[IX(i-1, j)]+ v[IX(i, j+1)]-v[IX(i, j-1)]); p[IX(i, j)] = 0; } } set_bnd(0, div); set_bnd(0, p); for ( k=0 ; k<30 ; k++ ) { for ( i=1 ; i<=N ; i++ ) { for ( j=1 ; j<=N ; j++ ) { p[IX(i, j)] = (div[IX(i, j)]+p[IX(i-1, j)]+p[IX(i+1, j)]+ p[IX(i, j-1)]+p[IX(i, j+1)])/4; } } set_bnd(0, p); } for ( i=1 ; i<=N ; i++ ) { for ( j=1 ; j<=N ; j++ ) { u[IX(i, j)] -= 0.5*(p[IX(i+1, j)]-p[IX(i-1, j)])/h; v[IX(i, j)] -= 0.5*(p[IX(i, j+1)]-p[IX(i, j-1)])/h; } } set_bnd(1, u); set_bnd(2, v); } ////////////////////////////////////////////////////////////////////////////////////////// void calculateVelocity(float[] u, float[] v, float[] u0, float[] v0, float visc, float dt) { add_force(u, fx, dt); add_force(v, fy, dt); add_source(u, u0, dt); add_source(v, v0, dt); swap(u0, u); swap(v0, v); diffuse(1, u, u0, visc, dt); diffuse(2, v, v0, visc, dt); project(u, v, u0, v0); swap(u0, u); swap(v0, v); advect(1, u, u0, u0, v0, dt); advect(2, v, v0, u0, v0, dt); project(u, v, u0, v0); } ////////////////////////////////////////////////////////////////////////////////////////// void calculateDensity(float[] u, float[] v, float[] dens, float[] dens0, float[] s, float diff, float dt) { add_source( dens, s, dt ); swap(dens0, dens); diffuse( 0, dens, dens0, diff, dt ); swap(dens0, dens); advect( 0, dens, dens0, u, v, dt ); } //////////////////////////////////////////////////////////////////////////////////////////