Spin Hamiltonian#

The basic theory behind Magnopy is describe in paper about Magnopy. This page is intended to serve as a bridge between the paper and the code, by introducing the details of the formalism and explaining an the concepts that are less evident in the paper, but important for the code.

In paper about Magnopy we discuss the spin Hamiltonian with arbitrary amount \(n\) of coupled components of spin angular momentum operator. However, at present time only the terms with at most four coupled components of spin angular momentum operator (i. e. \(n \le 4\)) are implemented in Magnopy. The Hamiltonian then can be written as

(1)#\[\begin{split}\mathcal{H}_{n \le 4} =& \,C_1 \sum_{\substack{\mu, \\ \alpha_1, \\ i_1}} J^{i_1}_{\alpha_1} S_{\mu, \alpha_1}^{i_1} +\\&+ C_2 \sum_{\substack{\mu, \nu_2, \\ \alpha_1, \alpha_2, \\ i_1, i_2}} J^{i_1, i_2}_{\nu_2; \alpha_1, \alpha_2} S_{\mu, \alpha_1}^{i_1} S_{\mu + \nu_2, \alpha_2}^{i_2} +\\&+ C_3 \sum_{\substack{\mu, \nu_2, \nu_3, \\ \alpha_1, \alpha_2, \alpha_3, \\ i_1, i_2, i_3}} J^{i_1, i_2, i_3}_{\nu_2, \nu_3; \alpha_1, \alpha_2, \alpha_3} S_{\mu, \alpha_1}^{i_1} S_{\mu + \nu_2, \alpha_1}^{i_2} S_{\mu + \nu_3, \alpha_3}^{i_3} +\\&+ C_4 \sum_{\substack{\mu, \nu_2, \nu_3, \nu_4, \\ \alpha_1, \alpha_2, \alpha_3, \alpha_4, \\ i_1, i_2, i_3, i_4}} J^{i_1, i_2, i_3, i_4}_{\nu_2, \nu_3, \nu_4; \alpha_1, \alpha_2, \alpha_3, \alpha_4} S_{\mu, \alpha_1}^{i_1} S_{\mu + \nu_2, \alpha_2}^{i_2} S_{\mu + \nu_3, \alpha_3}^{i_3} S_{\mu + \nu_4, \alpha_4}^{i_4}\end{split}\]

where the sum over \(n\) is expanded.

Meaning of indices

The Hamiltonian is defined on a periodic lattice comprising of \(N = N_1 \times N_2 \times N_3\) and unit cell is defined by the three lattice vectors

\[\begin{split}\boldsymbol{a}_1 = (a_1^x, a_1^y, a_1^z) \\ \boldsymbol{a}_2 = (a_2^x, a_2^y, a_2^z) \\ \boldsymbol{a}_3 = (a_3^x, a_3^y, a_3^z)\end{split}\]

which are stored in Magnopy as (SpinHamiltonian.cell)

[[a1_x, a1_y, a1_z],
 [a2_x, a2_y, a2_z],
 [a3_x, a3_y, a3_z]]
  • Superscript indices \(i_1, i_2, i_3, i_4\) each assume values \(x, y, z\) and refer to the Cartesian components of a vectors, matrix or tensor in the global orthonormal reference frame \((\boldsymbol{x}, \boldsymbol{y}, \boldsymbol{z})\).

    For example, the scalar product of two vectors \(J^{i_1}_{\alpha_1}\) and \(S_{\mu, \alpha_1}^{i_1}\) is written as

    \[(\boldsymbol{S}_{\mu, \alpha_1} \cdot \boldsymbol{J}_{\alpha_1}) = \sum_{i_1} S_{\mu, \alpha_1}^{i_1} \cdot J^{i_1}_{\alpha_1} = S_{\mu, \alpha_1}^x \cdot J^x_{\alpha_1} + S_{\mu, \alpha_1}^y \cdot J^y_{\alpha_1} + S_{\mu, \alpha_1}^z \cdot J^z_{\alpha_1}\]
  • Subscript Greek letters \(\mu, \nu_m\) denote the unit cells in the lattice. Each unit cell's index represents a tuple of three integers

    \[\begin{split}\mu &= (\mu^1, \mu^2, \mu^3) \\ \nu_m &= (\nu_m^1, \nu_m^2, \nu_m^3)\end{split}\]

    that define the position of the unit cell in real space relative to the three lattice vectors

    \[\boldsymbol{r}_{\mu+\nu_m} = (\mu^1 + \nu_m^1) \cdot \boldsymbol{a}_1 + (\mu^2 + \nu_m^2) \cdot \boldsymbol{a}_2 + (\mu^3 + \nu_m^3) \cdot \boldsymbol{a}_3\]

    The index \(\mu\) is always taken care of analytically and the code does not need to store it (note that interaction parameters do not depend on \(\mu\), thus highlighting the translational invariance of the Hamiltonian). The indices \(\nu_m\) are stored in Magnopy as tuples of three integers, for example

    nu_1 = (1, 0, -2)
    nu_2 = (0, 1, 0)
    
  • Subscript Greek letters \(\alpha_m\) denote the magnetic sites within the unit cell. Each site's index can be represented by the tuple of three real numbers from the half-open interval \([0,1)\)

    \[\alpha_m = (\alpha_m^1, \alpha_m^2, \alpha_m^3)\]

    that define the position of the magnetic site within the unit cell

    \[\boldsymbol{r}_{\alpha_m} = \alpha_m^1 \cdot \boldsymbol{a}_1 + \alpha_m^2 \cdot \boldsymbol{a}_2 + \alpha_m^3 \cdot \boldsymbol{a}_3\]

    However, on contrary to the unit cell indices the floating point numbers are ill suited for being indices, thus in Magnopy we store indices alpha as integers ranging from \(0\) to \(M-1\), where M is the amount of magnetic sites in the unit cell, for example

    alpha_1 = 0
    alpha_2 = 3
    

