Fortranは古い言語なので、元々の仕様として変数を動的に割り当てることなくメモリー上に固定したエリアを確保していました。
どういうことかというと、今の動的にメモリーを確保する言語ならサブルーチンに処理を渡したときに、次に呼ばれたときにはそのサブルーチン内の変数は初期化されています。(初期化もしくは不定値ですね。)
ところが、元々のFortranではサブルーチンの変数の値がメモリー上に残るので、例えばサブルーチンが呼ばれるたびにローカル変数をインクリメントしたりすることができるし、古いライブラリーではそのような実装になっているものが結構あったりします。
Fortranの恩恵のひとつが、こういった過去のライブラリーを流用できることなのですが。。
実際のところは、もう何十年も前からデフォルトでは変数の静的割り当ては行われなくなっています。この機能を使うときにはコンパイル時にオプションを指定する必要があります。
まぁ、よくあるパターンが-saveオプションですが、互換性の問題から推奨されるのはオプションによる指定ではなくて、変数をSAVE宣言してやる方がいいんですよね。でも、どの変数が静的に割り当てられているかを識別するのは大変なので、よくまとめて-saveオプションを使ってしまったりするのですね。コードをいじる必要がなくなるので。
で、GCCに含まれているgfortranでどうやったらこの静的割り当てができるかをちょっと前に悩んでたんです。
gfortranでコンパイルした結果が他のコンパイラーでコンパイルした結果による実行結果と有意に違っていたんです。
で、色々と探してみつけたのが -fno-automatic オプションでした。これがいわゆる-saveオプションに相当するみたいですね。
昔だったらcommonで逃げるという手もあったんでしょうが、common自体は推奨されていません。一般にグローバル変数で言われるように、どの時点で変数が書き換えられたかがわかりにくくなるからですね。Fortranではmodule推奨ですが、まだうまく使いこなせないなぁ。
と、話がそれましたが、過去の資産を利用しようとすると、静的割り当てが必要になると。
まぁ、commonをmoduleに単純に置き換えるぐらいだったら、common名をgrepかければ大抵はなんとかなりますけどね。