dynamicsoar's log

主に研究関係のメモ

Dynamic meshing in Fluent

NB! UDF全般に関する事項は別記事に分けている: ANSYS Fluent の UDF についての自分用メモ - dynamicsoar's log

Dynamic Mesh

  1. Setup > General > Transient
  2. Setup > Dynamic Mesh > tick "Dynamic Mesh"
  3. Setup > Dynamic Mesh > "Create/Edit..."

Smoothing, Layering, Remeshing の3手法あり、相互に排他的ではなく併用可能。基本的には Smoothing と Layering で対処するが、メッシュの変形が大きすぎる場合は Remshing を使ってメッシュ品質を維持することになる。しかし、Remeshing が発生すると時間精度が1次までに制限される(Smoothing と Layering は2次)ので注意が必要。

Smoothing

Node の数を変えずに、位置のみ動かす方法のこと。まずこれを smoothing と呼ぶのが非常にわかりづらくて、マニュアル見るまで意味わかってなかった。Deformation の方がわかりやすくないか…?

メッシュスムージングでは,一般に回転よりも平行移動による境界運動の方がはるかに良好な結果を得ることができる.

とのこと。

  • Spring/Laplace/Boundary Layer
  • Diffusion
  • Linearly Elastic Solid

の3つの方法がある。

Diffusion か Solid で周期運動の場合は、TUI から基準位置を指定することで、サイクル間のメッシュ品質の一貫性を向上できるらしい。

Spring 以外は複数回 UDF を call する(可能性がある)!

UDF マニュアルをよく見ると(なぜか DEFINE_CG_MOTION のところに…)書いてあるのだが、smoothing の手法によって(具体的には spring 以外の場合、だと思う)、UDF が複数回(ていうか2回?)call されることがある。したがって、「現在の位置に+で速度かけるタイムステップを移動量として加える」みたいなことをやってると、実際よりも多く変形してしまう、という危険性がある。そのため、

NV_D( NODE_COORD(np), +=, dr);

というように増分をインクリメントするよりも、

NV_D( NODE_COORD(np), =, new_r_vec);

のように座標の絶対値を直接代入した方がよい。

Spring/Laplace/Boundary Layer

メッシュの node 間をつなぐ edge をバネとみなして、移動境界により変形するバネ群の釣り合いを反復計算によりで解いて、メッシュ位置を求める。Diffusion 法に比べると高速だが低品質で、基本的に tetra mesh にしか使えない(使うべきではない)。下の "Parameters" で、"Spring Constant Factor" から "Laplace Node Relaxation" までが有効になる。

Spring Constant Factor はデフォルトが1だが、これだと node が物体境界を超えることがあるらしい…(そういう図がマニュアルに載っている。どうみてもダメすぎる)。0だとそれはない。ということは基本は0から始めて小さめの値を目指すべきか。実際、チュートリアルでは 0.3 にしろとある。

Spring は tetra/triangle mesh 向きで、デフォルトでは "Elements" が "Tet in Tet Zones" になっている。もし tetra 以外も変形させたい場合は "All" を選べるが、多面体では特定の条件の下でないと「バネ」の仮定がうまくいかずにセルが大きく歪むことがあるらしい(条件はマニュアルに書いてある)。したがって、tetra 以外(多面体)には Diffusion が推奨されるとのこと。

Diffusion

拡散方程式を解いてメッシュを決める。Spring 法に比べると、計算負荷が高いが高品質。

下の "Parameters" で、"Diffusion Function" と "Diffusion Parameter" が有効になる。

マニュアルにいきなり

変形境界における境界条件は,メッシュが境界の接線方向に運動するよう定められる(つまり,垂直速度成分は消失する) [English] On deforming boundaries, the boundary conditions are such that the mesh motion is tangent to the boundary (that is, the normal velocity component vanishes)

と書いてある。なんだこれは…?意味が分かりづらいが、さすがに流れの境界条件を勝手に変えるという意味ではないと思うので、メッシュ (node) 位置を決めるための「拡散方程式を解くときの境界条件としては」ってことじゃないかと思う。

拡散率の指定には2種類あり、Diffusion Function から選ぶ。

  1. boundary-distance: Diffusion Parameter は 0 から 2 の範囲で指定する(上限は3だが0から2がよいとマニュアルにある)。デフォルトの0だと全体のメッシュが一様に変形する。1など大きくするにつれて、運動している境界付近では初期メッシュ形状が維持されて、運動境界から遠い場所でより大きなメッシュの変形が生じるようになる。回転境界運動の場合は1.5が推奨されている。
    • 標準境界距離(デフォルト):移動境界から最も近い "wall" boundary までの距離に応じて拡散係数が決まる
    • 一般化境界距離(TUIで設定可能):移動境界から最も近い boundary (any type) までの距離に応じて拡散係数が決まる
  2. cell-volume: Diffusion Parameter を1よりも大きくすると、「大きなセルほどより多く変形する(多くの変形を吸収する)」ようになる。なんかこっちの方が良さそうな気がするが、どうかな…。上限は3(それ以上を入れると怒られるので初めて分かる…)。

