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

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での計算とレポート作成の自動化プロセスを体験し、今後の研究や開発に役立ててください!

コメントを残す

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