world.")を自由に変え、コンパイル&実行せよ。[#t53ce9d9]まずはC言語の復習も兼ねて、線形合同法による乱数生成プログラムのC言語版を見てみよう。[#a4f54c2b]次にFortran90/95言語で同じことをするコードを見てみよう。random_numbermoduleはデータと関数をひとまとめにしたもの。C++やJavaのclassに対応。[#ff61e3dd]上のFortran90/95プログラムをrandom_number.f95という名前のファイルに保存し、コンパイル&実行せよ。[#nca1bce0]以下全てFORTRAN66/77と誤解している。変数名は6文字までなんでしょう?・・・そんなことはありません。ソースコードは全部大文字で書くんでしょう?・・・それも可能ですが、わざわざそんな読みにくいことをする必要はありません。ソースコードは固定形式(7列目から72列目まで)なんでしょう?・・・そんなことはありません。構造体がないんでしょう?・・・あります。ポインタがないんでしょう?・・・あります。使う必要はありませんが。演算子を自分で定義することができなんでしょう?・・・できます。関数や演算子の多重定義ができなんでしょう?・・・できます。再帰呼び出しができなんでしょう?・・・できます。関数とデータをまとめてひとかたまりにする(クラス化する)ことなんてできないんでしょう?・・・できます。上のサンプルプログラムで使ったmoduleがそれです。情報の隠蔽(カプセル化)ができないんでしょう?・・・できます。[#pcddf2ad]上の最後に述べた情報隠蔽(カプセル化)は名前空間を分離し、バグの入りにくいコードを書くためには不可欠な機能である。上のサンプルプログラムにカプセル化を施したコードを下に示す。冒頭近くに3行ほど追加しただけである。諸君は既にJavaを知っているから、この3行の意味は明白であろう。[#y74761e3]数値演算や計算機シミュレーションに適した言語である。スーパーコンピュータ向けの言語としては最適。オブジェクト指向プログラミングや並列計算機への対応も意識された言語である。これらの意味を納得できるようになることが目標。[#gbfec419]部屋の中の温度場の分布から平均気温を求めよう。f(nx,ny,nz)で表す。nzは実行時まで不定とする。全ての格子点(i,j,k)上でのfの値を足して格子点の総数で割ればよいものとする。任意サイズの3次元単精度実数(浮動小数点数)配列を受け取り、その平均値を返す関数を作ろう。Fortran90/95ではこう書ける。[#f2c59871]このようにわずか4行で書ける。mean_valueこのプログラムの意味は後で説明するが、ここに出てくるsumやsizeはライブラリではなく組み込み関数、つまりFortran90/95言語にもともと含まれている関数である。[#eab3a00a]上の関数をC言語で作れ。[#e6951de8]行列のかけ算のためにFortran90/95ではmatmulという組み込み関数が用意されている。行列の転置をとる組み込み関数transposeも用意されている。matmul(transpose(A),B)と一行で書ける。行列の足し算も簡単である。[#hc79163b]以下のプログラムをmatmul_a_transpose_b.f95というファイルに保存し、コンパイル&実行せよ。\frac{1}{4}の最初の1000項の和を求めるプログラムも、式をそのまま書けばいい。Translation。series_one_forth.f95という名前に保存し、コンパイル&実行せよ。[#y64cdf79]上の例では第1行目から第1000項目までの和をとっていた。第50項目から第90行目までの和が欲しければ以下のようにすればよい。x(50:90)などは部分配列と呼ぶ。部分配列も含めてFortran90/95には配列を扱うための便利な機能が多数用意されている。配列機能については次回詳しく解説する。[#oc44c8ef]空間中に分布する磁場(3成分ベクトル場)の全磁気エネルギーは#ref(emag01.jpg)で与えられる。全磁気エネルギーは#ref(emag02.jpg)と書ける。sum(Bx**2+By**2+Bz**2)とわずか1行で書ける。配列のサイズ(nx,ny,nz)が実行時まで不定でもよい。Fortran90/95のソースコードではアルファベットの大文字と小文字は区別しない。文字列変数の中では当然区別される。