Source code for green_mbtools.mint.seet_init
import numpy as np
import h5py
[docs]
class seet_init:
'''
SEET pre-processing class.
Computes proper orthogonal transformation and projection matricies
Attributes
----------
args : map
simulation parameters
'''
def __init__(self, args):
'''
Initialize SEET pre-processing class
Parameters
----------
args: map
simulation parameters
'''
self.args = args
[docs]
def to_full_bz(self, X, conj_list, ir_list, bz_index, k_ind):
'''
Project moment-dependent quantity onto full Brillouin zone
'''
index_list = np.zeros(bz_index.shape, dtype=int)
for i,irn in enumerate(ir_list):
index_list[irn] = i
old_shape = X.shape
new_shape = np.copy(old_shape)
new_shape[k_ind] = conj_list.shape[0]
Y = np.zeros(new_shape, dtype=X.dtype)
for ik, kk in enumerate(bz_index):
k = index_list[kk]
if k_ind == 0:
Y[ik, ::] = X[k, ::].conj() if conj_list[ik] else X[k, ::]
elif k_ind == 1:
Y[:,ik, ::] = X[:,k, ::].conj() if conj_list[ik] else X[:,k, ::]
elif k_ind == 2:
Y[:,:,ik, ::] = X[:,:,k, ::].conj() if conj_list[ik] else X[:,:,k, ::]
return Y
[docs]
def get_input_data(self):
'''
Read weak-coupling solution
'''
inp_data = h5py.File(self.args.input_file, "r")
gf2_inp_data = h5py.File(self.args.gf2_input_file, "r")
last_gf2_iter = gf2_inp_data["iter"][()]
S1 = gf2_inp_data["iter{}/Sigma1".format(last_gf2_iter)][()].view(np.complex128)
if len(S1.shape) == 5:
S1 = S1.reshape(S1.shape[:-1])
gf2_inp_data = h5py.File(self.args.gf2_input_file, "r")
last_gf2_iter = gf2_inp_data["iter"][()]
G_tau = gf2_inp_data["iter{}/G_tau/data".format(last_gf2_iter)][()].view(np.complex128)
if len(G_tau.shape) == 6:
dm = - G_tau[G_tau.shape[0]-1,:].reshape(G_tau.shape[1:-1])
else :
dm = - G_tau[G_tau.shape[0]-1,:].reshape(G_tau.shape[1:])
dm_s = np.copy(dm)
dm = (dm[0] + dm[1])*0.5
gf2_inp_data.close()
e_nuc = inp_data["HF/Energy_nuc"][()]
nk = inp_data["HF/nk"][()]
kmesh = inp_data["grid/k_mesh"][()]
kmesh_sc = inp_data["grid/k_mesh_scaled"][()]
reduced_mesh = inp_data["grid/k_mesh"][()]
reduced_mesh_sc = inp_data["grid/k_mesh_scaled"][()]
if "grid/weight" in inp_data:
weight = inp_data["grid/weight"][()]
conj_list = inp_data["grid/conj_list"][()]
ir_list = inp_data["grid/ir_list"][()]
bz_index = inp_data["grid/index"][()]
else:
weight = [1] * kmesh.shape[0]
conj_list = [0] * kmesh.shape[0]
ir_list = range(kmesh.shape[0])
bz_index = range(kmesh.shape[0])
S = inp_data["HF/S-k"][()].view(np.complex128)
S = S.reshape(S.shape[:-1])
T = inp_data["HF/H-k"][()].view(np.complex128)
T = T.reshape(T.shape[:-1])
if self.args.from_ibz:
# T = to_full_bz(T, conj_list, ir_list, bz_index, 1)
S1 = self.to_full_bz(S1, conj_list, ir_list, bz_index, 1)
dm_s = self.to_full_bz(dm_s, conj_list, ir_list, bz_index, 1)
dm = self.to_full_bz(dm, conj_list, ir_list, bz_index, 0)
inp_data.close()
F = S1 + T
return F, S, T, dm, dm_s, e_nuc, nk, kmesh, kmesh_sc, reduced_mesh, reduced_mesh_sc, weight, conj_list, ir_list, bz_index