* Added Navier Stokes computational fluid dynamics algorithms to libTerrain.Channel.
parent
f645705851
commit
0d7af9bbf0
|
@ -220,9 +220,40 @@ namespace libTerrain
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void nsSimulate(int N, int rounds, double dt, double diff, double visc, double force, double source)
|
private void nsSimulate(int N, int rounds, double dt, double diff, double visc)
|
||||||
{
|
{
|
||||||
|
int size = (N * 2) * (N * 2);
|
||||||
|
|
||||||
|
double[] u = new double[size]; // Force, X axis
|
||||||
|
double[] v = new double[size]; // Force, Y axis
|
||||||
|
double[] u_prev = new double[size];
|
||||||
|
double[] v_prev = new double[size];
|
||||||
|
double[] dens = (double[])map.Clone();
|
||||||
|
double[] dens_prev = (double[])map.Clone();
|
||||||
|
|
||||||
|
for (int i = 0; i < rounds; i++)
|
||||||
|
{
|
||||||
|
u_prev = u;
|
||||||
|
v_prev = v;
|
||||||
|
dens_prev = dens;
|
||||||
|
|
||||||
|
nsVelStep(N, ref u, ref v, ref u_prev, ref v_prev, visc, dt);
|
||||||
|
nsDensStep(N, ref dens, ref dens_prev, ref u, ref v, diff, dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsBufferToDoubles(ref dens, N, ref this.map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Performs computational fluid dynamics on a channel
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="rounds">The number of steps to perform (Recommended: 20)</param>
|
||||||
|
/// <param name="dt">Delta Time - The time between steps</param>
|
||||||
|
/// <param name="diff">Fluid diffusion rate</param>
|
||||||
|
/// <param name="visc">Fluid viscosity</param>
|
||||||
|
public void navierStokes(int rounds, double dt, double diff, double visc)
|
||||||
|
{
|
||||||
|
nsSimulate(this.h, rounds, dt, diff, visc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue