- 2005/09/09 (森川 靖大) 09/09 のメモを追加
- 2005/09/08 (森川 靖大) 修正
- 2005/09/08 (小高 正嗣) 作成
- 2005/09/09
- 林祥介, 竹広真一, 中島健介, 石渡正樹, 谷口博, 森川靖大, 北守太一
- 2005/09/08
- 林祥介, 竹広真一, 中島健介, 石渡正樹, 小高正嗣, 柿並義宏, 谷口博, 森川靖大, 北守太一
09/08(木) 9:00 〜 12:30 ミーティング1
12:30 〜 14:00 食事
14:00 〜 19:00 ミーティング2
初日解散
09/09(金) 9:00 〜 13:00 ミーティング3
- 関数で書ける部分は関数で書く
- 数式との対応をできるだけよくする
- 離散化マニュアルはプログラム書く一歩手間まで用意する
- 変数と定数の区別
- 定数は module で値を確定し, その他のプログラムは定数を定義した mudule を
use する
- 基本場の変数のような配列はどう扱うか?
- どのような系を計算するかを考えてから区別しないといけない
- コメント文
- コメントは必ずつける, プログラム作成時に書く(忘れるので)
- コメントの記述はプログラム内, プログラム間で整合的につける
- サブルーチン引数の授受特性
- サブルーチン側では引数の授受特性を intent 文で明示できるが, call
するサブルーチン側では引数の授受特性がわからない
- そこで, 主プログラムとサブルーチンに引数の意味と授受特性をコメント
行で記述する
ex)
call Scalar( &
& ss_PotTemp_bl, & !(in) 温位(t-Δt)
& DelTime, & !(in) 時間刻み
& fs_VelX_nl, & !(in) x方向速度(t-Δt)
& sf_VelZ_nl, & !(in) y方向速度(t-Δt)
& ss_PotTemp_nl, & !(in) 温位(t)
& ss_PotTemp_bl, & !(in) 温位(t-Δt)
& ss_Kh_bl, & !(out) 乱流拡散係数(t-Δt)
& ss_PotTemp_al & !(inout) 温位(t+Δt)
)
竹広コードと小高コード (ひいては dcpam, arare(?) ) の書法の違いについて
検討した.
- 竹広コード
- 長期ラン実行プログラムと同じファイルに書き込んであり,
実験のパラメタ(?)として初期値ファイル名を与えない場合には
自身で初期値を生成し, 初期値ファイル名を与える場合には
そのデータを読み込んでリスタートさせる. つまり,
単体の実行プログラムだけで実験が可能.
- 小高コード, dcpam, arare??
- 初期値ファイルは別の実行ファイルで作成する. お手軽に実行するには
Makefile やシェルスクリプトのサポートが必要.
- 結論
- 竹広流でいってみる. やっぱり実行ファイル単体で動くのは
重要.
- 竹広コード
- 出力ファイルにリスタートファイルとヒストリーファイルの両方を
兼ねさせる.
- 利点
- 1つだから利用する人が迷わなくてすむ.
- もしも分けると, リスタートファイルとヒストリーファイルとで
ファイル名を別途考えなければならないし, NAMELIST 等で設定する
項目も1つ増える.
- 欠点
- ヒストリーファイルに出力される変数のうち, どれが
リスタートに必要なものなのかがわかりづらい.
- ヒストリーファイルへの出力変数を気軽に選択できない.
- ファイルがでかくなったらどうするの?
- netCDF は 3.6.0 にすればいい
- Ruby で扱う際の限度問題は???
- 結論
- リスタートファイルとヒストリーファイルを分ける.
- リスタートファイルは, デフォルトでは実験の最後に出力する.
- 竹広コード
- ファイル名をお手軽に返られるのと, コードを複雑にしないため,
標準入力, 標準出力を利用
- 通常の処理系では rewind できない
- dcpam, arare
- NAMELIST 内の変数の順序を気にしたくないため, ファイル名を
ハードコードして, そのファイル内を何度も rewind して
NAMELIST 変数を取得
- なんか引数処理しないとハードコードして面倒
- しかし, 引数処理ルーチン getarg は大抵の処理系ではあるものの,
規約として正しく規定されているルーチンではないので, なんか
祟りそう.
- 備考
- CReSS も NAMELIST ファイル名はハードコードしていた.
- 結論
- 以下のお作法で行ってみましょう
- NAMELIST 名はプログラム内にハードコードする.
- プログラムが大規模になってくると, NAMELIST 変数の
順序を気にするコストが非常に大きくなってくるため.
- hogehoge.f90 というプログラムならば,
NAMELIST のファイル名は hogehoge.nml
- NAMELIST 作成シェルスクリプトを用意し, 実験ごとに複数の
シェルスクリプト (NAMELIST の代わり) を用意するようにする.
- NAMELIST はモジュールまたはプログラムごとに Open/Close する.
- プログラム全体で開いているか閉じているかを判定して rewind
するよりきっとこっちの方が楽だと思う.
- どのような NAMELIST を読み込んだかどうかは, 読み込んだ NAMELIST
を write 文で書き出すことで見るようにしておく.
- 混乱を無くすため, 最後には消すようにしておく.
- 構造体を用いた情報隠蔽
- 構造体とそれに対する利用者定義演算を用意
- Var%Value に対し演算を行う場合には, 専用の利用者定義演算を介して
行う.
- Var%Value = ... のような行は書かない.
- 構造体の定義, 演算を変更しても, それを利用している主プログラムを
変更する必要がない
- 継承: 似て非なるプログラムを書く必要をなくすための工夫
- Ruby 的な継承を F90 で行うことは難しい
- クラスを定義したモジュールを use 文で入れ子にすることで,
上位のプログラムから見たときに見掛け上継承がなされている
ようにすることは, (かんばれば)できるかもしれない.
- 多態性:
- 引数の型だけ異なり, 同じような動作をする手続きを多数用意する場合の工夫
- interface 文を活用
- コードの雛型を用意して何らかの方法でソースコードを自動生成するようにする
と管理が楽
- コードの自動生成
- 引数の型を変更するくらいのレベルなら使い物になる
- 引数の数だけが異なる
- 変更部分が多くなるとつらい
- オリジナルのライセンスにしたいという強い希望がなければ spmodel
のライセンスにならう
詳しくは <URL:dcmodel-coderule_20050909.rd>
(旧版: <URL:dcmodel-coderule_20050908.rd> )
基本ルールの変更:
変数名は (格子点情報を示す接頭詞)_(物理量を表す名前)(時間方向添字) とする.
- 大文字を使う
- 変数名と時間レベルを表す添字との間には "_" (アンダースコアー) は
使わない
- spmodel の配列演算関数と混同する恐れがあるため
時間添字: 未来には A, 過去は B だけを使う
AA: 時刻 t+2Δt (After のさらに After)
A : 時刻 t+ Δt (After)
N : 時刻 t (Now
B : 時刻 t- Δt (Before)
BB: 時刻 t-2Δt (Before のさらに Before)
time split 等を用いた場合のように複数の時間レベルが現れる
場合には, 区別するための任意の文字を追加する.
As 時刻 t+Δτ (短い時間刻で計算した After)
Al: 時刻 t+Δt (長い時間刻で計算した After)
例
xy_TempA
wa_VorB
ss_ExnerNs
時間微分の物理量を表す名前は D(従属変数)D(独立変数)
と記述する.
採用案:
\DP{\zeta}{t} ⇒ \texttt{DVorDtNs}
\DP{\zeta}{\lambda } ⇒ \texttt{DVorDlonNs}
\DP{\theta_e}{\theta} ⇒ \texttt{DPotTempEDPotTemp}
ボツ案:
\partial_t \zeta ⇒ \texttt{DtVorNs}
\partial_t \zeta ⇒ \texttt{DtDVorNs}
\partial_\lambda \zeta ⇒ \texttt{DlonVorNs}
\partial_\lambda \zeta ⇒ \texttt{DlonDVorNs}
\partial_\theta \theta_e ⇒ \texttt{DPotTempPotTempE}
\partial_\theta \theta_e ⇒ \texttt{DPotTempDPotTempE}
- ギャラリー
- SPMODEL の使い方
- (「SPMODEL ライブラリ (spml)」および「SPMODEL に必要となる資源」
はこちらにマージ. またはこれらの2 つをまとめて「SPMODEL のインストール」
として「SPMDOEL の使い方」と同じインデントに並べる).
- プログラム集 (「サンプルプログラム」から改名)
- 使用上の注意
- 発表資料
- 謝辞
- リンク・開発者向け資料
「SPMODEL の目指すもの」の内容は, トップページの下部にさしこむ.
「数式とコードを対応させる」みたいな文章をさらに加える.
竹広 真一, 小高 正嗣, 森川 靖大
竹広 真一,
佐々木 洋平(3d-shell-wt/mhd-boussinesq/),
小高 正嗣(2d-sphere-w/shallow/),
柿並 義宏(2d-sphere-w/shallow/, 2d-sphere-w/baro)
石岡 圭一
竹広 真一, 小高 正嗣
竹広 真一, 石渡 正樹, 林 祥介
地球流体電脳倶楽部 dcmodel プロジェクト
地球流体電脳倶楽部 davis プロジェクト
日本語の場合の引用例:
竹広真一, 石岡圭一, 柿並義宏, 森川靖大, 小高正嗣, 石渡正樹, 林祥介,
SPMODEL 開発グループ, 2005:
階層的地球流体力学スペクトルモデル集 (SPMODEL),
http://www.gfd-dennou.org/library/spmodel/, 地球流体電脳倶楽部.
英語の場合の引用例:
Takehiro, S., Ishioka, K., Kakinami, Y., Morikawa, Y., Odaka, M., Ishiwatari, M., Hayashi, Y.-Y.,
SPMODEL Development Group, 2005:
Hierarchical Spectral Models for GFD (SPMODEL),
http://www.gfd-dennou.org/library/spmodel/, GFD Dennou Club.