富士通長野システムエンジニアリング

  1. ホーム >
  2. 製品 & サービス >
  3. [研究開発] >
  4. AVS >
  5. 特集記事 - 標準モジュールの改造
トップ 製品概要 事例 ソリューション サポート & トレーニング 体験版CD-ROM 動作環境 価格 技術情報/FAQ お問い合わせ お見積もり ダウンロード リンク集

PDF PDF版 [175KB]

標準モジュールの改造
~望んだ可視化結果が得られるようにプログラムを改造~

AVS Technical Report -September,2008-


Contents

  1. はじめに
  2. advectorモジュールの改造
  3. おわりに

1. はじめに

AVS/Expressには多くの可視化モジュールが用意されています。代表的な可視化手法を網羅するように用意されてはいますが、使いこなしていくと標準機能をちょっと改良した表現がしたい場合もあります。

既存モジュールを組み合わせることによって表現できる場合もありますが、それでも実現が難しい場合には、モジュールを新規に作成することになります。実は、標準提供されているモジュールは、モジュールのVファイルと一部分のソースファイルが公開されています。そこで、これらを利用して標準モジュールの改造を行う方法をご紹介いたします。なお、モジュールを改造するためにはAVS/Express Devloperが必要になります。(AVS/Express Vizでは実施できません)

2. advectorモジュールの改造

ここでは、advectorモジュールを改造してみます。advectorモジュールは、定常の流れ場に対して、質量0の仮想粒子を飛ばしてその動きをアニメーションするモジュールです。

標準機能では、粒子の色はその位置でのベクトルの大きさによって決められていますが、これを粒子の初期リリース位置に基づいて色が付くように改造します。

標準機能版:粒子の色はベクトルの大きさによって決定される
改造機能版:粒子の色はパーティクルリリース位置のz座標値によって決定される

2-1. 改造の対象となるモジュールを探す

advectorモジュールは複数のモジュールを組み合わせています。まずは、改造の対象となるモジュールを特定します。advectorモジュールをダブルクリックして内部を開き、さらにAdvectマクロを開いて内部の構造を確認します。

                                     図1 Advectマクロの内部

この中に存在するDVという名前で始まるモジュールが、ソースコードとVファイルが公開されているモジュールです。DVadvectは、時事刻々のパーティクル位置を計算するモジュールであるため、これを改造することにします。

2-2. モジュールのVファイルと、ソースファイルを見つける

         図2  オンラインヘルプの呼び出し

DVadvectモジュールを右ボタンでクリックして現れるメニューより”help”を選択すると、オンラインマニュアルを参照することができます。

“Synopsis”の章にモジュールのパラメータの詳細が記述されており、omethod型のオブジェクトに呼び出し関数が登録されています。DVadvectの場合には、” DVadvect_update”という関数を呼び出していることが分かります。

DVadvectのVファイル、ソースファイルはオンラインマニュアルの「File」章を参照するとわかります。


File

  

v/dv.v

modules/advect.cUtility DVM macrosDVMadvect_param, Advect

空白が適切に入っておらず読みづらい表記になっていますが、以下の通りです。

Vファイル:v/dv.v
ソースファイル:modules/advect.c

これは、AVS/Expressのインストールフォルダ配下の vフォルダに存在する dv.vと、modulesフォルダに存在するadvect.cファイルを示します。

advectorモジュールの定義Vファイルも見つけておきます。
AVS/Expressのインストールフォルダ配下で” DVadvect”をという文字列を含むVファイルを検索する事で確認出来ます。その結果、vフォルダに「dv_macro.v」というファイルが見つかります。dv_macro.vには、全てのDVxxxxモジュールについて、マクロモジュールの定義が記述されています。dv_macro.vをテキストエディタで開いてDVadvectを検索すると、AdvectPointsの定義が見つかります。さらに、AdvectPointsの定義を再利用してAdvectが定義されている事がわかります。

  macro AdvectPoints {

    :

    :

};

