PySCFとGPUの連携で中・大規模分子を解析【Pythonで始める量子化学計算】

PySCFとGPUの連携で中・大規模分子を解析【Pythonで始める量子化学計算】

この記事は、量子化学計算ライブラリPySCFを使用して中・大規模な分子の計算を効率的に実行する方法を解説したものです。記事では、PySCFをGPUで実行可能な環境の設定から実際の分子構造(例:Epitalon)を対象とした構造最適化の手法までを解説します。この内容を学ぶことで、量子化学計算をより高速かつ効率的に実行できるようになります。

動作検証済み環境

Google colab, pyscf 2.6.2, py3Dmol, PubChemPy 1.0.4., rdkit 2024.3.5, Avogadro 1.2.0

0. 量子化学計算用のソフトウェア: PySCFとは


参考文献[1]から引用

PySCF(Python Simulations of Chemistry Framework)は、Pythonベースのオープンソースの量子化学計算フレームワークです。PySCFは、高度な電子構造計算をシンプルかつ効率的に実行するためのツールを提供し、研究者や学生が量子化学の計算を容易に行えるように設計されています。

PySCFの主な特徴は以下の通りです:

  • モジュラー設計:PySCFは、計算の各ステップ(分子の構造定義、基底状態の計算、励起状態の計算など)をモジュールとして提供しており、必要な部分だけを組み合わせて使用することができます。
  • 高性能計算:内部に高度なアルゴリズムを使用しており、大規模な計算でも高速に処理を行うことができます。
  • 柔軟性: Pythonベースであるため、スクリプトを通じて簡単に操作や拡張が可能です。ユーザーは、計算手法やパラメータをカスタマイズして特定のニーズに合わせることができます。
  • 拡張性: オープンソースであるため、研究者や開発者が自分の研究に合わせてPySCFを拡張することが容易です。新しいアルゴリズムや方法論を追加することで、独自の研究を進めることができます。また、拡張機能が開発され続けている事も特徴です。

本記事では、Google Colab上でGPUを活用してPyscfの計算を実行する方法について詳しく解説します。

1. GPUを活用するメリット


近年、GPU(Graphics Processing Unit)は、計算化学を含む科学計算において重要性を増しています。GPUは、並列計算に優れたアーキテクチャを持つため、特定の計算においてCPUに比べて桁違いの速度を発揮します。

  • 計算時間の大幅な短縮特に、大規模な分子や固体系における行列演算や積分計算で、GPUはその能力を発揮します。

  • コストパフォーマンス高性能なGPUを備えたクラウドサービス(例:Google Colab)を利用することで、計算リソースにかかる初期投資を抑えることが可能です。

  • スケーラビリティ並列計算能力を活用して、複数GPUでさらなる計算の高速化を図ることも可能です。

2. Google ColabでのGPU環境の設定


Google Colabは、Pythonプログラミングやデータ解析、機械学習などに広く利用される無料のクラウドベースのサービスです。ここからは、Google Colab上でGPUを有効化し、PySCF計算に活用するための手順を説明します。

GPUインスタンスの有効化方法

1. Google ColabへのアクセスGoogleアカウントでGoogle Colabにアクセスします。

2. 新しいノートブックを作成 : 画面右下の「+ 新しいノートブック」をクリックして、Pythonノートブックを作成します。

3. ハードウェアアクセラレータの変更 : デフォルトではGPUが無効になっています。以下の手順で有効化します。

  • メニューから「ランタイム」をクリックし、「ランタイムのタイプを変更」を選択します。
  • 「ハードウェア アクセラレータ」のプルダウンメニューから「GPU」を選択します。
  • 「保存」をクリックして設定を適用します。

4.GPUが有効化されたことを確認 : 次のコードを実行し、GPUが利用可能であることを確認します。

import tensorflow as tftf.test.gpu_device_name() 

実行結果として/device:GPU:0が表示されれば、GPUが正しく設定されています。

T4、A100、L4 GPUの違い

Google Colabで利用可能なGPUには、主にT4、A100、L4があります。それぞれの特徴と用途を以下にまとめます(2024年11月24日時点)。今回は無料枠で使えるT4を使用していきます。

