coulomb_utensor

edrixs.coulomb_utensor.get_gaunt(l1, l2)[source]

Calculate the Gaunt coefficents \(C_{l_1,l_2}(k,m_1,m_2)\)

\[C_{l_1,l_2}(k,m_1,m_2)=\sqrt{\frac{4\pi}{2k+1}} \int \mathop{d\phi} \mathop{d\theta} sin(\theta) Y_{l_1}^{m_1\star}(\theta,\phi) Y_{k}^{m_1-m_2}(\theta,\phi) Y_{l_2}^{m_2}(\theta,\phi)\]
Parameters:
l1: int

The first quantum number of angular momentum.

l2: int

The second quantum number of angular momentum.

Returns:
res: 3d float array

The calculated Gaunt coefficents.

The 1st index (\(= 0, 1, ..., l_1+l_2+1\)) is the order \(k\).

The 2nd index (\(= 0, 1, ... ,2l_1\)) is the magnetic quantum number \(m_1\) plus \(l_1\)

The 3nd index (\(= 0, 1, ... ,2l_2\)) is the magnetic quantum number \(m_2\) plus \(l_2\)

Notes

It should be noted that \(C_{l_1,l_2}(k,m_1,m_2)\) is nonvanishing only when

\(k + l_1 + l_2 = \text{even}\),

and

\(|l_1 - l_2| \leq k \leq l_1 + l_2\).

Please see Ref. [1] p. 10 for more details.

References

[1]

Sugano S, Tanabe Y and Kamimura H. 1970. Multiplets of Transition-Metal Ions in Crystals. Academic Press, New York and London.

Examples

>>> import edrixs

Get gaunt coefficients between \(p\)-shell and \(d\)-shell

>>> g = edrixs.get_gaunt(1, 2)
edrixs.coulomb_utensor.get_umat_kanamori(norbs, U, J)[source]

Calculate the Coulomb interaction tensor for a Kanamori-type interaction. For the \(t2g\)-shell case, it is parameterized by \(U, J\).

Parameters:
norbs: int

number of orbitals (including spin).

U: float

Hubbard \(U\) for electrons residing on the same orbital with opposite spin.

J: float

Hund’s coupling.

Returns:
umat: 4d complex array

The calculated Coulomb interaction tensor

See also

coulomb_utensor.get_umat_kanamori_ge
coulomb_utensor.get_umat_slater
coulomb_utensor.umat_slater

Notes

The order of spin index is: up, down, up, down, …, up, down.

edrixs.coulomb_utensor.get_umat_kanamori_ge(norbs, U1, U2, J, Jx, Jp)[source]

Calculate the Coulomb interaction tensor for a Kanamori-type interaction. For the general case, it is parameterized by \(U_1, U_2, J, J_x, J_p\).

Parameters:
norbs: int

number of orbitals (including spin).

U1: float

Hubbard \(U\) for electrons residing on the same orbital with opposite spin.

U2: float

Hubbard \(U\) for electrons residing on different orbitals.

J: float

Hund’s coupling for density-density interaction.

Jx: float

Hund’s coupling for spin flip.

Jp: float

Hund’s coupling for pair-hopping.

Returns:
umat: 4d complex array

The calculated Coulomb interaction tensor

See also

coulomb_utensor.get_umat_kanamori
coulomb_utensor.get_umat_slater
coulomb_utensor.umat_slater

Notes

The order of spin index is: up, down, up, down, …, up, down.

edrixs.coulomb_utensor.get_umat_slater(case, *args)[source]

Convenient adapter function to return the Coulomb interaction tensor for common case.

Parameters:
case: string

Indicates atomic shells, should be one of

