ワークステーションを使ったフォートラン実習 - yamagata...

62
ワークステーションを ったフォートラン 1 はじめに これから さん ってフォートラン いう をする すが, ただ をさせるだけ ありません。 データベース, ワープロ, グラフ , きる す。いってみれ す。また をうまく きるように 活に 大き れ、 する 大き メリットに ります。こ フォート ラン しいプログラミングスタイルを け 、そし てプログ ラムをかけるようにする すが,それ して きるか, すれ いい かを に学 よう して さい。 2 事始め これから センターにある Fujitsu SUN いうワークステーション kdeve います。まずこ ってフォートラン プログラムを むに UNIX いう オペレ ーティングシステム コマンド を覚え くて いけません 。コマンド すれ いう意 す。つまり うように るために ,キーボ ード から する を打ち があります。こ をコマンド います。また UNIX いうオペレ ー ティングシステム (OS ) よく われている OS す。OS えて まさ えて さい。 に意 えますよ SUN いうワーク ステーションに, えるに UNIX いう けれ りません。UNIX 一つ一つがコマンド に たる す。 2.1 ログ イン これからセンター パソコンを して,SUN にアクセスする すが,そ す。まず 台か いるパソコン ります。そし て れて さい ( パソコン にあります)。し らく ( ) Windows がり、 インド きます。こ インド キャンセル いうボタンをマ らび クリック (ボタンを すこ ) して さい。する またし らくして、 つか アイコン ( ) れる います。そ Telnet ショートカット 」 かれているアイコンを して さい。そし てそこをマ ダブルクリック (2 ボタンを すこ ) し ます。 する しい インド います。そこ インド に「 いうメニュー がある 、これをマ クリックします。する サブ メニュ ーが れる 、そ サブ メニュ ー 「リモートシステム」 いう をクリックします。する さらに しい れる ホスト かれている にキーボ ード から kdeve 打ち みましょう。する 1

Upload: others

Post on 24-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

ワークステーションを使ったフォートラン実習

理学部物理学科  郡司 修一

1 はじめに

これから皆さんは計算機を使ってフォートランという言語で計算機の実習をする訳ですが,計算機

はただ計算をさせるだけのものではありません。例えばデータベース,ワープロ,グラフ表示,通信等の色々な事ができる道具です。いってみれば非常に賢い文房具の様なものです。また計算機をうまく利

用できるようになれば,日常生活にも大きな変化が訪れ、物理を勉強する上でも大きなメリットにな

ります。この実習の目的はフォートランの正しいプログラミングスタイルを身に付け、そしてプログ

ラムをかけるようにする事ですが,それと平行して計算機は何ができるか,どの様に利用すればいい

のかを同時に学ぶよう努力して下さい。

2 事始め

これから実習に使う計算機は計算機センターにある Fujitsuの SUNというワークステーションで名前を kdeveと言います。まずこの計算機を使ってフォートランのプログラムを組むには UNIXというオペレーティングシステムの最小限のコマンドを覚えなくてはいけません。コマンドとは直訳すれば命

令という意味です。つまり計算機を自分の思うように操るためには,キーボードから計算機が理解する

言葉を打ち込んでやる必要があります。この言葉をコマンドと言います。また UNIXというオペレーティングシステム (OSと略す)は現在もっともよく使われている OSです。OSとは例えて言えばまさに言語だと考えて下さい。例えば日本人なら日本語で相手に意思を伝えますよね。SUNというワークステーションに,自分の命令を与えるには,UNIX語というのを使わなければなりません。UNIX語の単語一つ一つがコマンドに当たる訳です。

2.1 ログイン

これからセンターのパソコンを通して,SUNにアクセスする訳ですが,その手続きは以下の通りです。まず何台か並んでいるパソコンの前に座ります。そして電源を入れて下さい ( 電源はパソコン本体の右上隅にあります)。しばらく経つと (数分程度)、Windowsが立ち上がり、最後に画面に小さなウインドウが開きます。このウインドウの中のキャンセルというボタンをマウスで選らびクリック (マウスの左側のボタンを押すこと)して下さい。するとまたしばらくして、画面に幾つかのアイコン (小さな絵)が現れると思います。その中で「Telnetへのショートカット」と書かれているアイコンを探して下さい。そしてそこをマウスで選んでダブルクリック (2回マウスの左ボタンを押すこと)します。すると新しいウインドウが開くと思います。そこでそのウインドウの左上に「接続」というメニュー

があるので、これをマウスでクリックします。するとサブメニューが現れるので、そのサブメニュー

の「リモートシステム」という箇所をクリックします。するとさらに新しい小さな画面が現れるので、

その画面のホスト名と書かれている場所にキーボードから kdeveと打ち込みましょう。すると先ほど

1

Page 2: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

のウインドウに login:という文字が現れます。そこで自分の kdeveのユーザーネームを打ち込んで下さい。そして次に Passwd:というプロンプトが出て来ますから,そこで自分のパスワードを打ち込んで下さい ( ここで一つ注意が必要です。UNIXでは大文字と小文字は区別されますから小文字で打たなくてはいけない所を大文字で打っても UNIXは理解してくれません)。すると色々な英語の文章が出て来た後,sg046@kdeve%という様なプロンプトが出て来ます (人によりプロンプトは若干異なります)。以上の手続をログインと言います。ログインとは,これから計算機を使い始めるための手続です。ログイン操作で自分の使用しているパソコンからワークステーション (SUN)に,入り込む事ができます。ログイン手続により,kdeveは自分に命令を与える資格があるかどうかを,最初にチェックします(パソコンなら電源を入れるだけだけど ... そこがパソコンとワークステーションの違う所)。またプロンプトとは計算機が人間の命令を待っている時に計算機が画面に表示する印の様なものです。パソコ

ンとワークステーションの一番の違いは、パソコンの場合、1人の人が占有して使用しますが、ワークステーションの場合には、大抵は複数の人が一度に使用することができます。もしログインした時

点で、ウインドウに表示される文字が文字化け (正しく文字が見えない現象)を起こしていたら、このウインドウの左上の「ターミナル」というメニューをマウスで選びます。するとサブメニューが出て

きますから、そのサブメニューの中で「設定」という項目を選びます。その中で漢字コードの設定を

「日本語EUC」にして、OKという箇所をマウスでクリックします。この操作により、今後文字化けが解消されるはずです。

2.2 コマンド

SUNという計算機は OS(Operating System)としてUNIX語を話すと前に書きました。特にこれからここで使うシェルは Cシェルです。言わば UNIX語の C-shellという方言だと考えて下さい。例えば英語でもインド訛りやオーストラリア訛りがあるように UNIX語も K-shell訛り,C-shell訛り,TC-shell訛りと幾つも訛りがあります。SUNは現在,K-shell訛りと C-shell訛り,TC-shell訛りを理解できます(B-shell訛りもしゃべれるかもしれない)。何も設定をしないと,SUNはあなたに Cシェル訛りをしゃべる事を要求します。僕は個人的には TC-shell訛りが好きなので,計算機にログインしたと同時にtcshというコマンドを打ちます。すると SUNはそれ以降 TC-shell訛りを理解してくれます。C-shell訛りと TC-shell訛りは非常に似ていますが,多少の違いがあります。これからコマンドを打ち込んで計算機に色々な命令を与える練習をしますが,その際に一つ覚えて

おく事があります。それは UNIXでは,大文字と小文字を区別します。従って LSという文字と lsという文字は,UNIXでは全然違う文字ですから気を付けて下さい。それでは,計算機に lsというコマンドを打ち込んで下さい ( ls –alと打つと,点で始まるファイルもみることができる)。するとあなたの所有しているファイルの名前が表示されます (ワークステーションに初めてログインした場合には、lsというコマンドを打っても、まだファイルを作っていないので、何も見えないかもしれません)。では次にファイルの中身を見てみましょう。ファイルの中身を見るには moreというコマンドを使います。

sg046@kdeve% more .cshrc

するとファイルの中身が見えたはずです。更に先を読みたい時には,スペースキーを打って下さい。ま

た途中でファイルの中身を見るのを止めたければ,qを打ちます。.cshrcの中に書いてあるのは,皆さんが計算機を使う時に,便利に使えるように様々なおまじない (?)が書いてあります。でも今は,その中身の意味は気にしないで下さい。これで一応ファイルの中身の見方が分かったと思います。では他

のファイルの中身も自分で見てみて下さい。(注意:ファイルの中身が見れないファイルもある。逆にどんなファイルが中身が見れてどんなファイルが中身を見る事ができないのかを覚えておいて下さい。)次にディレクトリーを作ってみましょう。それを行うには、以下のようなコマンドを打ちます。

2

Page 3: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

sg046@kdeve% mkdir test

では次に今作ったディレクトリーに移動してみましょう。(ちなみにあなたが今いるディレクトリーをルートディレクトリーと呼びます。つまり計算機にログインした時にあなたがいるディレクトリーで

す。) それをやるためには以下のコマンドを打ち込みます。

sg046@kdeve% cd test

この様に打ち込むと,testというディレクトリーの中に入ることができます。これからはこのディレクトリーに自分で作ったファイルを入れておいてください。またディレクトリーの移動は頻繁に行う

ので、以下のようなコマンドを覚えておいてください。

sg046@kdeve% cd ~ <---ルートディレクトリーに戻る

sg046@kdeve% pwd <---自分のいるディレクトリーを確認する

sg046@kdeve% cd test <---testというディレクトリーに移動する

sg046@kdeve% cd ..  <---一つ上のディレクトリーに移動する

ここでディレクトリーとファイルの概念を理解する例を挙げておきます。これを理解するには図書

館をイメージすると良いでしょう。例えば図書館に入ると本が分野別に分類されているでしょう。例え

ば理学,政治...とかいった様に。また理学の分野に行くと物理,数学...といった様に細目が分かれているでしょ。そして物理の中でもまた細目別に分かれていますね。今計算機が記憶している全部の情報

を図書館にある本としましょう。そしてあなたは例えば物理学というコーナーの宇宙物理というコー

ナーに勝手に本を並べてよしと言われているとしましょう。その時にファイルが本に相当し,宇宙物

理という棚が,あなたのルートディレクトリーに当たります。宇宙物理の本を並べる時に,超新星関

係の本は棚のこの部分,活動銀河核の本は棚のこの部分と分類をしますね。そのさらに細かい分類が

今あなたの作ったディレクトリーに相当します (ディレクトリーとはファイルを整理するフォルダーだと考えて下さい)。ファイルを整理するには,ディレクトリーを幾つか作ってそれに応じてファイルを分類する事が大切です。また今までの説明である程度分かったと思いますが、ディレクトリーという

のは、実はただのファイルを格納しておく箱だと考えてください。

以上に幾つかコマンドを紹介しました。更にいろんなコマンドを覚えたい人は,頻繁に使われるコ

マンドを付録に付けておいたので,見てみて下さい。また UNIXの事が書いた本は生協に沢山ありますから,呑みに行くお金があるのなら一回我慢して,UNIXの本を買いましょう [2][3]。また kdeveの固有の使い方に関しては,机の上に緑色の本があると思います。これを参照して下さい。端末 (パソコン)の使い方が分かっている人なら,WWWサーバーにアクセスして kdeveの使い方を調べる事もできます。アドレスは以下の通りです。

http://ei5nazha.yz.yamagata-u.ac.jp/info-edu/text/

2.3 ログアウト

また計算機の使用を止める時には,exitというコマンドを打てばワークステーションから抜けられます (抜けられないで,更にプロンプトが出てきたなら,もう一度 exitというコマンドを打ちます)。ワークステーションから抜けたら、画面の上の sessionという箇所をマウスで選んで、そこの終了という項目を選びます。そしてその画面の左上隅にあるマイナスマークをマウスで選ぶとメニューが出て

きたはずです。そこで閉じるという項目を選びます。これで一応ワークステーションの使用を完全に

終えた状態になります。さらにパソコンの電源を切るには、まず画面の左下隅にあるスタートという

ボタンを押します。するとメニューの下の方に、Windowsの終了というメニューがでますので、それ

3

Page 4: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

を選びます。すると 4つの選択肢が出てくるので、「コンピューターの電源を切れる状態にする」を選びます。それを選んだ後に、パソコンの電源を落として下さい。

3 簡単なコミニケーション

今までの説明では、ワークステーションにログインして、簡単なコマンドを打って、ワークステー

ションをログアウトするという簡単な手続きを勉強したわけですが、これだけでは、面白くありませ

ん。次にワークステーションを使って文章やプログラムを書いたり、人とコミニケーションを取る基

礎的な部分を説明します。

3.1 エディターの使い方

プログラムを書くには,ワープロが必要です。計算機の用語では,プログラムを作るためのワープ

ロをエディターと言います。例えば PC98で動くエディターとして一太郎が有名ですが,SUNではvi,emacs,muleというエディターが使えます。この実習では,muleというエディターを標準で使用しようと思います。

muleを動かすには次のように入力します。

sg046@kdeve% mule sample1.f <---これから sample1.fというファイルを作る

すると画面が白くなると思います。そこでキーボードからアルファベットを打ち込むと,画面に入力し

たものがそのまま画面に現れると思います。この様にしてプログラムを書いていく事になります。ある

程度書き終わったら。コントロールキーを押しながらxを押し,cを押します。すると今書いたファイルを保存するかどうか聞いてくるので,yを押すと保存されます。これが muleによる最も簡単なファイルの作り方です。より色々な使い方をしたい場合には,muleのマニュアルを読んで下さい [6]。また,付録に muleで頻繁に使うコマンドを載せておきました。プログラムを組む際には、このmuleというエディターを使いますので、付録に載っている様々なコマンドは覚えておきましょう。

3.2 メールの使い方とトークの方法

計算機実習を行っている時に,しばしば分からない事や疑問にぶつかる事があると思います。しかし

ながら教官やティーチングアシスタントは,自分の部屋に戻ってタバコをすっているかもしれないし,

学生室でだべっているかもしれません。その様な時に計算機を使った電子メールが役に立ちます。電子

メールの一番簡単な使い方は,以下のようにします。まずエディターを使って手紙を書きます。例えば

手紙のファイルをmail.datとしましょう。そして以下のようにすれば郡司宛にメイルが送れます。(以下の sg046とは郡司の kdeveでのユーザーネームです) また自分の友達のユーザーネームを知っていたら,sg046の代わりにそこに自分の友達のユーザーネームを書けば,友達に電子メールが送れます。

sg046@kdeve% mailx sg046 <mail.dat

電子メールとは,計算機におけるお手紙だと思って下さい。従って,手紙を送った相手が読みたい時

に読む事ができます。読みたい場合には,以下の様に打ちます。

sg046@kdeve% mailx

4

Page 5: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

すると自分宛に誰からメールが来ているか分かります。そしてそこでもう一度リターンキーを打てば,

メールが読めます。長い文章であれば,スペースキーを打っていけば,さらに続きが読めます。メー

ルを読み終わるとプロンプトが? マークになります。そこで qを打つと,メールから抜けてもとのプロンプトが見えるはずです。自分が一度読んだメールは、自分のルートディレクトリーの mboxというファイルに格納されるので、後でもう一度メールを読みたくなっても、大丈夫です。

ここで一言メールアドレスに関して簡単に説明しておきましょう。以上で説明したように、kdeveからぼく宛にメールを打つ場合には、以上の様にすればいいのですが、他の大学や kdeveにアカウントを持っていない人にメールを打つ場合には、アドレスの指定方法が異なってきます。例えば他の大学

から僕にメールを送りたい人は、以下のようなメールアドレスを指定してメールを打ちます。

% mailx [email protected] <mail.dat

この@以下の所は何を意味するかというと、まず kdeveは僕の使用している計算機、kjとは小白川(kojirakawa)の kと jという文字を取ったものです。また yamagata-uは山形大学という意味ですね。また acとは academyの略で、日本の学術機関を意味します。また最後の jpは日本 (japan)を意味します。例えば以下の様にメールを打つと、僕の東大で使っているワークステーションにメールが送ら

れます。

% mailx [email protected] <mail.dat

もし学外の友達にメールを送りたい場合には、単にその人のユーザーネームを聞くだけでなく、ちゃ

んとしたフルアドレスを聞いておきましょう。

次は talkの説明です。talkとは電話に相当し、緊急の場合にのみ使用します。使い方は簡単で以下の様にします。

sg046@kdeve% talk sf004

