Chapter 44

MOPACの実行

poclabweb
poclabweb
2022.11.04に更新

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)

並列処理により、少し速くなりました。