IT pass HikiWiki - [Exp2009]Fortran の簡単な解説 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

((<"スケジュール表・各回資料 (07/10)"|[Exp2009]スケジュール表・各回資料#07-2F10>))

=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 より小さいか等しい

==画面やファイルへの出力

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"|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/>))