[Fortranのはじめ方] Part28: 科学技術計算レポート出力の自動化

Fortran

Fortranによる計算結果を効率的にレポート化しよう!

科学技術計算やシミュレーションを実行した後、その結果をまとめてレポートを作成することは非常に重要です。計算自体はFortranが得意とするところですが、その結果を見やすく整形し、グラフなどを含んだレポートを作成するのは、手作業では時間もかかり、間違いも起こりやすくなります 😥。

ここでは、Fortranプログラムの計算結果をもとに、レポート作成プロセスを自動化する方法について学びましょう。自動化によって、作業効率が大幅に向上し、再現性のあるレポートを簡単に作成できるようになります ✨。

1. Fortranプログラムからのデータ出力

レポート自動化の第一歩は、Fortranプログラムから必要なデータを適切な形式でファイルに出力することです。多くの場合、CSV(Comma-Separated Values)形式や単純なテキストファイルが扱いやすく、他のツールとの連携に適しています。

WRITE文とFORMAT文をうまく活用して、後処理しやすい形式でデータを出力しましょう。

例:計算結果をCSVファイルに出力する

program write_csv_example
  implicit none
  integer :: i, file_unit
  real :: time(5), value(5)

  ! Sample data
  time = [0.0, 1.0, 2.0, 3.0, 4.0]
  value = [1.2, 2.3, 3.1, 4.5, 5.0]

  ! Open file
  open(newunit=file_unit, file='output_data.csv', status='replace', action='write')

  ! Write header
  write(file_unit, '(A, A, A)') 'Time', ',', 'Value'

  ! Write data rows
  do i = 1, size(time)
    write(file_unit, '(F5.1, A, F5.1)') time(i), ',', value(i)
  end do

  ! Close file
  close(file_unit)

  print *, 'Data successfully written to output_data.csv'

end program write_csv_example

この例では、時間と値のペアをoutput_data.csvというファイルに出力しています。1行目にヘッダーを書き込み、その後、各行にカンマ区切りでデータを出力しています。FORMAT文で出力形式を整えることがポイントです。

2. レポート生成ツールの活用 🛠️

Fortranからデータを出力したら、次はそのデータを処理してレポートを生成するツールを活用します。様々なアプローチがありますが、ここでは代表的なものをいくつか紹介します。

2.1. Pythonとの連携 🐍

Pythonはデータ処理、グラフ作成、レポート生成のための豊富なライブラリを持つため、Fortranとの連携に非常に強力です。

  • データ読み込み・処理: pandasライブラリを使ってCSVファイルを簡単に読み込み、データフレームとして操作できます。
  • グラフ作成: matplotlibseabornを使って、読み込んだデータから様々な種類のグラフを生成できます。
  • レポート生成:
    • ReportLab: PDFレポートをプログラムで生成できます。
    • Jinja2 + HTML/CSS: HTMLテンプレートエンジンを使って、動的にHTMLレポートを生成できます。生成されたHTMLはブラウザで表示したり、PDFに変換したりできます。
    • F2PY: FortranコードをPythonモジュールとして直接呼び出すことも可能です。これにより、データファイルを介さずに連携できますが、設定が少し複雑になる場合があります。CtypesとFortran 2003の`ISO_C_binding`機能を使う方法も一般的です。

Pythonとの連携は非常に柔軟性が高く、多くの科学技術計算分野で採用されています。

参考:

2.2. LaTeXとの連携 📜

高品質な数式組版や文書整形が必要な場合、LaTeXが非常に有効です。

  • Fortranプログラムから、LaTeXコマンドを含むテキストファイルを出力します。例えば、計算結果をLaTeXの表形式(tabular環境)で出力するなどです。
  • 別途用意したLaTeXテンプレートファイルに、Fortranが出力したデータを\inputコマンドなどで読み込みます。
  • LaTeXコンパイラ(例: pdflatex)を実行して、最終的なPDFレポートを生成します。

論文や技術文書など、厳密なフォーマットが求められる場合に適しています。

2.3. Markdownとの連携 ✍️

Markdownは軽量マークアップ言語であり、シンプルなテキストベースで記述でき、HTMLやPDFなど様々な形式に変換可能です。

  • Fortranプログラムから、Markdown形式のテキストファイル(計算結果を含む表やリストなど)を出力します。
  • Pandocのようなツールを使って、MarkdownファイルをHTML、PDF、Word文書などに変換します。

手軽にレポートを作成したい場合や、Webページでの公開を前提とする場合に便利です。

2.4. Gnuplotとの連携 📊

Gnuplotは高機能なグラフ描画ツールです。Fortranから直接Gnuplotを呼び出すことは難しいですが、連携は可能です。

  • Fortranで計算結果をデータファイル(例: `data.txt`)に出力します。
  • FortranでGnuplotスクリプトファイル(例: `plot.gp`)を生成します。このスクリプトには、データファイルを読み込んでグラフを描画するコマンドを記述します。
  • シェルスクリプトやMakefileなどを使って、Fortranプログラムの実行後にGnuplotを自動的に実行し、グラフ画像を生成します。(例: `gnuplot plot.gp`)

Step 7で学んだGnuplot連携を自動化プロセスに組み込むことができます。

