Beispiel #1
0
def diagonlize(scaleU=1):
    umat = edrixs.get_umat_slater('d',
                                  slater[0][1]*scaleU,
                                  slater[1][1]*scaleU,
                                  slater[2][1]*scaleU)
    cfmat = edrixs.angular_momentum.cf_tetragonal_d(ten_dq=ten_dq, d1=d1, d3=d3)
    H = edrixs.build_opers(2, cfmat, basis) + edrixs.build_opers(4, umat, basis)
    e, v = scipy.linalg.eigh(H)
    e = e - np.min(e)  # define ground state as zero energy
    return e, v
Beispiel #2
0
def diagonalize(U, t, extra_emat=None):
    """Diagonalize 2 site Hubbard Hamiltonian"""
    umat = np.zeros((norb, norb, norb, norb), dtype=np.complex128)
    emat = np.zeros((norb, norb), dtype=np.complex128)
    U_mat_1site = edrixs.get_umat_slater('s', U)
    umat[:2, :2, :2, :2,] = umat[2:, 2:, 2:, 2:] = U_mat_1site
    emat[2, 0] = emat[3, 1] = emat[0, 2] = emat[1, 3] = t
    
    if extra_emat is not None:
        emat = emat + extra_emat

    H = (edrixs.build_opers(2, emat, basis)
         + edrixs.build_opers(4, umat, basis))
 
    e, v = scipy.linalg.eigh(H)
    return e, v
