LoginSignup
14
12

More than 5 years have passed since last update.

【Fortran超入門】プログラム全体の流れ・文法の基礎[FORTRAN]

Last updated at Posted at 2019-01-13

はじめに

Fortranでプログラムを組むにあたっての基本を押させていこうと思います。

FORTRANとは

フォートラントは1954年にIBMのジョン・バッカスによって考案された、コンピューターにおいて広く使われた世界最初の高級言語です。

FORTRANは科学技術計算に向いた手続き型プログラミング言語であり、その長い歴史の間に開発された非常に多くの数学関数やサブルーチンを数値解析ソフトウェアの形で持っている。また、並列計算の並列性を明示的に書くことができ最適化が行いやすく、そのため他の言語より高速である等の理由から、数値予報および気候モデル、構造力学における有限要素法、計算流体力学、計算物理学、計算機化学、計量経済学、動物と植物の品種改良などの大規模な計算を行う分野において、スーパーコンピュータで使われている。

引用:FORTRAN from wikipedia

FORTRANの歴史

  • Fortran77より前
    • 初期の頃は、変数名が大文字6文字までで、動的な記憶領域の確保ができないなど多くの制約があった。
  • Fortran77
    • 構造化プログラミングが導入された。
    • ファイルの拡張子:.for.for
  • Fortran90
    • モジュラープログラミング配列演算ユーザー定義総称関数が導入された。
    • ファイルの拡張子:.f90
  • Fortran95
    • High Performance Fortran(HPF)が導入された。
    • ファイルの拡張子:.f95
  • Fortran2003
    • オブジェクト指向が導入された。
    • ファイルの拡張子:.f03
  • Fortran2008
    • コンカレント・コンピューティング(並行計算)が導入された。
    • ファイルの拡張子:.f08

全体の流れ

  1. テキストファイルにプログラム(ソースファイル)を書く
  2. コンパイラによって実行ファイルを作成する
  3. 実行ファイルを実行する

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で構成されています。

sample.f90
! メインルーチンは、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.

おわりに

この記事が役に立ったという方は、いいね、お願いします(^^)

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12