eigenvec_viewer

eigenvec_viewer.py [-h] [-a ATOMS] [--spin-orbit | --spin-charge]
                   [-w {total,rank}] [-g GROUP] [-l L] [-t] [-f]
                   [--basis_order BASIS_ORDER]
                   filein

Description

eigenvec_viewer.py is a script for printing eigenvectors in a user-friendly layout. Eigenvectors are generated by script chiq_post.py with option vector=true. See Analyzing the susceptibility for the definition of the eigenvectors.

Positional Arguments

filein

File name of the eigenvectors, e.g., chi_q_eigenvec.00.00.00.dat.

Options

-h, –help

Show this help message and exit.

-a ATOMS, –atoms ATOMS

Specify the number of atoms. If provided, the eigenvector for each atom is printed as a matrix.

–spin-orbit

Spin-orbit coupling is included in DMFT calculation. The spin is not conserved.

–spin-charge

If this is activated, up-up and down-down components are converted to charge and Sz basis.

-w {total,rank}, –weight {total,rank}

Print the weight of each irreducible representation (irrep) in the eigenvectors.

-g GROUP, –group GROUP

Group name (required if -w is activated).

-l L, –l L

Angular momentum, e.g., 2, 3, or 5/2 (required if -w is activated).

-t, –time_reversal

Classify multipole operators by time-reversal symmetry (only applicable when -w is activated).

-f, –fileout

Save weights into a file (only applicable when -w is activated).

–basis_order BASIS_ORDER

Specify the order of the basis, e.g., [2,1,0].

Note

Options --spin-orbit and --spin-charge are mutually exclusive.

Example

Single-orbital case

First example is the single-orbital Hubbard model on a square lattice in Tutorial.

The original data for the eigenvector \(U^{(\xi)}_{ij}(\boldsymbol{q})\) for \(\boldsymbol{q}=0\) is shown below:

$ cat chi_q_eigenvec.00.00.00.dat
-7.071067811865475727e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.071067811865474617e-01 2.110206395247974729e-18
0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 -2.984282503566126277e-18 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
-7.071067811865474617e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 -7.071067811865475727e-01 -2.110206395247975115e-18

