組成可変型進化的アルゴリズム(EA-vc)

情報
情報

動作環境

  • CrySPY 1.4.0以上
  • インターフェースとの互換性はCrySPY > Interfaceを見ること

入力ファイルの準備

下記のどれか一つに従い,その後CrySPY実行のセクションに移ること.

電荷中性条件を課す場合は,cryspy.inの[structure]セクションでchargeを指定する.詳細は機能 > 電荷中性条件を参照.

探索する組成範囲を制限する場合は,cryspy.inの[structure]セクションでmin_compとmax_compを指定する(バージョン1.5.0以降).電荷中性条件との併用も可能.詳細は機能 > 組成制限を参照.

CrySPY実行

組成可変型進化的アルゴリズム(EA-vc)のサブセクション

ASE on Your Local PC (Cu-Ag-Au)

最終更新日:2026年10月16日

ここで利用しているファイルはCrySPY_utility/examples/ase_Cu-Ag-Au_EA-vcからダウンロードできる. このチュートリアルでは,計算が軽いASEのPure Python EMT calculatorを用いてローカルPCで動作確認を行う.対象となるシステムは3元系のCu-Ag-Au.

cryspy.in

cryspy.inの例.

[basic]
algo = EA-vc
calc_code = ASE
nstage = 1
njob = 5
jobcmd = zsh
jobfile = job_cryspy

[structure]
atype = Cu Ag Au
ll_nat = 0 0 0
ul_nat = 8 8 8

[ASE]
ase_python = ase_in.py

[EA]
n_pop = 20
n_crsov = 5
n_perm = 2
n_strain = 2
n_rand = 2
n_add = 3
n_elim = 3
n_subs = 3
n_elite = 2
n_fittest = 10
slct_func = TNM
t_size = 2
ref_energies = 0.0 0.0 0.0
maxgen_ea = 0

[option]
rslt_out = always
energy_output_interval = 1
backup_interval = 1

calc_in/

calc_in/以下はチュートリアル > ランダムサーチ(RS) > ASE in your local PCと同様

calc_in/ase_in.py

from ase.constraints import FixSymmetry
from ase.filters import FrechetCellFilter
from ase.calculators.emt import EMT
from ase.optimize import BFGS
import numpy as np
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')

calc_in/job_cryspy

#!/bin/sh

# ---------- ASE
python3 ase_in.py > out.log

MLIP(Cu-Au)

最終更新日:2026年10月16日

情報
  • ASEのCalculatorとして利用可能な機械学習原子間ポテンシャル(MLIP)のインストールが必要
  • ここでは例として,CHGNetを用いる

ここで利用しているファイルはCrySPY_utility/examples/chgnet_Cu-Au_EA-vcからダウンロードできる. このチュートリアルでは,機械学習原子間ポテンシャル(MLIP)のCHGNetを用いてジョブスケジューラーを備えた計算機クラスタで行うことを想定している. Calculatorの部分を変更すれば,様々なMLIPを用いることができる. 手持ちのPCでも十分動作するので,そうしたい場合は入力を適宜変更すること. 対象となるシステムは2元系のCu-Au.

事前計算

EA-vcではcryspy.inでref_energies(ver. 1.4.3以下ではend_point)として,各元素単体の1原子当たりのエネルギーを基準として用いるため,事前に計算する必要がある. exampleファイルの中に二つのディレクトリがあるはず.

Au_fcc
├── POSCAR
├── chgnet_in.py
└── job_cryspy
Cu_fcc
├── POSCAR
├── chgnet_in.py
└── job_cryspy

結晶構造データ(POSCAR)とその構造最適化を行いエネルギーを求めるpythonスクリプト(chgnet_in.py)およびジョブスクリプト(job_cryspy)があるので適宜使用する計算機の環境に合わせて編集すること.

ジョブを実行する(ジョブサブミットのコマンドは適宜読み替えること).

cd Au_fcc
qsub job_cryspy
cd ../Cu_fcc
qsub job_cryspy
cd ..

計算が無事に終わったら,それぞれのディレクトリにref_energiesというファイルができており,ここに構造最適化後の1原子あたりのエネルギー(eV/atom)が出力されている.

cat Au_fcc/ref_energies
-3.2357187271118164
cat Cu_fcc/ref_energies
-4.083529472351074

これらをcryspy.inでの入力に用いる.

cryspy.in

cryspy.inの例.

[basic]
algo = EA-vc
calc_code = ASE
nstage = 1
njob = 20
jobcmd = qsub
jobfile = job_cryspy

[structure]
atype = Cu Au
ll_nat = 0 0
ul_nat = 8 8

[ASE]
ase_python = chgnet_in.py

[EA]
n_pop = 20
n_crsov = 5
n_perm = 2
n_strain = 2
n_rand = 2
n_add = 3
n_elim = 3
n_subs = 3
n_elite = 2
n_fittest = 10
slct_func = TNM
t_size = 2
maxgen_ea = 0
ref_energies = -4.08352709  -3.23571777