Beispiel #3
0
def get_hopping_coulomb(locaxis):
    # Number of orbitals
    nt2g, nporb, norbs = 6, 6, 24

    # On-site Coulomb interaction tensor
    Ud, JH = edrixs.UJ_to_UdJH(2, 0.3)
    F0_d, F2_d, F4_d = edrixs.UdJH_to_F0F2F4(Ud, JH)

    G1_dp, G3_dp = 0.957, 0.569
    F0_dp, F2_dp = edrixs.get_F0('dp', G1_dp, G3_dp), 1.107

    umat_t2g_i = edrixs.get_umat_slater('t2g', F0_d, F2_d, F4_d)

    params = [
        F0_d,
        F2_d,
        F4_d,  # Fk for d
        F0_dp,
        F2_dp,  # Fk for dp
        G1_dp,
        G3_dp,  # Gk for dp
        0.0,
        0.0  # Fk for p
    ]
    umat_t2gp_n = edrixs.get_umat_slater('t2gp', *params)

    # static core-hole potential
    static_v = 2.0
    for i in range(0, nt2g):
        for j in range(nt2g, nt2g + nporb):
            umat_t2gp_n[i, j, j, i] += static_v

    umat_i = np.zeros((norbs, norbs, norbs, norbs), dtype=np.complex128)
    umat_n = np.zeros((norbs, norbs, norbs, norbs), dtype=np.complex128)

    umat_i[0:6, 0:6, 0:6, 0:6] = umat_t2g_i
    umat_i[6:12, 6:12, 6:12, 6:12] = umat_t2g_i

    indx = np.array([[0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17],
                     [6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23]])
    for m in range(2):
        for i in range(12):
            for j in range(12):
                for k in range(12):
                    for l in range(12):
                        umat_n[indx[m, i], indx[m, j], indx[m, k],
                               indx[m, l]] += umat_t2gp_n[i, j, k, l]

    emat_i = np.zeros((norbs, norbs), dtype=np.complex128)
    emat_n = np.zeros((norbs, norbs), dtype=np.complex128)

    # SOC
    zeta_d_i, zeta_p_n = 0.35, 1072.6666666666667
    soc_d = edrixs.atom_hsoc('t2g', zeta_d_i)
    soc_p = edrixs.atom_hsoc('p', zeta_p_n)

    emat_i[0:6, 0:6] += soc_d
    emat_i[6:12, 6:12] += soc_d

    emat_n[0:6, 0:6] += soc_d
    emat_n[6:12, 6:12] += soc_d

    emat_n[12:18, 12:18] += soc_p
    emat_n[18:24, 18:24] += soc_p
    for i in range(2 * nt2g):
        emat_n[i, i] -= 6 * static_v

    # Crystal field and hoppings between the two Ir-sites
    t1, t2, delta = -0.18, 0.036, -0.03
    # Uncomment the following line to do calculation without hopping and crystal filed splitting.
    # t1, t2, delta = 0, 0, -0.03
    crys_tmp = np.array(
        [[0, delta, delta, t1, t2, t1], [delta, 0, delta, t2, t1, t1],
         [delta, delta, 0, t1, t1, t2], [t1, t2, t1, 0, delta, delta],
         [t2, t1, t1, delta, 0, delta], [t1, t1, t2, delta, delta, 0]],
        dtype=np.complex)

    # transform spin to local axis
    dmat = np.zeros((2, 2, 2), dtype=np.complex128)
    ang1, ang2, ang3 = edrixs.rmat_to_euler(locaxis[0])
    dmat[0] = edrixs.dmat_spinor(ang1, ang2, ang3)
    ang1, ang2, ang3 = edrixs.rmat_to_euler(locaxis[1])
    dmat[1] = edrixs.dmat_spinor(ang1, ang2, ang3)

    t_spinor = np.zeros((12, 12), dtype=np.complex128)
    for i in range(2):
        off = i * 6
        t_spinor[off + 0:off + 2, off + 0:off + 2] = dmat[i]
        t_spinor[off + 2:off + 4, off + 2:off + 4] = dmat[i]
        t_spinor[off + 4:off + 6, off + 4:off + 6] = dmat[i]

    crys_spin = np.zeros((12, 12), dtype=np.complex128)
    crys_spin[0:12:2, 0:12:2] = crys_tmp
    crys_spin[1:12:2, 1:12:2] = crys_tmp
    t_orb = np.zeros((12, 12), dtype=np.complex128)
    t_orb[0:6, 0:6] = edrixs.tmat_r2c('t2g', True)
    t_orb[6:12, 6:12] = edrixs.tmat_r2c('t2g', True)
    crys_spin[:, :] = edrixs.cb_op(crys_spin, np.dot(t_spinor, t_orb))

    emat_i[0:12, 0:12] += crys_spin
    emat_n[0:12, 0:12] += crys_spin

    # Write to files
    # ED inputs
    edrixs.write_emat(emat_i, "ed/hopping_i.in")
    edrixs.write_umat(umat_i, "ed/coulomb_i.in")

    # XAS inputs
    edrixs.write_emat(emat_n, "xas/hopping_n.in")
    edrixs.write_umat(umat_n, "xas/coulomb_n.in")

    # RIXS inputs
    edrixs.write_emat(emat_i, "rixs_pp/hopping_i.in")
    edrixs.write_umat(umat_i, "rixs_pp/coulomb_i.in")
    edrixs.write_emat(emat_n, "rixs_pp/hopping_n.in")
    edrixs.write_umat(umat_n, "rixs_pp/coulomb_n.in")

    edrixs.write_emat(emat_i, "rixs_ps/hopping_i.in")
    edrixs.write_umat(umat_i, "rixs_ps/coulomb_i.in")
    edrixs.write_emat(emat_n, "rixs_ps/hopping_n.in")
    edrixs.write_umat(umat_n, "rixs_ps/coulomb_n.in")
Beispiel #4
0
# t2g system, 6 orbitals and occupied by 2 electrons
norb = 6
noccu = 2
# Hubbard U and Hund's coupling J in the form of Kanamori Coulomb interaction
U, J = 4, 1
# Hubbard Ud and Hund's coupling JH in the form of Slater Coulomb interaction
Ud, JH = edrixs.UJ_to_UdJH(U, J)
# Slater integrals
F0, F2, F4 = edrixs.UdJH_to_F0F2F4(Ud, JH)
# Two fermion terms: spin-orbital coupling (SOC)
# The matrix is in the complex spherical Harmonics basis
soc_zeta = 0.4
emat_soc = edrixs.atom_hsoc('t2g', soc_zeta)
# Four fermion terms: Coulomb interaction
# The 4-rank tensor is in the complex spherical Harmonics basis
umat = edrixs.get_umat_slater('t2g', F0, F2, F4)
# Fock basis in the complex spherical Harmonics basis with the orbital ordering:
# |-1,up>, |-1,dn>, |0,up>, |0,dn>, |+1,up>, |+1,dn>
# basis: 2d list of integers with 1 or 0, the shape is (15, 6) in this case
# where, 15=6*5/2 is the total number of Fock basis and 6 is the total number of
# single-particle orbitals
basis = edrixs.get_fock_bin_by_N(norb, noccu)

