Closed Tracy-Lee closed 11 years ago
Because SrVO3 is a metal, the Hubbard-I solver is not generally suitable for it.
Could you show the error message you got?
The error message I got is:
Total Density = 0.999999;Chemical_Potential = 0.075647
Traceback (most recent call last):
File "srvo3_04.py", line 76, in
Trace is :
/opt/TRIQS/lib/libtriqs.so void check_have_same_structurestd::complex<double, std::complex
The first dimension of the two Green functions is not the same
There might be an issue with the Block structure of the Greens functions. The Hubbard I Solver does not compute an optimal structure of G, but assumes just G['up'] and G['down'], with indices 0,1,2 for the t2g orbitals of SrVO3. When initialising the SumK_LDA, did you use the UseLDABlocs = True option? Then the thing could crash. Set UseLDABlocs = False instead. But as Leonid said, using Hubbard I for SrVO3 is not at all recommended, results will be unphysical.
This is the script I used:
from pytriqs.Wien2k.SumK_LDA import from pytriqs.Wien2k.SumK_LDA_Wien2k_input import from pytriqs.Solvers.HubbardI.Solver_HubbardI import Solver_HubbardI
LDAFilename = 'srvo3_04'
Beta = 40
Uint = 2.70
JHund = 0.70
Loops = 3 # Number of DMFT sc-loops
Mix = 0.7 # Mixing factor in QMC
DC_type = 0 # 0...FLL, 1...Held, 2... AMF, 3...Lichtenstein
DC_Mix = 1.0 # 1.0 ... all from imp; 0.0 ... all from Gloc
useBlocs = False # use bloc structure from LDA input
useMatrix = True # use the U matrix calculated from Slater coefficients instead of (U+2J, U, U-J)
HDFfilename = LDAFilename+'.h5'
Converter = SumK_LDA_Wien2k_input(Filename=LDAFilename,repacking=False) Converter.convert_DMFT_input()
previous_runs = 0 previous_present = False
if MPI.IS_MASTER_NODE(): ar = HDF_Archive(HDFfilename,'a') if 'iterations' in ar: previous_present = True previous_runs = ar['iterations'] else: previous_runs = 0 previous_present = False del ar
MPI.barrier() previous_runs = MPI.bcast(previous_runs) previous_present = MPI.bcast(previous_present)
SK=SumK_LDA(HDFfile=LDAFilename+'.h5',UseLDABlocs=False)
Norb = SK.corr_shells[0][3] l = SK.corr_shells[0][2]
S = Solver_HubbardI(Beta = Beta, Uint = Uint, JHund = JHund, l = l, Verbosity=2) S.Nmoments=10
if (previous_present):
MPI.report("Using stored data for initialisation")
if (MPI.IS_MASTER_NODE()):
ar = HDF_Archive(HDFfilename,'a')
S.Sigma <<= ar['SigmaF']
del ar
S.Sigma = MPI.bcast(S.Sigma)
SK.load()
for Iteration_Number in range(1,Loops+1):
itn = Iteration_Number + previous_runs
# put Sigma into the SumK class:
SK.put_Sigma(Sigmaimp = [ S.Sigma ])
# Compute the SumK, possibly fixing mu by dichotomy
if SK.Density_Required and (Iteration_Number > 0):
Chemical_potential = SK.find_mu( precision = 0.000001 )
else:
MPI.report("No adjustment of chemical potential\nTotal density = %.3f"%SK.total_density(mu=Chemical_potential))
# Density:
S.G <<= SK.extract_Gloc()[0]
MPI.report("Total charge of Gloc : %.6f"%S.G.total_density())
dm = S.G.density()
if ((Iteration_Number==1)and(previous_present==False)):
SK.SetDoubleCounting( dm, U_interact = Uint, J_Hund = JHund, orb = 0, useDCformula = DC_type)
# set atomic levels:
eal = SK.eff_atomic_levels()[0]
S.set_atomic_levels( eal = eal )
# update hdf5
if (MPI.IS_MASTER_NODE()):
ar = HDF_Archive(HDFfilename,'a')
ar['Chemical_Potential%s'%itn] = Chemical_potential
del ar
# solve it:
S.Solve()
if (MPI.IS_MASTER_NODE()):
ar = HDF_Archive(HDFfilename)
ar['iterations'] = itn
# Now mix Sigma and G:
if ((itn>1)or(previous_present)):
if (MPI.IS_MASTER_NODE()):
MPI.report("Mixing Sigma and G with factor %s"%Mix)
if ('SigmaF' in ar):
S.Sigma <<= Mix * S.Sigma + (1.0-Mix) * ar['SigmaF']
if ('GF' in ar):
S.G <<= Mix * S.G + (1.0-Mix) * ar['GF']
S.G = MPI.bcast(S.G)
S.Sigma = MPI.bcast(S.Sigma)
if (MPI.IS_MASTER_NODE()):
ar['SigmaF'] = S.Sigma
ar['GF'] = S.G
# after the Solver has finished, set new double counting:
dm = S.G.density()
SK.SetDoubleCounting( dm, U_interact = Uint, J_Hund = JHund, orb = 0, useDCformula = DC_type )
# correlation energy calculations:
correnerg = 0.5 * (S.G * S.Sigma).total_density()
MPI.report("Corr. energy = %s"%correnerg)
if (MPI.IS_MASTER_NODE()):
ar['correnerg%s'%itn] = correnerg
ar['DCenerg%s'%itn] = SK.DCenerg
del ar
#Save stuff:
SK.save()
if (MPI.IS_MASTER_NODE()):
print 'DC after solver: ',SK.dc_imp[SK.invshellmap[0]]
# do some analysis:
MPI.report("Orbital densities of impurity Green function:")
dm1 = S.G.density()
for s in dm1:
MPI.report("Block %s: "%s)
for ii in range(len(dm1[s])):
str = ''
for jj in range(len(dm1[s])):
if (dm1[s][ii,jj].real>0):
str += " %.4f"%(dm1[s][ii,jj].real)
else:
str += " %.4f"%(dm1[s][ii,jj].real)
MPI.report(str)
MPI.report("Total charge of impurity problem : %.6f"%S.G.total_density())
if (SK.Density_Required): SK.Chemical_potential = SK.find_mu( precision = 0.000001 ) dN,d = SK.calc_DensityCorrection(Filename = LDAFilename+'.qdmft')
MPI.report("Trace of Density Matrix: %s"%d)
if (MPI.IS_MASTER_NODE()): ar = HDF_Archive(HDFfilename) itn = ar['iterations'] correnerg = ar['correnerg%s'%itn] DCenerg = ar['DCenerg%s'%itn] del ar correnerg -= DCenerg[0] f=open(LDAFilename+'.qdmft','a') f.write("%.16f\n"%correnerg) f.close()
This script should be fine. However, you should change SrVO3.indmftpr there you will need to include the full V 3d shell as correlated (instead of including only t2g), hence, you substitute the old description of V
cubic 1 1 2 0 ! l included for each sort 0 0 2 0 ! l included for each sort 01 ! t2g Wannier functions will be constructed 0 ! no spin-orbit
with the following one
cubic 1 1 2 0 ! l included for each sort 0 0 0 0 ! l included for each sort 0 ! no spin-orbit
and rerun dmftproj
Dear Leonid
Thank you for your help. If I use the full d shell pytriqs doesn’t give the error. Can you please explain why it is not possible to use only the t2g manifold as for the QMC-solver?
Generally, treating only one particular representation (e.g. t2g) instead of the full shell is not particularly useful in the case of Hub-I. In contrast to CT-QMC, the solver is very fast, and one can easily apply it to the full d-shell with almost no additional computational cost. For this reason this has not been implemented in Hub-I, though it is not difficult to do.
Thank you Leonid.
Dear all
I would like to use the Hubbard-I solver on SrVO3. I tried using Ce-gamma.py script. After the calculation of the chemical potential pytriqs complains in the assignment : S.G <<= SK.extract_Gloc()[0]
Can someone help me to build a script suitable for the calculation I want to make?
Thank you in advance.