Skip to content

Commit 5076204

Browse files
committed
[feat] allow spinave in calc_density_correction also for vasp and qe
1 parent 29c484a commit 5076204

1 file changed

Lines changed: 20 additions & 8 deletions

File tree

python/triqs_dft_tools/sumk_dft.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2150,8 +2150,10 @@ def calc_density_correction(self, filename=None, dm_type=None, spinave=False, kp
21502150
DFT code to write the density correction for. Options:
21512151
'vasp', 'wien2k', 'elk' or 'qe'. Needs to be set for 'qe'
21522152
spinave : logical
2153-
Elk specific and for magnetic calculations in DMFT only.
2154-
It averages the spin to keep the DFT part non-magnetic.
2153+
For magnetic calculations in DMFT only.
2154+
If True, the density matrix is averaged over spin up/down to
2155+
keep the DFT part non-magnetic (supported for 'elk', 'vasp'
2156+
and 'qe').
21552157
kpts_to_write : iterable of int
21562158
Indices of k points that are written to file. If None (default),
21572159
all k points are written. Only implemented for dm_type 'vasp'
@@ -2170,11 +2172,11 @@ def calc_density_correction(self, filename=None, dm_type=None, spinave=False, kp
21702172
the corresponing total charge `dens`.
21712173
21722174
"""
2173-
#automatically set dm_type if required
2175+
# automatically set dm_type if required
21742176
if dm_type is None:
21752177
dm_type = self.dft_code
21762178

2177-
assert dm_type in ('vasp', 'wien2k', 'elk', 'qe'), "'dm_type' must be either 'vasp', 'wienk', 'elk' or 'qe'"
2179+
assert dm_type in ('vasp', 'wien2k', 'elk', 'qe'), "'dm_type' must be either 'vasp', 'wien2k', 'elk' or 'qe'"
21782180
# default file names
21792181
if filename is None:
21802182
if dm_type == 'wien2k':
@@ -2334,7 +2336,10 @@ def calc_density_correction(self, filename=None, dm_type=None, spinave=False, kp
23342336
else:
23352337
assert np.min(kpts_to_write) >= 0 and np.max(kpts_to_write) < self.n_k
23362338

2337-
assert self.SP == 0, "Spin-polarized density matrix is not implemented"
2339+
if not spinave:
2340+
assert self.SP == 0, "Spin-polarized density matrix is not implemented"
2341+
elif self.SP != 0:
2342+
mpi.report("SumK calc_density_correction: WARNING! Averaging out spin-polarized correction in the density channel")
23382343

23392344
if mpi.is_master_node():
23402345
if filename == 'vaspgamma.h5':
@@ -2343,8 +2348,13 @@ def calc_density_correction(self, filename=None, dm_type=None, spinave=False, kp
23432348
bnd_win_towrite = [band_window[0][:n_k_ibz,:]]
23442349
vasp_h5['band_window'] = bnd_win_towrite
23452350
vasp_h5.create_group('deltaN')
2346-
vasp_h5['deltaN']['up'] = deltaN['up'][:n_k_ibz]
2347-
vasp_h5['deltaN']['down'] = deltaN['down'][:n_k_ibz]
2351+
if spinave and self.SP != 0 and self.SO == 0:
2352+
deltaN_ave = [(u + d) / 2.0 for (u, d) in zip(deltaN['up'][:n_k_ibz], deltaN['down'][:n_k_ibz])]
2353+
vasp_h5['deltaN']['up'] = deltaN_ave
2354+
vasp_h5['deltaN']['down'] = deltaN_ave
2355+
else:
2356+
vasp_h5['deltaN']['up'] = deltaN['up'][:n_k_ibz]
2357+
vasp_h5['deltaN']['down'] = deltaN['down'][:n_k_ibz]
23482358
else:
23492359
with open(filename, 'w') as f:
23502360
f.write(" -1 -1 ! Number of k-points, default number of bands\n") # % len(kpts_to_write))
@@ -2410,7 +2420,9 @@ def calc_density_correction(self, filename=None, dm_type=None, spinave=False, kp
24102420
f.write("\n")
24112421

24122422
elif dm_type == 'qe':
2413-
if self.SP == 0:
2423+
if not spinave:
2424+
assert self.SP == 0, "Spin-polarized density matrix is not implemented"
2425+
elif self.SP != 0:
24142426
mpi.report("SUMK calc_density_correction: WARNING! Averaging out spin-polarized correction in the density channel")
24152427

24162428
subgrp = 'dft_update'

0 commit comments

Comments
 (0)