# quantum number of orbital angular momentum for t2g: l=1
ll = 1
# Matrices of lx,ly,lz,sx,sy,sz,jx,jy,jz in the single-particle basis
# lx: l_orb[0], ly: l_orb[1], lz: l_orb[2]
l_orb = edrixs.get_orb_momentum(ll, True)
# sx: s_spin[0], sy: s_spin[1], sz: s_spin[2]
s_spin = edrixs.get_spin_momentum(ll)
# jx: j_so[0], jy: j_so[1], jz: j_so[2]
Beispiel #5
0
from example_3_AIM_XAS import (F0_dd, F2_dd, F4_dd, nd, norb_d, norb_bath,
                               v_noccu, imp_mat, CF, bath_level, hyb, ext_B,
                               trans_c2n)

ntot = 20
################################################################################
# Four fermion matrix
# ------------------------------------------------------------------------------
# The Coulomb interactions in the :math:`d` shell of this problem are described
# by a :math:`10\times10\times10\times10` matrix. We
# need to specify a :math:`20\times20\times20\times 20` matrix since we need to
# include the full problem with :code:`ntot=20` spin-orbitals. The edrixs
# convention is to put the :math:`d` orbitals first, so we assign them to the
# first :math:`10\times10\times10\times 10` indices of the matrix. edrixs
# creates this matrix in the complex harmmonic basis by default.
umat_delectrons = edrixs.get_umat_slater('d', F0_dd, F2_dd, F4_dd)
umat = np.zeros((ntot, ntot, ntot, ntot), dtype=complex)
umat[:norb_d, :norb_d, :norb_d, :norb_d] += umat_delectrons

################################################################################
# Two fermion matrix
# ------------------------------------------------------------------------------
# Previously we made a :math:`10\times10` two-fermion matrix describing the
# :math:`d`-shell interactions. Keep in mind we did this in the real harmonic
# basis. We need to specify the two-fermion matrix for
# the full problem :math:`20\times20` spin-orbitals in size.
emat_rhb = np.zeros((ntot, ntot), dtype='complex')
emat_rhb[0:norb_d, 0:norb_d] += imp_mat

################################################################################
# The :code:`bath_level` energies need to be applied to the diagonal of the
#    .. math::
#        \begin{gather*}
#        U_{m_{l_i}m_{s_i}, m_{l_j}m_{s_j}, m_{l_t}m_{s_t},
#        m_{l_u}m_{s_u}}^{i,j,t,u}
#        = \\ \frac{1}{2} \delta_{m_{s_i},m_{s_t}}\delta_{m_{s_j},m_{s_u}}
#        \delta_{m_{l_i}+m_{l_j}, m_{l_t}+m_{l_u}}
#        \sum_{k}C_{l_i,l_t}(k,m_{l_i},m_{l_t})C_{l_u,l_j}
#        (k,m_{l_u},m_{l_j})F^{k}_{i,j,t,u}
#        \end{gather*}
#
# where :math:`m_s` is the magnetic quantum number for spin
# and :math:`m_l` is the quantum number for orbitals.
# :math:`F^{k}_{i,j,t,u}` are Slater integrals.
# :math:`C_{l_i,l_j}(k,m_{l_i},m_{l_j})` are Gaunt coefficients. We can
# construct the matrix via
umat = edrixs.get_umat_slater('p', F0, F2)

