asked by Riccardo Piombo (2020/04/30 12:10)
Hi there, it seems I've got a problem in PES spectrum computation: I obtain the correct spectrum of a d10 system if I set all the Coulomb interaction equal to zero. It should be the same also in the interacting case because I'm adding a single hole to the system, but it doesn't happen. Anyone can give me any advice?
Here is the part of the script where I compute the PES Spectrum. If necessary, I can also send you the part of the code in which the Hamiltonian is defined.
A small clarification: the system is a molecule formed by a transition metal and a Ligand atom. I'm considering only the sub-shell 4d of the TM while I'm considering a sub-shell with the same symmetry as the 4d in the Ligand: the latter is formed by the bonding linear combinations of p spin-orbitals.
-- number of fermionic spin-orbitals
NF=20
-- number of bosonic modes
NB=0
-- 4d spin-orbitals in spherical harmonics basis
IndexDn_4d={ 0, 2, 4, 6, 8}
IndexUp_4d={ 1, 3, 5, 7, 9}
-- Ligand-P spin-orbitals in spherical harmonics basis
IndexDn_Ld={10, 12, 14, 16, 18}
IndexUp_Ld={11, 13, 15, 17, 19}
--######################################### PES Spectrum #########################################
----------- Hamiltonian diagonalization -----------
Npsi_i = 1
psiList_N = Eigensystem(H_tot, StartRestrictions1, Npsi_i)
psiList_N = {psiList_N}
oppList={H_tot, OppHopLd4d, OppCF_4d, OppCF_Ld, OppUdd, OppULpLp, OppN_4d, OppN_Ld}
print("Done")
print("")
print("---------- Energies in eV ----------")
print("")
print(" # <E> <Ehyb> <CF4d> <CFLd> <Udd> <Upp> <N_4d> <N_Ld>");
for i = 1,#psiList_N do
io.write(string.format("%3i ",i))
for j = 1,#oppList do
expectationvalue = Chop(psiList_N[i]*oppList[j]*psiList_N[i])
io.write(string.format("%9.5f ",expectationvalue))
end
io.write("\n")
end
if ToDo['Scalar Product'] then
print("")
print("---------- Scalar product <ψ[i]|ψ[j]> ----------")
print("")
for i = 1,#psiList_N do
for j = 1,#psiList_N do
io.write(string.format("%3i %3i ",i,j))
scalar_product = Chop(psiList_N[i]*psiList_N[j])
io.write(string.format("%8.3f ",scalar_product))
end
io.write("\n")
end
end
----------- chemical potential -----------
-- Fermi energy is not defined in the experimental data so we have to fix
-- it and then freely translate the experimental spectrum along w axis
-- Three possible choices: μ+ , μ- , mean μ
-- μ- : chemical potential to remove a particle
print("")
print("(N-1)-body states energies computation")
StartRestrictions_rem = {NF, NB, {"1111111111 1111111111",nL + (n4d-1),nL + (n4d-1)}}
psiList_Nminus1 = Eigensystem(H_tot, StartRestrictions_rem, 1)
psiList_Nminus1 = {psiList_Nminus1}
E_gs_N = psiList_N[1]*(H_tot)*psiList_N[1]
E_gs_Nminus1 = psiList_Nminus1[1]*(H_tot)*psiList_Nminus1[1]
remove_mu = E_gs_N - E_gs_Nminus1
print("E_gs_N = ", E_gs_N)
print("E_GS_N-1 = ", E_gs_Nminus1)
print("mu- = ", remove_mu)
print("Done")
print("")
-- μ+ : chemical potential to add a particle
print("(N+1)-body states energies computation")
StartRestrictions_add = {NF, NB, {"1111111111 1111111111",nL + (n4d+1), nL + (n4d+1)}}
psiList_Nplus1 = Eigensystem(H_tot, StartRestrictions_add, 1)
psiList_Nplus1 = {psiList_Nplus1}
-- check for n4d = 10
-- print(psiList_Nplus1) == is nhil
-- E_Gs(N+1) = 0
E_gs_Nplus1 = psiList_Nplus1[1]*(H_tot)*psiList_Nplus1[1]
add_mu = E_gs_Nplus1 - E_gs_N
print("E_gs_N = ", E_gs_N)
print("E_GS_N+1 = ", E_gs_Nplus1)
print("mu+ = ", add_mu)
print("Done")
print("")
-- mean μ
mean_mu = (add_mu + remove_mu)/2.0
print("mean mu = [(mu+) + (mu-)]/2 = ", mean_mu)
print("")
----------- change-basis matrix -----------
Orbitals = {"4d","Ligand-P_d"}
YtoK = YtoKMatrix(Orbitals)
KtoY = ConjugateTranspose(YtoK)
print("YtoK = ")
print(YtoK)
print("")
print("KtoY =")
print(KtoY)
----------- PES Spectrum Computation -----------
-- Rotate returns M' = R* M R^T
-- the hermitian conjugate to KtoY is YtoK
-- we use rotate to obtain Kubic harmonics
-- We create a list of operators related to the removal and adding spectrum
-- Then the spectral function of each operator in this list is computed
-- the output file contains as many columns as many operators are specified in the list.
-- The columns can be later combined using a python program to obtain the operators in
-- the requested representation
-- from T_SW[1] to T_SW[20] there are the operators related to the removal spectrum
T_SW = {}
for k,v in pairs(IndexUp_4d) do
T_SW[#T_SW + 1] = Rotate(NewOperator("An", NF, v-1), KtoY) ---> v-1 provides for the down components
-- here #T_SW increases by one
T_SW[#T_SW + 1] = Rotate(NewOperator("An", NF, v), KtoY) ---> v provides for the up components
end
print(T_SW)
for k,v in pairs(IndexUp_Ld) do
T_SW[#T_SW + 1] = Rotate(NewOperator("An", NF, v-1), KtoY)
T_SW[#T_SW + 1] = Rotate(NewOperator("An", NF, v), KtoY)
end
-- from T_SW[21] to T_SW[40] there are the operators related to the adding spectrum
for k,v in pairs(IndexUp_4d) do
T_SW[#T_SW + 1] = Rotate(NewOperator("Cr", NF, v-1), KtoY)
T_SW[#T_SW + 1] = Rotate(NewOperator("Cr", NF, v), KtoY)
end
for k,v in pairs(IndexUp_Ld) do
T_SW[#T_SW + 1] = Rotate(NewOperator("Cr", NF, v-1), KtoY)
T_SW[#T_SW + 1] = Rotate(NewOperator("Cr", NF, v), KtoY)
end
print("Gamma = ", Gamma)
print("Npoint = ", Npoint)
print("Gamma unb = ", Gamma_unb)
print("Npoint unb = ", Npoint_unb)
-- CreateSpectra returns G(ω) = <ψ|O*_2 (ω + E0 + iΓ/2 - O_1)^-1 O_2|ψ>
-- where E0 = <ψ|O_1|ψ>. Here O_2 = Σ_m d_m and O_1 = Htot.
-- Total spectral wieght
G_SW = CreateSpectra(H_tot, T_SW , psiList_N[1], {{"Emin",E_min}, {"Emax",E_max}, {"NE",Npoint}, {"Gamma",Gamma}} )
--G_SW.Shift(remove_mu)
G_SW = -(1/math.pi)*G_SW
peaks_SW = CreateSpectra(H_tot, T_SW, psiList_N[1], {{"Emin", E_min}, {"Emax",E_max}, {"NE",Npoint_unb}, {'Gamma',Gamma_unb}} )
--peaks_SW.Shift(remove_mu)
peaks_SW = -(1/math.pi)*peaks_SW
G_SW.Print({{"file","PES_Spectra.dat"}})
peaks_SW.Print({{"file", "Peaks.dat"}})