def calculate_impl(self, gd, n_sg, v_sg, e_g): """Calculate energy and potential. gd may be non-periodic. To be distinguished from self.gd which is always periodic due to priminess of FFT dimensions. (To do: proper padded FFTs.)""" assert gd == self.distribution.input_gd assert self.libvdwxc is not None semiloc = self.semilocal_xc self.timer.start('van der Waals') self.timer.start('semilocal') # XXXXXXX taken from GGA grad_v = semiloc.grad_v sigma_xg, dedsigma_xg, gradn_svg = gga_vars(gd, grad_v, n_sg) n_sg[:] = np.abs(n_sg) # XXXX What to do about this? sigma_xg[:] = np.abs(sigma_xg) # Grrr, interface still sucks if hasattr(semiloc, 'process_mgga'): semiloc.process_mgga(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) else: semiloc.kernel.calculate(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) self.last_semilocal_energy = e_g.sum() * self.gd.dv self.timer.stop('semilocal') energy_nonlocal = self.redist_wrapper.calculate( n_sg, sigma_xg, v_sg, dedsigma_xg) # Note: Redistwrapper handles vdwcoef. For now add_gradient_correction(grad_v, gradn_svg, sigma_xg, dedsigma_xg, v_sg) self.last_nonlocal_energy = energy_nonlocal e_g[0, 0, 0] += energy_nonlocal / self.gd.dv self.timer.stop('van der Waals')
def calculate_impl(self, gd, n_sg, v_sg, e_g): """Calculate energy and potential. gd may be non-periodic. To be distinguished from self.gd which is always periodic due to priminess of FFT dimensions. (To do: proper padded FFTs.)""" assert gd == self.distribution.input_gd assert self.libvdwxc is not None semiloc = self.semilocal_xc self.timer.start('van der Waals') self.timer.start('semilocal') # XXXXXXX taken from GGA grad_v = semiloc.grad_v sigma_xg, dedsigma_xg, gradn_svg = gga_vars(gd, grad_v, n_sg) n_sg[:] = np.abs(n_sg) # XXXX What to do about this? sigma_xg[:] = np.abs(sigma_xg) # Grrr, interface still sucks if hasattr(semiloc, 'process_mgga'): semiloc.process_mgga(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) else: semiloc.kernel.calculate(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) #self.semilocal_xc.calculate_impl(gd, n_sg, v_sg, e_g) self.last_semilocal_energy = e_g.sum() * self.gd.dv self.timer.stop('semilocal') #energy = GGA.calculate(self, gd, n_sg, v_sg, e_g=None) nspins = len(n_sg) if nspins == 1: n_g = n_sg[0] sigma_g = sigma_xg[0] v_g = v_sg[0] dedsigma_g = dedsigma_xg[0] elif nspins == 2: n_g = n_sg.sum(0) sigma_g = sigma_xg[0] + 2 * sigma_xg[1] + sigma_xg[2] v_g = np.zeros_like(n_g) dedsigma_g = np.zeros_like(n_g) else: raise ValueError('Strange number of spins {0}'.format(nspins)) energy_nonlocal = self.redist_wrapper.calculate( n_g, sigma_g, v_g, dedsigma_g) if nspins == 2: dedsigma_xg[0] += dedsigma_g dedsigma_xg[1] += 2 * dedsigma_g dedsigma_xg[2] += dedsigma_g v_sg += v_g[None] # Note: Redistwrapper handles vdwcoef. For now add_gradient_correction(grad_v, gradn_svg, sigma_xg, dedsigma_xg, v_sg) # XXXXXXXXXXXXXXXX ignoring vdwcoef # XXXXXXXXXXXXXXXX ugly self.last_nonlocal_energy = energy_nonlocal e_g[0, 0, 0] += energy_nonlocal / self.gd.dv self.timer.stop('van der Waals')
def calculate_impl(self, gd, n_sg, v_sg, e_g): sigma_xg, dedsigma_xg, gradn_svg = gga_vars(gd, self.grad_v, n_sg) self.process_mgga(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) add_gradient_correction(self.grad_v, gradn_svg, sigma_xg, dedsigma_xg, v_sg)
def calculate_impl(self, gd, n_sg, v_sg, e_g): sigma_xg, dedsigma_xg, gradn_svg = gga_vars(gd, self.grad_v, n_sg) self.calculate_exchange(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) self.calculate_correlation(e_g, n_sg, v_sg, sigma_xg, dedsigma_xg) add_gradient_correction(self.grad_v, gradn_svg, sigma_xg, dedsigma_xg, v_sg)