我最近一直在研究模型this scholarly article.的JS程序。我最近遇到的问题是:
“表面张力通常是由颗粒之间的吸引力引起的。 在液体中,这种吸引力会抵消,但对于分子而言 在表面附近,邻居分布的不对称导致a 对流体的非零净力。“
我认为这种情况在双密度松弛法中自然发生,但我的program似乎没有显示出它的迹象。
以下是双密度松弛法的摘录:
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);
}
}
答案 0 :(得分:0)
Here's one表现得更像是一种可识别的低粘度液体。这种模拟似乎在数字上不稳定,而且帧速率越低。
我发现我认为您的代码存在一些问题。
在我阅读论文时,L ij 是跨时间步长保持的弹簧长度的三角矩阵的元素; gamma和alpha控制它变化的速率。该矩阵未保留在原始代码中,因此粘弹性不起作用。
粒子间碰撞是不必要的,实际上会进一步破坏模拟的稳定性。粘度传递中的β提供了排斥力。
p 0 / k的比率不能太低,否则会以快速振荡的崩溃簇的形式出现不稳定。当群集破裂时,你会得到单个粒子从墙壁上反弹,就像失控的Flubber球一样。
墙壁仍然存在一些问题:即使我做了调整,颗粒也会沿着柱子排成一排,新的颗粒被压在底部,因为旧的颗粒从顶部喷出,形成流体中有一种双涡旋。
我正在尝试设置弹簧长度的下限,这有时可以稳定其他不稳定的参数集。关于它建模的物理属性,我对袖口的猜测是dilatant行为。