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
34 stars 20 forks source link

A question about function umat_slater and get_umat_slater #181

Closed wangyuxinsplendid closed 12 months ago

wangyuxinsplendid commented 1 year ago

Dear edrixs authors: I have a question about these two functions. In the coulomb_utensor.py file, the function umat_slater provides two examples. In the example with one d-electron and one p-electron, I think four Slater parameters are missing in the input. The missing Slater parameters are fk[(1,1,1,2,2)]=G1_dp, fk[(3.1,1,2,2)]=G3_dp, fk[(1,2,2,1,1)]=G1_dp, and fk[(3,2,2,1,1)]=G3_dp, and the corresponding Gaunt integrals should not be zero.

The same issue are also found in the function "get_umat_slater". Lines 572-574 of this file did not assign values to these four parameters.

In the code list in below, I use the umat_slater function to calculate and compare the U matrix with or without assigning values ​​to the above four Slater integrals, and find that the two results are different.

For comparison, I input a non-contributing Slater integral, which does not affect the result. I also use the get_umat_slater function to calculate directly, and find that the result is consistent with when the four Slater integrals are not assigned.

Therefore, I think these four Slater integrals should not be lost, and they do contribute to the U matrix.

The code I used is listed below: import edrixs 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

We assign four additional (may be the missed) Slater integrals in fk.

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[(1,1,1,2,2)] = G1_dp #Not include in example. fk[(1,2,2,1,1)] = G1_dp #Not include in example. fk[(3,1,1,2,2)] = G3_dp #Not include in example. fk[(3,2,2,1,1)] = G3_dp #Not include in example. fk[(0,2,2,2,2)] = F0_pp fk[(2,2,2,2,2)] = F2_pp umat_dp = edrixs.umat_slater(l_list, fk)

fk1 is the same as the example.

fk1={} fk1[(0,1,1,1,1)] = F0_dd fk1[(2,1,1,1,1)] = F2_dd fk1[(4,1,1,1,1)] = F4_dd fk1[(0,1,2,1,2)] = F0_dp fk1[(0,2,1,2,1)] = F0_dp fk1[(2,1,2,1,2)] = F2_dp fk1[(2,2,1,2,1)] = F2_dp fk1[(1,1,2,2,1)] = G1_dp fk1[(1,2,1,1,2)] = G1_dp fk1[(3,1,2,2,1)] = G3_dp fk1[(3,2,1,1,2)] = G3_dp fk1[(0,2,2,2,2)] = F0_pp fk1[(2,2,2,2,2)] = F2_pp umat_dp1 = edrixs.umat_slater(l_list, fk1)

We assign one additional non-contributing Slater integral in fk2.

fk2={} fk2[(0,1,1,1,1)] = F0_dd fk2[(2,1,1,1,1)] = F2_dd fk2[(4,1,1,1,1)] = F4_dd fk2[(0,1,2,1,2)] = F0_dp fk2[(0,2,1,2,1)] = F0_dp fk2[(2,1,2,1,2)] = F2_dp fk2[(2,2,1,2,1)] = F2_dp fk2[(1,1,2,2,1)] = G1_dp fk2[(1,2,1,1,2)] = G1_dp fk2[(3,1,2,2,1)] = G3_dp fk2[(3,2,1,1,2)] = G3_dp fk2[(0,2,2,2,2)] = F0_pp fk2[(2,2,2,2,2)] = F2_pp fk2[(3,1,2,2,2)] = G3_dp # non-contributing Slater integral umat_dp2 = edrixs.umat_slater(l_list, fk2)

We use "get_umat_slater" function here.

umat_dp3=edrixs.get_umat_slater('dp',F0_dd,F2_dd,F4_dd,F0_dp,F2_dp,G1_dp,G3_dp,F0_pp,F2_pp)

print((umat_dp == umat_dp1).all()) #This result is False. print((umat_dp1 == umat_dp2).all()) #This result is True. print((umat_dp1 == umat_dp3).all()) #This result is True.

mpmdean commented 1 year ago

@wangyuxinsplendid Thank you for the input.

@shenmidelin would you be able to comment upon this?

shenmidelin commented 1 year ago

@wangyuxinsplendid Thank you very much for the comment! Yes, you are right, fk[(1,1,1,2,2)]=G1_dp, fk[(3,1,1,2,2)]=G3_dp, fk[(1,2,2,1,1)]=G1_dp, and fk[(3,2,2,1,1)]=G3_dp, are not zeros in general. However, here we only consider the Hilbert space that does not change the total occupancy numbers of each non-equivalent atomic shells. Take the d-p shells for example, processes like d^{\dagger}d^{\dagger} p p are not considered in the calculations. This is reasonable since in X-ray scattering, the process that annihilate two p-core electrons and create two d valence electrons will cost a lot of energies, which can be safely ignored. Those four fks will annihilate two p electrons and create two d electrons (vice versa), so they will not change the results. We are sorry for this confusion and we will consider to make it more general and transparent.

wangyuxinsplendid commented 1 year ago

@shenmidelin I see. Thank you for your reply.

mpmdean commented 1 year ago

Dear @wangyuxinsplendid do you consider this issue to be addressed adequately? Or should some updates to the documentation be considered?