[option]
rslt_out = always
energy_output_interval = 1
backup_interval = 1
  • algo = EA-vc を使用.
  • v1.5.0以降は,[option]セクションのenergy_output_intervalで凸包の図と凸包からの距離のファイルの出力間隔(世代数)を指定できる.デフォルトは1(毎世代),0で自動出力を無効化.
  • v1.5.0以降は,[option]セクションのbackup_intervalで自動バックアップの間隔(世代数)を指定できる.デフォルトは1,0で自動バックアップを無効化.詳細は機能 > バックアップを参照.
  • MLIPではASEのCalculatorを用いるので,calc_code = ASEを使う.
  • jobcmdは計算機環境に合わせて変更すること.
  • [structure]セクションでは,ll_natで各元素の原子数の最小値,ul_natで最大値を指定.
  • n_pop = n_crsov + n_perm + n_strain + n_rand + n_add + n_elim + n_subs
  • ref_energies(ver. 1.4.3以下ではend_point)には事前計算しておいたCu, Auにおける各単体の1原子当たりのエネルギー(eV/atom)を入力.atypeの順番.
  • [EA]セクションのパラメータについては,入力ファイル > [EA] sectionおよび探索アルゴリズム > 組成可変型進化的アルゴリズム(EA-vc)を見ること.
  • 自動的にプロットされる凸包グラフのパラメータはチュートリアル > 組成可変型進化的アルゴリズム(EA-VC) > 解析と可視化も参考にすること.

calc_in/

calc_in/以下はチュートリアル > ランダムサーチ(RS) > ASE in your local PCと同様であるが,少しだけCHGNet用に変更している. ジョブスクリプトのpython本体のpathも計算機環境に合わせること.

calc_in/chgnet_in.py

# ---------- import
from ase.constraints import FixSymmetry
from ase.filters import FrechetCellFilter
from ase.io import read, write
from ase.optimize import FIRE, BFGS, LBFGS
from chgnet.model import CHGNetCalculator

# ---------- input structure
# CrySPY outputs 'POSCAR' as an input file in work/xxxxxx directory
atoms = read('POSCAR')

# ---------- set up
atoms.calc = CHGNetCalculator()
atoms.set_constraint([FixSymmetry(atoms)])
cell_filter = FrechetCellFilter(atoms)
opt = BFGS(cell_filter, trajectory='opt.traj')

# ---------- 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')

calc_in/job_cryspy

#!/bin/sh
#$ -cwd
#$ -V -S /bin/bash
####$ -V -S /bin/zsh
#$ -N CuAu_CrySPY_ID
#$ -pe smp 2

# ---------- OpenMP
export OMP_NUM_THREADS=2

# ---------- ASE
/usr/local/Python-3.10.13/bin/python3 chgnet_in.py > out.log

VASP(Fe-Al)

最終更新日:2026年10月16日

バージョン1.4.2でEA-vcはVASPに対応.

ここで利用しているファイルはCrySPY_utility/examples/vasp_Fe-Al_EA-vcからダウンロードできる. このチュートリアルでは,VASPを用いてジョブスケジューラーを備えた計算機クラスタで行うことを想定している. 対象となるシステムは2元系のFe-Alで,強磁性を仮定した計算を行う.

事前計算

EA-vcではcryspy.inでref_energies(ver. 1.4.3以下ではend_point)として,各元素単体の1原子当たりのエネルギーを基準として用いるため,事前に計算する必要がある. exampleファイルの中に二つのディレクトリがあるはず.

Al-fcc
├── POSCAR
├── INCAR
├── POTCAR_dummy
└── job_cryspy
Fe-bcc
├── POSCAR
├── INCAR
├── POTCAR_dummy
└── job_cryspy

結晶構造データ(POSCAR)とその構造最適化を行いエネルギーを求めるインプットファイル(INCAR)およびジョブスクリプト(job_cryspy)があるので適宜使用する計算機の環境に合わせて編集すること. また,POTCARファイルは配布できないので各自で準備すること.

INCARファイルでは,最終的に使用するカットオフなどの値を単体の計算でも利用しなければならないので注意すること.

ジョブを実行する(ジョブサブミットのコマンドは適宜読み替えること).

cd Al_fcc
qsub job_cryspy
cd ../Fe_bcc
qsub job_cryspy
cd ..

計算が終わったら1原子あたりのエネルギーを計算しておく. 今回はBCCやFCCなので,ユニットセルは1原子で構成されており,全エネルギーの値をそのまま使えばよい. 通常はユニットセルの原子数でセルあたりのエネルギーを割って計算する.

cryspy.in

cryspy.inの例.

[basic]
algo = EA-vc
calc_code = VASP
nstage = 2
njob = 10
jobcmd = qsub
jobfile = job_cryspy

[structure]
atype =  Fe Al
ll_nat =  0  0
ul_nat =  8  8

[VASP]
kppvol = 40 120
vasp_MAGMOM = 4.0 0.0

[EA]
n_pop = 20
n_crsov = 5
n_perm = 2
n_strain = 2
n_rand = 2
n_add = 3
n_elim = 3
n_subs = 3
n_elite = 2
n_fittest = 10
slct_func = TNM
t_size = 2
maxgen_ea = 0
ref_energies = -8.24249611  -3.74226843

[option]
rslt_out = always
energy_output_interval = 1
backup_interval = 1
  • algo = EA-vc を使用.
  • v1.5.0以降は,[option]セクションのenergy_output_intervalで凸包の図と凸包からの距離のファイルの出力間隔(世代数)を指定できる.デフォルトは1(毎世代),0で自動出力を無効化.
  • v1.5.0以降は,[option]セクションのbackup_intervalで自動バックアップの間隔(世代数)を指定できる.デフォルトは1,0で自動バックアップを無効化.詳細は機能 > バックアップを参照.
  • jobcmdは計算機環境に合わせて変更すること.
  • [structure]セクションでは,ll_natで各元素の原子数の最小値,ul_natで最大値を指定.
  • n_pop = n_crsov + n_perm + n_strain + n_rand + n_add + n_elim + n_subs
  • ref_energies(ver. 1.4.3以下ではend_point)には事前計算しておいた,FeおよびAlにおける各単体の1原子当たりのエネルギー(eV/atom)を入力.atypeの順番.
  • [EA]セクションのパラメータについては,入力ファイル > [EA] sectionおよび探索アルゴリズム > 組成可変型進化的アルゴリズム(EA-vc)を見ること.
  • 自動的にプロットされる凸包グラフのパラメータはチュートリアル > 組成可変型進化的アルゴリズム(EA-VC) > 解析と可視化も参考にすること.

For VASP

[VASP]セクションのvasp_MAGMOMにはatypeに対応する元素のMAGMOMの値を入れる. CrySPYは./work/xxx/INCAR(xxxは構造ID)にINCARをコピーする際に,n*vasp_MAGMOM(nは原子数)を追記する.

例えば, atype = (‘Fe’, ‘Al’),nat = (5, 3),vasp_MAGMOM = (4.0 0.0)の場合,下記のように追記する.

MAGMOM = 5*4.0 3*0.0

このチュートリアルでは使用していないが,他にもINCARのLDAUL,LDAUUおよびLDAUJに対応している.cryspy.inではvasp_をつけて下記のように使う.

[VASP]
kppvol = 40 120
vasp_MAGMOM = 4.0 0.0
vasp_LDAUL = 2 -1
vasp_LDAUU = 4.0 0.0
vasp_LDAUJ = 0.0 0.0

nat = (5, 0)のように2元系から単体に次元が落ちる場合,CrySPYは./work/xxx/INCARに下記のように追記する. 原子数がゼロの元素に関しては何もしない.

MAGMOM = 5*4.0
LDAUL = 2
LDAUU = 4.0
LDAUJ = 0.0

calc_in/

POTCAR

EA-vcでは各元素に対応するPOTCARファイルをそれぞれ準備する. ファイル名は

  • POTCAR_Fe
  • POTCAR_Al

のように末尾にatypeに書いた元素名をつける. CrySPYは計算する構造の原子数に合わせて,./work/xxx/POTCARを準備する. つまり,nat = (5, 0)のようにFeだけから構成される構造の場合はPOTCAR_Fe, nat = (4, 4)のようにFe-Al系の場合はPOTCAR_FeとPOTCAR_Alを繋げてPOTCARにする.

job_cryspy

#!/bin/sh
#$ -cwd
#$ -V -S /bin/bash
####$ -V -S /bin/zsh
#$ -N FeAl_CrySPY_ID
#$ -pe smp 32


# ---------- vasp
VASPROOT=/usr/local/vasp/vasp.6.4.2/bin
mpirun -np $NSLOTS $VASPROOT/vasp_std

INCAR

1_INCAR

SYSTEM = FeAl

Algo = Fast
####LREAL = Auto
ENCUT = 348

ISMEAR = 1
SIGMA = 0.1

NSW = 40
IBRION = 2
ISIF = 2

ISPIN = 2
######MAGMOM =   # cryspy append MAGMOM in work/xx/INCAR 

EDIFF = 1e-6
EDIFFG = -0.01

KPAR = 4

LWAVE = .FALSE.
LCHARG = .FALSE.

2_INCAR

SYSTEM = FeAl

Algo = Fast
####LREAL = Auto
ENCUT = 348

ISMEAR = 1
SIGMA = 0.1

NSW = 200
IBRION = 2
ISIF = 3

ISPIN = 2
######MAGMOM =   # cryspy append MAGMOM in work/xx/INCAR 

EDIFF = 1e-6
EDIFFG = -0.01

KPAR = 4

LWAVE = .FALSE.
LCHARG = .FALSE.

QE(Fe-Al)

最終更新日:2026年10月16日

バージョン1.4.2でEA-vcはQEに対応.

ここで利用しているファイルはCrySPY_utility/examples/qe_Fe-Al_EA-vcからダウンロードできる. このチュートリアルでは,QEを用いてジョブスケジューラーを備えた計算機クラスタで行うことを想定している. 対象となるシステムは2元系のFe-Alで,強磁性を仮定した計算を行う.

事前計算

EA-vcではcryspy.inでref_energies(ver. 1.4.3以下ではend_point)として,各元素単体の1原子当たりのエネルギーを基準として用いるため,事前に計算する必要がある. exampleファイルの中に二つのディレクトリがあるはず.

Al-fcc
├── pwscf.in
└── job_cryspy
Fe-bcc
├── pwscf.in
└── job_cryspy

インプットファイル(pwscf.in)およびジョブスクリプト(job_cryspy)があるので適宜使用する計算機の環境に合わせて編集すること.

pwscf.inファイルでは,最終的に使用するカットオフなどの値を単体の計算でも利用しなければならないので注意すること.

ジョブを実行する(ジョブサブミットのコマンドは適宜読み替えること).

cd Al_fcc
qsub job_cryspy
cd ../Fe_bcc
qsub job_cryspy
cd ..

計算が終わったら1原子あたりのエネルギーをeV単位に変換しておくこと. 今回はBCCやFCCなので,ユニットセルは1原子で構成されているが, 通常はユニットセルの原子数でセルあたりのエネルギーを割って計算する.

