Gaussian の Scan 計算から結果を抽出する

Gaussian の Scan 計算は、分子構造の一部(結合長、結合角、二面角など)を段階的に変化させながら、各ステップで構造最適化を行う計算方法です。これにより、異性化などの分子構造変化プロセスに伴うエネルギー変化を調べることができます。

Scan 計算の実行方法

Scan 計算を実行するには、Gaussian の入力ファイルで以下のように指示します:

# b3lyp/6-31g(d) opt=modredundant

butadiene cis/trans isomerization

0 1
 C                  1.17156555   -1.44912161    0.00000000
 H                  2.10009025   -0.91738667    0.00000000
 H                  1.16991827   -2.51912042    0.00000000
 C                 -0.00237085   -0.77203916    0.00000000
 H                 -0.93089555   -1.30377410    0.00000000
 C                  0.00000000    0.76795913    0.00000000
 H                  0.92852470    1.29969407    0.00000000
 C                 -1.16989285    1.45200445    0.00000000
 H                 -2.10156042    0.92579563    0.00000000
 H                 -1.16188831    2.52197459    0.00000000

D 8 6 4 1 S 18 10.000000

この例では、ブタジエンの中心C-C結合周りの二面角を操作します。trans型を出発構造とし、二面角を10度ずつ変化させながら、各点で構造最適化を行います。

Scan 計算結果の抽出

Scan 計算の結果は Gaussian の出力ファイルに記録されていますが、その読み取りはやや煩雑です。Gaussian の GUI である GaussView を使えば構造やエネルギーの変化を可視化できますが、変化する座標データを直接出力する方法はないようです(私の知識不足かもしれません🤔)。

そこで、各ステップの最適化構造を抽出するために、以下のような Python スクリプトを作成しました。このコードをextract_structures.pyなどの名前で保存してください。

import re
import argparse

def parse_arguments():
    parser = argparse.ArgumentParser(description='Extract optimized structures from Gaussian output file.')
    parser.add_argument('gaussian_output', help='Path to the Gaussian output file')
    parser.add_argument('coordinate_file', help='Path to save the XYZ file')
    return parser.parse_args()

atomic_symbols = {
    1: "H", 2: "He", 3: "Li", 4: "Be", 5: "B", 6: "C", 7: "N", 8: "O", 9: "F", 10: "Ne",
    11: "Na", 12: "Mg", 13: "Al", 14: "Si", 15: "P", 16: "S", 17: "Cl", 18: "Ar", 19: "K", 20: "Ca",
}

def extract_structures(input_file_path):
    structures = []
    with open(input_file_path, 'r') as file:
        lines = file.readlines()
        i = 0
        current_structure = None

        while i < len(lines):
            if "Standard orientation" in lines[i]:
                i += 5
                coordinates_block = []
                while "---" not in lines[i]:
                    coordinates_block.append(lines[i].strip())
                    i += 1
                current_structure = "\\n".join(coordinates_block)

            if "Stationary point found" in lines[i]:
                if current_structure:
                    structures.append(current_structure)
                current_structure = None

            i += 1

    return structures

def write_xyz_file(structures, xyz_file_path):
    xyz_content = ""
    for scan_point, structure in enumerate(structures, 1):
        atom_lines = structure.strip().splitlines()
        atom_count = len(atom_lines)
        xyz_content += f"{atom_count}\\nScan point {scan_point}\\n"
        for line in atom_lines:
            parts = line.split()
            atomic_number = int(parts[1])
            atomic_symbol = atomic_symbols.get(atomic_number, "X")
            x, y, z = float(parts[3]), float(parts[4]), float(parts[5])
            xyz_content += f"{atomic_symbol} {x:12.6f} {y:12.6f} {z:12.6f}\\n"

    with open(xyz_file_path, 'w') as xyz_file:
        xyz_file.write(xyz_content)

def main():
    args = parse_arguments()
    structures = extract_structures(args.gaussian_output)
    write_xyz_file(structures, args.coordinate_file)
    print(f"Found {len(structures)} optimized structures")
    print(f"XYZ file saved as: {args.coordinate_file}")

if __name__ == "__main__":
    main()

スクリプトの動作

  1. Gaussian出力ファイルを開き、各行を順に読み込みます。
  2. Standard orientationという文字列を検索し、直後の座標ブロックを抽出します。
  3. Stationary point foundという文字列を検出したら、直前の構造を最適化構造として保存します。
  4. 抽出したすべての最適化構造をXYZ形式に変換し、ファイルに出力します。

スクリプトの使い方

この Python スクリプトを実行するには、コマンドラインで以下のように入力します:

python extract_structures.py gaussian_output.log coordinate_file.xyz

ここで、gaussian_output.logは Gaussian の出力ファイル、coordinate_file.xyz は読み取った XYZ 座標を記録したファイルです。

スクリプトを実行すると、Scan 計算の各ステップにおける最適化構造が XYZ 形式で保存されます。得られた結果は以下のように活用できます:

  • 分子構造可視化ソフトウェア(例:VMD、PyMOL)での表示と構造変化のアニメーション作成
  • 特定の原子間距離や角度の変化の詳細な解析
  • 他の計算ソフトウェアへの入力データとしての利用
Gaussian
Posted :