ParaView-Catalyst 設計仕様

背景

ParaView 5.9 以降、ParaView ディストリビューションには Catalyst API の実装が含まれています。この実装は現在 ParaView-Catalyst と呼ばれています。したがって、これはデータ処理とレンダリングに ParaView を使用する Catalyst In Situ API の実装です。

Catalyst in situ API は、計算シミュレーションコードから Catalyst 実装にデータや制御を渡すために使用される 5 つの関数呼び出しで構成されています:catalyst_initializecatalyst_executecatalyst_resultscatalyst_finalizecatalyst_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_NAMECATALYST_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: (必須)チャネルの種類を表す文字列。現在サポートされている値は meshmultimesh のみです。

    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:

    1. attribute_type`: 文字列であり、フィールドの属性タイプを表します。これにより VTK は GlobalIds のような属性配列を使用できるようになります。使用される値は vtkDataSetAttributes::AttributeTypes のエントリと Ghosts です。値の完全な一覧は以下のとおりです。

      • Scalars

      • Vectors

      • Normals

      • TCoords

      • Tensors

      • GlobalIds

      • PedigreeIds

      • EdgeFlag

      • Tangents

      • RationalWeights

      • HigherOrderDegrees

      • ProcessIds

      • Ghosts

    2. 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 です。

typeio の場合、以下の属性がサポートされます。

  • filename: (必須)ファイル名を表す文字列。{timestep} を使用してタイムステップに置換したり、{time} を使用して時刻の値に置換することができます。fmt 形式の書式指定子(例:{time:03f} など)を使用することも可能です。ファイル名は、データを保存する際に使用されるサポート対象のライターを決定するために使用される場合があります。

  • channel: (必須)チャネルを名前で識別する文字列。

プロトコル: multimesh

これは、channel/typemultimesh に設定されている場合に channel/data に使用されるプロトコルです。

  • channel/data/[block-name]: (プロトコル: mesh): (任意)存在する場合、Conduit Mesh プロトコルを使用して記述された個々のメッシュ/ブロックを表します。これは複数のブロックに対して繰り返すことができます。block-name は各ブロックごとに一意でなければなりません。

  • channel/assembly: (任意)存在する場合、multimesh 内の個々のメッシュ/ブロック間の任意の階層関係を定義するために使用できます。例えば、blockAblockB という 2 つのブロックがある場合、次のような階層構造を定義できます。したがって、すべてのノードは object、list、または string のいずれかであり、string の場合は有効なブロック名を参照しなければなりません。

channel/assembly/
                 AllBlocks: [“blockA”, “blockB”]
                 BlockA: “blockA”
                 BlockB: “blockB”
                 SubGroup/
                          AnotherChild: “blockA”