AdvectPoints Advect {

    :

    :

};

次に”Advect”という文字列を含むVファイルを検索します。今度はたくさん見つかりますが、v/module.v が、advctorの定義Vファイルになります。(または、advectorモジュールのオンラインマニュアルのFile章を参照すると、v/module.vであることがわかります)
module.vファイルをテキストエディタで開き、advectorという文字列を検索します。以下の記述がadvectorの定義部分になります。

advect_points advector {

    :

    :

}; // advector

advectorモジュールはadvect_pointsモジュールを基にして作成されている事がわかります。 advect_pointsの定義部分も見つけておきます。

macro advect_points {

    :

    :

}; // advector

以上で、改造のために必要となるVファイルとソースファイルが見つかりました。次は、これらをコピーしてモジュールを作成します。

2-3.既存モジュールをコピーする

モジュール作成用のプロジェクト環境を作成した後、モジュールをコピーして動作の確認を行います。
(モジュール作成の詳細については、デベロッパーズガイド第6章を参照して下さい)
(注)以下、AVS/Expressインストールフォルダを<AVS/Express>と表記します。

(1)AVS/Expressを起動してプルダウンメニューの”プロジェクト”を選び、”プロジェクト新規保存”を選択します。あらかじめ用意しておいた空のフォルダか、新規フォルダを作成して選択します。AVS/Exressは終了させます。

(2)手順1で作成したプロジェクトフォルダ配下に、srcフォルダを作成します。

(3)<AVS/Express>/ module/advect.c を srcへコピーします。
関数の名前がオリジナルの関数と同じではコンパイル時に二重定義エラーになるため、関数名を変更します。赤字部分が変更箇所です。(合計4ヵ所の変更)

  :

int testFUNCadvec (OMobj_id in, double time, double start_time,

                               double release_interval, int dir, OMobj_id out);

int testDVadvect_update(OMobj_id mod_id, OMevent_mask event_mask, int seq_num)

{

  :

    return

          (testFUNCadvec(in, time, start_time, release_interval, dir, out));

}

int testFUNCadvec (OMobj_id in, double time, double start_time,

                               double release_interval, int dir, OMobj_id out)

