Liggghtsでの解析結果をParaviewで可視化する場合に、ステップ数と時間の対応方法が分からず悩んだので、その方法を共有します。
Liggghts結果データのフォーマット
Liggghtsの結果ファイルはdumpコマンドで出力を行います。
dump ID group-ID style N file args
使用例
dump dmp all custom 100 dump*.liggghts_run id type x y z vx vy vz fx fy fz radius mass
出力ファイルは以下のような中身になっています。
ITEM: TIMESTEP
23500
ITEM: NUMBER OF ATOMS
1
ITEM: BOX BOUNDS ff ff ff
0 1.5
0 0.5
0 0.5
ITEM: ATOMS id type x y z vx vy vz fx fy fz radius mass
1 1 0.75 0.25 0.25 0 0 0 2.23481e-08 -0.0248054 1.49699e-15 0.00553014 0.00252857
このままでは、Paraviewで読み込めないのでプリポスト用のPythonツール集であるLPPパッケージを使用してVTKファイルに変換します。LPPについては、以前の記事を参考にダウンロードしてください。
dumpコマンドで出力した結果データがあるフォルダーで、lpp.pyというPythonスクリプトを実行することで変換することができます。lpp.pyはダウンロードしたLPPパッケージの中に含まれます。
python -i lpp.py 出力ファイル名
これにより、出力されたvtkファイルを読み込むことでParaviewで可視化できます。
しかし、この方法で読み込んだ結果は解析ステップと時刻の対応がなされていません。したがって、解析のアニメーションで時刻を表示させたい場合に、解析内での実時間とアニメーションでの表記が一致しない問題が発生します。
CFDEMでCFDの結果と同時に表示させる際に、2つの時間進行が一致しない等の問題が起こります。
ParaviewにおいてVTKファイルでのステップ数と時刻の対応を行うには、以下のようなjson形式のSeriesファイルが必要になります。(Paraview5.6以上)
{
"file-series-version" : "1.0",
"files" : [
{ "name" : "foo1.vtk", "time" : 0 },
{ "name" : "foo2.vtk", "time" : 5.5 },
{ "name" : "foo3.vtk", "time" : 11.2 }
]
}
Paraview5.6以下では以下のような書式のものを作成ください。
<VTKFile type="Collection" version="0.1" byte_order="LittleEndian">
<Collection>
<DataSet timestep="0.01" group="" part="0" file="Foo_001.vtu"/>
<DataSet timestep=“0.02" group="" part="0" file=“Foo_002.vtu"/>
<DataSet timestep=“0.03" group="" part="0" file=“Foo_003.vtu"/>
</Collection>
</VTKFile>
これらのファイルをvtkファイルがあるフォルダーに置き、Paraviewで読み込むとステップ数と時刻の対応が可能です。
Information>Time にIndexとTimeが表示されると思います。
vtkファイルの数が多いと、テキストの編集も大変になるので、.seriesファイルを出力するPythonスクリプトを作成しました。実行時に、必要項目をinputするとseriesファイルを作成することができます。
import json
def generate_json(prefix, start, end, interval, start_time, time_interval):
files = []
time = start_time
for i in range(start, end + 1, interval):
# 追番を4桁以上にし、不足分を0で埋める
formatted_number = str(i).zfill(4)
filename = f"{prefix}{formatted_number}.vtk"
files.append({"name": filename, "time": time})
time += time_interval
data = {
"file-series-version": "1.0",
"files": files
}
return json.dumps(data, indent=2)
if __name__ == "__main__":
prefix = input("ファイル名のプレフィックスを入力してください(例:ファイル): ")
start = int(input("開始番号を入力してください: "))
end = int(input("終了番号を入力してください: "))
interval = int(input("追番の間隔を入力してください: "))
start_time = float(input("時間の開始時刻を入力してください: "))
time_interval = float(input("時間の間隔を入力してください: "))
result = generate_json(prefix, start, end, interval, start_time, time_interval)
with open("TimeSteps.series", "w") as file:
file.write(result)
print("TimeSteps.seriesファイルにJSONテキストを出力しました。")
今回は、ParaviewでVTKの時刻の設定を行う方法を説明しました。