CFD 3Dシンプルな氎シミュレヌタヌ









はじめに



CFD蚈算流䜓力孊 -蚈算流䜓力孊。

液䜓のさたざたなプロセスず、さたざたな皮類の液䜓たずえば、蜂蜜、オむル-これらはすべお液䜓のシミュレヌションに䜿甚されたす。



この投皿では、衚面が開いお障害物がある通垞の氎の2Dシミュレヌタヌを怜蚎したす3Dバヌゞョンでは、すべおが同様であり、 ゜ヌスコヌドが利甚可胜です。

氎面は氎ず空気を分離する境界であり、これにより波、氎滎などをシミュレヌトできたす。



いく぀かの理由でシミュレヌタヌを䜜成するこずにしたした。 それらの1぀は、むンタヌネット䞊の䞻題に関する適切に蚘述された゜ヌスの欠劂です。 私が芋぀けたのは、Fortranたたは2dのみでした。



そのため、シミュレヌタの䞻な機胜





蚈算の芳点から、私はNavier-Stokesの方皋匏およびむンタヌネットで芋぀かった゜ヌスから始めたした。

これは、粘性のある非圧瞮性流䜓の運動を蚘述する偏埮分方皋匏のシステムです。 定矩䞊、すべおの液䜓は非圧瞮性であるため、ここで非圧瞮性ずいう蚀葉はダニに䌌おいたす。 粘床は、個々の粒子間の摩擊を瀺し、割り圓おられたボリュヌム党䜓を埋めるずきに、ガスの堎合のように、粒子が異なる方向に散乱するのを防ぎたす。 液䜓粒子は、できるだけ䞀緒にくっ぀きたす。



私のシミュレヌタヌでは、わずかに修正された方皋匏のセットを䜿甚したしたが、以䞋でさらに詳しく説明したす...



流䜓力孊方皋匏



したがっお、䞀般的なベクトル圢匏の基本的なナビ゚ストヌクス方皋匏は次のずおりです。



ここに



最初の方皋匏は運動方皋匏、2番目は連続方皋匏です。

運動方皋匏は、右にあるニュヌトン方皋匏ma = Fに䌌おいたす-流䜓に䜜甚する力の合蚈-これは圧力、拡散、重力です...



2Dバリアントの堎合、方皋匏は次の圢匏を取りたすここでは、これらは既に無次元圢匏で提瀺されおいたす。







運動方皋匏は、2぀の速床成分-uおよびvの2぀の方皋匏で衚されたす。

新しい係数に関しお、Reはレむノルズ数無次元倉数に切り替えたずきに刀明であり、2぀の前の係数係数をすぐに眮き換えたす。 密床ず粘床。 それは氎がどのように芋えるかによっお異なりたす-蜂蜜や普通の氎のように Reが倚ければ倚いほど、液䜓は通垞の氎に䌌おいたす。

括匧内は、液䜓の粘性挙動たたは拡散を定矩する衚珟です。 右偎の残りの甚語重力を陀くは察流です。 巊偎-速床ず圧力。



次に、これらの方皋匏を少し単玔化したした。







ご芧のように、察流は消滅し、液䜓の挙動がわずかに悪化したすが、党䜓的には芖芚的には非垞に正垞に芋えたす。さらに、察流を適切に離散化するために、特別なスキヌムが䜿甚されたす-これはかなり面倒に芋えたす。



方皋匏を解くずき、Splittingず呌ばれる特別なスキヌムが䜿甚されたす。これに぀いお詳しく説明したいず思いたすが、これは別の投皿の可胜性が高くなりたす。

Bridson R. Fluid Simulation for Computer Graphics.pdfの「数倀シミュレヌションの抂芁」。

そしお、流䜓力孊の数倀シミュレヌションGriebel M Dornseifer T Neunhoeffer T SIAM 1998



分割方皋匏の解法は次のずおりです。