cryspy.in

cryspy.inの例.

[basic]
algo = EA-vc
calc_code = QE
nstage = 2
njob = 10
jobcmd = qsub
jobfile = job_cryspy

[structure]
atype =  Fe Al
ll_nat =  0  0
ul_nat =  8  8

[QE]
kppvol = 40 120
qe_infile = pwscf.in
qe_outfile = pwscf.out

[EA]
n_pop = 20
n_crsov = 5
n_perm = 2
n_strain = 2
n_rand = 2
n_add = 3
n_elim = 3
n_subs = 3
n_elite = 2
n_fittest = 10
slct_func = TNM
t_size = 2
maxgen_ea = 6
ref_energies = -3406.14117375  -91.25463006

[option]
rslt_out = always
energy_output_interval = 1
backup_interval = 1
  • algo = EA-vc を使用.
  • v1.5.0以降は,[option]セクションのenergy_output_intervalで凸包の図と凸包からの距離のファイルの出力間隔(世代数)を指定できる.デフォルトは1(毎世代),0で自動出力を無効化.
  • v1.5.0以降は,[option]セクションのbackup_intervalで自動バックアップの間隔(世代数)を指定できる.デフォルトは1,0で自動バックアップを無効化.詳細は機能 > バックアップを参照.
  • jobcmdは計算機環境に合わせて変更すること.
  • [structure]セクションでは,ll_natで各元素の原子数の最小値,ul_natで最大値を指定.
  • n_pop = n_crsov + n_perm + n_strain + n_rand + n_add + n_elim + n_subs
  • ref_energies(ver. 1.4.3以下ではend_point)には事前計算しておいた,FeおよびAlにおける各単体の1原子当たりのエネルギー(eV/atom)を入力.atypeの順番.
  • [EA]セクションのパラメータについては,入力ファイル > [EA] sectionおよび探索アルゴリズム > 組成可変型進化的アルゴリズム(EA-vc)を見ること.
  • 自動的にプロットされる凸包グラフのパラメータはチュートリアル > 組成可変型進化的アルゴリズム(EA-VC) > 解析と可視化も参考にすること.

For QE

VASPと違ってQEでは組成可変型への対応は簡単で,2元系の探索の場合は常に2元系のインプット,3元系なら常に3元系のインプットを./calc_inに準備すればよい. ただしnatだけは変更の必要があるので,CrySPYが自動で書き換える. 準備する際は下記のように何か適当な数字でnatを書いておく.

nat = 1

CrySPYは./work/xxx/において,先頭の空白を除いてnatから始まる行を

    nat = (実際の原子数)

に自動的に書き換える.

calc_in/

job_cryspy

#!/bin/sh
#$ -cwd
#$ -V -S /bin/bash
####$ -V -S /bin/zsh
#$ -N FeAl_CrySPY_ID
#$ -pe smp 32


QEROOT=/usr/local/qe/q-e-qe-7.3.1/bin
mpirun -np $NSLOTS $QEROOT/pw.x -nk 4 < pwscf.in > pwscf.out


if [ -e "CRASH" ]; then
    sed -i -e '3 s/^.*$/skip/' stat_job
    exit 1
fi

pwscf.in

1_pwscf.in

&control
calculation = 'relax'
nstep = 40
pseudo_dir = '/usr/local/qe/gbrv/all_pbe_UPF_v1.5/'
outdir='./outdir/'
/


&system
ibrav = 0
nat = 1
ntyp = 2
ecutwfc = 40
ecutrho = 200

occupations = "smearing"
smearing    = "mp"
degauss     =  0.01

nspin = 2
starting_magnetization(1) = 0.4
starting_magnetization(2) = 0.0
/


&electrons
mixing_beta = 0.4
/

&ions
/

&cell
/

ATOMIC_SPECIES
Fe -1.0 fe_pbe_v1.5.uspp.F.UPF
Al -1.0 al_pbe_v1.uspp.F.UPF

2_pwscf.in

&control
calculation = 'vc-relax'
nstep = 200
pseudo_dir = '/usr/local/qe/gbrv/all_pbe_UPF_v1.5/'
outdir='./outdir/'
/


&system
ibrav = 0
nat = 1
ntyp = 2
ecutwfc = 40
ecutrho = 200

occupations = "smearing"
smearing    = "mp"
degauss     =  0.01

nspin = 2
starting_magnetization(1) = 0.4
starting_magnetization(2) = 0.0
/


&electrons
mixing_beta = 0.4
/

&ions
/

&cell
/

ATOMIC_SPECIES
Fe -1.0 fe_pbe_v1.5.uspp.F.UPF
Al -1.0 al_pbe_v1.uspp.F.UPF

次世代の生成

最終更新日:2026年10月16日

初回実行

cryspyを実行すると,構造生成モードになり,第一世代のランダム構造が生成されて,一旦プログラムは終了する.

cryspy

出力をみると,ll_natとul_natの範囲の原子数で構造が生成されているのが確認できる.

