def get_phi_aGp(self): setups = self.calc.wfs.setups spos_ac = self.calc.atoms.get_scaled_positions() kk_Gv = gemmdot(self.q_c + self.Gvec_Gc, self.bcell_cv.copy(), beta=0.0) phi_aGp = {} for a, id in enumerate(setups.id_a): phi_aGp[a] = two_phi_planewave_integrals(kk_Gv, setups[a]) for iG in range(self.npw): phi_aGp[a][iG] *= np.exp( -1j * 2. * pi * np.dot(self.q_c + self.Gvec_Gc[iG], spos_ac[a])) # For optical limit, G == 0 part should change if self.optical_limit: for a, id in enumerate(setups.id_a): nabla_iiv = setups[a].nabla_iiv phi_aGp[a][0] = -1j * (np.dot(nabla_iiv, self.qq_v)).ravel() self.phi_aGp = phi_aGp self.printtxt('') self.printtxt('Finished phi_Gp !') return
def get_phi_aGp(self, q_c=None, parallel=True, alldir=False): if q_c is None: q_c = self.q_c qq_v = self.qq_v optical_limit = self.optical_limit else: optical_limit = False if np.abs(q_c).sum() < 1e-8: q_c = np.array([0.0001, 0, 0]) optical_limit = True qq_v = np.dot(q_c, self.bcell_cv) setups = self.calc.wfs.setups spos_ac = self.calc.atoms.get_scaled_positions() kk_Gv = gemmdot(q_c + self.Gvec_Gc, self.bcell_cv.copy(), beta=0.0) phi_aGp = {} phiG0_avp = {} if parallel: from gpaw.response.parallel import parallel_partition npw, npw_local, Gstart, Gend = parallel_partition(self.npw, self.comm.rank, self.comm.size, reshape=False) else: Gstart = 0 Gend = self.npw for a, id in enumerate(setups.id_a): phi_aGp[a] = two_phi_planewave_integrals(kk_Gv, setups[a], Gstart, Gend) for iG in range(Gstart, Gend): phi_aGp[a][iG] *= np.exp( -1j * 2. * pi * np.dot(q_c + self.Gvec_Gc[iG], spos_ac[a])) if parallel: self.comm.sum(phi_aGp[a]) # For optical limit, G == 0 part should change if optical_limit: for a, id in enumerate(setups.id_a): nabla_iiv = setups[a].nabla_iiv phi_aGp[a][0] = -1j * (np.dot(nabla_iiv, qq_v)).ravel() phiG0_avp[a] = np.zeros((3, len(phi_aGp[a][0])), complex) for dir in range(3): # 3 dimension q2_c = np.diag((1, 1, 1))[dir] * self.qopt qq2_v = np.dot(q2_c, self.bcell_cv) # summation over c phiG0_avp[a][dir] = -1j * (np.dot(nabla_iiv, qq2_v)).ravel() if alldir: return phi_aGp, phiG0_avp else: return phi_aGp
def get_phi_aGp(self, q_c=None, parallel=True, alldir=False): if q_c is None: q_c = self.q_c qq_v = self.qq_v optical_limit = self.optical_limit else: optical_limit = False if np.abs(q_c).sum() < 1e-8: q_c = np.array([0.0001, 0, 0]) optical_limit = True qq_v = np.dot(q_c, self.bcell_cv) setups = self.calc.wfs.setups spos_ac = self.calc.atoms.get_scaled_positions() kk_Gv = gemmdot(q_c + self.Gvec_Gc, self.bcell_cv.copy(), beta=0.0) phi_aGp = {} phiG0_avp = {} if parallel: from gpaw.response.parallel import parallel_partition npw, npw_local, Gstart, Gend = parallel_partition( self.npw, self.comm.rank, self.comm.size, reshape=False) else: Gstart = 0 Gend = self.npw for a, id in enumerate(setups.id_a): phi_aGp[a] = two_phi_planewave_integrals(kk_Gv, setups[a], Gstart, Gend) for iG in range(Gstart, Gend): phi_aGp[a][iG] *= np.exp(-1j * 2. * pi * np.dot(q_c + self.Gvec_Gc[iG], spos_ac[a]) ) if parallel: self.comm.sum(phi_aGp[a]) # For optical limit, G == 0 part should change if optical_limit: for a, id in enumerate(setups.id_a): nabla_iiv = setups[a].nabla_iiv phi_aGp[a][0] = -1j * (np.dot(nabla_iiv, qq_v)).ravel() phiG0_avp[a] = np.zeros((3, len(phi_aGp[a][0])), complex) for dir in range(3): # 3 dimension q2_c = np.diag((1,1,1))[dir] * self.qopt qq2_v = np.dot(q2_c, self.bcell_cv) # summation over c phiG0_avp[a][dir] = -1j * (np.dot(nabla_iiv, qq2_v)).ravel() if alldir: return phi_aGp, phiG0_avp else: return phi_aGp
def get_phi_aGp(self): setups = self.calc.wfs.setups spos_ac = self.calc.atoms.get_scaled_positions() kk_Gv = gemmdot(self.q_c + self.Gvec_Gc, self.bcell_cv.copy(), beta=0.0) phi_aGp = {} for a, id in enumerate(setups.id_a): phi_aGp[a] = two_phi_planewave_integrals(kk_Gv, setups[a]) for iG in range(self.npw): phi_aGp[a][iG] *= np.exp(-1j * 2. * pi * np.dot(self.q_c + self.Gvec_Gc[iG], spos_ac[a]) ) # For optical limit, G == 0 part should change if self.optical_limit: for a, id in enumerate(setups.id_a): nabla_iiv = setups[a].nabla_iiv phi_aGp[a][0] = -1j * (np.dot(nabla_iiv, self.qq_v)).ravel() self.phi_aGp = phi_aGp self.printtxt('') self.printtxt('Finished phi_Gp !') return
def initialize_paw_corrections(self, pd, soft=False): wfs = self.calc.wfs q_v = pd.K_qv[0] optical_limit = np.allclose(q_v, 0) G_Gv = pd.G_Qv[pd.Q_qG[0]] + q_v if optical_limit: G_Gv[0] = 1 pos_av = np.dot(self.spos_ac, pd.gd.cell_cv) # Collect integrals for all species: Q_xGii = {} for id, atomdata in wfs.setups.setups.items(): if soft: ghat = PWLFC([atomdata.ghat_l], pd) ghat.set_positions(np.zeros((1, 3))) Q_LG = ghat.expand() Q_Gii = np.dot(atomdata.Delta_iiL, Q_LG).T else: Q_Gii = two_phi_planewave_integrals(G_Gv, atomdata) ni = atomdata.ni Q_Gii.shape = (-1, ni, ni) Q_xGii[id] = Q_Gii Q_aGii = [] for a, atomdata in enumerate(wfs.setups): id = wfs.setups.id_a[a] Q_Gii = Q_xGii[id] x_G = np.exp(-1j * np.dot(G_Gv, pos_av[a])) Q_aGii.append(x_G[:, np.newaxis, np.newaxis] * Q_Gii) if optical_limit: Q_aGii[a][0] = atomdata.dO_ii return Q_aGii
def initialize_paw_corrections(self, pd, soft=False): wfs = self.calc.wfs q_v = pd.K_qv[0] optical_limit = np.allclose(q_v, 0) G_Gv = pd.get_reciprocal_vectors() if optical_limit: G_Gv[0] = 1 pos_av = np.dot(self.spos_ac, pd.gd.cell_cv) # Collect integrals for all species: Q_xGii = {} for id, atomdata in wfs.setups.setups.items(): if soft: ghat = PWLFC([atomdata.ghat_l], pd) ghat.set_positions(np.zeros((1, 3))) Q_LG = ghat.expand() Q_Gii = np.dot(atomdata.Delta_iiL, Q_LG).T else: Q_Gii = two_phi_planewave_integrals(G_Gv, atomdata) ni = atomdata.ni Q_Gii.shape = (-1, ni, ni) Q_xGii[id] = Q_Gii Q_aGii = [] for a, atomdata in enumerate(wfs.setups): id = wfs.setups.id_a[a] Q_Gii = Q_xGii[id] x_G = np.exp(-1j * np.dot(G_Gv, pos_av[a])) Q_aGii.append(x_G[:, np.newaxis, np.newaxis] * Q_Gii) if optical_limit: Q_aGii[a][0] = atomdata.dO_ii return Q_aGii
k_G = np.array([[11., 0.2, 0.1], [10., 0., 10.]]) nkpt = k_G.shape[0] d0 = np.zeros((nkpt, m, m), dtype=complex) for i in range(m): for j in range(m): for ik in range(nkpt): k = k_G[ik] kk = np.sqrt(np.inner(k, k)) kr = np.inner(k, rr.T).T expkr = np.exp(-1j * kr) d0[ik, i, j] = gd.integrate(psi[i] * psi[j] * expkr) # Calculate on 1d-grid < phi_i | e**(-ik.r) | phi_j > rgd = RadialGridDescriptor(r, np.ones_like(r) * r[1]) g = [np.exp(-(r / rc * b)**2) * r**l for l in range(lmax + 1)] l_j = range(lmax + 1) d1 = two_phi_planewave_integrals(k_G, rgd=rgd, phi_jg=g, phit_jg=np.zeros_like(g), l_j=l_j) d1 = d1.reshape(nkpt, m, m) for i in range(m): for j in range(m): for ik in range(nkpt): if np.abs(d0[ik, i, j] - d1[ik, i, j]) > 1e-10: print(i, j, d0[ik, i, j] - d1[ik, i, j])
rr[dim] -= R_a[dim] k_G = np.array([[11.,0.2,0.1],[10., 0., 10.]]) nkpt = k_G.shape[0] d0 = np.zeros((nkpt,m,m), dtype=complex) for i in range(m): for j in range(m): for ik in range(nkpt): k = k_G[ik] kk = np.sqrt(np.inner(k,k)) kr = np.inner(k,rr.T).T expkr = np.exp(-1j * kr) d0[ik, i,j] = gd.integrate(psi[i] * psi[j] * expkr) # Calculate on 1d-grid < phi_i | e**(-ik.r) | phi_j > rgd = RadialGridDescriptor(r, np.ones_like(r) * r[1]) g = [np.exp(-(r / rc * b)**2)*r**l for l in range(lmax + 1)] l_j = range(lmax + 1) d1 = two_phi_planewave_integrals(k_G, rgd=rgd, phi_jg=g, phit_jg=np.zeros_like(g), l_j=l_j) d1 = d1.reshape(nkpt, m, m) for i in range(m): for j in range(m): for ik in range(nkpt): if np.abs(d0[ik,i,j] - d1[ik,i,j]) > 1e-10: print i, j, d0[ik,i,j]- d1[ik,i,j]