はじめに
Fortranでプログラムを組むにあたっての基本を押させていこうと思います。
FORTRANとは
フォートラントは1954年にIBMのジョン・バッカスによって考案された、コンピューターにおいて広く使われた世界最初の高級言語です。
FORTRANは科学技術計算に向いた手続き型プログラミング言語であり、その長い歴史の間に開発された非常に多くの数学関数やサブルーチンを数値解析ソフトウェアの形で持っている。また、並列計算の並列性を明示的に書くことができ最適化が行いやすく、そのため他の言語より高速である等の理由から、数値予報および気候モデル、構造力学における有限要素法、計算流体力学、計算物理学、計算機化学、計量経済学、動物と植物の品種改良などの大規模な計算を行う分野において、スーパーコンピュータで使われている。
FORTRANの歴史
- Fortran77より前
- 初期の頃は、変数名が大文字6文字までで、動的な記憶領域の確保ができないなど多くの制約があった。
- Fortran77
- 構造化プログラミングが導入された。
- ファイルの拡張子:
.f
or.for
- Fortran90
- モジュラープログラミング、配列演算とユーザー定義総称関数が導入された。
- ファイルの拡張子:
.f90
- Fortran95
- **High Performance Fortran(HPF)**が導入された。
- ファイルの拡張子:
.f95
- Fortran2003
- オブジェクト指向が導入された。
- ファイルの拡張子:
.f03
- Fortran2008
- **コンカレント・コンピューティング(並行計算)**が導入された。
- ファイルの拡張子:
.f08
全体の流れ
- テキストファイルにプログラム(ソースファイル)を書く
- コンパイラによって実行ファイルを作成する
- 実行ファイルを実行する
1. テキストファイルにプログラム(ソースファイル)を書く
ファイルを作成してプログラムを記述するわけですが、ここでは拡張子.f90
のプログラムファイル(例:sample.f90)を作成し、プログラムを組むとします。
$ touch sample.f90
2. コンパイラによって実行ファイルを作成する
Fortranで書かれたプログラムをコンパイルすることができるコンパイラであれば何でも良いのですが、ここではGfortranソフトウェアを利用するとします。
gfortran
コマンドでプログラムファイルをコンパイルできます。
gfortran
コマンドによって作成された実行ファイルはデフォルトでは、a.out
となりますが、実効ファイル名を変更するためには、oオプション
を利用します。
ex) $ gfortran sample.f90 -o sample.out
ちなみに、a.outはアセンブラアウトプット(Assembler OUTput)に由来しています。
$ gfortran sample.f90
3. 実行ファイルを実行する
./a.out
で実行することができます。
$ ./a.out
プログラム
目的
サンプルプログラムには
「キーボードから実数xを入力し、$f(x) = x^2 - 1$を計算し、f(x)の値が正であるか0であるか負であるかを判定し、結果をディスプレイに表示する(処理は5回繰り返す)」
という処理を記述します。
サンプルコード
プログラムは、メインルーチンのexampleと、f(x)を計算するサブルーチンfuncで構成されています。
! メインルーチンは、program [プログラム名] という行で始まり、endで終わる
program example
! 中身は二つのブロック(宣言部と実行部)から成る
! 宣言部:記号の定義、実行部:本体
! implicit noneは、バグを発見しやすくするために常に記述
! 書かないと、宣言していない変数が現れてもコンパイラがエラーを検出しないことがある
implicit none
! 型宣言
real x, y
integer i
! 定数は、parameter文で値を宣言しておく
integer, parameter::IMAX=5
! do 変数 = 初期値, 終値(, 増分) ~ enddo
do i=1, IMAX
!-- print文でカンマ後の文字列、変数をディスプレイに表示する
print *, 'x=?'
!-- read文で、キーボオードからの入力待ちとなる(xに入力値が代入される)
read *, x
!-- call文で、サブルーチンが呼び出されてyにf(x)の値が代入される
call func(x, y)
print *, 'f(x)=', y
!-- if(~ endif)文で条件を記述
if (y > 0) then
print *, 'f(x) is positive'
elseif (y == 0) then
print *, 'f(x) is equal to zero'
else
print *, 'f(x) is negative'
endif
enddo
! stop文でプログラムは実行を停止する
stop
end
! サブルーチンではreturn文で処理を終えてメインルーチンに戻る(注:stop文ではない)
subroutine func(t, ft)
implicit none
real t, ft
ft= t**2 - 1
return
end
型宣言
表記 | 型 |
---|---|
integer | 整数型 |
real | 実数型 |
double precision | 倍精度実数型(有効桁数が2倍) |
complex | 複素数型 |
character | 文字型 |
比較演算子
意味 | 表記1 | 表記2 |
---|---|---|
$<$ | < | .lt. |
$\leq$ | <= | .le. |
$=$ | == | .eq. |
$\neq$ | /= | .ne. |
$>$ | > | .gt. |
$\geq$ | >= | .ge. |
論理演算子
意味 | 表記 |
---|---|
否定(以外) | .not. |
論理積(かつ) | .and. |
論理和(または) | .or. |
論理値が等しい | .eqv. |
論理値が等しくない | .neqv. |
おわりに
この記事が役に立ったという方は、いいね、お願いします(^^)