情報地球科学演習 (第2020講)

演習をする前に

演習の便利のために、 http://earth.sci.ehime-u.ac.jp/~kameyama/lectures-j.html 以下から、この演習で使う資料をたどれるようにしています。 復習する際などでも有効に利用してください。 ただし、[みほん] としている一部の プログラムのソースの閲覧は不可 としています。

またこの演習では、Linux を作業台として、Fortran 90 をプログラミング言語として用いていきます。 これらに自信のない人は、2年生後期の「地球物理学実験」の土屋(旬)・出倉先生担当分の資料 を復習しておくことを強く勧めます。

計算機環境の復習と演習の準備

これまでの多くの機会では Windows (8 とか 10 とか) を使ってきたであろうが、この授業では (Linux の一種である) CentOS を使って演習を進めていく。

Linux の起動

まず何はなくとも、CentOS のデスクトップを起動させるところからスタートしよう。 やり方を忘れてしまった人は 総合情報メディアセンター のページ以下、「センター計算機利用」→「パソコン」のページに掲載されている手順を確認せよ。 具体的には、 まずは「パソコン基本操作」で Windows 10 にログオンした後に、 「Linux 利用」で Linux にログインする。 なおパソコンの電源を切る際も、「パソコン基本操作」の手順に従ってください。

演習用の環境づくり

Linux のデスクトップが正しく立ち上がったら、各自のパソコンの画面上でこの演習資料が見えるようにしておこう。

  1. 画面の上端にある「メニューバー」(正式には「Gnome パネル」というらしい) の Firefox みたいな Firefox のアイコンをクリックするか、あるいは 「アプリケーション」から「インターネット」と進んで「Firefox ウェブ・ブラウザ」を選んで Firefox を起動し、
  2. 検索窓から「愛媛大学理学部地球科学科」の ホームページ に行き、
  3. 上側のメニューから「研究・教員」に行き、
  4. 下のほうにある亀山の行で home のアイコンをクリックして 亀山のホームページ に行き、
  5. 左側のメニューから「講義資料」に行き、
  6. 「情報地球科学演習」の「演習ノート」をクリック
という手順により到達できる。 しかしこんな手間を毎回やるのは正気の沙汰ではないので、「演習ノート」のページをブックマークしておくのが吉でしょう。

Linux の基本操作

続いて、Linux や「端末」の基本的な操作法を思い出してみよう。 この演習では主に「端末」を使って Linux を操作してもらうことになる。 即ち、「マウスでカチカチする」やり方ではなく、「キーボードからコマンドを入力する」やり方でコンピューターを操作することが多くなる。 この方法は確かに、(慣れるまでは) 面倒臭くて分かりにくいものなのだが、いったん慣れてしまえば「マウスでカチカチする」よりも圧倒的に速いスピードで操作できるようになる。

「端末」を立ち上げるには、画面の上端にある「メニューバー」(正式には「Gnome パネル」というらしい) の「アプリケーション」から「システムツール」と進んで「端末」を選べばOKである。 端末が開くと、その中には $ な記号が出ているはずだ。 これは「コマンドプロンプト」と呼ばれており、英語の prompt の意味の通り、ユーザからの指示 (コマンド) の入力を催促しているものである。

次に、この授業の演習で作成・操作するファイル一式をまとめておくフォルダ (正確な Linux 用語では「ディレクトリ (directory)」という) を作ってみよう。 開いた「端末」の中から、以下のように入力してみよ。 ただしコマンドプロンプトの $ は実際には入力する必要はない。

$ mkdir jouhou
これにより、jouhou という名前のフォルダ (ディレクトリ) が新たに作成されているはずだ。 なお mkdir とは、「次の名前のフォルダを新しく作ってください」という Linux の命令である (MaKe DIRectory のこと)。 いったん作ったフォルダを新たに作り直す必要はない訳だから、この操作は最初の1回だけやればよい

ここまでできたら、端末の中で以下のように入力してみよ。

