下面是一些代碼來進一步解釋。
insideBound是陣列(1 - 邊界,0 - 空,流體可通過槽)
#define FOR_EACH_CELL for (i=1 ; i<=N ; i++) { for (j=1 ; j<=N ; j++) {
void set_bnd (int N, int b, float * x, int * insideBound)
{
int i, j;
float sum;
int count;
for (i=1 ; i<=N ; i++) {
x[IX(0 ,i)] = b==1 ? -x[IX(1,i)] : x[IX(1,i)];
x[IX(N+1,i)] = b==1 ? -x[IX(N,i)] : x[IX(N,i)];
x[IX(i,0 )] = b==2 ? -x[IX(i,1)] : x[IX(i,1)];
x[IX(i,N+1)] = b==2 ? -x[IX(i,N)] : x[IX(i,N)];
}
x[IX(0 ,0 )] = 0.5f*(x[IX(1,0 )]+x[IX(0 ,1)]);
x[IX(0 ,N+1)] = 0.5f*(x[IX(1,N+1)]+x[IX(0 ,N)]);
x[IX(N+1,0 )] = 0.5f*(x[IX(N,0 )]+x[IX(N+1,1)]);
x[IX(N+1,N+1)] = 0.5f*(x[IX(N,N+1)]+x[IX(N+1,N)]);
if (!b) return;
FOR_EACH_CELL
sum = 0.0f;
count = 0;
if (insideBound[IX(i,j)] == 1)
{
if (insideBound[IX(i-1,j)] != 1)
{
count++;
sum = sum + x[IX(i-1,j)];
}
if (insideBound[IX(i+1,j)] != 1)
{
count++;
sum = sum + x[IX(i+1,j)];
}
if (insideBound[IX(i,j-1)] != 1)
{
count++;
sum = sum + x[IX(i, j-1)];
}
if (insideBound[IX(i,j+1)] != 1)
{
count++;
sum = sum + x[IX(i, j+1)];
}
if (count > 0)
{
x[IX(i,j)] = -sum/count;
} else {
x[IX(i,j)] = 0;
}
}
END_FOR
}
每書(工作):
在第一循環的頂部設置,右,下並留下邊界細胞。 因爲對於他們來說只有一個沒有綁定的相鄰單元格獲得它的值。 (我不知道爲什麼它與U相反,V相同)
第一次循環後,設置角邊界值。在這裏,他們從它們的相鄰單元得到平均值(我猜想,因爲沒有相鄰單元不是他們使用邊界單元的邊界)。
礦,不能正常工作:
如果(B!)的回報 - 忽略了密度和僅更新速度計算。
循環計算所有邊界單元格的值(同樣,本身不是邊界的相鄰單元格的平均值)。 我從這個方法中得到了幾乎現實的結果,但是密度和流體消失完全的邊界過大的一些錯誤有很大的損失。
請問您能詳細解釋一下嗎?本文定義了'set_bnd'。你的代碼應該爲哪些單元格做什麼?據我所知,與邊界單元相鄰的單元(意思是至少有一個面等同於牆邊界的單元)不應該被專門處理。 – EverythingRightPlace