...
[2026-07-07 15:18:02,548][cryspy_init][INFO] # ---------- Initial structure generation
[2026-07-07 15:18:02,548][rs_gen][INFO] # ------ mindist
[2026-07-07 15:18:02,549][struc_util][INFO] Cu - Cu: 1.32
[2026-07-07 15:18:02,549][struc_util][INFO] Cu - Ag: 1.385
[2026-07-07 15:18:02,549][struc_util][INFO] Cu - Au: 1.34
[2026-07-07 15:18:02,549][struc_util][INFO] Ag - Ag: 1.45
[2026-07-07 15:18:02,549][struc_util][INFO] Ag - Au: 1.405
[2026-07-07 15:18:02,549][struc_util][INFO] Au - Au: 1.36
[2026-07-07 15:18:02,549][rs_gen][INFO] # ------ Generate random structures
[2026-07-07 15:18:02,712][gen_pyxtal][INFO] Structure ID      0: (6, 6, 2) Space group: 196 --> 216 F-43m
[2026-07-07 15:18:02,721][gen_pyxtal][WARNING] Compoisition [7 5 3] not compatible with symmetry 224:     spg = 224 retry.
[2026-07-07 15:18:02,726][gen_pyxtal][WARNING] Compoisition [3 3] not compatible with symmetry 134:     spg = 134 retry.
[2026-07-07 15:18:02,733][gen_pyxtal][WARNING] Compoisition [ 6  4 16] not compatible with symmetry 140:     spg = 140 retry.
[2026-07-07 15:18:02,822][gen_pyxtal][INFO] Structure ID      1: (1, 4, 3) Space group:  23 -->  71 Immm
[2026-07-07 15:18:02,839][gen_pyxtal][INFO] Structure ID      2: (2, 2, 8) Space group: 150 --> 150 P321
...

cryspy.statを見ると,EAでは現在の世代の情報が追加されている.

[status]
generation = 1
id_queueing = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

構造最適化

何度かcryspyを実行して,第一世代の構造最適化を終わらせると,下記のように出力される.

...
[2026-07-07 15:21:18,273][ea_next_gen][INFO] Done generation 1
[2026-07-07 15:21:18,273][ea_next_gen][INFO] Calculate convex hull for generation 1
Ignoring fixed y limits to fulfill fixed data aspect with adjustable data limits.
[2026-07-07 15:21:18,772][ea_next_gen][INFO] 
EA is ready

凸包

この時点で,./data/convex_hull/にhull distanceの情報とconvex hullのグラフが出力されている.

  • hull_dist_all_gen_1
      ID    hull distance (eV/atom)    Num_atom
      14                   0.000000    (0, 1, 3)
       9                   0.088493    (2, 8, 8)
      15                   0.105278    (8, 7, 5)
      10                   0.200962    (8, 0, 7)
       8                   0.210806    (0, 3, 3)
      13                   0.247862    (5, 6, 8)
      19                   0.258563    (6, 6, 1)
       5                   0.261977    (2, 6, 4)
       6                   0.269711    (7, 7, 2)
      18                   0.290792    (1, 6, 6)
      11                   0.292541    (8, 3, 1)
      16                   0.356158    (6, 2, 4)
       2                   0.373888    (2, 2, 8)
       7                   0.514507    (0, 4, 4)
      12                   0.548770    (3, 4, 4)
       1                   0.617685    (1, 4, 3)
       3                   0.761585    (1, 0, 8)
      17                   0.934091    (6, 4, 7)
       4                   0.955053    (2, 8, 4)
       0                   1.019078    (6, 6, 2)
  • conv_hull_gen_1.svg conv_hull_gen_1.svg conv_hull_gen_1.svg

次世代生成

準備ができた状態でもう一度cryspyを実行すると,次世代構造の生成が始まる. デフォルト(backup_interval = 1)では,次世代構造を生成する直前に自動バックアップが実行される. v1.5.0以降は,[option]セクションのbackup_intervalで間隔(世代数)を変更でき,0で自動バックアップを無効にする.詳細は機能 > バックアップを参照.

