def full_static_screened_interaction(self): """Calcuate W_GG(q)""" W_qGG = np.zeros((self.nibzq, self.npw, self.npw), dtype=complex) t0 = time() for iq in range(self.nibzq): q = self.ibzq_qc[iq] optical_limit = False if np.abs(q).sum() < 1e-8: q = self.q_c.copy() optical_limit = True df = DF(calc=self.calc, q=q, w=(0.,), optical_limit=optical_limit, nbands=self.nbands, hilbert_trans=False, eta=0.0001, ecut=self.ecut*Hartree, xc='RPA', txt='df.out') df.initialize() df.calculate() if optical_limit: K_GG = self.V_qGG[iq].copy() q_v = np.dot(q, self.bcell_cv) K0 = calculate_Kc(q, self.Gvec_Gc, self.acell_cv, self.bcell_cv, self.pbc, vcut=self.vcut)[0,0] for iG in range(1,self.npw): K_GG[0, iG] = self.V_qGG[iq, iG, iG]**0.5 * K0**0.5 K_GG[iG, 0] = self.V_qGG[iq, iG, iG]**0.5 * K0**0.5 K_GG[0,0] = K0 df_GG = np.eye(self.npw, self.npw) - K_GG*df.chi0_wGG[0] else: df_GG = np.eye(self.npw, self.npw) - self.V_qGG[iq]*df.chi0_wGG[0] dfinv_GG = np.linalg.inv(df_GG) if optical_limit: eps = 1/dfinv_GG[0,0] self.printtxt(' RPA macroscopic dielectric constant is: %3.3f' % eps.real) W_qGG[iq] = dfinv_GG * self.V_qGG[iq] self.timing(iq, t0, self.nibzq, 'iq') if rank == 0: if self.kernel_file is not None: data = {'W_qGG': W_qGG} name = self.kernel_file+'.pckl' pickle.dump(data, open(name, 'w'), -1) return W_qGG
def screened_interaction_kernel(self, iq): """Calcuate W_GG(w) for a given q. if static: return W_GG(w=0) is not static: return W_GG(q,w) - Vc_GG """ q = self.ibzq_qc[iq] w = self.w_w.copy()*Hartree optical_limit = False if np.abs(q).sum() < 1e-8: q = np.array([1e-12, 0, 0]) # arbitrary q, not really need to be calculated optical_limit = True hilbert_trans = True if self.ppa or self.static: hilbert_trans = False df = DF(calc=self.calc, q=q.copy(), w=w, nbands=self.nbands, eshift=None, optical_limit=optical_limit, hilbert_trans=hilbert_trans, xc='RPA', time_ordered=True, rpad=self.rpad, vcut=self.vcut, G_plus_q=True, eta=self.eta*Hartree, ecut=self.ecut.copy()*Hartree, txt='df.out', comm=self.dfcomm, kcommsize=self.kcommsize) df.initialize() df.e_skn = self.e_skn.copy() df.calculate() dfinv_wGG = df.get_inverse_dielectric_matrix(xc='RPA') assert df.ecut[0] == self.ecut[0] if not self.static and not self.ppa: assert df.eta == self.eta assert df.Nw == self.Nw assert df.dw == self.dw # calculate Coulomb kernel and use truncation in 2D delta_GG = np.eye(df.npw) Vq_G = np.diag(calculate_Kc(q, df.Gvec_Gc, self.acell_cv, self.bcell_cv, self.pbc, integrate_gamma=True, N_k=self.kd.N_c, vcut=self.vcut))**0.5 if (self.vcut == '2D' and df.optical_limit) or self.numint: for iG in range(len(df.Gvec_Gc)): if df.Gvec_Gc[iG, 0] == 0 and df.Gvec_Gc[iG, 1] == 0: v_q, v0_q = calculate_Kc_q(self.acell_cv, self.bcell_cv, self.pbc, self.kd.N_c, vcut=self.vcut, q_qc=np.array([q]), Gvec_c=df.Gvec_Gc[iG]) Vq_G[iG] = v_q[0]**0.5 self.Kc_GG = np.outer(Vq_G, Vq_G) if self.ppa: dfinv1_GG = dfinv_wGG[0] - delta_GG dfinv2_GG = dfinv_wGG[1] - delta_GG self.wt_GG = self.E0 * np.sqrt(dfinv2_GG / (dfinv1_GG - dfinv2_GG)) self.R_GG = - self.wt_GG / 2 * dfinv1_GG del dfinv_wGG dfinv_wGG = np.array([1j*pi*self.R_GG + delta_GG]) if self.static: assert len(dfinv_wGG) == 1 W_GG = dfinv_wGG[0] * self.Kc_GG return df, W_GG else: Nw = np.shape(dfinv_wGG)[0] W_wGG = np.zeros_like(dfinv_wGG) for iw in range(Nw): dfinv_wGG[iw] -= delta_GG W_wGG[iw] = dfinv_wGG[iw] * self.Kc_GG return df, W_wGG