VisIt (visualization)でスナップショットを出力して動画を作る方法

# はじめに
以前、[こちら](https://qiita.com/t_dragon/items/07458507bd64043ebc72)の記事で[VisIt](https://visit-dav.github.io/visit-website/)というフリーの可視化ソフトを使っているという話をした。
よくメモリ不足で落ちてしまうVisItでスナップショットを出力して動画を作ってみたので、備忘録として残そうと思う。

やったことは以下の通りである。
- VisItでデスクトップのフォルダへのアクセスができるようにした
- GUIで連番のスナップショットを出力した
- コマンドラインで連番のスナップショットを出力した
- 連番スナップショットをconvertでmpgにした

# VisItでデスクトップのフォルダへアクセスしたい

なぜかずっとファイルを開くときにデスクトップに置いてあるものを指定するとこのようなエラーでできなかった。
"The MetaData server running on localhost could not get the file list for the current directory."

[こちら](https://github.com/visit-dav/visit/issues/4069)を参考にすると、どうやらそのフォルダの場所でターミナルで以下のコマンドを入力すると良いらしい。

~~~
% /Applications/VisIt.app/Contents/Resources/bin/visit
~~~

# 動画ではなく連番のスナップショットを出力したい

## 下準備

これは備忘録なのでスクリーンショットがないのを容赦願いたい。
下準備として以下の作業を行う。
1. VisItを起動する
1. Sources → Open
1. Plots → Add → Draw → 手動で調整
1. Controls → Annotation → 色々と調整
1. (私の可視化では必要なので) Options → Rendering → 色々と調整
1. 他にも図の描画に必要な調整をしておく
1. File → Save session as → 名前をつけてこれらの設定を保存する **(重要!)**

## 連番スナップショットの出力(GUI)

8. File → Save movie → New simple movie
8. FormatをPNG imagesにする
8. [x] Use screen capture
8. -> → Continue
8. First frameとInitial frame valueにそれぞれ同じ数字(スナップショットを出しはじめたい番号)にする
8. Output directoryをデータのあるフォルダの中のスナップショット用フォルダにする(ほうが良いと思う)

確かに途中で出力が虚無になり、VisItの起動をしたターミナルを見てみるとこのようなエラーが出ていた。

~~~
engine_ser[8101:15745932] GLDRendererMetal command buffer completion error: Error Domain=MTLCommandBufferErrorDomain Code=8 "Insufficient Memory (00000008:kIOGPUCommandBufferCallbackErrorOutOfMemory)" UserInfo={NSLocalizedDescription=Insufficient Memory (00000008:kIOGPUCommandBufferCallbackErrorOutOfMemory)}
~~~

おそらく一番大変そうな「影をつける」というRenderingがMemory不足の原因になっているのだと思われる(詳しいことはわからないが)。
とりあえずVisItを起動したターミナルでControl+Cして強制終了させ、もう一度以下のコマンドで起動させる。

~~~
% /Applications/VisIt.app/Contents/Resources/bin/visit
~~~

そのあとは以下の通り。
1. File → Restore session with sources → 保存したsessionを選択
1. Timeで出力したいスナップショットのデータ番号を入力
1. File → Save movie → New simple movie **(以下はさっきと同じ)**
8. FormatをPNG imagesにする
8. [x] Use screen capture
8. -> → Continue
8. First frameとInitial frame valueにそれぞれ同じ数字(スナップショットを出しはじめたい番号)にする
8. Output directoryをデータのあるフォルダの中のスナップショット用フォルダにする(ほうが良いと思う)

## 連番スナップショットの出力(コマンドライン)

[こちら](https://www.visitusers.org/index.php?title=Making_Movies#Command_line_arguments)を参考にした。
下準備で*.sessionというファイルが作られていればコマンドラインで簡単にスナップショットの出力ができる。
実際には以下のようなコマンドを使用した。

~~~
% /Applications/VisIt.app/Contents/Resources/bin/visit -movie -format png -geometry 1848x1704 -sessionfile visit0000.session -start 79 -end 310 -frame 79
~~~

簡単な説明は以下の通りである。
- /Applications/VisIt.app/Contents/Resources/bin/visitはvisitの起動と同じコマンド
- -formatで出力フォーマットの指定(今回はpngの連番ファイル)
- -geometryでサイズを指定
- -sessionfileで読み込む設定用ファイルの指定
- -startで初めのデータ番号
- -endで終わりのデータ番号
- -frameで出力ファイルの始まりの番号

このコマンドを例えば30スナップショット毎に走らせるようなスクリプトを組めば良い気がする。
もしうまく行けば続編として記事を書くかもしれない。
とりあえずはあまり時間もなかったので、メモリ不足のエラーを吐いたらControl+Cをして止めて、失敗した番号からまたスナップショットを出す…ということを繰り返してやってみた。

# 連番スナップショットをconvertでmpgにする

連番スナップショットをCentOS計算機(メモリ126 GB)にscpで送り、以下のコマンドを入力。
[こちらの過去記事](https://qiita.com/t_dragon/items/07458507bd64043ebc72#ppm%E3%82%92mpg%E3%81%ABconvert)も参考に。

~~~
$ convert -delay 10 -loop 0 movie*.png movie.mpg &
~~~