cryspy
...
[2026-07-07 15:29:32,182][ea_next_gen][INFO] Done generation 1
[2026-07-07 15:29:32,505][utility][INFO] Backup data
[2026-07-07 15:29:32,512][ea_next_gen][INFO] # ---------- Evolutionary algorithm
[2026-07-07 15:29:32,512][ea_next_gen][INFO] Generation 2
[2026-07-07 15:29:32,512][ea_next_gen][INFO] # ------ Apply nat/composition constraints
[2026-07-07 15:29:32,512][ea_next_gen][INFO] Current candidates after constraint filter: 20
[2026-07-07 15:29:32,513][ea_next_gen][INFO] Elite structures after constraint filter: 0
[2026-07-07 15:29:32,513][ea_next_gen][INFO] # ------ natural selection
[2026-07-07 15:29:32,515][ea_next_gen][INFO] ranking without duplication (including elite):
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID     14, fitness:    0.00000
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID      9, fitness:    0.08849
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID     15, fitness:    0.10528
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID     10, fitness:    0.20096
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID      8, fitness:    0.21081
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID     13, fitness:    0.24786
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID     19, fitness:    0.25856
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID      5, fitness:    0.26198
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID      6, fitness:    0.26971
[2026-07-07 15:29:32,515][ea_next_gen][INFO] Structure ID     18, fitness:    0.29079
[2026-07-07 15:29:32,515][ea_next_gen][INFO] # ------ Generate children
[2026-07-07 15:29:32,515][ea_child][INFO] # -- mindist
[2026-07-07 15:29:32,517][struc_util][INFO] Cu - Cu: 1.32
[2026-07-07 15:29:32,517][struc_util][INFO] Cu - Ag: 1.385
[2026-07-07 15:29:32,517][struc_util][INFO] Cu - Au: 1.34
[2026-07-07 15:29:32,517][struc_util][INFO] Ag - Ag: 1.45
[2026-07-07 15:29:32,517][struc_util][INFO] Ag - Au: 1.405
[2026-07-07 15:29:32,517][struc_util][INFO] Au - Au: 1.36
[2026-07-07 15:29:32,521][ea_child][INFO] eligible candidates for crossover and strain: 10
[2026-07-07 15:29:32,521][ea_child][INFO] eligible candidates for permutation: 10
[2026-07-07 15:29:32,521][ea_child][INFO] eligible candidates for addition: 10
[2026-07-07 15:29:32,522][ea_child][INFO] eligible candidates for elimination: 10
[2026-07-07 15:29:32,522][ea_child][INFO] eligible candidates for substitution: 10
[2026-07-07 15:29:32,527][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,532][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,537][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,541][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,547][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,551][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,556][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,561][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,564][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,569][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,592][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,622][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,644][crossover][WARNING] remove_within_mindist: some atoms within mindist. retry.
[2026-07-07 15:29:32,667][crossover][INFO] Structure ID     20 (8, 3, 5) was generated from     10 and     15 by crossover. Space group:   1 P1
[2026-07-07 15:29:32,668][crossover][INFO] Structure ID     21 (0, 1, 5) was generated from     14 and      8 by crossover. Space group:   1 P1
...
...
...
[2026-07-07 15:29:33,401][ea_next_gen][INFO] # ------ Apply nat/composition constraints to elite candidates
[2026-07-07 15:29:33,401][ea_next_gen][INFO] Elite candidates after constraint filter: 20
[2026-07-07 15:29:33,401][ea_next_gen][INFO] Structure ID     14 keeps as the elite
[2026-07-07 15:29:33,401][ea_next_gen][INFO] Structure ID      9 keeps as the elite

あとはcryspyの実行を繰り返せば,探索が進む.

結果の確認

最終更新日:2026年10月16日

ここでは,EAと異なるところを中心に述べる.

cryspy_rslt

以下は第3世代まで計算を終えたcryspy_rsltの例である.EA-vcでは,形成エネルギー(Ef_eV_atom)と原子数(Num_atom)も追加される.

v1.5.0以降は,[option]セクションのrslt_outでcryspy_rsltとcryspy_rslt_energy_ascの出力タイミングを変更できる.デフォルトはalways.詳細は入力ファイル > [option] Sectionを参照.

    Gen  Spg_num   Spg_sym  Spg_num_opt Spg_sym_opt  E_eV_atom  Ef_eV_atom   Num_atom  Magmom   Opt
0     1      216     F-43m          216       F-43m   1.016698    1.016698  (6, 6, 2)     NaN  done
1     1       71      Immm           71        Immm   0.611438    0.611438  (1, 4, 3)     NaN  done
2     1      150      P321          150        P321   0.365560    0.365560  (2, 2, 8)     NaN  done
3     1      191    P6/mmm          191      P6/mmm   0.761585    0.761585  (1, 0, 8)     NaN  done
4     1      139    I4/mmm          139      I4/mmm   0.950294    0.950294  (2, 8, 4)     NaN  done
5     1       59      Pmmn           59        Pmmn   0.256424    0.256424  (2, 6, 4)     NaN  done
6     1       16      P222           16        P222   0.267629    0.267629  (7, 7, 2)     NaN  done
7     1      183      P6mm          191      P6/mmm   0.506178    0.506178  (0, 4, 4)     NaN  done
8     1       35      Cmm2           35        Cmm2   0.202477    0.202477  (0, 3, 3)     NaN  done
9     1       32      Pba2           32        Pba2   0.081089    0.081089  (2, 8, 8)     NaN  done
10    1      148       R-3          148         R-3   0.200962    0.200962  (8, 0, 7)     NaN  done

組成を指定して結果を確認

v1.5.0以降では,cryspy-printの-c(--composition)オプションで,rslt_data.pklから特定の組成比の結果だけを表示できる. 組成比はatypeの順に指定する.この例ではatype = Cu Ag Auなので,Cuを含まずAgとAuが1:1の構造を確認するには,次のように実行する.

cryspy-print data/pkl_data/rslt_data.pkl -c 0 1 1 --all

組成比は約分して比較されるため,上の表ではNum_atomが(0, 4, 4)のID 7と(0, 3, 3)のID 8が該当する. 該当する結果を形成エネルギー(Ef_eV_atom)の昇順で表示する.--allは該当する全行を表示する指定で,エネルギーが低い先頭10件だけを確認したい場合は--head 10に置き換える.

上の表のデータに対する表示結果:

   Gen  Spg_num Spg_sym  Spg_num_opt Spg_sym_opt  E_eV_atom  Ef_eV_atom   Num_atom  Magmom   Opt
8    1       35    Cmm2           35        Cmm2   0.202477    0.202477  (0, 3, 3)     NaN  done
7    1      183    P6mm          191      P6/mmm   0.506178    0.506178  (0, 4, 4)     NaN  done

nat_data

