@@ -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