Spin-orbit coupling and non-collinear calculations

https://journals.aps.org/prb/abstract/10.1103/PhysRevB.62.11556

from gpaw.new.ase_interface import GPAW
from ase import Atoms
import numpy as np

a = 6.339
d = 1.331

atoms = Atoms('V3Cl6',
              cell=[a, a, 1, 90, 90, 60],
              pbc=[1, 1, 0],
              scaled_positions=[
                  [0, 0, 0],
                  [1 / 3, 1 / 3, 0],
                  [2 / 3, 2 / 3, 0],
                  [0, 2 / 3, d],
                  [0, 1 / 3, -d],
                  [1 / 3, 0, d],
                  [1 / 3, 2 / 3, -d],
                  [2 / 3, 1 / 3, d],
                  [2 / 3, 0, -d]])
atoms.center(axis=2, vacuum=5)

m = 3.0
magmoms = np.zeros((9, 3))
magmoms[0] = [m, 0, 0]
magmoms[1] = [-m / 2, m * 3**0.5 / 2, 0]
magmoms[2] = [-m / 2, -m * 3**0.5 / 2, 0]

atoms.calc = GPAW(mode={'name': 'pw',
                        'ecut': 400},
                  magmoms=magmoms,
                  symmetry='off',
                  kpts={'size': (2, 2, 1), 'gamma': True},
                  parallel={'domain': 1, 'band': 1},
                  txt='VCl2_gs.txt')

atoms.get_potential_energy()
atoms.calc.write('VCl2_gs.gpw')
# web-page: mag1d.png, mag2d.png
from gpaw.new.ase_interface import GPAW
import matplotlib.pyplot as plt
import numpy as np

calc = GPAW('VCl2_gs.gpw')
dens = calc.dft.densities()
grid_spacing = calc.atoms.cell[2, 2] / 200
nt = dens.pseudo_densities(grid_spacing)
n = dens.all_electron_densities(grid_spacing=grid_spacing)

i = nt.desc.size[2] // 2
x, y = n.desc.xyz()[:, :, i, :2].transpose((2, 0, 1))
uv = n.data[1:3, :, :, i]
m = (uv**2).sum(0)**0.5
u, v = uv / m
fig, ax = plt.subplots()
ct = ax.contourf(x, y, m)
cbar = fig.colorbar(ct)
cbar.ax.set_ylabel('magnetization [Å$^{-3}$]')
ax.quiver(*(a[::3, ::3] for a in [x, y, u, v]))
ax.axis('equal')
ax.set_xlabel('x [Å]')
ax.set_ylabel('y [Å]')
fig.savefig('mag2d.png')

fig, ax = plt.subplots()
x, y = n.xy(1, ..., 0, i)
x, yt = nt.xy(1, ..., 0, i)
j = len(x) // 2
L = calc.atoms.cell[0, 0]
x = np.concatenate((x[j:] - L, x[:j]))
y = np.concatenate((y[j:], y[:j]))
yt = np.concatenate((yt[j:], yt[:j]))
ax.plot(x, y, label='all-electron')
ax.plot(x, yt, label='pseudo')
ax.legend()
ax.set_xlabel('x [Å]')
ax.set_ylabel('magnetization [Å$^{-3}$]')
fig.savefig('mag1d.png')
../../_images/mag2d.png
../../_images/mag1d.png

Experiential:

Theoretical:

DFT: