Scriptsのサブセクション
extract_struc.py
2023 April 16 update
init_struc_data.pkl
やopt_struc_data.pkl
から構造ごとにcifファイルを出力するスクリプト.
ファイル出力せず,構造情報を画面にプリントすることも可能.
-i
オプションでインデックス(構造ID)を(複数)指定できる.
-t
オプションでエネルギーが低い順番に指定した構造数のcifファイルを出力可能.
-a
オプションの場合は全ての構造をcifファイルに出力する.数が多い場合はディレクトリを作成してそこに移動してから実行したほうが良い.
-s
オプションをつけると対称性(空間群)の情報を付けられる.ただし,セルや原子数が変わるので注意.
対称性の情をつける際,--tolerance
オプションでtoleranceを変えられる(デフォルトは0.01).
-p
オプションをつけるとファイル出力せずに,画面にプリントする.
gzipしたファイルもそのまま読み込み可能(e.g., opt_struc_data.pkl.gz
).
更新履歴
- 2024 April 16: –tolerance option, gzip
- 2023 July 21: –print option
使い方
python3 extract_struc.py -h
このスクリプトをPATHが通ったところにおけばpython3
を省略できる
extract_struc.py -h
usage: extract_struc.py [-h] [-p] [-a] [-i [INDEX ...]] [-t TOP] [-r] [-s] [--tolerance TOLERANCE] infile
positional arguments:
infile input file
options:
-h, --help show this help message and exit
-p, --print just print, e.g., extract_struc.py opt_struc_data.pkl -i 7 10 12 -ps
-a, --all_id all structures, e.g., extract_struc.py opt_struc_data.pkl -as
-i [INDEX ...], --index [INDEX ...]
structure ID, e.g., extract_struc.py opt_struc_data.pkl -i 7 10 12 -s
-t TOP, --top TOP top k structures, e.g. (k = 3), extract_struc.py opt_struc_data.pkl -t 3 -s
-r, --rank add rank in file names, e.g., extract_struc.py opt_struc_data.pkl -t 3 -rs
-s, --symmetrized symmetrized structure, e.g., extract_struc.py opt_struc_data.pkl -i 7 10 12 -s
--tolerance TOLERANCE
tolerance for symmetrization (default 0.01), e.g., extract_struc.py opt_struc_data.pkl -i 0 1 -s --tolerance 0.01
例
プリント
-p
オプションは-s
以外のオプションと組み合わせて使用することができる.
extract_struc.py -p opt_struc_data.pkl -i 0 1
ID 0
Full Formula (Na8 Cl8)
Reduced Formula: NaCl
abc : 6.823618 6.823618 7.566454
angles: 90.000000 90.000000 96.650518
pbc : True True True
Sites (16)
# SP a b c
--- ---- -------- -------- --------
0 Na 0 0 1
1 Na 0 0 0.5
2 Na 0.704707 0.295293 0.75
3 Na 0.295293 0.704707 0.25
4 Na 0.5 0 1
5 Na 0.5 0 0.5
6 Na 0 0.5 0.5
7 Na 0 0.5 0
8 Cl 0.5 0.5 0
9 Cl 0.5 0.5 0.5
10 Cl 0.484753 0.515247 0.75
11 Cl 0.515247 0.484753 0.25
12 Cl 0.828247 0.171753 0.851096
13 Cl 0.171753 0.828247 0.351096
14 Cl 0.828247 0.171753 0.648904
15 Cl 0.171753 0.828247 0.148904
ID 1
Full Formula (Na8 Cl8)
Reduced Formula: NaCl
abc : 8.145021 8.145021 4.324235
angles: 90.000000 90.000000 120.000000
pbc : True True True
Sites (16)
# SP a b c
--- ---- --------- --------- --------
0 Na 0.666667 0.333333 0.736206
1 Na 0.666667 0.333333 0.263794
2 Na 0.913147 0.086853 0.5
3 Na 0.913147 0.826295 0.5
4 Na 0.173705 0.086853 0.5
5 Na 0.77711 0.22289 0
6 Na 0.77711 0.55422 0
7 Na 0.44578 0.22289 0
8 Cl 0.027675 0.423376 0.5
9 Cl -0.423376 -0.395701 0.5
10 Cl 0.395701 -0.027675 0.5
11 Cl -0.423376 -0.027675 0.5
12 Cl 0.395701 0.423376 0.5
13 Cl 0.027675 -0.395701 0.5
14 Cl 0.333333 0.666667 0.5
15 Cl 0 0 0
構造ID
extract_struc.py opt_struc_data.pkl -i 7 10 12
以下のファイルが出力される.
7.cif
,10.cif
,12.cif
対称性の情報ありの場合は-s
オプションをつける.
extract_struc.py opt_struc_data.pkl -i 7 10 12 -s
2024 April 16
toleranceパラメーター(デフォルトは0.01)を指定する場合
extract_struc.py opt_struc_data.pkl -i 7 10 12 -s --tolerance 0.01
Top k 構造
rslt_data.pkl
がインプット(init_struc_data.pkl
かopt_struc_data.pkl
)と同じディレクトリに必要.
ここでは以下のようにファイルが存在して,
- ./data/pkl_data/opt_struc_data.pkl
- ./data/pkl_data/rslt_data.pkl
cryspy_rslt_energy_asc
の中身が下記のものを仮定すると
Spg_num Spg_sym Spg_num_opt Spg_sym_opt E_eV_atom Magmom Opt
9 110 I4_1cd 110 I4_1cd -1284.708037 NaN not_yet
16 4 P2_1 4 P2_1 -1284.693651 NaN done
97 92 P4_12_12 91 P4_122 -1284.692494 NaN done
8 57 Pbcm 57 Pbcm -1284.668504 NaN done
81 19 P2_12_12_1 19 P2_12_12_1 -1284.635684 NaN done
...
トップk (ここではk=3) の構造は下記コマンドで出力できる.
extract_struc.py ./data/pkl_data/opt_struc_data.pkl -t 3
ここではrlst_data.pkl
は./data/pkl_data/
の中に存在しなければならない.
9.cif
, 16.cif
, 97.cif
というファイルが出力される.
-r
オプションを使うと,ファイル名に順位を含めることができる.
extract_struc.py ./data/pkl_data/opt_struc_data.pkl -t 3 -r
ファイル名は1_9.cif
, 2_16.cif
, 3_97.cif
のようになる.
対称化されたcifの場合は下記のようにする.
extract_struc.py ./data/pkl_data/opt_struc_data.pkl -t 3 -rs
全構造
構造が多い場合はディレクトリを先に作った方が良い.
mkdir init_cifs
cd init_cifs
extract_struc.py /path/to/opt_struc_data.pkl -a
対称化する場合,
extract_struc.py /path/to/init_struc_data.pkl -as
gzipファイル
2024 April 16
gzipされたファイル(拡張子が.gz
)も読み込み可能:
extract_struc.py opt_struc_data.pkl.gz -i 0 1 -s
pos2pkl.py
2023年7月23日更新
あらかじめ用意した構造のテキストデータをinit_struc_data.pkl
に変換するスクリプト.
入力のデフォルトはinit_POSCARS
形式.オプションでPOSCARやcifファイルなどのシングル構造データも変換可能.
出力はinit_struc_data.pkl
.
すでに存在するinit_struc_data.pkl
に構造データを追加することもできる.
構造IDは考慮されず,新しく割り振られる.
原子数が異なる場合はエラーが出る.
init_struc_data.pkl
はCrySPYでシミュレーション開始時にロードすることが可能.
-f
オプションで原子種の削除とソートが可能.このオプションを指定しないとpymatgenが勝手に電気陰性度の順番で並び替えるので注意!
使い方
usage: pos2pkl.py [-h] [-s [SINGLE ...]] [-f [FILTER ...]] [-p] [infile ...]
positional arguments:
infile input file: init_POSCARS
options:
-h, --help show this help message and exit
-s [SINGLE ...], --single [SINGLE ...]
input file: single structure file (POSCAR, cif)
-f [FILTER ...], --filter [FILTER ...]
filter (sort): remove species and sort
-p, --permit_diff_comp
flag for permitting different composition
例
init_POSCARS –> init_struc_data.pkl
CrySPYで構造生成後に出力されるinit_POSCARS
をスパコン等の別のマシンに移すような場合に使える.複数のファイルを変換可能.
python3 pos2pkl.py init_POSCARS
pos2pkl.py
をPATHが通ったところにおけば,python3
は省略可能.
pos2pkl.py init_POSCARS
Composition: Na8 Cl8
Converted. The number of structures: 4
Save init_struc_data.pkl
複数の入力ファイルの場合.
python3 pos2pkl.py init_POSCARS init_POSCARS2 init_POSCARS3
Composition: Na8 Cl8
Converted. The number of structures: 12
Save init_struc_data.pkl
カレントディレクトリにすでにinit_struc_data.pkl
が存在し,それに追加する場合.
python3 pos2pkl.py init_POSCARS
init_struc_data.pkl already exists.
Append to init_struc_data.pkl? [y/n]: y
Load init_struc_data
Composition: Na8 Cl8
The number of structures: 12
Converted. The number of structures: 16
Save init_struc_data.pkl
POSCAR or cif –> init_struc_data.pkl
POSCARファイルやcifファイル等の構造が一つだけのデータも変換可能.-s/--single
オプションが必要.
python3 pos2pkl.py -s POSCAR test.cif
Composition: Na8 Cl8
Converted. The number of structures: 2
Save init_struc_data.pkl
init_POSCARS, POSCAR –> init_struc_data.pkl
python3 pos2pkl.py init_POSCARS -s POSCAR
Composition: Na8 Cl8
Converted. The number of structures: 5
Save init_struc_data.pkl
下記は間違い.init_POSCARS
もシングル構造として取り扱われてしまう.
python3 pos2pkl.py -s POSCAR init_POSCARS
Filter (remove and sort)
次のような組成のcifファイルを考える:Sr8 Co8 O20 X4.これはダミー原子(X4)を4原子含んでいる.
-f/--filter
オプションは原子種を削除したり,ソートするのに使える.
cryspy.in
のatype
と同じように指定する.
python3 pos2pkl.py -s Sr8Co8O20X4.cif -f Sr Co O
Removed species: {'X0+'}
Composition: Sr8 Co8 O20
Converted. The number of structures: 1
Save init_struc_data.pkl
extract_struc.pyを使えば,
init_struc_data.pkl
にどのように登録されたのか確認できる.
python3 extract_struc.py init_struc_data.pkl -pa
ID 0
Full Formula (Sr8 Co8 O20)
Reduced Formula: Sr2Co2O5
...
-f
オプションでソートもできる.
python3 pos2pkl.py -s Sr8Co8O20X4.cif -f O Co
Removed species: {'Sr', 'X0+'}
Composition: O20 Co8
Converted. The number of structures: 1
Save init_struc_data.pkl
kpt_check.py
kpt_check.py
はkppvol
を入力した際にkメッシュがどれくらいになるかをチェックすることができる.
POSCAR
,CONTCAR
,およびinit_struc_data.pkl
が読み込み可能.
pymatgenライブラリが必要.
初期構造を生成後に,kppvol
の値をどれくらいにしたら良いか色々試すことができる.(下記の最後の例を参照)
使い方
python3 kpt_check.py -h
このスクリプトをPATHが通ったところにおけばpython3
を省略できる
kpt_check.py -h
usage: kpt_check.py [-h] [-w] [-n NSTRUC] infile kppvol
positional arguments:
infile input file: POSCAR, CONTCAR, or init_struc_data.pkl
kppvol kppvol
options:
-h, --help show this help message and exit
-w, --write write KPOINTS
-n NSTRUC, --nstruc NSTRUC
number of structure to check
例
POSCARとkppvol
kpt_check.py POSCAR 100
a = 10.689217
b = 10.689217
c = 10.730846
Lattice vector
10.689217 0.000000 0.000000
0.000000 10.689217 0.000000
0.000000 0.000000 10.730846
kppvol: 100
k-points: [2, 2, 2]
KPOINTSファイルの生成
POSCAR
およびCONTCAR
を入力とする際は,-w
オプションを使用することでKPOINTS
ファイルを生成できる.
kpt_check.py -w POSCAR 100
$ cat KPOINTS
pymatgen 4.7.6+ generated KPOINTS with grid density = 607 / atom
0
Monkhorst
2 2 2
init_struc_data.pklとkppvol
init_struc_data.pkl
の初期構造データに任意のkppvol
の値を適用した場合のkメッシュを調べることが可能.
デフォルト設定でははじめの5構造をチェックする.
-n
を使うとチェックする構造数も変えられる.
kpt_check.py -n 3 init_struc_data.pkl 100
# ---------- 0th structure
a = 8.0343076893
b = 8.03430768936
c = 9.1723323373
Lattice vector
8.034308 0.000000 0.000000
-4.017154 6.957915 0.000000
0.000000 0.000000 9.172332
kppvol: 100
k-points: [3, 3, 3]
# ---------- 1th structure
a = 9.8451944096
b = 9.84519440959
c = 6.8764313585
Lattice vector
9.845194 0.000000 0.000000
-4.922597 8.526188 0.000000
0.000000 0.000000 6.876431
kppvol: 100
k-points: [3, 3, 4]
# ---------- 2th structure
a = 7.5760383679
b = 7.57603836797
c = 6.6507478296
Lattice vector
7.576038 0.000000 0.000000
-3.788019 6.561042 0.000000
0.000000 0.000000 6.650748
kppvol: 100
k-points: [4, 4, 4]
repeat_cryspy
cryspy
を何度も実行するのが面倒な時は,下記の自動スクリプトが便利.
これは5分間に1回cryspy
を実行する例.
#!/bin/bash
set -e
while :
do
cryspy -n
LOG_LASTLINE=`tail -n 1 log_cryspy`
if [ "$LOG_LASTLINE" = "Done all structures!" ]
then
exit 0
# ---------- for EA
elif [ "${LOG_LASTLINE:0:17}" = "Reached maxgen_ea" ]
then
exit 0
elif [ "$LOG_LASTLINE" = "EA is ready" ]
then
cryspy -n # EA
LOG_LASTLINE=`tail -n 1 log_cryspy`
if [ "${LOG_LASTLINE:0:17}" = "Reached maxgen_ea" ]
then
exit 0
fi
cryspy -n # submit jobs
# ---------- for BO
elif [ "${LOG_LASTLINE:0:21}" = "Reached max_select_bo" ]
then
exit 0
elif [ "$LOG_LASTLINE" = "BO is ready" ]
then
cryspy -n # selection
LOG_LASTLINE=`tail -n 1 log_cryspy`
if [ "${LOG_LASTLINE:0:21}" = "Reached max_select_bo" ]
then
exit 0
fi
cryspy -n # submit jobs
# ---------- for LAQA
elif [ "$LOG_LASTLINE" = "LAQA is ready" ]
then
cryspy -n # selection
cryspy -n # submit jobs
fi
sleep 300 # seconds
done
print_pkl.py
2024 May 31
data/pkl_data/
にあるピクル化されたファイルをさっとチェックしたい時にprint_pkl.py
を使うと便利.
Usage
python3 print_pkl.py xxxx.pkl
PATHが通っているところにこのpythonスクリプトを置いているならpython3
は省略可能.
print_pkl.py xxxx.pkl
Example
print_pkl.py init_struc_data.pkl
Number of structures: 10
dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print_pkl.py input_data.pkl
[basic]
algo = RS
calc_code = ASE
tot_struc = 10
nstage = 1
njob = 5
jobcmd = zsh
jobfile = job_cryspy
[structure]
struc_mode = crystal
natot = 8
atype = ('Cu', 'Au')
nat = (4, 4)
mindist_factor = 1.0
vol_factor = 1.1
symprec = 0.01
spgnum = all
use_find_wy = False
[option]
stop_chkpt = 0
load_struc_flag = False
stop_next_struc = False
append_struc_ea = False
energy_step_flag = False
struc_step_flag = False
force_step_flag = False
stress_step_flag = False
[ASE]
kpt_flag = False
force_gamma = False
ase_python = ase_in.py
print_pkl.py elite_struc.pkl
Number of structures: 2
dict_keys([3, 6])
print_pkl.py elite_fitness.pkl
{3: -325.79973412221455, 6: -324.8381948581405}