現在作成中です。 既に書いている内容も&color(#ff0000){大幅に変わる};可能性が高いです。 as of 2010-04-28 (&counter;) ------- #contents ------- * 担当教員 [#d810a8d4] 陰山 聡 * 演習日 [#e84fbb5c] - 2010.05.06 - 2010.05.13 * 概要と達成目標 [#dcc5c361] + 概要 ++ why f? (なぜFortran95言語か) ++ f && c (Fotran95とCの同じところ) ++ [演習]Hello, world. コンパイルと実行 ++ diff f c (Fotran95とCの違うところ) ++ wonderful f (Fotran95の素晴らしいところ) ++ practical f (Fotran95によるコーディングの実際) + 目標 ++ この「計算科学演習I」で扱うFotranソースコードが自由に読めること。 ++ 2次元拡散方程式を解くコードをFotran95言語の特性を活かして書けるようになること。 * はじめに [#rd9d9a92] // wiki の練習。コメントのテスト。この文字は見えないはず。見えたら異常。 - Emacsのmajorモードをf90に設定すると便利(f95モードではなく) -- ミニバッファでf90-modeと打つ (Esc-x f90-mode) - scalar上でのコンパイルコマンドは pgf95 またはpgf90 * はじめに [#rd9d9a92] - ''FORTRAN''(全部大文字の)という言語は存在しない。 --''Fortran90''や''Fortran95''という言語ならある。 - FORTRAN66。 --1966年に標準化。 - FORTRAN77 --1977年に標準化。 -- if/then/else -- 広まった - Fortran90 -- 1991年に標準化。 -- 大幅な改訂 - Fortran95 --F90からのマイナーバージョンアップ Fortran90はFORTRAN77とは大きく違う。違う言語と考えるべき。 ~| f95 - f90 | << | f90 - f77 | * why f90/f95? [#qfc92c34] + 計算速度が速い -- スーパーコンピュータは速さが命 -- C/C++でもFortranと同じくらい速いコードは書けるが、遅いコードも書けてしまう。 -- 言語としての自由度の違い。自由度が高いとコンパイラが困る。最適化ができなくなる。 + 便利 -- 道具(言語)は目的にあったものを -- 数学的計算にはFortran90/Fotran95が適している --- '''For'''-mula '''Tran'''-slator -- 数値計算ライブラリの抱負な蓄積。Legacyなコード。財産。 * Fortranが推奨される間違った理由 [#o19dac24] 『新しい言語を勉強するのは面倒だ。 FORTRAN77の何の不足もない。これでxx年やってきた。』 ・・・Legacyな人間。時代に2010-1977=33年遅れている。 * Fortran90/95に対する偏見 [#u2f56714] - 変数名は6文字までなんでしょう?・・・そんなことはありません。 - ソースコードは全部大文字なんでしょう?・・・そんなことはありません。 - ソースコードは固定形式(7列目から72列目まで)なんでしょう?・・・そんなことはありません。 - 構造体がないんでしょう?・・・あります。普通に使います。 - ポインタがないんでしょう?・・・あります。あまり使う必要はありませんが。 - 関数とデータをまとめてひとかたまりにする(クラス化する)ことなんてできないんでしょう?・・・できます。普通にやっています。 - データ/関数の隠蔽(カプセル化)ができないんでしょう?・・・できます。いつもしています。 - 演算子を自分で定義することができなんでしょう?・・・できます。いつもしています。 - 関数や演算子の多重定義ができなんでしょう?・・・できます。いつもしています。 * Fortran90/95は現代のプログラミング言語である。 [#g3040af6] - スーパーコンピュータ向けの言語としては最先端 - 特に並列計算機には - 数値演算や計算機シミュレーションには最適な言語 * まだ納得できないない?では例を一つ [#ra937520] 部屋の中の温度場の分布から平均気温を求めよう。 温度場を3次元float配列 f(nx,ny,nz)で表す。3つの整数nx, ny, nzは不定。 平均気温=全ての格子点(i,j,k)上でのfの値を足して格子点の総数で割る * 【演習】 [#t9110993] 任意サイズの3次元単精度実数(浮動小数点数)配列を受け取り、 その平均値を返す関数をC言語(またはC++言語)で作れ。 - scalar上でのCコンパイラ=cc, gcc * Fortran90/95ではこう書ける。 [#ube6e027] わずか4行。 real function mean_value(f) real, dimension(:,:,:) :: f mean_value = sum(f) / (size(f,1)*size(f,2)*size(f,3)) end function mean_value * 数式の表現が簡単な例 [#ada18727] $e^{i\pi} = -1$ つまり #ref(e_i_pi.jpg) をFortran95で書くと、 complex :: i = (0.0,1.0) real :: pi = 3.141593 print *,' exp(i*pi) = ', exp(i*pi) * 例 [#h6f4d481] 級数 #ref(series_one_forth.jpg) // \sum_{n=1}^\infty\,\frac{1}{i}\cdot\frac{1}{i+1}\cdot\frac{1}{i+2} = \frac{1}{1}\cdot\frac{1}{2}\cdot\frac{1}{3} + \frac{1}{2}\cdot\frac{1}{3}\cdot\frac{1}{4} + \frac{1}{3}\cdot\frac{1}{4}\cdot\frac{1}{5} + \cdots = \frac{1}{4} の最初の有限数項までの値を求めるプログラムも、式をそのまま書けばいい。Formula Translation。 integer, parameter :: nterms = 1000 real, dimension(nterms) :: x, y, z integer :: i do i = 1 , nterms x(i) = 1.0 / i y(i) = 1.0 / (i+1) z(i) = 1.0 / (i+2) end do print *,'ans = ', sum(x*y*z) * 例 [#h2acd79c] 空間中に分布する磁場(3成分のベクトル場) Bx(100,100,100), By(100,100,100), Bz(100,100,100) の全磁気エネルギーは、 energy = sum(Bx**2+By**2+Bz**2)/2 と一行(定義式そのもの)を書けば良い。