IT pass HikiWiki - [Exp2011]Fortran の簡単な解説 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
{{toc}}
((<"スケジュール表・各回資料 (07/08)"|[Exp2011]スケジュール表・各回資料#07-2F08>))
=Fortran
* コンパイラ型のプログラミング言語
* 科学技術計算の分野で C 言語と同じくらいよく使われる言語です.
実習では, 惑星軌道計算のプログラミング言語として Fortran を, コンパイラとして gfortran を使用します.
==コンパイラ型の言語とは?
プログラムを書いても, そのままでは実行できないタイプの言語です.
通常プログラムは, 人間が理解できる形で書かれていますが, コンピュータはそのまま読んだり実行したりできません.
そこで, 書いたプログラムを機械語へ翻訳する必要があります. この翻訳の操作を「コンパイル」と呼びます.
=Fortran の文法
==はじめに
プログラムを書いたり, 編集したりするにはエディタを使います.
Windows ならメモ帳, Linux なら vi, vim, Emacs などが使えます.
==文の構造
Fortran の書式には, 自由形式/固定形式 があります.
今回使用するコンパイラ (gfortran) は, どちらの書式でもコンパイル可能です.
===自由形式
Fortran90 から使えるようになった書式.
* ファイルの名前は, 「**.f90」にする.
* 1 行には 132 文字まで書ける.
* 1 つの文が複数行に渡るときは, 文の最後に「&」をつけると次の行へ継続される.
* 継続した文の先頭を示したいとき (示さなくてもプログラム上は問題ありません)は, 文の先頭にも「&」を入れる.
* コメント文は,
* 行の始めから書くとき… 1 文字目に「!」を入れ, 改行まで.
* 行の途中から書くとき… 「!」を入れたところから改行まで.
[プログラム例]
! 色々と表示するプログラム
print *, "Hello World!!" !「Hello World!!」と画面に表示
print *, "1 つの文が長くなる場合には, このように&
& 2 行に分けられます."
end
[実行結果]
Hello World!!
1 つの文が長くなる場合には, このように 2 行に分けられます.
===固定形式
Fortran77 (Fortran90 の前のバージョン)で使用される書式.
* プログラムのファイル名は「**.f」にする.
* 左から半角で 6 文字空けて, 7 文字目から書き始める
* 1 行には 72 文字まで書ける
* 1 つの文が複数行に渡るときは, 次の行の 6 文字目に「&」をつけると継続される.
* コメント文は,
* 行の始めから書くとき… 1文字目に「!」か「*」か「c」か「C」を入れ, 改行まで.
* 行の途中から書くとき… 「!」を入れたところから改行まで.
[プログラム例]
! 色々と表示するプログラム
!「Hello World!!」と画面に表示
print *, "Hello World!!"
print *, "1 つの文が長くなる場合には, このように
& 2 行に分けられます."
end
[実行結果]
Hello World!!
1 つの文が長くなる場合には, このように 2 行に分けられます.
==変数の型宣言
変数 (例えば惑星の位置 xp や時間 time など) はどんな数を表すものなのか, その型を宣言してから使います.
* integer : 整数型
* real : 実数型
例 :
real xp,yp ! xp, yp は実数型の変数
integer step ! step は整数型の変数
※実定数(=実数型の定数)には小数点をつけなければいけません.
例:
1 <---整数型の定数
1.0 <---実数型の定数
===配列
同じ型の複数の値を格納できる変数のことを, 「配列」といいます.
配列の型宣言は次のように書きます.
* 3 個の要素を持つ実数の配列 xp
real xp(1:3) <--- "1:" は省略してもよい
上記のように宣言すると, xp1, xp2, xp3 が実数型の変数であると宣言したことになります.
* 3 × 3 個の要素を持つ整数の配列 fx
integer fx(3,3) <--- "1:" を省略した
上記のように宣言すると, fx は 3 × 3 = 9 個の要素をもつ 2 次元整数型の配列になります.
==代入文と演算子
===代入文
ある変数に値を代入するときは,
a=5
b=b+1
のように書くと左辺で指定した変数に, 右辺の値が代入されます.
=== 演算子
# RT
演算子, 意味
+, 加算
-, 減算
*, 乗算
/, 除算
**, べき乗
E2, × 10 の 2 乗 (単精度)
E-2, × 10 の -2 乗 (単精度)
D2, × 10 の 2 乗 (倍精度)
D-2, ×10 の -2 乗 (倍精度)
====単精度と倍精度について
計算機の内部において, 実数をどう表現するかで区別します.
一般的には,
* 単精度:32 bit ( 2 進数で 32 桁)
* 倍精度:64 bit ( 2 進数で 64 桁)
です.
この 32 桁や 64 桁のうち, 符号部(+か−か), 指数部( 2 の何乗か), 仮数部(実際の数字部)に桁を分けて表現します。
倍精度は単精度より多くの記憶領域を使用しており, 有効数字の桁がほぼ 2 倍になります.
=== 関数
* sqrt(a), a の平方根
* abs(a), a の絶対値
* min(a,b), aとb のうち小さいほうを取る
* max(a,b), aとb のうち大きいほうを取る
== 繰り返し文
do i=m, n
<繰り返したい操作>
enddo
と書くと, i を m から n まで 1 ずつ変化させながら <繰り返したい操作> を(n-m+1)回行います.
[プログラム例]
integer a,i ! a,i を整数とする
a=0 ! a の初期値は 0
do i=1, 10
a=a+1
enddo
print *, "a=",a ! a の値を画面に表示する
end
これを実行すると, 1 から 10 まで 1 ずつ加えていった結果 (=10) が a に代入されます.
[実行結果]
a= 10
== 条件文
if (条件) then
<文 1>
else
<文 2>
end if
(条件) が満たされた時は<文 1>を, 満たされない時<文 2>を実行します.
# RT
演算子, 意味
a.eq.b または a==b, a と b は等しい
a.lt.b または a< b, a が b より小さい
a.gt.b または a>b, a が b より大きい
a.le.b または a<=b, a は b 以下
a.ge.b または a=>b, a は b 以上
a.ne.b または a/=b, a と b は等しくない
[プログラム例]
!a と b の大きさを比べる
a=1.0
b=5.0
if(a .gt. b)then
write(*,*)"a は b より大きい"
else
write(*,*)"a は b より小さいか等しい"
end if
end
[実行結果]
a は b より小さいか等しい
==サブルーチン
プログラムの中で何度も同じ計算をする場合, その計算部分を別パーツ(サブルーチン)化しておくことで, プログラムを簡潔にできます.
[プログラム例]
program hogehoge
real a,b,c,d
real answer1,answer2,answer3,answer4
a = 1.0
b = 2.0
call sub(a,b,answer1,answer2) ! a と b を使ってサブルーチン内で answer1 と answer2 を求める
write(*,*) "answer1=",answer1,"answer2=",answer2
c = 4.0
d = 6.0
call sub(c,d,answer3,answer4) ! c と d を使ってサブルーチン内で answer3 と answer4 を求める
write(*,*) "answer3=",answer3,"answer4=",answer4
contains
subroutine sub(x,y,answerA,answerB) ! サブルーチン
real x,y,answerA,answerB ! call 文で渡された引数を x,y,answerA,answerB に入れる
answerA = x + y
answerB = x - y
end subroutine
end program hogehoge
[実行結果]
answer1 = 3.0 answer2 = -1.0
answer3 = 10.0 answer4 = -2.0
==画面やファイルへの出力
print文は画面への出力のみが可能ですが, write文は画面・ファイルへの出力のどちらでも可能です.
* 画面に表示させるとき
write(*,*) "a=",a !「a=<変数 a>」と表示
print *, a,b !「<変数 a><変数 b>」と表示
* ファイルへの出力
write(14,*) a,b !「<変数 a><変数 b>」と表示
fort.14 というファイルに結果が出力されます.
open 文と close 文を用いて, 任意の名前のファイルへ出力することもできます.
open(unit=100, file="hoge.dat", status="unknown")
write(100,*) a,b
close(100,status="keep")
hoge.dat というファイルに結果が出力されます.
* open 文の status の種類
#RT
new, 新しくファイルを作成する
old, 既存のファイルを探す
unknown, まず既存のファイルを探す.なければファイルを作成する.
* close 文の status の種類
#RT
keep, ファイルを保存する
delete, ファイルを削除する
== プログラムの終了
* プログラムの最後には, 必ず「end」を書く.
=プログラムをコンパイルする
例えば test.f というファイル名のプログラムなら, 次のようにしてコンパイルができます.
$ gfortran test.f
特に問題なくコンパイルされれば, a.out という実行ファイルができます.
=プログラムを実行する
コンパイルによってできた a.out を実行するためには単に
$ ./a.out
と打つだけで OK です.
= 参考文献
この資料は以下の文献を参考に作成しました.
* ((<2010 第11回ITPASS実習資料 Fortran の簡単な解説|[Exp2010]Fortran の簡単な解説>))
* 入門 Fortran90
* ラリー・ニーホフ, サンフォード・リーストマー著
* 株式会社ピアソン・エデュケーション
* ((<"Fortran Tips"|URL:http://www.sci.hokudai.ac.jp/grp/poc/top/software/other/fortran_tips/index.htm>))
* ((<"ST-Lab (SAIDA Takao - Laboratory) Fortran"|URL:http://www.d9.dion.ne.jp/~stlab/pages/fortran.html>))
* ((<"Fortran90 PROGRAMMING_Sec1"|URL:http://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec1.html#sec1>))
* ((<"Fortran入門: データ入出力"|URL:http://www.nag-j.co.jp/fortran/FI_14.html>))
* ((<"技術の森 No,7472-単精度 倍精度"|URL:http://www.nc-net.or.jp/mori_log/CAD_%A4%BD%A4%CE%C2%BE/1/%B5%BB%BD%D1%A4%CE%BF%B9No.7472-%C3%B1%C0%BA%C5%D9%A1%A1%C7%DC%C0%BA%C5%D9.html>))
* ((<"Fortran"|URL:http://www.k.hosei.ac.jp/~sawa/lecture/fortran/index.html>))
* ((<"Fortran プログラミング初級編"|URL:http://svr01.damp.tottori-u.ac.jp/~akimoto/Fortran/>))
((<"スケジュール表・各回資料 (07/08)"|[Exp2011]スケジュール表・各回資料#07-2F08>))
=Fortran
* コンパイラ型のプログラミング言語
* 科学技術計算の分野で C 言語と同じくらいよく使われる言語です.
実習では, 惑星軌道計算のプログラミング言語として Fortran を, コンパイラとして gfortran を使用します.
==コンパイラ型の言語とは?
プログラムを書いても, そのままでは実行できないタイプの言語です.
通常プログラムは, 人間が理解できる形で書かれていますが, コンピュータはそのまま読んだり実行したりできません.
そこで, 書いたプログラムを機械語へ翻訳する必要があります. この翻訳の操作を「コンパイル」と呼びます.
=Fortran の文法
==はじめに
プログラムを書いたり, 編集したりするにはエディタを使います.
Windows ならメモ帳, Linux なら vi, vim, Emacs などが使えます.
==文の構造
Fortran の書式には, 自由形式/固定形式 があります.
今回使用するコンパイラ (gfortran) は, どちらの書式でもコンパイル可能です.
===自由形式
Fortran90 から使えるようになった書式.
* ファイルの名前は, 「**.f90」にする.
* 1 行には 132 文字まで書ける.
* 1 つの文が複数行に渡るときは, 文の最後に「&」をつけると次の行へ継続される.
* 継続した文の先頭を示したいとき (示さなくてもプログラム上は問題ありません)は, 文の先頭にも「&」を入れる.
* コメント文は,
* 行の始めから書くとき… 1 文字目に「!」を入れ, 改行まで.
* 行の途中から書くとき… 「!」を入れたところから改行まで.
[プログラム例]
! 色々と表示するプログラム
print *, "Hello World!!" !「Hello World!!」と画面に表示
print *, "1 つの文が長くなる場合には, このように&
& 2 行に分けられます."
end
[実行結果]
Hello World!!
1 つの文が長くなる場合には, このように 2 行に分けられます.
===固定形式
Fortran77 (Fortran90 の前のバージョン)で使用される書式.
* プログラムのファイル名は「**.f」にする.
* 左から半角で 6 文字空けて, 7 文字目から書き始める
* 1 行には 72 文字まで書ける
* 1 つの文が複数行に渡るときは, 次の行の 6 文字目に「&」をつけると継続される.
* コメント文は,
* 行の始めから書くとき… 1文字目に「!」か「*」か「c」か「C」を入れ, 改行まで.
* 行の途中から書くとき… 「!」を入れたところから改行まで.
[プログラム例]
! 色々と表示するプログラム
!「Hello World!!」と画面に表示
print *, "Hello World!!"
print *, "1 つの文が長くなる場合には, このように
& 2 行に分けられます."
end
[実行結果]
Hello World!!
1 つの文が長くなる場合には, このように 2 行に分けられます.
==変数の型宣言
変数 (例えば惑星の位置 xp や時間 time など) はどんな数を表すものなのか, その型を宣言してから使います.
* integer : 整数型
* real : 実数型
例 :
real xp,yp ! xp, yp は実数型の変数
integer step ! step は整数型の変数
※実定数(=実数型の定数)には小数点をつけなければいけません.
例:
1 <---整数型の定数
1.0 <---実数型の定数
===配列
同じ型の複数の値を格納できる変数のことを, 「配列」といいます.
配列の型宣言は次のように書きます.
* 3 個の要素を持つ実数の配列 xp
real xp(1:3) <--- "1:" は省略してもよい
上記のように宣言すると, xp1, xp2, xp3 が実数型の変数であると宣言したことになります.
* 3 × 3 個の要素を持つ整数の配列 fx
integer fx(3,3) <--- "1:" を省略した
上記のように宣言すると, fx は 3 × 3 = 9 個の要素をもつ 2 次元整数型の配列になります.
==代入文と演算子
===代入文
ある変数に値を代入するときは,
a=5
b=b+1
のように書くと左辺で指定した変数に, 右辺の値が代入されます.
=== 演算子
# RT
演算子, 意味
+, 加算
-, 減算
*, 乗算
/, 除算
**, べき乗
E2, × 10 の 2 乗 (単精度)
E-2, × 10 の -2 乗 (単精度)
D2, × 10 の 2 乗 (倍精度)
D-2, ×10 の -2 乗 (倍精度)
====単精度と倍精度について
計算機の内部において, 実数をどう表現するかで区別します.
一般的には,
* 単精度:32 bit ( 2 進数で 32 桁)
* 倍精度:64 bit ( 2 進数で 64 桁)
です.
この 32 桁や 64 桁のうち, 符号部(+か−か), 指数部( 2 の何乗か), 仮数部(実際の数字部)に桁を分けて表現します。
倍精度は単精度より多くの記憶領域を使用しており, 有効数字の桁がほぼ 2 倍になります.
=== 関数
* sqrt(a), a の平方根
* abs(a), a の絶対値
* min(a,b), aとb のうち小さいほうを取る
* max(a,b), aとb のうち大きいほうを取る
== 繰り返し文
do i=m, n
<繰り返したい操作>
enddo
と書くと, i を m から n まで 1 ずつ変化させながら <繰り返したい操作> を(n-m+1)回行います.
[プログラム例]
integer a,i ! a,i を整数とする
a=0 ! a の初期値は 0
do i=1, 10
a=a+1
enddo
print *, "a=",a ! a の値を画面に表示する
end
これを実行すると, 1 から 10 まで 1 ずつ加えていった結果 (=10) が a に代入されます.
[実行結果]
a= 10
== 条件文
if (条件) then
<文 1>
else
<文 2>
end if
(条件) が満たされた時は<文 1>を, 満たされない時<文 2>を実行します.
# RT
演算子, 意味
a.eq.b または a==b, a と b は等しい
a.lt.b または a< b, a が b より小さい
a.gt.b または a>b, a が b より大きい
a.le.b または a<=b, a は b 以下
a.ge.b または a=>b, a は b 以上
a.ne.b または a/=b, a と b は等しくない
[プログラム例]
!a と b の大きさを比べる
a=1.0
b=5.0
if(a .gt. b)then
write(*,*)"a は b より大きい"
else
write(*,*)"a は b より小さいか等しい"
end if
end
[実行結果]
a は b より小さいか等しい
==サブルーチン
プログラムの中で何度も同じ計算をする場合, その計算部分を別パーツ(サブルーチン)化しておくことで, プログラムを簡潔にできます.
[プログラム例]
program hogehoge
real a,b,c,d
real answer1,answer2,answer3,answer4
a = 1.0
b = 2.0
call sub(a,b,answer1,answer2) ! a と b を使ってサブルーチン内で answer1 と answer2 を求める
write(*,*) "answer1=",answer1,"answer2=",answer2
c = 4.0
d = 6.0
call sub(c,d,answer3,answer4) ! c と d を使ってサブルーチン内で answer3 と answer4 を求める
write(*,*) "answer3=",answer3,"answer4=",answer4
contains
subroutine sub(x,y,answerA,answerB) ! サブルーチン
real x,y,answerA,answerB ! call 文で渡された引数を x,y,answerA,answerB に入れる
answerA = x + y
answerB = x - y
end subroutine
end program hogehoge
[実行結果]
answer1 = 3.0 answer2 = -1.0
answer3 = 10.0 answer4 = -2.0
==画面やファイルへの出力
print文は画面への出力のみが可能ですが, write文は画面・ファイルへの出力のどちらでも可能です.
* 画面に表示させるとき
write(*,*) "a=",a !「a=<変数 a>」と表示
print *, a,b !「<変数 a><変数 b>」と表示
* ファイルへの出力
write(14,*) a,b !「<変数 a><変数 b>」と表示
fort.14 というファイルに結果が出力されます.
open 文と close 文を用いて, 任意の名前のファイルへ出力することもできます.
open(unit=100, file="hoge.dat", status="unknown")
write(100,*) a,b
close(100,status="keep")
hoge.dat というファイルに結果が出力されます.
* open 文の status の種類
#RT
new, 新しくファイルを作成する
old, 既存のファイルを探す
unknown, まず既存のファイルを探す.なければファイルを作成する.
* close 文の status の種類
#RT
keep, ファイルを保存する
delete, ファイルを削除する
== プログラムの終了
* プログラムの最後には, 必ず「end」を書く.
=プログラムをコンパイルする
例えば test.f というファイル名のプログラムなら, 次のようにしてコンパイルができます.
$ gfortran test.f
特に問題なくコンパイルされれば, a.out という実行ファイルができます.
=プログラムを実行する
コンパイルによってできた a.out を実行するためには単に
$ ./a.out
と打つだけで OK です.
= 参考文献
この資料は以下の文献を参考に作成しました.
* ((<2010 第11回ITPASS実習資料 Fortran の簡単な解説|[Exp2010]Fortran の簡単な解説>))
* 入門 Fortran90
* ラリー・ニーホフ, サンフォード・リーストマー著
* 株式会社ピアソン・エデュケーション
* ((<"Fortran Tips"|URL:http://www.sci.hokudai.ac.jp/grp/poc/top/software/other/fortran_tips/index.htm>))
* ((<"ST-Lab (SAIDA Takao - Laboratory) Fortran"|URL:http://www.d9.dion.ne.jp/~stlab/pages/fortran.html>))
* ((<"Fortran90 PROGRAMMING_Sec1"|URL:http://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec1.html#sec1>))
* ((<"Fortran入門: データ入出力"|URL:http://www.nag-j.co.jp/fortran/FI_14.html>))
* ((<"技術の森 No,7472-単精度 倍精度"|URL:http://www.nc-net.or.jp/mori_log/CAD_%A4%BD%A4%CE%C2%BE/1/%B5%BB%BD%D1%A4%CE%BF%B9No.7472-%C3%B1%C0%BA%C5%D9%A1%A1%C7%DC%C0%BA%C5%D9.html>))
* ((<"Fortran"|URL:http://www.k.hosei.ac.jp/~sawa/lecture/fortran/index.html>))
* ((<"Fortran プログラミング初級編"|URL:http://svr01.damp.tottori-u.ac.jp/~akimoto/Fortran/>))