This HowTo demonstrates how the crystal lattice vectors and atomic basis can be constructed using the space group symbol, lattice parameters and Wyckoff coordinates.
The spacegroup code is required and can be found in the elk/src/spacegroup directory. It is compiled automatically with the elk code.
We will use the hexagonal topological insulator Bi2Se3 for an example.
-
The lattice parameters of Bi2Se3 are a=b=4.138 Å and c=28.64 Å. Note that the units are Angstroms and so we should first convert these to atomic units (Bohr). This means dividing them by 0.529177210903 (CODATA 2018).
In atomic units the lattice parameters are a=b=7.820 a.u. and c=54.12 a.u.
The lattice is hexagonal with space group R-3m. This is the Hermann-Mauguin symbol and can be used by the spacegroup code to construct the crystal structure which is invariant under the space group operations.
To do so, we also have to specify the Wyckoff coordinates.
Take a look at the Bilbao Crystallographic Server (http://www.cryst.ehu.es/) and find the operations corresponding to this space group. We will use the space group in the hexagonal setting which is given by the symbol R-3m:H in the spacegroup code.
The Bi atom is at Wyckoff position 6c for which you need only specify the coordinate (0,0,z), where z=0.399. A total of six atomic coordinates are generated from this by the group operations (combinations of rotation, inversion, reflection and translation).
The first Se atom is at position 3a which means that we have to place one atom at (0,0,0) and the other two are positioned from the symmetry operations giving a total of three atoms.
The next Se atom is also at Wyckoff position 6c but with z=0.206.
These are the experimental crystal parameters determined from X-ray diffraction, see R. W. G. Wyckoff, Crystal Structures, Vol. 2 (Wiley, New York, 1964).
Last edit: J. K. Dewhurst 2019-10-20-
-
The spacegroup.in file for Bi2Se3 is thus:
'R-3m:H' : hrmg 7.820 7.820 54.12 : a, b, c 90.0 90.0 120.0 : bc, ac, ab 1 1 1 : ncell .true. : primcell 2 : nspecies 'Bi' : spsymb, spfname 1 : nwpos 0.000 0.000 0.399 : wpos 'Se' 2 0.000 0.000 0.000 0.000 0.000 0.206
The angles bc, ac and ab are the angles between the lattice vectors a, b and c. These angles are also called alpha, beta and gamma. The lattice system is hexagonal thus a=b and alpha=beta=90° with gamma=120°.
Setting primcell=.true. tells the code to find the smallest possible unit cell (i.e. the primitive cell) which gives the same crystal structure as the conventional cell.
Last edit: J. K. Dewhurst 2019-08-19-
-
Now run the spacegroup code in the same directory as the spacegroup.in file.
This will produce a GEOMETRY.OUT file. Here it is for this example:
! Atomic positions generated by spacegroup version 1.2.01 ! Hermann-Mauguin symbol : R-3m:H ! Hall symbol : -R 3 2" ! Schoenflies symbol : D3d^5 ! space group number : 166:H ! lattice constants (a,b,c) : 7.820000000 7.820000000 54.12000000 ! angles in degrees (bc,ac,ab) : 90.00000000 90.00000000 120.0000000 ! number of conventional unit cells : 1 1 1 ! reduction to primitive cell : T ! Wyckoff positions : ! species : 1, Bi ! 0.000000000 0.000000000 0.3990000000 ! species : 2, Se ! 0.000000000 0.000000000 0.000000000 ! 0.000000000 0.000000000 0.2060000000 avec 3.910000000 6.772318658 0.000000000 7.820000000 0.000000000 0.000000000 0.4440892099E-15 4.514879105 -18.04000000 atoms 2 : nspecies 'Bi.in' : spfname 2 : natoms; atposl, bfcmt below 0.79800000 0.60100000 0.80300000 0.00000000 0.00000000 0.00000000 0.20200000 0.39900000 0.19700000 0.00000000 0.00000000 0.00000000 'Se.in' : spfname 3 : natoms; atposl, bfcmt below 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.41200000 0.79400000 0.38200000 0.00000000 0.00000000 0.00000000 0.58800000 0.20600000 0.61800000 0.00000000 0.00000000 0.00000000
As we can see the stoichiometry is correct, i.e. there are two Bi atoms and three Se atoms.
The GEOMETRY.OUT file can be used directly in the elk.in file. This can be accomplished by appending it to the end of elk.in:
cat GEOMETRY.OUT >> elk.in
-
Finally, we can plot the crystal structure to make sure that everything looks correct.
This can be done using the XCrySDen package (http://www.xcrysden.org/) as follows:
xcrysden --xsf crystal.xsf
The crystal structure looks reasonable:
We can now run elk confident that we have the correct crystal structure.
-
Hi John Kay Dewhurst
Thanks for this tutorial. This worked for the bulk calculations and I got the correct band structure. I am also trying to figure out how to do the same thing for the slab calculation. I am interested in the (001) plane and I want to have 6 quintuple layes (QLs) and 30 bohr of vacuum along the z-axis. Each unit cell contains 3 QLs, so I would ideally want 2 units cells in z-direction. My questions are in bold text.
Firstly, I made the following spacegroup.in file.
'R-3m:H' : hrmg 7.8196867 7.8196867 54.121756 : a, b, c 90 90 120 : bc, ac, ab 1 1 2 : ncell .false. : primcell 2 : nspecies 'Bi' : spsymb, spfname 1 : nwpos 0.0 0.0 0.399 : wpos 'Se' : spsymb, spfname 2 : nwpos 0.0 0.0 0.0 : wpos 0.0 0.0 0.206
Is this the correct method? I got the following GEOMETRY.OUT file.
avec 7.819686700 0.000000000 0.000000000 -3.909843350 6.772047332 0.000000000 0.000000000 0.000000000 108.2435120 atoms 2 : nspecies 'Bi.in' : spfname 12 : natoms; atposl, bfcmt below 0.00000000 0.00000000 0.19950000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.69950000 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.36616667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.86616667 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.53283333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.03283333 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.80050000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.30050000 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.13383333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.63383333 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.96716667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.46716667 0.00000000 0.00000000 0.00000000 'Se.in' : spfname 18 : natoms; atposl, bfcmt below 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.50000000 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.16666667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.66666667 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.33333333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.83333333 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.10300000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.60300000 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.26966667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.76966667 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.43633333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.93633333 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.89700000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.39700000 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.23033333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.73033333 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.06366667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.56366667 0.00000000 0.00000000 0.00000000
After this, I am changing the last line of avec to 0.000000000 0.000000000 138.2435120, so as to include 30 bohr of vacuum. Is this the correct method to include vaccum? Note that I didn't use primcell = .true. in my spacegroup.in file since then I will not be able to add this vacuum on top of a hexagonal unit cell, by changing avec (because the primitive unit cell of Bi2Se3 is rhombohedral).
Unfortunately, I did not get the correct band structure nor did I get any surface state.
My elk.in file looks like this:tasks 1 10 20 mixtype 3 xctype 20 autolinengy true maxscl 100 nempty 10 spinorb .true. cmagz .true. primcell .true. sppath '/home1/sci/opt/elk-5.2.14/species/' plot1d 3 200 : nvp1d, npp1d 0.33333333 0.66666667 0.25 : vlvp1d, K point 0.0 0.0 0.25 : GM point 0.5 0.5 0.25 : M point avec 7.819686700 0.000000000 0.000000000 -3.909843350 6.772047332 0.000000000 0.000000000 0.000000000 138.2435120 atoms 2 : nspecies 'Bi.in' : spfname 12 : natoms; atposl, bfcmt below 0.00000000 0.00000000 0.19950000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.69950000 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.36616667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.86616667 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.53283333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.03283333 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.80050000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.30050000 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.13383333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.63383333 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.96716667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.46716667 0.00000000 0.00000000 0.00000000 'Se.in' : spfname 18 : natoms; atposl, bfcmt below 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.50000000 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.16666667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.66666667 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.33333333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.83333333 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.10300000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.60300000 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.26966667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.76966667 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.43633333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.93633333 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.89700000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.39700000 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.23033333 0.00000000 0.00000000 0.00000000 0.33333333 0.66666667 0.73033333 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.06366667 0.00000000 0.00000000 0.00000000 0.66666667 0.33333333 0.56366667 0.00000000 0.00000000 0.00000000 ngridk 10 10 1
Note that here I am mentioning primcell = .true.
Is my plot1d part of the code correct? Is that the correct way to denote K, Gamma and M points on the surface (001)?
I have also attached my BAND.OUT , BANDLINES.OUT and slurm.out file with this post for your reference.
Last edit: Shadab Ahamed 2019-08-19-
This is not correct: all you've done is stretched the unit cell in the z-direction.
To form a vacuum layer, keep avec as it is and remove the top few layers of atoms.
When you've done this, you can run elk with task=190 to plot the structure.
Regards,
Kay.
https://sourceforge.net/p/elk/discussion/897820/thread/8c297bf308/
0 Comments