3
0
mirror of https://github.com/triqs/dft_tools synced 2024-06-30 00:44:34 +02:00

Merge pull request #226 from merkelm/unstable

Fix for wannier converter: reordering of orbital/spin order only necessary for vasp 5
This commit is contained in:
Alexander Hampel 2022-10-24 14:08:20 -04:00 committed by GitHub
commit 3b635aaa31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 12 deletions

View File

@ -62,7 +62,7 @@ class Wannier90Converter(ConverterTools):
def __init__(self, seedname, hdf_filename=None, dft_subgrp='dft_input',
symmcorr_subgrp='dft_symmcorr_input', misc_subgrp='dft_misc_input',
repacking=False, rot_mat_type='hloc_diag', bloch_basis=False, add_lambda=None,
w90zero=2e-6):
w90zero=2e-6, reorder_orbital_and_spin_vasp5=False):
"""
Initialise the class.
@ -86,9 +86,15 @@ class Wannier90Converter(ConverterTools):
bloch_basis : boolean, optional
Should the Hamiltonian be written in Bloch rather than Wannier basis?
add_lambda : list of floats, optional
add local spin-orbit term
Add local spin-orbit term
w90zero : float, optional
threshold on symmetry checks of Hamiltonian and rot_mat
Threshold on symmetry checks of Hamiltonian and rot_mat
reorder_orbital_and_spin_vasp5 : bool, optional
Is false for output from VASP 6 and Quantum Espresso
Reorder orbitals and spins from the VASP 5 convention of first all
orbitals with up and then all orbitals with down to the "usual"
convention of every up orbital immediately being followed by its
corresponding down orbital
"""
self._name = 'Wannier90Converter'
assert isinstance(seedname, str), self._name + \
@ -110,6 +116,7 @@ class Wannier90Converter(ConverterTools):
self.rot_mat_type = rot_mat_type
self.bloch_basis = bloch_basis
self.add_lambda = add_lambda
self.reorder_orbital_and_spin_vasp5 = reorder_orbital_and_spin_vasp5
if self.add_lambda is not None and len(self.add_lambda) != 3:
raise ValueError('If specifying add_lambda, give three values.')
if self.rot_mat_type not in ('hloc_diag', 'wannier', 'none'):
@ -191,8 +198,8 @@ class Wannier90Converter(ConverterTools):
mpi.report('Overwriting required density with DFT result {:.5f}'.format(density_required))
mpi.report('and using the DFT Fermi energy {:.5f} eV\n'.format(fermi_energy))
# Switches from wannier90 order to triqs order
if SO and not self.add_lambda:
# Switches from Vasp 5 + wannier90 order to triqs order
if SO and not self.add_lambda and self.reorder_orbital_and_spin_vasp5:
wannier_hr, u_total = reorder_orbital_and_spin(n_wannier, wannier_hr, u_total)
# Finds R=0 index
@ -933,10 +940,10 @@ def read_misc_input(w90_seed, n_spin_blocks, n_k):
def reorder_orbital_and_spin(nwfs, wannier_hr, u_total):
"""
Changes order from wannier90 (first all up spin wannier orbitals, then all
down spin) to triqs order (every up orbital is followed directly by the
corresponding down orbital). The order between orbital degrees of freedom
is not changed.
Changes order from VASP5 + wannier90 (first all up spin wannier orbitals,
then all down spin) to usual order (every up orbital is followed directly
by the corresponding down orbital). The order between orbital degrees of
freedom is not changed.
Returns
-------
@ -958,8 +965,8 @@ def reorder_orbital_and_spin(nwfs, wannier_hr, u_total):
def generate_local_so_matrix_t2g(add_lambda, n_corr_shells, nwfs):
"""
Adds local spin-orbit interaction term to the t2g subspace. Orbital order
is assumed to be the triqs order xz_up, xz_dn, yz_up, yz_dn, xy_up, xy_dn
as given after reordering the Wannier input.
is assumed to be the wannier90/triqs order xz_up, xz_dn, yz_up, yz_dn,
xy_up, xy_dn.
Parameters are defined as add_lambda = [lambda_x, lambda_y, lambda_z],
representative of the orbital coupling terms perpendicular to [x, y, z],
i.e., [d_yz, d_xz, d_xy], respectively.

View File

@ -33,7 +33,8 @@ subfolder = 'w90_convert/'
# bloch_basis False
seedname = subfolder+'SrVO3_soc'
converter = Wannier90Converter(seedname=seedname, hdf_filename=seedname+'.out.h5',
rot_mat_type='wannier', bloch_basis=False)
rot_mat_type='wannier', bloch_basis=False,
reorder_orbital_and_spin_vasp5=True)
converter.convert_dft_input()
if mpi.is_master_node():