magattacaのブログ

日付以外誤報

DeepMindのDFTのやつ(DM21)がColabで動きました

こんな感じでDM21がColab上で動かせました。コードはDM21のGitHubのREADMEから抜粋しました。

メタンの計算で14分かかりました。何が計算されたのかいまいち分かっていないです。

1. DM21のインストール

!pip install git+git://github.com/deepmind/deepmind-research.git#subdirectory=density_functional_approximation_dm21

2. 必要なライブラリのインポート

DM21はPySCFというソフトウェアに基づいて作られているので基本的にはPySCFと同じやり方で計算できるそうです。残念ながら私はPySCFを使った事がありません。

import density_functional_approximation_dm21 as dm21
from pyscf import gto
from pyscf import dft

3. 計算したい分子の用意

メタン分子を構築するための情報はDM21のGitHubのREADMEを利用しています

# Create methane
methane = gto.Mole()
methane.atom = """H 0.000000000000 0.000000000000 0.000000000000
                  C 0.000000000000 0.000000000000 1.087900000000
                  H 1.025681956337 0.000000000000 1.450533333333
                  H -0.512840978169 0.888266630391 1.450533333333
                  H -0.512840978169 -0.888266630391 1.450533333333"""
methane.basis = 'def2-qzvp'
methane.verbose = 4
methane.build()

分子が構築できるとこんな結果がでます。

[CONFIG] conf_file None
[INPUT] verbose = 4
[INPUT] num. atoms = 5
[INPUT] num. electrons = 10
[INPUT] charge = 0
[INPUT] spin (= nelec alpha-beta = 2S) = 0
[INPUT] symmetry False subgroup None
[INPUT] Mole.unit = angstrom
[INPUT]  1 H      0.000000000000   0.000000000000   0.000000000000 AA    0.000000000000   0.000000000000   0.000000000000 Bohr
[INPUT]  2 C      0.000000000000   0.000000000000   1.087900000000 AA    0.000000000000   0.000000000000   2.055833050914 Bohr
[INPUT]  3 H      1.025681956337   0.000000000000   1.450533333333 AA    1.938257988385   0.000000000000   2.741110734552 Bohr
[INPUT]  4 H     -0.512840978169   0.888266630391   1.450533333333 AA   -0.969128994193   1.678580657029   2.741110734552 Bohr
[INPUT]  5 H     -0.512840978169  -0.888266630391   1.450533333333 AA   -0.969128994193  -1.678580657029   2.741110734552 Bohr

nuclear repulsion = 13.4613239153198
number of shells = 57
number of NR pGTOs = 209
number of NR cGTOs = 177
basis = def2-qzvp
ecp = {}
CPU time:         6.55

DFT計算するためのソルバーを作成

RKSはRestricted Kohn-Shamの略の様です。DM21汎関数をソルバーに代入することで、DM21を使った計算ができる様になります。

# Create a DFT solver and insert the DM21 functional into the solver.
mf = dft.RKS(methane)
mf._numint = dm21.NeuralNumInt(dm21.Functional.DM21)

DFT計算の実行

%%time
# Run the DFT calculation.
mf.kernel()
******** <class 'pyscf.dft.rks.RKS'> ********
method = RKS-RHF
initial guess = minao
damping factor = 0
level_shift factor = 0
DIIS = <class 'pyscf.scf.diis.CDIIS'>
diis_start_cycle = 1
diis_space = 8
SCF conv_tol = 1e-09
SCF conv_tol_grad = None
SCF max_cycles = 50
direct_scf = True
direct_scf_tol = 1e-13
chkfile to save SCF result = /content/tmpmc1ww10e
max_memory 4000 MB (current use 1094 MB)
XC library pyscf.dft.libxc version 5.1.7
    S. Lehtola, C. Steigemann, M. J. Oliveira, and M. A. Marques, SoftwareX 7, 1 (2018)
XC functionals = LDA,VWN
    P. A. M. Dirac, Math. Proc. Cambridge Philos. Soc. 26, 376 (1930)
    F. Bloch, Z. Phys. 57, 545 (1929)
    S. H. Vosko, L. Wilk, and M. Nusair, Can. J. Phys. 58, 1200 (1980)
radial grids: 
    Treutler-Ahlrichs [JCP 102, 346 (1995); DOI:10.1063/1.469408] (M4) radial grids

becke partition: Becke, JCP 88, 2547 (1988); DOI:10.1063/1.454033
pruning grids: <function nwchem_prune at 0x7fce59db0710>
grids dens level: 3
symmetrized grids: False
atomic radii adjust function: <function treutler_atomic_radii_adjust at 0x7fce59db0b90>
small_rho_cutoff = 1e-07
Set gradient conv threshold to 3.16228e-05
tot grids = 53998

関係なさそうな部分を省略します。SCFサイクルが走ってる感じの記述がずっと並んでました。

最終的な結果は以下

Extra cycle  E= -40.5178537368252  delta_E= 4.76e-10  |g|= 5.27e-08  |ddm|= 6.94e-08
converged SCF energy = -40.5178537368252
CPU times: user 25min 26s, sys: 12.7 s, total: 25min 38s
Wall time: 13min 41s

収束したSCFエネルギーは「 -40.5178537368252」(単位はHartree?)で、計算に14分弱かかりました。

GitHubの計算結果は「'CH4': -40.51785372584538」だったのでほとんど同じ値が出ていそうです。

思ったより計算時間がかかりました。