{

  :

(4)<AVS/Express>/v/dv.v をvへコピーしてファイル名をsample_dv.vに変更します。

(5)sample_dv.v をテキストエディタで開き、以下の範囲を残して他を全て削除します。

module DVadvect<process="express",src_file="advect.c",build_dir="src"> {

    :

};

メソッドが呼び出す関数を改造版に置き換えるため、以下のように修正します。

module DVadvect<process="express",src_file="advect.c",build_dir="src"> {

    :

  omethod+notify_val+notify_inst upd_advect = "testDVadvect_update";

};

(6)<AVS/Express>/v/dv_macro.vをvへコピーしてファイル名をsample_dv_macro.vに変更します。

(7)sample_dv_macro.vをテキストエディタで開き、以下の範囲を残して他を全て削除します。

macro AdvectPoints {

    :

};

  

AdvectPoints Advect {

    :

};

Advectの定義は直前で定義されているAdvectPointを基にしていますが、このままでは本体にあるオリジナルのAdvectPointと区別できません。従って以下のようにAdvectの定義部分に「WORKSPACE_1.」というパスを指定して参照先を明示します。

macro AdvectPoints {

    :

};

  

WORKSPACE_1.AdvectPoints Advect {

    :

};

このVファイルの中で参照されているDVadvectモジュールも改造版に置き換えるため、DVadvectの定義部分に「WORKSPACE_1.」という文字列を加えます。

                  :

        };

        WORKSPACE_1.DVadvect DVadvect {

                in => DVstream.out;

                  :

(8)<AVS/Express>/v/module.vをvへコピーしてファイル名をsample_macro.vに変更します。

(9)sample_macro.vをテキストエディタで開き、以下の範囲を残して他を全て削除します。

macro advect_points {

    :

}; // advector

  

advect_points advector {

    :

}; // advector

advectorの定義は直前で定義されているadvect_pointを参照するように修正します。 また、このVファイルの中で利用されているAdvectPointsモジュールを改造版に置き換えるため、Advectの定義部分に「WORKSPACE_1.」という文字列を加えます。同様に、Advectモジュールも改造版に置き換えます。(合計3ヵ所、修正することになります)

             :

  

        WORKSPACE_1.AdvectPoints Advect {

            in_fld => in_field;

             :

             :

}; // advector

  

WORKSPACE_1.advect_points advector {

        ilink in_glyph<export_all=1>;

  

        WORKSPACE_1.Advect Advect {

             :

(10)プロジェクト環境のvフォルダにあるtempl.vファイルを修正して、コピーしたVファイルをプロジェクト環境に登録します。

"$XP_PATH<0>\\v\\templ.v" Templates {

      WORKSPACE_1 {

            $include sample_dv.v

            $include sample_dv_macro.v

            $include sample_macro.v

      };

};

(11)コンパイルします。
baseコマンドを利用して、コンパイル環境の生成とコンパイルの実行を行います。<AVS/Express>\bin\<$MACHINE>\base -comp_proc express -project . -exit

(12)動作確認をします。
プロジェクト環境のbinフォルダにある、express.exe をクリックして起動させます。Library_WorkspacesのWorkspace_1に改造版のadvectorモジュールが登録されているので、これを使用して動作確認をします。

              図3 登録された改造版のadvectorモジュール

例えば、ExamplesライブラリにあるデモアプリケーションのAdvectを起動して、その中で使われているadvectorモジュールを改造版に置き換えて、同様に動作するか確認して下さい。
又、advectorモジュールを開いて、内部にあるDVadvectのupd_advectオブジェクトに登録されている関数が"testDVadvect_update"になっている事を確認します。

図4  upd_advectメソッドに登録されている関数名の確認

2-4. ソースファイルを編集する

プロジェクト環境のsrcフォルダ配下にあるadvect.cファイルを編集します。
出力するノードデータとして、オリジナルでは流速ベクトルになっていますが、これをパーティクルのリリース位置(z座標値)に変更します。DVadvectに入力されている流線データの先頭座標を取得するとパーティクルのリリース位置がわかります。この値をノードデータに設定するように修正しています。具体的には以下のように修正しています。

246行目から

/* 修正前

          for (i=0; i<veclen; i++) {

                  out_data[out_nnodes] = vel[i];

          }

*/

          out_data[out_nnodes] = *(coord+node_list[cell*2]*3+2); /* 修正後 */

その他、スカラーデータとして出力する等の修正を二か所ほど行っています。修正量はさほど多くはありません。ソースファイルをダウンロードできるようにしますので、修正の詳細についてはソースファイルをご参照ください。

修正後、再度モジュールをコンパイルして動作確認をします。

2-5. 動作確認

サンプルとして、<AVS/Express>/MicroAVS/demo_data/room 配下に用意されているデータを可視化してみました。部屋の中の空気の流れを可視化することができます。
部屋の下に滞留している空気の流れ(左奥に温風の吹き出し口があるため、そちらに向かって引き込まれている)と、部屋の上部にある早い流れを確認することができます。

図5 改造版のadvectorモジュールの可視化 (右上: 初期位置、左下: 時間発展後)

3. おわりに

提供されている標準モジュールの多くは、ソースファイルが公開されています。ちょっとした改造ならば、モジュールを一から作成する必要なく行うことができますので、モジュールの作成環境が整っている方は是非お試しください。

改造したモジュールのソースファイル、Vファイルは以下のところから入手可能です。興味ある方は、ダウンロードしてモジュールの作成行ってください。

ZIPhttp://jp.fujitsu.com/group/fns/downloads/services/avs/tech/avsexpress-sp200809/src_v.zip

PDF PDF版 [175KB]


AVS Support Center, fns-avssup@cs.jp.fujitsu.com