Name

electronDensityParameters Specifies the mesh cut-off and whether or not (and to what degree) the atomic configuration should be considered as a spin-polarized system.

Synopsis

Namespace: ATK.KohnSham or ATK.TwoProbe
dictionary electronDensityParameters(mesh_cutoff)
dictionary electronDensityParameters(
mesh_cutoff,
initial_spin
)
dictionary electronDensityParameters(
mesh_cutoff,
initial_scaled_spin
)
dictionary electronDensityParameters(
mesh_cutoff,
fixed_spin
)

Description

This function returns a dictionary with parameters that define the mesh used to represent real-space quantities when evaluating integrals and solving the Poisson equation.

In addition, this is also where you define the spin-properties of the system, specifically if the system should be spin-polarized or not, and whether this polarization is to be considered as fixed (the latter is only relevant for molecules).

If no spin values are supplied (this is the default), the system will not be regarded as spin-polarized. If spin values are provided, the corresponding spin-polarized version of the exchange-correlation potential will automatically be selected and used in the calculation.

The spin-polarization parameters cannot be combined arbitrarily. The following listings indicate the various available possibilities.

List of arguments

mesh_cutoff

Parameter defining the density of the real-space grids for solving the Poisson equation. The parameter is given as an energy E, which implicitly defines the grid spacing \Delta x from the equivalent plane wave cut-off component k_c=\pi/\Delta x (note that there is no factor of 2 here!) which is related to the energy as E = \hbar^2
            k_c^2/2m_e, where m_e is the electron mass. A higher value (energy) of this parameter gives better accuracy in the calculations.

Default: 150*Rydberg

initial_spin

The value for the net spin-polarization of the initial electron density for the whole system. The parameter is given as a scalar angular momentum, e.g. 1.0*hbar. This parameter is not compatible with initial_scaled_spin.

Default: None

initial_scaled_spin

The scaled net spin-polarization per atom of the initial electron density. This must be given as a list with numbers confined to the range [-1:1], e.g. [0.8,-0.6,...] without units. In addition, the length of the list must match the number of atoms in the system. See below for a more detailed explanation of what the numbers mean. This parameter is not compatible with initial_spin.

Default: None

fixed_spin

The fixed value of the spin-polarization for the entire system given as an angular momentum. e.g. 0.5*hbar. This parameter can only be used for molecular calculations.

Default: None

Usage examples

Set the initial spin, and also specify a finer grid, compared to the default values:

initial_electron_density = electronDensityParameters(
    mesh_cutoff = 250*Rydberg,
    initial_spin = 0.2*hbar
    )

Set the initial scaled spin for a sample with three atoms:

electron_density = electronDensityParameters(
    initial_scaled_spin = [0.34, -0.25, 0.9]
    )

Notes

On mesh cut-off

If E is given in Rydberg, then \Delta x =
	  \frac{\pi}{\sqrt{E}} will be given in Bohr.

A higher value of the mesh cut-off gives better accuracy in the results, at the expense of prolonged computational time and more memory usage. It is highly recommended to perform a convergence analysis by systematically increasing this parameter (actually, first start by decreasing it in order to check if it is already converged with the default parameter).

The optimal value of the mesh cut-off depends on the elements (and thereby the pseudo-potentials), that are present in the sample. Elements like hydrogen and lithium only require a cut-off below 100 Rydberg, while some transition metal elements like iron may require cut-offs above 200 Rydberg. The default value for the mesh cut-off is a compromise and is usually (but certainly not always!) a good initial guess. For some materials it is crucial to increase the value to obtain good accuracy, while for others it can be lowered without affecting the accuracy noticeably.

On spin in general

It is not possible to specify both initial_spin and initial_scaled_spin at the same time.

The spin of an electron is \frac{\hbar}{2}. Thus, a total_spin (or initial_spin) of 2*hbar corresponds to 4 excess, unpaired, spin-up electrons, which is also known as a quintet configuration (3 unpaired electrons is a quartet, 2 is a triplet, 1 is a doublet, and 0 is a singlet).