Hint

The position of the magnetic site in real space is defined by the position of the unit cell of that site and by the position of the site within unit cell. It is denoted by the pair of subscript indices \(\mu+\nu_m, \alpha_m\) and can be expressed as

\[\boldsymbol{r}_{\mu+\nu_m, \alpha_m} = (\mu^1 + \nu_m^1+ \alpha_m^1) \cdot \boldsymbol{a}_1 + (\mu^2 + \nu_m^2+ \alpha_m^2) \cdot \boldsymbol{a}_2 + (\mu^3 + \nu_m^3+ \alpha_m^3) \cdot \boldsymbol{a}_3\]

For the implementation (and its use) you need to understand one extra concept about this Hamiltonian that the paper about Magnopy does not discuss in details: the distinction between the terms with the same amount of spin operators (same \(n\)) but different amount of unique magnetic sites.

This distinction is implicit in the code, in particular you will always see an extra index, that we label as \(p_n\), that goes in pare with the index \(n\) in this documentation and in the names of some methods implemented in Magnopy.

For the linear, bilinear and trilinear terms of the Hamiltonian the extra index \(p_n\) is trivial to construct. For example, there is one case for the linear term, two cases for the bilinear term and three cases for the trilinear term. Therefore, the extra index \(p_n\) for \(n = 1, 2, 3\) can be defined simply to indicate the amount of unique magnetic sites in the term

However, for the quadlinear term (\(n = 4\)) there are five cases that we consider to be different. In particular the case with two unique magnetic sites splits into two cases: one where each site has two spin operators associated with it and the other where one site has three spin operators and the other site has one spin operator. In fact, the amount of cases for an integer \(n\) is defined by the amount of its partitions.

There are several strategies for labeling such cases, in Magnopy we do the following:

  • Write down each partition of integer \(n\) as a tuple of integers

  • Sort each partition in descending order

  • Sort partitions of the same integer lexicographically in descending order.

  • Label each partition with an extra index \(p_n\) that goes from \(1\) to the amount of partitions of \(n\).

This strategy has an advantage: for \(n < 4\) the extra index \(p_n\) still indicates the amount of unique magnetic sites. The table below summarize the labeling rules that are used in Magnopy. See linked pages for the details of the terms of the Hamiltonian for each case.

\(n\)

\(p_n\)

partition

Hamiltonian's terms

Convention constant (\(C_{n,p_n}\))

1

1

( 1 )

( 1 ) terms

\(C_{1,1} \equiv C_1\)

2

1

(2, 0)

(2, 1) terms

\(C_{2,1}\)

2

2

(1, 1)

(2, 2) terms

\(C_{2,2}\)

3

1

(3, 0, 0)

(3, 1) terms

\(C_{3,1}\)

3

2

(2, 1, 0)

(3, 2) terms

\(C_{3,2}\)

3

3

(1, 1, 1)

(3, 3) terms

\(C_{3,3}\)

4

1

(4, 0, 0, 0)

(4, 1) terms

\(C_{4,1}\)

4

2

(3, 1, 0, 0)

(4, 2) terms