################################################################################
# Create basis
# ------------------------------------------------------------------------------
# Now we build the binary form of the Fock basis :math:`|F>` (we consider it
# preferable to use the standard :math:`F` and trust the reader to avoid
# confusing it with the Slater parameters.)
# The Fock basis is the simplest legitimate form for the basis and it consists
# of a series of 1s and 0s where 1 means occupied and
# 0 means  empty. These are in order up, down, up, down, up, down.
basis = edrixs.get_fock_bin_by_N(norb, noccu)
print(np.array(basis))
################################################################################
# We expect the number of these states to be given by the mathematical
# combination of two electrons distributed among six states (three orbitals
Beispiel #7
0
def ed():
    # 1-10: Ni-3d valence orbitals, 11-16: Ni-2p core orbitals
    # Single particle basis: complex shperical Harmonics
    ndorb, nporb, ntot = 10, 6, 16
    emat_i = np.zeros((ntot, ntot), dtype=np.complex)
    emat_n = np.zeros((ntot, ntot), dtype=np.complex)

    # 4-index Coulomb interaction tensor, parameterized by
    # Slater integrals, which are obtained from Cowan's code
    F2_d, F4_d = 7.9521, 4.9387
    # Averaged dd Coulomb interaction is set to be zero
    F0_d = edrixs.get_F0('d', F2_d, F4_d)
    G1_dp, G3_dp = 4.0509, 2.3037
    # Averaged dp Coulomb interaction is set to be zero
    F0_dp, F2_dp = edrixs.get_F0('dp', G1_dp, G3_dp), 7.33495
    umat_i = edrixs.get_umat_slater(
        'dp',
        F0_d,
        F2_d,
        F4_d,  # dd
        0,
        0,
        0,
        0,  # dp
        0,
        0)  # pp
    umat_n = edrixs.get_umat_slater(
        'dp',
        F0_d,
        F2_d,
        F4_d,  # dd
        F0_dp,
        F2_dp,
        G1_dp,
        G3_dp,  # dp
        0,
        0)  # pp

    # Atomic spin-orbit coupling
    zeta_d, zeta_p = 0.083, 11.24
    emat_i[0:ndorb, 0:ndorb] += edrixs.atom_hsoc('d', zeta_d)
    emat_n[0:ndorb, 0:ndorb] += edrixs.atom_hsoc('d', zeta_d)
    emat_n[ndorb:ntot, ndorb:ntot] += edrixs.atom_hsoc('p', zeta_p)

    # Tetragonal crystal field splitting terms,
    # which are first defined in the real cubic Harmonics basis,
    # and then transformed to complex shperical Harmonics basis.
    dt, ds, dq = 0.011428, 0.035714, 0.13
    tmp = np.zeros((5, 5), dtype=np.complex)
    tmp[0, 0] = 6 * dq - 2 * ds - 6 * dt  # d3z2-r2
    tmp[1, 1] = -4 * dq - 1 * ds + 4 * dt  # dzx
    tmp[2, 2] = -4 * dq - 1 * ds + 4 * dt  # dzy
    tmp[3, 3] = 6 * dq + 2 * ds - 1 * dt  # dx2-y2
    tmp[4, 4] = -4 * dq + 2 * ds - 1 * dt  # dxy
    tmp[:, :] = edrixs.cb_op(tmp, edrixs.tmat_r2c('d'))
    emat_i[0:ndorb:2, 0:ndorb:2] += tmp
    emat_i[1:ndorb:2, 1:ndorb:2] += tmp
    emat_n[0:ndorb:2, 0:ndorb:2] += tmp
    emat_n[1:ndorb:2, 1:ndorb:2] += tmp

    # Build Fock basis in its binary form
    basis_i = edrixs.get_fock_bin_by_N(ndorb, 8, nporb, nporb)
    basis_n = edrixs.get_fock_bin_by_N(ndorb, 9, nporb, nporb - 1)
    ncfg_i, ncfg_n = len(basis_i), len(basis_n)

    # Build many-body Hamiltonian in Fock basis
    hmat_i = np.zeros((ncfg_i, ncfg_i), dtype=np.complex)
    hmat_n = np.zeros((ncfg_n, ncfg_n), dtype=np.complex)
    hmat_i[:, :] += edrixs.two_fermion(emat_i, basis_i, basis_i)
    hmat_i[:, :] += edrixs.four_fermion(umat_i, basis_i)
    hmat_n[:, :] += edrixs.two_fermion(emat_n, basis_n, basis_n)
    hmat_n[:, :] += edrixs.four_fermion(umat_n, basis_n)

    # Do exact-diagonalization to get eigenvalues and eigenvectors
    eval_i, evec_i = np.linalg.eigh(hmat_i)
    eval_n, evec_n = np.linalg.eigh(hmat_n)

    # Build dipolar transition operators
    dipole = np.zeros((3, ntot, ntot), dtype=np.complex)
    T_abs = np.zeros((3, ncfg_n, ncfg_i), dtype=np.complex)
    T_emi = np.zeros((3, ncfg_i, ncfg_n), dtype=np.complex)
    tmp = edrixs.get_trans_oper('dp')
    for i in range(3):
        dipole[i, 0:ndorb, ndorb:ntot] = tmp[i]
        # First, in the Fock basis
        T_abs[i] = edrixs.two_fermion(dipole[i], basis_n, basis_i)
        # Then, transfrom to the eigenvector basis
        T_abs[i] = edrixs.cb_op2(T_abs[i], evec_n, evec_i)
        T_emi[i] = np.conj(np.transpose(T_abs[i]))

    return eval_i, eval_n, T_abs, T_emi
