3
0
mirror of https://github.com/triqs/dft_tools synced 2024-12-25 22:03:43 +01:00
dft_tools/test/python/w90_optics_Sr2RuO4.py
Alexander Hampel c6e755ef07 refactor & fix: merge the two read functions and small fixes
fix: add asserts for spin calculations and disent
2023-03-23 12:57:15 -04:00

81 lines
3.2 KiB
Python

#!/bin/python3
import numpy as np
import triqs.utility.mpi as mpi
from h5 import HDFArchive
from triqs.gf import MeshReFreq
from triqs.utility import h5diff
from triqs_dft_tools.sumk_dft import SumkDFT
from triqs_dft_tools.sumk_dft_transport import transport_distribution, init_spectroscopy, conductivity_and_seebeck, write_output_to_hdf
from triqs_dft_tools.converters.wannier90 import Wannier90Converter
kx = 5
seedname = 'sro'
w90_params = {'seedname': 'w90_optics/'+seedname, 'nk_optics': [kx, kx, kx]}
n_wf = 3
# ----------------- set-up sum_k -----------------------
Converter = Wannier90Converter(seedname=w90_params['seedname'], rot_mat_type='wannier', bloch_basis=False)
Converter.convert_dft_input()
# add group 'dft_transp_input' and some other stuff in 'dft_misc_input' needed for transport
h5_archive = ''.join([w90_params['seedname'], '.h5'])
if mpi.is_master_node():
with HDFArchive(h5_archive, 'a') as ar:
band_window = np.array([(1, n_wf) for k in range(ar['dft_input']['kpts'].shape[0])])
band_window_optics = np.array([(1, n_wf) for k in range(ar['dft_input']['kpts'].shape[0])])
for group_name, group_prop in [('band_window', [band_window]), ('rot_symmetries', [np.eye(3)]), ('n_symmetries', 1)]:
ar['dft_misc_input'].create_group(group_name)
ar['dft_misc_input'][group_name] = group_prop
# dft_transp_input
ar.create_group('dft_transp_input')
ar['dft_transp_input'].create_group('band_window_optics')
ar['dft_transp_input']['band_window_optics'] = [band_window_optics]
# create SumK object
window = (-4., 4.)
n_w = 1001
beta = 40
mu = 11.369
w_mesh = MeshReFreq(window=window, n_w=n_w)
sum_k = SumkDFT(h5_archive, use_dft_blocks=False, mesh=w_mesh)
# ----------------- create Sigma / set into sum_k -----------------------
sigma_freq = [sum_k.block_structure.create_gf(ish=iineq, mesh=w_mesh) for iineq in range(sum_k.n_inequiv_shells)]
# Sigma const
eta_sigma = 0.01
for block, gf in sigma_freq[0]:
gf << - eta_sigma * 1j
sum_k.set_mu(mu)
sum_k.set_Sigma(sigma_freq)
# ----------------- compute optical properties -----------------------
Om_mesh = [0.0, 0.2]
eta_lattice = 0.001
directions = ['xx']
sum_k = init_spectroscopy(sum_k, code='wannier90', w90_params=w90_params)
Gamma_w, omega, Om_mesh = transport_distribution(sum_k, directions=directions,
Om_mesh=Om_mesh, energy_window=window,
with_Sigma=True, broadening=eta_lattice,
beta=beta, code='wannier90')
if mpi.is_master_node():
optic_cond, seebeck, kappa = conductivity_and_seebeck(Gamma_w, omega, Om_mesh, sum_k.SP, directions, beta=beta, method=None)
output_dict = {'Gamma_w': Gamma_w, 'Om_mesh': Om_mesh, 'omega': omega, 'directions': directions,
'seebeck': seebeck, 'optic_cond': optic_cond, 'kappa': kappa}
write_output_to_hdf(sum_k, output_dict, 'transp_output')
# comparison of the output transport data
# velocities can differ depending on LAPACK diagonalization
out = HDFArchive(h5_archive,'r')
ref = HDFArchive('sr2ruo4_transp.ref.h5', 'r')
h5diff.compare('', out['transp_output'], ref['transp_output'], 0, 1e-8)