Javascript 我对这个流体动力学计算有什么误解?

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[

最后一个问题因过于简短和模糊而被删除,因此这次我将尽量详细

我正在使用Javascript实现一个基本的物理精确的SPH跟踪。在开始的时候,我只想让基础工作起来,只想完成第一个算法

我从一个只有两个粒子的测试用例开始,分别是(0.05,0.05)和(0.06999,0.05)。他们的样本半径刚刚接触,我已经得到了奇怪的数字

这是我计算密度和压力的方法:

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;
}