3. 自動化の実践例(Python連携)

ここでは、Fortranで出力したCSVデータをPythonで読み込み、グラフを作成して簡単なHTMLレポートに出力する流れを見てみましょう。

1. Fortranプログラム (上記 `write_csv_example.f90` を使用)

まず、先ほどのFortranプログラムを実行して `output_data.csv` を生成します。

$ gfortran write_csv_example.f90 -o write_csv
$ ./write_csv

2. Pythonスクリプト (`generate_report.py`)

import pandas as pd
import matplotlib.pyplot as plt
from jinja2 import Environment, FileSystemLoader
import os

# --- 設定 ---
csv_file = 'output_data.csv'
graph_file = 'output_graph.png'
html_template = 'report_template.html'
output_html = 'report.html'

# --- データの読み込み ---
try:
    df = pd.read_csv(csv_file)
    print(f"Successfully loaded data from {csv_file}")
except FileNotFoundError:
    print(f"Error: {csv_file} not found.")
    exit()

# --- グラフの作成と保存 ---
plt.figure(figsize=(8, 5))
plt.plot(df['Time'], df['Value'], marker='o', linestyle='-')
plt.title('Calculation Result')
plt.xlabel('Time')
plt.ylabel('Value')
plt.grid(True)
plt.savefig(graph_file)
print(f"Graph saved to {graph_file}")
plt.close() # メモリ解放

# --- HTMLレポートの生成 ---
env = Environment(loader=FileSystemLoader('.')) # カレントディレクトリのテンプレートを読み込む
template = env.get_template(html_template)

# テンプレートに渡すデータ
template_data = {
    'report_title': 'Calculation Report',
    'description': f'This report shows the result from {csv_file}.',
    'data_table': df.to_html(index=False, classes='table is-striped is-hoverable'), # Bulmaのクラスを指定
    'graph_path': graph_file
}

# HTMLをレンダリング
html_content = template.render(template_data)

# HTMLファイルに書き出し
with open(output_html, 'w', encoding='utf-8') as f:
    f.write(html_content)

print(f"HTML report generated: {output_html}")

3. HTMLテンプレート (`report_template.html`)

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>{{ report_title }}</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.0/css/bulma.min.css">
  <style>
    /* Optional: Add custom styles here */
    .table-container { max-width: 600px; margin: 20px auto; }
    .image-container { text-align: center; margin: 20px auto; }
  </style>
</head>
<body>
  <section class="section">
    <div class="container">
      <h1 class="title">{{ report_title }}</h1>
      <p class="subtitle">{{ description }}</p>

      <h2 class="title is-4">Data Table</h2>
      <div class="table-container">
        {{ data_table | safe }}
      </div>

      <h2 class="title is-4">Result Graph</h2>
      <div class="image-container">
        <img src="{{ graph_path }}" alt="Calculation Result Graph">
      </div>
    </div>
  </section>
</body>
</html>

このPythonスクリプトを実行する前に、必要なライブラリ(`pandas`, `matplotlib`, `jinja2`)をインストールしてください。

$ pip install pandas matplotlib jinja2

そしてPythonスクリプトを実行します。

$ python generate_report.py

これにより、`output_graph.png`(グラフ画像)と`report.html`(レポートファイル)が生成されます。`report.html`をブラウザで開くと、整形された表とグラフが表示されるはずです。

4. (オプション) シェルスクリプトやMakefileによる完全自動化

一連のプロセス(Fortranコンパイル、実行、Pythonスクリプト実行)をシェルスクリプトやMakefileにまとめることで、コマンド一つでレポート生成まで完了させることができます。

例:シェルスクリプト (`run_and_report.sh`)

#!/bin/bash

# Fortranプログラムのコンパイルと実行
echo "Compiling Fortran code..."
gfortran write_csv_example.f90 -o write_csv
if [ $? -ne 0 ]; then
  echo "Fortran compilation failed!"
  exit 1
fi

echo "Running Fortran program..."
./write_csv
if [ $? -ne 0 ]; then
  echo "Fortran program execution failed!"
  exit 1
fi

# Pythonスクリプトの実行
echo "Generating report using Python..."
python generate_report.py
if [ $? -ne 0 ]; then
  echo "Python script execution failed!"
  exit 1
fi

echo "Report generation complete: report.html"

このスクリプトに実行権限を与えて実行します。

$ chmod +x run_and_report.sh
$ ./run_and_report.sh

これにより、一連の処理が自動的に実行されます。Makefileを使えば、ファイルの依存関係を考慮した、より効率的なビルド・実行プロセスを構築できます。

4. まとめ

科学技術計算レポートの自動化は、Fortranプログラマにとって非常に有用なスキルです。計算結果を適切な形式で出力し、Python、LaTeX、Markdown、Gnuplotなどの外部ツールと連携することで、レポート作成の効率と質を大幅に向上させることができます🚀。

特にPythonとの連携は、豊富なライブラリを活用できるため非常に強力です。データ処理、可視化、Web技術との連携など、様々な応用が可能です。

このミニプロジェクトを通して、Fortranでの計算とレポート作成の自動化プロセスを体験し、今後の研究や開発に役立ててください! 💪

コメント

タイトルとURLをコピーしました