すると桜井先生 (櫻井先生の kdeveでのユーザー名は sf004)が kdeveを使っていたなら,桜井先生の画面に sg046さんがあなたを読んでいますというメッセージが画面に表示されます。talkに答えるには,以下の様にコマンドを打ちます。

sg046@kdeve% talk sg046

するとそれぞれの画面が 2つに割れて,相手がキーボードに打ち込んだ文字が自分のパソコンに表示されます。もし talkを止めたければ,コントロールキーを”押しながら”cを打ちます。(問題)郡司宛にメールを送ってみよ。もし日本語を使いたい場合には,計算機センターでは cannaが立ち上がっているので,cannaを用いて日本語を書く事ができる。cannaに関しては,付録を参照。

4 フォートランとは?

4.1 プログラムを組むとは?

よくプログラムという言葉をちまたで聞くと思いますが、では実際にはいったいなんの事なのでしょ

うか? プログラムとは、ある一連の仕事をコンピューターにさせるために、その作業の流れをコンピューターに解るように書いた一連の文章です。ではどのような文章を書いて、どのようにコンピュー

ターに一連の仕事を頼む事ができるのでしょうか。まずその流れを簡単に説明しましょう。まずあな

たは、UNIXワークステーションにログインする必要があります。そして、ログインできたらプロンプトから以下のようにコマンドを打ち込んでみて下さい。

5

Page 6: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

sg046@kdeve% mule temp.f

以上のコマンドはエディターである muleを使用して、temp.fと言うファイルにフォートランプログラムを書きますという意味です (最後の.fというのがフォートランプログラムによく使うファイルネームです)。このコマンドを打つと、画面が白紙に変わります。そしてそこにプログラム言語の文法の規則に従って、一連の仕事の流れを書いていきます。今回あなた達が実習するのは、フォートラン言語

というものです。これはまさに言語で、外国語の様なものだと思って下さい。ですから、まずあなた

達は、その”外国語”を覚える必要があります。しかしそのフォートランという”外国語”は至って簡単で、半年あれば基本的な事は覚えてしまうでしょう。

フォートラン言語であなたがワークステーションにやらせたい仕事の流れを書いたら、ワープロを

終了して、そのフォートランプログラムを保存しておきましょう。自分が書いたフォートランプログ

ラムは、よくソースプログラムと呼ばれます ( ソースとは sauceでなく sourceです、大本という意味ですね)。そして後述するコンパイルとリンクという作業をソースプログラムに施し、実際に実行可能なプログラムを製作します。この翻訳されたプログラムは、実行プログラムと呼ばれます (executableprogram とも呼ばれます)。コンパイルとリンクという作業は、自分の書いたフォートランプログラムをワークステーションが分かるように翻訳を行い、肉づけを行う作業だと最初は思っていて下さい

(ワークステーションは、あなたの書いたプログラムを直に理解することはできません。コンピューターが直接理解できる言葉 (マシン語)を人間が書くのは、とてもじゃないけど難しすぎるのでこの様な作業が必要になります)。実行プログラムができたら、今度はこの実行プログラムの通りにコンピューターを動かすために、またプロンプトから今作った実行ファイル名を打ちます。するとコンピューター

はあなたの考えていた一連の作業をしてくれるという訳です。

以上がフォートランプログラムを組んで、あなたの指定した作業をコンピューターに行わせる手順

です。では実際にどのような作業をコンピューターにやらせることができるのでしょうか。もし簡単

な仕事なら、なにもフォートランプログラムを組む必要はありません。しかしもしあなたが量子力学

の問題をコンピューターに解かせたいとします。これはとてもじゃないけど、一言では言い表せない

ぐらい大変な仕事です。そんなときに、あなたは手順書としてのプログラムを書く必要があるのです。

そして以上の手順で実行プログラムを作るわけです。

4.2 フォートランの基礎的な規則

フォートランでプログラムを組む場合、基本的にフォートランの文法に従って、文章を並べていくこ

とになります。この文章の並びをメインプログラムと言います。それに対して副プログラム (サブルーチン)というのがありますが、これは後でちょっと触れます。また実際の使い方に関しては、後の演習でやります。フォートランコンパイラーは、その文章を”基本的”には上から順番に翻訳していきます。ではフォートランの文章には、どのようなものがあるのでしょうか。基本的な文を以下にまとめてみ

ました。またフォートランの文章では、大文字と小文字は同じ意味を示しています。従って、Integerと書いても integerと書いても同じです。

非実行文 実際にプログラムの中に書いても、フォーオートランコンパイラーが無視したり、何も行われな

い文章。ただし後で書いてある宣言文は、何もしないけど、無視されるわけではないです。

空行 何にも書いていない行であり、当然の事ながらフォートランコンパイラーは、この行を読

み飛ばします。

コメント文 これは自分の書いたプログラムを後で見たときに、何をやっていたのかを思い出すために、

通常書きます。これはフォートランコンパイラーが翻訳しない部分です。コメント文の書き

6

Page 7: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

方は、行の 1文字目に Cと書けば OKです。そしてその後に自分のメモを書いておきます。

宣言文 これには Integer文、Real文、Character文、Parameter文などが含まれます。これらの文章は、これからプログラムの中で使う文字や変数、定数の定義をする文です。これらの文

は必ず、7文字目から 72文字目までの間に収まらなくてはいけません。また変数が基本的には 6文字以内でなくてはなりません (しかし最近のフォートランコンパイラーは 6文字以上の変数を定義しても大丈夫な物がほとんどです)。どうしても、7文字目から 72文字目に収まらない場合、つまり 1行では書けない場合には、次の行の 6文字目に&マークを書いてから、同様に次の行の 7文字目から 72文字目までに文章を書いていきます。この&に関する規則は実行文に関しては全て当てはまります。以下に例を示しましょう。

Integer input1, input2, input3, input4, input5, input6,

& mulput1,mulput2,mulput3

上の例は、input1から input6までとmulput1から mulput3までの整数の変数をこのプログラムで使いますよという文章です。文章が 2行に渡って書かれていますが、その時には、前に話したように&マークを 6文字目に書きます。また変数をいくつも並べる場合には、カンマで区切って並べます。(input6の後ろにもカンマが書いてあることに注意して下さい。)カンマで区切られたものがそれぞれの変数として定義されます。使われる変数は、必ずちゃん

と定義するようにしましょう。またこの文の中で、空白が幾つかありますが、それはフォー

トランプログラムは読み飛ばします。従って、input1,input2と書いても input1, input2と書いてもこれは同じ事です。

実行文 実行文とは、実際に自分のやらせたい事を記述した文です。この文章も 7文字目から 72文字目までの間に書かなくてはいけません。また 2行に及ぶ場合には、同様に&マークを次の行の 6文字目に書きます。

代入文 ある変数や定数をある変数に代入する文章です。以下に例を示します。

Real a,b,c

Character chara,chara1

a=2.0

b=3.0

c=a+b

chara=’I am sorry’

chara1=char

以上の例では、aと bという変数が実数として定義されていて、次に charaという文字変数を定義しています。3,4行目では aと bという実数変数にそれぞれ 2.0と 3.0いう値を代入しています。さらに 5行目は、aと bを足したものを cに代入しています (フォートランのプログラムでイコールの印は、等しいことを意味するのではなく、右辺の値を左辺に代入

するという事を意味します)。従って cは 5.0になりますね。6行目は、charaという文字変数に I am sorryという文字を代入しています。文字定数の代入の場合には、その定数をアポストロフィーで囲んで代入します。7行目は、文字変数 chara1に文字変数 charaの値を代入しています。char1は I am sorryとなりますね。文字”変数”を文字変数に代入する場合には、アポストロフィーを付けてはいけません。また前に空白は読み飛ばされると書き

ましたが、アポストロフィーで囲まれた部分の空白は読み飛ばされません。空白がそのま

7

Page 8: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

ま代入されます。いままでのところで解ったと思いますが、代入文とはまさに代入文であ

り、数学のイコールとは違います。右の値を左に代入することを意味します。

制御文 これは End文、goto文、If文、Do文、Call文がその分野に属します。End文はプログラムの終わりに必ず書かなくてはいけない文です。goto文は、後で詳しく説明しますが、goto文の所まで来ると、プログラムはそのすぐ下には行かないで、goto文で指定された所に行きます。If文や Do文も同様に後で説明しますが、If文は条件文とも呼ばれていて、もしある条件が満たされるなら、これこれの事をしなさいという様な事を命令したいときに使い

ます。また Do文は、あることを繰り返しなさいという命令を行いたいときに使います。If文はかならず End If文と対になって使われ、Do文は End Do文と同様に対になって使われます。これらの文章が制御文と言われるわけは、おわかりの通りプログラムの流れを制

御する役目を果たすからです。Call文とは、サブルーチン (副プログラムとも言う)という物を呼び出すのに使用します。プログラムが Call文の所までくると、そこでプログラムは制御を副プログラムの部分に移します。そして副プログラムが終わった時点で、もとのプ

ログラムの Call文のすぐしたの文が実行されます。副プログラムとは言ってみれば、メインプログラムの下請けです。

入出力文 Write文、Read文、Open文、Close文がこれに当たります。Write文は、計算結果をコンピューターのディスプレイに表示したり、他のファイルの中に書き込んだりする役目を果

たします。また Read文は逆にキーボードから打ち込んだ値をプログラムが受け取ったり、あるファイルの中にある数字や文字を読んだりするのに使われます。Open文は、あるファイルを開いて、ここに書かれている文字や数字をプログラムが読めるようにしてあげるた

めの文です。また Close文は、そのファイルをもう一度プログラムから見えなくしてしまう文章です。入出力文は、いずれにしても文字を書き出したり読み出したりするときに必

要な文章です。

以上でだいたいプログラムに登場する文が出てきましたが、それはどのような順番で書いてもいい

という訳ではありません。幾つか規則がありますからそれをまとめておきます。

1.プログラムは基本的に上から実行されていくことを念頭においてかかれなければいけない (例外は、goto文や Call文)。

2. メインプログラムも副プログラムも、必ず End文で終わらなくてはいけない。3.宣言文が実行文よりも必ず先になくてはいけない。

以上がおおざっぱな規則です。他にも沢山の順序に対する規則はありますが、それは演習で学んで下

さい。

5 フォートランの実習 (初歩の初歩)

ここではフォートランの文法のおさらいと,プログラミングスタイルを実習します。このテキスト

に書かれている事だけで、一応簡単なプログラムを書くことはできるはずですが、簡単なフォートラ

ンの本を購入する事を薦めます [1]。

8

Page 9: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

5.1 フォートランの起動方法

まず最初にサンプルのプログラムを書いて,それをワークステーションで計算させてみましょう。以

下のプログラムをエディターを使ってまず書いてみて下さい (これから皆さんが新しくプログラムを書く時には,testという前に作ったディレクトリーの中に書きましょう)。これから書くプログラムのファイルの名前は,できれば sample1.f,sample2.fという様にしていくといいと思います。

c--------

c sample

c--------

Implicit none

Real a,b,c

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

c=a+b

Write(6,*)’c=’,c

End

以上のプログラムは入力した 2つの数を足すプログラムです。(フォートランのプログラムは 7行目から 72行目の間に書く事を忘れない様に!) 一行目に cを書くとこれはコメント (プログラムとしては意味を無さない文)になります。ではこのプログラムを上から見ていきましょう。まず最初の 3行は 1列目が cで始まっています。従ってこの部分はコメント文で、プログラムには何も関係しない、ただの覚え書きです。次に Implicit noneという文がありますが,これはこれからフォートランを書く時に必ず最初に書いて下さい! これは定義していない変数がプログラムの中に現れる事を禁止する文です。なぜ絶対に書けというかは、後々分かってきます。次に現れる文は、Realという宣言文です。この様にプログラムで使用する、a,b,cという実数変数を定義している箇所です。プログラムで使用する変数は、すべてこの様に最初の部分にまとめて書きます。次の Write(6,*)’a=’という文章は、画面に a=という文字を書きなさいという文です。この 6という数字は、”画面”という事を意味する数字です。またアスタリスクマークは、a=というものを画面に書く際に、その書き方は、コンピューターにおまかせしますという意味です。次の文章は、Read(5,*)aですが、これはキーボードから aに代入すべき値を打ち込んでくれという要求を示す文です。この数字の 5はキーボードを意味しています。ここでキーボードから数字を打ち込むと、その数字が aという変数に代入されます。次に同様に bという変数に対しても同じ事が行われ、次に aと bを足した結果を cに代入しなさいという文があります。そして最後に cの値を画面に書きなさいというWrite文があります。この様にWrite文を書くと、画面にはc=という文字が書かれ、その後に cの値が示されます。クオーテーションで囲まれたものが Write文の後ろにあると、そのクオーテーションマークの中に書かれた文字を画面に書き出すことを意味しま

すが、クオーテーションマークが付いていない場合には、その変数に代入されていた数字が画面に現

れます。また 2つのものを並べて書き出したい場合には、それぞれをカンマで区切ります。最後にこれでプログラムは終わりですよという事を示す End文でプログラムを締めくくります。

9

Page 10: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

以上のプログラムが書けたら,muleを抜けてそしてこのプログラムを動かしてみましょう。動かし方は以下の様にします。

sg046@kdeve% frt -o sample1 sample1.f <---いま書いたファイルの名前

sg046@kdeve% sample1 <---sample1を実行する

上の例の様に,自分で作ったフォートランのファイル (sample1.f)の事をソースファイルと言います。また frtというコマンドで作ったファイル (sample1)の事をエグゼキュータブルファイルと言います。またソースファイルをエグゼキュータブルファイルに変換する作業をコンパイルしリンクするといい

ます。また以上のように sample1とキーボードから入力すればプログラムが動きだしたはずです。もし動かないようであれば、それはプログラミングに失敗しています。もう一度muleを立ちあげて、文法が正しいかチェックしてください。またこのサンプルプログラムを使って,muleの練習を各自行って下さい。(この先プログラムを自分で書いたら必ず sample1.fとか sample2.fという様に.fで終わるファイルネームにして下さい。またエグゼキュータブルファイルの名前は,ソースファイルの名前が

sample1.fなら sample1,sample2.fなら sample2というようにしましょう)

5.2 Do文

Do文とは,ある操作を繰り返し行わせたい時に使用します。下にサンプルのプログラムを示します。各自muleで打ち込んでみて下さい。

c----------

c sample do

c----------

Implicit none

Integer i

Integer sum

sum=0

Do i=1,100

sum=sum+i

End do

Write(6,*)’sum=’,sum

End

上のプログラムは 1から 100まで足し算した結果を表示するプログラムです。Implicit noneまでは、以前のプログラムと同じですね。そしてその次に整数を宣言する文が 2つ出てきます。これはプログラムで iと sumという変数を使うから宣言しています。この文章は、以下のように書いても構いません。

Integer i,sum

次にプログラムの本体が現れます。まず sumという変数の値にゼロを代入します。すると次に Doで始まる文が現れますね。これは Doの行から、End doの行で囲まれている部分を、iの値を 1から 100まで変えながら、繰り返しなさいという意味です。一番最初に Do文に出会うと、iの値は 1になります。そして End doの所まで来るともう一度Doの所に戻りますが、その時の iの値は 2になっています。実際に 100回繰り返される文章は sum=sum+iですが、これはどの様な働きをするか考えてみま

10

Page 11: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

しょう。この文章の意味は sumという変数の値に 1を足して、それを sumという変数に新しく代入することを意味します。まず 1回目には、何が起こるかというと、iの値は 1で sumの値は最初ゼロなので、0+1で sumには 1が代入されます。次に 2回目の実行が行われる際には、sumの値は 1に変化しており、iの値は 2です。ですから sumには 1+2で 3の値が代入されます。そして 3回目の実行では、sumの値は 3であり、iの値は 3なので、sumには 6が代入されます。もう気が付いたと思いますが、Doの中身が 100回繰り返されると、結局 sumの値は 1から 100までを足し算した値が代入される事になります。

またこのプログラムを見て気が付くのは,sumという変数と iという変数は,小文字ですが DoとかWriteとか Integerとか,フォートラン自身であらかじめ定義されている文字は最初が大文字になっています。なるべくこの様にプログラムを書いて下さい。(当然この様にしなくてもプログラムはちゃんと動作するが...) また Doと End doの間に囲まれた行は少し文が始まる位置が下がっています。Doと End doで囲まれる部分は,必ず何文字かの字下げをして書きましょう (Muleではタブキーを押す事である程度自動的にこの様な作業を行ってくれる)。これもプログラムを見易くするこつです。このプログラムが動作したら,自分で少しこのプログラムを書き換えてみましょう。