項目T4 (Tesla T4)A100 (Ampere A100)L4 (Ada L4)
CUDAコア数256069127680
メモリ容量16GB GDDR640GB/80GB HBM2e24GB GDDR6
計算性能 (FP32)約8.1 TFLOPS約19.5 TFLOPS約29.9 TFLOPS
用途汎用計算、AI推論、軽量な科学計算大規模AI学習、ハイエンド科学計算AI推論、動画処理、科学計算
Google Colabでの利用無料枠・Pro/Pro+で利用可能Pro/Pro+で利用可能主にPro+で利用可能

メモ:Google Colabの制限事項

Google Colabは無料で利用可能ですが、いくつかの制限があります。

  • セッション時間の制限: 1回のセッションは最大12時間まで。
  • GPUリソースの制限: 利用状況によってはGPUが割り当てられない場合もあります。
  • 優先アクセス: Google Colab ProまたはPro+のサブスクリプションでは、より高速なGPUや長時間のセッションが利用可能です。

3. 環境構築手順


Pyscfを活用してGPUで高速な分子軌道計算を実現するためには、適切なライブラリとツールのインストールが必要です。Google Colab環境でのライブラリのセットアップ手順を解説し、特にGPU対応版のPyscfライブラリであるgpu4pyscf-cuda12xについて詳しく説明します。

3.1 必要なライブラリのインストール

以下のコマンドを順番に実行して、必要なライブラリをインストールします。これらのライブラリは、Pyscfを利用した計算、分子構造の操作、可視化などのために必要です。

!pip install gpu4pyscf-cuda12x
!pip install pyscf
!pip install numpy
!pip install geometric
!pip install rdkit
!pip install pubchempy
!pip install py3Dmol

それぞれのライブラリの役割を簡単に説明します[4-5]。

  • gpu4pyscf-cuda12x: GPU計算をサポートするPyscfの拡張版。CUDA 12.xに対応。
  • pyscf: 分子軌道計算を実行するための主要ライブラリ。
  • numpy: 数値計算に必要なPythonの基本ライブラリ。
  • geometric: 分子構造の最適化に利用。
  • rdkit: 分子構造操作やファイルフォーマット変換をサポート。
  • pubchempy: PubChemデータベースから分子情報を取得するためのライブラリ。
  • py3Dmol: 分子構造の3D可視化に利用。

3.2 gpu4pyscf-cuda12x の解説

gpu4pyscf-cuda12xは、CUDAを活用してPyscfの計算をGPUで高速に実行するための拡張ライブラリです。このライブラリは、以下のような特長を持っています。

  • CUDA 12.x対応:CUDAはNVIDIA GPUの演算処理を最適化するための開発ツールです。gpu4pyscf-cuda12xは最新のCUDA 12.xバージョンに対応しており、最新のGPUでの性能向上を活かせます。

  • GPU対応の計算アルゴリズム :分子軌道計算における行列演算や積分計算をGPUで実行可能にします。特に大規模な系や繰り返し計算において大幅な速度向上が期待できます。

  • 互換性:Python 3.8以降およびPyscfライブラリと完全な互換性があります。他の関連ライブラリ(例: numpy)ともスムーズに連携可能です。

3.3 CUDAと関連ドライバの確認

Google Colab上でGPUを利用するためには、CUDAおよびドライバが適切にインストールされている必要があります。以下のコマンドを実行して確認してください。

CUDAバージョンの確認:

!nvcc --version

出力例:

Cuda compilation tools, release 12.0, V12.x.x

GPUの状態確認:

!nvidia-smi

出力例:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02   Driver Version: 530.30.02   CUDA Version: 12.1       |
+-----------------------------------------------------------------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
+-----------------------------------------------------------------------------+

3.4 トラブルシューティング

  • エラー: No GPU found
    Google ColabでGPUを有効化していることを確認してください。
  • CUDAバージョンの不一致
    gpu4pyscf-cuda12xはCUDA 12.xに対応しています。もしCUDA 11.xバージョンの場合はgpu4pyscf-cuda11xを使用してください。

4. PyscfでのGPU計算の実践


