2013-10-10 51 views
1

我使用這個article來編寫一個流體模擬應用程序。 我無法實現內部邊界。據我所知,當我設定的邊界(在set_bnd功能),選擇那些是邊界內我應該從相鄰的非邊界單元這樣計算的平均值的每個小區:內邊界

for (i = 0 ; i < n ; i++) 
{ 
    for (j = 0 ; j < n ; j++) 
    { 
    if (isBoundary(i,j) 
    { 
     sum = 0; 
     count = 0; 
     if (!isBoundary(i+1,j) { 
      sum += x[i+1][j]; 
     } 
     if (!isBoundary(i-1,j) { 
      sum += x[i-1][j]; 
     } 
     if (!isBoundary(i,j+1) { 
      sum += x[i][j+1]; 
     } 
     if (!isBoundary(i,j-1) { 
      sum += x[i-1][j]; 
     } 
     x[i][j] = sum/4; 
    } 
    } 
} 

不幸的是,煙霧被吸收並與邊界面接觸而消失。
我的數學背景不足以理解計算的每個部分,因此如果有人指出我正確的方向,我將非常感激。

+0

請問您能詳細解釋一下嗎?本文定義了'set_bnd'。你的代碼應該爲哪些單元格做什麼?據我所知,與邊界單元相鄰的單元(意思是至少有一個面等同於牆邊界的單元)不應該被專門處理。 – EverythingRightPlace

回答

0

下面是一些代碼來進一步解釋。
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!)的回報 - 忽略了密度和僅更新速度計算。
循環計算所有邊界單元格的值(同樣,本身不是邊界的相鄰單元格的平均值)。 我從這個方法中得到了幾乎現實的結果,但是密度和流體消失完全的邊界過大的一些錯誤有很大的損失。

0

我設法找到一個解決方案,在這裏它是潛在的人同樣的問題

void set_bnd (int N, int b, float * x, int * insideBound) 
{ 
    int i, j; 
    float sum, tmp; 
    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 (i=1 ; i<=N ; i++) { 
     for (j=1 ; j<=N ; j++) { 
      sum = 0.0f; 
      count = 0; 
      if (insideBound[IX(i,j)] == 1) 
      { 
       if (insideBound[IX(i-1,j)] != 1) 
       { 
        count++; 
        if (b == 2) 
         tmp = -x[IX(i-1,j)]; 
        else 
         tmp = x[IX(i-1,j)]; 

        sum = sum + tmp; 
       } 

       if (insideBound[IX(i+1,j)] != 1) 
       { 
        count++; 
        if (b == 2) 
         tmp = -x[IX(i+1,j)]; 
        else 
         tmp = x[IX(i+1,j)]; 
        sum = sum + tmp; 
       } 

       if (insideBound[IX(i,j-1)] != 1) 
       { 
        count++; 
        if (b == 1) 
         tmp = - x[IX(i, j-1)]; 
        else 
         tmp = x[IX(i, j-1)]; 
        sum = sum + tmp; 
       } 

       if (insideBound[IX(i,j+1)] != 1) 
       { 
        count++; 
        if (b == 1) 
         tmp = -x[IX(i, j+1)]; 
        else 
         tmp = x[IX(i, j+1)]; 
        sum = sum + tmp; 
       } 

       if (count > 0) 
       { 
        x[IX(i,j)] = -sum/count; 
       } else { 
        x[IX(i,j)] = 0; 
       } 
      } 
     } 
    } 
} 

insideBound是布爾陣列(0,1),這表明有邊界的細胞。與一個或多個邊界區域一起工作,但它們應該至少3個單元寬和高。