ASE on your local PC
2025 July 11, updated for v1.4.2
ASE provides interfaces to different codes. ASE also includes Pure Python EMT calculator, which is suitable for testing CrySPY because of its fast and easy structure optimization.
In this tutorial, we try to use CrySPY in your local PC (Mac or Linux). The target system is Cu 8 atoms.
Assumption
Here, we assume the following conditions:
- CrySPY 1.2.0 or later in your local PC
- CrySPY job filename:
job_cryspy
- ase input filename:
ase_in.py
Input files
Move to your working directory, and copy the example files by one of the following methods.
- 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
is the input file of 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]
In [basic]
section, jobcmd = zsh
can be changed to jobcmd = sh
or jobcmd = bash
in accordance with your environment.
CrySPY runs zsh job_cryspy
as a background job internally.
[ASE]
section is required when you use ASE.
You can name the following files whatever you want:
jobfile
:job_cryspy
ase_python
:ase_in.py
The other input variables are discussed later.
calc_in directory
The job file and input files for ASE are prepared in this directory.
Job file
The name of the job file must match the value of jobfile
in cryspy.in
.
The example of job file (here, job_cryspy
) is shown below.
#!/bin/sh
# ---------- ASE
python3 ase_in.py
You can specify the input (ase_in.py
) file names,
but it must match the values of ase_python
in cryspy.in
.
You must add sed -i -e ‘3 s/^.*$/done/’ stat_job at the end of the file in CrySPY.
Starting from version 1.4.2, CrySPY automatically appends the following line to the end of the job file. (See also: Features > Job file auto-rewriting)
# ---------- CrySPY
sed -i -e '3s/^sub.*/done/' stat_job
For versions older than 1.4.2, the last line of the job file must be written as sed -i -e '3s/^sub.*/done/' stat_job
. If you use a job file with this sed command in version 1.4.2 or later, it will simply be executed twice, which does not cause any problems.
The meaning of the above sed command is to change the part starting with “sub” in the third line of the file stat_job to “done”.
(Detail: Features > Job file auto-rewriting)
In the job file of CrySPY, the string CrySPY_ID
is automatically replaced with the structure ID.
When you use a job scheduler such as PBS and SLURM, it is useful to set the structure ID to the job name.
For example, in the PBS system, #PBS -N Si_CrySPY_ID
in ID 10 is replaced with #PBS -N Si_10
.
Note that starting with a number will result in an error.
You should add a prefix like Si_
.
Input for ASE
Input files corresponding to the number of stages (nstage
in cryspy.in
) are required.
Prepare the input file names by adding x_
as a prefix or _x
as a suffix, where x
is the stage number.
CrySPY searches for input files in the following order of priority:
x_ase_in.py
ase_in.py_x
ase_in.py
If you use the same input for all stages, you can omit x_
or _x
.
In this ASE tutorial, since nstage = 1
is used, only one ASE input file, ase_in.py
, is needed. You can omit x_
or _x
.
An example of ase_in.py
is shown below (for details on how to use ASE, refer to the official documentation).
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')
Unlike VASP and QE, the ASE input (python script) is more flexible. CrySPY has three rules:
- Energy is output in units of eV/cell to
log.tote
file. CrySPY reads the last line of it. - Optimized structure is output to
CONTCAR
file in the VASP format. - The result of the optimization convergence check should be written as either
done
ornot_yet
in a file namedout_check_opt
. CrySPY reads the last line of this file.
Running CrySPY
Go to Running CrySPY