NSLS-II / edrixs

An open source toolkit for simulating RIXS spectra based on ED
https://nsls-ii.github.io/edrixs
GNU General Public License v3.0
32 stars 19 forks source link

trigonal CFs #92

Open mpmdean opened 3 years ago

mpmdean commented 3 years ago

At some point it would be nice to implement trigonal CFs for the full d-electron shell.

Below are my notes. It might be useful for users to write them in the real harmonic basis and then return the converted ones.

#!/usr/bin/env python

import numpy as np
from numpy import exp as e
import scipy
import edrixs

# z along face surface normal
ten_dq = 10 # cubic distortion
delta =  1 # trigonal distortion

from numpy import sqrt

# write eigenvections in real harmonic basis using edrixs convention
tmat_r2trig = np.array([[1,         0,        0,         0,         0],  # z^2
                        [0,         0,sqrt(1/3),-sqrt(2/3),         0],  # zx
                        [0, sqrt(1/3),        0,         0,-sqrt(2/3)],  # zy
                        [0,         0,sqrt(2/3),  sqrt(1/3),        0],  # x^2-y^2
                        [0,-sqrt(2/3),        0,         0,-sqrt(1/3)]], # xy
                       dtype=np.complex128) 

# invert matrix
tmat_trig2tr = np.conj(np.transpose(tmat_r2trig))

# create matrix in trigonal basis
tmp_trig = np.zeros((5, 5), dtype=np.complex)
ind = np.arange(5)
# energies are diagaonal in trigonal basis
tmp_trig[ind, ind] = np.array([-0.4*ten_dq, delta-0.4*ten_dq, delta-0.4*ten_dq, 0.6*ten_dq, 0.6*ten_dq])

# convert to real harmonic basis
tmp = edrixs.cb_op(tmp_trig, tmat_trig2tr)

cf = np.zeros((10, 10), dtype=np.complex)
cf[0:10:2, 0:10:2] = tmp
cf[1:10:2, 1:10:2] = tmp

#z^2 zx zy x^2-y^2 xy
e, v = scipy.linalg.eigh(tmp)
for energy, vec in zip(e, v.T):
    print(f"{energy:.2f} {vec.round(3).real}")

# apical atom along z
ten_dq = 10 # cubic distortion
delta =  1 # trigonal distortion

from numpy import sqrt

phi = 2*np.pi/3
ep = np.exp(1j*phi)/np.sqrt(3)
em = np.exp(-1j*phi)/np.sqrt(3)
e0 = 1/np.sqrt(3)

# write eigenvections in real harmonic basis using edrixs convention
tmat_r2trig = np.array([[0,         0,       0,         1,        0],
                        [e0,       em,      ep,         0,        0],
                        [e0,       ep,      em,         0,        0],
                        [0,         0,       0,         0,        1],
                        [e0,       e0,      e0,         0,        0]],
                       dtype=np.complex128)
# invert matrix
tmat_trig2tr = np.conj(np.transpose(tmat_r2trig))

# create matrix in trigonal basis
tmp_trig = np.zeros((5, 5), dtype=np.complex)
ind = np.arange(5)
# energies are diagaonal in trigonal basis
tmp_trig[ind, ind] = np.array([-0.4*ten_dq, delta-0.4*ten_dq, delta-0.4*ten_dq, 0.6*ten_dq, 0.6*ten_dq])

# convert to real harmonic basis
tmp = edrixs.cb_op(tmp_trig, tmat_trig2tr)

cf = np.zeros((10, 10), dtype=np.complex)
cf[0:10:2, 0:10:2] = tmp
cf[1:10:2, 1:10:2] = tmp

#z^2 zx zy x^2-y^2 xy
e, v = scipy.linalg.eigh(tmp)
for energy, vec in zip(e, v.T):
    print(f"{energy:.2f} {vec.round(3).real}")

See also: https://arxiv.org/pdf/cond-mat/0505214.pdf section 3.4.1 Crystal Field

shenmidelin commented 3 years ago

@mpmdean Thanks for the suggestion! I will look into this later.