fortran ではシングルトン−オブジェクト指向プログラミングを志向すべきであり、
そのクラス=インスタンスにmoduleを使うことになる。
「プログラムの核心はモジュール内サブルーチン(メソッド)にある。モジュール内サブルーチンは他のモジュールのモジュール変数(+ファイル読み込みデータ)からモジュール内のモジュール変数をallocateして作ること」である。
この考え方で言えばモジュールには主に2種類の使い方しかない。
その1:複数のサブルーチンを取りまとめる。
複数のサブルーチンがcall-caller treeで結びついているときにその親玉(複数ありえる)を中心に一つのモジュールに入れる。publicな関数を指定する。原則的にモジュール変数はつかわないこと(サブルーチンの間のデータのやり取りが見えなくなる)。useしてcallすることで(基本的に必ずonlyをつける)、コンパイラが呼び出し側との間の変数の整合性チェックができる(optional変数、名前結合などでは必須)。
その2:出力変数をモジュール変数とする。
サブルーチンを複数含んでおり、サブルーチンの出力変数をモジュール変数とする場合。この場合、サブルーチンの出力はモジュール変数で返す。サブルーチンは入力引数のみを取りモジュール内の出力変数を書くことになる。出力変数はprotectすること。他のモジュールの変数を見るときにはuse onlyする。
そもそもfortranで書けるのはここまで。大きなプログラムをfortranで書くべきでない。
(その3:typeの取りまとめなど)
そもそもtypeは極力使わないのがよいと考えているが私はpointer arrayを作る方法(原子ごとに長さの違う配列をつくるなど)がtypeの配列を作る以外に思いつかないのでしかたなく用いている。
https://github.com/tkotani/ecalj/blob/master/SRC/subroutines/m_struc_def.f90
(type s_specは消したいがまだ消せてない)。