[Fortranのはじめ方] Part25: ファイルによるデータ可視化ツールとの連携(例:Gnuplot)

Fortranで計算したデータをグラフにして理解を深めよう!

はじめに

Fortranは数値計算に非常に強力な言語ですが、計算結果を数値の羅列だけで理解するのは難しい場合があります 。そこで、計算結果をグラフなどで「見える化」することが重要になります。

このステップでは、Fortranプログラムで生成したデータをファイルに出力し、それをGnuplotのような外部の可視化ツールで読み込んでグラフ化する方法を学びます。これにより、計算結果の分析や理解が格段に進みます。

1. Fortranからファイルへのデータ出力

Gnuplotなどの可視化ツールでデータを読み込むためには、特定の形式でファイルに出力する必要があります。一般的には、以下のようなテキストファイル形式がよく使われます。

  • スペース区切り: 各列のデータをスペースで区切る形式。
  • タブ区切り: 各列のデータをタブ文字で区切る形式。
  • CSV (Comma Separated Values): 各列のデータをカンマで区切る形式。

FortranのWRITE文を使って、これらの形式でデータを出力できます。例えば、x座標とy座標のデータをスペース区切りで`output.dat`というファイルに出力する簡単な例を見てみましょう。

program write_data
  implicit none
  integer :: i
  real :: x, y
  integer, parameter :: data_unit = 10

  ! ファイルを開く (ステータスが 'unknown' の場合、新規作成される)
  open(unit=data_unit, file='output.dat', status='unknown', action='write')

  ! 簡単なデータを書き込む (例: y = x^2)
  do i = 1, 10
    x = real(i) * 0.5
    y = x**2
    ! WRITE文でスペース区切りで出力
    write(data_unit, *) x, y
  end do

  ! ファイルを閉じる
  close(data_unit)

  print *, 'データファイル "output.dat" を作成しました。'

end program write_data
ポイント:
  • OPEN文でファイルを開き、書き込み用ユニット番号(ここでは10)を割り当てます。status='unknown'はファイルが存在しない場合に新規作成、存在する場合は上書き(内容は消去)します。
  • WRITE(ユニット番号, *)のようにアスタリスク(*)を使うと、リスト指定形式(通常はスペース区切り)で出力されます。特定の書式で出力したい場合はFORMAT文を使います(Step 5参照)。
  • CLOSE文でファイルを閉じるのを忘れないようにしましょう。

2. Gnuplotの基本的な使い方

Gnuplotは、コマンドラインベースのグラフ作成ツールです。多くのOS(Windows, macOS, Linux)で利用できます。

インストール後、ターミナル(コマンドプロンプト)でgnuplotと入力すると起動します。

$ gnuplot

        G N U P L O T
        Version 5.4 patchlevel 8    last modified 2023-06-07

        Copyright (C) 1986-1993, 1998, 2004, 2007-2023
        Thomas Williams, Colin Kelley and many others

        gnuplot home:     http://www.gnuplot.info
        faq, bugs, etc:   type "help FAQ"
        immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'qt'
gnuplot>

基本的なプロットコマンドはplotです。先ほどFortranで作成した`output.dat`ファイルをプロットするには、次のように入力します。

gnuplot> plot 'output.dat' with linespoints

これにより、`output.dat`の1列目をx軸、2列目をy軸として、線と点でグラフが表示されます。with linespoints (または w lp) は描画スタイルを指定するオプションです。他にもwith lines (線のみ), with points (点のみ) などがあります。

グラフにタイトルや軸ラベルを追加することもできます。

gnuplot> set title 'y = x^2 のグラフ'
gnuplot> set xlabel 'x軸'
gnuplot> set ylabel 'y軸'
gnuplot> replot  # 設定を反映して再描画

Gnuplotを終了するにはexitまたはquitと入力します。

3. FortranとGnuplotの連携方法

FortranプログラムとGnuplotを連携させる主な方法は2つあります。

方法1: Gnuplotスクリプトを使う

一連のGnuplotコマンドをテキストファイル(例: `plot_script.gp`)に記述しておき、Gnuplotでそのスクリプトを実行する方法です。

plot_script.gp の例:

# Gnuplot スクリプトファイル
set terminal pngcairo size 800,600 enhanced font 'Arial,10' # 出力形式(PNG)とサイズ指定
set output 'graph.png' # 出力ファイル名

set title 'y = x^2 のグラフ'
set xlabel 'x軸'
set ylabel 'y軸'
set grid # グリッド線を表示

plot 'output.dat' with linespoints title '計算結果' lw 2 pt 7 # lw:線の太さ, pt:点の種類

このスクリプトを実行するには、ターミナルで以下のように入力します。

$ gnuplot plot_script.gp

これにより、`graph.png`という名前でグラフの画像ファイルが生成されます。

手順:

  1. Fortranプログラムを実行してデータファイル (`output.dat`) を生成する。
  2. Gnuplotスクリプト (`plot_script.gp`) を用意する。
  3. ターミナルで `gnuplot plot_script.gp` を実行する。

この方法は、手動でグラフ化する場合や、決まった形式のグラフを繰り返し作成する場合に適しています。

方法2: FortranからSYSTEMサブルーチンでGnuplotを呼び出す

Fortranプログラム内からOSのコマンドを実行できるSYSTEMサブルーチン(または類似の非標準拡張)を使って、Gnuplotを直接呼び出す方法です。これにより、データ生成からグラフ化までをFortranプログラム内で完結させることができます 。

program call_gnuplot
  implicit none
  integer :: i, stat
  real :: x, y
  integer, parameter :: data_unit = 10
  character(len=200) :: command_str

  ! --- データファイルの作成 (内容は先ほどと同じ) ---
  open(unit=data_unit, file='output.dat', status='unknown', action='write')
  do i = 1, 10
    x = real(i) * 0.5
    y = x**2
    write(data_unit, *) x, y
  end do
  close(data_unit)
  print *, 'データファイル "output.dat" を作成しました。'

  ! --- Gnuplotコマンドを文字列として作成 ---
  ! 1. ターミナル設定 (PNG出力)
  command_str = "set terminal pngcairo size 800,600; "
  ! 2. 出力ファイル名設定
  command_str = trim(command_str) // "set output 'graph_from_fortran.png'; "
  ! 3. タイトル・ラベル設定
  command_str = trim(command_str) // "set title 'SYSTEM Call Plot'; set xlabel 'X'; set ylabel 'Y'; "
  ! 4. プロットコマンド
  command_str = trim(command_str) // "plot 'output.dat' with linespoints title 'Data';"

  ! --- SYSTEMサブルーチンでGnuplotを実行 ---
  ! gnuplot に -e オプションでコマンド文字列を渡す
  call system("gnuplot -e """ // trim(command_str) // """")

  ! systemサブルーチンの戻り値を確認 (処理系による)
  ! if (stat /= 0) then
  !   print *, 'Gnuplot の実行に失敗しました。'
  ! end if

  print *, 'Gnuplot を呼び出して "graph_from_fortran.png" を作成しました。'

end program call_gnuplot
注意点:
  • SYSTEMサブルーチンはFortranの標準規格ではありません。多くの処理系(gfortran, Intel Fortranなど)で利用可能ですが、移植性に欠ける可能性があります。
  • SYSTEMサブルーチンはセキュリティ上のリスクを伴う可能性があるため、信頼できない入力をコマンド文字列に含めないように注意が必要です。
  • Gnuplotのコマンドを一つの文字列にまとめる際、引用符('")の扱いに注意が必要です。Fortranの文字列内で引用符を使う場合は、二重(''"")にする必要があります。上の例では、OSコマンドラインで全体をダブルクォートで囲むため、 Fortran の文字列リテラルとしては """ のように3重になっています。
  • 長いコマンドは読みにくくなるため、Gnuplotスクリプトファイルを作成し、それをSYSTEMで呼び出す方が管理しやすい場合もあります (例: call system("gnuplot plot_script.gp"))。

4. 実践例: sin関数のグラフ化

もう少し具体的な例として、sin関数 \(y = \sin(x)\) のデータをFortranで計算・出力し、Gnuplotでグラフ化してみましょう。

Fortranプログラム (sin_data.f90):

program generate_sin_data
  implicit none
  integer :: i
  real :: x, y
  real, parameter :: pi = acos(-1.0) ! 円周率
  integer, parameter :: data_unit = 10
  integer, parameter :: n_points = 100 ! データ点数

  open(unit=data_unit, file='sin_data.dat', status='replace', action='write')

  ! 0 から 4*pi までを n_points 個の点で計算
  do i = 0, n_points
    x = real(i) / real(n_points) * 4.0 * pi
    y = sin(x)
    write(data_unit, '(F10.6, 1X, F10.6)') x, y ! 固定書式で出力
  end do

  close(data_unit)

  print *, '"sin_data.dat" を作成しました。'

end program generate_sin_data

このプログラムをコンパイル・実行すると、`sin_data.dat`ファイルが生成されます。

# コンパイル (gfortranの場合)
$ gfortran sin_data.f90 -o sin_data
# 実行
$ ./sin_data
 "sin_data.dat" を作成しました。

次に、このデータをプロットするためのGnuplotスクリプト (`plot_sin.gp`) を作成します。

Gnuplotスクリプト (plot_sin.gp):

set terminal pngcairo size 800,400
set output 'sin_graph.png'

set title 'sin(x) のグラフ (0 <= x <= 4*pi)'
set xlabel 'x'
set ylabel 'sin(x)'
set grid
set xrange [0:4*pi] # x軸の範囲指定
set yrange [-1.1:1.1] # y軸の範囲指定
set xtics ("0" 0, "π" pi, "2π" 2*pi, "3π" 3*pi, "4π" 4*pi) # x軸の目盛り設定

plot 'sin_data.dat' using 1:2 with lines title 'Fortran 計算結果' lw 2

最後に、Gnuplotでこのスクリプトを実行します。

$ gnuplot plot_sin.gp

これで、カレントディレクトリに `sin_graph.png` というファイル名で sin 関数のグラフが生成されているはずです 。

5. その他の可視化ツール

Gnuplotは非常に強力で広く使われているツールですが、他にもFortranと連携できる可視化ツールは存在します。

ツール名 特徴 連携方法
Python (Matplotlib, Seabornなど) 高機能で柔軟なグラフ作成が可能。Jupyter Notebookなどでの対話的な分析にも強い。
  • Fortranでデータファイルを出力し、Pythonスクリプトで読み込んでプロット。
  • f2py などを使ってFortranコードをPythonから呼び出し、結果を直接プロット。
Grace (xmgrace) 科学技術分野で古くから使われている2Dグラフ作成ツール。GUI操作も可能。 Fortranでデータファイルを出力し、Graceで読み込むか、コマンドラインオプションで操作。
ParaView / VisIt 大規模な3次元データの可視化に特化した高機能ツール。並列計算結果の可視化など。 VTKなどの標準的なデータフォーマットでFortranから出力し、ParaView/VisItで読み込む。

どのツールを選択するかは、作成したいグラフの種類、必要な機能、使い慣れている環境などによって異なります。まずはGnuplotから試してみるのがおすすめです。

まとめ

このステップでは、Fortranプログラムで計算した結果をファイルに出力し、Gnuplotを使ってグラフとして可視化する方法を学びました。

  • FortranのWRITE文で、スペース区切りなどのテキストファイルにデータを出力する。
  • Gnuplotの基本的な使い方(plotコマンド、各種設定)を理解する。
  • Gnuplotスクリプトを作成して、定型的なグラフ作成を自動化する。
  • (応用) FortranのSYSTEMサブルーチンを使って、プログラム内からGnuplotを呼び出す。

計算結果を視覚的に表現することで、データの傾向や特徴を直感的に把握できるようになります。これは、デバッグ、結果の解釈、そして他者への説明において非常に役立ちます 。

次のステップ(ミニプロジェクト)では、ここで学んだ知識も活用しながら、より実践的なプログラム作成に挑戦してみましょう!

参考情報

  • Gnuplot official website: http://www.gnuplot.info/ – 公式サイト。ドキュメントやデモがあります。
  • Gnuplot ドキュメント日本語訳: (特定の最新公式訳サイトは変動する可能性がありますが、検索すると有志による翻訳が見つかることがあります) – Gnuplotの使い方を日本語で学ぶ際に役立ちます。
  • Fortran 標準の `execute_command_line` サブルーチン: Fortran 2008 で標準化されたサブルーチンで、`SYSTEM` と同様にOSコマンドを実行できます。より標準的で推奨される方法です。使い方を調べてみましょう。 (例: `call execute_command_line(“gnuplot plot_script.gp”)`)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です