From a995f114aece44cb09f2748a6e65fc3b8dc4b2d7 Mon Sep 17 00:00:00 2001 From: phibeck Date: Wed, 15 Dec 2021 17:35:39 -0500 Subject: [PATCH] This fix ensures than in the bloch_basis=False mode the complex diagonal components of the Hamiltonian are zero. If this is not checked it can lead to instabilities in the inversion for G_latt, which is a problem for ReFreq Green's functions --- python/triqs_dft_tools/converters/wannier90.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/python/triqs_dft_tools/converters/wannier90.py b/python/triqs_dft_tools/converters/wannier90.py index 65fab6c1..7a1777bd 100644 --- a/python/triqs_dft_tools/converters/wannier90.py +++ b/python/triqs_dft_tools/converters/wannier90.py @@ -486,6 +486,19 @@ class Wannier90Converter(ConverterTools): else: # make Fourier transform H(R) -> H(k) : it can be done one spin at a time hamk = self.fourier_ham(hamr_full[isp]) + + # Sanity check if imaginary diagonal elements are zero, otherwise instabilties in lattice Gf! + diag_iterator = range(0,dim_corr_shells) + for ik in range(self.n_k): + if not numpy.allclose(hamk[ik][diag_iterator, diag_iterator].imag, 0, atol=1e-10): + mpi.report('ERROR: Wannier Hamiltonian has complex diagonal entries. ' + + f'First occurred at kpt {ik}:') + with numpy.printoptions(formatter={'float': '{:+.10f}'.format}): + mpi.report('\nWannier Hamiltonian diagonal, Fourier(H(r)), imaginary') + mpi.report(hamk[ik][diag_iterator, diag_iterator].imag) + mpi.MPI.COMM_WORLD.Abort(1) + # set imaginary part to zero + hamk[ik][diag_iterator, diag_iterator] = hamk[ik][diag_iterator, diag_iterator].real + 0*1j # finally write hamk into hoppings for ik in range(self.n_k): hopping[ik, isp] = hamk[ik] - numpy.identity(numpy.max(n_orbitals)) * self.fermi_energy