原子数,組成の情報はnat_dataにも出力される.

      ID    ('Cu', 'Ag', 'Au')    Composition
       0    (    6,     6,     2)    (0.429, 0.429, 0.143)
       1    (    1,     4,     3)    (0.125, 0.500, 0.375)
       2    (    2,     2,     8)    (0.167, 0.167, 0.667)
       3    (    1,     0,     8)    (0.111, 0.000, 0.889)
       4    (    2,     8,     4)    (0.143, 0.571, 0.286)
       5    (    2,     6,     4)    (0.167, 0.500, 0.333)
       6    (    7,     7,     2)    (0.438, 0.438, 0.125)
       7    (    0,     4,     4)    (0.000, 0.500, 0.500)
       8    (    0,     3,     3)    (0.000, 0.500, 0.500)
       9    (    2,     8,     8)    (0.111, 0.444, 0.444)
      10    (    8,     0,     7)    (0.533, 0.000, 0.467)
...

hull_dist_all_gen_x

デフォルト設定では,例えば第3世代終了時点のhull distanceのデータは./data/convex_hull/hull_dist_all_gen_3というファイルに出力される. 出力間隔は[option]セクションのenergy_output_intervalで指定する.デフォルトは1(毎世代),0でファイルの自動出力を無効化.詳細は入力ファイル > [option] Sectionを参照.

      ID    hull distance (eV/atom)    Num_atom
      21                   0.000000    (0, 1, 5)
      46                   0.000000    (0, 1, 3)
      49                   0.000000    (0, 2, 3)
      56                   0.000000    (3, 0, 1)
      14                   0.000000    (0, 1, 3)
      28                   0.000001    (0, 1, 3)
      48                   0.002585    (0, 1, 3)
      45                   0.006762    (2, 8, 8)
      26                   0.007389    (2, 8, 8)
...

conv_hull_gen_x.svg

デフォルト設定では,例えば第3世代終了時点の凸包プロットの画像データは./data/convex_hull/conv_hull_gen_3.svgに出力される. 凸包図の自動出力も同じenergy_output_intervalの設定に従う. デフォルトはsvg形式であるが,入力ファイルでfig_formatを変更していればpdfやpngで出力される. ase_Cu-Ag-Au_EA-vc_gen3.svg ase_Cu-Ag-Au_EA-vc_gen3.svg

解析と可視化

最終更新日:2026年10月16日

自動凸包プロット

EA-vcでは2元系および3元系の探索シミュレーションの場合,デフォルトで各世代の計算終了時に凸包のグラフが自動プロットされる. 画像は ./data/convex_hull/conv_hull_gen_{gen}.{fig_fotmat}に保存される。

バージョン1.5.0以降は,[option]セクションのenergy_output_intervalで出力間隔(世代数)を変更できる.デフォルトは1(毎世代)で,0なら凸包の図と凸包からの距離のファイルの自動出力を無効にする.凸包と凸包からの距離の計算自体は毎世代行われる.詳細は入力ファイル > [option] Sectionを参照.

2元系

fig_EA-vc_2d_lr fig_EA-vc_2d_lr fig_EA-vc_2d_rl fig_EA-vc_2d_rl

上の図は第3世代まで探索した時の例であり,cryspy.inの[visual]セクションで,下記のような入力変数を設定できる. 詳細は CrySPY > Input file > [visual] section.

...
[visual]
ymax = 0.2
markersize = 10
fig_format = svg
label_stable = True
vmax = 0.2
bottom_margin = 0.04
axis_order = lr
...

ここで,vmaxはhull distanceのカラーバーの最大値,bottom_marginは形成エネルギーの最小値とy軸の最小値の間のマージンを表す. 左の図に示すように,axis_order = lr(デフォルト設定)としたとき,atype[0]が左端,aypte[1]が右端になるように描画される. 右の図はaxis_order = rlにしたもの,つまり,atype = Cu Auの場合, 純Cu結晶がグラフの右端,純Au結晶が左端に配置される.

3元系

EA-vc_3d.svg EA-vc_3d.svg EA-vc_3d_ltr.svg EA-vc_3d_ltr.svg

上の図は3元系の例であり,cryspy.inの[visual]セクションで,下記のような入力変数を設定できる. 詳細は CrySPY > Input file > [visual] section.

...
[visual]
markersize = 10
fig_format = svg
###show_max = 0.4
label_stable = True
vmax = 0.2
axis_order = tlr
...

ここで,show_maxはプロットするhull distanceの最大値であり,上記の例ではコメントアウトしてあるので デフォルト値のNoneが適用されている. 左の図に示すように,axis_order = tlr(デフォルト設定)としたとき,atype[0]が上,aypte[1]が左,atype[2]が右のendpointになる. trlやltrなど配置したい順番で指定できる. 右の図は axis_order = ltrのとした時の例で, atype = Cu Ag Auの場合だと,Cuが左,Agが上,Auが右のendpointに配置される.

電荷中性条件

chargeを指定して電荷中性条件を課した場合の凸包プロットを以下に示す. 入力例や電荷の指定方法は機能 > 電荷中性条件を参照.

2元系(左:single-valence,右:multi-valence).

  • single-valence:(Cu, Au) = (+1, -1)
  • multi-valence:(Cu, Au) = ((+2, +3), -2)

電荷中性条件を課した2元系(single-valence) 電荷中性条件を課した2元系(single-valence) 電荷中性条件を課した2元系(multi-valence) 電荷中性条件を課した2元系(multi-valence)

3元系(左:single-valence,右:multi-valence).

  • single-valence:(Cu, Ag, Au) = (+1, +2, -1)
  • multi-valence:(Cu, Ag, Au) = (+1, (+2, +3), -2)

