多少まとめました。 誤字脱字等あるかもしれませんので、修正を書けるつもりです。
あと、一般的なもとの差があるかもしれませんが、 基本的には、「ルールを守って記述する」というのが一番重要です。
文字の取り扱い
キーワードはすべて大文字
基本的にはfortran90のキーワードは大文字で表記する。 以下、以外にもあるので注意。
INTEGER REAL(8) SUBROUTINE END DO DO END ALLOCATE IMPLICIT NONE MODULE SAVE USE .etc
モジュール名は頭文字を大文字
# 宣言 MODULE Globals END MODULE # 呼び出し USE Globals
定数はすべて大文字
単語のつなぎは、「_」(アンダーバー)とする。
# 定数 REAL(8),PARAMETER :: WATER_DENSITY = 1.0D0 INTEGER,PARAMETER :: IMAX = 100
変数名は頭文字小文字
変数名の頭文字は小文字とし、単語のつなぎはキャメル式とする。 (アンダーバーのつなぎにする場合は、統一する)
# 変数 REAL(8), x,y = 1.0D0 INTEGER, flagOfCal = 0
モジュールは基本的に3つとメイン文
1.グローバル変数と定数
# 例えば、Globalsというモジュールに入れる場合 MODULE Globals # グローバル変数 REAL(8), ALLOCATABLE, SAVE, DIMENSION(:,:) :: pressure # 定数 REAL(8),PARAMETER :: WATER_DENSITY = 1.0D0 INTEGER,PARAMETER :: IMAX = 100 END MODULE # 呼び出し USE Globals
2.サブルーチン群
# 例えば、Sub1というサブルーチンを作成する場合 SUBROUTINE Sub1(imax,x) # モジュールの読み込み USE Globals # 必ず宣言 IMPLICIT NONE # インテント文を入れて、引数を宣言 INTEGER,INTENT(IN) :: imax REAL(8),INTENT(INOUT) :: x # サブルーチン内で利用するローカル変数の設定(カウンター等) INTEGER I,J,K # 以下処理の記述 END SUBROUTINE # 呼び出し CALL Sub1(imax,x)
3.ファンクション群
# 例えば、Sub1というサブルーチンを作成する場合 FUNCTION INTEGER func1(a,b) # モジュールの読み込み USE Globals # 必ず宣言 IMPLICIT NONE # インテント文を入れて、引数を宣言 INTEGER,INTENT(IN) :: a,b # 以下処理の記述 func = a + b END func1 # 呼び出し INTEGER sum sum = func1(1,1)
FUNCTIONは数が多くなる可能性があるので、必要に応じて、インターフェイスモジュールを使う。 後ほど記述予定。
4.メイン文
基本的には、時間積分を記述するものとする。
PROGRAM MAIN # モジュールの読み込み USE Globals # 必ず宣言 IMPLICIT NONE # ローカル変数 INTEGER TMAX INTEGER T # 初期条件、パラメータの設定 T = 0 # 以下、時間積分の処理 DO # 連続式 # 運動方程式 # 境界条件 # 乱流モデル # 河床変動等々 T = T + 1 # 出力関連 CALL OutPut IF(T .GE. TMAX) EXIT END DO END PROGRAM
その他
makefileを作成
必要であれば、記述。
実行時のオプションがあれば明記
必要であれば、記述。
インデントは半角スペース4つ
普通は2文字であるが、コードの見やすさのために、あえてスペース4つとする。 f90であれば、列の制限はないので、問題ないかと。
タブは使わない。
小数点の値を記述するときには「d0」を付けること
小数の精度を考えて、「d0」を付ける。
サブルーチンにおいて、引数を持たせる場合は、INTENT文を入れること。
サブルーチンの引数の取り扱いを明確にするために付ける。
書き換えてはいけない変数を書き換えてしまうのを防止する。
IMPLICIT NONEを宣言すること。
変数は宣言してから使うものとする。
組み込み関数は大文字にする。
標準の関数については大文字とする。
見た目で、組み込み関数か、自作関数かを明確にするため。