Beispiel #8
0
    G1_dp, G3_dp = 0.957, 0.569
    F0_dp, F2_dp = edrixs.get_F0('dp', G1_dp, G3_dp), 1.107

    zeta_d_i, zeta_p_n = 0.35, 1072.6666666666667

    Ir_loc2g = np.zeros((2, 3, 3), dtype=np.float64)
    Ir_loc2g[0] = [[+0.70710678, +0.40824829, +0.57735027],
                   [-0.70710678, +0.40824829, +0.57735027],
                   [+0.00000000, -0.81649658, +0.57735027]]
    Ir_loc2g[1] = [
        [-0.70710678, +0.40824829, -0.57735027],
        [+0.70710678, +0.40824829, -0.57735027],
        [+0.00000000, -0.81649658, -0.57735027],
    ]

    umat_t2g_i = edrixs.get_umat_slater('t2g', F0_d, F2_d, F4_d)
    umat_t2g_i = edrixs.transform_utensor(umat_t2g_i,
                                          edrixs.tmat_c2r('t2g', True))
    params = [
        0.0,
        0.0,
        0.0,  # Fk for d
        F0_dp,
        F2_dp,  # Fk for dp
        G1_dp,
        G3_dp,  # Gk for dp
        0.0,
        0.0  # Fk for p
    ]
    umat_t2gp_n = edrixs.get_umat_slater('t2gp', *params)
    tmat = np.zeros((12, 12), dtype=np.complex128)
