HeisenbergExchange

class HeisenbergExchange(configuration, kpoints=None, atom_indices=None)

Class for calculating the inter-site Heisenberg exchange coupling matrix for a BulkConfiguration.

Parameters:
  • configuration (BulkConfiguration) – The BulkConfiguration for which to calculate the inter-site coupling matrix.
  • kpoints (All | list of ints.) – The k-points with which to calculate the heisenberg exchange constants.
    Default: MonkhorstPackGrid(1, 1, 1)
  • atom_indices – The atom indices for which to calculate the heisenberg exchange constants.
    Default: All i.e. all atoms in the configuration.
atomIndices()
Returns:The atom indices.
Return type:list of int.
atomSpins()
Returns:The atomic spin polarizations.
Return type:list of floats.
couplingMatrix(atom_i_index, atom_j_index)

Returns the unscaled coupling matrix elements between atom_i_index and atom_j_index. This corresponds to the matrix elements from the model H_ij = J_ij * e_i * e_j, where e_i and e_j are unit vectors.

Parameters:
  • atom_i_index (int.) – The index of atom i in the central cell.
  • atom_j_index (int.) – The index of atom j in the central and repeated cells.
Returns:

The coupling matrix elements.

Return type:

PhysicalQuantity of type energy

fullCouplingMatrix()
Returns:The Heisenberg exchange coupling matrix with shape (n_atoms, n_atoms), where n_atoms is the number of atoms in the configuration.
Return type:PhysicalQuantity of type energy.
kpoints()
Returns:The k-points with which to calculate the Heisenberg exchange constants.
Return type:class:~.MonkhorstPackGrid | RegularKpointGrid
metatext()
Returns:The metatext of the object or None if no metatext is present.
Return type:str | unicode | None
nlprint(stream=None)

Print a string containing an ASCII table useful for plotting the AnalysisSpin object.

Parameters:stream (python stream) – The stream the table should be written to.
Default: NLPrintLogger()
realSpaceDistance(atom_i_index, atom_j_index)

Returns the real space distance between atom_i_index and atom_j_index.

Parameters:
  • atom_i_index (int.) – The index of atom i in the central cell.
  • atom_j_index (int.) – The index of atom j in the central and repeated cells.
Returns:

The real space distance between the atoms.

Return type:

PhysicalQuantity of type energy

scaledCouplingMatrix(atom_i_index, atom_j_index)

Returns the coupling matrix elements between atom_i_index and atom_j_index scaled with the atomic spin polarizations. This corresponds to the matrix elements from the model H_ij = J_ij * S_i * S_j.

Parameters:
  • atom_i_index (int.) – The index of atom i in the central cell.
  • atom_j_index (int.) – The index of atom j in the central and repeated cells.
Returns:

The coupling matrix elements.

Return type:

PhysicalQuantity of type energy

setMetatext(metatext)

Set a given metatext string on the object.

Parameters:metatext (str | unicode | None) – The metatext string that should be set. A value of “None” can be given to remove the current metatext.

Usage Examples

Calculate Heisenberg exchange spin coupling constants of a stretched H2 moleculefrom:

# Define elements
elements = [Hydrogen, Hydrogen]

# Define coordinates
cartesian_coordinates = [[ 0. ,  0. ,  0. ],
                         [ 0. ,  0. ,  3.0]]*Angstrom

# Set up configuration
molecule_configuration = MoleculeConfiguration(
    elements=elements,
    cartesian_coordinates=cartesian_coordinates
    )

numerical_accuracy_parameters = NumericalAccuracyParameters(
    density_mesh_cutoff=50.0*Hartree,
    )

calculator = LCAOCalculator(
    exchange_correlation = SGGA.PBE,
    basis_set=BasisGGASG15.Hydrogen_Medium,
    )

# Set anti-ferromagnetic spins.
scaled_spins = [
    -1.0,
    1.0,
]

initial_spin = InitialSpin(scaled_spins=scaled_spins)
molecule_configuration.setCalculator(
    calculator,
    initial_spin=initial_spin,)

heisenberg_exchange = HeisenbergExchange(
    configuration=molecule_configuration,
    )

nlsave('H2-heisenberg-exchange.hdf5', heisenberg_exchange)

heisenberg_exchange.py

Notes

The Heisenberg exchange Hamiltonian described magnetic exchange coupling as given by

\[H = -\sum_{i,j}J_{ij}\hat{S}_i\hat{S}_j\]

where \(\hat{S}_i\) is the local spin vector on atom \(i\) and \(J_{ij}\) is the Heisenberg exchange coupling constant. Following [LKAG87], [HOY04] we calculate the coupling constants for the Hamiltonian

\[H^{unit} = -\sum_{i,j}J_{ij}^{unit}\mathbf{e}_i\mathbf{e}_j\]

where the spin operators are substituted by unit vectors \(\mathbf{e}_i\) pointing in the direction of the i’th site magnetization.

Both the coupling constants \(J_{ij}^{unit}\) and \(J_{ij}\) are available in a HeisenbergExchange object and are simply relates as

\[J_{ij} = \frac{J_{ij}^{unit}}{S_i\cdot S_j}\]

where \(S_i\) is calculated from the MullikenPopulation on each atom as \(S_i = (M_i^{up} - M_i^{down})/2\) where \(M_i^{up}\) is the Mulliken population for up-electrons on atom \(i\).

The coupling constants \(J_{ij}^{unit}\) are obtained as:

coupling_matrix = heisenberg_exchange.couplingMatrix(atom_i_index=0, atom_j_index=1)

and the coupling constants \(J_{ij}\) are obtained as:

scaled_coupling_matrix = heisenberg_exchange.scaledCouplingMatrix(atom_i_index=0, atom_j_index=1)

[HOY04]Myung Joon Han, Taisuke Ozaki, and Jaejun Yu. Electronic structure, magnetic interactions, and the role of ligands in $\mathrm mn_n(n=4,12)$ single-molecule magnets. Phys. Rev. B, 70:184421, 2004. URL: https://link.aps.org/doi/10.1103/PhysRevB.70.184421, doi:10.1103/PhysRevB.70.184421.
[LKAG87]A.I. Liechtenstein, M.I. Katsnelson, V.P. Antropov, and V.A. Gubanov. Local spin density functional approach to the theory of exchange interactions in ferromagnetic metals and alloys. Journal of Magnetism and Magnetic Materials, 67(1):65 – 74, 1987. URL: http://www.sciencedirect.com/science/article/pii/0304885387907219, doi:https://doi.org/10.1016/0304-8853(87)90721-9.