def get_number_of_grid_points(cell_cv, h=None, mode=None, realspace=None, symmetry=None): if mode is None: mode = FD() if realspace is None: realspace = mode.name != 'pw' if h is None: if mode.name == 'pw': h = np.pi / (4 * mode.ecut)**0.5 elif mode.name == 'lcao' and not realspace: h = np.pi / (4 * 340 / Hartree)**0.5 else: h = 0.2 / Bohr if realspace or mode.name == 'fd': N_c = h2gpts(h, cell_cv, 4) else: N_c = h2gpts(h, cell_cv, 1) if symmetry is None: N_c = np.array([get_efficient_fft_size(N) for N in N_c]) else: N_c = np.array([ get_efficient_fft_size(N, n) for N, n in zip(N_c, symmetry.gcd_c) ]) return N_c
def get_number_of_grid_points(cell_cv, h=None, mode=None, realspace=None, symmetry=None): if mode is None: mode = FD() if realspace is None: realspace = mode.name != 'pw' if h is None: if mode.name == 'pw': h = np.pi / (4 * mode.ecut)**0.5 elif mode.name == 'lcao' and not realspace: h = np.pi / (4 * 340 / Hartree)**0.5 else: h = 0.2 / Bohr if realspace or mode.name == 'fd': N_c = h2gpts(h, cell_cv, 4) else: N_c = h2gpts(h, cell_cv, 1) if symmetry is None: N_c = np.array([get_efficient_fft_size(N) for N in N_c]) else: N_c = np.array([get_efficient_fft_size(N, n) for N, n in zip(N_c, symmetry.gcd_c)]) return N_c
def __init__(self, cell_cv, nk_c, txt=sys.stdout): self.nk_c = nk_c bigcell_cv = cell_cv * nk_c[:, np.newaxis] L_c = (np.linalg.inv(bigcell_cv)**2).sum(0)**-0.5 rc = 0.5 * L_c.min() prnt('Inner radius for %dx%dx%d Wigner-Seitz cell: %.3f Ang' % (tuple(nk_c) + (rc * Bohr,)), file=txt) self.a = 5 / rc prnt('Range-separation parameter: %.3f Ang^-1' % (self.a / Bohr), file=txt) # nr_c = [get_efficient_fft_size(2 * int(L * self.a * 1.5)) nr_c = [get_efficient_fft_size(2 * int(L * self.a * 3.0)) for L in L_c] prnt('FFT size for calculating truncated Coulomb: %dx%dx%d' % tuple(nr_c), file=txt) self.gd = GridDescriptor(nr_c, bigcell_cv, comm=mpi.serial_comm) v_R = self.gd.empty() v_i = v_R.ravel() pos_iv = self.gd.get_grid_point_coordinates().reshape((3, -1)).T corner_jv = np.dot(np.indices((2, 2, 2)).reshape((3, 8)).T, bigcell_cv) for i, pos_v in enumerate(pos_iv): r = ((pos_v - corner_jv)**2).sum(axis=1).min()**0.5 if r == 0: v_i[i] = 2 * self.a / pi**0.5 else: v_i[i] = erf(self.a * r) / r self.K_Q = np.fft.fftn(v_R) * self.gd.dv
def __init__(self, cell_cv, nk_c, txt=sys.stdout): self.nk_c = nk_c bigcell_cv = cell_cv * nk_c[:, np.newaxis] L_c = (np.linalg.inv(bigcell_cv)**2).sum(0)**-0.5 rc = 0.5 * L_c.min() print('Inner radius for %dx%dx%d Wigner-Seitz cell: %.3f Ang' % (tuple(nk_c) + (rc * Bohr, )), file=txt) self.a = 5 / rc print('Range-separation parameter: %.3f Ang^-1' % (self.a / Bohr), file=txt) # nr_c = [get_efficient_fft_size(2 * int(L * self.a * 1.5)) nr_c = [get_efficient_fft_size(2 * int(L * self.a * 3.0)) for L in L_c] print('FFT size for calculating truncated Coulomb: %dx%dx%d' % tuple(nr_c), file=txt) self.gd = GridDescriptor(nr_c, bigcell_cv, comm=mpi.serial_comm) v_R = self.gd.empty() v_i = v_R.ravel() pos_iv = self.gd.get_grid_point_coordinates().reshape((3, -1)).T corner_jv = np.dot(np.indices((2, 2, 2)).reshape((3, 8)).T, bigcell_cv) for i, pos_v in enumerate(pos_iv): r = ((pos_v - corner_jv)**2).sum(axis=1).min()**0.5 if r == 0: v_i[i] = 2 * self.a / pi**0.5 else: v_i[i] = erf(self.a * r) / r self.K_Q = np.fft.fftn(v_R) * self.gd.dv
def interpolate_weight(calc, weight, h=0.05, n=2): '''interpolates cdft weight function, gd is the fine grid ''' gd = calc.density.finegd weight = gd.collect(weight, broadcast=True) weight = gd.zero_pad(weight) w = np.zeros_like(weight) gd1 = GridDescriptor(gd.N_c, gd.cell_cv, comm=serial_comm) gd1.distribute(weight, w) N_c = h2gpts(h / Bohr, gd.cell_cv) N_c = np.array([get_efficient_fft_size(N, n) for N in N_c]) gd2 = GridDescriptor(N_c, gd.cell_cv, comm=serial_comm) interpolator = Interpolator(gd1, gd2) W = interpolator.interpolate(w) return W
def __init__(self, calc, h=0.05, n=2): """Create transformation object. calc: GPAW calculator object The calcalator that has the wave functions. h: float Desired grid-spacing in Angstrom. n: int Force number of points to be a mulitiple of n. """ self.calc = calc gd = calc.wfs.gd gd1 = GridDescriptor(gd.N_c, gd.cell_cv, comm=serial_comm) # Descriptor for the final grid: N_c = h2gpts(h / Bohr, gd.cell_cv) N_c = np.array([get_efficient_fft_size(N, n) for N in N_c]) gd2 = self.gd = GridDescriptor(N_c, gd.cell_cv, comm=serial_comm) self.interpolator = Interpolator(gd1, gd2, self.calc.wfs.dtype) self.dphi = None # PAW correction (will be initialized when needed)
def __init__(self, cell_cv, nk_c, txt=None): txt = txt or sys.stdout self.nk_c = nk_c bigcell_cv = cell_cv * nk_c[:, np.newaxis] L_c = (np.linalg.inv(bigcell_cv)**2).sum(0)**-0.5 rc = 0.5 * L_c.min() print('Inner radius for %dx%dx%d Wigner-Seitz cell: %.3f Ang' % (tuple(nk_c) + (rc * Bohr,)), file=txt) self.a = 5 / rc print('Range-separation parameter: %.3f Ang^-1' % (self.a / Bohr), file=txt) nr_c = [get_efficient_fft_size(2 * int(L * self.a * 3.0)) for L in L_c] print('FFT size for calculating truncated Coulomb: %dx%dx%d' % tuple(nr_c), file=txt) self.gd = GridDescriptor(nr_c, bigcell_cv, comm=mpi.serial_comm) v_ijk = self.gd.empty() pos_ijkv = self.gd.get_grid_point_coordinates().transpose((1, 2, 3, 0)) corner_xv = np.dot(np.indices((2, 2, 2)).reshape((3, 8)).T, bigcell_cv) # Ignore division by zero (in 0,0,0 corner): with seterr(invalid='ignore'): # Loop over first dimension to avoid too large ndarrays. for pos_jkv, v_jk in zip(pos_ijkv, v_ijk): # Distances to the 8 corners: d_jkxv = pos_jkv[:, :, np.newaxis] - corner_xv r_jk = (d_jkxv**2).sum(axis=3).min(2)**0.5 v_jk[:] = erf(self.a * r_jk) / r_jk # Fix 0/0 corner value: v_ijk[0, 0, 0] = 2 * self.a / pi**0.5 self.K_Q = np.fft.fftn(v_ijk) * self.gd.dv
def get_number_of_grid_points(cell_cv, h=None, mode=None, realspace=None): if mode == 'pw': mode = PW() elif mode is None: mode = 'fd' if realspace is None: realspace = not isinstance(mode, PW) if h is None: if isinstance(mode, PW): h = np.pi / (4 * mode.ecut)**0.5 elif mode == 'lcao' and not realspace: h = np.pi / (4 * 340 / Hartree)**0.5 else: h = 0.2 / Bohr if realspace or mode == 'fd': N_c = h2gpts(h, cell_cv, 4) else: N_c = h2gpts(h, cell_cv, 1) N_c = np.array([get_efficient_fft_size(N) for N in N_c]) return N_c