Houdini 18.5 ダイナミクス

流体シミュレーションの分散

このツールは、HQueueによる複数マシンでの並列処理ができるように、シミュレーションオブジェクトのネットワークをセットアップします。

On this page

概要

Distribute Particle Fluid シェルフツールはシミュレーションするオブジェクトのネットワークをセットアップして、HQueueによって複数のマシンで並行して計算ができるようにします。

パーティクル流体と単一グリッドベースの流体コンテナを スライス によって分散させることができます。 これによって、エフェクトが起きる空間がスライスに区分けされて、各 スライス が別々のマシンで計算されます。 グリッドベースの流体コンテナは、面単位で特定の数だけ分割してスライスすることができますが、パーティクル流体シミュレーションに関しては 境界がない ので、手動でスライスしなければなりません。

スライスしたシミュレーションにおいては、ネットワークのノードはスライス間の境界を越えてお互い情報を交換し合います。

クラスタ化した流体シミュレーションでは、各クラスタコンテナはそれぞれ独立して計算します。それは他のクラスタコンテナと重複してる場合も同じです。しかし煙とPyroのシミュレーションにおいては、その出力ボリュームは視覚的には一緒に混ざるので上手く動作します。

Mac

分散シミュレーションはMacOS10.14.4以降でのみ対応しています。

シミュレーションを分散させるメソッド

distributedsim HQueue Simulationレンダーノードのパラメータに配置されている Partitioning Type ドロップダウンメニューから使用したい分散メソッドを選択することができます。

No Partitioning

シミュレーション全体を他のマシンに送信して、全体としてそれをシミュレーションします。 布とワイヤーのシミュレーションに関しては、それらをスライス することができない ので、このメソッドが上手く動作します。

Clustering

ソースをX,Y,Z軸でぶつ切りにして区分けすることができます。 これらのピースは同時にシミュレーションされますが、お互いに通信することもフレーム間でパーティクルを転送することも できません 。 このメソッドでは、各パーティションは次のフレームに進む前に現在のフレームのシミュレーションが完了するのを待つ必要がないので、Slicingメソッドよりも非常に高速です。

Slicing

パーティクル流体を含んだ空間をスライスすることができるので、HQueueファーム上の異なるマシンで、その流体の別々の部分をシミュレーションさせることができます。 このメソッドは各フレームの最後にスライス間でパーティクルを転送するので、Clusteringよりも精度が良いです(が、処理も 重く なります)。

Tip

ピースの方向と階層に関するコントロールがもっと必要であれば、 Sliceまたは Slice Along Lineのシェルフツールを使用してください。

詳細は、スライスした分散シミュレーションのセットアップを参照してください。

Volume Slicing

パーティクル流体を含んだ空間をNxMxPの3D配列で同一サイズのピースに自動的に分割します。 特定の重なりを指定して各ピース周辺にバッファを用意することもできます。 そして、別々のマシンが各スライスで動作し、定期的にそららのバッファを同期させます。 これは、Pyro計算のように固定された矩形空間での Dense シミュレーションで上手く動作します。

Particle Slicing

非Dense シミュレーションに関しては、ドメインを同一サイズのパーツに分割するのは意味がありません。 あるマシンが他のマシンの終了を待たないようにパーティションのバランスを取るのが重要です。 そのため、代わりに Slice ノードまたは Slice Plane DOP ノードを使用してシミュレーション空間を分割する必要があります。 これらのノードは、ワールドを各シミュレーションマシンが 所有 する別々の領域に分割します。 各マシンは、それ自身のスライス用のすべてのデータと、常時更新する必要がないように周辺スライスの境界情報を持ちます。

Wedging

シミュレーションの様々なバリエーションを試すことができます。 詳細は、 HQueue Simulationレンダーノード Wedgeレンダーノードを参照してください。

分散メソッドの互換性

ソルバタイプ Clustering Volume Slicing Particle Slicing 条件と制限事項
Pyro Volume Slicingに関して:
  • Pressure Projection(圧力射影)をまったく上手く 制御しません
  • スライス間の境界で渦壁が生成される場合があります。
  • スケーリングが非常に貧弱です。
Upres/Retime Pyro
  • マシンにフィールド全体を保持するのに 十分なメモリがない 時に役立ちます。
  • シミュレーションのスライス境界の サイズ (Velocity x タイムスタンプ)が正しく設定されている時に上手く動作します。
  • 同期化の負荷が高くなる可能性があります。