それでは、GPUを活用したPyscfでの計算手法を紹介し、CPUとのパフォーマンス比較を行います。特に、βカロテン分子を例に、計算速度や精度、メモリ使用量の観点から詳細に分析します。

4.1 GPUを使用した場合に利用可能な計算手法

GPUを利用したGPU4PySCFは、以下のような計算をサポートしており、特に密度汎関数理論(DFT)計算において幅広い機能を提供します。表4に概要をまとめます[6]。

機能SCF勾配(Gradient)ヘシアン(Hessian)
直接SCFOOCPU
密度フィッティングOOO
局所密度近似 (LDA)OOO
一般化勾配近似 (GGA)OOO
メタGGA (mGGA)OOO
ハイブリッド汎関数OOO
非制限計算 (Unrestricted)OOO
PCM/SMD 溶媒モデルGPUGPUFD
分散補正 (DFT-D3/D4)CPU*CPU*FD
非局所相関OONA
有効コアポテンシャル (ECP)CPUCPUCPU
MP2GPUCPUCPU
CCSDGPUCPUNA

注:

  • 「O」: GPU向けに最適化済み
  • 「GPU」: GPUに対応する置き換えまたは簡易実装
  • 「CPU」: CPUで計算
  • 「FD」: 有限差分法による近似計算
  • 「NA」: 非対応
  • 「CPU*」: DFTD3/DFTD4はCPU上で計算

これらの機能により、GPUでの効率的な電子構造計算が可能です。また、PCM/SMD溶媒モデルや非局所相関など、計算コストの高い手法もGPUで最適化されており、計算ボトルネックを軽減します。

4.2 βカロテン分子を用いたCPU vs GPUのパフォーマンス比較

βカロテン(C₄₀H₅₆)は、分子量が大きく、計算負荷の高い分子です。これを対象に、CPUとGPUでの計算速度を比較します。

手順:

  1. 分子構造の取得と最適化PubChemからβカロテンのSMILESを取得し、RDKitで3D構造を生成・最適化します。

  2. Pyscfによるエネルギー計算生成した構造を用いて、Pyscfでエネルギー計算を実行します。

  3. CPUとGPUでの計算時間の比較同一条件でCPUとGPUの計算時間を測定し、比較します。

コード例:

以下に、βカロテン分子のエネルギー計算をCPUとGPUで実行するコードを示します。

import time
from pyscf import gto, scf
from gpu4pyscf import scf as gpu_scf
from rdkit import Chem
from rdkit.Chem import AllChem
import pubchempy as pcp

# 化合物名を使用してPubChemから取得
compound = pcp.get_compounds("carotenoid", "name")[0]
smiles = compound.isomeric_smiles
mol = Chem.MolFromSmiles(smiles)

# 水素原子を追加
mol = Chem.AddHs(mol)

# 3D構造の生成と最適化
AllChem.EmbedMolecule(mol)
AllChem.UFFOptimizeMolecule(mol)

# XYZ形式で分子構造を取得
xyz_coords = Chem.MolToXYZBlock(mol)

# 原子の数とヘッダー情報を追加
num_atoms = mol.GetNumAtoms()
xyz_full = f"{num_atoms}\\nCarotene molecule\\n" + xyz_coords

# 必要な行のみを抽出(5行目以降)
xyz_lines = xyz_full.splitlines()
xyz_trimmed = "\\n".join(xyz_lines[4:])

print("使用するXYZデータ:")
print(xyz_trimmed)

# PySCFの分子設定
mol = gto.Mole()
mol.atom = xyz_trimmed
mol.basis = "sto-3g"
mol.build()

# CPU計算
start_cpu = time.time()
mf_cpu = scf.RHF(mol)
mf_cpu.kernel()
end_cpu = time.time()
cpu_time = end_cpu - start_cpu

# GPU計算
start_gpu = time.time()
mf_gpu = gpu_scf.RHF(mol)
mf_gpu.kernel()
end_gpu = time.time()
gpu_time = end_gpu - start_gpu

print(f"CPU計算時間: {cpu_time:.2f}秒")
print(f"GPU計算時間: {gpu_time:.2f}秒")

