def get_combined_data(self, qmdata=None, cldata=None, spacing=None): if qmdata is None: qmdata = self.density.rhot_g if cldata is None: cldata = self.classical_material.charge_density if spacing is None: spacing = self.cl.gd.h_cv[0, 0] spacing_au = spacing / Bohr # from Angstroms to a.u. # Collect data from different processes cln = self.cl.gd.collect(cldata) qmn = self.qm.gd.collect(qmdata) clgd = GridDescriptor(self.cl.gd.N_c, self.cl.cell, False, serial_comm, None) if world.rank == 0: cln *= self.classical_material.sign # refine classical part while clgd.h_cv[0, 0] > spacing_au * 1.50: # 45: cln = Transformer(clgd, clgd.refine()).apply(cln) clgd = clgd.refine() # refine quantum part qmgd = GridDescriptor(self.qm.gd.N_c, self.qm.cell, False, serial_comm, None) while qmgd.h_cv[0, 0] < clgd.h_cv[0, 0] * 0.95: qmn = Transformer(qmgd, qmgd.coarsen()).apply(qmn) qmgd = qmgd.coarsen() assert np.all(qmgd.h_cv == clgd.h_cv), " Spacings %.8f (qm) and %.8f (cl) Angstroms" % (qmgd.h_cv[0][0] * Bohr, clgd.h_cv[0][0] * Bohr) # now find the corners r_gv_cl = clgd.get_grid_point_coordinates().transpose((1, 2, 3, 0)) cind = self.qm.corner1 / np.diag(clgd.h_cv) - 1 n = qmn.shape # print 'Corner points: ', self.qm.corner1*Bohr, ' - ', self.qm.corner2*Bohr # print 'Calculated points: ', r_gv_cl[tuple(cind)]*Bohr, ' - ', r_gv_cl[tuple(cind+n+1)]*Bohr cln[cind[0] + 1:cind[0] + n[0] + 1, cind[1] + 1:cind[1] + n[1] + 1, cind[2] + 1:cind[2] + n[2] + 1] += qmn world.barrier() return cln, clgd
def get_combined_data(self, qmdata=None, cldata=None, spacing=None): if qmdata is None: qmdata = self.density.rhot_g if cldata is None: cldata = self.classical_material.charge_density if spacing is None: spacing = self.cl.gd.h_cv[0, 0] spacing_au = spacing / Bohr # from Angstroms to a.u. # Collect data from different processes cln = self.cl.gd.collect(cldata) qmn = self.qm.gd.collect(qmdata) clgd = GridDescriptor(self.cl.gd.N_c, self.cl.cell, False, serial_comm, None) if world.rank == 0: cln *= self.classical_material.sign # refine classical part while clgd.h_cv[0, 0] > spacing_au * 1.50: # 45: cln = Transformer(clgd, clgd.refine()).apply(cln) clgd = clgd.refine() # refine quantum part qmgd = GridDescriptor(self.qm.gd.N_c, self.qm.cell, False, serial_comm, None) while qmgd.h_cv[0, 0] < clgd.h_cv[0, 0] * 0.95: qmn = Transformer(qmgd, qmgd.coarsen()).apply(qmn) qmgd = qmgd.coarsen() assert np.all(qmgd.h_cv == clgd.h_cv ), " Spacings %.8f (qm) and %.8f (cl) Angstroms" % ( qmgd.h_cv[0][0] * Bohr, clgd.h_cv[0][0] * Bohr) # now find the corners r_gv_cl = clgd.get_grid_point_coordinates().transpose((1, 2, 3, 0)) cind = self.qm.corner1 / np.diag(clgd.h_cv) - 1 n = qmn.shape # print 'Corner points: ', self.qm.corner1*Bohr, ' - ', self.qm.corner2*Bohr # print 'Calculated points: ', r_gv_cl[tuple(cind)]*Bohr, ' - ', r_gv_cl[tuple(cind+n+1)]*Bohr cln[cind[0] + 1:cind[0] + n[0] + 1, cind[1] + 1:cind[1] + n[1] + 1, cind[2] + 1:cind[2] + n[2] + 1] += qmn world.barrier() return cln, clgd
def go(comm, ngpts, repeat, narrays, out, prec): N_c = np.array((ngpts, ngpts, ngpts)) a = 10.0 gd = GridDescriptor(N_c, (a, a, a), comm=comm)) gdcoarse = gd.coarsen() gdfine = gd.refine() kin1 = Laplace(gd, -0.5, 1).apply laplace = Laplace(gd, -0.5, 2) kin2 = laplace.apply restrict = Transformer(gd, gdcoarse, 1).apply interpolate = Transformer(gd, gdfine, 1).apply precondition = Preconditioner(gd, laplace, np_float) a1 = gd.empty(narrays) a1[:] = 1.0 a2 = gd.empty(narrays) c = gdcoarse.empty(narrays) f = gdfine.empty(narrays) T = [0, 0, 0, 0, 0] for i in range(repeat): comm.barrier() kin1(a1, a2) comm.barrier() t0a = time() kin1(a1, a2) t0b = time() comm.barrier() t1a = time() kin2(a1, a2) t1b = time() comm.barrier() t2a = time() for A, C in zip(a1,c): restrict(A, C) t2b = time() comm.barrier() t3a = time() for A, F in zip(a1,f): interpolate(A, F) t3b = time() comm.barrier() if prec: t4a = time() for A in a1: precondition(A, None, None, None) t4b = time() comm.barrier() T[0] += t0b - t0a T[1] += t1b - t1a T[2] += t2b - t2a T[3] += t3b - t3a if prec: T[4] += t4b - t4a if mpi.rank == 0: out.write(' %2d %2d %2d' % tuple(gd.parsize_c)) out.write(' %12.6f %12.6f %12.6f %12.6f %12.6f\n' % tuple([t / repeat / narrays for t in T])) out.flush()
n = 20 gd = GridDescriptor((n,n,n)) np.random.seed(8) a = gd.empty() a[:] = np.random.random(a.shape) gd2 = gd.refine() b = gd2.zeros() for k in [2, 4, 6, 8]: inter = Transformer(gd, gd2, k // 2).apply inter(a, b) assert abs(gd.integrate(a) - gd2.integrate(b)) < 1e-14 gd2 = gd.coarsen() b = gd2.zeros() for k in [2, 4, 6, 8]: restr = Transformer(gd, gd2, k // 2).apply restr(a, b) assert abs(gd.integrate(a) - gd2.integrate(b)) < 1e-14 # complex versions a = gd.empty(dtype=complex) a.real = np.random.random(a.shape) a.imag = np.random.random(a.shape) phase = np.ones((3, 2), complex) gd2 = gd.refine() b = gd2.zeros(dtype=complex)
from time import time from gpaw.transformers import Transformer from gpaw.grid_descriptor import GridDescriptor from gpaw.mpi import world ngpts = 80 N_c = (ngpts, ngpts, ngpts) a = 10.0 gd = GridDescriptor(N_c, (a, a, a)) gdcoarse = gd.coarsen() restrict = Transformer(gd, gdcoarse, 2).apply a1 = gd.empty() a1[:] = 1.0 f = gdcoarse.empty() ta = time() r = 600 print a1.shape, f.shape for i in range(r): restrict(a1, f) tb = time() print tb - ta #n = 8 * (1 + 2 + 4) * ngpts**3 #print '%.3f GFlops' % (r * n / (tb - ta) * 1e-9)
from gpaw.transformers import Transformer n = 20 gd = GridDescriptor((n, n, n)) np.random.seed(8) a = gd.empty() a[:] = np.random.random(a.shape) gd2 = gd.refine() b = gd2.zeros() for k in [2, 4, 6, 8]: inter = Transformer(gd, gd2, k // 2).apply inter(a, b) assert abs(gd.integrate(a) - gd2.integrate(b)) < 1e-14 gd2 = gd.coarsen() b = gd2.zeros() for k in [2, 4, 6, 8]: restr = Transformer(gd, gd2, k // 2).apply restr(a, b) assert abs(gd.integrate(a) - gd2.integrate(b)) < 1e-14 # complex versions a = gd.empty(dtype=complex) a.real = np.random.random(a.shape) a.imag = np.random.random(a.shape) phase = np.ones((3, 2), complex) gd2 = gd.refine() b = gd2.zeros(dtype=complex)