\(C_{4,2}\)

4

3

(2, 2, 0, 0)

(4, 3) terms

\(C_{4,3}\)

4

4

(2, 1, 1, 0)

(4, 4) terms

\(C_{4,4}\)

4

5

(1, 1, 1, 1)

(4, 5) terms

\(C_{4,5}\)

Examples#

In this part we show how the common terms of the spin Hamiltonian can be written in the form of equation (1).

Zeeman interaction#

Linear coupling with the magnetic field is usually written as

\[\mathcal{H} = \mu_B\boldsymbol{h}\sum_{\mu,\alpha_1} g_{\alpha_1} \boldsymbol{S}_{\mu, \alpha_1}\]

This term can be written in the form of ( 1 ) terms if one defines \(C_1 = 1\) and \(\boldsymbol{J}_{\alpha_1} = \mu_B\boldsymbol{h} g_{\alpha_1}\).

On-site anisotropy#

We take an example of the triaxial anisotropy, that can be written as

\[\mathcal{H} = \sum_{\mu,\alpha_1} \Bigl( K^x (S^x_{\mu,\alpha_1})^2 + K^y (S^y_{\mu,\alpha_1})^2 + K^z (S^z_{\mu,\alpha_1})^2 \Bigr)\]

This Hamiltonian can be written in the form of (2, 1) terms if one defines \(C_{2, 1} = 1\) and

\[\begin{split}\boldsymbol{J}_{0;\alpha_1,\alpha_1} = \begin{pmatrix} K^x & 0 & 0 \\ 0 & K^y & 0 \\ 0 & 0 & K^z \end{pmatrix}\end{split}\]

Exchange interaction#

Bilinear exchange interaction with isotropic and Dzyaloshinskii-Moriya (DM) exchange can be written as

\[\mathcal{H} = \dfrac{1}{2} \sum_{\mu,\nu_2,\alpha_1,\alpha_2} \Bigl[ J^{iso}_{\nu_2;\alpha_1,\alpha_2} (\boldsymbol{S}_{\mu,\alpha_1} \cdot \boldsymbol{S}_{\mu+\nu_2,\alpha_2}) + \boldsymbol{D}_{\nu_2;\alpha_1,\alpha_2} \cdot (\boldsymbol{S}_{\mu,\alpha_1} \times \boldsymbol{S}_{\mu+\nu_2,\alpha_2}) \Bigr]\]

where \(\boldsymbol{D}_{\nu_2;\alpha_1,\alpha_2}\) is a DM vector. This Hamiltonian can be written in the form of (2, 2) terms if one defines \(C_{2, 2} = 1/2\) and

\[\begin{split}\boldsymbol{J}_{\nu_2;\alpha_1,\alpha_2} = \begin{pmatrix} J^{iso}_{\nu_2;\alpha_1,\alpha_2} & D^z_{\nu_2;\alpha_1,\alpha_2} & -D^y_{\nu_2;\alpha_1,\alpha_2} \\ -D^z_{\nu_2;\alpha_1,\alpha_2} & J^{iso}_{\nu_2;\alpha_1,\alpha_2} & D^x_{\nu_2;\alpha_1,\alpha_2} \\ D^y_{\nu_2;\alpha_1,\alpha_2} & -D^x_{\nu_2;\alpha_1,\alpha_2} & J^{iso}_{\nu_2;\alpha_1,\alpha_2} \end{pmatrix}\end{split}\]

Biquadratic exchange#

Isotropic biquadratic exchange interaction can be written as

\[\mathcal{H} = \sum_{\mu,\nu_2,\alpha_1,\alpha_2} J_{\nu_2;\alpha_1,\alpha_2} (\boldsymbol{S}_{\mu,\alpha_1} \cdot \boldsymbol{S}_{\mu+\nu_2,\alpha_2})^2\]

This Hamiltonian can be written in the form of (4, 3) terms if one defines \(C_{4,3} = 1\) and \(J^{i_1,i_2,i_3,i_4}_{0,\nu_2,\nu_2;\alpha_1, \alpha_1, \alpha_2, \alpha_2} = J_{\nu_2;\alpha_1,\alpha_2}\) when \((i_1,i_2,i_3,i_4) = (xxxx), (xyxy), (xzxz), (yxyx), (yyyy), (yzyz), (zxzx), (zyzy), (yyyy)\) and \(J^{i_1,i_2,i_3,i_4}_{0,\nu_2,\nu_2;\alpha_1, \alpha_1, \alpha_2, \alpha_2} = 0\) otherwise.