結果: βカロテンを使った同一計算における速度比較

βカロテン(C₄₀H₅₆)の分子構造を対象に、CPUとGPUでのエネルギー計算の速度を比較しました。以下は、STO-3G基底セットでの結果です。

計算環境計算時間(秒)
CPU63.2
GPU37.4

GPU計算はCPU計算に比べ、約2倍の高速化を達成しました。特に、密度行列の計算やフォック行列の構築といった繰り返し処理の多い計算で、GPUの並列計算性能が顕著に現れます。

4.4 他の量子化学計算ソフトウェアとの比較

GPU4PySCFは、他の主要な量子化学計算ソフトウェア(GAMESS、QUICK、Psi4、PySCFのCPU版)と比較して、高い計算効率を示します[6-8]。本節では、それぞれの性能について比較します。

  • GAMESS、QUICK、PySCF(CPU版)との比較

以下は、ポリグリシン(Glyₙ)を対象としたSCFエネルギー計算(10反復)での計算時間の比較です。

システム基底関数GPU4PySCF(秒)GAMESS(秒)QUICK(秒)PySCF(秒)
Gly₃₀STO-3G2.42.33.574.2
Gly₃₀6-31G6.415.212.4238.9
Gly₃₀6-31G(d)17.434.444.1477.4

比較結果のポイント:

  • GAMESS : GPU4PySCFとほぼ同程度の性能を示す場合がある(例:STO-3G基底)。より高次の基底関数(例:6-31G、6-31G(d))では、GPU4PySCFが高速。

  • QUICK:中規模分子では、GPU4PySCFがQUICKより約2~3倍速い。

  • PySCF(CPU版):マルチスレッドを使用しても、GPU4PySCFと比較して10~30倍遅い。

  • Psi4との比較

GPU4PySCFは、Psi4(v1.8)と比較しても、高い速度向上を示します。

SCFエネルギー計算

以下は、分子ごとの計算誤差(エネルギー差、Hartree単位)と速度向上倍率(Psi4に対するGPU4PySCFのスピードアップ)を示したものです。

分子基底関数エネルギー誤差スピードアップ
Vitamin CSTO-3G3.94e-061.081
6-31G2.92e-062.431
def2-SVP3.87e-063.302
def2-TZVPP3.97e-066.502
def2-TZVPD6.44e-068.025
Mg PorphyrinSTO-3G4.61e-064.417
def2-TZVPD5.48e-0715.080

比較結果のポイント:

  1. 精度:GPU4PySCFとPsi4のエネルギー計算結果の誤差は、通常1e-05以下であり、化学的に意味のある範囲内で一致。

  2. 速度:GPU4PySCFは、特に高次基底関数(def2-TZVPP、def2-TZVPD)を用いた計算でPsi4に対して6~15倍の速度向上を達成。

4.4 結論

  1. 総合的なパフォーマンス:GPU4PySCFは、GAMESSやQUICKと比較して高い性能を示し、Psi4に対しても顕著な速度向上を達成しています。特に、大規模分子や高次基底関数の使用が必要な場合に、GPU4PySCFの優位性が際立ちます。

  2. 適用範囲:小規模分子や最小基底関数(STO-3G)の場合、他のソフトウェア(GAMESS、Psi4)が競争力を持つ場合もあります。一方で、DFTやMP2、CCSDなどの高度な手法や大規模計算においては、GPU4PySCFが非常に有効です。

5. GPUを活用した構造最適化


分子構造最適化は、量子化学計算において重要なステップであり、分子の最安定構造を求めるために行います。ここでは、Epitalonという化合物を例に、GPUを活用した効率的な構造最適化の手法と、その可視化方法について解説します。

5.1 Epitalon: 概要

Epitalon(C14H22N4O9)は、4つのアミノ酸(アルギニン、アラニン、グリシン、アスパラギン酸)からなるペプチドで、主にアンチエイジングやテロメラーゼ活性化に関心を持たれています。この分子を例に、構造最適化の実行方法を説明します。

5.2 構造最適化コードの説明

以下のコードを実行することで、Epitalonの構造最適化を行い、その収束プロセスを可視化します。

