3.39 Calculating polarization of solids with FHI-aims
This section describes the relevant keywords connected to the implementation of the Berry-phase formalism within FHI-aims. The theory behind these flags will soon be summarized here.
Tag: output polarization(control.in)
Usage: output polarization pol_direction n_kpoints_dir1 n_kpoints_dir2 n_kpoints_dir3
Purpose: Calculates the electronic and ionic contributions to the polarization in periodic systems via the Berry-phase formalism [165] along a specific reciprocal lattice vector pol_direction using a n_kpoints_dir1 n_kpoints_dir2 n_kpoints_dir3 k-grid. N.B. System must be an insulator/semiconductor.
The polarization direction pol_direction accepts the values 1, 2, or 3, corresponding to the index of the reciprocal space lattice vector along which the polarization is then calculated. The k-point grid defined by the last three fields (n_kpoints_dir1 n_kpoints_dir2 n_kpoints_dir3) should contain integer numbers and defines the k-point density along the reciprocal lattice vectors 1, 2, and 3, respectively. On this mesh, the required eigenstates and wave functions are obtained non-self consistently by Fourier-interpolating the electronic density obtained during the SCF cycle, in close analogy to band-structure or density-of-states calculations.
Note that the polarization is only defined modulo the polarization quantum, therefore, when evaluating polarization differences between different geometries, it is thus necessary to ensure that the polarization changes continuously between different geometries and does not jump by a full quantum. This can be checked by constructing discrete paths between geometries, e.g. between a non-centrosymmetric and centrosymmetric structure. For the latter, the polarization has to vanish. Therefore, relaxed geometries that fulfill all symmetry constraints are necessary to obtain accurate polarization differences.
Multiple polarization calculations can be requested within one FHI-aims run, e.g., to obtain the polarization along all reciprocal lattice vectors:
output polarization 1 20 5 5
output polarization 2 5 20 5
output polarization 3 5 5 20
For each one of these directives, the polarization is evaluated independently. A summary for all directives can be found at the end of the polarization calculations, e.g.,
Summarizing all directives:
Directive 1 in direction of rec. latt. vec. 1 yields the full polarization: 472.792E-03 (C/m2)
Directive 1 in direction of rec. latt. vec. 2 yields the full polarization: 0.0E00 (C/m2)
Directive 1 in direction of rec. latt. vec. 3 yields the full polarization: 0.0E00 (C/m2)
Whenever the polarization is calculated along all three directions within the same run, the code will also output the polarization along the Cartesian axes x, y, z , e.g.,
Cartesian Polarization 403.809855E-06 -684.500436E-06 10.214219E-03
This is particularly useful for non-orthogonal lattice vectors, for which (reciprocal) lattice vectors and Cartesian axes do not coincide.
A quick note on convergence: Generally, a much larger density of k-points is required for polarization calculations than for the SCF cycle. In particular along the reciprocal lattice vector poldirection along which the polarization is evaluated, as the example above shows. The reason is that the Berry-connection is evaluated using finite-differences for the wave-function derivatives with respect to this k-path.
Tag: output Z2_invariant(control.in)
Usage: output Z2_invariant num_of_planes n_kpoints_parallel n_kpoints_perpendicular
Warning: At the current stage, ScalaPACK is not supported, yet. Please specify KS_method serial to force the code to use LAPACK instead.
Purpose: Calculates the evolution of the Wannier Center of Charges (WCC) for num_of_planes planes representing the Brillouin zone. n_kpoints_parallel and n_kpoints_perpendicular denote the k-point mesh in the plane, whereby n_kpoints_parallel are the k-points paralleland n_kpoints_perpendicular are those perpendicular to the direction along which the WCC evolution is evaluated, as in the case of the tag output polarization. The obtained WCC evolution allows the subsequent determination of the topological invariant Z2 [162] and the characterization of insulators into topologically trivial (those with even Z2) and topologically non-trivial (those with odd Z2). Note that the material must be insulating and should have the time reversal symmetry.
The index num_of_planes denotes the following planes in reciprocal space:
-
1.
kx=[-0.5, 0.5] ky=[0.0, 0.5] kz= 0.0 || kx = kparallel / ky = kperpendicular
-
2.
kx= [-0.5, 0.5] ky=[0.0, 0.5] kz= 0.5 || kx = kparallel / ky = kperpendicular
-
3.
kx= 0.0 ky=[-0.5, 0.5] kz= [0.0, 0.5] || ky = kparallel / kz = kperpendicular
-
4.
kx= 0.5 ky=[-0.5, 0.5] kz= [0.0, 0.5] || ky = kparallel / kz = kperpendicular
-
5.
kx= [0.0, 0.5] ky=0.0 kz= [-0.5, 0.5] || kz = kparallel / kx = kperpendicular
-
6.
kx= [0.0, 0.5] ky=0.5 kz= [0.0, 0.5] || kz = kparallel / kx = kperpendicular
The code always iterates over all planes between 1 and num_of_planes and for each plane n the evolution of the WCC can be found in the output file WCCn.dat. For each plane n, the output file WCCn.dat allows to investigate how many times the Berry phase is cycled through the Brillouin zone and thus allows to determine the topological invariant Z2 for this particular plane [162]. In practice, this can be done by plotting the WCC evolution and counting how often the WCC evolution crosses an arbitrary line parallel to the abscissa [324]. An odd number of crossings implies Z2=1 (topological), an even number Z2=0 (trivial insulator). See Fig.3.10 for some examples.
Alternatively, the value of Z2 can be determined automatically using the approach proposed by [283] and implemented in the script get_z2.py that can be found in the utilities folder of the FHI-aims distribution. The main idea behind the algorithm is that topological indexes (in fact winding numbers) can be determined by tracking the biggest gap in phase between the evolution of the individual WCC centers along the WCC path, see [283, 114]. In practice, it is sufficient to copy get_z2.py into the folder containing the WCCn.dat files and to execute it there. Besides plotting the WCC evolution, the determined Z2 indexes for the individual planes n are reported both in the title of the graphes and in the file output_z2.dat.
To distinguish between weak and strong topological insulators [99] Z2 needs to be investigated in multiple planes. For two-dimensional materials with a thick vacuum layer along the Cartesian z axes, it is sufficient to study the WCC evolution in the kz = 0 plane (num_of_planes=1), since there is no dispersion in z direction. For three-dimensional crystals with three-fold rotational symmetry, it is enough to investigate two planes, i.e., one intersecting the Gamma point and one at the border of the Brillouin zone, by using num_of_planes=2. The topological character of the material is then given by the sum of the two obtained indexes modulo 2.
In the general, three-dimensional case, materials are characterized by a set of 4 indexes v0;v1,v2,v3 and all six planes (num_of_planes=6 ) in the BZ need to be investigated [99]. The first, strong index v0 distinguishes between strong and weak topological insulators. The last three indices v1,v2,v3 are called weak topological invariants [100] and denote the value of Z2 for the planes at the BZ boundaries, i.e., those planes in which the index is associated with num_of_planes is 2,4, and 6. For instance, Bi2Se3 with implies that Bi2Se3 is a strong topological insulator (there are topologically protected surface states).
How to calculate Born Effective Charges?
Born effective charges (BEC) or dynamic charges are defined as the change in polarization upon the displacement of one atom in the unit cell (and its periodic images, i.e., q=0) as . Here, the index runs over all atoms in the unit cell, the indexes i,j denote the Cartesian directions for the polarization and the atomic displacement, respectively, is the unit cell volume and e is the elementary charge.
The computation of BECs can be performed using the python script BEC.py that can be found in the FHIaims utilities directory. It utilizes a finite difference approach to determine the derivative of the polarization with respect to atomic displacements.
Example: Displacing Mg atoms along z direction with a kgrid 2552 along direction 1, 273 direction 2 and 3420 direction 3, finite difference between 0.005 and 0.01:
python BEC.py -r path-to-aims-excutable --name Mg -p 1 --kx 25 5 2 --ky 2 7 3 --kz 3 4 20 -c 3 -d 0.005 0.01
Here, the user has to provide the path to the FHI-aims executable and for which atoms or species the BEC needs to be computed. If the user wants to displace all atoms of the same species, e.g., because they are equivalent, then the option -p must be omitted. If only one specific atom from the chosen species should be displaced, then the user has to provide the number of this atom in the geometry.in (-p 2). Moreover, the user has to provide the polarization k-grid size along the reciprocal lattice vectors (--kx --ky --kz), the Cartesian axis along which the atom should be displaced (-c 1,2 or 3 corresponding to x,y, and z), and the displacements in Angstrom to be used for the finite difference (-d d1 d2). The latter setting is optional and defaults to -d 0 0.0025 if omitted. Values of the displacement of the order of 0.01 Angstrom are usually used in the literature.
The script then performs the following steps in an automatic workflow:
-
•
It reads the provided geometry.in and control.in files and creates two folders, one for each of the chosen displacements d1 and d2 of the chosen atom. In each of these folders it copies the provided control.in and adds the polarization flags with the provided k-grids.
-
•
The polarization is calculated along all Cartesian coordinates with FHI-aims using the specified k-point grids.
-
•
The BECs are obtained via finite difference scheme from the calculated polarizations.