フォートラン77を使ったデータ解析

 2012.7.19


コンテンツ

(1)はじめに
(2)サブルーチンについて
(3)エクササイズ(サンプルプログラム)
   ごたくはいいから・・・というせっかちな人は(3)にとんでください

(1)はじめに

本エクササイズは観測で得られたデータ(特に超音波風速計のデータ)をフォートランで解析することを主眼に置いた、神田研初心者向けの構成となっています。データ解析のためのプログラムの基本構造は、

   1.データの読み込み
   2.読み込んだデータの統計処理
   3.統計処理した結果の出力

となります。1.は各自が持っているデータによって形を変えないといけませんが、2.は目的が同じであれば同じプログラムが使えます(例えば平均をとるとかフーリエ変換するとか)。3.は大体2.の内容に応じて決まるので、これも使いまわしがききます。ちなみに、データの読み込みにはアスキー、バイナリのどちらでも読み込むことができますが、いずれにしろ元データファイルの構造(値の並び方)が分かっていないとだめです。


(2)サブルーチンについて

サブルーチンを使うことを推奨します。エラーの大半はサブルーチン周辺で起こり、慣れないとはまりますが、それを補って余りあるベネフィットがあります。

例えば(1)で述べたことをサブルーチンを使って書くと、

 call input_data
 call statistics
 call output_data
 end
!
 subroutine input_data
 .....
 subroutine statistics
 .....
 subroutine output_data
 .....

のようになり見た目すっきりで見やすい(=発見しにくいミスが減る)。また、別のデータを解析したいときは「subroutine input_data」の所だけを変えるだけですみます。大体は。

それだけではなく、例えば上記で別な統計処理(例えばfft解析)を追加したい場合、

 call input_data
 call statistics
 call fft
 call output_data
 end
!
 subroutine input_data
 .....
 subroutine statistics
 .....
 subroutine fft
 .....
 subroutine output_data
 .....

のように、元の構造を邪魔することなくすっぽり入ります。さらに、どこかの天才が作った何やっているか分からないけどとにかくすごいプログラム(sugo.for)についても、入出力されている変数の意味だけ分かれば簡単に組み込むことができます。


 call input_data
 call statistics
 call fft
 call sugo
 call output_data
 end
!
 subroutine input_data
 .....
 subroutine statistics
 .....
 subroutine fft
 .....
 subroutine sugo
 .....
 subroutine output_data
 .....


(3)エクササイズ(サンプルプログラム)

 以下はサンプルプログラム。適宜組み合わせて使う。

●エクササイズの項目
   Exercise 01: データの入出力
   Exercise 02: 平均と標準偏差
   Exercise 03: サブルーチン
   Exercise 04: 連番ファイルを読み込む
   Exercise 05: FFT解析(参照「スペクトル解析」日野幹夫著)
   Exercise 06: 風速計の傾度補正

●使い方
  1.以下よりファイル一式をダウンロード(要パスワード)
    download >>
ex_fortran.tar
  2.Linux上のホームディレクトリに上記ファイルをscpする
  3.解凍
    tar xvf ex_fortran.tar
  4.解凍してできたディレクトリ「ex_fortran」に移動
    cd ex_fortran
  5.以下のファイルとディレクトリができているか確認
    ls
    > 実行結果
      EX01_read_write.for
      EX02_ave_stdev.for
      EX03_subroutine.for
      EX04_read_write_multi.for
      EX05_fft.for
      EX06_coord_transform.for
      OUTPUT
      data
   上記の「EX**.for」はプログラムファイル、「data」は読み込むデータファイルが格納されているディレクトリ、「OUTPUT」は出力結果を格納するためのディレクトリ(空っぽ)
  6.コンパイルして実行
    ifort EX01_read_write.for
    ./a.out
  7.実行結果はOUTPUTディレクトリに作成されるか、直接表示されるので確認する

以上


●Exercise 01: データの入出力
とあるデータのファイル(R01.csv)を読み込んで、その並び方を変えて別ファイルに出力を行う。それだけ

ポイント:元のファイルの大きさ(何行何列のデータか)を調べて、imax,jmaxの値を適宜決める。
ポイント:数字以外の文字が入っている場合はフォーマットを定義する必要あり
ポイント:行列(プログラム上では通常「配列(array)」と呼ぶ。ここでは「p」)を使う場合は必ず「dimension」でその大きさを定義する



●Exercise 02: 平均と標準偏差

とあるデータファイル(R01.csv)を読み込んで、その平均値と標準偏差を計算して画面上に出力する。それだけ

ポイント:特になし


●Exercise 03: サブルーチン
Exercise 02をサブルーチンを使って書き換えた。それだけ

ポイント:「call」及び「subroutine」の後のカッコ内に書かれているのはサブルーチン内外で受け渡す変数(数値及び配列)で、それぞれ1対1で対応していないといけない(例えば配列の大きさ、整数値、実数値、記載する順番など。変数の文字列はサブルーチン内外で違っていてもいい)。プログラムエラーの大半はこれの受け渡しミスにあるので、エラーが出たらこの辺をよく見る


●Exercise 04: 連番ファイルを読み込む
連番のファイル(R01.csv〜R06.csv)を読み込み、各々についてExercise 03の操作を行う。それだけ

ポイント:サブルーチン「read_data」内がポイントで、整数nを文字列aaに置き換えている。ファイル名の数字が二桁までならaaの大きさを2以上(aa*2)で書き込みフォーマットを「I2.2」とし、三桁までなら3以上(aa*3)と「I3.3」、のようにする。出力ファイルについても同様だが、nループ内で必ずcloseすることを忘れてはいけない。


●Exercise 05: FFT解析(参照「スペクトル解析」日野幹夫著)
超音波風速計のサンプルデータ(sonicdata.csv)を読み込んでFFTにかけてパワースペクトルを出力する。それだけ

ポイント:FFT(の計算手順)を理解していなくても、データを適切に入力できればFFT解析ができてしまう。


●Exercise 06: 風速計の傾度補正
超音波風速計のサンプルデータ(sonicdata.csv)からu,v,wのデータを読み込んで、vの平均値=wの平均値=0となるように三角関数を使って座標変換する。それだけ

ポイント:u,v,wの読み込みだけできれば、後は勝手にやってくれる。フラックス(渦相関法)を計算するときに使う(w=0とする)。

以上。分からないことがある場合は本を買って勉強する。「身銭を切るほど強くなる」(By K先生)