コードの主要ステップ

1. フォルダ作成とファイル名の設定

計算結果を保存するフォルダを作成し、出力ファイルを管理します。

import os

folder_path = "/content/drive/MyDrive/pyscf_GPU"
base_filename = "Epitalon"
path = os.path.join(folder_path, base_filename)

if not os.path.exists(folder_path):
    os.makedirs(folder_path)
    print(f"Created folder: {folder_path}")

checkpoint_file = path + ".chk"
print(f"Checkpoint file will be saved as: {checkpoint_file}")

2. 分子構造の取得と初期最適化

PubChemからEpitalonの構造を取得し、水素原子を追加して3D構造を生成します。

from rdkit import Chem
from rdkit.Chem import AllChem
import pubchempy as pcp

compound = pcp.get_compounds("Epitalon", "name")[0]
smiles = compound.isomeric_smiles
mol = Chem.MolFromSmiles(smiles)
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol)
AllChem.UFFOptimizeMolecule(mol)

# XYZ形式に変換
xyz_coords = Chem.MolToXYZBlock(mol)
num_atoms = mol.GetNumAtoms()
xyz_full = f"{num_atoms}\\nEpitalon molecule\\n" + xyz_coords
xyz_trimmed = "\\n".join(xyz_full.splitlines()[4:])
print("使用するXYZデータ:\\n", xyz_trimmed)

3. PySCFを用いた構造最適化[5-6]

GPUを活用してB3LYP汎関数を用いた構造最適化を実行します。計算結果(エネルギーと分子座標)をステップごとに保存し、収束状況を追跡します。

from pyscf import gto
from gpu4pyscf import dft
from pyscf.geomopt import geometric_solver

# 分子の設定
mol = gto.Mole()
mol.atom = xyz_trimmed
mol.basis = "sto-3g"
mol.build()

# GPUでのDFT計算設定
mf = dft.RKS(mol, xc='B3LYP').density_fit().to_gpu()
mf.chkfile = path + '.chk'
mf.verbose = 1

energies = []  # エネルギー記録用
geometries = []  # 座標記録用

def cb(envs):
    mf = envs['g_scanner'].base  # 現在の計算オブジェクトを取得
    energies.append(mf.e_tot)  # エネルギーをリストに追加
    geometries.append(mol.atom_coords(unit="ANG"))  # ジオメトリーをリストに追加

conv_params = {
    'convergence_energy': 1e-5,
    'convergence_grms': 3e-4,
    'convergence_gmax': 4.5e-4,
    'convergence_drms': 1.2e-3,
    'convergence_dmax': 1.8e-3
}

# 構造最適化実行
geometric_solver.optimize(mf, callback=cb, **conv_params)

4. エネルギー収束の可視化

各ステップのエネルギーをプロットし、構造最適化の収束状況を確認します。

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5))
plt.plot(energies, marker='o')
plt.title('Energy Convergence During Geometry Optimization')
plt.xlabel('Optimization Step')
plt.ylabel('Total Energy (Hartree)')
plt.grid(True)
plt.show()

5. 分子構造の保存と可視化

最適化の各ステップで生成された分子構造をXYZ形式で保存し、3Dで表示します。

import py3Dmol
from ipywidgets import interact, IntSlider, Dropdown

# ジオメトリーの保存
for i, coords in enumerate(geometries):
    filename = f"{path}_geometry_step_{i+1}.xyz"
    with open(filename, 'w') as f:
        f.write(f"{mol.natm}\\n")
        f.write(f"Step {i+1} Energy: {energies[i]}\\n")
        for j in range(mol.natm):
            symbol = mol.atom_pure_symbol(j)
            x, y, z = coords[j]
            f.write(f"{symbol} {x:.6f} {y:.6f} {z:.6f}\\n")

print("All geometries have been saved.")

# 保存されたXYZファイルを読み込む
def read_xyz(file_path):
    with open(file_path, 'r') as f:
        return f.read()

