すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

PyroとClusterとTOP

タイトルがてんこ盛り

パラメーターを変えつつ、TOPを使用してほぼ同じ設定で量産したい場合などに。

この方法でキャッシュを取ると1台でも並列でキャッシュを取ることができるため、マシンに余裕があればキャッシュを取る速度があがります。

TOPを利用しているのでサーバーに投げることができればより効率的に分散できる…はず?

(仕事ではこれが安定動作しない環境のため、geoごと複製してます…)


Houdini Fire

実際には以下の画像のような区分けで値を変えた共通のDOPのシムになっている。

f:id:godofsuama:20200428070048p:plain

Geo全体

f:id:godofsuama:20200820232756p:plain
ネットワーク全体

Emitter

f:id:godofsuama:20200428061716p:plain
Emitter

Emitter用のPointはGridにScatterでばら撒いたものを中心にPoint Replicateで増やしています。

それのSeedや数や配置違いを用意

Cluster

f:id:godofsuama:20200428061853p:plain
Cluster

Point Clusterを使用してもいいですが、明確にそれぞれ分けたかったので手動で作成

めんどうなのでノード名末尾の数字をint(opdigits("."))でCluster番号にしています。

Clusterの最大値

f:id:godofsuama:20200428062125p:plain
maxCluster

すべてのEmitterをMergeしたのち、Attribute PromoteでClusterの最大値をDetailにいれます。

Parameter Override

f:id:godofsuama:20200428062311p:plain
Override Parm

f:id:godofsuama:20200428062512p:plain

Wrangleで作成したノードでString型の1 2 2 4のようなスペース区切りの値をDetailにいれます。

この値をDOPで読み込んでClusterごとにパラメーターをOverrideします。

Edit Parametr Interfaceからパラメーターを以下の画像のように作成し、

f:id:godofsuama:20200428062639p:plain
Edit Parameter Interface

以下のWrangleで処理

あまり良くないWrangleなのと、現時点でFloatにしか対応していなく、さらにたまにパラメーターが設定されないエラーがある…

//param
int cnt = chi("wedgeCnt");
int iteration = chi("numpath");

//
for(int i = 0; i < iteration; i++){

    string def = chs("defVal" + itoa(i + 1));
    string value = chs("valList" + itoa(i + 1));
    string attrbName = chs("attrib" + itoa(i + 1));
    
    int clusterArray[];
    string valueArray[];
    string setParm = "";
    
    //create array
    for(int arrayi = 0; arrayi < cnt; arrayi++){
        push(clusterArray, arrayi);
        push(valueArray, def);
    }
    
    
    //delete first and last line
    string array[] = split(value,"\n");
    removeindex(array, 0);
    removeindex(array, -1);
    
    //for line
    foreach (string num; array) {
        string numArray[] = split(num, "\:");
        
        //cluster num
        int clean = atoi(re_replace(r"(\D)", "", numArray[0]));
        
        //value
        string cleanVal = re_replace(r"(\")", "", numArray[1]);
        
        insert(valueArray, clean, cleanVal);
    };
    
    //set param
    for(int seti = 0; seti < cnt; seti++){
        setParm = setParm + " " + valueArray[seti];
        setParm = re_replace(r"(\,)", "", setParm);
    }
    
    //set parameter
    setParm = strip(setParm);
    setdetailattrib(0, attrbName, setParm, "set");
}
選択したCluster以外をDelete

f:id:godofsuama:20200428063125p:plain
Delete

このDeleteが大事で、このDeleteのCluster NumをWedgeを使用して書き換えてシムをする。

DOP

DOP In

f:id:godofsuama:20200820232903p:plain

Pyro Source以下のSource処理は通常通りなので省略。

Bounding BoxはPyro Source以下で行う。

Collisionは必要であれば。

DOP Out

heatとtemperatureを保存。

velは任意。

過去記事のVDB Advectがしたい場合は保存する。

godofsuama.hatenablog.com

DOP Inside

f:id:godofsuama:20200428063809p:plain
DOP Inside

ほとんどデフォルトのPyro Solver

Gas Intermittent Solve

Gas Intermittent Solveを追加で使用している。

Only Once Per Timestepにチェックを入れるとSubstepごとのエミットがされなくなるはず…

Gas Resize Fluid Dynamicと、Sourceに対して行っています。

f:id:godofsuama:20200428063919p:plain
Gas Intermittent Solve

Parameter Set

f:id:godofsuama:20200428064319p:plain

さきほどのParameter Overrideの項目で作成したDetail Attributeとarg使用して、ClusterごとにPyroの設定を書き換える。

そのまま書き換えも可能だが今回はMultiplyしています。

arg(string, argNum)になっていて、stringの部分の1 2 2 4のようなスペース区切りの値のargNumに該当するIndexを取り出す感じ。

このargNumの部分がDeleteのCluster Numに繋がっています。

Post処理

f:id:godofsuama:20200428065248p:plain

Cache

f:id:godofsuama:20200428065330p:plain
File Cache

実際に使うのはFile Mergeのほう。

File Cacheはパラメーターの確認時に使用する。

f:id:godofsuama:20200428065518p:plain

File MergeのFile Pathに、あとで設定する@wedgenumの部分を$SLICEに書き換えたものを指定

Merge Rangeの最大値にmaxClusterの値detail("../set_maxCluster", "maxCluster",0)を指定する。

TOPでのキャッシュ

f:id:godofsuama:20200428070148p:plain
TOP

Wedge

f:id:godofsuama:20200428070309p:plain

Wedge Countに何個のClusterがあるのかを入力。これはmaxCluster+1の値。

Wedge Parameterを作成し、Target Parameterに、DeleteのCluster Numパラメーターを指定する。

Start / Endを指定。これは、Clusterの最大最小値になる。

ROP Geometry

f:id:godofsuama:20200428070602p:plain

シムに使用するFrame Rangeを設定

SOP Pathにキャッシュしたい箇所のノードを指定(File Cacheノードではない)

Output Fileに、書き出し先のファイルパスを指定する。

この際にファイルパスに@wedgenumを入れる必要がある。

この@wedgenumにそれぞれのCluster番号と同じものが入るため、ないと上書きされてしまう。

例:$HIP/geo/fire/`@wedgenum`/sim.$F4.bgeo.sc

キャッシュを読み込む際はFile Mergeを使用して@wedgenum$SLICEに変更する。

f:id:godofsuama:20200428072117p:plain

画像は間違っているが、Cache ModeをWriteに変更する。

変更しないとキャッシュを上書きできないため、既存のキャッシュがある場合にスキップされてしまう。

TOPでシミュレーションのキャッシュを取る場合は、All Frames in One Batchにチェックを入れる必要があるので注意。