我最近一直在开发一个JS程序,为这篇学术文章建模。我最近遇到的问题是:
表面张力通常是由颗粒之间的吸引力引起的。在流体内部,这种吸引力会被抵消,但对于分子来说在表面附近,相邻分布的不对称性导致朝向流体的非零净力。"
我假设这在双密度弛豫方法中自然发生,但我的程序似乎没有显示出任何迹象
以下是双密度弛豫方法的摘录:
function doubleDensityRelaxation() {
for(var i = 0; i<particles.length; i++) {
var pi = particles[i];
var p = 0;
var pNear = 0;
for(var j = i+1; j<particles.length; j++) {
var pj = particles[j];
var rij = sub(pi.r,pj.r);
var q = length(rij)/h;
if(q < 1) {
p += (1-q)*(1-q);
pNear += (1-q)*(1-q)*(1-q);
}
}
var P = k*(p-p0);
var PNear = kNear*pNear;
var dx = [0,0];
for(var j = i+1; j<particles.length; j++) {
var pj = particles[j];
var rij = sub(pi.r,pj.r);
var q = length(rij)/h;
if(q < 1) {
var D = scale(normalize(rij), dtsq*(P*(1-q)+PNear*(1-q)*(1-q)));
pj.r = add(pj.r,scale(D,0.5));
dx = sub(dx,scale(D,0.5));
}
}
pi.r = add(pi.r,dx);
}
}
这里有一种更像可识别的低粘度流体。这种模拟在数值上似乎很不稳定,帧速率越低越不稳定。
我发现你的代码有一些问题。
-
当我阅读这篇论文时,Lij是跨时间步长保留的弹簧长度的三角形矩阵的元素;gamma和alpha控制其变化的速率。这个矩阵没有保留在你的原始代码中,所以粘弹性根本不起作用。
-
粒子间碰撞是不必要的,而且实际上会进一步破坏模拟的稳定性。粘度通道中的贝塔提供了这种排斥力。
-
p0/k的比率不能太低,否则你会以快速振荡坍缩团簇的形式得到不稳定性。当簇确实破裂时,单个粒子会像失控的Flubber球一样从墙上反弹。
-
墙壁仍然存在一些问题:即使我做了一些调整,粒子也倾向于沿着它们排列成一列,新粒子被迫进入底部,而旧粒子则从顶部喷出,在流体中形成一种双漩涡。
-
我正在尝试设置弹簧长度的下限,这有时可以稳定原本不稳定的参数集。我即兴猜测它所模拟的物理性质是膨胀行为。