NiO crystal-field \(L_{2,3}\) XAS & RIXS

The calculation treats NiO as an ionic Ni \(3d^8\) site in a cubic field and excites a \(2p\) electron into the \(3d\). It includes an effective exchange field acting along the \(<112>\) direction.

The RIXS spectrum is calculated at the global maximum of the XAS and summed over two orthogonal outgoing linear polarizations.

"""Calculate NiO crystal-field L2,3-edge XAS and RIXS spectra."""

import matplotlib.pyplot as plt
import numpy as np

import edrixs


# Slater integrals
F2_dd, F4_dd = 11.142, 6.874
F2_dp, G1_dp, G3_dp = 6.667, 4.922, 2.796
F0_dd = 2 * (F2_dd + F4_dd) / 63
F0_dp = G1_dp / 15 + 3 * G3_dp / 70

slater_i = [F0_dd, F2_dd, F4_dd]
slater_n = [
    F0_dd, F2_dd, F4_dd,
    F0_dp, F2_dp, G1_dp, G3_dp,
    0.0, 0.0,
]

# emat terms on the 3d shell.
ten_dq = 1.1
zeta_3d, zeta_2p = 0.081, 11.498
exchange = 6 * 0.027
ext_B = exchange / (2 * np.sqrt(6)) * np.array([1.0, 1.0, 2.0])

edge_shift = 857.6
*problem, shift = edrixs.model_1v1c(
    ('d', 'p'),
    shell_level=(0.0, -edge_shift),
    v_soc=(zeta_3d, zeta_3d),
    c_soc=zeta_2p,
    v_noccu=8,
    slater=(slater_i, slater_n),
    v_cfmat=edrixs.cf_cubic_d(ten_dq),
    ext_B=ext_B,
    on_which='spin',
    sparse_U=True,
)

backend = 'scipy'
hmat_i, hmat_n, trans_ops = edrixs.get_ops(*problem, backend=backend)
eval_i, evec_i = edrixs.ed(
    hmat_i, shift=shift,
    num_evals=3,

)

# Calculate XAS spectrum.
energy = np.linspace(edge_shift - 10, edge_shift + 20, 3001)
gamma_c = 0.65
xas = edrixs.xas(
    eval_i, evec_i, hmat_n, trans_ops, energy,
    gamma_c=gamma_c,
    pol_type=[('linear', 0)],

).sum(-1)
xas /= xas.max()

# Calculate RIXS at the global XAS maximum. Summing two orthogonal
# scattered polarizations represents a measurement without outgoing
# polarization analysis.
resonance_energy = energy[np.argmax(xas)]
energy_loss = np.arange(-0.5, 5, 0.01)
rixs = edrixs.rixs(
    eval_i, evec_i, hmat_i, hmat_n, trans_ops,
    np.array([resonance_energy]), energy_loss,
    gamma_c=gamma_c,
    gamma_f=0.05,
    pol_type=[
        ('linear', 0, 'linear', 0),
        ('linear', 0, 'linear', np.pi / 2),
    ],

)
rixs_spectrum = rixs[0].sum(axis=-1)
rixs_spectrum /= rixs_spectrum.max()

fig, (ax_xas, ax_rixs) = plt.subplots(
    1, 2, figsize=(11, 4), constrained_layout=True
)
ax_xas.plot(energy, xas)
ax_xas.axvline(resonance_energy, color='tab:red', linestyle='--', linewidth=1)
ax_xas.set_xlabel('Incident photon energy (eV)')
ax_xas.set_ylabel('Normalized intensity')
ax_xas.set_title(r'NiO $L_{2,3}$ XAS')

ax_rixs.plot(energy_loss, rixs_spectrum)
ax_rixs.set_xlabel('Energy loss (eV)')
ax_rixs.set_ylabel('Normalized intensity')
ax_rixs.set_title(r'RIXS at $E_{L_3}=%.2f$ eV' % resonance_energy)
plt.show()

(Source code)

../_images/nio_l23_xas.png