MOPACのインストール
google colabolatoryの人は、minicondaをインストールしてから、以下のコードでmopacをインストールしてください。
!conda install -c conda-forge mopac
2. MOPACの実行
1つの分子の計算例と簡単な確認
subprocessは、プログラムを実行させる標準ライブラリー
先頭に!をつけることでシェルコマンドを実行をできます。conda install でMOPACをインストールしていると、以下のようにシェルコマンドでmopacを実行できる用になっています。
openbabelで作成したphenol.dat
を計算する場合には、以下のコードで実行できます。
google colabolatoryなどでシェルコマンドを実行するのは、先頭に!
をつけることで実行できます。mopacのあとにファイル名(パス)を指定すると実行できます。
!mopac "phenol.dat"
subprocessは、プログラムを実行させる標準ライブラリー
今後の応用などやgoogle colabolatory以外でも実行する方法も覚える上でsubprocessでのやり方を学びます。
シェルコマンドは、subprocessを呼び出すことでも実行できます。
mopacの実行は、以下のように行います。
標準ライブラリーであるsubprocessを呼び出します。
その後、subprocess.run()
で実行できます。()
の中に実行したいコードを書くと実行できます。
import subprocess
file_path = "phenol.dat"
# mopacの後にスペースを1つ開ける。
subprocess.run('mopac ' + file_path, shell=True)
実行結果の確認
計算が行われたファイルを確認する。ファイルの確認は、シェルコマンドのcatでできる。
!cat "/content/phenol.arc"
.datに加えて.out及び.arcが生成されていれば計算ができている。以下は、arcファイルの確認
!cat "/content/phenol.out"
正常に終了していれば、以下の文章 JOB ENDED NORMMALLYが表示される。
**********************
* *
* JOB ENDED NORMALLY *
* *
**********************
複数分子の計算例
フォルダ内にある複数分子を計算するやり方を学んでいく。
folder_pathは、ファイルを作成したファオルダー名を指定する。前回作成したところだと、以下の通りだと思います。
folder_path = "/content/drive/MyDrive/data/mopac/"
このフォルダー内にある、datファイルを全て計算するプログラムは、以下の通り。
(tqdmは進捗状況や処理状況をプログレスバー(ステータスバー)として表示する機能になります。無理して使わなくても良いですが便利な機能になっています。)
%%timeをつけて、どれくらい時間がかかるのかも出力してみます。
%%time
import glob
from tqdm import tqdm
# tqdmは進行状況を可視化してくれる
for file_path in tqdm(glob.glob(folder_path + "/*.dat")):
subprocess.run('mopac ' + file_path, shell=True)
実行した123個の分子で10分38秒ほどかかりました。
【補足説明】同時に複数分子を計算する
同時に複数分子の計算例
for 文で 1つずつ行うやり方もありますが、multiprocessingを使って、並列計算を行うと速くなります。
multiprocessingをimportして、cpuの数を表示させます。
from multiprocessing import Pool
import multiprocessing
multiprocessing.cpu_count()
mopacを実行するための関数を書きます。
def mopac_run(file_path):
subprocess.run('mopac ' + file_path, shell=True)
計算するファイル群を書きます。
calc_files = glob.glob(folder_path + "/*.dat")
並行して行う処理数を書きます。(増やしすぎても遅くなります。)
p = Pool(2)
mapで、以下のように書くと並列処理を行います。
%%time
# 並列処理によって、計算終了までの時間が速くなります。
p.map(mopac_run, calc_files)
並列処理により、少し速くなりました。