For single shell:

  • ‘s’: single \(s\)-shell (\(l=0\))

  • ‘p’: single \(p\)-shell (\(l=1\))

  • ‘p12’: single \(p_{1/2}\)-shell (\(l=1\))

  • ‘p32’: single \(p_{3/2}\)-shell (\(l=1\))

  • ‘t2g’: single \(t_{2g}\)-shell (\(l_{\text{eff}}=1\))

  • ‘d’: single \(d\)-shell (\(l=2\))

  • ‘d32’: single \(d_{3/2}\)-shell (\(l=2\))

  • ‘d52’: single \(d_{5/2}\)-shell (\(l=2\))

  • ‘f’: single \(f\)-shell (\(l=3\))

  • ‘f52’: single \(f_{5/2}\)-shell (\(l=3\))

  • ‘f72’: single \(f_{7/2}\)-shell (\(l=3\))

For two shells:

case = str1 + str2

where, str1 and str2 are strings and they can be any of

[‘s’, ‘p’, ‘p12’, ‘p32’, ‘t2g’, ‘d’, ‘d32’, ‘d52’, ‘f’, ‘f52’, ‘f72’]

For examples,

  • ‘dp’: 1st \(d\)-shell and 2nd \(p\)-shell

  • ‘dp12’: 1st \(d\)-shell and 2nd \(p_{1/2}\)-shell

  • ‘f52p32’: 1st \(f_{5/2}\)-shell and 2nd \(p_{3/2}\)-shell

  • ‘t2gp’: 1st \(t_{2g}\)-shell and 2nd \(p\)-shell

*args: floats

Variable length argument list. Slater integrals. The order of these integrals shoule be

For only one shell case,

args = [F0, F2, F4, F6, ….]

For two shells case,

args = [FX_11, FX_12, GX_12, FX_22]

where, 1 (2) means 1st (2nd)-shell, and X=0, 2, 4, … or X=1, 3, 5 …, and X should be in ascending order. The following are possible cases:

  • ‘s’:

args = [F0]

  • ‘p’, ‘p12’, ‘p32’:

args = [F0, F2]

  • ‘d’, ‘d32’, ‘d52’, ‘t2g’:

args = [F0, F2, F4]

  • ‘f’, ‘f52’, ‘f72’:

args = [F0, F2, F4, F6]

  • ‘ss’:

args = [F0_11, F0_12, G0_12, F0_22]

  • ‘ps’, ‘p12s’, ‘p32s’:

args = [F0_11, F2_11, F0_12, G1_12, F0_22]

  • ‘ds’, ‘d32s’, ‘d52s’, ‘t2gs’:

args = [F0_11, F2_11, F4_11, F0_12, G2_12, F0_22]

  • ‘fs’, ‘f52s’, ‘f72s’:

args = [F0_11, F2_11, F4_11, F6_11, F0_12, G3_12, F0_22]

  • ‘sp’, ‘sp12’, ‘sp32’:

args = [F0_11, F0_12, G1_12, F0_22, F2_22]

  • ‘pp’, ‘pp12’, ‘pp32’, ‘p12p’, ‘p12p12’, ‘p12p32’, ‘p32p’, ‘p32p12’, ‘p32p32’:

args = [F0_11, F2_11, F0_12, F2_12, G0_12, G2_12, F0_22, F2_22]

  • ‘dp’, ‘dp12’, ‘dp32’, ‘d32p’, ‘d32p12’, ‘d32p32’, ‘d52p’, ‘d52p12’, ‘d52p32’, ‘t2gp’, ‘t2gp12’, t2gp32’:

args = [F0_11, F2_11, F4_11, F0_12, F2_12, G1_12, G3_12, F0_22, F2_22]

  • ‘fp’, ‘fp12’, ‘fp32’, ‘f52p’, ‘f52p12’, ‘f52p32’, ‘f72p’, ‘f72p12’, ‘f72p32’:

args = [F0_11, F2_11, F4_11, F6_11, F0_12, F2_12, G2_12, G4_12, F0_22, F2_22]

  • ‘sd’, ‘sd32’, ‘sd52’:

args = [F0_11, F0_12, G2_12, F0_22, F2_22, F4_22]

  • ‘pd’, ‘pd32’, ‘pd52’, ‘p12d’, ‘p12d32’, ‘p12d52’, ‘p32d’, ‘p32d32’, ‘p32d52’:

args = [F0_11, F2_11, F0_12, F2_12, G1_12, G3_12, F0_22, F2_22, F4_22]

  • ‘dd’, ‘dd32’, ‘dd52’, ‘d32d’, ‘d32d32’, ‘d32d52’, ‘d52d’, ‘d52d32’, ‘d52d52’, ‘t2gd’, ‘t2gd32’, ‘t2gd52’:

args = [F0_11, F2_11, F4_11, F0_12, F2_12, F4_12, G0_12, G2_12, G4_12, F0_22, F2_22, F4_22]

  • ‘fd’, ‘fd32’, ‘fd52’, ‘f52d’, ‘f52d32’, ‘f52d52’, ‘f72d’, ‘f72d32’, ‘f72d52’:

args = [F0_11, F2_11, F4_11, F6_11, F0_12, F2_12, F4_12, G1_12, G3_12, G5_12, F0_22, F2_22, F4_22]

  • ‘sf’, ‘sf52’, ‘sf72’:

args = [F0_11, F0_12, G3_12, F0_22, F2_22, F4_22, F6_22]

  • ‘pf’, ‘pf52’, ‘pf72’, ‘p12f’, ‘p12f52’, ‘p12f72’, ‘p32f’, ‘p32f52’, ‘p32f72’:

args = [F0_11, F2_11, F0_12, F2_12, G2_12, G4_12, F0_22, F2_22, F4_22, F6_22]

  • ‘df’, ‘df52’, ‘df72’, ‘d32f’, ‘d32f52’, ‘d32f72’, ‘d52f’, ‘d52f52’, ‘d52f72’, ‘t2gf’, ‘t2gf52’, ‘t2gf72’:

args = [F0_11, F2_11, F4_11, F0_12, F2_12, F4_12, G1_12, G3_12, G5_12, F0_22, F2_22, F4_22, F6_22]

  • ‘ff’, ‘ff52’, ‘ff72’, ‘f52f’, ‘f52f52’, ‘f52f72’, ‘f72f’, ‘f72f52’, ‘f72f72’:

args = [F0_11, F2_11, F4_11, F6_11, F0_12, F2_12, F4_12, F6_12, G0_12, G2_12, G4_12, G6_12, F0_22, F2_22, F4_22, F6_22]

Returns:
umat: 4d array of complex

the Coulomb interaction tensor

See also

coulomb_utensor.umat_slater
coulomb_utensor.get_umat_kanamori
coulomb_utensor.get_umat_kanamori_ge

Examples

>>> import edrixs
>>> F0_dd, F2_dd, F4_dd = 3.0, 1.0, 0.5
>>> F0_dp, F2_dp, G1_dp, G3_dp = 2.0, 1.0, 0.2, 0.1
>>> F0_pp, F2_pp = 0.0, 0.0
>>> slater = [F0_dd, F2_dd, F4_dd, F0_dp, F2_dp, G1_dp, G3_dp, F0_pp, F2_pp]
>>> umat_d = edrixs.get_umat_slater('d', F0_dd, F2_dd, F4_dd)
>>> umat_dp = edrixs.get_umat_slater('dp', *slater)
>>> umat_t2gp = edrixs.get_umat_slater('t2gp', *slater)
>>> umat_dp32 = edrixs.get_umat_slater('dp32', *slater)
edrixs.coulomb_utensor.get_umat_slater_3shells(shell_name, *args)[source]

Given three shells, build the slater type of Coulomb tensors among the three shells.

Parameters:
shell_name: tuple of three strings

Shells names.

*args: floats

Slater integrals. The order should be