電荷中性条件を課した3元系(single-valence) 電荷中性条件を課した3元系(single-valence) 電荷中性条件を課した3元系(multi-valence) 電荷中性条件を課した3元系(multi-valence)

組成制限

バージョン1.5.0以降では,min_compとmax_compで探索する組成範囲を制限できる. 組成制限を設定した場合,凸包プロットでは組成の許容範囲が青色の領域で示される. 入力例や図の見方は機能 > 組成制限を参照.

2元系(左)と3元系(右)の第3世代までの探索結果の例.

組成制限を用いた2元系の探索結果 組成制限を用いた2元系の探索結果 組成制限を用いた3元系の探索結果 組成制限を用いた3元系の探索結果

探索結果を使わずに入力した組成範囲を確認するには,cryspy-Eplotの-cオプションを利用できる.

電荷中性条件と組成制限の併用

組成制限はchargeによる電荷中性条件とも併用できる. その場合,青色の領域は組成制限のみを表し,生成される構造はその領域内で電荷中性条件も満たすものに限られる. 入力例は機能 > 組成制限を参照.

両方の条件を課した3元系の第3世代までの探索結果の例.

電荷中性条件と組成制限を併用した3元系の探索結果 電荷中性条件と組成制限を併用した3元系の探索結果

cryspy-Eplotを用いた再プロット

もしプロットされた図を調整して再プロットしたい場合は,cryspy-Eplotコマンドを使えば簡単に実行できる.

cryspy-Eplot 

世代を指定した再プロット

cryspy-Eplotコマンドを用いる場合は,専用の以下の入力変数も利用可能となっている.

  • plot_min_gen
  • plot_max_gen
  • ref_gen

例えば,2世代目における図を再プロットするには,[visual]セクションを下記のように書く.

...
[visual]
plot_max_gen = 2
...

cryspy-Eplotを実行すると

cryspy-Eplot 

conv_hull_gen_2.svg conv_hull_gen_2.svg

この場合,CrysPYは ./data/convex_hull/conv_hull_gen_{gen}.{fig_fotmat}にファイルを上書き保存する.

plot_min_genとplot_max_genを用いることで,プロットする世代の範囲を指定することも可能である. plot_min_genに値が設定された場合,たとえそれが1であっても普段と異なる次のファイルに図が保存される. ./data/convex_hull/conv_hull_gen_{plot_min_gen}-{plot_max_gen}.{fig_fotmat}.

conv_hull_gen_1-1_ref_3.svg conv_hull_gen_1-1_ref_3.svg conv_hull_gen_2-2_ref_3.svg conv_hull_gen_2-2_ref_3.svg conv_hull_gen_3-3_ref_3.svg conv_hull_gen_3-3_ref_3.svg

例えば上の図は左から,第1世代.第2世代,第3世代の構造だけを抜き出してきたものである. ただし,ref_gen = 3を使って,凸包(実線)は第3世代ものを常に用いて描いている. ref_genの値はplot_max_gen以上に設定する必要がある. 中央の図のように第2世代だけ抜き出したい場合は,[visual]セクションで下記のように設定する.

...
[visual]
plot_min_gen = 2
plot_max_gen = 2
ref_gen = 3
...

もしref_genが指定された場合は,出力されるファイル名は次のようになる. conv_hull_gen_{plot_min_gen}-{plot_max_gen}_ref_{ref_gen}.{fig_format}.

化合物を基準とした凸包

[visual]セクションのterminalsで基準となる化合物組成を指定すると,化合物を基準とした凸包も描画できる.設定例はコマンド > cryspy-Eplot > 化合物を基準とした凸包を参照.

以下は,電荷中性条件を課したLi–Al–O系の第30世代までの探索結果の例.左は元素を基準とした3元系の凸包,右はLi2OとAl2O3を基準とした擬2元系の凸包.

Li–Al–O系の元素を基準とした凸包 Li–Al–O系の元素を基準とした凸包 Li2OとAl2O3を基準とした凸包 Li2OとAl2O3を基準とした凸包

データのダウンロード

ここでは,CrySPYのデータをローカルPCで解析・可視化することを前提としている. CrySPYをスーパーコンピュータやワークステーションで使用している場合は,データをローカルPCにダウンロードすること. work や backup ディレクトリは,ファイルサイズが非常に大きくなる可能性があるため,不要であれば削除してよい.

Jupyter Notebook

先ほどダウンロードした結果の中にある data/ ディレクトリに移動する. その後,CrySPY utilityがローカルにダウンロード してある場合は cryspy_analyzer_EA-vc.ipynb をコピーする. またはGitHubから直接ダウンロードしてくる(CrySPY_utility/notebook/).

Jupyter notebookファイルには,CrySPYのコードと同じ関数が書かれており,自由に凸包のプロットをカスタマイズできる. 適宜順番に実行していき,下記のどちらかを選ぶと自動プロットと同じものが得られる

  • Binary system, matplotlib
  • Ternary system, matplotlib

途中にある

  • Interactive plot using Plotly

では,2元系,3元系および4元系において,Plotlyを用いたインタラクティブプロットができる.

fig_conv_plotly3d_ternary fig_conv_plotly3d_ternary fig_conv_plotly3d_ternary fig_conv_plotly3d_ternary fig_conv_plotly3d_ternary fig_conv_plotly3d_ternary