(問題)(1+∼+10)+(2+∼+11)+∼+(91+∼+100)を Do文を使って計算せよ。そしてその結果を手で計算した結果と比べてみよ。

5.3 If文

If文は,プログラムの中で条件分岐が必要な場合に使います。下がサンプルプログラムです。

c--------

c sample If_1

c--------

Implicit none

Real a,b

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

If(a.gt.b) Then

Write(6,*)’a>b’

End If

If(a.lt.b) Then

Write(6,*)’a<b’

End If

If(a.eq.b) Then

Write(6,*)’a=b’

End If

End

11

Page 12: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

上のプログラムで、Read(5,*)bまでの部分は分かりますよね。その下に 3つの If文が出てきます。基本的には If文は Ifのカッコの中に囲まれている条件を満たせば,その次の文章に処理が移るというものです。もし条件を満たさなければ,End Ifに飛びます。Do文と同じく Ifで囲まれている所は,字下げして書きます。プログラムを書くときに頭の中で「If(もし)aが bより大きいならば、その時に (Then)a>bと書け」という様に思い浮かべながら書くと良いでしょう。またフォートランでは大小関係を表す記号として、.gt.、.ge.、.eq.、.ne.、.le.、.lt. 等の記号を使います。.gt.は「より大きい」を、.ge.は「以上」を、.eq.は「等しい」を.ne.は「等しくない」を、.le.は「以下」を、.lt.は「より小さい」を示します。

また上のプログラムは以下の様にも書けます。

c--------

c sample If_2

c--------

Implicit none

Real a,b

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

If(a.gt.b) Then

Write(6,*)’a>b’

Else if(a.lt.b) Then

Write(6,*)’a<b’

Else

Write(6,*)’a=b’

End If

End

上のプログラムでは、Elseという新しい言葉が出てきますが、これは”そうでないなら” と訳して考えます。つまり上のプログラムの If文の所は、「もし aが bより大きければ、その時 a>bと書き出しなさい。もしそうでなく、aが bより小さいなら、その時 a<bと書き出しなさい。またそうでもないなら a=bと書き出しなさい。」という様に読めます。上のプログラムは以下の様にも書けます。それぞれのプログラムが全く同様に動作する事を確認して下さい。

c--------

c sample If_3

c--------

Implicit none

Real a,b

Write(6,*)’a=’

12

Page 13: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

If(a.gt.b) Then

Write(6,*)’a>b’

Else

If(a.lt.b) Then

Write(6,*)’a<b’

Else

Write(6,*)’a=b’

End If

End If

End

上のプログラムでは If文の”入れ子”(If文と End If文の中に、さらに Ifと End Ifが入っているような構造)が使われています。この様に入れ子をやると、どの Ifとどの End Ifが対応しているか分からなくなりがちです。そのため、Ifと End Ifで囲まれた部分は字下げをして書きます。そうすると IfとEnd Ifの対応関係が明確になります。またどちらかと言うと,sample If 2や sample If 3の様な書き方を勧めます。If文はバラバラに書くよりも,Elseを使った方がすっきりするし,なお条件の数え落としを防ぐ事ができます。

If文にはいろんなパターンがありますが以下に示すのは,プログラムの一部での If文の使い方です(以下の部分だけ書いてもプログラムは動かないので、注意しましょう)。参考にしてみて下さい。

If((a.ge.c).AND.(a.le.b)) Then <---aが c以上かつ b以下であるなら aの値を

Write(6,*)’a=’,a 書け。

End If

If((a.ge.c).OR.(a.le.b)) Then <---aが c以上若しくは b以下であるなら

Write(6,*)’a=’,a aの値を書け。

End If

(問題)キーボードから 3つの数字を打ち込んで,もしこの 3つの数字を 3辺とする 3角形が作れるなら,コンピューターの画面に successと打ちださせ,もし 3角形ができなければ,failと打ち出させるプログラムを作れ。

5.4 goto文

goto文は,If文や Do文の中から外に抜ける時に主に使用します。サンプルのプログラムを以下に示します。

c-------------

c sample goto1

c-------------

Implicit none

13

Page 14: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Integer a

Write(6,*)’a=’

Read(5,*)a

10 Continue

a=a+1 <---aの値を少しづつ増やして,aが 1000を越えたら

If(a.lt.1000) Then プログラムを終了しなさいというプログラム

goto 10

End If

Write(6,*)’a=’,a

End

goto文は continue文といっしょに使います。goto文までプログラムが進んだ時に,goto文の指定する番号の所に制御を戻すという様な使い方です。Continue文の前にある番号は,2列目から書き始めるようにしましょう。なおこの番号は通常 1から 9999までのうち、好きな番号を使えます。また当然の事ですが、同じ番号の Continue文が 1つのプログラムに 2つ以上現れることはありません。以下の例を見て下さい。もしこの様に 2つの箇所で同じ番号の Continuep文があると、goto文でどこに飛べばよいか、一意的に定まらなくなるからです。逆に同じ番号を持った goto文は、幾つあっても構いません。

c-------------

c wrong sample goto

c-------------

Implicit none

Integer a

Write(6,*)’a=’

Read(5,*)a

10 Continue

If(a.eq.0) Then

goto 10

End If

10 Continue

End

心掛けておいてほしいのは,使わないで済むなら goto文は使わないようにするという事です。例えば以下の様なプログラムは gotoを沢山使っていて,読みやすいプログラムとは言えません。 これはgoto文を沢山使っているため,プログラムの制御があっちに行ったりこっちに行ったりしているからです。

c-------------

c sample goto2  これは悪い例。見習わないように!

14

Page 15: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

c-------------

Implicit none

Integer a,b

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

10 Continue

a=a-1

goto 30

20 Continue

a=a+1

30 Continue

If(a.gt.b) Then

goto 10

Else if(a.lt.b) Then

goto 20

End If

Write(6,*)’a=’,a

End

(問題)キーボードから自分で好きな自然数 (Nとする)を入力し,N<2nの条件を満足する最小の nを求めるプログラムを goto文を使って製作せよ。

5.5 Do while文

上で例題で goto文と If文を用いてプログラムをかきましたが、実際これもあまり良いプログラムと言えません。一番いい方法はこれから説明するDo while文を使う方法です。goto文と If文を組み合わせて使うプログラムは、Do while文を使うと非常にシンプルに書けます。ただしこの文は古いフォートランコンパイラーしか載っていないワークステーションでは使えない場合がありますので、注意し

て下さい (kdeveでは使える)。以下のサンプルプログラムを見て下さい。これは先ほどの例題と全く同じ働きをするプログラムです。

c-------------

c sample do while 1

c-------------

Implicit none

Integer a

Write(6,*)’a=’

Read(5,*)a

15

Page 16: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Do while(a.lt.1000)

a=a+1

End do

Write(6,*)’a=’,a

End

肝心な箇所は Do whileと End doの部分です。Do whileの意味は、カッコの条件が満たされている限り、無限に a=a+1を繰り返せという意味です。つまりこのプログラムでは、aの値が 1000以上になるまで、aに 1を足していき、もし aが 1000 以上になったら、End doの下の文章が実行されます。上の例題を見て気が付いた人がいるかもしれませんが、Do whileは下手をすると無限に終わらない

プログラムを作ってしまう可能性があります。例えば以下の例を見て下さい。

c-------------

c sample do while 1  ! bad sample

c-------------

Implicit none

Integer a

Write(6,*)’a=’

Read(5,*)a

Do while(1.lt.1000)

a=a+1

End do

Write(6,*)’a=’,a

End

上の例は一カ所タイプミスをしています。これはWhileの中身が (1.lt.1000)で aと書くところを 1と書いてしまいました。すると当然ですが、1は 1000よりもいつも小さいので、一度 Do whileの中に入ったが最後、制御が外に移ることはありません。従って無限に動き続けるプログラムになってしま

います。この様なプログラムが動いていると他の kdeveを使っているユーザーは、非常に迷惑をします。それは、あなたが無意味な計算をすることで、kdeveの能力の一部が無駄になってしまうからです。(これを逆手にとって、人に意地悪をすることが昔はできた。上のようなプログラムを動かすと、ワークステーションは上の計算を一生懸命、無限にやり続ける。従って他のユーザーが動かしている

プログラムが、なかなか終わらないのである。特に昔のワークステーションは馬鹿だったので、一人

が上のようなプログラムを走らせると、その計算にかかりっきりになり、他のユーザーの計算をそっ

ちのけでやり続けたのである。筆者が大学院生だった頃、上のようなプログラムをふざけて動かして、

助手の先生に怒られた。賢明な学生はまねしないように!)

5.6 Implicit noneについて

ここで一つ休憩がてらに Implicit noneがなぜ重要かという問題について触れてみたいと思います。以下のプログラムを見て下さい。これは 2つの数を足すプログラムを書くつもりで書かれたプログラ

16

Page 17: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

ムです。しかしこれは正しく機能しません。なぜでしょう?

c----------

c implicit

c----------

Write(6,*)’a1=’

Read(5,*)a1

Write(6,*)’a2=’

Read(5,*)a2

Write(6,*)’a1+a2=’,al+a2 <---この部分に注意!!

End

これが分かる人は相当目が良い人ですね。実は al+a2の部分の下線部は数字の 1でなくてエルの小文字なのです。「なんだつまらない」と言うかもしれませんが,一日中プログラムを打っていると,必ず

と言っていい程タイプミスをします。上の例は疲れている時にはまず発見できないでしょう。しかし

もし Implicit noneをちゃんと入れていれば,話はまったく違ってきます。プログラムをコンパイルする時に,計算機が間違っている事を教えてくれるのです。Implicit noneはタイプミスを防ぐ強力な方法です。その反面、Implicit noneを書かないと、プログラムの上の方で、プログラムで使う変数を定義する必要はありません。しかし筆者の経験では、少しぐらい余分にタイプをしても、バグ (間違い)が入りにくいプログラムの方が有効なので、必ず Implicit noneは書くようにしましょう。

5.7 組込み関数

フォートランは四則演算 (+,−, ∗, /)の他に色々な関数をサポートしています。この様にあらかじめフォートランが最初から持っている関数を組み込み関数と言います。例えば三角関数や指数関数や対

数関数です。これらは以下の様に使います。

c----------

c test_func

c----------

Implicit none

Real a,b

Write(6,*)’a=’

Read(5,*)a

b=sin(a) <---aの sinの値を求めている。

Write(6,*)’sin(a)’,b

End

組込み関数でよく間違うのは,sinと sindの違いとか,logと log10の違いです。sinはラジアン単位で使われ,sindは度の単位で使われます。logは対数の底が自然対数で log10は底が 10ですので間違わないように!! またよく使う組み込み関数を付録に載せておきました。どの様な事ができるか見てごらんなさい。

17

Page 18: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

(問題)x2 = yと e−x/0.3 = yの交点をフォートランで解かせてみよ。ただしその交点は 0.01程度の誤差を含んでも良い。

5.8 パラメーター文

プログラムを書いている時に,よく不変な定数がでてくる時があります。例えば電子の質量とか等

です。また不変定数と言う訳ではないけども,プログラムのなかでは取り敢えず値が変わらない様な

数があります。こういう数はパラメーター文を使って定義します。以下にサンプルプログラムを示し

ます。

c---------

c Compton

c---------

Implicit none

Real MC2,THETA

Real energy,scat_ene

Parameter(MC2=511.0, THETA=90.0)

Integer i

Do i=1,10

energy=i*10.0

scat_ene=energy/(1.0+energy/MC2*(1.0-cosd(THETA)))

Write(6,*)’Incident=’,energy,’Scattered=’,scat_ene

End do

End

このプログラムは Compton散乱によって 90◦に散乱された硬 X線のエネルギーが入射エネルギーによってどの様に変化するかを調べたものです。上の例では,電子の質量は 511keVという不変定数なので,値を固定するためにパラメーター文を使っています。また今 90散乱だけ考えたいので,角度を90度に固定しています。パラメーター文を使う利点は,一つには数字の意味がはっきりするという事です (数字を代入する変数の名前を意味のある変数にすればよい)。またもう一つは簡単なプログラムでは分かり難いのですが,もし上のプログラム本体に頻繁に 90度という数が使われたとしましょう。そして後からこの値を120度に変更したいとすると,プログラムの最初から最後まで眺めて全てを変更していかなくてはなりません。しかしパラメーター文を使うと,プログラムの最初の所だけで,直すべき箇所は一箇所で

済みます。つまり最後までプログラムを読んでいく必要が無くなります。

5.9 配列

計算で配列を扱う事がよくあります。配列の定義として a(6)とか a(2,3)とか a(3,4,5)等の色々なものが使えます。a(6)という変数を最初に定義しておくと、これは a(1),a(2),a(3),a(4),a(5),a(6)という6個の変数を一辺に定義したことと同じになります。この様な定義の方法はベクトルの計算をさせるときに非常に便利です。例えば direction(3)という変数を定義しておけば、direction(1)はあるベクトルの x成分、direction(2)は y成分、direction(3)は z成分を示しているとしてプログラムを書くことが

18

Page 19: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

できます。この様にしておけば、プログラムが非常に見やすくなります。以下に配列を使った簡単な

プログラムの例を挙げておきます。下のプログラムは 2行 2列の行列の足し算をするプログラムです。

c-------

c matrix

c-------

Implicit none

Real a(2,2),b(2,2),c(2,2) <---2行 2列の行列を定義している。

Integer i,j

Do i=1,2

Do j=1,2

Read(5,*)a(j,i)

End do

End do

Do i=1,2

Do j=1,2

Read(5,*)b(j,i)

End do

End do

Do i=1,2

Do j=1,2

c(j,i)=a(j,i)+b(j,i)

Write(6,*)’c(’,j,i,’)=’,c(j,i)

End do

End do

End

まず行列を定義している箇所を見てみましょう。ここでは 2行 2列の行列が 3つ定義されています。例えば上のように a(2,2)と定義しておくと、a(1,1)、a(2,1)、a(1,2)、a(2,2)という 4つの実数変数を同時に定義した事になります。そして、次の 5行文は、a(1,1)、a(2,1)、a(1,2)、a(2,2)にそれぞれ値を順番に代入していく文です。ここではうまくDo文の入れ子を使って行っています。これは以下のように書いても同じです。しかし上のように書いた方が、行列の要素が増えたときに便利です。

Read(5,*)a(1,1)

Read(5,*)a(2,1)

Read(5,*)a(1,2)

Read(5,*)a(2,2)

(問題)2行 2列の逆行列を計算するプログラムを書け。もし逆行列がない場合には,その胸を画面に表示させよ。

19

Page 20: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

5.10 ファイル操作

ファイルに格納されているデータをプログラムに読み込んで,それをプログラムで加工して,また

別のファイルに書き出すという事はよくあることです。以下にサンプルのプログラムを示します。

c----------

c Simple Example 1

c----------

Implicit none

Integer i

Do i=1,10

Write(3,*)i

End do

End

上の例は、非常にシンプルなプログラムです。ただ今までと違うところは、Write(6,*) ではなく、Write(3,*)となっている所です。前に説明したように 6 とは画面を示しています。では 3 とは何を示しているのでしょうか。実は 3とは fort.3というファイルを意味しています。従って、上のプログラムを実行すると、結果が画面に出るのではなく、fort.3というファイルが新しくできて、そのファイルの中に実行結果が保存されます。また 3の代わりに 4とすれば fort.4というファイルが新しくできて、その中にプログラムの実行結果が書き出されます。この番号 (ロジカルユニットナンバーと呼ばれる)は、1から 99までは使えるはずです。しかし何度も出てきたように、5番はキーボード、6番はディスプレイとして最初から定義されているので、ファイルに書き出す場合には、それ以外の番号を

使います。

では次の例を見て下さい。

c----------

c Simple Example 2

c----------

Implicit none

Integer i,a

Do i=1,10

Read(4,*)a

Write(6,*)’a=’,a

End do

End

上のプログラムも非常にシンプルですが、異なったところは Read(4,*)の 4という所です。ここを 5にすればキーボードから値を打ち込み、その結果が画面に表示されるというプログラムですが、4としておくと、fort.4というファイルから値を読み込む事になります。従ってこのプログラムを動かす際には、あらかじめ fort.4というファイルを作り、その中に以下のような数字を書いておく必要があります。

20

Page 21: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

1

5

3

7

6

2

8

5

9

10

もし以上のような fort.4というファイルを作っておくと、プログラムは fort.4から中身を Read文で読んで、その結果を画面に書き出します。

今までのファイルに結果を書き出したり、ファイルから数字を読み込む場合には、fort.3とか fort.4とか特別の名前のファイルに限定されました。しかし、こんな変な名前のファイルを使いたくない事

がしばしばでしょう。そこでもっとかっこいい方法があります。ここではこの様な方法を実習します。

また同時に文字変数の入力の方法も同時に実習を行います。

c----------

c Character

c----------

Implicit none

Character*32 infile,outfile

Integer i,a,b,INLUN,OUTLUN

Parameter(INLUN=3,OUTLUN=4)

Write(6,*)’input filename’

Read(5,’(A)’)infile

Open(INLUN,FILE=infile,STATUS=’OLD’,ERR=999)

Write(6,*)’output filename’

Read(5,’(A)’)outfile

Open(OUTLUN,FILE=outfile,STATUS=’NEW’,ERR=999)

Do i=1,10

Read(INLUN,*)a

b=i+a

Write(OUTLUN,*)a,b

End Do

goto 998

999 Continue

Write(6,*)’File access error’

998 Continue

21

Page 22: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Close(INLUN)

Close(OUTLUN)

End

上からこのプログラムを見ていくと,Characterという宣言文が目につきます。これは infile,outfileという変数が文字変数で 32文字分の領域が確保されているという事を示しています。次に目につくのがこれから使用するファイルの名前を読み込む所です。文字を読み込むRead文はちょっと変わっている事に注意して下さい。そしてこのファイルを開く文章として open文が使われています。最初の open文は,ロジカルユニットナンバー 3(INLUNの事)として infileという名前のファイルを開くという事を意味します (先ほどのWrite(3,*)の 3に対応)。またこのファイルはすでに存在するファイルであり(だから STATUSは OLDになってます),もし開けなかったら 999という番号の文に飛びなさいという事がかかれています。次にデータを書き出すファイルをロジカルユニットナンバー 4としてファイルを開きます。そしてロジカルユニットナンバー 3のファイルからデータを読み込み,加工してロジカルユニットナンバー 4のファイルに書き込みが行なわれています。そしてデータの操作が終わったら,開いていたファイルを閉じるように,close文が書かれています。ファイル操作を行う事ができるようになると,プログラムを作る上での幅が俄然広がります。です

からこの様な操作を出来るだけ覚えましょう。例として行列の所で挙げたサンプルプログラムをつく

り直して,キーボードから数字を打ち込むのでは無く,ファイルにあらかじめ数字を書き込んでおい

て,それをプログラムに読み込ませたり,ディスプレイに答えを出すのでは無くファイルに書き出す

ような事をやってみましょう。

(問題)あらかじめ以下の様なファイルを作っておき,このファイルをプログラムの中で開いて,数の小さな順番に並びかえて,その内容を画面に表示させよ。

5.4

2.1

9.4

8.0

3.8

6.1

0.5

2.9

5.11 副プログラム (サブルーチン文)

複雑な計算を行いだすと,プログラムが長くなり見にくくなります。また長いプログラムがもし間

違っていた場合,直すのは一苦労です。そこで文章にも段落や章があるように,プログラムもその様

な一つのまとまりを持つ部分を区分けしておくと,プログラムが見易くなります。これがサブルーチ

ンと言われるものです。この概念はフォートランを書く上で非常に大事な概念ですから,ちょっと概念

的な例をあげてみます。研究室でみんなで仕事をしている時の事を考えてみましょう。実験系の研究

室の場合,大抵は共同で一つの実験を行います。そして教官が大体こういう事をやろうというおおま

かな構想を立てます。そしてそれを実現するには,基礎実験 1と基礎実験 2が必要だという様な事までを考えます。そして基礎実験 1は大学院生の A君が担当して,基礎実験 2は大学院生の B君が担当するという役割分担を決めます。すると A君は例えば基礎実験 1を行うには回路の製作と計算機で信号の読み取りが必要だと判断します。そして回路の製作は 4年生の C君に計算機回りは 4年生の D君にやってもらおうと決めます。この様に仕事はおおまかな所から下へ下へと降りてきます。プログラ

22

Page 23: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

ムを組む場合も全く同じです。メインプログラムは全体のおおまかな流れを記述し,サブルーチンは

その中の細かい部分を担当するという形になります。以下に簡単なサンプルプログラムを示します。

c---------

c main

c---------

Implicit none

Real a,b,add,sub,mult

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

Call calc(a,b,add,sub,mult) <---この文から制御が Subroutineに移る。

Write(6,*)’a+b’,add

Write(6,*)’a-b=’,sub

Write(6,*)’a*b=’,mult

End <---メインプログラムの終わり

Subroutine calc(op1,op2,add,sub,mult) <---サブルーチンの始まり

Implicit none

c Input:

Real op1,op2

c Output:

Real add,sub,mult

add=op1+op2

sub=op1-op2

mult=op1*op2

Return <---メインプログラムの Call文のすぐ下に戻りなさいという意味。

End <---サブルーチンの終わり

ここでサブルーチンの書き方で注意する事が 2つあります。一つは引き数の問題です。引き数とは Call文の中に入っている変数又は数の事です。このプログラムでは a,b,add,sub,multの 5つの変数が入っています。その時にサブルーチンの方では同じように 5つの引き数で受けなくてはいけません。今の場合では op1,op2,add,sub,multです。その時に変数の名前が変わっても問題ありません。ここでは aがop1に bが op2に変化していますね。ただしメインプログラムで aを Real で定義しているので,サブルーチンでも op1は Realで宣言しなくてはいけません。(恐い事にサブルーチンで op1を Integerで宣言するとコンパイルエラーは起こりませんが,ある条件でプログラムを走らせると,明らかに間

違った結果が出てきます)もう一つはプログラミングの問題ですが,サブルーチンの中に Inputとか Outputとかのコメントが書いてありますね。これはこれからも必ず付けて下さい。つまりサブルーチンの中に入力される変数

は何か,またサブルーチンから出力される変数は何かをちゃんと分かるようにしておくためです。下

23

Page 24: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

にもう一つサンプルのプログラムを付けます。下の例では,入力した数を入れ換えて出力するという

だけのものです。ここでもう一度サブルーチンの中に注目すると,サブルーチンの宣言の箇所のコメ

ントに Modifiedと Localと書いてありますね。Modifiedとして宣言されている変数は,入力された数が変更されてサブルーチンから出力される事を意味しています。また Localの場所に宣言されている変数は,サブルーチンの中だけで使われる変数です。以上をまとめると,サブルーチンで使われる変

数は,Input,Output, Modified,Localの 4つのうちの必ずどれかに分類されるはずです。プログラミングのスタイルとして必ずこの様なコメントを書いて,この変数はどの様にして使われるのかを整理

しましょう。またサブルーチンに変数を渡す際には,変数 (引き数)を書く順番を決めておくと自分が後からプログラムを読んだ時に見易くなります。大抵は入力される変数を先に書き,次に変換される

変数を,そして最後に出力される変数を書くと良いです。

c---------

c main

c---------

Implicit none

Real a,b

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

Call calc(a,b)

Write(6,*)’a=’,a

Write(6,*)’b=’,b

End

Subroutine calc(op1,op2)

Implicit none

c Modified:

Real op1,op2

c Local:

Real temp1,temp2

temp1=op1

temp2=op2

op1=temp2

op2=temp1

Return

End

サブルーチンは分かり難く,最初は戸惑うと思いますが大切なので,下にさらに 2つの例を載せておきます。

c---------

24

Page 25: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

c main

c---------

Implicit none

Real a,b

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

Call calc(a,b,2.0) <---引き数に数を書いても良い。

End

Subroutine calc(op1,op2,op3) <---op3には 2.0が代入される。

Implicit none

c Input:

Real op1,op2,op3

Write(6,*)’a=’,op1

Write(6,*)’b=’,op2

Write(6,*)’op3=’,op3

Return

End

さらにもう一つの例です。

c---------

c main

c---------

Implicit none

Real a,b,c,d,ans

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

Write(6,*)’c=’

Read(5,*)c

Write(6,*)’d=’

Read(5,*)d

Call calc(a,b,ans)

Write(6,*)’answer=’,ans

Call calc(c,d,ans) <---この様に違う変数を入れて何回も使える

25

Page 26: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Write(6,*)’answer=’,ans

End

Subroutine calc(op1,op2,op3)

Implicit none

c Input:

Real op1,op2,op3

op3=op1+op2

Return

End

以上は一つのファイルの中にサブルーチンを同時に書いた例です。実はサブルーチンはサブルーチン

で別のファイルネームで格納しておく事もできます。本来はこの様にサブルーチンはサブルーチンで

一つのファイルとして格納しておいた方がいいのですが,慣れないうちは,以上の例の様にメインプ

ログラムの下に書いておいても構いません。もし興味のある人は UNIXの本を読んでみて下さい。(問題)2次元のベクトルを回転させるサブルーチンを製作せよ。invector(1),invector(2)が入力されるベクトルで,thetaが回転角とし,計算されて戻ってくる値は outvector(1),outvector(2)としてプログラムを組め。

5.12 Common文

Common文は大きなプログラムを書く時には必要とされますが,500行以内のプログラムでは必要ありません。逆に混乱を招く元なので初心者のうちは使う事を勧めません。しかしながら複雑なプロ

グラムを書いたり、プログラム中でよく参照されるデータを保存しておく場合には、便利な方法とな

ります。一応以下に Common文の例を示しておきます。またなぜ Common文が混乱を招くかを説明しておきます。

c----------

c bad sample

c----------

Implicit none

Real a,b

Real c

Common/test/a,b <---Common Blockとして testを定義する。

testには aと bという変数が存在する。

Write(6,*)’a=’

Read(5,*)a

Write(6,*)’b=’

Read(5,*)b

Call calc1

Call calc2(a,b,c)

Write(6,*)’c=’,c

End

26

Page 27: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Subroutine calc1

Implicit none

c Input:

Real a,b

Common/test/a,b <---Common Blockとして testを定義する。

testには aと bという変数が存在する。

a=1.0

b=2.0

Return

End

Subroutine calc2(a,b,ans)

Implicit none

c Input:

Real a,b

c Output:

Real ans

ans=a+b

Return

End

以上のプログラムの例でメインプログラムだけを見て,入力した a,bという数がどこのサブルーチンに渡っているか分かる人はいますか? いるはずはありません。なぜならメインプログラムからサブルーチンを呼ぶ時に,何がサブルーチンに送られるか書かれていないからです。つまり Common文を使うと,変数がどのサブルーチンを通っていくのかが全く見えないプログラムになってしまいます。この例

はおおげさですが,プログラムを読んでいたり,また直そうと思った時にこれが一番問題になります。

またサブルーチンと言うのは,別なメインプログラムにつなげる可能性もあるので,なるべくそれ自

体独立していた方がいいものです。しかし Common文が入っていると,その独立性が失われます。ですからなるべく Common文を使わずに,引き数を使ってサブルーチンに変数を渡す様にしましょう。(Common文を使うという事は,以下の様にたとえられます。夜間に大学に入ってくる人間をしっかりチェックしたいため門の所に人を立てていたら,トイレの窓から入られたという感じです。この場合大

学がサブルーチンにあたり,人がサブルーチンに渡る変数です。そして Common文は窓に相当するのです。)

5.13 プログラミングスタイルのまとめ

以上で説明したプログラムの中でプログラミングスタイルに関するもので大切なものをまとめてみ

ました。

1.読みやすいプログラムを書く様に心掛けよ2. Implicit noneは必ず書け

27

Page 28: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

3. If文や Do文で囲まれる領域は字下げせよ4. goto文は多用するな5.定数は大文字で書け6. Parameter文をなるべく使うようにせよ7.サブルーチンは単機能のものをなるべく作れ8.サブルーチンで使われる変数をきちんと分類せよ9. Common文は小さいプログラムには使うな

6 フォートランの中級編

ここでは、以上で学習したことに加えて新しい文法や手法を紹介します。基礎的なプログラムが書

けるようになったら、以下の文章を読んでみて下さい。この章を読み通して、実際に学習すれば、大

抵の問題をフォートランプログラムで書くことができます。

6.1 初期化

6.1.1 初期化の例 1

以下のプログラムを読んでみて下さい。

c-------------------------

c Example 1 of initialization

c-------------------------

Implicit none

Integer first/1/,i

Integer sum/0/

Do i=first,first+10

If(mod(i,2).eq.1) Then

sum=sum+i

End If

End do

Write(6,*)’sum=’,sum

End

以上のプログラムは、1から 11までの間の数のうち、奇数であればそれを足し算していくというプログラムです。まず目新しいのは、first/1/とかいう書き方だと思います。この様に書くと、最初に firstには 1という数が代入される事になります。また同様に sum/0/であれば、最初に sumには 0が代入されている事になります。その様に考えると最初に firstは 1だから Do文の繰り返しは、1から 11までという事になります。また mod(i,2)という文章がありますが、これは iという数を 2で割ったときに、余りを計算せよという関数です。またこのプログラムは以下のようにも書けます。

c-------------------------

c Example 1 of initialization

c-------------------------

28

Page 29: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Implicit none

Integer first/1/,i

Integer sum/0/

Do i=first,first+10,2 <---Do文の変形

sum=sum+i

End do

Write(6,*)’sum=’,sum

End

この例で新しいのは Do文に新しく,2という部分が加わりましたね。この場合には、Do文が回る際に、iの数は 1,2,3,4,5という様に変化するのではなく、1,3,5,7という様に 1つおきに変えなさいという事を意味します。また,3とすれば 1,4,7,....という様に iの値が変わっていきます。

6.1.2 初期化の例 2

以下の例も初期化を行う例ですが、以前よりちょっと複雑です。以下の例は 1から 10まで足し算するプログラムですが、sumの値を以前のような形で初期化していません。初期化しているのは、Do文の中でです。最初 firstという変数は 1なので、Do文の中の If文の条件は満たされます。しかし If文に入ったとたん、firstという変数は 0に変えられてしまいます。従って、2度目からは If文の中は実行されません。この様に 1度だけ何かを実行させたい場合にこの書き方は非常に強力です。この使用例は余りにも簡単な例ですが、実際にはサブルーチンとかでしょっちゅう使います。つまり初めてサブ

ルーチンに入ったときだけ、ある値をセットしたい場合などです。

c-------------------------

c Example 2 of initialization

c-------------------------

Implicit none

Integer first/1/,i

Integer sum

Do i=1,10

If(first.eq.1) Then

sum=0

first=0

End If

sum=sum+i

End do

Write(6,*)’sum=’,sum

End

6.1.3 初期化の例 3

配列の様なものの初期化はどの様にすればいいでしょうか。以下の例を見て下さい。

29

Page 30: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

c--------------

c Example of Data

c--------------

Implicit none

Integer delta1(10)/1,2,3,4,5,6,7,8,9,10/

Real delta2(10)/10*0.0/

Real delta3(10)/5*1.0,5*2.0/

Integer i

Real delta4(3)

Data (delta4(i),i=1,3)/1.0,2.0,3.0/

Write(6,*)’dalta1(5)=’,delta1(5)

Write(6,*)’delta2(5)=’,delta2(5)

Write(6,*)’delta3(2)=’,delta3(2)

Write(6,*)’delta3(8)=’,delta3(8)

End

上の例では、delta1という 10個の 1次元配列の各要素を 1,2,...10という様に初期化している例です。また delta2も delta1と同様の配列ですが、上のように書いておくと 10個の変数がすべて 0.0に初期化されます。この様に、初期化する個数にかけ算の記号を書いて、そして初期化するべき値を書けば、

同じ数で初期化する場合には、非常に便利です。また delta3の初期化は、delta1の初期化と delta2の初期化の複合みたいなものです。delta4の初期化の方法は Data文というものを使っています。Data文は色々な書き方があるので、詳しくはフォートランのマニュアルを参照して下さい。

6.1.4 初期化の例 4

さらに以下の例は複雑で、Entry文というものを使用しています。この方法を体得すると、サブルーチンで使われるローカルな変数の初期化が非常に簡単に行えます。ただし Entry文は色々な規則があるので、詳しくはフォートランの本を読んでみて下さい。

c-------------------------

c Example 4 of initialization

c-------------------------

Implicit none

Integer sum

Call ini_calc()