When specifying a spin-polarized calculation, the sign (positive or negative) of the specified spin determines whether the system has a net surplus of spin-up or spin-down electrons.

If initial_spin is set to a larger number than what can be supported by the electron configuration, double occupancies (two spin-up electrons in the same orbital, for instance) can occur. This parameters should only be used if the value of the initial spin has been found from careful analysis, such as applying Hund's Rule to the atomic configuration.

The simplest way to obtain a spin-polarized calculation is to use the initial_scaled_spin parameter and set all entries to 1.0. This is usually the safest way to obtain good convergence in spin-polarized molecular and bulk systems. In spin-polarized two-probe systems, however, a more careful analysis is often needed in order to obtain reliable convergence. This will be described in the following section.

Using initial_scaled_spin

When specifying the initial spin-polarization per atom through the keyword initial_scaled_spin, the length and ordering of the list must be the same as the length and ordering of the atomic configuration.

The initial_scaled_spin parameter specifies the degree of polarization for unpaired electrons (either spin-up or spin-down) within a given valence electron shell.

Consider bulk iron, which has a total of 8 valence electrons (4s23d6).

How should these electrons be distributed with respect to spin? In the simplest picture, we start by filling all the available spin-up states, and when they have been filled we add the remaining electrons into spin-down states. The resulting occupations are shown in Table 6; remember that the 4s orbitals (both up and down) are filled before the 3d orbitals.

Table 6: Iron in the maximum spin configuration, corresponding to initial_scaled_spin = 1.0.

  4s   3d
Spin-up \mathbf{\uparrow}   \mathbf{\uparrow} \mathbf{\uparrow} \mathbf{\uparrow} \mathbf{\uparrow} \mathbf{\uparrow}
Spin-down \mathbf{\downarrow}   \mathbf{\downarrow}        

This configuration corresponds to using initial_scaled_spin = 1.0 (or -1, if we reverse the roles of spin-up and spin-down). For obvious reasons, we will refer to this configuration as the maximum spin configuration.

Let us define some symbols for reference. Let n_{i,\sigma} be the total population of shell i (4s and 3d, for iron) in the maximum spin configuration, where \sigma denotes the spin. We also define the maximum spin polarization for each shell,

\displaystyle

	    \Delta N_i=n_{i,\uparrow}-n_{i,\downarrow},

which thus is 4 for 3d in the case of iron. For 4s the maximum spin polarization is zero, which means that this shell cannot be initially polarized in the calculations. A spin polarization of the 4s shell can still occur as a result of the self-consistent calculation, but it requires that the total population of the 4s shell is lower than two, and this cannot be used as an initial condition, since the total population of each shell

\displaystyle

	    N_i = \sum_{\sigma}n_{i,\sigma}.

is fixed and constant in the process of assigning the initial populations.

The parameter initial_scaled_spin (which we will denote \alpha in the formulas below) determines the initial spin occupations o_{i,\sigma} of the states in shell i through the following expression:

\displaystyle

	    \alpha = \frac{o_{i,\uparrow}-o_{i,\downarrow}}{\Delta N_i}.

As mentioned, the total number of valence electrons in each shell N_i must always be conserved, and this poses a constraint on the initial spin configurations that can be constructed in this way. It can easily be verified, that \alpha=1 gives exactly o_{i,\sigma}=n_{i,\sigma}.

Let us consider a concrete example for iron, with initial_scaled_spin = 0.5. As mentioned above, only the 3d shell can be polarized initially, and we find

\displaystyle

	    o_{\mathrm{3d},\uparrow}-o_{\mathrm{3d},\downarrow} = \alpha\ \Delta
	    N_\mathrm{3d} = 0.5 \times 4 = 2.

Combined with the constraint N_\mathrm{3d} =
            o_{\mathrm{3d},\uparrow}+o_{\mathrm{3d},\downarrow}=6, we obtain

\displaystyle

	    o_{\mathrm{3d},\uparrow} = 4, \qquad o_{\mathrm{3d},\downarrow} = 2.

