ParaView-Catalyst 設計仕様
背景
ParaView 5.9 以降、ParaView ディストリビューションには Catalyst API の実装が含まれています。この実装は現在 ParaView-Catalyst と呼ばれています。したがって、これはデータ処理とレンダリングに ParaView を使用する Catalyst In Situ API の実装です。
Catalyst in situ API は、計算シミュレーションコードから Catalyst 実装にデータや制御を渡すために使用される 5 つの関数呼び出しで構成されています:catalyst_initialize、catalyst_execute、catalyst_results、catalyst_finalize、catalyst_about です。これらの各関数には Conduit Node オブジェクトが渡されます。Conduit Node は、階層的なインメモリ科学データを記述するための柔軟な仕組みを提供します。Conduit Node は単なる軽量コンテナであるため、各 Catalyst API 呼び出しにおいて関連データを伝達する際に使用する規約を定義する必要があります。このような規約は総称して Blueprint と呼ばれます。各 Catalyst API 実装は独自の blueprint を開発することができます。ParaView が提供する Catalyst API 実装である ParaView-Catalyst も、ParaView-Catalyst Blueprint と呼ばれる独自の設計仕様を定義しています。本ページではこの設計仕様について説明します。
プロトコル
設計仕様にはしばしば複数のプロトコルが含まれており、それぞれが特定のユースケースに対する規約を定義します。主な Catalyst API 関数は 3 つあるため、現在の設計仕様ではそれぞれの Catalyst API 関数に対応する 3 つのプロトコルが定義されています。
protocol:
initialize:catalyst_initializeで受け付けられるオプションを定義します。これには、ParaView の Python スクリプトを追加して読み込むといったものが含まれます。protocol:
execute:catalyst_executeのプロトコルを定義し、in situ 処理にデータを提供するための Catalyst チャネル、すなわちポートに関する情報や、シミュレーションからの実際のデータを含みます。protocol:
finalize:catalyst_finalizeのプロトコルを定義します。現在のところ、これは空です。
各 Catalyst API 呼び出しにおいて、ParaView は catalyst という名前のトップレベルノードを探します。想定される子ノードは、以下のサブセクションで説明するプロトコルに基づいて異なります。
これらのトップレベルプロトコルは、channel などの他の内部プロトコルを使用します。
プロトコル: initialize
現在、initialize プロトコルは、Catalyst 実装ライブラリをどのようにロードするか、および解析のためにロードするスクリプトをどのように渡すかを定義しています。
catalyst_load/*: (任意)Catalyst はこのノードの下にあるメタデータを使用して、実装名と場所を特定しようとします。これが存在しない場合は、環境変数 CATALYST_IMPLEMENTATION_NAME と CATALYST_IMPLEMENTATION_PATH が参照されます。詳細は Catalyst API の catalyst_initialize のドキュメントを参照してください。catalyst/scripts: (任意)存在する場合はlistまたはobjectノードでなければならず、その子ノードで in situ 解析のためにロードする Python スクリプトへのパスを指定します。catalyst/scripts/[name]: (任意)存在する場合、stringまたはobjectとなります。stringの場合は Python スクリプトへのパスとして解釈されます。objectの場合は、以下の属性を持つことができます。catalyst/scripts/[name]/filename: Python スクリプトへのパスcatalyst/scripts/[name]/args: (任意)存在する場合はlist型でなければならず、各子ノードはstring型である必要があります。これらの引数をスクリプトから取得するには、paraview catalyst モジュールのget_args()メソッドを使用します。
警告
Legacy Catalyst v1 scripts are not supported.
さらに、使用する事前コンパイル済みパイプラインのリストを指定することもできます。
catalyst/pipelines: (任意)存在する場合はlistまたはobjectノードでなければならず、その子ノードは使用するハードコードされたパイプラインのタイプとパラメータを提供するオブジェクトである必要があります。各オブジェクトはpipelineプロトコルに従わなければなりません。
MPI 対応ビルドでは、ParaView はデフォルトで MPI_COMM_WORLD をグローバルコミュニケータとして使用するように初期化されます。特定の MPI コミュニケータを指定するには、次のようにします。
catalyst/mpi_comm: (任意)存在する場合、使用する MPI コミュニケータの Fortran ハンドルを表す整数でなければなりません。Fortran ハンドルはMPI_CommからMPI_Comm_c2f()を使って取得できます。
ParaView の Python インタプリタへの追加のパスを指定することもできます。これは Catalyst スクリプトの PYTHONPATH を定義する代替方法と考えることができます。パスは次のように指定します。
catalyst/python_path: (任意)存在する場合は文字列でなければなりません。複数のパスを指定する場合は、システムのパス区切り文字、すなわち Unix/MacOS では:、Windows では;を使用して区切ります。
プロトコル: execute
各タイムイテレーションにおいてデータをどのように伝達するかを定義します。
time/timestep/cycle: 現在の呼び出しに関する時間的情報を定義します。
catalyst/state/timestep: (任意)現在のタイムステップを表す整数値。指定されていない場合はcatalyst/cycleが使用されます。catalyst/state/cycle: (任意)現在のサイクルインデックスを表す整数値。指定されていない場合は 0 が使用されます。catalyst/state/time: (任意)現在の時刻を表す float64 値。指定されていない場合は 0.0 が使用されます。catalyst/state/parameters: (任意)任意の実行時パラメータのリスト。存在する場合はlist型でなければならず、各子ノードはstring型である必要があります。catalyst/state/multiblock: (任意)整数値。存在し、かつ 1 に設定されている場合、出力はレガシーな vtkMultiBlockDataSet になります。
channels: チャネルはシミュレーションデータを伝達するために使用されます。channels ノードは 1 つ以上の子ノードを持つことができ、それぞれが名前付きチャネルに対応します。チャネルは解析パイプライン内のデータソースを表し、シミュレーションコードによって生成されるデータにリンクされます。ほとんどのシミュレーションアダプタは単一のチャネルしか持ちませんが、多物理シミュレーションコードでは、シミュレーションされる各物理ごとに複数のチャネルを持つことになります(例:流体-構造連成シミュレーションにおける流体領域用チャネルと構造領域用チャネル)。
catalyst/channels/[channel-name]: (プロトコル:channel): (任意)存在する場合、channel-nameという名前を持つチャネルを表します。このノードはchannelプロトコルに従うobjectノードでなければなりません。
channel プロトコルは以下のとおりです。
channel/type: (必須)チャネルの種類を表す文字列。現在サポートされている値はmeshとmultimeshのみです。meshは、このチャネルが Conduit Mesh プロトコルに従って指定されていることを示します。multimeshはマルチドメインメッシュ(マルチブロックとも呼ばれる)のための拡張であり、後で説明します。channel/data: (必須)このチャネル上でシミュレーションデータを伝達するために使用されるオブジェクトノード。このノードはchannel/typeで指定されたプロトコル要件に適合していなければなりません。channel/state/data/fields/[field-name]: (optional) defines extra fields associated to the current mesh. Each field is not associated to any topology and it could be a string, a numerical array or an array following the MCArray Blueprint protocol. In ParaView Catalyst, the each field will be added as a Field Data array to the generated VTK object.channel/data/fields/[field-name]/display_name: (optional) defines the original name of the field. VTK will rename fields when there is both a point array and a cell array with the same name. When the conduit node is converted back to a vtkDataObject, VTK will set the original name back.channel/data/state/metadata/vtk_fields/[field-name]: (optional) defines metadata for a specific field named [field-name] so that it can be utilized appropriately by VTK (see CxxPolygonalWithAttributes example). These metadata are:attribute_type`: 文字列であり、フィールドの属性タイプを表します。これにより VTK は GlobalIds のような属性配列を使用できるようになります。使用される値は vtkDataSetAttributes::AttributeTypes のエントリと Ghosts です。値の完全な一覧は以下のとおりです。Scalars
Vectors
Normals
TCoords
Tensors
GlobalIds
PedigreeIds
EdgeFlag
Tangents
RationalWeights
HigherOrderDegrees
ProcessIds
Ghosts
values_to_replaceおよびreplacement_values: これら 2 つはフィールド内の特定の値を置換するために使用される値のベクトルです。これは、フィールドに VTK では有効でない値が含まれている場合に有用です。例えば、vtkGhostType 配列は他のゴーストセル生成アルゴリズムでは使用されない特定の値を使用します。この場合、values_to_replaceには置換が必要な値を指定し、replacement_valuesにはそれを置き換える値を指定します。両方のベクトルは同じ長さである必要があります。
channel/state: (任意)catalyst/stateの時間情報を上書きするためのフィールド。channel/state/timestep: (任意)存在する場合、このチャネルに対してcatalyst/state/timestepを上書きします。channel/state/cycle: (任意)存在する場合、このチャネルに対してcatalyst/state/cycleを上書きします。channel/state/time: (任意)存在する場合、このチャネルに対してcatalyst/state/timeを上書きします。指定されていない各channel/stateパラメータについては、チャネルはデフォルトでcatalyst/state/の値を使用します。channel/state/multiblock: (任意)存在する場合、このチャネルに対してcatalyst/state/multiblockを上書きします。
プロトコル: finalize
現在のところ、これは空です。
プロトコル: pipeline
ハードコードされたパイプラインの種類とパラメータを定義します。
type: (必須)パイプラインの種類を識別する文字列。現在サポートされている値は
ioです。
type が io の場合、以下の属性がサポートされます。
filename: (必須)ファイル名を表す文字列。{timestep}を使用してタイムステップに置換したり、{time}を使用して時刻の値に置換することができます。fmt形式の書式指定子(例:{time:03f}など)を使用することも可能です。ファイル名は、データを保存する際に使用されるサポート対象のライターを決定するために使用される場合があります。channel: (必須)チャネルを名前で識別する文字列。
プロトコル: multimesh
これは、channel/type が multimesh に設定されている場合に channel/data に使用されるプロトコルです。
channel/data/[block-name]: (プロトコル:mesh): (任意)存在する場合、Conduit Mesh プロトコルを使用して記述された個々のメッシュ/ブロックを表します。これは複数のブロックに対して繰り返すことができます。block-nameは各ブロックごとに一意でなければなりません。channel/assembly: (任意)存在する場合、multimesh 内の個々のメッシュ/ブロック間の任意の階層関係を定義するために使用できます。例えば、blockAとblockBという 2 つのブロックがある場合、次のような階層構造を定義できます。したがって、すべてのノードは object、list、または string のいずれかであり、string の場合は有効なブロック名を参照しなければなりません。
channel/assembly/
AllBlocks: [“blockA”, “blockB”]
BlockA: “blockA”
BlockB: “blockB”
SubGroup/
AnotherChild: “blockA”