sum=0

Call calc(sum)

Write(6,*)’sum=’,sum

End

Subroutine calc(sum)

Implicit none

30

Page 31: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

c Modified:

Integer sum

c Local:

Integer i,first

Save first

Do i=first,first+10

If(mod(i,2).eq.1) Then

sum=sum+i

End If

End do

Return

Entry ini_calc()

Write(6,*)’first=?’

Read(5,*)first

Return

End

上の例は、例 1と全く同じ事を行うプログラムを Entry文という初期化の手法を使って書いてみたプログラムです。まずメインプログラムから、ini calcというルーチンが呼ばれます。この場合引数は何もありません。ini calcの中身は、実はサブルーチン calcの下の方に書いてあります。メインプログラムから制御は、Entry文の所に移ります。そして、そこで firstの値を自分でキーボードから代入することになります。firstに代入された値は、Save文で保存しておくようになっています。そして代入が終わると、Return文により、制御はメインプログラムに移ります。そして今度は、メインプログラムでは、calcというサブルーチンが呼ばれます。calcは、1から 11までのなかで奇数だけを足し算していって、sumという値を代入します。計算が終わったら End do文の次の Return文により、制御はメインプログラムに移ります。そしてメインプログラムで sumの値は、ディスプレイに表示されます。この様に最初にサブルーチンの中で使われる変数を Entry文を使って初期化するというのは、大きなプログラムを書く際には非常に効力を発揮します。このプログラムを Entry文を使わないで、サブルーチン calcを生かしたまま使用すると、calcというサブルーチンの引数として、firstを書かなくてはいけません。しかしそれは、プログラムが複雑になると案外嫌になってくると思います。大体、firstという変数は、メインプログラムには関係が無いのだから、calcというサブルーチンの中だけで定義されているという方が綺麗なプログラムになります。Entry文とは、サブルーチンの任意の場所に入り口を設けるために使用する手段として非常に有効です。

6.2 他の定義文

今までは、Integer,real,Characterの 3種類の定義文を紹介しましたが、それ以外にも定義文は存在します。

6.2.1 複素数の取り扱い

以下のプログラムの一部を見て下さい。これは複素数を扱っている例です。

31

Page 32: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

c-------------------

c example of definition

c-------------------

Implicit none

Complex im1,im2

Real a

a=1.0

im1=(1.0,2.0)

im2=(3.0,4.0)

Write(6,*)im1+im2

Write(6,*)real(im1)

Write(6,*)aimag(im2)

Write(6,*)cmplx(a)

End

最初に複素数 im1と im2を定義しています。また im1や im2に実際の値を代入するには、a=1.0の次の文のように行います。real()という関数は、複素数の実数部分を取り出す関数です。また aimag()は複素数部分を取り出す関数です。また cmplx()は実数を複素数に変換する関数です。

6.2.2 倍精度実数

実数の定義は realという定義文を使いますが、よりもっと精度のいい計算をやりたい場合には realで変数を定義するのは得策ではありません。realで定義された変数には小数点以下 7桁程度までしか正確な値を格納できないからです。精度が必要な計算には、以下のような倍精度実数を使います。以

下の例を見て下さい。

c-------------------

c example of definition

c-------------------

Implicit none

Double Precision a

Real b

a=1.0/3.0

Write(6,*)a

b=1.0/3.0

Write(6,*)b

End

上のプログラムで aと bという変数の値を画面に打ち出していますが、aの方が小数点以下をもっと沢山計算していることが分かるでしょう (有効数字 15桁)。

32

Page 33: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

6.2.3 理論型変数

プログラムを組んでいる際に、正しいか正しくないかという様な 2つの状態を持つ場合がしばしば存在します。その様な場合には、理論型の変数を使うと便利な場合があります (ただし筆者はあまりこの変数は好きでない)。以下の例を見て下さい。このプログラムは、前の章に出てきた初期化に関する事を論理型変数で実行している例です。プログラム自体は 1から 10まで足し算しなさいという簡単なプログラムです。

c-------------------

c example of definition

c-------------------

Implicit none

Logical judge/.TRUE./

Integer i,sum

Do i=1,10

If(judge) Then

judge=.FALSE.

sum=0

End If

sum=sum+i

End do

Write(6,*)’sum=’,sum

End

まず最初の定義文で Logicalというのが出てきます。いま理論型変数としてここでは judgeという変数を定義しています。理論型変数は、.TRUE.か.FALSE.の 2つの値しか取ることができません。以上の例では最初 judgeという変数は.TRUE.という値を持たせて初期化しています (初期化の章を参照)。Do文すぐ次の If文で judgeが.TRUE.か.FALSE.かを判断しています (この様に論理演算子を使うと、If文のカッコの中に 1つの変数だけを書くことができる)。もし judgeが.TRUE.なら If文の中身が実行されます。

6.3 行列の受け渡し

物理の問題を解く際には、行列をしばしば使用することがあると思います。この便利な扱い方をこ

こでは説明します。

6.3.1 配列の回し方

まず配列の基本的な事を学習するために、以下の 2つのプログラムを見て下さい。2つとも、それぞれ a(100,100,100)という行列の要素をゼロにするプログラムです。

c-------

c test1

c-------

Implicit none

33

Page 34: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Integer i,j,k

Real a(100,100,100)

Do i=1,100

Do j=1,100

Do k=1,100

a(i,j,k)=0.0

End do

End do

End do

End

c-------

c test2

c-------

Implicit none

Integer i,j,k

Real a(100,100,100)

Do k=1,100

Do j=1,100

Do i=1,100

a(i,j,k)=0.0

End do

End do

End do

End

2つのプログラムは一見してほとんど同じです。違いは Do文の変数の回し方だけです。どちらが計算が速く終わるでしょう? 答えは test2というプログラムの方です (ただしフォートランのオプティマイザーがちゃんとしていると変わらないかもしれない)。計算機の内部では,100×100×100のメモリー領域を

a(100,100,100)のために確保します。その時に計算機内部では次のようにメモリーを確保するのです。a(1,1,1),a(2,1,1)....a(100,1,1),a(1,2,1),a(2,2,1).....a(100,100,1), a(1,1,2).... つまり計算機内部では a(1,1,1)と a(2,1,1)のメモリー領域ははすぐ隣に並んでいます。しかし a(1,1,1)と a(1,1,2)は非常に離れているのです。test2のプログラムだと一直線にメモリー領域の書き込みを行いますが,test1だとメモリー領域を行ったり来たりしながら書き込みが行なわれます。従って test2の方が効率が良いのです。これをフォートランは内回りと呼びます。つまり行列に値を詰めていく時には,必ず内側の変数から詰めて

いくようにすべきなのです。

34

Page 35: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

6.3.2 整合配列 1

次に整合配列というものを学習しましょう。以下のプログラムを見て下さい。

c-------

c seigou1

c-------

Implicit none

Integer DIM

Parameter (DIM=100)

Real a(DIM,DIM)

Call calc(DIM,a)

Write(6,*)’a(50,50)=’,a(50,50)

End

c---------

c Calc

c---------

Subroutine calc(youso,hairetsu)

Implicit none

c Input:

Integer youso

c Modified:

Real hairetsu(youso,youso)

c Local:

Integer i,j

Do i=1,youso

Do j=1,youso

hairetsu(j,i)=i+j

End do

End do

Return

End

まずメインプログラムで aという 100行 100列の行列が Parameter文を使って定義されています。この行列をサブルーチンに送るときに、Call文では、その配列の要素数と配列の名前の両方が引数として書かれています。また受け側のサブルーチン calcでは、各々の値を yousoと hairetsuという変数で受けています。そして定義の箇所で、以下のようにしていますね。

c Modified:

Integer youso

Real hairetsu(youso,youso)

35

Page 36: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

この様に行列と行列の要素を同時にサブルーチンの引数として渡す方法を整合配列と呼びます。この手法

は非常に便利です。整合配列の場合、サブルーチンの中身を見てみると分かりますが hairetsu(youso,youso)というのは,メインプログラムから数字を渡されるまでは,その行列要素をどの程度取ったらいいの

か分かりません。それでもフォートランは動くのです。

例えば以下の例は整合配列を使わなかった場合の例ですが、良いプログラムではありません。この

プログラムの問題点は、もし aという行列の配列要素を 100から 200に取り替えたいとした場合を考えてみましょう。その場合には、下のプログラムでは、メインプログラムの 100という値を 200に書き換えると同時に、calcというサブルーチンの yousoという定義の所も 100から 200にしなくてはいけません。頻繁にプログラムを書き換えるのであれば、書き換える箇所は最低限にとどめるように最

初から設計をすべきです。整合配列を使っておけば、書き換えるのはメインプログラムの所だけで済

みます。

c-------

c Bad example

c-------

Implicit none

Integer DIM

Parameter (DIM=100)

Real a(DIM,DIM)

Call calc(a)

Write(6,*)’a(50 50)=’,a(50,50)

End

c---------

c Calc

c---------

Subroutine calc(hairetsu)

Implicit none

c Modified:

Integer youso

Parameter (youso=100)

Real hairetsu(youso,youso)

c Local:

Integer i,j

Do i=1,youso

Do j=1,youso

hairetsu(j,i)=i+j

End do

End do

Return

36

Page 37: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

End

6.3.3 整合配列 2

以下に整合配列のサンプルプログラムは,かなり高度なプログラムです。このプログラムはかなり計

算機の事を知らないと書けませんが、原理が分かれば非常に柔軟なプログラミングが可能になります。

c-------

c seigou

c-------

Implicit none

Integer DIM

Parameter (DIM=10)

Real a(DIM,DIM), b(DIM,DIM,DIM)

Call init(a,DIM*DIM)

Call init(b,DIM*DIM*DIM)

End

Subroutine init(matrix,n)

Implicit none

c Input:

Integer n

Real matrix(n)

c Local:

Integer i

Do i=1,n

matrix(i)=0.0

End do

Return

End

このサブルーチンは行列の初期化のサブルーチンですが、どんな次元の行列でも初期化する事ができ

るサブルーチンです。aや bが 2ないし 3次元の行列なのに,受け側のmatrixという行列が 1次元の行列である事は不思議に思うかもしれません。(初心者のうちは,この様な書き方はしないでください)それは、フォートランでメインプログラムから、サブルーチンに行列の値を渡すときに、実はメイン

プログラムは、その行列の先頭の値が格納されている計算機内部での場所 (アドレス)と、その場所から行列の要素が幾つあるかだけを渡しています。つまり上の例では、aという行列名は、実は aという行列の先頭のアドレスの場所を意味しています。そしてサブルーチン側では、aというのを matrixという配列名に置き換えます。次にメインプログラムで DIM*DIMという数が、その配列の要素数で、それは nとしてサブルーチンは読みます。例えば例を挙げるとメインプログラムで、a(50,50)の値は、サブルーチン側では matrix(2500)に渡されることになります。フォートランプログラムでは実はコン

37

Page 38: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

パイラーは、1次元だろうが 2次元だろうが、配列は全て同じように解釈します。上の例はその性質を利用したプログラムです。

6.4 文字制御

フォートランプログラムでは、時たま文字を扱う事があります。そこで文字に対する基本的な事柄

や、文字制御の関数をここでは紹介します。まず復習として、文字定数と文字変数に関して学びましょ

う。文字変数とはある文字列を格納する入れ物です。この様な文字変数は、必ず上の定義を書く場所

で定義を行なうようにするべきです。文字変数の定義は、Character文で行います。また文字定数とは文字そのものです。以下の例を見て下さい。

c--------------------

c Example of Character

c--------------------

Implicit none

Character*10 chara1/’test’/,chara2

Character*20 chara3

Integer i

chara2=chara1

Write(6,*)chara2

chara2=’ example ’

Write(6,*)chara2

Do i=1,10

Write(6,*)chara2(i:i)

End do

chara1=’I am ’

chara2=’a boy.’

chara3=chara1//chara2

Write(6,*)chara3

Write(6,*)’I am ’//’a boy.’

End

まずこのプログラムでは最初に、10文字の文字が格納できる chara1と chara2という文字変数を定義しています。さらに chara1の初期値は、testという文字である事を意味します。今まで Integer first/1/という様な初期化の方法を勉強しましたが、文字変数をある文字で初期化する際には、必ずクオーテー

ションで囲む必要があります。つまりクオーテーションで囲まれたものは変数ではなく定数であるとみ

なすルールがあるのです。次の行では chara3という 20文字格納できる文字変数が定義されています。そして実行文の箇所の先頭では chara1の値を chara2に代入していますね (あくまで文字変数 chara1を代入しているので、この場合にはクオーテーションで囲んではいけません)。そして chara2という文字変数の中身を画面に打ち出しています。プログラムを動かせば、画面には testという文字が出てくるはずです。次に chara2に exampleという文字を代入していますが、exampleという文字の前に

38

Page 39: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

はスペースが入っていることに注意して下さい。その場合 chara2を画面に打ち出すと、最初にスペースが入ってから exampleという文字が画面に現れます。次には Do文がありますが、chara2(i:i)とはchara2に格納されている文字の第 i番目の文字を意味します。従ってこのプログラムを動かすと、最初にスペースが、次に eという 1文字が、さらに xの 1文字が画面に現れることになります。Do文の次には、chara1と chara2にそれぞれ文字を代入しています。そして次の文で chara1と chara2の間に//という記号が出てきます。この記号は、chara1と chara2に代入されている文字を連結することを意味します。chara3を打ち出してみると分かりますが、画面には「I am a boy.」という様に amと aの間にスペースが入っているのが分かると思います。これは chara1は 10文字分の領域を取っているために、実は chara1には I am の後に 6文字分のスペースが挿入されていることが分かります。最後に単純に’I am ’//’a boy.’とした場合には、I am a boy.と予想通りの結果が得られました。また文字を扱う組み込み関数というのも存在します。例えば、len(chara1)という様な組み込み関数 lenは chara1が幾つの文字を格納できる文字変数かを教えてくれる関数です。その他にも index、ichar、charといった組み込み関数があります。もし凝った文字制御を行いたい場合には、フォートランの本を参考にし

てみて下さい。

6.5 フォーマット文等の打ち出し制御

6.5.1 Write文のテクニック 1

今までは、計算結果等を画面に表示させるときに、全部計算機にまかせていましたが (Write(6,*)の*印に当たる)、自分で打ち出し方を指定したい場合もあります。以下のプログラムを見て下さい。

c----------

c Format 1

c----------

Implicit none

Integer i

Integer dat(10)/1,2,3,4,5,6,7,8,910/

Write(6,*)(dat(i),i=1,10)

Do i=1,10

Write(6,*)dat(i)

End do

End

上のプログラムではまず datという 1次元の配列に 1から 10までの数字が詰め込まれています。それを直ぐしたのWrite文で書き出していますが、この様な書き方をすると 10個の数が 1行に並んでくれます。また次の Do文の様な書き方をすると、1行に 1つの数字が表示されることになります。この例はWrite文の例ですが、Read文にもこの書き方は応用できます。もし Do文を使わないような場合には、一つの行にそれぞれの数字をスペースで区切って 10個並べて書くと、ちゃんと 10個の数字を読み込んでくれます。

39

Page 40: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

6.5.2 Write文のテクニック 2

今まで、画面から何かしらの値をプログラムに与える際には、Write文の次に Read文を書かせて数字を読み込ませましたが、Write文が終わると改行されて、気持ちが悪かったかもしれません。これを回避する方法を以下に示します。

c----------

c Format 2

c----------

Implicit none

Integer i

Write(6,*)’i=?’

Read(5,*)i

Write(6,*)’i=’,i

Write(6,’(’’ i=? ’’,$)’)

Read(5,*)i

Write(6,*)’i=’,i

End

上のプログラムを実行すると分かるのですが、最初の部分は今までと同じ入力方法でした。しかし次

の入力方法では、i=?という文字が出た後に改行されませんよね。確かにこの方が気持ちがいいです。そこでかっこいい入力を行わせるためには、以上の様な方法が便利です。とにかく、今までWrite(6,*)の星印の所を、’(” 表示したい文字”,$)’で置き換えると覚えておいて下さい。ここで注意が 2つあります。一つはワープロの画面では分かりにくいと思うので、注意すると上のクオーテーションマーク

はすべてシングルクオーテーションマークです。もう一つは、自分が表示したい文字とその前にある

