差分法による弾性波動並列シミュレーション
東京大学 情報学環 / 地震研究所

森 太志

f-mori@eri.u-tokyo.ac.jp

東京大学 情報学環 / 地震研究所

古村 孝志

2

本日の目次

• はじめに– 有限差分法（FDM)による弾性波動計算の概要– ppOpen-APPL/FDM の概要– FX10によるパフォーマンステスト– 応用例：大規模連成計算• ppOpen-APPL/FDMの演習– 利用方法– 演習

3

FDMによる弾性波動計算• 構成方程式– 弾性体の釣り合いの式（運動方程式）
𝜌𝑢 =𝜕𝜎𝑥𝑝 𝜕𝜎𝑦𝑝 𝜕𝜎𝑧𝑝+++ 𝑓𝑝 , (𝑝 = 𝑥, 𝑦, 𝑧)𝜕𝑥𝜕𝑦𝜕𝑧
𝑢: 加速度、𝜎: 応力、𝜌: 密度、 𝑓: 外力(1)– 等方完全弾性体の応力𝜎𝑝𝑞 = 𝜆 𝑒𝑥𝑥 + 𝑒𝑦𝑦 +𝑒𝑧𝑧 𝛿𝑝𝑞 + 2𝜇𝑒𝑝𝑞 , (𝑝, 𝑞 = 𝑥, 𝑦, 𝑧)(2)

λ, 𝜇 : Lame定数、𝛿: クロネッカのデルタ• 歪みは変位の空間微分で求められる
1  u p u q ,e pq  
2  qp ( p, q  x, y, z )

𝑒: 歪み

(3)

4

弾性波動の陽的計算• 時間発展により波動伝播を進めるために、式(1)の速度変数を中間変数とする
nu p12n u p12nnn
1   xp  yp  zpn
 f p t , ( p  x, y, z )  x
yz


(4)

𝑢𝑛+1/2 𝑝 粒子速度

• 式(2)と式(3)を結合した式(5)を用いて中央差分に基づく時間積分1
11  n 1nn  
 n  12n 2 u pu q 2   u x 2 u yu z 2 n 1n pq   pq    pq    t , ( p, q)  ( x, y, z )
x

y
z

q
p



  (5)

5格子モデル(A) 一般格子(B) スタガード格子A) 変位や応力、物性値など全ての変数を同一格子点上に配置する一般格子B) 変位を半格子ずれた位置に定義するスタガード格子– 変数の微分が定義される位置に関連の変数が位置するため計算精度が良い6

