Last-modified: 2017/04/21 19:08:50.

1 install

gem install vasputils

2 概説

VASP を使用していると様々なツールを作りたくなりますが、 気儘にプログラムを作ってると数十とかになりかねません。 ユーザのコマンド環境の名前空間が汚れて嫌な感じですし、 そもそもどんなコマンドをどんな名前で作ったのかわかりにくくなります。

そこで操作を系統ごとにまとめてサブコマンドを備えたコマンド体系を実装しました。

3 使用例

3.1 計算を実行する

ローカルホストで実行するときには以下のようにサブコマンド execute を使います。

vaspdir execute #一点計算の場合

vaspgeomopt execute #構造最適化計算の場合

vasp のパスなどのマシン固有の情報が必要ですが、 これは 自作ライブラリ Comana の機能を使います。

vaspgeomopt の場合、 以前に実行して途中で止まっている構造最適化ディレクトリでは、 自動的に続きを実行します。

3.2 計算を job scheduler のキューに入れる

VaspUtils は Grid engine を想定していますので、 Torque などでは動きません。

基本的には以下のオプションを使います。 qsub スクリプトに埋め込む情報です。

[--q-name=Q_NAME]                    # Queue name for '#$ -q'
[--pe-name=PE_NAME]                  # Parallel environment name for '#$ -pe'
[--ppn=PPN]                          # Process per node, 2nd argument for'#$ -pe'
[--ld-library-path=LD_LIBRARY_PATH]  # Environmental variable 'LD_LIBRARY_PATH'
[--command=COMMAND]                  # Command

その他、 ~/.clustersetting の group に設定してあれば、 --load-group=LOAD_GROUP で設定をロードできます。

qsub スクリプトを生成するだけしたくて、 実際には投げたくないなら --no-submit オプションを入れましょう。

「複数のキューがあるけれど、どれに投げるとか考えたくない! 適当にいいかんじにやっといて!」 という場合には --auto が使えます。 ただし、これには ~/.clustersetting の group の各グループ設定に benchmark の値が必要です。 これは統一した基準で測定した実行時間を想定しています。 bench.Hg の Elapsed time とかでいいと思います。

動作としては、持っているホストに空きがあるキューがあれば、 その中から benchmark が最小(最短)のもの を選択します。 持っているホストに空きがあるキューがなければ、 貯まっているジョブ数、稼動ホスト数、benchmark から 次に投げるジョブが最も早く終わると期待できるキューを選択します。 選択したキューの情報は --load-group と同様に ~/.clustersetting から取得します。

3.3 計算ディレクトリの状態を知る

vaspdir, vaspgeomopt のサブコマンド show を使いましょう。

いろいろオプションがありますが、サブコマンド help で見てください。

3.4 計算ディレクトリの出力ファイルを削除する

vaspdir, vaspgeomopt のサブコマンド clean を使いましょう。 vasp の出力ファイル (CONTCAR, vasprun.xml など) を削除します。 それ以外の名前の、たとえば手作業で作ったファイルは消えません。

3.5 計算ディレクトリを初期化する

vaspdir, vaspgeomopt のサブコマンド init を使いましょう。 vaspdir なら 4ファイル、vaspgeomopt なら geomopt00 の4ファイルのみを残し、 他の全てを削除します。 手作業で作ったファイルも消えます。

3.6 構造最適化の過程を描画する

  1. poscar snapgeomopt
  2. poscar pov

あたりを使います。 特に、poscar pov --atom で --transmit オプションで透明度を使うことで、 構造最適化の過程の順序を示すと(まだしも)見易いと思います。

example/poscar/pov/geomopt/run.rb にサンプルを置いています。

#! /usr/bin/ruby

TRANSMIT_MIN = 0.0
TRANSMIT_MAX = 0.99
POVFILE = 'geomopt.pov'

require 'pp'
require 'fileutils'

system "poscar snapgeomopt"
FileUtils.rm POVFILE if File.exist? POVFILE
system "poscar pov 01.vasp --camera=10,10,70 > #{POVFILE}"
system "poscar pov 01.vasp --cell   >> #{POVFILE}"
system "poscar pov 01.vasp --axes   >> #{POVFILE}"

files = Dir.glob('*.vasp').sort
num_section = files.size - 1

files.each_with_index do |file, i|
  transmit =
    TRANSMIT_MIN * i / num_section +
    TRANSMIT_MAX * (num_section - i) / num_section
    command = "poscar pov #{file} --atom --transmit=#{transmit} >> #{POVFILE}"
    #pp command
    system command
end

system "povray #{POVFILE}"

4 やりたいこと