In-Situ PBVR(v1.1)マニュアル

2021 年 5 月

国立研究開発法人日本原子力研究開発機構
システム計算科学センター

改訂履歴
版数

改定日

章番号

改版内容

1.0

2019.03.28

-

新規

1.1

2021.05.01

クライアント・サーバ型 PBVR と共通の GUI に修正i目次
１ はじめに ............................................................................................................................................ 4

１.１. 粒子サンプラの概要 ................................................................................................................. 5
１.２. デーモンの概要 ........................................................................................................................ 5
１.３. PBVR クライアントの概要 ....................................................................................................... 6
１.４. 動作環境 ................................................................................................................................... 6
２ パッケージ構成 ................................................................................................................................. 7

２.１. ロードモジュールパッケージ................................................................................................... 7
２.２. ソースコードパッケージ .......................................................................................................... 8
３ ソースパッケージのビルド ............................................................................................................... 9３.１. デーモン、粒子サンプラ .......................................................................................................... 9３.２. PBVR クライアント ................................................................................................................ 10
４ In−Situ 可視化のセットアップ ....................................................................................................... 11

４.１. 環境変数の設定 ...................................................................................................................... 11
４.２. 可視化パラメータの設定 ........................................................................................................ 11
４.３. ポートフォワード接続 ........................................................................................................... 11
４.３.１. ２点間リモート接続 ....................................................................................................... 12
４.３.２. 多段リモート接続 .......................................................................................................... 12４.４. デーモンの起動とポートフォワード接続............................................................................... 12
５ 粒子サンプラ ................................................................................................................................... 14

５.１. 構造格子向けの粒子生成関数................................................................................................. 14
５.２. 非構造格子向けの粒子生成関数 ............................................................................................. 15
５.３. 階層格子向けの粒子生成関数................................................................................................. 16
５.４. 粒子サンプラの組込み ........................................................................................................... 17
５.４.１. 領域情報の定義と粒子生成関数の追加 .......................................................................... 18
６ PBVR クライアント ....................................................................................................................... 19

６.１. 起動方法 ................................................................................................................................. 19
６.２. 終了方法 ................................................................................................................................. 19
６.２.１. 強制終了.......................................................................................................................... 20
６.３. GUI の構成と操作方法 ............................................................................................................ 21
７ サンプルの実行 ............................................................................................................................... 22

７.１. プログラム実行が許可されたログインノード ....................................................................... 22
７.２. 対話ジョブ ............................................................................................................................. 23
７.３. Windows.................................................................................................................................. 25
ii

iii

１ はじめに
本書は日本原子力研究開発機構システム計算科学センターで開発した In-Situ による遠隔可視化フ
レームワーク In−Situ PBVR のマニュアルである。昨今のスーパーコンピュータでは演算速度が I/O 速
度を大幅に上回るため、計算結果の出力が困難になった。その結果、遠隔地にあるストレージ上の計算
結果を手元の PC に転送して可視化する従来の可視化手法は適用が困難になった。In-Situ 可視化は、シミュレーションに結合された可視化プログラムが計算と同時に可視化処理を実行することで大規模なデータ I/O を回避し、確実に可視化画像を生成することができる。ポリゴンベースによる従来の手法
では対話的な In-Situ 可視化が難しかったが、In−Situ PBVR は粒子ベースによる可視化と対話的 In-Situ
制御技術により対話的な可視化を可能にしたフレームワークである。
In-Situ PBVR は C++で開発され，京都大学小山田研究室で開発された粒子ベースのボリュームレン
ダリング手法である PBVR（Particle Based Volume Rnderring）法，および，可視化ライブラリ KVSを用いて構築されている。本フレームワークは粒子サンプラ、デーモン、PBVR クライアントの３つのコンポーネントで構成されている（図 １-1）。
（１） 粒子サンプラ
粒子サンプラはシミュレーションコードに結合され、計算と同じ環境で粒子を生成する可視化ライブラリである。シミュレーション＋In-Situ 可視化のコードを構築するには、粒子サンプラが提供する可視化用関数に計算結果の配列を渡しシミュレーションコードに挿入する。粒子サ
ンプラはストレージ上の可視化パラメータファイルを参照して、各タイムステップの計算結果を圧縮された可視化用粒子に変換し、ストレージ上に出力する。粒子ファイルは各プロセスから分散して出力される。
（２） デーモン
デーモンはログインノードあるいは対話ジョブ上で動作し、ストレージ上の粒子ファイルとPBVR クライアントから送信されてくる可視化パラメータを仲介する機能をもち、対話的 InSitu 制御の要となるアプリケーションである。デーモンはストレージ上のファイルを監視して分散出力された粒子ファイルを集約し、ネットワークを介してユーザ PC に転送する。またデーモンは PBVR クライアントから送信されてくる可視化パラメータを受信し、粒子サンプラが参照する可視化パラメータファイルとして出力する。この動作はシミュレーションと非同期に実行されるため、シミュレーションを阻害せずに対話的制御が可能である。
（３） PBVR クライアント
PBVR クライアントはユーザ PC 上で動作し、可視化結果を表示するビューワと可視化パラメー
タを編集する GUI を提供する。PBVR クライアントはポートフォワードを使用してデーモンと通信しする。PBVR クライアントはデーモンからの粒子データを受信してビューワ上にボ
リュームレンダリング画像を表示し、ユーザが GUI 上で編集した可視化パラメータをデーモンに送信する。
In-Situ PBVR には、様々なシミュレーションに汎用的に対応可能な多変量可視化機能が実装されている。３次元データの可視化では計算結果のデータに色と不透明度を割り当てる。そして、その関係を記述する関数を伝達関数と呼ぶ。従来の可視化では一つの物理値に対して、色・不透明度を割り当てる4