Whitewater Particle Slicingに関して:

密度近似またはクランプ処理を使用する場合は、スライス交換で十分なパーティクルのオーバーラップを用意してください。そうしないと、スライス交換でアーティファクトが発生する可能性があります。
POP
  • シミュレーションが大域計算を していない 場合にのみ使用します。
  • 固有のパーティクルIDを用意するのが非常に難しいです。
Grains
  • シミュレーションに明示的な拘束が 含まれていない 場合にのみ使用します。
  • VRAMが限られていて、複数のGPUを使用したい場合や複数のGPUにメモリを分散させたい時に役立ちます。
  • 分散エラーを最小限に抑えるために妥当なオーバーラップ量を残してください。
FLIP
  • Pressure Projection(圧力射影)オペレーションを使用する場合、シミュレーションを分散させることを意識してください。そうしないと、スライス境界でアーティファクトが発生する可能性があります。
  • Viscosityは 分散を考慮しない のでスライス境界でアーティファクトが発生する可能性があります。
Narrow Band FLIP
  • シミュレーションで使用しているすべてのフィールドを同期させている場合にのみ動作します。
  • フィールドの同期化は移動するスライスには 対応していません
  • スライスの再バランス化と一緒に空間のスライシングを 使用することはできません
Adaptive FLIP Pressure Projection(圧力射影)オペレーションは分散に 対応していません

スライスした分散シミュレーションのセットアップ

パーティクル流体を含んだ空間をスライスすると、HQueueファーム上の別のマシンに流体の別の 領域 をシミュレーションさせることができます。 スライスしないでパーティクル流体シミュレーションをファームに送ることもできますが、複数マシンの並列処理ではなく、1台のマシンで単にシミュレーションしているだけにすぎません。

Particle Fluids タブには、パーティクル流体シミュレーションをスライスして分散できるように別の領域に分けるツールが2つあります:

  • Slice Along Lineツール

    特定の方向に沿って特定の数だけ空間を等分することでスライスを作成します。 これがスペースをスライスする一番単純な方法です。

  • Sliceツール

    階層状の平面を交差させて空間をスライスするので、任意に複雑な方法で分割することができます。

各領域にはHQueueクライアントネットワーク上の個々のマシンが必要なので、持っているマシンと同じ数の領域のみをセットアップすることができます。 例えば、 Slice Along Line ツールで Number of Regions8に設定すれば、HQueueネットワークには8台のマシンが必要となります。

流体空間をスライスする方法

  1. Particle FluidsClothWire シェルフタブから Distribute ツールをクリックします。

  2. パーティクル流体、布、ワイヤーオブジェクトを選択してEnterを押します。

    このツールは、シミュレーションを分散するために色々なネットワークにいくつかのノードを作成します:

    • /outdistributedsim HQueue Simulationレンダーノードが作成されます。これはシミュレーションをHQueueに出力します。

      このレンダーノードは分散ジョブをHQueueサーバーに送ります。

    • /objdistribute_オブジェクト名 オブジェクトが作成されます。これはHQueueクライアントで作成されたシミュレーションファイルをHoudiniに戻すオブジェクトです。

    • DOP NetworkにDISTRIBUTE_オブジェクト名_CONTROLS Nullノードが作成されます。

      このノードは主に、値の代用として使います。レンダーノードは、トラッカーアドレス/ポートとスライス分割のようなコントロール Null DOPに値を明確に設定します。そして、ネットワークの複数のdistribution-aware DOPが、そのコントロール Null の値を参照します。

  3. ジオメトリファイルの保存($HIP/geo/dist_${SLICE}_$F.bgeo.gz)に使うデフォルトパスのパターンを変更したい場合は、シーンレベル(/obj)に移動して、distribute_オブジェクト名オブジェクトをダブルクリックして中に入ります。loadslicesFileノードを選択して、 File パラメータを変更します。詳細は、ファイル名にエクスプレッションを使うを参照してください。

    パスは$HIP基準の相対パスにしたほうが良いです。

ファーム上にシミュレーションを実行しないでシミュレーションスライスを閲覧する方法