FDMによる弾性波動計算• FDMによる式(4)と(5)の空間微分– 中心差分による計算(2次精度、4次精度、8次精度）(2次精度)𝑑1∆𝑥∆𝑥
𝜎 (𝑥, 𝑦, 𝑧) ≃𝜎 𝑥+, 𝑦, 𝑧 − 𝜎𝑝𝑞 𝑥 −, 𝑦, 𝑧𝑑𝑥 𝑝𝑞∆𝑥 𝑝𝑞
22(4次精度)

𝑑1 9∆𝑥∆𝑥
𝜎𝑝𝑞 (𝑥, 𝑦, 𝑧) ≃𝜎𝑥+,𝑦,𝑧−𝜎𝑥−, 𝑦, 𝑧𝑝𝑞𝑑𝑥∆𝑥 8 𝑝𝑞22−(8次精度)

13∆𝑥
3∆𝑥
𝜎𝑝𝑞 𝑥 +, 𝑦, 𝑧 − 𝜎𝑝𝑞 𝑥 −, 𝑦, 𝑧
2422𝑑1 1225∆𝑥∆𝑥𝜎𝑝𝑞 (𝑥, 𝑦, 𝑧) ≃𝜎𝑝𝑞 𝑥 +, 𝑦, 𝑧 − 𝜎𝑝𝑞 𝑥 −, 𝑦, 𝑧𝑑𝑥∆𝑥 102422245
3∆𝑥3∆𝑥−𝜎𝑝𝑞 𝑥 +, 𝑦, 𝑧 − 𝜎𝑝𝑞 𝑥 −, 𝑦, 𝑧3072
22495∆𝑥5∆𝑥+𝜎𝑝𝑞 𝑥 +, 𝑦, 𝑧 − 𝜎𝑝𝑞 𝑥 −, 𝑦, 𝑧5120
2257∆𝑥7∆𝑥−𝜎𝑝𝑞 𝑥 +, 𝑦, 𝑧 − 𝜎𝑝𝑞 𝑥 −, 𝑦, 𝑧7168
227ppOpen-APPL/FDM の概要

ppOpen-APPL/FDM 概要
1. 弾性波動並列シミュレーション(地震）– Staggered グリッド、陽解法– 3次元/2次元モデル– 等間隔格子– 微分：2次、4次、8次精度
ｊ k– MPI並列は3次元領域分割– MPI/OpenMPハイブリッド並列

i014825369710111213141628293031

3次元領域分割（赤文字：MPIランク）

9ppOpen-APPL/FDM 概要 (cont.)

2. サンプルプログラムとインターフェイス– 観測点の波形– 波動場のスナップショット

波動場のスナップショット
観測点の波形

10

ppOpen-APPL/FDM概要 (cont.)• ドキュメント– ppOpen-APPL/FDMの使い方：ユーザマニュアル– コード内のモジュール説明• MITライセンス– 公開されているコードはユーザが自由に手を加えることができる

11

ppOpen-APPL/FDM 計算手順
入力

• 計算パラメータの設定• ソース、観測点、層構造の設定

計算• 観測点における波形
出力&可視化 • 波動場

12

１．入力パラメータの例（計算パラメータ）

1. 計算パラメータ(m_param.f90)
モデルサイズ: 128*128*128
格子サイズ: 0.5
時間間隔： 0.025
MPI領域分割: 2*2*2!-- << Model Size and Grid Width >>integer, parameter :: NX = 128
integer, parameter :: NY = 128
モデルサイズ
integer, parameter :: NZ = 128integer, parameter :: KFS = 25integer, parameter :: NX1 = NX+1integer, parameter :: NY1 = NY+1integer, parameter :: NZ1 = NZ+1integer, parameter :: NTMAX = 2000
integer, parameter :: NWRITE = 10real(PN), parameter :: DX = 0.5_PNreal(PN), parameter :: DY = 0.5_PN
格子間隔real(PN), parameter :: DZ = 0.5_PNreal(PN), parameter :: DT = 0.025_PN
時間間隔integer, parameter :: NDUMP = 5!-<< Parallel >>integer, parameter :: IP = 2integer, parameter :: JP = 2
MPI領域分割
integer, parameter :: KP = 2
integer, parameter :: NP = IP*JP*KP ! Number of processinteger, parameter :: NL = 4 ! Order of the fd scheme

1. 入力パラメータの例(ソースの設定、地下構造の設定)

13

ソースの設定（source.dat）

source.dat
ソース

16.0 16.0 16.0
0.0 45.0 90.0
0.5 1.0# ソースの位置: X(km), Y(km), Z(km)# 断層パラメータ# ソース時間: at, t0 (s)地下構造の設定
medium.dat
medium.dat

4
20 2.3 3.0 1.7
Layer 1
Layer 2
Layer 3Layer 4

深さ (km)30 2.3 3.3 2.3
40 2.7 5.0 3.3
50 2.7 6.0 4.0# 地下構造の層の数# 深さ(km), 密度 (t/m3),
P波速度(km/s), S波速度 (km/s)

1. 入力パラメータの例(観測点の設定)

14観測点の設定（station.dat）

断面観測点
airstation.dat

表面410.0 10.0 0.0# ステーション数# ステーション1: X, Y, Z(km)の設定

40.0 10.0 0.0
10.0 40.0 0.0
40.0 40.0 0.0（注意） ./examples/seismic_3D-exampleにパラメータファイルが用意されています。
./src/seismic_3D/1.pureMPI-ppohVIS or 2.pure-MPIにCOPY

15最大周波数と安定条件（１）最大周波数の決め方
4次精度の場合6-8個
𝜆𝑚𝑖𝑛（経験的に）=6Δ𝑥𝜆𝑚𝑖𝑛 = 6Δ𝑥 = 6 × 0.5 = 𝟑. 𝟎𝑉𝑠𝑚𝑖𝑛 = 𝑓𝑚𝑎𝑥 × 𝜆𝑚𝑖𝑛
(伝わる速度)(周波数）(波長)1.7 = 𝑓𝑚𝑎𝑥 × 𝟑. 𝟎
𝑓𝑚𝑎𝑥 = 𝟎. 𝟔(𝐻𝑧)𝜆(2) Δtの決め方∆𝑥Δ𝑡 < 0.2
𝑉𝑚𝑎𝑥

0.5= 𝟎. 𝟎𝟐𝟓
Δ𝑡 < 0.2
4.0

青： 未知数
黒： 既知数162. 計算手順
① 微分の計算

境界条件

（応力）

⑥ ＭＰＩ通信② 速度変数の更新（応力変数）③ MPI通信⑤ 応力変数の更新（速度変数）④ 微分計算境界条件（速度）173. 出力および可視化• 出力データ– 各MPIランクで出力されている

SEISM3D3.prm
SEISM3D3.WAV.***SEISM3D3.SPS.***SEISM3D3.SUR.***SEISM3D3.XY(XZ, YZ).***

計算パラメータ
観測点における波形
P波とS波の波動場
表面上での波動場
各断面での波動場

18

3. 出力および可視化 (cont.)• ./tools/seismic_3D-toolsにおいてmakeすると4つ実行ファイル（catsnap,catwav, ppmxy3d3,rwav3d）が生成される• % catsnap SEISM3D3.prm  分割されたファイルが結合される（波動場）• % catwav SEISM3D3.prm  分割されたファイル が結合される（波形）• % ppmxy3d3  波動場のスナップショット (xvやimagemagickで可視化）• % rwav3d  観測点の波形 （gnuplotで可視化）

観測点の波形波動場のスナップショット（P波：赤、S波: 緑）

19

可視化 ppOpen-MATH/VIS• プロジェクト内で公開している大規模データのための可視化ライ
ブラリppOpen-MATH/VIS• ppOpen-APPL/FDM ver0.2.0に実装済み– ./src/seismic_3D/1.pureMPI-ppohVIS– 出力ファイルは ./src/seismic_3D/1.pureMPI-ppohVIS– control.datのMaxVoxelCountやMaxRefineLevelの値を大きくすると細かくなる ( ./examples/seismic_3D-example )– AVSやParaviewで可視化することができる

ＶＸの速度場20

ppOpen-APPL/FDM
Performance in FX10

21

Weak scaling test in flat MPI• モデルサイズ：64^3 , 128^3 grid points• 並列数：16～1024 コア• 3D domain partitioning of MPI
Calculation time [s]700128^3 grid points

600
500
400
300

200

64^3 grid points

1000163264128256

5121024core22Strong scaling test in the flat MPI
256^3 grid points

遅Calculation time [s]1024^3 grid points
2500

400
350

2000

300
250

1500

200
1000

150
100

500
50001664256

1024

core

速128256512• 計算時間はコア数が増加することで低減している– 256^3 grid points• 1024コアでの計算時間は、16コアの計算時間よりも18倍速くなっていた– 1024^3 grid points• 1024コアでの計算時間は、128コアの計算時間よりも7倍速くなっていた

1024

core

23

Storing scaling test in the MPI/OpenMP hybrid
parallel computing on FX10

• パフォーマンステストは8ノード（128コア, 16コア/ノード）を使って評価– P128T1, P64T2, P32T4, P16T8, P8T16 (Pはプロセス、Tはスレッド)
モデルサイズ– 256^3, 512^3グリッドポイント•• すべてのモデルにおいて、最小の計算時間は、P64T2 による並列のときであった

pureMPIより遅い– Pure MPIよりも P64T2 の方が2倍高速化していた
Model size: 256^3 grid points

遅Calculation time [s]120Model size: 512^3 grid points
450
400

10035080300
2506020040150100

20500
P128T1

P64T2

P32T4

P16T8

P8T16

速0
P128T1

P64T2

P32T4

P16T8

P8T16

24

ppOpen-APPL/FDMの実例
大規模連成計算（地震動）

大規模連成計算の取り組み• ppOpen-HPCプロジェクト内で開発されているppOpenMATH/MP couplerを用いて差分法（地震動 ppOpenAPPL/FDM）と有限要素法（構造解析 ppOpenAPPL/FEM）を連成し、大規模連成計算をおこなっている

FDM: Seismic Wave Propagation

ppOpen-MATH/MP

FEM: Building Response

26

地震動計算
淡路を震源とした地震を想定し、ポートアイランドにある計算科学研究機構 京コンピュータの建屋への影
響をシミュレーションをおこなう
100km

計算領域（黒点線）：100km×100km×30km
計算格子間隔：Δx = Δy = 40 m, Δz = 20 m
計算ステップ： 36万ステップ（Δt=0.001, 360s)
計算グリッド： 2500×2500×1500

観測点
震源
Google mapから引用

計算科学研究機構 (AICS)
京コンピュータ建屋

100km

計算メモリ： 1.2TB

27

ppOpen-APPL/FDM
利用方法と実習28

はじめに• ppOpen-HPC project (URL: http://ppopenhpc.cc.utokyo.ac.jp/wordpress/) からppOpen-APPL/FDM
ver0.2.0をダウンロード• Paraviewをダウンロード、インストール• FX10の利用支援ポータルサイトからFUJITSU
Software Development Tools をダウンロード、インストール

29

ファイルの解凍• ダウンロードしたら解凍する% tar zxvf ppohFDM_0.2.0.tar.gz[c31003@oakleaf-fx-4 ppohFDM_0.2.0]$ ls
doc
INSTALL_ppohAPPL-FDM
etc
LICENSE_ppohAPPL-FDM
Examples
LICENSE_ppohMATH-VIS

Makefile
ppohMATH-VIS-install src
Makefile.in ppohMATH-VIS-lib
tools
README_ppoh-APPL-FDM• 以下このディレクトリをルートディレクトリ(/)として説明する• サンプルのパラメータファイルは、以下においてあります./src/example/seismic_3D-example

30

入力パラメータ設定(1)• 入力パラメータファイル（３つ）1. 観測点（X, Y, Z (km))の設定
断面station.dat

観測点air

表面410.0 10.0 0.040.0 10.0 0.0
10.0 40.0 0.0
40.0 40.0 0.0# ステーション数# ステーション1: X, Y, Z(km)を設定

2. ソースパラメータを設定
source.dat
ソース

16.0 16.0 16.0
0.0 45.0 90.0
0.5 1.0# ソースの位置: X(km), Y(km), Z(km)# 断層パラメータ# ソース時間: at, t0 (s)31

入力パラメータ設定(2)3. 地下構造モデル（深さ(depth), 密度(R0), P波の速度(VP), S波の速度(VS))を設定•medium.dat
medium.dat
4
20 2.3 3.0 1.7# 地下構造の層の数# 深さ(km), 密度 (t/m3),
P波速度(km/s), S波速度 (km/s)

30 2.3 3.3 2.3
40 2.7 5.0 3.3
50 2.7 6.0 4.0

Layer 1
Layer 2
Layer 3Layer 4

深さ (km)32

計算パラメータ設定

計算パラメータ(m_param.f90)(計算モデルとタイムステップ）• モデルサイズ:NX, NY, NZ• 格子間隔：DX, DY, DZ• タイムステップ：NTMAX• 時間間隔：DT（MPI: 3次元分割）• 分割： IP, JP, KP• プロセス数： NP!-- << Model Size and Grid Width >>integer, parameter :: NX = 128
integer, parameter :: NY = 128
モデルサイズ
integer, parameter :: NZ = 128
integer, parameter :: KFS = 25integer, parameter :: NX1 = NX+1integer, parameter :: NY1 = NY+1
integer, parameter :: NZ1 = NZ+1
integer, parameter :: NTMAX = 2000
タイムステップ
integer, parameter :: NWRITE = 10real(PN), parameter :: DX = 0.5_PNreal(PN), parameter :: DY = 0.5_PN
格子間隔real(PN), parameter :: DZ = 0.5_PNreal(PN), parameter :: DT = 0.025_PN
時間間隔
integer, parameter :: NDUMP = 5!-<< Parallel >>integer, parameter :: IP = 2integer, parameter :: JP = 2
MPI領域分割
integer, parameter :: KP = 2integer, parameter :: NP = IP*JP*KP ! Number of processinteger, parameter :: NL = 4 ! Order of the fd scheme（注意） ./examples/seismic_3D-exampleにパラメータファイルが用意されています。
./src/seimic_3D/2.pureMPIにコピーしてくださいコンパイル
pureMPIとハイブリッド並列

33• コンパイル– ./src/seism_3D/2.pureMPIや./src/seism_3D/3.hybridにあるMakefile.optionをIntel Compiler 用 FX10用にコメントアウトする– % ./make seism3d-mpi, %./make seism3d-hybrid• 実行ファイルseism3d3nが生成されていることを確認

実行
pureMPIとハイブリッド並列

34• バッチ実行– % pjsub job– % pjstat• 実行されているか確認
job file in the hybrid parallel#!/bin/sh

job file in the pure MPI#PJM -L "rscgrp=short"#PJM -L "node=4"#PJM -L "elapse=00:30:00"#PJM -g **#PJM --mpi "proc=64"#!/bin/sh#PJM -L "rscgrp=short"#PJM -L "node=1"#PJM -L "elapse=0:30:00"#PJM -g **#PJM --mpi "proc=16"
mpiexec ./seism3d3nm_param.f90で設定したNPとproc数を同じにする

export OMP_NUM_THREADS=16

mpiexec ./seism3d3n35

コンパイルと実行 with ppOpen-MATH/VIS• コインパイル
1.
2.
3.
4.

% ./make% ./make install% ./make seism3d-ppohVIS% ./make install./src/seismic_3D/1.pureMPI-ppohVISに実行ファイルseism3d3nが生成されていることを確認• Makefile.inにMATH/VISライブラリのコンパイル先が書かれている。各ユーザはディレクトリを場所を絶対パスで書く– デフォルトは /usr/local/ppoh-HPCになっている• ジョブ投入は、puerMPIと同様

36

演習（1）

1. 媒質の物理値を変化させ、波動場と波形の観測せよ。パラメータは以下の通り–

計算パラメータの設定（m_param.f90）•–

モデルサイズ(NX*NY*NZ)：128*128*128

媒質の設定（medium.dat）
420 2.3 3.0 1.7
30 2.3 3.3 2.3
40 2.7 5.0 3.3
50 2.7 6.0 4.0
デフォルト

–

510 2.3 2.8 1.2
20 2.3 3.0 1.7
30 2.3 3.3 2.3
40 2.7 5.0 3.3
50 2.7 6.0 4.0

ソースの設定（source.dat）
16.0 16.0 16.0
0.0 45.0 90.0
1.0 2.0
デフォルト

16.0 16.0 10.0
0.0 45.0 90.0
1.0 2.0

37

演習（1）(cont.)– 観測点の設定（station.dat）

4
10.0 10.0 0.0
40.0 10.0 0.0
10.0 40.0 0.0
40.0 40.0 0.0• 上記のパラメータとデフォルトパラメータとの違いを確認せよ
1. 媒質のパラメータを変更したときの違い
2. ソースのパラメータを変更したときの違い
3. 両方（媒質+ソース）のパラメータを変更したときの違い38

演習（1）(cont.)• コンパイル– % ./make seism3d-mpi• 実行– % cd ./src/seimic_3D/2.pureMPI/– %pjsub job#!/bin/sh**はユーザがパラメータに応じて変更#PJM -L "rscgrp=**"#PJM -L "node=**"#PJM -L "elapse=**:**:**"#PJM -g **#PJM --mpi "proc=**"mpiexec lpgparm -p 256MB -d 256MB -h 256MB -s 256MB -t 256MB ./seism3d3n

39

演習（1）(cont.)• ローカルPCで可視化– ./tools/seismic_3D-toolsにおいてmakeすると4つ実行ファイル（catsnap, catwav, ppmxy3d3,rwav3d）が生成される• 波動場の確認– % catsnap SEISM3D3.prm– % ppmxy3d3 –f SEISM3D3.prm –tim –tick –pall –pmul 1e3 –smul
1e3 –ptype SPS– % xv *.ppm• 波形の確認– % catwav SEISM3D3.prm– % rwav3d SEISM3D3.WAV > wave.dat– % gnuplot– plot “wave.dat” index0 using 4:5 with lines lw 2

40

演習（1a）

1. 媒質の物理値を変化させ、波動場の観測せよ。パ
ラメータは以下の通り–

計算パラメータの設定（m_param.f90）•–

モデルサイズ(NX*NY*NZ)：128*128*128

媒質の設定（medium.dat）
420 2.3 3.0 1.7
30 2.3 3.3 2.3
40 2.7 5.0 3.3
50 2.7 6.0 4.0
デフォルト

–

510 2.3 2.8 1.2
20 2.3 3.0 1.7
30 2.3 3.3 2.3
40 2.7 5.0 3.3
50 2.7 6.0 4.0

ソースの設定（source.dat）
16.0 16.0 16.00.0 45.0 90.0
1.0 2.0
デフォルト

16.0 16.0 10.0
0.0 45.0 90.0
1.0 2.0

41

演習（1a）(cont.)– 観測点の設定（station.dat） 4– control.dat

10.0 10.0 0.0
40.0 10.0 0.0
10.0 40.0 0.0
40.0 40.0 0.0[Refine]AvailableMemory = 32.0
MaxVoxelCount = 5000
MaxRefineLevel = 1000

– 可視化したい物理値はseism3d3n.f90のL107において設定する• 上記のパラメータとデフォルトパラメータとの違いを確認せよ
1.
2.
3.

媒質のパラメータを変更したときの違い
ソースのパラメータを変更したときの違い
control.datのMaxVoxelCountとMaxRefineLevelの値を変更したときの違い確認せよ

42演習（1a）(cont.)• コンパイル
1.
2.
3.
4.

% ./make% ./make install% ./make seism3d-ppohVIS% ./make install• 実行– % cd ./src/seimic_3D/1.pureMPI-ppohVIS– %pjsub job#!/bin/sh**はユーザがパラメータに応じて変更#PJM -L "rscgrp=**"#PJM -L "node=**"#PJM -L "elapse=**:**:**"#PJM -g **#PJM --mpi "proc=**"mpiexec lpgparm -p 256MB -d 256MB -h 256MB -s 256MB -t 256MB ./seism3d3n

43

演習(1a)• ppOpen-MATH/VISで出力されたinpファイルをparaviewを使って可視化– ./src/seismic_3D/1.pureMPI-ppohVIS/ppohVISにデータが出力されていることを確認• Paraviewを使って可視化する44

演習（2） pureMPI

1. 並列数とモデルサイズを変更して計算時間の変化を計測せよ– m_param.f90••

モデルサイズ: 256*256*256 grid points
NP: 8, 16, 32, 64,･･･– プロファイル情報を取得するために、計測した部分にcall fapp_start, call fapp_stopで挟む•

seism3d3n.f90に書き込む（デフォルトでコメントアウトされている）!! Velocity Update
call fapp_start("region2",1,1)
call ppohFDM_update_vel( 1, NXP, 1, NYP, 1, NZP )call fapp_stop("region2",1,1)

45

演習（2） pureMPI• Job ファイル#!/bin/sh**はユーザがパラメータに応じて変更#PJM -L "rscgrp=**"#PJM -L "node=**"#PJM -L "elapse=**:**:**"#PJM -g **#PJM --mpi "proc=**"fapp -C -d prof -L 1 -Ihwm -Hevent=Statistics mpiexec lpgparm -p 256MB -d 256MB -h 256MB -s 256MB-t 256MB ./seism3d3n•

プロファイルを保存するディレクトリが必要–./src/seismic_3D/2.pureMPI/prof（注意）
計測にあたりseism3d3n.f90のL316にあるcall ppohFDM_io_write()をコメントアウトする

46

演習（3） Hybrid parallel computing

1. 並列数とモデルサイズを変更して計算時間の変化を計測
せよ–m_param.f90••

モデルサイズ: 256*256*256 grid points
使用するノード数: 8ノード（128コア） or 4ノード（64コア）に固定–––IP, JP, KPの値を変化させる(プロセス数）
Job文のexport OMP_NUM_THREADSの値を変化させる

Jobファイル#!/bin/sh#PJM -L "rscgrp=***"#PJM -L "node=**"#PJM -L "elapse=**:**:**"#PJM -g **#PJM --mpi "proc=**"**はユーザがパラメータに応じて変更

export OMP_NUM_THREADS=**
fapp -C -d prof -L 1 -Ihwm -Hevent=Statistics mpiexec lpgparm -p 256MB -d 256MB -h 256MB -s 256MB -t
256MB ./seism3d3n

47

参照文献

• 古村孝志, 地震波伝播と強震動の大規模並列
FDMシミュレーション, 東京大学情報基盤センター
スーパーコンピューティングニュース, Vol11,
pp.35-63, 2009.
• ppOpen-APPL/FDM ver0.2.0 user guide• ppOpen-APPL/FDM ver0.2.0 reference guide