１次元伝達関数が利用されていた。しかし従来の可視化手法では多変量向けの多次元伝達関数を設計することが困難であった。In-Situ PBVR は代数式により多次元伝達関数を設計できる伝達関数エディタを提供している。伝達関数エディタでは各変量の１次元伝達関数を編集し、それらを変数として任意の代数式による多次元伝達関数を記述できる。この代数式では基本的な演算子や初等関数、微分演算子が利用可能である。
スーパーコンピュータ（スパコン）
シミュレーション
粒子サンプラネットワークデーモン

粒子データの集約

粒子データ

可視化
パラメータ

ユーザ
PC

可視化
パラメータ PBVRクライア



ント



粒子データ
可視化パラメータ
色

粒子データ

不透明度

ストレージ

図 １-1 In-Situ PBVR フレームワークの全体構成

１.１. 粒子サンプラの概要
粒子サンプラは、MPI/OMP のハイブリッドプログラミングモデルで並列化され、更に SIMD 演算を利用することで可視化用粒子の生成を加速させている。粒子サンプラは、シミュレーションで用いる
領域分割を変えることなく MPI 並列化され、各部分領域で OpenMP による要素並列で粒子を生成する。多変量可視化で必要となる物理値の合成や伝達関数の合成、そして物理値の補間計算が SIMD 演
算の利用によりベクトル化されている。
粒子サンプラはシミュレーションで利用する格子の種類に合わせて、構造格子向け、非構造格子向け、そして階層格子向けの３種類が利用可能である。粒子サンプラは C／C++そして、FORTRAN で記述されたシミュレーションコードをサポートしている。In−Situ 可視化するために、粒子サンプラはシ
ミュレーションのタイムステップループに挿入される。この時、シミュレーション結果の多変量デー
タ、格子データ、そして領域の全体座標が粒子サンプラの引数として入力される。また、多変量データのメモリレイアウトは配列構造体（SOA）を仮定している。

１.２. デーモンの概要
デーモンはスーパーコンピュータの対話ノードあるいは対話ジョブで実行され、バッチ処理実行時の対話的可視化を実現するための要となる。デーモンはストレージ上のファイル情報を常に監視しており、粒子サンプラが出力した粒子ファイルを収集する。この収集作業は粒子サンプラ及びシミュレー
ションと非同期であるために、シミュレーションのパフォーマンスを阻害しない。粒子ファイルの収集は OpenMP で並列化されていて、デーモンは読み込んだ粒子データを一つの粒子データに集約して
PBVR クライアントに送信する。また PBVR クライアントから送信された可視化パラメータを受信し、粒子サンプラが使用するストレージ上の可視化パラメータファイルを更新する。

5

In-Situ PBVR ではデーモンと PBVR クライアントはインターネットを介したソケット通信でデータを送受信するため、対話ノードとユーザ PC がポートフォワードで接続される必要がある。そのため、ポートフォワードが許可されない運用のスーパーコンピュータではデーモンが動作せず、対話的可視化が利用できない。またバッチ処理終了時までファイル出力が行われないステージングによる I/O を採用したスーパーコンピュータでもまた対話的可視化が利用できない。

１.３. PBVR クライアントの概要
PBVR クライアントはユーザ PC 上で起動され、可視化結果を表示するための画面、伝達関数を編集するための伝達関数エディタから構成されている。伝達関数エディタでは、多変量可視化を実現するための機能である“伝達関数合成器”（TFS）が実装されている。TFS は、結果データに含まれる変量を組み合わせ新しいボリュームデータを生成するボリュームデータ合成機能と、複数の伝達関数を組み合わせる伝達関数合成機能を備えている。ユーザは TFS 上で代数式により合成関数を指定する。
代数式は可視化パラメータとして粒子計算モジュールに転送され、数式処理機能によりリアルタイムにボリュームデータ・伝達関数の合成が行われる。ユーザは TFS 上の代数式として、初頭的な数学関数や、物理変数の空間微分が利用可能であり、それらを組み合わせて自在に数式を構築可能である。

１.４. 動作環境
In-Situ PBVR はクロスプラットフォームのプログラムであり、富岳や東大/筑波 OakforestPACS、機構所有の SGI8600 等様々なスーパーコンピュータで動作する。下表に動作環境を示す。
表 １-1 PBVR クライアント
プラットフォーム

OS

コンパイラ

Linux

Ubuntu18

g++

Mac

OSX10

clang

Windows

Windows10

MSVC

表 １-2 デーモン
プラットフォーム

OS

コンパイラ

Linux

RedHatg++

表 １-3 粒子サンプラ
プラットフォーム

CPU (アーキテクチャ)

コンパイラ

富岳

A64FX (ARM)

富士通コンパイラ

OakforestPACS

Intel Xeon Phi (Knights Landing, KNL)

Intel コンパイラ

SGI8600

Intel Xeon GoldIntel コンパイラ6