Distribute ツールは、ネットワークを修正して、分散できるように準備します。それらの修正の後にシミュレーションを再生すると、ネットワークは全体のシミュレーションの内、1スライスのみしか計算しません。そして、いくつかのノードでは、HQueueピアーとの通信を試みるので、ネットワークトラフィックが発生します。

単体のマシンでシミュレーションをチェックしたいのであれば、 Distribute ツールで作成されたコントロール Null DOPのパラメータを使って、一時的にネットワークを分散処理しないように戻すことができます。

To...Do this

シミュレーションを分散しないでスライスを閲覧する

  1. DOP NetworkのDISTRIBUTE_uprespyro_CONTROLS Null ノードの Distribution チェックボックスをオフにします。

  2. Slice パラメータを閲覧したいスライスに設定します。

FLIPによるパーティクル流体の分散の使い方

タンクによるパーティクル分散を使用すると、流体を損失してしまうことがあります。 この問題を回避するには、FLIP SolverDistributed Pressure Solve チェックボックスを有効にします。 これは、タンク内の圧力を考慮し、スライス間の繋目がより滑らかになります。

Narrow Band(狭帯域) FLIPタンクの分散セットアップの方法

  1. Oceans シェルフ上のツールのどれかを使って FLIPタンクを作成します。デフォルトでは、 Narrow Band Particles が有効になっているはずです。

  2. Particle Fluids シェルフ上のSliceツールを使って、パーティクル流体をスライスします。

  3. Distribute シェルフツールを使って、 Slicing を選択します。これは、HQueueを使って複数のマシン上で並列で流体を計算できるネットワークをセットアップします。

Whitewaterシミュレーションの分散セットアップの方法

  1. Oceans シェルフ上のツールを使ってWhitewaterシミュレーションを作成します。

  2. 分散させたいWhitewaterを選択して、 Particle Fluids シェルフの Distribute Particle Fluid ツールをクリックします。

  3. ポップアップダイアログボックスから、 No PartitioningClustering のどちらかの分散メソッドを選択します。

    Note

    SliceツールまたはSlice Along Lineツールを使ってWhitewaterが事前にスライスされていれば、さらに Slicing の選択肢もあります。

    No Partitioning を選択すれば、シミュレーション全体を他のマシンに送信することができます。 Clustering を選択すれば、他のマシンで同時にシミュレーションできるようにシミュレーションをぶつ切りにすることができます。 どちらのオプションでも分散シミュレーション用のHQueue Simulationを作成します。

  4. Clustering を選択すると、HQueue Simulationレンダーノードの Partition TypeClusters に設定されます。 Cluster Node パラメータの Jump to operator ボタンをクリックすると、partition_emissionサブネットワークにジャンプします。

  5. Divisions パラメータを使ってクラスタを設定します。

    Note

    クラスタは個別にシミュレーションされることから、別のクラスタで誕生したパーティクルをフレーム間で転送することができないので、パーティクル流体は、フロー方向に平行で分割してください。

    以下の例では、Beach TankがZ軸に沿って分割されています。これは、海辺に乗り上げる波の流れに合わせています。

クラスタ化したSmoke/Pyroシミュレーションの分散セットアップ

  1. Pyro FX シェルフタブの Smoke ClusterPyro Cluster ツールを使って、ポイントソースからクラスタ化した煙またはPyroシミュレーションを作成します(クラスタ化を参照)。

  2. Container Tools シェルフタブの Distribute ツールをクリックします。

  3. 分散させるコンテナを選択してEnterを押します。

    Smoke/Pyro Clusterツールで作成された複数のコンテナでクラスタ化したシミュレーションを分散しているなら、その複数のコンテナから1つを選択することができます。

    (別の方法として、ネットワークエディタからDOPオブジェクトを選択してビューポートでEnterを押します。)

  4. オブジェクトに複数のコンテナ(例えば、クラスタ化で作成)があれば、ダイアログボックスが表示されて スライス または クラスタ化 をしてシミュレーションを分散したいのか聞いてきます。

    (シミュレーションが大規模で、1個のクラスタコンテナでさえも1台のマシンで実行するには重すぎるのであれば、 Slicing をクリックして各クラスタコンテナに対して別々にスライスを分散します。)

  5. なんらかの理由でシミュレーション結果をインポートするオブジェクトが2つ以上ある場合、ダイアログボックス表示されて、どのオブジェクトを分散で使うのか聞いてきます(以下のツールがどのようにしてジオメトリネットワークを修正するのかを参照)。

  6. ツールはHQueue Simulationレンダーノードを作成して選択します。そのノードの HQueue Server パラメータにHQueueサーバー名とポート名を設定します(例えば、hq.company.com:5000)。

    スライスを使っていれば、 Slice Divisions パラメータを設定することができます。デフォルトの1, 1, 1だと、実際にはコンテナを複数のサブドメインに分割しません。 例えば、これらの値を2, 2, 2まで上げると、そのコンテナが分散できるように8個の小さいボックスにスライスされます。

