はじめに
このプログラムは第一原理計算の計算が収束しているかどうかを簡単にチェックするためのツールです。計算結果から”total energy”の値を抽出し、その値を用いて折れ線グラフを描画します。このグラフを通じて、計算が進むにつれて”total energy”がどのように減少していくかを視覚的に確認し、計算が収束しているかどうかを判断することができます。
第一原理計算はQuantum Espressoを用いて行い、scf計算を実行した後のファイル(ここではscf.outと名付けています。)を解析することを想定します。
手順
- ファイルを一行ずつ読み込み、指定したパターン(‘total energy ‘)にマッチする行を抽出します。
- 抽出した行から不要な文字列を削除し、必要なデータを取得します。
収束した結果には!が含まれるため、それを削除します。 - データを一時的に保存するためのリストを作成します。
- リストの要素をファイルに書き込み、同時に折れ線グラフの描画に必要なデータを取得します。
- データを使って折れ線グラフを描画し、結果を表示します。
以下に、具体的なコードを示します。
import re import matplotlib.pyplot as plt # 入力ファイル名 input_file = 'scf.out' # 出力ファイル名 output_file = 'temp' # 検索するパターン search_pattern = 'total energy ' # 出力を一時的に保存するリスト output_lines = [] # total energyの行番号 line_number = 1 # 入力ファイルを開く with open(input_file, 'r') as file: # ファイルを一行ずつ読み込む for line in file: # 正規表現を使ってパターンにマッチするかチェック if re.search(search_pattern, line): # '!' を削除 line = line.replace('!', '') # 行番号と4番目のフィールドを取得 fields = line.strip().split() print(fields) try: energy = float(fields[3]) # リストに追加 output_lines.append( (line_number, energy) ) # 行番号の更新 line_number += 1 except ValueError: # floatへの変換に失敗した場合はスキップする continue # 結果をファイルに書き込む with open(output_file, 'w') as file: for line in output_lines: file.write(f"{line[0]} {line[1]}\n") # プロットデータを取得 line_numbers = [line[0] for line in output_lines] energies = [line[1] for line in output_lines] # グラフを描画 plt.plot(line_numbers, energies) plt.xlabel('Line Number') plt.ylabel('Energy') plt.title('Total Energy') plt.grid(True) plt.show()
このコードを実行すると、指定した入力ファイル内から’total energy ‘というパターンにマッチする行を抽出し、4番目のフィールドのデータを折れ線グラフとして描画します。また、抽出したデータを一時ファイルに書き込みます。ファイル出力しておくことで、のちにグラフ描画する際に再利用できるようにしています。
まとめ
Pythonを使えば、ファイル内の特定のパターンを検索してデータを取得し、折れ線グラフとして可視化することができます。この記事では、ファイルの読み込みや正規表現の利用、データの抽出と保存、matplotlibを使ったグラフの描画を活用し、Quantum Espressoのscf計算が収束しているかどうかをtotal energyの変化から判断するプログラムを紹介しました。一度、このようなプログラムを作っておくと、以降の解析が非常に楽になります。
また、Quantum Espressoの出力データ以外のデータ解析や可視化においても、このような手法を活用して効率的な作業ができます。
参考
Quantum Espressoのinputファイルをpythonで作成するプログラム。
非常に役立つプログラムです。