$ cd jouhou
ここで cd とは、「この端末でこれ以降の作業を実行する場所を、次の名前のフォルダの中に変更してください」という Linux の命令である (Change Directory のこと)。

ここまではクリアできただろうか。 来週以降の演習は、

  1. パソコンを起動して Windows 10 にログインし
  2. Linux のデスクトップ画面を立ち上げ、
  3. ウェブブラウザで「演習ノート」を開き、
  4. 端末を立ち上げ、
  5. jouhou という名前のフォルダ (ディレクトリ) の中に作業場所を移動しておく
状態からスタートすることにしたいので、この手順を必ず覚えていてほしい。

なお (亀山はあまり使い方を知らないのだが) Windows でいうところの「エクスプローラ」みたいなものも、実はちゃんと用意されている。 画面上の「○○のホーム」というアイコンをクリックすると、各自の「ホームディレクトリ」の内容を見ることができる。

演習で用いるデータのダウンロード

今回の演習 (の前半) では、愛媛県松山市における1890年〜2019年までの130年間における、月ごとの平均気温 (元データは気象庁ホームページ以下より拝借) のデータを使って、簡単なデータ解析の実習を行う。

まず、ここ をクリックしてみよう。 使用するサンプルデータの中身を確認し、これをダウンロードしておくこと。

準備プログラムの作成

次は、以下に示した内容で、新しく enshu00.f90 という名前のファイルを作成しよう (別の画面で開きたい人は ここ を)。 ただし、「コピペ」はそう簡単にできないようになっているので、面倒でも自分で入力すること。

やり方を忘れてしまった人は、開いた「端末」の中から、以下のように入力するとよい。

$ gedit enshu00.f90 &
これは「enshu00.f90 という名前のファイルの中身を編集したいので、gedit という名前のエディターを起動してください」という意味の命令である。 この際、enshu00.f90 という名前のファイルがまだない場合には、その名前のファイルを gedit が新しく作ってくれる。 また命令の最後に「&」をつけておくと、gedit が実行中でもその「端末」に別の命令を出すことができる。

ついでながら、この先 (卒業研究などで) Linux や プログラミングを「バリバリに」使う腹積もりの人は、gedit の代わりに emacs というエディターを使うようにすることを強くおススメする。 emacs は (gedit と比べて) 最初のハードルは高いけれど、プログラミング作業をする上での便利さは比べものにならない。 その気になった (なりそうな) 人は例えば EmacsWiki の中の「Emacsビギナ—」あたりから始めてみるといいかも。

program enshu00                                        
implicitnone
integer::seireki,joutai
real::kion01,kion02,kion03,kion04,kion05,kion06,&
kion07,kion08,kion09,kion10,kion11,kion12
do
read(*,'(i4,12f5.1)',iostat=joutai)seireki,&
kion01,kion02,kion03,kion04,kion05,kion06,&
kion07,kion08,kion09,kion10,kion11,kion12
if(joutai/=0)exit
write(*,'(i4,12f6.1)')seireki,&
kion01,kion02,kion03,kion04,kion05,kion06,&
kion07,kion08,kion09,kion10,kion11,kion12
enddo
endprogramenshu00

準備プログラムの実行

enshu00.f90 の入力ができたら、

$ gfortran enshu00.f90
としてみよう (「コンパイルする」という)。 Fortran 90 の文法の間違いがなかった ら、gfortran から怒られることもなく、新たに a.out という名前のファイルが新しく作成されているはずだ。 a.out ができていない場合には、プログラムの中身に間違いがないかを確認した後に、上のコマンドをもう一度実行してみよ。

次は

$ cat matsuyama-kion.txt | ./a.out
としてみよう。 なお (最初だし念のため) 上で入力してほしい内容を「音読」してみると、「cat matsuyama-kion.txt」に 「たて棒 (|)」ときてから、 「ドット (.) スラッシュ (/) の直後に続けて a.out」である。 これらがどういう意味であるかは後日解説する (かも)。 またよくある日本語キーボードでは、「たて棒 (|)」は Shift キーと ¥ キーを同時に押すと入力できる。

