mirror of
https://github.com/triqs/dft_tools
synced 2024-08-16 17:28:29 +02:00
91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
from itertools import *
|
|
import numpy as np
|
|
import triqs.utility.mpi as mpi
|
|
from h5 import *
|
|
from triqs.gf import *
|
|
from triqs_dft_tools.sumk_dft import *
|
|
from triqs_dft_tools.sumk_dft_tools import *
|
|
from triqs.operators.util.hamiltonians import *
|
|
from triqs.operators.util.U_matrix import *
|
|
from triqs_cthyb import *
|
|
import warnings
|
|
warnings.filterwarnings("ignore", category=FutureWarning)
|
|
|
|
filename = 'nio'
|
|
SK = SumkDFT(hdf_file = filename+'.h5', use_dft_blocks = False)
|
|
|
|
beta = 5.0
|
|
|
|
# We analyze the block structure of the Hamiltonian
|
|
Sigma = SK.block_structure.create_gf(beta=beta)
|
|
|
|
SK.put_Sigma([Sigma])
|
|
G = SK.extract_G_loc()
|
|
SK.analyse_block_structure_from_gf(G, threshold = 1e-3)
|
|
|
|
|
|
# Setup CTQMC Solver
|
|
n_orb = SK.corr_shells[0]['dim']
|
|
spin_names = ['up','down']
|
|
orb_names = [i for i in range(0,n_orb)]
|
|
|
|
|
|
# Print some information on the master node
|
|
iteration_offset = 0
|
|
Sigma_iw = 0
|
|
if mpi.is_master_node():
|
|
ar = HDFArchive(filename+'.h5','a')
|
|
if not 'DMFT_results' in ar: ar.create_group('DMFT_results')
|
|
if not 'Iterations' in ar['DMFT_results']: ar['DMFT_results'].create_group('Iterations')
|
|
if 'iteration_count' in ar['DMFT_results']:
|
|
iteration_offset = ar['DMFT_results']['iteration_count']+1
|
|
print(('offset',iteration_offset))
|
|
Sigma_iw = ar['DMFT_results']['Iterations']['Sigma_it'+str(iteration_offset-1)]
|
|
SK.dc_imp = ar['DMFT_results']['Iterations']['dc_imp'+str(iteration_offset-1)]
|
|
SK.dc_energ = ar['DMFT_results']['Iterations']['dc_energ'+str(iteration_offset-1)]
|
|
SK.chemical_potential = ar['DMFT_results']['Iterations']['chemical_potential'+str(iteration_offset-1)].real
|
|
|
|
iteration_offset = mpi.bcast(iteration_offset)
|
|
Sigma_iw = mpi.bcast(Sigma_iw)
|
|
SK.dc_imp = mpi.bcast(SK.dc_imp)
|
|
SK.dc_energ = mpi.bcast(SK.dc_energ)
|
|
SK.chemical_potential = mpi.bcast(SK.chemical_potential)
|
|
|
|
|
|
SK.put_Sigma(Sigma_imp = [Sigma_iw])
|
|
|
|
ikarray = numpy.array(list(range(SK.n_k)))
|
|
|
|
# set up the orbitally resolved local lattice greens function:
|
|
n_orbs = SK.proj_mat_csc.shape[2]
|
|
spn = SK.spin_block_names[SK.SO]
|
|
mesh = Sigma_iw.mesh
|
|
block_structure = [list(range(n_orbs)) for sp in spn]
|
|
gf_struct = [(spn[isp], block_structure[isp])
|
|
for isp in range(SK.n_spin_blocks[SK.SO])]
|
|
block_ind_list = [block for block, inner in gf_struct]
|
|
glist = lambda: [GfImFreq(indices=inner, mesh=mesh)
|
|
for block, inner in gf_struct]
|
|
|
|
G_latt_orb = BlockGf(name_list=block_ind_list,
|
|
block_list=glist(), make_copies=False)
|
|
G_latt_orb.zero()
|
|
|
|
for ik in mpi.slice_array(ikarray):
|
|
G_latt_KS = SK.lattice_gf(ik=ik, beta=beta)
|
|
G_latt_KS *= SK.bz_weights[ik]
|
|
for bname, gf in G_latt_orb:
|
|
add_g_ik = gf.copy()
|
|
add_g_ik.zero()
|
|
add_g_ik << SK.downfold(ik, 0, bname, G_latt_KS[bname], gf, shells='csc', ir=None)
|
|
gf << gf + add_g_ik
|
|
|
|
G_latt_orb << mpi.all_reduce(
|
|
mpi.world, G_latt_orb, lambda x, y: x + y)
|
|
|
|
mpi.barrier()
|
|
|
|
if mpi.is_master_node():
|
|
ar['DMFT_results']['Iterations']['G_latt_orb_it'+str(iteration_offset-1)] = G_latt_orb
|
|
if mpi.is_master_node(): del ar
|