These populations are equally distributed among the five 3d states for each respective spin.

As a further example, had we instead specified 0.75 as the value for initial_scaled_spin we would have obtained a spin-polarized configuration with 3.5 spin-up and 1.5 spin-down electrons on average per unit-cell in the 3d shell.

The parameter initial_scaled_spin (as well as initial_spin) only affects the initial spin polarization. The converged spin-polarization could very well be different. Let us again study iron as an example.

The script below calculates and prints the converged Mulliken population of a spin-polarized bulk bcc iron system. Since we do not know what value to use for the initial scaled spin, we use 1.0.

from ATK.KohnSham import *

# Create example structure
Iron = BulkConfiguration(
    bravais_lattice=BodyCenteredCubic(2.87*Angstrom),
    elements=[Iron],
    cartesian_coordinates=[3*(0.0,)]*Angstrom
    )
# K-points must be specified for bulk calculations
kpoints = brillouinZoneIntegrationParameters((10,10,10))

# Specify spin-polarized electron density
initial_density = electronDensityParameters(
    initial_scaled_spin=[1.0]
    )

# Configure and perform actual calculation
method = KohnShamMethod(
    electron_density_parameters=initial_density,
    brillouin_zone_integration_parameters=kpoints,
    )

scf_iron = method.apply(Iron)

# Increase verbosity when reporting
# Mulliken populations
import ATK
ATK.setVerbosityLevel(10)
print calculateMullikenPopulation(scf_iron).toArray()

iron_spin.py

If you run the script, the script should print the following to your screen:

[[ 5.11434491]
 [ 2.88565509]]

The first number is the total Mulliken population of spin-up electrons and the second that of the spin-down electrons. If, in addition, you increased the verbosityLevel(), you would see that the calculation converged in 24 iterations. The question is now, could we have improved the convergence rate by choosing a different initial spin polarization?

As seen above, the converged Mulliken populations for the spin states correspond to 5.11 electrons occupying a spin-up state whereas 2.89 electrons occupy a spin-down state (on average per unit cell). Now these numbers also include the 4s and in fact also some 5p electrons (since a DZP basis set was used), but by studying the detailed output from the more verbose calculation it can be seen that the spin polarization of these shells is only about one percent of that of the 3d shell. Hence, to a very good approximation we can assume o_{\mathrm{3d},\uparrow}-o_{\mathrm{3d},\downarrow}=5.11-2.88=2.23.

Thus, the converged result corresponds to a value of initial_scaled_spin equal to 2.23/\Delta
            N_\mathrm{3d}=0.56. It can therefore be expected that if we had used this value in the calculation from the beginning, it would have converged faster. This is indeed the case; rerunning the script with the new value of initial_scaled_spin, the self-consistent iteration reaches convergence in 12 steps, i.e. half as many as before!

We should therefore use 0.56 as the initial_scaled_spin for iron in spin-polarized calculations. In addition to providing a speed-up in execution time, a proper choice of the initial spin can make the difference between converging or not converging in e.g. spin-polarized two-probe systems.

Finally, let us show how to determine the value that should be assigned to initial_scaled_spin in order to generate a given, initial, spin-configuration.

Suppose we wanted to perform a spin-polarized calculation for manganese (7 valence electrons, (4s23d5)) with an initial spin occupation as the one shown in Table 7.

Table 7: Manganese in an electronic configuration with a majority of spin-down electrons.

  4s   3d
Spin-up \mathbf{\uparrow}   \mathbf{\uparrow} \mathbf{\uparrow}      
Spin-down \mathbf{\downarrow}   \mathbf{\downarrow} \mathbf{\downarrow} \mathbf{\downarrow}    

We can see that o_{\mathrm{3d},\uparrow}-o_{\mathrm{3d},\downarrow}=-1, as we have one unpaired spin-down electron. The number of unpaired electrons in the maximum spin configuration for manganese is 5 (all 3d electrons in the spin-up state), and thus we need to set initial_scaled_spin to a value of \alpha=-0.2 to obtain the desired initial configuration.