自分で作った enshu00.f90の中に 間違いが一つもなかった ら、上で入力したコマンドの出力として、端末には以下のように表示されているはずだ (最後の3行分のみ示す)。

2017   6.6   7.0   9.2  15.7  20.2  22.5  28.5  28.8  23.7  18.8  12.7   6.8
2018   5.0   5.5  11.4  16.7  19.8  23.0  28.3  29.4  24.1  19.1  13.6   9.4
2019   7.2   8.2  10.9  14.8  20.3  23.0  26.1  27.8  26.3  20.7  14.1   9.7

うまくできない場合は、自分で作った enshu00.f90 の中に 本当に間違いがないか を確認せよ。 プログラムの間違いが修正できたら、改めて

$ gfortran enshu00.f90
とし、gfortran から怒られなかったことを確認せよ。 これにより、enshu00.f90 に加えた修正を反映した a.out が作成されたことになる。 この新しい a.out を用いてもう一度
$ cat matsuyama-kion.txt | ./a.out
と入力してプログラムを動かし、本当に正しく動いたかどうかを確認せよ。

準備プログラムの解説

今回の演習で行ってもらうプログラミングはもちろんのこと、一般的に「プログラミング」をマスターするためのコツは、 データの構造 (データの並び方、データの蓄え方) と 処理の構造 (順次・反復・分岐) の2つを理解することにある。

基本プログラムの作成

先に作った enshu00.f90 を手直しして、もう少し使い勝手のよいプログラムに作り変えることにしよう。 以下に示した内容で、新しく enshu01.f90 という名前のファイルを作成せよ (別の画面で開きたい人は ここ を)。 その際、enshu00.f90enshu01.f90 の2つで、どこがどう違うか に注目せよ。

なお (当然気付いているとは思うが)、もともとの enshu00.f90 をコピーして enshu01.f90 を作り、それを編集するのが簡単。 やり方を忘れてしまった人は、「端末」で以下のように入力せよ ($ はコマンドプロンプト)。

$ cp enshu00.f90 enshu01.f90
$ gedit enshu01.f90 &
ここで (やはり当然気付いているとは思うが) cp とは「次の名前のファイルを複製して、その次の名前のファイルを作ってください」という Linux の命令である (CoPy のこと)。 プログラムの変更が終わったら、改めて
$ gfortran enshu01.f90
とし、gfortran から怒られなかったことを確認せよ。 これにより、enshu01.f90 の内容に基づいた a.out が作成されたことになる。 この新しい a.out を用いてもう一度
$ cat matsuyama-kion.txt | ./a.out
と入力してプログラムを動かし、本当に正しく動いたかどうかを確認せよ。 自分で作った enshu01.f90の中に 間違いが一つもなかった ら、上で入力したコマンドの出力として、端末には以下のように表示されているはずだ (最後の3行分のみ示す)。
2017   6.6   7.0   9.2  15.7  20.2  22.5  28.5  28.8  23.7  18.8  12.7   6.8
2018   5.0   5.5  11.4  16.7  19.8  23.0  28.3  29.4  24.1  19.1  13.6   9.4
2019   7.2   8.2  10.9  14.8  20.3  23.0  26.1  27.8  26.3  20.7  14.1   9.7

ここで作った enshu01.f90 というファイルは大事に保存 しておくこと。 このプログラムは 以降の実習の基本としてフル活用される 予定。

program enshu01                                      
implicitnone
integer::seireki,joutai
real,dimension(12)::kion
do
read(*,'(i4,12f5.1)',iostat=joutai)seireki,kion
if(joutai/=0)exit
write(*,'(i4,12f6.1)')seireki,kion
enddo
endprogramenshu01

配列とは

enshu00.f90enshu01.f90 の大きな違いは、enshu01.f90 では 配列 を使ってデータを管理していることである。 では、「配列」とは何だろうか?

