タイトルがてんこ盛り
パラメーターを変えつつ、TOPを使用してほぼ同じ設定で量産したい場合などに。
この方法でキャッシュを取ると1台でも並列でキャッシュを取ることができるため、マシンに余裕があればキャッシュを取る速度があがります。
TOPを利用しているのでサーバーに投げることができればより効率的に分散できる…はず?
(仕事ではこれが安定動作しない環境のため、geoごと複製してます…)
実際には以下の画像のような区分けで値を変えた共通のDOPのシムになっている。
Geo全体
Emitter
Emitter用のPointはGridにScatterでばら撒いたものを中心にPoint Replicateで増やしています。
それのSeedや数や配置違いを用意
Cluster
Point Clusterを使用してもいいですが、明確にそれぞれ分けたかったので手動で作成
めんどうなのでノード名末尾の数字をint(opdigits("."))
でCluster番号にしています。
Clusterの最大値
すべてのEmitterをMergeしたのち、Attribute PromoteでClusterの最大値をDetailにいれます。
Parameter Override
Wrangleで作成したノードでString型の1 2 2 4
のようなスペース区切りの値をDetailにいれます。
この値をDOPで読み込んでClusterごとにパラメーターをOverrideします。
Edit Parametr 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
このDeleteが大事で、このDeleteのCluster NumをWedgeを使用して書き換えてシムをする。
DOP
DOP In
Pyro Source以下のSource処理は通常通りなので省略。
Bounding BoxはPyro Source以下で行う。
Collisionは必要であれば。
DOP Out
heatとtemperatureを保存。
velは任意。
過去記事のVDB Advectがしたい場合は保存する。
DOP Inside
ほとんどデフォルトのPyro Solver
Gas Intermittent Solve
Gas Intermittent Solveを追加で使用している。
Only Once Per Timestepにチェックを入れるとSubstepごとのエミットがされなくなるはず…
Gas Resize Fluid Dynamicと、Sourceに対して行っています。
Parameter Set
さきほどのParameter Overrideの項目で作成したDetail Attributeとarg使用して、ClusterごとにPyroの設定を書き換える。
そのまま書き換えも可能だが今回はMultiplyしています。
arg(string, argNum)
になっていて、stringの部分の1 2 2 4
のようなスペース区切りの値のargNumに該当するIndexを取り出す感じ。
このargNumの部分がDeleteのCluster Numに繋がっています。
Post処理
Cache
実際に使うのはFile Mergeのほう。
File Cacheはパラメーターの確認時に使用する。
File MergeのFile Pathに、あとで設定する@wedgenum
の部分を$SLICE
に書き換えたものを指定
Merge Rangeの最大値にmaxClusterの値detail("../set_maxCluster", "maxCluster",0)
を指定する。
TOPでのキャッシュ
Wedge
Wedge Countに何個のClusterがあるのかを入力。これはmaxCluster+1の値。
Wedge Parameterを作成し、Target Parameterに、DeleteのCluster Numパラメーターを指定する。
Start / Endを指定。これは、Clusterの最大最小値になる。
ROP Geometry
シムに使用するFrame Rangeを設定
SOP Pathにキャッシュしたい箇所のノードを指定(File Cacheノードではない)
Output Fileに、書き出し先のファイルパスを指定する。
この際にファイルパスに@wedgenum
を入れる必要がある。
この@wedgenumにそれぞれのCluster番号と同じものが入るため、ないと上書きされてしまう。
例:$HIP/geo/fire/`@wedgenum`/sim.$F4.bgeo.sc
キャッシュを読み込む際はFile Mergeを使用して@wedgenum
を$SLICE
に変更する。
画像は間違っているが、Cache ModeをWriteに変更する。
変更しないとキャッシュを上書きできないため、既存のキャッシュがある場合にスキップされてしまう。
TOPでシミュレーションのキャッシュを取る場合は、All Frames in One Batchにチェックを入れる必要があるので注意。