ASE on your local PC
2025年7月11日 更新 v1.4.2
ASEは様々なコードのインターフェースを提供しているPythonライブラリであり, Pure Python EMT calculatorというシンプルなEMTの計算も実行できる.CrySPYさえインストールしてあれば,精度はともかく簡単に計算できるので,CrySPYのテストにちょうど良い.
このチュートリアルでは,MacやLinuxなどのOSのローカルPCを用いてCu 8原子の構造探索を試す.
Assumption
ここでは次のような条件を想定している:
- CrySPY 1.2.0 or later in your local PC
- CrySPY job filename:
job_cryspy - ase input filename:
ase_in.py
Input files
どこか適当なワーキングディレクトリに移動して,まずはexampleをコピーしてくる.下記のどちらからコピーしてきても良い.
- Download from CrySPY_utility/examples/ase_Cu8_RS
- Copy from CrySPY utility that you installed
cd ase_Cu8_RS
tree
.
├── calc_in
│ ├── ase_in.py
│ └── job_cryspy
└── cryspy.in
cryspy.in
cryspy.inはCrySPYの入力ファイル.
[basic]
algo = RS
calc_code = ASE
tot_struc = 5
nstage = 1
njob = 5
jobcmd = zsh
jobfile = job_cryspy
[structure]
atype = Cu
nat = 8
[ASE]
ase_python = ase_in.py
[option]
[basic] セクションのjobcmd = zshは環境に合わせてjobcmd = shやjobcmd = bash等に変更する.
CrySPYは内部でバックグラウンドジョブとしてzsh job_cryspyを実行する.
ASEを使う場合は,[ASE]セクションが必要.
下記の二つのファイル名は好きなように変えても良い.
jobfile:job_cryspyase_python:ase_in.py
他の入力変数については後で説明を行う.
calc_in directory
ASEのジョブファイルや入力ファイルはこのディレクトリに準備する.
Job file
ジョブファイルの名前はcryspy.inのjobfileに一致させる必要がある.
ジョブファイルの例は下記の通り.
#!/bin/sh
# ---------- ASE
python3 ase_in.py
ase_in.pyというファイル名も自由に変えられるが, cryspy.inのase_pythonの値と一致させておく必要がある.
CrySPYではジョブファイルの最後の行はsed -i -e ‘3 s/^.*$/done/’ stat_jobとしておくルールになっている.
バージョン1.4.2からCrySPYがジョブファイルの末尾に自動的に下記を追記するようになった.(参考:機能 > ジョブファイルの自動書き換え)
# ---------- CrySPY
sed -i -e '3s/^sub.*/done/' stat_job
1.4.2より古いバージョンでは,ジョブファイルの最後の行はsed -i -e '3s/^sub.*/done/' stat_jobと書いておくルールになっている.自分でsedコマンド文を書いたジョブファイルを1.4.2以上のバージョンで使用しても2回実行されるだけなので問題はない.
上記sedコマンドの意味は,stat_jobというファイルの3行目のsubから始まる部分をdoneに変える処理.
(詳細:機能 > ジョブファイルの自動書き換え)
CrySPYのジョブファイルのCrySPY_IDという文字列は自動的に構造IDに置き換わるようになっている.
PBSやSLURMといったジョブスケジューラーを使う場合,ジョブ名にCrySPY_IDと書いておくとどの構造のジョブなのかが分かり便利である.
例えば,PBSでは#PBS -N Si_CrySPY_IDのように書いておくと,ジョブをサブミットする際,#PBS -N Si_10のように置き換わる.
注意点として,ジョブ名を数字から始めるとエラーとなることが多いので,Si_のように何か文字列を頭につけておくこと.
Input for ASE
ステージ数(nstage in cryspy.in)に応じた数のインプットファイルが必要となる.
インプットファイル名の先頭にx_,または語尾に_xをつけて準備する.
ここでxはステージ数.
CrySPYが探すインプットファイル名の優先順位は以下の通り.
x_ase_in.pyase_in.py_xase_in.py
各ステージで共通のインプットを使用するのであればx_や_xを省略できる.
このASEのチュートリアルではnstage = 1を用いるので,ASEのインプットファイルはase_in.pyの一つだけでよい.x_や_xを省略したファイルを準備している.
ase_in.pyは例えば下記の通り(ASEの使い方の詳細は公式のドキュメントを見ること).
from ase.constraints import FixSymmetry
from ase.filters import FrechetCellFilter
from ase.calculators.emt import EMT
from ase.optimize import BFGS
from ase.io import read, write
# ---------- input structure
# CrySPY outputs 'POSCAR' as an input file in work/xxxxxx directory
atoms = read('POSCAR', format='vasp')
# ---------- setting and run
atoms.calc = EMT()
atoms.set_constraint([FixSymmetry(atoms)])
cell_filter = FrechetCellFilter(atoms, hydrostatic_strain=False)
opt = BFGS(cell_filter)
# ---------- run
converged = opt.run(fmax=0.01, steps=2000)
# ---------- rule in ASE interface
# output file for energy: 'log.tote' in eV/cell
# CrySPY reads the last line of 'log.tote' file
# outimized structure: 'CONTCAR' file in vasp format
# check_opt: 'out_check_opt' file ('done' or 'not yet')
# CrySPY reads the last line of 'out_check_opt' file
# ------ energy
e = cell_filter.atoms.get_total_energy() # eV/cell
with open('log.tote', mode='w') as f:
f.write(str(e))
# ------ struc
opt_atoms = cell_filter.atoms.copy()
opt_atoms.set_constraint(None) # remove constraint for pymatgen
write('CONTCAR', opt_atoms, format='vasp', direct=True)
# ------ check_opt
with open('out_check_opt', mode='w') as f:
if converged:
f.write('done\n')
else:
f.write('not yet\n')
ASEはVASPやQEなどと違って,入力ファイル(python script)は自分で書くことになるので自由度がある. CrySPYでは3つのルールを設けている.
- エネルギーはeV/cellの単位で
log.toteというファイルに出力する.CrySPYはこのファイルの最後の行を読む. - 最適化後の構造データは
CONTCARというファイルにVASPフォーマットで出力する. - 最適化の収束判定結果を
out_check_optというファイルにdoneかnot_yetで書き込む.CrySPYはこのファイルの最後の行を読む.
CrySPY実行
ここまで準備ができたらCrySPY実行へ進む.