ふつうの「変数」は、1つの値だけしか入れることができない「器」である。 これに対し「配列 (array)」とは、同じ種類の いくつもの「変数」をまとめて作った1つの「かたまり」 のことである。 具体的には enshu01.f90 では、

ことにして、データの読み書きを行っている。

簡単なグラフを描く

1限の講義でも既に述べた通り、「グラフにしてみる」ことも「データ処理」における大事な作法の1つである。 そこで、Linux 上で動く簡単なグラフ化ツールである Gnuplot を使ってみよう。

まずは端末で以下のように入力してみよう ($ は端末のコマンドプロンプト)。

$ gnuplot
すると Gnuplot の入力画面に入る。 そこで例えば (gnuplot>は Gnuplot のプロンプト)
gnuplot> plot sin(x),cos(x)
と入力すれば、画面に \(y=\sin(x)\) と \(y=\cos(x)\) の2つのグラフが表示されているはずだ。 その後
gnuplot> quit
とすれば Gnuplot から抜け出して、通常のコマンドプロンプトへ戻ってくる。

Gnuplot は、高校までで習うような関数はたいがい知っている。 自分が思いつく関数をいくつか Gnuplot で表示させてみよ。

ちょっと複雑な例では

gnuplot> plot 0.5+atan(5*x)/pi
とか
gnuplot> plot exp(-x**2/2)/sqrt(2*pi)
なんてのもOK。 ただし atan は逆正接関数 (arc tangent)、 exp は \(e\) を底とする指数関数 (exponential function)、 **2 は平方 (2乗) で sqrt は平方根 (square root)、 pi は円周率 \(\pi=3.141592\ldots\) のこと。 またグラフの横軸の範囲を指定して表示するには、例えば以下のようにする。
gnuplot> plot [-5:5] exp(-x**2/2)/sqrt(2*pi)
これにより、横軸の範囲が \(-5\le{x}\le5\) のみになったグラフが表示されるはずだ。 なおこの \(y=\dfrac{1}{\sqrt{2\pi}}\exp\left(-\dfrac{x^2}{2}\right)\) などという形の関数は一般に「ガウス関数」(Gaussian function) と呼ばれており、統計学や誤差論で「正規分布」を習う際に必ず出てくる大事なものである (1限の授業でもそのうち出てくる)。 表示されたグラフを見ながら、この関数の特徴を記憶に残しておいてほしい。

これ以外にも Gnuplot には、ファイルから読み込んだデータをグラフにする機能が備わっている。 そこで例えば

gnuplot> plot "matsuyama-kion.txt" using 1:5
とすると、matsuyama-kion.txt の1列目 (西暦) を横軸に、5列目 (4月の平均気温) を縦軸にとったグラフが表示される。 さらに
gnuplot> plot "matsuyama-kion.txt" using 1:5 with lines
とすれば、4月の平均気温が折れ線グラフで表示される。 同じようなやり方を使って、各月の平均気温の変化をグラフにして表示してみよ。 またグラフの横軸の範囲を指定することにより、最近10年間の4月の平均気温の変化もグラフに表示してみよ。

Gnuplot は画面上にグラフを描かせるだけでなく、描かせたグラフを画像として保存することもできる。 そのためには、例えば以下のようにすればよい。

gnuplot> plot [-5:5] exp(-x**2/2)/sqrt(2*pi)
gnuplot> set terminal png
gnuplot> set output "mygraph.png"
gnuplot> replot
これにより、グラフは画面に出力される代わりに、mygraph.png という名前のファイルに描かれるようになる。 なお replot とは、先に描いたグラフをもう一度 Gnuplot に描かせるための命令である。

出席確認用プログラム提出フォーム

以下のフォームにより、各自で作成した enshu01.f90 (に相当する) Fortran 90 プログラムの最終版を提出せよ。

学外からアップロードするには、例のユーザー名とパスワードによる認証が必要です。
学生証番号 (8桁/半角英数字で)
氏名
提出するプログラム