Houdini 17.5 ダイナミクス

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

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

On this page

概要

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

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

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

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

Mac

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

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

No Partitioning

これは、 Distribute Particle Fluid シェルフツールをクリックした後にポップアップから選択可能な分散メソッドです。 シミュレーション全体を他のマシンに送信して、全体としてそれをシミュレーションします。

Clustering

これは、 Distribute Particle Fluid シェルフツールをクリックした後にポップアップから選択可能な分散メソッドです。 これは、ソースをX,Y,Z軸でぶつ切りにして区分けすることができます。 これらのピースは同時にシミュレーションされますが、フレーム間でパーティクルを転送することができません。 このメソッドでは、各パーティションは次のフレームに進む前に現在のフレームのシミュレーションが完了するのを待つ必要がないので、Slicingメソッドよりも非常に高速です。

Slicing

SliceシェルフツールとSlice Along Lineシェルフツールは、パーティクル流体を含んだ空間をスライスすることができるので、HQueueファーム上の異なるマシンで、その流体の別々の部分をシミュレーションさせることができます。 これらのツールには、ピースの方向と階層に関するコントロールがたくさん備わっています。 また、このメソッドは各フレームの最後にスライス間でパーティクルを転送します。これによって精度が良くなりますが、処理も重くなります。

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

流体空間をスライス

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

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

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

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

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

How to

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

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

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

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

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

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

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

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

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

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

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

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

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

To...Do this

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

  1. DOP NetworkのDISTRIBUTE_uprespyro_CONTROLSNullノードの 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 ClusterやPyro 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 nodeを追加することで、ファーム上の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ファイルを読み込み、フレーム毎にパーティクル流体シミュレーションのスライスをシミュレーションして保存します。個々のクライアントマシンは、生成したジオメトリキャッシュファイルを共有ネットワークディレクトリに保存します。

ダイナミクス

ダイナミクスの学習

衝突オブジェクト

シミュレーションタイプ

Vellum

非DOPシミュレーション

次のステップ