時間ステップでは、オむラヌ法が䜿甚されたす。最初のステップでも、圧力を䞋げお、速床FずGの䞭間蚈算を取埗したす。これらの速床は、圧力を考慮しないこずに加えお、連続方皋匏も満たしたせん。 トリッキヌな操䜜により、圧力を蚈算する方皋匏が芋぀かりたす。これにより、連続方皋匏の問題も解決されたす。 すでに蚈算されたFずGからこの方皋匏を解くず、新しい圧力Pが芋぀かりたす。

次に、3番目のステップで、蚈算された圧力を考慮しお速床が修正されたす。

これにより、1぀の完党なタむムステップが完了し、次のステップですべおが新たに繰り返されたす。



方皋匏の離散化



方皋匏を離散化するために、有限差分法が䜿甚されたす。 時間ステップでは、暙準のオむラヌ法が䜿甚されたす-抂略的には次のようになりたすun + 1= un+ dt * f、

ここで、fは、時間差を含たない方皋匏の党䜓ずしお理解されたす。



䞀般的に、新しい瞬間un + 1の速床倀は、前の瞬間unの倀から求められたす。

この投皿では方皋匏の離散的な類䌌䜓に぀いおは説明したせんが、これは流䜓力孊の数倀シミュレヌションGriebel M Dornseifer T Neunhoeffer T SIAM 1998で非垞によくできおいたす。



離散方皋匏を解くために䜿甚されるのは、解のマトリックス法ではなく、反埩ガりスザむデル法です。 行列の予備的な組み立おを必芁ずせず、䞀般に䞭間配列を必芁ずしたせん。蚈算スキヌムを簡単に倉曎できたす。おおよその解法は1回の反埩埌に既にあり、シミュレヌション党䜓を倧幅に加速したす。



この投皿では、2Dケヌスを怜蚎したす。䞻な重点は境界条件の説明です。 それらは方皋匏を解くのに最倧の困難を匕き起こしたす。 シミュレヌトされた領域党䜓が、氎平方向のimaxポむントず垂盎方向のjmaxポむントに分割されたす。 imax * jmaxセルのグリッドになりたす。

4぀の境界線から境界点が远加されたす。 合蚈で、サむズimax + 2*jmax + 2の配列が取埗されたす。



各セルには、速床ず圧力の独自の倀がありたす-蚈算グリッド䞊のベクトル速床堎ずスカラヌ圧力堎に぀いお話すのが慣習です。

Uはxのセル内の粒子速床です

Vは、yのセル内の粒子速床です。

P-圧力



通垞、蚈算された倉数U、V、Pをセルの䞭心に配眮するのが䞀般的ですが、流䜓モデリングの堎合、これは垞に゜リュヌションに問題を匕き起こしたす-完党に正しくなく振動しおいるこずが刀明したした。 そのため、CFDはスタッガヌドグリッドを䜿甚したす-リヌプフロッグずも呌ばれたす。







図から、速床はセル自䜓ではなく、セルの面、u-セルの右境界線、v-䞊郚境界線にあるこずがわかりたす。



壁の境界条件



差分法で蚈算するには、蚈算グリッドの境界に倀u、v、pを蚭定する必芁がありたす。これらは巊から䞋、右䞊の4぀の壁です。境界条件は、滑り止めタむプずフリヌスリヌプタむプです。 他のタむプもありたすが、これらは䞀般的な蚈画ではなく、より専門的な条件です。



フリヌスリヌプ -これは、液䜓が壁に沿っお自由に滑るこずを意味したす。たるで摩擊がなく、液䜓がそれに沿っお動くのを劚げるものがないかのように。

この投皿では、このタむプの境界条件は考慮したせん。



滑り止めは粘着状態です。぀たり、液䜓が壁にぶ぀かるず速床が䜎䞋したす。

これは、流䜓速床が壁速床ず䞀臎するこずを意味したす぀たり、この䟋では、固定境界でれロに等しい。



たずえば、右偎の境界のみを考えたす。速床= 0のuコンポヌネント。 それは壁に垂盎であり、氎は境界を貫通しおはいけたせん。

滑りのない境界の堎合のvコンポヌネントも0ですが、スタッガヌドメッシュの堎合は修正する必芁がありたす。vコンポヌネントの堎合、vが盎接境界にないため、匏をわずかに修正する必芁がありたす。

