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ファイルを簡単に読み込み、データフレームとして操作できます。 - グラフ作成:
matplotlib
やseaborn
を使って、読み込んだデータから様々な種類のグラフを生成できます。 - レポート生成:
ReportLab
: PDFレポートをプログラムで生成できます。Jinja2
+ HTML/CSS: HTMLテンプレートエンジンを使って、動的にHTMLレポートを生成できます。生成されたHTMLはブラウザで表示したり、PDFに変換したりできます。F2PY
: FortranコードをPythonモジュールとして直接呼び出すことも可能です。これにより、データファイルを介さずに連携できますが、設定が少し複雑になる場合があります。CtypesとFortran 2003の`ISO_C_binding`機能を使う方法も一般的です。
Pythonとの連携は非常に柔軟性が高く、多くの科学技術計算分野で採用されています。
参考:
- Fortranの手続きをPythonから呼び出すポータブルかつ簡便な方法 (みずほリサーチ&テクノロジーズ)
- PythonからFortranを使う――CtypesとISO_C_bindingの利用 (Qiita)
- すぐに始めるFortran ~Python連携・数値計算ライブラリ利用による実践的活用ガイド~ (Zenn)
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での計算とレポート作成の自動化プロセスを体験し、今後の研究や開発に役立ててください! 💪
コメント