# 3D可視化
def show_structure(xyz_content, style):
    view = py3Dmol.view(width=800, height=400)
    view.addModel(xyz_content, 'xyz')
    if style == "ball and stick":
        view.setStyle({'stick': {'radius': 0.1}, 'sphere': {'radius': 0.3}})
    elif style == "stick":
        view.setStyle({'stick': {}})
    elif style == "sphere":
        view.setStyle({'sphere': {}})
    view.zoomTo()
    view.show()

# ウィジェットを使ったインタラクション
def visualize_structure(idx, style):
    file_path = f"{path}_geometry_step_{idx}.xyz"
    xyz_content = read_xyz(file_path)
    show_structure(xyz_content, style)

max_steps = len(geometries)
interact(visualize_structure,
         idx=IntSlider(min=1, max=max_steps, step=1, value=1),
         style=Dropdown(options=["ball and stick", "stick", "sphere"], value="ball and stick"))

Epitalonの構造最適化結果:

今回はここまでですが、こちらの技術書を参考にすると以下のように分子軌道可視化や振動数計算、IRスペクトルの計算を行うことも可能です。

EpitalonのLUMOを可視化した結果:

おわりに


いかがでしょうか。この記事ではEpitalon分子を例にGPUを活用した構造最適化の実施方法を紹介しました。PySCFとGPUの組み合わせにより、大規模分子でも効率的に最安定構造を求めることが可能です。是非、色んな分子で挑戦してみてください!!

おまけ


構造最適化の続きで以下のコードを実行することで分子軌道可視化が出来ます。

# 最適化後のジオメトリーを取得
final_geometry = mol.atom_coords(unit="ANG")

# SCF計算の再実行
mf = dft.RKS(mol)
mf.chkfile = 'checkpoint_file.chk'
mf.xc = 'B3LYP'
mf.kernel()

# 計算結果の検証
if mf.mo_occ is not None and len(mf.mo_occ) > 0:
    print("SCF calculation completed successfully.")
    print(f"Number of occupied orbitals: {sum(mf.mo_occ > 0)}")
else:
    raise ValueError(
        "SCF calculation failed or mo_occ is not properly assigned."
        )

# HOMOおよびLUMOのインデックスを取得
homo_index = (mf.mo_occ > 0).nonzero()[0][-1]
lumo_index = (mf.mo_occ == 0).nonzero()[0][0]
from pyscf import tools
import py3Dmol
from IPython.display import display, HTML
import ipywidgets as widgets
import numpy as np

# 指定した軌道のCUBEファイルを生成する関数
def generate_cube_file(orbital_index, filename):
    # Convert mf.mo_coeff to a NumPy array before passing it to tools.cubegen.orbital
    coeff = mf.mo_coeff[:, orbital_index].get() # Use .get() to move the data to CPU
    tools.cubegen.orbital(mol, filename, coeff) 

# 可視化する軌道のリストを作成
orbitals = {
    "LUMO+3": lumo_index + 3,
    "LUMO+2": lumo_index + 2,
    "LUMO+1": lumo_index + 1,
    "LUMO": lumo_index,
    "HOMO": homo_index,
    "HOMO-1": homo_index - 1,
    "HOMO-2": homo_index - 2,
    "HOMO-3": homo_index - 3,
}

# エネルギーをeVに変換
hartree_to_ev = 27.2114
orbital_energies = {
    name: mf.mo_energy[idx] * hartree_to_ev for name, idx in orbitals.items()
}

# ウィジェットの作成
dropdown = widgets.Dropdown(
    options=[
        (f"{name} ({orbital_energies[name]:.6f} eV)", name)
        for name in orbitals.keys()
    ],
    description="Orbital:",
    disabled=False,
)

output = widgets.Output()

