=begin
= dcmodel コーディングルール案
# * 2005/10/10 (森川) 更新
# * 2005/10/09 (森川) 更新
# * 2005/10/08 (森川) 更新
# * 2005/10/04 (林, 石渡, 小高, 杉山, やまだゆ, 森川, 北守, 谷口, 柿並) 更新
# * 2005/09/29 (林, 石渡, 小高, 杉山, やまだゆ, 森川, 北守, 谷口) 更新
# * 2005/09/27 (林, 石渡, 小高, 杉山, やまだゆ, 森川, 北守, 谷口) 更新
# * 2005/09/09 (林, 石渡, 竹広, 中島, 小高, 森川, 北守, 柿並, 谷口) 更新
# * 2004/12/27 (林, 石渡, 中島, 小高, 高橋, 杉山, 山田, 森川, 北守) 新規作成
#== まとめきれなかった項目
#
#* 変数と定数の区別
# * 定数は module で値を確定し, その他のプログラムは定数を定義した mudule を
# use する
# * どのような系を計算するかを考えてから変数と定数を区別する
#
#* コメント文
# * コメントの記述はプログラム内, プログラム間で整合的につける
#== 検討事項
#
#* この文書内において, プログラム, モジュール, コードなどの用語の定義を
# 明確にし, 正しく使い分けるようにすること.
#
#* この文書内において, ドキュメントとマニュアルの定義を
# 明確にし, 正しく使い分けるようにすること.
== はじめに
# (気象庁コーディングルールの文面を元に作ってみました. morikawa).
ヨーロッパや米国, 日本の気象機関では, Fortran プログラムのソースコードを
理解しやすく管理しやすいものにし, またソースコードの交換を容易にするため,
それぞれコーディングルールが作成されている ( ((<参考文献>)) 1,2,3 ).
地球流体電脳倶楽部 dcmodel プロジェクトでも, これらを参考にして
dcmodel コーディングルールを作成している.
その目的の 1 つは, 他のコーディングルールと同様,
コーディング・スタイルを統一することにより
可読性と移植性を高め, 維持管理を容易にすることである.
もう 1 つの目的は,
dcmodel プロジェクトの目的である階層的モデル群の整備のために,
コーディングルールによってソースコードの「見た目」や
プログラムの基本動作 (実行すればとりあえず動く, とか
そういうことを言いたいのだが…) を統一させることである.
このコーディングルールでは Fortran 95 (Fortran90 を内包する)
の使用を前提としている.
なお, このコーディングルールは現在も dcmodel プロジェクトのモデル群の
開発と共に検討, 修正を重ねている段階であり, 以降予告無く変更される
可能性があることを述べておく.
== 基本ルール
=== 基本的な書法
気象庁標準コーディングルール ( ((<参考文献>)) 1 ) に従う.
=== 数理モデルの数式とソースコードとの対応付け
モデルの支配方程式の形とソースコードとを出来るだけ近い形で
記述する. その方法として以下の手法を推奨する.
* 関数の利用
演算にサブルーチンではなく関数を用いることで,
どの変数が返り値になるのか一目で分かるようになる.
さらに, 関数の命名に関して ((<関数命名法>)) に従うことで,
ソースコードを方程式の形により近づけることができる.
(例: SPMODEL ( ((<参考文献>)) 4 ))
* 変数の命名
変数の命名に関して, ((<変数命名法>)) を参考にして
その書式を統一する. 上記の関数と合わせて用いることで
ソースコードをより方程式の形に近づけることができる.
* モデルの支配方程式に関するドキュメントの作成
ソースコードに対応するように, モデルの支配方程式系に
関するドキュメントも整備する. その際, 離散化などに
関して詳細に記載すると逆に対応が悪くなるため,
ソースコードとの対応を考慮すること.
=== モジュールの利用
* public 属性は明示的に与える.
モジュール内で定義される定数, 変数, 関数, サブルーチン, 構造体は,
デフォルトでは private 属性とし, 外部から参照される
ものにのみ明示的に public 属性を与える.
これにより, そのモジュールが何を公開するのかが明確になる.
* use には必ず only を用いる.
モジュールを参照する際, 利用する定数, 変数, 関数,
サブルーチン, 構造体には明示的に only をつけて参照する.
これにより, そのソースコードを読む際
どのモジュールから何を参照したのかトレースが容易になる.
例
module sample_mod1
use grid, only : DimXMax, DimYMax ! 必ず only を用いて参照する
implicit none
private ! private 属性をデフォルトに
public :: pub_sub1 ! 外部から使用可
contains
subroutine public_sub ! 外部から参照されるサブルーチン
...
end subroutine public_sub
subroutine internal_sub ! 内部的に利用するサブルーチン
...
end subroutine internal_sub
....
end module sample_mod1
=== ポインタ変数の利用
ポインタ変数の利用に関しては以下に留意すること.
* null() による初期化
ポインタ変数を利用する際は, サブルーチンや関数の引数に用いる
場合を除き, 以下に示すように必ず null()
による初期化を行う. これによりポインタの不定状態を回避することができ,
associated 関数を安心して利用できる.
integer, pointer :: ptr(:) => null()
* 引数に用いる場合の授受特性コメントの付加
ポインタ変数を関数やサブルーチンの引数として用いる場合,
ソースコード内に授受特性 (intent(in)などの属性) を付記することが
できない. そのため, 実際の役割に応じて必ずコメントをつける.
((<コメントの書き方>)) を参照せよ.
=== コメント文
メインルーチン, モジュール, サブルーチン, 関数, 変数, 定数,
引数, 構造体に対して, コメント文は短くても良いので必ず書くようにする.
メインルーチンやモジュール, サブルーチン, 関数ならば機能の要約を,
変数, 定数, 引数, 構造体ならばその役割を記述する.
このように説明を付記することは可読性を向上させるだけでなく,
プログラムを構築する上で個々の役割を明確にする一助となる.
また, Fortran ソースコードを解析してモジュール, サブルーチン,
関数, 変数, 定数の仕様に関するドキュメントを自動生成
することも容易となる.
本コーディングルールではコメントの書き方に関してもルールを
設けている. ((<コメントの書き方>)) を参照せよ.
== コメントの書き方
=== コメントの基本的書法
サブルーチンや関数の引数, または定数, 変数に対するコメントは,
トレイリングコメント (行末に, コメント記号 ` ! ' 後に記述するコメント)
を原則とする. 記述する内容が行末のみに収まらない場合, 改行して
以降の行に記述する. その際, 行頭の位置はそろえるようにする.
メインルーチン, モジュール, サブルーチン, 関数, 構造体
に対するコメントは, 下記の例のようにそれぞれ program, module, subroutine,
function, type で始まる行よりも下の行に記述する.
ファイル自体に関するコメントは, ファイルの一番最初に記述する.
例
! (ファイルの行頭)
!
! ファイルの情報をここに書く
!
module hogehoge
!
! モジュール ( program の場合はメインルーチン ) の機能をここに書く
!
use constants, only: PI, Grav
implicit none
private
public :: any_value, any_constant, MULTI_ARRAY
real :: any_value ! 変数に対するコメント
integer :: any_constant ! 定数に対するコメント
type MULTI_ARRAY
!
! 構造体に対するコメントはここに書く
!
real, pointer :: var(:) =>null() ! 変数に対するコメント
integer :: num = 0 ! 変数に対するコメント
end type MULTI_ARRAY
contains
subroutine hoge( inA, inB, & !(in)
& inout, & !(inout)
& out & !(out)
& )
!
! サブルーチン ( function の場合は関数) の機能をここに書く
!
character(*),intent(in) :: inA ! 変数 A の説明が行末に
! 収まらない場合, このように書く
character(*),pointer :: inB !(in) ポインタB
character(*),pointer :: inout !(inout) ポインタinout
character(*),pointer :: out !(out) ポインタout
...
end subroutine hoge
end module hogehoge
=== 授受特性の記述
サブルーチンは関数と違い, call する側から引数の授受特性を陽に
知ることが出来ない. そのため, call する主プログラム側の
引数の後ろに, 授受特性をコメントで記述する.
見た目をそろえるため,
サブルーチンの定義の文にも同様に授受特性を明記する.
なお, 引数の授受特性の後ろに引数の説明等を追記しても良い.
引数にポインタ変数を利用する場合, ソースコードに intent 属性を
付記出来ないため, 変数の定義文の後ろに, 入出力情報をコメントで
記述する.
(検討事項) 授受特性に加え, 割り付け状態がどのようになっているかを
示すことを推奨する.
しかし, 授受特性が in と inout のポインタ引数は既に割り付けられてい
るべきであり, 一方で授受特性が out のポインタ引数は既に解放されてい
るべきであることは明らかである. 従って, in, out, inout を指定すれば
ポインタの割り付け状態を別途示す必要はないかもしれない.
例
call hoge( inA, inB, & !(in)
& inoutA, inoutB, & !(inout)
& outA, & !(out) ポインタ出力変数
& )
...
subroutine hoge( inA, inB, & !(in)
& inoutA, inoutB, & !(inout)
& outA, & !(out) ポインタ出力変数
& outB, & !(out)
& )
character(*),intent(in) :: inA ! 入力変数
integer,pointer :: inB !(in) ポインタ入力変数
real,pointer :: inoutA !(inout) ポインタ入出力変数
real :: inoutB ! 入出力変数
real(8),pointer :: outA !(out) ポインタ出力変数
logical, optional :: outB ! 出力変数
...
end subroutine hoge
例 (ポインタの割り付け状態を明記する場合)
call hoge( inA, & !(in)
& inB, & !(in,allocated)
& inoutA, & !(inout,allocated)
& inoutB, & !(inout)
& outA, & !(out,deallocated) ポインタ出力変数
& outB, & !(out)
& )
...
subroutine hoge( inA, & !(in)
& inB, & !(in,allocated)
& inoutA, & !(inout,allocated)
& inoutB, & !(inout)
& outA, & !(out,deallocated) ポインタ出力変数
& outB, & !(out)
& )
character(*),intent(in) :: inA ! 入力変数
integer,pointer :: inB !(in) ポインタ入力変数
real,pointer :: inoutA !(inout) ポインタ入出力変数
real :: inoutB ! 入出力変数
real(8),pointer :: outA !(out) ポインタ出力変数
logical, optional :: outB ! 出力変数
...
end subroutine hoge
== リスタートファイルとヒストリーファイル
本コーディングルールでのリスタートファイルとヒストリーファイル
の定義
: リスタートファイル
プログラムの初期値となるファイル. 格納されるデータの種類は
プログラムに固有である. プログラムのスタート, リスタートに
必要となるデータが格納される.
ここでは初期値データもリスタートファイルに含む.
: ヒストリーファイル
プログラムによって生成された結果のデータ.
プログラムを動かすユーザ毎に必要となるデータは異なるため,
ユーザが任意でどのデータを書き出すかを決める.
ここでの「ユーザ」とはプログラムの実行者を表すが,
プログラムの開発者であっても良い.
=== ルール
* リスタートファイルとヒストリーファイルとは別々のファイルに分けて
出力する.
リスタートファイルには, リスタートに必要なデータ全てを 1
つのファイルに出力する. 正しくリスタートを行うため,
プログラム内で用いる最も高い精度と同じ精度のデータを格納する.
プログラムのスタート, リスタートに不要なデータは含まない.
リスタートファイルの出力のタイミングは任意だが, 最低限プログラム
終了時には出力するようにする.
ヒストリーファイルにはユーザが必要とするデータを任意で
出力する. 複数のデータを 1 つのファイルにまとめても,
複数のファイルに分けても良い. 精度もユーザによって任意に
決める.
リスタートファイルとヒストリーファイルとを分けるのは,
出力する個々のデータがリスタートに必要なのか不要なのかを
明確にする利点がある.
== NAMELIST ファイルの利用
NAMELIST は, プログラムの動作を動的に変化させるのに非常に便利である.
以下では NAMELIST に関するルールを挙げる.
=== NAMELIST ファイルの書法
NAMELIST ファイルには, 入力する定数/変数の説明を以下のようにコメント行
として加えること.
* 例
#--------------------------- 物理変数設定 ----------------------------
#
# real(8) :: Radius ! 球の半径
# real(8) :: Omega ! 回転角速度
# integer :: HVOrder ! 超粘性の次数(1 で普通の粘性,
# ! 水平ラプラシアンの階数)
# real(8) :: HVisc ! 超粘性係数
&physics Radius=1.0D0, Omega=100.0D0, HVOrder=8, HVisc=1.0D-21 /
...
=== NAMELIST ファイルの入力
Fortran 95 の規格には含まれていないが, ほとんどの処理系には用意されている
組み込み関数 getarg を利用して NAMELIST ファイル名を取得する.
この方法には以下の利点がある.
* 実行のたびに NAMELIST ファイル名を動的に変化させる
ことが可能である.
NAMELIST ファイルをハードコードするのに対し, ファイル名を
自由に変更できるため, 実験の際の手間を減らすことができる.
* 標準入力ではなくファイルから取得するため, NAMELIST 変数の
順序を気にしなくて良い.
プログラムが大規模になると読み込む NAMELIST 変数の数も
増大することが想定される. 標準入力からの読み込みと異なり,
ファイルから読み込む場合にはファイル内を何度も参照可能なためである.
この方法には以下の欠点も指摘される.
* 処理系によって getarg の仕様が異なる.
dcmodel プロジェクトでは, gtool4 プロジェクトの
データ I/O ライブラリ gt4f90io ( ((<参考文献>)) 5 ) によって
処理系依存を吸収する.
=== NAMELIST 変数のデフォルト値の設定
NAMELIST 変数で入力する値には必ずデフォルト値を設定し,
NAMELIST 変数が入力できない場合 (NAMELIST ファイル内に変数が
記述されていない場合) でもなんらかの値が設定されるようにする.
これは, NAMELIST 変数が無くても正常に動作が続くことを強制する
のではなく, 場合によってはプログラムを終了させることも含む.
これにより不定な変数がプログラム内で用いられるのを防ぐことができ,
結果として予期しない動作を抑止することができる.
== プログラムのスタート, リスタートに関して
原則的に, 計算を開始するためには NAMELIST
ファイルとリスタートファイルの組を持つことを前提とする.
リスタートファイルの名前や各種のパラメータなどは
全て NAMELIST ファイル内で指定する.
NAMELIST ファイル内で初期値ファイルを指定しない場合には,
プログラムの内部でデフォルトの初期値を作成し, その初期値から
プログラムをスタートさせる. 各種のパラメータは NAMELIST
ファイル内で指定するものを用いる.
NAMELIST ファイル自体を指定せずにプログラムを実行した場合,
プログラム内部でデフォルトの初期値を生成し, その初期値から
プログラムをスタートさせる. 各種のパラメータはデフォルトの
ものを用いる.
== モデル時刻とデータ時刻
本コーディングルールでの, モデル時刻とデータ時刻の定義
:モデル時刻
モデルの積分時間
:データ時刻
入出力するデータに与えられる時刻
例1: NCEP の 2000 年 1 月 1 日のデータを初期値に与えて 1 年積分する場合.
* モデル時刻 : 0 日 〜 1 年
* 初期値データのデータ時刻 : 2000 年 1 月 1 日
* 出力されるリスタートファイルのデータ時刻: 2000 年 12 月 31 日
例2: 理想的な初期値を与えて 1 年積分する場合
* モデル時刻 : 0 日 〜 1 年
* 初期値データのデータ時刻 : 0 日
* 出力されるリスタートファイルのデータ時刻: 1 年
=== ルール
モデルが出力するデータのデータ時刻は,
入力するリスタートファイルのデータ時刻を引き継いだものとしてもよいし,
計算開始時点で適当な値にセットしたものとしてもよい.
もしも適当な値にセットする場合には, その値を NAMELIST ファイルで指定する.
== モデル時刻ゼロのデータの出力に関して
モデル時刻ゼロのデータ (プログラムを実行する際に入力した
リスタートファイルのデータ) をヒストリーファイルに出力
すべきかどうかは, ヒストリーファイルの利用方法に依る.
そのため, 出力できるかどうか, NAMELIST によって動的に
変化できるようにしておく.
デフォルトでは, リスタートファイルを入力する際には
出力し, 初期値データを自身で生成する際には出力しないようにする.
== 変数命名法
=== 基本ルール
変数名の基本形は以下のようにする.
(格子点情報に関する接頭詞)_(物理的意味)(時間方向添字)
配列ではないものに関しては以下のようにする.
(物理的意味)(時間方向添字)
時間方向に変化しない変数は (時間方向添字) を記述しない.
=== 格子点情報に関する接頭詞
格子点情報に関する接頭詞には, 以下の文字を用いる.
s sin 展開スペクトルデータ
c cos 展開スペクトルデータ
e フーリエ展開スペクトルデータ
w 球面調和関数展開スペクトルデータ
t チェビシェフ多項式展開スペクトルデータ
x 格子点データ(x / 経度座標)
y 格子点データ(y / 緯度座標)
z 格子点データ(z / 動径座標)
p 格子点データ半整数レベル(x / 経度座標)
q 格子点データ半整数レベル(y / 緯度座標)
r 格子点データ半整数レベル(z / 動径座標)
a 格子点データ(任意)
今のところ利用しない予定の接頭詞
b Bessel 関数展開スペクトルデータに使いそう
h エルミート多項式展開スペクトルデータに使いそう
例
* X-Z 2 次元座標の場合
pz: x 方向フラックス格子点
xr: z 方向フラックス格子点
xz: スカラー格子点
Z
-|--xr--|- 半整数レベル
| |
pz xz pz 整数レベル
| |
-|--xr--|-X
* 1 次元配列の場合
p_Temp x 方向 1 次元配列(半整数レベル)
r_Temp z 方向 1 次元配列(半整数レベル)
z_Temp z 方向 1 次元配列(整数レベル)
* スペクトルモデルの場合
xyz_Temp 整数レベル (格子点データ)
xyr_Temp 半整数レベル (格子点データ)
wz_Temp 整数レベル (スペクトルデータ)
wr_Temp 半整数レベル (スペクトルデータ)
=== 時間方向添字
時間方向の添え字には大文字を用いる.
未来には A, 現在には N, 過去は 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)
Bl Nl Al
-|-----------|-----------|---->t
-|-----|-----|-----|-----|---->τ
Bs Ns As AAs
例
xy_TempA
wa_VorB
ss_ExnerNs
=== 物理的意味
基本的なルール
* 1 文字の名前はなるべく利用しない.
u, v, T, ...
* 頭文字は大文字とする.
Temp, Vel, ...
* ベクトル量にはその方向座標を示す添字を付ける
VelX, VelZ, TauX, TauZ, ...
ただし, プログラム全体にわたってこの基本ルールを強制するものでは無く,
下請けのモジュール, サブルーチン内でのみ現れる変数の名前については,
その都度工夫して変数の名前の付ける.
==== 個別名
よく利用される名前について列挙する.
* 座標等
座標 X, Lon
Y, Lat
Z, Rad, Press, Sigma
交互格子点上の座標 x_X, p_X
y_Y, q_Y
z_Z, r_Z
最大最小 *Max, *Min
座標格子間隔 DelX, DelY, DelZ
DelLon, DelLat, DelRad
暦 Date (?)
Date%Year, Date%Month, Date%Day,
Date%Hour, Date%Min, Date%Sec
時間 Time
時間格子間隔 DelTime
長い時間ステップ DelTimeLong
短い時間ステップ DelTimeShort
時間ステップ数 Nstep (?)
長い時間ステップ NstepLong
短い時間ステップ NstepShort
* 予報変数
速度 VelX, VelLon
VelY, VelLat
VelZ, VelRad, VelPress, VelSigma
流線関数 Stream
速度ポテンシャル VelPot
渦度 Vor,
VorX,
VorY,
VorZ,
ポテンシャル渦度 PotVor
水平発散 HDiv, HorDiv (?)
温度 Temp
仮温度 VirTemp
温位 PotTemp,
仮温位 VirPotTemp
相当温位 EquivPotTemp (?)
飽和相当温位 SatEquivPotTemp (?)
密度 Dens
圧力 Press
エクスナー関数 Exner
ジオポテンシャル GeoPot
高度 Height
トレーサ(4 次元配列にし, 4 番目の次元でトレーサの種類を区別する)
分率(0〜1) QTracer (記号 q を用いるから)
混合比(0〜∞) RTracer (記号 r を用いるから)
降水量 Rain, Precip
* 微分量
時間微分の物理量を表す名前は D(従属変数)D(独立変数) と記述する.
渦度の時間微分 DVorDtNs
渦度の経度微分 DVorDlonNs
相当温位の温位微分 DPotTempEDPotTemp
==== 今後検討を要する個別名
以下のものは現在検討中の個別名である.
* 平均成分
案1) 該当する変数名に Avr(平均をとる座標変数) を接尾語につける.
ex) X 方向平均 VelXAvrX
Y 方向平均 VelYAvrY
Z 方向平均 VelZAvrZ
水平平均 VelXAvrXY
案2) 該当する変数名に Mean(平均をとる座標変数) を接尾語につける.
ex) X 方向平均 VelXMeanX
Y 方向平均 VelYMeanY
Z 方向平均 VelZMeanZ
水平平均 VelXMeanXY
上記 案1, 案2 の欠点は, 本来変数 VelX などにかかるオペレータを表す
AvrX などの文字列が, 変数の後ろに付けられているため, 気持悪いこと.
* 基本場
案1) 該当する変数名に Basic(独立変数となる座標) を接尾語につける.
ex) 温度 TempBasicZ
密度 RhoBasicZ
圧力 PressBasicZ
速度 VelXBasicZ
欠点は, 変数名が長くなること.
* パラメータ
円周率 Pi
ステファン-ボルツマン定数 ??
気体定数 GasConst
重力加速度 Grav
定圧比熱 Cp
定積比熱 Cv
非熱比 Gamma
自転角速度 Omega
気体分子量 Gaswt, MolWt
惑星名 Planet
* 個別名で指定されていない変数の名前は, それらしい意味を持っ
た名前にする.
原則としてドキュメントに用いられている名前と対応した変数名にする
ex.1) 式中に現れる個別の項
たとえば
dT/dt = ADV + DIFF
のようにドキュメントに書かれており, ADV, DIFF に対応
する変数を使用する場合には, ADV, DIFF に対応した変数名
にする.
ex.2) 計算パラメータ
時間差分に陰解法を用いた場合の重み
音波減衰項の係数
Asselin 時間フィルターの係数
乱流エネルギーから拡散係数を求める際の比例係数
....
数理ドキュメントに無い変数の名前は, それらしい意味を持った名前をその都度
考えて与える
ex.3) 行列の要素
ドキュメントには単に「逆行列を解く」とのみ記載されている場合,
実際の逆行列を解く部分で必要になる中間変数の変数名はそれら
しい意味を持つものにする.
たとえば係数行列を LU 分解して解く場合, L 行列の要素は LL, U
行列の要素は UU などとする.
ex.4) 配列要素の大きさ
格子モデルのように, 「配列要素の大きさ」と「物理的に意味のあ
る領域の大きさ」を区別する必要がある場合, 多少長めの変数名
を付けておいた方がよいだろう.
たとえば
* 配列の上限と下限を指定する変数(配列要素の大きさを指定)
* DimXMax, DimXMin
* 物理的に意味のある領域の大きさを指定する変数(箱+壁)
* RegXMax, RegXMin
* のりしろ部分の大きさ
* MarginX, MarginY
などとする.
この場合の欠点は, 配列変数の宣言文が長くなることである.
単に一時的に値を格納するためだけに用いられる変数の名前は Work にする.
* 文字変数の命名法
計算条件, 状態を指定するような文字列を決めておいた方がよいかもし
れない.
ex.1) 境界条件
周期境界 'Cyclic'
摩擦なし 'FreeSlip'
滑べりなし 'RigidRid'
放射条件 'Radiation'
実際に各変数に対し境界条件を適用する下請けモジュールまたはサブルー
チン内でスイッチなどに用いられる文字列は, 各モデルの実装に応じて決
めてよい.
* Do ループ時に配列の要素を指定する変数
ドキュメントに用いられている添字と対応させやすい変数名にする
== 関数命名法
=== 基本ルール
関数名の基本形は以下のようにする. ただし, 入力引数が 2 つ以上である場合,
さらにこの後ろに `((%_(入力引数の格子点情報を示す接頭詞)%))' を続ける.
(出力データの格子点情報を示す接頭詞)_(機能)_(入力引数の格子点情報を示す接頭詞)
例 (SPMODEL, ((<参考文献>)) 1 )
xy 2 次元データの x_AvrLat_xy
緯度方向平均を返す
2 つの xy 2 次元データ
に発散を作用させてスペ w_Div_xy_xy
クトルデータを返す
== 参考文献
(1) ((<気象庁標準コーディングルール|URL:http://www.mri-jma.go.jp/Project/mrinpd/coderule.html>))
(2) ヨーロピアンスタンダード
( ((<オリジナル|URL:http://www.meto.gov.uk/research/nwp/numerical/fortran90/f90_standards.html>)) /
((<気象研究所による和訳|URL:http://www.mri-jma.go.jp/Project/mrinpd/eurostand.html>)) )
(3) (())
(4) ((<階層的地球流体スペクトルモデル集 SPMODEL|URL:http://www.gfd-dennou.org/library/spmodel>))
(5) (())
== URL
* (())
* ((<地球流体電脳倶楽部 dcmodel プロジェクト|URL:http://www.gfd-dennou.org/library/dcmodel>))
* ((<地球流体電脳倶楽部|URL:http://www.gfd-dennou.org>))
== 本コーディングルール作成に携わった人々
# もしかすると dcmodel のページの「過去の功労者」でまとめた方が
# いいかもしれないが,
# このファイル自体があちこちに行くのであればここに書いておいても
# 良いのかもしれない. (dcmodel ページへのリンクが貼られていれば
# それでよいのかも.)
#
# とりあえずだいたい年齢 (学年) 順で並べたつもり
林 祥介, 中島 健介, 石渡 正樹, 竹広 真一, 堀之内 武, 小高 正嗣,
谷口 博, 柿並 義宏, 杉山 耕一朗, 山田 由貴子, 森川 靖大, 北守 太一
=end