俺コーディングルール
基本的には気象庁コーディングルールに従う。そこからの modifications や additions について記す。
コメントについて
コメントは !! で行う。コメントアウトの ! と区別するため。
subroutine の call について
- 必ず全ての引数を = で明示する。順番依存の呼び出しは危険なので絶対にしない
- 右にコメントで intent のタイプを書く
- 引数がひとつの場合、一行で書く
- 引数が2つ以上ある場合、引数一つごとに改行する(下記参照)
例:
call advection_1st_upwind_uniform( & & advec = adv_v(1) & !! intent(out) & , h = Uv & !! intent(in) & , ds = dx & !! intent(in) & , q_m1 = v(i-1,j) & !! intent(in) & , q = v(i ,j) & !! intent(in) & , q_p1 = v(i+1,j) & !! intent(in) & )
変数の受け渡しについて
上位ルーチンや他 module からある subroutine への変数の受け渡しには2種類ある。
- モジュール共有変数を使う。module mod 側で real(8), public :: foo にしておいて、use mod, only : foo みたいな
- 引数を使う。 real(8), intent(in/out/inout) :: foo みたいな
変数の流れを明確にするために、基本的には引数を優先して使う。
- subroutine 内で変数の値を変えるときは、intent(out) または intent(inout) を使う
- subroutine 内で変数の値を変えないときは、intent(in) を使う。場合によっては、モジュール共有変数を使ってもいい
use は module 直下でまとめて、ではなく、subroutine ごとに個別に行う。そのほうが変数の流れがさらにハッキリする。ただしモジュール共有変数の配列の上限などに使う変数はモジュール冒頭で use するしかない。また例外として、paramterではないものの、計算途中で絶対に値を変えないような定数(例えばPIとか)については、モジュール冒頭で use してもいいことにする。