壁のvは、最埌の2぀のセル間の平均に等しくなりたす。 v_g =v [imax + 1] [j] + v [imax] [j]/ 2

v_gはれロv [imax + 1] [j] + v [imax] [j]/ 2 = 0であり、ここからプログラムで蚭定する必芁がある倀v [imax + 1] [j]を芋぀けたす。

v [imax + 1] [j] =-v [imax] [j];

䞊限のuコンポヌネントにも同じこずを行う必芁がありたす。







配列では、4぀の境界線が次の座暙で衚されたす。



巊壁



u [0] [j]、jは壁党䜓を走りたす

v [0] [j]



コヌドでは次のようになりたす。

for (j = 0; j <= jmax + 1; j++) { U[0][j] = 0.0; V[0][j] = -V[1][j]; }
      
      







底壁



u [i] [0]

v [i] [0]



 for (i = 0; i <= imax + 1; i++) { U[i][0] = -U[i][1]; V[i][0] = 0.0; }
      
      







右壁

間隔を空けたグリッドがあるため、右の壁には、最埌の列ではなく最埌から2番目の列に沿っお通過するuの倀の境界がありたす。したがっお、セルのUの倀をU [imax] [j]に蚭定したす。



u [imax] [j]

v [imax + 1] [j]



 for (j = 0; j <= jmax + 1; j++) { U[imax][j] = 0.0; V[imax + 1][j] = -V[imax][j]; }
      
      







䞊壁

ここで、vの倀の堎合、境界は最埌から2番目の線jmaxに沿っお走るので、セルのVの倀を蚭定したす-V [i] [jmax]



u [i] [jmax + 1]

v [i] [jmax]



 for (i = 0; i <= imax + 1; i++) { U[i][jmax + 1] = -U[i][jmax]; V[i][jmax] = 0.0; }
      
      







メむン゜ルバヌをテストするために、すべおの境界倀= 0を蚭定できたす。



たた、境界に圧力をかける必芁がありたす。圧力は、速床ずしお゚ッゞではなくセルの䞭倮に蚭定されたす。したがっお、非垞に簡単です。境界の圧力は、隣接するセルず同じに蚭定できたす。隣接するセルから倀をコピヌするだけです。



 for (j = 1; j <= jmax; j++) { //   P[0][j] = P[1][j]; //   P[imax + 1][j] = P[imax][j]; } for (i = 1; i <= imax; i++) { P[i][0] = P[i][1]; P[i][jmax + 1] = P[i][jmax]; }
      
      







障害物の境界条件



障害物はフラグC_Bで衚されたす。 それらの境界条件は、倖壁の堎合ず同じ原理で蚭定されおいたす。圧力の蚭定の2぀の䟋を瀺したす。



 if (IsObstacle(i, j)) { //     -  -    P   if (IsFluid(i, j - 1)) { P[i][j] = P[i][j - 1]; } //   -  ... else if (IsFluid(i - 1, j)) { P[i][j] = P[i - 1][j]; } // ....... }
      
      







倖呚セルの堎合、呚囲の氎セルの倀の平均を取埗し、たずえば障害物を取埗するず、その巊䞊に氎があるため、次のように障害物セルの圧力を考慮したす。



 if (IsFluid(i - 1, j) && IsFluid(i, j + 1)) { P[i][j] = (P[i][j + 1] + P[i - 1][j]) / 2; }
      
      







衚面の境界条件



衚面ずその動きは、粒子を䜿甚しおモデル化されたす。 このセクションで説明されおいるように䜜成された、衚面に境界条件を持぀゜ヌスは、simpletestobstacleフォルダヌにありたす。



最初に、粒子はセルごずに4個ず぀セルごずに液䜓で配眮されたす各コヌナヌ近くに1個。 次に、各ステップでの粒子は、叀兞力孊からの単玔なオむラヌ法を䜿甚しお移動したす。 移動の速床は、セル党䜓の平均ずしお各セルで取埗されたすただし、補間などを䜿甚しおも問題ありたせん。



  x = particles[k].x; y = particles[k].y; //        i = (int)(x / delx); j = (int)(y / dely); u = U[i][j]; v = V[i][j]; //        x += delt * u; y += delt * v;
      
      







各ステップで、粒子のあるセルは氎ずしおラベル付けされ、残りは空のセルであり、基本倉数u、v、pは蚈算されたせん。



䞻な倉数を蚈算するには、壁に必芁なのず同じように、衚面ず隣接するセルに境界条件を蚭定する必芁がありたす。 しかし、最初に、氎ずラベル付けされた现胞のうち、どの现胞が衚面に属し、たたどの偎から空気が入っおいるかを刀断する必芁がありたす。 これらの目的のために、FLAGずFLAGSURFの2぀のアレむが䜿甚されたす。 1぀目は、セルタむプ氎、空気空、障害物のみが指定されおいたす。 察応するフラグは次のずおりです略語B-境界F-流䜓E-空



 public const int C_B = 0x0000; // public const int C_F = 0x0010;// public const int C_E = 0x1000;//
      
      







FLAGSURF配列は、衚面のセルを決定するために䜿甚され、残りのセルでは、そこの倀= 0です。 この配列のフラグは、セルのタむプだけでなく、空の隣接セルのすべおの組み合わせも決定したす。 フラグは、結合できるように暙準ビットマスクずしお䜜成されたす。

FLAGSURFの各倀には、4蟺隣接セルに察応する4ビットが含たれおいたす。

ビットが1に蚭定されおいる堎合、察応する隣接セルで-空。 0の堎合-氎がありたす。

ビット0000 NSWO 0000 0000-文字は、N北北S南南W西東およびO西の4぀の偎面を瀺したす。



フラグのリスト党䜓が゜ヌスにあるため、倀のいく぀かの䟋を瀺したす。



public const int C_W = 0x0200; // 512

バむナリでは、倀は0000 0010 0000 0000のようになりたす

ここで、サむドWに察応するフラグは1に蚭定されたす。これは、珟圚のセルの巊偎が空であるこずを意味したす。

同時に、残りの3ビットは0に蚭定されたす。これは、残りの隣接セルが氎で満たされるこずを意味したす。







public const int C_SW = 0x0600; // 1536 0000 0110 0000 0000

ここでは、WずSの䞡偎に察応するフラグが1に蚭定されおいたす。したがっお、珟圚のセルの巊ず䞋は空で、残りのセルは氎です。







衚面セルのタむプを決定し、FLAGSURF配列を埋めるずき、察応するビットはこの方法で1に蚭定されたす。



 //   ,      1 if (FLAG[i-1][j] == GG.C_E) FLAGSURF[i][j] = FLAGSURF[i][j] | GG.C_W;
      
      







FLAGSURF配列は、䞻に衚面の境界条件を蚭定するためにのみ必芁です。 衚面セルの皮類が異なるず、異なる境界条件が適甚されるためです。 既に述べたように、衚面セルの隣にある空のセルに境界条件を眮く必芁がありたす。たた、衚面セル自䜓にも境界条件が必芁です。グリッドがずらされおおり、すべおの衚面セルがuv倉数の蚈算に含たれないためです。



倀を蚭定する原理は簡単です。 なぜなら 空気圧は氎圧よりも1000倍䜎い-速床を制限せず、移動方向を倉えるこずなく、氎を無芖しお氎面に沿っお自由に移動させるこずができたす。 もちろん、私のスキヌムでは、衚面匵力は考慮されおいたせん。そうでなければ、すべおがはるかに耇雑になりたす。



衚面のセルずそれらに接する空のセルの速床UずVの倀を、栌子がずれおいるこずを忘れずに蚘録したす。

配眮の倀は、隣接する氎セルから取埗されたすが、耇数のセルが存圚する可胜性があるため、どの隣接セルからこれを取埗するかを決定するだけです。







これは、貌り付ける必芁のある境界条件を含む画面です。青い四角は氎です。 黒いマヌクは、必芁な境界条件です。 ラベルの䞀郚は衚面セルに、䞀郚は空のセルに配眮されおいるこずに泚意しおください。 これは、゜ルバヌコヌドには次のような条件があるために発生したすご芧のずおり、UVは右境界壁の前のセルで蚈算されたせん。



  if (IsFluid(i, j) && IsFluid(i+1, j)){ F[i][j] = ... }
      
      







いく぀かの䟋を芋おみたしょう。



フラッグケヌゞC_SW



  case GG.C_SW: { U[i][j - 1] = U[i][j]; V[i][j - 1] = V[i][j]; U[i - 1][j] = U[i][j]; V[i - 1][j] = V[i][j]; } break;
      
      







ここでは、セル自䜓の倀は必芁ありたせん-゜ルバヌで蚈算されたす。 ただし、隣接する空のセルに倀が必芁です-なぜなら ゜ルバヌにはU [i] [j-1]などの項がありたす。



これらの空のセルに最も近い氎セルは、そこからのセル[i] [j]であり、UずVの倀が取埗されたす。

図から、V [i-1] [j]の倀は、セル[i] [j]ず[i-1] [j + 1]の䞡方から取埗できるこずがわかりたすが、䞀般的な堎合、セル[ i-1] [j + 1]は非氎である可胜性があり、その䞭のVの倀も境界である可胜性があり、ただ䞋に眮かれないため、正しいオプションは[i] [j]です。 。



フラッグケヌゞC_W



  case GG.C_W: { U[i - 1][j] = U[i][j]; V[i - 1][j] = V[i][j]; } break;
      
      







ここではすべおが䌌おいたす。



フラグがC_NWのセル





  case GG.C_NW: { V[i][j] = V[i][j - 1]; U[i - 1][j] = U[i][j]; } break;
      
      







ここで、セル自䜓のUの倀は゜ルバヌで蚈算されたす。 圌女の右偎に氎槜がありたす。 ただし、䞊のセルは空であるため、Vを䞋げる必芁がありたす。たた、U [i-1] [j]を蚭定する必芁がありたす。 U [i-1] [j]。



前の堎合ず同じように、V [i] [j]からではなく、セルV [i] [j-1]から倀V [i] [j]を取埗したす。V[i-1の倀] [j]は境界であり、ただ知られおいないこずが刀明する堎合がありたす。



空のセルず衚面セルの圧力を0に蚭定したす。これは完党に正しいわけではありたせんが、機胜したす。

衚面セルでは、圧力の方皋匏を解くずきにこれらのセルは境界であり、圧力蚈算はセル内で盎接実行されないため、圧力が必芁です。



粒子のみの流䜓運動アルゎリズム



゜ヌスには、タむトルにトラックずいう名前のオプションがありたす。 これは、粒子が液䜓党䜓ではなく衚面自䜓のみを移動する自由衚面を移動する方法です。 これは、VOFメ゜ッドに倚少䌌おいたすが、衚面の予備的な再構築がそこで行われ、かなり面倒です。 私の方法では、粒子がセルを離れるず、空のマヌクが付けられ、粒子のない近くの液䜓セルに粒子が远加されたす-衚面がどこにあるかがわかりたす。 粒子が空のセルに入る堎合、セルは液䜓ずしおマヌクされたす。 もちろん、この方法には䞍正確な郚分がかなりありたすが、高速であり、耇雑なコヌディングを必芁ずしたせん。



暗黙的な蚈算スキヌム



゜ヌスには暗黙的な゜ルバヌのバヌゞョンもありたす-速床の方皋匏に適甚されたす。明瀺的なバヌゞョンずのコヌドの違いは最小限です。 サンプリングするずき、UおよびV [i] [j]を含むすべおの項は、明瀺的なように右ではなく方皋匏の巊偎に移動したす。暗黙的暗黙的スキヌムを䜿甚するず、明瀺的には䞍可胜な倧幅に倧きな時間ステップを䜿甚できたす。

暗黙的に぀いおは、 http//math.mit.edu/cse/codes/mit18086_navierstokes.pdfで読むこずができたす。



3Dバヌゞョン



3Dバヌゞョンでは、すべおが2Dずの類掚によっお行われたす。

F1-F8 + WASDキヌ、矢印、ER PgUp PgDownを制埡しおカメラを回転させたす。

氎源があるシヌンの堎合-Pキヌ-氎圧をオフにしたす。

G-より良い衚面レンダリング立方䜓の代わりに球が䜿甚されたすが、ひどく遅くなりたす。

Demosフォルダヌ-xmlファむル圢匏のシヌンずパラメヌタヌサむズ、タむムステップ、重力、セルあたりのパヌティクル数がありたす。 HeightMap高さのマップをペむントでペむントするこずもできたす。サむズは任意です-自動サむズ倉曎がありたす。



結論ずしお、2Dおよび3Dのスクリヌンショットを提䟛したす。











残りのスクリヌンショットはこちら
























゜ヌスはここsourceforgeです。



゜ヌスにあるプロゞェクト
すべおがVisual Studio 2010で曞かれおいたす

-アダプティブメッシュリファむンメント -セルはより小さな郚分に分割され、これらのドヌタヌセルでもカりントされたす

すべおの倉数。䞀方、倧きなセルは、区別されるず嚘セルに隣接したす。

fluid2subcell *

-暗黙バヌゞョン

fluide2dimplicit \およびfluide2dimplicitfree \

-プログラムは 、叀いバヌゞョンを削陀せずに他のバヌゞョンず簡単に亀換できるモゞュヌルに分割されおいたす

fluide2dmodule \

-氎の動きは、衚面䞊の粒子のみの動きによっお実珟されたす

fluide2dtrack *

-この投皿で説明されおいる、衚面䞊の明瀺的な方法ず境界条件を持぀䜜業バヌゞョン

simpletestobstacle \

-無次元のReの代わりに-氎の密床ず粘床の実際の係数が䜿甚され 、

これにより、方皋匏を解くずきに、UVPアレむの実際の速床ず実際の圧力をすぐに取埗できたす。

simpletestobstaclereal \

-有限ボリュヌムフォルダヌ内のすべおがこのメ゜ッドに適甚されたす

本から䜜られた

蚈算流䜓力孊の玹介有限䜓積法Versteeg HK Malalasek



-珟圚3D

-最も簡単なオプション-衚面ず障害物なし

SimpleFluid3D \

-C ++のすべおを備えた最新バヌゞョン

fluid3dunion \

-7倍のGeForce 550アクセラレヌションで、OpenCLで蚘述されたGPU氎のみのオプション特にGPUの最適化なし

fluid3clsimple \

-fluid3dunionにあるものの非垞に初期のバヌゞョン -バヌゞョンは機胜しおいたすが、cには倚くの欠点がありたす。

fluide3tao





関連リンク
良い蚘事はこちらKalland_Master.pdf

流䜓力孊に぀いお簡単に運動方皋匏



曞籍

-Griebel M Dornseifer T流䜓力孊の数倀シミュレヌションSIAM 1998

//特にこの本に泚目したす。実際はすべお私から始たったもので、その゜ヌスコヌドは簡単に芋぀かりたすが、cfd実装のより良い説明はただ芋぀かりたせん。



-コンピュヌタヌグラフィックス向けBridson R. Fluid Simulation

-アンダヌ゜ンJDJr蚈算流䜓力孊アプリケヌションの基瀎MGH 1995

-チャヌルズハヌシュ-内郚および倖郚フロヌの数倀蚈算2007

-Gretar Tryggvason気液混盞流の盎接数倀シミュレヌション

-Versteeg HK Malalasek蚈算流䜓力孊入門有限䜓積法



どこにいおも、すべおの本を芋぀けるこずができたす。





PS CFDに粟通しおいる人がいる堎合、゜リュヌションの速床ず正確さの点で特にサヌフェスのモデリングの堎合このプロゞェクトを䞀緒に改善するこずは興味深いでしょう。

私自身はレンダリングを倚少レンダリングできたすが、数孊ず物理孊は私の䞻な分野ではありたせん。 コメントや圹立぀ヒントを喜んでお届けしたす。



All Articles