Fortran について。
(一部 MacOS を想定)Fortran は数値計算を主に取り扱うプログラミング言語である。歴史は古く、現在は数値計算の分野でしか使われないが、今でも物理などの分野では現役である (例えば Intel のコンパイラーは C/C++ と Fortran をサポートしている。)。実際長く使われている歴史があるので、信頼のおける言語である。また、言語構造が簡単なので、早く習得できると思う。
Fortran ももちろん、できてから今まで言語の更新が行われてきた。紙媒体に穴を空けたものからデータを読み取っていたときの名残が、Fortran 77 というバージョンには残っており、左を 6 マス空けなければならない。しかし、Fortran 90 や 95 といった後継の Fortran ではそれらは解消され、モジュールや、ポインターなども使えるようになり、今では現代的なプログラミング言語となっている。
目次
導入 (Mac)
Fortran を含め、多くの言語では、人間の目に易しい書き方が可能である一方、コンピュータからすれば非常に効率の悪い書き方になっている。なので、人間が書くときには人間に分かりやすく、コンピュータが実行するときにはより効率的な書き方にする必要がある。そのように変換することをコンパイルするという。コンパイルするツールをコンパイラーと呼び、Fortran ではこのコンパイラーが必要である。
環境準備
以下の手順でコンパイラーを導入する準備を行う。
- Xcode を App Store からインストールする。
- 以下のコマンドで Command Line Tools をインストールする。
- XQuartz をインストールする。
- MacPorts または、 Homebrew または、 Fink などを用いて GNU の Fortran コンパイラーをインストールする。
-
Xcode の使用許諾に同意していない。
→ Xcode を起動してライセンス契約にサインする。
-
XQuartz が古い。
→ 最新のものにアップデートする。
ここでは、Homebrew の方法で試みる。
Homebrew のインストール
Homebrew のトップページにあるように、以下のコマンド (変更があり得るので確認すること) にて Homebrew をインストールする。 うまくいったら、以下のコマンドで最新状態にアップデートする。 さらにうまくいったら、以下のコマンドで問題がないかチェックする。 後々問題が起こらないように、ここで得られたエラーや警告は全て解決しておこう。 途中、ごちゃごちゃ言われたらその都度内容を読んで対処する。以下、起こりえる問題点を示す。
gfortran (GNU の Fortran コンパイラー) のインストール
gfortran は gcc のパッケージに含まれる。よって、以下のコマンドで、gcc をインストールする。 インストールが完了したら、 と実行してみて、 (インプットファイルが無いよ!) などと出力されたら、うまくいっている。 とすれば、コンパイラーのバージョンが分かる。
コンパイル
以下のようにプログラムファイル (test.f90) をコンパイルする。 すると、a.out というファイルができる。これを実行するには、 とする。ここで、a.out は実行ファイルと呼ばれる。 実行ファイルの名前を変えたければ、 とすればよい。実行ファイルとして、test.exe ができる。
基本的な書き方・ルール
まずは基本中の基本の話から
- プログラムのファイル名は、xxx.f90 とする。 xxx の部分はアルファベット [a-z,A-Z] から始まり、アルファベット [a-z,A-Z] 、数字 [0-9] 、およびアンダーバー _ 、ハイフン - 、プラス記号 + 等が使える。あまり複雑な記号を使うのはエラーの元なので控える。空白文字 (スペース) は使わない。日本語も使わない。
- Fortran 内部では、大文字と小文字の区別はない。パラメーターは大文字で書くなどの統一性を持たせると良い。
- コメント文はびっくりマーク ! で記述し、その行のそれ以降は無視される。
- 長いプログラム文は読みにくいので、適宜改行を入れる。改行を入れるには、 & 記号を行末に書く。また、分かりやすいように、改行後の行頭にも & を入れると良い。
- 基本的に 1 コマンド 1 行だが、セミコロン ; を使って複数のコマンドを 1 行に書くこともできる。
- 配列を使うことができる。配列とは変数名が一つで複数の変数を格納することができる箱。型名及び、次元を与える。
-
文章の構成
- プログラム名を書く。
- 明示的に型宣言をするように指定する。
-
変数を定義する。
型名::変数名
の形で定義する。パラメーターの場合は値も代入する。
- パラメーター (定数) の定義。全て一般変数で定義してもいいが、パラメーター指定にすると、プログラムの実行速度が早くなり、また、バグの発見が容易になる。
- 一般変数の定義。
-
よく使う型は以下である。
型 記述方法 値の例 整数 integer 1, 2, 5, 10 実数 (倍精度) real(kind(0d0)), couble precision 1d0, 2.0d0, 5d-1 複素数 (倍精度) complex(kind(0d0)) cmplx(1.0,0.0,kind(0d0)), cmplx(0d0,1d0) 文字 character(1), character(100), character(*) 'abc', "xyz", "123" 論理 logical .true., .false. - 変数には対応する形式で代入する。形式は、上の表の「値の例」参照。
-
変数名はアルファベットから始まれば何でも良いが、以下のルールをオススメする。
- 整数は、 i, j, n, m を変数の前に付ける。
- 実数は、 d を変数の前につけdる。
- 複素数は、 c を変数の前に付ける。
- 文字列は、 s を変数の前に付ける。
- 論理型変数は、 l を変数の前に付ける。
- 実行するコマンドを書く。
- プログラムの終了を記述する。 プログラム例
繰り返しの文
繰り返しの方法は、 do と enddo (end do) を用いる。
i に 1 から 100 までを順番に入れて、それを足しあわせる例。
複数の入れ子構造も可能。
i にまず 1 を入れて、j に 1 から100 までを入れながらその合計を行い、終わったら、i に 2 を入れて、j に同じ操作、という感じに i に 100 が入って、j のループがなされるまで続ける例。
配列の値を操作する場合、Fortran では左側の変数から操作した方が処理が早い。
2 次元配列 darray の i, j 成分をどんどん足していく例。
条件分岐
結果によって処理を変えたいときには、if 文を用いて条件分岐を行う。
dval が 50 以上なら "pass" と書き出し、それ以外なら、"bad" と書き出す例。
dval が 80 以上なら "good" と書き出し、50 以上 80 未満なら "soso" と書き出し、50 未満なら "bad" と書き出す例。
書き出しのコマンド
-
DO 反復文
ファイルへの書き出し
ファイルへの書き出しはまずはファイルを開く (作る) open コマンドから始める。 ここでは、10 番という装置番号で test.txt というファイルを開く (作る) ことを行っている。装置番号というのは open に関連付けられた番号で、 とすれば、先ほど 10 番で開いた test.txt に書き込むことができる。 ファイルを開いたら、最後に必ず close 文で閉じなければならない。
既存のファイルを開いて、その一番最後から追加で記述したい場合は、 open にさらに position = 'append' という引数を追加する。 これで、再度 write 文で書き込みを行ったとき、ファイルの途中から書き込みを行ってくれる。
乱数の取り扱い (Intel MKL)
Intel コンパイラーを購入している場合、本格的に乱数を扱いたい場合や、テストで適当な乱数の配列を作りたい場合などに、組み込みの乱数発生装置ではなくて、Intel 謹製の乱数発生装置を用いることができる。その方法について述べる。詳しくはオフィシャルなドキュメントを参照のこと。
以下のようなモジュールを自分で準備して使うと便利。
上記モジュールをコンパイル時に読み込んで、使用したいプログラムの中で、 として、まずは初期化する。 それから、一様乱数なら、(範囲 [0,1]) とすれば良い。ガウス分布の乱数なら、(平均 0.5, 分散 0.2) とする。