TUIからいくつかの設定が可能。

  • /define/dynamic-mesh/controls/smoothing-parameters/verbosity を 1 にするとスムージング残差が表示されるようになる
  • /define/dynamic-mesh/controls/smoothing-parameters/max-iteration で最大反復回数を変更できる。デフォルトは30になっている(バージョンによるかも)
  • /define/dynamic-mesh/controls/smoothing-parameters/relative-convergence-tolerance で相対残差許容量を変更できる。デフォルトはマニュアルには1.0e-4とあるが実際には1.0e-10になっていた(バージョンによるかも)。当然こんなに落ちるには多くの iteration が必要になる。適当にやったテスト計算では、30回では1e-5とか1e-7くらいまでしか落ちていないこともあった。もっとも、そこまで smoothing に気を使うよりも、変形が大きいなら remeshing しないとどうしようもないような気もするが…。

境界層 smoothing とは併用できない。

Linear Elastic Solid

メッシュを固体とみなして、境界移動にともなう弾性変形からメッシュ位置を求める(FEMを解くらしい)。下の "Parameters" で、"Poisson's Ratio" のみが有効になる。ポアソン比は -1.0 から 0.5 の間で指定可能。他に、TUIから最大反復回数と相対許容残差が指定できる。

Diffusion より更に計算負荷が高いが、場合によってはより高品質になるらしい。ただし、拡散の場合は距離やセル体積に応じて非一様な分布が実現できたのに対して、こちらは物性値を一定とみなしている。そのためだと思われるが、

回転境界運動と尖った角を伴うケースでは,境界距離に依存する拡散による拡散スムージングを使用した方が有利

とのこと。

これも境界層 smoothing とは併用できない。

Layering (Dynamic Layering)

Remeshing

メッシュを(局所的に or 全体的に)切り直す。Remeshing が発生(発動)すると、時間精度は1次までになってしまう。この時間精度の切替が発生したかどうかを知るためには、

/define/dynamic-mesh/transient-settings/verbosity

を1に設定すること(数字は何でもいいようだが、おそらく0 = OFF かそれ以外 = ON)。

  • Local Cell: tetra のみに効く
    • Local Face: Local Cell にプラスして併用可能なオプション。Local Cell なしにこれだけ選ぶことはできない。境界層メッシュの tetra & wedge に適用
  • Region Face
  • CutCell Zone
  • 2.5D

Local remeshing

ゾーン内のセル全部ではなく、特定のセルで指標(max/min lengthとskewness)が指定の範囲を超えた場合にそのセル付近のみをリメッシングする…のだと思われる。

Local Cell remeshing

おそらく最も基本的なリメッシング法。Max skewness の基準はデフォルトで 3D が 0.9, 2D が 0.7. 変更は可能だが 3D で 0.7 未満を指定すると、実行時に「そんなに小さくするのは非現実的やろ」と言って勝手に 0.7 に直される(先に言えよ…)。

リメッシングが行われるタイミングは2パタンある。Max skewness 基準のリメッシングは全ての時刻ステップに対して行われるが、length 基準の方は、Size Remeshing Interval で選んだ間隔で実行される。デフォルトは5.

基準値 (Parameters) について、version 19.2 の日本語マニュアルでは

Parameters グループボックスの初期値では目的とする結果はまず得られないため,これらのフィールドを編集する必要がある.

といった記述が追加されていた(version 18 ではなかった)。とりあえず Use Default を押せばわりといい感じになるので、そこから初めるのがよいようだ。

Local Face remeshing

Local Cell remeshing を選んだ場合に追加可能なオプション。セルではなく face(面)のリメッシング。

  1. Mesh Methods Settings ダイアログで、 Maximum Face Skewness の値を設定する。
  2. Dynamic Mesh Zones ダイアログで、Deforming または User-Defined の場合、Meshing Options タブの Remeshing Method 欄が選択可能になっているので、Local にチェックを入れて Maximum Skewness を設定する。どうやらここの Local というのは face だけに関係するようだ…?
追加の Local remeshing

というのがあるらしい。TUI で、

/define/dynamic-mesh/controls/remeshing-parameter/remeshing-after-moving?

で設定する。この追加の remeshing では Size Function は無視される。

Size Function

非常に分かりづらいしよくわからないのだが、マニュアルによると、

要約すれば,サイズファンクションは,すべての境界フェース上(静止境界と移動境界の両方)におけるすべてのメッシュサイズの距離加重平均である.

とのこと。

Cell Zone remeshing

Local Cell remeshing を選んだ場合にデフォルトで有効になっている(とあるが、実際には Remeshing を有効にしたらデフォルトで有効になるのでは?)。Local では対処しきれないようなメッシュの過度な変形が生じた場合に自動で発動する。Local とは違い、そのセルゾーン全体(つまり、多くの場合は「空間全部」)をリメッシングする。高品質になるがおそらくものすごく時間がかかるはず。

TUI コマンドで自動発動を無効化できる:

/define/dynamic-mesh/controls/remeshing-parameter/zone-remeshing

逆に手動で発動するには:

/define/dynamic-mesh/actions/remesh-cell-zone

Cell Zone remeshing が発動すると、境界層の wedge メッシュも勝手に適当なパラメタでリメッシュされてしまうようだ。それについて設定したい場合は、

/define/dynamic-mesh/controls/remeshing-parameters/prism-layer-parameters

で first layer thickness, growth rate, number of layers を設定できるらしい(『通常その必要はない』とあるが、なにが通常なんだ?)。

Cell Zone remeshing は triangular, tetrahedral, and wedge のセルにしか適用できないらしい…(あれ?六面体のプリズムは??→どうやらそれには Dynamic Layering を使えよ、ってことっぽい?)

Face region remeshing

もともとピストンエンジンのシリンダ内用に開発されたようで、ピストンが移動した際に、シリンダ内壁面のメッシュが伸びるので、それをきれいにリメッシュする、というのが典型的な使い方のようだ。この場合、ピストン面が移動 zone *1、ピストン内壁は Deforming zone にするようだ。

マニュアルでは、ピストンエンジンの場合、ピストン面とシリンダの間のコーナー領域を含むようにボリューム分解をすることが推奨されている。あるいはコーナーを含まなくてもいいのでピストンとシリンダは分解しろと。そうしないとピストンが大きく移動したときにコーナー付近で潰れがちなのだろう…。

これは今考えている問題(翼の変形)には不要かな…?

CutCell zone remeshing

CutCell ということで6面体になるようだが、リメッシングでテトラからヘキサに変わるってこと…?いまいちよくわからない…。そもそも最初から CutCell でメッシュを生成していた場合はわかるのだが。うまく行けば便利そうだが、まだ発展途上な印象。もちろん単純な(工業的な?)形状に対しては有効なのだろうが。

TUIから、手動で CutCell remeshing を適用できる:

/define/dynamic-mesh/actions/remesh-cell-zone-cutcell

2.5D surface remeshing

六面体メッシュを押出してギアポンプをモデル化するような場合,特に有用

とのことで一般的ではなさそう。

Feature Detection

Dynamic Mesh Zone ダイアログの Geometry Definition タブに Feature Detection というものがある。ここの Include Features をチェックして Feature Angle (deg) をデフォルトの 180 度から下げないと、物体表面などの角が勝手に面取りされてしまう可能性があるらしい…まじかよ。0度にすると面取りを確実に防ぐようだ(が、発散しやすくなるのか?)。ただ、どうも Local Face remeshing では面取りはされなくて、Region Face remeshing のときだけされうるっぽい?そのように書いてあるが、でも Region Face remeshing にチェックを入れてなくてもこの Feature Detection を選べるんだよな…単に不具合で、将来のバージョンでは修正される可能性もあるが*2

Options

Implicit Update

時刻ステップを移動することなしにメッシュ更新を行う。6DOF dynamics や FSI のときに使用可能で、収束を改善する可能性がある。流れ場の情報を使って予測するので、Prescribed motion 時には使用できない。

Update interval はマニュアルの説明だと意味が不明瞭。時間ステップ内の iteration のことを言っている?たとえば max iteration が 20 の場合、2 に設定すると、2, 4, 6, ... iteration のときにメッシュ更新が起きる、のか?

UDFを使用して運動を計算する場合は,運動計算のためのUDFを呼び出すごとに,UDFがその 時点における流れ場を使うようにすること(それ以前に保存された情報を使わないようにする必要がある).このような確認が必要になるのは,メッシュが更新されるごとにUDFが呼び出されるからである.この呼び出しは,Update Intervalの入力内容に応じて,1つの時間ステップ内で何度も行われることがある.

これはかなり重要な情報。

Dynamic Mesh Event

いろいろなイベントを定義できるが、一番使えそうなのは Change Time Step Size と Change Under-Relaxation Factor かな。計算開始初期は発散しやすいので収束を優先し、計算が進んで落ち着いてきたら時間刻みを大きくしたり不足緩和を緩めたりできそうだ。

Execute Command があるので何でもできるのか…?

Replace Mesh というのがある。極端な話、これを使ってすべての時刻のメッシュを読み込むという力技も可能っぽいな…?

UDF

DEFINE_GEOM と DEFINE_GRID_MOTION の違い

これは引数を見たら簡単だった。DEFINE_GEOM には引数に時間 time がなく、DEFINE_GRID_MOTION にはある。つまり GEOM は時間によって不変な形状しか記述できない。したがって、物体の時々刻々の変形を prescribe するには、GRID_MOTION の方を使う。

UDFマニュアル以外だと、チュートリアルの fl00391 がおそらく唯一まともな情報源。

*1:moving dynamic zone とあり、これはおそらく Rigid Body or User-Defined or System Coupling のいずれかのタイプ、という意味での総称と思われる。

*2:実際にこういう細かいUIの変更(改良…と思いたい)はバージョンアップに伴って頻繁に起きている。