Beispiel #9
0
def get_hopping_coulomb():
    norbs = 28

    Ud, JH = edrixs.UJ_to_UdJH(6, 0.45)
    F0_d, F2_d, F4_d = edrixs.UdJH_to_F0F2F4(Ud, JH)

    scale_dp = 0.9
    G1_dp, G3_dp = 0.894 * scale_dp, 0.531 * scale_dp
    F2_dp = 1.036 * scale_dp
    Udp_av = 0.0
    F0_dp = Udp_av + edrixs.get_F0('dp', G1_dp, G3_dp)

    params = [F0_d, F2_d, F4_d]
    umat_i = edrixs.get_umat_slater('t2g', *params)

    params = [F0_d, F2_d, F4_d, F0_dp, F2_dp, G1_dp, G3_dp, 0.0, 0.0]

    umat_tmp = edrixs.get_umat_slater('t2gp', *params)
    tmat = np.zeros((12, 12), dtype=np.complex128)
    tmat[0:6, 0:6] = edrixs.tmat_c2j(1)
    tmat[6:12, 6:12] = edrixs.tmat_c2j(1)
    umat_i[:, :, :, :] = edrixs.transform_utensor(umat_i, edrixs.tmat_c2j(1))

    umat_tmp[:, :, :, :] = edrixs.transform_utensor(umat_tmp, tmat)
    id1 = [0, 1, 2, 3, 4, 5, 8, 9, 10, 11]
    id2 = [0, 1, 2, 3, 4, 5, 24, 25, 26, 27]
    umat_n = np.zeros((norbs, norbs, norbs, norbs), dtype=np.complex)
    for i in range(10):
        for j in range(10):
            for k in range(10):
                for ll in range(10):
                    umat_n[id2[i], id2[j], id2[k],
                           id2[ll]] = umat_tmp[id1[i], id1[j], id1[k], id1[ll]]

    emat_i = np.zeros((norbs, norbs), dtype=np.complex128)
    emat_n = np.zeros((norbs, norbs), dtype=np.complex128)
    # bath energy level & hybridization strength
    N_site = 3
    data = np.loadtxt('bath_sites.in')
    e1, v1 = data[:, 0], data[:, 1]
    e2, v2 = data[:, 2], data[:, 3]

    h = np.zeros((24, 24), dtype=np.complex)
    h[0, 0] = h[1, 1] = -14.7627972353
    h[2, 2] = h[3, 3] = h[4, 4] = h[5, 5] = -15.4689430453
    for i in range(N_site):
        o = 6 + 6 * i
        # orbital j=1/2
        h[o + 0, o + 0] = h[o + 1, o + 1] = e1[i]
        h[0, o + 0] = h[1, o + 1] = h[o + 0, 0] = h[o + 1, 1] = v1[i]
        # orbital j=3/2
        h[o + 2, o + 2] = h[o + 3, o + 3] = h[o + 4, o + 4] = h[o + 5,
                                                                o + 5] = e2[i]
        h[2, o + 2] = h[3, o + 3] = h[4, o + 4] = h[5, o + 5] = v2[i]
        h[o + 2, 2] = h[o + 3, 3] = h[o + 4, 4] = h[o + 5, 5] = v2[i]

    emat_i[0:24, 0:24] += h
    emat_n[0:24, 0:24] += h

    # static core-hole potential
    static_V = 2.0
    for i in range(6):
        emat_n[i, i] -= static_V

    # Write to files
    # Search GS inputs
    edrixs.write_emat(emat_i, "search_gs/hopping_i.in")
    edrixs.write_umat(umat_i, "search_gs/coulomb_i.in")

    # ED inputs
    edrixs.write_emat(emat_i, "ed/hopping_i.in")
    edrixs.write_umat(umat_i, "ed/coulomb_i.in")

    # XAS inputs
    edrixs.write_emat(emat_n, "xas/hopping_n.in")
    edrixs.write_umat(umat_n, "xas/coulomb_n.in")

    # RIXS inputs
    edrixs.write_emat(emat_i, "rixs_pp/hopping_i.in")
    edrixs.write_umat(umat_i, "rixs_pp/coulomb_i.in")
    edrixs.write_emat(emat_n, "rixs_pp/hopping_n.in")
    edrixs.write_umat(umat_n, "rixs_pp/coulomb_n.in")

    edrixs.write_emat(emat_i, "rixs_ps/hopping_i.in")
    edrixs.write_umat(umat_i, "rixs_ps/coulomb_i.in")
    edrixs.write_emat(emat_n, "rixs_ps/hopping_n.in")
    edrixs.write_umat(umat_n, "rixs_ps/coulomb_n.in")
    You can change noccu to play with it.
    """
    # number of orbitals
    norbs = 14

    # number of occupancy, change this number and re-run it to see how it will change.
    noccu = 7

    # Slater integrals: FX, x=0, 2, 4, 2*3=6
    F2_f, F4_f, F6_f = 9.711 * 0.77, 6.364 * 0.77, 4.677 * 0.77
    # set the average Coulomb interaction energy Uf_ave to zero
    Uf_av = 0.0
    F0_f = Uf_av + edrixs.get_F0('f', F2_f, F4_f, F6_f)
    # get rank-4 Coulomb U-tensor
    params = [F0_f, F2_f, F4_f, F6_f]
    umat_i = edrixs.get_umat_slater('f', *params)
    # SOC strength
    zeta_f_i = 0.261 * 0.9
    hsoc_i = edrixs.atom_hsoc('f', zeta_f_i)

    # prepare files for ed.x
    # write control parameters to file
    edrixs.write_config(ed_solver=2,
                        num_val_orbs=norbs,
                        neval=100,
                        ncv=200,
                        nvector=1,
                        idump=True)
    # write nonzeros terms of two-fermion terms hsoc_i to file 'hopping_i.in', read by ed.x
    edrixs.write_emat(hsoc_i, 'hopping_i.in', 1E-10)
    # write nonzeros terms of four-fermion terms umat to file 'coulomb_i.in', read by ed.x
def get_hopping_coulomb(locaxis):
    # Number of orbitals for each site
    ndorb, nporb = 6, 4
    # Number of sites
    nsite = 2
    # Total number of orbitals
    ntot = nsite * (ndorb + nporb)
    # orbital orders:
    # 0-5:    1st-site-t2g
    # 6-11:   2nd-site-t2g
    # 12-15:  1st-site-2p
    # 16-19:  2nd-site-2p

    # On-site Coulomb interaction tensor
    U, J = 2.0, 0.3
    Ud, JH = edrixs.UJ_to_UdJH(U, J)
    F0_dd, F2_dd, F4_dd = edrixs.UdJH_to_F0F2F4(Ud, JH)  # k=0, 2, 2*l

    G1_dp, G3_dp = 0.957, 0.569  # k=|2-1|, |2+1|
    F0_dp, F2_dp = edrixs.get_F0('dp', G1_dp,
                                 G3_dp), 1.107  # k=0, min(2*2, 2*1)

    # just one site t2g-subspace
    umat_tmp_i = edrixs.get_umat_slater('t2g', F0_dd, F2_dd, F4_dd)

    params = [
        F0_dd,
        F2_dd,
        F4_dd,  # FX for dd
        F0_dp,
        F2_dp,  # FX for dp
        G1_dp,
        G3_dp,  # GX for dp
        0,
        0  # FX for pp
    ]
    # just one site
    umat_tmp_n = edrixs.get_umat_slater('t2gp32', *params)  # 2p_3/2 -> t2g

    # static core-hole potential
    static_v = 2.0
    for i in range(0, ndorb):
        for j in range(ndorb, ndorb + nporb):
            umat_tmp_n[i, j, j, i] += static_v

    # two sites as a whole
    umat_i = np.zeros((ntot, ntot, ntot, ntot), dtype=np.complex)
    umat_n = np.zeros((ntot, ntot, ntot, ntot), dtype=np.complex)

    umat_i[0:ndorb, 0:ndorb, 0:ndorb,
           0:ndorb] = umat_tmp_i  # 1st site 5d-valence
    umat_i[ndorb:2 * ndorb, ndorb:2 * ndorb, ndorb:2 * ndorb,
           ndorb:2 * ndorb] = umat_tmp_i  # 2nd site 5d-valence

    indx = np.array([
        [
            0,
            1,
            2,
            3,
            4,
            5,  # orbital indices for 1st site 5d-t2g
            12,
            13,
            14,
            15
        ],  # orbital indices for 1st site 2p-core
        [
            6,
            7,
            8,
            9,
            10,
            11,  # orbital indices for 2nd site 5d-t2g
            16,
            17,
            18,
            19
        ]  # orbital indices for 2nd site 2p-core
    ])
    # copy umat_tmp_n (one site) to umat_n (two sites)
    ndp = ndorb + nporb
    for m in range(nsite):
        for i in range(ndp):
            for j in range(ndp):
                for k in range(ndp):
                    for l in range(ndp):
                        umat_n[indx[m, i], indx[m, j], indx[m, k],
                               indx[m, l]] += umat_tmp_n[i, j, k, l]

    # two fermion terms, SOC, crystal field, and hopping between the two sites
    emat_i = np.zeros((ntot, ntot), dtype=np.complex)
    emat_n = np.zeros((ntot, ntot), dtype=np.complex)

    # SOC
    zeta_d_i = 0.35
    soc_d = edrixs.atom_hsoc('t2g', zeta_d_i)

    emat_i[0:ndorb, 0:ndorb] += soc_d
    emat_i[ndorb:2 * ndorb, ndorb:2 * ndorb] += soc_d

    emat_n[0:ndorb, 0:ndorb] += soc_d
    emat_n[ndorb:2 * ndorb, ndorb:2 * ndorb] += soc_d

    # Terms from static core-hole potential
    for i in range(2 * ndorb):
        emat_n[i, i] -= nporb * static_v

    # Crystal field and hoppings between the two Ir-sites
    d = -0.03  # trgional splitting in t2g-subspace

    # Uncomment the following line to do calculation without hopping and crystal filed splitting.
    t1, t2 = -0.18, 0.036  # hopping between the two-sites in t2g-subspace

    cf_tmp = np.array([  # dzx_1, dzy_1,  dxy_1,    dzx_2, dzy_2,  dxy_2
        [0, d, d, t1, t2, t1],  # dzx_1
        [d, 0, d, t2, t1, t1],  # dzy_1
        [d, d, 0, t1, t1, t2],  # dxy_1
        [t1, t2, t1, 0, d, d],  # dzx_2
        [t2, t1, t1, d, 0, d],  # dzy_2
        [t1, t1, t2, d, d, 0],  # dxy_2
    ])
    # Including spin degree of freedom, in global axis
    cf_spin = np.zeros((2 * ndorb, 2 * ndorb), dtype=np.complex)
    cf_spin[0:2 * ndorb:2, 0:2 * ndorb:2] = cf_tmp
    cf_spin[1:2 * ndorb:2, 1:2 * ndorb:2] = cf_tmp

    # Transform spin basis to local axis
    # 1/2-spinor matrix
    t_spinor = np.zeros((2 * ndorb, 2 * ndorb), dtype=np.complex128)
    for i in range(nsite):
        alpha, beta, gamma = edrixs.rmat_to_euler(locaxis[i])
        dmat = edrixs.dmat_spinor(alpha, beta, gamma)
        for j in range(ndorb // 2):
            off = i * ndorb + j * 2
            t_spinor[off:off + 2, off:off + 2] = dmat

    # Transform orbital basis from real cubic to complex harmonics
    t_orb = np.zeros((2 * ndorb, 2 * ndorb), dtype=np.complex128)
    t_orb[0:ndorb, 0:ndorb] = edrixs.tmat_r2c('t2g', True)
    t_orb[ndorb:2 * ndorb, ndorb:2 * ndorb] = edrixs.tmat_r2c('t2g', True)
    # Do the tranformation
    cf_spin[:, :] = edrixs.cb_op(cf_spin, np.dot(t_spinor, t_orb))

    emat_i[0:2 * ndorb, 0:2 * ndorb] += cf_spin
    emat_n[0:2 * ndorb, 0:2 * ndorb] += cf_spin

    # Write emat and umat to files
    # ED inputs
    edrixs.write_emat(emat_i, "ed/hopping_i.in")
    edrixs.write_umat(umat_i, "ed/coulomb_i.in")

    # XAS inputs
    edrixs.write_emat(emat_n, "xas/hopping_n.in")
    edrixs.write_umat(umat_n, "xas/coulomb_n.in")

    # RIXS inputs
    edrixs.write_emat(emat_i, "rixs_pp/hopping_i.in")
    edrixs.write_umat(umat_i, "rixs_pp/coulomb_i.in")
    edrixs.write_emat(emat_n, "rixs_pp/hopping_n.in")
    edrixs.write_umat(umat_n, "rixs_pp/coulomb_n.in")

    edrixs.write_emat(emat_i, "rixs_ps/hopping_i.in")
    edrixs.write_umat(umat_i, "rixs_ps/coulomb_i.in")
    edrixs.write_emat(emat_n, "rixs_ps/hopping_n.in")
    edrixs.write_umat(umat_n, "rixs_ps/coulomb_n.in")
Beispiel #12
0
#
# where :math:`\alpha`, :math:`\beta`, :math:`\gamma`, :math:`\delta` are
# orbital indices and :math:`\hat{f}^{\dagger}`
# (:math:`\hat{f}`) are the creation (anihilation) operators.
# For a :math:`d`-electron system, we have :math:`10` distinct spin-orbitals
# (:math:`5` orbitals each with :math:`2` spins), which makes matrix the
# :math:`10\times10\times10\times10` in total size.
# In EDRIXS the matrix can be created as follows:
import edrixs
import numpy as np
import scipy
import matplotlib.pyplot as plt
import itertools

F0, F2, F4 = 6.94, 14.7, 4.41
umat_chb = edrixs.get_umat_slater('d', F0, F2, F4)
################################################################################
# We stored this under variable :code:`umat_chb` where "cbh" stands for
# complex harmonic basis, which is the default basis in EDRIXS.

################################################################################
# Parameterizing interactions
# ------------------------------------------------------------------------------
# EDRIXS parameterizes the interactions in :math:`U` via Slater integral
# parameters :math:`F^{k}`. These relate to integrals of various spherical
# Harmonics as well as Clebsch-Gordon coefficients, Gaunt coefficients,
# and Wigner 3J symbols. Textbooks such as [1]_ can be used for further
# reference. If you are interested in the details of how
# EDRIXS does this (and you probably aren't) function :func:`.umat_slater`,
# constructs the required matrix via Gaunt coeficents from
# :func:`.get_gaunt`. Two alternative parameterizations are common.