dynamicsoar's log

主に研究関係のメモ

俺コーディングルール

基本的には気象庁コーディングルールに従う。そこからの 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種類ある。

  1. モジュール共有変数を使う。module mod 側で real(8), public :: foo にしておいて、use mod, only : foo みたいな
  2. 引数を使う。 real(8), intent(in/out/inout) :: foo みたいな

変数の流れを明確にするために、基本的には引数を優先して使う。

  • subroutine 内で変数の値を変えるときは、intent(out) または intent(inout) を使う
  • subroutine 内で変数の値を変えないときは、intent(in) を使う。場合によっては、モジュール共有変数を使ってもいい

use は module 直下でまとめて、ではなく、subroutine ごとに個別に行う。そのほうが変数の流れがさらにハッキリする。ただしモジュール共有変数の配列の上限などに使う変数はモジュール冒頭で use するしかない。また例外として、paramterではないものの、計算途中で絶対に値を変えないような定数(例えばPIとか)については、モジュール冒頭で use してもいいことにする。