Each eigenvector is printed in one line in real, imaginary, real, imaginary, …, manner. The indices \(i=(a, \sigma, m)\) and \(j=(a, \sigma', m')\) are ordered as \((a, \sigma, \sigma', m, m')\), where \(a\) is atom, \(\sigma\) is spin, and \(m\) is orbital. In the single-orbital model, the indices \(i\) and \(j\) refer only to the spin, namely, \((ij)=(\sigma\sigma')\). Therefore, there are 8 numbers in one line.

No option

Without any option, eigenvec_viewer.py simply prints the eigenvectors as follows:

$ eigenvec_viewer.py chi_q_eigenvec.00.00.00.dat
Namespace(filein='chi_q_eigenvec.00.00.00.dat', atoms=None, spin_orbit=False, spin_charge=False, weight=None, group=None, l=None, time_reversal=False, fileout=False, basis_order=None)

Load 'chi_q_eigenvec.00.00.00.dat'
 (n_eigen, dim) = (4, 4)

Decompose dim=4
 n_atoms = 1
 n_spin = 2
 n_orb = 1
 (atom, s1, s2, m1, m2) = (1, 2, 2, 1, 1)

#0
 -0.7071067811865476 0  0 0  0 0  0.7071067811865475 0
#1
 0 0  1.0 0  0 0  0 0
#2
 0 0  0 0  1.0 0  0 0
#3
 -0.7071067811865475 0  0 0  0 0  -0.7071067811865476 0

'n_atoms', 'n_spin', and 'n_orb' are the number of atoms, spins, and orbitals, respectively. The value of 'n_orb' is evaluated automatically. 0.000000000000000000e+00 is printed as 0. The real and imaginary parts are separated by a single space and different elements are separated by double spaces.

-a option

With option -a, the eigenvectors \(U^{(\xi)}_{ij}\) are printed as follows:

$ eigenvec_viewer.py chi_q_eigenvec.00.00.00.dat -a 1
...

=============
#0
atom 0
uu
  -0.707
ud
   0
du
   0
dd
   0.707

=============
#1
atom 0
uu
   0
ud
   1.000
du
   0
dd
   0

=============
#2
atom 0
uu
   0
ud
   0
du
   1.000
dd
   0

=============
#3
atom 0
uu
  -0.707
ud
   0
du
   0
dd
  -0.707

‘uu’ indicates \((\uparrow\uparrow)\), ‘ud’ indicates \((\uparrow\downarrow)\), and so on. The result above corresponds to the Pauli matrices. From this output, we can identify the eigenvectors, listed from top to bottom, as \(S_z\), \(S_+\), \(S_-\), \(n\) (the charge operator).

--spin-charge option

With option --spin-charge, transformation to the Pauli matrices defined below is computed explicitly.

\[ \begin{align}\begin{aligned}U^\mathrm{(ch)}_{a, (m m')} &\equiv (U_{(a \uparrow m), (a \uparrow m')} + U_{(a \downarrow m), (a \downarrow m')}) / \sqrt{2}\\U^\mathrm{(spz)}_{a, (m m')} &\equiv (U_{(a \uparrow m), (a \uparrow m')} - U_{(a \downarrow m), (a \downarrow m')}) / \sqrt{2}\\U^\mathrm{(sp+)}_{a, (m m')} &\equiv U_{(a \uparrow m), (a \downarrow m')}\\U^\mathrm{(sp-)}_{a, (m m')} &\equiv U_{(a \downarrow m), (a \uparrow m')}\end{aligned}\end{align} \]

The result is as follows:

$ eigenvec_viewer.py chi_q_eigenvec.00.00.00.dat -a 1 --spin-charge
...

=============
#0
atom 0
ch
   0
sp+
   0
sp-
   0
spz
  -1.000

=============
#1
atom 0
ch
   0
sp+
   1.000
sp-
   0
spz
   0

=============
#2
atom 0
ch
   0
sp+
   0
sp-
   1.000
spz
   0

=============
#3
atom 0
ch
  -1.000
sp+
   0
sp-
   0
spz
   0

Two-orbital case

Next example is the two-orbital Hubbard model in Tutorial. The eigenvectors for \(\boldsymbol{q}=(1/2, 1/2, 0)\) (M point) are shown below with -a and --spin-charge options. \(U^\mathrm{(ch)}_{a, (m m')}\), \(U^\mathrm{(spz)}_{a, (m m')}\), \(U^\mathrm{(sp+)}_{a, (m m')}\), and \(U^\mathrm{(sp-)}_{a, (m m')}\) defined above are now shown as \(2 \times 2\) matrices.

$ eigenvec_viewer.py chi_q_eigenvec.16.16.00.dat -a 1 --spin-charge
Namespace(filein='chi_q_eigenvec.16.16.00.dat', atoms=1, spin_orbit=False, spin_charge=True, weight=None, group=None, l=None, time_reversal=False, fileout=False, basis_order=None)

Load 'chi_q_eigenvec.16.16.00.dat'
 (n_eigen, dim) = (16, 16)

Decompose dim=16
 n_atoms = 1
 n_spin = 2
 n_orb = 2
 (atom, s1, s2, m1, m2) = (1, 2, 2, 2, 2)

=============
#0
atom 0
ch
   0               0
   0               0
sp+
   0               0.003
   0.003           0
sp-
   0               0.000
   0.000           0
spz
   0              -0.707
  -0.707           0

=============
#1
atom 0
ch
   0               0
   0               0
sp+
   0               0.149
   0.149           0
sp-
   0               0.691
   0.691           0
spz
   0               0.001
   0.001           0

=============
#2
atom 0
ch
   0               0
   0               0
sp+
   0              -0.691
  -0.691           0
sp-
   0               0.149
   0.149           0
spz
   0              -0.002
  -0.002           0

=============
#3
atom 0
ch
  -0.707           0
   0               0.707
sp+
   0               0
   0               0
sp-
   0               0
   0               0
spz
   0               0
   0               0

...

We can see that the the orbital matrices are of the form of the Pauli matrices. Using symobls \(\sigma_{\xi}\) and \(\tau_{\xi}\) for the Pauli matrices in the spin and orbital spaces, respectively, the eigenvectors can be represented by their combinations \(\sigma_{\xi}\tau_{\xi'}\).

The first three eigenvectors show \(\tau_x\) in the orbital space combined with spins. These correspond to the degenerate order parameters \((\tau_x \sigma_x, \tau_x \sigma_y, \tau_x \sigma_z)\) for the excitonic insulator. The fourth eigenvector shows \(\tau_z\) in the orbital space in the charge sector. This corersponds to the energy splitting between the two orbitals. Its staggered modulation corresponds to the high-spin–low-spin order.