FX_11, FX_12, GX_12, FX_22, FX_13, GX_13, FX_23, GX_23, FX_33

where, 1, 2, 3 means 1st, 2nd, 3rd shell, and X=0, 2, 4, … or X=1, 3, 5 …, and X should be in ascending order.

Returns:
umat: 4d complex array

Rank-4 Coulomb tensors.

edrixs.coulomb_utensor.umat_slater(l_list, fk)[source]

Calculate the Coulomb interaction tensor defined via

\[\hat{U} = \sum_{i j u t} \sum_{m_l​,m_s} U_{m_{l_i}m_{s_i}, m_{l_j}m_{s_j}, m_{l_u}m_{s_u}, m_{l_t}m_{s_t}}^{i,j,u,t} \hat{f}^{\dagger}_{i} \hat{f}^{\dagger}_{j} \hat{f}_{t} \hat{f}_{u} ,\]

which is parameterized by Slater integrals \(F^{k}\):

\[U_{m_{l_i}m_{s_i}, m_{l_j}m_{s_j}, m_{l_u}m_{s_u}, m_{l_t}m_{s_t}}^{i,j,u,t} =\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}\]

where \(m_s\) is the magnetic quantum number for spin and \(m_l\) is the magnetic quantum number for orbital. \(F^{k}_{i,j,t,u}\) are Slater integrals. \(C_{l_i,l_j}(k,m_{l_i},m_{l_j})\) are Gaunt coefficients. Note that the matrix is indexed with respect to the second quantization convention, where the last two indices in the tensor are swapped with respect to the operators so double occupancy involves matrix elements umat[i, j, j, i].

\[\]
Parameters:
l_list: list of int

contains the quantum number of orbital angular momentum \(l\) for each shell.

fk: dict of float

contains all the possible Slater integrals between the shells in l_list, the key is a tuple of 5 ints (\(k,i,j,t,u\)), where \(k\) is the order, \(i,j,t,u\) are the shell indices begin with 1.

Returns:
umat: 4d array of complex

contains the Coulomb interaction tensor.

See also

coulomb_utensor.get_umat_slater
coulomb_utensor.get_umat_kanamori
coulomb_utensor.get_umat_kanamori_ge

Examples

>>> import edrixs

For only one \(d\)-shell

>>> l_list = [2]
>>> fk={}
>>> F0, F2, F4 = 5.0, 4.0 2.0
>>> fk[(0,1,1,1,1)] = F0
>>> fk[(2,1,1,1,1)] = F2
>>> fk[(4,1,1,1,1)] = F4
>>> umat_d = edrixs.umat_slater(l_list, fk)

For one \(d\)-shell and one \(p\)-shell

>>> l_list = [2,1]
>>> fk={}
>>> F0_dd, F2_dd, F4_dd = 5.0, 4.0, 2.0
>>> F0_dp, F2_dp = 4.0, 2.0
>>> G1_dp, G3_dp = 2.0, 1.0
>>> F0_pp, F2_pp = 2.0, 1.0
>>> fk[(0,1,1,1,1)] = F0_dd
>>> fk[(2,1,1,1,1)] = F2_dd
>>> fk[(4,1,1,1,1)] = F4_dd
>>> fk[(0,1,2,1,2)] = F0_dp
>>> fk[(0,2,1,2,1)] = F0_dp
>>> fk[(2,1,2,1,2)] = F2_dp
>>> fk[(2,2,1,2,1)] = F2_dp
>>> fk[(1,1,2,2,1)] = G1_dp
>>> fk[(1,2,1,1,2)] = G1_dp
>>> fk[(3,1,2,2,1)] = G3_dp
>>> fk[(3,2,1,1,2)] = G3_dp
>>> fk[(0,2,2,2,2)] = F0_pp
>>> fk[(2,2,2,2,2)] = F2_pp
>>> umat_dp = edrixs.umat_slater(l_list, fk)