[Exp2009]Fortran の簡単な解説
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
のように書くと左辺で指定した変数に, 右辺の値が代入されます.
演算子
演算子 | 意味 |
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
** | べき乗 |
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>を実行します.
演算子 | 意味 |
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 より小さいか等しい
画面やファイルへの出力
print文は画面への出力のみが可能ですが, write文は画面・ファイルへの出力のどちらでも可能です.
画面に表示させるとき
write(*,*) "a=",a !「a=<変数 a>」と表示 print *, a,b !「<変数 a><変数 b>」と表示
ファイルへの出力
write(14,*) a,b !「<変数 a><変数 b>」と表示
fort.14 というファイルに結果が出力されます.
プログラムの終了
- プログラムの最後には, 必ず「end」を書く.
プログラムをコンパイルする
例えば test.f というファイル名のプログラムなら, 次のようにしてコンパイルができます.
$ gfortran test.f
特に問題なくコンパイルされれば, a.out という実行ファイルができます.
プログラムを実行する
コンパイルによってできた a.out を実行するためには単に
$ ./a.out
と打つだけで OK です.
参考文献
この資料は以下の文献を参考に作成しました.
- 2008 年 惑星科学実習 実習資料
- 入門 Fortran90
- ラリー・ニーホフ, サンフォード・リーストマー著
- 株式会社ピアソン・エデュケーション
- Fortran Tips
- ST-Lab (SAIDA Takao - Laboratory) Fortran
- Fortran90 PROGRAMMING_Sec1
- Fortran入門: データ入出力
- 技術の森 No,7472-単精度 倍精度
- Fortran
- Fortran プログラミング初級編
Keyword(s):
References:[[Exp2009]スケジュール表・各回資料]