階層的地球流体スペクトルモデル集 SPMODEL | << Prev | Index| Next >> |
SPMODEL ライブラリ (spml) [4] は, スペクトル法による流体計算のための基本的な 関数を提供するライブラリである. これらの関数群は, スペクトル計算のための既存 FORTRAN77 ライブラリである ISPACK[2] のサブルーチン群を, 第 2 節 で説明した Fortran90 で強化された配列機能を利用してくるむことにより 作成されたものである. ISPACK が提供していた格子点空間とスペクトル空間との変換に加えて, 微分積分計算をも関数として新たに追加している.
SPMODEL ライブラリが提供するサブプログラムの例として, 1 次元周期境界条件領域用のサブルーチンと関数のいくつかを以下に示す.
初期化 : スペクトル変換の格子点数, 波数, 計算領域の設定.
subroutine ae_initial(im,km,xmin,xmax)
スペクトル正変換, 逆変換.
function g_e(e) real(8), dimension(0:im-1) :: g_e real(8), dimension(-km:km), intent(in) :: e function e_g(g) real(8), dimension(-km:km) :: e_g real(8), dimension(0:im-1), intent(in) :: g
微分 : 空間微分のスペクトル変換 (スペクトル変換に波数をかける).
function e_Dx_e(e) real(8), dimension(-km:km) :: e_Dx_e real(8), dimension(-km:km), intent(in) :: e
積分 : 空間積分ならびに空間平均.
function Int_g(g), function Avr_g(g) real(8), dimension(0:im-1), intent(in) :: g real(8) :: Int_g, Avr_g
SPMODEL ライブラリの関数の名前は
(出力データ空間識別子)_(機能)_(入力データ空間識別子)
といった形に統一されている.
名前自体は冗長になるが, 関数への入力データと関数からの出力とが定義されている空間 (たとえばスペクトル空間か実空間か), ならびに, 関数の機能を名前からわかるようにすることで, 操作内容を読みとりやすくし, 同時に, プログラム間違いを減らすことを 狙っている.
関数の命名法にあわせて, 格子点およびスペクトルデータを表す配列を
(変数のデータ空間識別子)_(変数名)
といった形式にそろえて用いることを推奨している. 関数と関数が作用する変数の書式を統一することにより, 以下の例で示すように, 数式表現で良くもちいられるテンソル表現に 類似した表現形式をもったプログラムを作成することができる.
1 次元周期境界条件用モジュールで用意されている関数の場合で 例示しよう. 先にリストしたように, スペクトル変換と微分は次のような名前を与えられていた:
g_e(e_Data) ! スペクトルから格子点への変換 e_g(g_Data) ! 格子点からスペクトルへの変換 e_Dx_e(e_Data) ! x 微分(波数をかける)
関数の接頭子 e_, g_ は, 関数の出力がそれぞれスペクトル空間および実空間(格子点)で 定義されているデータ配列であることを示す データ空間識別子である. 一方, 関数の接尾子 _e, _g は, 関数への入力データがそれぞれ スペクトル空間および実空間(格子点)で定義された データ配列であることを示すデータ空間識別子である. 配列データも同じ表記に従い, e_Data, g_Data はそれぞれ, スペクトルデータおよび実空間(格子点)データであることを示している.
これらの関数を用いると, 格子点データ配列 g_Data1 の x 微分を スペクトル変換して計算し, 格子点配列 g_Data2 に格納することが
g_Data2 = g_e(e_Dx_e(e_g(g_Data1)))
という 1 行で表記できる. 接頭子と接尾子がちょうどテンソル計算での添字の縮約規則のように 対になって現れることに注意されたい.
階層的地球流体スペクトルモデル集 SPMODEL | << Prev | Index| Next >> |