def extract_basis_functions(self, basis_name='atompaw.sz'): """Create BasisFunctions object with pseudo wave functions.""" from gpaw.basis_data import Basis, BasisFunction assert self.wfs.nspins == 1 d = self.wfs.gd.r_g[0] ng = self.wfs.gd.N + 1 rgd = EquidistantRadialGridDescriptor(d, ng) basis = Basis(self.symbol, basis_name, readxml=False, rgd=rgd) basis.generatorattrs = {} # attrs of the setup maybe basis.generatordata = 'AtomPAW' # version info too? bf_j = basis.bf_j for l, n, f, eps, psit_G in self.state_iter(): phit_g = rgd.empty() phit_g[0] = 0.0 phit_g[1:] = psit_G phit_g *= np.sign(psit_G[-1]) # If there's no node at zero, we shouldn't set phit_g to zero # We'll make an ugly hack if abs(phit_g[1]) > 3.0 * abs(phit_g[2] - phit_g[1]): phit_g[0] = phit_g[1] bf = BasisFunction(n, l, self.wfs.gd.r_g[-1], phit_g, '%s%d e=%.3f f=%.3f' % ('spdfgh'[l], n, eps, f)) bf_j.append(bf) return basis
v = rgd.zeros(nspins) n[:] = np.exp(-rgd.r_g**2) n[-1] *= 2 E = xc.calculate_spherical(rgd, n, v) i = 23 x = v[-1, i] * rgd.dv_g[i] n[-1, i] += 0.000001 Ep = xc.calculate_spherical(rgd, n, v) n[-1, i] -= 0.000002 Em = xc.calculate_spherical(rgd, n, v) x2 = (Ep - Em) / 0.000002 print(name, nspins, E, x, x2, x - x2) equal(x, x2, 1e-9) n[-1, i] += 0.000001 if nspins == 1: ns = rgd.empty(2) ns[:] = n / 2 Es = xc.calculate_spherical(rgd, ns, 0 * ns) equal(E, Es, 1e-13) N = 20 a = 1.0 gd = GridDescriptor((N, N, N), (a, a, a)) for name in ['LDA', 'PBE']: xc = XC(name) for nspins in [1, 2]: n = gd.empty(nspins) n.fill(0.03) z = np.arange(gd.beg_c[2], gd.end_c[2]) * a / N
v = rgd.zeros(nspins) n[:] = np.exp(-rgd.r_g**2) n[-1] *= 2 E = xc.calculate_spherical(rgd, n, v) i = 23 x = v[-1, i] * rgd.dv_g[i] n[-1, i] += 0.000001 Ep = xc.calculate_spherical(rgd, n, v) n[-1, i] -= 0.000002 Em = xc.calculate_spherical(rgd, n, v) x2 = (Ep - Em) / 0.000002 print(name, nspins, E, x, x2, x - x2) equal(x, x2, 1e-9) n[-1, i] += 0.000001 if nspins == 1: ns = rgd.empty(2) ns[:] = n / 2 Es = xc.calculate_spherical(rgd, ns, 0 * ns) equal(E, Es, 1e-13) N = 20 a = 1.0 gd = GridDescriptor((N, N, N), (a, a, a)) for name in ['LDA', 'PBE']: xc = XC(name) for nspins in [1, 2]: n = gd.empty(nspins) n.fill(0.03) z = np.arange(gd.beg_c[2], gd.end_c[2]) * a / N n[:] += 0.01 * np.sin(2 * pi * z / a)