Fortran 勉強会 辻野 智紀
Fortran 勉強会
辻野 智紀
目次
Fortran の基本的な書き方 変数の宣言
− 実数・整数・複素数− 配列
結果の入出力 実際に計算する
− 複素数の計算− 円周率の計算− フーリエ級数展開
その前に
• 今回, いくつかプログラムを作ります.• 以下の URL から, データファイルをダウンロー
ドして下さい.– http://rain.hyarc.nagoya-
u.ac.jp/~satoki/main/calc/Nagoya-Fortran/seminar-1.tar.gz
Fortran プログラムの作成
● 必要なもの– コンパイラ
• ifort, gfortran, frt, pgfrt, g95
– ソースファイル• 拡張子 .f, .f90• 今回は Fortran 90 をベース.
● プログラム作成手順– ソースファイルの作成.– コンパイラによるコンパイル.– 実行ファイルの作成.
Fortran の基本的な書き方● 基本的な流れ
– メインプログラム宣言(1)– (必要ならば)モジュールの読み込み(2)– 変数の宣言(3)– 実際の処理(4)– (必要ならば)内部手続き(5)
Fortran の基本的な書き方
メインプログラム
モジュール読み込み
変数宣言
実際の処理
内部手続き
変数の宣言
実数型 (real) 整数型 (integer) 複素数型 (complex) 論理型(logical) 文字型 (character)
– 宣言 : character(文字数) 構造体(後で詳しく)
変数の宣言
実数型 (real)– a = 1.0, b = 2.0, …
整数型 (integer)– a = 1, b = 2, …
文字型(character(10))– a = 'hogehogeho'
論理型(logical)– a = .true.
複素数型 (complex)– a = (1.0,1.0), b = (0.0,1.0), …– 複素数変数の場合,
• (実部, 虚部)
実数型に関して
単精度− メモリ上で 1 つの番地に収まる大きさ− 宣言 : real a, b, …
倍精度− メモリ上で 2 つの番地に収まる大きさ− 宣言 : real(8) a, b, …
倍精度の方が, より多くの数値を扱える− 円周率では
単精度 : 3.141592 倍精度 : 3.14159265358979
配列の宣言
宣言 : – [変数型], dimension(要素数) :: a– [変数型] :: a(要素数)
多次元配列– [変数型], dimension(要素数1,要素数2) :: a– [変数型] :: a(要素数1,要素数2)
Fortran での配列順番– 要素数1 の方が要素数2 より先に格納される.
Fortran の基礎的な処理
演算子– + : 足し算– ー : 引き算– * : 掛け算– / : 割り算– ** : べき乗
優先順位– ** > *, / > +, ー
比較– >, < : (greater, less) than– <=, >= : (greater, less) equal– ==, /= : equal, not equal– .eqv., .neqv. : 論理比較 (equivalent,not equivalent)
Fortran の基礎的な処理
処理命令− ループ(繰り返し)
do i=(from), (to), (step) 繰り返す処理end do
− 条件(判断)if(条件)then 条件が成り立つときの処理else 条件が成り立たないときの処理end if
Fortran の基礎的な処理
処理命令− 条件付きループ
do while (条件) 条件が満たされる間繰り返す処理end do
− 複数条件select case (変数)case (条件1) 条件1 が成り立つときの処理case (条件2) 条件2 が成り立つときの処理end select
その他の基礎的な処理
結果の入出力(端末)
出力 : write− write(*,*) a, '文章'
入力 : read− read(*,*) a, b
結果の入出力(ファイル)
ファイル出力装置の宣言open(unit=装置番号, file=ファイル名, status=) write(装置番号,フォーマット) [書き出すデータ] read(装置番号,フォーマット) [読み込むデータ]close(unit=装置番号)
• status– unknown, new, old
– フォーマット• '(f5.1)' => 実数(float) で負号を合わせて 5 文字, 小数点以下 1 文字.
• '(i8)' => 整数(integer) で負号を合わせて 8 文字.
結果の入出力(ファイル)
装置番号 (ファイルに出力する場合は以下の番号以外を使用)– 0 番:標準エラー出力 (F90 では 102 番も)
– 5 番:標準入力 (F90 では 100 番も)
– 6 番:標準出力 (F90 では 101 番も) status
– unknown : ファイルの有無に関わらず開く.
– old : ファイルが存在している場合に開く.
– new : 新しくファイルを作成して開く. iostat (エラー判定)
– 書式• open(...., iostat=変数,...)
• read(..,iostat=変数)
– 正常に read できれば“変数=0”が, できなければ 0 以外が代入される.
実際に計算して見ましょう
複素数の計算
変数を適切に定義し, 以下を計算させる– 実部, 虚部– 共役複素数– 自身と共役複素数の積– 自身と共役複素数の和, 積
詳しくは, 配布資料参照
円周率の計算
• ライプニッツの公式を用いて計算する• 任意の項数まで計算できるように,実行時に計算する項数をこちらで指定する• 単精度と倍精度を作成する• 詳しくは, 配布資料参照• 完成したら, この公式以外の方法で円周率を計算させてみてもいいかも
Advanced : フーリエ級数展開
• f(x)=±1, (-π<x<π) をフーリエ展開する• 展開係数は事前に計算しておく(配布資料).
• 展開項数は任意に指定できるようにする.• 詳しくは, 配布資料参照.
Advanced : ゾンデデータの処理
• 実際のゾンデデータから高度, 気圧, 温度を読み込み, 各高度における温位を計算するプログラムを作ってみましょう.
• 計算した温位は別のファイルにテキスト形式で出力してみましょう.
参考資料
• http://www.nag-j.co.jp/fortran/index.html– Fortran 入門