あるケミストの独り言(winchemwinの日記)

ケミスト(化学者)の視点で、面白そうな情報(シミュレーション関係など)を発信

Pyscfによる量子化学計算-Tkinterアプリ_9

引き続きpyscfの計算実施用アプリについて紹介したいと思います。
 今回は赤外線吸収スペクトル表示の計算の部分になります。赤外線吸収スペクトルは、これまでのブログでは紹介していませんが、Tkinterのアプリを作成するにあたり新たに追加しました。実行するにはモジュールのインポートの紹介の記事の際に記載していたかもしれませんが、以下のモジュールをインポートしておく必要があります。

from pyscf.prop.freq import rks
from pyscf.prop.infrared.rks import Infrared

以下のコードはこれまでと同様に計算用の関数設定です。Tkinterアプリからの入力値(method, function, baseset等)を受けて、計算の実行を行っています。methodの違い(HF, DFT, MP2)はif文で分岐させていますが、赤外線吸収スペクトル表示については、私の方で試した範囲ではDFTのみで可能でした。そのため、HF、MP2では計算できない旨の表示をさせるようにしています。 

def  infrared_spect():
    # Calculation of infrared spectrum
    
    # Display 'start'
    Label22=ttk.Label(text=u'Calculations(Infrared Spectrum) were started', font=("Times","12"))
    Label22.place(x=20, y=570)
    
    if meth=='HF': 
        # HFではInfrared Spectrum 計算でエラー。計算不可の表示
        
        Label22.place_forget()
        Label11_1=ttk.Label(text=u'Infrared Spectrum by HF can not be performed', font=("Times","12"))
        Label11_1.place(x=20, y=570)
        
        return
      
    elif meth=='DFT':
        mol_ir=gto.M(atom=comp_geo, basis=base,verbose=4,output=svname+'-dftir.xyz', max_memory = mem)
        mol_ir.spin=mul
        mol_ir.charge=chr
        lib.num_threads(thre)
        mf_dft_ir=dft.RKS(mol_ir)
        mf_dft_ir.xc=func
        mf_dft_ir=mf_dft_ir.newton()
        mf_dft_ir.chkfile=svname+'-dftir.chk'
        mf_dft_ir.kernel()
        
        wave_ren, modes = rks.Freq(mf_dft_ir).kernel()
        
        mf_ir_spec=Infrared(mf_dft_ir).run()
        
    elif meth=='MP2':
        
        # MP2 ではInfrared Spectrum 計算でエラー。計算不可の表示
        Label22.place_forget()
        Label11_1=ttk.Label(text=u'Infrared Spectrum by MP2 can not be performed', font=("Times","12"))
        Label11_1.place(x=20, y=570)
        
        return
    
    # Display 'finish'
    Label22.place_forget()
    Label23=ttk.Label(text=u'Calculation was finished', font=("Times","12"))
    Label23.place(x=20, y=540) 
    

 赤外吸収スペクトルの計算は  通常のDFT計算を行った後、以下のコードを追加することで行っています。

wave_ren, modes = rks.Freq(mf_dft_ir).kernel()
mf_ir_spec=Infrared(mf_dft_ir).run()

得られた計算結果は以下のコード(化学あたしいカタチさんのブログも参考)で処理することでTkinterのsubwindowに表示させています。pyscfでは計算結果に対してplot_ir()を実行するだけで簡単にスペクトル図を作成できます。

# IR Spectrum描画(化学あたらしいカタチさんの記事参考)
    sub_window5=tk.Toplevel()
    sub_window5.title('Calculations results (IR Spectrum)')
    sub_window5.geometry('720x540')
    
    fig=mf_ir_spec.plot_ir()[0]
    fig_canvas = FigureCanvasTkAgg (fig, master=sub_window5)
    fig_canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)

    toolbar = NavigationToolbar2Tk(fig_canvas, sub_window5)
    toolbar.update()
    fig_canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
    

以下の図はアセトニトリルの計算で得られるスペクトル図になります。

赤外線吸収スペクトルの図


以上、今回は赤外線吸収スペクトル表示の関数のコードについて紹介させていただきました。
次回は計算実行部分の関数とTkinter設定部分のコードについて紹介したいと思います。