-- This tutorial calculates the ground-state of NiO within the crystal-field theory approximation
-- Within crystal-field theory the solid is approximated by a single atom in an effective
-- potential. Although an extremely crude approximation it is useful for some cases.
-- For correlated transition metal insulators it captures the right symmetry of the
-- localized open d-shell. It is useful to determine magnetic g-factors, energies of d-d
-- excitations or core level x-ray absorption. (2p to 3d excitations L23 edges)
-- One should notice that the effective crystal-field potential is an effective potential
-- it is there to mimic the interaction with neighboring ligand atoms. In real materials
-- there do not exist such large electro static potentials.
-- In order to do crystal-field theory for NiO we need to define a Ni d-shell.
-- A d-shell has 10 elements and we label again the even spin-orbitals to be spin down
-- and the odd spin-orbitals to be spin up.
NF=10
NB=0
IndexDn_3d={0,2,4,6,8}
IndexUp_3d={1,3,5,7,9}
-- We define several operators acting on the Ni d-shell
OppSx =NewOperator("Sx" ,NF, IndexUp_3d, IndexDn_3d)
OppSy =NewOperator("Sy" ,NF, IndexUp_3d, IndexDn_3d)
OppSz =NewOperator("Sz" ,NF, IndexUp_3d, IndexDn_3d)
OppSsqr =NewOperator("Ssqr" ,NF, IndexUp_3d, IndexDn_3d)
OppSplus=NewOperator("Splus",NF, IndexUp_3d, IndexDn_3d)
OppSmin =NewOperator("Smin" ,NF, IndexUp_3d, IndexDn_3d)
OppLx =NewOperator("Lx" ,NF, IndexUp_3d, IndexDn_3d)
OppLy =NewOperator("Ly" ,NF, IndexUp_3d, IndexDn_3d)
OppLz =NewOperator("Lz" ,NF, IndexUp_3d, IndexDn_3d)
OppLsqr =NewOperator("Lsqr" ,NF, IndexUp_3d, IndexDn_3d)
OppLplus=NewOperator("Lplus",NF, IndexUp_3d, IndexDn_3d)
OppLmin =NewOperator("Lmin" ,NF, IndexUp_3d, IndexDn_3d)
OppJx =NewOperator("Jx" ,NF, IndexUp_3d, IndexDn_3d)
OppJy =NewOperator("Jy" ,NF, IndexUp_3d, IndexDn_3d)
OppJz =NewOperator("Jz" ,NF, IndexUp_3d, IndexDn_3d)
OppJsqr =NewOperator("Jsqr" ,NF, IndexUp_3d, IndexDn_3d)
OppJplus=NewOperator("Jplus",NF, IndexUp_3d, IndexDn_3d)
OppJmin =NewOperator("Jmin" ,NF, IndexUp_3d, IndexDn_3d)
Oppldots=NewOperator("ldots",NF, IndexUp_3d, IndexDn_3d)
-- Next we define the Coulomb operator. The Coulomb operator is given as:
-- Sum_{i,j} e^2/|r_i-r_j|
-- This is actually a nastier sum than one might think as r_i-r_j=0 for r_i=r_j.
-- The solution is to expand this operator on spherical harmonics
-- ~ sum_k,m Y(t_i,p_i) Y(t_j,p_j)^* f(r_i,r_j)
-- the part depending on the angles (theta and phi) can be solved analytically.
-- The radial part (f(r_i,r_j)) is calculated numerically and results in the Slater integrals
-- The sum runs in principle over all possible values of k. The expansion coefficient k is
-- related to the momentum transfer of two electrons when they scatter due to the Coulomb
-- interaction. There is a maximal transfer of momentum that can happen between two electrons
-- which is 2l. Furthermore k has to be even due to parity.
-- There are thus l+1 = 3 Slater integrals for two electrons in the d-shell.
-- F[0], F[2] and F[4]. F[0] is the spherical interaction between two d electrons. F[2] and
-- F[4] represent interaction or scattering processes whereby the electrons exchange an angular
-- momentum of 2 or 4.
--
-- We here define the part depending on F0, F2 and F4 separately.
-- when summing we can put in the numerical values
-- of the slater integrals.
OppF0 =NewOperator("U", NF, IndexUp_3d, IndexDn_3d, {1,0,0})
OppF2 =NewOperator("U", NF, IndexUp_3d, IndexDn_3d, {0,1,0})
OppF4 =NewOperator("U", NF, IndexUp_3d, IndexDn_3d, {0,0,1})
-- Next we need to define the crystal field.
-- The crystal-field is a potential that lifts the degeneracy of the d electrons.
-- There are several ways to add such an interaction. We here follow the classical
-- notation as for example used in Ballhausen or other textbooks on crystal-field theory.
-- We expand the crystal-field potential on (renormalized) spherical harmonics and
-- enter the expansion coefficients of this potential.
-- For specific symmetries there are relations between the different expansion coefficients.
-- The function PotentialExpandedOnClm takes as an input the energies of the eigen-orbitals
-- and creates the potential expanded on spherical harmonics. The order of the eigen-energies
-- is the same as used in most point-group tables. (in cubic symmetry it is eg before t2g)
-- We here create an operator that splits the d-shell into t2g orbitals at an energy of -0.4
-- and eg orbitals at an energy of 0.6, such that the total splitting is one and the center
-- of gravity is not changed. One can change the total splitting by multiplying this operator
-- Akm = {{k1,m1,Akm1},{k2,m2,Akm2}, ... }
Akm = PotentialExpandedOnClm("Oh",2,{0.6,-0.4});
OpptenDq = NewOperator("CF", NF, IndexUp_3d, IndexDn_3d, Akm);
-- We do not only want to give the t2g and eg electrons a different energy, it is also nice
-- to define operators that count the number of t2g and eg electrons. If we define an operator
-- where the eg electrons have an onsite energy of 1 and the t2g electrons have an onsite
-- energy of 0 then the expectation value of such an operator is proportional to the total
-- number of eg electrons. This is what we do in the next 4 lines, once to get an operator
-- that counts the number of eg electrons, once to create an operator that counts the number
-- of t2g electrons
Akm = PotentialExpandedOnClm("Oh",2,{1,0});
OppNeg = NewOperator("CF", NF, IndexUp_3d, IndexDn_3d, Akm);
Akm = PotentialExpandedOnClm("Oh",2,{0,1});
OppNt2g = NewOperator("CF", NF, IndexUp_3d, IndexDn_3d, Akm);
-- once all operators are defined we can set some parameter values.
-- the value of U drops out of a crystal-field calculation as the total number of electrons
-- is always the same
U = 0.000
-- F2 and F4 are often referred to in the literature as J_{Hund}. They represent the energy
-- differences between different multiplets. Numerical values can be found in the back of
-- my PhD. thesis for example. http://arxiv.org/abs/cond-mat/0505214
F2dd = 11.142
F4dd = 6.874
-- F0 is not the same as U, although they are related. Unimportant in crystal-field theory
-- the difference between U and F0 is so important that I do include it here. (U=0 so F0 is not)
F0dd = U+(F2dd+F4dd)*2/63
-- tenDq in NiO is 1.1 eV as can be seen in optics or using IXS to measure d-d excitations
tenDq = 0
-- the Ni 3d spin-orbit is small but finite
zeta_3d = 0*0.081
-- we add a small magnetic field
Bz = 0.000001
-- note that all energies are in units of electron volt. (tesla to eV is EnergyUnits.Tesla.value = 5.788.... E-5)
-- the total Hamiltonian is the sum of the different operators multiplied with their prefactor
Hamiltonian = F0dd*OppF0 + F2dd*OppF2 + F4dd*OppF4 + tenDq*OpptenDq + zeta_3d*Oppldots + Bz*(2*OppSz + OppLz)
-- we now can create the lowest Npsi eigenstates:
Npsi=45;
-- in order to make sure we have a filling of 8
-- electrons we need to define some restrictions
StartRestrictions = {NF, NB, {"1111111111",8,8}};
-- we calculate the eigen system
psiList = Eigensystem(Hamiltonian, StartRestrictions, Npsi);
-- In order to get some information on these eigenstates it is good to plot expectation values
-- We first define a list of all the operators we would like to calculate the expectation value of
oppList={Hamiltonian, OppSsqr, OppLsqr, OppJsqr, OppSz, OppLz, Oppldots, OppF2, OppF4, OppNeg, OppNt2g};
-- next we loop over all operators and all states and print the expectation value
print(" ~~ ");
for i = 1,#psiList do
for j = 1,#oppList do
expectationvalue = Chop(psiList[i]*oppList[j]*psiList[i])
io.write(string.format("%6.3f ",expectationvalue))
end
io.write("\n")
end~~