The following figure is the bulk structure of NiSe$_2$ downloaded from the materials project database.

enter image description here

Now I want to study the properties of its [111] plane. In detail, I cut the slab with atomic simulation environment (ASE) as follows:

from ase.io import read, write
from ase.build import surface


structA=read('NiSe2.vasp', format='vasp')
structB=surface(structA, (1,1,1), 3, vacuum=10)
write('111.vasp', structB, format='vasp')

The cutted slab is:

enter image description here

In particular, I find the Se5 atom is strange. In addition, the cutted slab is different from this paper:

enter image description here

Here different terminations are considered. Therefore, how can I use ASE cut these (111) slabs with different terminations?

Thanks in advance.

  • 3
    $\begingroup$ If you do manage to automate something, even for this specific material, please share as an answer since others may be able to build off your specific example later. My answer is unfortunately an answer of despair. $\endgroup$ Commented Jan 1, 2021 at 4:52
  • $\begingroup$ @Jack ASE is in the title, why did you remove the ASE tag? $\endgroup$ Commented Mar 12, 2023 at 0:26
  • $\begingroup$ @NikeDattani Not realized that "ASE" tag has been included. $\endgroup$
    – Jack
    Commented Mar 12, 2023 at 5:18
  • $\begingroup$ I wonder cannot just create a slightly bigger (thicker) slab, sort the atoms and their coordintation along the z axis and you cut of what you dont need? also, not all surface can be cut symmetrically without reorganization $\endgroup$
    – Greg
    Commented Mar 12, 2023 at 9:29

1 Answer 1


There is currently no tool built into ASE to do this sort of detective work on surface terminations. I highly suggest that you take the approach of trying to eliminate dangling bonds first (for example, Se atoms with only 1 neighbor). This will give you a more reasonable termination, but may not give you the desired Ni-Se ratio. With a complex unit cell like this, you may not find a solution that is automated unfortunately.

What you can do though if studying a common class of materials is to use ASE as a first pass, clean up the terminations in ase-gui, then save that template. Then start from this template rather than the bulk material if you study similar materials. You may find this easier if you color the atoms by coordination number.

You may find pymatgen or catkit more capable than ASE at generating surfaces, I have heard they tend to do a slightly better job but this is a complex issue.

  • $\begingroup$ Thanks for your suggestion. Maybe materials studio is more suitable for this than ASE. $\endgroup$
    – Jack
    Commented Jan 2, 2021 at 3:49
  • $\begingroup$ @Jack I have heard it works well for this sort of thing as well. Let us know what works best, I am also curious. $\endgroup$ Commented Jan 2, 2021 at 6:23

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .