Beispiel #1
0
    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')
Beispiel #2
0
    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')
Beispiel #3
0
 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)
Beispiel #4
0
 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)