引き続きpyscfの計算実施用アプリについて紹介したいと思います。
今回は分極率の計算の部分になります。
以下のコードはこれまでと同様に計算用の関数設定です。Tkinterアプリからの入力値(method, function, baseset等)を受けて、計算の実行を行っています。methodの違い(HF, DFT, MP2)はif文で分岐させています。分極率は、以前の記事でも紹介したようにPySCFでは、Polarizability()関数を使用します。分極率はテンソル(αxx, αxy、αxz・・・等)の値がnumpy arrayの形で算出されますので、等方的な数値のisotropic α 値を、numpyモジュールで処理をすることで算出しています。Mullken電荷や双極子モーメントの場合と同様に MP2レベルでの計算ではエラーが発生しましたので、計算できない旨のアラートを表示させるようにしています。
def Polar(): # Calculation of Polarizability # Display 'start' Label20=ttk.Label(text=u'Calculations(polarizability analysis) were started', font=("Times","12")) Label20.place(x=20, y=570) # Calculation of polarizability if meth=='HF': mol_pol=gto.M(atom=comp_geo, basis=base,verbose=4,output=svname+'-hfpol.xyz', max_memory = mem) mol_pol.spin=mul mol_pol.charge=chr lib.num_threads(thre) mf_hf_pol=scf.RHF(mol_pol) mf_hf_pol.chkfile=svname+'-hfpol.chk' mf_hf_pol.kernel() polar=mf_hf_pol.Polarizability().polarizability() elif meth=='DFT': mol_pol=gto.M(atom=comp_geo, basis=base,verbose=4,output=svname+'-dftpol.xyz', max_memory = mem) mol_pol.spin=mul mol_pol.charge=chr lib.num_threads(thre) mf_dft_pol=dft.RKS(mol_pol) mf_dft_pol.xc=func mf_dft_pol=mf_dft_pol.newton() mf_dft_pol.chkfile=svname+'-dftpol.chk' mf_dft_pol.kernel() polar=mf_dft_pol.Polarizability().polarizability() elif meth=='MP2': # MP2 ではPolarizability 計算でエラー。計算不可の表示 Label20.place_forget() Label11_1=ttk.Label(text=u'Polarizability calculations by MP2 can not be performed', font=("Times","12")) Label11_1.place(x=20, y=570) return # Display 'finish' Label20.place_forget() Label21=ttk.Label(text=u'Calculation was finished', font=("Times","12")) Label21.place(x=20, y=540)
以上、今回は分極率の計算の関数のコードについて紹介させていただきました。
次回は赤外吸収スペクトル表示の関数のコードについて紹介したいと思います。