2つのシングルクオーテーションマークの間に必ず 1つのスペースを入れるということです。このスペースを入れないと、正しく文字が表示されない場合があります (これはフォートランコンパイラーに依存するため、正しいプログラミングスタイルとしては、ちゃんとスペースを空ける癖を付けた方が

無難です)。

6.5.3 Write文中での書き出しの指定

以下のプログラムを見て下さい。今までのWrite文の星印が、変な数字で置き換わっていますね。

c----------

c Format 3

c----------

Implicit none

Integer i/20/,j/50/

Character*10 chara1/’test’/

Write(6,’(I2,2X,I2,2X,A)’)i,j,chara1

40

Page 41: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

End

Write文の星印の代わりに書かれているものは、画面に数字や文字を打ち出す場合にどの様に打ち出すかを示した文です。まずこの様な指定を行う際には、’(と)’の間に書く規則があります。この中身を順番に見ていくと、I2の Iとは Integerつまり整数を表します。2は 2桁という意味です。つまり最初に整数 2桁を打ち出せといういう意味です。そして次に 2Xとありますが Xは空白を示し、2はその空白の数を示します。Aというのは文字を表します。つまりこの部分は、整数 2桁書いた後、空白を 2つ入れて、その後にまた整数 2桁と空白 2つを入れて、最後に文字を書き出せという事を意味しています。最初の I2は iに当たり、次の I2は jの値を書き出すのに使用されます。また Aは当然 chara1の文字を書き出すことを意味しています。この様にして自分の好きなフォーマットで画面に文字を書

き出すことができます。この様な Iや Xや Aなどを編集記述子と言います。その他にも沢山の編集記述子がありますが、それ以外によく使うものは、以下の Fというものです。これは実数を書き出す場合に使います。以下のプログラムを見て下さい。

c----------

c Format 4

c----------

Implicit none

Real a/20.3265/,b/50.19439/

Write(6,’(F5.2,2X,F6.2)’)a,b

Write(6,’(F7.3,2X,F8.5)’)a,b

End

この例では、aと bを編集記述子 Fの規則に従って画面に書き出すわけですが、F5.2とは全体で小数点も含めて 5つの文字を書き出しなさい。そして小数点以下 2桁まで書き出しなさいという事を意味します。次に 2Xでスペースを 2つ空けて、そして今度は小数点を含めて 6文字を打ち出しなさい。そして小数点以下は 2桁まで表示しないさいという事を意味します。次のWrite文もそれに準じた動作をします。

6.5.4 フォーマット文

以上と同じ事をフォーマット文を使って書いてみましょう。以下のプログラムを見て下さい。これ

は以前のプログラムと全く同じ動作をします。

c----------

c Format 5

c----------

Implicit none

Integer i/20/,j/50/

Character*10 chara1/’test’/

Write(6,100)i,j,chara1

100 Format(I2,2X,I2,2X,A)

41

Page 42: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

End

この例では、今まで編集記述子が書かれていた場所に 100という数字が書かれています。また次の行に 100と最初番号が打ってあって、Formatという文章が書かれています。ここに編集記述子が書かれています (ただしこの場合には’(と)’はない)。この様にすると以前と全く同じ動作をしてくれます。この 100番という番号は、2列目から書き始めるという規則があります。またこの Format文は、Write文の直ぐ後にかいておく必要はありません。宣言文の前であれば、好きな部分に書けます。また 1つの Format文を書いておき、2つ以上のWrite文がそれを同時に参照する様にすることもできます。例えば以下のような例です。

c----------

c Format 6

c----------

Implicit none

Integer i/20/,j/50/

Character*10 chara1/’test’/

Write(6,100)i,j,chara1

100 Format(I2,2X,I2,2X,A)

i=13

j=17

chara1=’temp’

Write(6,100)i,j,chara1

End

6.6 Common文を使った巨大なプログラムの構築方法

以前に書いたように、Common文は 500行を越えるようなプログラム以外では、あまり使用しないと書きました。そこで 500行を越えるようなプログラムのさわりを解説して、その中で Common文をどの様に使用するか、その場合、プログラミングスタイルとしてどの様なものを採用したら良いかを

簡単に説明してみます。以下のプログラムは、筆者が研究のために開発しているプログラムの一部で、

メインプログラムが以下のものです。このプログラムは、キャピラリープレートと呼ばれる新しい検

出器から得たデータを解析するプログラムです。この生データには X線がガス中で吸収された折りに出てくる電子の飛跡の様子をデジタルカメラで撮影したような感じで、デジタル的な画像データが保

存されています。このデータを基にこの最初に飛び出す電子がどちらの方向に飛び出したかを判定す

るのがこのプログラムの目的です。一見して分かることは、ほとんどが Call文で構成されているという事でしょう。つまりメインプログラムには、思考の大まかな流れしか書かないのが普通です。従っ

て細かいことは、すべてサブルーチンにまかせてしまうという様な構造でプログラムを書きます。実

は全体的には、全てのサブルーチンを合わせるとこのプログラムは 1万行程度に及ぶのですが (実際筆者が書いたのは 2千行程度で、それ以外はヨーロッパの CERNという加速器物理の研究所等で開発されたサブルーチンを使わせてもらっている)、メインプログラムをざっと見ると、その様な巨大なプログラムには見えないはずです。従って後からプログラムを読む人も、それほど苦労無くプログラムを

読めるように工夫しています。

42

Page 43: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

c--------------------

c CAP full analysis

c-------------------

C Implicit none

Common /PAWC/ H(950000)

Include ’cluster.inc’

Integer DATADIM

Parameter (DATADIM=100)

Integer istat

Integer numfile,i,j,k

Real capdata(DATADIM,DATADIM),smcapd(DATADIM,DATADIM)

Integer flag(DATADIM,DATADIM)

Real length,polar,total_light

Integer evt_flag

Character*60 outfile/’cap1.hbk’/

C

C ... initialize

Call Hlimit(950000)

C

C ... booking

Do i=1,87

Call Hbook2(i,’x-y’,100,0.0,100.0,100,0.0,100.0,0.0)

End do

C ........Start

Call Intrd(’input number of files’,numfile)

Call ini_thresh()

Call ini_smooth()

Call ini_roundsea()

Call ini_que_clust()

Call ini_area_thresh()

Call ini_turtlewalk()

Do i=1,numfile

Call readcapd(DATADIM,capdata)

Call thresh(DATADIM,capdata)

Call smooth(DATADIM,capdata,smcapd)

Call roundsea(DATADIM,smcapd,flag)

total_light=0.0

Do j=1,cl_count

total_light=total_light+infoclust(4,j)

End do

End do

43

Page 44: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

C ... store to file

Call Titrd(’Input output filename’,outfile)

Call Hropen(20,’EXAMPLE’,outfile,’N’,1024,istat)

Call Hrout(0,icycle,’ ’)

Call Hrend(’EXAMPLE’)

C

Close(Unit=20)

C

Stop

End

まずプログラムの大まかな流れを説明しましょう。メインプログラムの中で、Startというコメント文がある場所から、実際のプログラムの流れが始まっています。まず最初にデジタル的な画像ファイ

ルが一体何枚あるのかを、キーボードから打ち込むようになっています。そしてその枚数が numfileという変数に読み込まれます。それが以下の一文です。

Call Intrd(’input number of files’,numfile)

Intrd(Integer Readの略で整数を読み込むルーチン)というのは、バークレイ研究所で開発されたサブルーチンで、その後、東京大学を中心に UNIXマシンに移植されたサブルーチンの 1つです。その後、iniで始まるサブルーチンが 6つ並んでいますが、それらはすべて後で呼ばれるサブルーチンの変数を初期化するためのルーチンを呼んでいます。実はこれら全てはそれぞれのサブルーチンに書かれてい

る Entry文を呼んでいます。ここまでで、全てのサブルーチンの初期化が完了します。次に Do文がありますが、そこで 1枚 1枚の画像データの解析を順番に行います。Do文の中では、次に readcapdというサブルーチンが呼ばれていますが、これは実際の画像のデジタルデータを 2次元の配列に読み込むためのサブルーチンです。この引数には、DATADIM,capdataという 2つの変数が書かれていますが、これは整合配列を使用した例です。その後に、thresh、smoothというサブルーチンがありますが、これらは画像データ中のノイズを落として、信号部分を取り出し、画像をスムースに変換する役割を

するサブルーチンを呼んでいる箇所です。そして roundseaというサブルーチンが呼ばれていますが、これは 1枚の画像データに、幾つかの画像が点在しているため、その点在しているものがどの座標にあり、どの程度の明るさを持ち、どの程度の大きさに広がっているかを計算している部分です。その

ルーチンを呼んだ後に、Do文があります。この Do文の中には、infoclust(4,j)という様な行列の変数がありますが、それはメインプログラムの定義の中には見あたりませんね。しかし前にも言ったとお

り、プログラム中で使用する変数は、必ず最初に定義するのが良いプログラミングスタイルです。実

はこの変数 infoclustこそ、今回のミソである Common文に深い関係があります。それではもう一度定義を行っている部分を見てみましょう。すると見慣れない宣言文として Includeという文を見つけることができるはずです。この文は、cluster.incという名前のファイルをこの位置に展開しなさいという事を意味しています。それではこの cluster.incというファイルの中身を見てみましょう。以下がそのファイルの中身です。

C Common Data Region

C INFONUM=1 : X in maximum light output

C INFONUM=2 : Y in maximum light output

C INFONUM=3 : Area of cluster

C INFONUM=4 : Total Light output

44

Page 45: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

Integer INFONUM,NUMCL

Parameter (INFONUM=4,NUMCL=200)

Real infoclust(INFONUM,NUMCL)

Integer cl_count

Common /cluster/infoclust,cl_count

このファイルの中身を見て分かるとおり、実は infoclustという行列は、このファイルの中で定義されていたのです。そして、この infoclustや cl count という変数は Common文によって、サブルーチンの引数として、サブルーチンに渡さなくても済むような構造を取っています。なぜサブルーチンの引

数として変数を渡さないで、Common文を使ったかというと、この変数は様々なサブルーチンで頻繁に使用されるため、このデータを引数として渡すと、非常に面倒な事になることが予想されたからで

す。また様々なルーチンから、頻繁にアクセスされる変数はデータバンクと呼ばれる事がありますが、

Common文で定義される変数は、この様なデータバンクにのみ使用されるのが普通です。ではこの clusterというデータバンクを他のサブルーチンで使用している例を見てみるため、roundseaというサブルーチンの中身をいかに示します。以下のプログラムの中で同様に定義を行うところで、

Include文で cluster.incというファイルを読み込んでいるのが分かると思います。この様に、Common文の定義は、一つのファイル (今の例では cluster.inc)にまとめておき、そのデータ (infoclustや cl count等の変数)を使いたい場合には、そのサブルーチンから Include文を使って呼び出すと、Common文での混乱が少なくなります。

c-----------

c roundsea

c-----------

Subroutine roundsea(DATADIM,smcapd,flag)

Implicit none

Real cont_th

Integer DATADIM,BUFDIM

Integer flag(DATADIM,DATADIM)

Real smcapd(DATADIM,DATADIM)

Parameter (BUFDIM=2000)

Integer first,count,pointer,smsize

Integer tempbufx(BUFDIM),tempbufy(BUFDIM)

Real templight(BUFDIM)

Integer i,j,k,m

Real area,light,peaklight

Integer peakx,peaky

Save cont_th

Include ’cluster.inc’

Do i=1,DATADIM

Do j=1,DATADIM

flag(i,j)=0

End do

End do

45

Page 46: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

cl_count=0

Do i=1+int(smsize/2),DATADIM-int(smsize/2)

Do j=1+int(smsize/2),DATADIM-int(smsize/2)

count=0

pointer=0

If((flag(i,j).eq.0).AND.(smcapd(i,j).ge.cont_th)) Then

Do k=1,BUFDIM

tempbufx(k)=0

tempbufy(k)=0

templight(k)=0.0

End do

count=1+count

tempbufx(count)=i

tempbufy(count)=j

templight(count)=smcapd(i,j)

flag(i,j)=1

10 Continue

pointer=pointer+1

Do k=tempbufx(pointer)-1,tempbufx(pointer)+1

Do m=tempbufy(pointer)-1,tempbufy(pointer)+1

If((flag(k,m).eq.0).AND.

& (smcapd(k,m).ge.cont_th)) Then

count=count+1

If(count.ge.BUFDIM) Then

Write(6,*)’Data is spilt from buffer’

Stop

End If

tempbufx(count)=k

tempbufy(count)=m

templight(count)=smcapd(k,m)

flag(k,m)=1

End If

End do

End do

If(pointer.lt.count) Then

goto 10

End If

area=float(count)

light=0.0

first=0

Do k=1,count

light=templight(k)+light

46

Page 47: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

If(first.eq.0) Then

peakx=tempbufx(k)

peaky=tempbufy(k)

peaklight=templight(k)

first=1

Else

If(peaklight.lt.templight(k)) Then

peakx=tempbufx(k)

peaky=tempbufy(k)

peaklight=templight(k)

End If

End If

End do

cl_count=cl_count+1

infoclust(1,cl_count)=float(peakx)

infoclust(2,cl_count)=float(peaky)

infoclust(3,cl_count)=area

infoclust(4,cl_count)=light

End If

End do

End do

Call que_clust()

Call area_thresh()

Return

Entry ini_roundsea()

Call Fltrd(’input contour threshold level’,cont_th)

Return

End

以上実際の巨大なプログラムの組み方に関して、簡単に説明しましたが、要点をまとめると以下の

ようになります。

• メインプログラムは、その思考の流れのみ記述して、細かい部分はサブルーチンに回すこと。

• なるべくすでに開発済みのサブルーチン群等を利用して、プログラムを構築する事。それによりプログラムの開発の手間も省け、確実なプログラムが構築できる。

• サブルーチンの初期化を行う際には Entry文が非常に強力な手段になり得る。

• 様々なサブルーチンで共通のデータにアクセスする場合には Common文を使用するとプログラムがすっきりする。

• Common文を使用する場合には、Common文で使用する変数や Common文の宣言は 1つの独立したファイルに書いておき、必要なサブルーチンで Include文を使用して、定義を行うように

47

Page 48: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

する。

7 フォートランの問題 (初級者用)

ここでは今まで勉強した事を生かして,フォートランのプログラムを組む練習をしてみましょう。以

下の 2つの問題をフォートランプログラムを使って解いてみて下さい。もしなかなか解けなくても精一杯考えて下さい。それから参考書を調べるのならそれなりに力が付くと思います。最初から答えを

見るのでなく,まず自分で考える習慣をつけましょうね!

7.1 2次方程式の解

これは If文の練習問題です。Ax2 + Bx + C = 0という式の xの解を求めてみて下さい ( A,B,Cの値はキーボードから自分で打ち込めるようにしておいて下さい)。この問題を扱うには虚数ををフォートランでどの様に扱ったらいいかが問題となりますが,虚数の扱い方は自分でフォートランの教科書

を読んで学んでみて下さい。マニュアルを読んで理解するのも勉強のうち!!

7.2 最小二乗法プログラム

学生実験で実験データを取った後に,これを最小二乗法でフィッティングするという事は頻繁にお

こります。そこでデータを与えると,自動的に計算機がフィッティングしてくれたらどんなにいいで

しょう... では自分でプログラムを作ってみましょう。最小 2乗法についてはすでに実験学の授業で習っていると思うので説明はしませんが,念のために

簡単な概念を説明しておきます。図 1を見て下さい。図 1は幾つかのデータを直線でフィットした図です。最小 2乗法とは,図の中で以下の式 1の Dを最小にしてくれる様な直線を求めるという事です。

直線の場合,傾きと切片の 2つが決まれば直線は決定できます。従って直線の傾きと切片という 2つの変数を変化させていき,式 1の値を最小にする傾きと切片求めるという事です。従って偏微分によって最小値を求める問題に帰着します。

D = (d1)2 + (d2)2 + (d3)2 + (d4)2 + (d5)2 + (d6)2 (1)

7.2.1 直線でフィット

まず一番簡単な直線でのフィッティングプログラムを作ってみましょう。プログラムの仕様は,以下

の様にして下さい。

1.まず読み込むべきデータの数を計算機に入力する。2.キーボードからデータの xの値と yの値を入力する。3.計算機の画面にフィットした直線の傾きと切片を打ち出す。

7.2.2 ファイルからのデータの読み込み

前のセクションでキーボードからデータを打ち込む所を,ファイルからでもデータを入力できるよ

うにしましょう。そのためプログラムを動かした時に,データをキーボードから入力するのかファイ

48

Page 49: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

図 1: 最小 2乗法の概念図。バツ印がデータ点でバツ印から直線までの距離を d1...とする。直線はフィッティングの結果

ルから入力するかを計算機が尋ねて来る様なプログラムを作りましょう。

7.2.3 指数関数,ベキ型関数でのフィット

直線だけでなく,指数関数やベキ型関数でのフィッティングもできる様にしましょう。そのため計算

機を動かした時点で,どの様な関数でフィットするかを,計算機が尋ねて来る様な構造にしましょう。

8 計算機を物理の問題に応用する

ここから先は,具体的な物理の問題を計算機を使って解いてみましょう。その際に結果を画面にグ

ラフで打ち出したいので,topdrawというソフトを使います。使い方は,付録に載せてあるので,それを参考にして下さい。

8.1 線形回路の応答を調べる

物理学実験で微分回路や積分回路の応答に関して勉強したと思います。これをフォートランを使っ

て応答を調べる事をここでは実習してみたいと思います。積分回路の図を以下に示します。時刻 t=0の時にスイッチを入れた場合に,時刻 tにコンデンサーの両端にかかる電圧をフォートランプログラムで調べてみましょう。実際微分回路の応答を調べるには,数学的には微分方程式を解けばいい訳で

す。つまり結局この実習では微分方程式を数値的に解く方法を学ぶ事になります。では微分方程式を

49

Page 50: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

R ( 1 0

k

)

C ( 1 m

i

c

r

o

) V

( 出

)

t = 0

0 V

1 V

入 力

図 2: 積分回路の図

どの様にしたら解く事ができるでしょうか? 例として以下の微分方程式を考えましょう。dV

dt= f ′(t) (2)

そして t=0.0で V の値は 0.0であるという初期条件がかされているとします。この場合には次のようにして考えます。まずある時刻での V の値が分かっていると,ちょっと時間が経った場合その時間で

の V の値は,次の図の中に示された式によってと求める事ができます。この方法により,初期条件で

与えられた値から順に点をつないでいけば,微分方程式の解をグラフとして求められる事になります。

原理が分かったところで,実際に上の積分回路の時間に対する応答をグラフで書いてみて下さい。グ

ラフ化する場合には,topdrawというソフトを使って行えます。付録の説明を読んでみて下さい。

8.2 電気力線を書いてみる

今下の図のような状況を考えてみましょう。その場合に空洞内のポテンシャルはどのようになるで

しょうか? この図で与えられているのは,芯線の電位とその箱の電位です。その時に空洞ない部ではどの様な電気力線が書けるかをフォートランプログラムを使って求めてみましょう。これを近似的に求

めるには,Relaxation法という方法を用います。まず空間を細かいメッシュに分けて考えます。そしてその空間での電位を求めます。ある点の電位はそれを囲む 4点の電位の平均であると考えます。つまり式で書けば以下の様になります。

u(i, j) = (u(i + 1, j) + u(i − 1, j) + u(i, j + 1) + u(i, j − 1))/4.0 (3)

最初の初期条件としては,回りの箱の電位と芯線の電位しか決められていないので,この様な計算を

1回だけ行っても無意味です。少し変化があるのは箱のすぐそばと芯線の回りだけでしょう。しかしこれを何回も何回も繰り返していけば段々全ての点での電位が正しい値にちかずいていきます。電位が

もとまれば,電場が求められますね。式で書けば以下の様になるはずです。

ex(i, j) = (u(i + 1, j) − u(i − 1, j))/2.0 (4)

50

Page 51: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

t

V

0d t

f ( 0 )

d

t'

t 1 t

1 + d

t

f ( t 1 )

f ( t 1 )

+

f

(

t

1

)

d

t'

図 3: 微分方程式を数値的に解くための概念図

ey(i, j) = (u(i, j + 1) − u(i, j − 1))/2.0 (5)

ex(i,j)と ey(i,j)はそれぞれ (i,j)での x方向の電場と y方向の電場です。また電場が求められれば,電気力線は書く事ができるはずです。書き方は工夫してみて下さい。実際に以上の方法で,上に示した

図の電気力線を書いてみて下さい。

9 おわりに

以上の実習を真面目に独力でこなせば,一応山形大学のワークステーションでフォートラン言語を

用いて簡単な計算ができるようになるでしょう。そこで最後に計算機を物理に応用していこうとする

人に,僕の個人的な経験から幾つか注意しておきたい事があるのでそれを以下にまとめてみます。

• 計算機の出してきた値をやみくもに信じない事! それはプログラムが間違っていても計算機はもっともらしい値を出してくるからです。必ず自分で紙と鉛筆を使って一応計算 (オーダーエスティメイト程度で良い)をしてみる事。「手で計算できないような複雑な計算だから計算機を使っているんだ。ドアホ!」という反論は当然あるでしょうが,それでも物理が本当に分かっているのならある程度の答えの予想はできるはずです。

• プログラムを組む際に,「分かりにくかろうが,とにかく正しく動くプログラムならそれでいい。」とは絶対に考えない事! 皆さんが段々複雑なプログラムを書くようになると分かると思いますが,自分が以前に書いたプログラムを少し手直しして,もう一度動かしたいという事はしょっちゅう

あります。自分が過去に書いたプログラムは,まるで他人が書いたプログラムの様に見えるもの

です。そして一体どんなプログラムなのか自分で書いておいて理解できず,手直しする事ができ

ないという事がよくあります (だから最初にプログラミングスタイルの実習を行ったのです)。また何人かの人で共同でプログラムを開発している場合,他人がその読みにくいプログラムを読ま

なくてはいけない事になる訳です。共同作業の場合には自分が分かればいいやという考えは通じ

ません。読みにくいプログラムを読まされる人はたまらないし,その様なプログラムで出てきた

結果を人は信用しません (少なくとも僕は信用しません)。

• 複雑なプログラム (1000行を越える程度のプログラム)を組む場合には,トップダウンの考え方

51

Page 52: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

V

2 c m

2 c m

図 4: 比例計数管のポテンシャル。2cm四方の箱の中心に心線が張ってある。図の点線は問題を解く際に使用する格子点を示すために付けたもの。この格子点を細かくすればするほど精度の良い計算がで

きる。

を採用する事をお勧めします。トップダウンとは,上から下へという事を意味します。具体的に

言いえば,メインプログラムで,中身の無いサブルーチンをアルゴリズムに従って順番に並べて

行きます。それから一つ一つのサブルーチンの中身を書いていくという事です。これはサブルー

チンの所で説明した概念と同じです。またこの様な心構えは,論文を書く時にも全く同様です。

• またプログラムを書いていて,一つのルーチンが 100行を越えたら,これは新たにサブルーチンを作るべきだと考えて下さい。「この様にいわれてもこのプログラムでうまくサブルーチンは使

えないよ! 実際に自分で書いてみろ!」と思うような場合もありますが,それは間違いです。大抵は自分の頭の中が整理されていないせいだからです。前にも言った様にサブルーチンとは,単

機能であれば単機能であるほど有効性が高いものです。単機能のルーチンが 100行以上になりますか?

•  プログラム開発を行っていると、多くの単機能のサブルーチンを作ります。この様なサブルー

チンは単機能であるため、他のプログラムにも応用が利きます。そこで自分がいままで開発し

たサブルーチンは、あるディレクトリーにまとめておくと良いです。そして必要なときに、その

ディレクトリーからサブルーチンを取ってきて使うようにします (さらに進めてサブルーチンをまとめたライブラリーというものを作るとなお良い、この方法は UNIXマシンのマニュアル参照)。すると新しくプログラムを開発する手間が、随分省けます。実際僕もこの様な習慣を付けており、大学院時代から自分の作ったプログラムの中で、単機能で使えるサブルーチンを一カ所

にまとめて、使用しています。

52

Page 53: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

A UNIXの主要コマンド一覧

実習で使用する計算機の OSは UNIXですが,これは最近の計算機の主流です。僕の予想するに今後 5年程度はこの隆盛は変化しないと思われます。従って UNIXマシンのコマンドを覚えておいて損はないでしょう。以下によく使うコマンドの一覧表を示します。その他に UNIXマシンには,パイプ

コマンド 機能説明

exit 計算機を使うのをやめる (ログアウトするという)。ls ファイルの一覧を表示する

more filename ファイルの中身を見る

cd dirname ディレクトリーを移動する

pwd 現在いるディレクトリーを確認する

mkdir dirname 新しくディレクトリーを作る

rmdir dirname ディレクトリーを削除する

cp file1 file2 file1を file2にコピーするmv file1 file2 file1という名前のファイルを file2という名前に変更するrm filename ファイルを消す

frt フォートランコンパイラーを起動する

man コマンドの使い方を表示する

finger 現在計算機を使用している人を調べる

grep keyword filename ある言葉がファイルの中に含まれているか探す

mailx 電子メールを送ったり読んだりする

talk 計算機を通してお話しをする

telnet 計算機にログインする

ftp 他の計算機からファイルを持ってくる

lpr プリンターにファイルを打ち出す

lprm プリンターにプリントアウトを停止させる

lpq 自分のプリンターに出した要求番号を確認する

表 1: UNIXでよく使用するコマンド一覧。上の表で manの所まではよく使う。それ以外はおいおい覚えて下さい。

とリダイレクションという概念があります。リダイレクションは矢印キーで表わされ,パイプは縦棒

で表わします。以下の 3つの例を見て下さい。最初の 2つはリダイレクションの例です。最初の文は,lsで示されたディレクトリーの内容を画面に打ち出すのでは無く,test.datというファイルに保存する事を意味しています。また 2行目は gunji@ksvax1にメイルを送る際に,test.datというファイルをメイルの内容として送る事を意味します。つまりリダイレクションとは本来画面に出力される物をファ

イルに出力したり,キーボードから打ち込まなくてはいけない物を,ファイルから入力する方法です。

3行目はパイプの例ですが,これはプロセスの中で rootのプロセスを探すという事を行っています。ps -aだけでは画面に表示されてしまいますが,これをパイプで grep rootの入力に回します。つまりパイプは前のコマンドによって得られた出力を,次のコマンドの入力に回すという方法です。

kspace% ls >test.dat

kspace% mailx gunji@ksvax1 <test.dat

kspace% ps -a | grep root

53

Page 54: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

B Muleのキー操作一覧

計算機を使って物理の問題を素早く解くためには,1)基本的な物理現象の理解,2)フォートランプログラムの組み方の熟知,3)エディターの使い方の熟知が必要です。どんなに物理ができ,プログラムにも詳しい人でも,エディターを使いこなせなくては,プログラムをすぐに組む事はできません。現

在Muleというエディターは,UNIXマシンで標準的に使われているエディターです。また以前から存在するエディターとして Emacsというのがありますが,基本的な使い方は Muleと同じです。そこで以下に示したMuleのコマンドを覚えておく事は,将来的にも非常に重要です。

コマンド 機能説明

CTRL-x CTRL-c 編集を終了する

CTRL-n 一行カーソルを下へ

CTRL-p 一行カーソルを上に

CTRL-f カーソルを右に

CTRL-b カーソルを左に

CTRL-a カーソルを行の先頭に

CTRL-e カーソルを行の最後に

CTRL-v カーソルを一ページ後ろに移動

ESC-v カーソルを一ページ前に移動

ESC-> カーソルをファイルの最後に

ESC-< カーソルをファイルの先頭に

ESC-x goto-line カーソルを自分の指定した行に

CTRL-d カーソルの位置の存在する文字を消去

CTRL-k カーソルのある行をカーソルの位置から終わりまで削除

CTRL-SPACE リージョンのセレクト開始 (マークを付ける)CTRL-w マークされた場所から,現在カーソルのある場所までを削除

CTRL-y 計算機に読み込まれた部分をペースト

CTRL-s 順方向に言葉を検索

CTRL-r 逆方向に言葉を検索

ESC-% 単語の置換

CTRL-x i ファイルを includeするCTRL-x CTRL-w ファイルをセーブ

CTRL-x 2 ウインドウを 2つに分割CTRL-x o 別のウインドウに移動

CTRL-x 1 ウインドウを一つにする

CTRL-x CTRL-b 現在のバッファーの一覧表示 (カーソルを合わせて qで選択)CTRL-x b バッファーの交換

表 2: Muleでよく使用するコマンド一覧。CTRL-とはコントロールキーを押しながらという事,ESC-はエスケープキーを押してという意味。

54

Page 55: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

C 仮名漢字変換 cannaの使い方

通常プログラムを書いている場合には,ほとんどローマ字だけで事足りますが,メールを書く時に

は,漢字を打ち込みたいですよね。そのために cannaというシステムが現在計算機センターで使用できます。cannaの役目は Mule上で入力したローマ字を漢字,ひらがな若しくは片仮名に直し,画面に表示させる働きをします。それでは cannaの使い方を勉強してみましょう。まず以下のコマンドを打って muleを起動してみて下さい。

コマンド 意味

CTRL–o 漢字入力モードに移動若しくは英数字入力モードに移動

スペースキー 漢字変換

CTRL–f 次の文節に移動

CTRL–b 前の文節に移動

CTRL–i 現在カーソルがある文節をちじめる

CTRL–o 現在カーソルがある文節を伸ばす

表 3: cannaでよく使うコマンド。CTRL–oを変換中に打てば文節を伸ばす事になり,変換中でなければ入力モードの変換になる。

sg046@kdssf% mule test.dat

そこで,コントロールキーを押しながら,アルファベットの oを押して下さい (以下では CTRL-oと略す)。すると画面の下の部分にひらがなの”あ”という文字が出てきたと思います。そこで例えば,キーボードから以下の様な文字を打ってみて下さい。

watashihahajimetenihongowotsukaimasu

すると画面にはそれがひらがなで表示されたはずです。そこでスペースキーを打つと,ひらがなが漢

字に変換されましたね。また cannaは各文節毎に言葉を区切るので,文節毎にちょっとした空白が開いたと思います。もしちゃんと思った通りに漢字変換されていたら,リターンキーを押します。それ

で漢字が確定されました。次に以下の様にキーボードを打ってみて下さい。

yatsunokanojyohaiijimaaininiteiruna

そしてスペースキーを押すと,以下の様に変換されませんでしたか?

奴の 彼女は 飯島 会いに 似ているな

これは明らかに”会いに”という部分が間違っていますよね。その場合には CTRL–fを押してみて下さい。するとカーソルが一文節づれましたね。そこで間違っている箇所まで CTRL–fで進んで下さい。そこでスペースキーを押して下さい。2回スペースキーを押すと下に変換の候補が出てきますのでスペースキーを続けて打って自分の変換したい漢字を選びます。また試しに以下の様に入力してみて下

さい。

watashikamone

すると”私かもね”と出てくるでしょう。もしそれを”私鴨ね”にしたかったとします。その時には,CTRL–iを押して文節をちじめます。以上の様な操作で漢字を打ち込む事ができます。また英数字を打ちたい時にはもう一度 CTRL–oで cannaの漢字モードから抜けます。

55

Page 56: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

D フォートランの組込み関数

フォートランでは、足し算、引き算、かけ算、わり算はそれぞれ+.-.*./という記号を使います。また 3の 2乗を計算したい場合には、3**2という書き方をします。しかしもっと複雑な関数計算をしたい場合には、以下の関数を使用します。フォートランでしばしば使われる代表的な関数です。

関数 機能

sin(a),cos(a),tan(a) aの sin,cos,tanを求める。aはラジアン単位で指定する。sind(a),cosd(a),tand(a) aの sin,cos,tanを求める。aは度の単位で指定する。asin(a),acos(a),atan(a) sin,cos,tanの逆関数,aはラジアン単位で指定する。asind(a),acosd(a),atand(a) sin,cos,tanの逆関数,aは度の単位で指定する。exp(a) eaを意味する。

log(a),log10(a) それぞれ logea,log10aを意味する。

sqrt(a) aの平方根を意味する。max(a,b,c),min(a,b,c) それぞれ a,b,cの最大値と最小値を求める。mod(a,b) a/bの余りを計算する。int(a) aの値を少数以下切り捨てる。float(a) 整数 aの値を実数に変換する。abs(a) aの絶対値を求める。

表 4: フォートランの組込み関数

E Topdrawの使い方