# 可視化関数
def visualize_orbital(orbital_name):
    orbital_index = orbitals[orbital_name]
    cube_filename = f"{orbital_name}.cube"

    generate_cube_file(orbital_index, cube_filename)

    view = py3Dmol.view(width=800, height=600)
    with open(cube_filename) as f:
        cube = f.read()
    view.addVolumetricData(
        cube, "cube", {"isoval": 0.02, "color": "red", "opacity": 0.75}
    )
    view.addVolumetricData(
        cube, "cube", {"isoval": -0.02, "color": "blue", "opacity": 0.75}
    )

    # 最適化後の分子形状を追加
    xyz = "\\n".join(
    [
        (
            f"{mol.atom_symbol(i)} "
            f"{final_geometry[i][0]:.6f} "
            f"{final_geometry[i][1]:.6f} "
            f"{final_geometry[i][2]:.6f}"
        )
        for i in range(mol.natm)
    ]
    )
    xyz = f"{mol.natm}\\n\\n" + xyz  # xyzフォーマットのヘッダー追加
    view.addModel(xyz, "xyz")
    view.setStyle({"stick": {}})
    view.zoomTo()

    # エネルギーのラベルを追加
    orbital_energy = orbital_energies[orbital_name]
    view.addLabel(
        f"{orbital_name}: {orbital_energy:.6f} eV",
        {
            "fontSize": 12,
            "fontColor": "black",
            "backgroundColor": "white",
            "backgroundOpacity": 0.8,
            "showBackground": True,
            "position": {"x": 0, "y": 0, "z": 0},
        },
    )

    with output:
        output.clear_output(wait=True)
        display(HTML(view._make_html()))

# ドロップダウンの変更イベントに可視化関数をバインド
def on_dropdown_change(change):
    with output:
        output.clear_output(wait=True)
        visualize_orbital(change["new"])

dropdown.observe(on_dropdown_change, names="value")

# インターフェースの表示
display(dropdown)
display(output)

# 初期表示
visualize_orbital(list(orbitals.keys())[0])

参考文献


[1] PySCF 2.4 公式サイト, https://pyscf.org/ (参照2024-05-24)

[2] Q. Sun, X. Zhang, S. Banerjee, P. Bao, M. Barbry, N. S. Blunt, N. A. Bogdanov, G. H. Booth, J. Chen, Z.-H. Cui, J. J. Eriksen, Y. Gao, S. Guo, J. Hermann, M. R. Hermes, K. Koh, P. Koval, S. Lehtola, Z. Li, J. Liu, N. Mardirossian, J. D. McClain, M. Motta, B. Mussard, H. Q. Pham, A. Pulkin, W. Purwanto, P. J. Robinson, E. Ronca, E. R. Sayfutyarova, M. Scheurer, H. F. Schurkus, J. E. T. Smith, C. Sun, S.-N. Sun, S. Upadhyay, L. K. Wagner, X. Wang, A. White, J. Daniel Whitfield, M. J. Williamson, S. Wouters, J. Yang, J. M. Yu, T. Zhu, T. C. Berkelbach, S. Sharma, A. Yu. Sokolov, and G. K.-L. Chan, “Recent developments in the PySCF program package“, J. Chem. Phys. 153, 024109 (2020).

[3] Q. Sun, T. C. Berkelbach, N. S. Blunt, G. H. Booth, S. Guo, Z. Li, J. Liu, J. McClain, S. Sharma, S. Wouters, and G. K.-L. Chan, “PySCF: the Python-based simulations of chemistry framework“, WIREs Comput. Mol. Sci. 8, e1340 (2018).

[4] Ulf Ekström, Lucas Visscher, Radovan Bast, Andreas J. Thorvaldsen, and Kenneth Ruud, “Arbitrary-order density functional response theory from automatic differentiation“, J. Chem. Theory Comput. 6, 1971 (2010).

[5] Susi Lehtola, Conrad Steigemann, Micael J.T. Oliveira, and Miguel A.L. Marques, “Recent developments in libxc — A comprehensive library of functionals for density functional theory“, SoftwareX 7, 1 (2018).

[6] L.-P. Wang, C.C. Song, “Geometry optimization made simple with translation and rotation coordinates”, J. Chem. Phys. 144, 214108 (2016).

[7] PySCF GPU4PySCFリポジトリ, https://github.com/pyscf/gpu4pyscf/blob/master/README.md.

[8] M. Xie, A. Yu. Sokolov, “Exploring GPU Acceleration for PySCF with GPU4PySCF“, arXiv preprint (2024).

[9] M. Xie, A. Yu. Sokolov, “GPU-accelerated Hartree-Fock calculations in PySCF“, arXiv preprint (2024).

コメントを残す

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