シーンの裏側で分散クラスタリング

あなたが分散したシミュレーションされるフィールド(例えば、import_pyro_build)をインポートするジオメトリオブジェクトに、 Distribute ツールはDOP I/Oノードを追加することで、ファーム上のROP Output Driverによって生成されるクラスタフィールドをディスクに書き出すことができます。

HIPファイルがファーム上で実行(以下参照)されている時、HQueueレンダーノードは以下の事を行ないます:

  • グローバル$CLUSTER変数を、そのマシンで生成されるクラスタ番号に設定します。

  • Cluster Points ノード(HQueueレンダーノードの Cluster Node パラメータで指定されたノード)で、 Cluster Filter パラメータを$CLUSTER変数に設定します。すると、ソースネットワークはそのクラスタ番号用のソースポイントのみ生成します。

  • ROP Output Driverを処理(HQueueレンダーノードの Output Driver パラメータで指定されたノード)します。それは、シミュレーションが現在のクラスタとフレームのジオメトリを処理して書き出します。

また、 Distribute ツールは、ネットワークにFile Mergeノードを作成することで、ファーム上で生成されたクラスタフィールドをインポートして、それを再統合します。このノードのディスプレイとレンダリングのフラグを設定して、あなたのマシン上のHIPファイルを見るとキャッシュ化したジオメトリファイルが使われているのがわかります。

Note

出力ジオメトリファイルのファイル名パターンはFile Mergeノードで設定し、ROP Output Driverから参照されます。パターンには、$CLUSTER(シミュレーションするクラスタ番号)と$F(現在のフレーム)変数を組み込まなければなりません。

ライブシミュレーションをオフ

一度HQueueネットワークがジオメトリを生成してしまうと、元のシミュレーションネットワークをクッキングするのを止めてください。なぜなら、その時点で最終結果をキャッシュ化しているからです。

以下のどれかを行なってください:

  • クッキングするのにシミュレーションを必要とするシーンレベルオブジェクトの表示をオフにします。

  • Houdiniでシミュレーションをオフにします。つまり、メインウィンドウの右下のシミュレーションメニューをクリック(または、押したまま)して、 Enable Simulation をオフにします。

  • 新規で.hipファイルを作成して、Fileサーフェスノードを使って、生成されたパーティクル流体ジオメトリファイルを読み込みます。

ファーム上に分散されたシミュレーションを実行

  1. メインメニューから Render ▸ Edit Render Node ▸ distributedsim を選択します。パラメータエディタで:

    • シミュレーションしたいフレーム範囲を設定します。

    • Slice Divisions パラメータをチェックします。3つの成分の積が、パーティクル流体シミュレーションの領域の数となります(例えば、3, 1, 1は3つの領域でシミュレーションします)。

      この数字は、 Distribute ツールがレンダーノードを作成するときに自動的に設定されます。とはいえ、戻ってスライスの数を変更(例えば、Slice Along Lineノードの Number of Regions パラメータを変更する)する場合、レンダーノードでこのパラメータを更新する必要があります。

    • HQ Server にHQueueサーバーのホスト名とポートを設定します(例えば、render.example.com:5000)。

  2. パラメータエディタで、 Render をクリックするとジョブがHQueueに送信されます。

    レンダーノードは、その情報をHQueueサーバーに送信します。HQueueサーバーはコマンドをクライアントマシンに送信して、.hipファイルを読み込み、フレーム毎にパーティクル流体シミュレーションのスライスをシミュレーションして保存します。個々のクライアントマシンは、生成したジオメトリキャッシュファイルを共有ネットワークディレクトリに保存します。

ダイナミクス

ダイナミクスの学習

衝突オブジェクト

シミュレーションタイプ

非DOPシミュレーション

次のステップ