Topdrawは色々な図を書く場合に使用されるソフトエウアです。使い方は比較的簡単ですが,拡張性が優れており,様々なグラフを表示させる事が可能です。最初は VAXという計算機で使われていたのですが,数年前から UNIXにも移行しました。UNIXの Topdrawは VAXの Topdrawほど多機能ではないですが,皆さんが実習に使う分には,なんら問題ありません。ここでは Topdrawの使い方を簡単に紹介します。

まず一番最初に、Windowsの画面の左下隅にあるスタートというボタンをクリックします。するとメニューが現れますね。そのメニューの中で「プログラム」の所にマウスを持っていきます。すると

自動的にサブメニューが開きますね。さらに「NCD PC-X ware」という箇所にマウスを持っていくと、またサブメニューが開くはずです。そこで「PC-X ware」という箇所をマウスでクリックして下さい。すると小さなウインドウが開きます。このまま少し待つと、画面いっぱいに「ようこそ kdeveへ」といったメッセージが書かれているスクリーンが現れます。このスクリーンを隅にどけておいて

下さい。以上の操作は、kdeveで計算した結果を自分の使っているパソコンでグラフ表示する際に必要となります。

次に以下の様な内容のファイルを muleで作ってみて下さい。

set limit x 0 8 y 0 8

1 2

3 4

5 6

56

Page 57: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

JOIN ; HISTOGRAM

このファイルを test.tdrとします。そして以下の様なコマンドを打ってみて下さい。下の例で nameという箇所には自分の使っている端末の名前を書きます。大抵パソコンの箱の所に書いてあるはずです。

(最初の setenvの行は 1度だけ打てばその後は打たなくても大丈夫)

sg046@kdeve% setenv DISPLAY name:0.0

sg046@kdeve% topd test.tdr

すると先ほどの大きなスクリーンにヒストグラムが現れたと思います。上のサンプルファイルの例

はデータ点として (1,2),(3,4),(5,6)というデータをヒストグラム形式で打ち出しなさいという事を意味しています。また一行目の文は,xを 0から 8まで yを 0から 8までの枠を画面に作りなさいという事を意味しています。また以下の様にすると,3つのデータ点を線でつないでくれます。

set limit x 0 8 y 0 8

1 2

3 4

5 6

PLOT ; JOIN

以上が最も簡単な topdrawの使い方です。スクリーンにグラフが出たら、このスクリーン上の上をマウスでクリックしてみて下さい。すると Telnetの画面の方で、再びプロンプトが現れたはずです。次に図をプリンターに打ち出すには以下の方法で行います。

sg046@kdeve% topd test.txt postscr <---ポストスクリプトファイルを作る

sg046@kdeve% lpr test.txt.ps <--プリンターへ打ち出す

F C,C++言語

計算を計算機に行わせるには,何もフォートランという言語を使う必要はありません。その他にも

Basicや C等の言語があります。特に Cや C++言語は企業等でのプログラムの開発には欠かせない言語です。また UNIXというOS自体も C言語で書かれています。また将来実験系でデータアクイジッションをやってみたいという人にはお勧めの言語です。データアクイジッションとは検出器で取得し

たデータを計算機に読み込む作業を言います。(ある程度大掛かりな実験には,検出器屋,回路屋, 計算機屋という様にある程度作業を分担します。そのため必ず一人はこの様なデータアクイジッションの

プロが必要になってきます。)データアクイジッションを行う場合には,ハードウエアからじかにデータを計算機に読み込んでくるので,よりハードウエアを操作しやすい言語が必要なのです。Cはそれに非常に向いています。C言語のマニュアルはそこらじゅうに氾濫しているので,興味のある人はそれらを読んで見るといいと思います。計算機センターの SUN(kdssf)で,C言語のプログラムを組んだら,以下の様にしてソースプログラムを実行形式のプログラムに変換できます。

sg046@kdeve% fcc -o sample1 sample1.c

以上の例は sample1.cというプログラムから sample1という実行ファイルを作る例です。

57

Page 58: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

G Anonymous FTP

他のグループ (この場合はみんなの使っているワークステーション以外という事)が開発したプログラムを自分で利用したいというのはよくある事です。他のグループの計算機にアカウントが無くても

(パスワードをもらってい無くても),そのプログラムを手に入れる事ができる場合があります。大きな研究所 (特にアメリカ)では,他の人が自由に自分達の開発したプログラムを使えるように一部を公開している場合があります。それを手に入れる方法が Anonymous FTPです。例えばワークステーションから以下の様にコマンドを打ったとしましょう。

sg046@kdeve% ftp 130.69.254.254

220 ftp.u-tokyo.ac.jp FTP server (Version 6.9 Mon Aug 31 17:37:13 WET 1992)

ready.

Connected to FTP.U-TOKYO.AC.JP.

Name (ftp.u-tokyo.ac.jp:gunji): anonymous <---ここで anonymousと打ち込む

331 Guest login ok, send e-mail address as password.

Password:[email protected] <---ここに自分のメイルの宛先を書く

230-

230-Welcome, archive user! This is an experimental FTP server. If have any

230-unusual problems, please report them via e-mail to [email protected]

230-If you do have problems, please try using a dash (-) as the first character

230-of your password -- this will turn off the continuation messages that may

230-be confusing your ftp client.

230-

230-There are some extensions to the FTP server such that if you

230-specify a filename (when using a RETRIEVE command) such that:

230-

FTP>True Filenam

FTP> ls <---どんなファイルがあるか調べる

FTP> get file <---fileで指定されたファイルを自分の計算機に持ってくる。

FTP>quit <---ftpプログラムを終了する。

以上の例は東京大学の計算機の一つに入り込んだ例です。そこで適当なコマンドを打ち込めば,必要

と思われるプログラムを入手する事ができます。ただし,この計算機から持ってきたプログラムが山

形のワークステーションで動くという保証はありません! それは入り込んだ計算機と山形の計算機の機種が違うからです。逆に言えば他の大きな研究機関で使っている計算機と同じ種類の計算機を使っ

ていれば,自分でプログラムを開発する手間が省けます。

H LateX

皆さんは英語の論文とかを読んだ事があるでしょうか? 現在物理学者の大半は論文を書く時に LateXという文章整形ソフトを使って論文を書いています。例えばこのテキストは LateXでかかれています。きれいでしょ! 逆に研究者として将来論文を書こうと思っている人は,早いうちに LateXというソフトに慣れておく必要があります [7][8]。またその様な人は卒論を LateXで書くぐらいの意気込みを持つべきです。現在計算機センターのワークステーションでは LateXで文章を書き,その文章をプリンターに打ち出すシステムが出来上がっています。まず以下の様なファイルを作ってみて下さい。以下

58

Page 59: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

のファイルは LaTeXの標準的なファイルです。バックスラッシュマークで始まる部分は全て LaTeXに命令を与える箇所です。そして最初の行から 7行目までは,プリアンプルと言って,ページのレイアウトを決める部分です。この部分はちょっと勉強が必要なので,最初からいじらないで,そういうも

のかと思って下さい。次に author,title,dateは誰がいつどんな文章を書いたかを示す部分です。また文章の本文は begin{document}と end{document}で囲まれた部分に本文を書いていきます。

\documentstyle{jarticle}

\setlength{\oddsidemargin}{0in}

\setlength{\evensidemargin}{0in}

\setlength{\textwidth}{6.0in}

\setlength{\topmargin}{-.6in}

\setlength{\textheight}{9in}

\setlength{\textheight}{9in}

\author{郡司修一 }

\title{LaTeXの使い方 }

\date{1995年 10月 }

\begin{document}

\maketitle

\begin{abstract}

ここでは LaTeXの簡単な使い方を勉強しましょう。

\end{abstract}

\section{はじめに}

手始めに,この文章を打ち込んで,そのファイル名を test.texとしてみて下さい。

\section{終わりに}

さあこれであなたも LaTeX使いになりましたね。

\end{document}

文章ができたら以下の方法でコンパイルして,プリンターに打ち出せるような形式のファイルにし

ます。

sg046@kdssf% jlatex test <---test.texをコンパイルする。

sg046@kdssf% dvi2ps test >test.ps <---test.dviというファイルを

ポストスクリプトファイルに変換する。

sg046@kdssf% lpr test.ps <---プリンターに打ち出す。

I インターネットとWWWサーバー

最近新聞を読んでいると,科学の欄にネットワーク,インターネット,マルチメディアという様な言

葉が頻繁に出てきます。ネットワークとは簡単に言えば,計算機と計算機をケーブルでつないで,複

数の計算機を使用したり,様々な情報をやり取りできる様なシステムを構築する事です。インターネッ

トとは,その様なネットワークの一つの種類と考えて下さい。世界中の大学のほとんどが現在このイ

ンターネットに加入しており,山形からでも,アメリカの計算機にアクセスする事ができます。また

マルチメディアという言葉も良く耳にすると思いますが,これは計算機で音楽,映像当を容易に扱え

るようにしたシステムです。現在のパソコンはテレビにもなり,このテレビの一画面を計算機のファ

59

Page 60: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

イルとして保存したり,ビデオからの信号を計算機に入力して加工したりする事が簡単にできるよう

になってきました。また最近WWW(World Wide Web)サーバーというものが色々な所で構築されるようになりました。これは一種の情報局みたいなもので,計算機からここにアクセスすると,色々な

情報 (画像及び音声等)が引き出せます。また HTML(HyperText Markup Language)[11]という言語を覚えれば、自分のホームページを作ることも簡単にできます。計算機センターの SUNでも,このWWWサーバーに接続するための netscapeというソフトがインストールされています。また山形大学や東北芸工大でもWWWサーバーが立ち上がっているので,そこにつないでみると良いでしょう。まず自分が座っている端末が Xwindowを吐き出せる端末である事を確認して下さい。それを確認したら以下の方法でソフトの起動を行います。

sg046@kdeve% netscape &

すると最初に色々な質問をされます。そこでどの様にその質問に答えていくかは,/usr/local/guideのC.a.wwwというファイルを見て設定を行って下さい。以下に主要なサーバーのアドレスを示しておきます。

http://www.yamagata-u.ac.jp/ 山形大学全体のサーバー

http://www.tuad.ac.jp/ 東北芸工大のサーバー

http://kspj112c.kj.yamagata-u.ac.jp/ 物理学科電磁気学研究室のサーバー

J perl

perlという言語 [10]は、フォートランや Cとはずいぶん違った言語で、物理計算などを行うにはあまり向いていません (記述の方法は Cに非常に似ているが)。データの並べ変え等のちょっとした仕事に使用する言語です。perlを使うメリットは,書くべきプログラムの行数が非常に少なくて済むという事です。例えばフォートランでデータの並べ変えを行おうと思ったら,20∼30程度のプログラムを組まなくてはなりません。しかし perlなら 1行ないし 2行でプログラムが書けてしまい,そのうえプログラムをコンパイルする必要がありません (プログラムを動かそうとすると、自動的にコンパイルしてくれる)。使い慣れると非常にありがたい言語です。perlは計算機センターの SUNで使用する事ができます。また最近はやりの WWWで凝ったページを作ろうとする場合に、cgi(Common GatewayInterface)[12]というものを使用しますが、これは cgiを使う場合にしばしば使われる言語です。

K Java

最近非常にはやっているコンピューター言語に Javaというプログラム言語があります。これは SUNマイクロシステムズ株式会社で開発された言語で、ネットワークに非常に適した言語です。JavaScriptという言語もありますが、これは Java言語とは似て非なるものです。JavaはWWWサーバーの普及に伴い、ものすごい勢いで発達を遂げています。かっこいい WWWのページを作りたいと思うとどうしても Java言語を覚えなくてはいけません。しかしながらもし C++を勉強したことがある人であれば、それほど取っつきにくい言語ではないので、一度簡単な本 [13]を買って勉強してみてはどうでしょうか。

60

Page 61: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

L 最近の計算機事情

最近パソコンが非常に手に入りやすい値段になってきたために、パソコンが大変普及してきました

よね。また研究室にも多数のパソコンやワークステーションが沢山ころがっているという状況を頻繁に

見かけます。そこで僕が最近話しに聞く計算機の使い方についてちょっと書いてみようかと思います。

1. Windowsマシン、Macintosh、UNIXマシンの 3種類のマシンが研究室にある場合には、それらのマシンをネットワークでつなぎ、かつデータを共有させると便利です。この共有に必要とされ

るソフトウエアが最近は無料で手に入るので、UNIXマシンにインストールしておけば、それぞれのマシンのファイルを共有できるばかりでなく、プリンター等も共有できます。現在僕の知る

範囲で、UNIXと MACでファイル共有やプリンター共有を行うソフトとして、CAPや Netalk等があります。どちらも無料なのでインストールしてみるといいかもしれません。また UNIXとWindowsマシンの共有は UNIXに Sambaというソフトを入れると行うことができます。さらにSambaと Netalkを入れれば、Windows、MAC、UNIXでファイル及びプリンター共有が可能になります。

2.安い PCを買ってきて、これをワークステーションに変えてしまうという手があります。PCにLinuxとか MKlinuxというOSをインストールすれば、簡単にそれが行えます。どちらも無料配布されているので高いワークステーションを買うよりもコストパフォーマンスが良いかもしれま

せん。

3.最近モバイルという言葉を良く聞きますよね。モバイルとは、軽量の携帯できる計算機を持ち歩いて何処にいてもインターネットにアクセスできる環境を整えることです。実際僕の友人の物理

学者は、リブレットという携帯端末に前の所で紹介した Linuxをインストールして、自分の携帯端末をワークステーションの代わりにしています。さらに彼は、携帯端末に様々な研究機関で開発

されたライブラリーをインストールしているので、電車の中で素粒子の大規模なコンピューター

シュミレーションまでできるようにしてあるそうです。そして携帯電話をリブレットに繋いで、ど

こからでも自分の研究室にアクセスできるような環境を整えています。便利な世の中になりまし

たねええ。

参考文献

[1] 原田賢一著,”Fortran77プログラミング”,サイエンス社(僕がフォートランを学び始めた時に使った教科書)

[2] 舟本奨著,”UNIXハンドブック”,ナツメ社(UNIXの初心者にはある程度役に立つがあまりお勧めはできない。)

[3] 山口和紀監修,”The UNIX Super Text 上,下”,技術評論社(最近僕が読んだ UNIXの本の中では一番良い本でした。全部読むのは大変ですが非常に役立ちます)

[4] カーニハン著,木村泉訳,”ソフトウエア作法”,共立出版(プログラミングのスタイルに関して書いてある本で,名著として有名である。物理研究者で計算機のプロを目指す人は,読む事を勧める。)

[5] 早野龍五,高橋忠幸著,”計算物理”,共立出版(東大の 3年生が計算機実習に使用している教科書。将来電磁気研に来てVAXや UNIXを使う人

61

Page 62: ワークステーションを使ったフォートラン実習 - Yamagata …xpolar.kj.yamagata-u.ac.jp/eduprint/fortran.pdf · 2020-04-08 · 訛りと幾つも訛りがあります。SUNは現在,K-shell訛りとC-shell訛り,TC-shell訛りを理解できま

にはぜひ一読していただきたい。ちなみに高橋先生は僕の計算機の先生であり,僕のテキストに

書かれている事の大半は高橋先生の受け売りである。)

[6] 大木敦雄著, ”入門 Mule”,ASCII出版(Muleをこれから使うという人には,いい本だと思います)

[7] 伊藤和人著, ”Latexトータルガイド”,秀和システムトレーディング社(Latex を始めて使う人には,良い本だと思うが上級者には物足りないかもしれない)

[8] 奥村晴彦監修,”LaTeXスタイルマクロポケットリファレンス”,技術評論社  

(LaTeXをかなり使い込むようになって、自由に色々なことをしたくなった時に便利です。)

[9] 松田晃一著,”入門 X Window”,ASCII出版社(Xwindowの事を勉強したい初心者には非常にいい本だと思います)

[10] 伊藤和人著,”perl for beginner’s”  (初心者には良い本だと思います。しかし perlを自在に使いこなすためにはさらに進んだ本が必要でしょう)

[11] 吉村信他著,”インターネットホームページデザイン”  (htmlの簡単な文法書です。初心者にはちょうどいいと思います)

[12] 笹木望著,”新HTML&CGI入門”  (CGIをWWWのプログラミングに如何に活用するかを説明した本であり、僕も物理学科のWWWサーバーを立ちあげる際に参考にした)

[13] ローラ ·リメイ他著,”Java言語入門”  (Javaの入門書です。まだ筆者も読んでいる最中ですが、比較的分かりやすいと思います。またCDが付いているのもいいですね。)

62