２ パッケージ構成
CCSE の公開ページ(https://ccse.jaea.go.jp/software/In-Situ_PBVR/)から In-Situ PBVR のソースコー
ドおよびロードモジュール（バイナリ）のパッケージが利用可能である。PBVR クライアント、デーモ
ン、粒子サンプラはそれぞれユーザ PC、ログインノード、計算ノードで独立にビルドされ、連携して動作する。

２.１. ロードモジュールパッケージ
ロードモジュールに関して、Windows、Linux、Mac 用に構築された PBVR クライアントと、Linux
サーバ用に構築されたデーモン及び粒子サンプラを提供する。粒子サンプラおよびデーモンは
SGI8600 および富岳（clang-mode）上で構築された。粒子サンプラは以下の３つのライブラリから構成される。
（１） 粒子生成機能を提供する粒子生成ライブラリ（２） 可視化機能を提供する KVS ライブラリ（３） 代数式処理機能を提供する数式処理ライブラリ
さらに粒子生成ライブラリは、３種類のシミュレーションの格子構造（構想格子、非構造格子、階層型格子）に対応している。下表にロードモジュールの一覧を示す。
表 ２-1 PBVR クライアント
機種

並列化

パッケージ名Linux

OpenMP

pbvr_client_linux.tar.gz

Mac

OpenMP

pbvr_client_mac.tar.gz

Windows

OpenMP

pbvr_client_win.zip

表 ２-2 デーモン
機種

並列化

ロードモジュール名

SGI8600

OpenMP

pbvr_daemon_s86.tar.gz

富岳

OpenMP

pbvr_daemon_fugaku.tar.gz

表 ２-3 粒子サンプラ
機種

並列化

ロードモジュール名

SGI8600

MPI+OpenMP

pbvr_sampler_s86.tar.gz

富岳

MPI+OpenMP

pbvr_sampler_fugaku.tar.gz

7

２.２. ソースコードパッケージ
ソースコードパッケージに In-Situ PBVR の粒子サンプラ、デーモン、そして PBVR クライアントが含まれる。ソースコードパッケージを構成するソースツリーを表 ２-4 に示す。ソースコードパッケー
ジには粒子サンプラ結合済みのテストシミュレーションコードが含まれている。
表 ２-4 In-Situ PBVR のソースツリー
ディレクトリ・ファイル

説明

is_pbvr/

In-Situ PBVR のルートディレクトリ

|-pbvr.conf

make の設定ファイル|-Makefile

サンプラ、デーモン、クライアントのコンパイルする|-arch/

各環境のコンパイラの設定ファイル|-Client/

PBVR クライアントプログラム|-Common/

プロトコル、通信、共通ライブラリ|-Daemon/デーモンプログラム|-Example/

テストシミュレーションコードのサンプル

|C/

C版

|-Hydrogen_struct/

構造格子テストシミュレーションプログラム|-Hydrogen_AMR/

階層構造格子テストシミュレーションプログラム|-Hydrogen_unstruct/

非構造格子テストシミュレーションプログラム|-Fortran/

Fortran 版|-Hydrogen_struct/

構造格子テストシミュレーションプログラム|-Hydrogen_AMR/

階層構造格子テストシミュレーションプログラム|-Hydrogen_unstruct

非構造格子テストシミュレーションプログラム|-FunctionParser/

数式処理ライブラリ|-InSituLib/

粒子生成ライブラリ|-struct/

構造格子向け粒子生成ライブラリ|-AMR/

階層構造格子向け粒子生成ライブラリ|-unstruct/

非構造格子向け粒子生成ライブラリ|-KVS/

可視化ライブラリ KVS

8

３ ソースパッケージのビルド
PBVR クライアントはユーザ PC 上で、デーモンと粒子サンプラはスーパーコンピュータ上でソースコードをビルドすることで生成される。

３.１. デーモン、粒子サンプラ
ソースパッケージからデーモンおよび粒子サンプラのライブラリをビルドする手順を示す。以下の手順では、ソースパッケージがスパコン上にダウンロード済みであり、ファイルのダウンロードパスを$HOME とする。
is_pbvr_1.10.tar.gz を解凍する。

①$ cd $HOME$ tar xvfz is_pbvr_1.10.tar.gz②

コンフィグファイルを編集する。

ビルドに使用するコンパイラは pbvr.conf を環境に合わせて編集することで制御される。
pbvr.conf 内
で指定している変数の概要を表 ３-1 に、変数の値として利用できるコンパイル設定ファイルの一覧を
表 ３-2 に示す。
表 ３-1

pbvr.conf の変数一覧

変数

入力値

説明

PBVR_MACHINE

文字列

arch 配下のコンパイル設定ファイルを指定

表 ３-2 コンパイル設定ファイル一覧
ファイル名

説明

Makefile_machine_gcc

gcc による逐次版コンパイルの設定

Makefile_machine_gcc_omp

gcc による OpenMP 版コンパイルの設定

Makefile_machine_gcc_mpi_omp

gcc による MPI+OpenMP 版コンパイルの設定

Makefile_machine_intel

intel による逐次版コンパイルの設定

Makefile_machine_intel_omp

intel による OpenMP 版コンパイルの設定

Makefile_machine_intel_mpi_omp

intel による MPI+OpenMP 版コンパイルの設定

Makefile_machine_fugaku_clang

富岳(ARM)clang モードのコンパイル設定

Makefile_machine_fugaku_trad

富岳(ARM)trad モードのコンパイル設定

Makefile_machine_s86_mpi_omp

機構 SGI8600(Intel Xeon Gold)向けのコンパイルの設定

Makefile_machine_ofp_mpi_omp

OakforestPACS(KNL)向けのコンパイルの設定

9$ cd $HOME/is_pbvr$ cat pbvr.conf
PBVR_MACHINE=Makefile_machine_gcc_mpi_omp
PBVR_MAKE_CLIENT=0
make によってデーモンと、粒子サンプラを構成するライブラリ群がビルドされる。

③$ cd $HOME/is_pbvr$ make all_clean$ make
表 ３-3 make によって生成されるファイル
ディレクトリ名

ファイル名

説明

KVS

libkvsCore.a

KVS ライブラリ。粒子データフォーマットや可視化機能を提供する。

CommonlibpbvrCommon.a

通信ライブラリ。ソケット通信用のプロトコルを提供する。

Daemonpbvr_daemon

デーモン

FuctionParser

libpbvrFunc.a

数式処理ライブラリ。数式処理の機能を提供する。

InsituLib/struct

libInSituPBVR.a

構造格子向け粒子生成ライブラリ

InsituLib/unstruct

libInSituPBVR.a

非構造格子向け粒子生成ライブラリ

InsituLib/AMR

libInSituPBVR.a

階層格子向け粒子生成ライブラリ④

以上でデーモンおよび粒子サンプラのビルドは完了であるが、続けて Example 以下にあるテス
トコードのビルド方法を示す。

$ cd $HOME/is_pbvr/Example/C/Hydrogen_struct$ make３.２. PBVR クライアント
PBVR クライアントはクライアント・サーバ型 PBVR (https://ccse.jaea.go.jp/software/PBVR/)と共通のコードで構築されている。In-Situ 向けに PBVR クライアントをビルドするために、qtpbvr.conf を
以下のように編集して PBVR_MODE=IS を有効にして下さい。
#PBVR_MODE - Either CS (ClientServer), or IS (Insitu) - Needed on all
platforms#PBVR_MODE = CS
PBVR_MODE = IS
PBVR クライアントのビルド方法の詳細は、クライアント・サーバ型 PBVR のマニュアルを参照して
ください。

10

４ In−Situ 可視化のセットアップ
シミュレーションに結合された粒子サンプラ、対話ノード上で動作するデーモン、そしてユーザ PC
上の PBVR クライアントが連携することで、バッチ処理されるシミュレーションが対話的に可視化される。これを実現するためには、幾つかの簡単な設定とポートフォワード接続が必要になる。

４.１. 環境変数の設定
デーモンと粒子サンプラは以下の表 ４-1 に示す環境変数を利用しており、実行時には export コマン
ドで環境変数を設定する必要がある。
表 ４-1 デーモンおよび粒子サンプラで参照する環境変数
環境変数名

説 明

VIS_PARAM_DIR

伝達関数ファイル（可視化パラメータ）の配置されるディレクトリ※1

PARTICLE_DIR

疑似シュミレーションコードが粒子データを出力するディレクトリ※1

TF_NAME

伝達関数のファイル名（拡張子は含まない）※2※１ 指定が無い場合、デーモンおよび粒子サンプラは各々が実行されているカレントディレクトリ
を検索する。
※２ 指定が無い場合、デーモンおよび粒子サンプラは伝達関数名として default.tf を採用する。

４.２. 可視化パラメータの設定
粒子サンプラがシミュレーション結果のボリュームデータを可視化用粒子データに変換する際に、伝達関数や可視化する物理値のレンジ、画面解像度等の可視化パラメータが必要とされる。可視化パ
ラメータはその各項目が伝達関数ファイルの中にタグベースで記述される。ユーザはソースパッケージの Example の中に格納してある default.tf を初起動時の伝達関数ファイルとして利用できる。
In−Situ PBVR を実行するために、ユーザは伝達関数ファイルを表 ４-1 の VIS_PARAM_DIR で指定されるディレクトリに TF_NAME で指定されるファイル名で配置する必要がある。
ユーザはデーモンと PBVR クライアントを起動することで GUI により伝達関数ファイルの内容を編集できる。環境変数で指定された伝達関数ファイルはデーモンに読み取られ、PBVR クライアント上に内容表示され、編集後上書きされる。

４.３. ポートフォワード接続
デーモンと PBVR クライアントの間で粒子データや可視化パラメータはソケット通信により送受信される。遠隔地のスーパーコンピュータ上の対話ノードと手元の PC の間でソケット通信するために、ユーザは双方のポート間を ssh ポートフォワーディングで接続する必要がある。

11

４.３.１. ２点間リモート接続
手元の machineA と遠隔地に有る machineB の２点間でポートフォワーディングするには以下のコ
マンドを利用する。
machineA> ssh -L portnumA:hostnameB:portnumB username@machineB
上記のコマンドにおいて、portnumA は machineA のポート番号、hostnameB は machineB のホスト名、portnumB は machineB のポート番号である。hostnameB は machineB のターミナル
上に表示されている場合が多く、また hostname コマンドでも確認できる。また、machineB のログ
インノードでポートフォワードが許可されている場合、hostnameB は特別なホスト名を入力する必要はなく、localhost が利用できる。

４.３.２. 多段リモート接続
遠隔地の 2 台のマシンでクライアントプログラム（machineA）とデーモンプログラム（machineB）
を起動するが，セキュリティ上の理由等により machineC を経由して接続する例を示す。この場合も2 点間の場合と同様に ssh ポートフォワードが確立した後の起動方法はスタンドアロンと同じである。
手順 1[ssh ポートフォワード A→C]
machineA> ssh -L 60000:localhost:60000 username@machineC（machineA の 60000 番ポートを machineC の 60000 番ポートにフォワード）手順 2[ssh ポートフォワード C→B]
machineC> ssh -L 60000:localhost:60000 username@machineB（machineC の 60000 番ポートを machineB の 60000 番ポートにフォワード）４.４. デーモンの起動とポートフォワード接続
デーモンは対話的処理が可能なノードあるいは、対話ジョブにおいて起動され、PBVR クライアン
トとソケット通信する。ユーザは手元の PC のターミナルから対話ノードへ ssh ポートフォワーディ
ングし、デーモンのロードモジュールが配置されたディレクトリに移動し、以下のようにデーモンを起動する。
$ ./pbvr_daemon
first reading time[ms]:0
Server initialize done
Server bind done
Server listen done
Waiting for connection ...
上記のようにクライアントとのソケット通信の接続待ちになったら，別の端末から PBVR クライア
ントを起動する。デーモン起動時のポート番号の省略値は 60000 である。ポート番号は，以下のように起動時のコマンドラインオプション–p で変更できる。
$ ./pbvr_daemon –p 71000
12

デーモンは先述した環境変数（４.１節）を参照して粒子ファイルの集約や伝達関数ファイルの更新を行う。そして起動時に指定されたポートを通じて PBVR クライアントとデータの送受信を行う。

13

５ 粒子サンプラ
シミュレーションコードに generate_particles 関数を挿入することで、粒子サンプラが In−Situ に可視化用粒子を生成できるようになる。この関数は kvs_wrapper.h で定義されており、粒子生成ライブ
ラリを参照・リンクすることで使用可能となる。
シミュレーションに結合された粒子サンプラはシミュレーションのバッチ処理と共に実行され、先述した環境変数（４.１節）と伝達関数ファイル（４.２節）を参照しながら計算結果のボリュームデー
タを可視化用粒子データに変換する。粒子サンプラは PARTICLE_DIR で指定されたディレクトリに粒子データファイルと、領域の最大最小値を記した t_pfi_coords_minmax.txt ファイルを出力する。粒子
データファイルは、ヘッダファイル（kvsml）、座標ファイル（coord.dat）、色ファイル（color.dat）、法
線ファイル（normal.dat）で構成されており、各タイムステップで１ノードにつき１組ずつ出力される。
同時に、粒子サンプラは VIS_PARAM_DIR に伝達関数の変更履歴を記した$TF_NAME_タイムステッ
プ.tf ファイルと、ヒストグラムや可視化対象の物理値のレンジを記した history_タイムステップ.txt
ファイル、処理タイムステップ区間を記した state.txt を出力する。

５.１. 構造格子向けの粒子生成関数#include “kvs_wrapper.h”
void generate_particles(
int time_step, domain_patameters dom, Typs** volume_data, int num_volume_data );この関数はシミュレーションのタイムステップや計算領域の情報、シミュレーション結果のボ
リュームデータを引数とする。
・

int time_step：シミュレーションタイムステップ。

・

domain_patameters dom：以下に示す計算領域を定義する構造体。
typedef struct{
float x_global_min; //全計算領域のｘ座標の最小値
float y_global_min; //全計算領域の y 座標の最小値
float z_global_min; //全計算領域の z 座標の最小値
float x_global_max; //全計算領域のｘ座標の最大値
float y_global_max; //全計算領域の y 座標の最大値
float z_global_max; //全計算領域の z 座標の最大値
float x_min;//部分領域のｘ座標の最小値

float y_min;//部分領域の y 座標の最小値

float z_min;//部分領域の z 座標の最小値

int* resolution;//格子解像度 int resolution[3]へのポインタ

float cell_length;//格子の単位長さ} domain_parameters;

14

・

Typs** volume_data：シミュレーション結果のボリュームデータの配列へのポインタ。Type はユー
ザ指定の物理値の型であり、多変数のボリュームデータは 2 次元配列として定義される。格子解
像 度 (X,Y,Z) の ボ リ ュ ー ム デ ー タ に お い て 、 n 番 目 の 変 数 の 位 置 (i,j,k) の 値 はvolume_data[n][i+j*X+k*X*Y]で参照する。

・

int num_volume_data：変数の数

５.２. 非構造格子向けの粒子生成関数#include “kvs_wrapper.h”
void generate_particles(
int time_step, domain_parameters dom, Type** values, int nvariables, float* coordinates,
int ncoords, unsigned int* connections, int ncells );この関数はシミュレーションのタイムステップや計算領域の情報、シミュレーション結果のボ
リュームデータ、非構造格子の格子情報を引数とする。
・

int time_step：シミュレーションタイムステップ。

・

domain_patameters dom：以下に示す計算領域を定義する構造体。
typedef struct{
float x_global_min; //全計算領域のｘ座標の最小値
float y_global_min; //全計算領域の y 座標の最小値
float z_global_min; //全計算領域の z 座標の最小値
float x_global_max; //全計算領域のｘ座標の最大値
float y_global_max; //全計算領域の y 座標の最大値
float z_global_max; //全計算領域の z 座標の最大値} domain_parameters;・Typs** volume_data：シミュレーション結果のボリュームデータの配列へのポインタ。
Type はユー
ザ指定の物理値の型であり、多変数のボリュームデータは 2 次元配列として定義される。n 番目の変数の cell 番目の頂点上の値は volume_data[n][cell]で参照する。

・

float* coordinates：頂点座標の配列へのポインタ。i 番目の頂点座標(x,y,z)は(coordinates[3*i],coordinates[3*i+1], coordinates[3*i+2])で参照する。

・

int ncoords：頂点の数。

・

unsigned int* connections：六面体要素を構成する頂点 ID の接続リストへのポインタ。六面体要素の構成を図 ５-1 に示す。i 番目の六面体要素の n 番目の頂点は connections[6*i+n]で参照する。

・

int ncells：要素の数。

15

0

3
1

2

4

7
5

6

図 ５-1 六面体要素の頂点接続

５.３. 階層格子向けの粒子生成関数
In-Situ PBVR ではメニーコア計算機のメモリレイアウトに最適化された階層格子構造（Block
Structured AMR）をサポートしている。このタイプの格子は、N3 の直交格子を最小の処理領域の単位（リーフ）と定義し、各階層でサイズの異なるリーフが接続されている。そのため Block Structured AMR
は NxNxNxL(L はリーフ数)の四次元格子として定義される。図 ５-2 に二次元の例を示す。

図 ５-2 二次元の階層格子の例。上部が階層 Lv.1 で下部が階層 Lv.2.の格子。リーフが 2x2 の直交格子で定義され、赤が Lv.1 のリーフ、青が Lv.2 のリーフ。
#include “kvs_wrapper.h”
void generate_particles(
int time_step, domain_patameters dom,
std::vector<float>& leaf_length,
std::vector<float>& leaf_min_coord,
int nvariables, float** values);
この関数はシミュレーションのタイムステップや計算領域の情報、階層格子の構成情報、シミュレー
ション結果のボリュームデータを引数とする。
・

int time_step：シミュレーションタイムステップ。

・

domain_patameters dom：以下に示す計算領域を定義する構造体。

16

typedef struct{
float x_global_min; //全計算領域のｘ座標の最小値
float y_global_min; //全計算領域の y 座標の最小値
float z_global_min; //全計算領域の z 座標の最小値
float x_global_max; //全計算領域のｘ座標の最大値
float y_global_max; //全計算領域の y 座標の最大値
float z_global_max; //全計算領域の z 座標の最大値
int* resolution;//格子解像度 int resolution[4]へのポインタ} domain_parameters;
・・

std::vector<float>& leaf_length ： リ ー フ の 長 さ の 配 列 へ の 参 照 。 l 番 目 の リ ー フ の 長 さ は
leaf_length[l]で参照する。

・

std::vector<float>& leaf_min_coord：リーフの最小位置座標の配列への参照。l 番目のリーフの座
標は(leaf_min_coord[3*l], leaf_min_coord[3*l+1], leaf_min_coord[3*l+2])で参照する。

・

float** values：シミュレーション結果のボリュームデータの配列へのポインタ。多変数のボリュー
ムデータは 2 次元配列として定義される。格子解像度(X,Y,Z,L)のボリュームデータにおいて、n 番
目の変数の位置(i,j,k,l)の値は values[n][i+j*X+k*X*Y+l*X*Y*Z]で参照する。

・

int nvariables：変数の数

５.４. 粒子サンプラの組込みユーザのシミュレーションコードに generate_particles 関数を組み込みコンパイルすることで、In−
Situ 可視化が可能になる。この章ではテストシミュレーションコードを例とした粒子サンプラの組み込み手順を示す。テストシミュレーションコードは、水素の電荷密度の式により各タイムステップで格子頂点上に電荷密度の値を計算する。そのため計算するクラス名は Hydrogen となっている。粒子サ
ンプラの組み込みがない状態のコードは以下のようになっている。
#include "Hydrogen.h"#include <iostream>#include <mpi.h>
int main( int argc, char** argv ){MPI_Init(&argc, &argv);
Hydrogen hydro;
int time_step = 0;
for(;;){hydro.values;
time_step++;}
MPI_Finalize();
return 0 ;}17上記ソースコードにおいて、
Hydrogen クラスは for 文中の hydro.values で各タイムステップのボリュー
ムデータを出力している。

５.４.１. 領域情報の定義と粒子生成関数の追加
generate_particles 関数は構造体 domain_parameters によって領域情報を取得する。
ユーザはシミュレーションコードから得られる領域情報を構造体にコピーする必要がある。
int mpi_rank;
MPI_Comm_rank( MPI_COMM_WORLD, &(mpi_rank) );int resol[3] = { hydro.resolution.x(), hydro.resolution.y(), hydro.resolution.z() };domain_parameters dom = {hydro.global_min_coord.x(),hydro.global_min_coord.y(),hydro.global_min_coord.z(),hydro.global_max_coord.x(),hydro.global_max_coord.y(),hydro.global_max_coord.z(),hydro.global_region[mpi_rank].x(),hydro.global_region[mpi_rank].y(),0.0,resol,hydro.cell_length};
上記コードでは、Hydrogen の部分領域の情報を得るために MPI のランク数を取得している。
領域情報とシミュレーション結果のボリュームデータを generate_particles 関数に入力する。
generate_particles 関数はタイムステップループの内部でシミュレーション後にコールされる。
Hydrogen の例の場合、以下のように挿入される。

int time_step = 0;
for(;;) {generate_particles( time_step, dom, hydro.values, hydro.nvariables )time_step++;}

18

６ PBVR クライアント
PBVR クライアントはデフォルトでデーモンとから受信した最新タイムステップの粒子データを描画する。粒子データはビューワ上に OpenGL により描画される。PBVR クライアントは伝達関数を含む可視化パラメータを編集する GUI を提供し、可視化パラメータをデーモンに送信する。デーモンとPBVR クライアント間のデータの送受信はソケット通信により任意のポート番号を通して行う。

６.１. 起動方法
PBVR クライアントは以下のコマンドで実行する。
$ pbvr_client [コマンドラインオプション]
表 ６-1 クライアントのコマンドラインオプション一覧
オプション

指定値

デフォルト

機能

-p

ポート番号

60000

ソケット通信ポート番号-viewer

100 ～ 9999 ×

620×620PBVR クライアント解像度-

シェーディング方法 ※1

100～9999-shading{L/P/B},ka,kd,ks,n※1. シェーディング方法の指定は以下の通り。
L:ランバートシェーディング
効果：拡散反射を考慮したシェーディングを与える。
使用パラメータ：ka（物体の明るさに掛かる係数。0〜１の実数），kd（法線方向と光線方向から計算される拡散反射成分に掛かる係数。０〜１の実数）
P：フォンシェーディング
効果：ランバートシェーディングにハイライト効果を追加したもの。
使用パラメータ：ka,kd,ks（視線方向，法線方向，光線方向から計算される鏡面反射成分に掛かる係数。０〜１の実数），n（ハイライトの強さ。０〜１００の実数）
B：ブリン−フォンシェーディング
効果：フォンシェーディングの簡略化モデル
使用パラメータ：ka,kd,ks,n６.２. 終了方法
PBVR クライアントの終了はプログラムを起動したコンソールにおいて Ctrl+c キーを押して行う。
Ctrl+c キーを押すと，時刻更新のタイミングで PBVR クライアントはデーモンと同期し、両方が終了する。ただし，タイムステップ制御パネルの Stop ボタンで通信を中断させた状態だと Ctrl+c キーの入19

力は無視される。また、デーモンを Ctrl+c キーで終了させてしまうと，PBVR クライアントを Ctrl+c
キーで終了させることができなくなるため注意すること。

６.２.１. 強制終了
何らかの理由により Ctrl+c キーの押下で PBVR クライアントとデーモンが終了しない場合は、以下に示すように，ps コマンドでクライアントとデーモンのプロセス番号を取得し，kill コマンドで強制終了させる。
【クライアントプロセスの強制終了】$ ps -C PBVRViewer
PID TTY
19582 pts/6

TIME CMD
00:00:00 PBVRViewer$ kill -9 19582【デーモンプロセスの強制終了】$ ps -C CPUServer
PID TTY
19539 pts/5

TIME CMD
00:00:00 CPUServer$ kill -9 19539

20

６.３. GUI の構成と操作方法
PBVR クライアントはクライアント・サーバ型 PBVR (https://ccse.jaea.go.jp/software/PBVR/)と共通の GUI で構築されている。PBVR クライアントの操作方法の詳細は、クライアント・サーバ型 PBVRのマニュアルを参照してください。

21

７ サンプルの実行
ソースコードパッケージに含まれる Example を用いて、Linux/Mac から富岳にポートフォワード接続し、In−Situ PBVR を実行する例を示す。ここでは、プログラム実行が許可されたログインノードを利用する方法と、対話ジョブを利用する方法を紹介する。また Windows から遠隔のサーバにアクセス
し In−Situ PBVR を実行する例を示す。

７.１. プログラム実行が許可されたログインノード
富岳上でプログラム実行が許可されたログインノードにログインし、非構造格子用のテストプログ
ラム（is_pbvr/Example/Hydrogen_unstruct）を実行する手順を示す。この例では、RSA 公開鍵及び sshのホスト名・ユーザ名の設定が済んでおり、ソースパッケージが富岳上の /home/ に配置され、ビルドが完了しているものとする。この手順では、In-Situ PBVR を結合したテストプログラムをジョブ投入し、ログインノード上でデーモンを、ユーザ PC 上で PBVR クライアントを起動する。
ターミナルを立ち上げ、富岳にログインし、投入スクリプト“run.sh”を用いてテストプログラムをジョブ投入する。
［ターミナル１］[userPC]$ ssh ユーザ ID@login.fugaku.r-ccs.riken.jp[fugaku]$ cd /home/is_pbvr/Example/Hydrogen_unstruct[fugaku]$ mkdir particle_out[fugaku]$ cat run.sh#!/bin/sh#PJM -L "node=1"#PJM -L "rscunit=rscunit_ft01"#PJM -L "rscgrp=small"#PJM -L "elapse=0:60"#PJM --mpi max-proc-per-node=4,proc=4#PJM -sexport OMP_NUM_THREADS=12
export TF_NAME=default
export VIS_PARAM_DIR=$PJM_JOBDIR
export PARTICLE_DIR=$PJM_JOBDIR/particle_out
mpiexec -n 4 ./run qsub run.sh[fugaku]$ pjsub run.sh22２つ目のターミナルで、プログラム実行が許可されたログインノードとユーザ PC をポートフォワー
ド接続しデーモンを起動する。
［ターミナル２］[userPC]$ ssh -L 61000:localhost:61000 ユーザ ID@loginX.fugaku.r-ccs.riken.jp[fugaku]$ source /opt/intel/bin/compilervars.sh intel64[fugaku]$ cd /home/is_pbvr/Daemon[fugaku]$ export VIS_PARAM_DIR=/home/is_pbvr/Example/Hydrogen_unstruct

X は 1~6

Intel コンパイラを active にする[fugaku]$ export PARTICLE_DIR=$VIS_PARAM_DIR/particle_out[fugaku]$ ./pbvr_daemon -p 61000
３つ目のターミナルで、ユーザ PC 上の PBVR クライアントを起動する。
［ターミナル３］[usrPC]$ ./pbvr_client -p 61000

７.２. 対話ジョブ
１つ目のターミナルを立ち上げ、富岳にログインし、投入スクリプト“run.sh”を用いてテストプロ
グラムをジョブ投入する。
［ターミナル１］[userPC]$ ssh FUGAKU[fugaku]$ cd /home/is_pbvr/Example/Hydrogen_unstruct[fugaku]$ mkdir particle_out[fugaku]$ cat run.sh#!/bin/sh#PJM -L "node=1"#PJM -L "rscunit=rscunit_ft01"#PJM -L "rscgrp=small"#PJM -L "elapse=0:60"#PJM --mpi max-proc-per-node=4,proc=4#PJM -sexport OMP_NUM_THREADS=12
export TF_NAME=default
export VIS_PARAM_DIR=$PJM_JOBDIR
export PARTICLE_DIR=$PJM_JOBDIR/particle_out
mpiexec -n 4 ./run qsub run.sh23

富岳はログインノード上でのプログラム実行が許可されていないため、計算ノードとユーザ PC を
ポートフォワード接続し、対話ジョブでデーモンを実行する。
ターミナル２で対話ジョブを起動し、対話ジョブ実行中の計算ノードの IP アドレスを取得する。ip
コマンドにより表示されるネットワーク情報の中で、inet の後ろにある IP アドレスが計算ノードの IP
アドレスである。
［ターミナル２］[userPC]$ ssh FUGAKU[fugaku]$ cd /home/is_pbvr/Example/Hydrogen_unstruct[fugaku]$ ln -s /home/is_pbvr/Daemon/pbvr_daemon[fugaku]$ pjsub --interact -L "node=1" -L "rscgrp=int" \[fugaku]$ -L "elapse=0:10:00" --sparam "wait-time=600"[intrct]$ ip address show tofu1……
inet **.**.**.**/12 brd 10.255.255.255 scope global noprefixroute tofu1……
計算ノードの IP アドレスを用いて、ターミナル３でユーザ PC と計算ノードをポートフォワード接続する。
［ターミナル３］[userPC]$ ssh -L 60000: **.**.**.**:60000 FUGAKU
ターミナル２でデーモンを実行する。
［ターミナル２］[intrct]$ export TF_NAME=default[intrct]$ export VIS_PARAM_DIR=$PJM_JOBDIR[intrct]$ export PARTICLE_DIR=$PJM_JOBDIR/particle_out[intrct]$ ./pbvr_daemon
ターミナル４で、ユーザ PC 上の PBVR クライアントを起動する。
［ターミナル４］[userPC]$ ./pbvr_client -p 60000

24

７.３. Windows
Windows クライアントから遠隔サーバにリモート接続する際の手順を以下に示す。尚、以下の手順
では、クライアントのポート 60000 からサーバのポート 60000 に転送するものとしている。

① puttyjp を起動し、接続するサーバのアドレスを入力する。

25

② 左側のカテゴリから「接続 ⇒ SSH ⇒ トンネル」を選択する。

③ 源ポートに転送元のポート番号、送り先にサーバのポートを設定し、「追加」ボタンを押下する。

26

④ フォワードするポート一覧にポート転送の設定が追加されたら、「開く」ボタンを押下してサーバと接続する。

⑤ サーバに接続しているターミナルからデーモンを起動する。
$ cd $HOME/JAEA/pbvr_inSitu_1.00/Example_C/Hydrogen$ export VIS_PARAM_DIR=$HOME/JAEA/pbvr_inSitu_1.00/Example_C/Hydrogen$ export PARTICLE_DIR=$HOME/JAEA/pbvr_inSitu_1.00/Example_C/Hydrogen/jupiter_particle_out$ export TF_NAME=jupiter$ ./pbvr_daemon -p 60000⑥ Visual Studio 2017 付属の「VS 2017 用 x64_x86 Cross Tools コマンド プロンプト」を起動し、以下のコマンドを実行する。
>set TIMER_EVENT_INTERVAL=1000>cd C:\pbvr\pbvr_inSitu_work\x64\Release>pbvr_client.exe –p 60000

27

⑦ サーバに接続しているターミナルからテストコードを起動する。
$ cd $HOME/JAEA/pbvr_inSitu_1.00/Example_C/Hydrogen$ export VIS_PARAM_DIR=$HOME/JAEA/pbvr_inSitu_1.00/Example_C/Hydrogen$ export PARTICLE_DIR=$HOME/JAEA/pbvr_inSitu_1.00/Example_C/Hydrogen/jupiter_particle_out$ export TF_NAME=jupiter$ mpiexec –n 4 ./run

28

ファイル名 :IS-PBVRManual.docx

フォルダー :
/Users/kawamura/Documents/PBVROpenSourceProject/ISPBV
R/v.1.1/ReleaseCandidate/v.1.1/Manual/Japanese
テンプレート :/Users/kawamura/Library/Group

Containers/UBF8T346G9.Office/User
Content.localized/Templates.localized/Normal.dotm
表題 :
副題 :
作成者 :

y ido

キーワード :
説明 :作成日時 :

2021/04/27 23:13:00

変更回数 :

2

最終保存日時 :2021/04/27 23:13:00

最終保存者 :

河村 拓馬

編集時間 :

1 分

最終印刷日時 :2021/04/27 23:13:00

最終印刷時のカウント
ページ数 :

29

単語数 :9,158 (約)

文字数 :13,006 (約)