1. Fortran を 使 ってみる 1.1. Fortran とは Fortran は 科 学 技 術 計 算 向 けに 開 発 された 言 語 です.スーパーコンピュータ 用 のプログラム はほとんど Fortran で 記 述 されます. 最 新 の 規 格 は Fortran2008 です. 実 習 で 使 用 するの は gfortran です.Fortran に 限 らず,C や C++などの 言 語 は,Cygwin をインストールす る 事 で 利 用 できます.Cygwin は Windows 上 で Unix 環 境 を 構 築 するフリーウェアです. http://www.cygwin.com/ から 入 手 できます.プログラミングに 興 味 がある 人 は 入 れてみて 下 さい. 1.2. プログラムの 作 成 手 順 一 般 にプログラムを 作 成 する 手 順 は 以 下 のようになります. ソースプログラムの 作 成 コンパイル 実 行 成 功?(Yes) 完 成 (No) デバッグ ソースプログラムの 作 成 まず,コンピュータにやって 欲 しいことを 人 間 にわかりやすい 言 語 で 書 きます. その 命 令 の 指 示 書 がソースプログラムです.またソースプログラムを 記 述 するための 言 語 がプログラミング 言 語 です. コンパイル 次 に,ソースプログラムをコンピュータが 理 解 できる 言 語 に 翻 訳 します.これがコ ンパイルという 作 業 です. 実 行 最 後 にプログラムが 正 しくできたかどうか, 確 かめるために 実 行 して 見 ます. デバッグ 期 待 通 りに 動 かない 場 合 は,プログラムを 修 正 します.この 作 業 をデバッグと 呼 びます. バグ は 虫 という 意 味 で,プログラムが 思 ったように 動 かないのは 虫 がいる せいで,その 虫 をとる(デバッグ)という 意 味 です. 1.3. ソースプログラムの 作 成 それでは, 実 際 に 簡 単 なプログラムを 作 ってみましょう.まずソースプログラム を 作 成 します.プログラムは 通 常 テキスト エディタと 呼 ばれるもので 作 ります. ここでは 秀 丸 を 使 うことにします. 右 図 のアイコンをクリックすると 秀 丸 の 画 面 が 開 きます. 秀 丸 を 用 いて, 以 下 のプログラムを 入 力 してください.! 以 外 で 始 まる 各 行 は 先 頭 に6 文 字 程 度 スペースを 入 れてください. 1
Implicit none! This is a sample program write(6,*) 'Hello World!'! プログラムを 入 力 し 終 えたら, 適 当 な 名 前 (ここでは hello.f90 とします)をつけて 保 存 します. 保 存 はメニューから ファイル 名 前 をつけて 保 存... とすると,ファイ ルを 保 存 するダイアログが 開 くので, 保 存 する 場 所 を 必 ず 自 分 のホームディレクト リである マイ ドキュメント もしくは 'nafs\u\stu\10'の S******(Y:) とし てください. 1.4. ソースプログラムのコンパイル 次 に, 上 で 作 成 したプログラムをコンパイルします.この 作 業 は, Cygwin のターミナル で 行 います.[スタート] [ 全 てのプログラム] [Cygwin] [Cygwin Bash Shell]とクリッ クしてください.そうするとターミナルが 開 きます. まず, 自 分 のホームディレクトリに 移 動 します.そのためにターミナルで, $ cd /cygdrive/c と 打 ってください($はプロンプトで 実 際 に 打 つのは,ls だけです).この 作 業 は Cygwin Bash Shell を 起 動 するたびに 毎 回 必 要 です. 次 に, 本 当 にソースプログラムができたかどうか 確 かめます.ターミナルで, $ ls と 打 ってみて 下 さい.ファイルのリストが 表 示 されます.その 中 に hello.f90 が あ れ ば, きちんと 保 存 されたことになります. コンパイルするためのコマンドは, gfortran -o 実 行 ファイル 名 ソースプログラム 名 です. 実 行 ファイル 名 は 後 で 実 際 に 実 行 するファイルの 名 前 です. 上 の 例 では, $ gfortran -o hello hello.f90 となります.エラーが 出 ずに 終 了 すれば hello.exe という 実 効 ファイルが 作 成 されます. 1.5. プログラムの 実 行 次 に,プログラムを 実 行 してみます.そのためにはターミナルで,./ 実 行 ファイル 名 とします. 上 の 例 では, $./hello 2
です.これまでのすべての 作 業 が 成 功 していれば, Hello World! と 出 力 されます. 2. Fortran の 文 法 2.1. Fortran の 書 式 ( 自 由 フォーマット) ここでは,Fortran90 の 書 式 を 説 明 します.Fortran77 とは 多 少 異 なります. Fortran90 のプログラムの 基 本 形 は, program プログラム 名 型 宣 言 文 プログラム 本 体 end program プログラム 名 です.Hello.f90 の 例 では, main がプログラム 名 です. 型 宣 言 文 はありません.プログ ラム 本 体 は, write(6,*) 'Hello World!' だけです.! 記 号 よりあとは,コメント 文 ( 非 実 行 文 ) でコンピュータには 無 視 されます ( 記 号 の 中 は 文 書 なので 別 ). 2.2. データの 型 と 型 宣 言 文 2.2.1. データの 型 データの 型 には 以 下 のものがある. 整 数 型, 実 数 型, 倍 精 度 実 数 型, 複 素 数 型, 倍 精 度 複 素 数 型, 論 理 型, 文 字 型 人 は1つの x という 変 数 を, 臨 機 応 変 に 整 数 だと 思 ったり, 複 素 数 だと 思 った りできるがコンピュータにはそれができない.そのためあらかじめ x は 整 数 なのか 実 数 なのか 複 素 数 なのかなどを 決 めてやらなければいけないのである. 2.2.2. 変 数 データの 型 の 決 定 変 数 データの 型 の 宣 言 は 以 下 の 3 通 りがあり,この 順 に 優 先 される (1) 宣 言 文 明 示 的 に 変 数 の 型 を 決 めてやる. 下 の 例 は 倍 精 度 実 数 の 指 定. ( 例 ) real(8) :: x, y, z (2) Implicit 文 特 定 のアルファベットから 始 まる 変 数 は 特 定 の 型 を 持 つという 指 定 の 仕 方. 下 の 例 は, 3
a から h および o から z で 始 まる 変 数 は 倍 精 度 実 数 とする 指 定.プログラムの 先 頭 によ く 用 いられる. ( 例 ) implicit real*8 (a-h,o-z) (3) 暗 黙 の 約 束 (Default implied typing) 何 も 指 定 しない 場 合 'i,j,k,l,m,n'で 始 まる 変 数 は 整 数 型 でそれ 以 外 は 実 数 型 と 扱 われる.この 約 束 を 取 り 消 すには と 指 定 する. (2),(3)は Fortran77 の 名 残 りで 現 在 でも 通 用 するが, 今 後 は 最 初 に, implicit none と 指 定 して, 使 う 変 数 は 全 て 型 宣 言 する 方 がよい. 2.2.3. 型 宣 言 文 それぞれの 型 は 以 下 の 宣 言 文 により 指 定 する 整 数 型 integer :: ix, iy, iz 実 数 型 real :: x, y, z 倍 精 度 実 数 型 double precision :: x,y,z 複 素 数 型 complex :: x, y, z 倍 精 度 複 素 数 型 complex(kind(0d0)) :: x, y, z 論 理 型 logical :: x, y, z 文 字 型 character :: word 単 精 度 は 有 効 数 字 がおよそ7 桁, 倍 精 度 はおよそ 15 桁 である. 2.2.4. 定 数 データの 型 定 数 の 型 は 以 下 のように 指 定 する. 整 数 4 単 精 度 実 数 2. 2.0 2.0e0 倍 精 度 実 数 2.0d0 単 精 度 複 素 数 cmplx(1., 1.) cmplx(1.0, 1.0) cmplx(1.0e0, 1.0e0) 倍 精 度 複 素 数 cmplx(1.0d0, 1.0d0) 2.0e0 と 2.0d0 はともに, という 意 味 である.しかし, 2.0e0 は, 有 効 数 字 8 桁 までしか 保 証 されない.つまり,2.0000000123 でも 2.0e0 である. 2.0d0 とかくと, 有 効 数 字 はおよそ 15 桁 である.このことは, 特 に 演 算 を 行 うときに 重 要 である 4
2.3. 数 値 演 算 2.3.1. 代 表 的 な 数 値 演 算 Fortran には, 代 表 的 な 演 算 として 以 下 のものがある. 関 数 意 味 関 数 意 味 + + - - * / x**n x n sin(x) sinx cos(x) cosx tan(x) tanx atan(x) Arctanx exp(x) e x log(x) logx sqrt(x) abs(x) x sign(x) x/ x 2.3.2. データ 型 の 重 要 性 データの 型 は 演 算 を 行 うときに 重 要 である. [ 問 題 1] 以 下 の 4 つのプログラムを 作 成 して, 実 行 結 果 を 考 察 しなさい. プログラム1 integer :: ix,iy,iz ix=1.0d0 iy=3.0d0 iz=ix/iy write(6,*) 'iz=',iz プログラム2 real :: ix,iy,iz ix=1.0d0 iy=3.0d0 iz=ix/iy write(6,*) 'iz=',iz プログラム3 real :: x x=atan(1.0d0) write(6,*) 'x=',x プログラム4 double precision :: x x=atan(1.0d0) write(6,*) 'x=',x 5
2.3.3. 代 入 文 (プログラムでの=の 意 味 ) Fortran に 限 らず,プログラム 言 語 で = は 右 辺 を 左 辺 に 代 入 する という 意 味 を 持 ち, 数 学 における 右 辺 と 左 辺 は 等 しい という 意 味 と 異 なる. 例 えば, 1 2 3 real :: x 4 x=1.0d0 5 x=x+1.0d0 6 write(6,*) 'x=',x 7 8 というプログラムを 考 えてみる. 数 学 的 には x=x+1.0d0 から 0.0d0=1.0d0 となり 変 になるが, 答 えは x=2.0d0 である.4 行 目 でxに 1.0d0 が 代 入 され,5 行 目 の 右 辺 で 1.0d0 であるxに 1.0d0 を 足 して, 右 辺 は 2.0d0 となりその 値 を 改 めて 左 辺 のxに 代 入 するので ある. 型 の 異 なる 変 数 に 代 入 をしたときは 左 辺 の 型 が 有 効 になる. 例 えば 単 精 度 を 倍 精 度 に 代 入 した 場 合, 倍 精 度 として 扱 われる.しかし 有 効 数 字 が 増 えるわけではない.バグのも とになるのでやら 無 いこと. 2.4. 簡 単 な 入 出 力 ファイルからデータを 読 み 込 むときは read 文,ファイルにデータを 書 き 込 むときは write 文 を 用 いる.ファイルの 指 定 には 装 置 番 号 と 呼 ばれる 番 号 を 用 いる.ここではフ ァイルの1つである,キーボードからデータを 読 み 込 んで,コンソール( 画 面 )に 結 果 をかき 出 すもっとも 簡 単 な 方 法 を 示 す.より 詳 しい 文 法 は 後 で 習 う.デフォルトでは,キーボー ドは 装 置 番 号 5 番 に,コンソールは 6 番 に 割 り 付 けられている. ( 例 ) キーボードから 変 数 x に 数 値 を 入 力 する. read(5,*) x ( 例 ) 変 数 x の 値 をコンソールにかき 出 す write(6,*) x ( 例 ) 変 数 x の 値 をコンソールに x= の 後 にかき 出 す. write(6,*) 'x=',x 6
今 まで 習 ったことを 使 ったプログラム 例 を 2 つ 示 す. ( 例 3-1) キーボードから'x','y'の 値 を 読 み 込 んで'x+y'の 値 を 返 す. double precision :: x,y,z read(5,*) x read(5,*) y z=x+y write(6,*) 'z=',z ( 例 3-2) πの 値 を 出 力 する double precision :: pi pi=4.0d0*atan(1.0d0) write(6,*) 'pi=',pi ( 例 3-2)はプログラム 中 でπの 値 を 作 るときの 常 套 手 段 である. [ 問 題 2] 華 氏 温 度 (Fahrenheit temperature) TF とセ 氏 温 度 (Cerucius temperature) TC の 間 には,TC = 5(TF-32)/9 関 係 がある. 上 のプログラムを 参 考 にして,TF をキーボードから 読 み 込 んで,コンソールに TC を 返 すプログラムを 作 れ. 7