現在作成中です。
既に書いている内容も&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
と一行(定義式そのもの)を書けば良い。