Javascript 我对这个流体动力学计算有什么误解?
最后一个问题因过于简短和模糊而被删除,因此这次我将尽量详细 我正在使用Javascript实现一个基本的物理精确的SPH跟踪。在开始的时候,我只想让基础工作起来,只想完成第一个算法 我从一个只有两个粒子的测试用例开始,分别是(0.05,0.05)和(0.06999,0.05)。他们的样本半径刚刚接触,我已经得到了奇怪的数字 这是我计算密度和压力的方法:Javascript 我对这个流体动力学计算有什么误解?,javascript,math,simulation,fluid,Javascript,Math,Simulation,Fluid,最后一个问题因过于简短和模糊而被删除,因此这次我将尽量详细 我正在使用Javascript实现一个基本的物理精确的SPH跟踪。在开始的时候,我只想让基础工作起来,只想完成第一个算法 我从一个只有两个粒子的测试用例开始,分别是(0.05,0.05)和(0.06999,0.05)。他们的样本半径刚刚接触,我已经得到了奇怪的数字 这是我计算密度和压力的方法: for (var i = 0; i < particles.length; i++) { var pi = particles[
for (var i = 0; i < particles.length; i++)
{
var pi = particles[i];
pi.density = 0;
for (var j = 0; j < pi.neighbors.length; j++)
{
var n = pi.neighbors[j];
var pj = n.p;
var h = (pi.sampleDist + pj.sampleDist) / 2;
n.r = subv(pi.pos, pj.pos); // subv() subtracts first vector from second
n.dist = length(n.r);
n.q = n.dist/h;
pi.density += pj.mass * W(n.q, h, 2);
}
pi.pressure = pi.stiffness * (Math.pow(pi.density / pi.restDensity, 7) - 1);
}
函数值梯度(pi,A)//A是标量
{
var vA={x:0,y:0};
对于(var j=0;j
功能VW(n,h)
{
var dw=
dW(n.q,h,2)
/(n.dist*h);
返回{
x:dw*n.r.x,
y:dw*n.r.y};
}
函数dW(q,h,d)//核的导数
{
var f=0;
如果(0)sqr
函数在做什么?为什么不直接使用Math.pow
?不知道,我想是更简洁易读一点吧。。。
function W(q, h, d)
{
var f = 0;
if (0 <= q && q < 1) f = 2/3 - sqr(q) + 1/2*cube(q); // 2/3 - q² + 1/2q³
else if (1 <= q && q < 2) f = 1/6 * cube(2 - q); // 1/6(2-q)³
return 3/Tau / Math.pow(h, d) * f;
}
var Fp = {x:0, y:0};
if (pi.density !== 0)
{
var Vp = valueGradient(pi, 'pressure');
Fp.x = -pi.mass/pi.density * Vp.x;
Fp.y = -pi.mass/pi.density * Vp.y;
}
function valueGradient(pi, A) // A is a scalar
{
var vA = {x: 0, y: 0};
for (var j = 0; j < pi.neighbors.length; j++)
{
var n = pi.neighbors[j];
var pj = n.p;
var h = (pi.sampleDist + pj.sampleDist) / 2;
var f = pj.mass / pj.density * pj[A];
var vw = VW(n, h);
vA.x += f * vw.x;
vA.y += f * vw.y;
}
return vA;
}
function VW(n, h)
{
var dw =
dW(n.q, h, 2)
/ (n.dist * h);
return {
x: dw * n.r.x,
y: dw * n.r.y };
}
function dW(q, h, d) // derivative of kernel
{
var f = 0;
if (0 <= q && q < 1) f = -2*q + 3/2*sqr(q); // -2q + 3/2q²
else if (1 <= q && q < 2) f = -1/2 * sqr(2 - q); // -1/2(2-q)²
return 3/Tau / Math.pow(h, d) * f;
}